Skip to content
Extensões

Tree

Componente de arvore hierarquica com suporte a checkboxes, expand/collapse, multiplos modos de selecao e icones customizaveis. Substitui FancyTree por implementacao nativa com acessibilidade WCAG 2.1 AA, dark mode automatico e scrollbar customizada.

components/tree.cssAbrir no Figma

Uso

Quando e como utilizar o componente tree para exibir dados hierarquicos.

  • Com checkbox -- Selecao multipla de nos com estado indeterminate para pais parcialmente selecionados.
  • Sem checkbox -- Navegacao hierarquica sem selecao. Use .ds-tree--no-checkbox.
  • Compacta -- Versao com menor espacamento para areas restritas. Use .ds-tree--compact.
  • Altura configuravel -- Controle a altura maxima com .ds-tree--height-sm/md/lg/xl/auto.
Use o componente tree para representar estruturas hierarquicas como organogramas, categorias aninhadas ou arvores de localizacao. Para listas simples, prefira checkboxes ou selects.

Anatomia

Estrutura interna do componente e seus elementos.

ParteElementoDescricao
Container.ds-treeWrapper com borda, border-radius e overflow
Scroll.ds-tree-scrollArea com scroll interno e scrollbar customizada
Header.ds-tree-headerBarra superior com titulo e acoes
Titulo.ds-tree-titleTexto do header, Inter 14px w500
Acoes.ds-tree-actionsBotoes de acao (expandir/recolher tudo)
No.ds-tree-nodeElemento individual da arvore
Header do no.ds-tree-node-headerLinha clicavel com hover
Toggle.ds-tree-toggleSeta triangular expand/collapse
Checkbox.ds-tree-checkboxInput com estados checked/indeterminate
Icone.ds-tree-iconIcone pasta/pagina via Ipe-Icons
Label.ds-tree-labelTexto do no com ellipsis
Filhos.ds-tree-childrenContainer aninhado com indent e borda

Propriedades

Classes disponiveis para configurar o componente tree.

PropriedadeTipoDefaultDescrição
.ds-treeclasseContainer principal da arvore com borda e border-radius.
.ds-tree-scrollclasseContainer com scroll interno (max-height 250px padrao).
.ds-tree--height-smclasseAltura maxima 150px.
.ds-tree--height-mdclasseAltura maxima 250px (padrao).
.ds-tree--height-lgclasseAltura maxima 400px.
.ds-tree--height-xlclasseAltura maxima 600px.
.ds-tree--height-autoclasseSem limite de altura (cresce com o conteudo).
.ds-tree-headerclasseHeader opcional com titulo e acoes.
.ds-tree-titleclasseTitulo do header (14px w500).
.ds-tree-actionsclasseContainer de botoes de acao no header.
.ds-tree-actionclasseBotao de acao individual (expandir tudo, etc.).
.ds-tree-nodeclasseNo individual da arvore.
.ds-tree-node-headerclasseLinha clicavel do no (toggle + checkbox + icon + label).
.ds-tree-node--expandedclasseNo com filhos visiveis.
.ds-tree-node--leafclasseNo folha (sem filhos). Oculta o toggle.
.ds-tree-node--folderclasseNo pasta (com filhos). Exibe icone de pasta.
.ds-tree-node--disabledclasseNo desabilitado (opacidade 0.5, sem interacao).
.ds-tree-node--loadingclasseNo com spinner no toggle (carregamento lazy).
.ds-tree-toggleclasseSeta de expand/collapse (20x20). Rotaciona 90deg quando expandido.
.ds-tree-checkboxclasseCheckbox do no com estados checked e indeterminate.
.ds-tree-iconclasseIcone do no (18x18). Desabilitado por padrao, usa Ipe-Icons.
.ds-tree-labelclasseTexto do no (14px w400) com text-overflow ellipsis.
.ds-tree-childrenclasseContainer de nos filhos com indent e borda lateral.
.ds-tree--no-checkboxclasseVariante sem checkboxes (apenas navegacao).
.ds-tree--compactclasseVariante compacta com padding e fonte reduzidos.

Codigo

Snippets prontos para copiar e usar no seu projeto.

Arvore basica com checkbox

html
<div class="ds-tree">
  <div class="ds-tree-header">
    <span class="ds-tree-title">Localizacoes</span>
    <div class="ds-tree-actions">
      <button class="ds-tree-action">Expandir tudo</button>
      <button class="ds-tree-action">Recolher tudo</button>
    </div>
  </div>
  <div class="ds-tree-scroll">
    <!-- No pai (pasta) -->
    <div class="ds-tree-node ds-tree-node--folder ds-tree-node--expanded">
      <div class="ds-tree-node-header" tabindex="0" role="treeitem" aria-expanded="true">
        <span class="ds-tree-toggle"></span>
        <label class="ds-tree-checkbox">
          <input type="checkbox" indeterminate>
          <span class="ds-tree-checkbox-box">
            <span class="ds-tree-checkbox-icon"></span>
          </span>
        </label>
        <span class="ds-tree-label">Parana</span>
      </div>
      <div class="ds-tree-children" role="group">
        <!-- No folha -->
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox" checked>
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Curitiba</span>
          </div>
        </div>
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox">
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Londrina</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Arvore sem checkbox

html
<div class="ds-tree ds-tree--no-checkbox">
  <div class="ds-tree-scroll">
    <div class="ds-tree-node ds-tree-node--folder ds-tree-node--expanded">
      <div class="ds-tree-node-header" tabindex="0" role="treeitem" aria-expanded="true">
        <span class="ds-tree-toggle"></span>
        <label class="ds-tree-checkbox">
          <input type="checkbox">
          <span class="ds-tree-checkbox-box">
            <span class="ds-tree-checkbox-icon"></span>
          </span>
        </label>
        <span class="ds-tree-label">Documentos</span>
      </div>
      <div class="ds-tree-children" role="group">
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox">
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Relatorio_2025.pdf</span>
          </div>
        </div>
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox">
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Planilha_dados.xlsx</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Arvore compacta com altura customizada

html
<div class="ds-tree ds-tree--compact ds-tree--height-sm">
  <div class="ds-tree-header">
    <span class="ds-tree-title">Categorias</span>
  </div>
  <div class="ds-tree-scroll">
    <div class="ds-tree-node ds-tree-node--folder ds-tree-node--expanded">
      <div class="ds-tree-node-header" tabindex="0" role="treeitem" aria-expanded="true">
        <span class="ds-tree-toggle"></span>
        <label class="ds-tree-checkbox">
          <input type="checkbox" checked>
          <span class="ds-tree-checkbox-box">
            <span class="ds-tree-checkbox-icon"></span>
          </span>
        </label>
        <span class="ds-tree-label">Bovinos</span>
      </div>
      <div class="ds-tree-children" role="group">
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox" checked>
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Nelore</span>
          </div>
        </div>
        <div class="ds-tree-node ds-tree-node--leaf">
          <div class="ds-tree-node-header" tabindex="0" role="treeitem">
            <span class="ds-tree-toggle"></span>
            <label class="ds-tree-checkbox">
              <input type="checkbox" checked>
              <span class="ds-tree-checkbox-box">
                <span class="ds-tree-checkbox-icon"></span>
              </span>
            </label>
            <span class="ds-tree-label">Angus</span>
          </div>
        </div>
      </div>
    </div>
    <div class="ds-tree-node ds-tree-node--folder">
      <div class="ds-tree-node-header" tabindex="0" role="treeitem" aria-expanded="false">
        <span class="ds-tree-toggle"></span>
        <label class="ds-tree-checkbox">
          <input type="checkbox">
          <span class="ds-tree-checkbox-box">
            <span class="ds-tree-checkbox-icon"></span>
          </span>
        </label>
        <span class="ds-tree-label">Suinos</span>
      </div>
      <div class="ds-tree-children" role="group">
        <!-- filhos ocultos -->
      </div>
    </div>
  </div>
</div>

No com estados especiais

html
<!-- No desabilitado -->
<div class="ds-tree-node ds-tree-node--leaf ds-tree-node--disabled">
  <div class="ds-tree-node-header" tabindex="-1" role="treeitem" aria-disabled="true">
    <span class="ds-tree-toggle"></span>
    <label class="ds-tree-checkbox">
      <input type="checkbox" disabled>
      <span class="ds-tree-checkbox-box">
        <span class="ds-tree-checkbox-icon"></span>
      </span>
    </label>
    <span class="ds-tree-label">Item indisponivel</span>
  </div>
</div>

<!-- No carregando -->
<div class="ds-tree-node ds-tree-node--folder ds-tree-node--loading">
  <div class="ds-tree-node-header" tabindex="0" role="treeitem">
    <span class="ds-tree-toggle"></span>
    <label class="ds-tree-checkbox">
      <input type="checkbox">
      <span class="ds-tree-checkbox-box">
        <span class="ds-tree-checkbox-icon"></span>
      </span>
    </label>
    <span class="ds-tree-label">Carregando subitens...</span>
  </div>
</div>

Design

Especificacoes visuais e tokens utilizados no componente.

Especificacoes

PropriedadeDefaultCompacta
Padding (scroll)8px8px
Padding (node header)4px 8px2px 4px
Gap (node header)4px4px
Checkbox18x1816x16
Icone18x1816x16
Fonte label14px w40012px w400
Indent filhos20px + 9px margin16px + 7px margin
Toggle20x2020x20
Border-radius8px (container), 4px (nodes)8px (container), 4px (nodes)
Scrollbar6px width6px width

Variantes de altura

ClasseMax-height
.ds-tree--height-sm150px
.ds-tree--height-md250px
.ds-tree--height-lg400px
.ds-tree--height-xl600px
.ds-tree--height-autosem limite

Tokens utilizados

ElementoBackgroundBordaTexto
Container--color-bg-secondary--color-border--color-text-primary
Header--color-bg-tertiary--color-border--color-text-primary
Node hover--color-bg-tertiary----
Checkbox default--color-bg-secondary--color-border--
Checkbox checked--color-primary--color-primarywhite
Toggle/Icone------color-text-secondary
Label------color-text-primary
Children border----color-border-light--
Acao (action)transparent----color-primary

Design System interno do GALES