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
↓ peach-browser-17914c24.tar.gzatlas at this save
files changed4 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+44 −2manifest.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": {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",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": {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