Select / dropdown
Placeholder vs. a value: click or press Enter / ↓ to open
Nothing selected yet, so the placeholder holds the empty state.
Leading status mark · the chosen option carries a cyan check · one disabled option.
Grouped options: group labels, leading + secondary text
Cloud and local engines, bucketed under headers.
Error / invalid + disabled
A workspace is required to continue.
Inert, but the chosen value stays legible.
Sizes: sm and md
Committed 0 selections. The island is live.
Parameters
Section titled “Parameters”Select is the plainest picker: one value from a fixed list, no typing. Reach for a neighbour when you need more: Combobox when the user should type to filter a long list (autocomplete); Multi-select when they pick several values (token chips, per-row checkboxes, select-all); Menu when the rows are actions, not a value (icons, shortcuts, submenus).
The spec is in review; these are the real divergences between the shipped platforms:
- Selected-row check (settled): a trailing check on the selected row is the shared
expression. The web package stamps it and the Swift idiom here uses
Label(_, systemImage: "checkmark"); the Compose idiom documented on this page reads the selection in the anchor only, so a trailing check onDropdownMenuItemis the piece this page specifies. - Control radius: the field is the
radius.controltoken everywhere, reached throughNockerlControlShapeon Compose andNockerlRadius.controlin SwiftUI. A literal corner radius on a picker is a law §11 violation rather than a platform difference. - Grouping + secondary text: web supports
groupheaders and asecondaryline per option. The Android and Swift idioms documented here are flat label-only rows, so grouping and the secondary line are specified on this page rather than mirrored from an app. - Sizing: web has
size(sm/md); Compose’s anchor is fixed at 48dp; Swift is intrinsic. - Error state: web has a first-class
errorText(warm border + icon + message); the apps surface validation outside the control today.