{"version":3,"file":"use-floating-indicator.cjs","sources":["../../../src/components/FloatingIndicator/use-floating-indicator.ts"],"sourcesContent":["import { RefObject, useEffect, useRef, useState } from 'react';\nimport { useMutationObserver, useTimeout } from '@raikou/hooks';\nimport { getEnv } from '../../core';\n\nfunction isParent(\n  parentElement: HTMLElement | EventTarget | null,\n  childElement: HTMLElement | null\n) {\n  if (!childElement || !parentElement) {\n    return false;\n  }\n\n  let parent = childElement.parentNode;\n  while (parent != null) {\n    if (parent === parentElement) {\n      return true;\n    }\n    parent = parent.parentNode;\n  }\n  return false;\n}\n\ninterface UseFloatingIndicatorInput {\n  target: HTMLElement | null | undefined;\n  parent: HTMLElement | null | undefined;\n  ref: RefObject<HTMLDivElement>;\n  displayAfterTransitionEnd?: boolean;\n}\n\nexport function useFloatingIndicator({\n  target,\n  parent,\n  ref,\n  displayAfterTransitionEnd,\n}: UseFloatingIndicatorInput) {\n  const transitionTimeout = useRef<number>();\n  const [initialized, setInitialized] = useState(false);\n\n  const [hidden, setHidden] = useState(\n    typeof displayAfterTransitionEnd === 'boolean' ? displayAfterTransitionEnd : false\n  );\n\n  const updatePosition = () => {\n    if (!target || !parent) {\n      return;\n    }\n\n    const targetRect = target.getBoundingClientRect();\n    const parentRect = parent.getBoundingClientRect();\n\n    const position = {\n      top: targetRect.top - parentRect.top,\n      left: targetRect.left - parentRect.left,\n      width: targetRect.width,\n      height: targetRect.height,\n    };\n\n    if (ref.current) {\n      ref.current.style.transform = `translateY(${position.top}px) translateX(${position.left}px)`;\n      ref.current.style.width = `${position.width}px`;\n      ref.current.style.height = `${position.height}px`;\n    }\n  };\n\n  const updatePositionWithoutAnimation = () => {\n    window.clearTimeout(transitionTimeout.current);\n    if (ref.current) {\n      ref.current.style.transitionDuration = '0ms';\n    }\n    updatePosition();\n    transitionTimeout.current = window.setTimeout(() => {\n      if (ref.current) {\n        ref.current.style.transitionDuration = '';\n      }\n    }, 30);\n  };\n\n  const targetResizeObserver = useRef<ResizeObserver>();\n  const parentResizeObserver = useRef<ResizeObserver>();\n\n  useEffect(() => {\n    updatePosition();\n\n    if (target) {\n      targetResizeObserver.current = new ResizeObserver(updatePositionWithoutAnimation);\n      targetResizeObserver.current.observe(target);\n\n      if (parent) {\n        parentResizeObserver.current = new ResizeObserver(updatePositionWithoutAnimation);\n        parentResizeObserver.current.observe(parent);\n      }\n\n      return () => {\n        targetResizeObserver.current?.disconnect();\n        parentResizeObserver.current?.disconnect();\n      };\n    }\n\n    return undefined;\n  }, [parent, target]);\n\n  useEffect(() => {\n    if (parent) {\n      const handleTransitionEnd = (event: TransitionEvent) => {\n        if (isParent(event.target, parent)) {\n          updatePositionWithoutAnimation();\n          setHidden(false);\n        }\n      };\n\n      parent.addEventListener('transitionend', handleTransitionEnd);\n      return () => {\n        parent.removeEventListener('transitionend', handleTransitionEnd);\n      };\n    }\n\n    return undefined;\n  }, [parent]);\n\n  useTimeout(\n    () => {\n      // Prevents warning about state update without act\n      if (getEnv() !== 'test') {\n        setInitialized(true);\n      }\n    },\n    20,\n    { autoInvoke: true }\n  );\n\n  useMutationObserver(\n    (mutations) => {\n      mutations.forEach((mutation) => {\n        if (mutation.type === 'attributes' && mutation.attributeName === 'dir') {\n          updatePositionWithoutAnimation();\n        }\n      });\n    },\n    { attributes: true, attributeFilter: ['dir'] },\n    () => document.documentElement\n  );\n\n  return { initialized, hidden };\n}\n"],"names":["useRef","useState","useEffect","useTimeout","getEnv","useMutationObserver"],"mappings":";;;;;;;;;;;AAIA,SAAS,QAAA,CACP,eACA,YACA,EAAA;AACA,EAAI,IAAA,CAAC,YAAgB,IAAA,CAAC,aAAe,EAAA;AACnC,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,IAAI,SAAS,YAAa,CAAA,UAAA;AAC1B,EAAA,OAAO,UAAU,IAAM,EAAA;AACrB,IAAA,IAAI,WAAW,aAAe,EAAA;AAC5B,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,MAAA,GAAS,MAAO,CAAA,UAAA;AAAA;AAElB,EAAO,OAAA,KAAA;AACT;AASO,SAAS,oBAAqB,CAAA;AAAA,EACnC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAA8B,EAAA;AAC5B,EAAA,MAAM,oBAAoBA,YAAe,EAAA;AACzC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEpD,EAAM,MAAA,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAAA,cAAA;AAAA,IAC1B,OAAO,yBAA8B,KAAA,SAAA,GAAY,yBAA4B,GAAA;AAAA,GAC/E;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAI,IAAA,CAAC,MAAU,IAAA,CAAC,MAAQ,EAAA;AACtB,MAAA;AAAA;AAGF,IAAM,MAAA,UAAA,GAAa,OAAO,qBAAsB,EAAA;AAChD,IAAM,MAAA,UAAA,GAAa,OAAO,qBAAsB,EAAA;AAEhD,IAAA,MAAM,QAAW,GAAA;AAAA,MACf,GAAA,EAAK,UAAW,CAAA,GAAA,GAAM,UAAW,CAAA,GAAA;AAAA,MACjC,IAAA,EAAM,UAAW,CAAA,IAAA,GAAO,UAAW,CAAA,IAAA;AAAA,MACnC,OAAO,UAAW,CAAA,KAAA;AAAA,MAClB,QAAQ,UAAW,CAAA;AAAA,KACrB;AAEA,IAAA,IAAI,IAAI,OAAS,EAAA;AACf,MAAI,GAAA,CAAA,OAAA,CAAQ,MAAM,SAAY,GAAA,CAAA,WAAA,EAAc,SAAS,GAAG,CAAA,eAAA,EAAkB,SAAS,IAAI,CAAA,GAAA,CAAA;AACvF,MAAA,GAAA,CAAI,OAAQ,CAAA,KAAA,CAAM,KAAQ,GAAA,CAAA,EAAG,SAAS,KAAK,CAAA,EAAA,CAAA;AAC3C,MAAA,GAAA,CAAI,OAAQ,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,EAAG,SAAS,MAAM,CAAA,EAAA,CAAA;AAAA;AAC/C,GACF;AAEA,EAAA,MAAM,iCAAiC,MAAM;AAC3C,IAAO,MAAA,CAAA,YAAA,CAAa,kBAAkB,OAAO,CAAA;AAC7C,IAAA,IAAI,IAAI,OAAS,EAAA;AACf,MAAI,GAAA,CAAA,OAAA,CAAQ,MAAM,kBAAqB,GAAA,KAAA;AAAA;AAEzC,IAAe,cAAA,EAAA;AACf,IAAkB,iBAAA,CAAA,OAAA,GAAU,MAAO,CAAA,UAAA,CAAW,MAAM;AAClD,MAAA,IAAI,IAAI,OAAS,EAAA;AACf,QAAI,GAAA,CAAA,OAAA,CAAQ,MAAM,kBAAqB,GAAA,EAAA;AAAA;AACzC,OACC,EAAE,CAAA;AAAA,GACP;AAEA,EAAA,MAAM,uBAAuBD,YAAuB,EAAA;AACpD,EAAA,MAAM,uBAAuBA,YAAuB,EAAA;AAEpD,EAAAE,eAAA,CAAU,MAAM;AACd,IAAe,cAAA,EAAA;AAEf,IAAA,IAAI,MAAQ,EAAA;AACV,MAAqB,oBAAA,CAAA,OAAA,GAAU,IAAI,cAAA,CAAe,8BAA8B,CAAA;AAChF,MAAqB,oBAAA,CAAA,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAE3C,MAAA,IAAI,MAAQ,EAAA;AACV,QAAqB,oBAAA,CAAA,OAAA,GAAU,IAAI,cAAA,CAAe,8BAA8B,CAAA;AAChF,QAAqB,oBAAA,CAAA,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAAA;AAG7C,MAAA,OAAO,MAAM;AACX,QAAA,oBAAA,CAAqB,SAAS,UAAW,EAAA;AACzC,QAAA,oBAAA,CAAqB,SAAS,UAAW,EAAA;AAAA,OAC3C;AAAA;AAGF,IAAO,OAAA,KAAA,CAAA;AAAA,GACN,EAAA,CAAC,MAAQ,EAAA,MAAM,CAAC,CAAA;AAEnB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAQ,EAAA;AACV,MAAM,MAAA,mBAAA,GAAsB,CAAC,KAA2B,KAAA;AACtD,QAAA,IAAI,QAAS,CAAA,KAAA,CAAM,MAAQ,EAAA,MAAM,CAAG,EAAA;AAClC,UAA+B,8BAAA,EAAA;AAC/B,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA;AACjB,OACF;AAEA,MAAO,MAAA,CAAA,gBAAA,CAAiB,iBAAiB,mBAAmB,CAAA;AAC5D,MAAA,OAAO,MAAM;AACX,QAAO,MAAA,CAAA,mBAAA,CAAoB,iBAAiB,mBAAmB,CAAA;AAAA,OACjE;AAAA;AAGF,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAC,gBAAA;AAAA,IACE,MAAM;AAEJ,MAAI,IAAAC,aAAA,OAAa,MAAQ,EAAA;AACvB,QAAA,cAAA,CAAe,IAAI,CAAA;AAAA;AACrB,KACF;AAAA,IACA,EAAA;AAAA,IACA,EAAE,YAAY,IAAK;AAAA,GACrB;AAEA,EAAAC,yBAAA;AAAA,IACE,CAAC,SAAc,KAAA;AACb,MAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,QAAa,KAAA;AAC9B,QAAA,IAAI,QAAS,CAAA,IAAA,KAAS,YAAgB,IAAA,QAAA,CAAS,kBAAkB,KAAO,EAAA;AACtE,UAA+B,8BAAA,EAAA;AAAA;AACjC,OACD,CAAA;AAAA,KACH;AAAA,IACA,EAAE,UAAY,EAAA,IAAA,EAAM,eAAiB,EAAA,CAAC,KAAK,CAAE,EAAA;AAAA,IAC7C,MAAM,QAAS,CAAA;AAAA,GACjB;AAEA,EAAO,OAAA,EAAE,aAAa,MAAO,EAAA;AAC/B;;;;"}