Zaidan

Command Palette

Search for a command to run...

GitHub

Context Menu

Displays a menu to the user — such as a set of actions or functions — triggered by a right-click.

Installation

CLI

Manual

Copy and paste the following code into your project.

import * as ContextMenuPrimitive from "@kobalte/core/context-menu";
import type { PolymorphicProps } from "@kobalte/core/polymorphic";
import { Check, ChevronRight } from "lucide-solid";
import type { ComponentProps, JSX, ValidComponent } from "solid-js";
import { splitProps } from "solid-js";
import { cn } from "~/lib/utils";
type ContextMenuProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuRootProps
> &
Pick<ComponentProps<T>, "class">;
const ContextMenu = <T extends ValidComponent = "div">(props: ContextMenuProps<T>) => {
return <ContextMenuPrimitive.Root {...props} />;
};
type ContextMenuTriggerProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuTriggerProps<T>
> & {
class?: string | undefined;
};
const ContextMenuTrigger = <T extends ValidComponent = "div">(
props: ContextMenuTriggerProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuTriggerProps, ["class"]);
return (
<ContextMenuPrimitive.Trigger
class={cn("z-context-menu-trigger select-none", local.class)}
data-slot="context-menu-trigger"
{...others}
/>
);
};
type ContextMenuPortalProps = ContextMenuPrimitive.ContextMenuPortalProps;
const ContextMenuPortal = (props: ContextMenuPortalProps) => {
return <ContextMenuPrimitive.Portal {...props} />;
};
type ContextMenuContentProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuContentProps<T>
> & {
class?: string | undefined;
};
const ContextMenuContent = <T extends ValidComponent = "div">(
props: ContextMenuContentProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuContentProps, ["class"]);
return (
<ContextMenuPrimitive.Portal>
<ContextMenuPrimitive.Content
class={cn(
"z-50 z-context-menu-content z-menu-target max-h-(--kb-popper-available-height) origin-(--kb-menu-content-transform-origin) overflow-y-auto overflow-x-hidden outline-none",
local.class,
)}
data-slot="context-menu-content"
{...others}
/>
</ContextMenuPrimitive.Portal>
);
};
type ContextMenuGroupProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuGroupProps<T>
> & {
class?: string | undefined;
};
const ContextMenuGroup = <T extends ValidComponent = "div">(props: ContextMenuGroupProps<T>) => {
const [local, others] = splitProps(props as ContextMenuGroupProps, ["class"]);
return (
<ContextMenuPrimitive.Group class={local.class} data-slot="context-menu-group" {...others} />
);
};
type ContextMenuLabelProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuGroupLabelProps<T>
> & {
class?: string | undefined;
inset?: boolean;
};
const ContextMenuLabel = <T extends ValidComponent = "div">(props: ContextMenuLabelProps<T>) => {
const [local, others] = splitProps(props as ContextMenuLabelProps, ["class", "inset"]);
return (
<ContextMenuPrimitive.GroupLabel
class={cn("z-context-menu-label data-inset:pl-8", local.class)}
data-slot="context-menu-label"
data-inset={local.inset}
{...others}
/>
);
};
type ContextMenuItemProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuItemProps<T>
> & {
class?: string | undefined;
inset?: boolean;
variant?: "default" | "destructive";
};
const ContextMenuItem = <T extends ValidComponent = "div">(props: ContextMenuItemProps<T>) => {
const [local, others] = splitProps(props as ContextMenuItemProps, ["class", "inset", "variant"]);
return (
<ContextMenuPrimitive.Item
class={cn(
"group/context-menu-item relative z-context-menu-item flex cursor-default select-none items-center outline-hidden data-disabled:pointer-events-none data-inset:pl-8 data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
local.class,
)}
data-slot="context-menu-item"
data-inset={local.inset}
data-variant={local.variant ?? "default"}
{...others}
/>
);
};
type ContextMenuSubProps = ContextMenuPrimitive.ContextMenuSubProps;
const ContextMenuSub = (props: ContextMenuSubProps) => {
return <ContextMenuPrimitive.Sub {...props} />;
};
type ContextMenuSubTriggerProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuSubTriggerProps<T>
> & {
class?: string | undefined;
children?: JSX.Element;
inset?: boolean;
};
const ContextMenuSubTrigger = <T extends ValidComponent = "div">(
props: ContextMenuSubTriggerProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuSubTriggerProps, [
"class",
"children",
"inset",
]);
return (
<ContextMenuPrimitive.SubTrigger
class={cn(
"z-context-menu-sub-trigger flex cursor-default select-none items-center outline-hidden data-inset:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0",
local.class,
)}
data-slot="context-menu-sub-trigger"
data-inset={local.inset}
{...others}
>
{local.children}
<ChevronRight class="ml-auto" />
</ContextMenuPrimitive.SubTrigger>
);
};
type ContextMenuSubContentProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuSubContentProps<T>
> & {
class?: string | undefined;
};
const ContextMenuSubContent = <T extends ValidComponent = "div">(
props: ContextMenuSubContentProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuSubContentProps, ["class"]);
return (
<ContextMenuPrimitive.Portal>
<ContextMenuPrimitive.SubContent
class={cn(
"z-50 z-context-menu-content z-context-menu-subcontent z-menu-target max-h-(--kb-popper-available-height) origin-(--kb-menu-content-transform-origin) overflow-y-auto overflow-x-hidden outline-none",
local.class,
)}
data-slot="context-menu-sub-content"
{...others}
/>
</ContextMenuPrimitive.Portal>
);
};
type ContextMenuCheckboxItemProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuCheckboxItemProps<T>
> & {
class?: string | undefined;
children?: JSX.Element;
};
const ContextMenuCheckboxItem = <T extends ValidComponent = "div">(
props: ContextMenuCheckboxItemProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuCheckboxItemProps, ["class", "children"]);
return (
<ContextMenuPrimitive.CheckboxItem
class={cn(
"relative z-context-menu-checkbox-item flex cursor-default select-none items-center outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
local.class,
)}
data-slot="context-menu-checkbox-item"
{...others}
>
<span class="pointer-events-none z-context-menu-item-indicator">
<ContextMenuPrimitive.ItemIndicator>
<Check />
</ContextMenuPrimitive.ItemIndicator>
</span>
{local.children}
</ContextMenuPrimitive.CheckboxItem>
);
};
type ContextMenuRadioGroupProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuRadioGroupProps<T>
> & {
class?: string | undefined;
};
const ContextMenuRadioGroup = <T extends ValidComponent = "div">(
props: ContextMenuRadioGroupProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuRadioGroupProps, ["class"]);
return (
<ContextMenuPrimitive.RadioGroup
class={local.class}
data-slot="context-menu-radio-group"
{...others}
/>
);
};
type ContextMenuRadioItemProps<T extends ValidComponent = "div"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuRadioItemProps<T>
> & {
class?: string | undefined;
children?: JSX.Element;
};
const ContextMenuRadioItem = <T extends ValidComponent = "div">(
props: ContextMenuRadioItemProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuRadioItemProps, ["class", "children"]);
return (
<ContextMenuPrimitive.RadioItem
class={cn(
"relative z-context-menu-radio-item flex cursor-default select-none items-center outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
local.class,
)}
data-slot="context-menu-radio-item"
{...others}
>
<span class="pointer-events-none z-context-menu-item-indicator">
<ContextMenuPrimitive.ItemIndicator>
<Check />
</ContextMenuPrimitive.ItemIndicator>
</span>
{local.children}
</ContextMenuPrimitive.RadioItem>
);
};
type ContextMenuSeparatorProps<T extends ValidComponent = "hr"> = PolymorphicProps<
T,
ContextMenuPrimitive.ContextMenuSeparatorProps<T>
> & {
class?: string | undefined;
};
const ContextMenuSeparator = <T extends ValidComponent = "hr">(
props: ContextMenuSeparatorProps<T>,
) => {
const [local, others] = splitProps(props as ContextMenuSeparatorProps, ["class"]);
return (
<ContextMenuPrimitive.Separator
class={cn("z-context-menu-separator", local.class)}
data-slot="context-menu-separator"
{...others}
/>
);
};
type ContextMenuShortcutProps = ComponentProps<"span"> & {
class?: string | undefined;
};
const ContextMenuShortcut = (props: ContextMenuShortcutProps) => {
const [local, others] = splitProps(props, ["class"]);
return (
<span
class={cn("z-context-menu-shortcut", local.class)}
data-slot="context-menu-shortcut"
{...others}
/>
);
};
export {
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuCheckboxItem,
ContextMenuRadioItem,
ContextMenuLabel,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuGroup,
ContextMenuPortal,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuRadioGroup,
};

Examples

Here are the source code of all the examples from the preview page:

Basic

import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuBasic() {
return (
<Example title="Basic">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem disabled>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Sides

import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithSides() {
return (
<Example title="With Sides">
<div class="grid grid-cols-2 gap-6">
<ContextMenu placement="top">
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click (top)
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
<ContextMenu placement="right">
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click (right)
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
<ContextMenu placement="bottom">
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click (bottom)
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
<ContextMenu placement="left">
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click (left)
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</div>
</Example>
);
}

With Icons

import {
Archive,
ClipboardPaste,
Copy,
Scissors,
Trash,
} from "lucide-solid";
import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithIcons() {
return (
<Example title="With Icons">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>
<Copy />
Copy
</ContextMenuItem>
<ContextMenuItem>
<Scissors />
Cut
</ContextMenuItem>
<ContextMenuItem>
<ClipboardPaste />
Paste
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem variant="destructive">
<Trash />
Delete
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Shortcuts

import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithShortcuts() {
return (
<Example title="With Shortcuts">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>
Back
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem disabled>
Forward
<ContextMenuShortcut>⌘]</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Reload
<ContextMenuShortcut>⌘R</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem>
Save
<ContextMenuShortcut>⌘S</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Save As...
<ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Submenu

import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithSubmenu() {
return (
<Example title="With Submenu">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>
Copy
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Cut
<ContextMenuShortcut>⌘X</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSub>
<ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuGroup>
<ContextMenuItem>Save Page...</ContextMenuItem>
<ContextMenuItem>Create Shortcut...</ContextMenuItem>
<ContextMenuItem>Name Window...</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem>Developer Tools</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem variant="destructive">Delete</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuSubContent>
</ContextMenuSub>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Groups, Labels & Separators

import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuLabel,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithGroups() {
return (
<Example title="With Groups, Labels & Separators">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuLabel>File</ContextMenuLabel>
<ContextMenuItem>
New File
<ContextMenuShortcut>⌘N</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Open File
<ContextMenuShortcut>⌘O</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Save
<ContextMenuShortcut>⌘S</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuLabel>Edit</ContextMenuLabel>
<ContextMenuItem>
Undo
<ContextMenuShortcut>⌘Z</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Redo
<ContextMenuShortcut>⇧⌘Z</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem>
Cut
<ContextMenuShortcut>⌘X</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Copy
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Paste
<ContextMenuShortcut>⌘V</ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem variant="destructive">
Delete
<ContextMenuShortcut></ContextMenuShortcut>
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Checkboxes

import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuGroup,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithCheckboxes() {
return (
<Example title="With Checkboxes">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuCheckboxItem defaultChecked>Show Bookmarks Bar</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem defaultChecked>Show Developer Tools</ContextMenuCheckboxItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Radio Group

import { createSignal } from "solid-js";
import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuLabel,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithRadio() {
const [user, setUser] = createSignal("pedro");
const [theme, setTheme] = createSignal("light");
return (
<Example title="With Radio Group">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuLabel>People</ContextMenuLabel>
<ContextMenuRadioGroup value={user()} onChange={setUser}>
<ContextMenuRadioItem value="pedro">Pedro Duarte</ContextMenuRadioItem>
<ContextMenuRadioItem value="colm">Colm Tuite</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuLabel>Theme</ContextMenuLabel>
<ContextMenuRadioGroup value={theme()} onChange={setTheme}>
<ContextMenuRadioItem value="light">Light</ContextMenuRadioItem>
<ContextMenuRadioItem value="dark">Dark</ContextMenuRadioItem>
<ContextMenuRadioItem value="system">System</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

With Destructive Items

import { Archive, Pencil, Share, Trash } from "lucide-solid";
import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
function ContextMenuWithDestructive() {
return (
<Example title="With Destructive Items">
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>
<Pencil />
Edit
</ContextMenuItem>
<ContextMenuItem>
<Share />
Share
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem>
<Archive />
Archive
</ContextMenuItem>
<ContextMenuItem variant="destructive">
<Trash />
Delete
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</Example>
);
}

In Dialog

import { ClipboardPaste, Copy, Scissors, Trash } from "lucide-solid";
import { Button } from "~/components/ui/button";
import {
ContextMenu,
ContextMenuContent,
ContextMenuGroup,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from "~/components/ui/context-menu";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "~/components/ui/dialog";
function ContextMenuInDialog() {
return (
<Example title="In Dialog">
<Dialog>
<DialogTrigger as={Button} variant="outline">
Open Dialog
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Context Menu Example</DialogTitle>
<DialogDescription>
Right click on the area below to see the context menu.
</DialogDescription>
</DialogHeader>
<ContextMenu>
<ContextMenuTrigger class="flex aspect-[2/0.5] w-full items-center justify-center rounded-lg border text-sm">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuGroup>
<ContextMenuItem>
<Copy />
Copy
</ContextMenuItem>
<ContextMenuItem>
<Scissors />
Cut
</ContextMenuItem>
<ContextMenuItem>
<ClipboardPaste />
Paste
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuSub>
<ContextMenuSubTrigger>More Options</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuGroup>
<ContextMenuItem>Save Page...</ContextMenuItem>
<ContextMenuItem>Create Shortcut...</ContextMenuItem>
<ContextMenuItem>Name Window...</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem>Developer Tools</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem variant="destructive">
<Trash />
Delete
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
</DialogContent>
</Dialog>
</Example>
);
}