{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tooltip","type":"registry:ui","title":"Tooltip","description":"A short hint shown on hover or keyboard focus.","dependencies":["radix-ui"],"registryDependencies":["https://dashral.com/r/utils.json","https://dashral.com/r/lib-portal.json"],"files":[{"path":"registry/dashral/tooltip.tsx","type":"registry:file","target":"components/dashral/tooltip.tsx","content":"\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"./lib/utils\"\nimport { usePortalContainer } from \"./lib/portal\"\n\ntype TooltipProps = Pick<React.ComponentProps<typeof TooltipPrimitive.Root>, \"open\" | \"defaultOpen\" | \"onOpenChange\"> &\n  Omit<React.ComponentProps<typeof TooltipPrimitive.Trigger>, \"children\" | \"content\"> & {\n  /** What the tooltip says. */\n  content: React.ReactNode\n  /** The element it describes; it must take a ref and focus (a button, a link). */\n  children: React.ReactElement\n  side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n  align?: \"start\" | \"center\" | \"end\"\n  /** Milliseconds the pointer rests before it opens. */\n  delay?: number\n  className?: string\n}\n\n/**\n * A short label for a control, shown on hover and keyboard focus, in one tag: `<Tooltip content=\"Copy\"><Button …/></Tooltip>`.\n * Don't put anything in it people must read or press: touch screens never show it. Other props (a ref, handlers) go\n * on to the control, so a Tooltip can itself be another component's trigger.\n */\nfunction Tooltip({ content, children, side, align, delay = 0, className, open, defaultOpen, onOpenChange, ...triggerProps }: TooltipProps) {\n  return (\n    <TooltipPrimitive.Provider delayDuration={delay}>\n      <TooltipPrimitive.Root data-slot=\"tooltip\" open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n        <TooltipPrimitive.Trigger\n          asChild\n          {...triggerProps}\n          onFocus={(event) => {\n            triggerProps.onFocus?.(event)\n            // Only a focus you can see (the keyboard's) shows it, not one a script moved after a click: opening a\n            // popover or dialog focuses what's inside, and its first control's tooltip would pop up on its own. The\n            // focused element may be inside the trigger (a radio in its label), so ask it, not the trigger.\n            if (!(event.target as Element).matches?.(\":focus-visible\")) event.preventDefault()\n          }}\n        >\n          {children}\n        </TooltipPrimitive.Trigger>\n        <TooltipContent side={side} align={align} className={className}>\n          {content}\n        </TooltipContent>\n      </TooltipPrimitive.Root>\n    </TooltipPrimitive.Provider>\n  )\n}\n\nfunction TooltipContent({\n  className,\n  sideOffset = 4,\n  children,\n  ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n  const portalContainer = usePortalContainer()\n  return (\n    <TooltipPrimitive.Portal container={portalContainer}>\n      <TooltipPrimitive.Content\n        data-slot=\"tooltip-content\"\n        sideOffset={sideOffset}\n        className={cn(\n          \"z-50 w-fit rounded-md bg-foreground px-3 py-1.5 text-xs text-balance text-background data-[state=closed]:zoom-out-95 animate-in fade-in-0 zoom-in-95 blur-in-[2px] duration-(--duration-standard) ease-spring data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-(--duration-fast) data-[state=closed]:ease-exit motion-reduce:blur-in-0\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n      </TooltipPrimitive.Content>\n    </TooltipPrimitive.Portal>\n  )\n}\n\nexport { Tooltip, type TooltipProps }\n"}],"cssVars":{"theme":{"ease-standard":"var(--ease-standard)","ease-enter":"var(--ease-enter)","ease-exit":"var(--ease-exit)","ease-spring":"var(--ease-spring)"},"light":{"duration-fast":"160ms","duration-standard":"240ms","duration-considered":"480ms","ease-standard":"cubic-bezier(0.2, 0, 0, 1)","ease-enter":"cubic-bezier(0, 0, 0, 1)","ease-exit":"cubic-bezier(0.3, 0, 1, 1)","ease-spring":"linear(0, 0.071 4%, 0.234 8%, 0.433 12%, 0.626 17%, 0.791 21%, 0.917 25%, 1.004 29%, 1.055 33%, 1.079 38%, 1.083 42%, 1.075 46%, 1.06 50%, 1.043 54%, 1.027 58%, 1.015 62%, 1.005 67%, 0.998 71%, 0.995 75%, 0.993 79%, 0.993 83%, 0.994 88%, 0.995 92%, 0.997 96%, 1)"},"dark":{}}}