Dropdown

A compact select for known, shortish lists.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Pick one from a short, known list
Configuration
State
Menu
Placeholder
<Dropdown value="banana" />
Behavior — The Engineering Contract
Prop / eventTypeNotes
value / onChangestring / (v) => voidSelected option id; controlled
multiplebooleanCheckbox options with a Clear / Confirm footer; value is an array
Option subReactNodeRight-aligned secondary text on an option (value, offset, shortcut)
placeholderstringShown when nothing is chosen
disabledbooleanTrigger inert, opacity 0.42
Enter / SpaceOpen the list; Enter commits the active option
↑ / ↓ · type-aheadMove the active option; typing jumps to a match
Esc · outside clickClose without changing the value

Use a Dropdown for a short, known list. When the list is long or needs filtering, use a Combobox; for free-text queries use Search.

Anatomy
Banana
1ValueThe current selection, or a muted placeholder.
2ChevronRotates 180° while the list is open.
3ListboxOptions panel; selected one is warm + checked.
Do's and Don'ts
✓ Do
Medium

Use it for a handful of known, mutually exclusive options.

✕ Don't
Search 190 countries…

Don't stuff a huge list behind a plain dropdown. Give it a Combobox filter.

✓ Do
DraftPublished

Mark the selected option clearly — warm text and a check.

✕ Don't
Yes

Don't use a dropdown for a binary choice. That is a Toggle or two Radios.

In context: Examples
A · Form field
Country
Germany

A labeled select inside a form, matching Input height and radius.

B · Toolbar filter
Newest

A compact sort control in a list toolbar.

C · Grouped
EuropeBerlinLisbon

Group labels sort long option sets into scannable sections.

Measurements & Tokens
TokenValueRole
--dd-height36pxTrigger height (matches Input M)
--dd-radius8pxTrigger corner
--menu-bg#141519Listbox panel
--menu-border#262A30Listbox hairline
--opt-on#FF9D45Selected option text + check
--opt-hover#1E1F25Active / hover row
Code
<div class="o-dd">
  <button class="o-dd__trigger" aria-haspopup="listbox" aria-expanded="false">
    <span class="o-dd__value">Banana</span>
    <svg class="o-dd__chevron">…</svg>
  </button>
  <div class="o-menu" role="listbox" hidden>
    <button role="option" class="o-menu__opt">Apple</button>
    <button role="option" aria-selected="true" class="o-menu__opt is-on">Banana ✓</button>
  </div>
</div>