moduix

Navigation Menu

A collection of links and menus for website and application navigation.

API Reference

Original primitive API

Behavior, accessibility details, and low-level props are documented by Base UI.

Base UI API

Basic

import {  NavigationMenu,  NavigationMenuList,  NavigationMenuItem,  NavigationMenuTrigger,  NavigationMenuContent,  NavigationMenuLink,} from "moduix";export function NavigationMenuDemo() {  return (    <NavigationMenu>      <NavigationMenuList>        <NavigationMenuItem>          <NavigationMenuTrigger>            Product          </NavigationMenuTrigger>          <NavigationMenuContent>            <ul className={styles.contentGrid}>              {productLinks.map((link) => (                <li key={link.title}>                  <a href={link.href} className={styles.linkCard}>                    <p className={styles.title}>{link.title}</p>                    <p className={styles.description}>{link.description}</p>                  </a>                </li>              ))}            </ul>          </NavigationMenuContent>        </NavigationMenuItem>        <NavigationMenuItem>          <NavigationMenuTrigger>            Guides          </NavigationMenuTrigger>          <NavigationMenuContent>            <ul className={styles.contentList}>              {guideLinks.slice(0, 2).map((link) => (                <li key={link.title}>                  <a href={link.href} className={styles.linkCard}>                    <p className={styles.title}>{link.title}</p>                    <p className={styles.description}>{link.description}</p>                  </a>                </li>              ))}            </ul>          </NavigationMenuContent>        </NavigationMenuItem>        <NavigationMenuItem>          <NavigationMenuLink href="#" closeOnClick>            Releases          </NavigationMenuLink>        </NavigationMenuItem>      </NavigationMenuList>    </NavigationMenu>  );}
.contentList,.contentGrid {  display: grid;  grid-template-columns: minmax(0, 1fr);  gap: var(--spacing-1);  width: 100%;  margin: 0;  padding: 0;  list-style: none;}.linkCard {  box-sizing: border-box;  display: grid;  gap: var(--spacing-1);  min-width: 0;  width: 100%;  padding: var(--spacing-2) var(--spacing-3);  border-radius: var(--radius-md);  color: inherit;  text-decoration: none;  overflow-wrap: anywhere;}.linkCard:hover {  background-color: var(--color-muted);}.title {  margin: 0;  color: var(--color-foreground);  font-size: var(--text-sm);  line-height: var(--line-height-text-sm);}.description {  margin: 0;  color: var(--color-muted-foreground);  font-size: var(--text-sm);  line-height: var(--line-height-text-sm);}@media (min-width: 700px) {  .contentGrid {    grid-template-columns: repeat(2, minmax(12rem, 1fr));    width: min(34rem, calc(100vw - var(--spacing-8)));  }}
const productLinks = [  {    href: "#",    title: "Quick Start",    description: "Install the package and assemble your first navigation.",  },  {    href: "#",    title: "Composition",    description: "Use slots and className to match your application layout.",  },];const guideLinks = [  {    href: "#",    title: "Accessibility handbook",    description: "Take a practical pass over focus order and keyboard support.",  },  {    href: "#",    title: "Composition handbook",    description: "Learn when to wrap parts and expose flexible APIs.",  },  {    href: "#",    title: "Styling handbook",    description: "Apply tokens and state styles without fighting markup.",  },];

Full list of component variables available for project-level overrides.

PropertyDefaultDescription
--navigation-menu-arrow-height0.625remControls popup arrow height.
--navigation-menu-arrow-inline-offset0.8125remControls arrow inline-axis offset.
--navigation-menu-arrow-offset0.5remControls arrow block-axis offset.
--navigation-menu-arrow-stroke-colorvar(--navigation-menu-popup-border-color)Controls popup arrow stroke color.
--navigation-menu-arrow-transition-durationvar(--duration-slow)Controls popup arrow movement duration.
--navigation-menu-arrow-width1.25remControls popup arrow width.
--navigation-menu-backdrop-bgvar(--backdrop-bg, transparent)Controls backdrop color.
--navigation-menu-backdrop-blur0Controls backdrop blur when backdrop is enabled.
--navigation-menu-backdrop-transitionvar(--navigation-menu-transition, var(--transition-default))Controls backdrop opacity transition.
--navigation-menu-bgtransparentControls root background.
--navigation-menu-colorvar(--color-foreground)Controls root text color.
--navigation-menu-content-min-width20remControls desktop content minimum width.
--navigation-menu-content-opacity-durationcalc(var(--duration-slow) * 0.7)Controls content fade duration.
--navigation-menu-content-paddingvar(--spacing-4)Controls content padding.
--navigation-menu-content-slide-distance50%Controls content slide animation distance.
--navigation-menu-content-width-mobilecalc(100vw - var(--spacing-8))Controls mobile content width.
--navigation-menu-disabled-opacityvar(--opacity-disabled)Controls disabled opacity.
--navigation-menu-focus-ring-colorvar(--color-ring)Controls trigger focus ring color.
--navigation-menu-focus-ring-widthvar(--border-width-sm)Controls trigger focus ring width.
--navigation-menu-full-width-inset0pxControls screen gutter for full-width popup mode.
--navigation-menu-icon-colorcurrentColorControls trigger icon color.
--navigation-menu-icon-size0.875remControls trigger icon size.
--navigation-menu-icon-transitionvar(--navigation-menu-transition, 200ms ease)Controls trigger icon rotation transition.
--navigation-menu-list-gap0Controls spacing between top-level items.
--navigation-menu-list-justifyflex-startControls horizontal alignment of top-level items.
--navigation-menu-min-widthmax-contentControls root minimum width.
--navigation-menu-paddingvar(--spacing-1)Controls root padding.
--navigation-menu-popup-bgvar(--color-popover)Controls popup background.
--navigation-menu-popup-border-colorvar(--color-border)Controls popup border and arrow stroke color.
--navigation-menu-popup-border-stylesolidControls popup border style.
--navigation-menu-popup-border-widthvar(--border-width-sm)Controls popup border width.
--navigation-menu-popup-colorvar(--color-popover-foreground)Controls popup text color.
--navigation-menu-popup-leave-duration150msControls popup closing transition duration.
--navigation-menu-popup-radiusvar(--radius-lg)Controls popup border radius.
--navigation-menu-popup-scalevar(--scale-popup)Controls popup enter/exit scale.
--navigation-menu-popup-shadowvar(--shadow-lg)Controls popup shadow.
--navigation-menu-popup-transition-durationvar(--duration-slow)Controls popup transition duration.
--navigation-menu-popup-transition-easingcubic-bezier(0.22, 1, 0.36, 1)Controls popup transition easing.
--navigation-menu-positioner-gap0.625remControls hover bridge spacing between trigger and popup.
--navigation-menu-positioner-max-widthcalc(100vw - var(--spacing-8))Controls popup positioner maximum width.
--navigation-menu-radiusvar(--radius-lg)Controls root border radius.
--navigation-menu-submenu-trigger-bgtransparentControls nested submenu trigger background.
--navigation-menu-submenu-trigger-bg-activevar(--navigation-menu-popup-bg, var(--color-background))Controls nested submenu trigger active background.
--navigation-menu-submenu-trigger-min-width9remControls nested submenu trigger minimum width.
--navigation-menu-submenu-trigger-padding-x0.75remControls nested submenu trigger horizontal padding.
--navigation-menu-submenu-trigger-padding-y0.5remControls nested submenu trigger vertical padding.
--navigation-menu-submenu-trigger-radiusvar(--radius-lg)Controls nested submenu trigger border radius.
--navigation-menu-submenu-trigger-shadow-active0 1px 2px rgb(0 0 0 / 0.08), 0 1px 1px rgb(0 0 0 / 0.04)Controls nested submenu trigger active shadow.
--navigation-menu-transitionvar(--transition-default)Controls trigger transitions.
--navigation-menu-trigger-bgtransparentControls trigger background.
--navigation-menu-trigger-bg-activevar(--color-muted)Controls trigger background when active or open.
--navigation-menu-trigger-bg-hovervar(--color-accent)Controls trigger background on hover.
--navigation-menu-trigger-border-colortransparentControls trigger border color.
--navigation-menu-trigger-border-stylesolidControls trigger border style.
--navigation-menu-trigger-border-width0Controls trigger border width.
--navigation-menu-trigger-colorvar(--color-foreground)Controls trigger text color.
--navigation-menu-trigger-font-sizevar(--text-sm)Controls trigger font size.
--navigation-menu-trigger-gap0.375remControls trigger content gap.
--navigation-menu-trigger-heightvar(--size-md)Controls trigger minimum height.
--navigation-menu-trigger-line-heightvar(--line-height-text-sm)Controls trigger line height.
--navigation-menu-trigger-padding-x0.75remControls trigger horizontal padding.
--navigation-menu-trigger-padding-y0Controls trigger vertical padding.
--navigation-menu-trigger-radiusvar(--radius-md)Controls trigger border radius.

Interactive variables scoped for docs preview without changing size scale tokens.

PropertyValueDefaultDescription
--navigation-menu-bgtransparentControls root background.
--navigation-menu-colorvar(--color-foreground)Controls root text color.
--navigation-menu-full-width-inset0pxControls full-width popup viewport inset.
--navigation-menu-list-justifyflex-startControls top-level item alignment.
--navigation-menu-popup-bgvar(--color-popover)Controls popup background.
--navigation-menu-popup-border-colorvar(--color-border)Controls popup border color.
--navigation-menu-popup-radiusvar(--radius-lg)Controls popup border radius.
--navigation-menu-radiusvar(--radius-lg)Controls root border radius.
--navigation-menu-trigger-bgtransparentControls trigger background.
--navigation-menu-trigger-bg-activevar(--color-muted)Controls trigger active background.
--navigation-menu-trigger-bg-hovervar(--color-accent)Controls trigger hover background.
--navigation-menu-trigger-border-colortransparentControls trigger border color.
--navigation-menu-trigger-border-width0Controls trigger border width.

Anatomy

NavigationMenu is composed from visible navigation parts (List, Item, Trigger, Content, Link) and the trigger's optional icon slot. The popup infrastructure (Portal, Positioner, Popup, Arrow, Viewport) is rendered internally by default through popupContent, so consumers can keep a compact composition for common navigation scenarios.

NavigationMenu
└─ NavigationMenuList
   ├─ NavigationMenuItem
   │  ├─ NavigationMenuTrigger
   │  │  └─ label
   │  └─ NavigationMenuContent
   │     └─ content
   └─ NavigationMenuItem
      └─ NavigationMenuLink
<NavigationMenu>
  <NavigationMenuList>
    <NavigationMenuItem>
      <NavigationMenuTrigger>Product</NavigationMenuTrigger>
      <NavigationMenuContent>
        <ul>
          <li>
            <a href="#">Quick Start</a>
          </li>
          <li>
            <a href="#">Composition</a>
          </li>
        </ul>
      </NavigationMenuContent>
    </NavigationMenuItem>

    <NavigationMenuItem>
      <NavigationMenuLink href="#" closeOnClick>
        Releases
      </NavigationMenuLink>
    </NavigationMenuItem>
  </NavigationMenuList>
</NavigationMenu>
PartRole
NavigationMenuRoot state machine. Controls value, orientation, open state, and shared popup behavior.
NavigationMenuListSemantic list wrapper for top-level navigation items.
NavigationMenuItemOne navigation node that can render either a trigger/content pair or a direct link.
NavigationMenuTriggerInteractive control that toggles associated content and receives state attributes.
NavigationMenuIconIcon slot rendered by NavigationMenuTrigger; use icon, hideIcon, or classNames.icon for common cases.
NavigationMenuContentPanel content for a trigger item; rendered with popup mechanics by default.
NavigationMenuLinkDirect navigation link item that can participate in close behavior with closeOnClick.

For most implementations, keep default popup service slots internal and style visible parts first. Reach for popupContent.className and popupContent.classNames when you need fine-grained control over popup container and infrastructure slots.

Composition

NavigationMenu forwards Base UI root props such as value, defaultValue, onValueChange, delay, closeDelay, orientation, actionsRef, render, className, and style. NavigationMenuTrigger, NavigationMenuContent, and NavigationMenuLink also forward their Base UI props, including render, keepMounted, active, and closeOnClick where those props belong.

NavigationMenuTrigger renders a chevron icon by default. Pass icon to replace it, hideIcon to remove it, or classNames.icon / slotProps.icon when only the icon slot needs styling or extra props.

Use popupContent for Base UI placement behavior and popup styling. popupContent.className styles the visible popup, while popupContent.classNames styles service slots hidden from the default composition:

<NavigationMenu
  popupContent={{
    sideOffset: 16,
    withBackdrop: true,
    className: styles.popup,
    classNames: {
      portal: styles.portal,
      backdrop: styles.backdrop,
      positioner: styles.positioner,
      arrow: styles.arrow,
      viewport: styles.viewport,
    },
  }}
/>

popupContent accepts Base UI popup props and the full positioner surface: side, sideOffset, align, alignOffset, arrowPadding, anchor, collisionAvoidance, collisionBoundary, collisionPadding, sticky, positionMethod, and disableAnchorTracking. Use popupContent.container to choose the portal container, popupContent.withBackdrop to render the backdrop, popupContent.withArrow={false} to hide the arrow, popupContent.fullWidth to stretch the popup to viewport width, and popupContent.slotProps when a service slot needs non-class props.

Use popupContent={false} and withViewport when a nested menu should render its content inside the current panel instead of opening another popup.

Examples

Full Width Popup

Use popupContent.fullWidth when the popup should span the full viewport width, while the menu itself stays inside the page container. The example also shows 2/3/4-column layouts and content alignment control through CSS.

import {  NavigationMenu,  NavigationMenuContent,  NavigationMenuItem,  NavigationMenuLink,  NavigationMenuList,  NavigationMenuTrigger,} from "moduix";import styles from "./navigation-menu.module.css";export function FullWidthNavigationMenuDemo() {  return (    <header className={styles.header}>      <div className={styles.container}>        <NavigationMenu          className={styles.menu}          popupContent={{ fullWidth: true, sideOffset: 12, withArrow: false }}        >          <NavigationMenuList>            <NavigationMenuItem>              <NavigationMenuTrigger>Platform</NavigationMenuTrigger>              <NavigationMenuContent className={styles.content}>                <div className={styles.contentInner}>                  <ul className={styles.gridCols2}>{/* 2-column links */}</ul>                </div>              </NavigationMenuContent>            </NavigationMenuItem>            <NavigationMenuItem>              <NavigationMenuTrigger>Developers</NavigationMenuTrigger>              <NavigationMenuContent className={styles.content}>                <div className={styles.contentInner}>                  <ul className={styles.gridCols3}>{/* 3-column links */}</ul>                </div>              </NavigationMenuContent>            </NavigationMenuItem>            <NavigationMenuItem>              <NavigationMenuTrigger>Design System</NavigationMenuTrigger>              <NavigationMenuContent className={styles.content}>                <div className={styles.contentInner}>                  <ul className={styles.gridCols4}>{/* 4-column links */}</ul>                </div>              </NavigationMenuContent>            </NavigationMenuItem>            <NavigationMenuItem>              <NavigationMenuLink href="#">Pricing</NavigationMenuLink>            </NavigationMenuItem>          </NavigationMenuList>        </NavigationMenu>      </div>    </header>  );}
.header {  width: 100%;}.container {  display: flex;  justify-content: center;  max-width: 72rem;  margin: 0 auto;  padding: 0 var(--spacing-4);}.menu {  --navigation-menu-full-width-content-justify: center;}.content {  padding: var(--spacing-5) 0;}.contentInner {  display: grid;  justify-content: var(--navigation-menu-full-width-content-justify, center);  max-width: 72rem;  margin: 0 auto;  padding: 0 var(--spacing-4);}.gridCols2,.gridCols3,.gridCols4 {  display: grid;  width: max-content;  gap: var(--spacing-1);  margin: 0;  padding: 0;  list-style: none;}.gridCols2 {  grid-template-columns: repeat(2, minmax(12rem, 16rem));}.gridCols3 {  grid-template-columns: repeat(3, minmax(12rem, 16rem));}.gridCols4 {  grid-template-columns: repeat(4, minmax(12rem, 16rem));}

Nested Submenu

Nest another NavigationMenu inside content when a second-level menu should open in a separate popup. The nested popup can still use collision handling from Base UI.

import {  ChevronRightIcon,  NavigationMenu,  NavigationMenuContent,  NavigationMenuItem,  NavigationMenuLink,  NavigationMenuList,  NavigationMenuTrigger,} from "moduix";export function NestedNavigationMenuDemo() {  return (    <NavigationMenu>      <NavigationMenuList>        <NavigationMenuItem>          <NavigationMenuTrigger>            Overview          </NavigationMenuTrigger>          <NavigationMenuContent>            <ul className={styles.contentList}>              <li>                <a href="#" className={styles.linkCard}>Quick Start</a>              </li>              <li className={styles.fullWidth}>                <NavigationMenu                  className={styles.nestedRoot}                  orientation="vertical"                  popupContent={{                    side: "right",                    align: "end",                    sideOffset: 24,                    alignOffset: -24,                    withArrow: false,                  }}                >                  <NavigationMenuList className={styles.fullWidth}>                    <NavigationMenuItem className={styles.fullWidth}>                      <NavigationMenuTrigger                        className={styles.nestedTrigger}                        icon={<ChevronRightIcon />}                        classNames={{ icon: styles.nestedIcon }}                      >                        <span>Handbook</span>                      </NavigationMenuTrigger>                      <NavigationMenuContent>                        <ul className={styles.contentList}>                          {guideLinks.map((link) => (                            <li key={link.title}>                              <a href={link.href} className={styles.linkCard}>                                {link.title}                              </a>                            </li>                          ))}                        </ul>                      </NavigationMenuContent>                    </NavigationMenuItem>                  </NavigationMenuList>                </NavigationMenu>              </li>            </ul>          </NavigationMenuContent>        </NavigationMenuItem>        <NavigationMenuItem>          <NavigationMenuLink href="#">GitHub</NavigationMenuLink>        </NavigationMenuItem>      </NavigationMenuList>    </NavigationMenu>  );}
.contentList {  display: grid;  gap: var(--spacing-1);  width: 100%;  margin: 0;  padding: 0;  list-style: none;}.linkCard,.nestedTrigger {  box-sizing: border-box;  display: grid;  gap: var(--spacing-1);  width: 100%;  padding: var(--spacing-2) var(--spacing-3);  border-radius: var(--radius-md);  color: inherit;  text-align: left;  text-decoration: none;  overflow-wrap: anywhere;}.fullWidth {  width: 100%;}.nestedRoot {  --navigation-menu-bg: transparent;  --navigation-menu-min-width: 0;  --navigation-menu-padding: 0;}.nestedTrigger {  position: relative;  padding-right: 2rem;}.nestedIcon {  position: absolute;  top: 50%;  right: 0.625rem;  transform: translateY(-50%);}
const guideLinks = [  { href: "#", title: "Accessibility handbook" },  { href: "#", title: "Composition handbook" },  { href: "#", title: "Styling handbook" },];

Nested Inline Submenu

Use popupContent={false} when second-level content should stay inside the same panel. Set withViewport on the nested menu and pass classNames.viewport to style the automatic viewport.

import {  NavigationMenu,  NavigationMenuContent,  NavigationMenuItem,  NavigationMenuList,  NavigationMenuTrigger,} from "moduix";import { useMediaQuery } from "@base-ui/react/unstable-use-media-query";export function NestedInlineNavigationMenuDemo() {  const isDesktop = useMediaQuery("(min-width: 700px)", { defaultMatches: true });  return (    <NavigationMenu>      <NavigationMenuList>        <NavigationMenuItem>          <NavigationMenuTrigger>            Product          </NavigationMenuTrigger>          <NavigationMenuContent className={styles.inlineProductContent}>            <NavigationMenu              className={styles.inlineNestedRoot}              orientation={isDesktop ? "vertical" : "horizontal"}              defaultValue="developers"              popupContent={false}              withViewport              classNames={{ viewport: styles.inlineViewport }}            >              <NavigationMenuList className={styles.inlineList}>                {sections.map((section) => (                  <NavigationMenuItem key={section.value} value={section.value}>                    <NavigationMenuTrigger className={styles.inlineTrigger} hideIcon>                      <span>{section.title}</span>                      <span>{section.description}</span>                    </NavigationMenuTrigger>                    <NavigationMenuContent className={styles.inlineSubmenuContent}>                      <ul className={styles.contentList}>                        {section.links.map((link) => (                          <li key={link}>                            <a href="#" className={styles.linkCard}>{link}</a>                          </li>                        ))}                      </ul>                    </NavigationMenuContent>                  </NavigationMenuItem>                ))}              </NavigationMenuList>            </NavigationMenu>          </NavigationMenuContent>        </NavigationMenuItem>      </NavigationMenuList>    </NavigationMenu>  );}
.inlineProductContent {  width: calc(100vw - 40px);  height: 100%;  max-width: 675px;  padding: 0;}.inlineNestedRoot {  display: grid;  grid-template-columns: 1fr;  overflow: hidden;  padding: 0;  border-radius: var(--radius-lg);}.inlineList {  display: flex;  flex-direction: row;  gap: var(--spacing-2);  overflow-x: auto;  margin: 0;  padding: var(--spacing-3);  border-bottom: var(--border-width-sm) solid var(--color-border);  background-color: var(--color-muted);  list-style: none;}.inlineTrigger {  box-sizing: border-box;  display: grid;  justify-content: flex-start;  gap: var(--spacing-1);  width: 100%;  min-width: 10rem;  padding: var(--spacing-2) var(--spacing-3);  border-radius: var(--radius-md);  text-align: left;}.inlineTrigger[data-popup-open],.inlineTrigger[data-active] {  background-color: var(--color-background);}.inlineSubmenuContent {  height: 100%;  padding: var(--spacing-4);}.inlineViewport {  min-height: 16.5rem;  border-top: var(--border-width-sm) solid var(--color-border);}@media (min-width: 700px) {  .inlineNestedRoot {    grid-template-columns: 13rem minmax(0, 1fr);  }  .inlineList {    flex-direction: column;    height: var(--popup-height);    overflow-x: visible;    overflow-y: auto;    border-right: var(--border-width-sm) solid var(--color-border);    border-bottom: 0;  }  .inlineViewport {    border-top: 0;  }}
const sections = [  {    value: "developers",    title: "Developers",    description: "API, SDK and integrations",    links: ["API Overview", "Web SDK", "Composition"],  },  {    value: "systems",    title: "Design Systems",    description: "Patterns and governance",    links: ["Styling", "Accessibility", "Release notes"],  },];

Custom Styles

Use popupContent.className and popupContent.classNames when styling the popup and the hidden Base UI service slots.

import {  NavigationMenu,  NavigationMenuContent,  NavigationMenuItem,  NavigationMenuList,  NavigationMenuTrigger,} from "moduix";export function CustomStylesNavigationMenuDemo() {  return (    <NavigationMenu      className={styles.customRoot}      popupContent={{        sideOffset: 16,        withBackdrop: true,        classNames: {          portal: styles.portal,          backdrop: styles.backdrop,          positioner: styles.positioner,          arrow: styles.arrow,          viewport: styles.viewport,        },      }}    >      <NavigationMenuList>        <NavigationMenuItem>          <NavigationMenuTrigger>            Resources          </NavigationMenuTrigger>          <NavigationMenuContent>            <ul className={styles.contentList}>              {guideLinks.map((link) => (                <li key={link.title}>                  <a href={link.href} className={styles.linkCard}>                    {link.title}                  </a>                </li>              ))}            </ul>          </NavigationMenuContent>        </NavigationMenuItem>      </NavigationMenuList>    </NavigationMenu>  );}
.contentList {  display: grid;  gap: var(--spacing-1);  margin: 0;  padding: 0;  list-style: none;}.linkCard {  display: block;  padding: var(--spacing-2) var(--spacing-3);  border-radius: var(--radius-md);  color: inherit;  text-decoration: none;}.portal {  z-index: var(--z-popup);}.customRoot {  position: relative;  z-index: calc(var(--z-popup) + 1);}.backdrop {  background-color: rgb(15 23 42 / 0.08);  backdrop-filter: blur(2px);}.positioner {  --navigation-menu-positioner-gap: var(--spacing-2);}.arrow {  color: var(--color-background);  --navigation-menu-arrow-stroke-color: var(--navigation-menu-popup-border-color);}.viewport {  overflow: hidden;}
const guideLinks = [  { href: "#", title: "Accessibility handbook" },  { href: "#", title: "Composition handbook" },  { href: "#", title: "Styling handbook" },];

Custom Icon

Pass icon to NavigationMenuTrigger to use any icon from your app or icon library.

import {  ChevronDownIcon,  NavigationMenu,  NavigationMenuContent,  NavigationMenuItem,  NavigationMenuList,  NavigationMenuTrigger,} from "moduix";export function CustomIconNavigationMenuDemo() {  return (    <NavigationMenu>      <NavigationMenuList>        <NavigationMenuItem>          <NavigationMenuTrigger            icon={<ChevronDownIcon />}            classNames={{ icon: styles.customIcon }}          >            Resources          </NavigationMenuTrigger>          <NavigationMenuContent>            <ul className={styles.contentList}>              {guideLinks.slice(0, 2).map((link) => (                <li key={link.title}>                  <a href={link.href} className={styles.linkCard}>                    {link.title}                  </a>                </li>              ))}            </ul>          </NavigationMenuContent>        </NavigationMenuItem>      </NavigationMenuList>    </NavigationMenu>  );}
.contentList {  display: grid;  gap: var(--spacing-1);  margin: 0;  padding: 0;  list-style: none;}.linkCard {  display: block;  padding: var(--spacing-2) var(--spacing-3);  border-radius: var(--radius-md);  color: inherit;  text-decoration: none;}.customIcon {  width: 1rem;  height: 1rem;}
const guideLinks = [  { href: "#", title: "Accessibility handbook" },  { href: "#", title: "Composition handbook" },  { href: "#", title: "Styling handbook" },];

On this page