Skip to content

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-disabled so 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 is role="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.
  • Runs & debugging — the keyboard-operable runs list.
  • Testing — the e2e-a11y gate.