Navigation Menu
Barra de navegação primária com itens que abrem submenus em painéis flutuantes ou navegam direto por link.
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>| Prop | Tipo | Descrição |
|---|---|---|
| viewport? | boolean | Quando 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. Aceitaviewport(padraotrue) para decidir se todoContentcompartilha um unico painel flutuante que troca de tamanho ao trocar de item, ou se cadaContentse 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 umNavigationMenuLink(navega direto) ou umNavigationMenuTriggerseguido de umNavigationMenuContent(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 deNavigationMenuLink.NavigationMenuLink(data-slot="navigation-menu-link"): o destino em si, dentro ou fora de um submenu. AceitaasChild, herdado do primitivo do Radix, para compor com oLinkdo 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 deNavigationMenuList, 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 quandoviewportetrue(o padrao); so precisa ser usado à mao quandoviewport={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