- AccordionNew
- Alert
- Alert DialogNew
- AutocompleteNew
- AvatarNew
- Badge
- Breadcrumb
- Button
- CalendarNew
- CardNew
- Checkbox
- Checkbox GroupNew
- CollapsibleNew
- ComboboxNew
- CommandNew
- Context MenuNew
- Date PickerNew
- DialogNew
- DrawerNew
- EmptyNew
- FieldNew
- FieldsetNew
- FormNew
- FrameNew
- GroupNew
- Input
- Input GroupNew
- KbdNew
- Label
- MenuNew
- MeterNew
- Number Field
- OTP FieldNew
- Pagination
- PopoverNew
- Preview CardNew
- Progress
- Radio Group
- Scroll AreaNew
- Select
- Separator
- SheetNew
- SkeletonNew
- Slider
- Spinner
- StepperNew
- Switch
- Table
- TabsNew
- Textarea
- ToastNew
- ToggleNew
- Toggle GroupNew
- ToolbarNew
- Tooltip
Menu
A list of actions in a dropdown, enhanced with keyboard navigation.
import {
PauseIcon,
PlayIcon,
SkipBackIcon,
SkipForwardIcon,
} from "lucide-react";
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuCheckboxItem,
MenuGroup,
MenuGroupLabel,
MenuItem,
MenuPopup,
MenuRadioGroup,
MenuRadioItem,
MenuSeparator,
MenuShortcut,
MenuSub,
MenuSubPopup,
MenuSubTrigger,
MenuTrigger,
} from "mako-ui/components/menu";
import { Trash } from "mako-ui/icons/trash";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuGroup>
<MenuGroupLabel>Playback</MenuGroupLabel>
<MenuItem>
<PlayIcon aria-hidden="true" />
Play
<MenuShortcut>⌘P</MenuShortcut>
</MenuItem>
<MenuItem disabled>
<PauseIcon aria-hidden="true" />
Pause
<MenuShortcut>⇧⌘P</MenuShortcut>
</MenuItem>
<MenuItem>
<SkipBackIcon aria-hidden="true" />
Previous
<MenuShortcut>⌘[</MenuShortcut>
</MenuItem>
<MenuItem>
<SkipForwardIcon aria-hidden="true" />
Next
<MenuShortcut>⌘]</MenuShortcut>
</MenuItem>
</MenuGroup>
<MenuSeparator />
<MenuCheckboxItem>Shuffle</MenuCheckboxItem>
<MenuCheckboxItem>Repeat</MenuCheckboxItem>
<MenuCheckboxItem disabled>Enhanced Audio</MenuCheckboxItem>
<MenuSeparator />
<MenuGroup>
<MenuGroupLabel>Sort by</MenuGroupLabel>
<MenuRadioGroup>
<MenuRadioItem value="artist">Artist</MenuRadioItem>
<MenuRadioItem value="album">Album</MenuRadioItem>
<MenuRadioItem value="title">Title</MenuRadioItem>
</MenuRadioGroup>
</MenuGroup>
<MenuSeparator />
<MenuCheckboxItem variant="switch">Auto save</MenuCheckboxItem>
<MenuSeparator />
<MenuSub>
<MenuSubTrigger>Add to Playlist</MenuSubTrigger>
<MenuSubPopup>
<MenuItem>Jazz</MenuItem>
<MenuSub>
<MenuSubTrigger>Rock</MenuSubTrigger>
<MenuSubPopup>
<MenuItem>Hard Rock</MenuItem>
<MenuItem>Soft Rock</MenuItem>
<MenuItem>Classic Rock</MenuItem>
<MenuSeparator />
<MenuItem>Metal</MenuItem>
<MenuItem>Punk</MenuItem>
<MenuItem>Grunge</MenuItem>
<MenuItem>Alternative</MenuItem>
<MenuItem>Indie</MenuItem>
<MenuItem>Electronic</MenuItem>
</MenuSubPopup>
</MenuSub>
<MenuItem>Pop</MenuItem>
</MenuSubPopup>
</MenuSub>
<MenuSeparator />
<MenuItem variant="destructive">
<Trash aria-hidden="true" />
Delete
<MenuShortcut>⌘⌫</MenuShortcut>
</MenuItem>
</MenuPopup>
</Menu>
);
}
Usage
import {
Menu,
MenuCheckboxItem,
MenuGroup,
MenuGroupLabel,
MenuItem,
MenuLinkItem,
MenuPopup,
MenuRadioGroup,
MenuRadioItem,
MenuSeparator,
MenuSub,
MenuSubPopup,
MenuSubTrigger,
MenuTrigger,
} from "mako-ui/components/menu"<Menu>
<MenuTrigger>Open</MenuTrigger>
<MenuPopup align="start" sideOffset={4}>
<MenuItem>Profile</MenuItem>
<MenuSeparator />
<MenuGroup>
<MenuGroupLabel>Playback</MenuGroupLabel>
<MenuItem>Play</MenuItem>
<MenuItem>Pause</MenuItem>
</MenuGroup>
<MenuSeparator />
<MenuCheckboxItem>Shuffle</MenuCheckboxItem>
<MenuCheckboxItem>Repeat</MenuCheckboxItem>
<MenuCheckboxItem variant="switch">Auto save</MenuCheckboxItem>
<MenuSeparator />
<MenuGroup>
<MenuGroupLabel>Sort by</MenuGroupLabel>
<MenuRadioGroup>
<MenuRadioItem>Artist</MenuRadioItem>
<MenuRadioItem>Album</MenuRadioItem>
<MenuRadioItem>Title</MenuRadioItem>
</MenuRadioGroup>
</MenuGroup>
<MenuSeparator />
<MenuSub>
<MenuSubTrigger>Add to playlist</MenuSubTrigger>
<MenuSubPopup>
<MenuItem>Jazz</MenuItem>
<MenuItem>Rock</MenuItem>
</MenuSubPopup>
</MenuSub>
</MenuPopup>
</Menu>API Reference
Menu
Root component. Also exported as DropdownMenu.
MenuTrigger
Trigger button that opens the menu. Also exported as DropdownMenuTrigger.
MenuPopup
Popup container that displays the menu content. Also exported as DropdownMenuContent.
| Prop | Type | Default | Description |
|---|---|---|---|
side | "top" | "bottom" | "left" | "right" | "bottom" | Side of the trigger to position the popup |
align | "start" | "center" | "end" | "center" | Alignment relative to the trigger |
sideOffset | number | 4 | Distance from the trigger in pixels |
alignOffset | number | - | Offset along the alignment axis |
portalProps | PortalProps | - | Props forwarded to the internal portal (keepMounted, container, etc.) |
MenuGroup
Groups related menu items. Also exported as DropdownMenuGroup.
MenuItem
Individual menu item. Also exported as DropdownMenuItem.
| Prop | Type | Default | Description |
|---|---|---|---|
inset | boolean | - | Adds left padding to align with items that have icons |
variant | "default" | "destructive" | "default" | Controls the item styling |
Using inset: When mixing items with and without icons, use inset on icon-less items to maintain alignment:
<MenuItem><Pencil /> Edit</MenuItem>
<MenuItem><Trash /> Delete</MenuItem>
<MenuItem inset>Profile</MenuItem> {/* Aligns with icon items above */}MenuLinkItem
Link menu item for navigation. LinkItem renders a native <a> when you pass href. Styled like MenuItem.
| Prop | Type | Default | Description |
|---|---|---|---|
inset | boolean | - | Adds left padding to align with items that have icons |
variant | "default" | "destructive" | "default" | Controls the item styling |
closeOnClick | boolean | true | Whether the menu closes when the link is clicked |
If you were using MenuItem render={<Link href="..." />}, migrate to MenuLinkItem but keep render — do not replace it with href alone when using a router Link.
<MenuLinkItem render={<Link href="/docs" />}>Docs</MenuLinkItem>Use href only for plain anchor links:
<MenuLinkItem href="/docs">Docs</MenuLinkItem>MenuCheckboxItem
Checkbox menu item. Also exported as DropdownMenuCheckboxItem.
| Prop | Type | Default | Description |
|---|---|---|---|
variant | "default" | "switch" | "default" | Display style - switch shows a toggle switch indicator |
MenuRadioGroup
Groups radio menu items. Also exported as DropdownMenuRadioGroup.
MenuRadioItem
Radio menu item. Also exported as DropdownMenuRadioItem.
MenuGroupLabel
Label for a menu group. Also exported as DropdownMenuLabel.
| Prop | Type | Default | Description |
|---|---|---|---|
inset | boolean | - | Adds left padding to align with items that have icons |
MenuSeparator
Visual separator between menu items. Also exported as DropdownMenuSeparator.
MenuShortcut
Displays keyboard shortcut text. Custom component. Also exported as DropdownMenuShortcut.
MenuSub
Submenu container. Also exported as DropdownMenuSub.
MenuSubTrigger
Trigger for opening a submenu. Also exported as DropdownMenuSubTrigger.
| Prop | Type | Default | Description |
|---|---|---|---|
inset | boolean | - | Adds left padding to align with items that have icons |
MenuSubPopup
Popup for submenu content. Also exported as DropdownMenuSubContent.
| Prop | Type | Default | Description |
|---|---|---|---|
align | "start" | "center" | "end" | "start" | Alignment relative to the trigger |
sideOffset | number | 0 | Distance from the trigger in pixels |
alignOffset | number | -5 | Offset along the alignment axis. Defaults to -5 when align is not "center" |
Examples
Open on Hover
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger openOnHover render={<Button variant="outline" />}>
Hover me
</MenuTrigger>
<MenuPopup>
<MenuItem>Item one</MenuItem>
<MenuItem>Item two</MenuItem>
</MenuPopup>
</Menu>
);
}
With Checkbox
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuCheckboxItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuCheckboxItem defaultChecked>Auto save</MenuCheckboxItem>
<MenuCheckboxItem>Notifications</MenuCheckboxItem>
</MenuPopup>
</Menu>
);
}
With Switch
MenuCheckboxItem supports a variant="switch" prop that displays a decorative switch indicator instead of a checkmark. This is a purely visual variant - the component remains a checkbox item with the same functionality.
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuCheckboxItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuCheckboxItem defaultChecked variant="switch">
Auto save
</MenuCheckboxItem>
<MenuCheckboxItem variant="switch">Notifications</MenuCheckboxItem>
<MenuCheckboxItem defaultChecked variant="switch">
Compact mode
</MenuCheckboxItem>
</MenuPopup>
</Menu>
);
}
With Radio Group
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuPopup,
MenuRadioGroup,
MenuRadioItem,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuRadioGroup defaultValue="grid">
<MenuRadioItem value="list">List</MenuRadioItem>
<MenuRadioItem value="grid">Grid</MenuRadioItem>
<MenuRadioItem value="gallery">Gallery</MenuRadioItem>
</MenuRadioGroup>
</MenuPopup>
</Menu>
);
}
With Link
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuLinkItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
import Link from "next/link";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuLinkItem render={<Link href="/docs" />}>Docs</MenuLinkItem>
<MenuLinkItem render={<Link href="/docs/get-started" />}>
Get Started
</MenuLinkItem>
</MenuPopup>
</Menu>
);
}
With Group Label
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuGroup,
MenuGroupLabel,
MenuItem,
MenuPopup,
MenuSeparator,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuGroup>
<MenuGroupLabel>Account</MenuGroupLabel>
<MenuItem>Profile</MenuItem>
<MenuItem>Billing</MenuItem>
</MenuGroup>
<MenuSeparator />
<MenuGroup>
<MenuGroupLabel>Support</MenuGroupLabel>
<MenuItem>Docs</MenuItem>
<MenuItem>Contact</MenuItem>
</MenuGroup>
</MenuPopup>
</Menu>
);
}
Nested Menu
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuItem,
MenuPopup,
MenuSub,
MenuSubPopup,
MenuSubTrigger,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuItem>Item one</MenuItem>
<MenuSub>
<MenuSubTrigger>More</MenuSubTrigger>
<MenuSubPopup>
<MenuItem>Sub item A</MenuItem>
<MenuItem>Sub item B</MenuItem>
</MenuSubPopup>
</MenuSub>
<MenuItem>Item two</MenuItem>
</MenuPopup>
</Menu>
);
}
Close on Click
import { Button } from "mako-ui/components/button";
import {
Menu,
MenuItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
export default function Particle() {
return (
<Menu>
<MenuTrigger render={<Button variant="outline" />}>Open menu</MenuTrigger>
<MenuPopup>
<MenuItem closeOnClick>Profile</MenuItem>
<MenuItem closeOnClick>Settings</MenuItem>
<MenuItem closeOnClick>Log out</MenuItem>
</MenuPopup>
</Menu>
);
}
Open a Dialog
"use client";
import { Button } from "mako-ui/components/button";
import {
Dialog,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogPopup,
DialogTitle,
} from "mako-ui/components/dialog";
import {
Menu,
MenuItem,
MenuPopup,
MenuTrigger,
} from "mako-ui/components/menu";
import { useState } from "react";
export default function Particle() {
const [dialogOpen, setDialogOpen] = useState(false);
return (
<>
<Menu>
<MenuTrigger render={<Button variant="outline" />}>
Open menu
</MenuTrigger>
<MenuPopup align="start">
<MenuItem onClick={() => setDialogOpen(true)}>Open dialog</MenuItem>
</MenuPopup>
</Menu>
<Dialog onOpenChange={setDialogOpen} open={dialogOpen}>
<DialogPopup>
<DialogHeader>
<DialogTitle>Settings</DialogTitle>
<DialogDescription>Change your preferences</DialogDescription>
</DialogHeader>
<DialogFooter>
<DialogClose render={<Button variant="ghost" />}>Close</DialogClose>
</DialogFooter>
</DialogPopup>
</Dialog>
</>
);
}
On This Page