Navigation Menu

Site links with panels that open on hover or click.

import { … } from '@inlaylab/ivorie/navigation-menu'
import { ChangeDetectionStrategy, Component } from '@angular/core';
import { IV_NAVIGATION_MENU_IMPORTS, navigationMenuTriggerStyle } from '@inlaylab/ivorie/navigation-menu';

@Component({
  selector: 'demo-navigation-menu',
  imports: [IV_NAVIGATION_MENU_IMPORTS],
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `
    <iv-navigation-menu>
      <ul ivNavigationMenuList>
        <li ivNavigationMenuItem>
          <button ivNavigationMenuTrigger>Getting started</button>
          <iv-navigation-menu-content>
            <ul class="grid w-72 gap-1">
              @for (l of guides; track l.title) {
                <li>
                  <a ivNavigationMenuLink [href]="l.href" class="flex-col items-start gap-0.5">
                    <span class="font-medium">{{ l.title }}</span>
                    <span class="text-muted-foreground">{{ l.text }}</span>
                  </a>
                </li>
              }
            </ul>
          </iv-navigation-menu-content>
        </li>
        <li ivNavigationMenuItem>
          <button ivNavigationMenuTrigger>Components</button>
          <iv-navigation-menu-content>
            <ul class="grid w-96 grid-cols-2 gap-1">
              @for (c of components; track c) {
                <li><a ivNavigationMenuLink [href]="'docs/' + c">{{ c }}</a></li>
              }
            </ul>
          </iv-navigation-menu-content>
        </li>
        <li ivNavigationMenuItem>
          <a ivNavigationMenuLink href="docs/cli" [class]="triggerStyle">CLI</a>
        </li>
      </ul>
    </iv-navigation-menu>
  `,
})
export default class NavigationMenuDemo {
  protected readonly triggerStyle = navigationMenuTriggerStyle;
  protected readonly guides = [
    { title: 'Installation', text: 'Add Ivorie to an app.', href: 'docs/installation' },
    { title: 'Theming', text: 'Colors, radius and dark mode.', href: 'docs/theming' },
  ];
  protected readonly components = ['button', 'dialog', 'select', 'tabs'];
}

Installation

CLInpm
npx ivorie add navigation-menu

Usage

import { IV_NAVIGATION_MENU_IMPORTS } from '@inlaylab/ivorie/navigation-menu';
<iv-navigation-menu>
  <ul ivNavigationMenuList>
    <li ivNavigationMenuItem>
      <button ivNavigationMenuTrigger>Docs</button>
      <iv-navigation-menu-content>
        <a ivNavigationMenuLink href="docs/installation">Installation</a>
      </iv-navigation-menu-content>
    </li>
  </ul>
</iv-navigation-menu>

API

Every part also accepts class.

iv-navigation-menu

Name Type Default Description
aria-label string 'Main' Label of the inner nav.

li[ivNavigationMenuItem]

Name Type Default Description
value string | null auto id Item key.
Name Type Default Description
active boolean false Marks the current page (aria-current="page").

Other parts

  • ul[ivNavigationMenuList].
  • button[ivNavigationMenuTrigger]: opens its item's panel. Adds a chevron.
  • iv-navigation-menu-content: the panel, shown under the menu. It slides in from the side of the last open panel.
  • navigationMenuTriggerStyle: classes to make a plain link look like a trigger.

Accessibility

  • A nav landmark with a list of links.
  • Triggers have aria-expanded and aria-controls. Down arrow opens the panel and focuses its first link.
  • Escape closes the panel and returns focus to its trigger. A click outside closes it.