Commit Graph

140 Commits

Author SHA1 Message Date
oleh 807d3c8e3c Add global keyboard EventRouter and unify publish (M6, §01D)
One module owns the document keydown listener and dispatches the shortcut map
(Cmd/Ctrl+Shift+N / +K / +S / +, / Escape), platform-aware, via the single-source
focus-utils interactive-context gate. Escape and Cmd/Ctrl+S run before the gate so
save works while editing; the rest are suppressed mid-typing. Publish + its toast
move into services/snippet-actions so the button and Cmd/Ctrl+S behave identically.
Removes the ad-hoc keydown handler from App and Monaco's Cmd+S command.
2026-06-07 17:18:55 +03:00
oleh f365258fcc Add URL hash view-state routing with Back/Forward and restore (M6, §01E)
The hash becomes the single serialized view (snippet / Datasets list / a dataset
/ new-dataset form / Chart Builder). url-hash is the sole reader/writer of
location+history (total, never-throwing parse; hash-only canonical URLs).
UrlStateSync grows from the modal↔URL seam into the full router: state→hash is
derived from the stores (so in-modal dataset sub-views reach the hash), hash→state
restores on load and on Back/Forward, validating ids and cleaning stale links.
startRouting() runs after store hydrate.
2026-06-07 17:18:10 +03:00
oleh 8c0a6b9239 Add pane show/hide toggle strip with persisted visibility (M6, §01A)
A persistent left-rail toolbar (APG toolbar + roving tabindex) toggles the
library / editor / preview panes; a hidden pane frees its space and the rest
redistribute proportionally to their remembered widths. Visibility persists to
astrolabe:ux-prefs (separate key from widths, so a hidden pane keeps its width).
Adds the positional pane-* glyph sub-family to Icon and a Datasets shortcut
button in the strip.
2026-06-07 17:15:58 +03:00
oleh f92118712c Add storage-estimate core and adapter (M6 Storage Monitor groundwork)
Portable summarizer (clamped fraction, ok/warning/critical level, availability
flag, humanizeBytes) with the browser StorageManager.estimate() feature-detect
isolated to the infrastructure adapter. No UI consumer yet — core-first per the
AI developer protocol; the Storage Monitor panel (spec §02) wires to it next.
2026-06-07 17:14:07 +03:00
oleh 548aa199d9 Add distributed settings and workspace import/export (M5) 2026-06-07 15:51:00 +03:00
oleh 80bedd2a8d Add snippet metadata panel, duplicate, and immediate-load preview (M4.5) 2026-06-06 23:54:59 +03:00
oleh 3e89d9a531 Add shared Icon primitive and controlled glyph vocabulary (Carbon, filled) 2026-06-06 23:51:47 +03:00
oleh af9ee1e4c0 Add aggregation, binning, granularity, sort, and stacking to the Chart Builder
- Per-channel transforms: aggregate (sum/mean/median/min/max), quantitative
  bin, and temporal timeUnit granularity; bin and aggregate are mutually
  exclusive. A field-less "Count of records" measure (Voyager's count(*)).
- Chart-level sort (rank a categorical axis by its measure) and stacking
  (zero / 100% normalize), each shown only when it applies.
- Field type is a fixed N|O|Q|T segmented control with the column's invalid
  types disabled; SegmentedControl gains APG-correct disabled options.
- A crowded-category-axis warning (a raw measure drawing one mark per row over
  a large dataset) and a disabled-Create hint (says why it's disabled).
- Drop the Create success toast — the new snippet is immediately visible.
- Docs: spec §06, research-doc §8 backlog (incl. the cardinality/extent
  profiling TODO), architecture 01 (stable-selector rule) and 05 (builder-local
  preview), and a profiling breadcrumb.
2026-06-06 18:04:24 +03:00
oleh c11afc273d Add Chart Builder: no-JSON Vega-Lite composer from a dataset (M4) 2026-06-05 23:46:21 +03:00
oleh 693f5d7073 Fix dataset-ref walk false positive and wire spec-mandated success toasts
- Prune the data payload and top-level datasets keys in all three ref walks
  (extractDatasetRefs, renameDatasetInSpec, resolveDatasetRefs) so a data row
  carrying a field named "data" is no longer misread as a library reference,
  spuriously rewritten, or made to throw DatasetNotFoundError. Adds tests,
  including a guard that lookup-transform refs (from.data) still resolve.
- Wire the deferred success toasts now the Toaster has landed: publish, revert,
  extract-to-dataset, and snippet/dataset delete. Copy follows the council
  title-vs-message rule (title states the action, message adds the consequence).
- Reconcile the spec's blanket toast mandate to "toast only what the user can't
  already see": no toast on visible-result creates (snippet, dataset form);
  Copy Reference stays inline and gains an aria-live announcement (new shared
  .visually-hidden utility) instead of a toast-per-copy.
- Move the toast region to bottom-right so it stops covering the header action
  cluster (Publish/Revert, theme/datasets).
- Update docs/spec 01F/02/05 and docs/architecture/07 + 10 to match.
2026-06-05 16:34:58 +03:00
oleh a4e4d96d3b Add dataset library, extract-to-dataset, and render-time reference resolution 2026-06-05 15:49:40 +03:00
oleh 25849461e0 Reconcile visual specimen with the resolved status indicator and toggle 2026-06-05 14:11:05 +03:00
oleh ad239d7d49 Show size and a draft indicator in snippet-library rows 2026-06-05 14:11:00 +03:00
oleh da20475d2f Record council resolutions for Draft/Published toggle and status dot 2026-06-05 14:10:56 +03:00
oleh 29217aefcf Switch default accent to deep teal 2026-06-05 13:41:34 +03:00
oleh cc0814a596 Unify segmented controls on a shared module with grey selection 2026-06-05 13:41:29 +03:00
oleh 0f8738cd0c Fix draft-dot alignment by floating it into the card gutter 2026-06-05 13:41:25 +03:00
oleh 3dd8187ee6 Document persistence failure-surfacing and overlay-store conventions 2026-06-05 13:07:55 +03:00
oleh 8e80b82cc0 Wire future council seats into the plan at M4 and M6 2026-06-05 13:07:52 +03:00
oleh 331ce93fb9 Record council backfill rules in the interaction contract 2026-06-05 12:58:59 +03:00
oleh 109c33e2cd Add app-shell heading and skip link (WCAG 2.4.1 / GOV.UK) 2026-06-05 12:58:54 +03:00
oleh 38c2ac15c2 Backfill interactive-control accessibility against the council (APG) 2026-06-05 12:58:32 +03:00
oleh 8f6ac21171 Reframe council audit as a one-off backfill, not a standing mode 2026-06-05 12:43:16 +03:00
oleh 8ef749c2d0 Report pane resize handle size to assistive tech (APG window splitter) 2026-06-05 12:33:19 +03:00
oleh 7b8115f623 Add design council skill and interaction-and-feedback contract 2026-06-05 12:33:00 +03:00
oleh 3839f92f1d Add notification toasts and surface persistence failures instead of failing silently 2026-06-05 11:19:50 +03:00
oleh c50f141d57 Add resizable panes with drag handles, min widths, and persistence 2026-06-05 10:46:07 +03:00
oleh 411bfbc6c2 Implement fit-mode rendering contract with container sizing and pane re-fit 2026-06-05 10:45:41 +03:00
oleh f4253f50ca Add draft/published editor workflow with publish, revert, and dirty indicator 2026-06-05 10:45:09 +03:00
oleh eec2986921 Allow typecheck/test/lint commands without permission prompts 2026-06-05 02:28:42 +03:00
oleh 7d7034ef1a Add in-app confirmation dialog replacing window.confirm 2026-06-05 02:28:37 +03:00
oleh edadc2a3fa Add .git-blame-ignore-revs to skip the Prettier reformat in blame 2026-06-05 01:43:47 +03:00
oleh 0c7297624e Format entire codebase with Prettier (mechanical, no behavior change) 2026-06-05 01:43:28 +03:00
oleh 939950b136 Add ESLint + pre-commit hook and fix the issues it surfaced 2026-06-05 01:42:42 +03:00
oleh 3d38dd1411 Clarify trim-content principle: judge by user-path, not category 2026-06-05 01:29:11 +03:00
oleh 22f0556ef8 Implement M1.5 visual design foundation: tokens, IBM Plex, theme toggle, chart themes 2026-06-05 01:29:10 +03:00
oleh 547edb85e4 Add orchestration/ to the AGENTS.md directory map 2026-06-05 00:31:03 +03:00
oleh 094e5f6e4e Add visual design language (IBM/Carbon-inspired) and schedule it as M1.5
Defines the visual contract before the design-application work, so M2+ build on settled tokens.

- docs/architecture/09-visual-design.md: principles + deliberate divergences (square chrome, free color/theming), token system (IBM Plex type, 8px spacing, role-based color, motion), component conventions, and a source-repo map for extending the research
- docs/architecture/visual-specimen.html: standalone kitchen-sink specimen with a live theme x accent switcher; doubles as the tokens.css sandbox
- IMPLEMENTATION-PLAN: new M1.5 'Visual design foundation' milestone, plus ground-rule/cross-cutting/reference wiring
- index links: 00-overview, CLAUDE.md, AGENTS.md (architecture playbook now 00-09)

Applying the design to the M1 surfaces is deferred to a separate session.
2026-06-05 00:25:11 +03:00
oleh ca54bb66b1 Implement M1 authoring loop: library, editor, live preview, persistence
M1 MVP from docs/IMPLEMENTATION-PLAN.md, with the /alignment pass applied.

- core: Snippet model + factory; prepareSpecForRender (copy-not-mutate); per-theme Vega chart config
- state/orchestration: SnippetStore with debounced auto-save; IndexedDB adapter + read-time migration; startup hydration + write-through persistence
- ui: SnippetLibrary, SpecEditor (Monaco edcore.main — full editor features, JSON-only languages), LivePreview
- build: Monaco/Vega manual chunks; raised PWA precache ceiling
- alignment: flush a valid draft on snippet switch (+regression tests); TODO breadcrumbs for the preview render race and the window.confirm delete
- housekeeping: gitignore .claude/projects/
2026-06-05 00:16:24 +03:00
oleh 056644450c Initial scaffold: spec, architecture playbook, and M0 skeleton 2026-06-04 22:14:33 +03:00