Skip to main content
Cayuse Design System Lato · 4pt grid · WCAG 2.1 AA

Components · Inputs

Select

Choose one value from a known, closed list. When the list is long enough that scanning it is a chore, reach for a Combobox instead.

Figma source: Select ↗

Examples

Select with options
Set from your profile and cannot be changed here.
html
<div class="cds-field">
  <label class="cds-field__label" for="proposal-type">Proposal type</label>
  <select class="cds-select" id="proposal-type">
    <option>New</option>
    <option>Renewal</option>
    <option>Resubmission</option>
  </select>
</div>

Option rows

The Figma Option component set is considerably richer than a native <option>: it supports secondary and tertiary data lines, nesting, checkboxes for multi-select, and a stacked layout for narrow viewports.

PropertyValuesNotes
ElementOption · Nested GroupA leaf row, or a group header with children beneath it.
StackedSingle · Double · TripleHow many lines of data the row carries.
Secondary Info?booleanWhether a supporting line is shown beneath the label.
CheckboxOn · OffMulti-select mode.
StateDefault · SelectedSelection state.
DisabledOn · OffUnavailable options remain visible but unselectable.
Rich option rows — a custom listbox, not a native select
College of Sciences
A rich option list is a custom widget, with custom obligations

The moment an option row carries more than a single string, a native <select> can no longer render it and the component becomes a custom listbox. That is a real cost: you now own keyboard handling (Up/Down, Home/End, type-ahead), the role="combobox" / role="listbox" / role="option" wiring, aria-activedescendant, and dismissal behaviour — all of which the browser gave you for free.

Use the native element whenever the options are plain strings. Reach for the rich version only when the secondary data genuinely changes the user’s choice.

Select properties

PropertyValuesNotes
StateDropdown Closed · Dropdown Open · Admin Hover · Admin ChooseThe two “Admin” values look product-specific rather than systemic — worth confirming whether they belong in the shared component.

Usage

When to use it

  • Use for a closed list of roughly 4–15 options.
  • Order options meaningfully — by frequency, or alphabetically for long lists — not by the order they were added to the database.
  • Keep disabled options visible when their absence would be confusing, and say why they are unavailable.

When not to use it

  • Do not use for two options — use Radio buttons or a Toggle, which show both choices at once.
  • Do not use for very long lists — use a Combobox so the user can type.
  • Do not use for multi-select; a multiple <select> is notoriously hard to operate. Use checkboxes or a multi-select combobox.
  • Do not put an option like “— Select —” in place of a label.

Accessibility

  • Prefer the native <select>. It is fully accessible, works with every assistive technology, and gets the right control on mobile.
  • Label with <label for>, as with any field.
  • If you must build a custom listbox, implement the full ARIA combobox pattern — partial implementations are worse than none, because they announce a role they do not honour.

Tokens consumed

TokenApplied toResolves to
--input-backgroundField fill--color-white
--input-borderResting border--color-gray-400 → #888c8c
--input-textEntered value--color-black → #111111
--input-focus-borderFocus ring--focus-ring → #44a3db ⚠
--input-error-backgroundFill in error--color-red-100
--input-error-borderBorder in error--color-red-500
--input-disabled-backgroundFill when disabled--color-gray-100
--input-disabled-textValue when disabled--disabled-text → #888c8c
--input-labelLabel--color-black
--input-requiredRequired asterisk--color-red-500
--input-captionHelp text and placeholder--color-gray-500
--input-error-captionError message--color-red-500
--menu-backgroundDropdown surface--color-white
--menu-borderDropdown border--color-gray-300
--menu-hoverOption hover--color-gray-200
--menu-activeSelected option--color-blue-100