{
	"$schema": "https://ui.shadcn.com/schema/registry-item.json",
	"name": "WarmTooltip-JS-CSS",
	"title": "WarmTooltip",
	"description": "Tooltip group where the first label waits, then its siblings open instantly while warm.",
	"type": "registry:component",
	"files": [
		{
			"type": "registry:file",
			"path": "WarmTooltip.css",
			"target": "@components/WarmTooltip.css",
			"content": ".warm-tooltip__trigger {\n  --wt-surface: #f5f5f5;\n  --wt-fuse-ms: 400ms;\n  --wt-ease-out: cubic-bezier(0.23, 1, 0.32, 1);\n\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n  touch-action: manipulation;\n  -webkit-touch-callout: none;\n  -webkit-tap-highlight-color: transparent;\n}\n\n.warm-tooltip__trigger[data-pressing] {\n  user-select: none;\n  -webkit-user-select: none;\n}\n\n.warm-tooltip__fuse {\n  position: absolute;\n  left: 4px;\n  right: 4px;\n  height: 2px;\n  border-radius: 1px;\n  background: var(--wt-surface);\n  opacity: 0;\n  transform: scaleX(0);\n  transform-origin: left center;\n  pointer-events: none;\n  transition:\n    transform 125ms var(--wt-ease-out),\n    opacity 125ms var(--wt-ease-out);\n}\n\n.warm-tooltip__fuse[data-side='top'] {\n  top: -4px;\n}\n\n.warm-tooltip__fuse[data-side='bottom'] {\n  bottom: -4px;\n}\n\n.warm-tooltip__fuse[data-side='left'],\n.warm-tooltip__fuse[data-side='right'] {\n  top: 4px;\n  bottom: 4px;\n  left: auto;\n  right: auto;\n  width: 2px;\n  height: auto;\n  transform: scaleY(0);\n  transform-origin: center top;\n}\n\n.warm-tooltip__fuse[data-side='left'] {\n  left: -4px;\n}\n\n.warm-tooltip__fuse[data-side='right'] {\n  right: -4px;\n}\n\n.warm-tooltip__fuse[data-fuse='arming'] {\n  opacity: 1;\n  transform: scaleX(1);\n  transition:\n    transform var(--wt-fuse-ms) linear,\n    opacity 80ms var(--wt-ease-out);\n}\n\n.warm-tooltip__fuse[data-side='left'][data-fuse='arming'],\n.warm-tooltip__fuse[data-side='right'][data-fuse='arming'] {\n  transform: scaleY(1);\n}\n\n.warm-tooltip {\n  --wt-surface: #f5f5f5;\n  --wt-ink: #18181b;\n  --wt-radius: 8px;\n  --wt-font: 12.5px;\n  --wt-origin: center bottom;\n\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 9999;\n  display: block;\n  pointer-events: none;\n  font-family: inherit;\n}\n\n.warm-tooltip__box {\n  position: absolute;\n  inset: 0;\n  border-radius: var(--wt-radius);\n  background: var(--wt-surface);\n  color: var(--wt-ink);\n  box-shadow:\n    0 1px 2px rgba(0, 0, 0, 0.12),\n    0 8px 24px -8px rgba(0, 0, 0, 0.45);\n  transform-origin: var(--wt-origin);\n}\n\n.warm-tooltip__layer {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.warm-tooltip__text {\n  display: inline-flex;\n  align-items: center;\n  gap: 7px;\n  font-size: var(--wt-font);\n  font-weight: 500;\n  line-height: 1.2;\n  letter-spacing: -0.01em;\n  white-space: nowrap;\n}\n\n.warm-tooltip__kbd {\n  display: inline-flex;\n  align-items: center;\n  height: 1.55em;\n  padding: 0 0.45em;\n  border-radius: 0.4em;\n  background: color-mix(in srgb, var(--wt-ink) 9%, transparent);\n  box-shadow: inset 0 -1px 0 color-mix(in srgb, var(--wt-ink) 12%, transparent);\n  color: color-mix(in srgb, var(--wt-ink) 72%, transparent);\n  font-family: inherit;\n  font-size: 0.86em;\n  font-weight: 500;\n  letter-spacing: 0.02em;\n  font-variant-numeric: tabular-nums;\n}\n\n.warm-tooltip__arrow {\n  position: absolute;\n  width: 8px;\n  height: 8px;\n  margin: -4px;\n  border-radius: 2px;\n  background: var(--wt-surface);\n  transform: rotate(45deg);\n}\n\n.warm-tooltip__arrow[data-side='top'] {\n  bottom: 1px;\n}\n\n.warm-tooltip__arrow[data-side='bottom'] {\n  top: 1px;\n}\n\n.warm-tooltip__arrow[data-side='left'] {\n  right: 1px;\n}\n\n.warm-tooltip__arrow[data-side='right'] {\n  left: 1px;\n}\n\n@media (prefers-contrast: more) {\n  .warm-tooltip__box {\n    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--wt-ink) 40%, transparent);\n  }\n}\n"
		},
		{
			"type": "registry:component",
			"path": "WarmTooltip.jsx",
			"content": "'use client';\n\nimport {\n  cloneElement,\n  createContext,\n  forwardRef,\n  useContext,\n  useEffect,\n  useId,\n  useImperativeHandle,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n  AnimatePresence,\n  animate,\n  motion,\n  useMotionValue,\n  useReducedMotion,\n  useSpring,\n  useTransform,\n  useVelocity\n} from 'motion/react';\n\nimport './WarmTooltip.css';\n\nconst EASE_OUT = [0.23, 1, 0.32, 1];\nconst LEAN_SPRING = { stiffness: 260, damping: 22, mass: 0.4 };\nconst FULL_LEAN_SPEED = 1200;\nconst SIGN = { top: 1, bottom: -1, left: -1, right: 1 };\nconst ORIGIN = { top: 'center bottom', bottom: 'center top', left: 'right center', right: 'left center' };\nconst SIZES = {\n  sm: { font: 11.5, px: 8, py: 5 },\n  md: { font: 12.5, px: 10, py: 6 },\n  lg: { font: 13.5, px: 12, py: 7 }\n};\nconst MARGIN = 8;\nconst HOLD_SLOP = 10;\nconst SWAP = 0.14;\nconst SWAP_SHIFT = 10;\nconst RISE = 4;\nconst GRACE = 80;\n\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\nconst now = () => (typeof performance !== 'undefined' ? performance.now() : Date.now());\nconst horizontal = side => side === 'top' || side === 'bottom';\n\nconst anchorOf = (rect, side, gap) => {\n  if (side === 'top') return [rect.left + rect.width / 2, rect.top - gap];\n  if (side === 'bottom') return [rect.left + rect.width / 2, rect.bottom + gap];\n  if (side === 'left') return [rect.left - gap, rect.top + rect.height / 2];\n  return [rect.right + gap, rect.top + rect.height / 2];\n};\n\nconst layoutOf = (x, y, width, height, side) => {\n  if (horizontal(side)) {\n    const X = clamp(x - width / 2, MARGIN, Math.max(MARGIN, window.innerWidth - MARGIN - width));\n    return { X, Y: side === 'top' ? y - height : y };\n  }\n  const Y = clamp(y - height / 2, MARGIN, Math.max(MARGIN, window.innerHeight - MARGIN - height));\n  return { X: side === 'left' ? x - width : x, Y };\n};\n\nconst LAYER = {\n  enter: ({ dir, across }) => ({\n    opacity: dir === 0 ? 1 : 0,\n    x: across ? 0 : SWAP_SHIFT * dir,\n    y: across ? SWAP_SHIFT * dir : 0,\n    filter: dir === 0 ? 'blur(0px)' : 'blur(3px)'\n  }),\n  show: { opacity: 1, x: 0, y: 0, filter: 'blur(0px)' },\n  exit: ({ dir, across }) => ({\n    opacity: 0,\n    x: across ? 0 : -SWAP_SHIFT * dir,\n    y: across ? -SWAP_SHIFT * dir : 0,\n    filter: 'blur(3px)'\n  })\n};\n\nconst GroupContext = createContext(null);\n\nexport const WarmTooltipGroup = forwardRef(function WarmTooltipGroup(\n  { delay = 400, warmWindow = 300, travel = 320, lean = 0, onWarmChange, children },\n  ref\n) {\n  const reduce = useReducedMotion();\n  const id = useId();\n  const [current, setCurrent] = useState(null);\n  const [state, setState] = useState('closed');\n  const st = useRef({\n    state: 'closed',\n    current: null,\n    mode: 'cold',\n    instant: false,\n    warmUntil: -Infinity,\n    warm: false,\n    swap: { dir: 0, across: false },\n    closeTimer: undefined,\n    leaveTimer: undefined,\n    warmTimer: undefined\n  });\n  const textRef = useRef(null);\n  const api = useRef({ show: () => {}, hide: () => {} });\n\n  const ax = useMotionValue(0);\n  const ay = useMotionValue(0);\n  const w = useMotionValue(0);\n  const h = useMotionValue(0);\n  const presence = useMotionValue(0);\n  const vx = useVelocity(ax);\n  const vy = useVelocity(ay);\n  const speed = useTransform([vx, vy], ([a, b]) =>\n    st.current.current && !horizontal(st.current.current.side) ? b : a\n  );\n  const leanUnit = useSpring(\n    useTransform(speed, [-FULL_LEAN_SPEED, 0, FULL_LEAN_SPEED], [1, 0, -1], { clamp: true }),\n    LEAN_SPRING\n  );\n  const leanDeg = reduce ? 0 : lean;\n\n  const place = useTransform([ax, ay, w, h], ([x, y, width, height]) => {\n    const side = st.current.current ? st.current.current.side : 'top';\n    const { X, Y } = layoutOf(x, y, width, height, side);\n    return `translate(${X}px, ${Y}px)`;\n  });\n  const arrowAt = useTransform([ax, ay, w, h], ([x, y, width, height]) => {\n    const side = st.current.current ? st.current.current.side : 'top';\n    const { X, Y } = layoutOf(x, y, width, height, side);\n    return horizontal(side) ? clamp(x - X, 10, width - 10) : clamp(y - Y, 10, height - 10);\n  });\n  const pop = useTransform([presence, leanUnit], ([p, l]) => {\n    const c = st.current.current;\n    const side = c ? c.side : 'top';\n    if (reduce || !c) return 'none';\n    const scale = c.popScale + (1 - c.popScale) * p;\n    const rise = (1 - p) * RISE * SIGN[side] * (side === 'left' ? -1 : 1);\n    const rotate = l * leanDeg * SIGN[side];\n    const tx = horizontal(side) ? 0 : rise;\n    const ty = horizontal(side) ? rise : 0;\n    return `translate(${tx}px, ${ty}px) scale(${scale}) rotate(${rotate}deg)`;\n  });\n  const blur = useTransform(presence, p => {\n    const c = st.current.current;\n    return reduce || !c ? 'none' : `blur(${c.popBlur * (1 - p)}px)`;\n  });\n\n  const isWarm = () => st.current.state !== 'closed' || now() < st.current.warmUntil;\n  const notify = () => {\n    const next = isWarm();\n    if (next === st.current.warm) return;\n    st.current.warm = next;\n    onWarmChange?.(next);\n  };\n\n  const finishClose = () => {\n    st.current.state = 'closed';\n    st.current.current = null;\n    setState('closed');\n    setCurrent(null);\n    notify();\n  };\n\n  api.current.show = (payload, mode) => {\n    clearTimeout(st.current.closeTimer);\n    clearTimeout(st.current.leaveTimer);\n    const prev = st.current.current;\n    const fresh = st.current.state === 'closed';\n    if (prev && prev.id !== payload.id) {\n      const [px, py] = anchorOf(prev.trigger.getBoundingClientRect(), prev.side, prev.gap);\n      const [nx, ny] = anchorOf(payload.trigger.getBoundingClientRect(), payload.side, payload.gap);\n      const across = !horizontal(payload.side);\n      st.current.swap = { dir: Math.sign(across ? ny - py : nx - px) || 1, across };\n    } else {\n      st.current.swap = { dir: 0, across: !horizontal(payload.side) };\n    }\n    st.current.mode = fresh ? mode : mode === 'instant' ? 'instant' : 'move';\n    st.current.instant = mode === 'instant';\n    st.current.current = payload;\n    st.current.state = 'open';\n    setCurrent(payload);\n    setState('open');\n    notify();\n  };\n\n  const beginClose = instant => {\n    const c = st.current.current;\n    if (!c || st.current.state !== 'open') return;\n    st.current.state = 'closing';\n    setState('closing');\n    st.current.warmUntil = now() + c.warmWindow;\n    clearTimeout(st.current.warmTimer);\n    st.current.warmTimer = setTimeout(notify, c.warmWindow + 1);\n    if (instant) {\n      presence.jump(0);\n      finishClose();\n      return;\n    }\n    const closeMs = Math.round(c.popDuration * 0.8);\n    animate(presence, 0, { duration: closeMs / 1000, ease: EASE_OUT });\n    st.current.closeTimer = setTimeout(finishClose, closeMs);\n  };\n\n  api.current.hide = (tooltipId, instant) => {\n    const c = st.current.current;\n    if (!c || c.id !== tooltipId || st.current.state !== 'open') return;\n    clearTimeout(st.current.leaveTimer);\n    if (instant || st.current.instant) {\n      beginClose(true);\n      return;\n    }\n    st.current.leaveTimer = setTimeout(() => beginClose(false), GRACE);\n  };\n\n  const group = useMemo(\n    () => ({\n      id,\n      delay,\n      warmWindow,\n      activeId: current ? current.id : null,\n      isWarm,\n      show: (payload, mode) => api.current.show(payload, mode),\n      hide: (tooltipId, instant) => api.current.hide(tooltipId, instant),\n      reset: () => {\n        if (st.current.current) api.current.hide(st.current.current.id, true);\n        st.current.warmUntil = -Infinity;\n        clearTimeout(st.current.warmTimer);\n        notify();\n      }\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [id, delay, warmWindow, current]\n  );\n  useImperativeHandle(ref, () => ({ reset: group.reset }), [group]);\n\n  useLayoutEffect(() => {\n    const c = st.current.current;\n    const text = textRef.current;\n    if (!c || !text || state !== 'open') return;\n    const [tx, ty] = anchorOf(c.trigger.getBoundingClientRect(), c.side, c.gap);\n    const tw = text.offsetWidth + c.px * 2;\n    const th = text.offsetHeight + c.py * 2;\n    const mode = st.current.mode;\n    if (mode === 'move' && !reduce && travel > 0) {\n      const spring = { type: 'spring', duration: travel / 1000, bounce: 0.1 };\n      animate(ax, tx, spring);\n      animate(ay, ty, spring);\n      animate(w, tw, spring);\n      animate(h, th, spring);\n      animate(presence, 1, { duration: 0.12, ease: EASE_OUT });\n      return;\n    }\n    ax.jump(tx);\n    ay.jump(ty);\n    w.jump(tw);\n    h.jump(th);\n    if (mode === 'cold') {\n      presence.jump(0);\n      animate(presence, 1, { duration: c.popDuration / 1000, ease: EASE_OUT });\n    } else {\n      presence.jump(1);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [current, state]);\n\n  useEffect(() => {\n    if (state === 'closed') return undefined;\n    let raf = 0;\n    const follow = () => {\n      cancelAnimationFrame(raf);\n      raf = requestAnimationFrame(() => {\n        const c = st.current.current;\n        if (!c) return;\n        const [tx, ty] = anchorOf(c.trigger.getBoundingClientRect(), c.side, c.gap);\n        ax.jump(tx);\n        ay.jump(ty);\n      });\n    };\n    const onHidden = () => {\n      if (document.visibilityState === 'hidden' && st.current.current) api.current.hide(st.current.current.id, true);\n    };\n    window.addEventListener('scroll', follow, { capture: true, passive: true });\n    window.addEventListener('resize', follow);\n    document.addEventListener('visibilitychange', onHidden);\n    return () => {\n      cancelAnimationFrame(raf);\n      window.removeEventListener('scroll', follow, { capture: true });\n      window.removeEventListener('resize', follow);\n      document.removeEventListener('visibilitychange', onHidden);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [state]);\n\n  useEffect(\n    () => () => {\n      clearTimeout(st.current.closeTimer);\n      clearTimeout(st.current.leaveTimer);\n      clearTimeout(st.current.warmTimer);\n    },\n    []\n  );\n\n  const canPortal = typeof document !== 'undefined';\n  const side = current ? current.side : 'top';\n  const arrowStyle = horizontal(side) ? { left: arrowAt } : { top: arrowAt };\n\n  return (\n    <GroupContext.Provider value={group}>\n      {children}\n      {state !== 'closed' && current && canPortal\n        ? createPortal(\n            <motion.span\n              id={id}\n              role=\"tooltip\"\n              className=\"warm-tooltip\"\n              data-side={side}\n              style={{\n                transform: place,\n                width: w,\n                height: h,\n                '--wt-surface': current.surfaceColor,\n                '--wt-ink': current.inkColor,\n                '--wt-radius': `${current.radius}px`,\n                '--wt-font': `${current.font}px`,\n                '--wt-origin': ORIGIN[side]\n              }}\n            >\n              <motion.span className=\"warm-tooltip__box\" style={{ transform: pop, opacity: presence, filter: blur }}>\n                <AnimatePresence initial={false} custom={st.current.swap}>\n                  <motion.span\n                    key={current.id}\n                    className=\"warm-tooltip__layer\"\n                    custom={st.current.swap}\n                    variants={LAYER}\n                    initial=\"enter\"\n                    animate=\"show\"\n                    exit=\"exit\"\n                    transition={{ duration: reduce ? 0 : SWAP, ease: EASE_OUT }}\n                  >\n                    <span\n                      ref={el => {\n                        if (el) textRef.current = el;\n                      }}\n                      className=\"warm-tooltip__text\"\n                    >\n                      {current.content}\n                      {current.shortcut ? <kbd className=\"warm-tooltip__kbd\">{current.shortcut}</kbd> : null}\n                    </span>\n                  </motion.span>\n                </AnimatePresence>\n                {current.arrow ? (\n                  <motion.span className=\"warm-tooltip__arrow\" data-side={side} style={arrowStyle} aria-hidden=\"true\" />\n                ) : null}\n              </motion.span>\n            </motion.span>,\n            document.body\n          )\n        : null}\n    </GroupContext.Provider>\n  );\n});\n\nfunction Trigger({\n  content,\n  shortcut,\n  children,\n  side,\n  delay,\n  warmWindow,\n  surfaceColor,\n  inkColor,\n  size,\n  radius,\n  gap,\n  arrow,\n  popDuration,\n  popScale,\n  popBlur,\n  showFuse,\n  longPress,\n  disabled,\n  className\n}) {\n  const group = useContext(GroupContext);\n  const id = useId();\n  const triggerRef = useRef(null);\n  const [fuse, setFuse] = useState('idle');\n  const [pressing, setPressing] = useState(false);\n  const t = useRef({ open: undefined, press: undefined, press0: null, suppressClick: false });\n  const preset = SIZES[size] || SIZES.md;\n  const coldDelay = delay ?? group.delay;\n  const active = group.activeId === id;\n\n  const payload = () => ({\n    id,\n    trigger: triggerRef.current,\n    content,\n    shortcut,\n    side,\n    gap,\n    arrow,\n    surfaceColor,\n    inkColor,\n    radius,\n    font: preset.font,\n    px: preset.px,\n    py: preset.py,\n    popDuration,\n    popScale,\n    popBlur,\n    warmWindow: warmWindow ?? group.warmWindow\n  });\n\n  const hide = instant => {\n    clearTimeout(t.current.open);\n    setFuse('idle');\n    group.hide(id, instant);\n  };\n\n  const arm = () => {\n    if (group.isWarm()) {\n      group.show(payload(), 'warm');\n      return;\n    }\n    setFuse('arming');\n    t.current.open = setTimeout(() => {\n      setFuse('idle');\n      group.show(payload(), 'cold');\n    }, coldDelay);\n  };\n\n  const cancelPress = () => {\n    clearTimeout(t.current.press);\n    if (!t.current.press0) return;\n    t.current.press0 = null;\n    setPressing(false);\n    setFuse('idle');\n  };\n\n  useEffect(() => {\n    if (disabled) {\n      cancelPress();\n      hide(true);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [disabled]);\n\n  useEffect(() => {\n    if (!active) return undefined;\n    const onOutside = e => {\n      if (triggerRef.current && !triggerRef.current.contains(e.target)) hide(false);\n    };\n    document.addEventListener('pointerdown', onOutside, true);\n    return () => document.removeEventListener('pointerdown', onOutside, true);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [active]);\n\n  useEffect(\n    () => () => {\n      clearTimeout(t.current.open);\n      clearTimeout(t.current.press);\n    },\n    []\n  );\n\n  const handlers = disabled\n    ? {}\n    : {\n        onPointerEnter: e => {\n          if (e.pointerType !== 'touch' && e.buttons === 0) arm();\n        },\n        onPointerLeave: e => {\n          if (e.pointerType !== 'touch') hide(false);\n        },\n        onPointerDown: e => {\n          if (e.pointerType === 'mouse') {\n            hide(false);\n            return;\n          }\n          try {\n            e.currentTarget.setPointerCapture(e.pointerId);\n          } catch {}\n          t.current.press0 = { x: e.clientX, y: e.clientY, id: e.pointerId };\n          setPressing(true);\n          setFuse('arming');\n          t.current.press = setTimeout(() => {\n            t.current.suppressClick = true;\n            t.current.press0 = null;\n            setPressing(false);\n            setFuse('idle');\n            group.show(payload(), 'cold');\n          }, longPress);\n        },\n        onPointerMove: e => {\n          const p = t.current.press0;\n          if (p && p.id === e.pointerId && Math.hypot(e.clientX - p.x, e.clientY - p.y) > HOLD_SLOP) cancelPress();\n        },\n        onPointerUp: cancelPress,\n        onPointerCancel: cancelPress,\n        onContextMenu: e => {\n          if (t.current.press0) e.preventDefault();\n        },\n        onClickCapture: e => {\n          if (!t.current.suppressClick) return;\n          t.current.suppressClick = false;\n          e.preventDefault();\n          e.stopPropagation();\n        },\n        onFocus: e => {\n          if (e.target.matches?.(':focus-visible')) group.show(payload(), 'instant');\n        },\n        onBlur: () => hide(true),\n        onKeyDown: e => {\n          if (e.key === 'Escape') hide(true);\n        }\n      };\n\n  const described = children.props['aria-describedby'];\n\n  return (\n    <span\n      ref={triggerRef}\n      className={`warm-tooltip__trigger${className ? ` ${className}` : ''}`}\n      data-pressing={pressing ? '' : undefined}\n      style={{ '--wt-surface': surfaceColor, '--wt-fuse-ms': `${t.current.press0 ? longPress : coldDelay}ms` }}\n      {...handlers}\n    >\n      {cloneElement(children, { 'aria-describedby': active ? group.id : described })}\n      {showFuse ? <span className=\"warm-tooltip__fuse\" data-side={side} data-fuse={fuse} aria-hidden=\"true\" /> : null}\n    </span>\n  );\n}\n\nexport default function WarmTooltip({\n  content,\n  shortcut,\n  children,\n  side = 'top',\n  delay,\n  warmWindow,\n  surfaceColor = '#f5f5f5',\n  inkColor = '#18181b',\n  size = 'md',\n  radius = 8,\n  gap = 8,\n  arrow = true,\n  popDuration = 160,\n  popScale = 0.94,\n  popBlur = 4,\n  showFuse = false,\n  longPress = 500,\n  disabled = false,\n  className = ''\n}) {\n  const context = useContext(GroupContext);\n  const props = {\n    content,\n    shortcut,\n    children,\n    side,\n    delay,\n    warmWindow,\n    surfaceColor,\n    inkColor,\n    size,\n    radius,\n    gap,\n    arrow,\n    popDuration,\n    popScale,\n    popBlur,\n    showFuse,\n    longPress,\n    disabled,\n    className\n  };\n  if (context) return <Trigger {...props} />;\n  return (\n    <WarmTooltipGroup delay={delay} warmWindow={warmWindow}>\n      <Trigger {...props} />\n    </WarmTooltipGroup>\n  );\n}\n"
		}
	],
	"registryDependencies": [],
	"dependencies": [
		"react-dom@^19.0.0",
		"motion@^12.23.12"
	]
}