Combobox
Autocomplete input and command palette with a list of suggestions.
Combobox — select searchable. Trigger bouton qui affiche la valeur choisie ; au clic, popover avec search input + liste filtrable des options. La valeur choisie va dans un hidden input pour form submission.
Vs Select (dropdown natif ou custom sans search). Utiliser Combobox dès que la liste dépasse ~10 options (recherche indispensable).
Installation
$ bext ui add combobox
Copy and paste the following into src/components/ui/combobox.tsx.
This component is interactive — make sure the shared island is loaded (see Islands). It reacts to data-ui="combobox" hooks.
Usage
Anatomy
<Combobox name="…" value={value} options={[...]} />
├── <input type="hidden" name value />
├── <button data-ui-cb-trigger>
│ ├── <span>{label ou placeholder}</span>
│ └── <ChevronDown />
└── <div data-ui-cb-pop>
├── <input data-ui-cb-search placeholder="Rechercher…" />
└── <div data-ui-cb-list>
└── <div data-ui-cb-item data-value>{label}</div> × NAPI Reference
Combobox
| Prop | Type | Default | Description |
|---|---|---|---|
| name | string | — | Nom du hidden input pour form submission. |
| value | string | — | Value sélectionnée (matche options[].value). |
| options | ComboboxOption[] | — | Liste de { value, label, disabled? }. |
| placeholder | string | "Sélectionner…" | Texte trigger quand vide. |
| emptyLabel | string | "Aucun résultat." | Message si search sans match. |
| required | boolean | — | Pose required sur hidden. |
| disabled | boolean | — | Désactive le trigger. |
| triggerWidth | string (utility) | "w-[240px]" | Largeur du trigger button. |
Data Attributes
Attributs qu'on peut cibler en CSS custom pour override le style par état.
| Attribute | On | Values | Description |
|---|---|---|---|
| data-ui="combobox" | root | — | Marqueur racine. |
| data-ui-cb-trigger | trigger button | — | Cliquer ouvre/ferme le popover. |
| data-ui-cb-search | input | — | Input fuzzy-filter — l'island filtre les items par data-label. |
| data-ui-cb-item | chaque option | data-value data-label data-disabled? | Cliquer set value + ferme. |
| data-ui-cb-empty | div | hidden par défaut | Affiché quand aucun item ne matche. |
Keyboard
| Key | Action |
|---|---|
| Enter / Space | Sur trigger fermé : ouvre. Sur item : sélectionne + ferme. |
| Escape | Ferme le popover ouvert. |
| Typing | Le focus va sur le search input ; taper filtre en temps réel. |
Accessibility
Trigger porte aria-haspopup="listbox" aria-expanded. Liste porte role="listbox", items role="option".
Le hidden input est un vrai champ de form — validation HTML5 native (required) fonctionne.
Examples
Placeholder (vide)
<Combobox name="x" options={…} placeholder="Choose one" />
Edit this component live in the bext playground. The PRISM + signals version is the bext-native idiom — fine-grained reactivity, no virtual DOM.
On This Page