{"version":3,"sources":["../../../../src/elements/useMutationObserver/core.ts"],"sourcesContent":["import { observable } from \"@legendapp/state\";\nimport { createSupported, get, createObserve, onUnmount } from \"@usels/core\";\nimport { normalizeTargets } from \"@shared/normalizeTargets\";\nimport type { DeepMaybeObservable, ReadonlyObservable, Supportable } from \"@usels/core\";\nimport type { MaybeEventTarget } from \"../../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- intentional alias to allow future extension without breaking API\nexport interface UseMutationObserverOptions extends MutationObserverInit {}\n\nexport interface UseMutationObserverReturn extends Supportable {\n  readonly isActive$: ReadonlyObservable<boolean>;\n  stop: () => void;\n  resume: () => void;\n  takeRecords: () => MutationRecord[];\n}\n\nexport function createMutationObserver(\n  target: MaybeEventTarget | MaybeEventTarget[],\n  callback: MutationCallback,\n  options?: DeepMaybeObservable<UseMutationObserverOptions>\n): UseMutationObserverReturn {\n  const opts$ = observable(options);\n  const isSupported$ = createSupported(() => typeof MutationObserver !== \"undefined\");\n  const isActive$ = observable<boolean>(true);\n  let observer: MutationObserver | null = null;\n\n  const cleanup = () => {\n    observer?.disconnect();\n    observer = null;\n  };\n\n  createObserve(() => {\n    const raw = opts$.get();\n    const active = isActive$.get();\n    // Reactive read — register dependency on target observables\n    const targets = normalizeTargets(target);\n\n    cleanup();\n    if (!isSupported$.get() || !active) return;\n\n    const uniqueTargets = [...new Set(targets)];\n    if (!uniqueTargets.length) return;\n\n    const init: MutationObserverInit = {\n      subtree: get(raw?.subtree) as boolean | undefined,\n      childList: get(raw?.childList) as boolean | undefined,\n      attributes: get(raw?.attributes) as boolean | undefined,\n      characterData: get(raw?.characterData) as boolean | undefined,\n      attributeOldValue: get(raw?.attributeOldValue) as boolean | undefined,\n      characterDataOldValue: get(raw?.characterDataOldValue) as boolean | undefined,\n      attributeFilter: get(raw?.attributeFilter) as string[] | undefined,\n    };\n\n    observer = new MutationObserver(callback);\n    uniqueTargets.forEach((el) => {\n      observer!.observe(el as Node, init);\n    });\n  });\n\n  onUnmount(cleanup);\n\n  const stop = () => {\n    cleanup();\n    isActive$.set(false);\n  };\n\n  const resume = () => {\n    isActive$.set(true);\n  };\n\n  const takeRecords = (): MutationRecord[] => {\n    return observer?.takeRecords() ?? [];\n  };\n\n  return {\n    isSupported$,\n    isActive$: isActive$ as ReadonlyObservable<boolean>,\n    stop,\n    resume,\n    takeRecords,\n  };\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB,KAAK,eAAe,iBAAiB;AAC/D,SAAS,wBAAwB;AAc1B,SAAS,uBACd,QACA,UACA,SAC2B;AAC3B,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,eAAe,gBAAgB,MAAM,OAAO,qBAAqB,WAAW;AAClF,QAAM,YAAY,WAAoB,IAAI;AAC1C,MAAI,WAAoC;AAExC,QAAM,UAAU,MAAM;AACpB,cAAU,WAAW;AACrB,eAAW;AAAA,EACb;AAEA,gBAAc,MAAM;AAClB,UAAM,MAAM,MAAM,IAAI;AACtB,UAAM,SAAS,UAAU,IAAI;AAE7B,UAAM,UAAU,iBAAiB,MAAM;AAEvC,YAAQ;AACR,QAAI,CAAC,aAAa,IAAI,KAAK,CAAC,OAAQ;AAEpC,UAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC1C,QAAI,CAAC,cAAc,OAAQ;AAE3B,UAAM,OAA6B;AAAA,MACjC,SAAS,IAAI,KAAK,OAAO;AAAA,MACzB,WAAW,IAAI,KAAK,SAAS;AAAA,MAC7B,YAAY,IAAI,KAAK,UAAU;AAAA,MAC/B,eAAe,IAAI,KAAK,aAAa;AAAA,MACrC,mBAAmB,IAAI,KAAK,iBAAiB;AAAA,MAC7C,uBAAuB,IAAI,KAAK,qBAAqB;AAAA,MACrD,iBAAiB,IAAI,KAAK,eAAe;AAAA,IAC3C;AAEA,eAAW,IAAI,iBAAiB,QAAQ;AACxC,kBAAc,QAAQ,CAAC,OAAO;AAC5B,eAAU,QAAQ,IAAY,IAAI;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AAED,YAAU,OAAO;AAEjB,QAAM,OAAO,MAAM;AACjB,YAAQ;AACR,cAAU,IAAI,KAAK;AAAA,EACrB;AAEA,QAAM,SAAS,MAAM;AACnB,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,QAAM,cAAc,MAAwB;AAC1C,WAAO,UAAU,YAAY,KAAK,CAAC;AAAA,EACrC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}