Navigation Menu
A horizontal row of triggers and links that open portaled content panels for site navigation.
Show codeHide code
Installation
import {
NavigationMenu,
NavigationMenuContent,
NavigationMenuContentList,
NavigationMenuItem,
NavigationMenuLink,
NavigationMenuLinkDescription,
NavigationMenuLinkTitle,
NavigationMenuList,
NavigationMenuPanel,
NavigationMenuTrigger,
NavigationMenuViewport,
} from "@makeplane/propel/components/navigation-menu";Usage
import {
NavigationMenu,
NavigationMenuContent,
NavigationMenuContentList,
NavigationMenuItem,
NavigationMenuLink,
NavigationMenuLinkDescription,
NavigationMenuLinkTitle,
NavigationMenuList,
NavigationMenuPanel,
NavigationMenuTrigger,
NavigationMenuViewport,
} from "@makeplane/propel/components/navigation-menu";
const PRODUCT_LINKS = [
{ href: "#issues", title: "Issues", description: "Track work items across projects." },
{ href: "#cycles", title: "Cycles", description: "Time-boxed sprints for your team." },
{ href: "#modules", title: "Modules", description: "Group related work into modules." },
{ href: "#pages", title: "Pages", description: "Rich documents that live with your work." },
];
const RESOURCE_LINKS = [
{ href: "#docs", title: "Documentation", description: "Guides and API references." },
{ href: "#changelog", title: "Changelog", description: "What shipped recently." },
];
export default function BasicDemo() {
return (
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuTrigger label="Product" />
<NavigationMenuContent>
<NavigationMenuContentList>
{PRODUCT_LINKS.map((item) => (
<li key={item.href}>
<NavigationMenuLink href={item.href} appearance="card">
<NavigationMenuLinkTitle>{item.title}</NavigationMenuLinkTitle>
<NavigationMenuLinkDescription>
{item.description}
</NavigationMenuLinkDescription>
</NavigationMenuLink>
</li>
))}
</NavigationMenuContentList>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuTrigger label="Resources" />
<NavigationMenuContent>
<NavigationMenuContentList>
{RESOURCE_LINKS.map((item) => (
<li key={item.href}>
<NavigationMenuLink href={item.href} appearance="card">
<NavigationMenuLinkTitle>{item.title}</NavigationMenuLinkTitle>
<NavigationMenuLinkDescription>
{item.description}
</NavigationMenuLinkDescription>
</NavigationMenuLink>
</li>
))}
</NavigationMenuContentList>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuLink href="#pricing" appearance="item">
Pricing
</NavigationMenuLink>
</NavigationMenuItem>
</NavigationMenuList>
<NavigationMenuPanel>
<NavigationMenuViewport />
</NavigationMenuPanel>
</NavigationMenu>
);
}Examples
Presentations
A link’s appearance sets its shape: item is a top-level pill beside the triggers, while card stacks a title over an optional description inside a content panel.
Show codeHide code
Large content
Cap the content region’s height and wrap the link list in a ScrollArea so the panel keeps a stable size while long menus scroll.
Show codeHide code
API Reference
NavigationMenu
The navigation menu Root — Base UI's context/state provider. It renders Base UI's unstyled `<nav>` container (a `<div>` when nested) and carries no propel styling, so it is a behavior-only role and lives in `components` (rules 1a, 2); the styled parts live in `elements/navigation-menu` and are grafted onto Base UI behavior here.
NavigationMenuTrigger
The ready-made trigger row: grafts Base UI's `NavigationMenu.Trigger` behavior onto the styled trigger, wraps the label, and bakes the rotating disclosure caret (`NavigationMenuIcon` with a default chevron — defaults are a `components` concern, rule 2a). Override the glyph via `icon`.
NavigationMenuLink
The ready-made navigable link: grafts Base UI's `NavigationMenu.Link` behavior onto the styled link. `appearance="item"` is a top-level pill beside the triggers; `appearance="card"` is a stacked entry inside a `NavigationMenuContent`, pairing a `NavigationMenuLinkTitle` with an optional `NavigationMenuLinkDescription`.
NavigationMenuPanel
The navigation menu surface: Base UI portal + positioner + popup grafted onto Propel styling. Named `Panel` to avoid clashing with Base UI's atomic per-item `NavigationMenu.Content`. The viewport and per-item content remain children.