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
6 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 −6
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",5-  "version": "3.6.7",5+  "version": "3.6.8",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",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",

view file

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": {

view file

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 /* ──────────────────────────────────────────────────────────────────────────

view file

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 collapse

view file

src/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>

view file