Button group
Des boutons réunis en un seul contrôle, avec jointures partagées, séparateurs, addons de texte, imbrication et piles verticales.
pnpm dlx shadcn@latest add https://hextaui.com/r/button-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/button-group.tsx components/ui/separator.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Button group assemble les boutons que vous utilisez déjà. Installez aussi <Button />.
Tailles
Définissez size sur chaque bouton. Les coins joints restent carrés à toutes les tailles, et les coins extérieurs gardent le rayon du bouton.
Bouton scindé
Les boutons pleins sont collés : ajoutez un <ButtonGroupSeparator /> entre eux. Un déclencheur de menu déroulant peut être n’importe quel segment.
Séparateurs
Séparateurs entre des boutons-icônes, avec un bouton à bascule qui indique son état pressé.
Retour d’état dans un groupe
Lorsque la largeur du libellé d’un bouton change pendant le chargement, le succès ou l’erreur, les segments suivants glissent au lieu de sauter.
Vertical
orientation="vertical" empile les segments. Les séparateurs passent automatiquement à l’horizontale.
Groupes imbriqués
Les groupes à l’intérieur d’un groupe deviennent des ensembles distincts séparés par un écart, chacun étant joint séparément.
Avec du texte et un champ
<ButtonGroupText /> ajoute une étiquette ou un préfixe. Rendez-le comme un <label> pour nommer le champ. Le champ s’étire pour remplir la ligne.
Désactivé et invalide
Désactivez ou marquez un seul segment avec aria-invalid. Un segment invalide passe au-dessus de ses voisins pour que son anneau rouge ne soit jamais recouvert.
Pleine largeur
Donnez une largeur au groupe et flex-1 à chaque bouton pour répartir l’espace uniformément.
Comme fieldset
Utilisez render pour produire un <fieldset> dans les formulaires.
De droite à gauche
Les coins joints, les séparateurs et les ensembles imbriqués s’inversent dans les mises en page de droite à gauche.
| Touche | Action |
|---|---|
| Tab | Parcourt les segments dans l’ordre. Le segment ayant le focus passe au-dessus pour que son anneau et sa bordure ne soient jamais recouverts. |
| EnterSpace | Active le bouton ayant le focus. |
- Le groupe a
role="group". Donnez-lui unaria-labelqui décrit l’ensemble, comme « Message actions ». - Les segments réduits à une icône ont besoin de leur propre
aria-label. - Les séparateurs sont exposés comme séparateurs avec la bonne orientation. Ajoutez
decorativelorsque la ligne est purement visuelle.
Chaque partie rend un <div> et accepte ses attributs.
| Prop | Type | Par défaut |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="button-group" | Ciblez les groupes en CSS. |
data-orientation | L’orientation actuelle. |
| Prop | Type | Par défaut |
|---|---|---|
orientationPar défaut, l’opposé de l’orientation du groupe. | "horizontal" | "vertical" | – |
decorativeMasque la ligne aux lecteurs d’écran. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="button-group-separator" | Ciblez les séparateurs en CSS. |
data-orientation | L’orientation résolue. |
| Prop | Type | Par défaut |
|---|---|---|
renderRendez un <label> pour nommer un champ du groupe. | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="button-group-text" | Ciblez les segments de texte en CSS. |
- SeparatorUn trait fin qui sépare le contenu horizontalement ou verticalement, avec un libellé facultatif et un mode décoratif pour les lignes purement visuelles.
- 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.
- 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.
- Toggle groupUne 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.