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
5 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/styles/popup.css+0 −32src/popup/views/Settings.tsx+25 −47
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 Password Manager",5-  "version": "4.0.9",5+  "version": "4.0.10",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 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",

view file

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",

view file

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 {

view file

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={

view file