Select
Atom
A single-choice dropdown field: a trigger showing the chosen value that opens a panel of options, styled to match Canvas inputs.
Playground
Every control sets a real prop of SelectProps. The JSX below updates as you go.
Web
iOS
Android
JSX · SelectProps
Variants
9 examples from src/atoms/select/select.md, each rendered live from its own JSX.
Sizes
States
Hover, focus and press are pinned so they can be compared side by side; the rest are real props.
Anatomy
1
Label
2
Trigger
3
Value
4
Chevron
5
Menu
Dimmed parts appear only in some states or variants.
Props
26 props on SelectProps, grouped as they are declared in source. Required props are marked *.
MeasureProps · width steps xxxs 192 · xxs 256 · xs 320 · sm 384 · md 448 · lg 512 · xl 576 · xxl 672 · xxxl 768 · wide 896 · wider 1024 · widest 1152 · page 1280, plus start to pin to the leading edge.
Accessibility and keyboard
Keyboard
ArrowDown
Opens the list
ArrowUp
ArrowDown
Moves through options
Enter
Commits the active option
Escape
Closes the list, keeps the text
Semantics
Roles
button
combobox
option
States
disabled
expanded
selected
ARIA on web
aria-controls
aria-disabled
aria-expanded
aria-haspopup
aria-hidden
aria-label
aria-labelledby
aria-required
aria-selected
Below the platform minimum, the touch area grows to 44 pt on iOS and 48 dp on Android without moving the layout.
From the docs
Pass label (and required) to name the field: iOS and web render the label above the trigger, while Android floats the Material 3 in-container label once the menu opens or a value is selected. On Android the trigger grows with the user's text size, and a label longer than the trigger truncates on one line clear of the chevron while the trigger's accessible name stays the whole label. The trigger fills the parent it is given; a step of its own (xs, lg, …, with start to pin it to the leading edge) or a Conta
The label also names the option list. Use accessibilityLabel to provide an explicit purpose when the visible label or placeholder is insufficient; it overrides both accessible names. A required field announces "required" with the button name and marks the option list as required. The selected value never replaces the field's purpose.
Pass ref to access the interactive trigger, preserving overlay measurement. Use useRef<ComponentRef<typeof Select>>(null) from React, or useRef<View>(null) with React Native's View type. Object and callback refs are supported and detach on unmount. Calling ref.current?.focus() or .blur() delegates to the host without activating the control. Browser focus is supported; native focus depends on the platform and React Native version, and is separate from accessibility focus.
Use dense eyebrow soft for the compact application field on web: a 32-pixel trigger with a 600 13-pixel value under a tracked uppercase eyebrow label at the kit’s 10-pixel reading floor, and 30-pixel rows. plainOptions removes the check and marks the chosen row with its wash alone; pointer hover uses the brand wash. steadyPress keeps the resting fill and opacity while pressed. menuWidth bounds the floating menu independently of the field. combobox exposes the selection-field role. Native skins keep their
Platform skins
The playground's props on each platform: same tree, native shapes, type and touch sizes.
Usage
Pass label (and required) to name the field: iOS and web render the label above the trigger, while Android floats the Material 3 in-container label once the menu opens or a value is selected. On Android the trigger grows with the user's text size, and a label longer than the trigger truncates on one line clear of the chevron while the trigger's accessible name stays the whole label. The trigger fills the parent it is given; a step of its own (xs, lg, …, with start to pin it to the leading edge) or a Container step sets its measure.
In glass mode the option panel is a dense-layer glass card under the trigger (or above it when it fits there); the trigger stays in place with its value and chevron, and the chosen value and expanded state commit immediately. Solid mode paints the skin's own panel.
The label also names the option list. Use accessibilityLabel to provide an explicit purpose when the visible label or placeholder is insufficient; it overrides both accessible names. A required field announces "required" with the button name and marks the option list as required. The selected value never replaces the field's purpose.
Tokens
Read from the playground render. Values follow the scheme and the ion hue.
--bg2
--fd
--ft
--ln2
--tx
--tx2
--tx3