{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "popover",
  "title": "Popover",
  "description": "A raised panel anchored to its trigger.",
  "dependencies": [
    "@base-ui/react"
  ],
  "registryDependencies": [
    "https://ui.ndekocode.dev/r/theme.json",
    "https://ui.ndekocode.dev/r/utils.json",
    "https://ui.ndekocode.dev/r/recipes.json"
  ],
  "files": [
    {
      "path": "registry/ndeko/ui/popover.tsx",
      "content": "'use client';\n\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\n\nimport { POPUP_TRANSITION } from '@/registry/ndeko/lib/recipes';\nimport { cn } from '@/registry/ndeko/lib/utils';\n\ntype WithClassName<Props> = Omit<Props, 'className'> & { className?: string };\n\nfunction Popover(props: PopoverPrimitive.Root.Props) {\n  return <PopoverPrimitive.Root data-slot='popover' {...props} />;\n}\n\nfunction PopoverTrigger(props: PopoverPrimitive.Trigger.Props) {\n  return <PopoverPrimitive.Trigger data-slot='popover-trigger' {...props} />;\n}\n\n/**\n * The first open does not glide: Base UI positions the popup while it still holds transitions off.\n * `trigger-change` marks a popover resting after a move between triggers, so scroll and resize\n * tracking stay instant; a keyboard open (`click`) still glides.\n */\nconst POPOVER_GLIDE = [\n  'transition-[top,left,right,bottom,transform] duration-250 ease-(--ease-out-strong)',\n  'data-closed:transition-none data-[instant=trigger-change]:transition-none',\n].join(' ');\n\nfunction positionerClassOf(glide: boolean) {\n  return cn('z-50', glide && POPOVER_GLIDE);\n}\n\ntype PopoverContentProps = WithClassName<PopoverPrimitive.Popup.Props> &\n  Pick<\n    PopoverPrimitive.Positioner.Props,\n    'side' | 'sideOffset' | 'align' | 'alignOffset'\n  > & {\n    /** Glide to the next anchor of a popover shared by several triggers. */\n    glide?: boolean;\n  };\n\nfunction PopoverContent({\n  className,\n  side = 'bottom',\n  sideOffset = 6,\n  align = 'center',\n  alignOffset = 0,\n  glide = false,\n  ...props\n}: PopoverContentProps) {\n  return (\n    <PopoverPrimitive.Portal>\n      <PopoverPrimitive.Positioner\n        side={side}\n        sideOffset={sideOffset}\n        align={align}\n        alignOffset={alignOffset}\n        className={positionerClassOf(glide)}\n      >\n        <PopoverPrimitive.Popup\n          data-slot='popover-content'\n          className={cn(\n            'surface-raised w-72 rounded-xl p-4 text-[13px] outline-none',\n            POPUP_TRANSITION,\n            className\n          )}\n          {...props}\n        />\n      </PopoverPrimitive.Positioner>\n    </PopoverPrimitive.Portal>\n  );\n}\n\nfunction PopoverTitle({\n  className,\n  ...props\n}: WithClassName<PopoverPrimitive.Title.Props>) {\n  return (\n    <PopoverPrimitive.Title\n      data-slot='popover-title'\n      className={cn('text-sm leading-none font-medium', className)}\n      {...props}\n    />\n  );\n}\n\nfunction PopoverDescription({\n  className,\n  ...props\n}: WithClassName<PopoverPrimitive.Description.Props>) {\n  return (\n    <PopoverPrimitive.Description\n      data-slot='popover-description'\n      className={cn('text-muted-foreground text-[13px]', className)}\n      {...props}\n    />\n  );\n}\n\nfunction PopoverClose(props: PopoverPrimitive.Close.Props) {\n  return <PopoverPrimitive.Close data-slot='popover-close' {...props} />;\n}\n\nexport {\n  POPOVER_GLIDE,\n  Popover,\n  PopoverClose,\n  PopoverContent,\n  PopoverDescription,\n  PopoverTitle,\n  PopoverTrigger,\n};\n",
      "type": "registry:ui"
    }
  ],
  "categories": [
    "primitives"
  ],
  "type": "registry:ui"
}