17914c240bb4

inline popup: + button in domain header opens create form directly, so users aren't trapped in the search list (v2.16.3)

time
2026-05-01 03:25 UTC · 5 months ago
machine
koh2
parent
a8e7ba480464
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+44 −2
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "2.16.2",4+  "version": "2.16.3",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.16.2",4+  "version": "2.16.3",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.16.2",3+  "version": "2.16.3",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/content/inject.ts+44 −2
@@ -369,7 +369,12 @@369369     padding: 9px 13px 7px;370370     border-bottom: 1px solid var(--peach-border);371371     display: flex; align-items: center; justify-content: space-between;372+    gap: 8px;372373   }374+  .domain-header-text {375+    display: flex; flex-direction: column; gap: 2px;376+    min-width: 0; flex: 1;377+  }373378   .domain-eyebrow {374379     font-size: 8px; letter-spacing: 0.12em; text-transform: uppercase;375380     color: var(--peach-text-dim); font-family: "IBM Plex Mono", monospace;@@ -377,7 +382,27 @@377382   .domain-name {378383     font-size: 10px; color: color-mix(in srgb, var(--peach-accent) 60%, transparent);379384     font-family: "IBM Plex Mono", monospace;385+    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;380386   }387+  .domain-add-btn {388+    flex-shrink: 0;389+    width: 22px; height: 22px;390+    display: inline-flex; align-items: center; justify-content: center;391+    background: color-mix(in srgb, var(--peach-accent) 12%, transparent);392+    border: 1px solid color-mix(in srgb, var(--peach-accent) 28%, transparent);393+    border-radius: 6px;394+    color: var(--peach-accent);395+    cursor: pointer; padding: 0;396+    transition: background 120ms, border-color 120ms, transform 80ms;397+    font-family: "IBM Plex Mono", monospace;398+    font-size: 14px; line-height: 1;399+  }400+  .domain-add-btn:hover {401+    background: color-mix(in srgb, var(--peach-accent) 22%, transparent);402+    border-color: color-mix(in srgb, var(--peach-accent) 48%, transparent);403+    transform: scale(1.06);404+  }405+  .domain-add-btn:active { transform: scale(0.96); }381406 382407   /* Search */383408   .search-wrap {@@ -1108,9 +1133,13 @@11081133 11091134     const current = activeEntries();11101135 1111-    // Domain header (always show)1136+    // Domain header (always show) — eyebrow + domain on the left,1137+    // a "+" shortcut to the create form on the right so the user is never1138+    // trapped in the search list when they want to make a new entry.11121139     const domHdr = document.createElement("div");11131140     domHdr.className = "domain-header";1141+    const headText = document.createElement("div");1142+    headText.className = "domain-header-text";11141143     const eyebrow = document.createElement("div");11151144     eyebrow.className = "domain-eyebrow";11161145     eyebrow.textContent = options.isSignup@@ -1119,7 +1148,20 @@11191148     const domName = document.createElement("div");11201149     domName.className = "domain-name";11211150     domName.textContent = options.domain ?? location.hostname.replace(/^www\./, "");1122-    domHdr.append(eyebrow, domName);1151+    headText.append(eyebrow, domName);1152+    domHdr.appendChild(headText);1153+1154+    if (!options.isSignup) {1155+      const addBtn = document.createElement("button");1156+      addBtn.className = "domain-add-btn";1157+      addBtn.type = "button";1158+      addBtn.setAttribute("aria-label", "Create new entry");1159+      addBtn.title = "Create new entry";1160+      addBtn.textContent = "+";1161+      addBtn.addEventListener("click", (e) => { e.stopPropagation(); void showCreateForm(); });1162+      domHdr.appendChild(addBtn);1163+    }1164+11231165     container.appendChild(domHdr);11241166 11251167     // Search — always show so user can find entries beyond the domain matches

view file