Customize

Accessibility

This page states exactly what each interactive component does today, including where it falls short, so you can decide what to add for your own product.

Approach

  • Use the platform. Checkbox, Radio, Select, Slider and the text fields are real <input>/<select> elements, so forms, autofill, labels and assistive tech work without custom code.
  • Real roles on the rest. Custom widgets carry the ARIA roles and states that apply, and are reachable by keyboard.
  • Visible focus. A 2px accent outline everywhere, a 3px ring on fields.
  • Reduced motion. One global rule; see Motion.

Keyboard and semantics

ComponentSemanticsKeyboard
Button, Toggle, ChipNative <button>; Toggle uses aria-pressed; loading sets aria-busyEnter / Space
Checkbox, RadioNative inputs, grouped by nameSpace; arrow keys inside a radio group
Switchrole=switch with aria-checkedEnter / Space
SliderNative range inputArrow keys, Home / End, PageUp / PageDown
SelectNative <select>Native behavior
OtpFieldOne labelled input per digit; autocomplete=one-time-codeAuto-advance, Backspace goes back, ← →, paste fills all
Dialogrole=dialog, aria-modal, aria-labelledbyEsc closes; Tab and Shift+Tab are trapped; focus returns to the trigger
Sheetrole=dialog, aria-modal, aria-labelledbyEsc closes; focus moves into the panel
PopoverTrigger sets aria-expandedEsc or outside click closes
DropdownMenurole=menu, menuitem; trigger aria-haspopup↑ ↓ wrap; first item focused on open; Esc closes
CommandInput role=combobox with listbox / option items↑ ↓ move, Enter runs, typing filters
Tabstablist / tab / tabpanel with aria-controls; roving tabindex← → move and activate
AccordionButton with aria-expanded / aria-controls; region panelsEnter / Space
Tooltiprole=tooltip with aria-describedbyShown on hover and on focus within
ToastRegion aria-live=polite; each toast role=statusDismiss is a button; hover pauses the timer
Breadcrumb, Paginationnav with aria-label; aria-current on the current itemNative links and buttons
StepperOrdered list; aria-current=stepNot interactive
Progress, Meterrole=progressbar / role=meter with aria-value*Not interactive
CalendarDay buttons with aria-pressed and aria-current=dateTab through days
RotatingCarouselrole=group, aria-roledescription=carousel← → on the focused carousel; dots and buttons are focusable
SplitShowcaserole=slider with aria-value*← → adjust the divider
Skeleton, SpinnerSkeleton is aria-hidden; Spinner has role=status and a label—

Known gaps

Listed plainly, so you can plan for them:

  • Sheet and Popover do not trap focus. Dialog does. If a Sheet holds a form, consider rendering it inside a Dialog or adding the same Tab handling.
  • DropdownMenu does not return focus to its trigger on close, and has no type-ahead.
  • Command highlights the active row visually but does not set aria-activedescendant.
  • Segmented and Rating expose radio roles on buttons but do not implement arrow-key navigation between options; each is a Tab stop.
  • Tabs do not handle Home and End.
  • Calendar is a button grid without grid arrow-key navigation.
  • Decorative effects (Marquee, Typewriter, Scramble, Orbit and similar) animate indefinitely and do not offer a pause control. Avoid them for essential content, and note that reduced motion shortens but does not remove their text.

Fixes are welcome: see Contributing, or open an issue on GitHub.

Color and contrast

  • Body text uses ink-soft and muted on surface or canvas. faint is for placeholders and decoration and is intentionally low contrast.
  • Never rely on color alone: status pills and alerts always include text, and alerts include an icon.
  • If you retint the accent, keep a 4.5:1 ratio between --accent and --accent-ink.

Testing your screens

  • Tab through the whole page without a mouse. Every control should be reachable and visibly focused.
  • Turn on reduced motion in your OS and reload. Nothing should depend on an animation to be understood.
  • Run a screen reader on a form and an overlay. Labels, roles and names should be announced sensibly.
  • Check both themes. Contrast problems often appear in only one.