Skip to main content

NavigationMenu

NavigationMenu displays a list of links and dropdowns with an overlay viewport and an animated indicator. It integrates with the sl styling system for consistent theming.

Demo

Usage

// Видимите текстове на английски; коментарите на български.
import React from 'react';
import {
NavigationMenu,
NavigationMenuItem,
NavigationMenuTrigger,
NavigationMenuContent,
NavigationMenuLink,
} from '@libdev-ui/base';

export default function Example() {
const [value, setValue] = React.useState<string | null>(null);

return (
<NavigationMenu.Root value={value} onValueChange={setValue} orientation="horizontal" openDelay={0} closeDelay={140}>
<NavigationMenu.List>
<NavigationMenuItem value="home">
<NavigationMenuLink href="#home" active={value === 'home'}>Home</NavigationMenuLink>
</NavigationMenuItem>

<NavigationMenuItem value="docs">
<NavigationMenuTrigger>Docs</NavigationMenuTrigger>
<NavigationMenuContent>
<a href="#getting-started">Getting started</a>
<a href="#components">Components</a>
</NavigationMenuContent>
</NavigationMenuItem>
</NavigationMenu.List>
<NavigationMenu.Viewport />
<NavigationMenu.Indicator />
</NavigationMenu.Root>
);
}

Props

PropTypeDefaultDescription
valuestring | nullControlled active item
defaultValuestring | nullnullUncontrolled initial value
onValueChange(value: string | null) => voidCalled when active item changes
orientation'horizontal' | 'vertical''horizontal'Layout orientation
openDelaynumber0Delay before opening on hover
closeDelaynumber140Delay before closing on leave
reopenSkipDelaynumber300Grace period between triggers
animationPreset'slide' | 'fade' | 'scale' | 'smart''smart'Animation style
reducedMotionMode'auto' | 'force-reduced''auto'Motion preference
viewportAlign'start' | 'center' | 'end''start'Alignment of viewport under trigger
slSlPropSystem styles
PropTypeDefault
rolestring'navigation'
slSlProp
PropTypeDefault
valuestringauto-generated
disabledbooleanfalse
slSlProp
PropTypeDefault
activebooleanfalse
disabledbooleanfalse
slSlProp
PropTypeDefault
forceMountbooleanfalse
slSlProp
PropTypeDefault
forceMountbooleanfalse
motionPropsMotionProps
slSlProp
PropTypeDefault
forceMountbooleantrue
viewportAlign'start' | 'center' | 'end''start'
slSlProp

Troubleshooting

  • If the demo does not open on first hover, ensure the viewport is not clipped by a parent container (overflow: hidden), and that the root wrapper has position: relative while the viewport uses position: absolute.
  • In Docusaurus, using <BrowserOnly> avoids SSR hydration issues for interactive demos.