From fbb64729ce4db3232cf66517bded23a5d7598352 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Mon, 20 Apr 2026 20:33:49 -0400 Subject: [PATCH] feat(ext/popup): open setup via chrome.tabs.create, drop setup view from popup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The popup is too constrained for multi-step setup (Chrome closes it when focus shifts to a file picker). Previously the popup rendered a pass-through setup-wizard component that itself opened setup.html in a tab. Cut the middleman: if not configured, directly chrome.tabs.create the setup page and window.close() the popup. - Remove 'setup' from the View union and the setup case from render(). - Delete setup-wizard component entirely — setup.html is the canonical flow. - Drop renderSetupWizard import. The @ts-nocheck stays on popup.ts until Slice 6 (item-* rewrites). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/popup/components/setup-wizard.ts | 31 ------------------- extension/src/popup/popup.ts | 9 ++---- 2 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 extension/src/popup/components/setup-wizard.ts diff --git a/extension/src/popup/components/setup-wizard.ts b/extension/src/popup/components/setup-wizard.ts deleted file mode 100644 index 5b9b2ad..0000000 --- a/extension/src/popup/components/setup-wizard.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// Setup prompt — directs users to the full-page setup wizard. -/// -/// The popup is too constrained for file pickers and multi-step forms -/// (Chrome closes it when focus shifts). All real setup happens in -/// setup.html, which pushes config to chrome.storage.local when done. - -import { escapeHtml } from '../popup'; - -export function renderSetupWizard(app: HTMLElement): void { - app.innerHTML = ` -
- -
relicario
-

two-factor vault

- -

- No vault configured yet. Open the setup wizard to - create a new vault or connect to an existing one. -

- - -
- `; - - document.getElementById('open-setup-btn')?.addEventListener('click', () => { - chrome.tabs.create({ url: chrome.runtime.getURL('setup.html') }); - window.close(); - }); -} diff --git a/extension/src/popup/popup.ts b/extension/src/popup/popup.ts index def13bc..360cb2e 100644 --- a/extension/src/popup/popup.ts +++ b/extension/src/popup/popup.ts @@ -10,7 +10,6 @@ import { renderUnlock } from './components/unlock'; import { renderEntryList } from './components/entry-list'; import { renderEntryDetail } from './components/entry-detail'; import { renderEntryForm } from './components/entry-form'; -import { renderSetupWizard } from './components/setup-wizard'; import { renderSettings } from './components/settings'; // --- Escape HTML to prevent XSS --- @@ -22,7 +21,7 @@ export function escapeHtml(str: string): string { // --- State --- -export type View = 'setup' | 'locked' | 'list' | 'detail' | 'add' | 'edit' | 'settings'; +export type View = 'locked' | 'list' | 'detail' | 'add' | 'edit' | 'settings'; export interface PopupState { view: View; @@ -80,9 +79,6 @@ function render(): void { if (!app) return; switch (currentState.view) { - case 'setup': - renderSetupWizard(app); - break; case 'locked': renderUnlock(app); break; @@ -112,7 +108,8 @@ async function init(): Promise { if (setupResp.ok) { const data = setupResp.data as { isConfigured: boolean }; if (!data.isConfigured) { - navigate('setup'); + await chrome.tabs.create({ url: chrome.runtime.getURL('setup.html') }); + window.close(); return; } }