From 92bfe888b58ef1a2534b419f73793cd83378805e Mon Sep 17 00:00:00 2001 From: Oleh Omelchenko Date: Sat, 13 Jun 2026 10:13:40 +0300 Subject: [PATCH] UX second pass: icon-only header, pane-toggle cue, schema columns, facet cleanup --- docs/architecture/09-visual-design.md | 7 +- .../10-interaction-and-feedback.md | 29 +++++++- docs/spec/01-application-shell.md | 17 ++--- docs/ux-second-pass.md | 67 +++---------------- src/app/App.tsx | 42 ++++++------ src/app/components/AboutModal.tsx | 4 +- .../components/ChartBuilderModal.module.css | 22 ------ src/app/components/ChartBuilderModal.tsx | 21 ++---- src/app/components/DatasetsModal.module.css | 16 +++-- src/app/components/LivePreview.tsx | 24 ++++--- src/app/components/PaneToggleStrip.module.css | 11 +-- src/app/components/SelectControl.module.css | 4 ++ src/app/components/SelectControl.tsx | 7 ++ src/app/components/ThemeBuilderModal.tsx | 7 +- 14 files changed, 124 insertions(+), 154 deletions(-) diff --git a/docs/architecture/09-visual-design.md b/docs/architecture/09-visual-design.md index 426a3f4..5569031 100644 --- a/docs/architecture/09-visual-design.md +++ b/docs/architecture/09-visual-design.md @@ -210,8 +210,11 @@ UI by swapping one set of values. Borrowed from Carbon's layering model: action is filled. Worked examples: the **editor toolbar** (Publish is the lone primary; Extract/Revert are secondary, and collapse to icons when narrow — see [arch 10 §8](10-interaction-and-feedback.md)), and the **header** (Datasets / - Import / Export / About are ghost; a divider then sets off the soft-accent Donate - and the ghost theme toggle). + Import / Export / About are **icon-only** IconButtons per Carbon's UI-shell + header — global actions as a right-aligned icon row — with accessible names + that carry scope, e.g. "Export workspace" vs the preview's per-chart "Export"; + a divider then sets off the soft-accent Donate, which keeps its text label — + a solicitation needs the word — and the ghost theme toggle). - **Hover is variant-specific:** filled buttons (primary/danger) **darken** (`--accent-hover` / a slight brightness drop); outlined/ghost buttons **gain a fill one elevation step above their surface** — on `--bg` → `--layer-01`, on a diff --git a/docs/architecture/10-interaction-and-feedback.md b/docs/architecture/10-interaction-and-feedback.md index 6b95b0a..1543648 100644 --- a/docs/architecture/10-interaction-and-feedback.md +++ b/docs/architecture/10-interaction-and-feedback.md @@ -231,6 +231,13 @@ last-focused control on re-entry. - The **Datasets** control is a plain **command button** (no `aria-pressed`) in the _same_ toolbar — APG permits mixed control types — set off from the toggles by a visual divider (and optionally a nested `role="group"`), but kept in the roving sequence as its last element. +- The **pressed (pane-visible) state has its own visual cue**: an inset accent edge bar plus the + full-strength glyph on the filled chip (the activity-bar convention). A fill alone cannot be + the state cue — hover uses the same one-step fill, so a fill-only pressed state is + indistinguishable from hovering an off toggle (the collision class arch 09 names for hover); + and a bar, not a border, keeps the strip boxless per the arch 09 box-discipline rule. The + unlabeled glyph rail itself is the established activity-bar convention (NN/g #4) — toggles + carry tooltips per Carbon's icon-button rule; no visible labels. - **Focus**: show/hide is only ever initiated **from the strip**, so the activating toggle already holds focus when its pane disappears and **retains it** (the button stays, flips to not-pressed) — no orphaned focus, no restoration logic. The strip is **never itself hidden**, @@ -252,7 +259,10 @@ the Draft/Published view) is a **radio group**, never a row of `aria-pressed` to **toggle switch** was also weighed and rejected: APG defines `role="switch"` as on/off of a **single** setting, but Draft/Published selects between two **named peer views** with no natural "on" side — a radio group is the right semantics. Reserve the switch for genuine - on/off settings. Consulted via /council → APG switch / radio-group / tabs.)_ + on/off settings. Consulted via /council → APG switch / radio-group / tabs.)_ A per-option + `title` (tooltip for a terse label) doubles as the option's accessible name, so it must + **lead with the visible label** ("Original — the natural size from the spec"), or + speech-input users can't address the control they see (WCAG 2.5.3 label-in-name). **Resolved — selectable lists.** A row the user selects must be a real ` - - {/* TODO: two controls labelled "Export" are visible at once (this - workspace export + the preview pane's per-chart export) — rename or - differentiate (docs/ux-second-pass.md). */} - - +