{"version":3,"file":"use-tour-target.cjs","sources":["../../../components/tour/use-tour-target.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { TourTarget } from './types';\n\nexport function resolveTourTarget(\n  target: TourTarget | null | undefined\n): Element | null {\n  if (target == null || typeof document === 'undefined') return null;\n  if (typeof target === 'string') {\n    try {\n      return document.querySelector(target);\n    } catch {\n      return null;\n    }\n  }\n  if (typeof target === 'function') {\n    try {\n      return target();\n    } catch {\n      return null;\n    }\n  }\n  if (target instanceof Element) return target.isConnected ? target : null;\n  return target.current?.isConnected ? target.current : null;\n}\n\nexport type TourTargetState = 'idle' | 'resolving' | 'found';\n\ninterface UseTourTargetOptions {\n  enabled: boolean;\n  timeout: number;\n  onNotFound?: () => void;\n}\n\nexport function useTourTarget(\n  target: TourTarget | null | undefined,\n  { enabled, timeout, onNotFound }: UseTourTargetOptions\n) {\n  const [element, setElement] = useState<Element | null>(null);\n  const [state, setState] = useState<TourTargetState>('idle');\n  const onNotFoundRef = useRef(onNotFound);\n  onNotFoundRef.current = onNotFound;\n\n  useEffect(() => {\n    if (!enabled) {\n      setElement(null);\n      setState('idle');\n      return;\n    }\n    if (target == null) {\n      setElement(null);\n      setState('found');\n      return;\n    }\n\n    let timer: ReturnType<typeof setTimeout> | undefined;\n    const clearTimer = () => {\n      if (timer !== undefined) {\n        clearTimeout(timer);\n        timer = undefined;\n      }\n    };\n    const startTimer = () => {\n      if (timer !== undefined) return;\n      timer = setTimeout(() => {\n        timer = undefined;\n        onNotFoundRef.current?.();\n      }, timeout);\n    };\n\n    const reconcile = () => {\n      const found = resolveTourTarget(target);\n      if (found?.isConnected) {\n        clearTimer();\n        setElement(prev => (prev === found ? prev : found));\n        setState(prev => (prev === 'found' ? prev : 'found'));\n      } else {\n        setElement(prev => (prev === null ? prev : null));\n        setState(prev => (prev === 'resolving' ? prev : 'resolving'));\n        startTimer();\n      }\n    };\n\n    reconcile();\n\n    const observer = new MutationObserver(reconcile);\n    observer.observe(document.body, {\n      childList: true,\n      subtree: true,\n      // Only selector targets can be newly satisfied by an attribute change.\n      attributes: typeof target === 'string'\n    });\n\n    return () => {\n      observer.disconnect();\n      clearTimer();\n    };\n  }, [target, enabled, timeout]);\n\n  return { element, state };\n}\n"],"names":[],"mappings":";;;;;AAKM;AAGJ;AAAuD;AACvD;AACE;AACE;;AACA;AACA;;;AAGJ;AACE;;;AAEE;AACA;;;;;AAIJ;AACF;AAUM;;;AAMJ;AACA;;;;;;;AAQE;;;;;AAMA;;AAEE;;;;AAIF;;;;AAGE;;AAEE;;AAEJ;;AAGE;AACA;AACE;AACA;AACA;;;AAEA;AACA;AACA;;AAEJ;AAEA;AAEA;AACA;AACE;AACA;;AAEA;AACD;AAED;;AAEE;AACF;;AAGF;AACF;;;"}