Tree
Linhas aninhadas e expansíveis para arquivos e hierarquias, com guias de recuo, linhas conectoras, checkboxes em cascata, typeahead e suporte completo ao teclado.
pnpm dlx shadcn@latest add https://hextaui.com/r/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 @base-ui/react @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/tree.tsx components/ui/checkbox.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
Um item com <TreeGroup /> é um ramo: ganha um chevron, abre e fecha, e responde às setas. Todo item precisa de um value único dentro da árvore.
Guias de recuo
variant="lines" desenha uma guia para cada nível. A guia do ramo que contém a linha selecionada ou com foco fica mais escura, para você ver onde está em árvores profundas.
Conectores
variant="connectors" liga cada item ao seu pai com um cotovelo, como uma listagem de árvore no terminal. Use meta para versões, tamanhos ou contagens.
Checkboxes
Com checkboxes, marcar um ramo marca todos os itens habilitados dentro dele, e um ramo parcialmente marcado mostra um traço. Marcar um ramo também conta como marcar filhos que você carregar depois. Clicar em uma linha a marca, e o chevron a abre.
Navegação
Renderize as linhas como links com render. Passe a página atual para selectedValues, abra sua seção e defina aria-current na linha dela.
Seleção múltipla
selectionMode="multiple" funciona como um gerenciador de arquivos: clique para selecionar uma linha, Cmd/Ctrl+clique para adicionar ou remover uma, Shift+clique para selecionar um intervalo. Em telas touch, um toque adiciona ou remove a linha.
Controlado
Mantenha os ramos abertos no seu próprio estado com expandedValues e onExpandedValuesChange. Este exemplo também monta a árvore a partir de dados com uma função recursiva.
Carregamento lazy
Busque os filhos em onExpandedChange de <TreeItem />. Renderize uma linha de carregamento desabilitada até eles chegarem, para o ramo manter seu chevron.
Pequeno
size="sm" usa linhas mais baixas e recuos menores, para sidebars. As linhas crescem em telas touch nos dois tamanhos.
Desabilitado
Um item desabilitado não pode ser selecionado, marcado nem aberto, e as setas o ignoram. Itens dentro de um ramo desabilitado também ficam desabilitados.
Nomes longos
Nomes longos são cortados com reticências e meta permanece visível. Passe title para mostrar o nome completo no hover.
Da direita para a esquerda
Recuos, conectores e chevrons são espelhados, e as setas esquerda e direita trocam.
| Tecla | Ação |
|---|---|
| ↓ | Move o foco para a próxima linha visível. |
| ↑ | Move o foco para a linha visível anterior. |
| → | Abre um ramo fechado. Em um ramo aberto, move o foco para o primeiro filho. |
| ← | Fecha um ramo aberto. Senão, move o foco para o pai. |
| Home | Move o foco para a primeira linha. |
| End | Move o foco para a última linha visível. |
| Enter | Seleciona a linha e a abre ou fecha se for um ramo. Segue o link em linhas de link. |
| Space | Seleciona a linha, adiciona ou remove no modo múltiplo, ou a marca com checkboxes. |
| Shift + ↑Shift + ↓ | Estende a seleção no modo múltiplo. |
| Cmd/Ctrl + A | Seleciona todas as linhas visíveis no modo múltiplo. |
| * | Abre todos os ramos no nível da linha com foco. |
| a–z | Move o foco para a próxima linha cujo nome começa com as letras digitadas. |
A árvore segue o padrão tree view da WAI-ARIA. Cada linha é o treeitem e é dona do seu grupo por meio de aria-owns, então o nome de uma linha é apenas seu próprio rótulo e as linhas de link funcionam como links de verdade. Apenas uma linha fica na ordem de tabulação por vez. Quando um ramo fecha em volta da linha com foco, o foco vai para esse ramo em vez de se perder.
Grupos fechados permanecem na página, então a busca na página do navegador abre as pastas em volta de uma ocorrência, e marcar um ramo vê todos os itens dentro dele. Dê um aria-label à árvore.
Os ramos abrem e fecham com o collapsible do Base UI. <TreeItem /> e <TreeGroup /> aceitam as props das partes que envolvem.
| Prop | Tipo | Padrão |
|---|---|---|
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 | – |
checkboxesMostra checkboxes em cascata. As linhas são marcadas em vez de selecionadas. | boolean | false |
checkedValuesItens marcados. Um ramo na lista conta como marcar seus filhos. | string[] | – |
defaultCheckedValues | string[] | – |
onCheckedValuesChangeChamado com cada folha marcada e cada ramo totalmente marcado. | (values: string[]) => void | – |
disabled | boolean | false |
hiddenUntilFoundPermite que a busca na página abra ramos fechados em volta de uma ocorrência. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="tree" | Selecione a raiz no CSS. |
data-variant | A variante atual. |
data-size | O tamanho atual. |
--tree-row-height | Altura da linha. Maior em telas touch. |
--tree-indent | Quanto cada nível é recuado. |
| Prop | Tipo | Padrão |
|---|---|---|
valueObrigatório. Único dentro da árvore. | string | – |
disabled | boolean | false |
onExpandedChangeChamado quando este item abre ou fecha. | (expanded: boolean) => void | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="tree-item" | Selecione itens no CSS. |
data-open | Presente quando o item está aberto. |
data-disabled | Presente quando o item está desabilitado. |
| Prop | Tipo | Padrão |
|---|---|---|
iconExibido antes do rótulo. | ReactNode | – |
expandedIconAparece com crossfade em lugar do ícone enquanto o ramo está aberto. | ReactNode | – |
metaExibido no final da linha, como um tamanho, contagem ou status. | ReactNode | – |
className | string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="tree-item-label" | Seleciona as linhas no CSS. |
data-value | O valor do item. |
data-expanded | Presente quando o ramo está aberto. |
data-selected | Presente quando a linha está selecionada. |
data-checked | Presente quando a linha está marcada. |
data-indeterminate | Presente quando apenas alguns filhos estão marcados. |
data-disabled | Presente quando o item está desabilitado. |
| Prop | Tipo | Padrão |
|---|---|---|
classNameAplicado ao wrapper interno, para que o padding nunca entre em conflito com a animação de altura. | string | – |
| Atributo | Descrição |
|---|---|
data-slot="tree-group" | Selecione grupos no CSS. |
data-open | Presente quando o grupo está aberto. |
data-starting-style | Presente enquanto o grupo anima a entrada. |
data-ending-style | Presente enquanto o grupo anima a saída. |
--collapsible-panel-height | A altura medida do grupo, usada para a animação de altura. |
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- 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.
Usado em blocos
Blocos que se baseiam em Tree.
- Diff ReviewRevise as edições de um agente em vários arquivos antes que sejam aplicadas. Uma árvore de arquivos com contagens, aceite ou rejeite cada mudança, cada arquivo ou tudo de uma vez, comentários em qualquer linha ou intervalo que voltam para o agente, visões unificada e dividida, destaques por palavra, desfazer, edições em streaming e um resumo "4 arquivos editados" para o chat.
- Tool CallsMostre o que um agente faz, uma linha por etapa. Leituras e buscas se dobram em um resumo curto, enquanto edições, comandos, aprovações e erros permanecem à vista. Cada etapa se abre em uma visão real: o arquivo, o diff, o terminal ou os resultados. Todos os estados de ferramenta do AI SDK são cobertos, incluindo aprovações com a opção de dar um motivo.