Skip to content
Extensões

Sidebar

Menu lateral de navegação com módulos expansíveis. Apenas um módulo pode ficar aberto por vez — ao clicar em outro, o anterior fecha. Chevron aparece no hover e rotaciona quando ativo. Dark mode automático via tokens semânticos.

components/sidebar.cssAbrir no Figma

Exemplo

Clique nos módulos para expandir/colapsar. Apenas um fica aberto por vez.

Propriedades

Classes disponíveis para configurar o sidebar.

PropriedadeTipoDefaultDescrição
.sidebarclasseContainer principal (340px, padding 24px).
.sidebar-backclasseBotão voltar com ícone left (opcional).
.sidebar-navclasseLista de módulos (gap 8px).
.sidebar-moduleclasseContainer de um módulo (header + subitens).
.is-openclasseExpande o módulo (mostra subitens, rotaciona chevron).
.sidebar-module-headerclasseHeader clicável (ícone + label + chevron, 40px).
.sidebar-module-iconclasseÍcone do módulo (18x18).
.sidebar-module-labelclasseTexto do módulo (p3 medium).
.sidebar-module-chevronclasseChevron down (16x16, hidden por padrão, visível no hover/ativo).
.sidebar-module-itemsclasseContainer dos subitens (hidden quando fechado).
.sidebar-module-lineclasseLinha vertical separadora (1px, border-default).
.sidebar-module-listclasseLista vertical de subitens.
.sidebar-module-itemclasseSubitem clicável (40px, com seta right no hover).
.is-activeclasseMarca o subitem como ativo.
.sidebar-item-arrowclasseSeta direita do subitem (16x16, hidden por padrão).

Código

Snippets prontos para copiar e usar.

Estrutura base

html
<nav class="sidebar">
    <!-- Botão voltar (opcional) -->
    <button class="sidebar-back">
        <svg viewBox="0 0 48 48" fill="none" stroke="currentColor"
             stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
            <path d="M31 36L19 24l12-12"/>
        </svg>
        Voltar
    </button>

    <div class="sidebar-nav">
        <!-- Módulo expandido -->
        <div class="sidebar-module is-open">
            <button class="sidebar-module-header">
                <span class="sidebar-module-icon">
                    <svg><!-- ícone do módulo 18x18 --></svg>
                </span>
                <span class="sidebar-module-label">Nome do módulo</span>
                <span class="sidebar-module-chevron">
                    <svg viewBox="0 0 48 48" fill="none" stroke="currentColor"
                         stroke-width="3" stroke-linecap="round"
                         stroke-linejoin="round">
                        <path d="M36 18L24 30 12 18"/>
                    </svg>
                </span>
            </button>
            <div class="sidebar-module-items">
                <div class="sidebar-module-line"></div>
                <div class="sidebar-module-list">
                    <a class="sidebar-module-item is-active" href="#">
                        <span>Subitem ativo</span>
                        <span class="sidebar-item-arrow">
                            <svg viewBox="0 0 48 48" fill="none"
                                 stroke="currentColor" stroke-width="3"
                                 stroke-linecap="round" stroke-linejoin="round">
                                <path d="M18 12l12 12-12 12"/>
                            </svg>
                        </span>
                    </a>
                    <a class="sidebar-module-item" href="#">
                        <span>Outro subitem</span>
                        <span class="sidebar-item-arrow">
                            <svg viewBox="0 0 48 48" fill="none"
                                 stroke="currentColor" stroke-width="3"
                                 stroke-linecap="round" stroke-linejoin="round">
                                <path d="M18 12l12 12-12 12"/>
                            </svg>
                        </span>
                    </a>
                </div>
            </div>
        </div>

        <!-- Módulo fechado -->
        <div class="sidebar-module">
            <button class="sidebar-module-header">
                <span class="sidebar-module-icon">
                    <svg><!-- ícone --></svg>
                </span>
                <span class="sidebar-module-label">Outro módulo</span>
                <span class="sidebar-module-chevron">
                    <svg viewBox="0 0 48 48" fill="none" stroke="currentColor"
                         stroke-width="3" stroke-linecap="round"
                         stroke-linejoin="round">
                        <path d="M36 18L24 30 12 18"/>
                    </svg>
                </span>
            </button>
            <div class="sidebar-module-items">
                <div class="sidebar-module-line"></div>
                <div class="sidebar-module-list">
                    <a class="sidebar-module-item" href="#">
                        <span>Subitem</span>
                        <span class="sidebar-item-arrow">
                            <svg viewBox="0 0 48 48" fill="none"
                                 stroke="currentColor" stroke-width="3"
                                 stroke-linecap="round" stroke-linejoin="round">
                                <path d="M18 12l12 12-12 12"/>
                            </svg>
                        </span>
                    </a>
                </div>
            </div>
        </div>
    </div>
</nav>

Comportamento com JavaScript

js
// Apenas um módulo aberto por vez
document.querySelectorAll('.sidebar-module-header').forEach(function(btn) {
    btn.addEventListener('click', function() {
        var module = btn.closest('.sidebar-module');
        var wasOpen = module.classList.contains('is-open');

        // Fecha todos
        document.querySelectorAll('.sidebar-module.is-open').forEach(function(m) {
            m.classList.remove('is-open');
        });

        // Abre o clicado (se não estava aberto)
        if (!wasOpen) module.classList.add('is-open');
    });
});

Design System interno do GALES