Skip to content

Navigation Menu

A menu with dropdown content and optional viewport transitions.

---
import { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger } from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem value="products">
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-2 gap-2 w-[380px] p-2">
<NavigationMenuLink href="/products/analytics">
<div class="font-medium">Analytics</div>
<div class="text-sm text-muted-foreground">Real-time insights</div>
</NavigationMenuLink>
<NavigationMenuLink href="/products/automation">
<div class="font-medium">Automation</div>
<div class="text-sm text-muted-foreground">Workflow builders</div>
</NavigationMenuLink>
<NavigationMenuLink href="/products/security">
<div class="font-medium">Security</div>
<div class="text-sm text-muted-foreground">Enterprise-grade</div>
</NavigationMenuLink>
<NavigationMenuLink href="/products/integrations">
<div class="font-medium">Integrations</div>
<div class="text-sm text-muted-foreground">Connect tools</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem value="solutions" align="center">
<NavigationMenuTrigger>Solutions</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-2 gap-2 w-[380px] p-2">
<NavigationMenuLink href="/solutions/startups">
<div class="font-medium">Startups</div>
<div class="text-sm text-muted-foreground">Move fast</div>
</NavigationMenuLink>
<NavigationMenuLink href="/solutions/enterprise">
<div class="font-medium">Enterprise</div>
<div class="text-sm text-muted-foreground">Scale securely</div>
</NavigationMenuLink>
<NavigationMenuLink href="/solutions/agencies">
<div class="font-medium">Agencies</div>
<div class="text-sm text-muted-foreground">Client delivery</div>
</NavigationMenuLink>
<NavigationMenuLink href="/solutions/ecommerce">
<div class="font-medium">E-commerce</div>
<div class="text-sm text-muted-foreground">Sell online</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem value="resources" align="center">
<NavigationMenuTrigger>Resources</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-3 gap-2 w-[520px] p-2">
<NavigationMenuLink href="/docs">
<div class="font-medium">Docs</div>
<div class="text-sm text-muted-foreground">Get started</div>
</NavigationMenuLink>
<NavigationMenuLink href="/blog">
<div class="font-medium">Blog</div>
<div class="text-sm text-muted-foreground">Latest updates</div>
</NavigationMenuLink>
<NavigationMenuLink href="/support">
<div class="font-medium">Support</div>
<div class="text-sm text-muted-foreground">Get help</div>
</NavigationMenuLink>
<NavigationMenuLink href="/events">
<div class="font-medium">Events</div>
<div class="text-sm text-muted-foreground">Upcoming webinars</div>
</NavigationMenuLink>
<NavigationMenuLink href="/guides">
<div class="font-medium">Guides</div>
<div class="text-sm text-muted-foreground">Best practices</div>
</NavigationMenuLink>
<NavigationMenuLink href="/contact">
<div class="font-medium">Contact</div>
<div class="text-sm text-muted-foreground">Talk to us</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem value="company">
<NavigationMenuTrigger>Company</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="w-[180px] p-2">
<NavigationMenuLink href="/about">
<div class="font-medium">About</div>
<div class="text-sm text-muted-foreground">Our story</div>
</NavigationMenuLink>
<NavigationMenuLink href="/careers">
<div class="font-medium">Careers</div>
<div class="text-sm text-muted-foreground">Join the team</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuIndicator />
</NavigationMenuList>
</NavigationMenu>
Terminal window
bunx bejamas add navigation-menu
---
import {
NavigationMenu,
NavigationMenuList,
NavigationMenuItem,
NavigationMenuTrigger,
NavigationMenuContent,
NavigationMenuLink,
} from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem value="products">
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-2 gap-2 w-[380px] p-2">
<NavigationMenuLink href="/products/analytics">
<div class="font-medium">Analytics</div>
<div class="text-sm text-muted-foreground">Real-time insights</div>
</NavigationMenuLink>
<NavigationMenuLink href="/products/automation">
<div class="font-medium">Automation</div>
<div class="text-sm text-muted-foreground">Workflow builders</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem value="resources" align="center">
<NavigationMenuTrigger>Resources</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-2 gap-2 w-[380px] p-2">
<NavigationMenuLink href="/docs">
<div class="font-medium">Docs</div>
<div class="text-sm text-muted-foreground">Get started</div>
</NavigationMenuLink>
<NavigationMenuLink href="/support">
<div class="font-medium">Support</div>
<div class="text-sm text-muted-foreground">Get help</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuIndicator />
</NavigationMenuList>
</NavigationMenu>

Links with Lucide icons for visual enhancement.

---
import { ChartBarIcon, ShieldIcon, ZapIcon } from '@lucide/astro';
import { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger } from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem value="features">
<NavigationMenuTrigger>Features</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid gap-2 w-[320px] p-2">
<NavigationMenuLink href="/analytics" class="flex-row items-start gap-4">
<ChartBarIcon class="size-5 mt-1 text-muted-foreground" />
<div>
<div class="font-medium">Analytics</div>
<div class="text-sm text-muted-foreground">Track your metrics</div>
</div>
</NavigationMenuLink>
<NavigationMenuLink href="/automation" class="flex-row items-start gap-4">
<ZapIcon class="size-5 mt-1 text-muted-foreground" />
<div>
<div class="font-medium">Automation</div>
<div class="text-sm text-muted-foreground">Streamline workflows</div>
</div>
</NavigationMenuLink>
<NavigationMenuLink href="/security" class="flex-row items-start gap-4">
<ShieldIcon class="size-5 mt-1 text-muted-foreground" />
<div>
<div class="font-medium">Security</div>
<div class="text-sm text-muted-foreground">Enterprise-grade protection</div>
</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuIndicator />
</NavigationMenuList>
</NavigationMenu>

Hero-style layout with a featured item alongside regular links.

---
import { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger } from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem value="getting-started">
<NavigationMenuTrigger>Getting Started</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="grid grid-cols-[1fr_200px] gap-2 w-[480px] p-2">
<div class="row-span-3">
<NavigationMenuLink href="/introduction" class="flex h-full flex-col rounded-md bg-gradient-to-b from-muted/50 to-muted p-4 no-underline">
<div class="mb-2 text-lg font-medium">Introduction</div>
<p class="text-sm text-muted-foreground">Learn the basics and get up to speed quickly with our comprehensive guides.</p>
</NavigationMenuLink>
</div>
<NavigationMenuLink href="/installation">
<div class="font-medium">Installation</div>
<div class="text-sm text-muted-foreground">Step-by-step setup</div>
</NavigationMenuLink>
<NavigationMenuLink href="/configuration">
<div class="font-medium">Configuration</div>
<div class="text-sm text-muted-foreground">Customize settings</div>
</NavigationMenuLink>
<NavigationMenuLink href="/examples">
<div class="font-medium">Examples</div>
<div class="text-sm text-muted-foreground">Code samples</div>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuIndicator />
</NavigationMenuList>
</NavigationMenu>

Use navigationMenuTriggerStyle() to style regular links to match triggers.

---
import { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger } from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem value="products">
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="w-[200px] p-2">
<NavigationMenuLink href="/products/one">Product One</NavigationMenuLink>
<NavigationMenuLink href="/products/two">Product Two</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuLink href="/pricing" class="px-4 py-2.5 bg-transparent border-none cursor-pointer flex items-center gap-1.5 transition-colors relative z-1 hover:text-accent">
Pricing
</NavigationMenuLink>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuLink href="/docs" class="px-4 py-2.5 bg-transparent border-none cursor-pointer flex items-center gap-1.5 transition-colors relative z-1 hover:text-accent">
Docs
</NavigationMenuLink>
</NavigationMenuItem>
<NavigationMenuIndicator />
</NavigationMenuList>
</NavigationMenu>

Set viewport={false} to render content directly without the animated viewport container.

---
import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger } from '@bejamas/ui/components/navigation-menu';
---
<NavigationMenu viewport={false}>
<NavigationMenuList>
<NavigationMenuItem value="menu">
<NavigationMenuTrigger>Menu</NavigationMenuTrigger>
<NavigationMenuContent>
<div class="w-[200px] p-2 rounded-md border bg-popover shadow-md">
<NavigationMenuLink href="/one">Option One</NavigationMenuLink>
<NavigationMenuLink href="/two">Option Two</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
PropTypeDefaultDescription
viewportbooleantrueEnable animated viewport container for content
delayOpennumber0Delay in ms before opening menu
delayClosenumber0Delay in ms before closing menu
openOnFocusbooleanfalseOpen menu on keyboard focus
asHTMLTag"nav"HTML element to render
PropTypeDefaultDescription
valuestringUnique identifier for the item
align"start" | "center" | "end""start"Content alignment relative to trigger
EventDetailDescription
navigation-menu:change{ value: string | null }Fired when active item changes
// Open a specific item
element.dispatchEvent(
new CustomEvent("navigation-menu:set", { detail: { value: "products" } })
);
// Close the menu
element.dispatchEvent(
new CustomEvent("navigation-menu:set", { detail: { value: null } })
);