Accordion
Des titres empilés qui révèlent chacun un panneau, avec un mouvement de hauteur réversible en cours de route et des panneaux qui restent consultables par la recherche une fois fermés.
pnpm dlx shadcn@latest add https://hextaui.com/r/accordion.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/accordion.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Outline
Les éléments partagent une même surface bordée, avec les coins extérieurs arrondis.
Séparé
Chaque élément est sa propre carte.
Ghost
Sans bordures. Les déclencheurs reçoivent un léger fond au survol et à l’ouverture.
Multiple
Définissez multiple pour laisser plusieurs éléments ouverts.
Désactivé
Désactivez un seul élément avec disabled sur <AccordionItem />, ou tout l’accordéon sur la racine.
Contrôlé
Passez value et onValueChange pour conserver les éléments ouverts dans votre propre état.
Icône personnalisée
Passez n’importe quel élément à icon. Stylez son état ouvert avec group-data-panel-open/accordion-trigger.
Icônes en début de ligne
Les icônes placées avant le libellé sont dimensionnées et alignées pour vous. icon={null} supprime le chevron.
Contenu long
Les titres longs passent à la ligne tandis que l’icône reste sur la première ligne. Les panneaux fermés restent recherchables : Cmd/Ctrl+F sur « retention » ouvre donc celui-ci.
Imbriqué
Un accordéon imbriqué conserve sa propre variante, ses styles de focus et sa navigation aux flèches.
De droite à gauche
Le contenu, les icônes et l’animation d’ouverture suivent le sens de lecture.
| Touche | Action |
|---|---|
| EnterSpace | Ouvre ou ferme l’élément ayant le focus. |
| ↓ | Déplace le focus vers le déclencheur suivant. |
| ↑ | Déplace le focus vers le déclencheur précédent. |
| Home | Déplace le focus vers le premier déclencheur. |
| End | Déplace le focus vers le dernier déclencheur. |
| Tab | Déplace le focus dans le panneau ouvert, puis vers le déclencheur suivant. |
Construit sur l’accordéon de Base UI. Chaque partie accepte les props de la primitive qu’elle enveloppe.
| Prop | Type | Par défaut |
|---|---|---|
variant | "default" | "outline" | "separated" | "ghost" | "default" |
multiplePermet d’ouvrir plusieurs éléments à la fois. | boolean | false |
value | Value[] | – |
defaultValue | Value[] | – |
onValueChange | (value: Value[], details) => void | – |
disabled | boolean | false |
hiddenUntilFoundGarde les panneaux fermés détectables par la recherche de page du navigateur. | boolean | true |
keepMountedIgnoré lorsque hiddenUntilFound est activé. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="accordion" | Ciblez la racine en CSS. |
data-variant | La variante actuelle. |
data-disabled | Présent lorsque l’accordéon est désactivé. |
| Prop | Type | Par défaut |
|---|---|---|
valueGénéré automatiquement si omis. | Value | – |
disabled | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="accordion-item" | Ciblez les items en CSS. |
data-open | Présent lorsque l’élément est ouvert. |
data-disabled | Présent lorsque l’item est désactivé. |
data-index | La position de l’élément, à partir de 0. |
| Prop | Type | Par défaut |
|---|---|---|
iconnull supprime l’icône. | ReactNode | null | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="accordion-trigger" | Ciblez les déclencheurs en CSS. |
data-panel-open | Présent lorsque son panneau est ouvert. Stylez l’icône avec group-data-panel-open/accordion-trigger. |
data-disabled | Présent lorsque l’item est désactivé. |
| Prop | Type | Par défaut |
|---|---|---|
classNameAppliqué au conteneur interne, afin que le padding n’entre jamais en conflit avec l’animation de hauteur. | string | – |
keepMounted | boolean | false |
hiddenUntilFound | boolean | – |
| Attribut | Description |
|---|---|
data-slot="accordion-content" | Ciblez les panneaux en CSS. |
data-open | Présent lorsque le panneau est ouvert. |
data-starting-style | Présent pendant l’animation d’ouverture du panneau. |
data-ending-style | Présent pendant l’animation de fermeture du panneau. |
data-settled | Présent une fois le panneau entièrement ouvert. Il cesse alors de rogner son contenu, si bien que les anneaux de focus d’un accordéon imbriqué s’affichent en entier. |
--accordion-panel-height | La hauteur mesurée du panneau, utilisée pour l’animation de hauteur. |
- Aspect ratioUne boîte qui garde sa forme avant le chargement du média, scintille pendant le chargement, fait apparaître le média en fondu et bascule sur un repli en cas d’échec.
- CarouselDes slides à scroll-snap natif avec inertie au toucher, glisser à la souris, flèches du clavier, points, miniatures et une lecture automatique qui se met en pause au bon moment.
- CollapsibleUn panneau qui s’affiche et se masque avec un mouvement de hauteur réversible en cours de route, sans faire sauter la mise en page.
- ResizableDes panneaux que l’on peut écarter à la main, avec un séparateur discret qui s’éveille au survol, des tailles qui glissent à la réinitialisation ou au repli, et des mises en page persistantes.
- Scroll areaUn défilement natif avec une barre de défilement minimale, des bords qui s’estompent seulement là où il y a plus à voir, et un aperçu facultatif qui coupe le dernier élément en deux.
- 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.