da5e731e2125
license key masked by default with copy+toggle; small text zoom moved to html to fix window gap; light theme surfaces −10% L (bg #DAD8CD, card #E0D1BD, etc). Bump v3.6.8
- time
- 2026-05-18 18:57 UTC · 5 months ago
- machine
- koh2
- parent
- aa32eb185cb3
↓ peach-browser-da5e731e.tar.gzatlas at this save
files changed6 files
manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/styles/popup.css+53 −19src/popup/styles/vars.css+27 −30src/popup/views/Settings.tsx+41 −6manifest.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.7",5+ "version": "3.6.8",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",4- "version": "3.6.7",4+ "version": "3.6.8",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": "3.6.7",3+ "version": "3.6.8",44 "description": "Zero-knowledge password manager",55 "type": "module",66 "scripts": {src/popup/styles/popup.css+53 −19
@@ -1604,7 +1604,7 @@16041604 16051605 .light .peach-settings-group,16061606 [data-theme="light"] .peach-settings-group {1607- background: rgba(245, 237, 226, 0.70);1607+ background: rgba(231, 213, 187, 0.70);16081608 border-color: rgba(26, 18, 8, 0.08);16091609 backdrop-filter: blur(10px) saturate(1.2);16101610 -webkit-backdrop-filter: blur(10px) saturate(1.2);@@ -1613,7 +1613,7 @@16131613 @supports not (backdrop-filter: blur(1px)) {16141614 .light .peach-settings-group,16151615 [data-theme="light"] .peach-settings-group {1616- background: rgba(245, 237, 226, 0.97);1616+ background: rgba(231, 213, 187, 0.97);16171617 border-color: rgba(26, 18, 8, 0.10);16181618 }16191619 }@@ -3529,7 +3529,7 @@35293529 35303530 .light .peach-glass,35313531 [data-theme="light"] .peach-glass {3532- background: rgba(240, 233, 223, 0.72);3532+ background: rgba(224, 209, 189, 0.72);35333533 border: 1px solid rgba(26, 18, 8, 0.08);35343534 backdrop-filter: blur(12px) saturate(1.2);35353535 -webkit-backdrop-filter: blur(12px) saturate(1.2);@@ -3538,7 +3538,7 @@35383538 @supports not (backdrop-filter: blur(1px)) {35393539 .light .peach-glass,35403540 [data-theme="light"] .peach-glass {3541- background: rgba(240, 233, 223, 0.97);3541+ background: rgba(224, 209, 189, 0.97);35423542 border: 1px solid rgba(26, 18, 8, 0.10);35433543 }35443544 }@@ -3555,11 +3555,11 @@35553555 35563556 .light .peach-lock-panel.peach-glass,35573557 [data-theme="light"] .peach-lock-panel.peach-glass {3558- background: rgba(240, 233, 223, 0.82);3558+ background: rgba(224, 209, 189, 0.82);35593559 border: 1px solid rgba(26, 18, 8, 0.08);35603560 box-shadow:3561- inset 0 1px 0 rgba(255, 255, 255, 0.5),3562- 0 8px 24px rgba(80, 56, 32, 0.12);3561+ inset 0 1px 0 rgba(255, 255, 255, 0.4),3562+ 0 8px 24px rgba(80, 56, 32, 0.15);35633563 }35643564 35653565 @supports not (backdrop-filter: blur(1px)) {@@ -3571,7 +3571,7 @@35713571 }35723572 .light .peach-lock-panel.peach-glass,35733573 [data-theme="light"] .peach-lock-panel.peach-glass {3574- background: rgba(240, 233, 223, 0.98);3574+ background: rgba(224, 209, 189, 0.98);35753575 }35763576 }35773577 @@ -7240,8 +7240,25 @@72407240 color: var(--peach-t0);72417241 letter-spacing: 0.04em;72427242 word-break: break-all;7243+ flex: 1;7244+ min-width: 0;72437245 }72447246 7247+.peach-settings-license-key--masked {7248+ font-family: 'IBM Plex Mono', monospace;7249+ font-size: 0.6rem;7250+ color: var(--peach-t1);7251+ letter-spacing: 0.18em;7252+ user-select: none;7253+}7254+7255+.peach-settings-license-actions {7256+ display: flex;7257+ align-items: center;7258+ gap: 2px;7259+ flex-shrink: 0;7260+}7261+72457262 .peach-settings-license-copy {72467263 font-size: 0.6875rem;72477264 color: var(--peach-accent);@@ -7258,6 +7275,23 @@72587275 opacity: 0.75;72597276 }72607277 7278+.peach-settings-license-toggle {7279+ display: flex;7280+ align-items: center;7281+ justify-content: center;7282+ background: transparent;7283+ border: none;7284+ cursor: pointer;7285+ padding: 4px 6px;7286+ border-radius: 4px;7287+ color: var(--peach-t2);7288+ transition: color 150ms ease;7289+}7290+7291+.peach-settings-license-toggle:hover {7292+ color: var(--peach-t1);7293+}7294+72617295 @keyframes peach-panic-pulse {72627296 0%, 100% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0.4); }72637297 50% { box-shadow: 0 0 0 8px rgba(220, 38, 38, 0); }@@ -8697,41 +8731,41 @@86978731 so they read as recessed against the parchment card background. */86988732 .light .peach-btn--ghost,86998733 [data-theme="light"] .peach-btn--ghost {8700- background: #EEE7DD;8701- border-color: #DDD5CB;8734+ background: #DDCFBB;8735+ border-color: #C8BCAC;87028736 color: #1A1208;87038737 }87048738 .light .peach-btn--subtle,87058739 [data-theme="light"] .peach-btn--subtle {8706- background: #EEE7DD;8707- border-color: #DDD5CB;8740+ background: #DDCFBB;8741+ border-color: #C8BCAC;87088742 }87098743 87108744 /* Wide secondary action button on the lock screen — override the87118745 hardcoded dark-mode rgba values with warm parchment equivalents. */87128746 .light .peach-lock-secondary,87138747 [data-theme="light"] .peach-lock-secondary {8714- background: #EEE7DD;8715- border-color: #DDD5CB;8748+ background: #DDCFBB;8749+ border-color: #C8BCAC;87168750 color: #1A1208;87178751 }87188752 .light .peach-lock-secondary:hover,87198753 [data-theme="light"] .peach-lock-secondary:hover {8720- background: #F0E9DF;8754+ background: #E0D1BD;87218755 }87228756 8723-/* Entry row hover: warm parchment bg-row lifts the row above the card surface. */8757+/* Entry row hover: bg-row lifts the row above the card surface. */87248758 .light .peach-entry-row:hover,87258759 [data-theme="light"] .peach-entry-row:hover {8726- background: #F2EBE1;8760+ background: #E3D5BF;87278761 }87288762 .light .peach-entry-row.is-active,87298763 [data-theme="light"] .peach-entry-row.is-active {8730- background: #F2EBE1;8764+ background: #E3D5BF;87318765 }87328766 .light .peach-entry-row.is-selected,87338767 [data-theme="light"] .peach-entry-row.is-selected {8734- background: #F5EDE2;8768+ background: #E7D5BB;87358769 }87368770 87378771 /* ──────────────────────────────────────────────────────────────────────────src/popup/styles/vars.css+27 −30
@@ -162,44 +162,43 @@162162 }163163 164164 .light {165- /* Warm parchment restoration — pixel-sampled from reference screenshots.166- Outer bg is hsl(50,16%,93%), card surfaces shift to hsl(35,36-49%,91-92%).167- The two hue families are intentional — do not normalize them to one hue. */168- --bg: #EFEEE9;169- --s1: #F0E9DF;170- --s2: #F5EDE2;171- --s3: #EEE7DD;165+ /* Warm parchment — all surface lightness values shifted −10% from restoration166+ brief. Outer bg hsl(50,16%,83%), card surfaces hsl(35,36-49%,81-82%).167+ The two hue families (50° outer / 35° card) are intentional — do not normalize. */168+ --bg: #DAD8CD;169+ --s1: #E0D1BD;170+ --s2: #E7D5BB;171+ --s3: #DDCFBB;172172 --bg-1: var(--s1);173173 --bg-2: var(--s2);174174 --bg-3: var(--s3);175175 --t0: #1A1208;176176 --t1: #3D2E18;177177 --t2: #A8A099;178- --t3: #DDD5CB;178+ --t3: #C8BCAC;179179 --t4: rgba(26, 18, 8, 0.06);180- --surface-card: #F0E9DF;181- --surface-elevated: rgba(245, 237, 226, 0.97);182- --shell-top-solid: rgba(239, 238, 233, 0.98);183- --shell-top-fade: rgba(245, 237, 226, 0.96);180+ --surface-card: #E0D1BD;181+ --surface-elevated: rgba(231, 213, 187, 0.97);182+ --shell-top-solid: rgba(218, 216, 205, 0.98);183+ --shell-top-fade: rgba(231, 213, 187, 0.96);184184 --shell-accent-a: color-mix(in srgb, var(--peach-accent) 6%, transparent);185185 --shell-accent-b: color-mix(in srgb, var(--peach-accent) 3%, transparent);186- --copy-shadow: 0 2px 8px rgba(80, 56, 32, 0.10), 0 14px 48px rgba(80, 56, 32, 0.10), 0 0 0 1px rgba(26, 18, 8, 0.05);186+ --copy-shadow: 0 2px 8px rgba(80, 56, 32, 0.12), 0 14px 48px rgba(80, 56, 32, 0.12), 0 0 0 1px rgba(26, 18, 8, 0.06);187187 --peach-rune-idle: rgba(26, 18, 8, 0.12);188- /* Ghost watermark: brief specifies 0.06 opacity for light parchment base */189188 --peach-ghost-opacity: 0.06;190189 191- /* Light-only semantic tokens from restoration brief */192- --peach-bg-card: #F0E9DF;193- --peach-bg-row: #F2EBE1;194- --peach-bg-input: #EEE7DD;195- --peach-bg-elevated: #F5EDE2;196- --peach-bg-search: #F2EBE1;190+ /* Light-only semantic tokens */191+ --peach-bg-card: #E0D1BD;192+ --peach-bg-row: #E3D5BF;193+ --peach-bg-input: #DDCFBB;194+ --peach-bg-elevated: #E7D5BB;195+ --peach-bg-search: #E3D5BF;197196 --peach-text-label: #79766F;198197 --peach-text-link: #B87155;199198 --peach-text-dim: #9E9890;200- --peach-border-subtle: #E8E2D8;201- --peach-border-strong: #C4BAB0;202- --peach-breach-bg: #F1E5D9;199+ --peach-border-subtle: #D6CAB8;200+ --peach-border-strong: #AFA093;201+ --peach-breach-bg: #E4CCB5;203202 --peach-breach-text: #DA6931;204203 --peach-warning-text: #DA6931;205204 }@@ -215,14 +214,12 @@215214 [data-text-size="small"] { --peach-text-scale: 0.92; }216215 [data-text-size="medium"] { --peach-text-scale: 1; }217216 [data-text-size="large"] { --peach-text-scale: 1.08; }218-/* Large: zoom on html so Chrome auto-resizes the popup window upward.219- Small: zoom on body instead — Chrome cannot shrink the popup below its220- minimum width, so zooming html for small leaves click coordinates misaligned.221- Zooming body keeps the window fixed and coordinate scaling stays correct.222- The html background fill prevents a bare strip at the edges of the scaled body. */217+/* Zoom on html (not body) for both sizes so Chrome auto-resizes the popup218+ window in both directions. Zooming body for small left a visible gap at219+ the bottom because the window stayed at full height. */223220 html { background: var(--bg); }224-html[data-text-size="large"] { zoom: 1.08; }225-html[data-text-size="small"] body { zoom: 0.92; }221+html[data-text-size="large"] { zoom: 1.08; }222+html[data-text-size="small"] { zoom: 0.92; }226223 227224 /* ─── Reduced motion ───────────────────────────────────────────────────228225 User-explicit setting OR OS-level prefers-reduced-motion both collapsesrc/popup/views/Settings.tsx+41 −6
@@ -1402,6 +1402,7 @@14021402 ];14031403 14041404 const [licenseKey, setLicenseKey] = createSignal<string | null>(null);1405+ const [showKey, setShowKey] = createSignal(false);14051406 14061407 const [showKeyEntry, setShowKeyEntry] = createSignal(false);14071408 const [deactivating, setDeactivating] = createSignal(false);@@ -1532,13 +1533,47 @@15321533 <div class="peach-settings-license">15331534 <span class="peach-settings-label">LICENSE KEY</span>15341535 <div class="peach-settings-license-row">1535- <span class="peach-settings-license-key">{licenseKey()!}</span>1536- <button1537- class="peach-settings-license-copy"1538- onClick={() => copyLicenseKey(licenseKey()!)}1536+ <Show1537+ when={showKey()}1538+ fallback={1539+ <span class="peach-settings-license-key peach-settings-license-key--masked" aria-label="License key hidden">1540+ ••••••••••••••••••••••••••••1541+ </span>1542+ }15391543 >1540- {copied() ? "✓" : "copy"}1541- </button>1544+ <span class="peach-settings-license-key">{licenseKey()!}</span>1545+ </Show>1546+ <div class="peach-settings-license-actions">1547+ <button1548+ class="peach-settings-license-copy"1549+ title="Copy license key"1550+ onClick={() => copyLicenseKey(licenseKey()!)}1551+ >1552+ {copied() ? "✓" : "copy"}1553+ </button>1554+ <button1555+ class="peach-settings-license-toggle"1556+ aria-label={showKey() ? "Hide license key" : "Reveal license key"}1557+ title={showKey() ? "Hide" : "Reveal"}1558+ onClick={() => setShowKey(v => !v)}1559+ >1560+ <Show1561+ when={showKey()}1562+ fallback={1563+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">1564+ <ellipse cx="7" cy="7" rx="5.5" ry="3.5" />1565+ <circle cx="7" cy="7" r="1.5" fill="currentColor" stroke="none" />1566+ </svg>1567+ }1568+ >1569+ <svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">1570+ <ellipse cx="7" cy="7" rx="5.5" ry="3.5" />1571+ <circle cx="7" cy="7" r="1.5" fill="currentColor" stroke="none" />1572+ <line x1="2" y1="2" x2="12" y2="12" />1573+ </svg>1574+ </Show>1575+ </button>1576+ </div>15421577 </div>15431578 </div>15441579 </Show>