ContextMenu
ContextMenu composes Base UI’s context menu primitives with Density item styling for right-click actions. Its trigger is a consumer-owned React element; the component owns its menu-item interaction and popup surface styling, never the trigger.
Right-click me!
import { ContextMenu } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
export default function ContextMenuExample() {
return (
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={[
{ id: "open", label: "Open details" },
{ id: "duplicate", label: "Duplicate row" },
{ id: "separator", type: "separator" },
{ id: "archive", label: "Archive" },
]}
/>
);
}Items
Use items for menu actions and separators. Item color affects only that item, not the menu’s other items.
Right-click me!
import { ContextMenu, type ContextMenuItem } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
const items: ContextMenuItem[] = [
{ id: "open", label: "Open" },
{ id: "separator", type: "separator" as const },
{ id: "archive", label: "Archive", disabled: true },
{ id: "delete", label: "Delete", color: "destructive" },
];
export default function ContextMenuItemsExample() {
return <ContextMenu trigger={<ContextMenuExampleTarget />} items={items} />;
}Color
Set item color to destructive, warning, or success for semantic menu actions. Menu items currently use ghost-primary emphasis; a future API can expose other emphasis choices when a menu needs action hierarchy.
Right-click me!
import { ContextMenu } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
export default function ContextMenuColorExample() {
return (
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={[
{ id: "approve", label: "Approve", color: "success" },
{ id: "flag", label: "Flag for review", color: "warning" },
{ id: "separator", type: "separator" },
{ id: "delete", label: "Delete", color: "destructive" },
]}
/>
);
}Size
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
import { ContextMenu, View } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
const items = [
{ id: "open", label: "Open" },
{ id: "archive", label: "Archive" },
];
export default function ContextMenuSizeExample() {
return (
<View align="center" gap="md" orientation="horizontal" padding={false} wrap>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="2xs"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="xs"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="sm"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="md"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="lg"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="xl"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="2xl"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
size="3xl"
/>
</View>
);
}Padding
Right-click me!
Right-click me!
import { ContextMenu, View } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
const items = [
{ id: "open", label: "Open" },
{ id: "archive", label: "Archive" },
];
export default function ContextMenuPaddingExample() {
return (
<View align="center" gap="md" orientation="horizontal" padding={false} wrap>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
padding={false}
/>
<ContextMenu trigger={<ContextMenuExampleTarget />} items={items} />
</View>
);
}Depth
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
Right-click me!
import { ContextMenu, View } from "density-base-ui";
import { ContextMenuExampleTarget } from "./ContextMenuExampleTarget";
const items = [
{ id: "open", label: "Open" },
{ id: "archive", label: "Archive" },
];
export default function ContextMenuDepthExample() {
return (
<View align="center" gap="md" orientation="horizontal" padding={false} wrap>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="1"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="2"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="3"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="4"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="5"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="6"
/>
<ContextMenu
trigger={<ContextMenuExampleTarget />}
items={items}
depth="7"
/>
</View>
);
}| Prop | Values | Required | Default | Behavior | Description |
|---|---|---|---|---|---|
depth | 1, 2, 3, 4, 5, 6, 7 | Not required | "1" | Attribute: data-dn-depth | — |
items | ContextMenuItem[] | Required | — | — | — |
padding | false, true | Not required | true | Attribute: data-dn-padding | — |
size | 2xs, xs, sm, md, lg, xl, 2xl, 3xl | Not required | — | Attribute: data-dn-size | — |
trigger | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Required | — | — | — |
This component also accepts props from native APIs. They are passed through and intentionally kept out of this focused Density API table.