Componente

Tree

Uma lista hierárquica de nós expansíveis. Passe um modelo de dados aninhado, controle expansão e seleção (única ou múltipla), adicione checkboxes em cascata com selecionar-tudo, filtre com uma caixa de busca embutida, virtualize listas longas, mostre um esqueleto de carregamento, e faça template do rótulo do nó ou do ícone de toggle.

Nós, expansão e seleção

Birches
Birch
Alder
autumn-notes.txt

selected: [betula] · last click: —

import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
import { provideIcons } from '@ng-icons/core';
import { phosphorFile, phosphorFolder, phosphorLeaf } from '@ng-icons/phosphor-icons/regular';

import { HbTreeImports, type HbTreeKey, type HbTreeNode } from '@herbst/ui';

@Component({
  selector: 'hb-demo-tree-basic',
  imports: [HbTreeImports],
  viewProviders: [provideIcons({ phosphorFolder, phosphorFile, phosphorLeaf })],
  template: `
    <div class="w-full max-w-xs">
      <hb-tree
        [hbNodes]="nodes"
        [(hbExpanded)]="expanded"
        [(hbSelection)]="selection"
        hbSelectionMode="single"
        hbAriaLabel="Herbst"
        (hbNodeClick)="clicked.set($any($event).label)"
      />

      <p class="mt-3 font-mono text-[12px] text-muted-foreground">
        selected: [{{ selection().join(', ') }}] · last click: {{ clicked() }}
      </p>
    </div>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HbDemoTreeBasicComponent {
  protected readonly expanded = signal<HbTreeKey[]>(['betulaceae']);
  protected readonly selection = signal<HbTreeKey[]>(['betula']);
  protected readonly clicked = signal('—');

  protected readonly nodes: HbTreeNode[] = [
    {
      key: 'betulaceae',
      label: 'Birches',
      icon: 'phosphorFolder',
      children: [
        { key: 'betula', label: 'Birch', icon: 'phosphorLeaf' },
        { key: 'alnus', label: 'Alder', icon: 'phosphorLeaf' },
      ],
    },
    {
      key: 'fagaceae',
      label: 'Oaks & beeches',
      icon: 'phosphorFolder',
      children: [
        { key: 'quercus', label: 'Oak', icon: 'phosphorLeaf' },
        { key: 'fagus', label: 'Beech', icon: 'phosphorLeaf', disabled: true },
      ],
    },
    { key: 'notes', label: 'autumn-notes.txt', icon: 'phosphorFile', leaf: true },
  ];
}

Checkboxes em cascata

Trees
Birch
Oak
Beech
Shrubs
Hazel
Elder

checked: [birch]

Filtro e templates customizados

selected: []

Referência de API

hb-tree — data & selection

PropriedadeDescriçãoTipoPadrão
[hbNodes] Os dados da árvore. Cada nó é { key, label, icon?, children?, leaf?, disabled?, selectable?, loading?, data? }. HbTreeNode[] []
[(hbExpanded)] As keys dos nós expandidos, bidirecional. HbTreeKey[] []
[hbSelectionMode] / [(hbSelection)] Modo de seleção de linha e as keys selecionadas (bidirecional). 'none' | 'single' | 'multiple' / HbTreeKey[] 'single' / []
[hbMetaKeySelection] Modo multiple — exige Ctrl/Cmd para adicionar à seleção em vez de alternar livremente. boolean false

hb-tree — checkboxes & filtering

PropriedadeDescriçãoTipoPadrão
[hbCheckable] / [(hbChecked)] Mostra um checkbox por nó e faz bind bidirecional das keys marcadas. boolean / HbTreeKey[] false / []
[hbCheckStrictly] / [hbShowSelectAll] Checkboxes independentes (sem cascata pai/filho), e um cabeçalho selecionar-tudo com estado indeterminado. boolean false
[hbShowFilter] / [hbFilter] Mostra a caixa de busca embutida, ou controle a filtragem você mesmo com uma query. boolean / string false / ""
[hbFilterMode] / [hbFilterPlaceholder] Lenient mantém os descendentes do nó correspondente visíveis; strict mostra só correspondências e ancestrais. Mais o placeholder da busca. 'lenient' | 'strict' / string 'lenient' / 'Filter…'

hb-tree — rendering & events

PropriedadeDescriçãoTipoPadrão
[hbVirtualScroll] / [hbItemSize] / [hbScrollHeight] Virtualiza a lista achatada com altura de linha fixa e altura de viewport. boolean / number / string false / 32 / '16rem'
[hbLoading] / [hbSkeletonRows] Substitui a árvore por linhas de esqueleto enquanto os dados carregam. boolean / number false / 6
[hbToggleIcon] / [hbIndent] / [hbAriaLabel] O nome do ícone de expansão, a indentação por nível em pixels, e o rótulo acessível da árvore. string / number / string 'phosphorCaretRight' / 16 / ''
(hbNodeExpand) / (hbNodeCollapse) / (hbNodeClick) Emitem o nó quando ele é expandido, colapsado ou clicado. HbTreeNode
ng-template[hbTreeNodeContent] / [hbTreeToggle] Faz template do rótulo do nó (ctx: $implicit = node, level) e do ícone de toggle (ctx: $implicit = expanded, node). template