Select

Selects capture one or more values from a list behind a compact trigger, in a family that spans search, counts, tags, and the platform picker.

Demo

Change the props and copy the result. The two entries mirror the sheet’s frames: Select carries the full Type axis, with search and tags rendering the ComboBox and TagSelect members, and Multi-select brings its controlled wiring. Snippets always emit the real component with the props you set, never a simplified stand-in. The two controlled entries, MultiSelect and TagSelect, also emit their state wiring — a useState or useListData call — which belongs inside your own component rather than at the top level where the snippet shows it.

Team member
Component
type
size
import { Select } from "@/components/base/select/select"; <Select size="lg" label="Team member" placeholder="Select team member" className="w-70" defaultSelectedKey="olivia" items={[ { id: "phoenix", label: "Phoenix Baker", supportingText: "@phoenix" }, { id: "olivia", label: "Olivia Rhye", supportingText: "@olivia" }, { id: "lana", label: "Lana Steiner", supportingText: "@lana" }, { id: "demi", label: "Demi Wilkinson", supportingText: "@demi" }, ]} > {(item) => <Select.Item {...item} />} </Select>

The family

6 components, and every popover member shares one items contract: id, label, supporting text, and an icon or avatar per item. The single-value Select is the default; the others trade its trigger for search, counts, or tags, and NativeSelect swaps the popover for the OS picker with plain options.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
SelectThe single-value dropdown field: label, trigger button, popover listbox, and hint.@/​components/​base/​select/​select
SelectItemOne option row, also available as Select.Item; carries icons, avatars, supporting text, and the selection indicator.@/​components/​base/​select/​select-item
ComboBoxThe searchable select, also available as Select.ComboBox: a text input that filters the list as you type.@/​components/​base/​select/​combobox
MultiSelectSeveral values behind one compact trigger that reads “2 selected”; the popover carries search, checkboxes, and a footer.@/​components/​base/​select/​multi-select
TagSelectSeveral values shown as removable tags inside the field, filtered by typing.@/​components/​base/​select/​tag-select
NativeSelectA styled wrapper around the platform’s own select element; options open in the OS picker.@/​components/​base/​select/​select-native

Sizes

The 3 sizes, read from the kit’s exported style object. Triggers measure 36, 40, and 44px tall, matching the same-named input and button sizes, so mixed rows sit flush. The popover follows the trigger’s width and caps its height per size.

Variants by size
smmdlg
Team memberThis is a hint text to help user.
Team memberThis is a hint text to help user.
Team memberThis is a hint text to help user.

Hover and focus states are live. Interact with any cell.

Trigger content

The 4 content forms of the closed field, mirroring the Figma component’s Type axis. The trigger echoes whatever the selected item carries: its icon, its avatar, or its supporting text. The dot form has no prop of its own; the item’s icon slot carries the foundations Dot, which is the audit-recorded gap between the sheet and the kit.

default
icon leading
avatar leading
dot leading

Items

The option rows inside the popover, rendered here in the same React Aria listbox the popover wraps, so every treatment is the kit’s own painting. Selection defaults to a right-aligned checkmark; a checkbox indicator and an indicator-free form are opt-in per item. Hover any row, or click to move the selection.

rest, selected, disabled (live)
Phoenix Baker@phoenix
Olivia Rhye@olivia
Lana Steiner@lana
Demi Wilkinson@demi
Candice Wu@candice
Natali Craig@natali
Drew Cano@drew
selectionIndicator="checkbox", left
Phoenix Baker@phoenix
Olivia Rhye@olivia
Lana Steiner@lana
Demi Wilkinson@demi
selectionIndicator="none"
Phoenix Baker
Phoenix Baker@phoenix
Olivia Rhye
Olivia Rhye@olivia
Lana Steiner
Lana Steiner@lana
Demi Wilkinson
Demi Wilkinson@demi

Hover, focus, and selection share one shade

An item paints bg-primary_hover for hover and for focus, and for the selected state too, with one exception read from the source: a selected row takes the shade only when selectionIndicator is not "checkbox", so checkbox lists leave the selected row unshaded and let the box carry the state. Keyboard focus adds an inset ring on top. Where the shade is shared, only the checkmark tells a selected row from a hovered one.

ComboBox

The searchable member: a text input in the field, the same items in the popover, filtered as you type. It opens on click or on the first keystroke, and the selected option’s supporting text is echoed inline after the typed value. The command-K badge is decorative; the kit wires no shortcut for it.

type to filter
shortcut={false}

MultiSelect

Several values behind one compact trigger: the count and its supporting text replace the value, and the popover carries a search field, checkbox rows, and a Reset and Select all footer. This specimen is fully wired; open it and change the selection.

controlled, 2 selected
showSearch={false} showFooter={false}

MultiSelect works controlled only

The trigger’s count reads the selectedKeys prop and nothing else, and the footer buttons only call your onReset and onSelectAll handlers, read from the component’s source. Left uncontrolled, the listbox updates but the trigger never changes and the footer does nothing. The wiring lives on the Code tab.

TagSelect

Several values as removable tags inside the field. Typing filters the remaining options, picking one appends a tag, and each tag’s close button removes it again; picked options leave the list while they are selected. The selection lives in a ListData you own.

Phoenix Baker

Phoenix Baker

Olivia Rhye

Olivia Rhye

sm, the member’s own default
Olivia Rhye

Olivia Rhye

md

NativeSelect

The platform’s own select element wearing the family’s field styling. The options open in the OS picker rather than the DrumKit popover, so item icons, avatars, and supporting text do not apply here.

sm
md
lg

States

Every treatment below comes from a real prop on the live component: the placeholder, a selected value, the required asterisk, and the disabled field. Focus and open are live states, not props; tab to any select on this page for the 2px brand ring, which most of the family paints for any focus and while the popover is open; MultiSelect reserves it for keyboard focus, as the callout below explains.

Team member
placeholder
Team member
value
Team member*
required
Team member
disabled
Team member
disabled, with value

The focus ring is not focus-visible, except on MultiSelect

Most triggers in this family paint their brand ring from React Aria’s isFocused state, so it appears for mouse clicks as well as keyboard focus, measured in this page’s probe run. That is unusual: most of the kit reserves rings for focus-visible. MultiSelect is the exception here, and gates its ring on isFocusVisible or isPressed, so it behaves like the rest of the kit rather than like its own family.