Usage
Select is a single-select dropdown backed by a fixed, predictable list. It enforces valid choices (unlike free text) and is faster to scan than a combobox when the list is short. The mental model is "pick one from a menu you already know": timezones, agencies in a short set, an operator's assigned roles, a preset sort order. Dispatch also uses Select as the responsive collapse target for tab strips—when a tab row no longer fits a narrow rail, the options become a select while the state and labels stay the same.
When the set is knowable up front and fits inside a menu without scrolling becoming the dominant experience.
Timezone pickers, status filters, language choices, agency pickers in small deployments. Typing adds no speed when the list is short.
When a TabMenu or Tabs row wraps awkwardly on narrow screens, render the same options as a Select with hideLabel. The state and accessibility contract stay the same; the control shape adapts to the viewport.
Integration keys, MIME filters, sort orders, protocol versions—places where an arbitrary string could create a downstream error. A select is the simplest way to keep the input within the valid set.
Use Combobox. When the list is long or dynamic, typeahead is the whole point.
Use SegmentedControl. Keeping the options visible is faster than opening a menu when the set is tiny and the change is frequent.
Use links, TabNav, or Sidebar. A select that changes the URL is a link wearing a dropdown's chrome.
Use Switch or a two-option segmented control. A select for on/off costs an extra click and hides the current value.
| Variant | Purpose | Emphasis |
|---|---|---|
| Standard | Labeled select in forms and filter bars | Label above, trigger below, helper text inline |
| Grouped | Options organized into labelled buckets | Use sentence-case group labels; keep the hierarchy shallow |
hideLabel | Minimal trigger, responsive tab collapse | Provide label for accessibility; trigger becomes icon-minimal |
| Disabled options | Options retained but not selectable | Keep visible when operators need to see unavailable choices and why |
A select is a trigger (with selected label or placeholder), a listbox menu, and one or more SelectItems. Group headings and separators organize long menus. The trigger sits inside a form field with a label above and optional helper text below; disabling the control disables the whole field. Use hideLabel only where an accessible name is supplied another way (a visible adjacent field, an explicit aria-label).
formatMessage. Labels describe the field ("Agency"), not the action ("Select an agency").aria-disabled. Keep disabled options visible when the rationale matters; hide them when the list is long and the rationale is obvious.Do
Don't
Switch or a two-option SegmentedControl is faster.hideLabel without providing an accessible name elsewhere.Radix handles the listbox semantics, keyboard model, and ARIA attributes. The app still owns the label association, hideLabel accessible-name fallback, and error messaging. See Accessibility for the full keyboard map, announcement sequences, and grouped-options behavior.
On this page