Appica UIUI 1.0.0

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 like Input. Add a clear button with clearable, and adornments with startSlot / endSlot.
  • SelectValue — renders the current selection inside the trigger. Pass a placeholder, 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; its value is 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.

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 a listbox and items are options. Selection and active state are wired through aria-activedescendant and aria-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, or aria-labelledby.
  • When clearable and a value is present, the trigger clears on Delete / Backspace (keeping focus on the trigger); the pointer ✕ affordance is decorative (aria-hidden).
  • disabled removes the control from the tab order; readOnly keeps it focusable but inert.
  • aria-invalid on the trigger is bridged to data-invalid so the error state styles with or without a wrapping Field.
  • Popup enter/exit transitions are skipped when the user prefers reduced motion.

© 2026 Appica UI. A free component library, crafted by the Appica team.