zeroUI

Navigation menu

A site's top navigation: a row of quiet slabs, some of which open a panel of links below them.

Install

terminal
# 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-menu

Examples

Jobs, districts, a plain link

navigation-menu-site.tsx
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

PropTypeDefaultDescription
value / defaultValueany—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.