Select is a user interface control that lets users choose a single option from a dropdown list. Triggered by a button, it displays a list of options and collapses once an option is selected, showing the chosen value.
Can be controlled or uncontrolled
Multiple variants, sizes and border radii
Animated using Motion
Two positioning modes
Fully managed focus, keyboard navigation
Handles invalid appearance
Easy to customize
Respects reduce motion via system settings and props
Provides additional control over the styling, icons and data, while still being simple to use.
component fully support original Radix API. Customize anything you want.
There’s an additional component built specifically for easy and clean isomorphic form validation. It leverages Conform and Zod, providing a single source of truth for both frontend and backend while preserving native browser validation APIs. It also seamlessly integrates with the latest React 19 features, such as :
Control motion with prop. Additionally, respects user system "Reduce motion" settings.
Animations work only when position set to .
You can use any Motion values:
Each animation comes with predefined
Alternatively, you can choose transition from this list:
Additionaly, you can control the duration of the transition:
You can use any Motion values:
Prop | Type | Default |
---|---|---|
options* | OptionDataProps[] | ― |
groupedOptions* | GroupedOptionDataProps[] | ― |
size | enum | "default" |
radius | enum | ― |
reduceMotion | boolean | false |
indicator | ReactNode | ― |
animation | AnimationProps | ― |
animationPreset | enum | ― |
transition | Transition | ― |
transitionPreset | enum TransitionPreset | ― |
placeholder | ReactNode | ― |
icon | ReactNode | ― |
invalid | boolean | ― |
Prop | Type | Default |
---|---|---|
size | enum | "default" |
radius | enum | ― |
reduceMotion | boolean | false |
Support all Radix API
Prop | Type | Default |
---|---|---|
size | enum | "default" |
radius | enum | ― |
placeholder | ReactNode | ― |
icon | ReactNode | ― |
invalid | boolean | ― |
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
Prop | Type | Default |
---|---|---|
size | enum | "default" |
radius | enum | ― |
animation | AnimationProps | ― |
animationPreset | enum | ― |
transition | Transition | ― |
transitionPreset | enum TransitionPreset | ― |
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
Uses as default icon, but could be replaced with any custom.
Abstracted Radix Item components, contains , , .
Prop | Type | Default |
---|---|---|
indicator | ReactNode | ― |
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
Support all Radix API
// Option #1. Abstracted simplified usage:
<Select />
// Option #2. Mixed API for additional control:
<Select>
<SelectItem>
<SelectItemText />
<SelectItemIndicator/>
</SelectItem>
</Select>
// Option #3. Full Radix API for advanced customization:
<SelectRoot>
<SelectTrigger>
<SelectValue />
<SelectIcon />
</SelectTrigger>
<SelectPortal>
<SelectContent>
<SelectScrollUpButton />
<SelectViewport>
<SelectItem>
<SelectItemText />
<SelectItemIndicator />
</SelectItem>
<SelectGroup>
<SelectLabel />
<SelectItem>
<SelectItemText />
<SelectItemIndicator />
</SelectItem>
</SelectGroup>
<SelectSeparator />
</SelectViewport>
<SelectScrollDownButton />
<SelectArrow />
</SelectContent>
</SelectPortal>
</SelectRoot>
Select
SelectField
useServerAction
reduceMotion
Select
popper
forceMount
popper
side
sideOffset
align
alignOffset
avoidCollisions
collisionBoundary
collisionPadding
arrowPadding
sticky
hideWhenDetached
transform-origin
align
transform-origin
align
transform-origin
align
transform-origin
align
Animation
transitionPreset
default
anticipate
quickOut
overshootOut
swiftOut
snappyOut
inOut
inQuad
inCubic
inQuart
inQuint
inExpo
inCirc
outQuad
outCubic
outQuart
outQuint
outExpo
outCirc
inOutQuad
inOutCubic
inOutQuart
inOutQuint
inOutExpo
inOutCirc
inOutBase
in
out
linear
<Select
animationPreset="motion"
transitionPreset={{
ease: "inOutExpo",
duration: 0.6,
}}
/>
Transition
CheckIcon
SelectItem
SelectItemText
SelectItemIndicator