UI

Sidebar

Menu lateral recolhível para sistemas e painéis, que vira um painel deslizante no celular.

Visão geral

Instalação

npx shadcn@latest add @lenstech/sidebar

Estrutura

SidebarProvider            estado (expandida/recolhida, mobile) + atalho Ctrl/⌘+B
├── Sidebar                o menu lateral
│   ├── SidebarHeader      logo / nome da empresa
│   ├── SidebarContent     área rolável
│   │   └── SidebarGroup   (SidebarGroupLabel + SidebarMenu)
│   │       └── SidebarMenuItem → SidebarMenuButton (+ SidebarMenuBadge)
│   └── SidebarFooter      usuário logado
└── SidebarInset           área principal (cabeçalho com SidebarTrigger + conteúdo)

Uso

import {
  Sidebar,
  SidebarContent,
  SidebarGroup,
  SidebarGroupLabel,
  SidebarInset,
  SidebarMenu,
  SidebarMenuButton,
  SidebarMenuItem,
  SidebarProvider,
  SidebarTrigger,
} from "@/components/ui/sidebar"
export default function Layout({ children }: { children: React.ReactNode }) {
  return (
    <SidebarProvider>
      <Sidebar>
        <SidebarContent>
          <SidebarGroup>
            <SidebarGroupLabel>Clínica</SidebarGroupLabel>
            <SidebarMenu>
              <SidebarMenuItem>
                <SidebarMenuButton href="/agenda" icon={<CalendarDays />} isActive>
                  Agenda
                </SidebarMenuButton>
              </SidebarMenuItem>
            </SidebarMenu>
          </SidebarGroup>
        </SidebarContent>
      </Sidebar>
      <SidebarInset>
        <header className="flex h-14 items-center gap-2 border-b px-4">
          <SidebarTrigger />
        </header>
        {children}
      </SidebarInset>
    </SidebarProvider>
  )
}

Atalho Ctrl/⌘ + B

O SidebarProvider escuta Ctrl + B (ou ⌘ + B no Mac) na janela inteira para expandir/recolher. Nesta página há várias prévias, então o atalho alterna todas ao mesmo tempo — no seu app haverá um só provider.

Tela cheia por padrão

No app real o SidebarProvider ocupa a altura da tela (min-h-svh) e a Sidebar fica fixa (h-svh). Nas prévias desta página usamos className="h-[480px] min-h-0" no provider e className="h-full" na Sidebar só para caber na caixa — não copie essas classes para o seu layout.

Exemplos

Offcanvas

collapsible="offcanvas" esconde o menu por completo ao recolher.

Clique no botão: o menu some por completo.

Começa recolhida

defaultOpen={false} inicia no modo ícones (collapsible="icon", o padrão).

Começa recolhida — só os ícones aparecem.

Controlada e useSidebar

Controle o estado com open + onOpenChange (por exemplo, para salvar a preferência do usuário) e use o hook useSidebar() em qualquer componente dentro do provider.

Estado salvo no componente pai: aberta

Do lado direito

Atividade
Pedido #10482

No celular

Abaixo de 768px a Sidebar vira um painel deslizante (Modal do React Aria) aberto pelo SidebarTrigger, que fecha com Esc, clique fora ou ao escolher um item. open/defaultOpen valem só para o desktop.

Quando usar

  • Use em sistemas com várias áreas: painel da clínica, gestão da loja, área do cliente.
  • Não use em sites institucionais e landing pages — use o bloco Site Header.
  • Com poucas seções (2–4) dentro de uma mesma tela, Tabs pode bastar.
  • Veja a composição completa (cabeçalho, breadcrumbs e cards) no bloco App Shell.

API

SidebarProvider

Aceita as props de uma div, mais:

Prop

Type

Aceita as props de uma div, mais:

Prop

Type

SidebarMenuButton

Com href renderiza um Link do React Aria; sem href, um Button (onPress). Aceita as props de cada um, mais:

Prop

Type

useSidebar

Prop

Type

Demais partes

SidebarHeader, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, SidebarMenuBadge, SidebarSeparator e SidebarInset aceitam as props do elemento HTML correspondente. SidebarTrigger aceita as props do Button.

On this page