UI

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

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Switch··············
Radio Group············
Toggle Group··············
Slider············
Range Slider··············
Stepper··············
Hold Stepper··············
Scrubber············
Rating············

Text fields

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Password Field··············
Masked Input··············
Time Field··············
OTP Input·············
Char Counter··············
Inline Edit·············
Submit Field··············
Mention Input··············
Tags Input···········

Selection & autocomplete

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Listbox·········
Combobox·············
Multi Combobox············
Typeahead Listbox············
Async Combobox··············
Debounced Search··············
Hotkey Search··············
Tag Filter··············
Transfer List············

Pickers

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Color Area·············
Color Picker·············
Swatch Picker············
Date Picker············
Date Range Picker············
Range Calendar············
Slot Picker··········
Dropzone··············

Validation & async fields

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Validated Field··············
Async Validation··············
Error Summary··············

Buttons

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Split Button·············
Copy Button·············
Confirm Button··············
Hold Button··············
Busy Button··············

Menus & toolbars

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Dropdown Menu·············
Menubar···········
Command Palette···········
Toolbar············

Navigation

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Tabs··········
Breadcrumb··············
Disclosure Nav··············
Scrollspy·············
Pagination··············
Steps··············
Carousel··············

Trees

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Tree·····
Tree Grid············

Tables & grids

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Data Grid········
Range Grid············
Spreadsheet·········
Virtual Grid···········
Data Table·········

Lists & collections

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
File List······
Virtual List···········
Sortable··········
Reorder List··············
Kanban·········
Feed··············
Show More List··············
Load More··············
Lazy List··············

Editing & canvas

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
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

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Dialog··············
Alert Dialog··············
Popover·············
Tooltip··············
Toggle Tip··············
Tour···········

Layout & disclosure

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Disclosure·············
Accordion·············
Reveal··············
Scroll Area··············
Splitter···········
Split View···········

Feedback & status

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Async Content···············
Live Loader··············
Retry Loader···············
Toast··············
Toast Stack··············
Banner··············
Activity Log··············
Progress···············
Meter···············

Accessibility foundations

ComponentAxeNameRovingFocusEscapeSelectUndoCopyPasteDragCancelRestoreReorderRenameRemoveOpen
Skip Link··············
Focus Ring··············
Icon Bar··············
Reflow Bar··············