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
Oaks & beeches
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
checked: [birch]
Filtro e templates customizados
Europe 3
Asia 2
selected: []
Referência de API
hb-tree — data & selection
| Propriedade | Descrição | Tipo | Padrã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
| Propriedade | Descrição | Tipo | Padrã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
| Propriedade | Descrição | Tipo | Padrã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 | — |