A dropdown menu component for displaying a list of actions or options, with support for submenus, checkboxes, radio groups, and keyboard shortcuts.

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuDemo() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>Open</MenuTrigger>
      <MenuPopup>
        <MenuItem>Profile</MenuItem>
        <MenuItem>Settings</MenuItem>
        <MenuItem>Billing</MenuItem>
      </MenuPopup>
    </Menu>
  );
}

Installation

Usage

import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuTrigger,
} from "@/components/ui/menu";
<Menu>
  <MenuTrigger>Open</MenuTrigger>
  <MenuPopup>
    <MenuItem>Profile</MenuItem>
    <MenuItem>Settings</MenuItem>
    <MenuItem>Billing</MenuItem>
  </MenuPopup>
</Menu>

Examples

With Submenu

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuSub,
  MenuSubPopup,
  MenuSubTrigger,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuSubmenu() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>Edit</MenuTrigger>
      <MenuPopup>
        <MenuItem>Undo</MenuItem>
        <MenuItem>Redo</MenuItem>
        <MenuSub>
          <MenuSubTrigger>Find</MenuSubTrigger>
          <MenuSubPopup>
            <MenuItem>Search the Web</MenuItem>
            <MenuItem>Find Next</MenuItem>
            <MenuItem>Find Previous</MenuItem>
          </MenuSubPopup>
        </MenuSub>
      </MenuPopup>
    </Menu>
  );
}

With Shortcut

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuShortcut,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuShortcut_() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>Open</MenuTrigger>
      <MenuPopup>
        <MenuItem>
          New Tab
          <MenuShortcut>⌘T</MenuShortcut>
        </MenuItem>
        <MenuItem>
          New Window
          <MenuShortcut>⌘N</MenuShortcut>
        </MenuItem>
        <MenuItem>
          Close Tab
          <MenuShortcut>⌘W</MenuShortcut>
        </MenuItem>
      </MenuPopup>
    </Menu>
  );
}

With Icon

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuTrigger,
} from "@/components/ui/menu";
import { UserIcon, CreditCardIcon, SettingsIcon } from "lucide-react";

export default function MenuIcon() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>Open</MenuTrigger>
      <MenuPopup>
        <MenuItem>
          <UserIcon />
          Profile
        </MenuItem>
        <MenuItem>
          <CreditCardIcon />
          Billing
        </MenuItem>
        <MenuItem>
          <SettingsIcon />
          Settings
        </MenuItem>
      </MenuPopup>
    </Menu>
  );
}

With Checkbox

Loading...
"use client";

import * as React from "react";
import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuCheckboxItem,
  MenuPopup,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuCheckbox() {
  const [showStatusBar, setShowStatusBar] = React.useState(true);
  const [showActivityBar, setShowActivityBar] = React.useState(false);
  const [showPanel, setShowPanel] = React.useState(false);

  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>
        View
      </MenuTrigger>
      <MenuPopup>
        <MenuCheckboxItem
          checked={showStatusBar}
          onCheckedChange={setShowStatusBar}
        >
          Status Bar
        </MenuCheckboxItem>
        <MenuCheckboxItem
          checked={showActivityBar}
          onCheckedChange={setShowActivityBar}
        >
          Activity Bar
        </MenuCheckboxItem>
        <MenuCheckboxItem
          checked={showPanel}
          onCheckedChange={setShowPanel}
        >
          Panel
        </MenuCheckboxItem>
      </MenuPopup>
    </Menu>
  );
}

With Radio Group

Loading...
"use client";

import * as React from "react";
import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuRadioGroup,
  MenuRadioItem,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuRadio() {
  const [position, setPosition] = React.useState("bottom");

  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>
        Panel Position
      </MenuTrigger>
      <MenuPopup>
        <MenuRadioGroup value={position} onValueChange={setPosition}>
          <MenuRadioItem value="top">Top</MenuRadioItem>
          <MenuRadioItem value="bottom">Bottom</MenuRadioItem>
          <MenuRadioItem value="right">Right</MenuRadioItem>
        </MenuRadioGroup>
      </MenuPopup>
    </Menu>
  );
}

Destructive

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuItem,
  MenuSeparator,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuDestructive() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>Open</MenuTrigger>
      <MenuPopup>
        <MenuItem>Rename</MenuItem>
        <MenuItem>Duplicate</MenuItem>
        <MenuSeparator />
        <MenuItem variant="destructive">Delete</MenuItem>
      </MenuPopup>
    </Menu>
  );
}

Groups

Loading...
"use client";

import { Button } from "@/components/ui/button";
import {
  Menu,
  MenuPopup,
  MenuGroup,
  MenuItem,
  MenuLabel,
  MenuSeparator,
  MenuTrigger,
} from "@/components/ui/menu";

export default function MenuGroups() {
  return (
    <Menu>
      <MenuTrigger render={<Button variant="outline" />}>My Account</MenuTrigger>
      <MenuPopup>
        <MenuGroup>
          <MenuLabel>Personal</MenuLabel>
          <MenuItem>Profile</MenuItem>
          <MenuItem>Settings</MenuItem>
        </MenuGroup>
        <MenuSeparator />
        <MenuGroup>
          <MenuLabel>Team</MenuLabel>
          <MenuItem>Members</MenuItem>
          <MenuItem>Billing</MenuItem>
        </MenuGroup>
      </MenuPopup>
    </Menu>
  );
}