A collection of React components for building accessible, customizable navigation menus with keyboard support and flexible layout options
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Essential components for building navigation menu structures with proper hierarchy and state management.
The root container component that manages global navigation menu state, timing behavior, and coordinates all child components.
/**
* Root navigation menu component that manages global state and timing
* @param value - Controlled value for the currently open menu item
* @param defaultValue - Default value for uncontrolled mode
* @param onValueChange - Callback when the active menu item changes
* @param dir - Text direction, affects keyboard navigation
* @param orientation - Layout orientation for the menu
* @param delayDuration - Delay before opening menu on hover (default: 200ms)
* @param skipDelayDuration - Time window to skip delay when moving between items (default: 300ms)
*/
const NavigationMenu: React.ForwardRefExoticComponent<
NavigationMenuProps & React.RefAttributes<HTMLElement>
>;
interface NavigationMenuProps extends React.ComponentPropsWithoutRef<"nav"> {
value?: string;
defaultValue?: string;
onValueChange?: (value: string) => void;
dir?: "ltr" | "rtl";
orientation?: "horizontal" | "vertical";
delayDuration?: number;
skipDelayDuration?: number;
}Usage Examples:
import { NavigationMenu } from "@radix-ui/react-navigation-menu";
// Uncontrolled mode
function UncontrolledNav() {
return (
<NavigationMenu defaultValue="home">
{/* Menu items */}
</NavigationMenu>
);
}
// Controlled mode with custom timing
function ControlledNav() {
const [value, setValue] = React.useState("");
return (
<NavigationMenu
value={value}
onValueChange={setValue}
delayDuration={100}
skipDelayDuration={500}
orientation="vertical"
>
{/* Menu items */}
</NavigationMenu>
);
}Container component for navigation menu items, providing the list structure and handling focus management.
/**
* List container for navigation menu items with focus management
* Renders as an unordered list (ul) element
*/
const NavigationMenuList: React.ForwardRefExoticComponent<
NavigationMenuListProps & React.RefAttributes<HTMLUListElement>
>;
interface NavigationMenuListProps
extends React.ComponentPropsWithoutRef<"ul"> {}Usage Examples:
import { NavigationMenu, NavigationMenuList, NavigationMenuItem } from "@radix-ui/react-navigation-menu";
function NavWithList() {
return (
<NavigationMenu>
<NavigationMenuList className="nav-list">
<NavigationMenuItem>Item 1</NavigationMenuItem>
<NavigationMenuItem>Item 2</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
);
}Wrapper component for individual menu items that manages the relationship between triggers and content panels.
/**
* Individual menu item wrapper that manages trigger-content relationships
* @param value - Unique identifier for this menu item (auto-generated if not provided)
*/
const NavigationMenuItem: React.ForwardRefExoticComponent<
NavigationMenuItemProps & React.RefAttributes<HTMLLIElement>
>;
interface NavigationMenuItemProps
extends React.ComponentPropsWithoutRef<"li"> {
value?: string;
}Usage Examples:
import {
NavigationMenu,
NavigationMenuList,
NavigationMenuItem,
NavigationMenuTrigger,
NavigationMenuContent
} from "@radix-ui/react-navigation-menu";
function ItemExample() {
return (
<NavigationMenu>
<NavigationMenuList>
{/* Item with explicit value */}
<NavigationMenuItem value="products">
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
Product content here
</NavigationMenuContent>
</NavigationMenuItem>
{/* Item with auto-generated value */}
<NavigationMenuItem>
<NavigationMenuTrigger>Services</NavigationMenuTrigger>
<NavigationMenuContent>
Service content here
</NavigationMenuContent>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
);
}Sub-navigation container for creating nested menu structures within a parent navigation menu.
/**
* Sub-navigation container for nested menu structures
* @param value - Controlled value for the sub-menu
* @param defaultValue - Default value for uncontrolled sub-menu
* @param onValueChange - Callback when sub-menu value changes
* @param orientation - Layout orientation for the sub-menu
*/
const NavigationMenuSub: React.ForwardRefExoticComponent<
NavigationMenuSubProps & React.RefAttributes<HTMLDivElement>
>;
interface NavigationMenuSubProps
extends React.ComponentPropsWithoutRef<"div"> {
value?: string;
defaultValue?: string;
onValueChange?: (value: string) => void;
orientation?: "horizontal" | "vertical";
}Usage Examples:
import {
NavigationMenu,
NavigationMenuList,
NavigationMenuItem,
NavigationMenuTrigger,
NavigationMenuContent,
NavigationMenuSub
} from "@radix-ui/react-navigation-menu";
function NestedMenuExample() {
return (
<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
<NavigationMenuSub>
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuTrigger>Web Tools</NavigationMenuTrigger>
<NavigationMenuContent>
Web tools content
</NavigationMenuContent>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenuSub>
</NavigationMenuContent>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
);
}Core components expose data attributes for styling:
[data-orientation="horizontal"] { /* Horizontal menu layout */ }
[data-orientation="vertical"] { /* Vertical menu layout */ }[data-orientation="horizontal"] { /* Horizontal list layout */ }
[data-orientation="vertical"] { /* Vertical list layout */ }[data-orientation="horizontal"] { /* Horizontal sub-menu */ }
[data-orientation="vertical"] { /* Vertical sub-menu */ }Styling Examples:
.nav-menu[data-orientation="horizontal"] {
display: flex;
flex-direction: row;
}
.nav-menu[data-orientation="vertical"] {
display: flex;
flex-direction: column;
}
.nav-list[data-orientation="horizontal"] {
display: flex;
flex-direction: row;
gap: 1rem;
}
.nav-list[data-orientation="vertical"] {
display: flex;
flex-direction: column;
gap: 0.5rem;
}Install with Tessl CLI
npx tessl i tessl/npm-radix-ui--react-navigation-menu