{"version":3,"file":"static/chunks/341-60358d08b9dd4735.js","mappings":"uEAaA,IAEA,kCAOA,kBAAqC,QALb,KAKa,EALb,EAKa,CALb,EAKa,EAJb,GAIa,EAJb,EAIa,CAJb,CAIa,IAHb,EAGa,KAGrC,kBAAmC,SARX,KAQW,EARX,EAQW,CARX,EAQW,MAPX,GAOW,EAPX,EAOW,CAPX,EAOW,EANX,EAMW,EA4BnC,cACA,QACA,CAEA,4BACA,6BACA,uDAGA,gBACA,SAKA,QADA,qBAvDA,IAuDA,MAvDA,IAwDA,IAAkB,EAxDlB,GAwDwC,IACxC,iBA2BA,0BAEA,MACA,EAEA,MACA,EAEA,EAhCA,YAKA,IAJA,QACA,IACA,KAEW,WAAmE,IAC9E,GAjEA,GAuEA,QADA,yBAtEA,GAyEA,kBACA,GA/EA,KAiCA,kBACA,YAAiB,EAnCjB,EAmCwC,KACxC,eACA,SACA,MAEA,iBACA,MACA,CACA,QACA,EAqCA,SACM,MACN,EA/DA,oBACA,YACA,EAEA,KADA,YACA,QACA,EACA,IAEA,UAEI,YA5BJ,MA4BI,IA3BJ,GA2BI,CACJ,QACA,EAqDA,MA/EA,GA+EA,IAEA,EAUA,OACA,CACA,gFCvEA,EAiBA,EASA,EAQA,EAMA,EAOA,oBAhFA,cACA,qBACA,qBACA,iBACA,iBAEA,CAF+B,GAE/B,8BACA,kCAEA,CAFyC,GAEzC,wCACA,wCACA,4CACA,uCACA,EAEA,aAeA,MAdA,8BACA,YAAoB,mBAAsB,KAC1C,mBAEA,eACA,2CACA,WAGA,CAEA,QACA,GAEA,qBACA,EAIA,YACA,gBACA,0BACA,0BACA,kBACA,oBACA,oBACA,oBACA,gBACA,kBACA,kBACA,kBACA,mBACA,CAAC,UAA0C,EAI3C,YACA,UACA,WACA,UACA,SACA,CAAC,UAAsB,EAIvB,YACA,YACA,cACA,WACA,CAAC,UAAsC,EAKvC,CACC,SAAgC,CADjC,QAKA,YACA,sBACA,yBACA,CAAC,UAAgC,EAIjC,YACA,cACA,kBACA,oBACA,wBACA,0BACA,4BACA,4BACA,4BACA,0BACA,0BACA,0BACA,4BACA,8BACA,8BACA,8BACA,4BACA,4BACA,4BACA,gCACA,kCACA,kCACA,kCACA,gCACA,gCACA,gCACA,0BACA,4BACA,+BACA,CAAC,UAAoC,EAKrC,QAMA,aACA,cACA,mCAEA,CAFmD,EAEnD,wBACA,qDACA,MAAwB,IACxB,gBACA,qBACA,sBACA,mBACO,CACP,CAEA,8BACA,4BACA,iBACA,mBACA,eACA,qBAEA,cACA,yCAEA,CAmBA,OAXA,EAFA,UAEA,mCACA,qBACA,iBACA,gBACA,oBACA,sBACA,kBACA,eACA,aACA,EAEA,CACA,CAAC,GAED,mDAKA,gBACA,YACA,WAGA,OACA,QACA,MACA,EACA,uBAGA,IAFA,yCAGA,kFAUA,GAPA,YACA,sBAEA,GAF+B,GAE/B,mCAIA,CAFA,mBAGA,sCAGA,QACA,CAEA,OACA,oBACA,mBACA,oBACA,wBAGA,8BACA,gCACA,gCACA,gCACA,6BACA,+BACA,6BAGA,8BACA,+BACA,8BACA,2BACA,8BACA,0BACA,8BAGA,mCACA,kCACA,8BACA,6BACA,iCACA,wBACA,kCAGA,+BACA,kCACA,oCAGA,cACA,oBACA,OAAW,IAAM,qBAGjB,sCACA,WACA,OAAW,IAAM,oBACjB,CAGA,CAEA,uBACA,GACA,WACA,eACA,eACA,aACA,cACA,cACA,cACA,SACA,UACA,UACA,UACA,UACA,EAKA,gBACA,SAkDA,OAjDA,sBACA,WAGA,CAHwD,EAGxD,uCACA,0BAGA,IAFA,gBAGA,IAFA,iBAGA,GACA,cACA,YACA,aAGA,CAFS,GAET,YACA,iBAIA,kBACA,gBAEA,CAGA,CAHM,EAGN,oCACA,0BAEA,iCACA,+BAEA,2BAEA,yBAQA,GAPA,MACA,cACA,YACA,YACA,QACA,EAEA,gBACA,0FAEA,CACA,CACA,CAAG,EACH,CACA,CAKA,WAIA,EAIA,EAIA,EAIA,GAIA,MAFA,MAEA,CAFmD,CAQnD,OAJA,EAFgD,CAGhD,SAGA,CACA,CAuBA,oBARA,IAUA,OACA,OAXA,EASA,0CATA,EASA,4BARA,CAQA,4BARA,MAQA,CARA,OAWA,2BAEA,CAEA,0CACA,mBACA,CAAC,EA2CD,cACA,WACA,IACA,qBACA,mBACA,CAwCA,kBAOA,OADA,WAFA,GADA,6BAFA,EAEA,KACA,EAEA,CAF+C,CAI/C,CAKA,MAZgD,GAYhD,OACA,cACA,QACA,SAEA,YACA,YACA,KACA,IACA,CAEA,aACA,YACA,QACA,sBACA,qBACA,CAEA,aACA,YAEA,QAEA,uBACA,sBACA,CAEA,OACA,QACA,KACA,CACA,CAEA,OACA,QACA,MACA,OACA,EAkLA,kBACA,gCACA,EAEA,aACA,kBAhUA,EAEA,CA+TA,cACA,mBACA,6BACA,iEACA,UAtlBA,EAulBA,2CACA,mBACA,gBAEA,uCA1UA,EA4UA,KA1UA,EADA,YA2UA,cA1UA,oBAEA,mBADA,6BA0UA,CAEA,kBA4HA,OA1HA,0BAMA,OALA,eAA4B,eAC5B,kCAEA,iCAEA,MAGA,oCAEA,QACA,iBACA,qCACA,iCACA,MACA,CAAK,EACL,IAnDA,MApBA,IACA,EA3OA,IACA,EACA,EACA,EACA,EA6SA,GAnDA,EAmDA,WAnDA,EAmDA,aAnDA,EAmDA,gBAlDA,sEAIA,0EAgDA,+EACA,mBACA,8BACA,8BACA,0BACA,0BACO,EAOP,CAPU,EAQV,YAxOA,sBAEA,sBACA,kBAEA,eACA,UACA,QAEA,gBACA,UACA,QAGA,CAHoD,CAGpD,eACA,iBACA,WACA,UACA,IACA,IAEA,gBAEA,GADA,0BACA,EAGA,QACA,IA8BA,GA5BA,kBAEA,GADA,wBACA,EAIA,KACA,SAGA,KACA,SAGA,KACA,SAGA,KACA,SAIA,OACA,OACA,OACA,OAEA,CAFoB,CAEpB,CACA,yBACA,qBACA,uCACA,qCAEA,OACA,IACA,IACA,IACA,2BAGA,OACA,IACA,IACA,IACA,yBAGA,QACA,qBAGA,QADA,CADA,2BACA,GAEA,IAEA,KACA,UAIA,QACA,qBAKA,QAJA,0BAEA,GAGA,IAEA,KACA,UAIA,QACA,IAKA,IACA,QAHA,CAFA,gBAEA,GAKA,KACA,UAIA,QACA,IAKA,IACA,QAHA,CAFA,eAEA,GAKA,KACA,SAGA,CAYA,OAVA,OACA,SACA,SACA,OACA,OACA,mBACA,iBACA,mBACA,gBACA,CAAG,CAEH,EAyFA,qFACA,oBAxFA,EAwFA,aAxFA,EAwFA,YArFA,CAFA,MAA+B,KAE/B,YACA,kBAAwC,eACxC,4CACA,uCACK,EAGL,cACA,kBAAwC,eACxC,4CACA,uCACK,EAGL,IAyEA,aApUA,EAoUA,UApUA,EAoUA,yCAnUA,QAmUA,EAnUA,OACA,iBACA,WACA,UAEA,CAFyB,EAEzB,IACA,OACA,OACA,OAEA,IACA,oBACA,MAGA,WAoTA,EApTA,OACA,MAGA,2BACA,4BAGA,gBA4SA,EA5SA,OACA,iBA2SA,EA3SA,QAIA,OACA,SACA,SACA,OACA,MACA,CAAG,GAsSH,yBAEA,IACA,EAEA,qCAEA,2BAEA,oBACA,EACA,6CACQ,KACR,yBAEA,yBAEA,6CAIA,eACA,EAEA,+BACA,uCAEA,8BACA,EAEA,+BACA,sDAlZA,gBACA,MACA,IAMA,EANA,EAgBA,uBACA,MAjBA,CAkBA,OAlBA,CAkBA,IAlBA,UAoBA,8CACA,EAIA,EADA,0BAEA,CAAG,KAzBH,EAOA,UAFA,EALA,EAKA,WALA,EAKA,QALA,KAOA,kCACA,GAGA,WAVA,oBACA,kBACA,EA6YA,iCACA,sBACA,EAEA,qCACA,gBACA,wEACA,8CACA,EAEA,gCACA,gBACA,EAEA,mCACA,6BACA,gEACA,EAEA,6BACA,4BACA,mCACA,QAAgD,CAAhD,cAEA,0CACA,sCACA,0CACA,YAEA,CAF8C,CAE9C,WAKA,GAHA,+BAGA,GACA,SAJ+C,CAI/C,iBAEA,+BAEA,wBACA,EAAM,QAEN,sDAEA,0BAGA,aAGA,CACA,CAAC,GAED,aACA,cACA,uCACA,mBACA,qBACA,iCACA,+BAGA,kBAkBA,OAhBA,gCACA,oHAOA,sBAKA,OAJA,mBACA,qBACA,iCACA,+BACA,IACA,EAEA,CACA,CAAC,GAED,aACA,gBACA,SACA,SACA,UACA,SACA,CAYA,OAVA,YAEA,wBAKA,OAJA,iBACA,iBACA,SACA,SACA,MAGA,CACA,CAAC,GA8BD,aACA,cACA,mBACA,0BACA,oBACA,aAEA,cADA,cAEA,kBAEA,UAFkC,GAElC,IACA,6BACA,6BAEA,CAFsE,GAEtE,4BACA,OACA,OAEA,uBACA,iBACA,QACA,SACA,cACA,eACA,iDACA,CAAK,EAEL,CAFQ,GAER,aAEA,KAF2B,gBAE3B,CAzDA,WACA,SAEA,IACA,8BAAuC,YACvC,eAEA,OADA,KACA,EACA,CACA,CAAK,EAEL,CAFQ,MAER,gCAEA,IAFiD,GAEjD,kCACA,CAAI,UAEJ,QACA,IA0CA,uBAGA,CAH4B,GAG5B,YAEA,gCAEA,0BAEA,oBACA,CAOA,mBAGA,IAFA,6BAGA,wHAGA,eACA,EAEA,kBAuYA,OArYA,6BACA,WAEA,0XAEA,iBACA,CAAK,CACL,EAEA,4BACA,yEACA,UACA,EAAM,CACN,6DACA,2DACA,4DACA,0DACA,EAEA,+BACA,MAEA,sDACA,gEACA,8DACA,+DACA,8DACA,8CACA,EAEA,gCACA,WAEA,IACA,oEACA,mDACA,iBACA,CAAO,EAEP,+BACA,CAAM,SACN,6EACA,CACA,EAEA,gCAOA,OAJA,yBACA,0CACA,yBACA,yCACA,EAQA,2BAGA,IAFA,EAEA,4BACA,OACA,OAEA,2BAGA,EAHmC,GAGnC,yDACA,iBAEA,IAF4B,GAE5B,+CAEA,EAOA,gCACA,oBAEA,yBACA,cACA,CAAK,CACL,EAQA,iCACA,WAGA,EADA,eAAsC,GACtC,YAEA,eACA,kCACA,GACA,uCAGA,2BACA,CAAO,EAIP,gBACA,EAQA,qCACA,iCACA,6BACA,EAMA,4BACA,6BAEA,8BAEA,CAF4C,CAE5C,yBAEA,CAF8C,CAE9C,yBAEA,CAFoD,CAEpD,wBACA,0BACA,QACA,SACA,eACA,aACA,CAAO,CACP,CAEA,+BAKA,OACA,MALA,iCAMA,OALA,mCAMA,aALA,eAMA,YALA,aAMA,CACA,EAMA,0BACA,+CACA,EAOA,oCACA,kDACA,EAYA,yBACA,sBAOA,4BACA,gBAA4C,IAC5C,2BACA,yCACK,GAaL,OAZA,6CACA,6DAEA,+BAKA,UAL6C,iBAK7C,IACA,cAGA,CACA,EAMA,gCACA,eACA,gDACA,eACA,EAAK,CACL,EAMA,uCACA,eACA,oDACA,SACA,iBAGA,CACA,EAAO,EAGP,aACA,EAMA,iCACA,IACA,EAMA,oBAGA,gCACA,OACA,OAEA,2BAEA,oBAEA,yBACA,cACA,CAAK,CACL,EAMA,oCAEA,mCAEA,cACA,6BACA,iBACA,QACA,SACA,cACA,eACA,iBACA,CAAK,EAEL,oBAEA,gCAEA,yBACA,cACA,CAAK,CACL,EAEA,uCACA,iBAEA,IAF0B,CAE1B,8BAGA,CAHwC,GAGxC,WACA,kCACA,WACA,CAAO,CAEP,EAEA,sCACA,WAEA,iBAEA,eACA,kCACA,+BACA,8BACA,wBACS,CACT,CAAO,EAIP,gCAEA,0BAEA,mBACA,EAMA,gCACA,oEAEA,eACA,6CACA,sBACA,WACA,CAAS,CACT,EAAO,EAGP,aACA,EAMA,+BACA,mEAEA,eACA,6CACA,sBACA,WACA,CAAS,CACT,EAAO,EAGP,aACA,EAMA,qBACA,mCAEA,eACA,kCACA,WACA,CAAO,EAIP,oBACA,EAEA,CACA,CAAC,cCr2CD,SAAS,IAeT,MAAS,CAdP,EAAQ,oBADO,IACP,GACV,GAaiB,CAdP,IACV,IAAoB,mBAAsB,KAC1C,mBAEA,eACA,2CACA,WAGA,CAEA,QACA,GAEiB,qBACjB,CASA,gBAMA,MALA,wCAEA,OADA,cACA,CACA,GAEA,IACA,CAEA,gBACA,oBACA,IAEA,IAFA,KACA,iBAGA,QAAc,WAAuB,IACrC,OACA,iBACA,YAGA,QACA,CASA,6TACA,cACA,IATA,EASA,aACA,WACA,cACA,aACA,YACA,WACA,qBACA,YACA,eACA,WACA,YACA,YACA,YACA,UACA,WACA,WACA,WACA,kCACA,qCACA,UACA,gBACA,kBACA,eACA,eACA,SA4BA,OACA,eA7DA,YADA,EAmCA,CACA,WACA,SACA,YACA,WACA,UACA,SACA,mBACA,UACA,aACA,SACA,UACA,UACA,UACA,QACA,SACA,SACA,SACA,gCACA,mCACA,QACA,cACA,gBACA,aACA,YACA,CAAG,EA3DH,oBACA,kCACG,EACH,GA2DA,MACA,CACA,CAcA,MAAmC,eAAmB,OAiBtD,cACA,iBAfA,MAA2B,gBAAU,IAGrC,GAFA,2BAGA,YAGA,MACA,oIAGA,QACA,IAIA,EAAY,YAAM,OAGlB,EADA,KACA,cAjCE,eAAS,YAGX,mBAA2C,EAE3C,gBAJA,EAE+D,KAF/D,QAIA,CA8BA,GA9BA,GACA,8FAEA,CAAG,EA2BH,EA3BG,EA6BH,MAAkB,cAAQ,GAC1B,OACA,OAkCA,CAlCiC,KAG/B,eAAS,YACX,MAEA,qCACA,OACA,aACA,OACA,EAEA,EADA,oCAEA,EAAM,IACN,8FAGA,kBACA,GACA,oCAEA,CACA,CAAG,KAED,CAFQ,EAER,YAAS,YACX,IACA,YACA,mCAGA,0CAGA,CAAG,yTACH,CACA,MACA,aACA,SACA,CACA,CAEA,cACA,WACA,kBACA,SAGA,EADA,KACA,IAEA,OAAS,eAAmB,sBAC5B,KACA,CAAG,eACH,CAEA,OACA,QACA,EA8CA,8DACA,GACA,oBACA,MACA,OACA,QACA,QACA,EACA,cACA,WACA,kBACA,SAEA,UACA,aAEA,WACA,SAEA,EA1BA,SACA,mCACA,4BACA,sBACA,EAAI,GAuBJ,EALA,cA5DA,YACA,gCACA,MAA0B,EAAiB,iBAC3C,EAAwB,EAAiB,iBAEzC,gCACA,OACA,8BACA,gCACA,EAGA,+BAGA,IAFA,IAEA,2EAGA,OACA,IAHA,kCAGA,KACA,OAHA,kCAGA,IACA,CACA,CACA,CAEA,YAEA,mBADA,YAEA,OACA,WACA,aACA,CACA,CAEA,QACA,EA8BA,MACA,IAA6B,EAAQ,CACrC,8BADqC,iCAErC,EACA,CAAG,KACH,OAAS,eAAmB,sBAC5B,gBACA,UACA,MAAW,EAAQ,EAAG,SACtB,CAAG,eACH,EAEA,gCACA,GACA,oBACA,kBACA,YACA,EACA,cACA,MAAkB,cAAQ,OAC1B,OACA,OAEA,EAAqB,YAAM,OACzB,eAAS,YACX,YACA,CAAG,KAEH,cACA,WACA,kBACA,SAuCA,OAAS,eAAmB,sBAC5B,MACA,MAAW,EAAQ,EAAG,KACtB,CAAG,IAvCH,GACA,cAGA,oBACA,OAAiB,eAAmB,mBAAsC,IAC1E,gBACA,eACA,iBACA,CAAW,EACX,CAAS,EAIT,KAIA,EACa,UAAc,kCAG3B,OAFA,EAEA,cAF0B,GAE1B,EACsB,cAAkB,CAHxC,EAGwC,CACxC,eACA,CAAW,EAIX,CACA,CAAO,EAGP,KAOA,EAcA,cAGA,kBACA,EAhBA,EAwBA,MANA,yBACA,YAnBA,EAmBA,CACA,wBACA,kCACA,sBACK,CArBL,2BAIW,EAAkB,QAG7B,MAeA,CACA,CAZA,EA5VA,wBA4VA,EA5VA,WACA,wBA2VA,EAzVA,EAyVA,KAcA,kBAsCA,OApCA,qCAEA,EAOA,EAMA,CAdA,6EAGA,iFAGA,uCACA,uBAGA,2DAGA,uBAGA,wDAGA,EAEA,kCAEA,yCACA,EAEA,oBACA,0BACA,OACM,eAAmB,aACzB,sBACO,GAEP,EAEA,CACA,CAAC,CAAC,WAAS,EACX,gBACA,WAAc,EAAU,QACxB","sources":["webpack://_N_E/../../node_modules/.pnpm/bezier-easing@2.1.0/node_modules/bezier-easing/src/index.js","webpack://_N_E/../../node_modules/.pnpm/parallax-controller@1.7.1/node_modules/parallax-controller/dist/parallax-controller.esm.js","webpack://_N_E/../../node_modules/.pnpm/react-scroll-parallax@3.4.2_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/react-scroll-parallax/dist/react-scroll-parallax.esm.js"],"sourcesContent":["/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1)      { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n  var currentX, currentT, i = 0;\n  do {\n    currentT = aA + (aB - aA) / 2.0;\n    currentX = calcBezier(currentT, mX1, mX2) - aX;\n    if (currentX > 0.0) {\n      aB = currentT;\n    } else {\n      aA = currentT;\n    }\n  } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n  return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n   var currentSlope = getSlope(aGuessT, mX1, mX2);\n   if (currentSlope === 0.0) {\n     return aGuessT;\n   }\n   var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n   aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n  return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n  if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n    throw new Error('bezier x values must be in [0, 1] range');\n  }\n\n  if (mX1 === mY1 && mX2 === mY2) {\n    return LinearEasing;\n  }\n\n  // Precompute samples table\n  var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n  for (var i = 0; i < kSplineTableSize; ++i) {\n    sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n  }\n\n  function getTForX (aX) {\n    var intervalStart = 0.0;\n    var currentSample = 1;\n    var lastSample = kSplineTableSize - 1;\n\n    for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n      intervalStart += kSampleStepSize;\n    }\n    --currentSample;\n\n    // Interpolate to provide an initial guess for t\n    var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n    var guessForT = intervalStart + dist * kSampleStepSize;\n\n    var initialSlope = getSlope(guessForT, mX1, mX2);\n    if (initialSlope >= NEWTON_MIN_SLOPE) {\n      return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n    } else if (initialSlope === 0.0) {\n      return guessForT;\n    } else {\n      return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n    }\n  }\n\n  return function BezierEasing (x) {\n    // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n    if (x === 0) {\n      return 0;\n    }\n    if (x === 1) {\n      return 1;\n    }\n    return calcBezier(getTForX(x), mY1, mY2);\n  };\n};\n","import bezier from 'bezier-easing';\n\nvar Limits = function Limits(properties) {\n  this.startX = properties.startX;\n  this.startY = properties.startY;\n  this.endX = properties.endX;\n  this.endY = properties.endY; // Used to calculate the progress of the element\n\n  this.totalX = this.endX - this.startX;\n  this.totalY = this.endY - this.startY; // Used to scale translate effects\n\n  this.startMultiplierX = properties.startMultiplierX || 1;\n  this.endMultiplierX = properties.endMultiplierX || 1;\n  this.startMultiplierY = properties.startMultiplierY || 1;\n  this.endMultiplierY = properties.endMultiplierY || 1;\n};\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nvar ValidCSSEffects;\n\n(function (ValidCSSEffects) {\n  ValidCSSEffects[\"speed\"] = \"speed\";\n  ValidCSSEffects[\"translateX\"] = \"translateX\";\n  ValidCSSEffects[\"translateY\"] = \"translateY\";\n  ValidCSSEffects[\"rotate\"] = \"rotate\";\n  ValidCSSEffects[\"rotateX\"] = \"rotateX\";\n  ValidCSSEffects[\"rotateY\"] = \"rotateY\";\n  ValidCSSEffects[\"rotateZ\"] = \"rotateZ\";\n  ValidCSSEffects[\"scale\"] = \"scale\";\n  ValidCSSEffects[\"scaleX\"] = \"scaleX\";\n  ValidCSSEffects[\"scaleY\"] = \"scaleY\";\n  ValidCSSEffects[\"scaleZ\"] = \"scaleZ\";\n  ValidCSSEffects[\"opacity\"] = \"opacity\";\n})(ValidCSSEffects || (ValidCSSEffects = {}));\n\nvar Units;\n\n(function (Units) {\n  Units[\"px\"] = \"px\";\n  Units[\"%\"] = \"%\";\n  Units[\"vh\"] = \"vh\";\n  Units[\"vw\"] = \"vw\";\n})(Units || (Units = {}));\n\nvar RotationUnits;\n\n(function (RotationUnits) {\n  RotationUnits[\"deg\"] = \"deg\";\n  RotationUnits[\"turn\"] = \"turn\";\n  RotationUnits[\"rad\"] = \"rad\";\n})(RotationUnits || (RotationUnits = {}));\n\nvar ScaleUnits;\n\n(function (ScaleUnits) {\n  ScaleUnits[\"\"] = \"\";\n})(ScaleUnits || (ScaleUnits = {}));\n\nvar ScrollAxis;\n\n(function (ScrollAxis) {\n  ScrollAxis[\"vertical\"] = \"vertical\";\n  ScrollAxis[\"horizontal\"] = \"horizontal\";\n})(ScrollAxis || (ScrollAxis = {}));\n\nvar EasingPreset;\n\n(function (EasingPreset) {\n  EasingPreset[\"ease\"] = \"ease\";\n  EasingPreset[\"easeIn\"] = \"easeIn\";\n  EasingPreset[\"easeOut\"] = \"easeOut\";\n  EasingPreset[\"easeInOut\"] = \"easeInOut\";\n  EasingPreset[\"easeInQuad\"] = \"easeInQuad\";\n  EasingPreset[\"easeInCubic\"] = \"easeInCubic\";\n  EasingPreset[\"easeInQuart\"] = \"easeInQuart\";\n  EasingPreset[\"easeInQuint\"] = \"easeInQuint\";\n  EasingPreset[\"easeInSine\"] = \"easeInSine\";\n  EasingPreset[\"easeInExpo\"] = \"easeInExpo\";\n  EasingPreset[\"easeInCirc\"] = \"easeInCirc\";\n  EasingPreset[\"easeOutQuad\"] = \"easeOutQuad\";\n  EasingPreset[\"easeOutCubic\"] = \"easeOutCubic\";\n  EasingPreset[\"easeOutQuart\"] = \"easeOutQuart\";\n  EasingPreset[\"easeOutQuint\"] = \"easeOutQuint\";\n  EasingPreset[\"easeOutSine\"] = \"easeOutSine\";\n  EasingPreset[\"easeOutExpo\"] = \"easeOutExpo\";\n  EasingPreset[\"easeOutCirc\"] = \"easeOutCirc\";\n  EasingPreset[\"easeInOutQuad\"] = \"easeInOutQuad\";\n  EasingPreset[\"easeInOutCubic\"] = \"easeInOutCubic\";\n  EasingPreset[\"easeInOutQuart\"] = \"easeInOutQuart\";\n  EasingPreset[\"easeInOutQuint\"] = \"easeInOutQuint\";\n  EasingPreset[\"easeInOutSine\"] = \"easeInOutSine\";\n  EasingPreset[\"easeInOutExpo\"] = \"easeInOutExpo\";\n  EasingPreset[\"easeInOutCirc\"] = \"easeInOutCirc\";\n  EasingPreset[\"easeInBack\"] = \"easeInBack\";\n  EasingPreset[\"easeOutBack\"] = \"easeOutBack\";\n  EasingPreset[\"easeInOutBack\"] = \"easeInOutBack\";\n})(EasingPreset || (EasingPreset = {}));\n\n/**\r\n * Creates a unique id to distinguish parallax elements.\r\n */\nvar id = 0;\nfunction createId() {\n  ++id;\n  return id;\n}\n\nvar Rect = /*#__PURE__*/function () {\n  function Rect(options) {\n    var rect = options.el.getBoundingClientRect(); // rect is based on viewport -- must adjust for relative scroll container\n\n    if (options.view.scrollContainer) {\n      var scrollRect = options.view.scrollContainer.getBoundingClientRect();\n      rect = _extends({}, rect, {\n        top: rect.top - scrollRect.top,\n        right: rect.right - scrollRect.left,\n        bottom: rect.bottom - scrollRect.top,\n        left: rect.left - scrollRect.left\n      });\n    }\n\n    this.height = options.el.offsetHeight;\n    this.width = options.el.offsetWidth;\n    this.left = rect.left;\n    this.right = rect.right;\n    this.top = rect.top;\n    this.bottom = rect.bottom;\n\n    if (options.rootMargin) {\n      this._setRectWithRootMargin(options.rootMargin);\n    }\n  }\n  /**\r\n   * Apply root margin to all properties\r\n   */\n\n\n  var _proto = Rect.prototype;\n\n  _proto._setRectWithRootMargin = function _setRectWithRootMargin(rootMargin) {\n    var totalRootY = rootMargin.top + rootMargin.bottom;\n    var totalRootX = rootMargin.left + rootMargin.right;\n    this.top -= rootMargin.top;\n    this.right += rootMargin.right;\n    this.bottom += rootMargin.bottom;\n    this.left -= rootMargin.left;\n    this.height += totalRootY;\n    this.width += totalRootX;\n  };\n\n  return Rect;\n}();\n\nvar VALID_UNITS = [ScaleUnits[''], Units.px, Units['%'], Units['vh'], Units['vw'], RotationUnits.deg, RotationUnits.turn, RotationUnits.rad];\n/**\r\n * Determines the unit of a string and parses the value\r\n */\n\nfunction parseValueAndUnit(str, defaultUnit) {\n  if (defaultUnit === void 0) {\n    defaultUnit = Units['%'];\n  }\n\n  var out = {\n    value: 0,\n    unit: defaultUnit\n  };\n  if (typeof str === 'undefined') return out;\n  var isValid = typeof str === 'number' || typeof str === 'string';\n\n  if (!isValid) {\n    throw new Error('Invalid value provided. Must provide a value as a string or number');\n  }\n\n  str = String(str);\n  out.value = parseFloat(str); // @ts-ignore\n\n  out.unit = str.match(/[\\d.\\-+]*\\s*(.*)/)[1] || defaultUnit; // @ts-expect-error\n\n  var isValidUnit = VALID_UNITS.includes(out.unit);\n\n  if (!isValidUnit) {\n    throw new Error('Invalid unit provided.');\n  }\n\n  return out;\n}\n\nvar easingPresets = {\n  ease: [0.25, 0.1, 0.25, 1.0],\n  easeIn: [0.42, 0.0, 1.0, 1.0],\n  easeOut: [0.0, 0.0, 0.58, 1.0],\n  easeInOut: [0.42, 0.0, 0.58, 1.0],\n\n  /* Ease IN curves */\n  easeInQuad: [0.55, 0.085, 0.68, 0.53],\n  easeInCubic: [0.55, 0.055, 0.675, 0.19],\n  easeInQuart: [0.895, 0.03, 0.685, 0.22],\n  easeInQuint: [0.755, 0.05, 0.855, 0.06],\n  easeInSine: [0.47, 0.0, 0.745, 0.715],\n  easeInExpo: [0.95, 0.05, 0.795, 0.035],\n  easeInCirc: [0.6, 0.04, 0.98, 0.335],\n\n  /* Ease Out Curves */\n  easeOutQuad: [0.25, 0.46, 0.45, 0.94],\n  easeOutCubic: [0.215, 0.61, 0.355, 1.0],\n  easeOutQuart: [0.165, 0.84, 0.44, 1.0],\n  easeOutQuint: [0.23, 1.0, 0.32, 1.0],\n  easeOutSine: [0.39, 0.575, 0.565, 1.0],\n  easeOutExpo: [0.19, 1.0, 0.22, 1.0],\n  easeOutCirc: [0.075, 0.82, 0.165, 1.0],\n\n  /* Ease IN Out Curves */\n  easeInOutQuad: [0.455, 0.03, 0.515, 0.955],\n  easeInOutCubic: [0.645, 0.045, 0.355, 1.0],\n  easeInOutQuart: [0.77, 0.0, 0.175, 1.0],\n  easeInOutQuint: [0.86, 0.0, 0.07, 1.0],\n  easeInOutSine: [0.445, 0.05, 0.55, 0.95],\n  easeInOutExpo: [1.0, 0.0, 0.0, 1.0],\n  easeInOutCirc: [0.785, 0.135, 0.15, 0.86],\n\n  /* Ease Bounce Curves */\n  easeInBack: [0.6, -0.28, 0.735, 0.045],\n  easeOutBack: [0.175, 0.885, 0.32, 1.275],\n  easeInOutBack: [0.68, -0.55, 0.265, 1.55]\n};\n\nfunction createEasingFunction(easing) {\n  if (Array.isArray(easing)) {\n    return bezier(easing[0], easing[1], easing[2], easing[3]);\n  }\n\n  if (typeof easing === 'string' && typeof easingPresets[easing] !== 'undefined') {\n    var params = easingPresets[easing];\n    return bezier(params[0], params[1], params[2], params[3]);\n  }\n\n  return;\n}\n\nvar PARALLAX_EFFECTS = /*#__PURE__*/Object.values(ValidCSSEffects);\nvar MAP_EFFECT_TO_DEFAULT_UNIT = {\n  speed: 'px',\n  translateX: '%',\n  translateY: '%',\n  rotate: 'deg',\n  rotateX: 'deg',\n  rotateY: 'deg',\n  rotateZ: 'deg',\n  scale: '',\n  scaleX: '',\n  scaleY: '',\n  scaleZ: '',\n  opacity: ''\n};\n/**\r\n * Takes a parallax element effects and parses the properties to get the start and end values and units.\r\n */\n\nfunction parseElementTransitionEffects(props, scrollAxis) {\n  var parsedEffects = {};\n  PARALLAX_EFFECTS.forEach(function (key) {\n    var defaultValue = MAP_EFFECT_TO_DEFAULT_UNIT[key]; // If the provided type is a number, this must be the speed prop\n    // in which case we need to construct the proper translate config\n\n    if (typeof (props == null ? void 0 : props[key]) === 'number') {\n      var value = props == null ? void 0 : props[key];\n      var startSpeed = (value || 0) * 10 + \"px\";\n      var endSpeed = (value || 0) * -10 + \"px\";\n      var startParsed = parseValueAndUnit(startSpeed);\n      var endParsed = parseValueAndUnit(endSpeed);\n      var speedConfig = {\n        start: startParsed.value,\n        end: endParsed.value,\n        unit: startParsed.unit\n      }; // Manually set translate y value\n\n      if (scrollAxis === ScrollAxis.vertical) {\n        parsedEffects.translateY = speedConfig;\n      } // Manually set translate y value\n\n\n      if (scrollAxis === ScrollAxis.horizontal) {\n        parsedEffects.translateX = speedConfig;\n      }\n    } // The rest are standard effect being parsed\n\n\n    if (Array.isArray(props == null ? void 0 : props[key])) {\n      var _value = props == null ? void 0 : props[key];\n\n      if (typeof _value[0] !== 'undefined' && typeof _value[1] !== 'undefined') {\n        var _startParsed = parseValueAndUnit(_value == null ? void 0 : _value[0], defaultValue);\n\n        var _endParsed = parseValueAndUnit(_value == null ? void 0 : _value[1], defaultValue);\n\n        var easing = createEasingFunction(_value == null ? void 0 : _value[2]);\n        parsedEffects[key] = {\n          start: _startParsed.value,\n          end: _endParsed.value,\n          unit: _startParsed.unit,\n          easing: easing\n        };\n\n        if (_startParsed.unit !== _endParsed.unit) {\n          throw new Error('Must provide matching units for the min and max offset values of each axis.');\n        }\n      }\n    }\n  });\n  return parsedEffects;\n}\n\n/**\r\n * Returns the percent (0 - 100) moved based on position in the viewport\r\n */\nfunction getProgressAmount(\n/*\r\n * The start value from cache\r\n */\nstart,\n/*\r\n * total dist the element has to move to be 100% complete (view width/height + element width/height)\r\n */\ntotalDist,\n/*\r\n * Current scroll value\r\n */\ncurrentScroll,\n/*\r\n * an optional easing function to apply\r\n */\neasing) {\n  // adjust cached value\n  var startAdjustedScroll = currentScroll - start; // Amount the element has moved based on current and total distance to move\n\n  var amount = startAdjustedScroll / totalDist; // Apply bezier easing if provided\n\n  if (easing) {\n    amount = easing(amount);\n  }\n\n  return amount;\n}\n\n/**\r\n * Takes two values (start, end) and returns whether the current scroll is within range\r\n * @param {number} start - start of scroll (x/y)\r\n * @param {number} end - end of scroll (x/y)\r\n * @param {number} scroll - current scroll (x/y)\r\n * @return {boolean} isInView\r\n */\nfunction isElementInView(start, end, scroll) {\n  var isInView = scroll >= start && scroll <= end;\n  return isInView;\n}\n\n// Scale between AKA normalize\nfunction scaleBetween(value, newMin, newMax, oldMin, oldMax) {\n  return (newMax - newMin) * (value - oldMin) / (oldMax - oldMin) + newMin;\n}\n\n/**\r\n * Scales a start and end value of an effect based on percent moved and easing function\r\n */\n\nfunction scaleEffectByProgress(effect, progress) {\n  var value = scaleBetween(typeof effect.easing === 'function' ? effect.easing(progress) : progress, (effect == null ? void 0 : effect.start) || 0, (effect == null ? void 0 : effect.end) || 0, 0, 1);\n  return {\n    value: value,\n    unit: effect == null ? void 0 : effect.unit\n  };\n}\n\nvar TRANSFORM_EFFECTS = /*#__PURE__*/Object.values(ValidCSSEffects).filter(function (v) {\n  return v !== 'opacity';\n});\nfunction setWillChangeStyles(el, effects) {\n  var keys = Object.keys(effects);\n  var hasOpacity = keys.includes('opacity');\n  var willChange = \"transform\" + (hasOpacity ? ',opacity' : '');\n  el.style.willChange = willChange;\n}\nfunction setElementStyles(effects, progress, el) {\n  if (!el) return;\n  var transform = getTransformStyles(effects, progress);\n  var opacity = getOpacityStyles(effects, progress);\n  el.style.transform = transform;\n  el.style.opacity = opacity;\n}\nfunction getOpacityStyles(effects, progress) {\n  var scaledOpacity = effects['opacity'] && scaleEffectByProgress(effects['opacity'], progress);\n\n  if (typeof scaledOpacity === 'undefined' || typeof scaledOpacity.value === 'undefined' || typeof scaledOpacity.unit === 'undefined') {\n    return '';\n  }\n\n  var styleStr = \"\" + scaledOpacity.value;\n  return styleStr;\n}\nfunction getTransformStyles(effects, progress) {\n  var transform = TRANSFORM_EFFECTS.reduce(function (acc, key) {\n    var scaledEffect = // @ts-expect-error\n    effects[key] && scaleEffectByProgress(effects[key], progress);\n\n    if (typeof scaledEffect === 'undefined' || typeof scaledEffect.value === 'undefined' || typeof scaledEffect.unit === 'undefined') {\n      return acc;\n    }\n\n    var styleStr = key + \"(\" + scaledEffect.value + scaledEffect.unit + \")\";\n    return acc + styleStr;\n  }, '');\n  return transform;\n}\n/**\r\n * Takes a parallax element and removes parallax offset styles.\r\n * @param {object} element\r\n */\n\nfunction resetStyles(element) {\n  var el = element.el;\n  if (!el) return;\n  el.style.transform = '';\n  el.style.opacity = '';\n}\n\nfunction createLimitsForRelativeElements(rect, view, scroll, shouldAlwaysCompleteAnimation) {\n  var startY = rect.top - view.height;\n  var startX = rect.left - view.width;\n  var endY = rect.bottom;\n  var endX = rect.right; // add scroll\n\n  startX += scroll.x;\n  endX += scroll.x;\n  startY += scroll.y;\n  endY += scroll.y;\n\n  if (shouldAlwaysCompleteAnimation) {\n    if (scroll.y + rect.top < view.height) {\n      startY = 0;\n    }\n\n    if (scroll.x + rect.left < view.width) {\n      startX = 0;\n    }\n\n    if (endY > view.scrollHeight - view.height) {\n      endY = view.scrollHeight - view.height;\n    }\n\n    if (endX > view.scrollWidth - view.width) {\n      endX = view.scrollWidth - view.width;\n    }\n  }\n\n  var limits = new Limits({\n    startX: startX,\n    startY: startY,\n    endX: endX,\n    endY: endY\n  });\n  return limits;\n}\n\nfunction getTranslateScalar(startTranslatePx, endTranslatePx, totalDist) {\n  var slow = endTranslatePx > startTranslatePx; // calculating necessary scale to increase translations\n\n  var totalAbsOff = (Math.abs(startTranslatePx) + Math.abs(endTranslatePx)) * (slow ? -1 : 1);\n  var totalDistTrue = totalDist + totalAbsOff; // Determine multiple to scale by, only values greater than 1\n\n  var scale = Math.max(totalDist / totalDistTrue, 1);\n  return scale;\n}\n\n/**\r\n * Return the start and end pixel values for an elements translations\r\n */\nfunction getStartEndValueInPx(translate, elementSize) {\n  var start = translate.start,\n      end = translate.end,\n      unit = translate.unit;\n\n  if (unit === '%') {\n    var scale = elementSize / 100;\n    start = start * scale;\n    end = end * scale;\n  }\n\n  if (unit === 'vw') {\n    var startScale = start / 100;\n    var endScale = end / 100;\n    start = window.innerWidth * startScale;\n    end = window.innerWidth * endScale;\n  }\n\n  if (unit === 'vh') {\n    var _startScale = start / 100;\n\n    var _endScale = end / 100;\n\n    start = window.innerHeight * _startScale;\n    end = window.innerHeight * _endScale;\n  }\n\n  return {\n    start: start,\n    end: end\n  };\n}\n\nvar DEFAULT_VALUE = {\n  start: 0,\n  end: 0,\n  unit: ''\n};\nfunction createLimitsWithTranslationsForRelativeElements(rect, view, effects, scroll, scrollAxis, shouldAlwaysCompleteAnimation) {\n  // get start and end accounting for percent effects\n  var translateX = effects.translateX || DEFAULT_VALUE;\n  var translateY = effects.translateY || DEFAULT_VALUE;\n\n  var _getStartEndValueInPx = getStartEndValueInPx(translateX, rect.width),\n      startTranslateXPx = _getStartEndValueInPx.start,\n      endTranslateXPx = _getStartEndValueInPx.end;\n\n  var _getStartEndValueInPx2 = getStartEndValueInPx(translateY, rect.height),\n      startTranslateYPx = _getStartEndValueInPx2.start,\n      endTranslateYPx = _getStartEndValueInPx2.end; // default starting values\n\n\n  var startY = rect.top - view.height;\n  var startX = rect.left - view.width;\n  var endY = rect.bottom;\n  var endX = rect.right;\n  var startMultiplierY = 1;\n  var endMultiplierY = 1;\n\n  if (scrollAxis === ScrollAxis.vertical) {\n    startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, view.height + rect.height);\n    endMultiplierY = startMultiplierY;\n  }\n\n  var startMultiplierX = 1;\n  var endMultiplierX = 1;\n\n  if (scrollAxis === ScrollAxis.horizontal) {\n    startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, view.width + rect.width);\n    endMultiplierX = startMultiplierX;\n  } // Apply the scale to initial values\n\n\n  if (startTranslateYPx < 0) {\n    startY = startY + startTranslateYPx * startMultiplierY;\n  }\n\n  if (endTranslateYPx > 0) {\n    endY = endY + endTranslateYPx * endMultiplierY;\n  }\n\n  if (startTranslateXPx < 0) {\n    startX = startX + startTranslateXPx * startMultiplierX;\n  }\n\n  if (endTranslateXPx > 0) {\n    endX = endX + endTranslateXPx * endMultiplierX;\n  } // add scroll\n\n\n  startX += scroll.x;\n  endX += scroll.x;\n  startY += scroll.y;\n  endY += scroll.y; // NOTE: please refactor and isolate this :(\n\n  if (shouldAlwaysCompleteAnimation) {\n    var topBeginsInView = scroll.y + rect.top < view.height;\n    var leftBeginsInView = scroll.x + rect.left < view.width;\n    var bottomEndsInView = scroll.y + rect.bottom > view.scrollHeight - view.height;\n    var rightEndsInView = scroll.x + rect.right > view.scrollWidth - view.height;\n\n    if (topBeginsInView && bottomEndsInView) {\n      startMultiplierY = 1;\n      endMultiplierY = 1;\n      startY = 0;\n      endY = view.scrollHeight - view.height;\n    }\n\n    if (leftBeginsInView && rightEndsInView) {\n      startMultiplierX = 1;\n      endMultiplierX = 1;\n      startX = 0;\n      endX = view.scrollWidth - view.width;\n    }\n\n    if (!topBeginsInView && bottomEndsInView) {\n      startY = rect.top - view.height + scroll.y;\n      endY = view.scrollHeight - view.height;\n      var totalDist = endY - startY;\n      startMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, totalDist);\n      endMultiplierY = 1;\n\n      if (startTranslateYPx < 0) {\n        startY = startY + startTranslateYPx * startMultiplierY;\n      }\n    }\n\n    if (!leftBeginsInView && rightEndsInView) {\n      startX = rect.left - view.width + scroll.x;\n      endX = view.scrollWidth - view.width;\n\n      var _totalDist = endX - startX;\n\n      startMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, _totalDist);\n      endMultiplierX = 1;\n\n      if (startTranslateXPx < 0) {\n        startX = startX + startTranslateXPx * startMultiplierX;\n      }\n    }\n\n    if (topBeginsInView && !bottomEndsInView) {\n      startY = 0;\n      endY = rect.bottom + scroll.y;\n\n      var _totalDist2 = endY - startY;\n\n      startMultiplierY = 1;\n      endMultiplierY = getTranslateScalar(startTranslateYPx, endTranslateYPx, _totalDist2);\n\n      if (endTranslateYPx > 0) {\n        endY = endY + endTranslateYPx * endMultiplierY;\n      }\n    }\n\n    if (leftBeginsInView && !rightEndsInView) {\n      startX = 0;\n      endX = rect.right + scroll.x;\n\n      var _totalDist3 = endX - startX;\n\n      startMultiplierX = 1;\n      endMultiplierX = getTranslateScalar(startTranslateXPx, endTranslateXPx, _totalDist3);\n\n      if (endTranslateXPx > 0) {\n        endX = endX + endTranslateXPx * endMultiplierX;\n      }\n    }\n  }\n\n  var limits = new Limits({\n    startX: startX,\n    startY: startY,\n    endX: endX,\n    endY: endY,\n    startMultiplierX: startMultiplierX,\n    endMultiplierX: endMultiplierX,\n    startMultiplierY: startMultiplierY,\n    endMultiplierY: endMultiplierY\n  });\n  return limits;\n}\n\nfunction scaleTranslateEffectsForSlowerScroll(effects, limits) {\n  var effectsCopy = _extends({}, effects);\n\n  if (effectsCopy.translateX) {\n    effectsCopy.translateX = _extends({}, effects.translateX, {\n      start: effectsCopy.translateX.start * limits.startMultiplierX,\n      end: effectsCopy.translateX.end * limits.endMultiplierX\n    });\n  }\n\n  if (effectsCopy.translateY) {\n    effectsCopy.translateY = _extends({}, effects.translateY, {\n      start: effectsCopy.translateY.start * limits.startMultiplierY,\n      end: effectsCopy.translateY.end * limits.endMultiplierY\n    });\n  }\n\n  return effectsCopy;\n}\n\nfunction getShouldScaleTranslateEffects(props, effects, scrollAxis) {\n  if (props.rootMargin || props.targetElement || props.shouldDisableScalingTranslations) {\n    return false;\n  }\n\n  if (!!effects.translateX && scrollAxis === ScrollAxis.horizontal || !!effects.translateY && scrollAxis === ScrollAxis.vertical) {\n    return true;\n  }\n\n  return false;\n}\n\nvar clamp = function clamp(num, min, max) {\n  return Math.min(Math.max(num, min), max);\n};\n\nvar Element = /*#__PURE__*/function () {\n  function Element(options) {\n    this.el = options.el;\n    this.props = options.props;\n    this.scrollAxis = options.scrollAxis;\n    this.disabledParallaxController = options.disabledParallaxController || false;\n    this.id = createId();\n    this.effects = parseElementTransitionEffects(this.props, this.scrollAxis);\n    this.isInView = null;\n    this.progress = 0;\n\n    this._setElementEasing(options.props.easing);\n\n    setWillChangeStyles(options.el, this.effects);\n  }\n\n  var _proto = Element.prototype;\n\n  _proto.updateProps = function updateProps(nextProps) {\n    this.props = _extends({}, this.props, nextProps);\n    this.effects = parseElementTransitionEffects(nextProps, this.scrollAxis);\n\n    this._setElementEasing(nextProps.easing);\n\n    return this;\n  };\n\n  _proto.setCachedAttributes = function setCachedAttributes(view, scroll) {\n    // NOTE: Must reset styles before getting the rect, as it might impact the natural position\n    resetStyles(this);\n    this.rect = new Rect({\n      el: this.props.targetElement || this.el,\n      rootMargin: this.props.rootMargin,\n      view: view\n    });\n    var shouldScaleTranslateEffects = getShouldScaleTranslateEffects(this.props, this.effects, this.scrollAxis);\n\n    if (typeof this.props.startScroll === 'number' && typeof this.props.endScroll === 'number') {\n      this.limits = new Limits({\n        startX: this.props.startScroll,\n        startY: this.props.startScroll,\n        endX: this.props.endScroll,\n        endY: this.props.endScroll\n      }); // Undo the reset -- place it back at current position with styles\n\n      this._setElementStyles();\n\n      return this;\n    }\n\n    if (shouldScaleTranslateEffects) {\n      this.limits = createLimitsWithTranslationsForRelativeElements(this.rect, view, this.effects, scroll, this.scrollAxis, this.props.shouldAlwaysCompleteAnimation);\n      this.scaledEffects = scaleTranslateEffectsForSlowerScroll(this.effects, this.limits);\n    } else {\n      this.limits = createLimitsForRelativeElements(this.rect, view, scroll, this.props.shouldAlwaysCompleteAnimation);\n    } // Undo the reset -- place it back at current position with styles\n\n\n    this._setElementStyles();\n\n    return this;\n  };\n\n  _proto._updateElementIsInView = function _updateElementIsInView(nextIsInView) {\n    // NOTE: Check if this is the first change to make sure onExit isn't called\n    var isFirstChange = this.isInView === null;\n\n    if (nextIsInView !== this.isInView) {\n      if (nextIsInView) {\n        this.props.onEnter && this.props.onEnter(this);\n      } else if (!isFirstChange) {\n        this._setFinalProgress();\n\n        this._setElementStyles();\n\n        this.props.onExit && this.props.onExit(this);\n      }\n    }\n\n    this.isInView = nextIsInView;\n  };\n\n  _proto._setFinalProgress = function _setFinalProgress() {\n    var finalProgress = clamp(Math.round(this.progress), 0, 1);\n\n    this._updateElementProgress(finalProgress);\n  };\n\n  _proto._setElementStyles = function _setElementStyles() {\n    if (this.props.disabled || this.disabledParallaxController) return;\n    var effects = this.scaledEffects || this.effects;\n    setElementStyles(effects, this.progress, this.el);\n  };\n\n  _proto._updateElementProgress = function _updateElementProgress(nextProgress) {\n    this.progress = nextProgress;\n    this.props.onProgressChange && this.props.onProgressChange(this.progress);\n    this.props.onChange && this.props.onChange(this);\n  };\n\n  _proto._setElementEasing = function _setElementEasing(easing) {\n    this.easing = createEasingFunction(easing);\n  };\n\n  _proto.updateElementOptions = function updateElementOptions(options) {\n    this.scrollAxis = options.scrollAxis;\n    this.disabledParallaxController = options.disabledParallaxController || false;\n  };\n\n  _proto.updatePosition = function updatePosition(scroll) {\n    if (!this.limits) return this;\n    var isVertical = this.scrollAxis === ScrollAxis.vertical;\n    var isFirstChange = this.isInView === null; // based on scroll axis\n\n    var start = isVertical ? this.limits.startY : this.limits.startX;\n    var end = isVertical ? this.limits.endY : this.limits.endX;\n    var total = isVertical ? this.limits.totalY : this.limits.totalX;\n    var s = isVertical ? scroll.y : scroll.x; // check if in view\n\n    var nextIsInView = isElementInView(start, end, s);\n\n    this._updateElementIsInView(nextIsInView); // set the progress if in view or this is the first change\n\n\n    if (nextIsInView) {\n      var nextProgress = getProgressAmount(start, total, s, this.easing);\n\n      this._updateElementProgress(nextProgress);\n\n      this._setElementStyles();\n    } else if (isFirstChange) {\n      // NOTE: this._updateElementProgress -- dont use this because it will trigger onChange\n      this.progress = clamp(Math.round(getProgressAmount(start, total, s, this.easing)), 0, 1);\n\n      this._setElementStyles();\n    }\n\n    return this;\n  };\n\n  return Element;\n}();\n\nvar View = /*#__PURE__*/function () {\n  function View(config) {\n    this.scrollContainer = config.scrollContainer;\n    this.width = config.width;\n    this.height = config.height;\n    this.scrollHeight = config.scrollHeight;\n    this.scrollWidth = config.scrollWidth;\n  }\n\n  var _proto = View.prototype;\n\n  _proto.hasChanged = function hasChanged(params) {\n    if (params.width !== this.width || params.height !== this.height || params.scrollWidth !== this.scrollWidth || params.scrollHeight !== this.scrollHeight) {\n      return true;\n    }\n\n    return false;\n  };\n\n  _proto.setSize = function setSize(params) {\n    this.width = params.width;\n    this.height = params.height;\n    this.scrollHeight = params.scrollHeight;\n    this.scrollWidth = params.scrollWidth;\n    return this;\n  };\n\n  return View;\n}();\n\nvar Scroll = /*#__PURE__*/function () {\n  function Scroll(x, y) {\n    this.x = x;\n    this.y = y;\n    this.dx = 0;\n    this.dy = 0;\n  }\n\n  var _proto = Scroll.prototype;\n\n  _proto.setScroll = function setScroll(x, y) {\n    this.dx = x - this.x;\n    this.dy = y - this.y;\n    this.x = x;\n    this.y = y;\n    return this;\n  };\n\n  return Scroll;\n}();\n\nfunction testForPassiveScroll() {\n  var supportsPassiveOption = false;\n\n  try {\n    var opts = Object.defineProperty({}, 'passive', {\n      get: function get() {\n        supportsPassiveOption = true;\n        return true;\n      }\n    }); // @ts-expect-error\n\n    window.addEventListener('test', null, opts); // @ts-expect-error\n\n    window.removeEventListener('test', null, opts);\n  } catch (e) {}\n\n  return supportsPassiveOption;\n}\n\n/**\r\n * -------------------------------------------------------\r\n * Parallax Controller\r\n * -------------------------------------------------------\r\n *\r\n * The global controller for setting up and managing a scroll view of elements.\r\n *\r\n */\n\nvar ParallaxController = /*#__PURE__*/function () {\n  function ParallaxController(_ref) {\n    var _ref$scrollAxis = _ref.scrollAxis,\n        scrollAxis = _ref$scrollAxis === void 0 ? ScrollAxis.vertical : _ref$scrollAxis,\n        scrollContainer = _ref.scrollContainer,\n        _ref$disabled = _ref.disabled,\n        disabled = _ref$disabled === void 0 ? false : _ref$disabled;\n    this.disabled = disabled;\n    this.scrollAxis = scrollAxis; // All parallax elements to be updated\n\n    this.elements = [];\n    this._hasScrollContainer = !!scrollContainer;\n    this.viewEl = scrollContainer != null ? scrollContainer : window; // Scroll and View\n\n    var _this$_getScrollPosit = this._getScrollPosition(),\n        x = _this$_getScrollPosit[0],\n        y = _this$_getScrollPosit[1];\n\n    this.scroll = new Scroll(x, y);\n    this.view = new View({\n      width: 0,\n      height: 0,\n      scrollWidth: 0,\n      scrollHeight: 0,\n      scrollContainer: this._hasScrollContainer ? scrollContainer : undefined\n    }); // Ticking\n\n    this._ticking = false; // Passive support\n\n    this._supportsPassive = testForPassiveScroll(); // Bind methods to class\n\n    this._bindAllMethods(); // If this is initialized disabled, don't do anything below.\n\n\n    if (this.disabled) return;\n\n    this._addListeners(this.viewEl);\n\n    this._addResizeObserver();\n\n    this._setViewSize();\n  }\n  /**\r\n   * Static method to instantiate the ParallaxController.\r\n   * @returns {Class} ParallaxController\r\n   */\n\n\n  ParallaxController.init = function init(options) {\n    var hasWindow = typeof window !== 'undefined';\n\n    if (!hasWindow) {\n      throw new Error('Looks like ParallaxController.init() was called on the server. This method must be called on the client.');\n    }\n\n    return new ParallaxController(options);\n  };\n\n  var _proto = ParallaxController.prototype;\n\n  _proto._bindAllMethods = function _bindAllMethods() {\n    var _this = this;\n\n    ['_addListeners', '_removeListeners', '_getScrollPosition', '_handleScroll', '_handleUpdateCache', '_updateAllElements', '_updateElementPosition', '_setViewSize', '_addResizeObserver', '_checkIfViewHasChanged', '_getViewParams', 'getElements', 'createElement', 'removeElementById', 'resetElementStyles', 'updateElementPropsById', 'update', 'updateScrollContainer', 'destroy'].forEach(function (method) {\n      // @ts-expect-error\n      _this[method] = _this[method].bind(_this);\n    });\n  };\n\n  _proto._addListeners = function _addListeners(el) {\n    el.addEventListener('scroll', this._handleScroll, this._supportsPassive ? {\n      passive: true\n    } : false);\n    window.addEventListener('resize', this._handleUpdateCache, false);\n    window.addEventListener('blur', this._handleUpdateCache, false);\n    window.addEventListener('focus', this._handleUpdateCache, false);\n    window.addEventListener('load', this._handleUpdateCache, false);\n  };\n\n  _proto._removeListeners = function _removeListeners(el) {\n    var _this$_resizeObserver;\n\n    el.removeEventListener('scroll', this._handleScroll, false);\n    window.removeEventListener('resize', this._handleUpdateCache, false);\n    window.removeEventListener('blur', this._handleUpdateCache, false);\n    window.removeEventListener('focus', this._handleUpdateCache, false);\n    window.removeEventListener('load', this._handleUpdateCache, false);\n    (_this$_resizeObserver = this._resizeObserver) == null ? void 0 : _this$_resizeObserver.disconnect();\n  };\n\n  _proto._addResizeObserver = function _addResizeObserver() {\n    var _this2 = this;\n\n    try {\n      var observedEl = this._hasScrollContainer ? this.viewEl : document.documentElement;\n      this._resizeObserver = new ResizeObserver(function () {\n        return _this2.update();\n      });\n\n      this._resizeObserver.observe(observedEl);\n    } catch (e) {\n      console.warn('Failed to create the resize observer in the ParallaxContoller');\n    }\n  };\n\n  _proto._getScrollPosition = function _getScrollPosition() {\n    // Save current scroll\n    // Supports IE 9 and up.\n    var nx = this._hasScrollContainer ? // @ts-expect-error\n    this.viewEl.scrollLeft : window.pageXOffset;\n    var ny = this._hasScrollContainer ? // @ts-expect-error\n    this.viewEl.scrollTop : window.pageYOffset;\n    return [nx, ny];\n  }\n  /**\r\n   * Window scroll handler sets scroll position\r\n   * and then calls '_updateAllElements()'.\r\n   */\n  ;\n\n  _proto._handleScroll = function _handleScroll() {\n    var _this$elements;\n\n    var _this$_getScrollPosit2 = this._getScrollPosition(),\n        nx = _this$_getScrollPosit2[0],\n        ny = _this$_getScrollPosit2[1];\n\n    this.scroll.setScroll(nx, ny); // Only called if the last animation request has been\n    // completed and there are parallax elements to update\n\n    if (!this._ticking && ((_this$elements = this.elements) == null ? void 0 : _this$elements.length) > 0) {\n      this._ticking = true; // @ts-ignore\n\n      window.requestAnimationFrame(this._updateAllElements);\n    }\n  }\n  /**\r\n   * Window resize handler. Sets the new window inner height\r\n   * then updates parallax element attributes and positions.\r\n   */\n  ;\n\n  _proto._handleUpdateCache = function _handleUpdateCache() {\n    this._setViewSize();\n\n    this._updateAllElements({\n      updateCache: true\n    });\n  }\n  /**\r\n   * Update element positions.\r\n   * Determines if the element is in view based on the cached\r\n   * attributes, if so set the elements parallax styles.\r\n   */\n  ;\n\n  _proto._updateAllElements = function _updateAllElements(_temp) {\n    var _this3 = this;\n\n    var _ref2 = _temp === void 0 ? {} : _temp,\n        updateCache = _ref2.updateCache;\n\n    if (this.elements) {\n      this.elements.forEach(function (element) {\n        if (updateCache) {\n          element.setCachedAttributes(_this3.view, _this3.scroll);\n        }\n\n        _this3._updateElementPosition(element);\n      });\n    } // reset ticking so more animations can be called\n\n\n    this._ticking = false;\n  }\n  /**\r\n   * Update element positions.\r\n   * Determines if the element is in view based on the cached\r\n   * attributes, if so set the elements parallax styles.\r\n   */\n  ;\n\n  _proto._updateElementPosition = function _updateElementPosition(element) {\n    if (element.props.disabled || this.disabled) return;\n    element.updatePosition(this.scroll);\n  }\n  /**\r\n   * Gets the params to set in the View from the scroll container or the window\r\n   */\n  ;\n\n  _proto._getViewParams = function _getViewParams() {\n    if (this._hasScrollContainer) {\n      // @ts-expect-error\n      var _width = this.viewEl.offsetWidth; // @ts-expect-error\n\n      var _height = this.viewEl.offsetHeight; // @ts-expect-error\n\n      var _scrollHeight = this.viewEl.scrollHeight; // @ts-expect-error\n\n      var _scrollWidth = this.viewEl.scrollWidth;\n      return this.view.setSize({\n        width: _width,\n        height: _height,\n        scrollHeight: _scrollHeight,\n        scrollWidth: _scrollWidth\n      });\n    }\n\n    var html = document.documentElement;\n    var width = window.innerWidth || html.clientWidth;\n    var height = window.innerHeight || html.clientHeight;\n    var scrollHeight = html.scrollHeight;\n    var scrollWidth = html.scrollWidth;\n    return {\n      width: width,\n      height: height,\n      scrollHeight: scrollHeight,\n      scrollWidth: scrollWidth\n    };\n  }\n  /**\r\n   * Cache the view attributes\r\n   */\n  ;\n\n  _proto._setViewSize = function _setViewSize() {\n    return this.view.setSize(this._getViewParams());\n  }\n  /**\r\n   * Checks if any of the cached attributes of the view have changed.\r\n   * @returns boolean\r\n   */\n  ;\n\n  _proto._checkIfViewHasChanged = function _checkIfViewHasChanged() {\n    return this.view.hasChanged(this._getViewParams());\n  }\n  /**\r\n   * -------------------------------------------------------\r\n   * Public methods\r\n   * -------------------------------------------------------\r\n   */\n\n  /**\r\n   * Returns all the parallax elements in the controller\r\n   */\n  ;\n\n  _proto.getElements = function getElements() {\n    return this.elements;\n  }\n  /**\r\n   * Creates and returns new parallax element with provided options to be managed by the controller.\r\n   */\n  ;\n\n  _proto.createElement = function createElement(options) {\n    var newElement = new Element(_extends({}, options, {\n      scrollAxis: this.scrollAxis,\n      disabledParallaxController: this.disabled\n    }));\n    newElement.setCachedAttributes(this.view, this.scroll);\n    this.elements = this.elements ? [].concat(this.elements, [newElement]) : [newElement];\n\n    this._updateElementPosition(newElement); // NOTE: This checks if the view has changed then update the controller and all elements if it has\n    // This shouldn't always be necessary with a resize observer watching the view element\n    // but there seems to be cases where the resize observer does not catch and update.\n\n\n    if (this._checkIfViewHasChanged()) {\n      this.update();\n    }\n\n    return newElement;\n  }\n  /**\r\n   * Remove an element by id\r\n   */\n  ;\n\n  _proto.removeElementById = function removeElementById(id) {\n    if (!this.elements) return;\n    this.elements = this.elements.filter(function (el) {\n      return el.id !== id;\n    });\n  }\n  /**\r\n   * Updates an existing parallax element object with new options.\r\n   */\n  ;\n\n  _proto.updateElementPropsById = function updateElementPropsById(id, props) {\n    if (this.elements) {\n      this.elements = this.elements.map(function (el) {\n        if (el.id === id) {\n          return el.updateProps(props);\n        }\n\n        return el;\n      });\n    }\n\n    this.update();\n  }\n  /**\r\n   * Remove a target elements parallax styles\r\n   */\n  ;\n\n  _proto.resetElementStyles = function resetElementStyles(element) {\n    resetStyles(element);\n  }\n  /**\r\n   * Updates all cached attributes on parallax elements.\r\n   */\n  ;\n\n  _proto.update = function update() {\n    // Save the latest scroll position because window.scroll\n    // may be called and the handle scroll event may not be called.\n    var _this$_getScrollPosit3 = this._getScrollPosition(),\n        nx = _this$_getScrollPosit3[0],\n        ny = _this$_getScrollPosit3[1];\n\n    this.scroll.setScroll(nx, ny);\n\n    this._setViewSize();\n\n    this._updateAllElements({\n      updateCache: true\n    });\n  }\n  /**\r\n   * Updates the scroll container of the parallax controller\r\n   */\n  ;\n\n  _proto.updateScrollContainer = function updateScrollContainer(el) {\n    // remove existing listeners with current el first\n    this._removeListeners(this.viewEl);\n\n    this.viewEl = el;\n    this._hasScrollContainer = !!el;\n    this.view = new View({\n      width: 0,\n      height: 0,\n      scrollWidth: 0,\n      scrollHeight: 0,\n      scrollContainer: el\n    });\n\n    this._setViewSize();\n\n    this._addListeners(this.viewEl);\n\n    this._updateAllElements({\n      updateCache: true\n    });\n  };\n\n  _proto.disableParallaxController = function disableParallaxController() {\n    this.disabled = true; // remove listeners\n\n    this._removeListeners(this.viewEl); // reset all styles\n\n\n    if (this.elements) {\n      this.elements.forEach(function (element) {\n        return resetStyles(element);\n      });\n    }\n  };\n\n  _proto.enableParallaxController = function enableParallaxController() {\n    var _this4 = this;\n\n    this.disabled = false;\n\n    if (this.elements) {\n      this.elements.forEach(function (element) {\n        return element.updateElementOptions({\n          disabledParallaxController: false,\n          scrollAxis: _this4.scrollAxis\n        });\n      });\n    } // add back listeners\n\n\n    this._addListeners(this.viewEl);\n\n    this._addResizeObserver();\n\n    this._setViewSize();\n  }\n  /**\r\n   * Disable all parallax elements\r\n   */\n  ;\n\n  _proto.disableAllElements = function disableAllElements() {\n    console.warn('deprecated: use disableParallaxController() instead');\n\n    if (this.elements) {\n      this.elements = this.elements.map(function (el) {\n        return el.updateProps({\n          disabled: true\n        });\n      });\n    }\n\n    this.update();\n  }\n  /**\r\n   * Enable all parallax elements\r\n   */\n  ;\n\n  _proto.enableAllElements = function enableAllElements() {\n    console.warn('deprecated: use enableParallaxController() instead');\n\n    if (this.elements) {\n      this.elements = this.elements.map(function (el) {\n        return el.updateProps({\n          disabled: false\n        });\n      });\n    }\n\n    this.update();\n  }\n  /**\r\n   * Removes all listeners and resets all styles on managed elements.\r\n   */\n  ;\n\n  _proto.destroy = function destroy() {\n    this._removeListeners(this.viewEl);\n\n    if (this.elements) {\n      this.elements.forEach(function (element) {\n        return resetStyles(element);\n      });\n    } // @ts-expect-error\n\n\n    this.elements = undefined;\n  };\n\n  return ParallaxController;\n}();\n\nexport { EasingPreset, Element, Limits, ParallaxController, Rect, RotationUnits, ScaleUnits, Scroll, ScrollAxis, Units, ValidCSSEffects, View, createId, getProgressAmount, isElementInView, parseElementTransitionEffects, parseValueAndUnit, resetStyles, scaleBetween, scaleEffectByProgress, setElementStyles, testForPassiveScroll };\n//# sourceMappingURL=parallax-controller.esm.js.map\n","import { ParallaxController, parseValueAndUnit, ScrollAxis } from 'parallax-controller';\nexport { EasingPreset } from 'parallax-controller';\nimport React, { useEffect, useContext, useRef, useState, Component } from 'react';\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n\n  _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nfunction removeUndefinedObjectKeys(obj) {\n  Object.keys(obj).forEach(function (key) {\n    return obj[key] === undefined && delete obj[key];\n  });\n  return obj;\n}\n\nvar _excluded = [\"disabled\", \"easing\", \"endScroll\", \"onChange\", \"onEnter\", \"onExit\", \"onProgressChange\", \"opacity\", \"rootMargin\", \"rotate\", \"rotateX\", \"rotateY\", \"rotateZ\", \"scale\", \"scaleX\", \"scaleY\", \"scaleZ\", \"shouldAlwaysCompleteAnimation\", \"shouldDisableScalingTranslations\", \"speed\", \"startScroll\", \"targetElement\", \"translateX\", \"translateY\"];\nfunction getIsolatedParallaxProps(props) {\n  var disabled = props.disabled,\n      easing = props.easing,\n      endScroll = props.endScroll,\n      onChange = props.onChange,\n      onEnter = props.onEnter,\n      onExit = props.onExit,\n      onProgressChange = props.onProgressChange,\n      opacity = props.opacity,\n      rootMargin = props.rootMargin,\n      rotate = props.rotate,\n      rotateX = props.rotateX,\n      rotateY = props.rotateY,\n      rotateZ = props.rotateZ,\n      scale = props.scale,\n      scaleX = props.scaleX,\n      scaleY = props.scaleY,\n      scaleZ = props.scaleZ,\n      shouldAlwaysCompleteAnimation = props.shouldAlwaysCompleteAnimation,\n      shouldDisableScalingTranslations = props.shouldDisableScalingTranslations,\n      speed = props.speed,\n      startScroll = props.startScroll,\n      targetElement = props.targetElement,\n      translateX = props.translateX,\n      translateY = props.translateY,\n      rest = _objectWithoutPropertiesLoose(props, _excluded);\n\n  var parallaxProps = removeUndefinedObjectKeys({\n    disabled: disabled,\n    easing: easing,\n    endScroll: endScroll,\n    onChange: onChange,\n    onEnter: onEnter,\n    onExit: onExit,\n    onProgressChange: onProgressChange,\n    opacity: opacity,\n    rootMargin: rootMargin,\n    rotate: rotate,\n    rotateX: rotateX,\n    rotateY: rotateY,\n    rotateZ: rotateZ,\n    scale: scale,\n    scaleX: scaleX,\n    scaleY: scaleY,\n    scaleZ: scaleZ,\n    shouldAlwaysCompleteAnimation: shouldAlwaysCompleteAnimation,\n    shouldDisableScalingTranslations: shouldDisableScalingTranslations,\n    speed: speed,\n    startScroll: startScroll,\n    targetElement: targetElement,\n    translateX: translateX,\n    translateY: translateY\n  });\n  return {\n    parallaxProps: parallaxProps,\n    rest: rest\n  };\n}\n\nfunction useVerifyController(controller) {\n  useEffect(function () {\n    var isServer = typeof window === 'undefined'; // Make sure the provided controller is an instance of the Parallax Controller\n\n    var isInstance = controller instanceof ParallaxController; // Throw if neither context or global is available\n\n    if (!isServer && !controller && !isInstance) {\n      throw new Error(\"Must wrap your application's <Parallax /> components in a <ParallaxProvider />.\");\n    }\n  }, [controller]);\n}\n\nvar ParallaxContext = /*#__PURE__*/React.createContext(null);\n\nfunction useParallaxController() {\n  var parallaxController = useContext(ParallaxContext);\n  var isServer = typeof window === 'undefined';\n\n  if (isServer) {\n    return null;\n  }\n\n  if (!parallaxController) {\n    throw new Error('Could not find `react-scroll-parallax` context value. Please ensure the component is wrapped in a <ParallaxProvider>');\n  }\n\n  return parallaxController;\n}\n\nfunction useParallax(props) {\n  var controller = useParallaxController();\n  var ref = useRef(null);\n\n  var _getIsolatedParallaxP = getIsolatedParallaxProps(props),\n      parallaxProps = _getIsolatedParallaxP.parallaxProps;\n\n  useVerifyController(controller);\n\n  var _useState = useState(),\n      element = _useState[0],\n      setElement = _useState[1]; // create element\n\n\n  useEffect(function () {\n    var newElement;\n\n    if (ref.current instanceof HTMLElement) {\n      var options = {\n        el: ref.current,\n        props: parallaxProps\n      };\n      newElement = controller == null ? void 0 : controller.createElement(options);\n      setElement(newElement);\n    } else {\n      throw new Error('You must assign the ref returned by the useParallax() hook to an HTML Element.');\n    }\n\n    return function () {\n      if (newElement) {\n        controller == null ? void 0 : controller.removeElementById(newElement.id);\n      }\n    };\n  }, []); // update element\n\n  useEffect(function () {\n    if (element) {\n      if (props.disabled) {\n        controller == null ? void 0 : controller.resetElementStyles(element);\n        controller == null ? void 0 : controller.updateElementPropsById(element.id, parallaxProps);\n      } else {\n        controller == null ? void 0 : controller.updateElementPropsById(element.id, parallaxProps);\n      }\n    }\n  }, [props.disabled, props.easing, props.endScroll, props.onChange, props.onEnter, props.onExit, props.onProgressChange, props.opacity, props.rootMargin, props.rotate, props.rotateX, props.rotateY, props.rotateZ, props.scale, props.scaleX, props.scaleY, props.scaleZ, props.shouldAlwaysCompleteAnimation, props.shouldDisableScalingTranslations, props.speed, props.startScroll, props.targetElement, props.translateX, props.translateY]);\n  return {\n    ref: ref,\n    controller: controller,\n    element: element\n  };\n}\n\nfunction Parallax(props) {\n  var _getIsolatedParallaxP = getIsolatedParallaxProps(props),\n      parallaxProps = _getIsolatedParallaxP.parallaxProps,\n      rest = _getIsolatedParallaxP.rest;\n\n  var _useParallax = useParallax(parallaxProps),\n      ref = _useParallax.ref;\n\n  return React.createElement(\"div\", Object.assign({\n    ref: ref\n  }, rest), props.children);\n}\n\nvar FALLBACK_RECT = {\n  height: 0\n};\nfunction getExpandedStyle(layer) {\n  if (Array.isArray(layer.translateY)) {\n    var translateYStart = parseValueAndUnit(layer.translateY[0]);\n    var translateYEnd = parseValueAndUnit(layer.translateY[1]);\n\n    if (translateYStart.unit === 'px' && translateYEnd.unit === 'px') {\n      return {\n        top: Math.abs(translateYEnd.value) * -1 + \"px\",\n        bottom: Math.abs(translateYStart.value) * -1 + \"px\"\n      };\n    }\n\n    if (translateYStart.unit === '%' && translateYEnd.unit === '%') {\n      var _layer$targetElement$, _layer$targetElement;\n\n      var clientRect = (_layer$targetElement$ = (_layer$targetElement = layer.targetElement) == null ? void 0 : _layer$targetElement.getBoundingClientRect()) != null ? _layer$targetElement$ : FALLBACK_RECT;\n      var top = Math.abs(clientRect.height * 0.01 * translateYEnd.value) * -1;\n      var bottom = Math.abs(clientRect.height * 0.01 * translateYStart.value) * -1;\n      return {\n        top: top + \"px\",\n        bottom: bottom + \"px\"\n      };\n    }\n  }\n\n  if (layer.speed) {\n    var speed = layer.speed || 0;\n    var absSpeed = Math.abs(speed) * 10 * -1;\n    return {\n      top: absSpeed + \"px\",\n      bottom: absSpeed + \"px\"\n    };\n  }\n\n  return {};\n}\n\nfunction getImageStyle(layer) {\n  return layer.image ? {\n    backgroundImage: \"url(\" + layer.image + \")\",\n    backgroundPosition: 'center',\n    backgroundSize: 'cover'\n  } : {};\n}\n\nvar _excluded$1 = [\"children\", \"disabled\", \"style\", \"expanded\", \"image\", \"testId\"];\nvar absoluteStyle = {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 0\n};\nvar ParallaxBannerLayer = function ParallaxBannerLayer(props) {\n  var _getIsolatedParallaxP = getIsolatedParallaxProps(props),\n      parallaxProps = _getIsolatedParallaxP.parallaxProps,\n      rest = _getIsolatedParallaxP.rest;\n\n  var style = rest.style,\n      _rest$expanded = rest.expanded,\n      expanded = _rest$expanded === void 0 ? true : _rest$expanded,\n      testId = rest.testId,\n      divProps = _objectWithoutPropertiesLoose(rest, _excluded$1);\n\n  var imageStyle = getImageStyle(props);\n  var expandedStyle = expanded ? getExpandedStyle(props) : {};\n  var parallax = useParallax(_extends({\n    targetElement: props.targetElement,\n    shouldDisableScalingTranslations: true\n  }, parallaxProps));\n  return React.createElement(\"div\", Object.assign({\n    \"data-testid\": testId,\n    ref: parallax.ref,\n    style: _extends({}, imageStyle, absoluteStyle, expandedStyle, style)\n  }, divProps), rest.children);\n};\n\nvar _excluded$2 = [\"disabled\", \"style\", \"layers\"];\nvar containerStyle = {\n  position: 'relative',\n  overflow: 'hidden',\n  width: '100%'\n};\nvar ParallaxBanner = function ParallaxBanner(props) {\n  var _useState = useState(null),\n      targetElement = _useState[0],\n      setTargetElement = _useState[1];\n\n  var containerRef = useRef(null);\n  useEffect(function () {\n    setTargetElement(containerRef.current);\n  }, []);\n\n  var rootStyle = props.style,\n      _props$layers = props.layers,\n      layers = _props$layers === void 0 ? [] : _props$layers,\n      rootRest = _objectWithoutPropertiesLoose(props, _excluded$2);\n\n  function renderLayers() {\n    if (targetElement) {\n      var shouldUseLayers = layers && layers.length > 0;\n\n      if (shouldUseLayers) {\n        return layers.map(function (layer, i) {\n          return React.createElement(ParallaxBannerLayer, Object.assign({}, layer, {\n            targetElement: targetElement,\n            key: \"layer-\" + i,\n            testId: \"layer-\" + i\n          }));\n        });\n      }\n    }\n\n    return null;\n  }\n\n  function renderChildren() {\n    if (targetElement) {\n      return React.Children.map(props.children, function (child) {\n        var item = child; // adds the targetElement prop to any ParallaxBannerLayer components\n\n        if ((item == null ? void 0 : item.type) === ParallaxBannerLayer) {\n          var clone = React.cloneElement(item, {\n            targetElement: targetElement\n          });\n          return clone;\n        }\n\n        return child;\n      });\n    }\n\n    return null;\n  }\n\n  return React.createElement(\"div\", Object.assign({\n    ref: containerRef,\n    style: _extends({}, containerStyle, rootStyle)\n  }, rootRest), renderLayers(), renderChildren());\n};\n\nvar createController = function createController(options) {\n  // Don't initialize on the server\n  var isServer = typeof window === 'undefined';\n\n  if (!isServer) {\n    // Must not be the server so kick it off...\n    return ParallaxController.init(options);\n  }\n\n  return null;\n};\n\nvar ParallaxProvider = /*#__PURE__*/function (_Component) {\n  _inheritsLoose(ParallaxProvider, _Component);\n\n  function ParallaxProvider(props) {\n    var _this;\n\n    _this = _Component.call(this, props) || this;\n    _this.controller = createController({\n      scrollAxis: props.scrollAxis,\n      scrollContainer: props.scrollContainer,\n      disabled: props.isDisabled\n    });\n    return _this;\n  }\n\n  var _proto = ParallaxProvider.prototype;\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    if (prevProps.scrollContainer !== this.props.scrollContainer && this.props.scrollContainer) {\n      var _this$controller;\n\n      (_this$controller = this.controller) == null ? void 0 : _this$controller.updateScrollContainer(this.props.scrollContainer);\n    }\n\n    if (prevProps.isDisabled !== this.props.isDisabled) {\n      if (this.props.isDisabled) {\n        var _this$controller2;\n\n        (_this$controller2 = this.controller) == null ? void 0 : _this$controller2.disableParallaxController();\n      }\n\n      if (!this.props.isDisabled) {\n        var _this$controller3;\n\n        (_this$controller3 = this.controller) == null ? void 0 : _this$controller3.enableParallaxController();\n      }\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    // @ts-ignore\n    this.controller = this.controller.destroy();\n  };\n\n  _proto.render = function render() {\n    var children = this.props.children;\n    return (// @ts-ignore\n      React.createElement(ParallaxContext.Provider, {\n        value: this.controller\n      }, children)\n    );\n  };\n\n  return ParallaxProvider;\n}(Component);\nParallaxProvider.defaultProps = {\n  scrollAxis: ScrollAxis.vertical\n};\n\nexport { Parallax, ParallaxBanner, ParallaxBannerLayer, ParallaxContext, ParallaxProvider, useParallax, useParallaxController };\n//# sourceMappingURL=react-scroll-parallax.esm.js.map\n"],"names":[],"sourceRoot":"","ignoreList":[0,1,2]}