Menu
The Menu component presents a structured list of actions, settings, or navigation targets within a transient surface. It supports icons, keyboard shortcuts, hint text, section titles, dividers, and submenu indicators.
import {Menu} from "@qualcomm-ui/react/menu"Examples
Item Customization
Compose the menu to include icons and commands.
import type {ReactElement} from "react"
import {Command, File, FileText, FolderOpen, ImageDown} from "lucide-react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Icon} from "@qualcomm-ui/react/icon"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuItemCustomizationDemo(): ReactElement {
return (
<Menu.Root>
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-text-file">
<Menu.ItemStartIcon icon={FileText} />
New Text File
<Menu.ItemCommand>
<Icon icon={Command} size="xs" />E
</Menu.ItemCommand>
</Menu.Item>
<Menu.Item value="new-file">
<Menu.ItemStartIcon icon={File} />
New File...
<Menu.ItemCommand>
<Icon icon={Command} size="xs" />N
</Menu.ItemCommand>
</Menu.Item>
<Menu.Item value="open-file">
<Menu.ItemStartIcon icon={FolderOpen} />
Open File...
<Menu.ItemCommand>
<Icon icon={Command} size="xs" />O
</Menu.ItemCommand>
<Menu.ItemDescription>Optional Description</Menu.ItemDescription>
</Menu.Item>
<Menu.Item value="export">
<Menu.ItemStartIcon icon={ImageDown} />
Export
<Menu.ItemCommand>
<Icon icon={Command} size="xs" />S
</Menu.ItemCommand>
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Menu Button
Use <Menu.Button> for a labeled trigger and <Menu.IconButton> for an icon-only trigger. Both automatically render a chevron indicator. Always provide an aria-label on <Menu.IconButton> to give assistive technologies an accessible name. Control the menu position with positioning.placement.
import type {ReactElement} from "react"
import {
Copy,
Ellipsis,
File,
FileText,
FolderOpen,
Pencil,
Trash2,
} from "lucide-react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuButtonDemo(): ReactElement {
return (
<div className="flex gap-2.5">
<Menu.Root positioning={{placement: "bottom-end"}}>
<Menu.Trigger>
<Menu.Button emphasis="primary" startIcon={File}>
File
</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-text-file">
<Menu.ItemStartIcon icon={FileText} />
New Text File
</Menu.Item>
<Menu.Item value="new-file">
<Menu.ItemStartIcon icon={File} />
New File...
</Menu.Item>
<Menu.Item value="open-file">
<Menu.ItemStartIcon icon={FolderOpen} />
Open File...
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
<Menu.Root size="sm">
<Menu.Trigger>
<Menu.IconButton
aria-label="More actions"
emphasis="primary"
icon={Ellipsis}
/>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="rename">
<Menu.ItemStartIcon icon={Pencil} />
Rename
</Menu.Item>
<Menu.Item value="duplicate">
<Menu.ItemStartIcon icon={Copy} />
Duplicate
</Menu.Item>
<Menu.Item value="delete">
<Menu.ItemStartIcon icon={Trash2} />
Delete
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
</div>
)
}Split Button
Use <Menu.SplitButton> for a split button trigger. The icon-only trigger provides a default "More options" aria-label; use triggerProps to override it. Optionally add an aria-label on the group when both halves share an accessible name. Control the menu position with positioning.placement on the parent <Menu.Root>.
import type {ReactElement} from "react"
import {Download, FileArchive, FileJson, FileText} from "lucide-react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuSplitButtonDemo(): ReactElement {
return (
<Menu.Root positioning={{placement: "bottom-end"}}>
<Menu.SplitButton
aria-label="Download"
emphasis="primary"
onClick={() => console.log("Download")}
startIcon={Download}
triggerProps={{"aria-label": "More download options"}}
>
Download
</Menu.SplitButton>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="pdf">
<Menu.ItemStartIcon icon={FileText} />
Download as PDF
</Menu.Item>
<Menu.Item value="json">
<Menu.ItemStartIcon icon={FileJson} />
Download as JSON
</Menu.Item>
<Menu.Item value="zip">
<Menu.ItemStartIcon icon={FileArchive} />
Download as ZIP
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Context Menu
Demonstrates how to trigger a menu on right-click or other context events.
import type {ReactElement} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuContextMenuDemo(): ReactElement {
return (
<Menu.Root>
<Menu.ContextTrigger className="flex h-48 w-full items-center justify-center border border-dashed">
Right click here
</Menu.ContextTrigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.ItemGroup>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.ItemGroup>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Nested Menus
Compose nested menus by nesting <Menu.Root> components inside each other.
<Menu.Root>
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Root positioning={{gutter: 2, placement: "right-start"}}>
<Menu.TriggerItem value="open-recent">
Open Recent
</Menu.TriggerItem>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="file-1">File 1</Menu.Item>
<Menu.Item value="file-2">File 2</Menu.Item>
<Menu.Item value="file-3">File 3</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
Links
Menu items can be links using polymorphic composition. Use the render prop on the <Menu.Item> to specify the element type.
<Menu.Content>
<Menu.Item
render={
<a href="https://react.dev" rel="noreferrer" target="_blank" />
}
value="react"
>
<Menu.ItemStartIcon icon={ExternalLink} />
React
</Menu.Item>
<Menu.Item
render={
<a
href="https://angular.dev"
rel="noreferrer"
target="_blank"
/>
}
value="angular"
>
<Menu.ItemStartIcon icon={ExternalLink} />
Angular
</Menu.Item>
</Menu.Content>
Groups
Use the <Menu.ItemGroup> component to group menu items.
Item Types
There are three item types, each corresponding to one of the three types of aria menu item roles:
<Menu.Item>—menuitem<Menu.RadioItem>—menuitemradio<Menu.CheckboxItem>—menuitemcheckbox
Checkbox Items
There are two appearance options:
- For a checkbox appearance, render the
<Menu.CheckboxItemControl>element as a child of the item. - Render the
<Menu.ItemIndicator />element for a simple selection indicator.
<Menu.ItemGroup>
<Menu.ItemGroupLabel>Choose an option</Menu.ItemGroupLabel>
<Menu.CheckboxItem value="item-1-1">
<Menu.CheckboxItemControl />
<Menu.ItemLabel>Option 1</Menu.ItemLabel>
</Menu.CheckboxItem>
<Menu.CheckboxItem value="item-1-2">
<Menu.CheckboxItemControl />
<Menu.ItemLabel>Option 2</Menu.ItemLabel>
</Menu.CheckboxItem>
</Menu.ItemGroup>
<Menu.ItemGroup>
<Menu.ItemGroupLabel>Choose an option</Menu.ItemGroupLabel>
<Menu.CheckboxItem value="item-2-1">
<Menu.ItemLabel>Option 1</Menu.ItemLabel>
<Menu.ItemIndicator />
</Menu.CheckboxItem>
<Menu.CheckboxItem value="item-2-2">
<Menu.ItemLabel>Option 2</Menu.ItemLabel>
<Menu.ItemIndicator />
</Menu.CheckboxItem>
</Menu.ItemGroup>
Checkbox Selection State
Illustrates how to manage and reflect the checked state of checkbox menu items.
<Menu.ItemGroup>
<Menu.ItemGroupLabel>Choose an option</Menu.ItemGroupLabel>
{items.map(({label, value}) => (
<Menu.CheckboxItem
key={value}
checked={checkboxState[value] || false}
onCheckedChange={(checked) => onChange(value, checked)}
value={value}
>
<Menu.ItemLabel>{label}</Menu.ItemLabel>
<Menu.ItemIndicator />
</Menu.CheckboxItem>
))}
</Menu.ItemGroup>
Radio Group
Demonstrates how to group radio menu items so only one can be selected at a time.
import type {ReactElement} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuRadioGroupDemo(): ReactElement {
return (
<Menu.Root>
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.RadioItemGroup>
<Menu.ItemGroupLabel>Choose an option</Menu.ItemGroupLabel>
<Menu.RadioItem value="one">
<Menu.RadioItemControl />
<Menu.ItemLabel>Option 1</Menu.ItemLabel>
</Menu.RadioItem>
<Menu.RadioItem value="two">
<Menu.RadioItemControl />
<Menu.ItemLabel>Option 2</Menu.ItemLabel>
</Menu.RadioItem>
<Menu.RadioItem value="three">
<Menu.RadioItemControl />
<Menu.ItemLabel>Option 3</Menu.ItemLabel>
</Menu.RadioItem>
</Menu.RadioItemGroup>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Controlled State
The menu's visibility can be controlled via the open, onOpenChange, and defaultOpen props.
- Use
opento explicitly set whether the menu is open (controlled mode). - Use
onOpenChangeto be notified when the menu requests to open or close. - Use
defaultOpento set the initial open state when you don't need to control it yourself (uncontrolled mode).
In controlled mode, the open prop should be updated in response to onOpenChange events to reflect the desired visibility.
import {type ReactElement, useState} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuControlledStateDemo(): ReactElement {
const [open, setOpen] = useState<boolean>(false)
return (
<Menu.Root onOpenChange={(nextState) => setOpen(nextState)} open={open}>
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="new-win">New Window</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Placement
Configure the menu's placement using the positioning.placement prop.
import type {ReactElement} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuPlacementDemo(): ReactElement {
return (
<Menu.Root positioning={{placement: "right-start"}}>
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="new-win">New Window</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Sizes
Use the size prop on <Menu.Root> to control the size of the menu. The default size is md. The demo features the small (sm) size.
The <Menu.Button> and <Menu.IconButton> triggers inherit the menu's size, so the trigger and menu match by default. Such a trigger can run larger than its menu: set size on it to override the inherited value. An md menu pairs with an md or lg trigger. A compact trigger should always pair with an sm menu. When a trigger uses density="compact", set size="sm" on <Menu.Root>.
Other trigger content does not inherit the menu size. A link, an avatar, or a custom element placed in the trigger must be sized directly.
import type {ReactElement} from "react"
import {LogOut, Settings, User} from "lucide-react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuSizesDemo(): ReactElement {
return (
<Menu.Root size="sm">
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="account">
<Menu.ItemStartIcon icon={User} />
Account
</Menu.Item>
<Menu.Item value="settings">
<Menu.ItemStartIcon icon={Settings} />
Settings
</Menu.Item>
<Menu.Item value="logout">
<Menu.ItemStartIcon icon={LogOut} />
Logout
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Anchor Point
Use the positioning.anchorPoint prop to control the anchor point of the menu.
import {type ReactElement, useRef} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuAnchorPointDemo(): ReactElement {
const ref = useRef<HTMLDivElement | null>(null)
const getAnchorRect = () => ref.current!.getBoundingClientRect()
return (
<Menu.Root positioning={{getAnchorRect}}>
<div className="flex flex-col gap-4">
<Menu.Trigger>
<Menu.Button emphasis="primary">Show Menu</Menu.Button>
</Menu.Trigger>
<div
ref={ref}
className="font-body-lg text-neutral-primary bg-neutral-04 border-neutral-01 rounded-md border p-4"
>
Anchor
</div>
</div>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="new-win">New Window</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Avatar
Here's an example that composes the Menu with the Avatar component to display a user account menu.
import type {ReactElement} from "react"
import {LogOut, Settings, User} from "lucide-react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Avatar} from "@qualcomm-ui/react/avatar"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuAvatarDemo(): ReactElement {
return (
<Menu.Root positioning={{placement: "right-start"}}>
<Menu.Trigger>
<Avatar.Root render={<button />} status="active">
<Avatar.Image alt="John Doe" src="/images/avatar-man.png" />
<Avatar.Content>JD</Avatar.Content>
<Avatar.Status />
</Avatar.Root>
</Menu.Trigger>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="account">
<Menu.ItemStartIcon icon={User} />
Account
</Menu.Item>
<Menu.Item value="settings">
<Menu.ItemStartIcon icon={Settings} />
Settings
</Menu.Item>
<Menu.Item value="logout">
<Menu.ItemStartIcon icon={LogOut} />
Logout
</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Within Dialog
When using the Menu inside a Dialog, don't render the <Menu.Positioner> within a <Portal> element.
import type {ReactElement} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Button} from "@qualcomm-ui/react/button"
import {Dialog} from "@qualcomm-ui/react/dialog"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuWithinDialogDemo(): ReactElement {
return (
<Dialog.Root>
<Dialog.Trigger>
<Button emphasis="primary" variant="fill">
Show Dialog
</Button>
</Dialog.Trigger>
<Portal>
<Dialog.Backdrop />
<Dialog.Positioner>
<Dialog.Content className="w-72">
<Dialog.Body>
<Dialog.Heading>Dialog Title</Dialog.Heading>
<Dialog.CloseButton />
<Menu.Root>
<Menu.Trigger>
<Menu.Button className="place-self-start" emphasis="primary">
Show Menu
</Menu.Button>
</Menu.Trigger>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="new-win">New Window</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Menu.Root>
</Dialog.Body>
</Dialog.Content>
</Dialog.Positioner>
</Portal>
</Dialog.Root>
)
}Hide When Detached
Use the positioning.hideWhenDetached prop to hide the menu when it's detached from the trigger.
import type {ReactElement} from "react"
import {Portal} from "@qualcomm-ui/react-core/portal"
import {Menu} from "@qualcomm-ui/react/menu"
export function MenuHideWhenDetachedDemo(): ReactElement {
return (
<Menu.Root open positioning={{hideWhenDetached: true}}>
<div className="border-neutral-03 box-border flex max-w-72 gap-2 overflow-x-scroll rounded-md border p-4">
{[...Array(6).keys()].map((x) => (
<div
key={x}
className="font-body-md text-neutral-primary border-neutral-01 bg-neutral-04 rounded-md border p-3 whitespace-nowrap"
>
Item {x}
</div>
))}
<Menu.Trigger>
<Menu.Button className="whitespace-nowrap" emphasis="primary">
Show Menu
</Menu.Button>
</Menu.Trigger>
</div>
<Portal>
<Menu.Positioner>
<Menu.Content>
<Menu.Item value="new-txt">New Text File</Menu.Item>
<Menu.Item value="new-file">New File...</Menu.Item>
<Menu.Item value="new-win">New Window</Menu.Item>
<Menu.Item value="open-file">Open File...</Menu.Item>
<Menu.Item value="export">Export</Menu.Item>
</Menu.Content>
</Menu.Positioner>
</Portal>
</Menu.Root>
)
}Explorer
Component Anatomy
Hover to highlight, click to view API
API
<Menu.Root>
{
x: number
y: number
}
booleanbooleanstringboolean'ltr' | 'rtl'
() =>
| Node
| ShadowRoot
| Document
stringstringbooleanbooleanboolean(details: {
href: string
node: HTMLAnchorElement
value: string
}) => void
(
event: KeyboardEvent,
) => void
VoidFunction(
event: FocusOutsideEvent,
) => void
(
value: string,
) => void
(
event: InteractOutsideEvent,
) => void
(
open: boolean,
) => void
(
event: PointerDownOutsideEvent,
) => void
(
event: CustomEvent<{
originalIndex: number
originalLayer: HTMLElement
targetIndex: number
targetLayer: HTMLElement
}>,
) => void
(
value: string,
) => void
booleanboolean'sm' | 'md'
booleanbooleanbooleanPositioningOptions
The positioning prop accepts an object with the following shape:
numberstring[data-menu-part=arrow]).() =>
| 'clippingAncestors'
| Element
| Array<Element>
| {
height: number
width: number
x: number
y: number
}
boolean| boolean
| Array<
| 'bottom'
| 'bottom-end'
| 'bottom-start'
| 'left'
| 'left-end'
| 'left-start'
| 'right'
| 'right-end'
| 'right-start'
| 'top'
| 'top-end'
| 'top-start'
>
(
element:
| HTMLElement
| VirtualElement,
) => {
height?: number
width?: number
x?: number
y?: number
}
numberboolean| boolean
| {
ancestorResize?: boolean
ancestorScroll?: boolean
animationFrame?: boolean
elementResize?: boolean
layoutShift?: boolean
}
{
crossAxis?: number
mainAxis?: number
}
(
data: ComputePositionReturn,
) => void
(data: {
placed: boolean
}) => void
numberboolean| 'bottom'
| 'bottom-end'
| 'bottom-start'
| 'left'
| 'left-end'
| 'left-start'
| 'right'
| 'right-end'
| 'right-start'
| 'top'
| 'top-end'
| 'top-start'
booleannumberboolean| 'absolute'
| 'fixed'
(data: {
updatePosition: () => Promise<void>
}) => void | Promise<void>
Element API
The following describes the individual subcomponents of the Menu component.
<Menu.Button>
| 'default'
| 'compact'
booleantrue, pointer/focus
events are blocked, and the component is visually dimmed.| 'neutral'
| 'primary'
| 'danger'
| 'white-persistent'
| 'black-persistent'
| 'inverse'
| ReactElement
| ((
props: object,
) => ReactElement)
| 'sm'
| 'md'
| 'lg'
| LucideIcon
| ReactNode
LucideIcon,
the size will automatically match the size prop. Supply as a
ReactElement for additional customization.| 'fill'
| 'ghost'
| 'outline'
className'qui-menu__button'<Menu.IconButton>
| 'default'
| 'compact'
booleantrue, pointer/focus
events are blocked, and the component is visually dimmed.| 'neutral'
| 'primary'
| 'danger'
| 'white-persistent'
| 'black-persistent'
| 'inverse'
LucideIcon| ReactElement
| ((
props: object,
) => ReactElement)
| 'square'
| 'rounded'
| 'sm'
| 'md'
| 'lg'
| 'fill'
| 'ghost'
| 'outline'
<Menu.SplitButton>
Omit<
ButtonProps,
| keyof {
density?:
| 'default'
| 'compact'
disabled?: boolean
emphasis?:
| 'neutral'
| 'primary'
| 'danger'
| 'white-persistent'
| 'black-persistent'
| 'inverse'
size?:
| 'sm'
| 'md'
| 'lg'
variant?:
| 'fill'
| 'ghost'
| 'outline'
}
| 'children'
>
| 'default'
| 'compact'
boolean| 'neutral'
| 'primary'
| 'danger'
| 'white-persistent'
| 'black-persistent'
| 'inverse'
| LucideIcon
| ReactNode
MouseEventHandler| ReactElement
| ((
props: object,
) => ReactElement)
| 'sm'
| 'md'
| 'lg'
| LucideIcon
| ReactNode
Omit<
MenuIconButtonProps,
keyof {
density?:
| 'default'
| 'compact'
disabled?: boolean
emphasis?:
| 'neutral'
| 'primary'
| 'danger'
| 'white-persistent'
| 'black-persistent'
| 'inverse'
size?: 'sm' | 'md' | 'lg'
variant?:
| 'fill'
| 'ghost'
| 'outline'
}
>
| 'fill'
| 'ghost'
| 'outline'
<Menu.Content>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu__content'data-from| 'trigger'
| 'context-trigger'
data-menu-part'content'data-placement| 'bottom'
| 'bottom-end'
| 'bottom-start'
| 'left'
| 'left-end'
| 'left-start'
| 'right'
| 'right-end'
| 'right-start'
| 'top'
| 'top-end'
| 'top-start'
data-size'sm' | 'md'
data-state| 'open'
| 'closed'
hiddenbooleantabIndex0<Menu.Trigger>
stringdata-menu-part'trigger'data-placement| 'bottom'
| 'bottom-end'
| 'bottom-start'
| 'left'
| 'left-end'
| 'left-start'
| 'right'
| 'right-end'
| 'right-start'
| 'top'
| 'top-end'
| 'top-start'
data-state| 'open'
| 'closed'
data-uidstring<Menu.Item>
stringbooleanboolean() => void
| ReactElement
| ((
props: object,
) => ReactElement)
stringclassName'qui-menu-item__root'data-disableddata-focus-visibledata-highlighteddata-menu-part'item'data-ownedbystringdata-size'sm' | 'md'
data-valuestringdata-valuetextstringtabIndex-1
<Menu.ItemAccessory>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__accessory'<Menu.ItemCommand>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__command'data-size'sm' | 'md'
<Menu.ItemLabel>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__label'data-disableddata-highlighteddata-menu-part'item-text'data-size'sm' | 'md'
data-state| 'checked'
| 'unchecked'
<Menu.ItemDescription>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__description'data-menu-part'description'data-size'sm' | 'md'
<Menu.ItemGroup>
className'qui-menu-item__group'data-menu-part'item-group'<Menu.ItemGroupLabel>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__group-label'data-menu-part'item-group-label'data-size'sm' | 'md'
<Menu.ItemStartIcon>
className'qui-menu-item__start-icon'data-menu-part'start-icon'data-size'sm' | 'md'
<Menu.ItemIndicator>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu-item__indicator'data-disableddata-highlighteddata-menu-part'item-indicator'data-size'sm' | 'md'
data-state| 'checked'
| 'unchecked'
hiddenboolean<Menu.CheckboxItem>
stringbooleanbooleanboolean(
checked: boolean,
) => void
() => void
| ReactElement
| ((
props: object,
) => ReactElement)
string<Menu.CheckboxItemControl>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-checkbox__control'<Menu.RadioItem>
stringbooleanboolean() => void
| ReactElement
| ((
props: object,
) => ReactElement)
stringclassName'qui-menu-item__root'data-size'sm' | 'md'
<Menu.RadioItemControl>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-radio__control'<Menu.RadioItemGroup>
string(
value: string,
) => void
| ReactElement
| ((
props: object,
) => ReactElement)
string<Menu.Separator>
| ReactElement
| ((
props: object,
) => ReactElement)
className'qui-menu__separator'data-menu-part'separator'<Menu.TriggerItem>
<button>
element by default.stringbooleanboolean| LucideIcon
| ReactNode
() => void
| ReactElement
| ((
props: object,
) => ReactElement)
stringdata-disableddata-focus-visibledata-highlighteddata-menu-part'trigger'data-ownedbystringdata-placement| 'bottom'
| 'bottom-end'
| 'bottom-start'
| 'left'
| 'left-end'
| 'left-start'
| 'right'
| 'right-end'
| 'right-start'
| 'top'
| 'top-end'
| 'top-start'
data-state| 'open'
| 'closed'
data-uidstringdata-valuestringdata-valuetextstringtabIndex-1