06609f3696a8

refactor: Remove unreachable popup states and styles (v4.10.36)

- Remove dead exit/navigation/locking states and keyframes - Keep popup .light and inline shadow-root data-theme behavior distinct - Drop unreachable note font rules, write-only accent variables, and no-op long press

time
2026-08-29 12:44 UTC · 1 month ago
machine
koh2
parent
f284ee4f084d
8 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/content/inject.ts+1 −4src/popup/App.tsx+3 −12src/popup/components/NoteRow.tsx+0 −10src/popup/styles/popup.css+14 −59src/popup/styles/vars.css+0 −2
manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "4.10.35",4+  "version": "4.10.36",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -2,7 +2,7 @@22   "manifest_version": 3,33   "minimum_chrome_version": "116",44   "name": "Peach Password Manager",5-  "version": "4.10.35",5+  "version": "4.10.36",66   "description": "Zero-knowledge password manager",77   "action": {88     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "4.10.35",3+  "version": "4.10.36",44   "description": "Zero-knowledge password manager",55   "license": "GPL-3.0-only",66   "type": "module",

view file

src/content/inject.ts+1 −4
@@ -604,7 +604,7 @@604604 605605 // All theme-dependent values resolve through tokens scoped to606606 // .peach-inline-popup[data-theme="dark|light"]. Accent variables607-// (--peach-accent, --peach-accent-dim, --peach-glow, --peach-border-accent)607+// (--peach-accent, --peach-glow, --peach-border-accent)608608 // are identical in both themes — only surface tokens differ. See609609 // Projects.md §4.14: hardcoded hex inside this stylesheet breaks the610610 // theme switch — only literal brand-peach in peachIconSvg may stay raw.@@ -1473,7 +1473,6 @@14731473   );14741474   host.style.cssText = `position: fixed; z-index: 2147483647;`;14751475   host.style.setProperty("--peach-accent", accentHex);1476-  host.style.setProperty("--peach-accent-dim", withAlpha(accentHex, "28"));14771476   host.style.setProperty("--peach-glow", withAlpha(accentHex, "18"));14781477   host.style.setProperty("--peach-border-accent", withAlpha(accentHex, "30"));14791478   // Hint the compositor that top/left animate during scroll repositioning so the@@ -3473,7 +3472,6 @@34733472   const host = document.createElement("div");34743473   host.style.cssText = "position: absolute; z-index: 2147483647;";34753474   host.style.setProperty("--peach-accent", accentHex);3476-  host.style.setProperty("--peach-accent-dim", withAlpha(accentHex, "28"));34773475   host.style.setProperty("--peach-glow", withAlpha(accentHex, "18"));34783476   host.style.setProperty("--peach-border-accent", withAlpha(accentHex, "30"));34793477   const shadow = host.attachShadow({ mode: "closed" });@@ -4246,7 +4244,6 @@42464244   const host = document.createElement("div");42474245   host.style.cssText = "position: absolute; z-index: 2147483647;";42484246   host.style.setProperty("--peach-accent", accentHex);4249-  host.style.setProperty("--peach-accent-dim", withAlpha(accentHex, "28"));42504247   host.style.setProperty("--peach-glow", withAlpha(accentHex, "18"));42514248   host.style.setProperty("--peach-border-accent", withAlpha(accentHex, "30"));42524249   const shadow = host.attachShadow({ mode: "closed" });

view file

src/popup/App.tsx+3 −12
@@ -126,12 +126,7 @@126126 export default function App() {127127   const [bootState, setBootState] = createSignal<BootState>("loading");128128   const [view, setView] = createSignal<View>("lock");129-  // Mobile bottom-sheet live drag offset in px (null = not actively dragging,130-  // CSS transition takes over for snap animation).131-  const [contentPhase, setContentPhase] = createSignal<"enter" | "exit" | "idle">(132-    "enter"133-  );134-  const [contentTransitioning, setContentTransitioning] = createSignal(false);129+  const [contentPhase, setContentPhase] = createSignal<"enter" | "idle">("enter");135130   const [hasVault, setHasVault] = createSignal(false);136131   const [onboarded, setOnboarded] = createSignal(true);137132   const [startOnboardingRestore, setStartOnboardingRestore] = createSignal(false);@@ -390,10 +385,8 @@390385     const color = ACCENT_COLORS.find(c => c.name === name) ?? ACCENT_COLORS[0]!;391386     const hex = color.hex;392387     document.documentElement.style.setProperty("--peach-accent", hex);393-    // Ambient surface variables — derived from the accent so surfaces shift394-    // subtly toward the accent hue rather than staying fixed warm-brown.388+    // Ambient variables derived from the selected accent.395389     document.documentElement.style.setProperty("--peach-glow", hex + "2A");396-    document.documentElement.style.setProperty("--peach-surface-tint", hex + "09");397390     document.documentElement.style.setProperty("--peach-border-accent", hex + "24");398391   }399392 @@ -1023,7 +1016,6 @@10231016 10241017     setSelectedEntry(nextSelectedEntry);10251018     setEditEntry(undefined);1026-    setContentTransitioning(false);10271019     setContentPhase("enter");10281020     queueContentIdle();10291021     if (!skipViewSet) setView("entry");@@ -1077,7 +1069,6 @@10771069       return;10781070     }10791071     setSelectedEntry(entry);1080-    setContentTransitioning(false);10811072     setContentPhase("enter");10821073     queueContentIdle();10831074     setView("entry");@@ -1502,7 +1493,7 @@15021493 15031494             <div class="peach-shell-body">15041495               <div class="peach-shell-veil"></div>1505-              <div class="peach-content-frame" data-content-phase={contentPhase()} classList={{ navigating: contentTransitioning() }}>1496+              <div class="peach-content-frame" data-content-phase={contentPhase()}>15061497                 <EntryView15071498                   entry={selectedEntry()}15081499                   currentTabUrl={currentTabUrl()}

view file

src/popup/components/NoteRow.tsx+0 −10
@@ -49,7 +49,6 @@4949   let touchStartX = 0;5050   let touchStartY = 0;5151   let captured = false;52-  let longPressTimer: number | undefined;5352 5453   function handleTouchStart(e: TouchEvent) {5554     const t = e.touches[0];@@ -57,11 +56,6 @@5756     touchStartX = t.clientX;5857     touchStartY = t.clientY;5958     captured = false;60-61-    longPressTimer = window.setTimeout(() => {62-      vibrate(60);63-      // Long press: context menu (future)64-    }, 500);6559   }6660 6761   function handleTouchMove(e: TouchEvent) {@@ -73,12 +67,10 @@7367     if (!captured) {7468       if (dy > 8 && dy > Math.abs(dx)) {7569         // vertical scroll — abort76-        clearTimeout(longPressTimer);7770         return;7871       }7972       if (Math.abs(dx) > 8) {8073         captured = true;81-        clearTimeout(longPressTimer);8274         setSwping(true);8375       }8476       return;@@ -88,7 +80,6 @@8880   }8981 9082   function handleTouchEnd(_e: TouchEvent) {91-    clearTimeout(longPressTimer);9283     if (!captured) {9384       // Tap9485       props.onTap(props.note, rowEl);@@ -119,7 +110,6 @@119110   }120111 121112   function handleTouchCancel() {122-    clearTimeout(longPressTimer);123113     setSwipeX(0);124114     setSwping(false);125115     captured = false;

view file

src/popup/styles/popup.css+14 −59
@@ -236,16 +236,9 @@236236   overflow: hidden;237237   transition: opacity 80ms ease, transform 80ms ease;238238 }239-.peach-content-frame.navigating {240-  opacity: 0.93;241-  transform: translateX(2px);242-}243239 .peach-content-frame[data-content-phase="enter"] {244240   animation: peach-content-enter 135ms ease-out both;245241 }246-.peach-content-frame[data-content-phase="exit"] {247-  animation: peach-content-exit 95ms ease-in forwards;248-}249242 .peach-content-frame[data-content-phase="idle"] { opacity: 1; transform: none; }250243 251244 /* Stage */@@ -977,10 +970,6 @@977970 /* Beat .peach-btn--ghost.peach-icon-btn (rest) and .peach-icon-btn:hover978971    (hover) so the lock reads accent in both states. */979972 .peach-btn--ghost.peach-icon-btn.peach-lock-btn { color: var(--peach-accent); }980-.peach-lock-btn.is-locking .peach-lock-icon {981-  animation: peach-lock-settle var(--peach-dur-600) var(--peach-curve-arrival);982-}983-984973 /* Copy button */985974 .peach-copy-btn {986975   position: relative; overflow: hidden;@@ -1528,8 +1517,7 @@15281517   }15291518 }15301519 1531-.light .peach-settings-group,1532-[data-theme="light"] .peach-settings-group {1520+.light .peach-settings-group {15331521   background: rgba(245, 237, 226, 0.70);15341522   border-color: rgba(26, 18, 8, 0.08);15351523   backdrop-filter: blur(10px) saturate(1.2);@@ -1537,8 +1525,7 @@15371525 }15381526 15391527 @supports not (backdrop-filter: blur(1px)) {1540-  .light .peach-settings-group,1541-  [data-theme="light"] .peach-settings-group {1528+  .light .peach-settings-group {15421529     background: rgba(245, 237, 226, 0.97);15431530     border-color: rgba(26, 18, 8, 0.10);15441531   }@@ -2540,18 +2527,6 @@25402527   margin: 10px 0;25412528 }25422529 2543-/* font size elements from execCommand */2544-.peach-note-editor-body font[size="1"],2545-.peach-note-content font[size="1"] { font-size: 0.6875rem; line-height: 1.6; }2546-.peach-note-editor-body font[size="2"],2547-.peach-note-content font[size="2"] { font-size: 0.8125rem; }2548-.peach-note-editor-body font[size="3"],2549-.peach-note-content font[size="3"] { font-size: 1rem; }2550-.peach-note-editor-body font[size="4"],2551-.peach-note-content font[size="4"] { font-size: 20px; }2552-.peach-note-editor-body font[size="5"],2553-.peach-note-content font[size="5"] { font-size: 26px; line-height: 1.4; }2554-25552530 /* bold / italic inside the editor and note display */25562531 .peach-note-editor-body b, .peach-note-editor-body strong,25572532 .peach-note-content b, .peach-note-content strong { font-weight: 700; }@@ -2636,10 +2611,6 @@26362611   from { opacity: 0.96; transform: translateY(4px); }26372612   to   { opacity: 1; transform: translateY(0); }26382613 }2639-@keyframes peach-content-exit {2640-  from { opacity: 1; transform: translateY(0); }2641-  to   { opacity: 0.92; transform: translateY(-3px); }2642-}26432614 @keyframes peach-screen-enter {26442615   from { opacity: 0; transform: translateY(14px); }26452616   to   { opacity: 1; transform: translateY(0); }@@ -2648,11 +2619,6 @@26482619   from { opacity: 0; }26492620   to   { opacity: 1; }26502621 }2651-@keyframes peach-lock-settle {2652-  0%   { transform: scale(0.9); }2653-  65%  { transform: scale(1.08); }2654-  100% { transform: scale(1); }2655-}26562622 @keyframes peach-copy-confirm {26572623   from { color: var(--peach-t2); border-color: var(--peach-t3); background-color: transparent; box-shadow: none; }26582624   to   { color: var(--peach-accent); border-color: color-mix(in srgb, var(--peach-accent) 42%, transparent); background-color: color-mix(in srgb, var(--peach-accent) 9%, transparent); box-shadow: 0 0 18px color-mix(in srgb, var(--peach-accent) 22%, transparent), inset 0 0 18px color-mix(in srgb, var(--peach-accent) 12%, transparent); }@@ -2983,8 +2949,7 @@29832949   }29842950 }29852951 2986-.light .peach-glass,2987-[data-theme="light"] .peach-glass {2952+.light .peach-glass {29882953   background: rgba(240, 233, 223, 0.72);29892954   border: 1px solid rgba(26, 18, 8, 0.08);29902955   backdrop-filter: blur(12px) saturate(1.2);@@ -2992,8 +2957,7 @@29922957 }29932958 29942959 @supports not (backdrop-filter: blur(1px)) {2995-  .light .peach-glass,2996-  [data-theme="light"] .peach-glass {2960+  .light .peach-glass {29972961     background: rgba(240, 233, 223, 0.97);29982962     border: 1px solid rgba(26, 18, 8, 0.10);29992963   }@@ -3009,8 +2973,7 @@30092973     0 12px 28px rgba(0, 0, 0, 0.3);30102974 }30112975 3012-.light .peach-lock-panel.peach-glass,3013-[data-theme="light"] .peach-lock-panel.peach-glass {2976+.light .peach-lock-panel.peach-glass {30142977   background: rgba(240, 233, 223, 0.82);30152978   border: 1px solid rgba(26, 18, 8, 0.08);30162979   box-shadow:@@ -3025,8 +2988,7 @@30252988       inset 0 1px 0 rgba(255, 255, 255, 0.05),30262989       0 12px 28px rgba(0, 0, 0, 0.4);30272990   }3028-  .light .peach-lock-panel.peach-glass,3029-  [data-theme="light"] .peach-lock-panel.peach-glass {2991+  .light .peach-lock-panel.peach-glass {30302992     background: rgba(240, 233, 223, 0.98);30312993   }30322994 }@@ -7568,7 +7530,7 @@75687530 75697531 /* Desktop: larger headline in TOC */75707532 @media (min-width: 400px) {7571-  .peach-notes-header-title:not(.is-breadcrumb) {7533+  .peach-notes-header-title {75727534     font-size: 32px;75737535   }75747536 @@ -7587,41 +7549,34 @@75877549 /* Settings section headers: use text-label (#79766F) per restoration brief —75887550    muted gray-warm gives ENTRIES / MAINTENANCE / DATA / VAULT HISTORY75897551    presence without fighting the light parchment background. */7590-.light .peach-settings-sub-label,7591-[data-theme="light"] .peach-settings-sub-label {7552+.light .peach-settings-sub-label {75927553   color: #79766F;75937554 }75947555 75957556 /* Secondary action buttons (ghost / subtle): filled with input-well surface75967557    so they read as recessed against the parchment card background. */7597-.light .peach-btn--ghost:not(.peach-icon-btn),7598-[data-theme="light"] .peach-btn--ghost:not(.peach-icon-btn) {7558+.light .peach-btn--ghost:not(.peach-icon-btn) {75997559   background: #EEE7DD;76007560   border-color: #DDD5CB;76017561   color: #1A1208;76027562 }7603-.light .peach-icon-btn,7604-[data-theme="light"] .peach-icon-btn {7563+.light .peach-icon-btn {76057564   background: transparent;76067565   border-color: transparent;76077566 }7608-.light .peach-btn--subtle,7609-[data-theme="light"] .peach-btn--subtle {7567+.light .peach-btn--subtle {76107568   background: #EEE7DD;76117569   border-color: #DDD5CB;76127570 }76137571 76147572 /* Entry row hover: bg-row lifts the row above the card surface. */7615-.light .peach-entry-row:hover,7616-[data-theme="light"] .peach-entry-row:hover {7573+.light .peach-entry-row:hover {76177574   background: #F2EBE1;76187575 }7619-.light .peach-entry-row.is-active,7620-[data-theme="light"] .peach-entry-row.is-active {7576+.light .peach-entry-row.is-active {76217577   background: #F2EBE1;76227578 }7623-.light .peach-entry-row.is-selected,7624-[data-theme="light"] .peach-entry-row.is-selected {7579+.light .peach-entry-row.is-selected {76257580   background: #F5EDE2;76267581 }76277582 

view file

src/popup/styles/vars.css+0 −2
@@ -117,9 +117,7 @@117117   --peach-border: var(--peach-t3);118118   --peach-mono: var(--font-mono);119119   --peach-accent: var(--ac);120-  --peach-accent-dim: color-mix(in srgb, var(--peach-accent) 25%, transparent);121120   --peach-glow: #F49C702A;        /* accent bloom behind buttons/illustrations — set by applyAccent() */122-  --peach-surface-tint: #F49C7009; /* accent tint on card surfaces — set by applyAccent() */123121   --peach-border-accent: #F49C7024; /* accent-tinted border for active states — set by applyAccent() */124122   --peach-breach: var(--breach);125123   --peach-health-ok: var(--health);

view file