{"name":"context-menu","type":"registry:ui","files":[{"path":"context-menu.tsx","type":"registry:ui","content":"\"use client\"\n\nimport * as React from \"react\"\nimport { Autocomplete as AutocompletePrimitive } from \"@base-ui/react/autocomplete\"\nimport { ContextMenu as ContextMenuPrimitive } from \"@base-ui/react/context-menu\"\nimport { ChevronRight as ChevronRightIcon } from \"honestui/icons\"\n\nimport { cn } from \"@/lib/utils\"\n\ntype AutocompleteMode = \"auto\" | \"manual\"\n\ntype ContextMenuContextValue = {\n  autocomplete: boolean\n  autocompleteMode: AutocompleteMode\n  inputRef: React.RefObject<HTMLInputElement | null>\n  inputValue: string\n  isInitialRenderRef: React.RefObject<boolean>\n  onInputValueChange: (value: string) => void\n  parent?: ContextMenuContextValue\n  shouldFilter: boolean\n}\n\nconst ContextMenuContext = React.createContext<ContextMenuContextValue | null>(\n  null\n)\n\nfunction useContextMenuContext() {\n  const context = React.useContext(ContextMenuContext)\n\n  if (!context) {\n    throw new Error(\"Context menu parts must be used within ContextMenu\")\n  }\n\n  return context\n}\n\nfunction getTextContent(node: React.ReactNode): string {\n  if (typeof node === \"string\" || typeof node === \"number\") {\n    return String(node)\n  }\n\n  if (Array.isArray(node)) {\n    return node.map(getTextContent).join(\" \")\n  }\n\n  if (React.isValidElement<{ children?: React.ReactNode }>(node)) {\n    return getTextContent(node.props.children)\n  }\n\n  return \"\"\n}\n\nfunction matchesSearch(\n  value: string | undefined,\n  children: React.ReactNode,\n  query: string\n) {\n  const normalizedQuery = query.trim().toLocaleLowerCase()\n\n  if (!normalizedQuery) return true\n\n  return (value ?? getTextContent(children))\n    .toLocaleLowerCase()\n    .includes(normalizedQuery)\n}\n\nfunction dispatchKeyboardEvent(element: Element, key: string) {\n  element.dispatchEvent(\n    new KeyboardEvent(\"keydown\", {\n      bubbles: true,\n      cancelable: true,\n      key,\n    })\n  )\n}\n\nfunction isSubmenuTrigger(element: Element) {\n  return element.matches('[data-slot=\"context-menu-subtrigger\"]')\n}\n\nfunction isSubmenuOpen(element: Element) {\n  return element.hasAttribute(\"data-popup-open\")\n}\n\ninterface NormalContextMenuRootProps\n  extends ContextMenuPrimitive.Root.Props {\n  autocomplete?: false\n  autocompleteMode?: never\n  defaultInputValue?: never\n  inputValue?: never\n  onInputValueChange?: never\n}\n\ninterface AutocompleteContextMenuRootProps\n  extends ContextMenuPrimitive.Root.Props {\n  autocomplete: true\n  autocompleteMode?: AutocompleteMode\n  defaultInputValue?: string\n  inputValue?: string\n  onInputValueChange?: (value: string) => void\n}\n\ntype ContextMenuRootProps =\n  | NormalContextMenuRootProps\n  | AutocompleteContextMenuRootProps\n\nfunction ContextMenu({\n  autocomplete = false,\n  autocompleteMode = \"auto\",\n  inputValue: controlledInputValue,\n  onInputValueChange,\n  defaultInputValue = \"\",\n  open: controlledOpen,\n  onOpenChange,\n  defaultOpen = false,\n  ...props\n}: ContextMenuRootProps) {\n  const [uncontrolledInputValue, setUncontrolledInputValue] =\n    React.useState(defaultInputValue)\n  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n  const inputRef = React.useRef<HTMLInputElement>(null)\n  const isInitialRenderRef = React.useRef(true)\n  const inputValue = controlledInputValue ?? uncontrolledInputValue\n  const open = controlledOpen ?? uncontrolledOpen\n\n  const setInputValue = React.useCallback(\n    (value: string) => {\n      if (controlledInputValue === undefined) {\n        setUncontrolledInputValue(value)\n      }\n      onInputValueChange?.(value)\n    },\n    [controlledInputValue, onInputValueChange]\n  )\n\n  const handleOpenChange = React.useCallback<\n    NonNullable<ContextMenuPrimitive.Root.Props[\"onOpenChange\"]>\n  >(\n    (nextOpen, eventDetails) => {\n      if (controlledOpen === undefined) {\n        setUncontrolledOpen(nextOpen)\n      }\n\n      if (!nextOpen && autocomplete) {\n        setInputValue(\"\")\n        isInitialRenderRef.current = true\n      }\n\n      onOpenChange?.(nextOpen, eventDetails)\n    },\n    [autocomplete, controlledOpen, onOpenChange, setInputValue]\n  )\n\n  const context = React.useMemo<ContextMenuContextValue>(\n    () => ({\n      autocomplete,\n      autocompleteMode,\n      inputRef,\n      inputValue,\n      isInitialRenderRef,\n      onInputValueChange: setInputValue,\n      shouldFilter: autocomplete && autocompleteMode === \"auto\",\n    }),\n    [autocomplete, autocompleteMode, inputValue, setInputValue]\n  )\n\n  return (\n    <ContextMenuContext.Provider value={context}>\n      <ContextMenuPrimitive.Root\n        open={open}\n        onOpenChange={handleOpenChange}\n        loopFocus={false}\n        {...props}\n      />\n    </ContextMenuContext.Provider>\n  )\n}\ninterface NormalContextMenuSubProps\n  extends ContextMenuPrimitive.SubmenuRoot.Props {\n  autocomplete?: false\n  autocompleteMode?: never\n  defaultInputValue?: never\n  inputValue?: never\n  onInputValueChange?: never\n}\n\ninterface AutocompleteContextMenuSubProps\n  extends ContextMenuPrimitive.SubmenuRoot.Props {\n  autocomplete: true\n  autocompleteMode?: AutocompleteMode\n  defaultInputValue?: string\n  inputValue?: string\n  onInputValueChange?: (value: string) => void\n}\n\ntype ContextMenuSubProps =\n  | NormalContextMenuSubProps\n  | AutocompleteContextMenuSubProps\n\nfunction ContextMenuSub({\n  autocomplete = false,\n  autocompleteMode = \"auto\",\n  inputValue: controlledInputValue,\n  onInputValueChange,\n  defaultInputValue = \"\",\n  open: controlledOpen,\n  onOpenChange,\n  defaultOpen = false,\n  ...props\n}: ContextMenuSubProps) {\n  const parent = useContextMenuContext()\n  const [uncontrolledInputValue, setUncontrolledInputValue] =\n    React.useState(defaultInputValue)\n  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n  const inputRef = React.useRef<HTMLInputElement>(null)\n  const isInitialRenderRef = React.useRef(true)\n  const inputValue = controlledInputValue ?? uncontrolledInputValue\n  const open = controlledOpen ?? uncontrolledOpen\n\n  const setInputValue = React.useCallback(\n    (value: string) => {\n      if (controlledInputValue === undefined) {\n        setUncontrolledInputValue(value)\n      }\n      onInputValueChange?.(value)\n    },\n    [controlledInputValue, onInputValueChange]\n  )\n\n  const handleOpenChange = React.useCallback<\n    NonNullable<ContextMenuPrimitive.SubmenuRoot.Props[\"onOpenChange\"]>\n  >(\n    (nextOpen, eventDetails) => {\n      if (controlledOpen === undefined) {\n        setUncontrolledOpen(nextOpen)\n      }\n\n      if (!nextOpen && autocomplete) {\n        setInputValue(\"\")\n        isInitialRenderRef.current = true\n      }\n\n      onOpenChange?.(nextOpen, eventDetails)\n    },\n    [autocomplete, controlledOpen, onOpenChange, setInputValue]\n  )\n\n  const context = React.useMemo<ContextMenuContextValue>(\n    () => ({\n      autocomplete,\n      autocompleteMode,\n      inputRef,\n      inputValue,\n      isInitialRenderRef,\n      onInputValueChange: setInputValue,\n      parent,\n      shouldFilter: autocomplete && autocompleteMode === \"auto\",\n    }),\n    [\n      autocomplete,\n      autocompleteMode,\n      inputValue,\n      parent,\n      setInputValue,\n    ]\n  )\n\n  return (\n    <ContextMenuContext.Provider value={context}>\n      <ContextMenuPrimitive.SubmenuRoot\n        open={open}\n        onOpenChange={handleOpenChange}\n        loopFocus={false}\n        {...props}\n      />\n    </ContextMenuContext.Provider>\n  )\n}\ntype ContextMenuTriggerProps = ContextMenuPrimitive.Trigger.Props\n\nfunction ContextMenuTrigger({ className, ...props }: ContextMenuTriggerProps) {\n  return (\n    <ContextMenuPrimitive.Trigger\n      data-slot=\"context-menu-trigger\"\n      className={cn(\n        \"outline-none focus-visible:ring-2 focus-visible:ring-[var(--hui-color-border-focus)] focus-visible:ring-offset-2\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\ntype ContextMenuCellProps = React.ComponentProps<\"div\"> & {\n  inset?: boolean\n  leadingIcon?: React.ReactNode\n  trailingIcon?: React.ReactNode\n  variant?: \"default\" | \"destructive\"\n}\n\nfunction ContextMenuCell({\n  children,\n  className,\n  inset,\n  leadingIcon,\n  trailingIcon,\n  variant = \"default\",\n  ...props\n}: ContextMenuCellProps) {\n  return (\n    <div\n      data-inset={inset || undefined}\n      data-variant={variant}\n      className={cn(\n        \"relative flex items-center gap-[var(--hui-space-3)] p-[var(--hui-space-3)] outline-none select-none [font-size:var(--hui-font-size-small)] [font-weight:var(--hui-font-weight-regular)] [letter-spacing:var(--hui-letter-spacing-small)] [line-height:var(--hui-line-height-small)] aria-disabled:pointer-events-none aria-disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 data-highlighted:cursor-pointer data-highlighted:rounded-[var(--hui-radius-2)] data-highlighted:bg-[var(--hui-color-background-base-primary-hover)] data-inset:ps-8 data-popup-open:cursor-pointer data-popup-open:rounded-[var(--hui-radius-2)] data-popup-open:bg-[var(--hui-color-background-base-primary-hover)] data-[variant=destructive]:text-[var(--hui-color-foreground-danger-primary)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:text-[var(--hui-color-foreground-base-secondary)] [&_svg:not([class*='size-'])]:size-4\",\n        className\n      )}\n      {...props}\n    >\n      {leadingIcon ? <span aria-hidden=\"true\">{leadingIcon}</span> : null}\n      {children}\n      {trailingIcon ? (\n        <span className=\"ms-auto\" aria-hidden=\"true\">\n          {trailingIcon}\n        </span>\n      ) : null}\n    </div>\n  )\n}\n\ntype ContextMenuItemProps = ContextMenuPrimitive.Item.Props & {\n  inset?: boolean\n  leadingIcon?: React.ReactNode\n  trailingIcon?: React.ReactNode\n  value?: string\n  variant?: \"default\" | \"destructive\"\n}\n\nfunction ContextMenuItem({\n  children,\n  value,\n  leadingIcon,\n  trailingIcon,\n  inset,\n  variant,\n  render,\n  ...props\n}: ContextMenuItemProps) {\n  const { autocomplete, inputValue, shouldFilter } = useContextMenuContext()\n\n  if (shouldFilter && !matchesSearch(value, children, inputValue)) {\n    return null\n  }\n\n  const cell =\n    render ?? (\n      <ContextMenuCell\n        inset={inset}\n        leadingIcon={leadingIcon}\n        trailingIcon={trailingIcon}\n        variant={variant}\n      />\n    )\n\n  if (autocomplete) {\n    return (\n      <AutocompletePrimitive.Item\n        data-slot=\"context-menu-item\"\n        value={value ?? getTextContent(children)}\n        render={<ContextMenuPrimitive.Item render={cell} />}\n        {...props}\n      >\n        {children}\n      </AutocompletePrimitive.Item>\n    )\n  }\n\n  return (\n    <ContextMenuPrimitive.Item\n      data-slot=\"context-menu-item\"\n      render={cell}\n      {...props}\n    >\n      {children}\n    </ContextMenuPrimitive.Item>\n  )\n}\ntype ContextMenuSubTriggerProps =\n  ContextMenuPrimitive.SubmenuTrigger.Props & {\n    inset?: boolean\n    leadingIcon?: React.ReactNode\n    trailingIcon?: React.ReactNode\n    value?: string\n  }\n\nfunction ContextMenuSubTrigger({\n  children,\n  value,\n  trailingIcon = <ChevronRightIcon />,\n  leadingIcon,\n  inset,\n  ...props\n}: ContextMenuSubTriggerProps) {\n  const { inputRef, parent } = useContextMenuContext()\n\n  if (\n    parent?.shouldFilter &&\n    !matchesSearch(value, children, parent.inputValue)\n  ) {\n    return null\n  }\n\n  const cell = (\n    <ContextMenuCell\n      inset={inset}\n      leadingIcon={leadingIcon}\n      trailingIcon={trailingIcon}\n    />\n  )\n\n  return (\n    <ContextMenuPrimitive.SubmenuTrigger\n      data-slot=\"context-menu-subtrigger\"\n      render={\n        parent?.autocomplete ? (\n          <AutocompletePrimitive.Item\n            value={value ?? getTextContent(children)}\n            render={cell}\n            onPointerEnter={(event) => {\n              if (document.activeElement !== parent.inputRef.current) {\n                parent.inputRef.current?.focus()\n              }\n              props.onPointerEnter?.(event)\n            }}\n            onKeyDown={(event) => {\n              requestAnimationFrame(() => inputRef.current?.focus())\n              props.onKeyDown?.(event)\n            }}\n          />\n        ) : (\n          cell\n        )\n      }\n      role={parent?.autocomplete ? \"option\" : \"menuitem\"}\n      {...props}\n    >\n      {children}\n    </ContextMenuPrimitive.SubmenuTrigger>\n  )\n}\ntype ContextMenuGroupProps = ContextMenuPrimitive.Group.Props\n\nfunction ContextMenuGroup({ children, ...props }: ContextMenuGroupProps) {\n  const { shouldFilter } = useContextMenuContext()\n\n  if (shouldFilter) return <>{children}</>\n\n  return (\n    <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props}>\n      {children}\n    </ContextMenuPrimitive.Group>\n  )\n}\ntype ContextMenuLabelProps = ContextMenuPrimitive.GroupLabel.Props\n\nfunction ContextMenuLabel({ className, ...props }: ContextMenuLabelProps) {\n  const { shouldFilter } = useContextMenuContext()\n\n  if (shouldFilter) return null\n\n  return (\n    <ContextMenuPrimitive.GroupLabel\n      data-slot=\"context-menu-label\"\n      className={cn(\n        \"px-[var(--hui-space-3)] py-[var(--hui-space-2)] [font-size:var(--hui-font-size-mini)] [font-weight:var(--hui-font-weight-medium)]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\ntype ContextMenuSeparatorProps = ContextMenuPrimitive.Separator.Props\n\nfunction ContextMenuSeparator({\n  className,\n  ...props\n}: ContextMenuSeparatorProps) {\n  const { shouldFilter } = useContextMenuContext()\n\n  if (shouldFilter) return null\n\n  return (\n    <ContextMenuPrimitive.Separator\n      data-slot=\"context-menu-separator\"\n      className={cn(\n        \"my-[var(--hui-space-2)] h-px bg-[var(--hui-color-border-base-primary)] [margin-inline:calc(var(--hui-space-3)*-1)]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nfunction ContextMenuEmptyState({\n  className,\n  ...props\n}: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"context-menu-empty-state\"\n      className={cn(\n        \"hidden p-[var(--hui-space-3)] text-center text-[var(--hui-color-foreground-base-secondary)] [font-size:var(--hui-font-size-small)] only:block\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\ntype ContextMenuContentProps = ContextMenuPrimitive.Popup.Props & {\n  align?: ContextMenuPrimitive.Positioner.Props[\"align\"]\n  alignOffset?: ContextMenuPrimitive.Positioner.Props[\"alignOffset\"]\n  searchLabel?: string\n  searchPlaceholder?: string\n  sideOffset?: ContextMenuPrimitive.Positioner.Props[\"sideOffset\"]\n}\n\nfunction ContextMenuContent({\n  ref,\n  className,\n  children,\n  searchLabel = \"Search menu items\",\n  searchPlaceholder = \"Search...\",\n  sideOffset = 4,\n  align = \"start\",\n  alignOffset = 0,\n  onFocus,\n  ...props\n}: ContextMenuContentProps) {\n  const {\n    autocomplete,\n    inputValue,\n    inputRef,\n    isInitialRenderRef,\n    onInputValueChange,\n    parent,\n  } = useContextMenuContext()\n  const highlightedItem = React.useRef<\n    [index: number, reason: \"keyboard\" | \"pointer\" | \"none\"]\n  >([-1, \"none\"])\n  const listRef = React.useRef<HTMLDivElement>(null)\n\n  const focusInput = React.useCallback(() => {\n    if (document.activeElement !== inputRef.current) {\n      inputRef.current?.focus()\n    }\n  }, [inputRef])\n\n  const highlightFirstItem = React.useCallback(() => {\n    if (!isInitialRenderRef.current) return\n    isInitialRenderRef.current = false\n\n    const item = listRef.current?.querySelector('[role=\"option\"]')\n    item?.dispatchEvent(new PointerEvent(\"mousemove\", { bubbles: true }))\n  }, [isInitialRenderRef])\n\n  const openHighlightedSubmenu = React.useCallback(() => {\n    if (highlightedItem.current[0] === -1) return\n\n    const items = listRef.current?.querySelectorAll('[role=\"option\"]')\n    const item = items?.[highlightedItem.current[0]]\n\n    if (item && isSubmenuTrigger(item)) {\n      dispatchKeyboardEvent(item, \"ArrowRight\")\n    }\n  }, [])\n\n  const closeHighlightedSubmenu = React.useCallback(\n    (event: React.KeyboardEvent<HTMLInputElement>) => {\n      if (highlightedItem.current[0] === -1) return\n\n      const items = listRef.current?.querySelectorAll('[role=\"option\"]')\n      const item = items?.[highlightedItem.current[0]]\n\n      if (!item || !isSubmenuTrigger(item) || !isSubmenuOpen(item)) return\n\n      dispatchKeyboardEvent(item, \"Escape\")\n      event.stopPropagation()\n    },\n    []\n  )\n\n  const closeStaleSubmenu = React.useCallback((index: number) => {\n    const items = listRef.current?.querySelectorAll('[role=\"option\"]')\n    const item = items?.[index]\n\n    if (!item || !isSubmenuTrigger(item) || !isSubmenuOpen(item)) return\n\n    dispatchKeyboardEvent(item, \"Escape\")\n    item.dispatchEvent(new PointerEvent(\"pointerout\", { bubbles: true }))\n  }, [])\n\n  return (\n    <ContextMenuPrimitive.Portal>\n      <ContextMenuPrimitive.Positioner\n        data-slot=\"context-menu-positioner\"\n        className=\"z-[var(--hui-z-index-portal)]\"\n        sideOffset={sideOffset}\n        align={align}\n        alignOffset={alignOffset}\n      >\n        <ContextMenuPrimitive.Popup\n          ref={ref}\n          data-slot=\"context-menu-content\"\n          className={cn(\n            \"box-border max-h-(--available-height) min-w-48 origin-(--transform-origin) overflow-x-hidden overflow-y-auto overscroll-contain rounded-[var(--hui-radius-2)] border-[0.5px] border-[var(--hui-color-border-base-primary)] bg-[var(--hui-color-background-base-primary)] p-[var(--hui-space-2)] text-[var(--hui-color-foreground-base-primary)] shadow-[var(--hui-shadow-soft)] outline-none [font-size:var(--hui-font-size-small)] [font-weight:var(--hui-font-weight-regular)] [letter-spacing:var(--hui-letter-spacing-small)] [line-height:var(--hui-line-height-small)] [transition:opacity_var(--hui-duration-fast)_var(--hui-ease-out)] focus:outline-none focus-visible:outline-none data-ending-style:opacity-0 data-starting-style:opacity-0 motion-safe:[transition:opacity_var(--hui-duration-fast)_var(--hui-ease-out),transform_var(--hui-duration-fast)_var(--hui-ease-out)] motion-safe:data-ending-style:scale-[0.97] motion-safe:data-starting-style:scale-[0.97]\",\n            className\n          )}\n          role={autocomplete ? \"dialog\" : \"menu\"}\n          onFocus={\n            autocomplete || parent?.autocomplete\n              ? (event) => {\n                  focusInput()\n                  event.stopPropagation()\n                  highlightFirstItem()\n                  onFocus?.(event)\n                }\n              : onFocus\n          }\n          {...props}\n        >\n          {autocomplete ? (\n            <AutocompletePrimitive.Root\n              inline\n              open\n              value={inputValue}\n              onValueChange={(value) => onInputValueChange(value)}\n              autoHighlight={Boolean(inputValue)}\n              mode=\"none\"\n              loopFocus={false}\n              onItemHighlighted={(_, eventDetails) => {\n                if (\n                  highlightedItem.current[1] === \"pointer\" &&\n                  eventDetails.reason === \"keyboard\"\n                ) {\n                  closeStaleSubmenu(highlightedItem.current[0])\n                }\n\n                highlightedItem.current = [\n                  eventDetails.index,\n                  eventDetails.reason,\n                ]\n              }}\n            >\n              <AutocompletePrimitive.Input\n                ref={inputRef}\n                data-slot=\"context-menu-search-input\"\n                aria-label={searchLabel}\n                placeholder={searchPlaceholder}\n                className=\"mb-[var(--hui-space-2)] h-8 w-full rounded-[var(--hui-radius-2)] border-0 bg-transparent px-[var(--hui-space-3)] text-[var(--hui-color-foreground-base-primary)] shadow-none outline-none placeholder:text-[var(--hui-color-foreground-base-secondary)] focus-visible:bg-[var(--hui-color-background-base-primary-hover)] focus-visible:ring-0 focus-visible:outline-none forced-colors:focus-visible:outline forced-colors:focus-visible:outline-1 forced-colors:focus-visible:outline-offset-[-2px]\"\n                onPointerEnter={focusInput}\n                onKeyDown={(event) => {\n                  if (event.key === \"ArrowLeft\") return\n                  if (event.key === \"Escape\") {\n                    closeHighlightedSubmenu(event)\n                    return\n                  }\n                  if (event.key === \"ArrowRight\" || event.key === \"Enter\") {\n                    openHighlightedSubmenu()\n                  }\n                  event.stopPropagation()\n                }}\n                tabIndex={-1}\n              />\n              <AutocompletePrimitive.List\n                ref={listRef}\n                data-slot=\"context-menu-search-list\"\n              >\n                {children}\n              </AutocompletePrimitive.List>\n            </AutocompletePrimitive.Root>\n          ) : (\n            children\n          )}\n        </ContextMenuPrimitive.Popup>\n      </ContextMenuPrimitive.Positioner>\n    </ContextMenuPrimitive.Portal>\n  )\n}\nfunction ContextMenuSubContent(props: ContextMenuContentProps) {\n  return <ContextMenuContent sideOffset={2} alignOffset={-4} {...props} />\n}\n\nexport {\n  ContextMenu,\n  ContextMenuContent,\n  ContextMenuEmptyState,\n  ContextMenuGroup,\n  ContextMenuItem,\n  ContextMenuLabel,\n  ContextMenuSeparator,\n  ContextMenuSub,\n  ContextMenuSubContent,\n  ContextMenuSubTrigger,\n  ContextMenuTrigger,\n}\n\nexport type {\n  AutocompleteContextMenuRootProps,\n  AutocompleteContextMenuSubProps,\n  ContextMenuContentProps,\n  ContextMenuGroupProps,\n  ContextMenuItemProps,\n  ContextMenuLabelProps,\n  ContextMenuRootProps,\n  ContextMenuSeparatorProps,\n  ContextMenuSubProps,\n  ContextMenuSubTriggerProps,\n  ContextMenuTriggerProps,\n  NormalContextMenuRootProps,\n  NormalContextMenuSubProps,\n}\n","target":"components/ui/context-menu.tsx"}],"dependencies":["@base-ui/react","honestui"]}