Select

Dropdown selector on bits-ui Select. The content springs open with a snappy scale-in, anchors to the trigger width, and the caret icon flips through color only — never layout.

Usage

Grouped options

Scrollable

Long option lists scroll inside a max-height constrained content panel.

States

Inverted

Set variant="inverted" on the content for a dark menu over a light app — Bloom's signature menu identity. Surface and accent CSS vars swap at the content root, so item rows, separators, and focus rings flip contrast automatically.

Select.Root props

Inherits bits-ui Select.Root props via spread. Type must be set to discriminate single vs multiple selection.

PropTypeDescription
'single' | 'multiple'Whether one value is selected at a time, or an array of values.
string | string[] (bindable)Current selection. Two-way bindable.
boolean (bindable)Whether the popover content is rendered.
booleanDisables the whole control.
Array<{ value: string; label?: string; disabled?: boolean }>Optional typeahead source. When omitted, typeahead still works against Select.Item labels.

Select.Content props

Inherits bits-ui Select.Content props via spread.

PropTypeDescription
'default' | 'inverted'Surface treatment. Inverted swaps popover/accent CSS vars to render dark on light (and light on dark).
stringMerged onto the content surface via tailwind-merge.

Select.Trigger props

Adds project-specific variant + size. Inherits bits-ui Select.Trigger props via spread.

PropTypeDescription
'bordered' | 'borderless'Visual weight. Borderless hugs toolbar buttons; bordered is the standalone form field.
'default' | 'sm'Controls trigger height via a data-size attribute.
'true' | 'false'Flips the focus ring to destructive.
HTMLButtonElement | nullTwo-way-bindable element reference.
stringMerged onto the trigger via tailwind-merge.