Select
A trigger that opens a popup list for choosing one or several options.
Usage
Select is a compound component. The root holds the value and shared options (size, variant, multiple, alignItemWithTrigger); the parts compose the trigger and the portalled popup:
SelectTrigger— the button styled likeInput. Add a clear button withclearable, and adornments withstartSlot/endSlot.SelectValue— renders the current selection inside the trigger. Pass aplaceholder, or a function child to format the value (e.g. for multi-select).SelectContent— the portalled, auto-positioned popup. Accepts the shared floating props (side,align,sideOffset, …).SelectItem— one option; itsvalueis what selection reports.SelectGroup/SelectGroupLabel/SelectSeparator— optional structure for grouped lists.
Reach for a Select when the options are short and known. For a long list users need to filter by typing, use a Combobox or Autocomplete instead.
Examples
Variants
variant switches the trigger appearance between a bordered outline (default) and a filled soft field.
Sizes
size on the root scales the trigger, popup radius, and items together — sm, md (default), or lg.
Grouped options
Wrap related items in SelectGroup with a SelectGroupLabel, and divide groups with SelectSeparator. Mark an option disabled to make it unselectable.
Clearable
Set clearable on the trigger to add a clear (✕) button that resets the selection once a value is present.
Disabled & error states
disabled on the root greys out the trigger and blocks interaction. Set aria-invalid on the SelectTrigger to paint the error state — it's mirrored to data-invalid. Inside a Field, the trigger also inherits the field's disabled and invalid state, which is the better choice when you're rendering a validation message.
Start & end slots
SelectTrigger accepts startSlot and endSlot for adornments — an icon, a badge, a unit — rendered inside the trigger frame, around the value.
Disable alignItemWithTrigger when using a startSlot
By default alignItemWithTrigger overlays the selected item directly on top of the trigger when the popup opens (an
iOS-style picker). That alignment assumes the value starts at the trigger's leading edge, so a startSlot throws the
popup's horizontal position off. Whenever you add a startSlot, set alignItemWithTrigger={false} on the Select so
the popup anchors below the trigger instead.
Country select
A compact country picker: each item shows a flag before the name, and the selected country's flag is mirrored into the trigger through startSlot. Because of that slot, the root sets alignItemWithTrigger={false}. For a long, searchable country list, use a Combobox instead.
User select
Rich items with an Avatar, a name, and a trailing role — a typical "assign to" picker. The chosen person's avatar is echoed into the trigger via startSlot (so alignItemWithTrigger is off here too).
Multiple selection
Set multiple on the root and the value becomes an array. Selected items keep a check, and a function child on SelectValue formats the trigger summary.
Controlled
Drive the selection yourself with value + onValueChange — useful for syncing with form state or reacting to every change. Use null (or [] when multiple) for the empty value.
RTL
Every Appica UI component supports right-to-left layouts out of the box. Set the dir attribute on a container (commonly your <html> element) so CSS logical properties resolve correctly, and wrap your tree in DirectionProvider so direction-aware behavior — roving focus, popup placement, and the like — follows the same direction.
The trigger, popup, and check indicators all mirror to follow the resolved direction. For setup details and caveats, see the RTL guide.
API reference
Select wraps Base UI's Select. Each part forwards every remaining prop to the matching Base UI primitive, so anything it accepts works here — the tables below list the Appica additions and the most common props. See the Base UI docs for the complete API.
Select
The root. Holds the value and shared styling/behavior options; renders no DOM of its own.
SelectTrigger
The button that opens the popup, styled like Input.
Also forwards every native <button> prop (onClick, aria-*, ref, …).
SelectValue
Renders the current selection inside the trigger.
SelectContent
The portalled, auto-positioned popup wrapping the list. Accepts the shared floating props.
SelectItem
One option in the list.
SelectGroup
Wraps one labelled section of the list.
SelectGroupLabel
The visible label for a SelectGroup.
SelectSeparator
A thin divider between groups.
Accessibility
- The trigger has
role="combobox"; the popup is alistboxand items areoptions. Selection and active state are wired througharia-activedescendantandaria-selected. - Space / Enter / ↓ open the popup, ↑/↓ move the highlight, Enter selects, Escape closes, and typing a letter jumps to the matching option (typeahead).
- Give the trigger an accessible name — an adjacent
<label>,aria-label, oraria-labelledby. - When
clearableand a value is present, the trigger clears on Delete / Backspace (keeping focus on the trigger); the pointer ✕ affordance is decorative (aria-hidden). disabledremoves the control from the tab order;readOnlykeeps it focusable but inert.aria-invalidon the trigger is bridged todata-invalidso the error state styles with or without a wrappingField.- Popup enter/exit transitions are skipped when the user prefers reduced motion.