Skip to main content

NavigationMenu

Site navigation whose dropdowns become a drawer on small screens.

import { NavigationMenu } from "@/fragments/ui";Source

Preview

<NavigationMenu>
  <NavigationMenu.List>
    <NavigationMenu.Item value="products">
      <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <NavigationMenu.Link href="/analytics" title="Analytics" description="Track your metrics and KPIs." />

Installation

npx @usefragments/cli add navigationmenu

Writes src/fragments/ui/components/NavigationMenu plus what it imports, the globals stylesheet, and .fragments/registry-lock.json, then prints the packages to add. No account, no key.

Your own registry: publish from Fragments Cloud and add --registry org/name. Connect a workspace.

Anatomy

NavigationMenu is a compound: import the root and reach its parts through dot notation.

  • NavigationMenu.List
  • NavigationMenu.Item
  • NavigationMenu.Trigger
  • NavigationMenu.Content
  • NavigationMenu.Link
  • NavigationMenu.Indicator
  • NavigationMenu.Viewport
  • NavigationMenu.MobileBrand
  • NavigationMenu.MobileContent
  • NavigationMenu.MobileSection

Two dropdowns beside one plain link.

<NavigationMenu>
  <NavigationMenu.List>
    <NavigationMenu.Item value="products">
      <NavigationMenu.Trigger>Products</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <NavigationMenu.Link href="/analytics" title="Analytics" description="Track your metrics and KPIs." />
        <NavigationMenu.Link href="/automation" title="Automation" description="Automate your workflows." />
      </NavigationMenu.Content>
    </NavigationMenu.Item>
    <NavigationMenu.Item value="resources">
      <NavigationMenu.Trigger>Resources</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <NavigationMenu.Link href="/docs" title="Documentation" description="Comprehensive API reference." />
        <NavigationMenu.Link href="/blog" title="Blog" description="Latest news and updates." />
      </NavigationMenu.Content>
    </NavigationMenu.Item>
    <NavigationMenu.Item>
      <NavigationMenu.Link href="/pricing">Pricing</NavigationMenu.Link>

Examples

With Rich Content

A grid of icons, titles, and descriptions.

<NavigationMenu>
  <NavigationMenu.List>
    <NavigationMenu.Item value="platform">
      <NavigationMenu.Trigger>Platform</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <div

Link lists where descriptions would be noise.

<NavigationMenu>
  <NavigationMenu.List>
    <NavigationMenu.Item value="company">
      <NavigationMenu.Trigger>Company</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <div style={{ display: 'flex', flexDirection: 'column', padding: '4px', minWidth: '160px' }}>

One promoted item leads the panel.

<NavigationMenu>
  <NavigationMenu.List>
    <NavigationMenu.Item value="learn">
      <NavigationMenu.Trigger>Learn</NavigationMenu.Trigger>
      <NavigationMenu.Content>
        <div

Vertical

Panels open to the side instead of below.

<div style={{ display: 'flex' }}>
  <NavigationMenu orientation="vertical">
    <NavigationMenu.List>
      <NavigationMenu.Item value="overview">
        <NavigationMenu.Trigger>Overview</NavigationMenu.Trigger>
        <NavigationMenu.Content>

API

Component props
Prop
Type
Default
Description
childrenRequirednodeNot setNavigationMenu.List, NavigationMenu.Viewport, and optionally NavigationMenu.MobileContent
valuestringNot setControlled open item value
defaultValuestring''Default open item value
onValueChangefunctionNot setCallback when open item changes
orientationenumhorizontalverticalhorizontal'horizontal' | 'vertical'
delayDurationnumber200Hover delay before opening (ms)
skipDelayDurationnumber300Duration after close during which moving to another trigger opens instantly (ms)
iconsobjectNot setOptional icon overrides for triggerChevron, mobileMenu, mobileClose, and drawerClose controls
mobileBreakpointenummdlgmdViewport breakpoint below which the mobile drawer replaces desktop navigation

Accessibility

  • Uses disclosure pattern (not menu role) per W3C guidance
  • Keyboard: Arrow keys navigate between triggers, Enter/Space toggles, Escape closes
  • Content panels have role="region" with aria-labelledby pointing to trigger
  • Mobile drawer has focus trap, Escape to close, and aria-modal
  • Supports prefers-reduced-motion for all animations

Guidance

Use when

  • Header navigation with more than links
  • Dropdowns carrying titles, descriptions, or icons
  • Navigation that must survive a phone screen
  • Several sections that animate between each other

Avoid when

  • Flat links with no dropdowns (use Header.Nav)
  • Application actions like cut and paste (use Menu)
  • Persistent side navigation (use Sidebar)
  • Showing where the user already is (use Breadcrumbs)
  • HeadersiblingPlace NavigationMenu inside Header for site navigation
  • SidebaralternativeUse Sidebar for persistent side navigation, NavigationMenu for header dropdowns
  • MenualternativeUse Menu for action menus (role=menu), NavigationMenu for site navigation (disclosure pattern)
  • BreadcrumbssiblingUse Breadcrumbs for hierarchical page trail, NavigationMenu for site-level navigation

Next steps