Conformance
Every component is checked against shared, implementation-agnostic guarantees, across Chromium, Firefox, and WebKit. Two layers: universal gates that hold for all UI and are verified everywhere without being declared, and behavioural contracts that each component declares and the same assertion then verifies for every component that declares it.
Universal gates — every component, every scenario
- Axe
- No WCAG 2 A/AA axe-core violations, on every scenario
- Target size
- Pointer targets are at least 24×24 CSS px, or spaced apart (WCAG 2.5.8)
- Focus visible
- Keyboard focus is never hidden behind other content (WCAG 2.4.11)
- Keyboard operable
- Every control the pointer can operate is reachable from the keyboard (WCAG 2.1.1)
- No trap
- Focus can always leave with Tab; a modal releases it on Escape (WCAG 2.1.2)
- Reflow
- No horizontal page scrolling at a 320 px viewport (WCAG 1.4.10)
- Text spacing
- Nothing is clipped when a user applies the WCAG 1.4.12 spacing overrides
- Forced colors
- Controls keep a visible boundary in high-contrast mode, where author colours are replaced (WCAG 1.4.11)
- Reduced motion
- Nothing animates position, size or rotation under prefers-reduced-motion (HIG / Material)
- Platform shortcuts
- ⌘/Ctrl+A, C, Z and F still reach a text field — a component may take a shortcut over only by implementing it, and saying so in aria-keyshortcuts
- Text is copyable
- The words on the page can be selected and copied; only controls and drag surfaces may be user-select: none
Declared contracts — per component, in the table below
- Axe
- No WCAG 2 A/AA axe-core violations
- Name
- The widget container exposes an accessible name
- Roving
- Exactly one tab stop; Arrow keys move within the widget
- Focus
- A visible focus indicator appears on keyboard focus (WCAG 2.4.7)
- Escape
- Escape dismisses the open overlay
- Select
- The file-manager selection model: Cmd/Ctrl-click toggles, Shift-click extends from the anchor, Cmd/Ctrl+A selects all and again clears, Escape clears, and the count is announced
- Undo
- What it destroys or moves comes back: Cmd/Ctrl+Z takes the last change back and announces it, Cmd/Ctrl+Shift+Z does it again, and a run of like changes is one step
- Copy
- Cmd/Ctrl+C puts what is selected on the clipboard in every flavour the widget promises — and a touch device, which has no command key, can do the same thing with a control
- Paste
- A paste lands: the widget takes the richest flavour it understands, never injects markup it did not ask for, and pastes as plain text on Shift+Cmd/Ctrl+V
- Drag
- Pointer-drag surfaces don't select text or hijack touch scrolling
- Cancel
- Escape mid-drag (and pointercancel, when the OS takes the gesture) restores the value the drag started from and ends it, so the release commits nothing
- Restore
- What the user set is still there after a reload — the pane size, the column widths, the open section, the active tab, the scroll position — but only where the host opted in, and never at the cost of working when storage is unavailable
- Reorder
- An item can be moved somewhere else by pointer and by keyboard — Space/Enter grabs, the arrows move, Space/Enter drops, Escape puts it back — with an indicator showing where it would land and every step announced
- Rename
- F2 opens an editor over the value with its text selected; Enter or a blur commits, Escape puts the old name back, Ctrl/Cmd+Z takes the rename back — announced, and reachable by a control as well as by the key
- Remove
- Delete takes it away and Ctrl/Cmd+Z puts it back where it was, announced — and focus lands on what takes its place rather than on the page body, where the undo could no longer be pressed
- Open
- Enter, or a double click, opens the item and says which — and a plain click only selects it, which is the other half of the guarantee
Inputs & controls
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Switch | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Radio Group | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Toggle Group | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Slider | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Range Slider | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Stepper | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Hold Stepper | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Scrubber | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Rating | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Text fields
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Password Field | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Masked Input | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Time Field | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| OTP Input | ✓ | · | · | ✓ | · | · | · | · | ✓ | · | · | · | · | · | · | · |
| Char Counter | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Inline Edit | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | ✓ | · | · |
| Submit Field | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Mention Input | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Tags Input | ✓ | · | · | ✓ | · | · | ✓ | ✓ | ✓ | · | · | · | · | · | · | · |
Selection & autocomplete
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Listbox | ✓ | ✓ | ✓ | ✓ | · | ✓ | · | ✓ | · | · | · | · | · | · | · | ✓ |
| Combobox | ✓ | · | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Multi Combobox | ✓ | · | · | ✓ | ✓ | · | · | · | ✓ | · | · | · | · | · | · | · |
| Typeahead Listbox | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Async Combobox | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Debounced Search | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Hotkey Search | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Tag Filter | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Transfer List | ✓ | · | · | ✓ | · | · | ✓ | · | · | ✓ | · | · | · | · | · | · |
Pickers
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Color Area | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |
| Color Picker | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |
| Swatch Picker | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Date Picker | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Date Range Picker | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Range Calendar | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Slot Picker | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Dropzone | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Validation & async fields
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Validated Field | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Async Validation | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Error Summary | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Buttons
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Split Button | ✓ | · | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Copy Button | ✓ | · | · | ✓ | · | · | · | ✓ | · | · | · | · | · | · | · | · |
| Confirm Button | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Hold Button | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Busy Button | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Menus & toolbars
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dropdown Menu | ✓ | · | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Menubar | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Command Palette | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Toolbar | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Navigation
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Tabs | ✓ | ✓ | ✓ | ✓ | · | · | ✓ | · | · | · | · | ✓ | · | · | · | · |
| Breadcrumb | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Disclosure Nav | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Scrollspy | ✓ | · | · | ✓ | · | · | · | · | · | · | · | ✓ | · | · | · | · |
| Pagination | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Steps | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Carousel | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Trees
Tables & grids
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Data Grid | ✓ | ✓ | ✓ | ✓ | · | · | · | ✓ | ✓ | · | · | · | · | ✓ | ✓ | · |
| Range Grid | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Spreadsheet | ✓ | ✓ | ✓ | ✓ | · | · | · | ✓ | ✓ | · | · | · | · | ✓ | · | · |
| Virtual Grid | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | ✓ | · | · | · | · |
| Data Table | ✓ | · | · | ✓ | · | · | · | ✓ | · | ✓ | ✓ | ✓ | ✓ | · | · | · |
Lists & collections
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| File List | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | · | · | · | · | · | ✓ | ✓ | ✓ |
| Virtual List | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | ✓ | · | · | · | · |
| Sortable | ✓ | · | · | ✓ | · | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | · | · |
| Reorder List | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Kanban | ✓ | · | · | ✓ | · | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | ✓ | · |
| Feed | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Show More List | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Load More | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Lazy List | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Editing & canvas
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Text Editor | ✓ | · | · | ✓ | · | · | ✓ | · | ✓ | · | · | · | · | · | · | · |
| Rich Text | ✓ | ✓ | ✓ | ✓ | · | · | · | · | ✓ | · | · | · | · | · | · | · |
| Selection Info | ✓ | · | · | · | · | · | · | · | · | · | · | · | · | · | · | · |
| Canvas Shape | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |
| Marquee Canvas | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Group Move | ✓ | ✓ | ✓ | ✓ | · | ✓ | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Snap Canvas | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |
| Rotate Canvas | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Gantt | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Crop Frame | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | · | · | · | · | · | · |
| Zoomable Viewport | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Pan View | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | · | · | · | · | · |
| Coordinate Canvas | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
Overlays
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Dialog | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Alert Dialog | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Popover | ✓ | · | · | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
| Tooltip | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Toggle Tip | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Tour | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | · | · | · | · | · | · | · | · | · |
Layout & disclosure
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Disclosure | ✓ | · | · | ✓ | · | · | · | · | · | · | · | ✓ | · | · | · | · |
| Accordion | ✓ | · | · | ✓ | · | · | · | · | · | · | · | ✓ | · | · | · | · |
| Reveal | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Scroll Area | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Splitter | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | ✓ | · | · | · | · |
| Split View | ✓ | · | · | ✓ | · | · | · | · | · | ✓ | ✓ | ✓ | · | · | · | · |
Feedback & status
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Async Content | ✓ | · | · | · | · | · | · | · | · | · | · | · | · | · | · | · |
| Live Loader | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Retry Loader | ✓ | · | · | · | · | · | · | · | · | · | · | · | · | · | · | · |
| Toast | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Toast Stack | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Banner | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Activity Log | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Progress | ✓ | · | · | · | · | · | · | · | · | · | · | · | · | · | · | · |
| Meter | ✓ | · | · | · | · | · | · | · | · | · | · | · | · | · | · | · |
Accessibility foundations
| Component | Axe | Name | Roving | Focus | Escape | Select | Undo | Copy | Paste | Drag | Cancel | Restore | Reorder | Rename | Remove | Open |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Skip Link | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Focus Ring | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Icon Bar | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |
| Reflow Bar | ✓ | · | · | ✓ | · | · | · | · | · | · | · | · | · | · | · | · |