> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# DropdownMenu

> A menu anchored to a trigger, built from DropdownMenuTrigger, DropdownMenuContent and its item, checkbox, radio, group, label and separator parts.

```tsx theme={null}
import {
  DropdownMenu,
  DropdownMenuCheckboxItem,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuHeader,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@fanvue/ui";
import type {
  DropdownMenuCheckboxItemProps,
  DropdownMenuContentProps,
  DropdownMenuGroupProps,
  DropdownMenuHeaderProps,
  DropdownMenuHeaderSearchProps,
  DropdownMenuHeaderSize,
  DropdownMenuHeaderType,
  DropdownMenuItemProps,
  DropdownMenuItemSize,
  DropdownMenuLabelPosition,
  DropdownMenuLabelProps,
  DropdownMenuProps,
  DropdownMenuRadioGroupProps,
  DropdownMenuRadioItemProps,
  DropdownMenuRadioItemSize,
  DropdownMenuSeparatorProps,
  DropdownMenuTriggerProps,
} from "@fanvue/ui";
```

## Examples

## Default

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-dropdownmenu--default&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="DropdownMenu — Default" />
</Frame>

```tsx theme={null}
import {
  Button,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@fanvue/ui";

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem>Option 1</DropdownMenuItem>
    <DropdownMenuItem>Option 2</DropdownMenuItem>
    <DropdownMenuItem>Option 3</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>
```

## As Child Link

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-dropdownmenu--as-child-link&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="DropdownMenu — As Child Link" />
</Frame>

```tsx theme={null}
import {
  Button,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@fanvue/ui";

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem asChild>
      <a href="#settings">Settings</a>
    </DropdownMenuItem>
    <DropdownMenuItem asChild>
      <a href="#profile">Profile</a>
    </DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>
```

## With Icons

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-dropdownmenu--with-icons&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="DropdownMenu — With Icons" />
</Frame>

```tsx theme={null}
import {
  Button,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
  EditIcon,
  StarIcon,
} from "@fanvue/ui";

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem leadingIcon={<EditIcon />}>Edit</DropdownMenuItem>
    <DropdownMenuItem leadingIcon={<StarIcon />}>Favourite</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>
```

## Size Matrix

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-dropdownmenu--size-matrix&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="480" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="DropdownMenu — Size Matrix" />
</Frame>

```tsx theme={null}
import {
  Button,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuTrigger,
} from "@fanvue/ui";

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent className="w-72">
    <DropdownMenuLabel position="top">Size 40</DropdownMenuLabel>
    <DropdownMenuItem size="40">Default</DropdownMenuItem>
    <DropdownMenuItem size="40" selected>
      Selected
    </DropdownMenuItem>
    <DropdownMenuItem size="40" disabled>
      Disabled
    </DropdownMenuItem>
    <DropdownMenuItem size="40" destructive>
      Error
    </DropdownMenuItem>
    <DropdownMenuLabel>Size 32</DropdownMenuLabel>
    <DropdownMenuItem size="32">Default</DropdownMenuItem>
    <DropdownMenuItem size="32" selected>
      Selected
    </DropdownMenuItem>
    <DropdownMenuItem size="32" disabled>
      Disabled
    </DropdownMenuItem>
    <DropdownMenuItem size="32" destructive>
      Error
    </DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>
```

## Feature Items

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-dropdownmenu--feature-items&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="360" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="DropdownMenu — Feature Items" />
</Frame>

```tsx theme={null}
import {
  Avatar,
  Button,
  ChevronRightIcon,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
  EditIcon,
  StarIcon,
} from "@fanvue/ui";

<DropdownMenu>
  <DropdownMenuTrigger asChild>
    <Button>Open Menu</Button>
  </DropdownMenuTrigger>
  <DropdownMenuContent className="w-80">
    <DropdownMenuItem
      avatar={<Avatar size={24} fallback="JD" />}
      trailingIcon={<ChevronRightIcon />}
    >
      Jane Doe
    </DropdownMenuItem>
    <DropdownMenuItem
      avatar={<Avatar size={24} fallback="AS" />}
      description="Product designer"
      count="12"
    >
      Alex Smith
    </DropdownMenuItem>
    <DropdownMenuItem leadingIcon={<StarIcon />} count="99+">
      Favourites
    </DropdownMenuItem>
    <DropdownMenuItem leadingIcon={<EditIcon />} description="Update your details">
      Edit profile
    </DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>
```

## Props

## DropdownMenu

Root component that manages open/close state for a dropdown menu.

<ParamField path="variant" type="&#x22;menu&#x22; | &#x22;sheet&#x22;" default="menu">
  How the menu presents its content.
</ParamField>

## DropdownMenuCheckboxItem

A single multi-select choice within a dropdown menu. Shows a square indicator that fills when checked, an optional leading avatar, and an optional helper line underneath the title.

Pair with `DropdownMenuHeader` at `type="search"` for filterable menus. Use `DropdownMenuRadioItem` instead when only one option may be active.

<ParamField path="asChild" type="boolean" />

<ParamField path="avatar" type="ReactNode">
  Leading avatar rendered between the checkbox and the title. Render at 32px to match the design.
</ParamField>

<ParamField path="helper" type="string">
  Optional secondary text shown below the title.
</ParamField>

## DropdownMenuContent

The positioned content panel rendered inside a portal.

Override the portal z-index per-instance via `style={{ zIndex: 1500 }}` or globally with the `--fanvue-ui-portal-z-index` CSS custom property.

<ParamField path="asChild" type="boolean" />

## DropdownMenuGroup

Groups related menu items. Accepts an optional `DropdownMenuLabel`.

Requires Radix menu context — not supported inside a `variant="sheet"` menu.

A direct re-export of the Radix `DropdownMenuPrimitive.Group` primitive. It accepts all of that primitive's props, unchanged.

## DropdownMenuHeader

Optional header rendered at the top of a `DropdownMenuContent`. Use `type="default"` to title the menu, or `type="search"` to embed a search input for filtering long lists.

Renders an inset separator beneath the row so it slots cleanly above the first group of items.

<ParamField path="closeLabel" type="string" default="Close menu">
  Accessible label for the close button.
</ParamField>

<ParamField path="onClose" type="(() => void)">
  Fires when the close icon button is activated.
</ParamField>

<ParamField path="searchProps" type="DropdownMenuHeaderSearchProps">
  Configuration for the embedded search input when `type="search"`.
</ParamField>

<ParamField path="showClose" type="boolean" default="true">
  Whether to render the close icon button on the right.
</ParamField>

<ParamField path="size" type="&#x22;32&#x22; | &#x22;40&#x22;" default="40">
  Height preset for the header row.
</ParamField>

<ParamField path="title" type="string">
  Title text shown when `type="default"`. Ignored if `children` is provided.
</ParamField>

<ParamField path="type" type="&#x22;search&#x22; | &#x22;default&#x22;" default="default">
  Visual type. `"default"` shows a title; `"search"` shows a search input.
</ParamField>

## DropdownMenuItem

An individual item within a `DropdownMenuContent`.

<ParamField path="asChild" type="boolean" />

<ParamField path="avatar" type="ReactNode">
  Leading avatar rendered in place of `DropdownMenuItemProps.leadingIcon`, for rows that represent a person or account. Pass an `Avatar` sized to `24`. Takes precedence over `leadingIcon`.
</ParamField>

<ParamField path="count" type="ReactNode">
  Trailing count or number (e.g. an unread total) rendered before `DropdownMenuItemProps.trailingIcon`.
</ParamField>

<ParamField path="description" type="ReactNode">
  Optional secondary text rendered on a second line below the label. When provided, the row switches to a two-line layout and the leading/trailing icons align to the title line (top) rather than the row's vertical centre.
</ParamField>

<ParamField path="destructive" type="boolean" default="false">
  Applies the destructive (error) treatment. Use for irreversible actions.
</ParamField>

<ParamField path="leadingIcon" type="ReactNode">
  Icon (or other node) rendered before the label. Ignored when `DropdownMenuItemProps.avatar` is set.
</ParamField>

<ParamField path="selected" type="boolean" default="false">
  Marks the item as the current selection in a single-select menu.
</ParamField>

<ParamField path="size" type="&#x22;32&#x22; | &#x22;40&#x22; | &#x22;md&#x22; | &#x22;sm&#x22;" default="40">
  Height of the menu item row.
</ParamField>

<ParamField path="trailingIcon" type="ReactNode">
  Icon (or other node) rendered after the label. When `DropdownMenuItemProps.selected` is true and no `trailingIcon` is given, the built-in selected check indicator renders in this slot instead — pass a `trailingIcon` to use a custom selected indicator (e.g. a themed tick) rather than the default one.
</ParamField>

## DropdownMenuLabel

A non-interactive label that groups related items within a menu.

<ParamField path="asChild" type="boolean" />

<ParamField path="position" type="&#x22;default&#x22; | &#x22;top&#x22;" default="default">
  Vertical placement within the surrounding group. `"top"` is used for the first label directly under a header; `"default"` adds extra top padding to separate it from preceding items.
</ParamField>

## DropdownMenuRadioGroup

Groups `DropdownMenuRadioItem` children so they behave as a single-select set. Controlled via `value`/`onValueChange`.

A direct re-export of the Radix `DropdownMenuPrimitive.RadioGroup` primitive. It accepts all of that primitive's props, unchanged.

## DropdownMenuRadioItem

A single radio-style choice within a `DropdownMenuRadioGroup`. Shows a circular indicator that fills when selected, plus an optional helper line underneath the title.

<ParamField path="asChild" type="boolean" />

<ParamField path="helper" type="string">
  Optional secondary text shown below the title.
</ParamField>

<ParamField path="size" type="&#x22;40&#x22;" default="40">
  Height of the item row.
</ParamField>

## DropdownMenuSeparator

Visual separator between groups of items.

<ParamField path="asChild" type="boolean" />

## DropdownMenuTrigger

The element that toggles the dropdown menu when clicked.

On touch devices, the menu only opens if the press-and-release stays within a small movement threshold. A drag that incidentally ends over the trigger (common when scrolling a feed on Android Chrome) is ignored. Mouse and keyboard interactions are unchanged.

<ParamField path="asChild" type="boolean" />

## Exported types

Also exported from `@fanvue/ui`: `DropdownMenuCheckboxItemProps`, `DropdownMenuContentProps`, `DropdownMenuGroupProps`, `DropdownMenuHeaderProps`, `DropdownMenuHeaderSearchProps`, `DropdownMenuHeaderSize`, `DropdownMenuHeaderType`, `DropdownMenuItemProps`, `DropdownMenuItemSize`, `DropdownMenuLabelPosition`, `DropdownMenuLabelProps`, `DropdownMenuProps`, `DropdownMenuRadioGroupProps`, `DropdownMenuRadioItemProps`, `DropdownMenuRadioItemSize`, `DropdownMenuSeparatorProps`, `DropdownMenuTriggerProps`.

***

**Setup:** [Installation](/docs/ui/installation) · [Theming](/docs/ui/theming)
