Select
Forms
Selection
Accessible dropdown select menus with keyboard navigation, built on Radix UI primitives. Supports groups, separators, and disabled options.
Preview
Basic dropdown selection
Grouped Options
Organize options into groups with labels
Form with Multiple Selects
Common use case in forms
Disabled State
Disabled select and individual options
Props
Select component API reference
| Prop | Type | Default | Description |
|---|---|---|---|
value | string | — | Controlled value |
defaultValue | string | — | Default value (uncontrolled) |
onValueChange | (value: string) => void | — | Callback when value changes |
disabled | boolean | false | Disable the select |
required | boolean | false | Mark as required in forms |
SelectItem Props
| Prop | Type | Default | Description |
|---|---|---|---|
value* | string | — | Unique value for this option |
disabled | boolean | false | Disable this item |
children* | ReactNode | — | Option content |
Usage
Import and implementation example
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
SelectSeparator,
} from '@/components/ui/select'
export default function Example() {
const [value, setValue] = useState('')
return (
<>
{/* Basic select */}
<Select>
<SelectTrigger>
<SelectValue placeholder="Select an option" />
</SelectTrigger>
<SelectContent>
<SelectItem value="option1">Option 1</SelectItem>
<SelectItem value="option2">Option 2</SelectItem>
<SelectItem value="option3">Option 3</SelectItem>
</SelectContent>
</Select>
{/* Controlled select */}
<Select value={value} onValueChange={setValue}>
<SelectTrigger>
<SelectValue placeholder="Choose..." />
</SelectTrigger>
<SelectContent>
<SelectItem value="a">Choice A</SelectItem>
<SelectItem value="b">Choice B</SelectItem>
</SelectContent>
</Select>
{/* With groups */}
<Select>
<SelectTrigger>
<SelectValue placeholder="Select..." />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectLabel>Group 1</SelectLabel>
<SelectItem value="1a">Item 1A</SelectItem>
<SelectItem value="1b">Item 1B</SelectItem>
</SelectGroup>
<SelectSeparator />
<SelectGroup>
<SelectLabel>Group 2</SelectLabel>
<SelectItem value="2a">Item 2A</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</>
)
}Features
Built-in functionality
- Keyboard navigation: Arrow keys, Home, End, Page Up/Down
- Type-ahead search: Type to filter options
- Grouped options: Organize with labels and separators
- Radix UI primitives: Built on accessible components
- Smooth animations: Fade and zoom transitions
- Disabled support: Disable entire select or individual options
- Controlled mode: Support for controlled and uncontrolled usage
- Dark mode: Full dark mode support
Accessibility
Accessibility considerations
ARIA Attributes
Uses native listbox semantics via RadixTrigger has role="combobox"Options have role="option"aria-selected indicates selected optionKeyboard Navigation
| Key | Action |
|---|---|
| Space/Enter | Open dropdown |
| Arrow Up/Down | Navigate options |
| Home/End | Jump to first/last option |
| Enter | Select option |
| Escape | Close dropdown |
| Type characters | Jump to matching option |
Notes
- Focus management handled automatically
- Disabled options are not focusable
- Selected option is announced
- Groups provide semantic structure