Collapsible
Un 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.
@preetsuthar17 starred 3 repositories
pnpm dlx shadcn@latest add https://hextaui.com/r/collapsible.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 cnCopiez et collez le code suivant dans votre projet.
components/ui/collapsible.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Ouvert par défaut
defaultOpen démarre le panneau ouvert sans prendre le contrôle de son état.
Voir plus
Le panneau se place au-dessus de son déclencheur. À sa fermeture, l’écart dans la mise en page flex du parent se résorbe dans la même animation : le bouton en dessous ne saute donc jamais.
Contrôlé
Passez open et onOpenChange pour piloter le panneau depuis votre propre état. Basculer en cours d’animation inverse le mouvement à partir de la position du panneau.
Désactivé
disabled sur la racine garde le panneau dans son état actuel et fait ignorer au déclencheur les clics et les touches.
Icône personnalisée
Les enfants de <CollapsibleTriggerIcon /> remplacent le chevron. Stylisez l’état ouvert avec group-data-panel-open/collapsible-trigger.
Arborescence de fichiers
Chaque dossier est son propre collapsible. Les panneaux extérieurs s’agrandissent en douceur à mesure que les intérieurs s’ouvrent.
Dans une carte
Les panneaux fermés restent dans la page avec hidden="until-found" : Cmd/Ctrl+F sur « webhook » ouvre donc celui-ci.
Démonté lorsqu’il est fermé
Définissez hiddenUntilFound={false} sur le contenu pour le retirer du DOM lorsqu’il est fermé, pour les panneaux lourds que vous ne voulez pas rendre d’emblée.
Contenu long
Les chaînes sans coupure passent à la ligne dans le panneau au lieu d’élargir la page.
De droite à gauche
Les chevrons s’inversent et les retraits imbriqués suivent le sens de lecture.
| Touche | Action |
|---|---|
| EnterSpace | Ouvre ou ferme le panneau depuis le déclencheur. |
| Tab | Déplace le focus du déclencheur vers le panneau ouvert. Les panneaux fermés sont ignorés. |
- Le déclencheur reçoit automatiquement
aria-expandedetaria-controls. - Les déclencheurs réduits à une icône ont besoin d’un
aria-label.<CollapsibleTriggerIcon />est masqué aux technologies d’assistance. - Avec la réduction des animations, le panneau s’ouvre et se ferme sans animer sa hauteur.
Construit sur le collapsible de Base UI. Chaque partie accepte les props de la primitive qu’elle enveloppe.
| Prop | Type | Par défaut |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="collapsible" | Ciblez la racine en CSS. |
data-open | Présent lorsqu’il est ouvert. |
data-closed | Présent lorsqu’il est fermé. |
| Prop | Type | Par défaut |
|---|---|---|
renderEn général un Button. | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Description |
|---|---|
data-slot="collapsible-trigger" | Ciblez le déclencheur en CSS. |
data-panel-open | Présent lorsque le panneau est ouvert. Stylisez les enfants avec group-data-panel-open/collapsible-trigger. |
| Prop | Type | Par défaut |
|---|---|---|
childrenLe chevron par défaut se retourne à l’ouverture du panneau. | ReactNode | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Description |
|---|---|
data-slot="collapsible-trigger-icon" | Masqué aux technologies d’assistance. S’abaisse légèrement pendant que le déclencheur est pressé. |
| Prop | Type | Par défaut |
|---|---|---|
classNameAppliqué au conteneur interne, afin que le padding n’entre jamais en conflit avec l’animation de hauteur. | string | – |
hiddenUntilFoundGarde le panneau fermé dans le DOM pour que la recherche de la page puisse le trouver et l’ouvrir. | boolean | true |
keepMountedIgnoré lorsque hiddenUntilFound est activé. | boolean | false |
| Attribut | Description |
|---|---|
data-slot="collapsible-content" | Ciblez le panneau en CSS. |
data-open | Présent lorsqu’il est ouvert. |
data-closed | Présent lorsqu’il est fermé. |
data-starting-style | Présent pendant l’animation d’ouverture du panneau. |
data-ending-style | Présent pendant l’animation de fermeture du panneau. |
--collapsible-panel-height | La hauteur mesurée du panneau. |
--collapsible-panel-width | La largeur mesurée du panneau. |
--collapsible-gap-start | L’écart du parent avant le panneau, résorbé lorsqu’il est fermé. |
--collapsible-gap-end | L’écart du parent après le panneau, résorbé lorsqu’il est fermé. |
- AccordionDes 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.
- 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.
- 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.
Utilisé dans les blocks
Des blocks qui s’appuient sur Collapsible.
- Agent TodosAffichez le plan d’un agent pendant son travail. Chaque étape passe de backlog à à faire, en cours puis terminé, avec des durées en direct, les échecs et les appels d’outils qui les sous-tendent. Une pastille de statut à placer au-dessus du champ de saisie, des changements de plan visibles et une étape de relecture pour modifier le plan avant son exécution.
- 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é.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.
- Chat SidebarLa barre latérale d’une application de chat. Logo, recherche et Nouveau chat en haut, vos propres liens en dessous, chats épinglés, projets qui se déploient pour montrer leurs chats, récents regroupés par jour, et des lignes avec menus au survol et au clic droit, renommage en ligne, suppression avec annulation et états de réponse en direct.