c24fc253fd97

move passkey delete to trash icon next to title (matches login entry pattern), remove buried bottom button, bump v2.10.4

time
2026-04-28 21:33 UTC · 6 months ago
machine
koh2
parent
cdb8aed8a54a
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/views/PasskeyEntry.tsx+43 −34
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "2.10.3",4+  "version": "2.10.4",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "2.10.3",4+  "version": "2.10.4",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "2.10.3",3+  "version": "2.10.4",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/popup/views/PasskeyEntry.tsx+43 −34
@@ -55,10 +55,49 @@5555               {entry().title}5656             </div>5757 58-            <div class="peach-entry-name-wrap" style="position:relative;z-index:1;">59-              <h1 class={`peach-entry-name ${titleSizeClass(entry().title)}`} aria-label={entry().title}>60-                <span class="peach-entry-name-text">{entry().title}</span>61-              </h1>58+            <div class="peach-entry-header" style="position:relative;z-index:1;">59+              <div class="peach-entry-header-name">60+                <h1 class={`peach-entry-name ${titleSizeClass(entry().title)}`} aria-label={entry().title}>61+                  <span class="peach-entry-name-text">{entry().title}</span>62+                </h1>63+              </div>64+              <Show65+                when={deleteConfirmPending()}66+                fallback={67+                  <button68+                    class="peach-entry-trash-btn"69+                    onClick={() => setDeleteConfirmPending(true)}70+                    aria-label="Remove passkey"71+                    title="Remove passkey"72+                  >73+                    <svg width="12" height="13" viewBox="0 0 12 13" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">74+                      <path d="M1 3h10M4 3V2h4v1M2 3l.7 8.5a1 1 0 0 0 1 .9h4.6a1 1 0 0 0 1-.9L10 3" />75+                      <path d="M4.5 6l.3 3.5M7.5 6l-.3 3.5" />76+                    </svg>77+                  </button>78+                }79+              >80+                <div class="peach-entry-trash-confirm">81+                  <span class="peach-entry-trash-confirm-label">remove?</span>82+                  <button83+                    class="peach-btn peach-btn--sm peach-btn--danger"84+                    style="font-size:10px;padding:2px 8px;min-height:22px;"85+                    onClick={() => {86+                      setDeleteConfirmPending(false);87+                      void props.onDelete();88+                    }}89+                  >90+                    yes91+                  </button>92+                  <button93+                    class="peach-btn peach-btn--ghost peach-btn--sm"94+                    style="font-size:10px;padding:2px 8px;min-height:22px;"95+                    onClick={() => setDeleteConfirmPending(false)}96+                  >97+                    no98+                  </button>99+                </div>100+              </Show>62101             </div>63102 64103             <div class="peach-domain" style="position:relative;z-index:1;">@@ -113,36 +152,6 @@113152                   ? "This passkey is held by your platform authenticator. Peach stores only the metadata."114153                   : "The private key is stored encrypted in your Peach vault and is never shown in the UI."}115154               </div>116-              <Show117-                when={deleteConfirmPending()}118-                fallback={119-                  <button120-                    class="peach-btn peach-btn--ghost peach-btn--sm peach-passkey-delete-btn"121-                    onClick={() => setDeleteConfirmPending(true)}122-                  >123-                    remove passkey124-                  </button>125-                }126-              >127-                <div class="peach-passkey-delete-confirm">128-                  <span class="peach-passkey-delete-confirm-copy">Remove this passkey?</span>129-                  <button130-                    class="peach-btn peach-btn--ghost peach-btn--sm"131-                    onClick={() => setDeleteConfirmPending(false)}132-                  >133-                    cancel134-                  </button>135-                  <button136-                    class="peach-btn peach-btn--ghost peach-btn--sm peach-passkey-delete-btn--confirm"137-                    onClick={() => {138-                      setDeleteConfirmPending(false);139-                      void props.onDelete();140-                    }}141-                  >142-                    remove143-                  </button>144-                </div>145-              </Show>146155             </div>147156           </>148157         )}

view file