"use client"; import * as React from "react"; import { Check, ChevronRight, Circle } from "lucide-react"; import { cn } from "../../lib/utils"; type ContextMenuContextValue = { open: boolean; setOpen: React.Dispatch>; position: { x: number; y: number }; setPosition: React.Dispatch>; subMenuOpen: Record; setSubMenuOpen: React.Dispatch>>; activeItem: string | null; setActiveItem: React.Dispatch>; }; const ContextMenuContext = React.createContext(undefined); function useContextMenu() { const context = React.useContext(ContextMenuContext); if (!context) { throw new Error("useContextMenu must be used within a ContextMenu"); } return context; } interface ContextMenuProps { children: React.ReactNode; } const ContextMenu = ({ children }: ContextMenuProps) => { const [open, setOpen] = React.useState(false); const [position, setPosition] = React.useState({ x: 0, y: 0 }); const [subMenuOpen, setSubMenuOpen] = React.useState>({}); const [activeItem, setActiveItem] = React.useState(null); return ( {children} ); }; interface ContextMenuTriggerProps extends React.HTMLAttributes {} const ContextMenuTrigger = React.forwardRef( ({ children, ...props }, ref) => { const { setOpen, setPosition } = useContextMenu(); const handleContextMenu = (e: React.MouseEvent) => { e.preventDefault(); setPosition({ x: e.clientX, y: e.clientY }); setOpen(true); }; return (
{children}
); } ); ContextMenuTrigger.displayName = "ContextMenuTrigger"; interface ContextMenuPortalProps { children: React.ReactNode; } const ContextMenuPortal = ({ children }: ContextMenuPortalProps) => { return <>{children}; }; interface ContextMenuContentProps extends React.HTMLAttributes {} const ContextMenuContent = React.forwardRef( ({ className, children, ...props }, ref) => { const { open, position, setOpen } = useContextMenu(); const contentRef = React.useRef(null); React.useEffect(() => { if (open) { const handleOutsideClick = (e: MouseEvent) => { if (contentRef.current && !contentRef.current.contains(e.target as Node)) { setOpen(false); } }; document.addEventListener("mousedown", handleOutsideClick); return () => { document.removeEventListener("mousedown", handleOutsideClick); }; } }, [open, setOpen]); if (!open) return null; return (
{children}
); } ); ContextMenuContent.displayName = "ContextMenuContent"; interface ContextMenuItemProps extends React.ButtonHTMLAttributes { inset?: boolean; } const ContextMenuItem = React.forwardRef( ({ className, inset, ...props }, ref) => { return ( ); const ContextMenuRadioItem = ({ children, className, ...props }: React.HTMLAttributes) => ( ); const ContextMenuLabel = React.forwardRef< HTMLDivElement, React.HTMLAttributes & { inset?: boolean } >(({ className, inset, ...props }, ref) => (
)); ContextMenuLabel.displayName = "ContextMenuLabel"; const ContextMenuSeparator = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => (
)); ContextMenuSeparator.displayName = "ContextMenuSeparator"; const ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { return ( ); }; // Simplified implementations for remaining context menu components const ContextMenuGroup = ({ children, ...props }: React.HTMLAttributes) => (
{children}
); const ContextMenuSub = ({ children }: { children: React.ReactNode }) => { return <>{children}; }; const ContextMenuSubTrigger = React.forwardRef< HTMLButtonElement, React.ButtonHTMLAttributes & { inset?: boolean } >(({ className, inset, children, ...props }, ref) => ( )); ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger"; const ContextMenuSubContent = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => (
)); ContextMenuSubContent.displayName = "ContextMenuSubContent"; const ContextMenuRadioGroup = ({ children, ...props }: React.HTMLAttributes) => (
{children}
); export { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuCheckboxItem, ContextMenuRadioItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuShortcut, ContextMenuGroup, ContextMenuPortal, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuRadioGroup, };