Select

Custom select — combobox trigger with elevated listbox menu.

Preview

Live

<div class="ui-select">
  <button type="button" class="ui-select__trigger field-control" role="combobox"
    aria-haspopup="listbox" aria-expanded="false" aria-labelledby="role-label">
    <span class="ui-select__value">Engineer</span>
    <span class="ui-icon ui-icon--chevron-down ui-select__chevron" aria-hidden="true"></span>
  </button>
  <ul class="ui-select__menu" role="listbox">
    <li role="presentation">
      <button type="button" class="ui-select__option is-selected" role="option" aria-selected="true">
        <span class="ui-select__option-label">Engineer</span>
        <span class="ui-icon ui-icon--check ui-select__check" aria-hidden="true"></span>
      </button>
    </li>
  </ul>
</div>

Variants

Invalid

.is-invalid on the root.

Disabled

.is-disabled + disabled trigger.

Open + selected

Menu option states.

Accessibility

  • Trigger is a combobox; menu is a listbox with option roles.
  • Provide aria-labelledby or aria-label on the trigger.
  • Arrow keys, Home/End, Escape, and type-ahead patterns are handled in React Select.
  • Reflect validation with invalid / aria-invalid.

API

HTML classes

Class Description
.ui-select / .is-open / .is-invalid / .is-disabled Root states.
.ui-select__trigger / __value / __chevron Combobox chrome.
.ui-select__menu / .is-drop-up Portaled listbox.
.ui-select__option / .is-selected / .is-active Option states.
.ui-select__check Selected check icon.

React props

From src/core/Select.tsx — controlled value + options.

Prop Type Default Description
value / onChange string / fn Controlled value (required).
options SelectOption[] { value, label } list (required).
disabled / invalid boolean false Disabled / invalid states.
aria-* string label, labelledby, describedby, invalid.