Skip to content
Harness Design System Harness Design System Harness Design System

DropdownMenu

beta

The DropdownMenu component provides a way to create customizable dropdown menus. It can render submenus and show item various indicators.

It can be composed with several subcomponents such as DropdownMenu.Root, DropdownMenu.Trigger, DropdownMenu.Content, DropdownMenu.Header, DropdownMenu.Footer, DropdownMenu.Separator, DropdownMenu.Group and DropdownMenu.Item to offer a structured and customizable interface.

DropdownMenu.Item has such variations as AvatarItem, LogoItem, IconItem, IndicatorItem, CheckboxItem, and RadioItem to provide different types of items for different use cases.

Usage

import { DropdownMenu } from "@harnessio/ui/components";
//...
return (
<DropdownMenu.Root>
<DropdownMenu.Trigger aria-label="options menu">
<IconV2 name="more-horizontal" />
</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item onSelect={onEdit}>Edit</DropdownMenu.Item>
<DropdownMenu.Item onSelect={onDelete}>Delete</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
)

Anatomy

All parts of the DropdownMenu component can be imported and composed as required.

<DropdownMenu.Root>
<DropdownMenu.Trigger />
<DropdownMenu.Content>
<DropdownMenu.Item />
<DropdownMenu.Group>
<DropdownMenu.Item />
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.RadioGroup>
<DropdownMenu.RadioItem />
</DropdownMenu.RadioGroup>
<DropdownMenu.Item>
<DropdownMenu.AvatarItem />
<DropdownMenu.LogoItem />
<DropdownMenu.IconItem />
<DropdownMenu.IndicatorItem />
<DropdownMenu.CheckboxItem />
<DropdownMenu.RadioItem />
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>

Grouped items

The DropdownMenu component supports grouping items together using the DropdownMenu.Group component. This allows you to create a structured menu with labeled sections.

The DropdownMenu component supports subitems using the DropdownMenu.Item component. This allows you to create items that can have their own nested items, effectively creating a submenu.

The DropdownMenu component supports header and footer sections using the DropdownMenu.Header and DropdownMenu.Footer components. This allows you to add additional content at the top or bottom of the dropdown menu.

Checkbox items

The DropdownMenu component supports checkbox items using the DropdownMenu.CheckboxItem component. This allows you to create items with checkboxes that can be checked or unchecked.

Radio items

The DropdownMenu component supports radio items using the DropdownMenu.RadioItem component. This allows you to create items with radio buttons that can be selected.

Avatar items

The DropdownMenu component supports avatar items using the DropdownMenu.AvatarItem component. This allows you to create items with avatars that can be used to represent users or other entities.

Logo items

The DropdownMenu component supports logo items using the DropdownMenu.LogoItem component. This allows you to create items with logos that can be used to represent brands or services.

Icon items

The DropdownMenu component supports icon items using the DropdownMenu.IconItem component. This allows you to create items with icons that can be used to represent actions or statuses.

Indicator items

The DropdownMenu component supports indicator items using the DropdownMenu.IndicatorItem component. This allows you to create items with indicators that can be used to make color pickers or other visual indicators.

Spinner

The DropdownMenu component supports loading states using the DropdownMenu.Spinner component. This is useful when the dropdown content is being loaded asynchronously.

No Options

The DropdownMenu component supports empty states using the DropdownMenu.NoOptions component. This is useful when there are no items to display in the dropdown menu.

Slot

The DropdownMenu.Slot component provides a simple wrapper for custom content within the dropdown menu. This is useful for adding custom components or layouts that don’t fit the standard item patterns.

API Reference

Root

The Root component serves as the main container for all dropdown menu elements. It requires both a Trigger and Content as children. It can be used in either a controlled or uncontrolled manner. When used in a controlled manner, you must pass in the open and onOpenChange props. When used in an uncontrolled manner, the open state is stored internally.

<DropdownMenu.Root
open // [OPTIONAL] controlled open state
onOpenChange={onChange} // [OPTIONAL] event handler called when the open state changes
defaultOpen // [OPTIONAL] default open state
modal // [OPTIONAL] when set to true, interaction with outside elements
// will be disabled and only menu content will be
// visible to screen readers.
dir // [OPTIONAL] reading direction of the dropdown
>
{/* Trigger and Content */}
</DropdownMenu.Root>
Prop
Required
Default
Type
openfalsefalseboolean
onOpenChangefalse(open: boolean) => void
defaultOpenfalsefalseboolean
modalfalsetrueboolean
dirfalse'ltr' | 'rtl'
childrentrueReactNode

Trigger

The Trigger component represents the button that triggers the dropdown menu.

<DropdownMenu.Trigger
className="my-class" // [OPTIONAL] custom class
asChild // [OPTIONAL] render the trigger as the child
disabled // [OPTIONAL] disable the trigger
>
{/* Trigger content */}
</DropdownMenu.Trigger>
Prop
Required
Default
Type
classNamefalsestring
asChildfalsefalseboolean
disabledfalsefalseboolean
childrentrueReactNode

Content

The Content component represents the dropdown menu content.

<DropdownMenu.Content
className="my-class" // [OPTIONAL] custom class
sideOffset={4} // [OPTIONAL] offset from the trigger
align="start" // [OPTIONAL] alignment relative to trigger
alignOffset={0} // [OPTIONAL] offset from align
side="bottom" // [OPTIONAL] preferred side of the trigger
>
{/* Item, Group, Separator, RadioGroup, Header, Footer */}
</DropdownMenu.Content>
Prop
Required
Default
Type
classNamefalsestring
sideOffsetfalse4number
alignfalse'center''start' | 'center' | 'end'
alignOffsetfalse0number
sidefalse'bottom''top' | 'right' | 'bottom' | 'left'
childrentrueReactNode

Item

The Item component represents a dropdown menu item.

<DropdownMenu.Item
title="Item title" // title of the item
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
prefix={<IconV2 />} // [OPTIONAL] prefix element (icon, avatar, etc.)
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
onSelect={onSelect} // [OPTIONAL] event handler called when the item is selected
textValue="text" // [OPTIONAL] text value for typeahead
asChild // [OPTIONAL] render the item as the child
>
{/* Optional nested items for submenu */}
</DropdownMenu.Item>
Prop
Required
Default
Type
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
prefixfalseReactNode
classNamefalsestring
disabledfalsefalseboolean
onSelectfalse(event: Event) => void
textValuefalsestring
asChildfalsefalseboolean
childrenfalseReactNode

Separator

The Separator component represents a visual divider between menu items.

<DropdownMenu.Separator
className="my-class" // [OPTIONAL] custom class
/>
Prop
Required
Default
Type
classNamefalsestring

Group

The Group component represents a labeled group of menu items.

<DropdownMenu.Group
label="Group label" // [OPTIONAL] label for the group
className="my-class" // [OPTIONAL] custom class
>
{/* Group items */}
</DropdownMenu.Group>
Prop
Required
Default
Type
labelfalsestring
classNamefalsestring
childrentrueReactNode

The Header component represents a header section with a separator.

<DropdownMenu.Header
className="my-class" // [OPTIONAL] custom class
>
{/* Header content */}
</DropdownMenu.Header>
Prop
Required
Default
Type
classNamefalsestring
childrentrueReactNode

The Footer component represents a footer section with a separator.

<DropdownMenu.Footer
className="my-class" // [OPTIONAL] custom class
>
{/* Footer content */}
</DropdownMenu.Footer>
Prop
Required
Default
Type
classNamefalsestring
childrentrueReactNode

CheckboxItem

The CheckboxItem component displays a checkbox next to the item. When the user interacts with the checkbox, the onCheckedChange prop is called. Setting the checked prop will set whether the checkbox is checked.

<DropdownMenu.CheckboxItem
title="Item title" // title of the item
checked // [OPTIONAL] whether the checkbox is checked
onCheckedChange={onChange} // [OPTIONAL] callback when checked state changes
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
>
{/* Optional nested items for submenu */}
</DropdownMenu.CheckboxItem>
Prop
Required
Default
Type
titletrueReactNode
checkedfalsefalseboolean | 'indeterminate'
onCheckedChangefalse(checked: boolean) => void
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean
childrenfalseReactNode

RadioGroup

The RadioGroup component groups together RadioItem components and controls the selected radio item.

<DropdownMenu.RadioGroup
value // [OPTIONAL] the selected radio item
onValueChange={onChange} // [OPTIONAL] callback when selection changes
label="Group label" // [OPTIONAL] label for the group
className="my-class" // [OPTIONAL] custom class
>
{/* RadioItem components */}
</DropdownMenu.RadioGroup>
Prop
Required
Default
Type
valuefalsestring
onValueChangefalse(value: string) => void
labelfalsestring
classNamefalsestring
childrentrueReactNode

RadioItem

The RadioItem component displays a radio button next to the item. When the user interacts with the radio button, the the onValueChange prop of the parent RadioGroup component is called with the value from the clicked RadioItem.

<DropdownMenu.RadioGroup
value={currentItem}
onValueChange={setCurrentItem}
>
<DropdownMenu.RadioItem
value="item-1" // value of the item
title="Item title" // title of the item
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
>
{/* Item content */}
</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
Prop
Required
Default
Type
valuetruestring
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean

AvatarItem

The AvatarItem component is a specialized item that displays an avatar.

<DropdownMenu.AvatarItem
src="/avatar.png" // avatar image source
title="Item title" // title of the item
rounded // [OPTIONAL] rounded avatar
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
onSelect={onSelect} // [OPTIONAL] event handler
>
{/* Optional nested items for submenu */}
</DropdownMenu.AvatarItem>
Prop
Required
Default
Type
srcfalsestring
roundedfalsetrueboolean
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean
onSelectfalse(event: Event) => void
childrenfalseReactNode

LogoItem

The LogoItem component is a specialized item that displays a logo.

<DropdownMenu.LogoItem
logo="gitlab" // logo name
title="Item title" // title of the item
original // [OPTIONAL] use original logo colors
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
onSelect={onSelect} // [OPTIONAL] event handler
>
{/* Optional nested items for submenu */}
</DropdownMenu.LogoItem>
Prop
Required
Default
Type
logotruestring
originalfalsefalseboolean
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean
onSelectfalse(event: Event) => void
childrenfalseReactNode

IconItem

The IconItem component is a specialized item that displays an icon.

<DropdownMenu.IconItem
icon="git-pull-request-closed" // icon name
title="Item title" // title of the item
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
onSelect={onSelect} // [OPTIONAL] event handler
>
{/* Optional nested items for submenu */}
</DropdownMenu.IconItem>
Prop
Required
Default
Type
icontruestring
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean
onSelectfalse(event: Event) => void
childrenfalseReactNode

IndicatorItem

The IndicatorItem component is a specialized item that displays a color indicator.

<DropdownMenu.IndicatorItem
color="green" // indicator color
title="Item title" // title of the item
pulse // [OPTIONAL] animate the indicator
description="Description" // [OPTIONAL] description text
label="Label" // [OPTIONAL] right-aligned label
shortcut="⌘K" // [OPTIONAL] keyboard shortcut
checkmark // [OPTIONAL] show checkmark icon
className="my-class" // [OPTIONAL] custom class
disabled // [OPTIONAL] disable the item
onSelect={onSelect} // [OPTIONAL] event handler
>
{/* Optional nested items for submenu */}
</DropdownMenu.IndicatorItem>
Prop
Required
Default
Type
colortrue'gray' | 'green' | 'red' | 'yellow' | 'blue' | 'purple' | 'brown' | 'cyan' | 'indigo' | 'lime' | 'mint' | 'orange' | 'pink' | 'violet'
pulsefalsefalseboolean
titletrueReactNode
descriptionfalsestring
labelfalsestring
shortcutfalsestring
checkmarkfalsefalseboolean
classNamefalsestring
disabledfalsefalseboolean
onSelectfalse(event: Event) => void
childrenfalseReactNode

Spinner

The Spinner component displays a loading indicator within the dropdown menu.

<DropdownMenu.Spinner
className="my-class" // [OPTIONAL] custom class
>
{/* Optional children content */}
</DropdownMenu.Spinner>
Prop
Required
Default
Type
classNamefalsestring
childrenfalseReactNode

NoOptions

The NoOptions component displays a message when there are no menu items available.

<DropdownMenu.NoOptions
className="my-class" // [OPTIONAL] custom class
>
{/* Custom message - defaults to "No options available" */}
</DropdownMenu.NoOptions>
Prop
Required
Default
Type
classNamefalsestring
childrenfalse"No options available"ReactNode

Slot

The Slot component provides a flexible container for custom content within the dropdown menu.

<DropdownMenu.Slot
className="my-class" // [OPTIONAL] custom class
>
{/* Custom content */}
</DropdownMenu.Slot>
Prop
Required
Default
Type
classNamefalsestring
childrenfalseReactNode