v1.0.0

Combobox

An input with a dropdown list for searching and selecting from a set of options.

Interactive Requires: veritheme.js JS init: automatic

Default

A searchable input with a dropdown list of options. Try searching and selecting.

html
Next.js
SvelteKit
Nuxt
Remix
Astro
No results found.
<div class="vt-relative vt-combobox-wrapper">
  <input onfocus="openCombobox('cb1')" type="text" placeholder="Search..." class="vt-input" />
  <div id="cb1" class="vt-dropdown-menu vt-w-full vt-mt-1">
    <div class="vt-combobox-item" onclick="selectComboboxItem(this)">Next.js</div>
    <div class="vt-combobox-item" onclick="selectComboboxItem(this)">SvelteKit</div>
  </div>
</div>

With Groups

Combobox with options organized into labeled groups. Icons are preserved on selection.

html
Suggestions
Calendar
Search
Settings
Results
Calculator
Profile
No results found.
<div class="vt-relative vt-combobox-wrapper" data-keep-icons="true">
  <div class="vt-relative">
    <svg class="vt-absolute vt-left-3 vt-top-1/2 vt--translate-y-1/2 vt-w-4 vt-h-4 vt-text-mains-quaternary">...</svg>
    <input type="text" placeholder="Search..." onfocus="openCombobox('cb-groups')" class="vt-input vt-pl-9" />
  </div>
  <div id="cb-groups" class="vt-dropdown-menu vt-w-full vt-mt-1">
    <div class="vt-combobox-group">
      <div class="vt-text-xs vt-font-semibold vt-text-mains-quaternary vt-px-2 vt-py-1.5">Suggestions</div>
      <div class="vt-combobox-item" onclick="selectComboboxItem(this)">
        <svg class="vt-w-4 vt-h-4">...</svg>
        Calendar
      </div>
      <div class="vt-combobox-item" onclick="selectComboboxItem(this)">
        <svg class="vt-w-4 vt-h-4">...</svg>
        Search
      </div>
    </div>
    <div class="vt-h-[0.5px] vt-bg-border-default vt-my-1"></div>
    <div class="vt-combobox-group">
      <div class="vt-text-xs vt-font-semibold vt-text-mains-quaternary vt-px-2 vt-py-1.5">Results</div>
      <div class="vt-combobox-item" onclick="selectComboboxItem(this)">
        <svg class="vt-w-4 vt-h-4">...</svg>
        Calculator
      </div>
    </div>
  </div>
</div>

Multi-Select

Select multiple items with tags displayed in the input area.

html
React Vue
React
Vue
Angular
Svelte
Solid
No results found.
<div class="vt-relative vt-combobox-wrapper" data-multi="true">
  <div class="vt-combobox-tags vt-flex vt-flex-wrap vt-items-center vt-gap-1.5 vt-min-h-[2.5rem] vt-w-full vt-rounded-lg vt-border vt-border-border-strong vt-bg-surfaces-surface vt-px-3 vt-py-1.5">
    <span class="vt-combobox-tag vt-inline-flex vt-items-center vt-gap-1 vt-rounded vt-bg-surfaces-subtle vt-px-2 vt-py-0.5 vt-text-xs vt-font-medium">
      React
      <button type="button" onclick="removeComboboxTag(this)"><svg class="vt-w-3 vt-h-3">...</svg></button>
    </span>
    <input type="text" onfocus="openCombobox('cb-multi')" class="vt-flex-1 vt-min-w-[40px] vt-bg-transparent vt-text-sm" />
  </div>
  <div id="cb-multi" class="vt-dropdown-menu vt-w-full vt-mt-1">
    <div class="vt-combobox-item vt-selected" onclick="toggleMultiComboboxItem(this)">
      <svg class="vt-w-4 vt-h-4">...</svg>
      React
    </div>
    <div class="vt-combobox-item" onclick="toggleMultiComboboxItem(this)">
      <span class="vt-w-4 vt-h-4"></span>
      Angular
    </div>
  </div>
</div>

With Button Trigger

Combobox with a button trigger instead of an input field.

html
Backlog
Todo
In Progress
Done
Cancelled
<div class="vt-relative vt-combobox-wrapper">
  <button type="button" onclick="toggleCombobox('cb-button')" class="vt-flex vt-h-10 vt-w-full vt-items-center vt-justify-between vt-rounded-lg vt-border vt-border-border-strong vt-bg-surfaces-surface vt-px-3">
    <span class="vt-combobox-button-label vt-text-mains-quaternary">Select status...</span>
    <svg class="vt-w-4 vt-h-4">...</svg>
  </button>
  <div id="cb-button" class="vt-dropdown-menu vt-w-full vt-mt-1">
    <div class="vt-combobox-item" onclick="selectComboboxButton(this, 'cb-button')">
      <span class="vt-w-4 vt-h-4"></span>
      Backlog
    </div>
    <div class="vt-combobox-item" onclick="selectComboboxButton(this, 'cb-button')">
      <span class="vt-w-4 vt-h-4"></span>
      Todo
    </div>
  </div>
</div>

Anatomy

HTML structure of the Combobox component.

div.vt-combobox-wrapper                  ← Root (relative positioning)
├── input.vt-input                          ← Search input
└── div.vt-dropdown-menu                    ← Dropdown panel
    ├── div.vt-combobox-group               ← Optional group
    │   ├── div (label)                    ← Group heading
    │   └── div.vt-command-item            ← Option
    │       ├── svg / span                 ← Check icon or spacer
    │       └── text                       ← Option label
    └── div.vt-combobox-empty               ← No results message

API Reference

All CSS classes available for the Combobox component.

Class Type Description
vt-combobox-wrapper Base Root wrapper — relative positioning context
vt-combobox-item Base Individual option in the dropdown list
vt-combobox-group Modifier Groups items under a label header
vt-combobox-tags Modifier Multi-select tag container wrapping the input
vt-combobox-tag Modifier Individual tag chip in multi-select mode
vt-combobox-button-label Modifier Label text inside button-trigger variant
vt-combobox-empty Modifier Empty state message when no results match
vt-selected State Marks the currently selected item
vt-open State Shows the dropdown panel
data-multi Modifier HTML attribute on wrapper — enables multi-select mode
data-keep-icons Modifier HTML attribute — preserves icons on selection

Accessibility

Keyboard and screen reader support.

Feature Details
Focus Dropdown opens on input focus, closes on click outside
Keyboard Type to filter options in real-time
Selection Click to select — checkmark icon indicates current selection
Multi-select Tags display selected items, X button removes them
Empty state Shows "No results found" when filter matches nothing