Collapsible
Ein Panel, das mit einer Höhenbewegung ein- und ausgeblendet wird, die sich mittendrin umkehren lässt, ohne das Layout springen zu lassen.
@preetsuthar17 starred 3 repositories
pnpm dlx shadcn@latest add https://hextaui.com/r/collapsible.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 @base-ui/react @tabler/icons-react cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/collapsible.tsx Passe die Importpfade an dein Projekt-Setup an.
Standardmäßig geöffnet
defaultOpen startet das Panel geöffnet, ohne seinen State zu übernehmen.
Mehr anzeigen
Das Panel sitzt über seinem Trigger. Beim Schließen fällt die Lücke im Flex-Layout des Elternelements in derselben Animation zusammen, sodass der Button darunter nie springt.
Kontrolliert
Übergib open und onOpenChange, um das Panel aus deinem eigenen State zu steuern. Ein Umschalten mitten in der Animation kehrt von der aktuellen Position des Panels aus um.
Deaktiviert
disabled an der Root hält das Panel in seinem aktuellen Zustand, und der Trigger ignoriert Klicks und Tasten.
Eigenes Icon
Kinder von <CollapsibleTriggerIcon /> ersetzen den Chevron. Style den geöffneten Zustand mit group-data-panel-open/collapsible-trigger.
Dateibaum
Jeder Ordner ist ein eigenes Collapsible. Äußere Panels wachsen sanft mit, wenn sich innere öffnen.
In einer Karte
Geschlossene Panels bleiben mit hidden=„until-found“ auf der Seite, daher öffnet Cmd/Strg+F nach „webhook“ dieses hier.
Im geschlossenen Zustand unmountet
Setze hiddenUntilFound={false} am Content, um ihn im geschlossenen Zustand aus dem DOM zu entfernen, für schwere Panels, die du nicht vorab rendern willst.
Langer Inhalt
Strings ohne Umbruchstelle werden im Panel umgebrochen, statt die Seite zu verbreitern.
Rechts nach links
Chevrons werden gespiegelt, und verschachtelte Einrückungen folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| EnterSpace | Öffnet oder schließt das Panel über den Trigger. |
| Tab | Setzt den Fokus vom Trigger in das geöffnete Panel. Geschlossene Panels werden übersprungen. |
- Der Trigger erhält
aria-expandedundaria-controlsautomatisch. - Reine Icon-Trigger brauchen ein
aria-label.<CollapsibleTriggerIcon />ist für assistive Technologien verborgen. - Bei reduzierter Bewegung öffnet und schließt sich das Panel ohne Höhenanimation.
Basiert auf dem Base UI Collapsible. Jeder Teil akzeptiert die Props der Primitive, die er umschließt.
| Prop | Typ | Standard |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="collapsible" | Das Root in CSS ansprechen. |
data-open | Vorhanden, wenn geöffnet. |
data-closed | Vorhanden, wenn geschlossen. |
| Prop | Typ | Standard |
|---|---|---|
renderNormalerweise ein Button. | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-slot="collapsible-trigger" | Den Trigger in CSS ansprechen. |
data-panel-open | Vorhanden, wenn das Panel geöffnet ist. Style Kinder mit group-data-panel-open/collapsible-trigger. |
| Prop | Typ | Standard |
|---|---|---|
childrenDer Standard-Chevron kippt, wenn sich das Panel öffnet. | ReactNode | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Beschreibung |
|---|---|
data-slot="collapsible-trigger-icon" | Für assistive Technologien verborgen. Rutscht nach unten, solange der Trigger gedrückt wird. |
| Prop | Typ | Standard |
|---|---|---|
classNameWird auf den inneren Wrapper angewendet, damit Padding nie mit der Höhenanimation kollidiert. | string | – |
hiddenUntilFoundHält das geschlossene Panel im DOM, damit die Seitensuche es finden und öffnen kann. | boolean | true |
keepMountedWird ignoriert, solange hiddenUntilFound aktiv ist. | boolean | false |
| Attribut | Beschreibung |
|---|---|
data-slot="collapsible-content" | Das Panel in CSS ansprechen. |
data-open | Vorhanden, wenn geöffnet. |
data-closed | Vorhanden, wenn geschlossen. |
data-starting-style | Vorhanden, während das Panel eingeblendet wird. |
data-ending-style | Vorhanden, während das Panel ausgeblendet wird. |
--collapsible-panel-height | Die gemessene Höhe des Panels. |
--collapsible-panel-width | Die gemessene Breite des Panels. |
--collapsible-gap-start | Der Abstand (gap) des Elternelements vor dem Panel, im geschlossenen Zustand eingeklappt. |
--collapsible-gap-end | Der Abstand (gap) des Elternelements nach dem Panel, im geschlossenen Zustand eingeklappt. |
- 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.
- ResizablePanels, 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.
- 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 Collapsible aufbauen.
- Agent TodosZeige den Plan eines Agenten, während er arbeitet. Jeder Schritt wandert von Backlog über To do und In Arbeit zu Erledigt, mit Live-Zeiten, Fehlern und den dahinterliegenden Tool-Aufrufen. Eine Status-Pille für über dem Composer, sichtbare Planänderungen und ein Review-Schritt, um den Plan vor der Ausführung zu bearbeiten.
- API keysDie API-Schlüssel-Seite eines KI-Produkts, wie in den Konsolen von OpenAI und Anthropic. Schlüssel mit eingeschränkten Berechtigungen und Ablaufdatum erstellen, das Secret einmal sehen mit einem Kopieren, das sich bestätigt, mit Rückgängig widerrufen, direkt umbenennen, mit Übergangsfrist rotieren und die Nutzung pro Schlüssel sehen.
- BillingPlan & Nutzung für ein KI-Produkt, im Stil von Cursor, Claude und Vercel. Eine nach Modell aufgeteilte Nutzungsanzeige, die das Ende des Zyklus hochrechnet und warnt, bevor die Credits ausgehen, ein tägliches Diagramm zum Scrubben, ein Ausgabenlimit mit Warnungen, die du auf der Anzeige in der Vorschau siehst, Planwechsel mit exakter Anteilsberechnung, ein Kartenformular mit echter Validierung und Rechnungen als PDF-Download.
- Chat SidebarDie Seitenleiste für eine Chat-App. Logo, Suche und Neuer Chat oben, deine eigenen Links darunter, angeheftete Chats, Projekte, die sich aufklappen und ihre Chats zeigen, zuletzt verwendete nach Tag gruppiert und Zeilen mit Hover- und Rechtsklick-Menüs, direktem Umbenennen, Löschen mit Rückgängig und Live-Antwortzuständen.