Navigation Menu

A collection of links for navigating websites.

Installation

npx shadcn@latest add @fulldev/navigation-menu

Usage

---
import {
  NavigationMenu,
  NavigationMenuContent,
  NavigationMenuItem,
  NavigationMenuLink,
  NavigationMenuList,
  NavigationMenuTrigger,
} from "@/components/ui/navigation-menu"
---
<NavigationMenu>
  <NavigationMenuList>
    <NavigationMenuItem value="item-one">
      <NavigationMenuTrigger>Item One</NavigationMenuTrigger>
      <NavigationMenuContent>
        <NavigationMenuLink href="/docs">Link</NavigationMenuLink>
      </NavigationMenuContent>
    </NavigationMenuItem>
  </NavigationMenuList>
</NavigationMenu>

Composition

Use the following composition to build a NavigationMenu:

NavigationMenu
├── NavigationMenuList
│   ├── NavigationMenuItem
│   │   ├── NavigationMenuTrigger
│   │   └── NavigationMenuContent
│   │       ├── NavigationMenuLink
│   │       └── NavigationMenuLink
│   └── NavigationMenuItem
│       └── NavigationMenuLink
└── NavigationMenuIndicator

Notes

  • Closed panels start hidden in the rendered HTML to prevent a flash before JavaScript initializes. The controller manages visibility after initialization.

  • Place NavigationMenuIndicator inside NavigationMenuList so its position is relative to the list whose measurements Data Slot uses.

  • Use NavigationMenuTrigger for items that open richer panels and NavigationMenuLink for direct navigation targets.

  • NavigationMenuLink accepts active when the current route should be visually highlighted.

  • Keep the content panel layout inside NavigationMenuContent simple and list-like so keyboard navigation stays predictable.

The menu opens below its trigger, aligned to the start, with an 8px gap. Set side, align, sideOffset, and alignOffset on NavigationMenu to change this placement. Data Slot reads the root configuration and positions the shared popup.

Content mounting

Data Slot’s recommended "lazy" strategy is the default: closed content is retained but detached from the document. Fulldev initializes nested Data Slot components inside that retained content too.

Use mountStrategy="eager" when an integration needs to query closed content through the document. Both strategies include content in server-rendered HTML; neither adds a no-JavaScript fallback.

API Reference

See the GitHub source code for more information on props. See the data-slot docs for more information on interactivity.