✨ Working with PDFs, images or videos? Discover 145+ free web apps built for everyday tasks

Dropdown Menu

A compound dropdown menu primitive built on Base UI Menu. Supports grouped sections with labels, nested submenus, checkbox items for multi-select, radio groups for single-choice, destructive items, keyboard shortcuts, and origin-aware open/close motion.

Loading preview...

Examples

Practical examples and common states for the same installable component.

Grouped

Organizes related menu actions into labeled sections with separators.

examples/dropdown-menu-grouped.tsx
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/wensity/dropdown-menu";
import { IconClipboard, IconCopy, IconFileText, IconFolder } from "@tabler/icons-react";
export function GroupedDropdown() {
return (
<DropdownMenu>
<DropdownMenuTrigger>Edit</DropdownMenuTrigger>
<DropdownMenuContent className="w-52">
<DropdownMenuLabel>Clipboard</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
<IconCopy />
Copy
<DropdownMenuShortcut keys={["⌘", "C"]} />
</DropdownMenuItem>
<DropdownMenuItem>
<IconClipboard />
Paste
<DropdownMenuShortcut keys={["⌘", "V"]} />
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuLabel>File</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
<IconFileText />
New file
</DropdownMenuItem>
<DropdownMenuItem>
<IconFolder />
New folder
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}

Nested

Displays additional actions through submenus with chevron indicators.

examples/dropdown-menu-nested.tsx
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@/components/wensity/dropdown-menu";
import { IconCloudDownload, IconDownload, IconFileExport, IconLink, IconMail } from "@tabler/icons-react";
export function NestedDropdown() {
return (
<DropdownMenu>
<DropdownMenuTrigger>Share</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuItem>
<IconLink />
Copy link
</DropdownMenuItem>
<DropdownMenuItem>
<IconMail />
Email
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<IconDownload />
Export as
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>
<IconFileExport />
PDF
</DropdownMenuItem>
<DropdownMenuItem>
<IconFileExport />
CSV
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<IconCloudDownload />
Archive (.zip)
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
</DropdownMenuContent>
</DropdownMenu>
);
}

Checkbox

Toggle multiple selectable options with check indicators.

examples/dropdown-menu-checkbox.tsx
"use client";
import * as React from "react";
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/wensity/dropdown-menu";
import { IconSettings } from "@tabler/icons-react";
export function CheckboxDropdown() {
const [showGrid, setShowGrid] = React.useState(true);
const [showRuler, setShowRuler] = React.useState(false);
return (
<DropdownMenu>
<DropdownMenuTrigger>
<IconSettings />
View
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuLabel>Canvas</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={showGrid}
onCheckedChange={setShowGrid}
>
Show grid
<DropdownMenuShortcut keys={["⌘", "'"]} />
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showRuler}
onCheckedChange={setShowRuler}
>
Show ruler
<DropdownMenuShortcut keys={["⌘", "R"]} />
</DropdownMenuCheckboxItem>
<DropdownMenuSeparator />
<DropdownMenuCheckboxItem checked disabled>
Snap to grid
</DropdownMenuCheckboxItem>
</DropdownMenuContent>
</DropdownMenu>
);
}

Radio

Select one option from a group with dot indicators.

examples/dropdown-menu-radio.tsx
"use client";
import * as React from "react";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/wensity/dropdown-menu";
import { IconSettings, IconWifi, IconWifiOff } from "@tabler/icons-react";
export function RadioDropdown() {
const [density, setDensity] = React.useState("comfortable");
return (
<DropdownMenu>
<DropdownMenuTrigger>
<IconSettings />
Density
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuLabel>Row height</DropdownMenuLabel>
<DropdownMenuRadioGroup value={density} onValueChange={setDensity}>
<DropdownMenuRadioItem value="compact">Compact</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="comfortable">Comfortable</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="spacious">Spacious</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
<DropdownMenuSeparator />
<DropdownMenuLabel>Status</DropdownMenuLabel>
<DropdownMenuRadioGroup value="online">
<DropdownMenuRadioItem value="online">
<IconWifi className="text-emerald-500" />
Online
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="offline" disabled>
<IconWifiOff />
Offline
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}

Destructive

Highlights dangerous or irreversible actions with red styling.

examples/dropdown-menu-destructive.tsx
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/wensity/dropdown-menu";
import { IconArrowBigUp, IconCopy, IconPencil, IconTrash } from "@tabler/icons-react";
export function DestructiveDropdown() {
return (
<DropdownMenu>
<DropdownMenuTrigger>More</DropdownMenuTrigger>
<DropdownMenuContent className="w-52">
<DropdownMenuLabel>Project</DropdownMenuLabel>
<DropdownMenuItem>
<IconPencil />
Rename
</DropdownMenuItem>
<DropdownMenuItem>
<IconCopy />
Duplicate
<DropdownMenuShortcut keys={["⌘", "D"]} />
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuLabel>Danger zone</DropdownMenuLabel>
<DropdownMenuItem destructive>
<IconArrowBigUp />
Archive
</DropdownMenuItem>
<DropdownMenuItem destructive>
<IconTrash />
Delete permanently
<DropdownMenuShortcut keys={["⌘", "⌫"]} />
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}