The Menu component provides a dropdown menu with support for items, groups, checkboxes, radio buttons, and nested submenus.
Installation
import {
MenuRoot,
MenuTrigger,
MenuPortal,
MenuPositioner,
MenuPopup,
MenuItem,
MenuSeparator,
MenuGroup,
MenuGroupLabel,
} from "@craftdotui/baseui/components/menu";
Usage
<MenuRoot>
<MenuTrigger>
<Button>Open Menu</Button>
</MenuTrigger>
<MenuPortal>
<MenuPositioner>
<MenuPopup>
<MenuItem>New File</MenuItem>
<MenuItem>Open</MenuItem>
<MenuSeparator />
<MenuItem>Save</MenuItem>
</MenuPopup>
</MenuPositioner>
</MenuPortal>
</MenuRoot>
Components
Callback when state changes.
Element that triggers the menu.
Add left padding for alignment with checkbox/radio items.
Callback when checked state changes.
Menu item with checkbox.
Menu item with radio button.
Callback when selection changes.
Container for radio items.
Examples
<MenuRoot>
<MenuTrigger>
<Button>File</Button>
</MenuTrigger>
<MenuPortal>
<MenuPositioner>
<MenuPopup>
<MenuItem>New</MenuItem>
<MenuItem>Open</MenuItem>
<MenuItem>Save</MenuItem>
<MenuSeparator />
<MenuItem>Exit</MenuItem>
</MenuPopup>
</MenuPositioner>
</MenuPortal>
</MenuRoot>
With Groups
import { MenuGroup, MenuGroupLabel } from "@craftdotui/baseui/components/menu";
<MenuPopup>
<MenuGroup>
<MenuGroupLabel>File</MenuGroupLabel>
<MenuItem>New</MenuItem>
<MenuItem>Open</MenuItem>
</MenuGroup>
<MenuSeparator />
<MenuGroup>
<MenuGroupLabel>Edit</MenuGroupLabel>
<MenuItem>Cut</MenuItem>
<MenuItem>Copy</MenuItem>
</MenuGroup>
</MenuPopup>
With Checkboxes
import { MenuCheckboxItem } from "@craftdotui/baseui/components/menu";
<MenuPopup>
<MenuCheckboxItem checked onCheckedChange={() => {}}>
Show Toolbar
</MenuCheckboxItem>
<MenuCheckboxItem>
Show Sidebar
</MenuCheckboxItem>
</MenuPopup>
With Radio Group
import { MenuRadioGroup, MenuRadioItem } from "@craftdotui/baseui/components/menu";
<MenuPopup>
<MenuRadioGroup value="light">
<MenuRadioItem value="light">Light</MenuRadioItem>
<MenuRadioItem value="dark">Dark</MenuRadioItem>
<MenuRadioItem value="system">System</MenuRadioItem>
</MenuRadioGroup>
</MenuPopup>
import { MenuSubmenuRoot, MenuSubmenuTrigger } from "@craftdotui/baseui/components/menu";
<MenuPopup>
<MenuItem>New File</MenuItem>
<MenuSubmenuRoot>
<MenuSubmenuTrigger>Open Recent</MenuSubmenuTrigger>
<MenuPortal>
<MenuPositioner>
<MenuPopup>
<MenuItem>file1.txt</MenuItem>
<MenuItem>file2.txt</MenuItem>
</MenuPopup>
</MenuPositioner>
</MenuPortal>
</MenuSubmenuRoot>
</MenuPopup>
With Shortcuts
import { MenuShortcut } from "@craftdotui/baseui/components/menu";
<MenuItem>
Save
<MenuShortcut>⌘S</MenuShortcut>
</MenuItem>
Accessibility
- Built on @base-ui/react for ARIA compliance
- Keyboard navigation (Arrow keys, Home, End)
- Type-ahead search
- Focus management
- Escape key to close