Resizable
Panels, die du auseinanderziehen kannst, mit einem dezenten Trenner, der beim Hover aufwacht, Größen, die beim Zurücksetzen oder Einklappen gleiten, und Layouts, die erhalten bleiben.
pnpm dlx shadcn@latest add https://hextaui.com/r/resizable.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add react-resizable-panels cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/resizable.tsx Passe die Importpfade an dein Projekt-Setup an.
Zahlen sind Pixel und Strings sind Prozente, sodass defaultSize="30%" und minSize={240} beide funktionieren. Der Trenner bleibt eine feine Linie, bis du nach ihm greifst. Beim Ziehen folgen die Panels dem Zeiger exakt; jede andere Änderung gleitet, auch Doppelklick-Resets, Tastaturschritte und Einklappen aus dem Code.
Collapsible
Ein collapsible-Panel schnappt zu, wenn es unter seine minSize gezogen wird. Schalte es per Button mit usePanelRef um; das Einklappen wird animiert.
Größenanzeige
showSize zeigt beim Ziehen oder Tastaturbedienen die Größe des Panels vor dem Trenner, in "percent" oder "pixels".
Layout merken
useDefaultLayout speichert Größen in localStorage und stellt sie beim nächsten Besuch ohne Animation wieder her. Gib jedem Panel eine id.
Vertikal
orientation="vertical" stapelt Panels. Gruppen lassen sich verschachteln, wie in der Demo oben.
Sichtbarer Griff
withHandle zeigt den Griff dauerhaft, statt ihn erst bei Hover einzublenden.
Rechts nach links
Panels und Pfeiltasten folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| ←→↑↓ | Bewegt den fokussierten Trenner um 5% entlang der Richtung seiner Gruppe. |
| HomeEnd | Bewegt den Trenner so weit, wie die Panels es erlauben. |
| Enter | Klappt ein einklappbares Panel ein oder aus. |
| F6 | Wechselt zum nächsten Trenner der Gruppe; Shift geht zurück. |
- Jeder Trenner ist ein fokussierbarer
separator, der die Größe des Panels davor meldet. - Die Größenanzeige ist Dekoration; Screenreader erhalten den eigenen Wert des Separators.
- Bei reduzierter Bewegung ändern sich Größen sofort, und der Trenner animiert nicht.
| Prop | Typ | Standard |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
defaultLayout | Layout | – |
onLayoutChangeJede Änderung, auch während des Ziehens. | (layout) => void | – |
onLayoutChangedSobald eine Änderung zur Ruhe kommt. | (layout, meta) => void | – |
disabled | boolean | false |
groupRef | Ref<GroupImperativeHandle> | – |
| Attribut | Beschreibung |
|---|---|
data-slot="resizable-panel-group" | Die Gruppe. |
data-ready | Wird nach dem Mount gesetzt; Größen animieren ab dann. |
| Prop | Typ | Standard |
|---|---|---|
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ötig, um Layouts zu merken. | string | – |
| Prop | Typ | Standard |
|---|---|---|
withHandleDen Griff immer anzeigen. | boolean | false |
showSize | boolean | "percent" | "pixels" | false |
disableDoubleClickVerhindere, dass ein Doppelklick die Panels zurücksetzt. | boolean | false |
disabled | boolean | false |
| Attribut | Beschreibung |
|---|---|
data-slot="resizable-handle" | Der Trenner. |
data-separator | "inactive", "hover", "active", "focus" oder "disabled". |
data-slot="resizable-handle-grip" | Die Griff-Pille. |
usePanelRef und useGroupRef geben dir collapse, expand, resize und setLayout. useDefaultLayout persistiert das Layout einer Gruppe.
- AccordionGestapelte Überschriften, die jeweils ein Panel aufklappen, mit einer Höhenbewegung, die sich mittendrin umkehren lässt, und Panels, die auch geschlossen durchsuchbar bleiben.
- Aspect ratioEine Box, die ihre Form behält, bevor Medien geladen sind, beim Laden schimmert, das Medium einblendet und bei einem Fehler auf einen Fallback zurückfällt.
- CarouselNative Scroll-Snap-Slides mit Momentum auf Touch, Maus-Ziehen, Pfeiltasten, Punkten, Thumbnails und einem Autoplay, das pausiert, wenn es soll.
- CollapsibleEin Panel, das mit einer Höhenbewegung ein- und ausgeblendet wird, die sich mittendrin umkehren lässt, ohne das Layout springen zu lassen.
- Scroll areaNatives Scrollen mit minimaler Scrollbar, Kanten, die nur dort ausblenden, wo es mehr zu sehen gibt, und einem optionalen Anschnitt, der das letzte Element halbiert.
- SeparatorEine Haarlinie, die Inhalte horizontal oder vertikal trennt, mit optionalem Label und einem dekorativen Modus für rein visuelle Linien.
In Blocks verwendet
Blocks, die auf Resizable aufbauen.
- ArtifactDas Panel neben einem KI-Chat, das zeigt, was das Modell erzeugt hat. Webseiten, SVGs, Dokumente und Code streamen live ein und wechseln dann zu einer Sandbox-Vorschau, mit Versionen zum Vergleichen und Wiederherstellen, einem anpassbaren Split und einem Bottom Sheet auf Smartphones.
- Diff ReviewPrüfe die Änderungen eines Agenten über mehrere Dateien, bevor sie übernommen werden. Ein Dateibaum mit Zählern, jede Änderung, jede Datei oder alles annehmen oder ablehnen, Kommentare zu jeder Zeile oder jedem Bereich, die an den Agenten zurückgehen, Unified- und Split-Ansicht, Hervorhebung auf Wortebene, Rückgängig, streamende Änderungen und eine Zusammenfassung „4 Dateien bearbeitet“ für den Chat.