Pular para o conteúdo
UI

Sidebar

Um componente de sidebar componível, com suporte a temas e personalizável.

Uso

Primeiro, crie um componente Sidebar na sua aplicação.

Provider

Depois, adicione SidebarProvider, SidebarTrigger e AppSidebar na raiz da sua aplicação.

app/layout.tsx
import { SidebarProvider, SidebarTrigger } from "@medway-ui/core"
import { AppSidebar } from "@/components/AppSidebar"
 
export default function Layout({ children }: { children: React.ReactNode }) {
  return (
    <SidebarProvider>
      <AppSidebar />
      <main>
        <SidebarTrigger 
          showTooltip 
          enableHover 
          tooltipContent={{ 
            open: "Esconder sidebar", 
            closed: "Mostrar sidebar" 
          }} 
        />
        {children}
      </main>
    </SidebarProvider>
  )
}

Mobile

Com a janela abaixo de 768px de largura, a Sidebar vira um sheet que abre pelo SidebarTrigger (exceto com collapsible="none"), e o useSidebar passa a usar o openMobile. Quem decide é o hook useIsMobile.

Esse limite é diferente do breakpoint tablet do DS, de 600px (o md: do Tailwind). Ele fica em 768px por compatibilidade com o test-prep-web, que monta o layout de celular nesse valor, e passa para 600px na próxima versão major.

Exemplos

O componente Sidebar oferece tooltips e efeitos de hover:

  • SidebarTrigger: use enableHover para trocar o ícone no hover (ChevronLeft quando aberta, ChevronRight quando fechada)
  • SidebarMenuButton: use a prop tooltip para exibir tooltips quando a sidebar está recolhida
  • Conteúdo personalizado do tooltip: use a prop tooltipContent no SidebarTrigger para personalizar as mensagens do tooltip

Para ativar o efeito de hover no SidebarTrigger, defina enableHover como true: no hover, ele mostra ChevronLeft quando a sidebar está aberta e ChevronRight quando está fechada. Você também pode personalizar o conteúdo do tooltip passando em tooltipContent mensagens próprias para os estados aberto e fechado.

API

Estrutura da Sidebar

ComponenteDescriçãoUso
SidebarProviderComponente raiz que gerencia o estado da sidebarDeve envolver toda a aplicação onde a Sidebar será usada
SidebarComponente principal que renderiza a sidebarContainer principal de toda a estrutura da sidebar
SidebarContentContainer do conteúdo da sidebarCuida do layout e da rolagem do conteúdo principal
SidebarHeaderSeção superior da sidebarIdeal para logos, títulos ou controles principais
SidebarFooterSeção inferior da sidebarÚtil para informações de status, controles do usuário ou ações secundárias
SidebarGroupAgrupa itens relacionadosContainer para grupos de itens com um título em comum
SidebarGroupLabelTítulo do grupoDefine o cabeçalho de um grupo de itens
SidebarGroupContentContainer do conteúdo do grupoEnvolve os itens de um grupo
SidebarGroupActionBotão de ação de um grupoAções contextuais relacionadas ao grupo
SidebarMenuLista de itens de menuContainer dos itens de navegação
SidebarMenuItemItem de menu individualContainer de um item de navegação
SidebarMenuButtonBotão de menu clicávelElemento interativo de navegação
SidebarMenuItemTitleTítulo e ícone do itemExibe o conteúdo visual do item de menu
SidebarMenuItemCollapseIndicador de recolhimento do item de menuExibe o item de menu com um ícone de recolher
SidebarMenuActionBotão de ação do itemAções contextuais de um item específico
SidebarMenuBadgeBadge ou contadorExibe informações adicionais sobre o item. O SidebarMenuButton reserva espaço à direita para um contador de até 3 caracteres (ex.: "128" ou "99+"), e o título longo é truncado antes dele
SidebarMenuSubContainer do submenuAgrupa os itens aninhados do submenu
SidebarMenuSubItemItem do submenuContainer de um item do submenu
SidebarMenuSubButtonBotão do submenuElemento interativo de navegação no submenu
SidebarTriggerBotão de alternânciaControla a visibilidade da sidebar
SidebarRailAlça clicável na borda da sidebarBotão que recolhe ou expande a sidebar (mesma ação do SidebarTrigger), fora da ordem de Tab. O nome acessível vem da prop label. Para uma linha divisória, use o SidebarSeparator
SidebarSeparatorLinha divisóriaSepara seções dentro da sidebar
SidebarInputCampo de entradaCampo de texto estilizado para a sidebar
SidebarInsetContainer de conteúdoAjusta o conteúdo principal à sidebar
SidebarMenuSkeletonComponente de carregamentoExibe o estado de carregamento dos itens de menu

SidebarProvider

O estado de abertura fica no provider, então estas props vão no SidebarProvider (e não na Sidebar). Ele também aceita todas as props de div e alterna a sidebar com Cmd/Ctrl + B.

PropriedadeTipoValores possíveisPadrãoDescrição
defaultOpenbooleantrue, falsetrueEstado inicial de abertura quando a sidebar não é controlada.
openbooleantrue, false-Controla o estado de abertura da sidebar (modo controlado).
onOpenChange(open: boolean) => void--Função chamada quando o estado de abertura muda.
PropriedadeTipoValores possíveisPadrãoDescrição
side"left" | "right""left", "right""left"Define de que lado a sidebar será exibida.
variant"sidebar" | "floating" | "inset""sidebar", "floating", "inset""sidebar"Define o estilo visual da sidebar.
collapsible"offcanvas" | "icon" | "none""offcanvas", "icon", "none""offcanvas"Define o comportamento de recolhimento da sidebar.
containerClassNamestringQualquer string de classe CSS-Classes CSS adicionais para o elemento container da sidebar.
mobileTitlestring-"Menu lateral"Título visualmente oculto, anunciado por leitores de tela quando a sidebar abre como sheet no mobile.
mobileDescriptionstring-"Navegação principal da aplicação."Descrição visualmente oculta do sheet no mobile.

SidebarMenuButton

PropriedadeTipoValores possíveisPadrãoDescrição
variant"default" | "section" | "outline""default", "section", "outline""default"Define o estilo visual do botão de menu.
size"md" | "sm" | "lg""md", "sm", "lg""md"Define o tamanho do botão de menu.
isActivebooleantrue, falsefalseDefine se o botão de menu está ativo.
tooltipstring | TooltipContentProps--Define o texto ou as configurações do tooltip do botão. Quando recebe uma string, ela é convertida em TooltipContentProps com a string como children.
asChildbooleantrue, falsefalsePermite renderizar o botão como um elemento filho personalizado.

SidebarMenuSubButton

PropriedadeTipoValores possíveisPadrãoDescrição
size"sm" | "md""sm", "md""md"Define o tamanho do botão do submenu.
isActivebooleantrue, falsefalseDefine se o botão do submenu está ativo. Quando ativo, aplica o estilo de ativo com peso de fonte semibold e a cor de texto secundária.
asChildbooleantrue, falsefalsePermite renderizar o botão como um elemento filho personalizado.

SidebarTrigger

PropriedadeTipoValores possíveisPadrãoDescrição
iconReact.ReactNodeQualquer nó React<HamburgerMd />Ícone do trigger, com a sidebar aberta ou fechada. Com enableHover, vira ChevronLeft/ChevronRight no hover.
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.
onClick(event: React.MouseEvent) => void--Função chamada quando o trigger é clicado.
showTooltipbooleantrue, falsefalseDefine se um tooltip aparece no hover do trigger.
tooltipContent{ open?: string; closed?: string }-{ open: "Esconder", closed: "Mostrar" }Conteúdo personalizado do tooltip para os estados aberto e fechado.
sizeIconstringQualquer string de classe CSS"size-4"Tamanho do ícone padrão e dos chevrons do hover. Não vale para um icon customizado, que traz o próprio tamanho.
enableHoverbooleantrue, falsefalseDefine se o efeito de hover (troca de ícone) está ativo. Quando ativo, mostra no hover ChevronLeft com a sidebar aberta e ChevronRight com ela fechada.
labelstring-"Alternar barra lateral"Label acessível do trigger. O SidebarRail aceita a mesma prop.

SidebarMenuItem

Item (li) de um SidebarMenu. Aceita as props nativas de li.

PropriedadeTipoValores possíveisPadrãoDescrição
isActivebooleantrue, false-Quando true, mostra uma barra vertical à esquerda do item para marcar a seção ativa. Não altera o estilo do SidebarMenuButton, que tem o próprio isActive.
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.

SidebarMenuAction

Botão de ação posicionado à direita de um SidebarMenuButton, dentro do mesmo SidebarMenuItem. Fica oculto quando a sidebar está recolhida em modo ícone. Aceita as props nativas de button.

PropriedadeTipoValores possíveisPadrãoDescrição
showOnHoverbooleantrue, falsefalseQuando true, em telas médias ou maiores a ação fica invisível e só aparece com hover ou foco no item, ou quando o menu associado está aberto (data-state="open").
asChildbooleantrue, falsefalseRenderiza o filho passado no lugar do button padrão, repassando classes e props (por exemplo, para usar um link).
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.

SidebarMenuSkeleton

Placeholder de carregamento para um item de menu, com a largura do texto variando entre os itens. Aceita as props nativas de div.

PropriedadeTipoValores possíveisPadrãoDescrição
showIconbooleantrue, falsefalseQuando true, mostra também um skeleton quadrado no lugar do ícone, antes do texto.
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.

SidebarGroupLabel

Título de um SidebarGroup. Aceita as props nativas de div.

PropriedadeTipoValores possíveisPadrãoDescrição
asChildbooleantrue, falsefalseRenderiza o filho passado no lugar do div padrão, repassando classes e props (por exemplo, para usar um link).
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.

SidebarGroupAction

Botão de ação no canto do título de um SidebarGroup. Aceita as props nativas de button.

PropriedadeTipoValores possíveisPadrãoDescrição
asChildbooleantrue, falsefalseRenderiza o filho passado no lugar do button padrão, repassando classes e props (por exemplo, para usar um link).
classNamestringQualquer string de classe CSS-Classes CSS adicionais para personalizar o estilo.

useSidebar

Hook que dá acesso ao estado e às ações da sidebar. Só pode ser usado dentro de um SidebarProvider; fora dele, lança um erro.

import { useSidebar } from "@medway-ui/core";
 
const { state, open, setOpen, openMobile, setOpenMobile, isMobile, toggleSidebar } = useSidebar();
RetornoTipoValores possíveisPadrãoDescrição
state"expanded" | "collapsed""expanded", "collapsed"-Estado visual da sidebar no desktop, derivado de open.
openbooleantrue, false-Se a sidebar está aberta no desktop.
setOpen(open: boolean) => void--Abre ou fecha a sidebar no desktop. Também chama o onOpenChange do provider e salva o estado no cookie sidebar_state.
openMobilebooleantrue, false-Se a sidebar está aberta no mobile.
setOpenMobile(open: boolean) => void--Abre ou fecha a sidebar no mobile.
isMobilebooleantrue, false-Se a janela tem menos de 768px de largura (veja Mobile).
toggleSidebar() => void--Alterna a sidebar, usando o estado do mobile ou do desktop conforme a tela. É a mesma ação do atalho Ctrl/Cmd + B.

useIsMobile

Hook que a Sidebar e o DropdownMenuContent usam para decidir o layout de celular. Retorna true com a janela abaixo de 768px de largura e acompanha o redimensionamento. No servidor, retorna false.

import { useIsMobile } from "@medway-ui/core";
 
const isMobile = useIsMobile();

O limite de 768px é diferente do breakpoint tablet do DS (600px) e fica assim por compatibilidade com o test-prep-web. Ele passa para 600px na próxima versão major.