'use client' import type { Placement } from '@/app/components/base/ui/placement' import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu' import * as React from 'react' import { menuBackdropClassName, menuGroupLabelClassName, menuIndicatorClassName, menuPopupAnimationClassName, menuPopupBaseClassName, menuRowClassName, menuSeparatorClassName, } from '@/app/components/base/ui/menu-shared' import { parsePlacement } from '@/app/components/base/ui/placement' import { cn } from '@/utils/classnames' export const ContextMenu = BaseContextMenu.Root export const ContextMenuTrigger = BaseContextMenu.Trigger export const ContextMenuPortal = BaseContextMenu.Portal export const ContextMenuBackdrop = BaseContextMenu.Backdrop export const ContextMenuSub = BaseContextMenu.SubmenuRoot export const ContextMenuGroup = BaseContextMenu.Group export const ContextMenuRadioGroup = BaseContextMenu.RadioGroup type ContextMenuContentProps = { children: React.ReactNode placement?: Placement sideOffset?: number alignOffset?: number className?: string popupClassName?: string positionerProps?: Omit< React.ComponentPropsWithoutRef, 'children' | 'className' | 'side' | 'align' | 'sideOffset' | 'alignOffset' > popupProps?: Omit< React.ComponentPropsWithoutRef, 'children' | 'className' > } type ContextMenuPopupRenderProps = Required> & { placement: Placement sideOffset: number alignOffset: number className?: string popupClassName?: string positionerProps?: ContextMenuContentProps['positionerProps'] popupProps?: ContextMenuContentProps['popupProps'] withBackdrop?: boolean } function renderContextMenuPopup({ children, placement, sideOffset, alignOffset, className, popupClassName, positionerProps, popupProps, withBackdrop = false, }: ContextMenuPopupRenderProps) { const { side, align } = parsePlacement(placement) return ( {withBackdrop && ( )} {children} ) } export function ContextMenuContent({ children, placement = 'bottom-start', sideOffset = 0, alignOffset = 0, className, popupClassName, positionerProps, popupProps, }: ContextMenuContentProps) { return renderContextMenuPopup({ children, placement, sideOffset, alignOffset, className, popupClassName, positionerProps, popupProps, withBackdrop: true, }) } type ContextMenuItemProps = React.ComponentPropsWithoutRef & { destructive?: boolean } export function ContextMenuItem({ className, destructive, ...props }: ContextMenuItemProps) { return ( ) } type ContextMenuLinkItemProps = React.ComponentPropsWithoutRef & { destructive?: boolean } export function ContextMenuLinkItem({ className, destructive, closeOnClick = true, ...props }: ContextMenuLinkItemProps) { return ( ) } export function ContextMenuRadioItem({ className, ...props }: React.ComponentPropsWithoutRef) { return ( ) } export function ContextMenuCheckboxItem({ className, ...props }: React.ComponentPropsWithoutRef) { return ( ) } type ContextMenuIndicatorProps = Omit, 'children'> & { children?: React.ReactNode } export function ContextMenuItemIndicator({ className, children, ...props }: ContextMenuIndicatorProps) { return ( {children ?? } ) } export function ContextMenuCheckboxItemIndicator({ className, ...props }: Omit, 'children'>) { return ( ) } export function ContextMenuRadioItemIndicator({ className, ...props }: Omit, 'children'>) { return ( ) } type ContextMenuSubTriggerProps = React.ComponentPropsWithoutRef & { destructive?: boolean } export function ContextMenuSubTrigger({ className, destructive, children, ...props }: ContextMenuSubTriggerProps) { return ( {children} ) } type ContextMenuSubContentProps = { children: React.ReactNode placement?: Placement sideOffset?: number alignOffset?: number className?: string popupClassName?: string positionerProps?: ContextMenuContentProps['positionerProps'] popupProps?: ContextMenuContentProps['popupProps'] } export function ContextMenuSubContent({ children, placement = 'right-start', sideOffset = 4, alignOffset = 0, className, popupClassName, positionerProps, popupProps, }: ContextMenuSubContentProps) { return renderContextMenuPopup({ children, placement, sideOffset, alignOffset, className, popupClassName, positionerProps, popupProps, }) } export function ContextMenuGroupLabel({ className, ...props }: React.ComponentPropsWithoutRef) { return ( ) } export function ContextMenuSeparator({ className, ...props }: React.ComponentPropsWithoutRef) { return ( ) }