# Accessibility

Accessible as a rule, not a pass: native elements, printed contrast measured in aluminium and graphite, a keyboard route to every value, and motion that can stop.

Foundation · Free · https://tactileui.dev/docs/foundations/accessibility

## Native first

Keys are buttons and links. Switches, rockers and checks are checkboxes; selectors and radios are radio groups; faders are ranges; dialogs are `<dialog>`. They are focusable, announced and posted by the browser, not by the kit. The one custom element, `<tui-knob>`, is a `role="slider"` with the full set of ARIA values and is form-associated.

## Printing contrast

Body text is `--tui-ink` or `--tui-ink-2`, at 4.5:1 or more on the desk, the face and the well in aluminium and graphite; `--tui-ink-3` is for scales and hints only, at 3:1 or more. The measured pairs are on [Colour](https://tactileui.dev/docs/foundations/colour), as `node kit/brain/tools/verify.mjs --contrast` prints them.

## The keyboard map

| Part | Keys |
| - | - |
| [Key](https://tactileui.dev/parts/key) | Tab to reach · Enter or Space to press |
| [Switch](https://tactileui.dev/parts/switch), [rocker](https://tactileui.dev/parts/rocker), [check](https://tactileui.dev/parts/check) | Space toggles |
| [Selector](https://tactileui.dev/parts/selector), radio | One Tab stop · arrows move the choice |
| [Tabs](https://tactileui.dev/parts/tabs) | One Tab stop · Left/Right · Home/End |
| [Fader](https://tactileui.dev/parts/fader) | Arrows · Page Up/Down · Home/End |
| [Knob](https://tactileui.dev/parts/knob) | Arrows ±step · Page Up/Down ±10% · Home/End · wheel while focused |
| [Dialog](https://tactileui.dev/parts/dialog) | Focus moves in and is trapped · Escape closes · focus returns |
| These docs | ⌘K or Ctrl K opens search · / filters the list of pages · arrows and Enter pick a page |

## Focus, labels, motion

- Focus is a 2px ring in `--tui-focus`, 3px away from the part: on the visible key of a selector, the cap of a fader, the whole well of a combo.
- Every control has a visible label or an `aria-label`; the verify tool fails a page that has an unlabelled input or knob.
- Lamps are never the only signal: every lamp sits next to words.
- Under reduced motion every transition and animation is zero and lamps stop blinking; nothing is lost.
- What the kit does not do for you: meters and progress need their `role` and values from your markup, and the stepper’s keys need eight lines of script. The part pages say so.
