Accordion
Gestapelte Überschriften, die jeweils ein Panel aufklappen, mit einer Höhenbewegung, die sich mittendrin umkehren lässt, und Panels, die auch geschlossen durchsuchbar bleiben.
pnpm dlx shadcn@latest add https://hextaui.com/r/accordion.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 class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/accordion.tsx Passe die Importpfade an dein Projekt-Setup an.
Outline
Die Einträge teilen sich eine umrandete Fläche mit abgerundeten äußeren Ecken.
Getrennt
Jeder Eintrag ist eine eigene Karte.
Ghost
Keine Rahmen. Trigger erhalten beim Hovern und im geöffneten Zustand eine weiche Füllung.
Mehrfach
Setze multiple, damit mehr als ein Eintrag geöffnet bleiben kann.
Deaktiviert
Deaktiviere einen einzelnen Eintrag mit disabled auf <AccordionItem /> oder das ganze Accordion an der Root.
Kontrolliert
Übergib value und onValueChange, um die geöffneten Einträge in deinem eigenen State zu halten.
Eigenes Icon
Übergib ein beliebiges Element an icon. Style den geöffneten Zustand mit group-data-panel-open/accordion-trigger.
Vorangestellte Icons
Icons vor dem Label werden automatisch in Größe und Ausrichtung angepasst. icon={null} entfernt den Chevron.
Langer Inhalt
Lange Titel umbrechen, während das Icon in der ersten Zeile bleibt. Geschlossene Panels bleiben durchsuchbar, daher öffnet Cmd/Strg+F nach „retention“ dieses hier.
Verschachtelt
Ein verschachteltes Accordion behält seine eigene Variante, Fokus-Stile und Pfeiltasten-Navigation.
Rechts nach links
Inhalt, Icons und die Öffnen-Bewegung folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| EnterSpace | Öffnet oder schließt den fokussierten Eintrag. |
| ↓ | Setzt den Fokus auf den nächsten Trigger. |
| ↑ | Setzt den Fokus auf den vorherigen Trigger. |
| Home | Setzt den Fokus auf den ersten Trigger. |
| End | Setzt den Fokus auf den letzten Trigger. |
| Tab | Setzt den Fokus in das geöffnete Panel und danach weiter zum nächsten Trigger. |
Basiert auf dem Base UI Accordion. Jeder Teil akzeptiert die Props der Primitive, die er umschließt.
| Prop | Typ | Standard |
|---|---|---|
variant | "default" | "outline" | "separated" | "ghost" | "default" |
multipleErlaubt, dass mehr als ein Eintrag geöffnet ist. | boolean | false |
value | Value[] | – |
defaultValue | Value[] | – |
onValueChange | (value: Value[], details) => void | – |
disabled | boolean | false |
hiddenUntilFoundGeschlossene Panels bleiben über die Seitensuche des Browsers auffindbar. | boolean | true |
keepMountedWird ignoriert, solange hiddenUntilFound aktiv ist. | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="accordion" | Das Root in CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-disabled | Vorhanden, wenn das Accordion deaktiviert ist. |
| Prop | Typ | Standard |
|---|---|---|
valueWird automatisch erzeugt, wenn nicht angegeben. | Value | – |
disabled | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="accordion-item" | Items in CSS ansprechen. |
data-open | Vorhanden, wenn der Eintrag geöffnet ist. |
data-disabled | Vorhanden, wenn das Item deaktiviert ist. |
data-index | Die Position des Eintrags, beginnend bei 0. |
| Prop | Typ | Standard |
|---|---|---|
iconnull entfernt das Icon. | ReactNode | null | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-slot="accordion-trigger" | Trigger in CSS ansprechen. |
data-panel-open | Vorhanden, wenn das Panel geöffnet ist. Style das Icon mit group-data-panel-open/accordion-trigger. |
data-disabled | Vorhanden, wenn das Item deaktiviert ist. |
| Prop | Typ | Standard |
|---|---|---|
classNameWird auf den inneren Wrapper angewendet, damit Padding nie mit der Höhenanimation kollidiert. | string | – |
keepMounted | boolean | false |
hiddenUntilFound | boolean | – |
| Attribut | Beschreibung |
|---|---|
data-slot="accordion-content" | Panels in CSS ansprechen. |
data-open | Vorhanden, wenn das Panel geöffnet ist. |
data-starting-style | Vorhanden, während das Panel eingeblendet wird. |
data-ending-style | Vorhanden, während das Panel ausgeblendet wird. |
data-settled | Vorhanden, sobald das Panel vollständig geöffnet ist. Dann wird nicht mehr beschnitten, sodass Fokusringe in einem verschachtelten Accordion vollständig sichtbar sind. |
--accordion-panel-height | Die gemessene Höhe des Panels, die für die Höhenanimation verwendet wird. |
- 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.
- 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.