Axon 911 Frontend Docs
    Loading navigation…
U
User
Switch to light mode
  1. Components
  2. Combobox
  3. Accessibility

Combobox

Accessibility

Documentation below is split by multiSelect. Default single-select follows the combobox + listbox pattern with typeahead. multiSelect keeps focus on the inline search input and moves a highlight through option rows via aria-activedescendant.
Single-select mode (default)
What the component handles
  • Combobox semantics. Input is role="combobox" with aria-expanded, aria-controls pointing at the listbox, and aria-activedescendant reflecting the highlighted option.
  • Listbox semantics. Results render with role="listbox"; each option has role="option" and reflects aria-selected.
  • Keyboard navigation. Arrow keys move through results without removing focus from the input.
  • Selection. Enter activates the highlighted option; value and input text sync per configuration.
What you must provide
  • Label. Always pass a visible label (trigger / selected-value text). For form fields that need a required asterisk, compose an external Label with required and set Combobox required for aria-required—do not expect an asterisk on the trigger itself.
  • Status messages. Announce result counts in a polite live region when the filter changes ("12 results", "No results found").
  • Empty state. Zero results should show explanatory text, not a silent empty listbox.
  • Async loading. Indicate loading without trapping focus (aria-busy on the list region when appropriate).
Keyboard behavior
  • Type filters results.
  • Arrow Down / Up moves the highlighted option; Home / End jump to first / last.
  • Enter selects the highlighted option.
  • Escape clears the input or closes the menu depending on state.
  • Tab leaves the combobox and closes the menu.
When searchable={false} there is no search input. Opening the popover moves focus into the cmdk root (not the Radix Popover wrapper) so Arrow keys, Enter, and Escape work. Option rows stay tabIndex={-1} so Tab still moves between triggers rather than through items.
Focus management
Focus stays in the input while browsing searchable single-select results; activating an option closes the listbox and keeps focus there unless configuration moves focus elsewhere. Without a search field, focus moves to the command list on open so keyboard navigation is available immediately.
Screen reader announcements
Typical sequence:
  1. Input focused → field name and combobox role announced.
  2. Type to filter → polite region announces result count.
  3. Arrow down → option position ("Spanish, option, 1 of 3").
  4. Enter → selection confirmed.
Multi-select mode (multiSelect)
  • Listbox semantics. Options render as role="option" with aria-selected; selected rows also show a trailing checkbox for sighted users. Keep labels short and unique so screen reader users can scan the list efficiently.
  • Nested row actions. The trailing checkbox and optional info control sit in an aria-hidden actions region and are not tab stops (tabIndex={-1}). Selection for assistive tech is aria-selected on the option—do not expose a second checkbox widget in the accessibility tree.
  • Option tooltips. Optional options[].tooltip is exposed to screen readers through aria-describedby (visually hidden description). The info icon remains a pointer/hover affordance for the visual tooltip. The content renders twice (visible tooltip + hidden description), so pass plain strings or id-less nodes — a node carrying its own id would be duplicated in the DOM.
  • Chips field / input. The inline search input carries role="combobox" with aria-expanded, aria-controls, aria-activedescendant, and aria-autocomplete="list". Pills supplement but must not replace the accessible name of the control.
  • Keyboard. Arrow Down / Up (and Home / End) move the highlight while focus stays in the input; Home / End skip disabled options; Enter or Space (when the search input is empty) toggles the highlighted option without closing; Escape closes the popover and keeps focus on the input; Backspace or Delete on an empty search input removes the most recently selected value first (collapsed +N more entries before pills still visible in the field). Option rows are not Tab stops — focus stays on the search input with aria-activedescendant. Tab can move into the Clear / Close footer buttons; Clear resets selection without closing, Close dismisses the panel. Storybook MultiSelectKeyboardNavigation demos this full pattern.
  • Badge overflow. Selected pills wrap with inline search and the field grows vertically for up to three rows; when they overflow that limit, a +N more control exposes the hidden values in a checkbox Menu. The overflow trigger has an accessible button name (for example "+3 more"). Overflow rows are menuitemcheckbox widgets with a decorative check indicator (not a nested interactive checkbox). The overflow menu and the Combobox options popover are mutually exclusive—opening one closes the other.
  • Overflow menu keyboard. Arrow keys move through checkbox items; Space/Enter toggles checked state without dismissing the menu; Escape closes the overflow menu. If recalculation removes overflow while the menu is open, the menu closes and focus returns to the combobox search input.
  • Announcements. When selection counts change materially, polite updates ("3 selected") help; debounce so rapid toggles do not stutter assistive tech.
  • Cross-reference. For heterogeneous checkbox menus, see Menu accessibility; keep Combobox field label plus pill summary as the product contract for this component.
Semantics and roles (single-select)
  • Input exposes aria-autocomplete (list or both) depending on configuration.
  • Listbox is hidden from the accessibility tree when collapsed.
  • Selected option uses aria-selected, not visual-only treatment.
Known caveats
  • Debouncing. Announce counts on a debounce so every keystroke does not stutter assistive tech.
  • Large result sets. Cap visible results when needed; communicate truncation if operators must refine search; surface totals in polite regions when virtualized.
  • Custom item rendering. Rich option content must keep the accessible name short; supplementary text can use aria-describedby.
  • Mode coverage. Regression-test both modes; listbox assumptions do not cover multiSelect.
Previous
Combobox / API and Development
Next
Confirm Morph / Usage
On this page
Single-select mode (default)
What the component handles
What you must provide
Keyboard behavior
Focus management
Screen reader announcements
Multi-select mode (multiSelect)
Semantics and roles (single-select)
Known caveats