GitHub

Dropdown Menu

Compact action menu for grouped commands, secondary controls, and contextual operations that should stay close to their trigger.

AccessibleDark ModeAnimatedKeyboard Nav

Install

$npx react-principles add dropdown-menu
02

Code Snippet

src/ui/DropdownMenu.tsx
import { DropdownMenu } from "@/ui/DropdownMenu";

<DropdownMenu>
  <DropdownMenu.Trigger>Open menu</DropdownMenu.Trigger>
  <DropdownMenu.Content>
    <DropdownMenu.Label>Actions</DropdownMenu.Label>
    <DropdownMenu.Item onSelect={() => console.log("Rename")}>Rename</DropdownMenu.Item>
    <DropdownMenu.Item inset onSelect={() => console.log("Duplicate")}>Duplicate</DropdownMenu.Item>
  </DropdownMenu.Content>
</DropdownMenu>
03

Copy-Paste (Single File)

DropdownMenu.tsx
import { createContext, useContext, useEffect, useRef, useState, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from "react";
import { cn } from "@/lib/utils";

export interface DropdownMenuProps {
  open?: boolean;
  defaultOpen?: boolean;
  onOpenChange?: (open: boolean) => void;
  children: ReactNode;
  className?: string;
}
04

Props

PropTypeDefaultDescription
openbooleanControlled open state for the menu.
defaultOpenbooleanfalseInitial open state for uncontrolled usage.
onOpenChange(open: boolean) => voidCalled whenever the menu opens or closes.
classNamestringAdditional classes applied to the root wrapper.
DropdownMenu.TriggerButtonHTMLAttributes<HTMLButtonElement>Button that toggles the menu.
DropdownMenu.ContentHTMLAttributes<HTMLDivElement>Floating content surface that contains labels, items, and separators.
DropdownMenu.Item.insetbooleanfalseAdds extra left padding for nested or secondary items.
DropdownMenu.Item.onSelect() => voidConvenience callback invoked before the menu closes.
DropdownMenu.LabelHTMLAttributes<HTMLDivElement>Section label for grouped menu items.
DropdownMenu.SeparatorHTMLAttributes<HTMLDivElement>Visual divider between menu sections.
react-principles