{"version":3,"sources":["../../../../src/sensors/useParallax/core.ts"],"sourcesContent":["import { observable } from \"@legendapp/state\";\nimport type { DeepMaybeObservable, ReadonlyObservable } from \"@usels/core\";\nimport type { MaybeEventTarget } from \"../../types\";\nimport { createDeviceOrientation } from \"../useDeviceOrientation/core\";\nimport { createScreenOrientation } from \"../../browser/useScreenOrientation/core\";\nimport { createMouseInElement } from \"../../elements/useMouseInElement/core\";\n\nexport type UseParallaxSource = \"deviceOrientation\" | \"mouse\";\n\nexport interface UseParallaxOptions {\n  /** Adjust device orientation tilt value */\n  deviceOrientationTiltAdjust?: (value: number) => number;\n  /** Adjust device orientation roll value */\n  deviceOrientationRollAdjust?: (value: number) => number;\n  /** Adjust mouse tilt value */\n  mouseTiltAdjust?: (value: number) => number;\n  /** Adjust mouse roll value */\n  mouseRollAdjust?: (value: number) => number;\n}\n\nexport interface UseParallaxReturn {\n  /** Roll value. Scaled to -0.5 ~ 0.5 */\n  roll$: ReadonlyObservable<number>;\n  /** Tilt value. Scaled to -0.5 ~ 0.5 */\n  tilt$: ReadonlyObservable<number>;\n  /** Sensor source: 'deviceOrientation' or 'mouse' */\n  source$: ReadonlyObservable<UseParallaxSource>;\n}\n\nconst identity = (i: number) => i;\n\n/**\n * Framework-agnostic parallax tracker. Picks the best available sensor source\n * (`deviceOrientation` when the device reports live data, otherwise `mouse`)\n * and exposes reactive `roll$` / `tilt$` observables scaled to -0.5 ~ 0.5.\n *\n * Must be called inside a `useScope` factory — it composes\n * `createDeviceOrientation`, `createScreenOrientation`, and\n * `createMouseInElement`, all of which register scope-managed listeners.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createParallax(\n  target: MaybeEventTarget,\n  options?: DeepMaybeObservable<UseParallaxOptions>\n): UseParallaxReturn {\n  const opts$ = observable(options);\n\n  const orientation = createDeviceOrientation();\n  const { orientation$: screenOrientation$ } = createScreenOrientation();\n  const { elementX$, elementY$, elementWidth$, elementHeight$ } = createMouseInElement(target, {\n    handleOutside: false,\n  });\n\n  const source$ = observable<UseParallaxSource>(() => {\n    const alpha = orientation.alpha$.get();\n    const gamma = orientation.gamma$.get();\n    if (\n      orientation.isSupported$.get() &&\n      ((alpha != null && alpha !== 0) || (gamma != null && gamma !== 0))\n    ) {\n      return \"deviceOrientation\";\n    }\n    return \"mouse\";\n  });\n\n  const roll$ = observable<number>(() => {\n    if (source$.get() === \"deviceOrientation\") {\n      const screenOrientation = screenOrientation$.get() ?? \"portrait-primary\";\n      const beta = orientation.beta$.get() ?? 0;\n      const gamma = orientation.gamma$.get() ?? 0;\n      let value: number;\n      switch (screenOrientation) {\n        case \"landscape-primary\":\n          value = gamma / 90;\n          break;\n        case \"landscape-secondary\":\n          value = -gamma / 90;\n          break;\n        case \"portrait-secondary\":\n          value = beta / 90;\n          break;\n        case \"portrait-primary\":\n        default:\n          value = -beta / 90;\n          break;\n      }\n      return (opts$.get()?.deviceOrientationRollAdjust ?? identity)(value);\n    } else {\n      const y = elementY$.get();\n      const height = elementHeight$.get();\n      if (height === 0) return 0;\n      return (opts$.get()?.mouseRollAdjust ?? identity)(-(y - height / 2) / height);\n    }\n  });\n\n  const tilt$ = observable<number>(() => {\n    if (source$.get() === \"deviceOrientation\") {\n      const screenOrientation = screenOrientation$.get() ?? \"portrait-primary\";\n      const beta = orientation.beta$.get() ?? 0;\n      const gamma = orientation.gamma$.get() ?? 0;\n      let value: number;\n      switch (screenOrientation) {\n        case \"landscape-primary\":\n          value = beta / 90;\n          break;\n        case \"landscape-secondary\":\n          value = -beta / 90;\n          break;\n        case \"portrait-secondary\":\n          value = -gamma / 90;\n          break;\n        case \"portrait-primary\":\n        default:\n          value = gamma / 90;\n          break;\n      }\n      return (opts$.get()?.deviceOrientationTiltAdjust ?? identity)(value);\n    } else {\n      const x = elementX$.get();\n      const width = elementWidth$.get();\n      if (width === 0) return 0;\n      return (opts$.get()?.mouseTiltAdjust ?? identity)((x - width / 2) / width);\n    }\n  });\n\n  return {\n    roll$: roll$ as ReadonlyObservable<number>,\n    tilt$: tilt$ as ReadonlyObservable<number>,\n    source$: source$ as ReadonlyObservable<UseParallaxSource>,\n  };\n}\n"],"mappings":"AAAA,SAAS,kBAAkB;AAG3B,SAAS,+BAA+B;AACxC,SAAS,+BAA+B;AACxC,SAAS,4BAA4B;AAwBrC,MAAM,WAAW,CAAC,MAAc;AAAA;AAYzB,SAAS,eACd,QACA,SACmB;AACnB,QAAM,QAAQ,WAAW,OAAO;AAEhC,QAAM,cAAc,wBAAwB;AAC5C,QAAM,EAAE,cAAc,mBAAmB,IAAI,wBAAwB;AACrE,QAAM,EAAE,WAAW,WAAW,eAAe,eAAe,IAAI,qBAAqB,QAAQ;AAAA,IAC3F,eAAe;AAAA,EACjB,CAAC;AAED,QAAM,UAAU,WAA8B,MAAM;AAClD,UAAM,QAAQ,YAAY,OAAO,IAAI;AACrC,UAAM,QAAQ,YAAY,OAAO,IAAI;AACrC,QACE,YAAY,aAAa,IAAI,MAC3B,SAAS,QAAQ,UAAU,KAAO,SAAS,QAAQ,UAAU,IAC/D;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,QAAQ,WAAmB,MAAM;AACrC,QAAI,QAAQ,IAAI,MAAM,qBAAqB;AACzC,YAAM,oBAAoB,mBAAmB,IAAI,KAAK;AACtD,YAAM,OAAO,YAAY,MAAM,IAAI,KAAK;AACxC,YAAM,QAAQ,YAAY,OAAO,IAAI,KAAK;AAC1C,UAAI;AACJ,cAAQ,mBAAmB;AAAA,QACzB,KAAK;AACH,kBAAQ,QAAQ;AAChB;AAAA,QACF,KAAK;AACH,kBAAQ,CAAC,QAAQ;AACjB;AAAA,QACF,KAAK;AACH,kBAAQ,OAAO;AACf;AAAA,QACF,KAAK;AAAA,QACL;AACE,kBAAQ,CAAC,OAAO;AAChB;AAAA,MACJ;AACA,cAAQ,MAAM,IAAI,GAAG,+BAA+B,UAAU,KAAK;AAAA,IACrE,OAAO;AACL,YAAM,IAAI,UAAU,IAAI;AACxB,YAAM,SAAS,eAAe,IAAI;AAClC,UAAI,WAAW,EAAG,QAAO;AACzB,cAAQ,MAAM,IAAI,GAAG,mBAAmB,UAAU,EAAE,IAAI,SAAS,KAAK,MAAM;AAAA,IAC9E;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,WAAmB,MAAM;AACrC,QAAI,QAAQ,IAAI,MAAM,qBAAqB;AACzC,YAAM,oBAAoB,mBAAmB,IAAI,KAAK;AACtD,YAAM,OAAO,YAAY,MAAM,IAAI,KAAK;AACxC,YAAM,QAAQ,YAAY,OAAO,IAAI,KAAK;AAC1C,UAAI;AACJ,cAAQ,mBAAmB;AAAA,QACzB,KAAK;AACH,kBAAQ,OAAO;AACf;AAAA,QACF,KAAK;AACH,kBAAQ,CAAC,OAAO;AAChB;AAAA,QACF,KAAK;AACH,kBAAQ,CAAC,QAAQ;AACjB;AAAA,QACF,KAAK;AAAA,QACL;AACE,kBAAQ,QAAQ;AAChB;AAAA,MACJ;AACA,cAAQ,MAAM,IAAI,GAAG,+BAA+B,UAAU,KAAK;AAAA,IACrE,OAAO;AACL,YAAM,IAAI,UAAU,IAAI;AACxB,YAAM,QAAQ,cAAc,IAAI;AAChC,UAAI,UAAU,EAAG,QAAO;AACxB,cAAQ,MAAM,IAAI,GAAG,mBAAmB,WAAW,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC3E;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}