Select
Single-choice dropdown on Radix Select — the DS's styling layer, not a rewrite of its behavior.
A thin styling wrapper over Radix Select:
Select / SelectTrigger / SelectContent / SelectItem / SelectValue compose exactly like the
primitive, styled to the DS. Every Radix prop passes through unchanged — this page doesn't re-document
Radix's own API, only the conventions specific to this styling layer.
Choosing between Select and Combobox
The design system ships two single-select dropdowns on purpose. They look the same — both wear the same 44px field shell — and differ only in interaction:
Select | Combobox | |
|---|---|---|
| Use for | short, fixed, known-at-build-time sets — a status, a sort direction, a currency | long lists, or option sets fetched at runtime |
| Renders | a button and a listbox | an ARIA 1.2 combobox: an editable text input and a popup listbox |
| Filter by typing | no | yes |
Why this isn't one component with a searchable prop. A combobox announces itself to a screen
reader as an editable field, and opens the keyboard on mobile. For a three-option list both are
wrong: there is nothing to type, and a keyboard covering half the screen to pick "Ascending" is a
regression. Select stays a button precisely so a short list behaves like one.
If more than one value can be chosen, neither applies — reach for MultiSelect.
Implementation notes
SelectTriggerneeds its own accessible name. Unlike a native<select>, nothing associates a visible<Label>automatically — passaria-label(or pair it with a<Label htmlFor>) directly on the trigger.- For picking several values, this isn't the component.
Selectcommits to one RadixRootwith one current value; useMultiSelectwhen more than one option can be chosen at once, rather than working aroundSelect's single-value model.
Do / Don't
- Do control
value/onValueChangefrom the consumer — this composes with whatever state a filter panel or form already holds. - Don't style
SelectContentper-consumer to fake a multi-select or a combobox — reach for the purpose-built component instead of bending this one past what Radix's single-select model supports. - Don't add a filter input above a
Selectto make a long list bearable — that is aCombobox, and it already handles the keyboard and screen-reader semantics that pairing does not.