706c273c6a24
fix: sync card styling — pairing options now match the green card as readable tappable rows (drop out-of-place brown peach-pair-method cards + dead CSS); remove the zero-knowledge info notice and the redundant Peach Sync blurb; bump 4.0.9→4.0.10
- time
- 2026-06-19 03:11 UTC · 4 months ago
- machine
- koh2
- agent
- claude-opus-4-8
- session
- consolidate sync into settings
- parent
- 138e162635be
↓ peach-browser-706c273c.tar.gzatlas at this save
files changed5 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/styles/popup.css+0 −32src/popup/views/Settings.tsx+25 −47manifest.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 Password Manager",5- "version": "4.0.9",5+ "version": "4.0.10",66 "description": "Zero-knowledge password manager",77 "browser_specific_settings": {88 "gecko": {manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22 "manifest_version": 3,33 "name": "Peach Password Manager",4- "version": "4.0.9",4+ "version": "4.0.10",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": "4.0.9",3+ "version": "4.0.10",44 "description": "Zero-knowledge password manager",55 "license": "GPL-3.0-only",66 "type": "module",src/popup/styles/popup.css+0 −32
@@ -1043,38 +1043,6 @@10431043 text-align: center; letter-spacing: 0.42em; padding-left: 0.42em;10441044 }10451045 .peach-code-input::placeholder { letter-spacing: 0.42em; }1046-/* Method chooser — two large tappable cards before the birds appear. */1047-.peach-pair-method-list {1048- display: flex; flex-direction: column; gap: 10px; padding: 4px 18px 8px;1049-}1050-.peach-pair-method {1051- display: flex; align-items: center; gap: 12px;1052- width: 100%; text-align: left; cursor: pointer;1053- padding: 12px; border-radius: 10px;1054- background: color-mix(in srgb, var(--peach-bg-elevated, var(--peach-bg)) 88%, var(--peach-accent) 12%);1055- border: 1px solid color-mix(in srgb, var(--peach-accent) 12%, transparent);1056- color: var(--peach-text);1057- font-family: inherit;1058- transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease;1059-}1060-.peach-pair-method:hover {1061- border-color: color-mix(in srgb, var(--peach-accent) 36%, transparent);1062- background: color-mix(in srgb, var(--peach-bg-elevated, var(--peach-bg)) 80%, var(--peach-accent) 20%);1063-}1064-.peach-pair-method:active { transform: translateY(1px); }1065-.peach-pair-method-icon {1066- flex-shrink: 0;1067- width: 32px; height: 32px;1068- display: flex; align-items: center; justify-content: center;1069- border-radius: 8px;1070- color: var(--peach-text);1071- background: color-mix(in srgb, var(--peach-accent) 18%, transparent);1072-}1073-.peach-pair-method-text {1074- display: flex; flex-direction: column; gap: 2px; min-width: 0;1075-}1076-.peach-pair-method-title { font-size: 0.875rem; font-weight: 600; }1077-.peach-pair-method-sub { font-size: 0.6875rem; color: var(--peach-t2); }10781046 10791047 /* Breach badge */10801048 .peach-breach-badge {src/popup/views/Settings.tsx+25 −47
@@ -1530,62 +1530,44 @@15301530 return (15311531 <div class="peach-settings-body">15321532 <div class="peach-settings-group">1533- <p class="peach-settings-sub-label">PAIRING</p>1534- <div class="peach-settings-row peach-settings-row--top">1535- <div class="peach-settings-row-main">1536- <span>1537- Peach Sync1538- <Show when={!isPro()}>1539- <span class="peach-pro-badge">Pro</span>1540- </Show>1541- </span>1542- <span class="peach-settings-value" style="font-size:11px;line-height:1.5;color:var(--peach-t2)">1543- Pair nearby devices by chirp and keep encrypted vault blobs in step without a central account.1544- </span>1545- </div>1546- <span class={`stk-pip ${isPro() ? "is-on" : ""}`} aria-hidden="true" />1547- </div>15481533 <div class="peach-settings-row peach-settings-row--meta">1549- <span>Status</span>1550- <span class="peach-settings-value">{isPro() ? "Ready" : "Requires Pro"}</span>1534+ <span>1535+ Status1536+ <Show when={!isPro()}><span class="peach-pro-badge">Pro</span></Show>1537+ </span>1538+ <span class="peach-settings-value" style="display:inline-flex;align-items:center;gap:8px">1539+ {isPro() ? "Ready" : "Requires Pro"}1540+ <span class={`stk-pip ${isPro() ? "is-on" : ""}`} aria-hidden="true" />1541+ </span>15511542 </div>15521543 15531544 {/* Pick a pairing method and begin — no separate hub screen. */}15541545 <p class="peach-settings-sub-label" style="margin-top:10px">PAIR A DEVICE</p>15551546 <button1556- class="peach-pair-method"1547+ class="peach-settings-row peach-settings-row--top peach-settings-row--tappable"15571548 disabled={!isPro()}15581549 onClick={() => props.onOpenSyncPairing?.("chirp")}15591550 >1560- <span class="peach-pair-method-icon" aria-hidden="true">1561- <svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round">1562- <path d="M3 8 L6 8 L10.5 4 L10.5 16 L6 12 L3 12 Z" />1563- <path d="M14 7.5 Q15.6 10 14 12.5" />1564- <path d="M16.4 5.5 Q19 10 16.4 14.5" opacity="0.5" />1565- </svg>1566- </span>1567- <span class="peach-pair-method-text">1568- <span class="peach-pair-method-title">Same room</span>1569- <span class="peach-pair-method-sub">Pair a nearby phone or browser by chirp</span>1570- </span>1551+ <div class="peach-settings-row-main">1552+ <span>Same room</span>1553+ <span class="peach-settings-value" style="font-size:11px;line-height:1.5;color:var(--peach-t2)">1554+ Pair a nearby phone or browser by chirp1555+ </span>1556+ </div>1557+ <span class="peach-settings-advanced-chevron" aria-hidden="true">›</span>15711558 </button>15721559 <button1573- class="peach-pair-method"1574- style="margin-top:8px"1560+ class="peach-settings-row peach-settings-row--top peach-settings-row--tappable"15751561 disabled={!isPro()}15761562 onClick={() => props.onOpenSyncPairing?.("desktop")}15771563 >1578- <span class="peach-pair-method-icon" aria-hidden="true">1579- <svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round">1580- <rect x="2" y="4" width="16" height="10" rx="1.4" />1581- <path d="M7 17 L13 17" />1582- <path d="M9 14 L9 17 M11 14 L11 17" />1583- </svg>1584- </span>1585- <span class="peach-pair-method-text">1586- <span class="peach-pair-method-title">Enter a code</span>1587- <span class="peach-pair-method-sub">Type the code from your desktop sync helper</span>1588- </span>1564+ <div class="peach-settings-row-main">1565+ <span>Enter a code</span>1566+ <span class="peach-settings-value" style="font-size:11px;line-height:1.5;color:var(--peach-t2)">1567+ Type the code from your desktop sync helper1568+ </span>1569+ </div>1570+ <span class="peach-settings-advanced-chevron" aria-hidden="true">›</span>15891571 </button>15901572 15911573 {/* Paired devices + manual sync — Settings is the hub. */}@@ -1662,12 +1644,8 @@16621644 </For>16631645 </Show>16641646 1665- <div class="peach-info-notice peach-info-notice--note" style="margin-top:8px">1666- Sync uses the same zero-knowledge vault format as backup and restore; pairing authorizes a device, not a cloud account.1667- </div>1668-16691647 {/* UI-4 / MV-8: rotate sync identity (re-keys the vault, invalidates lost devices). */}1670- <p class="peach-settings-sub-label">RECOVERY</p>1648+ <p class="peach-settings-sub-label" style="margin-top:12px">RECOVERY</p>16711649 <Show16721650 when={rotateConfirmOpen()}16731651 fallback={