Skip to main content

What it is

A control that chooses from a fixed, enumerable set of options, collapsed behind a trigger until the reader opens it. The collapse is the point — it is the right choice once showing every option at once, as Radio does, would cost more space than it returns. This page covers single-select and multi-select together, since choosing between them is one decision about the same field.

Live example

Exports

Vocabulary

Autocomplete is a mode of this same component, not a separate “Combobox” — see Vocabulary and Open issues for the correction and its sign-off status.

Choose Select when

  • The set of valid answers is fixed and enumerable, and long enough — roughly more than five — that showing every option at once would cost more space than it returns.
  • The reader mainly needs to see the chosen value, not compare every option side by side.

Choose something else when

Anatomy

Options nest one level. The Figma library’s option-list component names two option kinds, Menu Item and Menu Sub-Item, each carrying the same state set (Default · Hover · Focused · Pressed · Disabled) and each combinable with a divider and a selected mark. This is a real structural axis this page did not previously account for — see TITAN-SELECT-08.

Variants, sizes, and states

Confirmed from the Figma library, not source. The trigger has Type (Default · Error) and State (Default · Focused · Filled · Disabled) axes, plus Autocomplete (false/true) — see Vocabulary. Filled here means “has a value,” distinct from the empty default — a state this page did not previously name.

Edge and failure states

Tokens

Composition

The closed trigger renders through the same field chrome as Input — border, focus ring, and control height are shared, not re-declared. Always paired with FieldLabel above it. The open option list’s items are named Menu Item / Menu Sub-Item in the design library — the same vocabulary Menu uses — suggesting shared overlay implementation. Unconfirmed against source; treat as likely, not settled. For a complete field rather than the bare control, compose through FormInput with type="select" — see TITAN-SELECT-09.

Content

Accessibility

  • The accessible name comes from FieldLabel, not from the currently-shown value.
  • The trigger and list follow the standard listbox interaction pattern: the trigger reports its expanded state, and the currently highlighted option is announced as focus moves through the list without moving actual DOM focus off the trigger.
What this component does not handle: validating that a selection was made, or deciding whether the field is required — both belong to Form validation.

Constraints

Known issues

Select: open issues

Divergences, open decisions, and undocumented gaps for Select.

Why it works this way

The collapse is the trade the fork with Radio is drawn around. Below roughly five options, showing all of them costs little and saves the reader a click; above that, the space a visible list would take outweighs the convenience, which is why Choose something else when draws the line there rather than at some other count. Option order matters more here than in a visible list, because a reader scanning a Radio group can notice a strange ordering before interacting with it. A Select’s options are hidden until opened, so a confusing order is discovered mid-interaction — a worse moment to lose the reader’s confidence in the control. A summarized multi-select trigger exists for the same reason Button holds its width while loading: a control that grows every time the reader acts on it moves whatever sits next to it, at the exact moment the reader is mid-task.

Status

  • FieldLabel — every Select composes with one
  • Input — shares the closed trigger’s field chrome
  • Checkbox — the always-visible alternative for multi-select
  • Form validation — decides whether a selection is required
Last modified on September 7, 2026