FORMS · FORM ELEMENTS
Selects
Native, custom, multi and combobox. Every list opens, filters, groups and speaks to a screen reader.THEME
DENSITY
01
Playground
Kind, size, state, label — the select and its a11y tree update livePREVIEWLive · pick, then close
Project ownerThe owner approves the budget
Choose an owner
ACCESSIBILITY TREE
rolecombobox · select-only
name"Project owner"
expandedfalse
valuenone
active option—
statesrequired
Settings
KIND
SIZE
LABEL
STATE
CODE
<Select label="Project owner" options={people} groupBy="team" renderIcon={Avatar} description={p => p.role} clearable hint="The owner approves the budget" required/>
02
Variants
10 patterns, all workingNative vs custom<select> · role="combobox"
Phones show the OS wheel or sheet
Custom selectType a letter to jump — try “s”
Native gets the OS picker on phones for free. Custom adds badges, search and rich rows — and has to rebuild the keyboard support itself.Choose a country
Rich optionsavatar · name · role
Project owner
Olivia LaneTom is on leave — listed, but can’t be picked
Grouped + search10 timezones · 4 regions
TimezoneSearch matches city, offset and region
London
Multi · chipsSelect all · Clear in the footer
Publish to
InstagramLinkedIn+1
Multi · counttrigger shows “4 of 9”
Visible columns
4 of 9 columns
ProjectClientOwnerStatusBudgetSpentStartDueTags
Creatable comboboxtype · Enter · create
LabelsType a new name and press Enter to create it. Backspace removes the last chip.
BrandingUrgent
Async optionsdebounce 350 ms · loading · empty
ClientResults load after you stop typing
Choose a client
DependentCountry → City
Country
Choose a country
CityUnlocks after you choose a country
Pick a country first
Status with colourdot + text, never colour alone
Status
Active
Short lists2–5 options: show them all
Priority
Billing cycle
03
States
8 trigger states × 3 sizes, plus option statesDEFAULTFOCUSOPENFILLEDERRORSUCCESSDISABLEDREAD-ONLYS · 36M · 44L · 52
Option statesinside the panel
Alex ReyesArt director
Jon ReyesHover or keyboard
Olivia Lanearia-selected="true"
Olivia LaneEnter keeps it
Liam Novakaria-disabled · on leave
Spectrigger · panel · option
TriggerSame box as inputs: 36 / 44 / 52 px, 1.5 px border, 16 px chevron
OpenRing stays on, chevron rotates 180°
Panel6 px from the trigger, 16 px radius, max 280 px, scrolls inside, flips up when needed
Option32 / 36 / 42 px, 10 px radius, check on the right
Group10 px caps label, role="presentation", never focusable
Multi18 px checkbox on the left, panel stays open
Empty / loadingSays what happened: “No matches for …”, “Searching clients…”
04
Behavior
Keyboard, collision, virtualised list, mobile sheetKeyboardarrows · Home/End · type-ahead
TypefaceClosed + a letter selects directly, like a native select
Futura
↓ ↑Open, then move through optionsEnter · SpaceOpen, or pick the active optionHome · EndFirst / last optionA–ZType-ahead — jumps to the next matchEscClose, focus stays on the triggerTabClose and move to the next field
KEY LOGbuffer empty
Focus the select and use the keyboard.Collisionflips up when there’s no room below
POSITION IN VIEWPORT
VIEWPORT
Open the select — the measurement shows hereIn review
Long list288 options · virtualised · sticky group
Start timePageUp / PageDown jump 8 rows. Only the visible rows are in the DOM.
10:0010:00 am
Mobile sheetbelow 480 px the list becomes a bottom sheet
New event
Title
Moodboard review
Reminder
Reminder
05
In Avava
Project filters and an Assign task formProjects · filtersmulti · single · chips · live table
Client
All clients
Status
Any status
Owner
Any owner
Due
Any due date
PROJECTCLIENTSTATUSOWNERDUE
Spring campaignNova AthleticsActive
Olivia LaneSat, Oct 24
Packaging refreshLume GoodsActive
Jon ReyesOct 31
Brand bookAtelier NoirPaused
Alex ReyesDec 13
Product shootKiln & CoActive
Jakob MoreauOct 13
App onboardingOrbit LabsLead
Ida SvenssonOct 31
Lookbook SS27Sable StudioActive
Alex ReyesSat, Oct 24
Type specimenForma TypeLead
Zoe DahlDec 13
Clinic signageHalo HealthArchived
Liam NovakOct 13
Annual reportMosaic PressActive
Ana PetitOct 31
Sonic logoDrift AudioPaused
Ida SvenssonSat, Oct 24
Assign tasksearch · segmented · creatable · validation
Assignee
Choose a person
Due
This Friday
Priority
Labels
Optional · Enter creates a new label
Task and Assignee are required
Assignedwhat the form produced
Nothing assigned yetFill the form and press Assign task.
06
Rules & a11y
When to use what, anatomy, ARIAWhich control?count the options first
2–5, all fit
Segmented or radio cardsPriority, billing cycle
5–15 options
SelectStatus, owner, due date
15+ or unknown
Select with searchTimezone, client
Pick several
Multi-select with chipsChannels, reviewers, filters
Free text + suggestions
Creatable comboboxLabels, tags
Plain text, mobile-first
Native <select>Country at checkout
Anatomylabel · trigger · panel · option
Project owner1
DESIGN
3Olivia Lane
Alex Reyes4
1Label — visible, linked with aria-labelledby
2Trigger — shows the chosen value, never a generic “Selected”
3Panel — listbox, opens under the trigger or flips up
4Active option — aria-activedescendant — focus stays on the trigger
Screen readersARIA 1.2 select-only combobox
✓role="combobox" aria-haspopup="listbox"On the trigger, with aria-expanded and aria-controls
✓role="listbox" · role="option"Panel and rows; group labels are role="presentation"
✓aria-activedescendant="owner-o-3"Moves with the arrows — DOM focus never leaves the trigger
✓aria-selected · aria-disabledOn every option, not only the chosen one
✓aria-multiselectable="true"On multi-selects; the panel stays open after each pick
✓Esc returns focus to the triggerTab closes without picking, like a native select
DO✓Use a native select for plain text on mobile-first forms✓Show the chosen value in the trigger, with its avatar or dot✓Scroll the selected option into view when the list opens✓Add search once the list passes about 15 options✓Return focus to the trigger after closing
DON’T✕Use a select for 2–3 options — show them as radios✕Open on hover or close the list on scroll✕Hide the chevron — it’s the affordance✕Reset a dependent field silently — say why it cleared✕Put actions like “Delete” inside an option list