{"version":3,"sources":["../../../../src/browser/useScreenOrientation/core.ts"],"sourcesContent":["import { batch, observable, type Observable } from \"@legendapp/state\";\nimport {\n  createSupported,\n  onMount,\n  type DeepMaybeObservable,\n  type ReadonlyObservable,\n  type Supportable,\n} from \"@usels/core\";\nimport { resolveWindowSource, type ConfigurableWindow } from \"@shared/configurable\";\n\nexport type OrientationType =\n  | \"portrait-primary\"\n  | \"portrait-secondary\"\n  | \"landscape-primary\"\n  | \"landscape-secondary\";\n\nexport type OrientationLockType =\n  | \"any\"\n  | \"natural\"\n  | \"landscape\"\n  | \"portrait\"\n  | \"portrait-primary\"\n  | \"portrait-secondary\"\n  | \"landscape-primary\"\n  | \"landscape-secondary\";\n\nexport type UseScreenOrientationOptions = ConfigurableWindow;\n\nexport interface UseScreenOrientationReturn extends Supportable {\n  orientation$: ReadonlyObservable<OrientationType | undefined>;\n  angle$: ReadonlyObservable<number>;\n  lockOrientation: (type: OrientationLockType) => Promise<void>;\n  unlockOrientation: () => void;\n}\n\n/**\n * Framework-agnostic reactive wrapper around the\n * [Screen Orientation API](https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation).\n *\n * @param options - Optional `ConfigurableWindow` (defaults to global `window`).\n * @returns Observable orientation type, angle, support flag, and lock helpers.\n */\nexport function createScreenOrientation(\n  options?: DeepMaybeObservable<UseScreenOrientationOptions>\n): UseScreenOrientationReturn {\n  const opts$ = observable(options);\n  const win$ = resolveWindowSource(opts$.window as unknown as Observable<unknown>);\n\n  const orientation$ = observable<OrientationType | undefined>(undefined);\n  const angle$ = observable<number>(0);\n\n  const isSupported$ = createSupported(() => {\n    const win = win$.get();\n    return !!win && \"orientation\" in win.screen;\n  });\n\n  onMount(() => {\n    const win = win$.peek();\n    if (!win?.screen?.orientation) return;\n    const orientation = win.screen.orientation;\n\n    const update = () => {\n      batch(() => {\n        orientation$.set(orientation.type as OrientationType);\n        angle$.set(orientation.angle);\n      });\n    };\n\n    update();\n    orientation.addEventListener(\"change\", update);\n    return () => orientation.removeEventListener(\"change\", update);\n  });\n\n  const lockOrientation = (type: OrientationLockType): Promise<void> => {\n    if (!isSupported$.peek()) return Promise.reject(new Error(\"Not supported\"));\n    const win = win$.peek();\n    const o = win!.screen.orientation as ScreenOrientation & {\n      lock: (type: OrientationLockType) => Promise<void>;\n    };\n    return o.lock(type);\n  };\n\n  const unlockOrientation = (): void => {\n    if (!isSupported$.peek()) return;\n    const win = win$.peek();\n    win!.screen.orientation.unlock();\n  };\n\n  return {\n    isSupported$,\n    orientation$: orientation$ as ReadonlyObservable<OrientationType | undefined>,\n    angle$: angle$ as ReadonlyObservable<number>,\n    lockOrientation,\n    unlockOrientation,\n  };\n}\n"],"mappings":"AAAA,SAAS,OAAO,kBAAmC;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AACP,SAAS,2BAAoD;AAkCtD,SAAS,wBACd,SAC4B;AAC5B,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,oBAAoB,MAAM,MAAwC;AAE/E,QAAM,eAAe,WAAwC,MAAS;AACtE,QAAM,SAAS,WAAmB,CAAC;AAEnC,QAAM,eAAe,gBAAgB,MAAM;AACzC,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO,CAAC,CAAC,OAAO,iBAAiB,IAAI;AAAA,EACvC,CAAC;AAED,UAAQ,MAAM;AACZ,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK,QAAQ,YAAa;AAC/B,UAAM,cAAc,IAAI,OAAO;AAE/B,UAAM,SAAS,MAAM;AACnB,YAAM,MAAM;AACV,qBAAa,IAAI,YAAY,IAAuB;AACpD,eAAO,IAAI,YAAY,KAAK;AAAA,MAC9B,CAAC;AAAA,IACH;AAEA,WAAO;AACP,gBAAY,iBAAiB,UAAU,MAAM;AAC7C,WAAO,MAAM,YAAY,oBAAoB,UAAU,MAAM;AAAA,EAC/D,CAAC;AAED,QAAM,kBAAkB,CAAC,SAA6C;AACpE,QAAI,CAAC,aAAa,KAAK,EAAG,QAAO,QAAQ,OAAO,IAAI,MAAM,eAAe,CAAC;AAC1E,UAAM,MAAM,KAAK,KAAK;AACtB,UAAM,IAAI,IAAK,OAAO;AAGtB,WAAO,EAAE,KAAK,IAAI;AAAA,EACpB;AAEA,QAAM,oBAAoB,MAAY;AACpC,QAAI,CAAC,aAAa,KAAK,EAAG;AAC1B,UAAM,MAAM,KAAK,KAAK;AACtB,QAAK,OAAO,YAAY,OAAO;AAAA,EACjC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}