Tree
Verschachtelte, aufklappbare Zeilen für Dateien und Hierarchien, mit Einrückungslinien, Verbindungslinien, kaskadierenden Checkboxen, Typeahead und voller Tastaturunterstützung.
pnpm dlx shadcn@latest add https://hextaui.com/r/tree.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/tree.tsx components/ui/checkbox.tsx Passe die Importpfade an dein Projekt-Setup an.
Ein Item mit <TreeGroup /> ist ein Zweig: Es erhält ein Chevron, öffnet und schließt sich und reagiert auf die Pfeiltasten. Jedes Item braucht einen value, der im Baum eindeutig ist.
Einrückungslinien
variant="lines" zeichnet für jede Ebene eine Führungslinie. Die Linie des Zweigs, der die ausgewählte oder fokussierte Zeile enthält, wird dunkler, sodass du in tiefen Bäumen siehst, wo du bist.
Verbindungslinien
variant="connectors" verbindet jedes Item mit einem Winkel mit seinem Elternelement, wie eine Terminal-Baumauflistung. Nutze meta für Versionen, Größen oder Anzahlen.
Checkboxen
Mit checkboxes hakt das Anhaken eines Zweigs jedes aktivierte Item darin an, und ein teilweise angehakter Zweig zeigt einen Strich. Das Anhaken eines Zweigs zählt auch als Anhaken von Kindern, die du später lädst. Ein Klick auf eine Zeile hakt sie an, und das Chevron öffnet sie.
Navigation
Rendere Zeilen mit render als Links. Übergib die aktuelle Seite an selectedValues, öffne ihren Abschnitt und setze aria-current an ihrer Zeile.
Mehrfachauswahl
selectionMode="multiple" funktioniert wie ein Dateimanager: Klick wählt eine Zeile, Cmd/Strg+Klick fügt eine hinzu oder entfernt sie, Shift+Klick wählt einen Bereich. Auf Touchscreens fügt ein Tippen die Zeile hinzu oder entfernt sie.
Kontrolliert
Halte offene Zweige in deinem eigenen State mit expandedValues und onExpandedValuesChange. Dieses Beispiel baut den Baum auch mit einer rekursiven Funktion aus Daten auf.
Lazy Loading
Lade Kinder in onExpandedChange an <TreeItem />. Rendere eine deaktivierte Ladezeile, bis sie eintreffen, damit der Zweig sein Chevron behält.
Klein
size="sm" nutzt kürzere Zeilen und engere Einrückungen, für Sidebars. Zeilen wachsen auf Touchscreens in beiden Größen.
Deaktiviert
Ein deaktiviertes Item kann nicht ausgewählt, angehakt oder geöffnet werden, und die Pfeiltasten überspringen es. Items in einem deaktivierten Zweig sind ebenfalls deaktiviert.
Lange Namen
Namen werden mit einer Ellipse abgeschnitten, und meta bleibt sichtbar. Übergib title, um den vollen Namen bei Hover zu zeigen.
Rechts nach links
Einrückungen, Verbindungslinien und Chevrons spiegeln sich, und die Pfeiltasten links und rechts tauschen.
| Taste | Aktion |
|---|---|
| ↓ | Setzt den Fokus auf die nächste sichtbare Zeile. |
| ↑ | Setzt den Fokus auf die vorherige sichtbare Zeile. |
| → | Öffnet einen geschlossenen Zweig. Bei einem offenen Zweig wandert der Fokus zu seinem ersten Kind. |
| ← | Schließt einen offenen Zweig. Sonst wandert der Fokus zum Elternelement. |
| Home | Setzt den Fokus auf die erste Zeile. |
| End | Setzt den Fokus auf die letzte sichtbare Zeile. |
| Enter | Wählt die Zeile aus und öffnet oder schließt sie, wenn sie ein Zweig ist. Folgt bei Link-Zeilen dem Link. |
| Space | Wählt die Zeile aus, fügt sie im Mehrfachmodus hinzu oder entfernt sie, oder hakt sie mit Checkboxen an. |
| Shift + ↑Shift + ↓ | Erweitert die Auswahl im Mehrfachmodus. |
| Cmd/Ctrl + A | Wählt im Mehrfachmodus jede sichtbare Zeile aus. |
| * | Öffnet jeden Zweig auf der Ebene der fokussierten Zeile. |
| a–z | Setzt den Fokus auf die nächste Zeile, deren Name mit den getippten Buchstaben beginnt. |
Der Baum folgt dem WAI-ARIA-Tree-View-Muster. Jede Zeile ist das treeitem und besitzt ihre Gruppe über aria-owns, sodass der Name einer Zeile nur ihr eigenes Label ist und Link-Zeilen als echte Links funktionieren. Immer nur eine Zeile ist in der Tab-Reihenfolge. Schließt sich ein Zweig um die fokussierte Zeile, wandert der Fokus zu diesem Zweig, statt verloren zu gehen.
Geschlossene Gruppen bleiben in der Seite, sodass die Seitensuche des Browsers die Ordner um einen Treffer öffnet und das Anhaken eines Zweigs jedes Item darin erfasst. Gib dem Baum ein aria-label.
Zweige öffnen und schließen sich mit dem Base UI Collapsible. <TreeItem /> und <TreeGroup /> akzeptieren die Props der Teile, die sie umschließen.
| Prop | Typ | Standard |
|---|---|---|
variant | "default" | "lines" | "connectors" | "default" |
size | "default" | "sm" | "default" |
selectionMode | "none" | "single" | "multiple" | "single" |
selectedValues | string[] | – |
defaultSelectedValues | string[] | – |
onSelectedValuesChange | (values: string[]) => void | – |
expandedValues | string[] | – |
defaultExpandedValues | string[] | – |
onExpandedValuesChange | (values: string[]) => void | – |
checkboxesZeige kaskadierende Checkboxen. Zeilen werden angehakt statt ausgewählt. | boolean | false |
checkedValuesAngehakte Items. Ein Zweig in der Liste zählt als Anhaken seiner Kinder. | string[] | – |
defaultCheckedValues | string[] | – |
onCheckedValuesChangeWird mit jedem angehakten Blatt und jedem vollständig angehakten Zweig aufgerufen. | (values: string[]) => void | – |
disabled | boolean | false |
hiddenUntilFoundLass die Seitensuche geschlossene Zweige um einen Treffer öffnen. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="tree" | Das Root in CSS ansprechen. |
data-variant | Die aktuelle Variante. |
data-size | Die aktuelle Größe. |
--tree-row-height | Zeilenhöhe. Auf Touchscreens größer. |
--tree-indent | Wie weit jede Ebene eingerückt wird. |
| Prop | Typ | Standard |
|---|---|---|
valueErforderlich. Im Baum eindeutig. | string | – |
disabled | boolean | false |
onExpandedChangeWird aufgerufen, wenn dieses Item öffnet oder schließt. | (expanded: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-item" | Items in CSS ansprechen. |
data-open | Vorhanden, wenn der Eintrag geöffnet ist. |
data-disabled | Vorhanden, wenn das Item deaktiviert ist. |
| Prop | Typ | Standard |
|---|---|---|
iconVor dem Label angezeigt. | ReactNode | – |
expandedIconBlendet für icon ein, während der Zweig offen ist. | ReactNode | – |
metaAm Ende der Zeile angezeigt, etwa Größe, Anzahl oder Status. | ReactNode | – |
className | string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-item-label" | Zeilen per CSS ansprechen. |
data-value | Der Wert des Items. |
data-expanded | Vorhanden, wenn der Zweig offen ist. |
data-selected | Vorhanden, wenn die Zeile ausgewählt ist. |
data-checked | Vorhanden, wenn die Zeile angehakt ist. |
data-indeterminate | Vorhanden, wenn nur einige Kinder angehakt sind. |
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 | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-group" | Gruppen in CSS ansprechen. |
data-open | Vorhanden, wenn die Gruppe offen ist. |
data-starting-style | Vorhanden, solange die Gruppe einblendet. |
data-ending-style | Vorhanden, solange die Gruppe ausblendet. |
--collapsible-panel-height | Die gemessene Höhe der Gruppe, für die Höhenanimation verwendet. |
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- AvatarNutzerfotos mit Initialen als Fallback, Statusbadges und gestapelte Gruppen, die zu einer Zahl einklappen.
- BadgeStatuslabels mit farbigen Punkten, entfernbare Tags, die zugleiten, und Zähler, die zu ihrem neuen Wert rollen.
- CardEine Fläche zum Gruppieren von Inhalten, mit drei Varianten, randlosen Medien, konzentrischen Radien und Links über die ganze Karte.
- ChartRecharts-Diagramme mit Theme-Farben, einem Tooltip und einer Legende, die Labels aus einer Konfiguration lesen, und Tastaturnavigation mit sichtbarem Fokusring.
- Data tableEine Tabelle für echte Daten, mit Sortierung, Suche, Zeilenauswahl, fixierten Spalten, Sticky Header und Paginierung.
In Blocks verwendet
Blocks, die auf Tree aufbauen.
- 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.
- Tool CallsZeige, was ein Agent tut, eine Zeile pro Schritt. Lesen und Suchen werden zu einer kurzen Zusammenfassung gefaltet, während Änderungen, Befehle, Freigaben und Fehler sichtbar bleiben. Jeder Schritt öffnet sich zu einer echten Ansicht: der Datei, dem Diff, dem Terminal oder den Ergebnissen. Jeder Tool-Zustand des AI SDK ist abgedeckt, einschließlich Freigaben mit der Möglichkeit, stattdessen eine Begründung anzugeben.