{"version":3,"sources":["../../../../src/elements/useWindowSize/core.ts"],"sourcesContent":["import { observable, type Observable } from \"@legendapp/state\";\nimport { createObserve, onMount, type DeepMaybeObservable } from \"@usels/core\";\nimport { resolveWindowSource, type ConfigurableWindow } from \"@shared/configurable\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\nimport { createMediaQuery } from \"../../browser/useMediaQuery/core\";\nimport { createOpaque } from \"@usels/core/reactivity/useOpaque/core\";\n\nexport interface UseWindowSizeOptions extends ConfigurableWindow {\n  initialWidth?: number;\n  initialHeight?: number;\n  listenOrientation?: boolean;\n  includeScrollbar?: boolean;\n  type?: \"inner\" | \"outer\" | \"visual\";\n}\n\nexport type UseWindowSizeReturn = Observable<{\n  width: number;\n  height: number;\n}>;\n\n/**\n * Framework-agnostic reactive window size tracker.\n *\n * Tracks the browser window dimensions and updates on resize and orientation\n * change. Supports `inner`, `outer`, and `visual` viewport modes.\n * Must be called inside a `useScope` factory.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createWindowSize(\n  options?: DeepMaybeObservable<UseWindowSizeOptions>\n): UseWindowSizeReturn {\n  const opts$ = observable(options);\n  const win$ = resolveWindowSource(opts$.window as unknown as Observable<unknown>);\n\n  const size$ = observable({\n    width: opts$.peek()?.initialWidth ?? 0,\n    height: opts$.peek()?.initialHeight ?? 0,\n  });\n\n  const update = () => {\n    const win = win$.peek();\n    if (!win) return;\n\n    const type = opts$.peek()?.type ?? \"inner\";\n    const includeScrollbar = opts$.peek()?.includeScrollbar !== false;\n\n    let width: number;\n    let height: number;\n\n    if (type === \"outer\") {\n      width = win.outerWidth;\n      height = win.outerHeight;\n    } else if (type === \"visual\") {\n      const vp = win.visualViewport;\n      if (vp) {\n        width = vp.width * vp.scale;\n        height = vp.height * vp.scale;\n      } else {\n        width = win.innerWidth;\n        height = win.innerHeight;\n      }\n    } else {\n      if (includeScrollbar) {\n        width = win.innerWidth;\n        height = win.innerHeight;\n      } else {\n        width = win.document.documentElement.clientWidth;\n        height = win.document.documentElement.clientHeight;\n      }\n    }\n\n    size$.assign({ width, height });\n  };\n\n  onMount(update);\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- win$ is Observable<OpaqueObject<Window> | null>, matches Overload 2\n  createEventListener(win$ as any, \"resize\", update, { passive: true });\n\n  // Visual viewport resize listener — only relevant for type: \"visual\"\n  const vp$ = createOpaque<VisualViewport>(null);\n  onMount(() => {\n    if (opts$.peek()?.type !== \"visual\") return;\n    const vp = win$.peek()?.visualViewport ?? null;\n    vp$.set(vp);\n  });\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- OpaqueObservable is not in MaybeEventTarget union; runtime valueOf() unwrapping handles it correctly\n  createEventListener(vp$ as any, \"resize\", update);\n\n  // Re-measure when type or includeScrollbar changes (skip initial run)\n  let isFirstTypeChange = true;\n  createObserve(() => {\n    opts$.get();\n    if (isFirstTypeChange) {\n      isFirstTypeChange = false;\n      return;\n    }\n    update();\n  });\n\n  // Orientation change — skip initial run, guard with listenOrientation flag\n  const matches$ = createMediaQuery(\"(orientation: portrait)\");\n  let isFirstOrientation = true;\n  createObserve(() => {\n    matches$.get();\n    if (isFirstOrientation) {\n      isFirstOrientation = false;\n      return;\n    }\n    if (opts$.peek()?.listenOrientation !== false) {\n      update();\n    }\n  });\n\n  return size$;\n}\n"],"mappings":"AAAA,SAAS,kBAAmC;AAC5C,SAAS,eAAe,eAAyC;AACjE,SAAS,2BAAoD;AAC7D,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAAA;AAuBtB,SAAS,iBACd,SACqB;AACrB,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,oBAAoB,MAAM,MAAwC;AAE/E,QAAM,QAAQ,WAAW;AAAA,IACvB,OAAO,MAAM,KAAK,GAAG,gBAAgB;AAAA,IACrC,QAAQ,MAAM,KAAK,GAAG,iBAAiB;AAAA,EACzC,CAAC;AAED,QAAM,SAAS,MAAM;AACnB,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,IAAK;AAEV,UAAM,OAAO,MAAM,KAAK,GAAG,QAAQ;AACnC,UAAM,mBAAmB,MAAM,KAAK,GAAG,qBAAqB;AAE5D,QAAI;AACJ,QAAI;AAEJ,QAAI,SAAS,SAAS;AACpB,cAAQ,IAAI;AACZ,eAAS,IAAI;AAAA,IACf,WAAW,SAAS,UAAU;AAC5B,YAAM,KAAK,IAAI;AACf,UAAI,IAAI;AACN,gBAAQ,GAAG,QAAQ,GAAG;AACtB,iBAAS,GAAG,SAAS,GAAG;AAAA,MAC1B,OAAO;AACL,gBAAQ,IAAI;AACZ,iBAAS,IAAI;AAAA,MACf;AAAA,IACF,OAAO;AACL,UAAI,kBAAkB;AACpB,gBAAQ,IAAI;AACZ,iBAAS,IAAI;AAAA,MACf,OAAO;AACL,gBAAQ,IAAI,SAAS,gBAAgB;AACrC,iBAAS,IAAI,SAAS,gBAAgB;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,EAChC;AAEA,UAAQ,MAAM;AAGd,sBAAoB,MAAa,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AAGpE,QAAM,MAAM,aAA6B,IAAI;AAC7C,UAAQ,MAAM;AACZ,QAAI,MAAM,KAAK,GAAG,SAAS,SAAU;AACrC,UAAM,KAAK,KAAK,KAAK,GAAG,kBAAkB;AAC1C,QAAI,IAAI,EAAE;AAAA,EACZ,CAAC;AAED,sBAAoB,KAAY,UAAU,MAAM;AAGhD,MAAI,oBAAoB;AACxB,gBAAc,MAAM;AAClB,UAAM,IAAI;AACV,QAAI,mBAAmB;AACrB,0BAAoB;AACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,WAAW,iBAAiB,yBAAyB;AAC3D,MAAI,qBAAqB;AACzB,gBAAc,MAAM;AAClB,aAAS,IAAI;AACb,QAAI,oBAAoB;AACtB,2BAAqB;AACrB;AAAA,IACF;AACA,QAAI,MAAM,KAAK,GAAG,sBAAsB,OAAO;AAC7C,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":[]}