// // Copyright 2023 DXOS.org // import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'; import { Primitive } from '@radix-ui/react-primitive'; import { Slot } from '@radix-ui/react-slot'; import React, { type ComponentPropsWithRef, forwardRef } from 'react'; import { useElevationContext, useThemeContext } from '../../hooks'; import { useSafeCollisionPadding } from '../../hooks/useSafeCollisionPadding'; import { type ThemedClassName } from '../../util'; type ContextMenuRootProps = ContextMenuPrimitive.ContextMenuProps; const ContextMenuRoot = ContextMenuPrimitive.ContextMenu; type ContextMenuTriggerProps = ContextMenuPrimitive.ContextMenuTriggerProps; const ContextMenuTrigger = ContextMenuPrimitive.Trigger; type ContextMenuPortalProps = ContextMenuPrimitive.ContextMenuPortalProps; const ContextMenuPortal = ContextMenuPrimitive.Portal; type ContextMenuContentProps = ThemedClassName & { constrainBlockSize?: boolean; }; const ContextMenuContent = forwardRef( ({ classNames, children, collisionPadding = 8, ...props }, forwardedRef) => { const { tx } = useThemeContext(); const elevation = useElevationContext(); const safeCollisionPadding = useSafeCollisionPadding(collisionPadding); return ( {children} ); }, ); type ContextMenuViewportProps = ThemedClassName> & { asChild?: boolean; }; const ContextMenuViewport = forwardRef( ({ classNames, asChild, children, ...props }, forwardedRef) => { const { tx } = useThemeContext(); const Root = asChild ? Slot : Primitive.div; return ( {children} ); }, ); type ContextMenuArrowProps = ThemedClassName; const ContextMenuArrow = forwardRef(({ classNames, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }); type ContextMenuGroupProps = ContextMenuPrimitive.ContextMenuGroupProps; const ContextMenuGroup = ContextMenuPrimitive.Group; type ContextMenuItemIndicatorProps = ContextMenuPrimitive.ContextMenuItemIndicatorProps; const ContextMenuItemIndicator = ContextMenuPrimitive.ItemIndicator; type ContextMenuItemProps = ThemedClassName; const ContextMenuItem = forwardRef( ({ classNames, ...props }: ContextMenuItemProps, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }, ); type ContextMenuCheckboxItemProps = ThemedClassName; const ContextMenuCheckboxItem = forwardRef( ({ classNames, ...props }: ContextMenuItemProps, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }, ); type ContextMenuSeparatorProps = ThemedClassName; const ContextMenuSeparator = forwardRef( ({ classNames, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }, ); type ContextMenuGroupLabelProps = ThemedClassName; const ContextMenuGroupLabel = forwardRef( ({ classNames, ...props }, forwardedRef) => { const { tx } = useThemeContext(); return ( ); }, ); export const ContextMenu = { Root: ContextMenuRoot, Trigger: ContextMenuTrigger, Portal: ContextMenuPortal, Content: ContextMenuContent, Viewport: ContextMenuViewport, Arrow: ContextMenuArrow, Group: ContextMenuGroup, Item: ContextMenuItem, CheckboxItem: ContextMenuCheckboxItem, ItemIndicator: ContextMenuItemIndicator, Separator: ContextMenuSeparator, GroupLabel: ContextMenuGroupLabel, }; export type { ContextMenuRootProps, ContextMenuTriggerProps, ContextMenuPortalProps, ContextMenuContentProps, ContextMenuViewportProps, ContextMenuArrowProps, ContextMenuGroupProps, ContextMenuItemProps, ContextMenuCheckboxItemProps, ContextMenuItemIndicatorProps, ContextMenuSeparatorProps, ContextMenuGroupLabelProps, };