Skip to main content
A feature-rich dropdown menu component that provides a flexible way to display actions, navigation links, or form controls in a popup panel.

Installation

npx shadcn@latest add @eo-n/dropdown-menu

Usage

Import the components you need:
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";

Basic Example

<DropdownMenu>
  <DropdownMenuTrigger>Open</DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem>Settings</DropdownMenuItem>
    <DropdownMenuItem>Account</DropdownMenuItem>
    <DropdownMenuItem>Notifications</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>

Complete Example

import { Button } from "@/components/ui/button";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuGroupLabel,
  DropdownMenuItem,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuSub,
  DropdownMenuSubTrigger,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";

export default function DropdownMenuDemo() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger render={<Button variant="outline">Menu</Button>} />
      <DropdownMenuContent className="w-52">
        <DropdownMenuGroup>
          <DropdownMenuGroupLabel>Preferences</DropdownMenuGroupLabel>
          <DropdownMenuItem>
            Dashboard
            <DropdownMenuShortcut>⌘D</DropdownMenuShortcut>
          </DropdownMenuItem>
          <DropdownMenuItem>
            Profile
            <DropdownMenuShortcut>⌘P</DropdownMenuShortcut>
          </DropdownMenuItem>
          <DropdownMenuSub>
            <DropdownMenuSubTrigger>File Actions</DropdownMenuSubTrigger>
            <DropdownMenuContent className="w-32">
              <DropdownMenuItem>Upload Files</DropdownMenuItem>
              <DropdownMenuItem>Download Files</DropdownMenuItem>
              <DropdownMenuItem>Share Files</DropdownMenuItem>
            </DropdownMenuContent>
          </DropdownMenuSub>
        </DropdownMenuGroup>
        <DropdownMenuSeparator />
        <DropdownMenuItem disabled>
          Settings
          <DropdownMenuShortcut>⌘,</DropdownMenuShortcut>
        </DropdownMenuItem>
        <DropdownMenuSeparator />
        <DropdownMenuItem variant="destructive">
          Log out
          <DropdownMenuShortcut>⌘L</DropdownMenuShortcut>
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  );
}

API Reference

The root component that manages the dropdown state. The button that triggers the dropdown menu.
render
ReactElement
Custom render function to render the trigger as a different element (like a Button).
The popup content container that appears when the trigger is activated.
sideOffset
number
default:"4"
The distance in pixels from the trigger element.
align
'start' | 'center' | 'end'
Alignment of the content relative to the trigger.
alignOffset
number
Offset along the alignment axis. Defaults to -4 when align is not ‘center’.
className
string
Additional CSS classes to apply to the content.
An individual item in the dropdown menu.
inset
boolean
Adds left padding to align with items that have icons.
variant
'default' | 'destructive'
default:"'default'"
Visual style variant. Use ‘destructive’ for dangerous actions like delete.
disabled
boolean
Disables the item, making it non-interactive.
Container for a nested sub-menu. Trigger for opening a nested sub-menu.
inset
boolean
Adds left padding to align with other items.
Groups related menu items together. Label for a group of menu items.
inset
boolean
Adds left padding to align with other items.
Visual separator between menu items or groups. Container for radio items where only one can be selected.
value
string
The currently selected value.
onValueChange
(value: string) => void
Callback when the selected value changes.
A radio item within a radio group.
value
string
required
The value of this radio item.
A checkbox item that can be toggled on/off.
checked
boolean
Whether the checkbox is checked.
onCheckedChange
(checked: boolean) => void
Callback when the checked state changes.
Displays keyboard shortcuts for menu items.
<DropdownMenuItem>
  Save <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>

Examples

With Icons

import { User, Settings, LogOut } from "lucide-react";

<DropdownMenuContent>
  <DropdownMenuItem>
    <User className="mr-2 h-4 w-4" />
    Profile
  </DropdownMenuItem>
  <DropdownMenuItem>
    <Settings className="mr-2 h-4 w-4" />
    Settings
  </DropdownMenuItem>
  <DropdownMenuSeparator />
  <DropdownMenuItem variant="destructive">
    <LogOut className="mr-2 h-4 w-4" />
    Log out
  </DropdownMenuItem>
</DropdownMenuContent>

With Checkbox Items

<DropdownMenuContent>
  <DropdownMenuCheckboxItem checked={showStatusBar}>
    Show Status Bar
  </DropdownMenuCheckboxItem>
  <DropdownMenuCheckboxItem checked={showActivityBar}>
    Show Activity Bar
  </DropdownMenuCheckboxItem>
</DropdownMenuContent>

With Radio Group

<DropdownMenuContent>
  <DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>
    <DropdownMenuRadioItem value="light">Light</DropdownMenuRadioItem>
    <DropdownMenuRadioItem value="dark">Dark</DropdownMenuRadioItem>
    <DropdownMenuRadioItem value="system">System</DropdownMenuRadioItem>
  </DropdownMenuRadioGroup>
</DropdownMenuContent>

Features

  • Flexible Positioning: Configurable alignment and offset options
  • Nested Sub-menus: Support for multi-level menu hierarchies
  • Rich Content: Support for icons, shortcuts, checkboxes, and radio items
  • Variant Styles: Built-in destructive variant for dangerous actions
  • Keyboard Navigation: Full keyboard support with arrow keys
  • Collision Detection: Automatically adjusts position to stay in viewport
  • Smooth Animations: Built-in entrance and exit animations
  • Accessible: Proper ARIA attributes and focus management

Accessibility

  • Keyboard navigation with arrow keys, Enter, and Escape
  • Focus management and focus trapping
  • Proper ARIA roles and attributes
  • Screen reader announcements for state changes
  • Disabled state support

Build docs developers (and LLMs) love