From 50d3079b24ad00d7aae89a2dd7b84064ae464737 Mon Sep 17 00:00:00 2001 From: Oleh Omelchenko Date: Sun, 7 Jun 2026 20:05:29 +0300 Subject: [PATCH] Update plan: mark M6 library/monitor/preview/import/modals delivered --- docs/IMPLEMENTATION-PLAN.md | 57 ++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/docs/IMPLEMENTATION-PLAN.md b/docs/IMPLEMENTATION-PLAN.md index 004e87c..36604e7 100644 --- a/docs/IMPLEMENTATION-PLAN.md +++ b/docs/IMPLEMENTATION-PLAN.md @@ -354,8 +354,8 @@ load / Draft↔Published switch incurred a 300 ms blank instead of the spec's ** render. `LivePreview` now renders immediately on `bufferEpoch`/`editorView` change and debounces only keystroke (`shownText`-only) changes. -**Still deferred to M5/M6 (per §02):** Search, Sort controls + persistence, two distinct -empty-state messages, Storage Monitor. +**Deferred at the time to M5/M6 (per §02):** Search, Sort controls + persistence, two +distinct empty-state messages, Storage Monitor — all now delivered in M6. **Verified:** `typecheck` + `test` (287 passing — `snippet` duplicate factory, `SnippetStore` rename/comment/duplicate, a `SnippetLibrary` render test guarding the @@ -411,30 +411,41 @@ entries). **Goal:** the workspace feels finished and meets §10. -- **Panes:** ~~drag-resize handles with min widths; widths persist~~ ✅ **pulled - forward after M2** (coupled to the preview's container sizing — see - [arch 05 §8](architecture/05-rendering-theming-preview.md)). Side panes carry - remembered widths, the editor flexes between them, widths persist to - `astrolabe:ux-prefs`. **Remaining:** per-pane show/hide **toggle strip** + - visibility persist + proportional redistribution on hide (§01A, §09D). -- **Routing:** URL hash view-state (`#snippet-`, `#datasets/...`) with Back/Forward; - restore on load (§01E). _(see [Architecture 04 · Routing & Events](architecture/04-routing-and-events.md))_ -- **Shortcuts:** Cmd/Ctrl+Shift+N / +K / +S / +, / Esc via a single key router - (§01D). _(see [Architecture 04 · Routing & Events](architecture/04-routing-and-events.md))_ -- **Toasts:** success/error/warning/info, stacking, auto-dismiss, reduced-motion (§01F). -- **Storage monitor** for the snippet tier (§02). -- **A11y:** modal focus trap + return, labelled icon buttons, contrast in both themes (§10). +- **Panes:** ~~drag-resize handles with min widths; widths persist~~ ✅ (pulled + forward after M2). ~~Per-pane show/hide **toggle strip** + visibility persist + + proportional redistribution on hide (§01A, §09D)~~ ✅. +- **Routing:** ~~URL hash view-state (`#snippet-`, `#datasets/...`) with Back/Forward; + restore on load (§01E)~~ ✅. +- **Shortcuts:** ~~Cmd/Ctrl+Shift+N / +K / +S / +, / Esc via a single key router + (§01D)~~ ✅. +- **Toasts:** ~~success/error/warning/info, stacking, auto-dismiss, reduced-motion; + appear/disappear with a brief fade (§01F)~~ ✅ (fade-out two-phase dismiss landed last). +- **Library search / sort / empty states** (§02, §09D): ~~live search across + name/comment/draft spec; Sort by Modified/Created/Name/Size with a disclosure + + flip-on-reselect, persisted to `astrolabe:ux-prefs`; the two distinct empty states~~ ✅ + (council-guided — see [arch 10](architecture/10-interaction-and-feedback.md)). +- **Storage monitor** for the snippet tier ~~(§02)~~ ✅ (`role="meter"` fill bar, + escalating ok/warning/critical at 0.8/0.95). +- **Live-preview busy indicator** (§04, §10): ~~non-blocking overlay + `aria-busy` for + renders past ~1s~~ ✅. +- **Import atomicity** (§08): ~~roll back on storage-quota failure so no partial import is + committed; actionable error~~ ✅ (effective at the service boundary; true cross-record + IDB-transaction atomicity would require exposing a raw transaction from `db.ts` — see + [arch 02](architecture/02-persistence.md)). +- **A11y:** modal focus trap + return, labelled icon buttons, contrast in both themes (§10) — ✅ in place. +- **About & Privacy** and **Donate** modals ~~(§01)~~ ✅ (Donate URL is a placeholder + `DONATE_URL` pending the real link). - **Offline/installable:** verify the SW + manifest give a working offline + installed app. -- **About & Privacy** and **Donate** modals. -- **Council** — seat **web.dev** for the PWA/offline/storage surfaces that none of the - seated members cover: the service-worker **update-available** prompt - (`registerType: 'prompt'`), storage **persistence** (`navigator.storage.persist()`), and - the quota **estimate** (`StorageManager.estimate()`) behind the storage monitor (§02). - (The storage-monitor work above is its most concrete consumer; seating triggers a one-off - backfill — see [`/council`](../.claude/skills/council/SKILL.md).) + **⏳ Remaining** — needs manual verification in a running/installed app. +- **Council** — seat **web.dev** for the PWA/offline/storage surfaces none of the seated + members cover: the service-worker **update-available** prompt (`registerType: 'prompt'`), + storage **persistence** (`navigator.storage.persist()`), and the quota **estimate** + (`StorageManager.estimate()`). **⏳ Remaining** (storage monitor is its consumer; seating + triggers a one-off backfill — see [`/council`](../.claude/skills/council/SKILL.md)). **Manual checks:** keyboard-only run-through; reload restores view from URL; -offline reload works; install as standalone; reduced-motion honored. +offline reload works; install as standalone; reduced-motion honored. **⏳ Still owed** +(plus visual verification of the new library/monitor/modals/busy-indicator surfaces). ---