{"version":3,"file":"react-tooltip.min.cjs","sources":["../src/utils/handle-style.ts","../src/utils/compute-tooltip-position.ts","../src/utils/debounce.ts","../src/utils/get-scroll-parent.ts","../src/utils/use-isomorphic-layout-effect.ts","../src/utils/clear-timeout-ref.ts","../src/components/Tooltip/anchor-registry.ts","../src/components/Tooltip/use-tooltip-anchors.tsx","../src/components/Tooltip/event-delegation.ts","../src/components/Tooltip/Tooltip.tsx","../src/utils/css-time-to-ms.ts","../src/components/Tooltip/use-tooltip-events.tsx","../src/utils/parse-data-tooltip-id-selector.ts","../src/utils/resolve-data-tooltip-anchor.ts","../src/components/TooltipController/shared-attribute-observer.ts","../src/components/TooltipController/TooltipController.tsx","../src/index.tsx"],"sourcesContent":["// This is the ID for the core styles of ReactTooltip\nconst REACT_TOOLTIP_CORE_STYLES_ID = 'react-tooltip-core-styles'\n// This is the ID for the visual styles of ReactTooltip\nconst REACT_TOOLTIP_BASE_STYLES_ID = 'react-tooltip-base-styles'\n\nconst injected = {\n  core: false,\n  base: false,\n}\n\n/**\n * Note about `state` parameter:\n * This parameter is used to keep track of the state of the styles\n * into the tests since the const `injected` is not acessible or resettable in the tests\n */\nfunction injectStyle({\n  css,\n  id = REACT_TOOLTIP_BASE_STYLES_ID,\n  type = 'base',\n  ref,\n  state = {},\n}: {\n  css: string\n  id?: string\n  type?: 'core' | 'base'\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ref?: any\n  state?: { [key: string]: boolean }\n}) {\n  if (\n    !css ||\n    typeof document === 'undefined' ||\n    (typeof state[type] !== 'undefined' ? state[type] : injected[type])\n  ) {\n    return\n  }\n\n  if (\n    type === 'core' &&\n    typeof process !== 'undefined' && // this validation prevents docs from breaking even with `process?`\n    process.env &&\n    process.env.REACT_TOOLTIP_DISABLE_CORE_STYLES\n  ) {\n    return\n  }\n\n  if (\n    type === 'base' &&\n    typeof process !== 'undefined' && // this validation prevents docs from breaking even with `process?`\n    process.env &&\n    process.env.REACT_TOOLTIP_DISABLE_BASE_STYLES\n  ) {\n    return\n  }\n\n  if (type === 'core') {\n    id = REACT_TOOLTIP_CORE_STYLES_ID\n  }\n\n  if (!ref) {\n    ref = {}\n  }\n  const { insertAt } = ref\n\n  if (document.getElementById(id)) {\n    // this could happen in cases the tooltip is imported by multiple js modules\n    return\n  }\n\n  const head = document.head || document.getElementsByTagName('head')[0]\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const style: any = document.createElement('style')\n  style.id = id\n  style.type = 'text/css'\n\n  if (insertAt === 'top') {\n    if (head.firstChild) {\n      head.insertBefore(style, head.firstChild)\n    } else {\n      head.appendChild(style)\n    }\n  } else {\n    head.appendChild(style)\n  }\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css\n  } else {\n    style.appendChild(document.createTextNode(css))\n  }\n\n  if (typeof state[type] !== 'undefined') {\n    state[type] = true\n  } else {\n    injected[type] = true // internal global state that jest doesn't have access\n  }\n}\n\nexport { injectStyle, injected }\n","import { computePosition, offset, shift, arrow, flip } from '@floating-ui/dom'\nimport type { IComputePositionArgs } from './compute-tooltip-position-types'\n\n// Hoisted constant middlewares — these configs never change\nconst defaultFlip = flip({ fallbackAxisSideDirection: 'start' })\nconst defaultShift = shift({ padding: 5 })\n\nconst computeTooltipPosition = async ({\n  elementReference = null,\n  tooltipReference = null,\n  tooltipArrowReference = null,\n  place = 'top',\n  offset: offsetValue = 10,\n  strategy = 'absolute',\n  middlewares = [offset(Number(offsetValue)), defaultFlip, defaultShift],\n  border,\n  arrowSize = 8,\n}: IComputePositionArgs) => {\n  if (!elementReference) {\n    // elementReference can be null or undefined and we will not compute the position\n\n    // console.error('The reference element for tooltip was not defined: ', elementReference)\n    return { tooltipStyles: {}, tooltipArrowStyles: {}, place }\n  }\n\n  if (tooltipReference === null) {\n    return { tooltipStyles: {}, tooltipArrowStyles: {}, place }\n  }\n\n  const middleware = [...middlewares]\n\n  if (tooltipArrowReference) {\n    middleware.push(arrow({ element: tooltipArrowReference as HTMLElement, padding: 5 }))\n\n    return computePosition(elementReference as HTMLElement, tooltipReference as HTMLElement, {\n      placement: place,\n      strategy,\n      middleware,\n    }).then(({ x, y, placement, middlewareData }) => {\n      const styles = { left: `${x}px`, top: `${y}px`, border }\n\n      /* c8 ignore start */\n      const { x: arrowX, y: arrowY } = middlewareData.arrow ?? { x: 0, y: 0 }\n\n      const staticSide =\n        {\n          top: 'bottom',\n          right: 'left',\n          bottom: 'top',\n          left: 'right',\n        }[placement.split('-')[0]] ?? 'bottom'\n      /* c8 ignore end */\n\n      const borderSide = border && {\n        borderBottom: border,\n        borderRight: border,\n      }\n\n      let borderWidth = 0\n      if (border) {\n        const match = `${border}`.match(/(\\d+)px/)\n        if (match?.[1]) {\n          borderWidth = Number(match[1])\n        } else {\n          /**\n           * this means `border` was set without `width`,\n           * or non-px value (such as `medium`, `thick`, ...)\n           */\n          borderWidth = 1\n        }\n      }\n\n      /* c8 ignore start */\n      const arrowStyle = {\n        left: arrowX != null ? `${arrowX}px` : '',\n        top: arrowY != null ? `${arrowY}px` : '',\n        right: '',\n        bottom: '',\n        ...borderSide,\n        [staticSide]: `-${arrowSize / 2 + borderWidth - 1}px`,\n      }\n      /* c8 ignore end */\n\n      return { tooltipStyles: styles, tooltipArrowStyles: arrowStyle, place: placement }\n    })\n  }\n\n  return computePosition(elementReference as HTMLElement, tooltipReference as HTMLElement, {\n    placement: 'bottom',\n    strategy,\n    middleware,\n  }).then(({ x, y, placement }) => {\n    const styles = { left: `${x}px`, top: `${y}px` }\n\n    return { tooltipStyles: styles, tooltipArrowStyles: {}, place: placement }\n  })\n}\n\nexport default computeTooltipPosition\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * This function debounce the received function\n * @param { function } \tfunc\t\t\t\tFunction to be debounced\n * @param { number } \t\twait\t\t\t\tTime to wait before execut the function\n * @param { boolean } \timmediate\t\tParam to define if the function will be executed immediately\n */\nconst debounce = <T, A extends any[]>(\n  func: (...args: A) => void,\n  wait?: number,\n  immediate?: boolean,\n) => {\n  let timeout: NodeJS.Timeout | null = null\n  let currentFunc = func\n\n  const debounced = function debounced(this: T, ...args: A): void {\n    const later = () => {\n      timeout = null\n      if (!immediate) {\n        currentFunc.apply(this, args)\n      }\n    }\n\n    if (immediate && !timeout) {\n      /**\n       * there's no need to clear the timeout\n       * since we expect it to resolve and set `timeout = null`\n       */\n      currentFunc.apply(this, args)\n      timeout = setTimeout(later, wait)\n    }\n\n    if (!immediate) {\n      if (timeout) {\n        clearTimeout(timeout)\n      }\n      timeout = setTimeout(later, wait)\n    }\n  }\n\n  debounced.cancel = () => {\n    /* c8 ignore start */\n    if (!timeout) {\n      return\n    }\n    /* c8 ignore end */\n    clearTimeout(timeout)\n    timeout = null\n  }\n\n  debounced.setCallback = (newFunc: (...args: A) => void) => {\n    currentFunc = newFunc\n  }\n\n  return debounced\n}\n\nexport default debounce\n","export const isScrollable = (node: Element) => {\n  if (!(node instanceof HTMLElement || node instanceof SVGElement)) {\n    return false\n  }\n  const style = getComputedStyle(node)\n  return ['overflow', 'overflow-x', 'overflow-y'].some((propertyName) => {\n    const value = style.getPropertyValue(propertyName)\n    return value === 'auto' || value === 'scroll'\n  })\n}\n\nconst getScrollParent = (node: Element | null) => {\n  if (!node) {\n    return null\n  }\n  let currentParent = node.parentElement\n  while (currentParent) {\n    if (isScrollable(currentParent)) {\n      return currentParent\n    }\n    currentParent = currentParent.parentElement\n  }\n  return document.scrollingElement || document.documentElement\n}\n\nexport default getScrollParent\n","import { useLayoutEffect, useEffect } from 'react'\n\n// React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\n// subscription callback always has the selector from the latest render commit\n// available, otherwise a store update may happen between render and the effect,\n// which may cause missed updates; we also must ensure the store subscription\n// is created synchronously, otherwise a store update may occur before the\n// subscription is created and an inconsistent state may be observed\nconst isHopefullyDomEnvironment =\n  typeof window !== 'undefined' &&\n  typeof window.document !== 'undefined' &&\n  typeof window.document.createElement !== 'undefined'\n\nconst useIsomorphicLayoutEffect = isHopefullyDomEnvironment ? useLayoutEffect : useEffect\n\nexport default useIsomorphicLayoutEffect\n","const clearTimeoutRef = (ref: React.RefObject<NodeJS.Timeout | null>) => {\n  if (ref.current) {\n    clearTimeout(ref.current)\n\n    ref.current = null\n  }\n}\n\nexport default clearTimeoutRef\n","type AnchorRegistrySubscriber = (anchors: Element[], error: Error | null) => void\n\ntype AnchorRegistryEntry = {\n  anchors: Element[]\n  error: Error | null\n  subscribers: Set<AnchorRegistrySubscriber>\n  /**\n   * When the selector is a simple `[data-tooltip-id='value']` pattern,\n   * this holds the extracted tooltip ID so we can skip expensive\n   * querySelectorAll calls when the mutation doesn't affect it.\n   */\n  tooltipId: string | null\n}\n\nconst registry = new Map<string, AnchorRegistryEntry>()\n\nlet documentObserver: MutationObserver | null = null\n\n/**\n * Extract a tooltip ID from a simple `[data-tooltip-id='value']` selector.\n * Returns null for complex or custom selectors.\n */\nfunction extractTooltipId(selector: string): string | null {\n  const match = selector.match(/^\\[data-tooltip-id=(['\"])((?:\\\\.|(?!\\1).)*)\\1\\]$/)\n  return match ? match[2].replace(/\\\\(['\"])/g, '$1') : null\n}\n\nfunction areAnchorListsEqual(left: Element[], right: Element[]) {\n  if (left.length !== right.length) {\n    return false\n  }\n\n  return left.every((anchor, index) => anchor === right[index])\n}\n\nfunction readAnchorsForSelector(selector: string) {\n  try {\n    return {\n      anchors: Array.from(document.querySelectorAll(selector)),\n      error: null,\n    }\n  } catch (error) {\n    return {\n      anchors: [],\n      error: error instanceof Error ? error : new Error(String(error)),\n    }\n  }\n}\n\nfunction notifySubscribers(entry: AnchorRegistryEntry) {\n  entry.subscribers.forEach((subscriber) => subscriber(entry.anchors, entry.error))\n}\n\nfunction refreshEntry(selector: string, entry: AnchorRegistryEntry) {\n  const nextState = readAnchorsForSelector(selector)\n  const nextErrorMessage = nextState.error?.message ?? null\n  const previousErrorMessage = entry.error?.message ?? null\n\n  if (\n    areAnchorListsEqual(entry.anchors, nextState.anchors) &&\n    nextErrorMessage === previousErrorMessage\n  ) {\n    return\n  }\n\n  const nextEntry = {\n    ...entry,\n    anchors: nextState.anchors,\n    error: nextState.error,\n  }\n\n  registry.set(selector, nextEntry)\n  notifySubscribers(nextEntry)\n}\n\nfunction refreshAllEntries() {\n  registry.forEach((entry, selector) => {\n    refreshEntry(selector, entry)\n  })\n}\n\nlet refreshScheduled = false\nlet pendingTooltipIds: Set<string> | null = null\nlet pendingFullRefresh = false\n\nfunction scheduleRefresh(affectedTooltipIds: Set<string> | null) {\n  if (affectedTooltipIds) {\n    if (!pendingTooltipIds) {\n      pendingTooltipIds = new Set()\n    }\n    affectedTooltipIds.forEach((id) => pendingTooltipIds!.add(id))\n  } else {\n    pendingFullRefresh = true\n  }\n\n  if (refreshScheduled) {\n    return\n  }\n  refreshScheduled = true\n\n  const flush = () => {\n    refreshScheduled = false\n    const fullRefresh = pendingFullRefresh\n    const ids = pendingTooltipIds\n    pendingFullRefresh = false\n    pendingTooltipIds = null\n\n    if (fullRefresh) {\n      refreshAllEntries()\n    } else if (ids && ids.size > 0) {\n      refreshEntriesForTooltipIds(ids)\n    }\n  }\n\n  if (typeof requestAnimationFrame === 'function') {\n    requestAnimationFrame(flush)\n  } else {\n    Promise.resolve().then(flush)\n  }\n}\n\n/**\n * Only refresh entries whose tooltipId is in the affected set,\n * plus any entries with custom (non-tooltipId) selectors.\n */\nfunction refreshEntriesForTooltipIds(affectedIds: Set<string>) {\n  registry.forEach((entry, selector) => {\n    if (entry.tooltipId === null || affectedIds.has(entry.tooltipId)) {\n      refreshEntry(selector, entry)\n    }\n  })\n}\n\n/**\n * Collect tooltip IDs from mutation records. Returns null when targeted\n * analysis is not worthwhile (few registry entries, or too many nodes to scan).\n */\nfunction collectAffectedTooltipIds(records: MutationRecord[]): Set<string> | null {\n  // Targeted refresh only pays off when there are many distinct selectors.\n  // With few entries, full refresh is already cheap — skip the analysis overhead.\n  if (registry.size <= 4) {\n    return null\n  }\n\n  const ids = new Set<string>()\n\n  for (const record of records) {\n    if (record.type === 'attributes') {\n      const target = record.target as Element\n      const currentId = target.getAttribute?.('data-tooltip-id')\n      if (currentId) ids.add(currentId)\n      if (record.oldValue) ids.add(record.oldValue)\n      continue\n    }\n\n    if (record.type === 'childList') {\n      const gatherIds = (nodes: NodeList) => {\n        for (let i = 0; i < nodes.length; i++) {\n          const node = nodes[i]\n          if (node.nodeType !== Node.ELEMENT_NODE) continue\n          const el = node as Element\n          const id = el.getAttribute?.('data-tooltip-id')\n          if (id) ids.add(id)\n          // For large subtrees, bail out to full refresh to avoid double-scanning\n          const descendants = el.querySelectorAll?.('[data-tooltip-id]')\n          if (descendants) {\n            if (descendants.length > 50) {\n              return true // signal bail-out\n            }\n            for (let j = 0; j < descendants.length; j++) {\n              const descId = descendants[j].getAttribute('data-tooltip-id')\n              if (descId) ids.add(descId)\n            }\n          }\n        }\n        return false\n      }\n      if (gatherIds(record.addedNodes) || gatherIds(record.removedNodes)) {\n        return null // large mutation — full refresh is cheaper\n      }\n      continue\n    }\n  }\n\n  return ids\n}\n\nfunction ensureDocumentObserver() {\n  if (documentObserver || typeof MutationObserver === 'undefined') {\n    return\n  }\n\n  documentObserver = new MutationObserver((records) => {\n    const affectedIds = collectAffectedTooltipIds(records)\n    scheduleRefresh(affectedIds)\n  })\n\n  documentObserver.observe(document.body, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n    attributeFilter: ['data-tooltip-id'],\n    attributeOldValue: true,\n  })\n}\n\nfunction cleanupDocumentObserverIfUnused() {\n  if (registry.size !== 0 || !documentObserver) {\n    return\n  }\n\n  documentObserver.disconnect()\n  documentObserver = null\n}\n\nexport function subscribeAnchorSelector(selector: string, subscriber: AnchorRegistrySubscriber) {\n  let entry = registry.get(selector)\n\n  if (!entry) {\n    const initialState = readAnchorsForSelector(selector)\n    entry = {\n      anchors: initialState.anchors,\n      error: initialState.error,\n      subscribers: new Set(),\n      tooltipId: extractTooltipId(selector),\n    }\n    registry.set(selector, entry)\n  }\n\n  entry.subscribers.add(subscriber)\n  ensureDocumentObserver()\n  subscriber([...entry.anchors], entry.error)\n\n  return () => {\n    const currentEntry = registry.get(selector)\n    if (!currentEntry) {\n      return\n    }\n\n    currentEntry.subscribers.delete(subscriber)\n    if (currentEntry.subscribers.size === 0) {\n      registry.delete(selector)\n    }\n    cleanupDocumentObserverIfUnused()\n  }\n}\n\n/** @internal Reset module state between tests */\nexport function resetAnchorRegistry() {\n  registry.clear()\n  if (documentObserver) {\n    documentObserver.disconnect()\n    documentObserver = null\n  }\n  refreshScheduled = false\n  pendingTooltipIds = null\n  pendingFullRefresh = false\n}\n","import { useEffect, useMemo, useRef, useState } from 'react'\nimport { subscribeAnchorSelector } from './anchor-registry'\n\nconst getAnchorSelector = ({\n  id,\n  anchorSelect,\n  imperativeAnchorSelect,\n}: {\n  id?: string\n  anchorSelect?: string\n  imperativeAnchorSelect?: string\n}) => {\n  let selector = imperativeAnchorSelect ?? anchorSelect ?? ''\n  if (!selector && id) {\n    selector = `[data-tooltip-id='${id.replace(/'/g, \"\\\\'\")}']`\n  }\n  return selector\n}\n\nconst useTooltipAnchors = ({\n  id,\n  anchorSelect,\n  imperativeAnchorSelect,\n  activeAnchor,\n  disableTooltip,\n  onActiveAnchorRemoved,\n  trackAnchors,\n}: {\n  id?: string\n  anchorSelect?: string\n  imperativeAnchorSelect?: string\n  activeAnchor: Element | null\n  disableTooltip?: (anchorRef: Element | null) => boolean\n  onActiveAnchorRemoved: () => void\n  trackAnchors: boolean\n}) => {\n  const [rawAnchorElements, setRawAnchorElements] = useState<Element[]>([])\n  const [selectorError, setSelectorError] = useState<Error | null>(null)\n  const warnedSelectorRef = useRef<string | null>(null)\n  const selector = useMemo(\n    () => getAnchorSelector({ id, anchorSelect, imperativeAnchorSelect }),\n    [id, anchorSelect, imperativeAnchorSelect],\n  )\n  const anchorElements = useMemo(\n    () => rawAnchorElements.filter((anchor) => !disableTooltip?.(anchor)),\n    [rawAnchorElements, disableTooltip],\n  )\n\n  const activeAnchorMatchesSelector = useMemo(() => {\n    if (!activeAnchor || !selector) {\n      return false\n    }\n\n    try {\n      return activeAnchor.matches(selector)\n    } catch {\n      return false\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [activeAnchor, selector, anchorElements])\n\n  useEffect(() => {\n    if (!selector || !trackAnchors) {\n      setRawAnchorElements([])\n      setSelectorError(null)\n      return undefined\n    }\n\n    return subscribeAnchorSelector(selector, (anchors, error) => {\n      setRawAnchorElements(anchors)\n      setSelectorError(error)\n    })\n  }, [selector, trackAnchors])\n\n  useEffect(() => {\n    if (!selectorError || warnedSelectorRef.current === selector) {\n      return\n    }\n    warnedSelectorRef.current = selector\n    /* c8 ignore start */\n    if (!process.env.NODE_ENV || process.env.NODE_ENV !== 'production') {\n      console.warn(`[react-tooltip] \"${selector}\" is not a valid CSS selector`)\n    }\n    /* c8 ignore end */\n  }, [selector, selectorError])\n\n  useEffect(() => {\n    if (!activeAnchor) {\n      return\n    }\n\n    if (!activeAnchor.isConnected) {\n      onActiveAnchorRemoved()\n      return\n    }\n\n    if (!anchorElements.includes(activeAnchor) && !activeAnchorMatchesSelector) {\n      onActiveAnchorRemoved()\n    }\n  }, [activeAnchor, anchorElements, activeAnchorMatchesSelector, onActiveAnchorRemoved])\n\n  return {\n    anchorElements,\n    selector,\n  }\n}\n\nexport default useTooltipAnchors\n","/**\n * Shared document event delegation.\n *\n * Instead of N tooltips each calling document.addEventListener(type, handler),\n * we maintain ONE document listener per event type. When the event fires,\n * we iterate through all registered handlers for that type.\n *\n * This reduces document-level listeners from O(N × eventTypes) to O(eventTypes).\n */\n\ntype Handler = (event: Event) => void\n\ntype DelegatedListener = {\n  handlers: Set<Handler>\n  dispatch: (event: Event) => void\n  eventType: string\n  capture: boolean\n}\n\nconst handlersByType = new Map<string, DelegatedListener>()\n\nfunction getListenerKey(eventType: string, capture: boolean): string {\n  return `${eventType}:${capture ? 'capture' : 'bubble'}`\n}\n\nfunction getOrCreateListener(eventType: string, capture: boolean): DelegatedListener {\n  const key = getListenerKey(eventType, capture)\n  let listener = handlersByType.get(key)\n  if (!listener) {\n    const handlers = new Set<Handler>()\n    const dispatch = (event: Event): void => {\n      handlers.forEach((handler) => {\n        handler(event)\n      })\n    }\n    listener = { handlers, dispatch, eventType, capture }\n    handlersByType.set(key, listener)\n    document.addEventListener(eventType, dispatch, { capture })\n  }\n  return listener\n}\n\n/**\n * Register a handler for a document-level event type.\n * Returns an unsubscribe function.\n */\nexport function addDelegatedEventListener(\n  eventType: string,\n  handler: Handler,\n  options: AddEventListenerOptions = {},\n): () => void {\n  const capture = Boolean(options.capture)\n  const key = getListenerKey(eventType, capture)\n  const listener = getOrCreateListener(eventType, capture)\n  listener.handlers.add(handler)\n\n  return () => {\n    listener.handlers.delete(handler)\n    if (listener.handlers.size === 0) {\n      handlersByType.delete(key)\n      document.removeEventListener(eventType, listener.dispatch, { capture })\n    }\n  }\n}\n\n/**\n * Reset for testing purposes.\n */\nexport function resetEventDelegation(): void {\n  handlersByType.forEach((listener) => {\n    document.removeEventListener(listener.eventType, listener.dispatch, {\n      capture: listener.capture,\n    })\n  })\n  handlersByType.clear()\n}\n","import React, {\n  useEffect,\n  useMemo,\n  useState,\n  useRef,\n  useCallback,\n  useImperativeHandle,\n  memo,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport clsx from 'clsx'\nimport {\n  useIsomorphicLayoutEffect,\n  computeTooltipPosition,\n  cssTimeToMs,\n  clearTimeoutRef,\n} from '../../utils'\nimport type { IComputedPosition } from '../../utils'\nimport coreStyles from './core-styles.module.css'\nimport styles from './styles.module.css'\nimport useTooltipAnchors from './use-tooltip-anchors'\nimport useTooltipEvents from './use-tooltip-events'\nimport type { IPosition, ITooltip, TooltipImperativeOpenOptions } from './TooltipTypes'\n\n// Shared across all tooltip instances — the CSS variable is on :root and never changes per-instance\nlet globalTransitionShowDelay: number | null = null\n\nconst Tooltip = ({\n  // props\n  forwardRef,\n  id,\n  className,\n  classNameArrow,\n  variant = 'dark',\n  portalRoot,\n  anchorSelect,\n  place = 'top',\n  offset = 10,\n  openOnClick = false,\n  positionStrategy = 'absolute',\n  middlewares,\n  wrapper: WrapperElement,\n  delayShow = 0,\n  delayHide = 0,\n  autoClose,\n  float = false,\n  hidden = false,\n  noArrow = false,\n  clickable = false,\n  openEvents,\n  closeEvents,\n  globalCloseEvents,\n  imperativeModeOnly,\n  style: externalStyles,\n  position,\n  afterShow,\n  afterHide,\n  disableTooltip,\n  // props handled by controller\n  content,\n  contentWrapperRef,\n  isOpen,\n  defaultIsOpen = false,\n  setIsOpen,\n  previousActiveAnchor,\n  activeAnchor,\n  setActiveAnchor,\n  border,\n  opacity,\n  arrowColor,\n  arrowSize = 8,\n  role = 'tooltip',\n}: ITooltip) => {\n  const tooltipRef = useRef<HTMLElement>(null)\n  const tooltipArrowRef = useRef<HTMLElement>(null)\n  const tooltipShowDelayTimerRef = useRef<NodeJS.Timeout | null>(null)\n  const tooltipHideDelayTimerRef = useRef<NodeJS.Timeout | null>(null)\n  const tooltipAutoCloseTimerRef = useRef<NodeJS.Timeout | null>(null)\n  const missedTransitionTimerRef = useRef<NodeJS.Timeout | null>(null)\n  const [computedPosition, setComputedPosition] = useState<IComputedPosition>({\n    tooltipStyles: {},\n    tooltipArrowStyles: {},\n    place,\n  })\n  const [show, setShow] = useState(false)\n  const [rendered, setRendered] = useState(false)\n  const [imperativeOptions, setImperativeOptions] = useState<TooltipImperativeOpenOptions | null>(\n    null,\n  )\n  const wasShowing = useRef(false)\n  const lastFloatPosition = useRef<IPosition | null>(null)\n  const hoveringTooltip = useRef(false)\n  const mounted = useRef(false)\n  const virtualElementRef = useRef({\n    getBoundingClientRect: () => ({\n      x: 0,\n      y: 0,\n      width: 0,\n      height: 0,\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n    }),\n  })\n\n  /**\n   * useLayoutEffect runs before useEffect,\n   * but should be used carefully because of caveats\n   * https://beta.reactjs.org/reference/react/useLayoutEffect#caveats\n   */\n  useIsomorphicLayoutEffect(() => {\n    mounted.current = true\n    return () => {\n      mounted.current = false\n    }\n  }, [])\n\n  const handleShow = useCallback(\n    (value: boolean) => {\n      if (!mounted.current) {\n        return\n      }\n      if (value) {\n        setRendered(true)\n      }\n      /**\n       * wait for the component to render and calculate position\n       * before actually showing\n       */\n      setTimeout(() => {\n        if (!mounted.current) {\n          return\n        }\n        setIsOpen?.(value)\n        if (isOpen === undefined) {\n          setShow(value)\n        }\n      }, 10)\n    },\n    [isOpen, setIsOpen],\n  )\n\n  /**\n   * Add aria-describedby to activeAnchor when tooltip is active\n   */\n  useEffect(() => {\n    if (!id) return\n\n    function getAriaDescribedBy(element: Element | null) {\n      return element?.getAttribute('aria-describedby')?.split(' ') || []\n    }\n\n    function removeAriaDescribedBy(element: Element | null) {\n      const newDescribedBy = getAriaDescribedBy(element).filter((s) => s !== id)\n      if (newDescribedBy.length) {\n        element?.setAttribute('aria-describedby', newDescribedBy.join(' '))\n      } else {\n        element?.removeAttribute('aria-describedby')\n      }\n    }\n\n    if (show) {\n      removeAriaDescribedBy(previousActiveAnchor)\n      const currentDescribedBy = getAriaDescribedBy(activeAnchor)\n      const describedBy = [...new Set([...currentDescribedBy, id])].filter(Boolean).join(' ')\n      activeAnchor?.setAttribute('aria-describedby', describedBy)\n    } else {\n      removeAriaDescribedBy(activeAnchor)\n    }\n\n    return () => {\n      // cleanup aria-describedby when the tooltip is closed\n      removeAriaDescribedBy(activeAnchor)\n      removeAriaDescribedBy(previousActiveAnchor)\n    }\n  }, [activeAnchor, show, id, previousActiveAnchor])\n\n  /**\n   * this replicates the effect from `handleShow()`\n   * when `isOpen` is changed from outside\n   */\n  useEffect(() => {\n    if (isOpen === undefined) {\n      return () => null\n    }\n    if (isOpen) {\n      setRendered(true)\n    }\n    const timeout = setTimeout(() => {\n      setShow(isOpen)\n    }, 10)\n    return () => {\n      clearTimeout(timeout)\n    }\n  }, [isOpen])\n\n  useEffect(() => {\n    if (show === wasShowing.current) {\n      return\n    }\n    clearTimeoutRef(missedTransitionTimerRef)\n    wasShowing.current = show\n    if (show) {\n      afterShow?.()\n    } else {\n      /**\n       * see `onTransitionEnd` on tooltip wrapper\n       */\n      if (globalTransitionShowDelay === null) {\n        const style = getComputedStyle(document.body)\n        globalTransitionShowDelay = cssTimeToMs(\n          style.getPropertyValue('--rt-transition-show-delay'),\n        )\n      }\n      const transitionShowDelay = globalTransitionShowDelay\n      missedTransitionTimerRef.current = setTimeout(() => {\n        /**\n         * if the tooltip switches from `show === true` to `show === false` too fast\n         * the transition never runs, so `onTransitionEnd` callback never gets fired\n         */\n        setRendered(false)\n        setImperativeOptions(null)\n        afterHide?.()\n        // +25ms just to make sure `onTransitionEnd` (if it gets fired) has time to run\n      }, transitionShowDelay + 25)\n    }\n  }, [afterHide, afterShow, show])\n\n  useEffect(() => {\n    clearTimeoutRef(tooltipAutoCloseTimerRef)\n\n    if (!show || !autoClose || autoClose <= 0) {\n      return () => {\n        clearTimeoutRef(tooltipAutoCloseTimerRef)\n      }\n    }\n\n    tooltipAutoCloseTimerRef.current = setTimeout(() => {\n      handleShow(false)\n    }, autoClose)\n\n    return () => {\n      clearTimeoutRef(tooltipAutoCloseTimerRef)\n    }\n  }, [activeAnchor, autoClose, handleShow, show])\n\n  const handleComputedPosition = useCallback((newComputedPosition: IComputedPosition) => {\n    if (!mounted.current) {\n      return\n    }\n    setComputedPosition((oldComputedPosition) => {\n      if (\n        oldComputedPosition.place === newComputedPosition.place &&\n        oldComputedPosition.tooltipStyles.left === newComputedPosition.tooltipStyles.left &&\n        oldComputedPosition.tooltipStyles.top === newComputedPosition.tooltipStyles.top &&\n        oldComputedPosition.tooltipStyles.border === newComputedPosition.tooltipStyles.border &&\n        oldComputedPosition.tooltipArrowStyles.left ===\n          newComputedPosition.tooltipArrowStyles.left &&\n        oldComputedPosition.tooltipArrowStyles.top === newComputedPosition.tooltipArrowStyles.top &&\n        oldComputedPosition.tooltipArrowStyles.right ===\n          newComputedPosition.tooltipArrowStyles.right &&\n        oldComputedPosition.tooltipArrowStyles.bottom ===\n          newComputedPosition.tooltipArrowStyles.bottom &&\n        oldComputedPosition.tooltipArrowStyles.borderBottom ===\n          newComputedPosition.tooltipArrowStyles.borderBottom &&\n        oldComputedPosition.tooltipArrowStyles.borderRight ===\n          newComputedPosition.tooltipArrowStyles.borderRight\n      ) {\n        return oldComputedPosition\n      }\n      return newComputedPosition\n    })\n  }, [])\n\n  const renderedRef = useRef(rendered)\n  renderedRef.current = rendered\n\n  const handleShowTooltipDelayed = useCallback(\n    (delay = delayShow) => {\n      if (tooltipShowDelayTimerRef.current) {\n        clearTimeout(tooltipShowDelayTimerRef.current)\n      }\n\n      if (renderedRef.current) {\n        // if the tooltip is already rendered, ignore delay\n        handleShow(true)\n        return\n      }\n\n      tooltipShowDelayTimerRef.current = setTimeout(() => {\n        handleShow(true)\n      }, delay)\n    },\n    [delayShow, handleShow],\n  )\n\n  const handleHideTooltipDelayed = useCallback(\n    (delay = delayHide) => {\n      if (tooltipHideDelayTimerRef.current) {\n        clearTimeout(tooltipHideDelayTimerRef.current)\n      }\n\n      tooltipHideDelayTimerRef.current = setTimeout(() => {\n        if (hoveringTooltip.current) {\n          return\n        }\n        handleShow(false)\n      }, delay)\n    },\n    [delayHide, handleShow],\n  )\n\n  const handleTooltipPosition = useCallback(\n    ({ x, y }: IPosition) => {\n      virtualElementRef.current.getBoundingClientRect = () => ({\n        x,\n        y,\n        width: 0,\n        height: 0,\n        top: y,\n        left: x,\n        right: x,\n        bottom: y,\n      })\n      computeTooltipPosition({\n        place: imperativeOptions?.place ?? place,\n        offset,\n        elementReference: virtualElementRef.current as unknown as Element,\n        tooltipReference: tooltipRef.current,\n        tooltipArrowReference: tooltipArrowRef.current,\n        strategy: positionStrategy,\n        middlewares,\n        border,\n        arrowSize,\n      }).then((computedStylesData) => {\n        handleComputedPosition(computedStylesData)\n      })\n    },\n    [\n      imperativeOptions?.place,\n      place,\n      offset,\n      positionStrategy,\n      middlewares,\n      border,\n      arrowSize,\n      handleComputedPosition,\n    ],\n  )\n\n  const updateTooltipPosition = useCallback(() => {\n    const actualPosition = imperativeOptions?.position ?? position\n    if (actualPosition) {\n      // if `position` is set, override regular and `float` positioning\n      handleTooltipPosition(actualPosition)\n      return\n    }\n\n    if (float) {\n      if (lastFloatPosition.current) {\n        /*\n          Without this, changes to `content`, `place`, `offset`, ..., will only\n          trigger a position calculation after a `mousemove` event.\n\n          To see why this matters, comment this line, run `yarn dev` and click the\n          \"Hover me!\" anchor.\n        */\n        handleTooltipPosition(lastFloatPosition.current)\n      }\n      // if `float` is set, override regular positioning\n      return\n    }\n\n    if (!activeAnchor?.isConnected) {\n      return\n    }\n\n    computeTooltipPosition({\n      place: imperativeOptions?.place ?? place,\n      offset,\n      elementReference: activeAnchor,\n      tooltipReference: tooltipRef.current,\n      tooltipArrowReference: tooltipArrowRef.current,\n      strategy: positionStrategy,\n      middlewares,\n      border,\n      arrowSize,\n    }).then((computedStylesData) => {\n      if (!mounted.current) {\n        // invalidate computed positions after remount\n        return\n      }\n      handleComputedPosition(computedStylesData)\n    })\n  }, [\n    imperativeOptions?.position,\n    imperativeOptions?.place,\n    position,\n    float,\n    activeAnchor,\n    place,\n    offset,\n    positionStrategy,\n    middlewares,\n    border,\n    handleTooltipPosition,\n    handleComputedPosition,\n    arrowSize,\n  ])\n\n  const handleActiveAnchorRemoved = useCallback(() => {\n    setRendered(false)\n    handleShow(false)\n    setActiveAnchor(null)\n    clearTimeoutRef(tooltipShowDelayTimerRef)\n    clearTimeoutRef(tooltipHideDelayTimerRef)\n    clearTimeoutRef(tooltipAutoCloseTimerRef)\n  }, [handleShow, setActiveAnchor])\n\n  const shouldTrackAnchors =\n    rendered ||\n    defaultIsOpen ||\n    Boolean(isOpen) ||\n    Boolean(activeAnchor) ||\n    Boolean(imperativeOptions?.anchorSelect)\n\n  const { anchorElements, selector: anchorSelector } = useTooltipAnchors({\n    id,\n    anchorSelect,\n    imperativeAnchorSelect: imperativeOptions?.anchorSelect,\n    activeAnchor,\n    disableTooltip,\n    onActiveAnchorRemoved: handleActiveAnchorRemoved,\n    trackAnchors: shouldTrackAnchors,\n  })\n\n  useTooltipEvents({\n    activeAnchor,\n    anchorElements,\n    anchorSelector,\n    clickable,\n    closeEvents,\n    delayHide,\n    delayShow,\n    disableTooltip,\n    float,\n    globalCloseEvents,\n    handleHideTooltipDelayed,\n    handleShow,\n    handleShowTooltipDelayed,\n    handleTooltipPosition,\n    hoveringTooltip,\n    imperativeModeOnly,\n    lastFloatPosition,\n    openEvents,\n    openOnClick,\n    rendered,\n    setActiveAnchor,\n    show,\n    tooltipHideDelayTimerRef,\n    tooltipRef,\n    tooltipShowDelayTimerRef,\n    updateTooltipPosition,\n  })\n\n  const updateTooltipPositionRef = useRef(updateTooltipPosition)\n  updateTooltipPositionRef.current = updateTooltipPosition\n\n  useEffect(() => {\n    if (!rendered) {\n      return\n    }\n    updateTooltipPosition()\n  }, [rendered, updateTooltipPosition])\n\n  useEffect(() => {\n    if (!rendered || !contentWrapperRef?.current) {\n      return () => null\n    }\n\n    let timeoutId: NodeJS.Timeout | null = null\n    const contentObserver = new ResizeObserver(() => {\n      // Clear any existing timeout to prevent memory leaks\n      if (timeoutId) {\n        clearTimeout(timeoutId)\n      }\n      timeoutId = setTimeout(() => {\n        if (mounted.current) {\n          updateTooltipPositionRef.current()\n        }\n        timeoutId = null\n      }, 0)\n    })\n    contentObserver.observe(contentWrapperRef.current)\n\n    return () => {\n      contentObserver.disconnect()\n      if (timeoutId) {\n        clearTimeout(timeoutId)\n      }\n    }\n  }, [content, contentWrapperRef, rendered])\n\n  useEffect(() => {\n    const shouldResolveInitialActiveAnchor = defaultIsOpen || Boolean(isOpen)\n\n    if (!shouldResolveInitialActiveAnchor) {\n      return\n    }\n\n    const activeAnchorMatchesImperativeSelector = (() => {\n      if (!activeAnchor || !imperativeOptions?.anchorSelect) {\n        return false\n      }\n\n      try {\n        return activeAnchor.matches(imperativeOptions.anchorSelect)\n      } catch {\n        return false\n      }\n    })()\n\n    if (!activeAnchor || !anchorElements.includes(activeAnchor)) {\n      /**\n       * if there is no active anchor,\n       * or if the current active anchor is not amongst the allowed ones,\n       * reset it\n       */\n      if (activeAnchorMatchesImperativeSelector) {\n        return\n      }\n      setActiveAnchor(anchorElements[0] ?? null)\n    }\n  }, [\n    activeAnchor,\n    anchorElements,\n    defaultIsOpen,\n    imperativeOptions?.anchorSelect,\n    isOpen,\n    rendered,\n    setActiveAnchor,\n  ])\n\n  useEffect(() => {\n    if (defaultIsOpen) {\n      handleShow(true)\n    }\n    return () => {\n      clearTimeoutRef(tooltipShowDelayTimerRef)\n      clearTimeoutRef(tooltipHideDelayTimerRef)\n      clearTimeoutRef(tooltipAutoCloseTimerRef)\n      clearTimeoutRef(missedTransitionTimerRef)\n    }\n  }, [defaultIsOpen, handleShow])\n\n  useEffect(() => {\n    if (tooltipShowDelayTimerRef.current) {\n      /**\n       * if the delay changes while the tooltip is waiting to show,\n       * reset the timer with the new delay\n       */\n      clearTimeoutRef(tooltipShowDelayTimerRef)\n      handleShowTooltipDelayed(delayShow)\n    }\n  }, [delayShow, handleShowTooltipDelayed])\n\n  const actualContent = imperativeOptions?.content ?? content\n  const hasContent = actualContent !== null && actualContent !== undefined\n  const canShow = show && computedPosition.tooltipStyles.left !== undefined\n\n  const tooltipStyle = useMemo(\n    () => ({\n      ...externalStyles,\n      ...computedPosition.tooltipStyles,\n      opacity: opacity !== undefined && canShow ? opacity : undefined,\n    }),\n    [externalStyles, computedPosition.tooltipStyles, opacity, canShow],\n  )\n\n  const arrowBackground = useMemo(\n    () =>\n      arrowColor\n        ? `linear-gradient(to right bottom, transparent 50%, ${arrowColor} 50%)`\n        : undefined,\n    [arrowColor],\n  )\n\n  const arrowStyle = useMemo(\n    () => ({\n      ...computedPosition.tooltipArrowStyles,\n      background: arrowBackground,\n      '--rt-arrow-size': `${arrowSize}px`,\n    }),\n    [computedPosition.tooltipArrowStyles, arrowBackground, arrowSize],\n  )\n\n  useImperativeHandle(forwardRef, () => ({\n    open: (options) => {\n      let imperativeAnchor: Element | null = null\n      if (options?.anchorSelect) {\n        try {\n          imperativeAnchor = document.querySelector(options.anchorSelect)\n        } catch {\n          if (!process.env.NODE_ENV || process.env.NODE_ENV !== 'production') {\n            console.warn(`[react-tooltip] \"${options.anchorSelect}\" is not a valid CSS selector`)\n          }\n          return\n        }\n        if (!imperativeAnchor) {\n          return\n        }\n      }\n      if (imperativeAnchor) {\n        setActiveAnchor(imperativeAnchor)\n      }\n      setImperativeOptions(options ?? null)\n      if (options?.delay) {\n        handleShowTooltipDelayed(options.delay)\n      } else {\n        handleShow(true)\n      }\n    },\n    close: (options) => {\n      if (options?.delay) {\n        handleHideTooltipDelayed(options.delay)\n      } else {\n        handleShow(false)\n      }\n    },\n    activeAnchor,\n    place: computedPosition.place,\n    isOpen: Boolean(rendered && !hidden && hasContent && canShow),\n  }))\n\n  useEffect(() => {\n    return () => {\n      // Final cleanup to ensure no memory leaks\n      clearTimeoutRef(tooltipShowDelayTimerRef)\n      clearTimeoutRef(tooltipHideDelayTimerRef)\n      clearTimeoutRef(tooltipAutoCloseTimerRef)\n      clearTimeoutRef(missedTransitionTimerRef)\n    }\n  }, [])\n\n  const tooltipNode =\n    rendered && !hidden && hasContent ? (\n      <WrapperElement\n        id={id}\n        role={role}\n        className={clsx(\n          'react-tooltip',\n          coreStyles['tooltip'],\n          styles['tooltip'],\n          styles[variant],\n          className,\n          `react-tooltip__place-${computedPosition.place}`,\n          coreStyles[canShow ? 'show' : 'closing'],\n          canShow ? 'react-tooltip__show' : 'react-tooltip__closing',\n          positionStrategy === 'fixed' && coreStyles['fixed'],\n          clickable && coreStyles['clickable'],\n        )}\n        onTransitionEnd={(event: TransitionEvent) => {\n          clearTimeoutRef(missedTransitionTimerRef)\n          if (show || event.propertyName !== 'opacity') {\n            return\n          }\n          setRendered(false)\n          setImperativeOptions(null)\n          afterHide?.()\n        }}\n        style={tooltipStyle}\n        ref={tooltipRef}\n      >\n        <WrapperElement\n          className={clsx(\n            'react-tooltip-content-wrapper',\n            coreStyles['content'],\n            styles['content'],\n          )}\n        >\n          {actualContent}\n        </WrapperElement>\n        <WrapperElement\n          className={clsx(\n            'react-tooltip-arrow',\n            coreStyles['arrow'],\n            styles['arrow'],\n            classNameArrow,\n            noArrow && coreStyles['noArrow'],\n          )}\n          style={arrowStyle}\n          ref={tooltipArrowRef}\n        />\n      </WrapperElement>\n    ) : null\n\n  if (!tooltipNode) {\n    return null\n  }\n\n  if (portalRoot) {\n    return createPortal(tooltipNode, portalRoot)\n  }\n\n  return tooltipNode\n}\n\nexport default memo(Tooltip)\n","const cssTimeToMs = (time: string): number => {\n  const match = time.match(/^([\\d.]+)(m?s)$/)\n  if (!match) {\n    return 0\n  }\n  const [, amount, unit] = match\n  return Number(amount) * (unit === 'ms' ? 1 : 1000)\n}\n\nexport default cssTimeToMs\n","import { useEffect, useMemo, useRef } from 'react'\nimport type { RefObject } from 'react'\nimport { autoUpdate } from '@floating-ui/dom'\nimport {\n  debounce,\n  getScrollParent,\n  clearTimeoutRef,\n  parseDataTooltipIdSelector,\n  resolveDataTooltipAnchor,\n} from '../../utils'\nimport type {\n  AnchorCloseEvents,\n  AnchorOpenEvents,\n  GlobalCloseEvents,\n  IPosition,\n} from './TooltipTypes'\nimport { addDelegatedEventListener } from './event-delegation'\n\nconst useTooltipEvents = ({\n  activeAnchor,\n  anchorElements,\n  anchorSelector,\n  clickable,\n  closeEvents,\n  delayHide,\n  delayShow,\n  disableTooltip,\n  float,\n  globalCloseEvents,\n  handleHideTooltipDelayed,\n  handleShow,\n  handleShowTooltipDelayed,\n  handleTooltipPosition,\n  hoveringTooltip,\n  imperativeModeOnly,\n  lastFloatPosition,\n  openEvents,\n  openOnClick,\n  rendered,\n  setActiveAnchor,\n  show,\n  tooltipHideDelayTimerRef,\n  tooltipRef,\n  tooltipShowDelayTimerRef,\n  updateTooltipPosition,\n}: {\n  activeAnchor: Element | null\n  anchorElements: Element[]\n  anchorSelector: string\n  clickable: boolean\n  closeEvents?: AnchorCloseEvents\n  delayHide: number\n  delayShow: number\n  disableTooltip?: (anchorRef: Element | null) => boolean\n  float: boolean\n  globalCloseEvents?: GlobalCloseEvents\n  handleHideTooltipDelayed: (delay?: number) => void\n  handleShow: (value: boolean) => void\n  handleShowTooltipDelayed: (delay?: number) => void\n  handleTooltipPosition: ({ x, y }: IPosition) => void\n  hoveringTooltip: RefObject<boolean>\n  imperativeModeOnly?: boolean\n  lastFloatPosition: RefObject<IPosition | null>\n  openEvents?: AnchorOpenEvents\n  openOnClick: boolean\n  rendered: boolean\n  setActiveAnchor: (anchor: Element | null) => void\n  show: boolean\n  tooltipHideDelayTimerRef: RefObject<NodeJS.Timeout | null>\n  tooltipRef: RefObject<HTMLElement | null>\n  tooltipShowDelayTimerRef: RefObject<NodeJS.Timeout | null>\n  updateTooltipPosition: () => void\n}) => {\n  // Ref-stable debounced handlers — avoids recreating debounce instances on every effect run\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const debouncedShowRef = useRef(debounce((_anchor: Element | null) => {}, 50, true))\n  const debouncedHideRef = useRef(debounce(() => {}, 50, true))\n\n  // Cache scroll parents — only recompute when the element actually changes\n  const anchorScrollParentRef = useRef<Element | null>(null)\n  const tooltipScrollParentRef = useRef<Element | null>(null)\n  const prevAnchorRef = useRef<Element | null>(null)\n  const prevTooltipRef = useRef<HTMLElement | null>(null)\n\n  if (activeAnchor !== prevAnchorRef.current) {\n    prevAnchorRef.current = activeAnchor\n    anchorScrollParentRef.current = getScrollParent(activeAnchor)\n  }\n  const currentTooltipEl = tooltipRef.current\n  if (currentTooltipEl !== prevTooltipRef.current) {\n    prevTooltipRef.current = currentTooltipEl\n    tooltipScrollParentRef.current = getScrollParent(currentTooltipEl)\n  }\n\n  // Memoize event config objects — only rebuild when the relevant props change\n  const hasClickEvent =\n    openOnClick || openEvents?.click || openEvents?.dblclick || openEvents?.mousedown\n  const actualOpenEvents: AnchorOpenEvents = useMemo(() => {\n    const events: AnchorOpenEvents = openEvents\n      ? { ...openEvents }\n      : {\n          mouseenter: true,\n          focus: true,\n          click: false,\n          dblclick: false,\n          mousedown: false,\n        }\n    if (!openEvents && openOnClick) {\n      Object.assign(events, {\n        mouseenter: false,\n        focus: false,\n        click: true,\n      })\n    }\n    if (imperativeModeOnly) {\n      Object.assign(events, {\n        mouseenter: false,\n        focus: false,\n        click: false,\n        dblclick: false,\n        mousedown: false,\n      })\n    }\n    return events\n  }, [openEvents, openOnClick, imperativeModeOnly])\n\n  const actualCloseEvents: AnchorCloseEvents = useMemo(() => {\n    const events: AnchorCloseEvents = closeEvents\n      ? { ...closeEvents }\n      : {\n          mouseleave: true,\n          blur: true,\n          click: false,\n          dblclick: false,\n          mouseup: false,\n        }\n    if (!closeEvents && openOnClick) {\n      Object.assign(events, {\n        mouseleave: false,\n        blur: false,\n      })\n    }\n    if (imperativeModeOnly) {\n      Object.assign(events, {\n        mouseleave: false,\n        blur: false,\n        click: false,\n        dblclick: false,\n        mouseup: false,\n      })\n    }\n    return events\n  }, [closeEvents, openOnClick, imperativeModeOnly])\n\n  const actualGlobalCloseEvents: GlobalCloseEvents = useMemo(() => {\n    const events: GlobalCloseEvents = globalCloseEvents\n      ? { ...globalCloseEvents }\n      : {\n          escape: false,\n          scroll: false,\n          resize: false,\n          clickOutsideAnchor: hasClickEvent || false,\n        }\n    if (imperativeModeOnly) {\n      Object.assign(events, {\n        escape: false,\n        scroll: false,\n        resize: false,\n        clickOutsideAnchor: false,\n      })\n    }\n    return events\n  }, [globalCloseEvents, hasClickEvent, imperativeModeOnly])\n\n  // --- Refs for values read inside event handlers (avoids effect deps) ---\n  const activeAnchorRef = useRef(activeAnchor)\n  activeAnchorRef.current = activeAnchor\n  const showRef = useRef(show)\n  showRef.current = show\n  const anchorElementsRef = useRef(anchorElements)\n  anchorElementsRef.current = anchorElements\n  const handleShowRef = useRef(handleShow)\n  handleShowRef.current = handleShow\n  const handleTooltipPositionRef = useRef(handleTooltipPosition)\n  handleTooltipPositionRef.current = handleTooltipPosition\n  const updateTooltipPositionRef = useRef(updateTooltipPosition)\n  updateTooltipPositionRef.current = updateTooltipPosition\n\n  // --- Handler refs (updated every render, read via ref indirection in effects) ---\n  const resolveAnchorElementRef = useRef<(target: EventTarget | null) => Element | null>(() => null)\n  const handleShowTooltipRef = useRef<(anchor: Element | null) => void>(() => {})\n  const handleHideTooltipRef = useRef<() => void>(() => {})\n\n  const dataTooltipId = anchorSelector ? parseDataTooltipIdSelector(anchorSelector) : null\n\n  resolveAnchorElementRef.current = (target: EventTarget | null) => {\n    if (!(target instanceof Element) || !target.isConnected) {\n      return null\n    }\n\n    const targetElement = target\n\n    if (dataTooltipId) {\n      const matchedAnchor = resolveDataTooltipAnchor(targetElement, dataTooltipId)\n\n      if (matchedAnchor && !disableTooltip?.(matchedAnchor)) {\n        return matchedAnchor\n      }\n    } else if (anchorSelector) {\n      try {\n        const matchedAnchor =\n          (targetElement.matches(anchorSelector)\n            ? targetElement\n            : targetElement.closest(anchorSelector)) ?? null\n\n        if (matchedAnchor && !disableTooltip?.(matchedAnchor)) {\n          return matchedAnchor\n        }\n      } catch {\n        return null\n      }\n    }\n\n    return (\n      anchorElementsRef.current.find(\n        (anchor) => anchor === targetElement || anchor.contains(targetElement),\n      ) ?? null\n    )\n  }\n\n  handleShowTooltipRef.current = (anchor: Element | null) => {\n    if (!anchor) {\n      return\n    }\n    if (!anchor.isConnected) {\n      setActiveAnchor(null)\n      return\n    }\n    if (disableTooltip?.(anchor)) {\n      return\n    }\n    if (delayShow && activeAnchorRef.current && anchor !== activeAnchorRef.current) {\n      // Moving to a different anchor while one is already active — defer the anchor\n      // switch until the show delay fires to prevent content/position from updating\n      // before visibility transitions complete.\n      if (tooltipShowDelayTimerRef.current) {\n        clearTimeout(tooltipShowDelayTimerRef.current)\n      }\n      tooltipShowDelayTimerRef.current = setTimeout(() => {\n        setActiveAnchor(anchor)\n        handleShow(true)\n      }, delayShow)\n    } else {\n      setActiveAnchor(anchor)\n      if (delayShow) {\n        handleShowTooltipDelayed()\n      } else {\n        handleShow(true)\n      }\n    }\n\n    if (tooltipHideDelayTimerRef.current) {\n      clearTimeout(tooltipHideDelayTimerRef.current)\n    }\n  }\n\n  handleHideTooltipRef.current = () => {\n    if (clickable) {\n      handleHideTooltipDelayed(delayHide || 100)\n    } else if (delayHide) {\n      handleHideTooltipDelayed()\n    } else {\n      handleShow(false)\n    }\n\n    if (tooltipShowDelayTimerRef.current) {\n      clearTimeout(tooltipShowDelayTimerRef.current)\n    }\n  }\n\n  // Update debounced callbacks to always delegate to latest handler refs\n  const debouncedShow = debouncedShowRef.current\n  const debouncedHide = debouncedHideRef.current\n  debouncedShow.setCallback((anchor: Element | null) => handleShowTooltipRef.current(anchor))\n  debouncedHide.setCallback(() => handleHideTooltipRef.current())\n\n  // --- Effect 1: Delegated anchor events + tooltip hover ---\n  // Only re-runs when the set of active event types or interaction mode changes.\n  // Handlers read reactive values (activeAnchor, show, etc.) from refs at invocation\n  // time, so this effect is decoupled from show/hide state changes.\n  useEffect(() => {\n    const cleanupFns: (() => void)[] = []\n\n    const addDelegatedListener = (\n      eventType: string,\n      listener: (event: Event) => void,\n      options?: AddEventListenerOptions,\n    ) => {\n      cleanupFns.push(addDelegatedEventListener(eventType, listener, options))\n    }\n\n    const activeAnchorContainsTarget = (event?: Event): boolean =>\n      Boolean(event?.target instanceof Node && activeAnchorRef.current?.contains(event.target))\n\n    const debouncedHandleShowTooltip = (anchor: Element | null) => {\n      debouncedHide.cancel()\n      debouncedShow(anchor)\n    }\n    const debouncedHandleHideTooltip = () => {\n      debouncedShow.cancel()\n      debouncedHide()\n    }\n\n    const addDelegatedHoverOpenListener = () => {\n      addDelegatedListener('mouseover', (event) => {\n        const anchor = resolveAnchorElementRef.current(event.target)\n        if (!anchor) {\n          return\n        }\n        const relatedAnchor = resolveAnchorElementRef.current((event as MouseEvent).relatedTarget)\n        if (relatedAnchor === anchor) {\n          return\n        }\n        debouncedHandleShowTooltip(anchor)\n      })\n    }\n\n    const addDelegatedHoverCloseListener = () => {\n      addDelegatedListener('mouseout', (event) => {\n        const targetAnchor = resolveAnchorElementRef.current(event.target)\n        if (!targetAnchor && !activeAnchorContainsTarget(event)) {\n          return\n        }\n        const relatedTarget = (event as MouseEvent).relatedTarget\n        const containerAnchor = targetAnchor || activeAnchorRef.current\n        if (relatedTarget instanceof Node && containerAnchor?.contains(relatedTarget)) {\n          return\n        }\n        debouncedHandleHideTooltip()\n      })\n    }\n\n    if (actualOpenEvents.mouseenter) {\n      addDelegatedHoverOpenListener()\n    }\n    if (actualCloseEvents.mouseleave) {\n      addDelegatedHoverCloseListener()\n    }\n    if (actualOpenEvents.mouseover) {\n      addDelegatedHoverOpenListener()\n    }\n    if (actualCloseEvents.mouseout) {\n      addDelegatedHoverCloseListener()\n    }\n    if (actualOpenEvents.focus) {\n      addDelegatedListener('focusin', (event) => {\n        debouncedHandleShowTooltip(resolveAnchorElementRef.current(event.target))\n      })\n    }\n    if (actualOpenEvents.mouseenter || actualOpenEvents.mouseover || actualOpenEvents.focus) {\n      addDelegatedListener('touchstart', (event) => {\n        debouncedHandleShowTooltip(resolveAnchorElementRef.current(event.target))\n      })\n    }\n    if (actualCloseEvents.blur) {\n      addDelegatedListener('focusout', (event) => {\n        const targetAnchor = resolveAnchorElementRef.current(event.target)\n        if (!targetAnchor && !activeAnchorContainsTarget(event)) {\n          return\n        }\n        const relatedTarget = (event as FocusEvent).relatedTarget\n        const containerAnchor = targetAnchor || activeAnchorRef.current\n        if (relatedTarget instanceof Node && containerAnchor?.contains(relatedTarget)) {\n          return\n        }\n        debouncedHandleHideTooltip()\n      })\n    }\n\n    const regularEvents = ['mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'focus', 'blur']\n    const clickEvents = ['click', 'dblclick', 'mousedown', 'mouseup']\n\n    const handleClickOpenTooltipAnchor = (event?: Event) => {\n      const anchor = resolveAnchorElementRef.current(event?.target ?? null)\n      if (!anchor) {\n        return\n      }\n      if (showRef.current && activeAnchorRef.current === anchor) {\n        return\n      }\n      handleShowTooltipRef.current(anchor)\n    }\n    const handleClickCloseTooltipAnchor = (event?: Event) => {\n      if (!showRef.current || !activeAnchorContainsTarget(event)) {\n        return\n      }\n      handleHideTooltipRef.current()\n    }\n\n    Object.entries(actualOpenEvents).forEach(([event, enabled]) => {\n      if (!enabled || regularEvents.includes(event)) {\n        return\n      }\n      if (clickEvents.includes(event)) {\n        addDelegatedListener(event, handleClickOpenTooltipAnchor as (event: Event) => void, {\n          capture: true,\n        })\n      }\n    })\n\n    Object.entries(actualCloseEvents).forEach(([event, enabled]) => {\n      if (!enabled || regularEvents.includes(event)) {\n        return\n      }\n      if (clickEvents.includes(event)) {\n        addDelegatedListener(event, handleClickCloseTooltipAnchor as (event: Event) => void, {\n          capture: true,\n        })\n      }\n    })\n\n    if (float) {\n      addDelegatedListener('pointermove', (event) => {\n        const currentActiveAnchor = activeAnchorRef.current\n        if (!currentActiveAnchor) {\n          return\n        }\n        const targetAnchor = resolveAnchorElementRef.current(event.target)\n        if (targetAnchor !== currentActiveAnchor) {\n          return\n        }\n        const mouseEvent = event as MouseEvent\n        const mousePosition = {\n          x: mouseEvent.clientX,\n          y: mouseEvent.clientY,\n        }\n        handleTooltipPositionRef.current(mousePosition)\n        lastFloatPosition.current = mousePosition\n      })\n    }\n\n    const tooltipElement = tooltipRef.current\n    const handleMouseOverTooltip = () => {\n      hoveringTooltip.current = true\n    }\n    const handleMouseOutTooltip = () => {\n      hoveringTooltip.current = false\n      handleHideTooltipRef.current()\n    }\n\n    const addHoveringTooltipListeners =\n      clickable && (actualCloseEvents.mouseout || actualCloseEvents.mouseleave)\n    if (addHoveringTooltipListeners) {\n      tooltipElement?.addEventListener('mouseover', handleMouseOverTooltip)\n      tooltipElement?.addEventListener('mouseout', handleMouseOutTooltip)\n    }\n\n    return () => {\n      cleanupFns.forEach((fn) => fn())\n      if (addHoveringTooltipListeners) {\n        tooltipElement?.removeEventListener('mouseover', handleMouseOverTooltip)\n        tooltipElement?.removeEventListener('mouseout', handleMouseOutTooltip)\n      }\n      debouncedShow.cancel()\n      debouncedHide.cancel()\n    }\n    // `rendered` needs to be a dependency because `tooltipRef` becomes stale when the\n    // tooltip is removed from / added to the DOM.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [actualOpenEvents, actualCloseEvents, float, clickable, rendered])\n\n  // --- Effect 2: Global close events + auto-update ---\n  // Re-runs when the global close config changes, or when the active anchor changes\n  // (for scroll parent listeners and floating-ui autoUpdate).\n  useEffect(() => {\n    const handleScrollResize = () => {\n      handleShowRef.current(false)\n      clearTimeoutRef(tooltipShowDelayTimerRef)\n    }\n\n    const tooltipScrollParent = tooltipScrollParentRef.current\n    const anchorScrollParent = anchorScrollParentRef.current\n\n    if (actualGlobalCloseEvents.scroll) {\n      window.addEventListener('scroll', handleScrollResize)\n      anchorScrollParent?.addEventListener('scroll', handleScrollResize)\n      tooltipScrollParent?.addEventListener('scroll', handleScrollResize)\n    }\n    let updateTooltipCleanup: null | (() => void) = null\n    if (actualGlobalCloseEvents.resize) {\n      window.addEventListener('resize', handleScrollResize)\n    } else if (activeAnchor && tooltipRef.current) {\n      updateTooltipCleanup = autoUpdate(\n        activeAnchor as HTMLElement,\n        tooltipRef.current as HTMLElement,\n        () => updateTooltipPositionRef.current(),\n        {\n          ancestorResize: true,\n          elementResize: true,\n          layoutShift: true,\n        },\n      )\n    }\n\n    const handleEsc = (event: KeyboardEvent) => {\n      if (event.key !== 'Escape') {\n        return\n      }\n      handleShowRef.current(false)\n    }\n    if (actualGlobalCloseEvents.escape) {\n      window.addEventListener('keydown', handleEsc)\n    }\n\n    const handleClickOutsideAnchors = (event: Event) => {\n      if (!showRef.current) {\n        return\n      }\n      const target = (event as MouseEvent).target\n      if (!(target instanceof Node) || !target.isConnected) {\n        return\n      }\n      if (tooltipRef.current?.contains(target)) {\n        return\n      }\n      if (activeAnchorRef.current?.contains(target)) {\n        return\n      }\n      if (anchorElementsRef.current.some((anchor) => anchor?.contains(target))) {\n        return\n      }\n      handleShowRef.current(false)\n      clearTimeoutRef(tooltipShowDelayTimerRef)\n    }\n\n    if (actualGlobalCloseEvents.clickOutsideAnchor) {\n      window.addEventListener('click', handleClickOutsideAnchors)\n    }\n\n    return () => {\n      if (actualGlobalCloseEvents.scroll) {\n        window.removeEventListener('scroll', handleScrollResize)\n        anchorScrollParent?.removeEventListener('scroll', handleScrollResize)\n        tooltipScrollParent?.removeEventListener('scroll', handleScrollResize)\n      }\n      if (actualGlobalCloseEvents.resize) {\n        window.removeEventListener('resize', handleScrollResize)\n      }\n      if (updateTooltipCleanup) {\n        updateTooltipCleanup()\n      }\n      if (actualGlobalCloseEvents.escape) {\n        window.removeEventListener('keydown', handleEsc)\n      }\n      if (actualGlobalCloseEvents.clickOutsideAnchor) {\n        window.removeEventListener('click', handleClickOutsideAnchors)\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [actualGlobalCloseEvents, activeAnchor])\n}\n\nexport default useTooltipEvents\n","function parseDataTooltipIdSelector(selector: string) {\n  const match = selector.match(/^\\[data-tooltip-id=(['\"])((?:\\\\.|(?!\\1).)*)\\1\\]$/)\n\n  if (!match) {\n    return null\n  }\n\n  return match[2].replace(/\\\\(['\"])/g, '$1')\n}\n\nexport default parseDataTooltipIdSelector\n","function resolveDataTooltipAnchor(targetElement: Element, tooltipId: string) {\n  let currentElement: Element | null = targetElement\n\n  while (currentElement) {\n    const dataset = (currentElement as Element & { dataset?: DOMStringMap }).dataset\n    if (dataset?.tooltipId === tooltipId) {\n      return currentElement\n    }\n    currentElement = currentElement.parentElement\n  }\n\n  return null\n}\n\nexport default resolveDataTooltipAnchor\n","/**\n * Shared MutationObserver for data-tooltip-* attribute changes.\n * Instead of N observers (one per tooltip), a single observer watches\n * all active anchors and dispatches changes to registered callbacks.\n */\n\ntype AttributeCallback = (element: Element) => void\n\nconst observedElements = new Map<Element, Set<AttributeCallback>>()\n\nlet sharedObserver: MutationObserver | null = null\n\nconst observerConfig: MutationObserverInit = {\n  attributes: true,\n  childList: false,\n  subtree: false,\n}\n\nfunction getObserver(): MutationObserver {\n  if (!sharedObserver) {\n    sharedObserver = new MutationObserver((mutationList) => {\n      for (const mutation of mutationList) {\n        if (\n          mutation.type !== 'attributes' ||\n          !mutation.attributeName?.startsWith('data-tooltip-')\n        ) {\n          continue\n        }\n        const target = mutation.target as Element\n        const callbacks = observedElements.get(target)\n        if (callbacks) {\n          callbacks.forEach((cb) => cb(target))\n        }\n      }\n    })\n  }\n  return sharedObserver\n}\n\nexport function observeAnchorAttributes(element: Element, callback: AttributeCallback): () => void {\n  const observer = getObserver()\n  let callbacks = observedElements.get(element)\n  if (!callbacks) {\n    callbacks = new Set()\n    observedElements.set(element, callbacks)\n    observer.observe(element, observerConfig)\n  }\n  callbacks.add(callback)\n\n  return () => {\n    const cbs = observedElements.get(element)\n    if (cbs) {\n      cbs.delete(callback)\n      if (cbs.size === 0) {\n        observedElements.delete(element)\n        // MutationObserver doesn't have unobserve — if no elements left, disconnect & reset\n        if (observedElements.size === 0) {\n          observer.disconnect()\n        } else {\n          // Re-observe remaining elements (MutationObserver has no per-target unobserve)\n          observer.disconnect()\n          observedElements.forEach((_cbs, el) => {\n            observer.observe(el, observerConfig)\n          })\n        }\n      }\n    }\n  }\n}\n\n/**\n * Reset for testing purposes\n */\nexport function resetSharedAttributeObserver(): void {\n  sharedObserver?.disconnect()\n  sharedObserver = null\n  observedElements.clear()\n}\n","import React, { useCallback, useEffect, useRef, useState, memo } from 'react'\nimport clsx from 'clsx'\nimport { Tooltip } from '../Tooltip'\nimport type {\n  PositionStrategy,\n  PlacesType,\n  VariantType,\n  WrapperType,\n  DataAttribute,\n  ITooltip,\n  TooltipRefProps,\n} from '../Tooltip/TooltipTypes'\nimport type { ITooltipController } from './TooltipControllerTypes'\nimport { observeAnchorAttributes } from './shared-attribute-observer'\n\nconst TooltipController = React.forwardRef<TooltipRefProps, ITooltipController>(\n  (\n    {\n      id,\n      anchorSelect,\n      content,\n      render,\n      className,\n      classNameArrow,\n      variant = 'dark',\n      portalRoot,\n      place = 'top',\n      offset = 10,\n      wrapper = 'div',\n      children = null,\n      openOnClick = false,\n      positionStrategy = 'absolute',\n      middlewares,\n      delayShow = 0,\n      delayHide = 0,\n      autoClose,\n      float = false,\n      hidden = false,\n      noArrow = false,\n      clickable = false,\n      openEvents,\n      closeEvents,\n      globalCloseEvents,\n      imperativeModeOnly = false,\n      style,\n      position,\n      isOpen,\n      defaultIsOpen = false,\n      disableStyleInjection = false,\n      border,\n      opacity,\n      arrowColor,\n      arrowSize,\n      setIsOpen,\n      afterShow,\n      afterHide,\n      disableTooltip,\n      role = 'tooltip',\n    }: ITooltipController,\n    ref,\n  ) => {\n    const [activeAnchor, setActiveAnchor] = useState<Element | null>(null)\n    const [anchorDataAttributes, setAnchorDataAttributes] = useState<\n      Partial<Record<DataAttribute, string | null>>\n    >({})\n    const previousActiveAnchorRef = useRef<Element | null>(null)\n    const styleInjectionRef = useRef(disableStyleInjection)\n\n    const handleSetActiveAnchor = useCallback((anchor: Element | null) => {\n      setActiveAnchor((prev) => {\n        if (!anchor?.isSameNode(prev)) {\n          previousActiveAnchorRef.current = prev\n        }\n        return anchor\n      })\n    }, [])\n\n    /* c8 ignore start */\n    const getDataAttributesFromAnchorElement = (elementReference: Element) => {\n      const dataAttributes = elementReference?.getAttributeNames().reduce(\n        (acc, name) => {\n          if (name.startsWith('data-tooltip-')) {\n            const parsedAttribute = name.replace(/^data-tooltip-/, '') as DataAttribute\n            acc[parsedAttribute] = elementReference?.getAttribute(name) ?? null\n          }\n          return acc\n        },\n        {} as Record<DataAttribute, string | null>,\n      )\n\n      return dataAttributes\n    }\n    /* c8 ignore end */\n\n    useEffect(() => {\n      if (styleInjectionRef.current === disableStyleInjection) {\n        return\n      }\n      /* c8 ignore start */\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn('[react-tooltip] Do not change `disableStyleInjection` dynamically.')\n      }\n      /* c8 ignore end */\n    }, [disableStyleInjection])\n\n    useEffect(() => {\n      if (typeof window !== 'undefined') {\n        window.dispatchEvent(\n          new CustomEvent('react-tooltip-inject-styles', {\n            detail: {\n              disableCore: disableStyleInjection === 'core',\n              disableBase: disableStyleInjection,\n            },\n          }),\n        )\n      }\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [])\n\n    useEffect(() => {\n      if (!activeAnchor) {\n        setAnchorDataAttributes({})\n        return () => {}\n      }\n\n      const updateAttributes = (element: Element) => {\n        const attrs = getDataAttributesFromAnchorElement(element)\n        setAnchorDataAttributes((prev) => {\n          const keys = Object.keys(attrs) as DataAttribute[]\n          const prevKeys = Object.keys(prev) as DataAttribute[]\n          if (keys.length === prevKeys.length && keys.every((key) => attrs[key] === prev[key])) {\n            return prev\n          }\n          return attrs\n        })\n      }\n\n      updateAttributes(activeAnchor)\n\n      const unsubscribe = observeAnchorAttributes(activeAnchor, updateAttributes)\n\n      return unsubscribe\n    }, [activeAnchor, anchorSelect])\n\n    useEffect(() => {\n      /* c8 ignore start */\n      if (process.env.NODE_ENV === 'production') {\n        return\n      }\n      /* c8 ignore end */\n      if (style?.border) {\n        console.warn('[react-tooltip] Do not set `style.border`. Use `border` prop instead.')\n      }\n      if (style?.opacity) {\n        console.warn('[react-tooltip] Do not set `style.opacity`. Use `opacity` prop instead.')\n      }\n    }, [border, opacity, style?.border, style?.opacity])\n\n    const currentAnchorDataAttributes = activeAnchor\n      ? getDataAttributesFromAnchorElement(activeAnchor)\n      : anchorDataAttributes\n\n    /**\n     * content priority: children < render or content < html\n     * children should be lower priority so that it can be used as the \"default\" content\n     */\n    const tooltipContent = currentAnchorDataAttributes.content ?? content\n    const tooltipPlace = (currentAnchorDataAttributes.place as PlacesType | undefined) ?? place\n    const tooltipVariant =\n      (currentAnchorDataAttributes.variant as VariantType | undefined) ?? variant\n    const tooltipOffset =\n      currentAnchorDataAttributes.offset == null\n        ? offset\n        : Number(currentAnchorDataAttributes.offset)\n    const tooltipWrapper =\n      (currentAnchorDataAttributes.wrapper as WrapperType | undefined) ?? wrapper\n    const tooltipPositionStrategy =\n      (currentAnchorDataAttributes['position-strategy'] as PositionStrategy | undefined) ??\n      positionStrategy\n    const tooltipDelayShow =\n      currentAnchorDataAttributes['delay-show'] == null\n        ? delayShow\n        : Number(currentAnchorDataAttributes['delay-show'])\n    const tooltipDelayHide =\n      currentAnchorDataAttributes['delay-hide'] == null\n        ? delayHide\n        : Number(currentAnchorDataAttributes['delay-hide'])\n    const tooltipAutoClose =\n      currentAnchorDataAttributes['auto-close'] == null\n        ? autoClose\n        : Number(currentAnchorDataAttributes['auto-close'])\n    const tooltipFloat =\n      currentAnchorDataAttributes.float == null\n        ? float\n        : currentAnchorDataAttributes.float === 'true'\n    const tooltipHidden =\n      currentAnchorDataAttributes.hidden == null\n        ? hidden\n        : currentAnchorDataAttributes.hidden === 'true'\n    const tooltipClassName = currentAnchorDataAttributes['class-name'] ?? null\n\n    let renderedContent = children\n    const contentWrapperRef = useRef<HTMLDivElement>(null)\n    if (render) {\n      const actualContent = currentAnchorDataAttributes.content ?? tooltipContent ?? null\n      const rendered = render({ content: actualContent, activeAnchor }) as React.ReactNode\n      renderedContent = rendered ? (\n        <div ref={contentWrapperRef} className=\"react-tooltip-content-wrapper\">\n          {rendered}\n        </div>\n      ) : null\n    } else if (tooltipContent !== null && tooltipContent !== undefined) {\n      renderedContent = tooltipContent\n    }\n\n    const props: ITooltip = {\n      forwardRef: ref,\n      id,\n      anchorSelect,\n      className: clsx(className, tooltipClassName),\n      classNameArrow,\n      content: renderedContent,\n      contentWrapperRef,\n      portalRoot,\n      place: tooltipPlace,\n      variant: tooltipVariant,\n      offset: tooltipOffset,\n      wrapper: tooltipWrapper,\n      openOnClick,\n      positionStrategy: tooltipPositionStrategy,\n      middlewares,\n      delayShow: tooltipDelayShow,\n      delayHide: tooltipDelayHide,\n      autoClose: tooltipAutoClose,\n      float: tooltipFloat,\n      hidden: tooltipHidden,\n      noArrow,\n      clickable,\n      openEvents,\n      closeEvents,\n      globalCloseEvents,\n      imperativeModeOnly,\n      style,\n      position,\n      isOpen,\n      defaultIsOpen,\n      border,\n      opacity,\n      arrowColor,\n      arrowSize,\n      setIsOpen,\n      afterShow,\n      afterHide,\n      disableTooltip,\n      activeAnchor,\n      previousActiveAnchor: previousActiveAnchorRef.current,\n      setActiveAnchor: handleSetActiveAnchor,\n      role,\n    }\n\n    return <Tooltip {...props} />\n  },\n)\n\nexport default memo(TooltipController)\n","import './tokens.css'\n\nimport { injectStyle } from './utils/handle-style'\n\nimport type {\n  DataAttribute,\n  PlacesType,\n  PositionStrategy,\n  VariantType,\n  WrapperType,\n  IPosition,\n  Middleware,\n  TooltipRefProps,\n} from './components/Tooltip/TooltipTypes'\nimport type { ITooltipController } from './components/TooltipController/TooltipControllerTypes'\n\n// those content will be replaced in build time with the `react-tooltip.css` builded content\nconst TooltipCoreStyles = 'react-tooltip-core-css-placeholder'\nconst TooltipStyles = 'react-tooltip-css-placeholder'\n\nif (typeof window !== 'undefined') {\n  window.addEventListener('react-tooltip-inject-styles', ((\n    event: CustomEvent<{ disableCore: boolean; disableBase: boolean }>,\n  ) => {\n    if (!event.detail.disableCore) {\n      injectStyle({ css: TooltipCoreStyles, type: 'core' })\n    }\n    if (!event.detail.disableBase) {\n      injectStyle({ css: TooltipStyles, type: 'base' })\n    }\n  }) as EventListener)\n}\n\nexport { TooltipController as Tooltip } from './components/TooltipController'\nexport type {\n  DataAttribute,\n  PlacesType,\n  PositionStrategy,\n  VariantType,\n  WrapperType,\n  ITooltipController as ITooltip,\n  IPosition,\n  Middleware,\n  TooltipRefProps,\n}\n"],"names":["injected","core","base","injectStyle","css","id","type","ref","state","document","process","env","REACT_TOOLTIP_DISABLE_CORE_STYLES","REACT_TOOLTIP_DISABLE_BASE_STYLES","insertAt","getElementById","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","defaultFlip","flip","fallbackAxisSideDirection","defaultShift","shift","padding","computeTooltipPosition","async","elementReference","tooltipReference","tooltipArrowReference","place","offset","offsetValue","strategy","middlewares","Number","border","arrowSize","tooltipStyles","tooltipArrowStyles","middleware","push","arrow","element","computePosition","placement","then","x","y","middlewareData","styles","left","top","arrowX","arrowY","_a","staticSide","_b","right","bottom","split","borderSide","borderBottom","borderRight","borderWidth","match","debounce","func","wait","immediate","timeout","currentFunc","debounced","args","later","apply","this","setTimeout","cancel","clearTimeout","setCallback","newFunc","isScrollable","node","HTMLElement","SVGElement","getComputedStyle","some","propertyName","value","getPropertyValue","getScrollParent","currentParent","parentElement","scrollingElement","documentElement","useIsomorphicLayoutEffect","window","useLayoutEffect","useEffect","clearTimeoutRef","current","registry","Map","documentObserver","extractTooltipId","selector","replace","readAnchorsForSelector","anchors","Array","from","querySelectorAll","error","Error","String","refreshEntry","entry","nextState","nextErrorMessage","message","previousErrorMessage","_d","_c","length","every","anchor","index","nextEntry","set","subscribers","forEach","subscriber","notifySubscribers","refreshScheduled","pendingTooltipIds","pendingFullRefresh","scheduleRefresh","affectedTooltipIds","Set","add","flush","fullRefresh","ids","affectedIds","size","tooltipId","has","requestAnimationFrame","Promise","resolve","ensureDocumentObserver","MutationObserver","records","record","target","currentId","getAttribute","call","oldValue","gatherIds","nodes","i","nodeType","Node","ELEMENT_NODE","el","descendants","j","descId","addedNodes","removedNodes","collectAffectedTooltipIds","observe","body","childList","subtree","attributes","attributeFilter","attributeOldValue","subscribeAnchorSelector","get","initialState","currentEntry","delete","disconnect","handlersByType","getListenerKey","eventType","capture","addDelegatedEventListener","handler","options","Boolean","key","listener","handlers","dispatch","event","addEventListener","getOrCreateListener","removeEventListener","globalTransitionShowDelay","Tooltip$1","memo","forwardRef","className","classNameArrow","variant","portalRoot","anchorSelect","openOnClick","positionStrategy","wrapper","WrapperElement","delayShow","delayHide","autoClose","float","hidden","noArrow","clickable","openEvents","closeEvents","globalCloseEvents","imperativeModeOnly","externalStyles","position","afterShow","afterHide","disableTooltip","content","contentWrapperRef","isOpen","defaultIsOpen","setIsOpen","previousActiveAnchor","activeAnchor","setActiveAnchor","opacity","arrowColor","role","tooltipRef","useRef","tooltipArrowRef","tooltipShowDelayTimerRef","tooltipHideDelayTimerRef","tooltipAutoCloseTimerRef","missedTransitionTimerRef","computedPosition","setComputedPosition","useState","show","setShow","rendered","setRendered","imperativeOptions","setImperativeOptions","wasShowing","lastFloatPosition","hoveringTooltip","mounted","virtualElementRef","getBoundingClientRect","width","height","handleShow","useCallback","undefined","removeAriaDescribedBy","currentDescribedBy","getAriaDescribedBy","describedBy","filter","join","setAttribute","newDescribedBy","s","removeAttribute","time","amount","unit","cssTimeToMs","transitionShowDelay","handleComputedPosition","newComputedPosition","oldComputedPosition","renderedRef","handleShowTooltipDelayed","delay","handleHideTooltipDelayed","handleTooltipPosition","computedStylesData","updateTooltipPosition","actualPosition","isConnected","handleActiveAnchorRemoved","shouldTrackAnchors","anchorElements","anchorSelector","imperativeAnchorSelect","onActiveAnchorRemoved","trackAnchors","rawAnchorElements","setRawAnchorElements","selectorError","setSelectorError","warnedSelectorRef","useMemo","getAnchorSelector","activeAnchorMatchesSelector","matches","includes","useTooltipAnchors","debouncedShowRef","_anchor","debouncedHideRef","anchorScrollParentRef","tooltipScrollParentRef","prevAnchorRef","prevTooltipRef","currentTooltipEl","hasClickEvent","click","dblclick","mousedown","actualOpenEvents","events","mouseenter","focus","Object","assign","actualCloseEvents","mouseleave","blur","mouseup","actualGlobalCloseEvents","escape","scroll","resize","clickOutsideAnchor","activeAnchorRef","showRef","anchorElementsRef","handleShowRef","handleTooltipPositionRef","updateTooltipPositionRef","resolveAnchorElementRef","handleShowTooltipRef","handleHideTooltipRef","dataTooltipId","parseDataTooltipIdSelector","Element","targetElement","matchedAnchor","currentElement","dataset","resolveDataTooltipAnchor","closest","find","contains","debouncedShow","debouncedHide","cleanupFns","addDelegatedListener","activeAnchorContainsTarget","debouncedHandleShowTooltip","debouncedHandleHideTooltip","addDelegatedHoverOpenListener","relatedTarget","addDelegatedHoverCloseListener","targetAnchor","containerAnchor","mouseover","mouseout","regularEvents","clickEvents","handleClickOpenTooltipAnchor","handleClickCloseTooltipAnchor","entries","enabled","currentActiveAnchor","mouseEvent","mousePosition","clientX","clientY","tooltipElement","handleMouseOverTooltip","handleMouseOutTooltip","addHoveringTooltipListeners","fn","handleScrollResize","tooltipScrollParent","anchorScrollParent","updateTooltipCleanup","autoUpdate","ancestorResize","elementResize","layoutShift","handleEsc","handleClickOutsideAnchors","useTooltipEvents","timeoutId","contentObserver","ResizeObserver","activeAnchorMatchesImperativeSelector","actualContent","hasContent","canShow","tooltipStyle","arrowBackground","arrowStyle","background","useImperativeHandle","open","imperativeAnchor","querySelector","close","tooltipNode","React","clsx","coreStyles","onTransitionEnd","createPortal","observedElements","sharedObserver","observerConfig","observeAnchorAttributes","callback","observer","mutationList","mutation","attributeName","startsWith","callbacks","cb","cbs","_cbs","TooltipController","render","children","disableStyleInjection","anchorDataAttributes","setAnchorDataAttributes","previousActiveAnchorRef","styleInjectionRef","handleSetActiveAnchor","prev","isSameNode","getDataAttributesFromAnchorElement","dataAttributes","getAttributeNames","reduce","acc","name","dispatchEvent","CustomEvent","detail","disableCore","disableBase","updateAttributes","attrs","keys","prevKeys","currentAnchorDataAttributes","tooltipContent","tooltipPlace","tooltipVariant","tooltipOffset","tooltipWrapper","tooltipPositionStrategy","_e","tooltipDelayShow","tooltipDelayHide","tooltipAutoClose","tooltipFloat","tooltipHidden","tooltipClassName","_f","renderedContent","_h","_g","props","Tooltip","TooltipController_default"],"mappings":"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"}