Select
A rich dropdown for picking a single option from a list. Built on base-ui Select — it renders a portaled, fully styleable popup, so items can carry icons, descriptions, groups, and separators that a native <select> can’t.
Reach for this over NativeSelect when you need custom-rendered options or a consistent look across platforms; the NativeSelect is lighter and better for plain text options or mobile-first forms. Reach for Combobox instead when the list is long enough to need type-ahead filtering — Select has no search input.
Compose the parts: Select (root, owns the value), SelectTrigger (the button), SelectValue (renders the current selection or placeholder), SelectContent (the popup), SelectItem (one option), and SelectGroup + SelectLabel + SelectSeparator for sectioning.
Basic
A trigger, a value, and a flat list of items. Give SelectValue a placeholder for the empty state, and seed an initial selection with defaultValue on the root.
Grouped options
Wrap related items in SelectGroup, head each group with a SelectLabel, and divide groups with SelectSeparator. Useful for sectioned lists like warehouses by region.
Disabled items
Mark an individual option unselectable with disabled on the SelectItem — it dims and skips keyboard focus while the rest of the list stays usable.
Controlled
Select is uncontrolled by default — pass defaultValue. To drive it yourself, pass value and onValueChange. When you control it, give SelectValue an items array ({ value, label }) so the trigger shows the option’s label instead of its raw value.
Current status: pending
Reference
Select
Root container. Extends base-ui Select.Root props.
| Prop | Type | Default | Description |
|---|---|---|---|
defaultValue | any | — | Initially selected value (uncontrolled) |
value | any | — | Selected value (controlled) |
onValueChange | (value) => void | — | Fires when the selection changes |
disabled | boolean | false | Disables the whole control |
name | string | — | Field name when used inside a form |
SelectTrigger
The button that opens the popup. Extends base-ui Select.Trigger props.
| Prop | Type | Default | Description |
|---|---|---|---|
size | "md" | "sm" | "md" | Trigger height |
className | string | — | Merged onto the trigger |
SelectTriggerButtonis an alternative trigger that renders through theButtoncomponent (defaults tovariant="ghost",size="sm") — use it when the trigger should blend into a toolbar or card header instead of looking like a bordered input.
SelectValue
Renders the current selection inside the trigger. Extends base-ui Select.Value props.
| Prop | Type | Default | Description |
|---|---|---|---|
placeholder | string | — | Shown when nothing is selected |
items | ReadonlyArray<{ value, label }> | — | Look-up table so the trigger shows a label, not the raw value |
children | (value) => ReactNode | — | Custom render function (alternative to items/placeholder) |
SelectContent
The portaled popup. Extends base-ui Select.Popup plus positioning props.
| Prop | Type | Default | Description |
|---|---|---|---|
side | "top" | "right" | "bottom" | "left" | "bottom" | Side of the trigger to open on |
sideOffset | number | 4 | Gap between trigger and popup |
align | "start" | "center" | "end" | "center" | Alignment along the trigger edge |
alignOffset | number | 0 | Offset along the alignment axis |
alignItemWithTrigger | boolean | false | Anchor the selected item over the trigger |
SelectItem
A single option. Extends base-ui Select.Item props.
| Prop | Type | Default | Description |
|---|---|---|---|
value | any | — | The value selecting this item sets |
disabled | boolean | false | Prevents selection and keyboard focus |
SelectGroup
Groups a set of items. Extends base-ui Select.Group props.
SelectLabel
A heading for a group. Extends base-ui Select.GroupLabel props.
SelectSeparator
A horizontal divider between groups. Extends base-ui Select.Separator props.