Listbox
A custom select whose options stay on screen: single or multi-select, an optional detail line under each option, and a checkmark on the chosen items. Reach for it when the options need rich rows; prefer Select for a simple short list.
The list 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.
One job, a platform's own control: iOS marks a choice in a list with a trailing check, so there every chosen row carries a check at its end (in single and multi select alike) and no row is filled for being chosen. The web and Android lead the row with the mark: a violet checkmark with the chosen label in the same violet in single-select, the platform's selection checkbox in multi-select (the Material 3 box on Android).
The rows are Dark Factory's menu rows on every platform: bold labels at an 8px corner that take the hover wash at once on the web, a muted second line, and a bordered list in Dark Factory's panel.
Single-select exposes a list of selectable options. With multi, it exposes a checkbox group: each row owns its label, checked state, and tap target. Give either mode a meaningful accessibilityLabel; the fallback is "Options". Arrow keys and Home/End move focus within one tab stop. Single-select follows focus, while multi-select keeps the current selection until Enter or Space toggles the focused row.
iOS
Android
Web
tsx
Default
Multi
Small
Large
Disabled
Detail line
Measure
Props
Do & Don’t
Prefer a native select for simple lists
Don’t
A custom listbox for two short options is heavier than it needs to be and worse on mobile.
Do
For short, plain lists a native select is lighter, accessible, and uses the platform picker on mobile.
single
Don’t
Single-select with two checkmarks lies about state: only one option can be the value.
Do
Show exactly one checkmark, mirror it in the trigger value, and close the panel on pick.
multi
Don’t
Don't close on each pick or echo only the last choice: multi-select needs to keep all selections visible.
Do
Keep the panel open, toggle each option's own checkmark, and summarize the count in the trigger.