{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "context-menu-tailwind",
  "type": "registry:item",
  "title": "Context Menu (Tailwind)",
  "description": "A menu component triggered by right-click or long press.",
  "files": [
    {
      "path": "registry/brook/tailwind/ui/context-menu.tsx",
      "content": "\"use client\";\n\nimport { ContextMenu } from \"@base-ui/react/context-menu\";\nimport { Check, ChevronRight, Circle } from \"lucide-react\";\nimport type React from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nfunction ContextMenuRoot({ ...props }: ContextMenu.Root.Props) {\n  return <ContextMenu.Root {...props} />;\n}\n\nfunction ContextMenuTrigger({ className, ...props }: ContextMenu.Trigger.Props) {\n  return (\n    <ContextMenu.Trigger\n      className={cn(\"select-none outline-none\", className)}\n      data-slot=\"contextmenu-trigger\"\n      {...props}\n    />\n  );\n}\n\nconst ContextMenuPortal = ContextMenu.Portal;\n\nfunction ContextMenuBackdrop({ className, ...props }: ContextMenu.Backdrop.Props) {\n  return (\n    <ContextMenu.Backdrop\n      className={cn(\n        \"fixed inset-0 z-[140] bg-black/80 opacity-0 transition-opacity duration-150\",\n        \"data-[open]:opacity-100\",\n        className\n      )}\n      data-slot=\"contextmenu-backdrop\"\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuPositioner({ className, ...props }: ContextMenu.Positioner.Props) {\n  return (\n    <ContextMenu.Positioner\n      className={cn(\"absolute z-[150] outline-none\", className)}\n      data-slot=\"contextmenu-positioner\"\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuPopup({ className, ...props }: ContextMenu.Popup.Props) {\n  return (\n    <ContextMenu.Popup\n      className={cn(\n        \"box-border min-w-[140px] bg-[var(--popover)]\",\n        \"rounded-[var(--radius)]\",\n        \"flex flex-col shadow-[0_0_0_0.5px_oklch(from_var(--border)_l_c_h_/_0.8),var(--shadow-border-stack)]\",\n        \"origin-[top_center] transition-[transform,scale,opacity] duration-[250ms] ease-[var(--ease-out-expo)]\",\n        \"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n        \"data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n        \"data-[side=none]:data-[starting-style]:scale-100 data-[side=none]:data-[starting-style]:opacity-100 data-[side=none]:data-[starting-style]:transition-none\",\n        \"data-[side=none]:data-[ending-style]:transition-none\",\n        \"max-sm:max-w-[calc(100vw-2rem)] max-sm:p-1.5\",\n        className\n      )}\n      data-slot=\"contextmenu-popup\"\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuArrow({ className, ...props }: ContextMenu.Arrow.Props) {\n  return (\n    <ContextMenu.Arrow\n      className={cn(\"fill-background stroke-1 stroke-border\", className)}\n      data-slot=\"contextmenu-arrow\"\n      {...props}\n    />\n  );\n}\n\ninterface ContextMenuItemProps extends ContextMenu.Item.Props {\n  icon?: ReactNode;\n  inset?: boolean;\n  className?: string;\n  children?: ReactNode;\n  variant?: \"default\" | \"destructive\";\n}\n\nfunction ContextMenuItem({\n  className,\n  icon,\n  children,\n  inset = false,\n  variant = \"default\",\n  ...props\n}: ContextMenuItemProps) {\n  return (\n    <ContextMenu.Item\n      className={cn(\n        \"flex h-8 items-center gap-3 px-2 pr-1.5 font-normal text-sm leading-tight\",\n        \"m-0 cursor-pointer justify-start text-foreground\",\n        \"relative isolate\",\n        \"before:absolute before:inset-x-1 before:inset-y-0 before:content-['']\",\n        \"before:-z-10 before:rounded-[calc(var(--radius)-4px)] before:bg-transparent\",\n        \"data-[popup-open]:before:bg-[var(--accent)]\",\n        \"data-[highlighted]:before:bg-[var(--accent)]\",\n        \"hover:before:bg-[var(--accent)]\",\n        \"focus:outline-none focus:before:bg-[var(--accent)]\",\n        \"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n        \"data-[disabled]:hover:bg-transparent\",\n        \"[&:hover_.context-menu-shortcut]:text-secondary-foreground\",\n        \"[&:hover_.context-menu-icon]:text-secondary-foreground [&:hover_.context-menu-icon]:opacity-100\",\n        \"data-[variant=destructive]:hover:text-[var(--destructive)]\",\n        \"data-[variant=destructive]:hover:[&_.context-menu-icon]:text-[var(--destructive)]\",\n        inset && \"pl-8\",\n        \"max-sm:min-h-11 max-sm:gap-3 max-sm:px-2.5 max-sm:py-2.5 max-sm:text-[0.9375rem]\",\n        className\n      )}\n      data-slot=\"contextmenu-item\"\n      data-variant={variant === \"destructive\" ? \"destructive\" : undefined}\n      {...props}\n    >\n      {icon && (\n        <span className=\"context-menu-icon ml-1 flex items-center justify-center text-muted-foreground\">{icon}</span>\n      )}\n      {children}\n    </ContextMenu.Item>\n  );\n}\n\nfunction ContextMenuCheckboxItem({ className, children, ...props }: ContextMenu.CheckboxItem.Props) {\n  return (\n    <ContextMenu.CheckboxItem\n      className={cn(\n        \"relative flex items-center gap-2 px-2 py-1.5 pl-8 text-sm\",\n        \"cursor-pointer select-none rounded-[calc(var(--radius)-2px)] outline-none\",\n        \"hover:bg-muted hover:text-accent-foreground data-[highlighted]:bg-muted data-[highlighted]:text-accent-foreground\",\n        \"data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n        \"max-sm:min-h-11 max-sm:px-3 max-sm:py-2.5 max-sm:pl-9 max-sm:text-[0.9375rem]\",\n        className\n      )}\n      data-slot=\"contextmenu-checkboxitem\"\n      {...props}\n    >\n      <span className=\"absolute left-2 flex h-4 w-4 items-center justify-center max-sm:left-3 max-sm:h-[1.125rem] max-sm:w-[1.125rem]\">\n        <Check size={16} />\n      </span>\n      {children}\n    </ContextMenu.CheckboxItem>\n  );\n}\n\nfunction ContextMenuRadioItem({ className, children, ...props }: ContextMenu.RadioItem.Props) {\n  return (\n    <ContextMenu.RadioItem\n      className={cn(\n        \"relative flex items-center gap-2 px-2 py-1.5 pl-8 text-sm\",\n        \"cursor-pointer select-none rounded-[calc(var(--radius)-2px)] outline-none\",\n        \"hover:bg-muted hover:text-accent-foreground data-[highlighted]:bg-muted data-[highlighted]:text-accent-foreground\",\n        \"data-[disabled]:pointer-events-none data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n        \"max-sm:min-h-11 max-sm:px-3 max-sm:py-2.5 max-sm:pl-9 max-sm:text-[0.9375rem]\",\n        className\n      )}\n      data-slot=\"contextmenu-radioitem\"\n      {...props}\n    >\n      <span className=\"absolute left-2 flex h-4 w-4 items-center justify-center max-sm:left-3 max-sm:h-[1.125rem] max-sm:w-[1.125rem]\">\n        <Circle fill=\"currentColor\" size={8} />\n      </span>\n      {children}\n    </ContextMenu.RadioItem>\n  );\n}\n\nfunction ContextMenuRadioGroup({ className, ...props }: ContextMenu.RadioGroup.Props) {\n  return <ContextMenu.RadioGroup className={cn(className)} {...props} />;\n}\n\nfunction ContextMenuLabel({\n  className,\n  inset = false,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }) {\n  return (\n    <div\n      className={cn(\n        \"px-2 pt-3 pb-1.5 font-medium text-muted-foreground text-xs uppercase tracking-wide\",\n        inset && \"pl-8\",\n        \"max-sm:px-3 max-sm:py-2.5 max-sm:pt-3.5 max-sm:text-[0.8125rem]\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuSeparator({ className, ...props }: ContextMenu.Separator.Props) {\n  return (\n    <div className=\"py-[5px]\">\n      <ContextMenu.Separator\n        className={cn(\"h-px border-[oklch(from_var(--border)_l_c_h_/_0.8)] border-b-[0.5px]\", className)}\n        {...props}\n      />\n    </div>\n  );\n}\n\nfunction ContextMenuSubmenuRoot({ ...props }: ContextMenu.SubmenuRoot.Props) {\n  return <ContextMenu.SubmenuRoot {...props} />;\n}\n\nfunction ContextMenuSubmenuTrigger({\n  className,\n  inset = false,\n  children,\n  ...props\n}: ContextMenu.SubmenuTrigger.Props & {\n  inset?: boolean;\n}) {\n  return (\n    <ContextMenu.SubmenuTrigger\n      className={cn(\n        \"flex h-8 items-center gap-3 px-2 pr-1.5 font-normal text-sm leading-tight\",\n        \"m-0 cursor-pointer justify-start text-foreground\",\n        \"relative isolate\",\n        \"before:absolute before:inset-x-1 before:inset-y-0 before:content-['']\",\n        \"before:-z-10 before:rounded-[calc(var(--radius)-4px)] before:bg-transparent\",\n        \"data-[popup-open]:before:bg-[var(--accent)]\",\n        \"data-[highlighted]:before:bg-[var(--accent)]\",\n        \"hover:before:bg-[var(--accent)]\",\n        \"focus:outline-none focus:before:bg-[var(--accent)]\",\n        \"[&:hover_.submenu-icon]:text-secondary-foreground\",\n        \"[&:hover>svg]:text-secondary-foreground [&>svg]:text-muted-foreground\",\n        inset && \"pl-8\",\n        \"max-sm:min-h-11 max-sm:px-2.5 max-sm:py-2.5 max-sm:text-[0.9375rem]\",\n        className\n      )}\n      data-slot=\"contextmenu-submenutrigger\"\n      {...props}\n    >\n      {children}\n      <ChevronRight\n        className=\"submenu-icon ml-auto h-4 w-4 text-muted-foreground opacity-60 max-sm:h-[1.125rem] max-sm:w-[1.125rem]\"\n        size={16}\n      />\n    </ContextMenu.SubmenuTrigger>\n  );\n}\n\nfunction ContextMenuGroup({ className, ...props }: ContextMenu.Group.Props) {\n  return <ContextMenu.Group className={cn(\"overflow-hidden\", className)} data-slot=\"contextmenu-group\" {...props} />;\n}\n\nfunction ContextMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\n  return (\n    <span\n      className={cn(\n        \"context-menu-shortcut mr-1 ml-auto text-muted-foreground text-xs tracking-wide opacity-60\",\n        \"max-sm:hidden\",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nfunction ContextMenuSpacer() {\n  return <div className=\"h-1 w-full\" />;\n}\n\nexport {\n  ContextMenuRoot as ContextMenu,\n  ContextMenuArrow,\n  ContextMenuBackdrop,\n  ContextMenuCheckboxItem,\n  ContextMenuGroup,\n  ContextMenuItem,\n  ContextMenuLabel,\n  ContextMenuPopup,\n  ContextMenuPortal,\n  ContextMenuPositioner,\n  ContextMenuRadioGroup,\n  ContextMenuRadioItem,\n  ContextMenuSeparator,\n  ContextMenuShortcut,\n  ContextMenuSpacer,\n  ContextMenuSubmenuRoot,\n  ContextMenuSubmenuTrigger,\n  ContextMenuTrigger,\n};\n",
      "type": "registry:file",
      "target": "~/components/ui/context-menu/context-menu.tsx"
    }
  ]
}