{"version":3,"sources":["../../../../src/sensors/useElementByPoint/core.ts"],"sourcesContent":["import { observable, ObservableHint, type Observable } from \"@legendapp/state\";\nimport {\n  createSupported,\n  onMount,\n  peek,\n  type DeepMaybeObservable,\n  type ReadonlyObservable,\n  type Pausable,\n  type Supportable,\n} from \"@usels/core\";\nimport {\n  type ConfigurableWindow,\n  defaultDocument,\n  resolveWindowSource,\n} from \"@shared/configurable\";\n\nexport interface UseElementByPointOptions<M extends boolean = false> extends ConfigurableWindow {\n  /** X coordinate */\n  x: number;\n  /** Y coordinate */\n  y: number;\n  /** Whether to return multiple elements (uses elementsFromPoint) */\n  multiple?: M;\n}\n\nexport type UseElementByPointReturn<M extends boolean = false> = Pausable &\n  Supportable & {\n    /** Element(s) at the specified point */\n    element$: ReadonlyObservable<M extends true ? Element[] : Element | null>;\n  };\n\n/**\n * Framework-agnostic reactive element-at-point tracker using\n * `document.elementFromPoint()` (or `elementsFromPoint()` in multiple mode).\n *\n * Runs a `requestAnimationFrame` loop that polls the current (x, y) each frame\n * and syncs the result into `element$`. Pausable via `pause()` / `resume()`.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createElementByPoint<M extends boolean = false>(\n  options: DeepMaybeObservable<UseElementByPointOptions<M>>\n): UseElementByPointReturn<M> {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const opts$ = observable(options) as any;\n  const win$ = resolveWindowSource(opts$.window as Observable<unknown>);\n\n  const isSupported$ = createSupported(\n    () => !!defaultDocument && \"elementFromPoint\" in defaultDocument\n  );\n\n  const multiple = !!peek(opts$.peek()?.multiple);\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const element$ = observable<any>(multiple ? [] : null);\n  const isActive$ = observable(true);\n\n  const pause = () => {\n    isActive$.set(false);\n  };\n\n  const resume = () => {\n    isActive$.set(true);\n  };\n\n  onMount(() => {\n    const win = win$.peek();\n    if (!defaultDocument || !win) return;\n\n    let rafId: number | undefined;\n\n    const loop = () => {\n      if (isActive$.peek()) {\n        const raw = opts$.peek();\n        const cx = peek(raw?.x) as number;\n        const cy = peek(raw?.y) as number;\n        if (multiple) {\n          const newElements = defaultDocument!.elementsFromPoint(cx, cy);\n          const prev = element$.peek() as Element[];\n          if (\n            newElements.length !== prev.length ||\n            newElements.some((el: Element, i: number) => el !== prev[i])\n          ) {\n            element$.set(ObservableHint.opaque(newElements));\n          }\n        } else {\n          const el = defaultDocument!.elementFromPoint(cx, cy);\n          if (el !== element$.peek()) {\n            element$.set(el ? ObservableHint.opaque(el) : null);\n          }\n        }\n      }\n      rafId = win.requestAnimationFrame(loop);\n    };\n\n    rafId = win.requestAnimationFrame(loop);\n\n    return () => {\n      if (rafId !== undefined) {\n        win.cancelAnimationFrame(rafId);\n      }\n    };\n  });\n\n  return {\n    isSupported$,\n    element$,\n    isActive$: isActive$ as ReadonlyObservable<boolean>,\n    pause,\n    resume,\n  } as UseElementByPointReturn<M>;\n}\n"],"mappings":"AAAA,SAAS,YAAY,sBAAuC;AAC5D;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAAA;AAyBA,SAAS,qBACd,SAC4B;AAE5B,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,oBAAoB,MAAM,MAA6B;AAEpE,QAAM,eAAe;AAAA,IACnB,MAAM,CAAC,CAAC,mBAAmB,sBAAsB;AAAA,EACnD;AAEA,QAAM,WAAW,CAAC,CAAC,KAAK,MAAM,KAAK,GAAG,QAAQ;AAE9C,QAAM,WAAW,WAAgB,WAAW,CAAC,IAAI,IAAI;AACrD,QAAM,YAAY,WAAW,IAAI;AAEjC,QAAM,QAAQ,MAAM;AAClB,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM;AACnB,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,UAAQ,MAAM;AACZ,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,mBAAmB,CAAC,IAAK;AAE9B,QAAI;AAEJ,UAAM,OAAO,MAAM;AACjB,UAAI,UAAU,KAAK,GAAG;AACpB,cAAM,MAAM,MAAM,KAAK;AACvB,cAAM,KAAK,KAAK,KAAK,CAAC;AACtB,cAAM,KAAK,KAAK,KAAK,CAAC;AACtB,YAAI,UAAU;AACZ,gBAAM,cAAc,gBAAiB,kBAAkB,IAAI,EAAE;AAC7D,gBAAM,OAAO,SAAS,KAAK;AAC3B,cACE,YAAY,WAAW,KAAK,UAC5B,YAAY,KAAK,CAAC,IAAa,MAAc,OAAO,KAAK,CAAC,CAAC,GAC3D;AACA,qBAAS,IAAI,eAAe,OAAO,WAAW,CAAC;AAAA,UACjD;AAAA,QACF,OAAO;AACL,gBAAM,KAAK,gBAAiB,iBAAiB,IAAI,EAAE;AACnD,cAAI,OAAO,SAAS,KAAK,GAAG;AAC1B,qBAAS,IAAI,KAAK,eAAe,OAAO,EAAE,IAAI,IAAI;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AACA,cAAQ,IAAI,sBAAsB,IAAI;AAAA,IACxC;AAEA,YAAQ,IAAI,sBAAsB,IAAI;AAEtC,WAAO,MAAM;AACX,UAAI,UAAU,QAAW;AACvB,YAAI,qBAAqB,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}