Accessibility¶
The Dashboard targets WCAG 2.0 Level A/AA for its operator surfaces, and that intent is
gated in CI — an axe-core smoke runs against
every top-level page on every PR (e2e-a11y) and fails on any serious/critical A/AA
violation, color-contrast included (0.7.0). It's an automated baseline, not a substitute
for a full assistive-technology audit — see Known limits.
Keyboard navigation¶
Everything an operator does routinely is reachable without a mouse:
- Visible focus, always. Every interactive element shows a clear focus ring
(
:focus-visible, the brand accent) as you Tab — you can always see where you are. - Tab / Shift-Tab move through controls in reading order; Enter/Space activate buttons and links.
- Runs list is keyboard-operable. Table rows are focusable — Tab into the list,
↑ / ↓ move between rows, and Enter (or Space) opens the focused run. Press
/anywhere on the Runs page (when you're not already typing in a field) to jump focus to the go-to-run-id box. - Nav rail is standard links; a reserved/not-yet-shipped item (Deployments) is marked
aria-disabledso it's announced as unavailable rather than dead. - Forms (Settings, Launch, filters, annotations) are native inputs/buttons — labelled, Tab-ordered, and submit on Enter where appropriate.
Screen-reader affordances¶
- Status & live regions — loading states expose
aria-busy/role="status"; toasts use a live region (aria-live) so a new notification is announced; the error boundary isrole="alert". - Labelled controls — icon-only controls (bulk-select groups, row actions, close buttons)
carry
aria-labels. - Landmarks — the app shell uses a
<nav>for the rail and semantic headings per page so a reader can jump by structure.
Color & contrast¶
The design system meets WCAG-AA contrast (4.5:1 for text) — the palette was tuned in 0.7.0
and the axe color-contrast rule is now enforced (previously excluded). Status is never
conveyed by color alone: run/health states pair a colored dot or icon with a text label, so
the information survives color-blindness and greyscale.
Known limits¶
- The CI gate is automated axe across the top-level pages in static mode; deep flows behind a live platform (a streaming run's trace, a populated audit page) aren't in the automated sweep, and a manual AT pass (NVDA/VoiceOver) is not yet part of the release gate.
- Report an accessibility issue via the project's issue tracker.
Related¶
- Runs & debugging — the keyboard-operable runs list.
- Testing — the
e2e-a11ygate.