Navigation menu
A site's top navigation: a row of quiet slabs, some of which open a panel of links below them.
Install
# once per project: where @zeroui items come frompnpm dlx shadcn@latest registry add @zeroui=https://zeroui.catforest.dev/r/{name}.jsonpnpm dlx shadcn@latest add @zeroui/navigation-menuExamples
Jobs, districts, a plain link
import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, navigationMenuTriggerStyle,} from "@/components/zero/navigation-menu";const jobs = [ ["#board", "Job board", "Every open job, by reward or distance."], ["#rush", "Rush jobs", "Higher rewards, shorter windows."], ["#taken", "Taken", "What you are carrying now."], ["#history", "History", "Every job you handed in."],] as const;const districts = [ ["#harbor", "Harbor", "Cranes, crates, the night shift."], ["#rail-yards", "Rail yards", "Long routes, sealed cargo."],] as const;export default function NavigationMenuSite() { return ( <NavigationMenu> <NavigationMenuList> <NavigationMenuItem> <NavigationMenuTrigger>Jobs</NavigationMenuTrigger> <NavigationMenuContent> <ul className="grid gap-1 sm:w-[28rem] sm:grid-cols-2"> {jobs.map(([href, title, line]) => ( <li key={href}> <NavigationMenuLink href={href}> <strong>{title}</strong> {line} </NavigationMenuLink> </li> ))} </ul> </NavigationMenuContent> </NavigationMenuItem> <NavigationMenuItem> <NavigationMenuTrigger>Districts</NavigationMenuTrigger> <NavigationMenuContent> <ul className="grid gap-1 sm:w-64"> {districts.map(([href, title, line]) => ( <li key={href}> <NavigationMenuLink href={href}> <strong>{title}</strong> {line} </NavigationMenuLink> </li> ))} </ul> </NavigationMenuContent> </NavigationMenuItem> <NavigationMenuItem> <a href="#drivers" className={navigationMenuTriggerStyle}> Drivers </a> </NavigationMenuItem> </NavigationMenuList> </NavigationMenu> );}Behaviour
The panel is shared: moving from one menu to the next, it changes size and its contents slide across in the direction you moved. Each link inside is a block with a leaning title (put it in a strong) and a line of text.
A plain link in the row takes navigationMenuTriggerStyle; the page you are on (aria-current="page") fills with the accent.
Props
NavigationMenu
| Prop | Type | Default | Description |
|---|---|---|---|
| value / defaultValue | any | — | The open menu. |
Also takes every prop of Base UI's NavigationMenu.Root.
NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink
Also takes every prop of Base UI's NavigationMenu.Trigger.