Dropdown Menu

A menu that opens from a trigger with a list of options

A dropdown menu component built with Ark UI. Use the convenience API with trigger and items for simple menus, or the compound API for custom layout, groups, and separators.

import { DropdownMenu } from "@/components/ui/dropdown-menu";

const items = [
  { value: "profile", label: "Profile" },
  { value: "settings", label: "Settings" },
  { value: "logout", label: "Log out" },
];

export default function Example() {
  return <DropdownMenu trigger="Options" items={items} />;
}

Installation

bash
liminal add dropdown-menu

Usage

Pass trigger (button content or element) and items (array of { value, label, disabled? }). Use onSelect to handle item selection.

<DropdownMenu
  trigger="Options"
  items={[
    { value: "a", label: "Option A" },
    { value: "b", label: "Option B" },
  ]}
  onSelect={({ value }) => console.log(value)}
/>

Examples

Convenience API

import { DropdownMenu } from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";

<DropdownMenu
  trigger={<Button variant="outline">Open menu</Button>}
  items={[
    { value: "edit", label: "Edit" },
    { value: "duplicate", label: "Duplicate" },
    { value: "delete", label: "Delete", disabled: true },
  ]}
/>

Compound API

Use MenuRoot, MenuTrigger, MenuContent, MenuItem, MenuItemText, and optionally MenuItemGroup, MenuItemGroupLabel, and MenuSeparator for full control.

tsx
import {
  MenuRoot,
  MenuTrigger,
  MenuContent,
  MenuItemGroup,
  MenuItem,
  MenuItemText,
  MenuSeparator,
} from "@/components/ui/dropdown-menu";
import { Button } from "@/components/ui/button";

export default function Example() {
  return (
    <MenuRoot>
      <MenuTrigger asChild>
        <Button variant="outline">Actions</Button>
      </MenuTrigger>
      <MenuContent>
        <MenuItemGroup>
          <MenuItem value="new">New file</MenuItem>
          <MenuItem value="open">Open</MenuItem>
        </MenuItemGroup>
        <MenuSeparator />
        <MenuItemGroup>
          <MenuItem value="logout">Log out</MenuItem>
        </MenuItemGroup>
      </MenuContent>
    </MenuRoot>
  );
}

API

PropTypeDefaultDescription
triggerReact.ReactNode-Content or element that opens the menu (convenience API).
items{ value: string; label: React.ReactNode; disabled?: boolean }[]-Menu options (convenience API).
onSelect(details: { value: string }) => void-Callback when an item is selected.
openbooleanuncontrolledControlled open state (MenuRoot).
onOpenChange(details) => void-Callback when open state changes (MenuRoot).