{"version":3,"sources":["../../../../src/elements/useElementSize/core.ts"],"sourcesContent":["import { observable, type Observable } from \"@legendapp/state\";\nimport { get, createObserve, type DeepMaybeObservable } from \"@usels/core\";\nimport { createResizeObserver } from \"@elements/useResizeObserver/core\";\nimport type { MaybeEventTarget } from \"../../types\";\n\nexport interface UseElementSizeOptions {\n  box?: \"content-box\" | \"border-box\" | \"device-pixel-content-box\";\n}\n\nexport interface UseElementSizeReturn {\n  width$: Observable<number>;\n  height$: Observable<number>;\n  stop: () => void;\n}\n\n/**\n * Framework-agnostic reactive element size tracker.\n *\n * Tracks the width and height of a DOM element using `ResizeObserver`.\n * SVG elements use `getBoundingClientRect()` as fallback.\n *\n * @param target - Element to observe (Ref$, Observable element, Document, Window, or null).\n * @param initialSize - Initial size values. Default `{ width: 0, height: 0 }`.\n * @param options - Optional box model option.\n * @returns `{ width$, height$, stop }` — reactive size observables and manual stop.\n */\nexport function createElementSize(\n  target: MaybeEventTarget,\n  initialSize?: { width: number; height: number },\n  options?: DeepMaybeObservable<UseElementSizeOptions>\n): UseElementSizeReturn {\n  const initial = initialSize ?? { width: 0, height: 0 };\n  const size$ = observable({ width: initial.width, height: initial.height });\n  const opts$ = observable(options);\n\n  const onResize: ResizeObserverCallback = (entries) => {\n    for (const entry of entries) {\n      const el = entry.target;\n      const isSvg = (el as Element).namespaceURI?.includes(\"svg\");\n\n      if (isSvg) {\n        const rect = el.getBoundingClientRect();\n        size$.assign({ width: rect.width, height: rect.height });\n      } else {\n        const box = opts$.peek()?.box ?? \"content-box\";\n        let w = 0;\n        let h = 0;\n        if (box === \"border-box\" && entry.borderBoxSize?.length) {\n          for (const b of entry.borderBoxSize) {\n            w += b.inlineSize;\n            h += b.blockSize;\n          }\n        } else if (box === \"device-pixel-content-box\" && entry.devicePixelContentBoxSize?.length) {\n          for (const b of entry.devicePixelContentBoxSize) {\n            w += b.inlineSize;\n            h += b.blockSize;\n          }\n        } else if (entry.contentBoxSize?.length) {\n          for (const b of entry.contentBoxSize) {\n            w += b.inlineSize;\n            h += b.blockSize;\n          }\n        } else {\n          w = entry.contentRect.width;\n          h = entry.contentRect.height;\n        }\n        size$.assign({ width: w, height: h });\n      }\n    }\n  };\n\n  const { stop } = createResizeObserver(target, onResize, options);\n\n  // Sync initial size from offsetWidth/offsetHeight after element mounts.\n  // Re-runs when `target` (Ref$/Observable) changes.\n  createObserve(() => {\n    const el = get(target) as HTMLElement | null;\n    if (!el) {\n      size$.assign({ width: initial.width, height: initial.height });\n      return;\n    }\n    const isSvg = (el as Element).namespaceURI?.includes(\"svg\");\n    if (!isSvg) {\n      size$.assign({\n        width: (el as HTMLElement).offsetWidth ?? initial.width,\n        height: (el as HTMLElement).offsetHeight ?? initial.height,\n      });\n    }\n  });\n\n  return { width$: size$.width, height$: size$.height, stop };\n}\n"],"mappings":"AAAA,SAAS,kBAAmC;AAC5C,SAAS,KAAK,qBAA+C;AAC7D,SAAS,4BAA4B;AAwB9B,SAAS,kBACd,QACA,aACA,SACsB;AACtB,QAAM,UAAU,eAAe,EAAE,OAAO,GAAG,QAAQ,EAAE;AACrD,QAAM,QAAQ,WAAW,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACzE,QAAM,QAAQ,WAAW,OAAO;AAEhC,QAAM,WAAmC,CAAC,YAAY;AACpD,eAAW,SAAS,SAAS;AAC3B,YAAM,KAAK,MAAM;AACjB,YAAM,QAAS,GAAe,cAAc,SAAS,KAAK;AAE1D,UAAI,OAAO;AACT,cAAM,OAAO,GAAG,sBAAsB;AACtC,cAAM,OAAO,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAAA,MACzD,OAAO;AACL,cAAM,MAAM,MAAM,KAAK,GAAG,OAAO;AACjC,YAAI,IAAI;AACR,YAAI,IAAI;AACR,YAAI,QAAQ,gBAAgB,MAAM,eAAe,QAAQ;AACvD,qBAAW,KAAK,MAAM,eAAe;AACnC,iBAAK,EAAE;AACP,iBAAK,EAAE;AAAA,UACT;AAAA,QACF,WAAW,QAAQ,8BAA8B,MAAM,2BAA2B,QAAQ;AACxF,qBAAW,KAAK,MAAM,2BAA2B;AAC/C,iBAAK,EAAE;AACP,iBAAK,EAAE;AAAA,UACT;AAAA,QACF,WAAW,MAAM,gBAAgB,QAAQ;AACvC,qBAAW,KAAK,MAAM,gBAAgB;AACpC,iBAAK,EAAE;AACP,iBAAK,EAAE;AAAA,UACT;AAAA,QACF,OAAO;AACL,cAAI,MAAM,YAAY;AACtB,cAAI,MAAM,YAAY;AAAA,QACxB;AACA,cAAM,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI,qBAAqB,QAAQ,UAAU,OAAO;AAI/D,gBAAc,MAAM;AAClB,UAAM,KAAK,IAAI,MAAM;AACrB,QAAI,CAAC,IAAI;AACP,YAAM,OAAO,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC7D;AAAA,IACF;AACA,UAAM,QAAS,GAAe,cAAc,SAAS,KAAK;AAC1D,QAAI,CAAC,OAAO;AACV,YAAM,OAAO;AAAA,QACX,OAAQ,GAAmB,eAAe,QAAQ;AAAA,QAClD,QAAS,GAAmB,gBAAgB,QAAQ;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,EAAE,QAAQ,MAAM,OAAO,SAAS,MAAM,QAAQ,KAAK;AAC5D;","names":[]}