Combobox Tailwind CSS uniquement CSS avec filtrage de recherche en direct et liste déroulante accessible. Navigation au clavier, variantes de couleurs. WCAG AA accessible, fonctionne avec Django, HTMX, Laravel, React et n'importe quelle pile.
Combobox combine une saisie de texte avec une liste déroulante. Utilisez le composant input pour le champ : les variantes de taille, de couleur et d'état proviennent de là. Les utilitaires combobox-* gèrent uniquement la liste déroulante, les éléments et l'état ouvert.
CSS uniquement, aucun JavaScript requis. WCAG AA accessible et indépendant du framework – fonctionne avec Django, HTMX, Laravel, React et n'importe quelle pile.
| Classe | Taper | Description |
|---|---|---|
| combobox-list | Base | Conteneur de liste déroulante pour les options de liste déroulante |
| combobox-item | Modificateur | Option individuelle dans la liste déroulante |
| combobox-open | Modificateur | Affiche la liste déroulante lorsqu'elle est appliquée au wrapper |
| combobox-primary | Couleur | Primary theme color highlight for items |
| combobox-secondary | Couleur | Secondary theme color highlight for items |
| combobox-accent | Couleur | Accent theme color highlight for items |
| combobox-info | Couleur | Info semantic color highlight |
| combobox-success | Couleur | Success semantic color highlight |
| combobox-warning | Couleur | Warning semantic color highlight |
| combobox-error | Couleur | Error semantic color highlight |
Utilisation de base
Enveloppez un input et un combobox-list dans un conteneur relative. Ajoutez combobox-open au wrapper pour afficher la liste – basculez-la via JS ou :focus-within.
- React
- Vue
- Angular
- Svelte
1 2 3 4 5 6 7 8 9 | <div class="relative w-64 combobox-open"> <input type="text" class="input w-full" placeholder="Search or select..."> <ul class="combobox-list"> <li class="combobox-item">React</li> <li class="combobox-item combobox-item-active">Vue</li> <li class="combobox-item">Angular</li> <li class="combobox-item">Svelte</li> </ul> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import { useCombobox } from 'frutjam/react' const frameworks = ['React', 'Vue', 'Angular', 'Svelte'] export default function ComboboxDemo() { const combo = useCombobox({ items: frameworks }) return ( <div {...combo.containerProps} className="relative w-64"> <input {...combo.inputProps} className="input w-full" placeholder="Search or select..." /> <ul className="combobox-list" role="listbox"> {combo.filtered.map((item, i) => ( <li key={item} {...combo.optionProps(item, i)} className="combobox-item">{item}</li> ))} </ul> </div> ) } |
Open on Focus
Utilisez focus-within:combobox-open sur le wrapper pour ouvrir la liste lorsque l'entrée est ciblée - aucun JavaScript n'est nécessaire.
- React
- Vue
- Angular
- Svelte
1 2 3 4 5 6 7 8 9 | <div class="relative w-64 focus-within:combobox-open"> <input type="text" class="input w-full" placeholder="Focus to open..."> <ul class="combobox-list"> <li class="combobox-item">React</li> <li class="combobox-item">Vue</li> <li class="combobox-item">Angular</li> <li class="combobox-item">Svelte</li> </ul> </div> |
Sizes
Use input-sm, input-lg, etc. on the input field. The dropdown adapts naturally.
- Banana
- Mango
- Papaya
- Banana
- Mango
- Papaya
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="relative w-64 combobox-open"> <input type="text" class="input input-sm w-full" placeholder="Small"> <ul class="combobox-list"> <li class="combobox-item">Banana</li> <li class="combobox-item combobox-item-active">Mango</li> <li class="combobox-item">Papaya</li> </ul> </div> <div class="relative w-64 combobox-open"> <input type="text" class="input input-lg w-full" placeholder="Large"> <ul class="combobox-list"> <li class="combobox-item">Banana</li> <li class="combobox-item combobox-item-active">Mango</li> <li class="combobox-item">Papaya</li> </ul> </div> |
Colors
Use input-primary etc. on the input for the field color. Add the matching combobox-primary to the wrapper to tint the active item highlight.
- React
- Vue
- Angular
- React
- Vue
- Angular
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="relative w-64 combobox-open combobox-primary"> <input type="text" class="input input-primary w-full" placeholder="Primary"> <ul class="combobox-list"> <li class="combobox-item">React</li> <li class="combobox-item combobox-item-active">Vue</li> <li class="combobox-item">Angular</li> </ul> </div> <div class="relative w-64 combobox-open combobox-error"> <input type="text" class="input input-error w-full" placeholder="Error"> <ul class="combobox-list"> <li class="combobox-item">React</li> <li class="combobox-item combobox-item-active">Vue</li> <li class="combobox-item">Angular</li> </ul> </div> |
Disabled
1 2 3 | <div class="relative w-64"> <input type="text" class="input w-full" placeholder="Disabled" disabled> </div> |
With Button
Compose with join to attach a search icon or trigger button.
- React
- Vue
- Angular
- Svelte
1 2 3 4 5 6 7 8 9 10 11 12 | <div class="relative w-64 combobox-open"> <div class="join w-full"> <span class="join-item btn btn-soft">🔍</span> <input type="text" class="input join-item" placeholder="Search..."> </div> <ul class="combobox-list"> <li class="combobox-item">React</li> <li class="combobox-item combobox-item-active">Vue</li> <li class="combobox-item">Angular</li> <li class="combobox-item">Svelte</li> </ul> </div> |
Items as Links or Buttons
combobox-item fonctionne sur n'importe quel élément : <li>, <a> ou <button>.
1 2 3 4 5 6 7 8 | <div class="relative w-64 combobox-open"> <input type="text" class="input w-full" placeholder="Search pages..."> <ul class="combobox-list"> <a href="#" class="combobox-item">Home</a> <a href="#" class="combobox-item combobox-item-active">About</a> <button class="combobox-item">Contact</button> </ul> </div> |
Aide JS et React
Use createCombobox from frutjam/js or useCombobox from frutjam/react to get filtering, keyboard navigation (↑ ↓ Enter Escape), and full aria-* wiring out of the box. Listen for the fj:select event to handle selection.
- React
- Vue
- Angular
- Svelte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <div class="relative w-64" id="js-combobox"> <input type="text" class="input w-full" placeholder="Search frameworks..."> <ul class="combobox-list"> <li class="combobox-item" data-value="react">React</li> <li class="combobox-item" data-value="vue">Vue</li> <li class="combobox-item" data-value="angular">Angular</li> <li class="combobox-item" data-value="svelte">Svelte</li> </ul> </div> <script type="module"> import { createCombobox } from 'frutjam/js' const combo = createCombobox(document.getElementById('js-combobox')) document.getElementById('js-combobox').addEventListener('fj:select', (e) => { console.log('Selected:', e.detail.value) }) </script> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import { useCombobox } from 'frutjam/react' const frameworks = [ { label: 'React', value: 'react' }, { label: 'Vue', value: 'vue' }, { label: 'Angular', value: 'angular' }, { label: 'Svelte', value: 'svelte' }, ] export default function ComboboxDemo() { const combo = useCombobox({ items: frameworks }) return ( <div {...combo.containerProps} className="relative w-64"> <input {...combo.inputProps} className="input w-full" placeholder="Search frameworks..." /> <ul {...combo.listboxProps} className="combobox-list"> {combo.filtered.map((item, i) => ( <li key={item.value} {...combo.optionProps(item, i)}>{item.label}</li> ))} </ul> </div> ) } |
Vous utilisez Claude Code, Cursor ou un autre éditeur d'IA ?
Cherry MCP donne à votre éditeur d'IA les noms et la structure exacts des classes Liste déroulante sur demande. Fini les cours hallucinés.