Resizable
Des 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/resizable.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 react-resizable-panels cnCopiez et collez le code suivant dans votre projet.
components/ui/resizable.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
Les nombres sont des pixels et les chaînes des pourcentages : defaultSize="30%" et minSize={240} fonctionnent donc tous deux. Le séparateur reste un filet jusqu'à ce que vous le saisissiez. Pendant le glissement, les panneaux suivent exactement le pointeur ; tous les autres changements sont adoucis, y compris les réinitialisations par double-clic, les pas au clavier et le repli depuis le code.
Collapsible
Un panneau collapsible se referme d'un coup quand on le tire sous son minSize. Basculez-le depuis un bouton avec usePanelRef ; le repli est animé.
Affichage de la taille
showSize affiche la taille du panneau avant le séparateur pendant le glissement ou l'usage du clavier, en "percent" ou "pixels".
Mémoriser la disposition
useDefaultLayout enregistre les tailles dans localStorage et les restaure à la visite suivante sans animation d'entrée. Donnez un id à chaque panneau.
Vertical
orientation="vertical" empile les panneaux. Les groupes s'imbriquent, comme dans la démo ci-dessus.
Poignée visible
withHandle garde la poignée affichée au lieu de ne la révéler qu'au survol.
De droite à gauche
Les panneaux et les flèches suivent le sens de lecture.
| Touche | Action |
|---|---|
| ←→↑↓ | Déplace le séparateur qui a le focus de 5% dans la direction de son groupe. |
| HomeEnd | Déplace le séparateur aussi loin que les panneaux le permettent. |
| Enter | Replie ou déplie un panneau repliable. |
| F6 | Passe au séparateur suivant du groupe ; Shift revient en arrière. |
- Chaque séparateur est un
separatorfocalisable qui indique la taille du panneau qui le précède. - L'affichage de la taille est décoratif ; les lecteurs d'écran reçoivent la valeur propre du séparateur.
- Avec la réduction des animations, les tailles changent instantanément et le séparateur ne s'anime pas.
| Prop | Type | Par défaut |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
defaultLayout | Layout | – |
onLayoutChangeChaque changement, y compris pendant le glissement. | (layout) => void | – |
onLayoutChangedUne fois qu'un changement se stabilise. | (layout, meta) => void | – |
disabled | boolean | false |
groupRef | Ref<GroupImperativeHandle> | – |
| Attribut | Description |
|---|---|
data-slot="resizable-panel-group" | Le groupe. |
data-ready | Défini après le montage ; les tailles s'animent à partir de là. |
| Prop | Type | Par défaut |
|---|---|---|
defaultSize | number | string | – |
minSize | number | string | – |
maxSize | number | string | – |
collapsible | boolean | false |
collapsedSize | number | string | 0 |
onResize | (size, id, previous) => void | – |
panelRef | Ref<PanelImperativeHandle> | – |
idNécessaire pour mémoriser les dispositions. | string | – |
| Prop | Type | Par défaut |
|---|---|---|
withHandleAffiche toujours la poignée. | boolean | false |
showSize | boolean | "percent" | "pixels" | false |
disableDoubleClickEmpêche le double-clic de réinitialiser les panneaux. | boolean | false |
disabled | boolean | false |
| Attribut | Description |
|---|---|
data-slot="resizable-handle" | Le séparateur. |
data-separator | "inactive", "hover", "active", "focus" ou "disabled". |
data-slot="resizable-handle-grip" | La pastille de poignée. |
usePanelRef et useGroupRef donnent accès à collapse, expand, resize et setLayout. useDefaultLayout conserve la disposition d'un groupe.
- 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.
- 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.
- 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 Resizable.
- ArtifactLe panneau à côté d’un chat IA qui montre ce que le modèle a produit. Pages web, SVG, documents et code arrivent en direct, puis passent à un aperçu isolé en sandbox, avec des versions à comparer et à restaurer, une séparation redimensionnable et une bottom sheet sur mobile.
- 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.