Toggle group
Une rangée de boutons à bascule pour un choix unique ou multiple, avec un remplissage qui glisse vers l’élément choisi, des éléments joints ou espacés et un focus aux flèches du clavier.
pnpm dlx shadcn@latest add https://hextaui.com/r/toggle-group.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 class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/toggle-group.tsx components/ui/toggle.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Quand un seul élément peut être activé à la fois, un unique remplissage glisse vers l'élément choisi et prend sa forme, si bien que le groupe se lit comme un seul contrôle. Avec multiple, chaque élément se remplit seul. Le remplissage est placé avant le premier rendu, il n'apparaît donc jamais en glissant au chargement.
Outline
variant="outline" joint les éléments en un seul contrôle bordé.
Multiple
multiple permet d'activer autant d'éléments que l'on veut, comme pour la mise en forme du texte.
Tailles
size sur le groupe définit chaque élément : sm, default ou lg.
Espacement
spacing place un espace entre les éléments sur l'échelle d'espacement. Les éléments outline espacés gardent leurs propres bordures et fonds.
Icônes et labels
Placez une icône avant le label. Les éléments réduits à une icône ont besoin d'un aria-label.
Vertical
orientation="vertical" empile les éléments et déplace le focus avec ↑ et ↓.
Désactivé
Désactivez un élément, ou tout le groupe avec disabled. Les éléments désactivés sont ignorés par le clavier.
Contrôlé
Passez value et onValueChange. Ignorer la valeur vide garde un élément activé, si bien qu'appuyer de nouveau sur l'élément choisi ne fait rien.
De droite à gauche
L'ordre des éléments, les coins joints, le remplissage glissant et les flèches suivent le sens de lecture.
| Touche | Action |
|---|---|
| Tab | Entre dans le groupe sur le dernier élément focalisé, puis en sort. |
| ←→ | Se déplace entre les éléments, en bouclant aux extrémités. ↑ et ↓ en vertical. |
| HomeEnd | Va au premier ou au dernier élément. |
| EnterSpace | Active ou désactive l'élément qui a le focus. |
- Le groupe a le rôle
group; donnez-lui unaria-label. Chaque élément est un bouton avecaria-pressed. - Un seul élément est dans l'ordre de tabulation : le groupe est un unique arrêt de Tab et les flèches se déplacent à l'intérieur.
- Sans
multiple, appuyer sur l'élément choisi le désactive. Contrôlez la valeur pour garder un élément activé. - Avec la réduction des animations, le remplissage apparaît en fondu au lieu de glisser.
| Prop | Type | Par défaut |
|---|---|---|
value | string[] | – |
defaultValue | string[] | – |
onValueChange | (value: string[], details) => void | – |
multiple | boolean | false |
variantDéfinit la variante de chaque élément. | "default" | "outline" | "default" |
sizeDéfinit la taille de chaque élément. | "default" | "sm" | "lg" | "default" |
spacingEspace entre les éléments sur l'échelle d'espacement. 0 joint les éléments outline. | 0 | 0.5 | 1 | 1.5 | 2 | 2.5 | 3 | 4 | 5 | 6 | 8 | 0 |
orientation | "horizontal" | "vertical" | "horizontal" |
loopFocus | boolean | true |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="toggle-group" | La racine. |
data-slot="toggle-group-indicator" | Le remplissage glissant, rendu sans multiple. data-visible quand un élément est activé. |
data-variant / data-size / data-spacing | La variante, la taille et l'espacement du groupe. |
data-orientation | "horizontal" ou "vertical". |
data-multiple | Présent quand plusieurs éléments peuvent être activés. |
data-disabled | Présent lorsque le groupe est désactivé. |
| Prop | Type | Par défaut |
|---|---|---|
valueIdentifie l'élément dans la valeur du groupe. | string | – |
disabled | boolean | false |
variantUtilisé quand le groupe n'en définit aucun. | "default" | "outline" | – |
sizeUtilisé quand le groupe n'en définit aucun. | "default" | "sm" | "lg" | – |
nativeButton | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="toggle-group-item" | Chaque élément. |
data-pressed | L'élément est activé. |
data-disabled | L'élément est désactivé. |
data-variant / data-size | La variante et la taille résolues de l'élément. |
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- ToggleUn bouton qui reste activé ou désactivé, avec un remplissage qui se pose à l’appui, une étape claire entre survol et activation, et des icônes qui peuvent se remplir selon l’état.
- ButtonDes boutons dans toutes les variantes et tailles, avec un flux de chargement, de succès et d’erreur intégré qui évite le spinner pour les requêtes rapides.
- Button groupDes boutons réunis en un seul contrôle, avec jointures partagées, séparateurs, addons de texte, imbrication et piles verticales.
Utilisé dans les blocks
Des blocks qui s’appuient sur Toggle group.
- Prompt InputUn champ de discussion qui démarre sur une seule ligne sobre, grandit en carte à mesure que vous écrivez et descend une fois la conversation lancée. Entrée envoie, sans risque avec la saisie japonaise et chinoise. Collez, déposez ou choisissez des fichiers avec aperçus, progression et nouvel essai. @ ajoute des fichiers et / lance des commandes depuis un menu au niveau du curseur. Un sélecteur de modèle avec touches numériques, un curseur d’effort qui s’anime à Max, un anneau de contexte, la dictée avec forme d’onde en direct, des chips d’outils, une file pour les messages saisis pendant qu’une réponse arrive en streaming, et des brouillons qui survivent à un rechargement.
- 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é.
- Diff ReviewRelisez les modifications d’un agent dans plusieurs fichiers avant qu’elles ne soient appliquées. Une arborescence de fichiers avec compteurs, acceptation ou rejet de chaque changement, de chaque fichier ou de tout, des commentaires sur n’importe quelle ligne ou plage renvoyés à l’agent, des vues unifiée et côte à côte, des surlignages au niveau du mot, l’annulation, des modifications en streaming et un résumé « 4 fichiers modifiés » pour le chat.
- MarkdownDu Markdown conçu pour les réponses d’IA. Il s’affiche en streaming de façon fluide et ne montre jamais de syntaxe à moitié saisie, avec des titres que l’on peut lier, des tableaux copiables en Markdown ou CSV, des callouts GitHub, des listes de tâches, des notes de bas de page, des images, des citations en ligne et des blocs de code complets.