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
↓ peach-browser-af020d18.tar.gzatlas at this save
files changed7 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 −0manifest.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": {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",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": {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;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); }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 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 >