Accessibility
Agent-composed pages don't exist until runtime, so they can't be audited page-by-page the way hand-built products are. auri's answer: make inaccessible output inexpressible in the vocabulary — the contract does the enforcing, before any pixel renders.
Names are required by schema
A component cannot be emitted without its accessible name — the JSON Schema marks these props
required: Stat.label, Badge.text, Callout.text, Chart.label, Sparkline.label, Progress.label, ApprovalCard.title, and every DataTable column's label. An agent that
omits them produces invalid wire, caught by the same validator that runs in CI.
And the rendered result is audited too
Required names guarantee the agent supplies the information; they cannot guarantee the component
spends it correctly. So every catalog's test suite replays each shipped fixture through a real
client and runs axe-core against the DOM a
screen reader would meet — WCAG 2.1 A and AA, minus the page-level rules (landmarks, a single
h1, lang) that belong to the host document rather than to a fragment. It runs in CI
on every change.
It earned its place immediately: the first run caught a failed media player rendering muted grey text on its own near-black letterbox — a stated error message that was hard to read, in the one state nobody screenshots.
Graphics describe themselves
Charts and sparklines generate a text alternative from their own data — "6 readings, latest 214, range 175 to 260" — so a screen reader hears the trend, not "image". The summary is computed, not an optional prop someone forgets.
Native semantics
- DataTable is a real
<table>with a<caption>andaria-sorton sortable headers (which are real buttons). - KeyValue is a
<dl>; Timeline is an<ol>; Chart is a<figure>with a caption. - Progress exposes
role="progressbar"with value/min/max — and omitsaria-valuenowwhen indeterminate, as the spec requires. - Interactive rows respond to Enter and Space; ConfirmButton disarms on Escape and blur.
Never color alone
Every intent pairs its color with text or a glyph: callouts prepend a spoken register ("warning:") for assistive tech, trend arrows carry sr-only descriptions, and all text pairings meet WCAG 2.2 AA in both themes — the bar that is also the EU legal floor under the European Accessibility Act.
Preferences are honored
prefers-reduced-motion: entrances become fades, stagger drops, shimmer freezes.forced-colors(Windows High Contrast): intents map to system colors.prefers-contrast: more: hairlines strengthen — darker in light, brighter alpha in dark — rather than hues shifting.- Focus is always visible; nothing keyboard-reachable is pointer-only.