Skip to content

Select

Wrapper around the native select element.

Browsers
Chrome 135+Firefox 121+
Why this version?

Firefox keeps the native select control. This custom styling uses ::picker(select), :open, and option::checkmark, which Firefox does not support yet.

Safari 17+
Why this version?

Safari keeps the native select control. This custom styling uses ::picker(select), :open, and option::checkmark, which Safari does not support yet.

Tier
0
Bundle compressed
480 B
Forced layout budget
0 ms
Axe budget
0
SSR compatible
Yes
Published contract
Test harness

Playground

Select

Default

Grouped

Pet

Separated

Long value

API

Select.Root

PropTypeDefaultDescription
childrenReactNode—Select parts, normally a Select.Content holding items and groups.
valuestring—Selected value, making the select controlled.
defaultValuestring—Value selected on first render; the native select owns selection from then on, so it works without JavaScript.
onValueChange(value: string) => void—Called with the new value when the selection changes.
namestring—Form field name submitted with the selected value.
disabledbooleanfalseDisables the native select and sets the data-disabled attribute.
renderReactElement | ((props, state) => ReactElement)—Replace the rendered element while keeping behavior and accessibility wiring.

Select.Content

PropTypeDefaultDescription
childrenReactNode—Items, groups and separators; the part renders its children without adding an element.

Select.Item

PropTypeDefaultDescription
childrenReactNode—Text shown for this option.
disabledbooleanfalseMakes this option unselectable.
value*string—Value submitted when this option is selected.
renderReactElement | ((props, state) => ReactElement)—Replace the rendered element while keeping behavior and accessibility wiring.

Select.Group

PropTypeDefaultDescription
childrenReactNode—Items belonging to this group.
label*string—Group heading shown by the native option group.
renderReactElement | ((props, state) => ReactElement)—Replace the rendered element while keeping behavior and accessibility wiring.

Select.Separator

PropTypeDefaultDescription
renderReactElement | ((props, state) => ReactElement)—Replace the rendered element while keeping behavior and accessibility wiring.

Keyboard

KeyAction
Arrow keysChange option when focused
SpaceOpen native picker (platform)

Accessibility

Text-only native <select>; the browser owns selection, keyboard input, typeahead, and form submission. Supporting engines enhance only the picker appearance.

Styling hooks

data-disabled