Accessibility
Every component is keyboard-operable and exposes the right ARIA semantics. This is enforced by the test suite, which audits every enumerated combination of every component's options, not just the default.
What is guaranteed
- Every interactive element has an accessible name. Label-less fields accept
ariaLabel. - ARIA references (
aria-labelledby,aria-describedby,aria-activedescendant) resolve; ids are unique; there is no positivetabindex. - Nothing focusable is hidden inside
aria-hidden; no interactive control is nested in another. - Required state attributes are present:
aria-valuenowon sliders,aria-checkedon custom radios,aria-sorton sortable headers,aria-expandedon disclosures. - Errors are tied to their field with
aria-invalidandaria-describedby; toasts userole="status"(alertfor danger). - Focus is always visible (a 3px glow ring) and returns to the trigger when a popover or menu closes.
- Motion respects
prefers-reduced-motion. Native<dialog>provides modal focus handling. - Charts offer a Table view of every value, legend items that are real buttons, and keyboard readouts, so nothing depends on hover or colour alone.
Keyboard reference
| Component | Keys |
|---|---|
| Select, Combobox, MultiSelect | ↓ ↑ move · Enter choose · Esc close (and revert typed text) · Home End · typing filters · Backspace removes the last tag |
| Menu, MenuButton, ContextMenu | ↓ ↑ Home End move · → open submenu · ← close it · Esc close · Shift+F10 or the Menu key opens a context menu |
| Calendar, DatePicker | ← → day · ↑ ↓ week · Home End week ends · PgUp PgDn month · Shift+PgUp/PgDn year · Enter select |
| TimePicker | Type 2:30 pm or 1430 · ↑ ↓ in the hour and minute lists |
| Tabs | ← → move and activate (skipping disabled, wrapping) · Home End · document tabs: Ctrl+Shift+← → Home End reorder (announced) · Delete or Ctrl+W close · Shift+F10 tab menu |
| Toolbar | One tab stop · ← → (↑ ↓ when vertical) move between controls · Home End · text fields keep their own caret keys |
| Accordion | ↑ ↓ Home End between headers · Enter/Space toggle |
| Tree | ↑ ↓ Home End · → expand, then enter the first child · ← collapse, then go to the parent · Enter select · Space toggle the checkbox |
| Slider | ← → step · PgUp PgDn 10% · Home End |
| SplitPane, Shell aside | Focus the divider: ← → (or ↑ ↓) resize · Shift larger steps · Home End · Enter reset |
| DataTable | ↑ ↓ PgUp PgDn Home End across rows, including virtual ones · → ← expand/collapse tree rows · Enter activate · Shift+F10 on a heading opens its column menu |
| Graph | ←↑→↓ nudge selected nodes · Shift larger · Delete remove · + − zoom · 0 fit · Esc clear selection |
| Charts | Focus the plot, then ← → read each point; histogram bins: Enter select, Shift+Enter extend, Esc clear |
| ColorPicker | Arrow keys move the saturation/brightness square (Shift for 10×) and nudge the hue and opacity rails |
| Shell | A “Skip to content” link is the first focusable element |
Notes for authors
- Give the group a label when using InputGroup; don't label the individual controls inside it.
- Icon-only buttons need
aria-label. Icon-onlySegmentedControloptions fall back to their value, or take anariaLabel. - Don't rely on colour alone: intents pair colour with an icon or text (toasts, callouts, badges).