3d870e4370eb

wrap copy actions under a single muted Copy eyebrow — Email/Username/Password buttons replace repetitive Copy email / Copy username / Copy password (inject.ts + marketing card, v3.6.72)

time
2026-05-21 01:53 UTC · 5 months ago
machine
koh2
parent
34cda6281b85
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+24 −7
manifest.firefox.json+1 −1
@@ -2,7 +2,7 @@22   "_comment_audio_capture": "Firefox does not honor the Chrome 'audioCapture' optional_permission — getUserMedia in WebExtensions is gated solely by the runtime permission prompt. Microphone access for chirp pairing works from the popup under the existing '<all_urls>' host permission; no manifest entry is required or accepted here.",33   "manifest_version": 3,44   "name": "Peach",5-  "version": "3.6.71",5+  "version": "3.6.72",66   "description": "Zero-knowledge password manager",77   "browser_specific_settings": {88     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "3.6.71",4+  "version": "3.6.72",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": "3.6.71",3+  "version": "3.6.72",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/content/inject.ts+24 −7
@@ -820,9 +820,18 @@820820     cursor: default;821821   }822822   .sp-fill-btn:disabled { cursor: default; }823+  .sp-actions-group {824+    margin-top: 6px;825+    display: flex; flex-direction: column; gap: 4px;826+  }827+  .sp-actions-label {828+    font-size: 8px; letter-spacing: 0.18em; text-transform: uppercase;829+    color: var(--peach-text-muted);830+    font-family: "IBM Plex Mono", monospace;831+    text-align: center;832+  }823833   .sp-actions {824834     display: flex; gap: 4px; justify-content: space-between; align-items: center;825-    margin-top: 4px;826835   }827836   .sp-action-btn {828837     flex: 1; height: 28px; border: none; border-radius: 6px;@@ -2025,15 +2034,23 @@20252034     });20262035     platter.appendChild(fillBtn);20272036 2037+    const actionsGroup = document.createElement("div");2038+    actionsGroup.className = "sp-actions-group";2039+    const actionsLabel = document.createElement("div");2040+    actionsLabel.className = "sp-actions-label";2041+    actionsLabel.textContent = "Copy";2042+    actionsGroup.appendChild(actionsLabel);2043+20282044     const actions = document.createElement("div");20292045     actions.className = "sp-actions";2046+    actionsGroup.appendChild(actions);20302047 20312048     if (entry.email) {20322049       const copyEmail = document.createElement("button");20332050       copyEmail.className = "sp-action-btn";20342051       copyEmail.type = "button";20352052       copyEmail.title = "Copy email";2036-      copyEmail.textContent = "Copy email";2053+      copyEmail.textContent = "Email";20372054       copyEmail.addEventListener("click", async (e) => {20382055         e.stopPropagation();20392056         let alreadyWritten = false;@@ -2056,9 +2073,9 @@20562073     const copyU = document.createElement("button");20572074     copyU.className = "sp-action-btn";20582075     copyU.type = "button";2059-    const copyULabel = entry.username?.includes("@") ? "Copy email" : "Copy username";2060-    copyU.title = copyULabel;2061-    copyU.textContent = copyULabel;2076+    const usernameIsEmail = entry.username?.includes("@") ?? false;2077+    copyU.title = usernameIsEmail ? "Copy email" : "Copy username";2078+    copyU.textContent = usernameIsEmail ? "Email" : "Username";20622079     copyU.disabled = !entry.username;20632080     copyU.addEventListener("click", async (e) => {20642081       e.stopPropagation();@@ -2083,7 +2100,7 @@20832100     copyP.className = "sp-action-btn";20842101     copyP.type = "button";20852102     copyP.title = "Copy password";2086-    copyP.textContent = "Copy password";2103+    copyP.textContent = "Password";20872104     copyP.addEventListener("click", async (e) => {20882105       e.stopPropagation();20892106       const resp = await chrome.runtime.sendMessage({@@ -2217,7 +2234,7 @@22172234     // the "2FA" label needed) and made the code one extra click away.22182235     if (entry.hasTotp) void openTOTPTray();22192236 2220-    platter.appendChild(actions);2237+    platter.appendChild(actionsGroup);22212238     container.appendChild(platter);22222239   }22232240 

view file