Record council resolutions for Draft/Published toggle and status dot

This commit is contained in:
2026-06-05 14:10:56 +03:00
parent 29217aefcf
commit da20475d2f
@@ -149,7 +149,11 @@ the Draft/Published view) is a **radio group**, never a row of `aria-pressed` to
- `role="radio"`/`aria-checked`, a **roving tabindex** (only the selected option is a tab - `role="radio"`/`aria-checked`, a **roving tabindex** (only the selected option is a tab
stop), and Arrow/Home/End to move-and-select (APG → Radio Group). One widget so the keyboard stop), and Arrow/Home/End to move-and-select (APG → Radio Group). One widget so the keyboard
model is defined once. _(Tabs were a candidate for Draft/Published; we chose radio group for model is defined once. _(Tabs were a candidate for Draft/Published; we chose radio group for
consistency with the other segmented controls and to avoid tabpanel wiring to Monaco.)_ consistency with the other segmented controls and to avoid tabpanel wiring to Monaco. A
**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.)_
**Resolved — selectable lists.** A row the user selects must be a real `<button>` (or a **Resolved — selectable lists.** A row the user selects must be a real `<button>` (or a
proper option), not a click handler on `<li>` (mouse-only, no keyboard, no role). It is proper option), not a click handler on `<li>` (mouse-only, no keyboard, no role). It is
@@ -158,6 +162,18 @@ forbids interactive children in a listbox. Mark the active row with `aria-curren
**only on that row** (don't emit `aria-current="false"` everywhere). Arrow-key roving **only on that row** (don't emit `aria-current="false"` everywhere). Arrow-key roving
_between_ rows is a later enhancement; button-per-row tab stops are the acceptable baseline. _between_ rows is a later enhancement; button-per-row tab stops are the acceptable baseline.
**Resolved — snippet-list status indicator.** The library row flags only the _exceptional_
state: a single **accent dot** when a snippet has unpublished draft changes; a fully-published
snippet shows **no dot** (presence = draft, absence = published). We do **not** give "published"
its own glyph — GOV.UK's Tag guidance notes one status suffices when absence is self-evident,
and Carbon's status-indicator pattern says not to highlight what isn't significant. Meaning
never rests on **hue** (WCAG 1.4.1): it rides on presence/absence **plus** the dot's accessible
label, and the colour is the neutral **accent** — not a warning hue, because unpublished work is
a normal state, not a problem. The dot sits in the row's secondary metadata line (with the
relative date and size), in a fixed-width leading slot so it never shifts adjacent text.
_(Consulted via /council → GOV.UK Tag, Carbon status-indicator-pattern, APG. This bullet is the
contract; cite it, not the external source.)_
**Resolved — one live region per shared message.** When the same error feeds two surfaces **Resolved — one live region per shared message.** When the same error feeds two surfaces
(the §1 "one producer, two subscribers" case — render errors via `PreviewStore`), exactly (the §1 "one producer, two subscribers" case — render errors via `PreviewStore`), exactly
**one** subscriber is the live region (`role="alert"` on the editor, where focus is); the **one** subscriber is the live region (`role="alert"` on the editor, where focus is); the