AppSidebar

AppSidebar mantém os destinos de uma aplicação à vista. Escolha a porta de children quando os links precisarem preservar o comportamento do router; escolha groups para uma interface rápida de seleção baseada em botões.

Exemplos

Links compostos e trilho de ícones

Passe filhos SidebarGroup quando a aplicação for dona do routing. Ao recolher, a barra vira um trilho de 64px e fornece tooltips nativos e nomes acessíveis a seus descendentes de link a partir do texto.

Grupos convenientes

groups transforma cada item em botão e informa seu id por onSelect. Seu label é uma string de propósito, para que o trilho sempre possa nomear o botão e mostrar um tooltip nativo.

Selected: Overview

Quando usar

Use AppSidebar para destinos agrupados e persistentes no shell de uma aplicação.

Prefira outro componente quando:

  • Uma linha curta de rotas no nível do site é suficiente — use Navbar.
  • Os destinos são visualizações pares na página atual — use Tabs.
  • Você precisa de apenas uma seção de navegação — use SidebarGroup.

Acessibilidade

  • AppSidebar renderiza um <nav> nativo. Passe aria-label para ele quando a página tiver mais de um landmark de navegação.
  • No modo groups, os itens são botões nativos; um item ativo recebe aria-current="page". O callback do item roda antes do callback onSelect(id, item) da barra lateral.
  • No modo de composição, os filhos permanecem seus elementos originais. Use âncoras reais para rotas; no modo trilho, descendentes de link recebem title e aria-label de um rótulo explícito, título ou de seu conteúdo textual.
  • O controle de recolhimento é um botão nativo cujo nome acessível e tooltip vêm de labels. No modo trilho, rótulos de grupo, texto de item e badges ficam visualmente ocultos, enquanto os nomes dos controles e itens continuam disponíveis.

API e código

NomeTipoObrigatóriaDescrição
brandReactNodeOptional brand content placed above the navigation groups.
groupsAppSidebarGroup[]Convenience data mode. Each group is composed through {@link SidebarGroup} and renders its items as buttons.
footerReactNodeOptional utility links or user content separated below the navigation groups.
widthnumberSidebar width in pixels while expanded. Default: `260`.
collapsiblebooleanWhether to render a control that switches between expanded and icon-rail modes.
collapsedbooleanControlled icon-rail state.
defaultCollapsedbooleanInitial icon-rail state when uncontrolled.
onCollapsedChange(collapsed: boolean) => voidCalled whenever the icon-rail state changes.
onSelect(id: string, item: AppSidebarGroupItem) => voidCalled after an item-level callback in data mode.
labelsAppSidebarLabelsLocalized labels for the collapse control.
childrenReactNodeComposition mode. Pass {@link SidebarGroup} children (including link children) to preserve their original element type and routing behavior instead of using data-mode buttons.

x-data="lyraAppSidebar({ … })"

OpçãoTipoObrigatóriaDescrição
defaultCollapsedbooleanWhether the sidebar starts in its icon-rail state. Default: `false`.
widthnumberSidebar width in pixels while expanded. Default: `260`.
labelsLyraAppSidebarLabelsLocalized labels for the collapse control.

A porta de links compostos é uma marcação de navegação comum. Fora do React, implemente o recolhimento, os rótulos do trilho e a seleção:

html
<nav class="lyra-appsidebar" aria-label="Navegação do espaço de trabalho">
  <div class="lyra-appsidebar__brand"><strong>Acme</strong></div>
  <div class="lyra-appsidebar__groups">
    <div class="lyra-sbgroup">
      <div class="lyra-sbgroup__label">Espaço de trabalho</div>
      <div class="lyra-sbgroup__items">
        <a
          class="lyra-sbgroup__item lyra-sbgroup__item--active"
          href="/overview"
          aria-current="page"
        >
          <span class="lyra-sbgroup__item-label">Visão geral</span>
        </a>
      </div>
    </div>
  </div>
</nav>

<lyra:app-sidebar> Gerado do lyra-ds/blade v0.10.0.

O comportamento vem de lyraAppSidebar() — instale @lyra-ds/alpine e veja a aba HTML + Alpine.

PropPadrãoObrigatóriaValores de exemplo
brandnull
groups[]
footernull
width260
collapsiblefalse
defaultCollapsedfalse
labels[]
blade
<lyra:app-sidebar
    :groups="[
        ['heading' => 'Workspace', 'items' => [
            ['id' => 'overview', 'label' => 'Overview', 'active' => true],
            ['id' => 'projects', 'label' => 'Projects', 'badge' => '12'],
        ]],
        ['heading' => 'Account', 'items' => [
            ['id' => 'billing', 'label' => 'Billing'],
            ['id' => 'settings', 'label' => 'Settings'],
        ]],
    ]"
    collapsible
/>