Gebaut auf Vercels UI SDK 0.1.0-beta.1. Die API kann sich ändern.
Tree
Eine Baumansicht auf Vercels UI SDK für Dateien und verschachtelte Seiten, mit Dateipfaden, Checkboxen, Links und Kindern, die bei Bedarf laden.
- Komponenten zur Datenanzeige
- 7 Teilen
- 12 Beispielen
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-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 @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/ui-sdk-tree.tsx Passe die Importpfade an dein Projekt-Setup an.
UI SDK bringt etwas eigenes CSS in einem Cascade Layer namens ui-sdk mit. Deklariere diesen Layer ganz oben im globalen Stylesheet, über dem Tailwind-Import, damit deine Klassen gewinnen.
Ein Element mit einer TreeGroup darin ist ein Zweig. Gib jedem Element einen eindeutigen value und dem Baum einen zugänglichen Namen. Der Fokus bleibt auf dem Element, und sein Label ist die sichtbare Zeile, daher landen ausgewählte, aktuelle und fokussierte Stile alle auf dem Label.
Übergib items ohne Kinder, und der Baum rendert gestylte Zeilen mit Chevrons für dich. Jedes Element hat einen value, ein label und optional children.
Übergib paths für einen Datei-Explorer, Ordner zuerst. Mit activation="automatic" wählen die Pfeiltasten aus, und ein onAction, das ein Promise zurückgibt, markiert die Zeile bis zum Abschluss als ausstehend.
Mit mode="multiple" schaltet Cmd- oder Strg-Klick ein Element um, und Shift erweitert einen Bereich. expandOnPress={false} überlässt das Aufklappen dem Chevron und den Pfeiltasten.
Füge checkable und in jedem Label eine TreeItemCheckbox hinzu. Ein abgehakter Zweig hakt alles darin ab, und ein teilweise abgehakter Zweig zeigt einen Strich.
Elemente mit href werden als Links gerendert. Mit mode="none" und current bekommt die aktuelle Seite aria-current, ihre Eltern klappen auf und sie erhält den Tab-Stopp.
Markiere ein Element als branch, bevor seine Kinder existieren, und loadChildren läuft beim ersten Öffnen. Der Chevron wird beim Laden zum Spinner und bei einem Fehler zum Wiederholen-Symbol. Archive schlägt einmal fehl.
variant="lines" zeichnet für jede offene Gruppe eine Einrückungslinie, und size="sm" macht die Zeilen niedriger.
Ein Controller aus createTreeController() klappt Elemente von überall auf und zu, wählt sie aus und macht sie sichtbar.
Mit hiddenUntilFound bleiben geschlossene Gruppen in der Seite, sodass die Suche des Browsers Phobos findet und Mars aufklappt, um es zu zeigen.
Ein deaktiviertes Element kann weiterhin den Fokus erhalten, damit Screenreader es finden, lässt sich aber nicht auswählen, abhaken oder öffnen.
Zeilen werden von rechts eingerückt, der Chevron zeigt nach links, und die Pfeiltasten links und rechts tauschen.
| Taste | Aktion |
|---|---|
| ↓↑ | Springt zum nächsten oder vorherigen sichtbaren Element. |
| → | Öffnet einen Zweig oder springt zu seinem ersten Kind. |
| ← | Schließt einen Zweig oder springt zu seinem Elternelement. |
| HomeEnd | Springt zum ersten oder letzten sichtbaren Element. |
| Alt→ | Öffnet einen Zweig und alles darin. |
| * | Öffnet alle Zweige neben dem fokussierten. |
| Enter | Wählt das Element aus und führt seine Aktion aus oder folgt seinem Link. |
| Space | Hakt das Element ab, wenn der Baum abhakbar ist, sonst wählt es es aus. |
| Shift↓ | Erweitert eine Mehrfachauswahl. |
| ⌘A | Wählt im Mehrfachmodus alle sichtbaren Elemente aus. |
Der Baum folgt dem WAI-ARIA-Muster für Baumansichten mit einem Tab-Stopp. Tab landet auf der aktuellen Seite, dem ausgewählten oder dem ersten Element. Ein getippter Buchstabe springt zum nächsten Element, das damit beginnt. Während ein langsames onAction läuft, hören Screenreader nach einer Sekunde pendingAnnouncement, also setze es in der Sprache deiner Seite.
Gruppen klappen nur dann mit Höhenanimation auf und zu, wenn Bewegung erlaubt ist. Auf Touchscreens sind Zeilen höher, und im Modus „Erzwungene Farben“ bekommen ausgewählte und aktuelle Zeilen einen Umriss.
Jeder Teil umhüllt den gleichnamigen UI-SDK-Teil und nimmt alle seine Props an, auch render und einen className, der eine Funktion des Zustands sein kann.
| Prop | Typ | Standard |
|---|---|---|
itemsDie ganze Hierarchie. Ohne Kinder rendert der Baum daraus gestylte Zeilen. | TreeItemData[] | – |
pathsDateipfade. Ordner werden zu Zweigen; ein Pfad, der auf / endet, ist ein leerer Ordner. | string[] | – |
mode | "single" | "multiple" | "none" | "single" |
value | string | string[] | null | – |
defaultValue | string | string[] | null | – |
onValueChange | (value, details) => void | – |
activation | "automatic" | "manual" | "manual" |
expanded | string[] | – |
defaultExpanded | string[] | – |
onExpandedChange | (expanded, details) => void | – |
expandOnPress | boolean | true |
checkable | boolean | false |
checked | string[] | – |
defaultChecked | string[] | – |
onCheckedChange | (checked, details) => void | – |
checkStrategy | "leaf" | "trunk" | "branch" | "independent" | "leaf" |
onActionLäuft bei Druck oder Enter. Gib ein Promise zurück, um das Element als ausstehend zu markieren. | (value, details) => unknown | – |
pendingAnnouncement | string | – |
loadChildren | (value, { signal }) => Promise<unknown> | – |
current | string | null | – |
disabled | boolean | false |
hiddenUntilFound | boolean | false |
keepMounted | boolean | false |
variant | "default" | "lines" | "default" |
size | "default" | "sm" | "default" |
controllerAus createTreeController(). | TreeController | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree" | Spricht den Baum in CSS an. |
data-variant | Die Variante: default oder lines. |
data-size | Die Größe: default oder sm. |
--tree-row-height | Die Höhe jeder Zeile, gesetzt durch size. |
--tree-indent | Wie weit jede Ebene eingerückt wird. |
| Prop | Typ | Standard |
|---|---|---|
valueEindeutig im Baum. | string | – |
branchSetze es für einen Zweig, dessen Kinder später laden. | boolean | – |
disabled | boolean | false |
labelDer Text, den die Tippsuche abgleicht, wenn das Label kein reiner Text ist. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-item" | Spricht ein Element in CSS an. Es hält den Fokus. |
data-level | Die Tiefe, ab 1. |
data-branch | Vorhanden auf einem Zweig. |
data-expanded | Vorhanden, solange ein Zweig offen ist. |
--tree-level | Die Tiefe, um eine flache Liste einzurücken. |
| Prop | Typ | Standard |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-label" | Spricht eine Zeile in CSS an. |
data-selected | Vorhanden, solange das Element ausgewählt ist. |
data-current | Vorhanden auf dem Element der aktuellen Seite. |
data-expanded | Vorhanden, solange ein Zweig offen ist. |
data-pending | Vorhanden, während onAction des Elements läuft. |
data-disabled | Vorhanden, wenn das Item deaktiviert ist. |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein Chevron, beim Laden ein Spinner und nach einem Fehler ein Wiederholen-Symbol. | ReactNode | (state) => ReactNode | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-indicator" | Das Chevron per CSS ansprechen. |
data-loading | Vorhanden, während Kinder laden. |
data-failed | Vorhanden, nachdem das Laden der Kinder fehlschlug. |
| Prop | Typ | Standard |
|---|---|---|
childrenStandard ist ein Haken, bei gemischtem Zustand ein Strich. | ReactNode | (state) => ReactNode | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-checkbox" | Spricht die Checkbox in CSS an. |
data-checked | Vorhanden, solange abgehakt. |
data-indeterminate | Vorhanden, solange ein Zweig teilweise abgehakt ist. |
| Prop | Typ | Standard |
|---|---|---|
keepMounted | boolean | – |
hiddenUntilFound | boolean | – |
| Attribut | Beschreibung |
|---|---|
data-slot="tree-group" | Spricht eine Gruppe in CSS an. |
data-open | Vorhanden, solange geöffnet. |
--tree-group-height | Die Höhe der Gruppe während der Animation. |
- 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.
- ItemEine Zeile aus Medien, Text und Aktionen für Listen, Einstellungen und Auswahlen, mit gruppierter Fläche und einer Hover-Hervorhebung, die zwischen den Zeilen gleitet.