{"version":3,"sources":["../../../../src/elements/useIntersectionObserver/core.ts"],"sourcesContent":["import { observable } from \"@legendapp/state\";\nimport { createSupported, createObserve, onUnmount, get } from \"@usels/core\";\nimport { normalizeTargets } from \"@shared/normalizeTargets\";\nimport { isWindow } from \"@usels/core/shared/index\";\nimport type { DeepMaybeObservable, ReadonlyObservable, Supportable, Pausable } from \"@usels/core\";\nimport type { MaybeEventTarget } from \"../../types\";\n\nexport interface UseIntersectionObserverOptions {\n  /** Whether to start observing immediately on mount. Default: true */\n  immediate?: boolean;\n  /** The element or document used as the viewport. Default: browser viewport */\n  root?: MaybeEventTarget;\n  /** Margin around the root. Accepts CSS-style values. Default: \"0px\" */\n  rootMargin?: string;\n  /** Threshold(s) at which to trigger the callback. Default: 0 */\n  threshold?: number | number[];\n}\n\nexport interface UseIntersectionObserverReturn extends Supportable, Pausable {\n  stop: () => void;\n}\n\nexport function createIntersectionObserver(\n  target: MaybeEventTarget | MaybeEventTarget[],\n  callback: IntersectionObserverCallback,\n  options?: DeepMaybeObservable<UseIntersectionObserverOptions>\n): UseIntersectionObserverReturn {\n  const opts$ = observable(options);\n  const isSupported$ = createSupported(() => typeof IntersectionObserver !== \"undefined\");\n  const isActive$ = observable<boolean>(opts$.peek()?.immediate !== false);\n  let observer: IntersectionObserver | null = null;\n  let stopped = false;\n\n  const cleanup = () => {\n    observer?.disconnect();\n    observer = null;\n  };\n\n  createObserve(() => {\n    const raw = opts$.get();\n    const rawRoot = get(raw?.root);\n    const rootMargin = get(raw?.rootMargin) as string | undefined;\n    const threshold = get(raw?.threshold) as number | number[] | undefined;\n    const active = isActive$.get();\n    normalizeTargets(target); // register reactive dep for target changes\n\n    cleanup();\n    if (stopped || !isSupported$.get() || !active) return;\n\n    if (rawRoot === null) return;\n    const effectiveRoot: Element | Document | undefined =\n      rawRoot === undefined\n        ? undefined\n        : isWindow(rawRoot as unknown)\n          ? undefined // window → treat as viewport\n          : (rawRoot as unknown as Element | Document);\n\n    const targets = normalizeTargets(target).filter((el): el is Element => el instanceof Element);\n    if (!targets.length) return;\n\n    observer = new IntersectionObserver(callback, {\n      root: effectiveRoot,\n      rootMargin: rootMargin as string | undefined,\n      threshold: (threshold as number | number[] | undefined) ?? 0,\n    });\n    targets.forEach((el) => observer?.observe(el));\n  });\n\n  onUnmount(cleanup);\n\n  const pause = () => {\n    cleanup();\n    isActive$.set(false);\n  };\n\n  const resume = () => {\n    if (stopped) return;\n    isActive$.set(true);\n  };\n\n  const stop = () => {\n    stopped = true;\n    cleanup();\n    isActive$.set(false);\n  };\n\n  return {\n    isSupported$,\n    isActive$: isActive$ as ReadonlyObservable<boolean>,\n    pause,\n    resume,\n    stop,\n  };\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB,eAAe,WAAW,WAAW;AAC/D,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AAmBlB,SAAS,2BACd,QACA,UACA,SAC+B;AAC/B,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,eAAe,gBAAgB,MAAM,OAAO,yBAAyB,WAAW;AACtF,QAAM,YAAY,WAAoB,MAAM,KAAK,GAAG,cAAc,KAAK;AACvE,MAAI,WAAwC;AAC5C,MAAI,UAAU;AAEd,QAAM,UAAU,MAAM;AACpB,cAAU,WAAW;AACrB,eAAW;AAAA,EACb;AAEA,gBAAc,MAAM;AAClB,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK,IAAI;AAC7B,UAAM,aAAa,IAAI,KAAK,UAAU;AACtC,UAAM,YAAY,IAAI,KAAK,SAAS;AACpC,UAAM,SAAS,UAAU,IAAI;AAC7B,qBAAiB,MAAM;AAEvB,YAAQ;AACR,QAAI,WAAW,CAAC,aAAa,IAAI,KAAK,CAAC,OAAQ;AAE/C,QAAI,YAAY,KAAM;AACtB,UAAM,gBACJ,YAAY,SACR,SACA,SAAS,OAAkB,IACzB,SACC;AAET,UAAM,UAAU,iBAAiB,MAAM,EAAE,OAAO,CAAC,OAAsB,cAAc,OAAO;AAC5F,QAAI,CAAC,QAAQ,OAAQ;AAErB,eAAW,IAAI,qBAAqB,UAAU;AAAA,MAC5C,MAAM;AAAA,MACN;AAAA,MACA,WAAY,aAA+C;AAAA,IAC7D,CAAC;AACD,YAAQ,QAAQ,CAAC,OAAO,UAAU,QAAQ,EAAE,CAAC;AAAA,EAC/C,CAAC;AAED,YAAU,OAAO;AAEjB,QAAM,QAAQ,MAAM;AAClB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM;AACnB,QAAI,QAAS;AACb,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,QAAM,OAAO,MAAM;AACjB,cAAU;AACV,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}