Tally UI
UI

DropdownMenu

A menu of actions or options triggered by a button press, with support for sub-menus, checkboxes, and radio groups.

Import

import {
  DropdownMenu, DropdownMenuTrigger, DropdownMenuContent,
  DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem,
  DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup,
  DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent,
  DropdownMenuRadioGroup,
} from '@tallyui/components';

Usage

<DropdownMenu>
  <DropdownMenuTrigger>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuLabel>My Account</DropdownMenuLabel>
    <DropdownMenuSeparator />
    <DropdownMenuItem>
      <Text>Profile</Text>
    </DropdownMenuItem>
    <DropdownMenuItem>
      <Text>Settings</Text>
    </DropdownMenuItem>
    <DropdownMenuSeparator />
    <DropdownMenuItem>
      <Text>Log out</Text>
    </DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>

DropdownMenu wraps the DropdownMenu primitive from @tallyui/primitives with default styling. The content renders through a portal, so you need a PortalHost in your native layout. See the DropdownMenu primitive for behavior and accessibility details.

Components

The floating panel containing menu items. Default sideOffset is 4.

Classes
z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md

A single actionable item within the menu.

Classes
relative flex cursor-default select-none flex-row items-center rounded-sm px-2 py-1.5 text-sm outline-none
Focus (web): bg-accent text-accent-foreground
PropTypeDefaultDescription
insetbooleanfalseAdds pl-8 padding to align with items that have indicators
classNamestring---Additional NativeWind classes

A menu item that toggles a checkmark.

Classes
relative flex cursor-default select-none flex-row items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none
Focus (web): bg-accent text-accent-foreground
PropTypeDefaultDescription
checkedboolean---Controlled checked state
onCheckedChange(checked: boolean) => void---Called when checked changes

A radio-style menu item, used inside DropdownMenuRadioGroup.

Classes
relative flex cursor-default select-none flex-row items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none
Focus (web): bg-accent text-accent-foreground

A non-interactive heading for a group of items.

Classes
px-2 py-1.5 text-sm font-semibold
PropTypeDefaultDescription
insetbooleanfalseAdds pl-8 left padding

A visual divider between sections.

Classes
-mx-1 my-1 h-px bg-muted

An item that opens a sub-menu on hover or press.

Classes
flex cursor-default select-none flex-row items-center rounded-sm px-2 py-1.5 text-sm outline-none
Focus (web): bg-accent

The floating panel for a nested sub-menu.

Classes
z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg

Examples

With checkbox items

const [showStatusBar, setShowStatusBar] = useState(true);
const [showPanel, setShowPanel] = useState(false);

<DropdownMenu>
  <DropdownMenuTrigger>
    <Button>View Options</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuLabel>Appearance</DropdownMenuLabel>
    <DropdownMenuSeparator />
    <DropdownMenuCheckboxItem checked={showStatusBar} onCheckedChange={setShowStatusBar}>
      <Text>Status Bar</Text>
    </DropdownMenuCheckboxItem>
    <DropdownMenuCheckboxItem checked={showPanel} onCheckedChange={setShowPanel}>
      <Text>Side Panel</Text>
    </DropdownMenuCheckboxItem>
  </DropdownMenuContent>
</DropdownMenu>

With radio group

const [sort, setSort] = useState('date');

<DropdownMenu>
  <DropdownMenuTrigger>
    <Button>Sort By</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuRadioGroup value={sort} onValueChange={setSort}>
      <DropdownMenuRadioItem value="date"><Text>Date</Text></DropdownMenuRadioItem>
      <DropdownMenuRadioItem value="name"><Text>Name</Text></DropdownMenuRadioItem>
      <DropdownMenuRadioItem value="size"><Text>Size</Text></DropdownMenuRadioItem>
    </DropdownMenuRadioGroup>
  </DropdownMenuContent>
</DropdownMenu>

With sub-menu

<DropdownMenu>
  <DropdownMenuTrigger>
    <Button>Actions</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem><Text>Cut</Text></DropdownMenuItem>
    <DropdownMenuItem><Text>Copy</Text></DropdownMenuItem>
    <DropdownMenuSub>
      <DropdownMenuSubTrigger><Text>Share</Text></DropdownMenuSubTrigger>
      <DropdownMenuSubContent>
        <DropdownMenuItem><Text>Email</Text></DropdownMenuItem>
        <DropdownMenuItem><Text>Slack</Text></DropdownMenuItem>
      </DropdownMenuSubContent>
    </DropdownMenuSub>
  </DropdownMenuContent>
</DropdownMenu>

On this page