Navigation Menu

Navegacao

Barra de navegação primária com itens que abrem submenus em painéis flutuantes ou navegam direto por link.

Carregando

Instalação

Recebe correções por update de versão. O caminho recomendado.

npm i @trdr/ui

import { NavigationMenu } from "@trdr/ui/navigation-menu"

Uso

import { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList } from "@trdr/ui/navigation-menu"

export function Exemplo() {
  return <NavigationMenu />
}

Props

NavigationMenuPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
PropTipoDescrição
viewport?booleanQuando true (padrao), a raiz monta o Viewport compartilhado internamente: o Content de todo item migra para um unico painel flutuante que troca de tamanho ao trocar de item. Quando false, cada Content se posiciona sozinho, direto abaixo do proprio Trigger, sem painel compartilhado. Util para uma barra compacta que nao deve reservar espaco para um painel largo.
NavigationMenuListPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
NavigationMenuItemPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Item>
NavigationMenuTriggerPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
NavigationMenuContentPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
NavigationMenuLinkPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Link>
NavigationMenuIndicatorPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>
NavigationMenuViewportPropsestende React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>

Quando usar

Use o NavigationMenu para a navegacao de topo de uma area do produto: um conjunto pequeno e estavel de destinos (Mercado, Portfolio, Relatorios...), onde alguns itens navegam direto e outros abrem um submenu com mais opcoes relacionadas. E o primitivo genérico por tras da barra de navegacao do Header do produto, mas nao e o Header em si: ele nao sabe nada sobre logo, busca, resultado do dia ou controles de janela, so resolve a mecanica de item, trigger, submenu e link.

Quando nao usar

Nao use para um menu de acoes contextual (clique com o botao direito, menu de "..." de uma linha de tabela): isso e o dropdown-menu, que abre por clique e nao tem a semantica de rota persistente. Nao use para a barra de menus de uma aplicacao desktop com Arquivo, Editar, Exibir: esse vocabulario e o Menubar. Nao use para navegacao com poucas opcoes e sem submenu nenhum: uma lista de Button, variante ghost, resolve com menos peso.

Anatomia

  • NavigationMenu (data-slot="navigation-menu"): a raiz. Aceita viewport (padrao true) para decidir se todo Content compartilha um unico painel flutuante que troca de tamanho ao trocar de item, ou se cada Content se posiciona sozinho sob o proprio trigger.
  • NavigationMenuList (data-slot="navigation-menu-list"): a lista horizontal de itens.
  • NavigationMenuItem (data-slot="navigation-menu-item"): um destino da barra. Pode conter so um NavigationMenuLink (navega direto) ou um NavigationMenuTrigger seguido de um NavigationMenuContent (abre submenu).
  • NavigationMenuTrigger (data-slot="navigation-menu-trigger"): abre o submenu do item. Traz a seta (data-slot="navigation-menu-trigger-icon") que gira quando o submenu esta aberto.
  • NavigationMenuContent (data-slot="navigation-menu-content"): o painel do submenu. Normalmente contém uma lista de NavigationMenuLink.
  • NavigationMenuLink (data-slot="navigation-menu-link"): o destino em si, dentro ou fora de um submenu. Aceita asChild, herdado do primitivo do Radix, para compor com o Link do Next sem perder foco nem estado ativo: <NavigationMenuLink asChild><Link href="/mercado">Mercado</Link></NavigationMenuLink>.
  • NavigationMenuIndicator (data-slot="navigation-menu-indicator"): a setinha que aponta para o trigger do item aberto no momento. Fica como ultimo filho de NavigationMenuList, junto dos itens (e assim que o Radix calcula a posicao dela).
  • NavigationMenuViewport (data-slot="navigation-menu-viewport"): o painel compartilhado. A raiz ja monta um automaticamente quando viewport e true (o padrao); so precisa ser usado à mao quando viewport={false} na raiz e mesmo assim se quiser um painel compartilhado em outro ponto da arvore.

Acessibilidade

O NavigationMenu monta um <nav> por baixo: passe aria-label na raiz descrevendo a barra ("Navegacao principal", por exemplo), porque duas <nav> sem rotulo na mesma pagina confundem leitor de tela. A navegacao por teclado e nativa do Radix: Tab entra na barra, Seta esquerda e Seta direita movem entre os triggers e links de topo, Enter/Espaco abre o submenu do item focado, Esc fecha o submenu aberto e devolve o foco ao trigger que o abriu. Foco sempre visivel via focus-visible:ring-2, tanto no trigger quanto em cada link do submenu.

Slots e tokens

Todo elemento renderizado carrega um data-slot para estilizar partes internas sem depender de classe da biblioteca. Os tokens listados são extraídos do código fonte.

[data-slot="navigation-menu"][data-slot="navigation-menu-content"][data-slot="navigation-menu-indicator"][data-slot="navigation-menu-item"][data-slot="navigation-menu-link"][data-slot="navigation-menu-list"][data-slot="navigation-menu-trigger"][data-slot="navigation-menu-trigger-icon"][data-slot="navigation-menu-viewport"]
14 tokens usados
bg-popoverbg-surface-secondaryborder-border-subtleborder-lborder-toutline-nonering-offset-2ring-offset-backgroundring-ringtext-b3text-content-secondarytext-content-tertiarytext-foregroundtext-popover-foreground