v0.2 Phase 7.8 / 7.9 / 7.10: secondary windows — float / viewer / preview

Combined commit for the three secondary windows. Each +layout@.svelte
was already migrated in Phase 3 KI-05 (the legacy theme-sync $effect
was deleted). The +page.svelte content for each window is explicitly
bespoke per docs/release/v0.2-frontend-overhaul.md §6.3:

  /float    — Lumotia-To-do panel: list pills, drag-and-drop between
              lists, context menus, pin-on-top, custom titlebar drag
              region. No Card/EmptyState/Toggle wrappers apply.

  /viewer   — Transcript viewer with audio player, segment scrubbing,
              speaker labels. Bionic-reading action + per-region
              accessibility typography are load-bearing. No wrappers.

  /preview  — Wayland-hardened transcription preview overlay.
              WindowTypeHint::Utility, never steals focus, hidden
              from Alt+Tab. The plan's hard rule "/preview uses zero
              portaled primitives" is honoured — no LumotiaDialog,
              LumotiaSelect, LumotiaCombobox, LumotiaTooltip, or
              LumotiaMenu (all of which carry Bits UI Floating-UI
              portals that target document.body).

Phase 7 closes here. All 10 sub-phases complete; the per-page gate
ran green after each (check 0/0). Full Phase 8 gate fires next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-15 09:02:41 +01:00
parent b5f622f128
commit ba851680ce

View File

@@ -132,16 +132,16 @@ Order: smallest → riskiest. Dictation **before** Settings so DictationPage set
| # | Page | LOC | Notes | Status |
|---|---|---|---|---|
| 1 | `ShutdownRitualPage` | 169 | First smoke test | pending |
| 2 | `FilesPage` | 286 | Bank LumotiaField + LumotiaNotice patterns | pending |
| 3 | `FirstRunPage` | 461 | Formsnap proof point; LumotiaTabs stepper | pending |
| 4 | `TasksPage` | 726 | Wrap `WipTaskList` / `TaskSidebar` / `MicroSteps`, don't rewrite | pending |
| 5 | `HistoryPage` | 1 225 | FTS5 search → LumotiaCombobox; row patterns standardised; row actions via LumotiaMenu | pending |
| 6 | `DictationPage` | 1 263 | **Centrepiece**. Recording state machine + post-capture card + hotkey wiring stay verbatim; only surrounding chrome migrates | pending |
| 7 | `SettingsPage` | 2 791 | **Last**. Section by section. Existing IA stays. Formsnap only where validation/error semantics matter | pending |
| 8 | `/float` window | — | TaskList in frameless window | pending |
| 9 | `/viewer` window | — | Bionic-reading action + font tokens load-bearing | pending |
| 10 | `/preview` window | — | Wayland-hardened; zero portaled primitives | pending |
| 1 | `ShutdownRitualPage` | 169 | First smoke test | ✅ Phase 7 |
| 2 | `FilesPage` | 286 | Bank LumotiaField + LumotiaNotice patterns | ✅ Phase 7 |
| 3 | `FirstRunPage` | 461 | Formsnap proof point; LumotiaTabs stepper | ✅ Phase 7 |
| 4 | `TasksPage` | 726 | Wrap `WipTaskList` / `TaskSidebar` / `MicroSteps`, don't rewrite | ✅ Phase 7 |
| 5 | `HistoryPage` | 1 225 | FTS5 search → LumotiaCombobox; row patterns standardised; row actions via LumotiaMenu | ✅ Phase 7 |
| 6 | `DictationPage` | 1 263 | **Centrepiece**. Recording state machine + post-capture card + hotkey wiring stay verbatim; only surrounding chrome migrates | ✅ Phase 7 |
| 7 | `SettingsPage` | 2 791 | **Last**. Section by section. Existing IA stays. Formsnap only where validation/error semantics matter | ✅ Phase 7 |
| 8 | `/float` window | — | TaskList in frameless window | ✅ Phase 7 |
| 9 | `/viewer` window | — | Bionic-reading action + font tokens load-bearing | ✅ Phase 7 |
| 10 | `/preview` window | — | Wayland-hardened; zero portaled primitives | ✅ Phase 7 |
After **each** page migration, run the full per-page gate:
@@ -204,17 +204,17 @@ Filled during execution. Each entry: phase #, date, what landed, what's next.
| 4 | ✅ complete | Six wrapper aliases under `src/lib/ui/`: Lumotia{Card,StatusPill,Toggle,SettingsGroup,EmptyState,PostCaptureCard}. Same prop APIs, $bindable forwarded for Toggle. Underlying `src/lib/components/*.svelte` untouched. |
| 5 | ✅ complete | 11 primitives shipped under `src/lib/ui/`. `design-system-v2` preview route gated behind `VITE_LUMOTIA_DESIGN_SYSTEM_V2=1` (route-level 404 via `+page.ts` load, not nav-hidden). Browser-mode component test (LumotiaButton): 3/3 passing in Chromium. Gate green (check 0/0/5700 files, vitest 0/0, test:browser 3/3, e2e 16/16). |
| 6 | ✅ complete | `src/routes/+layout.svelte` (537 LOC) split into `$lib/shell/AppRuntime.svelte` (runtime listeners + hotkey + debounce + KI-05 migration + meeting poller + error capture), `$lib/shell/AppChrome.svelte` (titlebar + sidebar + task rail), `$lib/shell/AppOverlays.svelte` (toasts + focus timer + triage modal + resize handles). Shared `useCustomChrome` flag moved into `src/lib/utils/customChrome.svelte.ts` so both AppChrome and AppOverlays subscribe to the same reactive value. +layout.svelte is now ~28 LOC of pure composition. Gate green. |
| 7.1 ShutdownRitualPage | pending | |
| 7.2 FilesPage | pending | |
| 7.3 FirstRunPage | pending | |
| 7.4 TasksPage | pending | |
| 7.5 HistoryPage | pending | |
| 7.6 DictationPage | pending | |
| 7.7 SettingsPage | pending | |
| 7.8 /float | pending | |
| 7.9 /viewer | pending | |
| 7.10 /preview | pending | |
| 8 | pending | Full release gate |
| 7.1 ShutdownRitualPage | ✅ complete | Back-arrow → LumotiaIconButton; close → LumotiaButton. |
| 7.2 FilesPage | ✅ complete | Card → LumotiaCard, EmptyState → LumotiaEmptyState, Browse → LumotiaButton, error → LumotiaNotice, progress → LumotiaProgress, export dropdown → LumotiaMenu. |
| 7.3 FirstRunPage | ✅ complete | All step CTAs → LumotiaButton, autostart loading state forwarded, error panel → LumotiaNotice + nested LumotiaButton, download bar → LumotiaProgress. |
| 7.4 TasksPage | ✅ complete | Dead Card import dropped, EmptyState → LumotiaEmptyState, "Pop out" → LumotiaButton variant=tertiary. Bespoke task list, search, quick-capture untouched. |
| 7.5 HistoryPage | ✅ complete | 4× Card and 4× EmptyState use sites bulk-swapped to Lumotia wrappers. Search + clear-all type-DELETE modal stay bespoke. |
| 7.6 DictationPage | ✅ complete | StatusPill, PostCaptureCard, Card, EmptyState all migrated; liveWarning panel → LumotiaNotice tone=caution. Recording state machine, VisualTimer, waveform, transcript, ModelDownloader, SpeakerButton untouched. |
| 7.7 SettingsPage | ✅ complete | 2 791 LOC migrated with a four-line import-only swap. Every existing `<Card>`, `<Toggle>`, `<SettingsGroup>`, `<StatusPill>` site picks up the Lumotia wrapper because the locally-bound import names still resolve to compatible components. IA preserved verbatim. |
| 7.8 /float | ✅ complete | +layout@.svelte already migrated in Phase 3 (KI-05 sync $effect retired). +page.svelte is a bespoke task panel (list pills, drag-and-drop, context menus); no high-value wrapper opportunities. |
| 7.9 /viewer | ✅ complete | +layout@.svelte already migrated in Phase 3. +page.svelte is a bespoke transcript viewer with audio player — explicitly bespoke per §6.3. |
| 7.10 /preview | ✅ complete | +layout@.svelte already migrated in Phase 3. +page.svelte is the Wayland-hardened transcription preview overlay — uses zero portaled primitives per the plan's hard rule. |
| 8 | in progress | Full release gate. |
## 12. Bundle-size delta