{"version":3,"sources":["../../../../src/sensors/useDeviceOrientation/core.ts"],"sourcesContent":["import { batch, observable, type Observable } from \"@legendapp/state\";\nimport {\n  createPermissionAware,\n  createSupported,\n  type DeepMaybeObservable,\n  type PermissionAware,\n  type ReadonlyObservable,\n  type Supportable,\n} from \"@usels/core\";\nimport { resolveWindowSource, type ConfigurableWindow } from \"@shared/configurable\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\n\ninterface DeviceOrientationEventiOS {\n  requestPermission: () => Promise<\"granted\" | \"denied\">;\n}\n\nexport type UseDeviceOrientationOptions = ConfigurableWindow;\n\nexport interface UseDeviceOrientationReturn extends Supportable, PermissionAware {\n  /**\n   * Whether the device has real orientation sensor hardware.\n   * `isSupported` only checks API availability — desktop browsers expose the API\n   * but fire events with all-null values when no hardware exists.\n   * `hasRealData$` becomes `true` on the first event where any of alpha/beta/gamma is non-null.\n   */\n  hasRealData$: ReadonlyObservable<boolean>;\n  /** Whether the orientation data is absolute (relative to the Earth's coordinate frame) */\n  isAbsolute$: ReadonlyObservable<boolean>;\n  /** Rotation around the z-axis in degrees (0–360) */\n  alpha$: ReadonlyObservable<number | null>;\n  /** Rotation around the x-axis in degrees (-180–180) */\n  beta$: ReadonlyObservable<number | null>;\n  /** Rotation around the y-axis in degrees (-90–90) */\n  gamma$: ReadonlyObservable<number | null>;\n}\n\n/**\n * Framework-agnostic reactive wrapper around the\n * [DeviceOrientationEvent](https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent).\n *\n * Resolves the target window via `resolveWindowSource`, exposes orientation\n * angles as observables, and integrates with the iOS permission flow via\n * `createPermissionAware`.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createDeviceOrientation(\n  options?: DeepMaybeObservable<UseDeviceOrientationOptions>\n): UseDeviceOrientationReturn {\n  const opts$ = observable(options);\n  const win$ = resolveWindowSource(opts$.window as unknown as Observable<unknown>);\n\n  const isSupported$ = createSupported(() => {\n    const win = win$.get();\n    return !!win && \"DeviceOrientationEvent\" in win;\n  });\n\n  const isRequired$ = createSupported(\n    () =>\n      typeof globalThis !== \"undefined\" &&\n      typeof (globalThis as { DeviceOrientationEvent?: unknown }).DeviceOrientationEvent !==\n        \"undefined\" &&\n      typeof (\n        (globalThis as { DeviceOrientationEvent: unknown })\n          .DeviceOrientationEvent as DeviceOrientationEventiOS\n      ).requestPermission === \"function\"\n  );\n\n  const { permissionState$, permissionGranted$, needsPermission$, ensurePermission } =\n    createPermissionAware({\n      isSupported$,\n      isRequired$,\n      requestPermission: async () => {\n        const result = await (\n          (globalThis as { DeviceOrientationEvent: unknown })\n            .DeviceOrientationEvent as DeviceOrientationEventiOS\n        ).requestPermission();\n        return result === \"granted\";\n      },\n    });\n\n  const hasRealData$ = observable<boolean>(false);\n  const isAbsolute$ = observable<boolean>(false);\n  const alpha$ = observable<number | null>(null);\n  const beta$ = observable<number | null>(null);\n  const gamma$ = observable<number | null>(null);\n\n  createEventListener(win$, \"deviceorientation\", (event: Event) => {\n    const e = event as DeviceOrientationEvent;\n    batch(() => {\n      isAbsolute$.set(e.absolute);\n      alpha$.set(e.alpha);\n      beta$.set(e.beta);\n      gamma$.set(e.gamma);\n      if (e.alpha !== null || e.beta !== null || e.gamma !== null) {\n        hasRealData$.set(true);\n      }\n    });\n  });\n\n  return {\n    isSupported$,\n    permissionState$,\n    permissionGranted$,\n    needsPermission$,\n    ensurePermission,\n    hasRealData$: hasRealData$ as ReadonlyObservable<boolean>,\n    isAbsolute$: isAbsolute$ as ReadonlyObservable<boolean>,\n    alpha$: alpha$ as ReadonlyObservable<number | null>,\n    beta$: beta$ as ReadonlyObservable<number | null>,\n    gamma$: gamma$ as ReadonlyObservable<number | null>,\n  };\n}\n"],"mappings":"AAAA,SAAS,OAAO,kBAAmC;AACnD;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AACP,SAAS,2BAAoD;AAC7D,SAAS,2BAA2B;AAAA;AAmC7B,SAAS,wBACd,SAC4B;AAC5B,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,oBAAoB,MAAM,MAAwC;AAE/E,QAAM,eAAe,gBAAgB,MAAM;AACzC,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO,CAAC,CAAC,OAAO,4BAA4B;AAAA,EAC9C,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,MACE,OAAO,eAAe,eACtB,OAAQ,WAAoD,2BAC1D,eACF,OACG,WACE,uBACH,sBAAsB;AAAA,EAC5B;AAEA,QAAM,EAAE,kBAAkB,oBAAoB,kBAAkB,iBAAiB,IAC/E,sBAAsB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,mBAAmB,YAAY;AAC7B,YAAM,SAAS,MACZ,WACE,uBACH,kBAAkB;AACpB,aAAO,WAAW;AAAA,IACpB;AAAA,EACF,CAAC;AAEH,QAAM,eAAe,WAAoB,KAAK;AAC9C,QAAM,cAAc,WAAoB,KAAK;AAC7C,QAAM,SAAS,WAA0B,IAAI;AAC7C,QAAM,QAAQ,WAA0B,IAAI;AAC5C,QAAM,SAAS,WAA0B,IAAI;AAE7C,sBAAoB,MAAM,qBAAqB,CAAC,UAAiB;AAC/D,UAAM,IAAI;AACV,UAAM,MAAM;AACV,kBAAY,IAAI,EAAE,QAAQ;AAC1B,aAAO,IAAI,EAAE,KAAK;AAClB,YAAM,IAAI,EAAE,IAAI;AAChB,aAAO,IAAI,EAAE,KAAK;AAClB,UAAI,EAAE,UAAU,QAAQ,EAAE,SAAS,QAAQ,EAAE,UAAU,MAAM;AAC3D,qBAAa,IAAI,IAAI;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}