{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "tooltip",
  "type": "registry:ui",
  "title": "Tooltip",
  "description": "Short label on hover or focus with an optional shortcut, origin-aware motion and instant skip between tooltips.",
  "dependencies": [
    "radix-ui"
  ],
  "registryDependencies": [
    "https://kuro.abstergo.fyi/r/kura-theme.json",
    "https://kuro.abstergo.fyi/r/kbd.json",
    "https://kuro.abstergo.fyi/r/kura-keys.json",
    "utils"
  ],
  "files": [
    {
      "path": "registry/kura/tooltip/index.ts",
      "type": "registry:ui",
      "target": "components/kura/tooltip/index.ts",
      "content": "export {\n  Tooltip,\n  TooltipContent,\n  type TooltipContentProps,\n  type TooltipProps,\n  TooltipProvider,\n  type TooltipProviderProps,\n  TooltipRoot,\n  TooltipTrigger,\n} from \"./tooltip\";\n"
    },
    {
      "path": "registry/kura/tooltip/tooltip.tsx",
      "type": "registry:ui",
      "target": "components/kura/tooltip/tooltip.tsx",
      "content": "\"use client\";\n\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport type { KeyName } from \"@/lib/kura/keys\";\nimport { Kbd } from \"@/components/kura/kbd\";\n\nexport interface TooltipProviderProps\n  extends React.ComponentProps<typeof TooltipPrimitive.Provider> {}\n\n/** True inside a `TooltipProvider`, so `<Tooltip>` joins it instead of creating its own. */\nconst InsideProvider = React.createContext(false);\n\n/**\n * Optional. Wrap an area (or the app) so moving between tooltips skips the open delay — this\n * includes every `<Tooltip>` and `IconButton` inside it. `<Tooltip>` works without it.\n */\nexport function TooltipProvider({\n  delayDuration = 500,\n  skipDelayDuration = 300,\n  children,\n  ...props\n}: TooltipProviderProps) {\n  return (\n    <TooltipPrimitive.Provider\n      delayDuration={delayDuration}\n      skipDelayDuration={skipDelayDuration}\n      {...props}\n    >\n      <InsideProvider.Provider value={true}>{children}</InsideProvider.Provider>\n    </TooltipPrimitive.Provider>\n  );\n}\n\nexport interface TooltipContentProps extends React.ComponentProps<typeof TooltipPrimitive.Content> {\n  /** Keyboard shortcut shown after the label, e.g. `[\"mod\", \"enter\"]`. */\n  shortcut?: readonly KeyName[];\n}\n\n/** The floating label. Origin-aware scale+fade in, instant when moving between tooltips. */\nexport function TooltipContent({\n  className,\n  sideOffset = 6,\n  shortcut,\n  children,\n  ...props\n}: TooltipContentProps) {\n  return (\n    <TooltipPrimitive.Portal>\n      <TooltipPrimitive.Content\n        data-slot=\"tooltip-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          \"z-50 inline-flex max-w-xs select-none items-center gap-2 rounded-kura-sm bg-kura-ink px-2 py-1 font-kura-sans text-kura-fg-inverted text-xs leading-snug shadow-kura-md\",\n          \"origin-(--radix-tooltip-content-transform-origin)\",\n          \"data-[state=delayed-open]:animate-kura-pop-in data-[state=closed]:animate-kura-pop-out data-[state=instant-open]:animate-none\",\n          className,\n        )}\n        {...props}\n      >\n        {children}\n        {shortcut && (\n          <Kbd\n            keys={shortcut}\n            variant=\"ghost\"\n            size=\"sm\"\n            className=\"-mr-1 [&_[data-slot=kbd-key]]:bg-white/15 [&_[data-slot=kbd-key]]:text-kura-fg-inverted\"\n          />\n        )}\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  );\n}\n\nexport const TooltipRoot = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipProps\n  extends Omit<React.ComponentProps<typeof TooltipPrimitive.Root>, \"children\"> {\n  /** The tooltip label. Keep it to a few words; never put interactive content in a tooltip. */\n  content: React.ReactNode;\n  /** The trigger. Must be a single focusable element that accepts a ref (e.g. <Button>). */\n  children: React.ReactElement;\n  /** Keyboard shortcut rendered as keys after the label. */\n  shortcut?: readonly KeyName[];\n  side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n  align?: \"start\" | \"center\" | \"end\";\n  /** Delay before opening in ms. Default 500, or the surrounding TooltipProvider's (0 when moving between tooltips). */\n  delayDuration?: number;\n  /** Disable without unmounting the trigger. */\n  disabled?: boolean;\n  /** Extra classes for the content bubble. */\n  contentClassName?: string;\n}\n\n/**\n * Label-on-hover/focus for an icon or control. Opens on hover after a delay and immediately on\n * keyboard focus; closes on Escape. Creates its own provider unless it sits inside a\n * `TooltipProvider`, which it then shares (instant hand-off between neighbouring tooltips).\n */\nexport function Tooltip({\n  content,\n  children,\n  shortcut,\n  side = \"top\",\n  align = \"center\",\n  delayDuration,\n  disabled = false,\n  contentClassName,\n  ...rootProps\n}: TooltipProps) {\n  const shared = React.useContext(InsideProvider);\n  if (disabled) return children;\n  const root = (\n    <TooltipPrimitive.Root data-slot=\"tooltip\" delayDuration={delayDuration} {...rootProps}>\n      <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n      <TooltipContent side={side} align={align} shortcut={shortcut} className={contentClassName}>\n        {content}\n      </TooltipContent>\n    </TooltipPrimitive.Root>\n  );\n  // Inside a TooltipProvider, join it so the skip-delay hand-off works across tooltips.\n  if (shared) return root;\n  return (\n    <TooltipPrimitive.Provider delayDuration={delayDuration ?? 500} skipDelayDuration={300}>\n      {root}\n    </TooltipPrimitive.Provider>\n  );\n}\n"
    }
  ],
  "categories": [
    "primitives",
    "tooltip",
    "hint",
    "label",
    "hover"
  ],
  "docs": "Docs: https://kuro.abstergo.fyi/components/tooltip · Markdown for agents: https://kuro.abstergo.fyi/components/tooltip.md",
  "meta": {
    "kura": {
      "status": "stable",
      "whenToUse": [
        "Name an icon-only control or reveal its shortcut.",
        "Brief supplementary hints (a few words)."
      ],
      "whenNotToUse": [
        "Interactive or rich content (links, buttons, forms) — use popover.",
        "Essential information — it is invisible on touch devices; put it in the UI.",
        "Labelling icon buttons — icon-button already includes a tooltip."
      ]
    }
  }
}
