{"version":3,"sources":["../../src/use-parallax/index.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useLatest } from '../use-latest'\nimport { useMouseInElement } from '../use-mouse-in-element'\nimport { useStableFn } from '../use-stable-fn'\n\nimport type { CSSProperties } from 'react'\nimport type { Pausable } from '../use-pausable'\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseParallaxOptions {\n  /**\n   * Adjust the tilt value from mouse sensor\n   */\n  mouseTiltAdjust?: (i: number) => number\n  /**\n   * Adjust the roll value from mouse sensor\n   */\n  mouseRollAdjust?: (i: number) => number\n}\n\nexport interface UseParallaxReturns extends Pausable {\n  /**\n   * Roll value. Scaled to `-0.5 ~ 0.5`\n   */\n  roll: number\n  /**\n   * Tilt value. Scaled to `-0.5 ~ 0.5`\n   */\n  tilt: number\n  /**\n   * Container style presets\n   */\n  containerStyle: (perspective?: number) => CSSProperties\n  /**\n   * Element style presets\n   */\n  elementStyle: (rotateRatio?: number, duration?: number) => CSSProperties\n}\n\n/**\n * A React Hook that create a parallax effect.\n */\nexport function useParallax(target: ElementTarget, options: UseParallaxOptions = {}): UseParallaxReturns {\n  const latest = useLatest({\n    mouseTiltAdjust: (e) => e,\n    mouseRollAdjust: (e) => e,\n    ...options,\n  } as Required<UseParallaxOptions>)\n\n  const {\n    isOutside,\n    elementX: x,\n    elementY: y,\n    elementWidth: width,\n    elementHeight: height,\n    isActive,\n    pause,\n    resume,\n  } = useMouseInElement(target, { handleOutside: false })\n\n  const roll = useMemo(() => {\n    const isInvalid = !height || isOutside\n    const value = isInvalid ? 0 : -(y - height / 2) / height\n    return latest.current.mouseRollAdjust(value)\n  }, [isOutside, y, height])\n\n  const tilt = useMemo(() => {\n    const isInvalid = !width || isOutside\n    const value = isInvalid ? 0 : (x - width / 2) / width\n    return latest.current.mouseTiltAdjust(value)\n  }, [isOutside, x, width])\n\n  const latestReturn = useLatest({ roll, tilt })\n\n  const containerStyle = useStableFn((perspective = 240): CSSProperties => {\n    return {\n      perspective: `${perspective}px`,\n      overflow: 'hidden',\n    }\n  })\n\n  const elementStyle = useStableFn((rotateRatio = 20, duration = 360): CSSProperties => {\n    const { tilt, roll } = latestReturn.current\n\n    return {\n      willChange: 'transform',\n      transform: `rotateX(${roll * rotateRatio}deg) rotateY(${tilt * rotateRatio}deg)`,\n      transitionDuration: `${duration}ms`,\n      transitionTimingFunction: 'ease-out',\n    }\n  })\n\n  return {\n    roll,\n    tilt,\n    containerStyle,\n    elementStyle,\n    isActive,\n    pause,\n    resume,\n  }\n}\n"],"names":["useParallax","target","options","latest","useLatest","mouseTiltAdjust","e","mouseRollAdjust","useMouseInElement","handleOutside","isOutside","elementX","x","elementY","y","elementWidth","width","elementHeight","height","isActive","pause","resume","roll","useMemo","isInvalid","value","current","tilt","latestReturn","containerStyle","useStableFn","perspective","overflow","elementStyle","rotateRatio","duration","willChange","transform","transitionDuration","transitionTimingFunction"],"mappings":";;;;+BA0CgBA;;;eAAAA;;;qBA1CQ;yBACE;iCACQ;2BACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCrB,SAASA,YAAYC,MAAqB;QAAEC,UAAAA,iEAA8B,CAAC;IAChF,IAAMC,SAASC,IAAAA,oBAAS,EAAC;QACvBC,iBAAiB,SAACC;mBAAMA;;QACxBC,iBAAiB,SAACD;mBAAMA;;OACrBJ;IAGL,IASIM,qBAAAA,IAAAA,oCAAiB,EAACP,QAAQ;QAAEQ,eAAe;IAAM,IARnDC,YAQEF,mBARFE,WACAC,AAAUC,IAORJ,mBAPFG,UACAE,AAAUC,IAMRN,mBANFK,UACAE,AAAcC,QAKZR,mBALFO,cACAE,AAAeC,SAIbV,mBAJFS,eACAE,WAGEX,mBAHFW,UACAC,QAEEZ,mBAFFY,OACAC,SACEb,mBADFa;IAGF,IAAMC,OAAOC,IAAAA,cAAO,EAAC;QACnB,IAAMC,YAAY,CAACN,UAAUR;QAC7B,IAAMe,QAAQD,YAAY,IAAI,CAAEV,CAAAA,IAAII,SAAS,CAAA,IAAKA;QAClD,OAAOf,OAAOuB,OAAO,CAACnB,eAAe,CAACkB;IACxC,GAAG;QAACf;QAAWI;QAAGI;KAAO;IAEzB,IAAMS,OAAOJ,IAAAA,cAAO,EAAC;QACnB,IAAMC,YAAY,CAACR,SAASN;QAC5B,IAAMe,QAAQD,YAAY,IAAI,AAACZ,CAAAA,IAAII,QAAQ,CAAA,IAAKA;QAChD,OAAOb,OAAOuB,OAAO,CAACrB,eAAe,CAACoB;IACxC,GAAG;QAACf;QAAWE;QAAGI;KAAM;IAExB,IAAMY,eAAexB,IAAAA,oBAAS,EAAC;QAAEkB,MAAAA;QAAMK,MAAAA;IAAK;IAE5C,IAAME,iBAAiBC,IAAAA,wBAAW,EAAC;YAACC,+EAAc;QAChD,OAAO;YACLA,aAAa,AAAC,GAAc,OAAZA,aAAY;YAC5BC,UAAU;QACZ;IACF;IAEA,IAAMC,eAAeH,IAAAA,wBAAW,EAAC;YAACI,+EAAc,IAAIC,4EAAW;QAC7D,IAAuBP,wBAAAA,aAAaF,OAAO,EAAnCC,OAAeC,sBAAfD,MAAML,OAASM,sBAATN;QAEd,OAAO;YACLc,YAAY;YACZC,WAAW,AAAC,WAA4CV,OAAlCL,OAAOY,aAAY,iBAAkC,OAAnBP,OAAOO,aAAY;YAC3EI,oBAAoB,AAAC,GAAW,OAATH,UAAS;YAChCI,0BAA0B;QAC5B;IACF;IAEA,OAAO;QACLjB,MAAAA;QACAK,MAAAA;QACAE,gBAAAA;QACAI,cAAAA;QACAd,UAAAA;QACAC,OAAAA;QACAC,QAAAA;IACF;AACF"}