Context Menu
Displays a menu to the user — such as a set of actions or functions — triggered by a button.
Right click here
Installation
Install the following dependencies:
pnpm add @radix-ui/react-context-menu
Copy and paste the following code into your project.
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
import { CheckIcon, ChevronRightIcon, DotIcon } from "lucide-react";
import {
menuSeparatorVariants,
Shortcut,
ShortcutGroup,
menuSubTriggerVariants,
menuLabelVariants,
menuSubContentVariants,
menuContentVariants,
menuItemVariants,
} from "~/components/ui/_Menu";
const ContextMenu = ContextMenuPrimitive.Root;
const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
const ContextMenuGroup = ContextMenuPrimitive.Group;
const ContextMenuPortal = ContextMenuPrimitive.Portal;
const ContextMenuSub = ContextMenuPrimitive.Sub;
const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
function ContextMenuSubTrigger({
className,
inset,
children,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {
inset?: boolean;
}) {
return (
<ContextMenuPrimitive.SubTrigger
className={menuSubTriggerVariants({ inset, className })}
{...props}
>
{children}
<ChevronRightIcon />
</ContextMenuPrimitive.SubTrigger>
);
}
function ContextMenuSubContent({
className,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {
return (
<ContextMenuPrimitive.SubContent
className={menuSubContentVariants({ className })}
{...props}
/>
);
}
function ContextMenuContent({
className,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {
return (
<ContextMenuPrimitive.Portal>
<ContextMenuPrimitive.Content
className={menuContentVariants({
hasClosedAnimateOut: true,
className,
})}
{...props}
/>
</ContextMenuPrimitive.Portal>
);
}
function ContextMenuItem({
className,
inset,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {
inset?: boolean;
}) {
return (
<ContextMenuPrimitive.Item
className={menuItemVariants({ inset, className })}
{...props}
/>
);
}
function ContextMenuCheckboxItem({
className,
children,
checked,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {
return (
<ContextMenuPrimitive.CheckboxItem
className={menuItemVariants({ inset: true, className })}
checked={checked}
{...props}
>
<ContextMenuPrimitive.ItemIndicator asChild>
<CheckIcon />
</ContextMenuPrimitive.ItemIndicator>
{children}
</ContextMenuPrimitive.CheckboxItem>
);
}
function ContextMenuRadioItem({
className,
children,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {
return (
<ContextMenuPrimitive.RadioItem
className={menuItemVariants({ inset: true, className })}
{...props}
>
<ContextMenuPrimitive.ItemIndicator asChild>
<DotIcon />
</ContextMenuPrimitive.ItemIndicator>
{children}
</ContextMenuPrimitive.RadioItem>
);
}
function ContextMenuLabel({
className,
inset,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {
inset?: boolean;
}) {
return (
<ContextMenuPrimitive.Label
className={menuLabelVariants({ inset, className })}
{...props}
/>
);
}
function ContextMenuSeparator({
className,
...props
}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {
return (
<ContextMenuPrimitive.Separator
className={menuSeparatorVariants({ className })}
{...props}
/>
);
}
function ContextMenuShortcutGroup(props: React.ComponentProps<"div">) {
return <ShortcutGroup {...props} />;
}
function ContextMenuShortcut(props: React.ComponentProps<"span">) {
return <Shortcut {...props} />;
}
export {
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuCheckboxItem,
ContextMenuRadioItem,
ContextMenuLabel,
ContextMenuSeparator,
ContextMenuShortcutGroup,
ContextMenuShortcut,
ContextMenuGroup,
ContextMenuPortal,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuRadioGroup,
};
Update the import paths to match your project setup.
Usage
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuTrigger,
} from "~/components/ui/ContextMenu";
<ContextMenu>
<ContextMenuTrigger>Right click</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Profile</ContextMenuItem>
<ContextMenuItem>Billing</ContextMenuItem>
<ContextMenuItem>Team</ContextMenuItem>
<ContextMenuItem>Subscription</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>