Skip to content

Select

Dropdown selector with keyboard navigation. The panel opens with ease-out animation, options support hover highlight and arrow key navigation.

Basic Usage

tsx
import { Select } from '@airo-ui/react'
import { useState } from 'react'

const fruits = [
  { label: 'Apple', value: 'apple' },
  { label: 'Banana', value: 'banana' },
  { label: 'Cherry', value: 'cherry' },
  { label: 'Durian', value: 'durian', disabled: true },
  { label: 'Lemon', value: 'lemon' },
]

function Demo() {
  const [value, setValue] = useState(null)

  return (
    <div>
      <Select
        value={value}
        onChange={(v) => setValue(v)}
        options={fruits}
        placeholder="Choose a fruit"
      />
      <p style={{ marginTop: 12, fontSize: 13 }}>
        Value: {value ?? 'null'}
      </p>
    </div>
  )
}

Clearable

tsx
<Select value={value} onChange={setValue} options={options} clearable />

Disabled Item & Disabled Select

tsx
<Select value={value} onChange={setValue} options={options} />
<Select value={null} options={options} disabled placeholder="Not selectable" />

Size

tsx
<Select value={value} onChange={setValue} options={options} size="sm" placeholder="sm" />
<Select value={value} onChange={setValue} options={options} size="md" placeholder="md" />
<Select value={value} onChange={setValue} options={options} size="lg" placeholder="lg" />

API

Props

NameTypeDefaultDescription
valuestring | number | null--Controlled selected value
defaultValuestring | number | nullnullDefault value (uncontrolled)
optionsSelectOption[][]Options array
placeholderstring--Placeholder when nothing selected
disabledbooleanfalseDisable entire select
clearablebooleanfalseShow clear button
size'sm' | 'md' | 'lg''md'Size
onChange(value: SelectValue, option: SelectOption | null) => void--Selection change handler

SelectOption

ts
interface SelectOption {
  label: string
  value: string | number
  disabled?: boolean
}

Keyboard Interaction

KeyBehavior
Space / EnterOpen panel; confirm highlighted item when open
ArrowDown / ArrowUpMove highlight, skip disabled items
EscapeClose panel
TabClose panel and focus next element

Accessibility

  • Trigger uses native <button>, aria-haspopup="listbox" and aria-expanded reflect state
  • Panel uses role="listbox", options use role="option" with aria-selected
  • Disabled items exposed via aria-disabled
  • Auto-closes on outside click or Escape

MIT License