Feito sobre o UI SDK 0.1.0-beta.1 da Vercel. A API pode mudar.
Tree
Uma visualização em árvore sobre o UI SDK da Vercel para arquivos e páginas aninhadas, com caminhos de arquivo, caixas de seleção, links e filhos carregados sob demanda.
- Componentes de exibição de dados
- 7 partes
- 12 exemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-tree.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-tree.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
O UI SDK adiciona um pouco de CSS próprio em uma camada de cascata chamada ui-sdk. Declare essa camada no topo da sua folha de estilos global, acima do import do Tailwind, para que suas classes vençam.
Um item com um TreeGroup dentro é um ramo. Dê a cada item um value único e à árvore um nome acessível. O foco fica no item, e seu label é a linha que você vê, então os estilos de selecionado, atual e focado ficam no label.
Passe items sem filhos e a árvore renderiza linhas estilizadas com chevrons para você. Cada item tem um value, um label e children opcionais.
Passe paths para um explorador de arquivos, com pastas primeiro. Com activation="automatic" as setas selecionam, e um onAction que retorna uma promise marca a linha como pendente até terminar.
Com mode="multiple", Cmd ou Ctrl com clique alterna um item e Shift estende um intervalo. expandOnPress={false} deixa a expansão para o chevron e as setas.
Adicione checkable e um TreeItemCheckbox em cada label. Marcar um ramo marca tudo dentro dele, e um ramo marcado em parte mostra um traço.
Itens com href são renderizados como links. Com mode="none" e current, a página atual recebe aria-current, seus pais se abrem e ela recebe a parada de tab.
Marque um item como branch antes de seus filhos existirem, e loadChildren roda na primeira vez que ele abre. O chevron vira um spinner enquanto carrega e um ícone de tentar de novo se falhar. Archive falha uma vez.
variant="lines" desenha uma guia de recuo para cada grupo aberto, e size="sm" deixa as linhas mais baixas.
Um controlador de createTreeController() expande, recolhe, seleciona e revela itens de qualquer lugar.
Com hiddenUntilFound, grupos fechados continuam na página, então a busca do navegador encontra Phobos e abre Mars para mostrá-lo.
Um item desativado ainda recebe foco, para que leitores de tela o encontrem, mas não pode ser selecionado, marcado nem aberto.
As linhas recuam a partir da direita, o chevron aponta para a esquerda e as setas esquerda e direita se invertem.
| Tecla | Ação |
|---|---|
| ↓↑ | Vai para o próximo item visível ou o anterior. |
| → | Abre um ramo ou vai para o primeiro filho. |
| ← | Fecha um ramo ou vai para o pai dele. |
| HomeEnd | Vai para o primeiro ou último item visível. |
| Alt→ | Abre um ramo e tudo dentro dele. |
| * | Abre todos os ramos ao lado do focado. |
| Enter | Seleciona o item e executa sua ação, ou segue seu link. |
| Space | Marca o item quando a árvore é marcável; caso contrário, o seleciona. |
| Shift↓ | Estende uma seleção múltipla. |
| ⌘A | Seleciona todos os itens visíveis no modo múltiplo. |
A árvore segue o padrão WAI-ARIA de visualização em árvore com uma única parada de tab. O Tab cai na página atual, no item selecionado ou no primeiro item. Digitar uma letra vai para o próximo item que começa com ela. Enquanto um onAction lento roda, leitores de tela ouvem pendingAnnouncement após um segundo, então defina-o no idioma da sua página.
Os grupos abrem e fecham pela altura só quando o movimento é permitido. Em telas de toque as linhas são mais altas, e no modo de cores forçadas as linhas selecionada e atual ganham um contorno.
Cada parte envolve a parte do UI SDK de mesmo nome e aceita todas as suas props, incluindo render e um className que pode ser uma função do estado da parte.
| Prop | Tipo | Padrão |
|---|---|---|
itemsA hierarquia inteira. Sem filhos, a árvore renderiza linhas estilizadas a partir dela. | TreeItemData[] | – |
pathsCaminhos de arquivo. Pastas viram ramos; um caminho terminado em / é uma pasta vazia. | 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" |
onActionRoda ao pressionar ou com Enter. Retorne uma promise para marcar o item como pendente. | (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" |
controllerDe createTreeController(). | TreeController | – |
| Atributo | Descrição |
|---|---|
data-slot="tree" | Seleciona a árvore no CSS. |
data-variant | A variante: default ou lines. |
data-size | O tamanho: default ou sm. |
--tree-row-height | A altura de cada linha, definida por size. |
--tree-indent | Quanto cada nível é recuado. |
| Prop | Tipo | Padrão |
|---|---|---|
valueÚnico na árvore. | string | – |
branchUse-o para um ramo cujos filhos carregam depois. | boolean | – |
disabled | boolean | false |
labelO texto que a digitação antecipada busca quando o label não é texto simples. | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-item" | Seleciona um item no CSS. Ele recebe o foco. |
data-level | A profundidade, a partir de 1. |
data-branch | Presente em um ramo. |
data-expanded | Presente enquanto um ramo está aberto. |
--tree-level | A profundidade, para recuar uma lista plana. |
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-label" | Seleciona uma linha no CSS. |
data-selected | Presente enquanto o item está selecionado. |
data-current | Presente no item da página atual. |
data-expanded | Presente enquanto um ramo está aberto. |
data-pending | Presente enquanto o onAction do item roda. |
data-disabled | Presente quando o item está desabilitado. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, um chevron, um spinner ao carregar e um ícone de tentar de novo após uma falha. | ReactNode | (state) => ReactNode | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-indicator" | Seleciona o chevron no CSS. |
data-loading | Presente enquanto os filhos carregam. |
data-failed | Presente após falhar o carregamento dos filhos. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, uma marca, ou um traço quando misto. | ReactNode | (state) => ReactNode | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-checkbox" | Seleciona a caixa de seleção no CSS. |
data-checked | Presente enquanto está marcado. |
data-indeterminate | Presente enquanto um ramo está marcado em parte. |
| Prop | Tipo | Padrão |
|---|---|---|
keepMounted | boolean | – |
hiddenUntilFound | boolean | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-group" | Seleciona um grupo no CSS. |
data-open | Presente enquanto aberto. |
--tree-group-height | A altura do grupo enquanto anima. |
- AvatarFotos de usuário com fallback de iniciais, badges de status e grupos empilhados que se recolhem em uma contagem.
- BadgeRótulos de status com pontos coloridos, tags removíveis que deslizam até fechar e contagens que rolam até o novo valor.
- CardUma superfície para agrupar conteúdo, com três variantes, mídia de ponta a ponta, raios concêntricos e links no card inteiro.
- ChartGráficos do Recharts com cores do tema, um tooltip e uma legenda que leem os rótulos de uma única configuração, e navegação por teclado com um anel de foco visível.
- Data tableUma tabela para dados reais, com ordenação, busca, seleção de linhas, colunas fixadas, cabeçalho fixo e paginação.
- ItemUma linha de mídia, texto e ações para listas, configurações e seletores, com uma superfície agrupada e um destaque de hover que desliza entre as linhas.