{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tooltip",
  "title": "Tooltip",
  "description": "Fast, fading label with minimal collision-aware travel from its trigger.",
  "dependencies": [
    "motion",
    "@base-ui/react"
  ],
  "registryDependencies": [
    "utils",
    "springs",
    "font-weight"
  ],
  "files": [
    {
      "path": "src/components/ui/tooltip.tsx",
      "content": "\"use client\";\n\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { motion, useReducedMotion } from \"motion/react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { spring } from \"@/lib/springs\";\nimport { fontWeights } from \"@/lib/font-weight\";\n\n/** Fast, deliberate — a tooltip that opened as slowly as a dialog would feel\n * laggy for something this small; 200ms strikes the balance between\n * \"confirms intent\" and \"instant.\" */\nconst defaultDelay = 200;\n\nfunction TooltipProvider({ delay = defaultDelay, ...props }: TooltipPrimitive.Provider.Props) {\n  return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delay={delay} {...props} />;\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n  return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n  return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\n/** A few pixels of slide toward the trigger, on top of the fade. Base UI's\n * resolved side keeps that cue correct when collision handling flips the\n * placement. */\nfunction slideOffset(side: NonNullable<TooltipPrimitive.Positioner.Props[\"side\"]>) {\n  switch (side) {\n    case \"top\":\n      return { y: 4 };\n    case \"bottom\":\n      return { y: -4 };\n    case \"left\":\n      return { x: 4 };\n    case \"right\":\n      return { x: -4 };\n    default:\n      return {};\n  }\n}\n\nfunction TooltipContent({\n  className,\n  side = \"top\",\n  sideOffset = 8,\n  align = \"center\",\n  alignOffset = 0,\n  children,\n  ...props\n}: TooltipPrimitive.Popup.Props &\n  Pick<TooltipPrimitive.Positioner.Props, \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\">) {\n  const reduceMotion = useReducedMotion();\n\n  return (\n    <TooltipPrimitive.Portal>\n      <TooltipPrimitive.Positioner\n        data-slot=\"tooltip-positioner\"\n        align={align}\n        alignOffset={alignOffset}\n        side={side}\n        sideOffset={sideOffset}\n        className=\"z-50\"\n      >\n        <TooltipPrimitive.Popup\n          data-slot=\"tooltip-content\"\n          render={(popupProps, state) => {\n            const exiting = state.transitionStatus === \"ending\";\n            const offset = reduceMotion ? {} : slideOffset(state.side);\n            return (\n              <motion.div\n                {...(popupProps as Record<string, unknown>)}\n                {...(props as Record<string, unknown>)}\n                className={cn(\n                  \"w-fit max-w-xs rounded-md bg-foreground px-2 py-1 text-caption text-background\",\n                  className,\n                )}\n                style={{ fontVariationSettings: fontWeights.medium }}\n                initial={{ opacity: 0, ...offset }}\n                animate={exiting ? { opacity: 0, ...offset } : { opacity: 1, x: 0, y: 0 }}\n                transition={exiting ? spring.quick.exit : spring.quick.enter}\n              >\n                {children}\n                <TooltipPrimitive.Arrow\n                  data-slot=\"tooltip-arrow\"\n                  className={cn(\n                    \"size-2 rotate-45 rounded-[1px] bg-foreground\",\n                    \"data-[side=bottom]:top-0.5 data-[side=top]:-bottom-0.5\",\n                    \"data-[side=left]:-right-0.5 data-[side=right]:-left-0.5\",\n                  )}\n                />\n              </motion.div>\n            );\n          }}\n        />\n      </TooltipPrimitive.Positioner>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}