Select
Choisissez une ou plusieurs options dans une liste qui s'ouvre sur la valeur courante, avec saisie prédictive, groupes et prise en charge des formulaires.
pnpm dlx shadcn@latest add https://hextaui.com/r/select.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/select.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
La liste s'ouvre juste sur le déclencheur, l'option actuelle alignée au-dessus de la valeur, pour que votre regard ne perde jamais sa place. Passez items pour que SelectValue affiche des labels plutôt que les valeurs brutes. Pour les longues listes qui demandent une recherche, utilisez Combobox.
Tailles
size sur SelectTrigger s'accorde aux hauteurs d'Input et de Button.
Groupes et longues listes
Regroupez les options avec SelectGroup et SelectLabel. Les longues listes tiennent à l'écran et affichent des flèches de défilement qui font défiler au survol.
Avec des icônes
Placez des icônes dans les éléments, et passez une fonction à SelectValue pour afficher la même icône dans le déclencheur.
Multiple
Avec multiple, la liste reste ouverte pendant la sélection, et la valeur peut résumer les longues sélections.
Dans un formulaire
Dans Field, le déclencheur reçoit son label, sa description et la validation d'obligation.
Désactivé et invalide
Désactivez tout le select ou des options isolées, et marquez-le invalide avec aria-invalid.
Sous le déclencheur
alignItemWithTrigger={false} ouvre la liste sous le déclencheur comme un menu. La saisie tactile le fait automatiquement.
De droite à gauche
Le déclencheur, la liste et la coche suivent le sens de lecture.
| Touche | Action |
|---|---|
| SpaceEnter↓↑ | Ouvre la liste depuis le déclencheur. |
| ↓↑ | Se déplace entre les options. |
| HomeEnd | Va à la première ou à la dernière option. |
| A–Z | Saute à l'option suivante qui commence par le texte saisi. |
| EnterSpace | Choisit l'option en surbrillance. |
| Esc | Ferme la liste et rend le focus au déclencheur. |
- Nommez le déclencheur avec
FieldLabelouaria-label. - Au toucher, la liste s'ouvre sous le déclencheur au lieu de le recouvrir, pour que votre doigt ne tombe pas sur une option.
| Prop | Type | Par défaut |
|---|---|---|
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
itemsPermet à SelectValue d'afficher des labels. | Record<string, ReactNode> | { value, label }[] | – |
multiple | boolean | false |
name | string | – |
required | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
| Prop | Type | Par défaut |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="select-trigger" | Le déclencheur, avec data-size. |
data-popup-open | Présent tant que la liste est ouverte. |
data-placeholder | Présent tant que rien n'est choisi. |
| Prop | Type | Par défaut |
|---|---|---|
placeholder | ReactNode | – |
childrenFormate la valeur affichée. | ReactNode | (value) => ReactNode | – |
| Prop | Type | Par défaut |
|---|---|---|
alignItemWithTriggerS'ouvre sur le déclencheur, l'option actuelle alignée. | boolean | true |
sideQuand il n'est pas aligné sur le déclencheur. | "top" | "bottom" | … | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Attribut | Description |
|---|---|
data-slot="select-content" | Le popup. |
data-side="none" | Présent tant qu'il est aligné sur le déclencheur. |
| Prop | Type | Par défaut |
|---|---|---|
value | Value | – |
disabled | boolean | false |
labelTexte pour la saisie prédictive. | string | – |
| Attribut | Description |
|---|---|
data-selected | L'option choisie. |
data-highlighted | L'option qui a le focus. |
data-disabled | L'option est désactivée. |
- CalendarUne grille de dates pour la sélection simple, de plage et multiple, avec des mois qui défilent, des aperçus de plage et des jours à taille tactile.
- CheckboxUne case à cocher dont la coche se dessine, avec des parents indéterminés, des groupes et des libellés qui partagent son survol.
- ComboboxUn select filtrable avec chips, groupes et résultats asynchrones, dans un popup qui se redimensionne pendant la saisie.
- Date pickerUn bouton qui ouvre un calendrier dans un popover, ou une bottom sheet sur mobile, pour des dates simples et des plages.
- FieldDes libellés, descriptions et erreurs reliés à leur contrôle, avec états de validation et mises en page pour les formulaires.
- InputUn champ de saisie texte en trois tailles, avec états invalide et lecture seule, style de validation natif et police tactile de 16px pour que les téléphones ne zooment jamais.
Utilisé dans les blocks
Des blocks qui s’appuient sur Select.
- API keysLa page des clés d’API d’un produit d’IA, comme les consoles d’OpenAI et d’Anthropic. Créez des clés avec des permissions limitées et une expiration, voyez le secret une seule fois avec une copie qui confirme, révoquez avec annulation, renommez sur place, effectuez une rotation avec période de grâce et consultez l’utilisation par clé.
- NotificationsLa section Notifications des paramètres d’un produit d’IA. Une grille canal par événement avec bascules par ligne, par colonne et globale, des heures calmes avec une ligne « prochain calme » en direct, un résumé par e-mail, de vrais envois de test pour le bureau, l’e-mail, le push et Slack, la gestion des permissions du navigateur et un flux de connexion à Slack. S’intègre dans n’importe quelle section Settings.