{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "ContextMenu",
  "dependencies": [
    "@base-ui/react",
    "cn",
    "lucide-react",
    "rescript-base-ui"
  ],
  "registryDependencies": [
    "@rescript-shadcn/Icons"
  ],
  "files": [
    {
      "path": "registry/base/ui/ContextMenu.res",
      "content": "@@directive(\"'use client'\")\n\n@@jsxConfig({version: 4, mode: \"automatic\", module_: \"BaseUi.BaseUiJsxDOM\"})\n\nopen BaseUi.Types\n\n@module(\"cn\")\nexternal cn: (string, option<string>) => string = \"cn\"\n\nmodule Variant = {\n  @unboxed\n  type t =\n    | @as(\"default\") Default\n    | @as(\"destructive\") Destructive\n}\n\n@react.componentWithProps(BaseUi.ContextMenu.Root.props)\nlet make = (props: BaseUi.ContextMenu.Root.props<'payload>) =>\n  <BaseUi.ContextMenu.Root {...props} dataSlot={props.dataSlot->Option.getOr(\"context-menu\")} />\n\nmodule Portal = {\n  @react.componentWithProps(BaseUi.ContextMenu.Portal.props)\n  let make = (props: BaseUi.ContextMenu.Portal.props) =>\n    <BaseUi.ContextMenu.Portal\n      {...props} dataSlot={props.dataSlot->Option.getOr(\"context-menu-portal\")}\n    />\n}\n\nmodule Trigger = {\n  @react.componentWithProps(BaseUi.ContextMenu.Trigger.props)\n  let make = (props: BaseUi.ContextMenu.Trigger.props) =>\n    <BaseUi.ContextMenu.Trigger\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-trigger\")}\n      className={cn(\"select-none\", props.className)}\n    />\n}\n\nmodule Content = {\n  type props = {\n    ...BaseUi.Types.BaseUIComponentProps.t,\n    align?: Align.t,\n    alignOffset?: float,\n    side?: Side.t,\n    sideOffset?: float,\n  }\n\n  let toBaseUiProps: props => BaseUi.Types.BaseUIComponentProps.t = %raw(`({align, alignOffset, side, sideOffset, ...props}) => props`)\n\n  @react.componentWithProps(props)\n  let make = (props: props) => {\n    let dataSlot = props.dataSlot->Option.getOr(\"context-menu-content\")\n    let align = props.align->Option.getOr(Align.Start)\n    let alignOffset = props.alignOffset->Option.getOr(4.)\n    let side = props.side->Option.getOr(Side.Right)\n    let sideOffset = props.sideOffset->Option.getOr(0.)\n    <BaseUi.ContextMenu.Portal>\n      <BaseUi.ContextMenu.Positioner\n        className=\"isolate z-50 outline-none\"\n        align\n        alignOffset={Const(alignOffset)}\n        side\n        sideOffset={Const(sideOffset)}\n      >\n        <BaseUi.ContextMenu.Popup\n          {...props->toBaseUiProps}\n          dataSlot\n          className={cn(\n            \"data-[side=inline-start]:slide-in-from-right-2 data-[side=inline-end]:slide-in-from-left-2 data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-36 rounded-lg p-1 shadow-md ring-1 duration-100 z-50 max-h-(--available-height) origin-(--transform-origin) overflow-x-hidden overflow-y-auto outline-none\",\n            props.className,\n          )}\n        />\n      </BaseUi.ContextMenu.Positioner>\n    </BaseUi.ContextMenu.Portal>\n  }\n}\n\nmodule Group = {\n  @react.componentWithProps(BaseUi.Types.BaseUIComponentProps.t)\n  let make = (props: BaseUi.Types.BaseUIComponentProps.t) => {\n    let className = props.className->Option.getOr(\"\")\n    <BaseUi.ContextMenu.Group\n      {...props} dataSlot={props.dataSlot->Option.getOr(\"context-menu-group\")} className\n    />\n  }\n}\n\nmodule Label = {\n  @react.componentWithProps(BaseUi.Types.BaseUIComponentProps.t)\n  let make = (props: BaseUi.Types.BaseUIComponentProps.t) =>\n    <BaseUi.ContextMenu.GroupLabel\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-label\")}\n      className={cn(\n        \"text-muted-foreground px-1.5 py-1 text-xs font-medium data-inset:pl-7\",\n        props.className,\n      )}\n    />\n}\n\nmodule Item = {\n  type props = {\n    ...BaseUi.ContextMenu.Item.props,\n    inset?: bool,\n    variant?: Variant.t,\n  }\n\n  let toBaseUiProps: props => BaseUi.ContextMenu.Item.props = %raw(`({inset, variant, ...props}) => props`)\n\n  @react.componentWithProps(props)\n  let make = (props: props) => {\n    let inset = props.inset\n    let variant = props.variant->Option.getOr(Variant.Default)\n    <BaseUi.ContextMenu.Item\n      {...props->toBaseUiProps}\n      dataInset=?{props.dataInset->Option.orElse(inset)}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-item\")}\n      dataVariant={props.dataVariant->Option.getOr((variant :> string))}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:text-destructive focus:*:[svg]:text-accent-foreground gap-1.5 rounded-md px-1.5 py-1 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 group/context-menu-item relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        props.className,\n      )}\n    />\n  }\n}\n\nmodule CheckboxItem = {\n  @react.componentWithProps(BaseUi.Menu.CheckboxItem.props)\n  let make = (props: BaseUi.Menu.CheckboxItem.props) => {\n    let children = props.children->Option.getOr(React.null)\n    <BaseUi.ContextMenu.CheckboxItem\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-checkbox-item\")}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        props.className,\n      )}\n    >\n      <span className=\"absolute right-2 pointer-events-none\">\n        <BaseUi.ContextMenu.CheckboxItemIndicator>\n          <Icons.Check />\n        </BaseUi.ContextMenu.CheckboxItemIndicator>\n      </span>\n      {children}\n    </BaseUi.ContextMenu.CheckboxItem>\n  }\n}\n\nmodule RadioGroup = {\n  @react.componentWithProps(BaseUi.Menu.RadioGroup.props)\n  let make = (props: BaseUi.Menu.RadioGroup.props<'value>) => {\n    let className = props.className->Option.getOr(\"\")\n    <BaseUi.ContextMenu.RadioGroup\n      {...props} dataSlot={props.dataSlot->Option.getOr(\"context-menu-radio-group\")} className\n    />\n  }\n}\n\nmodule RadioItem = {\n  @react.componentWithProps(BaseUi.Menu.RadioItem.props)\n  let make = (props: BaseUi.Menu.RadioItem.props<'value>) => {\n    let children = props.children->Option.getOr(React.null)\n    <BaseUi.ContextMenu.RadioItem\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-radio-item\")}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 relative flex cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        props.className,\n      )}\n    >\n      <span className=\"absolute right-2 pointer-events-none\">\n        <BaseUi.ContextMenu.RadioItemIndicator>\n          <Icons.Check />\n        </BaseUi.ContextMenu.RadioItemIndicator>\n      </span>\n      {children}\n    </BaseUi.ContextMenu.RadioItem>\n  }\n}\n\nmodule Separator = {\n  @react.componentWithProps(BaseUi.Types.BaseUIComponentProps.t)\n  let make = (props: BaseUi.Types.BaseUIComponentProps.t) =>\n    <BaseUi.ContextMenu.Separator\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-separator\")}\n      className={cn(\"bg-border -mx-1 my-1 h-px\", props.className)}\n    />\n}\n\nmodule Shortcut = {\n  @react.componentWithProps(BaseUi.Types.DomProps.t)\n  let make = (props: BaseUi.Types.DomProps.t) =>\n    <span\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-shortcut\")}\n      className={cn(\n        \"text-muted-foreground group-focus/context-menu-item:text-accent-foreground ml-auto text-xs tracking-widest\",\n        props.className,\n      )}\n    />\n}\n\nmodule Sub = {\n  @react.componentWithProps(BaseUi.Menu.SubmenuRoot.props)\n  let make = (props: BaseUi.Menu.SubmenuRoot.props<'payload>) =>\n    <BaseUi.ContextMenu.SubmenuRoot\n      {...props} dataSlot={props.dataSlot->Option.getOr(\"context-menu-sub\")}\n    />\n}\n\nmodule SubContent = {\n  @react.componentWithProps(Content.props)\n  let make = (props: Content.props) => {\n    let align = props.align->Option.getOr(Align.Start)\n    let alignOffset = props.alignOffset->Option.getOr(4.)\n    let side = props.side->Option.getOr(Side.Right)\n    let sideOffset = props.sideOffset->Option.getOr(0.)\n    <Content\n      {...props}\n      align\n      alignOffset\n      side\n      sideOffset\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-sub-content\")}\n      className={cn(\"shadow-lg  \", props.className)}\n    />\n  }\n}\n\nmodule SubTrigger = {\n  @react.componentWithProps(BaseUi.Types.BaseUIComponentProps.t)\n  let make = (props: BaseUi.Types.BaseUIComponentProps.t) => {\n    let children = props.children->Option.getOr(React.null)\n    <BaseUi.ContextMenu.SubmenuTrigger\n      {...props}\n      dataSlot={props.dataSlot->Option.getOr(\"context-menu-sub-trigger\")}\n      className={cn(\n        \"focus:bg-accent focus:text-accent-foreground data-open:bg-accent data-open:text-accent-foreground gap-1.5 rounded-md px-1.5 py-1 text-sm data-inset:pl-7 [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center outline-hidden select-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n        props.className,\n      )}\n    >\n      {children}\n      <Icons.ChevronRight className=\" ml-auto\" />\n    </BaseUi.ContextMenu.SubmenuTrigger>\n  }\n}\n",
      "type": "registry:file",
      "target": "@ui/ContextMenu.res"
    }
  ],
  "type": "registry:ui"
}