Layout
NavigationMenu A site navigation bar with expandable submenus, sharing active-item state across a compound of parts.
npm pnpm yarn bun
npm install @morphos/layout
import {
NavigationMenu,
NavigationMenuList,
NavigationMenuItem,
NavigationMenuTrigger,
NavigationMenuContent,
NavigationMenuLink,
} from '@morphos/layout'
@ Component ()
class MyComponent extends StatefulComponent {
@ State () nav = new NavigationMenu ({ 'aria-label' : 'Main navigation' })
@ State () productsItem = new NavigationMenuItem ({ nav: this .nav, value: 'products' })
render () {
return (
< NavigationMenu nav = { this .nav}>
< NavigationMenuList nav = { this .nav}>
< NavigationMenuItem nav = { this .nav} value = "products" >
< NavigationMenuTrigger item = { this .productsItem}>Products</ NavigationMenuTrigger >
< NavigationMenuContent item = { this .productsItem}>
< NavigationMenuLink href = "/analytics" >Analytics</ NavigationMenuLink >
< NavigationMenuLink href = "/automation" >Automation</ NavigationMenuLink >
</ NavigationMenuContent >
</ NavigationMenuItem >
< li >
< NavigationMenuLink href = "/pricing" >Pricing</ NavigationMenuLink >
</ li >
</ NavigationMenuList >
</ NavigationMenu >
)
}
}
Plain links that don't need a submenu can skip NavigationMenuItem entirely and sit directly in an <li> inside NavigationMenuList, as shown with "Pricing" above.
Component Description NavigationMenuRoot — renders <nav>, tracks which item's submenu is active NavigationMenuListRenders <ul role="list"> NavigationMenuItemOne item in the list — bridges the root and its trigger/content NavigationMenuTriggerButton that expands/collapses the item's submenu NavigationMenuContentThe submenu panel NavigationMenuLinkA plain navigation link (<a>)
Prop Type Default Description orientation"horizontal" | "vertical""horizontal"Layout direction aria-labelstring— Accessible label for the <nav> classstring— CSS class idstring— HTML id
Method Description open(item: string)Opens the submenu for the given item value, closing any other open one close()Closes the currently open submenu toggle(item: string)Opens the given item's submenu if closed, or closes it if it's the currently open one
Prop Type Default Description navNavigationMenu— The root NavigationMenu instance childrenChildren— NavigationMenuItem and plain <li> elementsclassstring— CSS class idstring— HTML id
Prop Type Default Description navNavigationMenu— The root NavigationMenu instance valuestring— Unique identifier for this item childrenChildren— Typically a NavigationMenuTrigger + NavigationMenuContent pair classstring— CSS class idstring— HTML id
Prop Type Default Description itemNavigationMenuItem— The parent NavigationMenuItem childrenChildren— Trigger label classstring— CSS class idstring— HTML id (defaults to the item's generated trigger id)
Prop Type Default Description itemNavigationMenuItem— The parent NavigationMenuItem childrenChildren— Submenu content classstring— CSS class idstring— HTML id (defaults to the item's generated content id)
Prop Type Default Description hrefstring— Link destination targetstring— Anchor target attribute relstring— Anchor rel attribute onClick(event: MouseEvent) => void— Click handler childrenChildren— Link content classstring— CSS class idstring— HTML id
Interaction Action Click a trigger Toggle its submenu open/closed; opening one closes any other open submenu Click outside the trigger and content Close the open submenu EscapeClose the open submenu
Arrow-key navigation between triggers or between links inside a submenu is not implemented — NavigationMenuContent only listens for Escape and outside mousedown on document while its item's submenu is open.
Attribute Element When present data-orientationNavigationMenu Always — reflects the orientation prop data-activeNavigationMenuItem The item's submenu is currently open
There is no data-open attribute on NavigationMenuTrigger or NavigationMenuContent — only NavigationMenuItem exposes state, via data-active. NavigationMenuContent uses the native hidden attribute to hide closed submenus.
.morphos-navigation-menu [ data-orientation = "vertical" ] .morphos-navigation-menu-list {
flex-direction : column ;
align-items : stretch ;
}
.morphos-navigation-menu-trigger:hover ,
.morphos-navigation-menu-item [ data-active ] .morphos-navigation-menu-trigger {
background : var ( --morphos-color-bg-hover );
}
.morphos-navigation-menu-content [ hidden ] {
display : none ;
}