0.1.0

Navigation Menu

Navigation menus organize site sections with optional dropdown panels for nested links.

Try it

Usage

Compose triggers, links, and panels with the sub-components. Use RuiNavigationMenuTrigger for sections with flyout content.

import {
  RuiNavigationMenu,
  RuiNavigationMenuBar,
  RuiNavigationMenuLink,
  RuiNavigationMenuPanel,
  RuiNavigationMenuPanels,
  RuiNavigationMenuTrigger,
} from '@ecopages/radiant-ui/navigation-menu';
 
<RuiNavigationMenu label="Main">
  <RuiNavigationMenuBar>
    <RuiNavigationMenuTrigger value="products">Products</RuiNavigationMenuTrigger>
    <RuiNavigationMenuLink href="/pricing">Pricing</RuiNavigationMenuLink>
  </RuiNavigationMenuBar>
  <RuiNavigationMenuPanels>
    <RuiNavigationMenuPanel value="products">
      <a href="/widgets">Widgets</a>
    </RuiNavigationMenuPanel>
  </RuiNavigationMenuPanels>
</RuiNavigationMenu>

Custom markup

import '@ecopages/radiant-ui/navigation-menu';
 
<rui-navigation-menu label="Main">
  <nav class="rui-navigation-menu">
    <div class="rui-navigation-menu__bar">
      <button data-navigation-item data-navigation-trigger data-value="products">Products</button>
      <a href="/pricing" data-navigation-item>Pricing</a>
    </div>
    <div class="rui-navigation-menu__panels">
      <div data-navigation-panel data-value="products" hidden>
        <a href="/widgets">Widgets</a>
      </div>
    </div>
  </nav>
</rui-navigation-menu>

Site-wide navigation

Keep top-level items to five or fewer. Move secondary links into panels or the footer.

Theming

The trigger bar is unboxed by default: fill, border, and shadow are transparent. Override --rui-navigation-menu-bar-* on rui-navigation-menu to paint chrome. Flyout panels use the shared --rui-popover-* surface knobs.

PartDefaultOverride
Bar fill / border / shadowtransparent, transparent, none--rui-navigation-menu-bar-surface, --rui-navigation-menu-bar-border-color, --rui-navigation-menu-bar-shadow
Bar radius / padding--radius-container, 0px--rui-navigation-menu-bar-radius, --rui-navigation-menu-bar-padding-x, --rui-navigation-menu-bar-padding-y
Panel size / padding12rem, --space-inset--rui-navigation-menu-panel-min-width, --rui-navigation-menu-panel-padding
Panel fill / border / radius / shadow--background, --border, --radius-container, --shadow-overlay--rui-popover-surface, --rui-popover-border-color, --rui-popover-radius, --rui-popover-shadow
Open triggerprimary-container fill and ringtheme roles
rui-navigation-menu {
  --rui-navigation-menu-bar-surface: var(--surface);
  --rui-navigation-menu-bar-border-color: var(--border);
  --rui-navigation-menu-bar-shadow: var(--shadow-sm);
  --rui-navigation-menu-bar-padding-x: var(--space-control-x);
  --rui-navigation-menu-bar-padding-y: var(--space-control-y);
}

API

RuiNavigationMenu is a custom element (<rui-navigation-menu>) rendering a nav landmark. Compose the view helpers for triggers, links, and panels, using RuiNavigationMenuBar and RuiNavigationMenuPanels.

Attributes

AttributeTypeDefaultDescription
labelstring''Accessible name for the nav landmark.

Light-DOM contract

TargetRequiredHost writesAuthor owns
[data-navigation-item]yesroving tabIndexbar link or trigger
[data-navigation-trigger]yesaria-expanded, aria-haspopup, idtrigger with data-value
[data-navigation-panel]yeshidden, data-state, aria-hidden, role, aria-labelledbypanel with matching data-value
data-valueper pair—links trigger to panel

View helpers

ComponentTarget stampedNotes
RuiNavigationMenu<rui-navigation-menu> + nav[data-ref="root"]
RuiNavigationMenuBardata-ref="bar"Trigger / link row
RuiNavigationMenuPanelsdata-ref="panels"Panel region
RuiNavigationMenuTrigger[data-navigation-item], [data-navigation-trigger], data-value
RuiNavigationMenuLink[data-navigation-item]Plain link
RuiNavigationMenuPanel[data-navigation-panel], data-value

CSS classes

Public BEM classes on the composed light-DOM surface (documented via @cssclass):

ClassDescription
.rui-navigation-menuRoot nav surface.
.rui-navigation-menu__barTop-level trigger / link bar.
.rui-navigation-menu__panelsPanel region.

Content helper classes authored in consumer markup (see stories):

ClassDescription
.rui-navigation-menu__megamenuPanel content grid.
.rui-navigation-menu__link-columnsTwo-column link group layout.
.rui-navigation-menu__link-group-labelLink group heading.
.rui-navigation-menu__link-listLink list.
.rui-navigation-menu__disclosure-copyParagraph copy inside disclosure panels.

Theme roles

PartCSS variables consumed
Bar (when painted)--surface, --border, --shadow-sm, --radius-container, --space-control-x, --space-control-y
Open trigger--primary-container, --on-primary-container, --primary, --focus-ring
Panel--background, --border, --radius-container, --shadow-overlay, --space-inset
Panel text--on-background, --on-surface, --link

Accessibility

  • The menu renders as a nav landmark with an accessible name from label.
  • Expanded panels are associated with their triggers via aria-controls.
  • Current page links should use aria-current="page".