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

PropTypeDefaultDescription
valuestringControlled value
defaultValuestringDefault value (uncontrolled)
onValueChange(value: string) => voidCallback when value changes
disabledbooleanfalseDisable the select
requiredbooleanfalseMark as required in forms

SelectItem Props

PropTypeDefaultDescription
value*stringUnique value for this option
disabledbooleanfalseDisable this item
children*ReactNodeOption 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 option

Keyboard Navigation

KeyAction
Space/EnterOpen dropdown
Arrow Up/DownNavigate options
Home/EndJump to first/last option
EnterSelect option
EscapeClose dropdown
Type charactersJump to matching option

Notes

  • Focus management handled automatically
  • Disabled options are not focusable
  • Selected option is announced
  • Groups provide semantic structure