af020d18934b

health loading screen, version label, smart change URL fix, overlay header redesign (v3.6.29)

time
2026-05-19 17:27 UTC · 5 months ago
machine
koh2
parent
080e85c872ca
7 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/background/health.ts+2 −1src/popup/styles/popup.css+11 −0src/popup/views/Health.tsx+8 −4src/popup/views/Settings.tsx+6 −0
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.28",5+  "version": "3.6.29",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.28",4+  "version": "3.6.29",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.28",3+  "version": "3.6.29",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/background/health.ts+2 −1
@@ -208,7 +208,8 @@208208   }209209 210210   try {211-    const u = new URL(url);211+    const normalized = url.startsWith("http") ? url : `https://${url}`;212+    const u = new URL(normalized);212213     return `${u.origin}/account/security`;213214   } catch {214215     return null;

view file

src/popup/styles/popup.css+11 −0
@@ -7370,6 +7370,17 @@73707370   color: var(--peach-t1);73717371 }73727372 7373+.peach-settings-version {7374+  text-align: center;7375+  font-family: var(--font-mono);7376+  font-size: 10px;7377+  color: var(--peach-t3);7378+  padding: 6px 0 10px;7379+  letter-spacing: 0.04em;7380+  pointer-events: none;7381+  user-select: none;7382+}7383+73737384 @keyframes peach-panic-pulse {73747385   0%, 100% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0.4); }73757386   50%      { box-shadow: 0 0 0 8px rgba(220, 38, 38, 0); }

view file

src/popup/views/Health.tsx+8 −4
@@ -66,12 +66,13 @@6666   });6767   const [viewingReusedGroup, setViewingReusedGroup] = createSignal<VaultEntry[] | null>(null);6868   const [advancedReport, setAdvancedReport] = createSignal<AdvancedHealthReport | null>(null);69-  const [advancedLoading, setAdvancedLoading] = createSignal<boolean>(false);69+  // Start true for Pro users so the loading screen is visible on the very first render —70+  // previously initialized to false and flipped in onMount, which left a blank-body flash.71+  const [advancedLoading, setAdvancedLoading] = createSignal<boolean>(!!props.isPro);7072   const [smartChangingId, setSmartChangingId] = createSignal<string | null>(null);7173 7274   onMount(async () => {7375     if (!props.isPro) return;74-    setAdvancedLoading(true);7576     try {7677       const res = await sendMessage({ type: "GET_ADVANCED_HEALTH_REPORT" });7778       if ((res as { ok: boolean }).ok) {@@ -87,13 +88,16 @@8788     const res = await sendMessage({8889       type: "INITIATE_PASSWORD_CHANGE",8990       payload: { id: entryId },90-    });91+    }) as { ok: boolean; error?: string };9192     setSmartChangingId(null);92-    if ((res as { ok: boolean }).ok) {93+    if (res.ok) {9394       // The reset URL opened in a new tab — close the popup so the user can9495       // act on the page. Refresh the report on next mount so the remediation9596       // queue reflects any updates the user makes.9697       window.close();98+    } else if (res.error === "no_reset_url") {99+      // Entry has no usable URL — open the entry directly for manual editing.100+      props.onFixEntry(props.entries.find((e) => e.id === entryId)!);97101     }98102   }99103 

view file

src/popup/views/Settings.tsx+6 −0
@@ -1759,6 +1759,12 @@17591759             cards={cards()}17601760             bodies={bodies}17611761           />1762+          <div class="peach-settings-version">1763+            Peach {isNativePlatform()1764+              ? ((globalThis as { Capacitor?: { getPlatform?: () => string } }).Capacitor?.getPlatform?.() === "ios" ? "iOS" : "Android")1765+              : "Extension"1766+            } v{version}1767+          </div>17621768         </div>17631769       }17641770     >

view file