From 123647a8b77036a331f99ab46ce630137a3e7995 Mon Sep 17 00:00:00 2001 From: Jeeho Ahn Date: Thu, 7 Dec 2023 05:12:53 +0000 Subject: [PATCH 1/4] feat: start adding support for scroll delay --- src/core/ScrollElement.ts | 28 +++++++++++++++++++++++----- src/types.ts | 1 + src/utils/maths.ts | 12 ++++++++++++ src/utils/translate.ts | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 src/utils/translate.ts diff --git a/src/core/ScrollElement.ts b/src/core/ScrollElement.ts index f056b0da..90dd848d 100644 --- a/src/core/ScrollElement.ts +++ b/src/core/ScrollElement.ts @@ -28,7 +28,8 @@ import { scrollCallFrom, scrollOrientation, } from '../types'; -import { clamp, closestNumber, normalize, mapRange } from '../utils/maths'; +import { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths'; +import { getTranslate } from '../utils/translate'; /** Constants */ const INVIEW_CLASS = 'is-inview'; @@ -96,6 +97,10 @@ export default class ScrollElement { this.$el.dataset['scrollSpeed'] != null ? parseFloat(this.$el.dataset['scrollSpeed']) : null, + scrollDelay: + this.$el.dataset['scrollDelay'] != null + ? parseFloat(this.$el.dataset['scrollDelay']) + : null, scrollRepeat: this.$el.dataset['scrollRepeat'] != null, scrollCall: this.$el.dataset['scrollCall'] ?? null, scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null, @@ -205,10 +210,23 @@ export default class ScrollElement { progress * wSize * this.attributes.scrollSpeed * -1; } - this.$el.style.transform = - this.scrollOrientation === 'vertical' - ? `translate3d(0, ${this.translateValue}px, 0)` - : `translate3d(${this.translateValue}px, 0, 0)`; + if (this.attributes.scrollDelay) { + const start = getTranslate(this.$el) + const lerped = this.scrollOrientation == 'vertical' ? + lerp(start.x, this.translateValue, this.attributes.scrollDelay) : + lerp(start.y, this.translateValue, this.attributes.scrollDelay) + + this.$el.style.transform = + this.scrollOrientation === 'vertical' + ? `translate3d(0, ${lerped}px, 0)` + : `translate3d(${lerped}px, 0, 0)`; + } + else { + this.$el.style.transform = + this.scrollOrientation === 'vertical' + ? `translate3d(0, ${this.translateValue}px, 0)` + : `translate3d(${this.translateValue}px, 0, 0)`; + } } } } diff --git a/src/types.ts b/src/types.ts index 6477fe36..80db17e3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -189,6 +189,7 @@ export interface IScrollElementOptions { */ export interface IScrollElementAttributes { scrollClass: string; + scrollDelay: number | null; scrollOffset: string; scrollPosition: string; scrollModuleProgress: boolean; diff --git a/src/utils/maths.ts b/src/utils/maths.ts index 550c1784..7f1760a5 100644 --- a/src/utils/maths.ts +++ b/src/utils/maths.ts @@ -62,3 +62,15 @@ export function closestNumber(array: number[], target: number): number { return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev; }); } + + +/** + * Linear interpolation between two numbers. + * @param {number} start + * @param {number} end + * @param {number} amt + * @returns {number} + */ +export function lerp(start: number, end: number, amt: number): number { + return (1 - amt) * start + amt * end; +} \ No newline at end of file diff --git a/src/utils/translate.ts b/src/utils/translate.ts new file mode 100644 index 00000000..ec9d4001 --- /dev/null +++ b/src/utils/translate.ts @@ -0,0 +1,18 @@ +export function getTranslate(el: Element) { + const translate = {x: 0, y: 0}; + + if (!window.getComputedStyle) return translate; + + const style = getComputedStyle(el); + const transform = style.transform + + let matches = transform.match(/translate\(([^)]+)\)/); + + if (matches) { + const parts = matches[1].split(', '); + translate.x = parseFloat(parts[0]); + translate.y = parseFloat(parts[1]); + } + + return translate; +} \ No newline at end of file From e215bd530bfca7f476fe456f6be52577fb235d34 Mon Sep 17 00:00:00 2001 From: Jeeho Ahn Date: Thu, 7 Dec 2023 11:59:56 +0000 Subject: [PATCH 2/4] fix: correct x/y --- bundled/locomotive-scroll.js | 36 ++++++++++++++++++++++++++- bundled/locomotive-scroll.min.js | 2 +- dist/locomotive-scroll.cjs | 2 +- dist/locomotive-scroll.cjs.map | 2 +- dist/locomotive-scroll.mjs | 2 +- dist/locomotive-scroll.mjs.map | 2 +- dist/locomotive-scroll.modern.mjs | 2 +- dist/locomotive-scroll.modern.mjs.map | 2 +- dist/locomotive-scroll.umd.js | 4 +-- dist/locomotive-scroll.umd.js.map | 2 +- dist/types/types.d.ts | 1 + dist/types/utils/maths.d.ts | 8 ++++++ dist/types/utils/translate.d.ts | 4 +++ src/core/ScrollElement.ts | 5 ++-- 14 files changed, 61 insertions(+), 13 deletions(-) create mode 100644 dist/types/utils/translate.d.ts diff --git a/bundled/locomotive-scroll.js b/bundled/locomotive-scroll.js index ae074e36..8792519c 100644 --- a/bundled/locomotive-scroll.js +++ b/bundled/locomotive-scroll.js @@ -234,6 +234,33 @@ return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev; }); } + /** + * Linear interpolation between two numbers. + * @param {number} start + * @param {number} end + * @param {number} amt + * @returns {number} + */ + function lerp(start, end, amt) { + return (1 - amt) * start + amt * end; + } + + function getTranslate(el) { + var translate = { + x: 0, + y: 0 + }; + if (!window.getComputedStyle) return translate; + var style = getComputedStyle(el); + var transform = style.transform; + var matches = transform.match(/translate\(([^)]+)\)/); + if (matches) { + var parts = matches[1].split(', '); + translate.x = parseFloat(parts[0]); + translate.y = parseFloat(parts[1]); + } + return translate; + } /** Constants */ var INVIEW_CLASS = 'is-inview'; @@ -291,6 +318,7 @@ scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null, scrollEventProgress: (_this$$el$dataset$scr4 = this.$el.dataset['scrollEventProgress']) != null ? _this$$el$dataset$scr4 : null, scrollSpeed: this.$el.dataset['scrollSpeed'] != null ? parseFloat(this.$el.dataset['scrollSpeed']) : null, + scrollDelay: this.$el.dataset['scrollDelay'] != null ? parseFloat(this.$el.dataset['scrollDelay']) : null, scrollRepeat: this.$el.dataset['scrollRepeat'] != null, scrollCall: (_this$$el$dataset$scr5 = this.$el.dataset['scrollCall']) != null ? _this$$el$dataset$scr5 : null, scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null, @@ -377,7 +405,13 @@ var _progress = mapRange(0, 1, -1, 1, this.progress); this.translateValue = _progress * wSize * this.attributes.scrollSpeed * -1; } - this.$el.style.transform = this.scrollOrientation === 'vertical' ? "translate3d(0, " + this.translateValue + "px, 0)" : "translate3d(" + this.translateValue + "px, 0, 0)"; + if (this.attributes.scrollDelay) { + var start = getTranslate(this.$el); + var lerped = this.scrollOrientation == 'vertical' ? lerp(start.y, this.translateValue, this.attributes.scrollDelay) : lerp(start.x, this.translateValue, this.attributes.scrollDelay); + this.$el.style.transform = this.scrollOrientation === 'vertical' ? "translate3d(0, " + lerped + "px, 0)" : "translate3d(" + lerped + "px, 0, 0)"; + } else { + this.$el.style.transform = this.scrollOrientation === 'vertical' ? "translate3d(0, " + this.translateValue + "px, 0)" : "translate3d(" + this.translateValue + "px, 0, 0)"; + } } } } diff --git a/bundled/locomotive-scroll.min.js b/bundled/locomotive-scroll.min.js index 201e4239..704324b7 100644 --- a/bundled/locomotive-scroll.min.js +++ b/bundled/locomotive-scroll.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t||self).LocomotiveScroll=e()}(this,function(){function t(){return t=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var i=0,s=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(){return s=Object.assign?Object.assign.bind():function(t){for(var e=1;e=1;const s=i?1:this.easing(e);this.value=this.from+(this.to-this.from)*s}var s,r,o;null==(e=this.onUpdate)||e.call(this,this.value,i),i&&this.stop()}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i=.1,duration:s=1,easing:n=(t=>t),onStart:r,onUpdate:o}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=n,this.currentTime=0,this.isRunning=!0,null==r||r(),this.onUpdate=o}}class o{constructor({wrapper:t,content:e,autoResize:i=!0}={}){if(this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth},this.wrapper=t,this.content=e,i){const t=function(t,e){let i;return function(){let e=arguments,s=this;clearTimeout(i),i=setTimeout(function(){t.apply(s,e)},250)}}(this.resize);this.wrapper!==window&&(this.wrapperResizeObserver=new ResizeObserver(t),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(t),this.contentResizeObserver.observe(this.content)}this.resize()}destroy(){var t,e;null==(t=this.wrapperResizeObserver)||t.disconnect(),null==(e=this.contentResizeObserver)||e.disconnect()}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class l{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}}off(t,e){var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}destroy(){this.events={}}}class a{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=2,normalizeWheel:s=!1}){this.onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0}},this.onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,n=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:n},this.emitter.emit("scroll",{deltaX:s,deltaY:n,event:t})},this.onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})},this.onWheel=t=>{let{deltaX:e,deltaY:i}=t;this.normalizeWheel&&(e=n(-100,e,100),i=n(-100,i,100)),e*=this.wheelMultiplier,i*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})},this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.normalizeWheel=s,this.touchStart={x:null,y:null},this.emitter=new l,this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}}class h{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:n=i,smoothWheel:h=!0,smoothTouch:c=!1,syncTouch:u=!1,syncTouchLerp:d=.1,__iosNoInertiaSyncTouchLerp:v=.4,touchInertiaMultiplier:m=35,duration:p,easing:f=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:g=!p&&.1,infinite:b=!1,orientation:S="vertical",gestureOrientation:E="vertical",touchMultiplier:I=1,wheelMultiplier:w=1,normalizeWheel:O=!1,autoResize:y=!0}={}){this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const n=i.type.includes("touch"),r=i.type.includes("wheel");if("both"===this.options.gestureOrientation&&0===t&&0===e||"vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t||n&&"vertical"===this.options.gestureOrientation&&0===this.scroll&&!this.options.infinite&&e<=0)return;let o=i.composedPath();if(o=o.slice(0,o.indexOf(this.rootElement)),o.find(t=>{var e;return(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent"))||n&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-touch"))||r&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-wheel"))||(null==(e=t.classList)?void 0:e.contains("lenis"))}))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(this.isSmooth=(this.options.smoothTouch||this.options.syncTouch)&&n||this.options.smoothWheel&&r,!this.isSmooth)return this.isScrolling=!1,void this.animate.stop();i.preventDefault();let l=e;"both"===this.options.gestureOrientation?l=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(l=t);const a=n&&this.options.syncTouch,h=n&&"touchend"===i.type&&Math.abs(l)>1;h&&(l=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+l,s({programmatic:!1},a&&{lerp:h?this.syncTouchLerp:this.options.__iosNoInertiaSyncTouchLerp}))},this.onNativeScroll=()=>{if(!this.__preventNextScrollEvent&&!this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.direction=Math.sign(this.animatedScroll-t),this.emit()}},window.lenisVersion="1.0.29",t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:n,smoothWheel:h,smoothTouch:c,syncTouch:u,syncTouchLerp:d,__iosNoInertiaSyncTouchLerp:v,touchInertiaMultiplier:m,duration:p,easing:f,lerp:g,infinite:b,gestureOrientation:E,orientation:S,touchMultiplier:I,wheelMultiplier:w,normalizeWheel:O,autoResize:y},this.animate=new r,this.emitter=new l,this.dimensions=new o({wrapper:t,content:e,autoResize:y}),this.toggleClass("lenis",!0),this.velocity=0,this.isLocked=!1,this.isStopped=!1,this.isSmooth=u||h||c,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll=new a(n,{touchMultiplier:I,wheelMultiplier:w,normalizeWheel:O}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll.destroy(),this.dimensions.destroy(),this.toggleClass("lenis",!1),this.toggleClass("lenis-smooth",!1),this.toggleClass("lenis-scrolling",!1),this.toggleClass("lenis-stopped",!1),this.toggleClass("lenis-locked",!1)}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.animate.stop()}start(){this.isStopped=!1,this.reset()}stop(){this.isStopped=!0,this.animate.stop(),this.reset()}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:r=this.options.duration,easing:o=this.options.easing,lerp:l=!r&&this.options.lerp,onComplete:a=null,force:h=!1,programmatic:c=!0}={}){if(!this.isStopped&&!this.isLocked||h){if(["top","left","start"].includes(t))t=0;else if(["bottom","right","end"].includes(t))t=this.limit;else{var u;let i;if("string"==typeof t?i=document.querySelector(t):null!=(u=t)&&u.nodeType&&(i=t),i){if(this.options.wrapper!==window){const t=this.options.wrapper.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t){if(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=n(0,t,this.limit),i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),void(null==a||a(this));if(!c){if(t===this.targetScroll)return;this.targetScroll=t}this.animate.fromTo(this.animatedScroll,t,{duration:r,easing:o,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling=!0},onUpdate:(t,e)=>{this.isScrolling=!0,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==a||a(this),this.__preventNextScrollEvent=!0,requestAnimationFrame(()=>{delete this.__preventNextScrollEvent}))}})}}}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?(this.animatedScroll%(t=this.limit)+t)%t:this.animatedScroll;var t}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isSmooth(){return this.__isSmooth}set isSmooth(t){this.__isSmooth!==t&&(this.__isSmooth=t,this.toggleClass("lenis-smooth",t))}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.toggleClass("lenis-scrolling",t))}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.toggleClass("lenis-stopped",t))}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.toggleClass("lenis-locked",t))}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isSmooth&&(t+=" lenis-smooth"),t}toggleClass(t,e){this.rootElement.classList.toggle(t,e),this.emitter.emit("className change",this)}}var c=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,i=t.rootMargin,s=void 0===i?"-1px -1px -1px -1px":i,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=s,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var i=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(i&&(i.isAlreadyIntersected=!0),t._setInview(e)):i&&i.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function u(t,e,i,s,n){return i+((n-t)/(e-t)*(s-i)||0)}function d(t,e){return t.reduce(function(t,i){return Math.abs(i-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var n,r=i(this.progressModularModules);!(n=r()).done;){var o=n.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var i=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(i)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,n=i(t);!(s=n()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=d([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var i,s,n=null==(i=this.attributes.scrollCall)?void 0:i.split(","),r=null==(s=this.attributes)?void 0:s.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],h=n[1],c=n[2];l=r?this.$el.dataset["module"+h.trim()]:c,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},h.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),m=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],p=/*#__PURE__*/function(){function t(t){var e=t.$el,i=t.modularInstance,s=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=i,this.scrollOrientation=r,this.triggerRootMargin=null!=s?s:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new c({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new c({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,n=i(this.RAFScrollElements);!(e=n()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,n=t.smooth,r=i(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:n})},e.removeScrollElements=function(t){var e=this,i=t.querySelectorAll("[data-scroll]");if(i.length){for(var s=0;s-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(s,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}i.forEach(function(t){var i=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),s=e.scrollElements.find(function(e){return e.$el===t});i&&e._unsubscribeElementUpdate(i),s&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=s.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),i=[];this.scrollElements.forEach(function(t){i.push(t.id)});var s=Math.max.apply(Math,i)+1,n=Array.from(e);this._subscribeScrollElements(n,s,!0)},e._subscribeScrollElements=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=!1);for(var s=0;st.length)&&(e=t.length);for(var i=0,s=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(){return s=Object.assign?Object.assign.bind():function(t){for(var e=1;e=1;const s=i?1:this.easing(e);this.value=this.from+(this.to-this.from)*s}var s,r,o;null==(e=this.onUpdate)||e.call(this,this.value,i),i&&this.stop()}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i=.1,duration:s=1,easing:n=(t=>t),onStart:r,onUpdate:o}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=n,this.currentTime=0,this.isRunning=!0,null==r||r(),this.onUpdate=o}}class o{constructor({wrapper:t,content:e,autoResize:i=!0}={}){if(this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth},this.wrapper=t,this.content=e,i){const t=function(t,e){let i;return function(){let e=arguments,s=this;clearTimeout(i),i=setTimeout(function(){t.apply(s,e)},250)}}(this.resize);this.wrapper!==window&&(this.wrapperResizeObserver=new ResizeObserver(t),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(t),this.contentResizeObserver.observe(this.content)}this.resize()}destroy(){var t,e;null==(t=this.wrapperResizeObserver)||t.disconnect(),null==(e=this.contentResizeObserver)||e.disconnect()}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class l{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}}off(t,e){var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}destroy(){this.events={}}}class a{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=2,normalizeWheel:s=!1}){this.onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0}},this.onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,n=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:n},this.emitter.emit("scroll",{deltaX:s,deltaY:n,event:t})},this.onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})},this.onWheel=t=>{let{deltaX:e,deltaY:i}=t;this.normalizeWheel&&(e=n(-100,e,100),i=n(-100,i,100)),e*=this.wheelMultiplier,i*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})},this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.normalizeWheel=s,this.touchStart={x:null,y:null},this.emitter=new l,this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}}class h{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:n=i,smoothWheel:h=!0,smoothTouch:c=!1,syncTouch:u=!1,syncTouchLerp:d=.1,__iosNoInertiaSyncTouchLerp:v=.4,touchInertiaMultiplier:m=35,duration:p,easing:f=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:g=!p&&.1,infinite:b=!1,orientation:S="vertical",gestureOrientation:w="vertical",touchMultiplier:E=1,wheelMultiplier:I=1,normalizeWheel:y=!1,autoResize:O=!0}={}){this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const n=i.type.includes("touch"),r=i.type.includes("wheel");if("both"===this.options.gestureOrientation&&0===t&&0===e||"vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t||n&&"vertical"===this.options.gestureOrientation&&0===this.scroll&&!this.options.infinite&&e<=0)return;let o=i.composedPath();if(o=o.slice(0,o.indexOf(this.rootElement)),o.find(t=>{var e;return(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent"))||n&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-touch"))||r&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-wheel"))||(null==(e=t.classList)?void 0:e.contains("lenis"))}))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(this.isSmooth=(this.options.smoothTouch||this.options.syncTouch)&&n||this.options.smoothWheel&&r,!this.isSmooth)return this.isScrolling=!1,void this.animate.stop();i.preventDefault();let l=e;"both"===this.options.gestureOrientation?l=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(l=t);const a=n&&this.options.syncTouch,h=n&&"touchend"===i.type&&Math.abs(l)>1;h&&(l=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+l,s({programmatic:!1},a&&{lerp:h?this.syncTouchLerp:this.options.__iosNoInertiaSyncTouchLerp}))},this.onNativeScroll=()=>{if(!this.__preventNextScrollEvent&&!this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.direction=Math.sign(this.animatedScroll-t),this.emit()}},window.lenisVersion="1.0.29",t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:n,smoothWheel:h,smoothTouch:c,syncTouch:u,syncTouchLerp:d,__iosNoInertiaSyncTouchLerp:v,touchInertiaMultiplier:m,duration:p,easing:f,lerp:g,infinite:b,gestureOrientation:w,orientation:S,touchMultiplier:E,wheelMultiplier:I,normalizeWheel:y,autoResize:O},this.animate=new r,this.emitter=new l,this.dimensions=new o({wrapper:t,content:e,autoResize:O}),this.toggleClass("lenis",!0),this.velocity=0,this.isLocked=!1,this.isStopped=!1,this.isSmooth=u||h||c,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll=new a(n,{touchMultiplier:E,wheelMultiplier:I,normalizeWheel:y}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll.destroy(),this.dimensions.destroy(),this.toggleClass("lenis",!1),this.toggleClass("lenis-smooth",!1),this.toggleClass("lenis-scrolling",!1),this.toggleClass("lenis-stopped",!1),this.toggleClass("lenis-locked",!1)}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.animate.stop()}start(){this.isStopped=!1,this.reset()}stop(){this.isStopped=!0,this.animate.stop(),this.reset()}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:r=this.options.duration,easing:o=this.options.easing,lerp:l=!r&&this.options.lerp,onComplete:a=null,force:h=!1,programmatic:c=!0}={}){if(!this.isStopped&&!this.isLocked||h){if(["top","left","start"].includes(t))t=0;else if(["bottom","right","end"].includes(t))t=this.limit;else{var u;let i;if("string"==typeof t?i=document.querySelector(t):null!=(u=t)&&u.nodeType&&(i=t),i){if(this.options.wrapper!==window){const t=this.options.wrapper.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t){if(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=n(0,t,this.limit),i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),void(null==a||a(this));if(!c){if(t===this.targetScroll)return;this.targetScroll=t}this.animate.fromTo(this.animatedScroll,t,{duration:r,easing:o,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling=!0},onUpdate:(t,e)=>{this.isScrolling=!0,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==a||a(this),this.__preventNextScrollEvent=!0,requestAnimationFrame(()=>{delete this.__preventNextScrollEvent}))}})}}}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?(this.animatedScroll%(t=this.limit)+t)%t:this.animatedScroll;var t}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isSmooth(){return this.__isSmooth}set isSmooth(t){this.__isSmooth!==t&&(this.__isSmooth=t,this.toggleClass("lenis-smooth",t))}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.toggleClass("lenis-scrolling",t))}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.toggleClass("lenis-stopped",t))}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.toggleClass("lenis-locked",t))}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isSmooth&&(t+=" lenis-smooth"),t}toggleClass(t,e){this.rootElement.classList.toggle(t,e),this.emitter.emit("className change",this)}}var c=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,i=t.rootMargin,s=void 0===i?"-1px -1px -1px -1px":i,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=s,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var i=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(i&&(i.isAlreadyIntersected=!0),t._setInview(e)):i&&i.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function u(t,e,i,s,n){return i+((n-t)/(e-t)*(s-i)||0)}function d(t,e){return t.reduce(function(t,i){return Math.abs(i-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var n,r=i(this.progressModularModules);!(n=r()).done;){var o=n.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var i=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(i)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,n=i(t);!(s=n()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=d([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var i,s,n=null==(i=this.attributes.scrollCall)?void 0:i.split(","),r=null==(s=this.attributes)?void 0:s.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],h=n[1],c=n[2];l=r?this.$el.dataset["module"+h.trim()]:c,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},h.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),m=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],p=/*#__PURE__*/function(){function t(t){var e=t.$el,i=t.modularInstance,s=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=i,this.scrollOrientation=r,this.triggerRootMargin=null!=s?s:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new c({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new c({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,n=i(this.RAFScrollElements);!(e=n()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,n=t.smooth,r=i(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:n})},e.removeScrollElements=function(t){var e=this,i=t.querySelectorAll("[data-scroll]");if(i.length){for(var s=0;s-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(s,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}i.forEach(function(t){var i=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),s=e.scrollElements.find(function(e){return e.$el===t});i&&e._unsubscribeElementUpdate(i),s&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=s.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),i=[];this.scrollElements.forEach(function(t){i.push(t.id)});var s=Math.max.apply(Math,i)+1,n=Array.from(e);this._subscribeScrollElements(n,s,!0)},e._subscribeScrollElements=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=!1);for(var s=0;st.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=n(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function o(t,e,s,i,n){return s+((n-t)/(e-t)*(i-s)||0)}function l(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,r=n(this.progressModularModules);!(i=r()).done;){var l=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=n(t);!(s=i()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=n(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=l([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,n=null==(s=this.attributes.scrollCall)?void 0:s.split(","),r=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],c=n[1],h=n[2];l=r?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),c=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],h=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new r({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new r({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=n(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,r=n(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(i,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,n=Array.from(e);this._subscribeScrollElements(n,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=r(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function o(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function l(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,n=r(this.progressModularModules);!(i=n()).done;){var l=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=r(t);!(s=i()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=r(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=l([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),c=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],h=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new n({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new n({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=r(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,n=r(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","style","transform","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","split","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_iterator2","_step2","_step3","_iterator3","module","push","moduleObj","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","lerp","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.cjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.mjs b/dist/locomotive-scroll.mjs index b4356e5b..6fa4fad6 100644 --- a/dist/locomotive-scroll.mjs +++ b/dist/locomotive-scroll.mjs @@ -1,2 +1,2 @@ -import t from"@studio-freight/lenis";function e(){return e=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function n(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function o(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var r,o=i(this.progressModularModules);!(r=o()).done;){var l=r.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,r=i(t);!(s=r()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=o([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),a=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],c=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new r({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new r({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,r=i(this.RAFScrollElements);!(e=r()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,r=t.smooth,n=i(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:r})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function n(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function o(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var r,o=i(this.progressModularModules);!(r=o()).done;){var l=r.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,r=i(t);!(s=r()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=o([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),a=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],c=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new r({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new r({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,r=i(this.RAFScrollElements);!(e=r()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,r=t.smooth,n=i(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:r})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","style","transform","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","split","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_iterator2","_step2","_step3","_iterator3","module","push","moduleObj","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","lerp","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.modern.mjs b/dist/locomotive-scroll.modern.mjs index c22b2307..3bb56ace 100644 --- a/dist/locomotive-scroll.modern.mjs +++ b/dist/locomotive-scroll.modern.mjs @@ -1,2 +1,2 @@ -import t from"@studio-freight/lenis";function s(){return s=Object.assign?Object.assign.bind():function(t){for(var s=1;s{t.forEach(t=>{const s=this.scrollElements.find(s=>s.$el===t.target);t.isIntersecting?(s&&(s.isAlreadyIntersected=!0),this._setInview(t)):s&&s.isAlreadyIntersected&&this._setOutOfView(t)})},{rootMargin:this.rootMargin});for(const t of this.scrollElements)this.observe(t.$el)}destroy(){this.observer.disconnect()}observe(t){t&&this.observer.observe(t)}unobserve(t){t&&this.observer.unobserve(t)}_setInview(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOn()),!this.IORaf&&(null==s||s.setInview())}_setOutOfView(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOff()),!this.IORaf&&(null==s||s.setOutOfView()),null!=s&&s.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)}}function i(t,s,e,i,r){return e+((r-t)/(s-t)*(i-e)||0)}function r(t,s){return t.reduce((t,e)=>Math.abs(e-s)1?1:e;var e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(const t of this.progressModularModules)this.modularInstance&&this.modularInstance.call("onScrollProgress",s,t.moduleName,t.moduleId);s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}}_setCssProgress(t=0){this.$el.style.setProperty("--progress",t.toString())}_setCustomEventProgress(t=0){const s=this.attributes.scrollEventProgress;if(!s)return;const e=new CustomEvent(s,{detail:{target:this.$el,progress:t}});window.dispatchEvent(e)}_getProgressModularModules(){if(!this.modularInstance)return;const t=Object.keys(this.$el.dataset).filter(t=>t.includes("module")),s=Object.entries(this.modularInstance.modules);if(t.length)for(const e of t){const t=this.$el.dataset[e];if(!t)return;for(const e of s){const[s,i]=e;t in i&&this.progressModularModules.push({moduleName:s,moduleId:t})}}}_getScrollCallFrom(){const t=r([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"}_dispatchCall(t,s){var e,i;const r=null==(e=this.attributes.scrollCall)?void 0:e.split(","),l=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var n;const[e,i,o]=r;let a;a=l?this.$el.dataset[`module${i.trim()}`]:o,this.modularInstance&&this.modularInstance.call(e.trim(),{target:this.$el,way:t,from:s},i.trim(),null==(n=a)?void 0:n.trim())}else if(r){const[e]=r,i=new CustomEvent(e,{detail:{target:this.$el,way:t,from:s}});window.dispatchEvent(i)}}}const n=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"];class o{constructor({$el:t,modularInstance:s,triggerRootMargin:e,rafRootMargin:i,scrollOrientation:r}){this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,t?(this.$scrollContainer=t,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=e?e:"-1px -1px -1px -1px",this.rafRootMargin=null!=i?i:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}_init(){const t=this.$scrollContainer.querySelectorAll("[data-scroll]"),s=Array.from(t);this._subscribeScrollElements(s),this.IOTriggerInstance=new e({scrollElements:[...this.triggeredScrollElements],rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new e({scrollElements:[...this.RAFScrollElements],rootMargin:this.rafRootMargin,IORaf:!0})}destroy(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()}onResize({currentScroll:t}){for(const s of this.RAFScrollElements)s.onResize({currentScroll:t})}onRender({currentScroll:t,smooth:s}){for(const e of this.scrollElementsToUpdate)e.onRender({currentScroll:t,smooth:s})}removeScrollElements(t){const s=t.querySelectorAll("[data-scroll]");if(s.length){for(let t=0;t-1&&(this.IOTriggerInstance.unobserve(e.$el),this.triggeredScrollElements.splice(t,1))}for(let t=0;t-1&&(this.IORafInstance.unobserve(e.$el),this.RAFScrollElements.splice(t,1))}s.forEach(t=>{const s=this.scrollElementsToUpdate.find(s=>s.$el===t),e=this.scrollElements.find(s=>s.$el===t);s&&this._unsubscribeElementUpdate(s),e&&(this.scrollElements=this.scrollElements.filter(t=>t.id!=e.id))})}}addScrollElements(t){const s=t.querySelectorAll("[data-scroll]"),e=[];this.scrollElements.forEach(t=>{e.push(t.id)});const i=Math.max(...e)+1,r=Array.from(s);this._subscribeScrollElements(r,i,!0)}_subscribeScrollElements(t,s=0,e=!1){for(let i=0;is.id!=t.id)}_checkRafNeeded(t){let s=[...n];const e=t=>{s=s.filter(s=>s!=t)};if(t.dataset.scrollOffset){if("0,0"!=t.dataset.scrollOffset.split(",").map(t=>t.replace("%","").trim()).join(","))return!0;e("scrollOffset")}else e("scrollOffset");if(t.dataset.scrollPosition){if("top,bottom"!=t.dataset.scrollPosition.trim())return!0;e("scrollPosition")}else e("scrollPosition");if(t.dataset.scrollSpeed&&!isNaN(parseFloat(t.dataset.scrollSpeed)))return!0;e("scrollSpeed");for(const e of s)if(e in t.dataset)return!0;return!1}}class a{constructor({resizeElements:t,resizeCallback:s=(()=>{})}){this.$resizeElements=void 0,this.isFirstObserve=void 0,this.observer=void 0,this.resizeCallback=void 0,this.$resizeElements=t,this.resizeCallback=s,this.isFirstObserve=!0,this._init()}_init(){this.observer=new ResizeObserver(t=>{var s;!this.isFirstObserve&&(null==(s=this.resizeCallback)||s.call(this)),this.isFirstObserve=!1});for(const t of this.$resizeElements)this.observer.observe(t)}destroy(){this.observer.disconnect()}}const c={wrapper:window,content:document.documentElement,eventsTarget:window,lerp:.1,duration:.75,orientation:"vertical",gestureOrientation:"vertical",smoothWheel:!0,smoothTouch:!1,syncTouch:!1,syncTouchLerp:.1,touchInertiaMultiplier:35,wheelMultiplier:1,touchMultiplier:2,normalizeWheel:!1,autoResize:!0,easing:t=>Math.min(1,1.001-Math.pow(2,-10*t))};class h{constructor({lenisOptions:t={},modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l=!0,autoStart:n=!0,scrollCallback:o=(()=>{}),initCustomTicker:a,destroyCustomTicker:h}={}){this.rafPlaying=void 0,this.lenisInstance=void 0,this.coreInstance=void 0,this.lenisOptions=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.rafInstance=void 0,this.autoResize=void 0,this.autoStart=void 0,this.ROInstance=void 0,this.initCustomTicker=void 0,this.destroyCustomTicker=void 0,this._onRenderBind=void 0,this._onResizeBind=void 0,this._onScrollToBind=void 0,this.lenisOptions=s({},c,t),Object.assign(this,{lenisOptions:t,modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l,autoStart:n,scrollCallback:o,initCustomTicker:a,destroyCustomTicker:h}),this._onRenderBind=this._onRender.bind(this),this._onScrollToBind=this._onScrollTo.bind(this),this._onResizeBind=this._onResize.bind(this),this.rafPlaying=!1,this._init()}_init(){var s;this.lenisInstance=new t({wrapper:this.lenisOptions.wrapper,content:this.lenisOptions.content,eventsTarget:this.lenisOptions.eventsTarget,lerp:this.lenisOptions.lerp,duration:this.lenisOptions.duration,orientation:this.lenisOptions.orientation,gestureOrientation:this.lenisOptions.gestureOrientation,smoothWheel:this.lenisOptions.smoothWheel,smoothTouch:this.lenisOptions.smoothTouch,syncTouch:this.lenisOptions.syncTouch,syncTouchLerp:this.lenisOptions.syncTouchLerp,touchInertiaMultiplier:this.lenisOptions.touchInertiaMultiplier,wheelMultiplier:this.lenisOptions.wheelMultiplier,touchMultiplier:this.lenisOptions.touchMultiplier,normalizeWheel:this.lenisOptions.normalizeWheel,easing:this.lenisOptions.easing}),null==(s=this.lenisInstance)||s.on("scroll",this.scrollCallback),document.documentElement.setAttribute("data-scroll-orientation",this.lenisInstance.options.orientation),requestAnimationFrame(()=>{this.coreInstance=new o({$el:this.lenisInstance.rootElement,modularInstance:this.modularInstance,triggerRootMargin:this.triggerRootMargin,rafRootMargin:this.rafRootMargin,scrollOrientation:this.lenisInstance.options.orientation}),this._bindEvents(),this.initCustomTicker&&!this.destroyCustomTicker?console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble."):!this.initCustomTicker&&this.destroyCustomTicker&&console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."),this.autoStart&&this.start()})}destroy(){var t;this.stop(),this._unbindEvents(),this.lenisInstance.destroy(),null==(t=this.coreInstance)||t.destroy(),requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.destroy()})}_bindEvents(){this._bindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance=new a({resizeElements:[document.body],resizeCallback:this._onResizeBind}):window.addEventListener("resize",this._onResizeBind))}_unbindEvents(){this._unbindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance&&this.ROInstance.destroy():window.removeEventListener("resize",this._onResizeBind))}_bindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.addEventListener("click",this._onScrollToBind,!1)})}_unbindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.removeEventListener("click",this._onScrollToBind,!1)})}_onResize(){requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.onResize({currentScroll:this.lenisInstance.scroll})})}_onRender(){var t,s;null==(t=this.lenisInstance)||t.raf(Date.now()),null==(s=this.coreInstance)||s.onRender({currentScroll:this.lenisInstance.scroll,smooth:this.lenisInstance.isSmooth})}_onScrollTo(t){var s;t.preventDefault();const e=null!=(s=t.currentTarget)?s:null;if(!e)return;const i=e.getAttribute("data-scroll-to-href")||e.getAttribute("href"),r=e.getAttribute("data-scroll-to-offset")||0,l=e.getAttribute("data-scroll-to-duration")||this.lenisOptions.duration||c.duration;i&&this.scrollTo(i,{offset:"string"==typeof r?parseInt(r):r,duration:"string"==typeof l?parseInt(l):l})}start(){var t;this.rafPlaying||(null==(t=this.lenisInstance)||t.start(),this.rafPlaying=!0,this.initCustomTicker?this.initCustomTicker(this._onRenderBind):this._raf())}stop(){var t;this.rafPlaying&&(null==(t=this.lenisInstance)||t.stop(),this.rafPlaying=!1,this.destroyCustomTicker?this.destroyCustomTicker(this._onRenderBind):this.rafInstance&&cancelAnimationFrame(this.rafInstance))}removeScrollElements(t){var s;t?(this._unbindScrollToEvents(t),null==(s=this.coreInstance)||s.removeScrollElements(t)):console.error("Please provide a DOM Element as $oldContainer")}addScrollElements(t){var s;t?(null==(s=this.coreInstance)||s.addScrollElements(t),requestAnimationFrame(()=>{this._bindScrollToEvents(t)})):console.error("Please provide a DOM Element as $newContainer")}resize(){this._onResizeBind()}scrollTo(t,s){var e;null==(e=this.lenisInstance)||e.scrollTo(t,{offset:null==s?void 0:s.offset,lerp:null==s?void 0:s.lerp,duration:null==s?void 0:s.duration,immediate:null==s?void 0:s.immediate,lock:null==s?void 0:s.lock,force:null==s?void 0:s.force,easing:null==s?void 0:s.easing,onComplete:null==s?void 0:s.onComplete})}_raf(){this._onRenderBind(),this.rafInstance=requestAnimationFrame(()=>this._raf())}}export{h as default}; +import t from"@studio-freight/lenis";function s(){return s=Object.assign?Object.assign.bind():function(t){for(var s=1;s{t.forEach(t=>{const s=this.scrollElements.find(s=>s.$el===t.target);t.isIntersecting?(s&&(s.isAlreadyIntersected=!0),this._setInview(t)):s&&s.isAlreadyIntersected&&this._setOutOfView(t)})},{rootMargin:this.rootMargin});for(const t of this.scrollElements)this.observe(t.$el)}destroy(){this.observer.disconnect()}observe(t){t&&this.observer.observe(t)}unobserve(t){t&&this.observer.unobserve(t)}_setInview(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOn()),!this.IORaf&&(null==s||s.setInview())}_setOutOfView(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOff()),!this.IORaf&&(null==s||s.setOutOfView()),null!=s&&s.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)}}function i(t,s,e,i,r){return e+((r-t)/(s-t)*(i-e)||0)}function r(t,s){return t.reduce((t,e)=>Math.abs(e-s)1?1:e;var e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(const t of this.progressModularModules)this.modularInstance&&this.modularInstance.call("onScrollProgress",s,t.moduleName,t.moduleId);s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}}_setCssProgress(t=0){this.$el.style.setProperty("--progress",t.toString())}_setCustomEventProgress(t=0){const s=this.attributes.scrollEventProgress;if(!s)return;const e=new CustomEvent(s,{detail:{target:this.$el,progress:t}});window.dispatchEvent(e)}_getProgressModularModules(){if(!this.modularInstance)return;const t=Object.keys(this.$el.dataset).filter(t=>t.includes("module")),s=Object.entries(this.modularInstance.modules);if(t.length)for(const e of t){const t=this.$el.dataset[e];if(!t)return;for(const e of s){const[s,i]=e;t in i&&this.progressModularModules.push({moduleName:s,moduleId:t})}}}_getScrollCallFrom(){const t=r([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"}_dispatchCall(t,s){var e,i;const r=null==(e=this.attributes.scrollCall)?void 0:e.split(","),l=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var n;const[e,i,o]=r;let a;a=l?this.$el.dataset[`module${i.trim()}`]:o,this.modularInstance&&this.modularInstance.call(e.trim(),{target:this.$el,way:t,from:s},i.trim(),null==(n=a)?void 0:n.trim())}else if(r){const[e]=r,i=new CustomEvent(e,{detail:{target:this.$el,way:t,from:s}});window.dispatchEvent(i)}}}const n=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"];class o{constructor({$el:t,modularInstance:s,triggerRootMargin:e,rafRootMargin:i,scrollOrientation:r}){this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,t?(this.$scrollContainer=t,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=e?e:"-1px -1px -1px -1px",this.rafRootMargin=null!=i?i:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}_init(){const t=this.$scrollContainer.querySelectorAll("[data-scroll]"),s=Array.from(t);this._subscribeScrollElements(s),this.IOTriggerInstance=new e({scrollElements:[...this.triggeredScrollElements],rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new e({scrollElements:[...this.RAFScrollElements],rootMargin:this.rafRootMargin,IORaf:!0})}destroy(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()}onResize({currentScroll:t}){for(const s of this.RAFScrollElements)s.onResize({currentScroll:t})}onRender({currentScroll:t,smooth:s}){for(const e of this.scrollElementsToUpdate)e.onRender({currentScroll:t,smooth:s})}removeScrollElements(t){const s=t.querySelectorAll("[data-scroll]");if(s.length){for(let t=0;t-1&&(this.IOTriggerInstance.unobserve(e.$el),this.triggeredScrollElements.splice(t,1))}for(let t=0;t-1&&(this.IORafInstance.unobserve(e.$el),this.RAFScrollElements.splice(t,1))}s.forEach(t=>{const s=this.scrollElementsToUpdate.find(s=>s.$el===t),e=this.scrollElements.find(s=>s.$el===t);s&&this._unsubscribeElementUpdate(s),e&&(this.scrollElements=this.scrollElements.filter(t=>t.id!=e.id))})}}addScrollElements(t){const s=t.querySelectorAll("[data-scroll]"),e=[];this.scrollElements.forEach(t=>{e.push(t.id)});const i=Math.max(...e)+1,r=Array.from(s);this._subscribeScrollElements(r,i,!0)}_subscribeScrollElements(t,s=0,e=!1){for(let i=0;is.id!=t.id)}_checkRafNeeded(t){let s=[...n];const e=t=>{s=s.filter(s=>s!=t)};if(t.dataset.scrollOffset){if("0,0"!=t.dataset.scrollOffset.split(",").map(t=>t.replace("%","").trim()).join(","))return!0;e("scrollOffset")}else e("scrollOffset");if(t.dataset.scrollPosition){if("top,bottom"!=t.dataset.scrollPosition.trim())return!0;e("scrollPosition")}else e("scrollPosition");if(t.dataset.scrollSpeed&&!isNaN(parseFloat(t.dataset.scrollSpeed)))return!0;e("scrollSpeed");for(const e of s)if(e in t.dataset)return!0;return!1}}class a{constructor({resizeElements:t,resizeCallback:s=(()=>{})}){this.$resizeElements=void 0,this.isFirstObserve=void 0,this.observer=void 0,this.resizeCallback=void 0,this.$resizeElements=t,this.resizeCallback=s,this.isFirstObserve=!0,this._init()}_init(){this.observer=new ResizeObserver(t=>{var s;!this.isFirstObserve&&(null==(s=this.resizeCallback)||s.call(this)),this.isFirstObserve=!1});for(const t of this.$resizeElements)this.observer.observe(t)}destroy(){this.observer.disconnect()}}const c={wrapper:window,content:document.documentElement,eventsTarget:window,lerp:.1,duration:.75,orientation:"vertical",gestureOrientation:"vertical",smoothWheel:!0,smoothTouch:!1,syncTouch:!1,syncTouchLerp:.1,touchInertiaMultiplier:35,wheelMultiplier:1,touchMultiplier:2,normalizeWheel:!1,autoResize:!0,easing:t=>Math.min(1,1.001-Math.pow(2,-10*t))};class h{constructor({lenisOptions:t={},modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l=!0,autoStart:n=!0,scrollCallback:o=(()=>{}),initCustomTicker:a,destroyCustomTicker:h}={}){this.rafPlaying=void 0,this.lenisInstance=void 0,this.coreInstance=void 0,this.lenisOptions=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.rafInstance=void 0,this.autoResize=void 0,this.autoStart=void 0,this.ROInstance=void 0,this.initCustomTicker=void 0,this.destroyCustomTicker=void 0,this._onRenderBind=void 0,this._onResizeBind=void 0,this._onScrollToBind=void 0,this.lenisOptions=s({},c,t),Object.assign(this,{lenisOptions:t,modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l,autoStart:n,scrollCallback:o,initCustomTicker:a,destroyCustomTicker:h}),this._onRenderBind=this._onRender.bind(this),this._onScrollToBind=this._onScrollTo.bind(this),this._onResizeBind=this._onResize.bind(this),this.rafPlaying=!1,this._init()}_init(){var s;this.lenisInstance=new t({wrapper:this.lenisOptions.wrapper,content:this.lenisOptions.content,eventsTarget:this.lenisOptions.eventsTarget,lerp:this.lenisOptions.lerp,duration:this.lenisOptions.duration,orientation:this.lenisOptions.orientation,gestureOrientation:this.lenisOptions.gestureOrientation,smoothWheel:this.lenisOptions.smoothWheel,smoothTouch:this.lenisOptions.smoothTouch,syncTouch:this.lenisOptions.syncTouch,syncTouchLerp:this.lenisOptions.syncTouchLerp,touchInertiaMultiplier:this.lenisOptions.touchInertiaMultiplier,wheelMultiplier:this.lenisOptions.wheelMultiplier,touchMultiplier:this.lenisOptions.touchMultiplier,normalizeWheel:this.lenisOptions.normalizeWheel,easing:this.lenisOptions.easing}),null==(s=this.lenisInstance)||s.on("scroll",this.scrollCallback),document.documentElement.setAttribute("data-scroll-orientation",this.lenisInstance.options.orientation),requestAnimationFrame(()=>{this.coreInstance=new o({$el:this.lenisInstance.rootElement,modularInstance:this.modularInstance,triggerRootMargin:this.triggerRootMargin,rafRootMargin:this.rafRootMargin,scrollOrientation:this.lenisInstance.options.orientation}),this._bindEvents(),this.initCustomTicker&&!this.destroyCustomTicker?console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble."):!this.initCustomTicker&&this.destroyCustomTicker&&console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."),this.autoStart&&this.start()})}destroy(){var t;this.stop(),this._unbindEvents(),this.lenisInstance.destroy(),null==(t=this.coreInstance)||t.destroy(),requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.destroy()})}_bindEvents(){this._bindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance=new a({resizeElements:[document.body],resizeCallback:this._onResizeBind}):window.addEventListener("resize",this._onResizeBind))}_unbindEvents(){this._unbindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance&&this.ROInstance.destroy():window.removeEventListener("resize",this._onResizeBind))}_bindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.addEventListener("click",this._onScrollToBind,!1)})}_unbindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.removeEventListener("click",this._onScrollToBind,!1)})}_onResize(){requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.onResize({currentScroll:this.lenisInstance.scroll})})}_onRender(){var t,s;null==(t=this.lenisInstance)||t.raf(Date.now()),null==(s=this.coreInstance)||s.onRender({currentScroll:this.lenisInstance.scroll,smooth:this.lenisInstance.isSmooth})}_onScrollTo(t){var s;t.preventDefault();const e=null!=(s=t.currentTarget)?s:null;if(!e)return;const i=e.getAttribute("data-scroll-to-href")||e.getAttribute("href"),r=e.getAttribute("data-scroll-to-offset")||0,l=e.getAttribute("data-scroll-to-duration")||this.lenisOptions.duration||c.duration;i&&this.scrollTo(i,{offset:"string"==typeof r?parseInt(r):r,duration:"string"==typeof l?parseInt(l):l})}start(){var t;this.rafPlaying||(null==(t=this.lenisInstance)||t.start(),this.rafPlaying=!0,this.initCustomTicker?this.initCustomTicker(this._onRenderBind):this._raf())}stop(){var t;this.rafPlaying&&(null==(t=this.lenisInstance)||t.stop(),this.rafPlaying=!1,this.destroyCustomTicker?this.destroyCustomTicker(this._onRenderBind):this.rafInstance&&cancelAnimationFrame(this.rafInstance))}removeScrollElements(t){var s;t?(this._unbindScrollToEvents(t),null==(s=this.coreInstance)||s.removeScrollElements(t)):console.error("Please provide a DOM Element as $oldContainer")}addScrollElements(t){var s;t?(null==(s=this.coreInstance)||s.addScrollElements(t),requestAnimationFrame(()=>{this._bindScrollToEvents(t)})):console.error("Please provide a DOM Element as $newContainer")}resize(){this._onResizeBind()}scrollTo(t,s){var e;null==(e=this.lenisInstance)||e.scrollTo(t,{offset:null==s?void 0:s.offset,lerp:null==s?void 0:s.lerp,duration:null==s?void 0:s.duration,immediate:null==s?void 0:s.immediate,lock:null==s?void 0:s.lock,force:null==s?void 0:s.force,easing:null==s?void 0:s.easing,onComplete:null==s?void 0:s.onComplete})}_raf(){this._onRenderBind(),this.rafInstance=requestAnimationFrame(()=>this._raf())}}export{h as default}; //# sourceMappingURL=locomotive-scroll.modern.mjs.map diff --git a/dist/locomotive-scroll.modern.mjs.map b/dist/locomotive-scroll.modern.mjs.map index bb142af2..795526b8 100644 --- a/dist/locomotive-scroll.modern.mjs.map +++ b/dist/locomotive-scroll.modern.mjs.map @@ -1 +1 @@ -{"version":3,"file":"locomotive-scroll.modern.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","constructor","scrollElements","rootMargin","IORaf","this","observer","_init","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","scrollElement","observe","destroy","disconnect","$scrollElement","unobserve","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","value","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","onRender","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","style","transform","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","top","left","height","width","metricsSize","offset","split","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","modulesIdName","module","moduleObj","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","func","targetModuleId","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","_this$resizeCallback","$resizeElement","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","lerp","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","lenisOptions","autoStart","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","stop","_unbindEvents","_this$coreInstance2","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","$rootContainer","$scrollToElements","_this$coreInstance3","scroll","_this$lenisInstance2","_this$coreInstance4","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance5","_this$coreInstance6","resize","_this$lenisInstance5","immediate","lock","force","onComplete"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.modern.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","constructor","scrollElements","rootMargin","IORaf","this","observer","_init","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","scrollElement","observe","destroy","disconnect","$scrollElement","unobserve","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","value","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","onRender","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","top","left","height","width","metricsSize","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","modulesIdName","module","moduleObj","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","func","targetModuleId","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","_this$resizeCallback","$resizeElement","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","lenisOptions","autoStart","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","stop","_unbindEvents","_this$coreInstance2","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","$rootContainer","$scrollToElements","_this$coreInstance3","scroll","_this$lenisInstance2","_this$coreInstance4","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance5","_this$coreInstance6","resize","_this$lenisInstance5","immediate","lock","force","onComplete"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.umd.js b/dist/locomotive-scroll.umd.js index 9daf3bf6..b2913fdc 100644 --- a/dist/locomotive-scroll.umd.js +++ b/dist/locomotive-scroll.umd.js @@ -1,3 +1,3 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@studio-freight/lenis")):"function"==typeof define&&define.amd?define(["@studio-freight/lenis"],e):(t||self).locomotiveScroll=e(t.Lenis)}(this,function(t){function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var s=/*#__PURE__*/e(t);function i(){return i=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=r(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function l(t,e,s,i,n){return s+((n-t)/(e-t)*(i-s)||0)}function a(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,n=r(this.progressModularModules);!(i=n()).done;){var o=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=r(t);!(s=i()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=r(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=a([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,n=null==(s=this.attributes.scrollCall)?void 0:s.split(","),r=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],c=n[1],h=n[2];l=r?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),h=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],u=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new o({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new o({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=r(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,n=r(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(i,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,n=Array.from(e);this._subscribeScrollElements(n,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=n(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function l(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function a(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,r=n(this.progressModularModules);!(i=r()).done;){var o=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=n(t);!(s=i()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=n(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=a([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),h=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],u=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new o({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new o({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=n(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,r=n(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","style","transform","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","split","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_iterator2","_step2","_step3","_iterator3","module","push","moduleObj","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","lerp","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.umd.js","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/types.d.ts b/dist/types/types.d.ts index 6f1c6f17..0e3e0a6c 100644 --- a/dist/types/types.d.ts +++ b/dist/types/types.d.ts @@ -74,6 +74,7 @@ export interface IScrollElementOptions { } export interface IScrollElementAttributes { scrollClass: string; + scrollDelay: number | null; scrollOffset: string; scrollPosition: string; scrollModuleProgress: boolean; diff --git a/dist/types/utils/maths.d.ts b/dist/types/utils/maths.d.ts index 13a30c67..c38f9880 100644 --- a/dist/types/utils/maths.d.ts +++ b/dist/types/utils/maths.d.ts @@ -39,3 +39,11 @@ export declare function normalize(min: number, max: number, value: number): numb * @returns {number} - Closest number. */ export declare function closestNumber(array: number[], target: number): number; +/** + * Linear interpolation between two numbers. + * @param {number} start + * @param {number} end + * @param {number} amt + * @returns {number} + */ +export declare function lerp(start: number, end: number, amt: number): number; diff --git a/dist/types/utils/translate.d.ts b/dist/types/utils/translate.d.ts new file mode 100644 index 00000000..f7333b47 --- /dev/null +++ b/dist/types/utils/translate.d.ts @@ -0,0 +1,4 @@ +export declare function getTranslate(el: Element): { + x: number; + y: number; +}; diff --git a/src/core/ScrollElement.ts b/src/core/ScrollElement.ts index 90dd848d..67df103f 100644 --- a/src/core/ScrollElement.ts +++ b/src/core/ScrollElement.ts @@ -212,9 +212,10 @@ export default class ScrollElement { if (this.attributes.scrollDelay) { const start = getTranslate(this.$el) + const lerped = this.scrollOrientation == 'vertical' ? - lerp(start.x, this.translateValue, this.attributes.scrollDelay) : - lerp(start.y, this.translateValue, this.attributes.scrollDelay) + lerp(start.y, this.translateValue, this.attributes.scrollDelay) : + lerp(start.x, this.translateValue, this.attributes.scrollDelay) this.$el.style.transform = this.scrollOrientation === 'vertical' From cfd9db1d78e1f6894a9d7c48bc10c99f386a57e4 Mon Sep 17 00:00:00 2001 From: Jeeho Ahn Date: Fri, 8 Dec 2023 21:08:44 +0900 Subject: [PATCH 3/4] Update translate.ts --- src/utils/translate.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/translate.ts b/src/utils/translate.ts index ec9d4001..3cbbf614 100644 --- a/src/utils/translate.ts +++ b/src/utils/translate.ts @@ -6,7 +6,7 @@ export function getTranslate(el: Element) { const style = getComputedStyle(el); const transform = style.transform - let matches = transform.match(/translate\(([^)]+)\)/); + let matches = transform.match(/translate3d\(([^)]+)\)/); if (matches) { const parts = matches[1].split(', '); @@ -15,4 +15,4 @@ export function getTranslate(el: Element) { } return translate; -} \ No newline at end of file +} From c2d160357cb8f3f1bbba32c47e0b012d11747440 Mon Sep 17 00:00:00 2001 From: Jeeho Ahn Date: Fri, 8 Dec 2023 23:26:51 +0000 Subject: [PATCH 4/4] use raw transform value --- bundled/locomotive-scroll.js | 6 ++---- bundled/locomotive-scroll.min.js | 2 +- dist/locomotive-scroll.cjs | 2 +- dist/locomotive-scroll.cjs.map | 2 +- dist/locomotive-scroll.mjs | 2 +- dist/locomotive-scroll.mjs.map | 2 +- dist/locomotive-scroll.modern.mjs | 2 +- dist/locomotive-scroll.modern.mjs.map | 2 +- dist/locomotive-scroll.umd.js | 2 +- dist/locomotive-scroll.umd.js.map | 2 +- dist/types/utils/translate.d.ts | 2 +- src/utils/translate.ts | 9 +++------ 12 files changed, 15 insertions(+), 20 deletions(-) diff --git a/bundled/locomotive-scroll.js b/bundled/locomotive-scroll.js index 8792519c..90a4a3d3 100644 --- a/bundled/locomotive-scroll.js +++ b/bundled/locomotive-scroll.js @@ -250,10 +250,8 @@ x: 0, y: 0 }; - if (!window.getComputedStyle) return translate; - var style = getComputedStyle(el); - var transform = style.transform; - var matches = transform.match(/translate\(([^)]+)\)/); + var transform = el.style.transform; + var matches = transform.match(/translate3d\(([^)]+)\)/); if (matches) { var parts = matches[1].split(', '); translate.x = parseFloat(parts[0]); diff --git a/bundled/locomotive-scroll.min.js b/bundled/locomotive-scroll.min.js index 704324b7..a7a7fc66 100644 --- a/bundled/locomotive-scroll.min.js +++ b/bundled/locomotive-scroll.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t||self).LocomotiveScroll=e()}(this,function(){function t(){return t=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var i=0,s=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(){return s=Object.assign?Object.assign.bind():function(t){for(var e=1;e=1;const s=i?1:this.easing(e);this.value=this.from+(this.to-this.from)*s}var s,r,o;null==(e=this.onUpdate)||e.call(this,this.value,i),i&&this.stop()}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i=.1,duration:s=1,easing:n=(t=>t),onStart:r,onUpdate:o}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=n,this.currentTime=0,this.isRunning=!0,null==r||r(),this.onUpdate=o}}class o{constructor({wrapper:t,content:e,autoResize:i=!0}={}){if(this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth},this.wrapper=t,this.content=e,i){const t=function(t,e){let i;return function(){let e=arguments,s=this;clearTimeout(i),i=setTimeout(function(){t.apply(s,e)},250)}}(this.resize);this.wrapper!==window&&(this.wrapperResizeObserver=new ResizeObserver(t),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(t),this.contentResizeObserver.observe(this.content)}this.resize()}destroy(){var t,e;null==(t=this.wrapperResizeObserver)||t.disconnect(),null==(e=this.contentResizeObserver)||e.disconnect()}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class l{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}}off(t,e){var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}destroy(){this.events={}}}class a{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=2,normalizeWheel:s=!1}){this.onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0}},this.onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,n=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:n},this.emitter.emit("scroll",{deltaX:s,deltaY:n,event:t})},this.onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})},this.onWheel=t=>{let{deltaX:e,deltaY:i}=t;this.normalizeWheel&&(e=n(-100,e,100),i=n(-100,i,100)),e*=this.wheelMultiplier,i*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})},this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.normalizeWheel=s,this.touchStart={x:null,y:null},this.emitter=new l,this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}}class h{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:n=i,smoothWheel:h=!0,smoothTouch:c=!1,syncTouch:u=!1,syncTouchLerp:d=.1,__iosNoInertiaSyncTouchLerp:v=.4,touchInertiaMultiplier:m=35,duration:p,easing:f=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:g=!p&&.1,infinite:b=!1,orientation:S="vertical",gestureOrientation:w="vertical",touchMultiplier:E=1,wheelMultiplier:I=1,normalizeWheel:y=!1,autoResize:O=!0}={}){this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const n=i.type.includes("touch"),r=i.type.includes("wheel");if("both"===this.options.gestureOrientation&&0===t&&0===e||"vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t||n&&"vertical"===this.options.gestureOrientation&&0===this.scroll&&!this.options.infinite&&e<=0)return;let o=i.composedPath();if(o=o.slice(0,o.indexOf(this.rootElement)),o.find(t=>{var e;return(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent"))||n&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-touch"))||r&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-wheel"))||(null==(e=t.classList)?void 0:e.contains("lenis"))}))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(this.isSmooth=(this.options.smoothTouch||this.options.syncTouch)&&n||this.options.smoothWheel&&r,!this.isSmooth)return this.isScrolling=!1,void this.animate.stop();i.preventDefault();let l=e;"both"===this.options.gestureOrientation?l=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(l=t);const a=n&&this.options.syncTouch,h=n&&"touchend"===i.type&&Math.abs(l)>1;h&&(l=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+l,s({programmatic:!1},a&&{lerp:h?this.syncTouchLerp:this.options.__iosNoInertiaSyncTouchLerp}))},this.onNativeScroll=()=>{if(!this.__preventNextScrollEvent&&!this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.direction=Math.sign(this.animatedScroll-t),this.emit()}},window.lenisVersion="1.0.29",t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:n,smoothWheel:h,smoothTouch:c,syncTouch:u,syncTouchLerp:d,__iosNoInertiaSyncTouchLerp:v,touchInertiaMultiplier:m,duration:p,easing:f,lerp:g,infinite:b,gestureOrientation:w,orientation:S,touchMultiplier:E,wheelMultiplier:I,normalizeWheel:y,autoResize:O},this.animate=new r,this.emitter=new l,this.dimensions=new o({wrapper:t,content:e,autoResize:O}),this.toggleClass("lenis",!0),this.velocity=0,this.isLocked=!1,this.isStopped=!1,this.isSmooth=u||h||c,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll=new a(n,{touchMultiplier:E,wheelMultiplier:I,normalizeWheel:y}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll.destroy(),this.dimensions.destroy(),this.toggleClass("lenis",!1),this.toggleClass("lenis-smooth",!1),this.toggleClass("lenis-scrolling",!1),this.toggleClass("lenis-stopped",!1),this.toggleClass("lenis-locked",!1)}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.animate.stop()}start(){this.isStopped=!1,this.reset()}stop(){this.isStopped=!0,this.animate.stop(),this.reset()}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:r=this.options.duration,easing:o=this.options.easing,lerp:l=!r&&this.options.lerp,onComplete:a=null,force:h=!1,programmatic:c=!0}={}){if(!this.isStopped&&!this.isLocked||h){if(["top","left","start"].includes(t))t=0;else if(["bottom","right","end"].includes(t))t=this.limit;else{var u;let i;if("string"==typeof t?i=document.querySelector(t):null!=(u=t)&&u.nodeType&&(i=t),i){if(this.options.wrapper!==window){const t=this.options.wrapper.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t){if(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=n(0,t,this.limit),i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),void(null==a||a(this));if(!c){if(t===this.targetScroll)return;this.targetScroll=t}this.animate.fromTo(this.animatedScroll,t,{duration:r,easing:o,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling=!0},onUpdate:(t,e)=>{this.isScrolling=!0,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==a||a(this),this.__preventNextScrollEvent=!0,requestAnimationFrame(()=>{delete this.__preventNextScrollEvent}))}})}}}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?(this.animatedScroll%(t=this.limit)+t)%t:this.animatedScroll;var t}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isSmooth(){return this.__isSmooth}set isSmooth(t){this.__isSmooth!==t&&(this.__isSmooth=t,this.toggleClass("lenis-smooth",t))}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.toggleClass("lenis-scrolling",t))}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.toggleClass("lenis-stopped",t))}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.toggleClass("lenis-locked",t))}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isSmooth&&(t+=" lenis-smooth"),t}toggleClass(t,e){this.rootElement.classList.toggle(t,e),this.emitter.emit("className change",this)}}var c=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,i=t.rootMargin,s=void 0===i?"-1px -1px -1px -1px":i,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=s,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var i=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(i&&(i.isAlreadyIntersected=!0),t._setInview(e)):i&&i.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function u(t,e,i,s,n){return i+((n-t)/(e-t)*(s-i)||0)}function d(t,e){return t.reduce(function(t,i){return Math.abs(i-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var n,r=i(this.progressModularModules);!(n=r()).done;){var o=n.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var i=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(i)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,n=i(t);!(s=n()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=d([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var i,s,n=null==(i=this.attributes.scrollCall)?void 0:i.split(","),r=null==(s=this.attributes)?void 0:s.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],h=n[1],c=n[2];l=r?this.$el.dataset["module"+h.trim()]:c,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},h.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),m=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],p=/*#__PURE__*/function(){function t(t){var e=t.$el,i=t.modularInstance,s=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=i,this.scrollOrientation=r,this.triggerRootMargin=null!=s?s:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new c({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new c({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,n=i(this.RAFScrollElements);!(e=n()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,n=t.smooth,r=i(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:n})},e.removeScrollElements=function(t){var e=this,i=t.querySelectorAll("[data-scroll]");if(i.length){for(var s=0;s-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(s,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}i.forEach(function(t){var i=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),s=e.scrollElements.find(function(e){return e.$el===t});i&&e._unsubscribeElementUpdate(i),s&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=s.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),i=[];this.scrollElements.forEach(function(t){i.push(t.id)});var s=Math.max.apply(Math,i)+1,n=Array.from(e);this._subscribeScrollElements(n,s,!0)},e._subscribeScrollElements=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=!1);for(var s=0;st.length)&&(e=t.length);for(var i=0,s=new Array(e);i=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function s(){return s=Object.assign?Object.assign.bind():function(t){for(var e=1;e=1;const s=i?1:this.easing(e);this.value=this.from+(this.to-this.from)*s}var s,r,o;null==(e=this.onUpdate)||e.call(this,this.value,i),i&&this.stop()}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i=.1,duration:s=1,easing:n=(t=>t),onStart:r,onUpdate:o}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=n,this.currentTime=0,this.isRunning=!0,null==r||r(),this.onUpdate=o}}class o{constructor({wrapper:t,content:e,autoResize:i=!0}={}){if(this.resize=()=>{this.onWrapperResize(),this.onContentResize()},this.onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)},this.onContentResize=()=>{this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth},this.wrapper=t,this.content=e,i){const t=function(t,e){let i;return function(){let e=arguments,s=this;clearTimeout(i),i=setTimeout(function(){t.apply(s,e)},250)}}(this.resize);this.wrapper!==window&&(this.wrapperResizeObserver=new ResizeObserver(t),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(t),this.contentResizeObserver.observe(this.content)}this.resize()}destroy(){var t,e;null==(t=this.wrapperResizeObserver)||t.disconnect(),null==(e=this.contentResizeObserver)||e.disconnect()}get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class l{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}}off(t,e){var i;this.events[t]=null==(i=this.events[t])?void 0:i.filter(t=>e!==t)}destroy(){this.events={}}}class a{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=2,normalizeWheel:s=!1}){this.onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0}},this.onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,n=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:n},this.emitter.emit("scroll",{deltaX:s,deltaY:n,event:t})},this.onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})},this.onWheel=t=>{let{deltaX:e,deltaY:i}=t;this.normalizeWheel&&(e=n(-100,e,100),i=n(-100,i,100)),e*=this.wheelMultiplier,i*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})},this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.normalizeWheel=s,this.touchStart={x:null,y:null},this.emitter=new l,this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}}class h{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:n=i,smoothWheel:h=!0,smoothTouch:c=!1,syncTouch:u=!1,syncTouchLerp:d=.1,__iosNoInertiaSyncTouchLerp:v=.4,touchInertiaMultiplier:m=35,duration:p,easing:f=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:g=!p&&.1,infinite:b=!1,orientation:S="vertical",gestureOrientation:E="vertical",touchMultiplier:I=1,wheelMultiplier:w=1,normalizeWheel:y=!1,autoResize:O=!0}={}){this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const n=i.type.includes("touch"),r=i.type.includes("wheel");if("both"===this.options.gestureOrientation&&0===t&&0===e||"vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t||n&&"vertical"===this.options.gestureOrientation&&0===this.scroll&&!this.options.infinite&&e<=0)return;let o=i.composedPath();if(o=o.slice(0,o.indexOf(this.rootElement)),o.find(t=>{var e;return(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent"))||n&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-touch"))||r&&(null==t.hasAttribute?void 0:t.hasAttribute("data-lenis-prevent-wheel"))||(null==(e=t.classList)?void 0:e.contains("lenis"))}))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(this.isSmooth=(this.options.smoothTouch||this.options.syncTouch)&&n||this.options.smoothWheel&&r,!this.isSmooth)return this.isScrolling=!1,void this.animate.stop();i.preventDefault();let l=e;"both"===this.options.gestureOrientation?l=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(l=t);const a=n&&this.options.syncTouch,h=n&&"touchend"===i.type&&Math.abs(l)>1;h&&(l=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+l,s({programmatic:!1},a&&{lerp:h?this.syncTouchLerp:this.options.__iosNoInertiaSyncTouchLerp}))},this.onNativeScroll=()=>{if(!this.__preventNextScrollEvent&&!this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.direction=Math.sign(this.animatedScroll-t),this.emit()}},window.lenisVersion="1.0.29",t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:n,smoothWheel:h,smoothTouch:c,syncTouch:u,syncTouchLerp:d,__iosNoInertiaSyncTouchLerp:v,touchInertiaMultiplier:m,duration:p,easing:f,lerp:g,infinite:b,gestureOrientation:E,orientation:S,touchMultiplier:I,wheelMultiplier:w,normalizeWheel:y,autoResize:O},this.animate=new r,this.emitter=new l,this.dimensions=new o({wrapper:t,content:e,autoResize:O}),this.toggleClass("lenis",!0),this.velocity=0,this.isLocked=!1,this.isStopped=!1,this.isSmooth=u||h||c,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll=new a(n,{touchMultiplier:I,wheelMultiplier:w,normalizeWheel:y}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,{passive:!1}),this.virtualScroll.destroy(),this.dimensions.destroy(),this.toggleClass("lenis",!1),this.toggleClass("lenis-smooth",!1),this.toggleClass("lenis-scrolling",!1),this.toggleClass("lenis-stopped",!1),this.toggleClass("lenis-locked",!1)}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.velocity=0,this.animate.stop()}start(){this.isStopped=!1,this.reset()}stop(){this.isStopped=!0,this.animate.stop(),this.reset()}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:r=this.options.duration,easing:o=this.options.easing,lerp:l=!r&&this.options.lerp,onComplete:a=null,force:h=!1,programmatic:c=!0}={}){if(!this.isStopped&&!this.isLocked||h){if(["top","left","start"].includes(t))t=0;else if(["bottom","right","end"].includes(t))t=this.limit;else{var u;let i;if("string"==typeof t?i=document.querySelector(t):null!=(u=t)&&u.nodeType&&(i=t),i){if(this.options.wrapper!==window){const t=this.options.wrapper.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t){if(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=n(0,t,this.limit),i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),void(null==a||a(this));if(!c){if(t===this.targetScroll)return;this.targetScroll=t}this.animate.fromTo(this.animatedScroll,t,{duration:r,easing:o,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling=!0},onUpdate:(t,e)=>{this.isScrolling=!0,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==a||a(this),this.__preventNextScrollEvent=!0,requestAnimationFrame(()=>{delete this.__preventNextScrollEvent}))}})}}}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?(this.animatedScroll%(t=this.limit)+t)%t:this.animatedScroll;var t}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isSmooth(){return this.__isSmooth}set isSmooth(t){this.__isSmooth!==t&&(this.__isSmooth=t,this.toggleClass("lenis-smooth",t))}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.toggleClass("lenis-scrolling",t))}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.toggleClass("lenis-stopped",t))}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.toggleClass("lenis-locked",t))}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isSmooth&&(t+=" lenis-smooth"),t}toggleClass(t,e){this.rootElement.classList.toggle(t,e),this.emitter.emit("className change",this)}}var c=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,i=t.rootMargin,s=void 0===i?"-1px -1px -1px -1px":i,n=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=s,this.IORaf=n,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var i=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(i&&(i.isAlreadyIntersected=!0),t._setInview(e)):i&&i.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function u(t,e,i,s,n){return i+((n-t)/(e-t)*(s-i)||0)}function d(t,e){return t.reduce(function(t,i){return Math.abs(i-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var n,r=i(this.progressModularModules);!(n=r()).done;){var o=n.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var i=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(i)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,n=i(t);!(s=n()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=d([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var i,s,n=null==(i=this.attributes.scrollCall)?void 0:i.split(","),r=null==(s=this.attributes)?void 0:s.scrollCallSelf;if(n&&n.length>1){var o,l,a=n[0],h=n[1],c=n[2];l=r?this.$el.dataset["module"+h.trim()]:c,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},h.trim(),null==(o=l)?void 0:o.trim())}else if(n){var u=new CustomEvent(n[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),m=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],p=/*#__PURE__*/function(){function t(t){var e=t.$el,i=t.modularInstance,s=t.triggerRootMargin,n=t.rafRootMargin,r=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=i,this.scrollOrientation=r,this.triggerRootMargin=null!=s?s:"-1px -1px -1px -1px",this.rafRootMargin=null!=n?n:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new c({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new c({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,n=i(this.RAFScrollElements);!(e=n()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,n=t.smooth,r=i(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:n})},e.removeScrollElements=function(t){var e=this,i=t.querySelectorAll("[data-scroll]");if(i.length){for(var s=0;s-1&&(this.IOTriggerInstance.unobserve(n.$el),this.triggeredScrollElements.splice(s,1))}for(var r=0;r-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(r,1))}i.forEach(function(t){var i=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),s=e.scrollElements.find(function(e){return e.$el===t});i&&e._unsubscribeElementUpdate(i),s&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=s.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),i=[];this.scrollElements.forEach(function(t){i.push(t.id)});var s=Math.max.apply(Math,i)+1,n=Array.from(e);this._subscribeScrollElements(n,s,!0)},e._subscribeScrollElements=function(t,e,i){void 0===e&&(e=0),void 0===i&&(i=!1);for(var s=0;st.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=r(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function o(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function l(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,n=r(this.progressModularModules);!(i=n()).done;){var l=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=r(t);!(s=i()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=r(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=l([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),c=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],h=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new n({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new n({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=r(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,n=r(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var n=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=r(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function o(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function l(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,n=r(this.progressModularModules);!(i=n()).done;){var l=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=r(t);!(s=i()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=r(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=l([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),c=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],h=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new n({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new n({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=r(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,n=r(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"6pCAkBqBA,eAMjB,WAAA,SAAAA,EAAAC,GACI,IAAAC,EAAcD,EAAdC,eAAcC,EAAAF,EACdG,WAAAA,OAAU,IAAAD,EAAG,sBAAqBA,EAClCE,EAAKJ,EAALI,WARGH,oBAAc,EAAAI,KACbF,gBAAU,EAAAE,KACVD,WAAK,EAAAC,KACLC,cAQJ,EAAAD,KAAKJ,eAAiBA,EACtBI,KAAKF,WAAaA,EAClBE,KAAKD,MAAQA,EAGbC,KAAKE,OACT,CAAC,IAAAC,EAAAT,EAAAU,UA4GA,OA5GAD,EAOOD,MAAA,WAAKG,IAAAA,OAwBTL,KAAKC,SAAW,IAAIK,qBAjBA,SAACC,GACjBA,EAAQC,QAAQ,SAACC,GACb,IAAMC,EACFL,EAAKT,eAAee,KAChB,SAACC,GAAS,OAAAA,EAAKC,MAAQJ,EAAMK,MAAM,GAGvCL,EAAMM,gBACNL,IAAgBA,EAAYM,sBAAuB,GACnDX,EAAKY,WAAWR,IACTC,GAAeA,EAAYM,sBAClCX,EAAKa,cAAcT,EAE3B,EACJ,EAnBwB,CACpBX,WAAYE,KAAKF,aAwBrB,IAAAqB,IAA+CC,EAA/CD,EAAAE,EAA4BrB,KAAKJ,kBAAcwB,EAAAD,KAAAG,MAE3CtB,KAAKuB,QAFeH,EAAAI,MACiBX,IAG7C,EAACV,EAKMsB,QAAA,WACHzB,KAAKC,SAASyB,YAClB,EAACvB,EAOMoB,QAAA,SAAQI,GACNA,GAIL3B,KAAKC,SAASsB,QAAQI,EAC1B,EAACxB,EAOMyB,UAAA,SAAUD,GACRA,GAIL3B,KAAKC,SAAS2B,UAAUD,EAC5B,EAACxB,EASOc,WAAA,SAAWR,GACf,IAAMoB,EAAgB7B,KAAKJ,eAAee,KACtC,SAACkB,GAAkB,OAAAA,EAAchB,MAAQJ,EAAMK,MAAM,GAGzDd,KAAKD,QAAsB,MAAb8B,GAAAA,EAAeC,uBAC5B9B,KAAKD,QAAS8B,MAAAA,GAAAA,EAAeE,YAClC,EAAC5B,EASOe,cAAA,SAAcT,GAClB,IAAMoB,EAAgB7B,KAAKJ,eAAee,KACtC,SAACkB,GAAkB,OAAAA,EAAchB,MAAQJ,EAAMK,MAAM,GAGzDd,KAAKD,QAAsB,MAAb8B,GAAAA,EAAeG,wBAC5BhC,KAAKD,QAAS8B,MAAAA,GAAAA,EAAeI,gBAGZ,MAAbJ,GAAAA,EAAeK,WAAWC,cAAiBnC,KAAKD,OACjDC,KAAK4B,UAAUnB,EAAMK,OAE7B,EAACpB,CAAA,CAxHD,YCEY0C,EACZC,EACAC,EACAC,EACAC,EACAhB,GAIA,OAAOe,IAAYf,EAAQa,IAFXC,EAAQD,IACPG,EAASD,IACiC,EAC/D,CAuBgB,SAAAE,EAAcC,EAAiB5B,GAC3C,OAAO4B,EAAMC,OAAO,SAACC,EAAMC,GACvB,OAAOC,KAAKC,IAAIF,EAAO/B,GAAUgC,KAAKC,IAAIH,EAAO9B,GAAU+B,EAAOD,CACtE,EACJ,CC7BA,IAIqBI,eAwBjB,WAAA,SAAAA,EAAArD,GAQwBsD,IAAAA,EAAAC,EAAAC,EAAAC,EAAAC,EAPpBxC,EAAGlB,EAAHkB,IACAyC,EAAE3D,EAAF2D,GACAC,EAAe5D,EAAf4D,gBACAC,EAAwB7D,EAAxB6D,yBACAC,EAA0B9D,EAA1B8D,2BACAC,EAAO/D,EAAP+D,QACAC,EAAiBhE,EAAjBgE,kBA9BG9C,KAAAA,SACAyC,EAAAA,KAAAA,eACAI,aAAO,EAAA1D,KACPkC,gBAAU,EAAAlC,KACV2D,uBACA3C,EAAAA,KAAAA,0BAEC4C,EAAAA,KAAAA,yBACAC,aAAO,EAAA7D,KACP8D,mBAAa,EAAA9D,KACb+D,oBACAC,EAAAA,KAAAA,cACAC,EAAAA,KAAAA,yBACAV,qBAAe,EAAAvD,KACfkE,4BAAsB,EAAAlE,KACtBmE,cACAC,EAAAA,KAAAA,mBACAC,EAAAA,KAAAA,qBACAC,mBAAa,EAAAtE,KAEbwD,8BAAwB,EAAAxD,KACxByD,gCAYJ,EAAAzD,KAAKa,IAAMA,EAEXb,KAAKsD,GAAKA,EAEVtD,KAAK0D,QAAUA,EAEf1D,KAAK2D,kBAAoBA,EAEzB3D,KAAKuD,gBAAkBA,EAEvBvD,KAAKwD,yBAA2BA,EAChCxD,KAAKyD,2BAA6BA,EAGlCzD,KAAKkC,WAAa,CACdqC,YAA4CtB,OAAjCA,EAAEjD,KAAKa,IAAI2D,QAAqB,aAACvB,EArDnC,YAsDTwB,aAA8CvB,OAAlCA,EAAElD,KAAKa,IAAI2D,QAAsB,cAACtB,EAAI,MAClDwB,sBAAcvB,EAAEnD,KAAKa,IAAI2D,QAAwB,gBAACrB,EAAI,YACtDwB,qBACgD,MAA5C3E,KAAKa,IAAI2D,QAA8B,qBAC3CI,kBAA4D,MAAzC5E,KAAKa,IAAI2D,QAA2B,kBACvDK,oBAC2CzB,OADxBA,EACfpD,KAAKa,IAAI2D,QAA6B,qBAACpB,EAAI,KAC/C0B,YACuC,MAAnC9E,KAAKa,IAAI2D,QAAqB,YACxBO,WAAW/E,KAAKa,IAAI2D,QAAqB,aACzC,KACVQ,YACuC,MAAnChF,KAAKa,IAAI2D,QAAqB,YACxBO,WAAW/E,KAAKa,IAAI2D,QAAqB,aACzC,KACVrC,aAAkD,MAApCnC,KAAKa,IAAI2D,QAAsB,aAC7CS,WAA0C,OAAhC5B,EAAErD,KAAKa,IAAI2D,QAAoB,YAACnB,EAAI,KAC9C6B,eAAsD,MAAtClF,KAAKa,IAAI2D,QAAwB,eACjDW,iBAA0D,MAAxCnF,KAAKa,IAAI2D,QAA0B,iBACrDY,uBACkD,MAA9CpF,KAAKa,IAAI2D,QAAgC,wBAIjDxE,KAAK4D,aAAe,CAChByB,MAAO,EACPC,IAAK,GAITtF,KAAK6D,QAAU,CACX0B,YAAa,EACbC,UAAW,EACXC,IAAK,CAAA,GAITzF,KAAK8D,cAC0B,aAA3B9D,KAAK2D,kBACC+B,OAAOC,QACPD,OAAOE,QAGjB5F,KAAK+D,eAAiB,EAGtB/D,KAAKgE,SAAW,EAChBhE,KAAKiE,aAAe,KACpBjE,KAAKkE,uBAAyB,GAG9BlE,KAAKmE,UAAW,EAChBnE,KAAKoE,eAAgB,EACrBpE,KAAKgB,sBAAuB,EAC5BhB,KAAKqE,UAAW,EAChBrE,KAAKsE,eAAgB,EAGrBtE,KAAKE,OACT,CAAC,IAAAC,EAAA6C,EAAA5C,UA8fA,OA9fAD,EAOOD,MAAA,WACCF,KAAK0D,UAKN1D,KAAKuD,iBAAmBvD,KAAKkC,WAAWyC,sBACxC3E,KAAK6F,6BAIT7F,KAAK8F,UACT,EAAC3F,EAKM4F,SAAA,SAAAC,GACHhG,KAAK8D,cADsBkC,EAAblC,cAEd9D,KAAK8F,SACT,EAAC3F,EAKM8F,SAAA,SAAAC,GAAiE,IAAvCC,EAAMD,EAANC,OACvBC,EACyB,aAA3BpG,KAAK2D,kBACC+B,OAAOW,YACPX,OAAOY,WAKjB,GAJAtG,KAAK8D,cALsBoC,EAAbpC,cAMd9D,KAAKuG,mBAIDvG,KAAKkC,WAAW4C,cACf0B,MAAMxG,KAAKkC,WAAW4C,aAGvB,GAAK9E,KAAKkC,WAAWkD,wBAA2Be,EAOzC,CAEH,GAAInG,KAAKqE,SAAU,CACf,IAAML,EAAWlB,KAAK2D,IAAI,EAAGzG,KAAKgE,UAClChE,KAAK+D,eACDC,EAAWoC,EAAQpG,KAAKkC,WAAW4C,aAAe,CACzD,KAAM,CACH,IAAMd,EAAW5B,EAAS,EAAG,GAAI,EAAG,EAAGpC,KAAKgE,UAC5ChE,KAAK+D,eACDC,EAAWoC,EAAQpG,KAAKkC,WAAW4C,aAAe,CACzD,CAED,GAAI9E,KAAKkC,WAAW8C,YAAa,CAC7B,IAAMK,ECrNpB,SAAuBqB,GACzB,IAAMC,EAAY,CAACC,EAAG,EAAGC,EAAG,GAE5B,IAAKnB,OAAOoB,iBAAkB,OAAOH,EAErC,IAGII,EAHUD,iBAAiBJ,GACPM,UAEAC,MAAM,wBAE9B,GAAIF,EAAS,CACT,IAAMG,EAAQH,EAAQ,GAAGI,MAAM,MAC/BR,EAAUC,EAAI7B,WAAWmC,EAAM,IAC/BP,EAAUE,EAAI9B,WAAWmC,EAAM,GAClC,CAED,OAAOP,CACX,CDoMkCS,CAAapH,KAAKa,KAE1BwG,WD9ILhC,EAAeC,EAAagC,GAC7C,OAAQ,EAAIA,GAAOjC,EAAQiC,EAAMhC,CACrC,CC6IwBiC,CADqC,YAA1BvH,KAAK2D,kBACX0B,EAAMwB,EACNxB,EAAMuB,EADG5G,KAAK+D,eAAgB/D,KAAKkC,WAAW8C,aAGvDhF,KAAKa,IAAI2G,MAAMR,UACgB,aAA3BhH,KAAK2D,kBACmB0D,kBAAAA,0BACHA,EAAM,WAClC,MAEGrH,KAAKa,IAAI2G,MAAMR,UACgB,aAA3BhH,KAAK2D,kBAAgC,kBACb3D,KAAK+D,eACR,SAAA,eAAA/D,KAAK+D,eAAc,WAEnD,MApCO/D,KAAK+D,iBACL/D,KAAKa,IAAI2G,MAAMR,kCAEnBhH,KAAK+D,eAAiB,CAmClC,EAAC5D,EAKM4B,UAAA,WACH,IAAI/B,KAAKmE,SAAT,CAIAnE,KAAKmE,UAAW,EAChBnE,KAAKa,IAAI4G,UAAUC,IAAI1H,KAAKkC,WAAWqC,aAEvC,IACMoD,EAAuB3H,KAAK4H,qBAClC5H,KAAKkC,WAAW+C,YAAcjF,KAAK6H,cAFR,QAE2BF,EAPrD,CAQL,EAACxH,EAKM8B,aAAA,WACH,GAAMjC,KAAKmE,UAAYnE,KAAKkC,WAAWC,aAAvC,CAIAnC,KAAKmE,UAAW,EAChBnE,KAAKa,IAAI4G,UAAUK,OAAO9H,KAAKkC,WAAWqC,aAE1C,IACMoD,EAAuB3H,KAAK4H,qBAClC5H,KAAKkC,WAAW+C,YAAcjF,KAAK6H,cAFR,QAE2BF,EAPrD,CAQL,EAACxH,EAMM2B,mBAAA,WACC9B,KAAKoE,gBAITpE,KAAKoE,eAAgB,EACrBpE,KAAKwD,yBAAyBxD,MAClC,EAACG,EAMM6B,oBAAA,WACEhC,KAAKoE,gBAIVpE,KAAKoE,eAAgB,EACrBpE,KAAKyD,2BAA2BzD,MAGX,MAArBA,KAAKiE,cACDjE,KAAKuG,iBAAiB9D,EAAc,CAAC,EAAG,GAAIzC,KAAKiE,eACzD,EAAC9D,EAOO2F,QAAA,WACJ9F,KAAK6D,QAAQ4B,IAAMzF,KAAKa,IAAIkH,wBAC5B/H,KAAKgI,kBACLhI,KAAKiI,uBAGDjI,KAAKsE,gBACLtE,KAAKsE,eAAgB,EAEjBtE,KAAKqE,UACLrE,KAAK+B,YAGjB,EAAC5B,EAOO6H,gBAAA,WACJ,IAAAE,EAAqClI,KAAK6D,QAAQ4B,IAC5CW,EACyB,aAA3BpG,KAAK2D,kBACC+B,OAAOW,YACPX,OAAOY,WAEX6B,EACyB,aAA3BnI,KAAK2D,kBAPgBuE,EAANE,OAAaF,EAALG,MAS3BrI,KAAK6D,QAAQ0B,YACTvF,KAAK8D,eALuC,aAA3B9D,KAAK2D,kBALfuE,EAAHI,IAASJ,EAAJK,MAU2BvI,KAAK+D,eAC7C/D,KAAK6D,QAAQ2B,UAAYxF,KAAK6D,QAAQ0B,YAAc4C,EAMhDnI,KAAKqE,SAHLrE,KAAK6D,QAAQ0B,YAAca,IAC1BpG,KAAKkC,WAAWiD,gBAMzB,EAAChF,EAOO8H,qBAAA,WAEJ,IAAM7B,EACyB,aAA3BpG,KAAK2D,kBACC+B,OAAOW,YACPX,OAAOY,WAGX6B,EACyB,aAA3BnI,KAAK2D,kBACC3D,KAAK6D,QAAQ4B,IAAI2C,OACjBpI,KAAK6D,QAAQ4B,IAAI4C,MAGrBG,EAASxI,KAAKkC,WAAWuC,aAAa0C,MAAM,KAC5C5B,EAA2BkD,MAAbD,EAAO,GAAkBA,EAAO,GAAGE,OAAS,IAC1DlD,EAAyBiD,MAAbD,EAAO,GAAkBA,EAAO,GAAGE,OAAS,IAGxDhE,EAAiB1E,KAAKkC,WAAWwC,eAAeyC,MAAM,KACxDwB,EACqBF,MAArB/D,EAAe,GAAkBA,EAAe,GAAGgE,OAAS,QAC1DE,EACmBH,MAArB/D,EAAe,GAAkBA,EAAe,GAAGgE,OAAS,MAG1DG,EAAgBtD,EAAYuD,SAAS,KACrC1C,EAAQ2C,SAASxD,EAAYyD,QAAQ,IAAK,IAAIN,QAAU,IACxDK,SAASxD,GACT0D,EAAczD,EAAUsD,SAAS,KACjC1C,EAAQ2C,SAASvD,EAAUwD,QAAQ,IAAK,IAAIN,QAAU,IACtDK,SAASvD,GAQf,OALIxF,KAAKqE,WACLsE,EAAsB,QAIlBA,GACJ,IAAK,QAyBL,QACI3I,KAAK4D,aAAayB,MACdrF,KAAK6D,QAAQ0B,YAAca,EAAQyC,EACvC,MAvBJ,IAAK,SACD7I,KAAK4D,aAAayB,MACdrF,KAAK6D,QAAQ0B,YACba,EACAyC,EACc,GAAdV,EACJ,MAEJ,IAAK,MACDnI,KAAK4D,aAAayB,MACdrF,KAAK6D,QAAQ0B,YACba,EACAyC,EACAV,EACJ,MAEJ,IAAK,OACDnI,KAAK4D,aAAayB,MAAQ,EAUlC,OAAQuD,GACJ,IAAK,QACD5I,KAAK4D,aAAa0B,IAAMtF,KAAK6D,QAAQ0B,YAAc0D,EACnD,MAEJ,IAAK,SACDjJ,KAAK4D,aAAa0B,IACdtF,KAAK6D,QAAQ0B,YAAc0D,EAA4B,GAAdd,EAC7C,MAOJ,QACInI,KAAK4D,aAAa0B,IACdtF,KAAK6D,QAAQ0B,YAAc0D,EAAcd,EAKrD,GAAInI,KAAK4D,aAAa0B,KAAOtF,KAAK4D,aAAayB,MAC3C,OAAQuD,GACJ,IAAK,QAcL,QACI5I,KAAK4D,aAAa0B,IAAMtF,KAAK4D,aAAayB,MAAQ,EAClD,MAZJ,IAAK,SACDrF,KAAK4D,aAAa0B,IACdtF,KAAK4D,aAAayB,MAAsB,GAAd8C,EAC9B,MAEJ,IAAK,MACDnI,KAAK4D,aAAa0B,IACdtF,KAAK4D,aAAayB,MAAQ8C,EAQ9C,EAAChI,EAUOoG,iBAAA,SAAiB2C,GAErB,IDldwC1H,ECkdlCwC,QACFkF,EAAAA,GDndoC1H,EAqCrCY,ECmbSpC,KAAK4D,aAAayB,MAClBrF,KAAK4D,aAAa0B,IDpbR,EAAG,ECqbbtF,KAAK8D,gBALT,IDpdetC,ECqdf,IDrdmCA,EC+d3C,GAFAxB,KAAKgE,SAAWA,EAEZA,GAAYhE,KAAKiE,aAAc,CAW/B,GAVAjE,KAAKiE,aAAeD,EAGpBhE,KAAKkC,WAAW0C,mBAAqB5E,KAAKmJ,gBAAgBnF,GAG1DhE,KAAKkC,WAAW2C,qBACZ7E,KAAKoJ,wBAAwBpF,GAG7BhE,KAAKkC,WAAWyC,qBAChB,IAAA,IAAwDvD,EAAxDD,EAAAE,EAA6BrB,KAAKkE,0BAAsB9C,EAAAD,KAAAG,MAAE,CAAA,IAA/C+H,EAAcjI,EAAAI,MACrBxB,KAAKuD,iBACDvD,KAAKuD,gBAAgB+F,KArdb,mBAudJtF,EACAqF,EAAeE,WACfF,EAAeG,SAE1B,CAILxF,EAAW,GAAKA,EAAW,GAAKhE,KAAK+B,YACxB,IAAbiC,GAAkBhE,KAAKiC,eACV,IAAb+B,GAAkBhE,KAAKiC,cAC1B,CACL,EAAC9B,EASDgJ,gBAAA,SAAgBM,QAAe,IAAfA,IAAAA,EAAkB,GAC9BzJ,KAAKa,IAAI2G,MAAMkC,YA9eE,aAgfbD,EAAgBE,WAExB,EAACxJ,EASDiJ,wBAAA,SAAwBK,YAAAA,IAAAA,EAAkB,GACtC,IAAMG,EAAkB5J,KAAKkC,WAAW2C,oBAExC,GAAK+E,EAAL,CAEA,IAAMC,EAAc,IAAIC,YAAYF,EAAiB,CACjDG,OAAQ,CACJjJ,OAAQd,KAAKa,IACbmD,SAAUyF,KAGlB/D,OAAOsE,cAAcH,EANrB,CAOJ,EAAC1J,EAOD0F,2BAAA,WACI,GAAK7F,KAAKuD,gBAAV,CAIA,IAAM0G,EAAiBC,OAAOC,KAAKnK,KAAKa,IAAI2D,SAAS4F,OAAO,SAACC,GACzD,OAAAA,EAAIvB,SAAS,SAAS,GAEpBwB,EAAiBJ,OAAO3J,QAAQP,KAAKuD,gBAAgB+G,SAE3D,GAAKL,EAAeM,OAIpB,QAA0CC,EAA1CC,EAAApJ,EAA4B4I,KAAcO,EAAAC,KAAAnJ,MAAE,KAClCkI,EAAWxJ,KAAKa,IAAI2D,QADNgG,EAAAhJ,OAGpB,IAAKgI,EACD,OAGJ,IAAA,IAA4BkB,EAA5BC,EAAAtJ,EAAqBiJ,KAAOI,EAAAC,KAAArJ,MAAE,CAAA,IAAnBsJ,EAAMF,EAAAlJ,MAGTgI,KAF4BoB,EAAM,IAGlC5K,KAAKkE,uBAAuB2G,KAAK,CAC7BtB,WAJwBqB,KAKxBpB,SAAAA,GAGX,CACJ,CA5BA,CA6BL,EAACrJ,EAODyH,mBAAA,WACI,IAAMkD,EAA2BrI,EAC7B,CAACzC,KAAK4D,aAAayB,MAAOrF,KAAK4D,aAAa0B,KAC5CtF,KAAK8D,eAET,OAAO9D,KAAK4D,aAAayB,QAAUyF,EAC7B,QACA,KACV,EAAC3K,EAUD0H,cAAA,SAAckD,EAAoBpD,OAAoBqD,EAAAC,EAC5CC,EAAiBF,OAAHA,EAAGhL,KAAKkC,WAAW+C,iBAAhB+F,EAAAA,EAA4B7D,MAAM,KACnDgE,EAAWF,OAAHA,EAAGjL,KAAKkC,iBAAL+I,EAAAA,EAAiB/F,eAElC,GAAIgG,GAAkBA,EAAeX,OAAS,EAAG,CAAA,IAAAa,EAGzCC,EADGC,EAA8BJ,KAAxB3B,EAAwB2B,EAAc,GAA1B1B,EAAY0B,EACrC,GAIIG,EADAF,EACiBnL,KAAKa,IAAI2D,QAAO,SAAU+E,EAAWb,QAErCc,EAGrBxJ,KAAKuD,iBACDvD,KAAKuD,gBAAgB+F,KACjBgC,EAAK5C,OACL,CACI5H,OAAQd,KAAKa,IACbkK,IAAAA,EACApD,KAAAA,GAEJ4B,EAAWb,OACG,OADG0C,EACjBC,QAAc,EAAdD,EAAgB1C,OAE3B,MAAUwC,GAAAA,EAAgB,CAEvB,IACMrB,EAAc,IAAIC,YADEoB,EAAc,GACa,CACjDnB,OAAQ,CACJjJ,OAAQd,KAAKa,IACbkK,IAAAA,EACApD,KAAAA,KAGRjC,OAAOsE,cAAcH,EACxB,CACL,EAAC7G,CAAA,CAnlBD,GEhDEuI,EAA2B,CAC7B,eACA,iBACA,uBACA,oBACA,sBACA,eAOiBC,eAAI,WAarB,SAAAA,EAAA7L,GAMc,IALVkB,EAAGlB,EAAHkB,IACA0C,EAAe5D,EAAf4D,gBACAkI,EAAiB9L,EAAjB8L,kBACAC,EAAa/L,EAAb+L,cACA/H,EAAiBhE,EAAjBgE,kBAjBIgI,KAAAA,sBACApI,EAAAA,KAAAA,4BACAkI,uBAAiB,EAAAzL,KACjB0L,mBAAa,EAAA1L,KACbJ,oBACAgM,EAAAA,KAAAA,6BACAC,EAAAA,KAAAA,8BACAC,4BAAsB,EAAA9L,KACtB+L,uBACAC,EAAAA,KAAAA,0BACArI,uBAAiB,EAShB9C,GAMLb,KAAK2L,iBAAmB9K,EAGxBb,KAAKuD,gBAAkBA,EAGvBvD,KAAK2D,kBAAoBA,EAGzB3D,KAAKyL,kBAAoBA,MAAAA,EAAAA,EAtCL,sBAuCpBzL,KAAK0L,cAAgBA,MAAAA,EAAAA,EAtCL,sBAyChB1L,KAAKJ,eAAiB,GACtBI,KAAK4L,wBAA0B,GAC/B5L,KAAK6L,kBAAoB,GACzB7L,KAAK8L,uBAAyB,GAI9B9L,KAAKE,SAzBD+L,QAAQC,MAAM,kDA0BtB,CAAC,IAAA/L,EAAAqL,EAAApL,UA2SA,OA3SAD,EAOOD,MAAA,WACJ,IAAMiM,EACFnM,KAAK2L,iBAAiBS,iBAAiB,iBAErCC,EAAqBC,MAAM3E,KAAKwE,GACtCnM,KAAKuM,yBAAyBF,GAG9BrM,KAAK+L,kBAAoB,IAAIrM,EAAG,CAC5BE,kBAAc4M,OAAMxM,KAAK4L,yBACzB9L,WAAYE,KAAKyL,kBACjB1L,OAAO,IAIXC,KAAKgM,cAAgB,IAAItM,EAAG,CACxBE,eAAc4M,GAAAA,OAAMxM,KAAK6L,mBACzB/L,WAAYE,KAAK0L,cACjB3L,OAAO,GAEf,EAACI,EAKMsB,QAAA,WACHzB,KAAK+L,kBAAkBtK,UACvBzB,KAAKgM,cAAcvK,UACnBzB,KAAKyM,+BACT,EAACtM,EAKD4F,SAAA,SAAAC,GACI,IADqD,IACH5E,EAD3C0C,EAAakC,EAAblC,cACP3C,EAAAE,EAA4BrB,KAAK6L,qBAAiBzK,EAAAD,KAAAG,MAA1BF,EAAAI,MACNuE,SAAS,CACnBjC,cAAAA,GAGZ,EAAC3D,EAKD8F,SAAA,SAAAC,GACI,IADO,IACgDsE,EADhD1G,EAAaoC,EAAbpC,cAAeqC,EAAMD,EAANC,OACtBsE,EAAApJ,EAA4BrB,KAAK8L,0BAAsBtB,EAAAC,KAAAnJ,MAA/BkJ,EAAAhJ,MACNyE,SAAS,CACnBnC,cAAAA,EACAqC,OAAAA,GAGZ,EAAChG,EAODuM,qBAAA,SAAqBC,GAA0B,IAAAtM,EAAAL,KACrC4M,EACFD,EAAcP,iBAAiB,iBAEnC,GAAKQ,EAAwBrC,OAA7B,CAGA,IAAK,IAAIsC,EAAQ,EAAGA,EAAQ7M,KAAK4L,wBAAwBrB,OAAQsC,IAAS,CACtE,IAAMhL,EAAgB7B,KAAK4L,wBAAwBiB,GAChBP,MAAM3E,KAAKiF,GACfE,QAAQjL,EAAchB,MAAQ,IACzDb,KAAK+L,kBAAkBnK,UAAUC,EAAchB,KAC/Cb,KAAK4L,wBAAwBmB,OAAOF,EAAO,GAElD,CAED,IAAK,IAAIA,EAAQ,EAAGA,EAAQ7M,KAAK6L,kBAAkBtB,OAAQsC,IAAS,CAChE,IAAMhL,EAAgB7B,KAAK6L,kBAAkBgB,GACVP,MAAM3E,KAAKiF,GACfE,QAAQjL,EAAchB,MAAQ,IACzDb,KAAKgM,cAAcpK,UAAUC,EAAchB,KAC3Cb,KAAK6L,kBAAkBkB,OAAOF,EAAO,GAE5C,CAGDD,EAAwBpM,QAAQ,SAACmB,GAC7B,IAAMqL,EACF3M,EAAKyL,uBAAuBnL,KACxB,SAACkB,GAAa,OAAKA,EAAchB,MAAQc,CAAc,GAEzDsL,EAAsB5M,EAAKT,eAAee,KAC5C,SAACkB,GAAkB,OAAAA,EAAchB,MAAQc,CAAc,GAGvDqL,GACA3M,EAAK6M,0BAA0BF,GAE/BC,IACA5M,EAAKT,eAAiBS,EAAKT,eAAewK,OACtC,SAAC+C,GACG,OAAAA,EAAkB7J,IAAM2J,EAAoB3J,EAAE,GAG9D,EAxCqC,CAyCzC,EAACnD,EAODiN,kBAAA,SAAkBC,GAEd,IAAMlB,EAAkBkB,EAAcjB,iBAAiB,iBAGjDkB,EAAgB,GACtBtN,KAAKJ,eAAeY,QAAQ,SAACqB,GACzByL,EAAIzC,KAAKhJ,EAAcyB,GAC3B,GACA,IACMiK,EADQzK,KAAK2D,IAAG+G,MAAR1K,KAAYwK,GACA,EACpBjB,EAAqBC,MAAM3E,KAAKwE,GACtCnM,KAAKuM,yBACDF,EACAkB,GACA,EAER,EAACpN,EAWDoM,yBAAA,SACIJ,EACAoB,EACAE,QADS,IAATF,IAAAA,EAAY,YACZE,IAAAA,GAAY,GAGZ,IAAK,IAAIZ,EAAQ,EAAGA,EAAQV,EAAgB5B,OAAQsC,IAAS,CACzD,IAAMlL,EAAiBwK,EAAgBU,GACjCnJ,EAAU1D,KAAK0N,gBAAgB/L,GAE/BgM,EAAwB,IAAI3K,EAAc,CAC5CnC,IAAKc,EACL2B,GAAIiK,EAAYV,EAChBlJ,kBAAmB3D,KAAK2D,kBACxBJ,gBAAiBvD,KAAKuD,gBACtBC,yBACIxD,KAAK4N,wBAAwBC,KAAK7N,MACtCyD,2BACIzD,KAAKkN,0BAA0BW,KAAK7N,MACxC0D,QAAAA,IAIJ1D,KAAKJ,eAAeiL,KAAK8C,GAGrBjK,GACA1D,KAAK6L,kBAAkBhB,KAAK8C,GAGxBF,IACAzN,KAAKgM,cAAcpM,eAAeiL,KAC9B8C,GAEJ3N,KAAKgM,cAAczK,QAAQoM,EAAsB9M,QAGrDb,KAAK4L,wBAAwBf,KAAK8C,GAG9BF,IACAzN,KAAK+L,kBAAkBnM,eAAeiL,KAClC8C,GAEJ3N,KAAK+L,kBAAkBxK,QAAQoM,EAAsB9M,MAGhE,CACL,EAACV,EAODsM,8BAAA,WACIzM,KAAKJ,eAAiB,GACtBI,KAAK6L,kBAAoB,GACzB7L,KAAK4L,wBAA0B,GAC/B5L,KAAK8L,uBAAyB,EAClC,EAAC3L,EAUDyN,wBAAA,SAAwB/L,GACpB7B,KAAK8L,uBAAuBjB,KAAKhJ,EACrC,EAAC1B,EAUD+M,0BAAA,SAA0BrL,GACtB7B,KAAK8L,uBAAyB9L,KAAK8L,uBAAuB1B,OACtD,SAAC0D,UACGA,EAAsBxK,IAAMzB,EAAcyB,EAAE,EAExD,EAACnD,EAWDuN,gBAAA,SAAgB/L,GACZ,IAAIoM,EAAqBvB,GAAAA,OAAOjB,GAG1ByC,EAAkB,SAACC,GACrBF,EAAwBA,EAAsB3D,OAC1C,SAAC8D,GAAS,OAAKA,GAAaD,CAAiB,EAErD,EAGA,GAAItM,EAAe6C,QAAQC,aAAc,CAKrC,GAAa,OAJC9C,EAAe6C,QAAQC,aAChC0C,MAAM,KACNgH,IAAI,SAACC,GAAI,OAAKA,EAAKpF,QAAQ,IAAK,IAAIN,MAAM,GAC1C2F,KAAK,KAEN,OACH,EACGL,EAAgB,eAEvB,MACGA,EAAgB,gBAIpB,GAAIrM,EAAe6C,QAAQE,eAAgB,CAEvC,GAAa,cADC/C,EAAe6C,QAAQE,eAAegE,OAEhD,SAEAsF,EAAgB,iBAEvB,MACGA,EAAgB,kBAIpB,GACIrM,EAAe6C,QAAQM,cACtB0B,MAAMzB,WAAWpD,EAAe6C,QAAQM,cAEzC,OAAO,EAEPkJ,EAAgB,eAIpB,QAA6CtD,EAA7CC,EAAAtJ,EAAwB0M,KAAqBrD,EAAAC,KAAArJ,MACzC,GADgBoJ,EAAAlJ,SACCG,EAAe6C,QAC5B,OACH,EAGL,QACJ,EAACgH,CAAA,CA1VoB,GCVJ8C,eAMjB,WAAA,SAAAA,EAAA3O,OAAc4O,EAAc5O,EAAd4O,eAAcC,EAAA7O,EAAE8O,eAAAA,WAAcD,EAAG,aAAQA,OAL/CE,qBAAe,EAAA1O,KACf2O,oBACA1O,EAAAA,KAAAA,qBACAwO,oBAAc,EAIlBzO,KAAK0O,gBAAkBH,EACvBvO,KAAKyO,eAAiBA,EAGtBzO,KAAK2O,gBAAiB,EAGtB3O,KAAKE,OACT,CAAC,IAAAC,EAAAmO,EAAAlO,UA4BA,OA5BAD,EAOOD,MAAA,WAAKG,IAAAA,OAQTL,KAAKC,SAAW,IAAI2O,eANH,SAACrO,IACbF,EAAKsO,uBAAkBtO,EAAKoO,gBAALpO,EAAKoO,kBAC7BpO,EAAKsO,gBAAiB,CAC1B,GAMA,IAAA,IAAiDvN,EAAjDD,EAAAE,EAA6BrB,KAAK0O,mBAAetN,EAAAD,KAAAG,MAC7CtB,KAAKC,SAASsB,QADOH,EAAAI,MAG7B,EAACrB,EAKMsB,QAAA,WACHzB,KAAKC,SAASyB,YAClB,EAAC4M,CAAA,CAtCD,GCPEO,EAAqC,CACvCC,QAASpJ,OACTqJ,QAASC,SAASC,gBAClBC,aAAcxJ,OACd6B,KAAM,GACN4H,SAAU,IACVC,YAAa,WACbC,mBAAoB,WACpBC,aAAa,EACbC,aAAa,EACbC,WAAW,EACXC,cAAe,GACfC,uBAAwB,GACxBC,gBAAiB,EACjBC,gBAAiB,EACjBC,gBAAgB,EAChBC,YAAY,EACZC,OAAQ,SAACC,GAAM,OAAAlN,KAAKmN,IAAI,EAAG,MAAQnN,KAAKoN,IAAI,GAAI,GAAKF,GAAG,0CAmCxD,SAAAG,EAAAC,GAUgC,IAAAzQ,WAAAyQ,EAAF,CAAE,EAAAA,EAAAC,EAAA1Q,EAT5B2Q,aAAAA,OAAY,IAAAD,EAAG,CAAA,EAAEA,EACjB9M,EAAe5D,EAAf4D,gBACAkI,EAAiB9L,EAAjB8L,kBACAC,EAAa/L,EAAb+L,cAAa6E,EAAA5Q,EACbmQ,WAAAA,OAAa,IAAHS,GAAOA,EAAAC,EAAA7Q,EACjB8Q,UAAAA,OAAY,IAAHD,GAAOA,EAAAE,EAAA/Q,EAChBgR,eAAAA,OAAiB,IAAHD,EAAG,WAAO,EAACA,EACzBE,EAAgBjR,EAAhBiR,iBACAC,EAAmBlR,EAAnBkR,oBA7BGC,KAAAA,uBAECC,mBAAa,EAAA/Q,KACbgR,kBAEAV,EAAAA,KAAAA,yBACA/M,qBAAe,EAAAvD,KACfyL,uBACAC,EAAAA,KAAAA,0BACAuF,iBAAW,EAAAjR,KACX8P,gBAAU,EAAA9P,KACVyQ,eAAS,EAAAzQ,KACTkR,gBAEAN,EAAAA,KAAAA,6BACAC,yBAAmB,EAAA7Q,KACnBmR,mBACAC,EAAAA,KAAAA,0BACAC,qBAAe,EAcnBrR,KAAKsQ,aAAYgB,EAAA,GAAQzC,EAAwByB,GAEjDpG,OAAOqH,OAAOvR,KAAM,CAChBsQ,aAAAA,EACA/M,gBAAAA,EACAkI,kBAAAA,EACAC,cAAAA,EACAoE,WAAAA,EACAW,UAAAA,EACAE,eAAAA,EACAC,iBAAAA,EACAC,oBAAAA,IAIJ7Q,KAAKmR,cAAgBnR,KAAKwR,UAAU3D,KAAK7N,MACzCA,KAAKqR,gBAAkBrR,KAAKyR,YAAY5D,KAAK7N,MAC7CA,KAAKoR,cAAgBpR,KAAK0R,UAAU7D,KAAK7N,MAGzCA,KAAK8Q,YAAa,EAGlB9Q,KAAKE,OACT,CAAC,IAAAC,EAAAgQ,EAAA/P,iBAAAD,EAOOD,MAAA,eAAKyR,EAAAtR,EAETL,KAAAA,KAAK+Q,cAAgB,IAAIa,EAAK,QAAC,CAC3B9C,QAAS9O,KAAKsQ,aAAaxB,QAC3BC,QAAS/O,KAAKsQ,aAAavB,QAC3BG,aAAclP,KAAKsQ,aAAapB,aAChC3H,KAAMvH,KAAKsQ,aAAa/I,KACxB4H,SAAUnP,KAAKsQ,aAAanB,SAC5BC,YAAapP,KAAKsQ,aAAalB,YAC/BC,mBAAoBrP,KAAKsQ,aAAajB,mBACtCC,YAAatP,KAAKsQ,aAAahB,YAC/BC,YAAavP,KAAKsQ,aAAaf,YAC/BC,UAAWxP,KAAKsQ,aAAad,UAC7BC,cAAezP,KAAKsQ,aAAab,cACjCC,uBAAwB1P,KAAKsQ,aAAaZ,uBAC1CC,gBAAiB3P,KAAKsQ,aAAaX,gBACnCC,gBAAiB5P,KAAKsQ,aAAaV,gBACnCC,eAAgB7P,KAAKsQ,aAAaT,eAClCE,OAAQ/P,KAAKsQ,aAAaP,SAE9B4B,OAAAA,EAAI3R,KAAC+Q,gBAALY,EAAoBE,GAAG,SAAU7R,KAAK2Q,gBAGtC3B,SAASC,gBAAgB6C,aACrB,0BACA9R,KAAK+Q,cAAcgB,QAAQ3C,aAG/B4C,sBAAsB,WAElB3R,EAAK2Q,aAAe,IAAIxF,EAAK,CACzB3K,IAAKR,EAAK0Q,cAAckB,YACxB1O,gBAAiBlD,EAAKkD,gBACtBkI,kBAAmBpL,EAAKoL,kBACxBC,cAAerL,EAAKqL,cACpB/H,kBAAmBtD,EAAK0Q,cAAcgB,QAAQ3C,cAIlD/O,EAAK6R,cAGD7R,EAAKuQ,mBAAqBvQ,EAAKwQ,oBAC/B5E,QAAQkG,KACJ,yHAEI9R,EAAKuQ,kBAAoBvQ,EAAKwQ,qBACtC5E,QAAQkG,KACJ,wHAKR9R,EAAKoQ,WAAapQ,EAAKgF,OAC3B,EACJ,EAAClF,EAKMsB,QAAA,WAAO2Q,IAAAA,EAAAC,EAAArS,KAEVA,KAAKsS,OAELtS,KAAKuS,gBAELvS,KAAK+Q,cAActP,iBAEnB2Q,OAAKpB,eAALoB,EAAmB3Q,UAGnBuQ,sBAAsB,WAAKQ,IAAAA,SACvBA,EAAAH,EAAKrB,eAALwB,EAAmB/Q,SACvB,EACJ,EAACtB,EAKO+R,YAAA,WACJlS,KAAKyS,sBAEDzS,KAAK8P,aACD,mBAAoBpK,OACpB1F,KAAKkR,WAAa,IAAI5C,EAAG,CACrBC,eAAgB,CAACS,SAAS0D,MAC1BjE,eAAgBzO,KAAKoR,gBAGxB1L,OAAeiN,iBAAiB,SAAU3S,KAAKoR,eAG5D,EAACjR,EAKOoS,cAAA,WACJvS,KAAK4S,wBAED5S,KAAK8P,aACD,mBAAoBpK,OACpB1F,KAAKkR,YAAclR,KAAKkR,WAAWzP,UAElCiE,OAAemN,oBACZ,SACA7S,KAAKoR,eAIrB,EAACjR,EAKOsS,oBAAA,SAAoBK,GAAwB,IAAAC,EAAA/S,KAC1CgT,EAAiBF,GAEjB9S,KAAK+Q,cAAckB,YACnBgB,EACY,MAAdD,OAAc,EAAdA,EAAgB5G,iBAAiB,qBAEpB,MAAjB6G,OAAiB,EAAjBA,EAAmB1I,SACf0I,EAAkBzS,QAAQ,SAACK,GACvBA,EAAI8R,iBAAiB,QAASI,EAAK1B,iBAAiB,EACxD,EACR,EAAClR,EAKOyS,sBAAA,SAAsBE,OAAwBI,EAAAlT,KAC5CgT,EAAiBF,GAEjB9S,KAAK+Q,cAAckB,YACnBgB,QACFD,SAAAA,EAAgB5G,iBAAiB,qBACpB,MAAjB6G,OAAiB,EAAjBA,EAAmB1I,SACf0I,EAAkBzS,QAAQ,SAACK,GACvBA,EAAIgS,oBAAoB,QAASK,EAAK7B,iBAAiB,EAC3D,EACR,EAAClR,EAKOuR,UAAA,WAAS,IAAAyB,EAEbnB,KAAAA,sBAAsB,WAAK,IAAAoB,EACN,OAAjBA,EAAAD,EAAKnC,eAALoC,EAAmBrN,SAAS,CACxBjC,cAAeqP,EAAKpC,cAAcsC,QAE1C,EACJ,EAAClT,EAKOqR,UAAA,eAAS8B,EAAAC,EACbD,OAAAA,EAAItT,KAAC+Q,gBAALuC,EAAoBE,IAAIC,KAAKC,OAEZ,OAAjBH,EAAAvT,KAAKgR,eAALuC,EAAmBtN,SAAS,CACxBnC,cAAe9D,KAAK+Q,cAAcsC,OAClClN,OAAQnG,KAAK+Q,cAAc4C,UAEnC,EAACxT,EAKOsR,YAAA,SAAYmC,GAAiBC,IAAAA,EACjCD,EAAME,iBACN,IAAMC,EAA8CF,OAAvCA,EAAID,EAAMI,eAA6BH,EAAI,KACxD,GAAKE,EAAL,CACA,IAAMjT,EACFiT,EAAQE,aAAa,wBACrBF,EAAQE,aAAa,QACnBzL,EAASuL,EAAQE,aAAa,0BAA4B,EAC1D9E,EACF4E,EAAQE,aAAa,4BACrBjU,KAAKsQ,aAAanB,UAClBN,EAAoBM,SAExBrO,GACId,KAAKkU,SAASpT,EAAQ,CAClB0H,OAA0B,iBAAXA,EAAsBO,SAASP,GAAUA,EACxD2G,SACwB,iBAAbA,EACDpG,SAASoG,GACTA,GAhBJ,CAkBlB,EAAChP,EAKMkF,MAAA,WAAK8O,IAAAA,EACJnU,KAAK8Q,aAKTqD,OAAAA,EAAInU,KAAC+Q,gBAALoD,EAAoB9O,QAEpBrF,KAAK8Q,YAAa,EAClB9Q,KAAK4Q,iBACC5Q,KAAK4Q,iBAAiB5Q,KAAKmR,eAC3BnR,KAAKoU,OACf,EAACjU,EAKMmS,KAAA,WAAI,IAAA+B,EACFrU,KAAK8Q,aAKQ,OAAlBuD,EAAArU,KAAK+Q,gBAALsD,EAAoB/B,OAEpBtS,KAAK8Q,YAAa,EAClB9Q,KAAK6Q,oBACC7Q,KAAK6Q,oBAAoB7Q,KAAKmR,eAC9BnR,KAAKiR,aAAeqD,qBAAqBtU,KAAKiR,aACxD,EAAC9Q,EAKMuM,qBAAA,SAAqBC,GAA0B,IAAA4H,EAC7C5H,GAKL3M,KAAK4S,sBAAsBjG,UAC3B4H,OAAKvD,eAALuD,EAAmB7H,qBAAqBC,IALpCV,QAAQC,MAAM,gDAMtB,EAAC/L,EAKMiN,kBAAA,SAAkBC,GAA0BmH,IAAAA,EAAAC,EAAAzU,KAC1CqN,GAKLmH,OAAAA,EAAIxU,KAACgR,eAALwD,EAAmBpH,kBAAkBC,GACrC2E,sBAAsB,WAClByC,EAAKhC,oBAAoBpF,EAC7B,IAPIpB,QAAQC,MAAM,gDAQtB,EAAC/L,EAKMuU,OAAA,WACH1U,KAAKoR,eACT,EAACjR,EAKM+T,SAAA,SACHpT,EACAiR,GAA+B4C,IAAAA,SAE/BA,OAAK5D,gBAAL4D,EAAoBT,SAASpT,EAAQ,CACjC0H,OAAQuJ,MAAAA,OAAAA,EAAAA,EAASvJ,OACjBjB,WAAMwK,SAAAA,EAASxK,KACf4H,SAAiB,MAAP4C,OAAO,EAAPA,EAAS5C,SACnByF,UAAkB,MAAP7C,OAAO,EAAPA,EAAS6C,UACpBC,KAAa,MAAP9C,OAAO,EAAPA,EAAS8C,KACfC,MAAO/C,MAAAA,OAAAA,EAAAA,EAAS+C,MAChB/E,OAAQgC,MAAAA,OAAAA,EAAAA,EAAShC,OACjBgF,WAAYhD,MAAAA,OAAAA,EAAAA,EAASgD,YAE7B,EAAC5U,EAQOiU,KAAA,WAAIY,IAAAA,EACRhV,KAAAA,KAAKmR,gBACLnR,KAAKiR,YAAce,sBAAsB,kBAAMgD,EAAKZ,MAAM,EAC9D,EAACjE,CAAA"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.cjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: HTMLElement) {\n const translate = {x: 0, y: 0};\n \n const transform = el.style.transform \n\n let matches = transform.match(/translate3d\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","matches","style","transform","match","parts","split","getTranslate","lerped","amt","lerp","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.mjs b/dist/locomotive-scroll.mjs index 6fa4fad6..26592589 100644 --- a/dist/locomotive-scroll.mjs +++ b/dist/locomotive-scroll.mjs @@ -1,2 +1,2 @@ -import t from"@studio-freight/lenis";function e(){return e=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function n(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function o(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var r,o=i(this.progressModularModules);!(r=o()).done;){var l=r.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,r=i(t);!(s=r()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=o([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),a=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],c=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new r({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new r({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,r=i(this.RAFScrollElements);!(e=r()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,r=t.smooth,n=i(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:r})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=i(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function n(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function o(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var r,o=i(this.progressModularModules);!(r=o()).done;){var l=r.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,l.moduleName,l.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,r=i(t);!(s=r()).done;){var n=this.$el.dataset[s.value];if(!n)return;for(var o,l=i(e);!(o=l()).done;){var a=o.value;n in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:n})}}}},e._getScrollCallFrom=function(){var t=o([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),a=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],c=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new r({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new r({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,r=i(this.RAFScrollElements);!(e=r()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,r=t.smooth,n=i(this.scrollElementsToUpdate);!(e=n()).done;)e.value.onRender({currentScroll:s,smooth:r})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: HTMLElement) {\n const translate = {x: 0, y: 0};\n \n const transform = el.style.transform \n\n let matches = transform.match(/translate3d\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","matches","style","transform","match","parts","split","getTranslate","lerped","amt","lerp","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.modern.mjs b/dist/locomotive-scroll.modern.mjs index 3bb56ace..f951caaa 100644 --- a/dist/locomotive-scroll.modern.mjs +++ b/dist/locomotive-scroll.modern.mjs @@ -1,2 +1,2 @@ -import t from"@studio-freight/lenis";function s(){return s=Object.assign?Object.assign.bind():function(t){for(var s=1;s{t.forEach(t=>{const s=this.scrollElements.find(s=>s.$el===t.target);t.isIntersecting?(s&&(s.isAlreadyIntersected=!0),this._setInview(t)):s&&s.isAlreadyIntersected&&this._setOutOfView(t)})},{rootMargin:this.rootMargin});for(const t of this.scrollElements)this.observe(t.$el)}destroy(){this.observer.disconnect()}observe(t){t&&this.observer.observe(t)}unobserve(t){t&&this.observer.unobserve(t)}_setInview(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOn()),!this.IORaf&&(null==s||s.setInview())}_setOutOfView(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOff()),!this.IORaf&&(null==s||s.setOutOfView()),null!=s&&s.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)}}function i(t,s,e,i,r){return e+((r-t)/(s-t)*(i-e)||0)}function r(t,s){return t.reduce((t,e)=>Math.abs(e-s)1?1:e;var e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(const t of this.progressModularModules)this.modularInstance&&this.modularInstance.call("onScrollProgress",s,t.moduleName,t.moduleId);s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}}_setCssProgress(t=0){this.$el.style.setProperty("--progress",t.toString())}_setCustomEventProgress(t=0){const s=this.attributes.scrollEventProgress;if(!s)return;const e=new CustomEvent(s,{detail:{target:this.$el,progress:t}});window.dispatchEvent(e)}_getProgressModularModules(){if(!this.modularInstance)return;const t=Object.keys(this.$el.dataset).filter(t=>t.includes("module")),s=Object.entries(this.modularInstance.modules);if(t.length)for(const e of t){const t=this.$el.dataset[e];if(!t)return;for(const e of s){const[s,i]=e;t in i&&this.progressModularModules.push({moduleName:s,moduleId:t})}}}_getScrollCallFrom(){const t=r([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"}_dispatchCall(t,s){var e,i;const r=null==(e=this.attributes.scrollCall)?void 0:e.split(","),l=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var n;const[e,i,o]=r;let a;a=l?this.$el.dataset[`module${i.trim()}`]:o,this.modularInstance&&this.modularInstance.call(e.trim(),{target:this.$el,way:t,from:s},i.trim(),null==(n=a)?void 0:n.trim())}else if(r){const[e]=r,i=new CustomEvent(e,{detail:{target:this.$el,way:t,from:s}});window.dispatchEvent(i)}}}const n=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"];class o{constructor({$el:t,modularInstance:s,triggerRootMargin:e,rafRootMargin:i,scrollOrientation:r}){this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,t?(this.$scrollContainer=t,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=e?e:"-1px -1px -1px -1px",this.rafRootMargin=null!=i?i:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}_init(){const t=this.$scrollContainer.querySelectorAll("[data-scroll]"),s=Array.from(t);this._subscribeScrollElements(s),this.IOTriggerInstance=new e({scrollElements:[...this.triggeredScrollElements],rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new e({scrollElements:[...this.RAFScrollElements],rootMargin:this.rafRootMargin,IORaf:!0})}destroy(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()}onResize({currentScroll:t}){for(const s of this.RAFScrollElements)s.onResize({currentScroll:t})}onRender({currentScroll:t,smooth:s}){for(const e of this.scrollElementsToUpdate)e.onRender({currentScroll:t,smooth:s})}removeScrollElements(t){const s=t.querySelectorAll("[data-scroll]");if(s.length){for(let t=0;t-1&&(this.IOTriggerInstance.unobserve(e.$el),this.triggeredScrollElements.splice(t,1))}for(let t=0;t-1&&(this.IORafInstance.unobserve(e.$el),this.RAFScrollElements.splice(t,1))}s.forEach(t=>{const s=this.scrollElementsToUpdate.find(s=>s.$el===t),e=this.scrollElements.find(s=>s.$el===t);s&&this._unsubscribeElementUpdate(s),e&&(this.scrollElements=this.scrollElements.filter(t=>t.id!=e.id))})}}addScrollElements(t){const s=t.querySelectorAll("[data-scroll]"),e=[];this.scrollElements.forEach(t=>{e.push(t.id)});const i=Math.max(...e)+1,r=Array.from(s);this._subscribeScrollElements(r,i,!0)}_subscribeScrollElements(t,s=0,e=!1){for(let i=0;is.id!=t.id)}_checkRafNeeded(t){let s=[...n];const e=t=>{s=s.filter(s=>s!=t)};if(t.dataset.scrollOffset){if("0,0"!=t.dataset.scrollOffset.split(",").map(t=>t.replace("%","").trim()).join(","))return!0;e("scrollOffset")}else e("scrollOffset");if(t.dataset.scrollPosition){if("top,bottom"!=t.dataset.scrollPosition.trim())return!0;e("scrollPosition")}else e("scrollPosition");if(t.dataset.scrollSpeed&&!isNaN(parseFloat(t.dataset.scrollSpeed)))return!0;e("scrollSpeed");for(const e of s)if(e in t.dataset)return!0;return!1}}class a{constructor({resizeElements:t,resizeCallback:s=(()=>{})}){this.$resizeElements=void 0,this.isFirstObserve=void 0,this.observer=void 0,this.resizeCallback=void 0,this.$resizeElements=t,this.resizeCallback=s,this.isFirstObserve=!0,this._init()}_init(){this.observer=new ResizeObserver(t=>{var s;!this.isFirstObserve&&(null==(s=this.resizeCallback)||s.call(this)),this.isFirstObserve=!1});for(const t of this.$resizeElements)this.observer.observe(t)}destroy(){this.observer.disconnect()}}const c={wrapper:window,content:document.documentElement,eventsTarget:window,lerp:.1,duration:.75,orientation:"vertical",gestureOrientation:"vertical",smoothWheel:!0,smoothTouch:!1,syncTouch:!1,syncTouchLerp:.1,touchInertiaMultiplier:35,wheelMultiplier:1,touchMultiplier:2,normalizeWheel:!1,autoResize:!0,easing:t=>Math.min(1,1.001-Math.pow(2,-10*t))};class h{constructor({lenisOptions:t={},modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l=!0,autoStart:n=!0,scrollCallback:o=(()=>{}),initCustomTicker:a,destroyCustomTicker:h}={}){this.rafPlaying=void 0,this.lenisInstance=void 0,this.coreInstance=void 0,this.lenisOptions=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.rafInstance=void 0,this.autoResize=void 0,this.autoStart=void 0,this.ROInstance=void 0,this.initCustomTicker=void 0,this.destroyCustomTicker=void 0,this._onRenderBind=void 0,this._onResizeBind=void 0,this._onScrollToBind=void 0,this.lenisOptions=s({},c,t),Object.assign(this,{lenisOptions:t,modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l,autoStart:n,scrollCallback:o,initCustomTicker:a,destroyCustomTicker:h}),this._onRenderBind=this._onRender.bind(this),this._onScrollToBind=this._onScrollTo.bind(this),this._onResizeBind=this._onResize.bind(this),this.rafPlaying=!1,this._init()}_init(){var s;this.lenisInstance=new t({wrapper:this.lenisOptions.wrapper,content:this.lenisOptions.content,eventsTarget:this.lenisOptions.eventsTarget,lerp:this.lenisOptions.lerp,duration:this.lenisOptions.duration,orientation:this.lenisOptions.orientation,gestureOrientation:this.lenisOptions.gestureOrientation,smoothWheel:this.lenisOptions.smoothWheel,smoothTouch:this.lenisOptions.smoothTouch,syncTouch:this.lenisOptions.syncTouch,syncTouchLerp:this.lenisOptions.syncTouchLerp,touchInertiaMultiplier:this.lenisOptions.touchInertiaMultiplier,wheelMultiplier:this.lenisOptions.wheelMultiplier,touchMultiplier:this.lenisOptions.touchMultiplier,normalizeWheel:this.lenisOptions.normalizeWheel,easing:this.lenisOptions.easing}),null==(s=this.lenisInstance)||s.on("scroll",this.scrollCallback),document.documentElement.setAttribute("data-scroll-orientation",this.lenisInstance.options.orientation),requestAnimationFrame(()=>{this.coreInstance=new o({$el:this.lenisInstance.rootElement,modularInstance:this.modularInstance,triggerRootMargin:this.triggerRootMargin,rafRootMargin:this.rafRootMargin,scrollOrientation:this.lenisInstance.options.orientation}),this._bindEvents(),this.initCustomTicker&&!this.destroyCustomTicker?console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble."):!this.initCustomTicker&&this.destroyCustomTicker&&console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."),this.autoStart&&this.start()})}destroy(){var t;this.stop(),this._unbindEvents(),this.lenisInstance.destroy(),null==(t=this.coreInstance)||t.destroy(),requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.destroy()})}_bindEvents(){this._bindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance=new a({resizeElements:[document.body],resizeCallback:this._onResizeBind}):window.addEventListener("resize",this._onResizeBind))}_unbindEvents(){this._unbindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance&&this.ROInstance.destroy():window.removeEventListener("resize",this._onResizeBind))}_bindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.addEventListener("click",this._onScrollToBind,!1)})}_unbindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.removeEventListener("click",this._onScrollToBind,!1)})}_onResize(){requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.onResize({currentScroll:this.lenisInstance.scroll})})}_onRender(){var t,s;null==(t=this.lenisInstance)||t.raf(Date.now()),null==(s=this.coreInstance)||s.onRender({currentScroll:this.lenisInstance.scroll,smooth:this.lenisInstance.isSmooth})}_onScrollTo(t){var s;t.preventDefault();const e=null!=(s=t.currentTarget)?s:null;if(!e)return;const i=e.getAttribute("data-scroll-to-href")||e.getAttribute("href"),r=e.getAttribute("data-scroll-to-offset")||0,l=e.getAttribute("data-scroll-to-duration")||this.lenisOptions.duration||c.duration;i&&this.scrollTo(i,{offset:"string"==typeof r?parseInt(r):r,duration:"string"==typeof l?parseInt(l):l})}start(){var t;this.rafPlaying||(null==(t=this.lenisInstance)||t.start(),this.rafPlaying=!0,this.initCustomTicker?this.initCustomTicker(this._onRenderBind):this._raf())}stop(){var t;this.rafPlaying&&(null==(t=this.lenisInstance)||t.stop(),this.rafPlaying=!1,this.destroyCustomTicker?this.destroyCustomTicker(this._onRenderBind):this.rafInstance&&cancelAnimationFrame(this.rafInstance))}removeScrollElements(t){var s;t?(this._unbindScrollToEvents(t),null==(s=this.coreInstance)||s.removeScrollElements(t)):console.error("Please provide a DOM Element as $oldContainer")}addScrollElements(t){var s;t?(null==(s=this.coreInstance)||s.addScrollElements(t),requestAnimationFrame(()=>{this._bindScrollToEvents(t)})):console.error("Please provide a DOM Element as $newContainer")}resize(){this._onResizeBind()}scrollTo(t,s){var e;null==(e=this.lenisInstance)||e.scrollTo(t,{offset:null==s?void 0:s.offset,lerp:null==s?void 0:s.lerp,duration:null==s?void 0:s.duration,immediate:null==s?void 0:s.immediate,lock:null==s?void 0:s.lock,force:null==s?void 0:s.force,easing:null==s?void 0:s.easing,onComplete:null==s?void 0:s.onComplete})}_raf(){this._onRenderBind(),this.rafInstance=requestAnimationFrame(()=>this._raf())}}export{h as default}; +import t from"@studio-freight/lenis";function s(){return s=Object.assign?Object.assign.bind():function(t){for(var s=1;s{t.forEach(t=>{const s=this.scrollElements.find(s=>s.$el===t.target);t.isIntersecting?(s&&(s.isAlreadyIntersected=!0),this._setInview(t)):s&&s.isAlreadyIntersected&&this._setOutOfView(t)})},{rootMargin:this.rootMargin});for(const t of this.scrollElements)this.observe(t.$el)}destroy(){this.observer.disconnect()}observe(t){t&&this.observer.observe(t)}unobserve(t){t&&this.observer.unobserve(t)}_setInview(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOn()),!this.IORaf&&(null==s||s.setInview())}_setOutOfView(t){const s=this.scrollElements.find(s=>s.$el===t.target);this.IORaf&&(null==s||s.setInteractivityOff()),!this.IORaf&&(null==s||s.setOutOfView()),null!=s&&s.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)}}function i(t,s,e,i,r){return e+((r-t)/(s-t)*(i-e)||0)}function r(t,s){return t.reduce((t,e)=>Math.abs(e-s)1?1:e;var e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(const t of this.progressModularModules)this.modularInstance&&this.modularInstance.call("onScrollProgress",s,t.moduleName,t.moduleId);s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}}_setCssProgress(t=0){this.$el.style.setProperty("--progress",t.toString())}_setCustomEventProgress(t=0){const s=this.attributes.scrollEventProgress;if(!s)return;const e=new CustomEvent(s,{detail:{target:this.$el,progress:t}});window.dispatchEvent(e)}_getProgressModularModules(){if(!this.modularInstance)return;const t=Object.keys(this.$el.dataset).filter(t=>t.includes("module")),s=Object.entries(this.modularInstance.modules);if(t.length)for(const e of t){const t=this.$el.dataset[e];if(!t)return;for(const e of s){const[s,i]=e;t in i&&this.progressModularModules.push({moduleName:s,moduleId:t})}}}_getScrollCallFrom(){const t=r([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"}_dispatchCall(t,s){var e,i;const r=null==(e=this.attributes.scrollCall)?void 0:e.split(","),l=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var n;const[e,i,o]=r;let a;a=l?this.$el.dataset[`module${i.trim()}`]:o,this.modularInstance&&this.modularInstance.call(e.trim(),{target:this.$el,way:t,from:s},i.trim(),null==(n=a)?void 0:n.trim())}else if(r){const[e]=r,i=new CustomEvent(e,{detail:{target:this.$el,way:t,from:s}});window.dispatchEvent(i)}}}const n=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"];class o{constructor({$el:t,modularInstance:s,triggerRootMargin:e,rafRootMargin:i,scrollOrientation:r}){this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,t?(this.$scrollContainer=t,this.modularInstance=s,this.scrollOrientation=r,this.triggerRootMargin=null!=e?e:"-1px -1px -1px -1px",this.rafRootMargin=null!=i?i:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}_init(){const t=this.$scrollContainer.querySelectorAll("[data-scroll]"),s=Array.from(t);this._subscribeScrollElements(s),this.IOTriggerInstance=new e({scrollElements:[...this.triggeredScrollElements],rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new e({scrollElements:[...this.RAFScrollElements],rootMargin:this.rafRootMargin,IORaf:!0})}destroy(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()}onResize({currentScroll:t}){for(const s of this.RAFScrollElements)s.onResize({currentScroll:t})}onRender({currentScroll:t,smooth:s}){for(const e of this.scrollElementsToUpdate)e.onRender({currentScroll:t,smooth:s})}removeScrollElements(t){const s=t.querySelectorAll("[data-scroll]");if(s.length){for(let t=0;t-1&&(this.IOTriggerInstance.unobserve(e.$el),this.triggeredScrollElements.splice(t,1))}for(let t=0;t-1&&(this.IORafInstance.unobserve(e.$el),this.RAFScrollElements.splice(t,1))}s.forEach(t=>{const s=this.scrollElementsToUpdate.find(s=>s.$el===t),e=this.scrollElements.find(s=>s.$el===t);s&&this._unsubscribeElementUpdate(s),e&&(this.scrollElements=this.scrollElements.filter(t=>t.id!=e.id))})}}addScrollElements(t){const s=t.querySelectorAll("[data-scroll]"),e=[];this.scrollElements.forEach(t=>{e.push(t.id)});const i=Math.max(...e)+1,r=Array.from(s);this._subscribeScrollElements(r,i,!0)}_subscribeScrollElements(t,s=0,e=!1){for(let i=0;is.id!=t.id)}_checkRafNeeded(t){let s=[...n];const e=t=>{s=s.filter(s=>s!=t)};if(t.dataset.scrollOffset){if("0,0"!=t.dataset.scrollOffset.split(",").map(t=>t.replace("%","").trim()).join(","))return!0;e("scrollOffset")}else e("scrollOffset");if(t.dataset.scrollPosition){if("top,bottom"!=t.dataset.scrollPosition.trim())return!0;e("scrollPosition")}else e("scrollPosition");if(t.dataset.scrollSpeed&&!isNaN(parseFloat(t.dataset.scrollSpeed)))return!0;e("scrollSpeed");for(const e of s)if(e in t.dataset)return!0;return!1}}class a{constructor({resizeElements:t,resizeCallback:s=(()=>{})}){this.$resizeElements=void 0,this.isFirstObserve=void 0,this.observer=void 0,this.resizeCallback=void 0,this.$resizeElements=t,this.resizeCallback=s,this.isFirstObserve=!0,this._init()}_init(){this.observer=new ResizeObserver(t=>{var s;!this.isFirstObserve&&(null==(s=this.resizeCallback)||s.call(this)),this.isFirstObserve=!1});for(const t of this.$resizeElements)this.observer.observe(t)}destroy(){this.observer.disconnect()}}const c={wrapper:window,content:document.documentElement,eventsTarget:window,lerp:.1,duration:.75,orientation:"vertical",gestureOrientation:"vertical",smoothWheel:!0,smoothTouch:!1,syncTouch:!1,syncTouchLerp:.1,touchInertiaMultiplier:35,wheelMultiplier:1,touchMultiplier:2,normalizeWheel:!1,autoResize:!0,easing:t=>Math.min(1,1.001-Math.pow(2,-10*t))};class h{constructor({lenisOptions:t={},modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l=!0,autoStart:n=!0,scrollCallback:o=(()=>{}),initCustomTicker:a,destroyCustomTicker:h}={}){this.rafPlaying=void 0,this.lenisInstance=void 0,this.coreInstance=void 0,this.lenisOptions=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.rafInstance=void 0,this.autoResize=void 0,this.autoStart=void 0,this.ROInstance=void 0,this.initCustomTicker=void 0,this.destroyCustomTicker=void 0,this._onRenderBind=void 0,this._onResizeBind=void 0,this._onScrollToBind=void 0,this.lenisOptions=s({},c,t),Object.assign(this,{lenisOptions:t,modularInstance:e,triggerRootMargin:i,rafRootMargin:r,autoResize:l,autoStart:n,scrollCallback:o,initCustomTicker:a,destroyCustomTicker:h}),this._onRenderBind=this._onRender.bind(this),this._onScrollToBind=this._onScrollTo.bind(this),this._onResizeBind=this._onResize.bind(this),this.rafPlaying=!1,this._init()}_init(){var s;this.lenisInstance=new t({wrapper:this.lenisOptions.wrapper,content:this.lenisOptions.content,eventsTarget:this.lenisOptions.eventsTarget,lerp:this.lenisOptions.lerp,duration:this.lenisOptions.duration,orientation:this.lenisOptions.orientation,gestureOrientation:this.lenisOptions.gestureOrientation,smoothWheel:this.lenisOptions.smoothWheel,smoothTouch:this.lenisOptions.smoothTouch,syncTouch:this.lenisOptions.syncTouch,syncTouchLerp:this.lenisOptions.syncTouchLerp,touchInertiaMultiplier:this.lenisOptions.touchInertiaMultiplier,wheelMultiplier:this.lenisOptions.wheelMultiplier,touchMultiplier:this.lenisOptions.touchMultiplier,normalizeWheel:this.lenisOptions.normalizeWheel,easing:this.lenisOptions.easing}),null==(s=this.lenisInstance)||s.on("scroll",this.scrollCallback),document.documentElement.setAttribute("data-scroll-orientation",this.lenisInstance.options.orientation),requestAnimationFrame(()=>{this.coreInstance=new o({$el:this.lenisInstance.rootElement,modularInstance:this.modularInstance,triggerRootMargin:this.triggerRootMargin,rafRootMargin:this.rafRootMargin,scrollOrientation:this.lenisInstance.options.orientation}),this._bindEvents(),this.initCustomTicker&&!this.destroyCustomTicker?console.warn("initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble."):!this.initCustomTicker&&this.destroyCustomTicker&&console.warn("destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble."),this.autoStart&&this.start()})}destroy(){var t;this.stop(),this._unbindEvents(),this.lenisInstance.destroy(),null==(t=this.coreInstance)||t.destroy(),requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.destroy()})}_bindEvents(){this._bindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance=new a({resizeElements:[document.body],resizeCallback:this._onResizeBind}):window.addEventListener("resize",this._onResizeBind))}_unbindEvents(){this._unbindScrollToEvents(),this.autoResize&&("ResizeObserver"in window?this.ROInstance&&this.ROInstance.destroy():window.removeEventListener("resize",this._onResizeBind))}_bindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.addEventListener("click",this._onScrollToBind,!1)})}_unbindScrollToEvents(t){const s=t||this.lenisInstance.rootElement,e=null==s?void 0:s.querySelectorAll("[data-scroll-to]");(null==e?void 0:e.length)&&e.forEach(t=>{t.removeEventListener("click",this._onScrollToBind,!1)})}_onResize(){requestAnimationFrame(()=>{var t;null==(t=this.coreInstance)||t.onResize({currentScroll:this.lenisInstance.scroll})})}_onRender(){var t,s;null==(t=this.lenisInstance)||t.raf(Date.now()),null==(s=this.coreInstance)||s.onRender({currentScroll:this.lenisInstance.scroll,smooth:this.lenisInstance.isSmooth})}_onScrollTo(t){var s;t.preventDefault();const e=null!=(s=t.currentTarget)?s:null;if(!e)return;const i=e.getAttribute("data-scroll-to-href")||e.getAttribute("href"),r=e.getAttribute("data-scroll-to-offset")||0,l=e.getAttribute("data-scroll-to-duration")||this.lenisOptions.duration||c.duration;i&&this.scrollTo(i,{offset:"string"==typeof r?parseInt(r):r,duration:"string"==typeof l?parseInt(l):l})}start(){var t;this.rafPlaying||(null==(t=this.lenisInstance)||t.start(),this.rafPlaying=!0,this.initCustomTicker?this.initCustomTicker(this._onRenderBind):this._raf())}stop(){var t;this.rafPlaying&&(null==(t=this.lenisInstance)||t.stop(),this.rafPlaying=!1,this.destroyCustomTicker?this.destroyCustomTicker(this._onRenderBind):this.rafInstance&&cancelAnimationFrame(this.rafInstance))}removeScrollElements(t){var s;t?(this._unbindScrollToEvents(t),null==(s=this.coreInstance)||s.removeScrollElements(t)):console.error("Please provide a DOM Element as $oldContainer")}addScrollElements(t){var s;t?(null==(s=this.coreInstance)||s.addScrollElements(t),requestAnimationFrame(()=>{this._bindScrollToEvents(t)})):console.error("Please provide a DOM Element as $newContainer")}resize(){this._onResizeBind()}scrollTo(t,s){var e;null==(e=this.lenisInstance)||e.scrollTo(t,{offset:null==s?void 0:s.offset,lerp:null==s?void 0:s.lerp,duration:null==s?void 0:s.duration,immediate:null==s?void 0:s.immediate,lock:null==s?void 0:s.lock,force:null==s?void 0:s.force,easing:null==s?void 0:s.easing,onComplete:null==s?void 0:s.onComplete})}_raf(){this._onRenderBind(),this.rafInstance=requestAnimationFrame(()=>this._raf())}}export{h as default}; //# sourceMappingURL=locomotive-scroll.modern.mjs.map diff --git a/dist/locomotive-scroll.modern.mjs.map b/dist/locomotive-scroll.modern.mjs.map index 795526b8..70dea69f 100644 --- a/dist/locomotive-scroll.modern.mjs.map +++ b/dist/locomotive-scroll.modern.mjs.map @@ -1 +1 @@ -{"version":3,"file":"locomotive-scroll.modern.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","constructor","scrollElements","rootMargin","IORaf","this","observer","_init","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","scrollElement","observe","destroy","disconnect","$scrollElement","unobserve","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","value","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","onRender","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","top","left","height","width","metricsSize","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","modulesIdName","module","moduleObj","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","func","targetModuleId","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","_this$resizeCallback","$resizeElement","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","lenisOptions","autoStart","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","stop","_unbindEvents","_this$coreInstance2","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","$rootContainer","$scrollToElements","_this$coreInstance3","scroll","_this$lenisInstance2","_this$coreInstance4","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance5","_this$coreInstance6","resize","_this$lenisInstance5","immediate","lock","force","onComplete"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.modern.mjs","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: HTMLElement) {\n const translate = {x: 0, y: 0};\n \n const transform = el.style.transform \n\n let matches = transform.match(/translate3d\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","constructor","scrollElements","rootMargin","IORaf","this","observer","_init","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","scrollElement","observe","destroy","disconnect","$scrollElement","unobserve","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","value","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","onRender","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","matches","style","transform","match","parts","split","getTranslate","lerped","amt","lerp","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","top","left","height","width","metricsSize","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","modulesIdName","module","moduleObj","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","func","targetModuleId","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","_this$resizeCallback","$resizeElement","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","lenisOptions","autoStart","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","stop","_unbindEvents","_this$coreInstance2","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","$rootContainer","$scrollToElements","_this$coreInstance3","scroll","_this$lenisInstance2","_this$coreInstance4","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance5","_this$coreInstance6","resize","_this$lenisInstance5","immediate","lock","force","onComplete"],"mappings":"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"} \ No newline at end of file diff --git a/dist/locomotive-scroll.umd.js b/dist/locomotive-scroll.umd.js index b2913fdc..e57bfdf6 100644 --- a/dist/locomotive-scroll.umd.js +++ b/dist/locomotive-scroll.umd.js @@ -1,3 +1,3 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@studio-freight/lenis")):"function"==typeof define&&define.amd?define(["@studio-freight/lenis"],e):(t||self).locomotiveScroll=e(t.Lenis)}(this,function(t){function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var s=/*#__PURE__*/e(t);function i(){return i=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=n(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function l(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function a(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,r=n(this.progressModularModules);!(i=r()).done;){var o=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=n(t);!(s=i()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=n(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=a([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),h=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],u=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new o({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new o({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=n(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,r=n(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;it.length)&&(e=t.length);for(var s=0,i=new Array(e);s=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o=/*#__PURE__*/function(){function t(t){var e=t.scrollElements,s=t.rootMargin,i=void 0===s?"-1px -1px -1px -1px":s,r=t.IORaf;this.scrollElements=void 0,this.rootMargin=void 0,this.IORaf=void 0,this.observer=void 0,this.scrollElements=e,this.rootMargin=i,this.IORaf=r,this._init()}var e=t.prototype;return e._init=function(){var t=this;this.observer=new IntersectionObserver(function(e){e.forEach(function(e){var s=t.scrollElements.find(function(t){return t.$el===e.target});e.isIntersecting?(s&&(s.isAlreadyIntersected=!0),t._setInview(e)):s&&s.isAlreadyIntersected&&t._setOutOfView(e)})},{rootMargin:this.rootMargin});for(var e,s=n(this.scrollElements);!(e=s()).done;)this.observe(e.value.$el)},e.destroy=function(){this.observer.disconnect()},e.observe=function(t){t&&this.observer.observe(t)},e.unobserve=function(t){t&&this.observer.unobserve(t)},e._setInview=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOn()),!this.IORaf&&(null==e||e.setInview())},e._setOutOfView=function(t){var e=this.scrollElements.find(function(e){return e.$el===t.target});this.IORaf&&(null==e||e.setInteractivityOff()),!this.IORaf&&(null==e||e.setOutOfView()),null!=e&&e.attributes.scrollRepeat||this.IORaf||this.unobserve(t.target)},t}();function l(t,e,s,i,r){return s+((r-t)/(e-t)*(i-s)||0)}function a(t,e){return t.reduce(function(t,s){return Math.abs(s-e)1?1:e;if(this.progress=s,s!=this.lastProgress){if(this.lastProgress=s,this.attributes.scrollCssProgress&&this._setCssProgress(s),this.attributes.scrollEventProgress&&this._setCustomEventProgress(s),this.attributes.scrollModuleProgress)for(var i,r=n(this.progressModularModules);!(i=r()).done;){var o=i.value;this.modularInstance&&this.modularInstance.call("onScrollProgress",s,o.moduleName,o.moduleId)}s>0&&s<1&&this.setInview(),0===s&&this.setOutOfView(),1===s&&this.setOutOfView()}},e._setCssProgress=function(t){void 0===t&&(t=0),this.$el.style.setProperty("--progress",t.toString())},e._setCustomEventProgress=function(t){void 0===t&&(t=0);var e=this.attributes.scrollEventProgress;if(e){var s=new CustomEvent(e,{detail:{target:this.$el,progress:t}});window.dispatchEvent(s)}},e._getProgressModularModules=function(){if(this.modularInstance){var t=Object.keys(this.$el.dataset).filter(function(t){return t.includes("module")}),e=Object.entries(this.modularInstance.modules);if(t.length)for(var s,i=n(t);!(s=i()).done;){var r=this.$el.dataset[s.value];if(!r)return;for(var o,l=n(e);!(o=l()).done;){var a=o.value;r in a[1]&&this.progressModularModules.push({moduleName:a[0],moduleId:r})}}}},e._getScrollCallFrom=function(){var t=a([this.intersection.start,this.intersection.end],this.currentScroll);return this.intersection.start===t?"start":"end"},e._dispatchCall=function(t,e){var s,i,r=null==(s=this.attributes.scrollCall)?void 0:s.split(","),n=null==(i=this.attributes)?void 0:i.scrollCallSelf;if(r&&r.length>1){var o,l,a=r[0],c=r[1],h=r[2];l=n?this.$el.dataset["module"+c.trim()]:h,this.modularInstance&&this.modularInstance.call(a.trim(),{target:this.$el,way:t,from:e},c.trim(),null==(o=l)?void 0:o.trim())}else if(r){var u=new CustomEvent(r[0],{detail:{target:this.$el,way:t,from:e}});window.dispatchEvent(u)}},t}(),h=["scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed"],u=/*#__PURE__*/function(){function t(t){var e=t.$el,s=t.modularInstance,i=t.triggerRootMargin,r=t.rafRootMargin,n=t.scrollOrientation;this.$scrollContainer=void 0,this.modularInstance=void 0,this.triggerRootMargin=void 0,this.rafRootMargin=void 0,this.scrollElements=void 0,this.triggeredScrollElements=void 0,this.RAFScrollElements=void 0,this.scrollElementsToUpdate=void 0,this.IOTriggerInstance=void 0,this.IORafInstance=void 0,this.scrollOrientation=void 0,e?(this.$scrollContainer=e,this.modularInstance=s,this.scrollOrientation=n,this.triggerRootMargin=null!=i?i:"-1px -1px -1px -1px",this.rafRootMargin=null!=r?r:"100% 100% 100% 100%",this.scrollElements=[],this.triggeredScrollElements=[],this.RAFScrollElements=[],this.scrollElementsToUpdate=[],this._init()):console.error("Please provide a DOM Element as scrollContainer")}var e=t.prototype;return e._init=function(){var t=this.$scrollContainer.querySelectorAll("[data-scroll]"),e=Array.from(t);this._subscribeScrollElements(e),this.IOTriggerInstance=new o({scrollElements:[].concat(this.triggeredScrollElements),rootMargin:this.triggerRootMargin,IORaf:!1}),this.IORafInstance=new o({scrollElements:[].concat(this.RAFScrollElements),rootMargin:this.rafRootMargin,IORaf:!0})},e.destroy=function(){this.IOTriggerInstance.destroy(),this.IORafInstance.destroy(),this._unsubscribeAllScrollElements()},e.onResize=function(t){for(var e,s=t.currentScroll,i=n(this.RAFScrollElements);!(e=i()).done;)e.value.onResize({currentScroll:s})},e.onRender=function(t){for(var e,s=t.currentScroll,i=t.smooth,r=n(this.scrollElementsToUpdate);!(e=r()).done;)e.value.onRender({currentScroll:s,smooth:i})},e.removeScrollElements=function(t){var e=this,s=t.querySelectorAll("[data-scroll]");if(s.length){for(var i=0;i-1&&(this.IOTriggerInstance.unobserve(r.$el),this.triggeredScrollElements.splice(i,1))}for(var n=0;n-1&&(this.IORafInstance.unobserve(o.$el),this.RAFScrollElements.splice(n,1))}s.forEach(function(t){var s=e.scrollElementsToUpdate.find(function(e){return e.$el===t}),i=e.scrollElements.find(function(e){return e.$el===t});s&&e._unsubscribeElementUpdate(s),i&&(e.scrollElements=e.scrollElements.filter(function(t){return t.id!=i.id}))})}},e.addScrollElements=function(t){var e=t.querySelectorAll("[data-scroll]"),s=[];this.scrollElements.forEach(function(t){s.push(t.id)});var i=Math.max.apply(Math,s)+1,r=Array.from(e);this._subscribeScrollElements(r,i,!0)},e._subscribeScrollElements=function(t,e,s){void 0===e&&(e=0),void 0===s&&(s=!1);for(var i=0;i {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: Element) {\n const translate = {x: 0, y: 0};\n\n if (!window.getComputedStyle) return translate;\n\n const style = getComputedStyle(el);\n const transform = style.transform \n\n let matches = transform.match(/translate\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","getComputedStyle","matches","transform","match","parts","split","getTranslate","lerped","amt","lerp","style","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"locomotive-scroll.umd.js","sources":["../src/core/IO.ts","../src/utils/maths.ts","../src/core/ScrollElement.ts","../src/utils/translate.ts","../src/core/Core.ts","../src/core/RO.ts","../src/index.ts"],"sourcesContent":["/**\n * Intersection Observer\n *\n * Detecting visibility of an element in the viewport.\n *\n * Features functions to:\n *\n * - Trigger inview/outOfView callbacks\n * - If the element has a requestAnimationFrame dependency, set interactivy status for the ScrollElement Class\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API}\n */\n\nimport { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n public scrollElements: ScrollElement[];\n private rootMargin: string;\n private IORaf: boolean;\n private observer!: IntersectionObserver;\n\n constructor({\n scrollElements,\n rootMargin = '-1px -1px -1px -1px',\n IORaf,\n }: IIOOptions) {\n // Parameters\n this.scrollElements = scrollElements;\n this.rootMargin = rootMargin;\n this.IORaf = IORaf;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Intersection Observer.\n *\n * @private\n */\n private _init() {\n // Options\n const observerOptions = {\n rootMargin: this.rootMargin,\n };\n\n // Callback\n const onIntersect = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n const $targetItem: ScrollElement | undefined =\n this.scrollElements.find(\n (item) => item.$el === entry.target\n );\n\n if (entry.isIntersecting) {\n $targetItem && ($targetItem.isAlreadyIntersected = true);\n this._setInview(entry);\n } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n this._setOutOfView(entry);\n }\n });\n };\n\n // Instance\n this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n // Observe each default elements\n for (const scrollElement of this.scrollElements) {\n const $scrollElement = scrollElement.$el;\n this.observe($scrollElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Intersection Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n\n /**\n * Subscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to observe.\n */\n public observe($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.observe($scrollElement);\n }\n\n /**\n * Unsubscribe element to the Intersection Observer.\n *\n * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n */\n public unobserve($scrollElement: HTMLElement) {\n if (!$scrollElement) {\n return;\n }\n\n this.observer.unobserve($scrollElement);\n }\n\n /**\n * Find ScrollElementReference instance and trigger inview callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setInview(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOn();\n !this.IORaf && scrollElement?.setInview();\n }\n\n /**\n * Find ScrollElementReference instance and trigger out of view callbacks.\n *\n * @private\n *\n * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n */\n private _setOutOfView(entry: IntersectionObserverEntry) {\n const scrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === entry.target\n );\n\n this.IORaf && scrollElement?.setInteractivityOff();\n !this.IORaf && scrollElement?.setOutOfView();\n\n // Unobserve if element doesn't have repeat attribute\n if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n this.unobserve(entry.target as HTMLElement);\n }\n }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min - Minimum value expected.\n * @param {number} max - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin - Current minimum value.\n * @param {number} inMax - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n value: number\n): number {\n const inRange = inMax - inMin;\n const outRange = outMax - outMin;\n return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min - Current minimum value.\n * @param {number} max - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array - Numbers array.\n * @param {number} target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n return array.reduce((prev, curr) => {\n return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n });\n}\n\n\n/**\n * Linear interpolation between two numbers.\n * @param {number} start \n * @param {number} end \n * @param {number} amt \n * @returns {number}\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return (1 - amt) * start + amt * end;\n}","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - scrollModuleProgress - Send scroll progress to modular module that have a specific method (PROGRESS_MODULAR_METHOD)\n * - scrollCssProgress - Add a specific css variable (PROGRESS_CSS_VAR) that store the scroll progress\n * - scrollEventProgress - Send scroll progress to custom event listeners.\n * - scrollSpeed - Add a scroll multiplicator to create a parallax effect\n * - scrollRepeat - Repeat the option to trigger animation each time the element is intersected\n * - scrollCall - Call a custom event or a modular callback when the element is intersected\n */\n\nimport {\n IModular,\n IScrollElementOptions,\n IScrollElementAttributes,\n IScrollElementIntersection,\n IScrollElementMetrics,\n IProgressModularModules,\n IScrollElementCallbacksValues,\n scrollCallWay,\n scrollCallFrom,\n scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange, lerp } from '../utils/maths';\nimport { getTranslate } from '../utils/translate';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\nconst PROGRESS_MODULAR_METHOD = 'onScrollProgress';\n\nexport default class ScrollElement {\n public $el: HTMLElement;\n public id: number;\n public needRaf: boolean;\n public attributes: IScrollElementAttributes;\n public scrollOrientation: scrollOrientation;\n public isAlreadyIntersected: boolean;\n\n private intersection: IScrollElementIntersection;\n private metrics: IScrollElementMetrics;\n private currentScroll: number;\n private translateValue: number;\n private progress: number;\n private lastProgress: number | null;\n private modularInstance?: IModular;\n private progressModularModules: IProgressModularModules[];\n private isInview: boolean;\n private isInteractive: boolean;\n private isInFold: boolean;\n private isFirstResize: boolean;\n\n private subscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n private unsubscribeElementUpdateFn: (scrollElement: ScrollElement) => void;\n\n constructor({\n $el,\n id,\n modularInstance,\n subscribeElementUpdateFn,\n unsubscribeElementUpdateFn,\n needRaf,\n scrollOrientation,\n }: IScrollElementOptions) {\n // Scroll DOM element\n this.$el = $el;\n // Unique ID\n this.id = id;\n // RAF option\n this.needRaf = needRaf;\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n // Modular.js\n this.modularInstance = modularInstance;\n // Parent's callbacks\n this.subscribeElementUpdateFn = subscribeElementUpdateFn;\n this.unsubscribeElementUpdateFn = unsubscribeElementUpdateFn;\n\n // Attributes\n this.attributes = {\n scrollClass: this.$el.dataset['scrollClass'] ?? INVIEW_CLASS,\n scrollOffset: this.$el.dataset['scrollOffset'] ?? '0,0',\n scrollPosition: this.$el.dataset['scrollPosition'] ?? 'start,end',\n scrollModuleProgress:\n this.$el.dataset['scrollModuleProgress'] != null,\n scrollCssProgress: this.$el.dataset['scrollCssProgress'] != null,\n scrollEventProgress:\n this.$el.dataset['scrollEventProgress'] ?? null,\n scrollSpeed:\n this.$el.dataset['scrollSpeed'] != null\n ? parseFloat(this.$el.dataset['scrollSpeed'])\n : null,\n scrollDelay:\n this.$el.dataset['scrollDelay'] != null\n ? parseFloat(this.$el.dataset['scrollDelay'])\n : null,\n scrollRepeat: this.$el.dataset['scrollRepeat'] != null,\n scrollCall: this.$el.dataset['scrollCall'] ?? null,\n scrollCallSelf: this.$el.dataset['scrollCallSelf'] != null,\n scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] != null,\n scrollEnableTouchSpeed:\n this.$el.dataset['scrollEnableTouchSpeed'] != null,\n };\n\n // Limits\n this.intersection = {\n start: 0,\n end: 0,\n };\n\n // Metrics\n this.metrics = {\n offsetStart: 0,\n offsetEnd: 0,\n bcr: {} as DOMRect,\n };\n\n // Scroll Values\n this.currentScroll =\n this.scrollOrientation === 'vertical'\n ? window.scrollY\n : window.scrollX;\n\n // Parallax\n this.translateValue = 0;\n\n // Progress\n this.progress = 0;\n this.lastProgress = null;\n this.progressModularModules = [];\n\n // Inview\n this.isInview = false;\n this.isInteractive = false;\n this.isAlreadyIntersected = false;\n this.isInFold = false;\n this.isFirstResize = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize progress tracking.\n *\n * @private\n */\n private _init() {\n if (!this.needRaf) {\n return;\n }\n\n // Prepare modules progress\n if (this.modularInstance && this.attributes.scrollModuleProgress) {\n this._getProgressModularModules();\n }\n\n // First resize to compute all values\n this._resize();\n }\n\n /**\n * Callback - Resize callback\n */\n public onResize({ currentScroll }: IScrollElementCallbacksValues) {\n this.currentScroll = currentScroll;\n this._resize();\n }\n\n /**\n * Callback - RAF callback\n */\n public onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n this.currentScroll = currentScroll;\n this._computeProgress();\n\n // Parallax\n if (\n this.attributes.scrollSpeed &&\n !isNaN(this.attributes.scrollSpeed)\n ) {\n // if touch detected or smooth disabled\n if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n if (this.translateValue) {\n this.$el.style.transform = `translate3d(0, 0, 0)`;\n }\n this.translateValue = 0;\n\n // if mousewheel or smooth enabled\n } else {\n // Check fold condition\n if (this.isInFold) {\n const progress = Math.max(0, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n } else {\n const progress = mapRange(0, 1, -1, 1, this.progress);\n this.translateValue =\n progress * wSize * this.attributes.scrollSpeed * -1;\n }\n\n if (this.attributes.scrollDelay) {\n const start = getTranslate(this.$el)\n\n const lerped = this.scrollOrientation == 'vertical' ?\n lerp(start.y, this.translateValue, this.attributes.scrollDelay) :\n lerp(start.x, this.translateValue, this.attributes.scrollDelay)\n\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${lerped}px, 0)`\n : `translate3d(${lerped}px, 0, 0)`;\n }\n else {\n this.$el.style.transform =\n this.scrollOrientation === 'vertical'\n ? `translate3d(0, ${this.translateValue}px, 0)`\n : `translate3d(${this.translateValue}px, 0, 0)`;\n }\n }\n }\n }\n\n /**\n * Inview callback\n */\n public setInview() {\n if (this.isInview) {\n return;\n }\n\n this.isInview = true;\n this.$el.classList.add(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'enter';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Out of view callback\n */\n public setOutOfView() {\n if (!(this.isInview && this.attributes.scrollRepeat)) {\n return;\n }\n\n this.isInview = false;\n this.$el.classList.remove(this.attributes.scrollClass);\n\n const way: scrollCallWay = 'leave';\n const from: scrollCallFrom = this._getScrollCallFrom();\n this.attributes.scrollCall && this._dispatchCall(way, from);\n }\n\n /**\n * Switch interactivity on to subscribe the instance to the RAF\n * and start calculations.\n */\n public setInteractivityOn() {\n if (this.isInteractive) {\n return;\n }\n\n this.isInteractive = true;\n this.subscribeElementUpdateFn(this);\n }\n\n /**\n * Switch interactivity off to unsubscribe the instance to the RAF\n * and stop calculations.\n */\n public setInteractivityOff() {\n if (!this.isInteractive) {\n return;\n }\n\n this.isInteractive = false;\n this.unsubscribeElementUpdateFn(this);\n\n // Force progress to progress limit when the element is out\n this.lastProgress != null &&\n this._computeProgress(closestNumber([0, 1], this.lastProgress));\n }\n\n /**\n * Resize method that compute the element's values.\n *\n * @private\n */\n private _resize() {\n this.metrics.bcr = this.$el.getBoundingClientRect();\n this._computeMetrics();\n this._computeIntersection();\n\n // First resize logic\n if (this.isFirstResize) {\n this.isFirstResize = false;\n // Dispatch default call if the element is in fold.\n if (this.isInFold) {\n this.setInview();\n }\n }\n }\n\n /**\n * Compute element's offsets and determine if the element is in fold.\n *\n * @private\n */\n private _computeMetrics() {\n const { top, left, height, width } = this.metrics.bcr;\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n const metricsStart = this.scrollOrientation === 'vertical' ? top : left;\n const metricsSize =\n this.scrollOrientation === 'vertical' ? height : width;\n\n this.metrics.offsetStart =\n this.currentScroll + metricsStart - this.translateValue;\n this.metrics.offsetEnd = this.metrics.offsetStart + metricsSize;\n\n if (\n this.metrics.offsetStart < wSize &&\n !this.attributes.scrollIgnoreFold\n ) {\n this.isInFold = true;\n } else {\n this.isInFold = false;\n }\n }\n\n /**\n * Compute intersection values depending on the context.\n *\n * @private\n */\n private _computeIntersection() {\n // Window size\n const wSize =\n this.scrollOrientation === 'vertical'\n ? window.innerHeight\n : window.innerWidth;\n\n // Metrics size\n const metricsSize =\n this.scrollOrientation === 'vertical'\n ? this.metrics.bcr.height\n : this.metrics.bcr.width;\n\n // Offset\n const offset = this.attributes.scrollOffset.split(',');\n const offsetStart = offset[0] != undefined ? offset[0].trim() : '0';\n const offsetEnd = offset[1] != undefined ? offset[1].trim() : '0';\n\n // Positions\n const scrollPosition = this.attributes.scrollPosition.split(',');\n let scrollPositionStart =\n scrollPosition[0] != undefined ? scrollPosition[0].trim() : 'start';\n const scrollPositionEnd =\n scrollPosition[1] != undefined ? scrollPosition[1].trim() : 'end';\n\n // Viewport\n const viewportStart = offsetStart.includes('%')\n ? wSize * parseInt(offsetStart.replace('%', '').trim()) * 0.01\n : parseInt(offsetStart);\n const viewportEnd = offsetEnd.includes('%')\n ? wSize * parseInt(offsetEnd.replace('%', '').trim()) * 0.01\n : parseInt(offsetEnd);\n\n // Fold exception\n if (this.isInFold) {\n scrollPositionStart = 'fold';\n }\n\n // Define Intersection Start\n switch (scrollPositionStart) {\n case 'start':\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n\n case 'middle':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.start =\n this.metrics.offsetStart -\n wSize +\n viewportStart +\n metricsSize;\n break;\n\n case 'fold':\n this.intersection.start = 0;\n break;\n\n default:\n this.intersection.start =\n this.metrics.offsetStart - wSize + viewportStart;\n break;\n }\n\n // Define Intersection End\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.metrics.offsetStart - viewportEnd;\n break;\n\n case 'middle':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n\n default:\n this.intersection.end =\n this.metrics.offsetStart - viewportEnd + metricsSize;\n break;\n }\n\n // Avoid to have the end < the start intersection >\n if (this.intersection.end <= this.intersection.start) {\n switch (scrollPositionEnd) {\n case 'start':\n this.intersection.end = this.intersection.start + 1;\n break;\n\n case 'middle':\n this.intersection.end =\n this.intersection.start + metricsSize * 0.5;\n break;\n\n case 'end':\n this.intersection.end =\n this.intersection.start + metricsSize;\n break;\n\n default:\n this.intersection.end = this.intersection.start + 1;\n break;\n }\n }\n }\n\n /**\n * Compute the scroll progress of the element depending\n * on its intersection values.\n *\n * @private\n *\n * @param {number} [forcedProgress] - Value to force progress.\n */\n private _computeProgress(forcedProgress?: number) {\n // Progress\n const progress =\n forcedProgress ??\n clamp(\n 0,\n 1,\n normalize(\n this.intersection.start,\n this.intersection.end,\n this.currentScroll\n )\n );\n\n this.progress = progress;\n\n if (progress != this.lastProgress) {\n this.lastProgress = progress;\n\n // Set the element's progress to the css variable\n this.attributes.scrollCssProgress && this._setCssProgress(progress);\n\n // Set the element's progress to the custom event listeners\n this.attributes.scrollEventProgress &&\n this._setCustomEventProgress(progress);\n\n // Set the element's progress to inline modules\n if (this.attributes.scrollModuleProgress) {\n for (const modularModules of this.progressModularModules) {\n this.modularInstance &&\n this.modularInstance.call(\n PROGRESS_MODULAR_METHOD,\n progress,\n modularModules.moduleName,\n modularModules.moduleId\n );\n }\n }\n\n // Logic to trigger the inview/out of view callbacks\n progress > 0 && progress < 1 && this.setInview();\n progress === 0 && this.setOutOfView();\n progress === 1 && this.setOutOfView();\n }\n }\n\n /**\n * Set the element's progress to a specific css variable.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCssProgress(currentProgress = 0) {\n this.$el.style.setProperty(\n PROGRESS_CSS_VAR,\n currentProgress.toString()\n );\n }\n\n /**\n * Set the element's progress to the custom event listeners.\n *\n * @private\n *\n * @param {number} [currentProgress] - Progress value.\n */\n _setCustomEventProgress(currentProgress = 0) {\n const customEventName = this.attributes.scrollEventProgress;\n\n if (!customEventName) return;\n\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n progress: currentProgress,\n },\n });\n window.dispatchEvent(customEvent);\n }\n\n /**\n * Get modular modules that can listen the element's progress.\n *\n * @private\n */\n _getProgressModularModules() {\n if (!this.modularInstance) {\n return;\n }\n\n const modulesIdNames = Object.keys(this.$el.dataset).filter((key) =>\n key.includes('module')\n );\n const modules: any[] = Object.entries(this.modularInstance.modules);\n\n if (!modulesIdNames.length) {\n return;\n }\n\n for (const modulesIdName of modulesIdNames) {\n const moduleId = this.$el.dataset[modulesIdName];\n\n if (!moduleId) {\n return;\n }\n\n for (const module of modules) {\n const [moduleName, moduleObj] = module;\n\n if (moduleId in moduleObj) {\n this.progressModularModules.push({\n moduleName,\n moduleId,\n });\n }\n }\n }\n }\n\n /**\n * Function to get scroll call from.\n *\n * @private\n */\n _getScrollCallFrom(): scrollCallFrom {\n const closestIntersectionValue = closestNumber(\n [this.intersection.start, this.intersection.end],\n this.currentScroll\n );\n return this.intersection.start === closestIntersectionValue\n ? 'start'\n : 'end';\n }\n\n /**\n * Function to dispatch a custom event or call a modular callback.\n *\n * @private\n *\n * @param {scrollCallWay} way - Enter or leave.\n * @param {scrollCallFrom} from - Start or end.\n */\n _dispatchCall(way: scrollCallWay, from: scrollCallFrom) {\n const callParameters = this.attributes.scrollCall?.split(',');\n const callSelf = this.attributes?.scrollCallSelf;\n\n if (callParameters && callParameters.length > 1) {\n // Using Modular.js (https://github.com/modularorg/modularjs)\n const [func, moduleName, moduleId] = callParameters;\n let targetModuleId;\n\n // If the module is set on the scroll element\n if (callSelf) {\n targetModuleId = this.$el.dataset[`module${moduleName.trim()}`];\n } else {\n targetModuleId = moduleId;\n }\n\n this.modularInstance &&\n this.modularInstance.call(\n func.trim(),\n {\n target: this.$el,\n way,\n from,\n },\n moduleName.trim(),\n targetModuleId?.trim()\n );\n } else if (callParameters) {\n // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\n const [customEventName] = callParameters;\n const customEvent = new CustomEvent(customEventName, {\n detail: {\n target: this.$el,\n way,\n from,\n },\n });\n window.dispatchEvent(customEvent);\n }\n }\n}\n","export function getTranslate(el: HTMLElement) {\n const translate = {x: 0, y: 0};\n \n const transform = el.style.transform \n\n let matches = transform.match(/translate3d\\(([^)]+)\\)/);\n\n if (matches) {\n const parts = matches[1].split(', ');\n translate.x = parseFloat(parts[0]);\n translate.y = parseFloat(parts[1]);\n }\n\n return translate;\n}\n","/**\n * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport {\n CoreOptions,\n IModular,\n IScrollElementCallbacksValues,\n scrollOrientation,\n} from '../types';\nimport IO from './IO';\nimport ScrollElement from './ScrollElement';\n\n/** Defined attributes that need a requestAnimationFrame */\nconst ATTRIBUTES_THAT_NEED_RAF = [\n 'scrollOffset',\n 'scrollPosition',\n 'scrollModuleProgress',\n 'scrollCssProgress',\n 'scrollEventProgress',\n 'scrollSpeed',\n];\n\n/** Default root margins */\nconst TRIGGER_ROOT_MARGIN = '-1px -1px -1px -1px';\nconst RAF_ROOT_MARGIN = '100% 100% 100% 100%'; // Add 100vh top/bottom && 100vw left/right to use a biggest value with data-scroll-speed\n\nexport default class Core {\n private $scrollContainer!: HTMLElement;\n private modularInstance?: IModular;\n private triggerRootMargin!: string;\n private rafRootMargin!: string;\n private scrollElements!: ScrollElement[];\n private triggeredScrollElements!: ScrollElement[];\n private RAFScrollElements!: ScrollElement[];\n private scrollElementsToUpdate!: ScrollElement[];\n private IOTriggerInstance!: IO;\n private IORafInstance!: IO;\n private scrollOrientation!: scrollOrientation;\n\n constructor({\n $el,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n scrollOrientation,\n }: CoreOptions) {\n if (!$el) {\n console.error('Please provide a DOM Element as scrollContainer');\n return;\n }\n\n // Scroll container\n this.$scrollContainer = $el;\n\n // Modular.js\n this.modularInstance = modularInstance;\n\n // Scroll Direction\n this.scrollOrientation = scrollOrientation;\n\n // IO Margins\n this.triggerRootMargin = triggerRootMargin ?? TRIGGER_ROOT_MARGIN;\n this.rafRootMargin = rafRootMargin ?? RAF_ROOT_MARGIN;\n\n // ScrollElements arrays\n this.scrollElements = [];\n this.triggeredScrollElements = [];\n this.RAFScrollElements = [];\n this.scrollElementsToUpdate = [];\n\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize the core.\n *\n * @private\n */\n private _init() {\n const $scrollElements =\n this.$scrollContainer.querySelectorAll('[data-scroll]');\n\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements($scrollElementsArr);\n\n // Trigger IO\n this.IOTriggerInstance = new IO({\n scrollElements: [...this.triggeredScrollElements],\n rootMargin: this.triggerRootMargin,\n IORaf: false,\n });\n\n // Raf IO\n this.IORafInstance = new IO({\n scrollElements: [...this.RAFScrollElements],\n rootMargin: this.rafRootMargin,\n IORaf: true,\n });\n }\n\n /**\n * Lifecyle - Destroy core.\n */\n public destroy() {\n this.IOTriggerInstance.destroy();\n this.IORafInstance.destroy();\n this._unsubscribeAllScrollElements();\n }\n\n /**\n * Callback - Resize callback.\n */\n onResize({ currentScroll }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.RAFScrollElements) {\n scrollElement.onResize({\n currentScroll,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Callback - RAF callback.\n */\n onRender({ currentScroll, smooth }: IScrollElementCallbacksValues) {\n for (const scrollElement of this.scrollElementsToUpdate) {\n scrollElement.onRender({\n currentScroll,\n smooth,\n } as IScrollElementCallbacksValues);\n }\n }\n\n /**\n * Remove items from lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $oldContainer - HTMLElement that contains data-scroll elements to unsubscribe\n */\n removeScrollElements($oldContainer: HTMLElement) {\n const $scrollElementsToRemove =\n $oldContainer.querySelectorAll('[data-scroll]');\n\n if (!$scrollElementsToRemove.length) return;\n\n // 1. Remove from IO\n for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n const scrollElement = this.triggeredScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IOTriggerInstance.unobserve(scrollElement.$el);\n this.triggeredScrollElements.splice(index, 1);\n }\n }\n\n for (let index = 0; index < this.RAFScrollElements.length; index++) {\n const scrollElement = this.RAFScrollElements[index];\n const $scrollElementsToRemoveArr = Array.from($scrollElementsToRemove) as HTMLElement []\n if ($scrollElementsToRemoveArr.indexOf(scrollElement.$el) > -1) {\n this.IORafInstance.unobserve(scrollElement.$el);\n this.RAFScrollElements.splice(index, 1);\n }\n }\n\n // 2. Remove from scrollElementsToUpdate[] and scrollElements[]\n $scrollElementsToRemove.forEach(($scrollElement) => {\n const targetScrollElementToUpdate =\n this.scrollElementsToUpdate.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n const targetScrollElement = this.scrollElements.find(\n (scrollElement) => scrollElement.$el === $scrollElement\n );\n\n if (targetScrollElementToUpdate) {\n this._unsubscribeElementUpdate(targetScrollElementToUpdate);\n }\n if (targetScrollElement) {\n this.scrollElements = this.scrollElements.filter(\n (scrollElementItem) =>\n scrollElementItem.id != targetScrollElement.id\n );\n }\n });\n }\n\n /**\n * Add items to lists of scroll elements and compute all new values.\n *\n * @param {HTMLElement} $newContainer - HTMLElement that contains data-scroll elements to subscribe\n */\n addScrollElements($newContainer: HTMLElement) {\n // 3. Rebuild ScrollElements\n const $scrollElements = $newContainer.querySelectorAll('[data-scroll]');\n\n // 4. Get max scrollElement.id\n const ids: number[] = [];\n this.scrollElements.forEach((scrollElement) => {\n ids.push(scrollElement.id);\n });\n const maxID = Math.max(...ids);\n const fromIndex = maxID + 1;\n const $scrollElementsArr = Array.from($scrollElements) as HTMLElement[]\n this._subscribeScrollElements(\n $scrollElementsArr,\n fromIndex,\n true\n );\n }\n\n /**\n * Create a ScrollElement instance for each elements with\n * `data-scroll` attribute.\n *\n * @private\n *\n * @param {HTMLElement[]} $scrollElements - List of elements that need\n * to be regarded.\n */\n _subscribeScrollElements(\n $scrollElements: HTMLElement[],\n fromIndex = 0,\n toObserve = false\n ) {\n // For each scroll element create a ScrollElement instance\n for (let index = 0; index < $scrollElements.length; index++) {\n const $scrollElement = $scrollElements[index];\n const needRaf = this._checkRafNeeded($scrollElement);\n\n const scrollElementInstance = new ScrollElement({\n $el: $scrollElement,\n id: fromIndex + index,\n scrollOrientation: this.scrollOrientation,\n modularInstance: this.modularInstance,\n subscribeElementUpdateFn:\n this._subscribeElementUpdate.bind(this),\n unsubscribeElementUpdateFn:\n this._unsubscribeElementUpdate.bind(this),\n needRaf,\n });\n\n // Push to common array\n this.scrollElements.push(scrollElementInstance);\n\n // Push to specific array\n if (needRaf) {\n this.RAFScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IORafInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IORafInstance.observe(scrollElementInstance.$el);\n }\n } else {\n this.triggeredScrollElements.push(scrollElementInstance);\n\n // Dynamic observe item\n if (toObserve) {\n this.IOTriggerInstance.scrollElements.push(\n scrollElementInstance\n );\n this.IOTriggerInstance.observe(scrollElementInstance.$el);\n }\n }\n }\n }\n\n /**\n * Clear all ScrollElement arrays.\n *\n * @private\n */\n _unsubscribeAllScrollElements() {\n this.scrollElements = [];\n this.RAFScrollElements = [];\n this.triggeredScrollElements = [];\n this.scrollElementsToUpdate = [];\n }\n\n /**\n * Subscribe ScrollElement instance that needs to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - ScrollElement instance inview\n * that needs to be updated.\n */\n _subscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate.push(scrollElement);\n }\n\n /**\n * Unscribe ScrollElement instance that doesn't need to be updated.\n *\n * @private\n *\n * @param {ScrollElement} scrollElement - The updated ScrollElement instance\n * out of view now.\n */\n _unsubscribeElementUpdate(scrollElement: ScrollElement) {\n this.scrollElementsToUpdate = this.scrollElementsToUpdate.filter(\n (scrollElementToUpdate) =>\n scrollElementToUpdate.id != scrollElement.id\n );\n }\n\n /**\n * Check if a DOM Element need a requestAnimationFrame to be used.\n *\n * @private\n *\n * @param {HTMLElement} $scrollElement - The element that needs to be checked.\n *\n * @returns {boolean}\n */\n _checkRafNeeded($scrollElement: HTMLElement) {\n let attributesThatNeedRaf = [...ATTRIBUTES_THAT_NEED_RAF];\n\n // Remove utils\n const removeAttribute = (attributeToRemove: string) => {\n attributesThatNeedRaf = attributesThatNeedRaf.filter(\n (attribute) => attribute != attributeToRemove\n );\n };\n\n // 1. Check scroll offset values\n if ($scrollElement.dataset.scrollOffset) {\n const value = $scrollElement.dataset.scrollOffset\n .split(',')\n .map((test) => test.replace('%', '').trim())\n .join(',');\n if (value != '0,0') {\n return true;\n } else {\n removeAttribute('scrollOffset');\n }\n } else {\n removeAttribute('scrollOffset');\n }\n\n // 2. Check scroll position values\n if ($scrollElement.dataset.scrollPosition) {\n const value = $scrollElement.dataset.scrollPosition.trim();\n if (value != 'top,bottom') {\n return true;\n } else {\n removeAttribute('scrollPosition');\n }\n } else {\n removeAttribute('scrollPosition');\n }\n\n // 3. Check scroll speed values\n if (\n $scrollElement.dataset.scrollSpeed &&\n !isNaN(parseFloat($scrollElement.dataset.scrollSpeed))\n ) {\n return true;\n } else {\n removeAttribute('scrollSpeed');\n }\n\n // 4. Check others attributes\n for (const attribute of attributesThatNeedRaf) {\n if (attribute in $scrollElement.dataset) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/**\n * Resize Observer\n *\n * The Resize Observer API provides a performant mechanism by which code can monitor an element for changes to its size,\n * with notifications being delivered to the observer each time the size changes.\n *\n * Features functions to:\n *\n * - Trigger the resize callback if the specified element's size change.\n *\n * References:\n *\n * - {@link https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API}\n */\n\nimport { IROOptions } from '../types';\n\nexport default class RO {\n private $resizeElements: HTMLElement[];\n private isFirstObserve: boolean;\n private observer!: ResizeObserver;\n private resizeCallback: () => void;\n\n constructor({ resizeElements, resizeCallback = () => {} }: IROOptions) {\n // Parameters\n this.$resizeElements = resizeElements;\n this.resizeCallback = resizeCallback;\n\n // Flags\n this.isFirstObserve = true;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize Resize Observer.\n *\n * @private\n */\n private _init() {\n // Callback\n const onResize = (entries: ResizeObserverEntry[]) => {\n !this.isFirstObserve && this.resizeCallback?.();\n this.isFirstObserve = false;\n };\n\n // Instance\n this.observer = new ResizeObserver(onResize);\n\n // Observe each default elements\n for (const $resizeElement of this.$resizeElements) {\n this.observer.observe($resizeElement);\n }\n }\n\n /**\n * Lifecyle - Destroy Resize Observer.\n */\n public destroy() {\n this.observer.disconnect();\n }\n}\n","//@ts-ignore\nimport Lenis from '@studio-freight/lenis';\nimport Core from './core/Core';\nimport RO from './core/RO';\nimport {\n ILenisOptions,\n ILenisScrollToOptions,\n ILenisScrollValues,\n ILocomotiveScrollOptions,\n IModular,\n lenisTargetScrollTo,\n} from './types';\n\n/**\n * @type {ILenisOptions}\n */\nconst defaultLenisOptions: ILenisOptions = {\n wrapper: window,\n content: document.documentElement,\n eventsTarget: window,\n lerp: 0.1,\n duration: 0.75,\n orientation: 'vertical',\n gestureOrientation: 'vertical',\n smoothWheel: true,\n smoothTouch: false,\n syncTouch: false,\n syncTouchLerp: 0.1,\n touchInertiaMultiplier: 35,\n wheelMultiplier: 1,\n touchMultiplier: 2,\n normalizeWheel: false,\n autoResize: true,\n easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // https://www.desmos.com/calculator/brs54l4xou\n};\n\n/**\n * Locomotive Scroll\n *\n * Detection of elements in viewport & smooth scrolling with parallax.\n *\n * Inspired by\n * {@link https://github.com/locomotivemtl/locomotive-scroll locomotive-scroll.js}\n * and built around\n * {@link https://github.com/studio-freight/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n public rafPlaying: boolean;\n\n private lenisInstance: any;\n private coreInstance: any;\n\n private lenisOptions: ILenisOptions;\n private modularInstance?: IModular;\n private triggerRootMargin?: string;\n private rafRootMargin?: string;\n private rafInstance?: any;\n private autoResize?: boolean;\n private autoStart?: boolean;\n private ROInstance?: RO;\n private scrollCallback?(scrollValues: ILenisScrollValues): void;\n private initCustomTicker?: (render: () => void) => void;\n private destroyCustomTicker?: (render: () => void) => void;\n private _onRenderBind: () => void;\n private _onResizeBind: () => void;\n private _onScrollToBind: (event: MouseEvent) => void;\n\n constructor({\n lenisOptions = {},\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize = true,\n autoStart = true,\n scrollCallback = () => {},\n initCustomTicker,\n destroyCustomTicker,\n }: ILocomotiveScrollOptions = {}) {\n // Arguments\n this.lenisOptions = { ...defaultLenisOptions, ...lenisOptions };\n\n Object.assign(this, {\n lenisOptions,\n modularInstance,\n triggerRootMargin,\n rafRootMargin,\n autoResize,\n autoStart,\n scrollCallback,\n initCustomTicker,\n destroyCustomTicker,\n });\n\n // Binding\n this._onRenderBind = this._onRender.bind(this);\n this._onScrollToBind = this._onScrollTo.bind(this);\n this._onResizeBind = this._onResize.bind(this);\n\n // Data\n this.rafPlaying = false;\n\n // Init\n this._init();\n }\n\n /**\n * Lifecyle - Initialize instance.\n *\n * @private\n */\n private _init(): void {\n // Create Lenis instance\n this.lenisInstance = new Lenis({\n wrapper: this.lenisOptions.wrapper,\n content: this.lenisOptions.content,\n eventsTarget: this.lenisOptions.eventsTarget,\n lerp: this.lenisOptions.lerp,\n duration: this.lenisOptions.duration,\n orientation: this.lenisOptions.orientation,\n gestureOrientation: this.lenisOptions.gestureOrientation,\n smoothWheel: this.lenisOptions.smoothWheel,\n smoothTouch: this.lenisOptions.smoothTouch,\n syncTouch: this.lenisOptions.syncTouch,\n syncTouchLerp: this.lenisOptions.syncTouchLerp,\n touchInertiaMultiplier: this.lenisOptions.touchInertiaMultiplier,\n wheelMultiplier: this.lenisOptions.wheelMultiplier,\n touchMultiplier: this.lenisOptions.touchMultiplier,\n normalizeWheel: this.lenisOptions.normalizeWheel,\n easing: this.lenisOptions.easing,\n });\n this.lenisInstance?.on('scroll', this.scrollCallback);\n\n // Add scroll direction attribute on body\n document.documentElement.setAttribute(\n 'data-scroll-orientation',\n this.lenisInstance.options.orientation\n );\n\n requestAnimationFrame(() => {\n // Create Core Instance\n this.coreInstance = new Core({\n $el: this.lenisInstance.rootElement,\n modularInstance: this.modularInstance,\n triggerRootMargin: this.triggerRootMargin,\n rafRootMargin: this.rafRootMargin,\n scrollOrientation: this.lenisInstance.options.orientation,\n });\n\n // Bind Events\n this._bindEvents();\n\n // RAF warning\n if (this.initCustomTicker && !this.destroyCustomTicker) {\n console.warn(\n 'initCustomTicker callback is declared, but destroyCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n } else if (!this.initCustomTicker && this.destroyCustomTicker) {\n console.warn(\n 'destroyCustomTicker callback is declared, but initCustomTicker is not. Please pay attention. It could cause trouble.'\n );\n }\n\n // Start RAF\n this.autoStart && this.start();\n });\n }\n\n /**\n * Lifecyle - Destroy instance.\n */\n public destroy(): void {\n // Stop raf\n this.stop();\n // Unbind Events\n this._unbindEvents();\n // Destroy Lenis\n this.lenisInstance.destroy();\n // Destroy Core\n this.coreInstance?.destroy();\n\n // Ensure a delay before destroying to handle cases of instant destruction\n requestAnimationFrame(() => {\n this.coreInstance?.destroy();\n });\n }\n\n /**\n * Events - Subscribe events to listen.\n */\n private _bindEvents() {\n this._bindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance = new RO({\n resizeElements: [document.body],\n resizeCallback: this._onResizeBind,\n });\n } else {\n (window as any).addEventListener('resize', this._onResizeBind);\n }\n }\n }\n\n /**\n * Events - Unsubscribe listened events.\n */\n private _unbindEvents() {\n this._unbindScrollToEvents();\n\n if (this.autoResize) {\n if ('ResizeObserver' in window) {\n this.ROInstance && this.ROInstance.destroy();\n } else {\n (window as any).removeEventListener(\n 'resize',\n this._onResizeBind\n );\n }\n }\n }\n\n /**\n * Events - Subscribe scrollTo events to listen.\n */\n private _bindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement): void => {\n $el.addEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Events - Unsubscribe scrollTo listened events.\n */\n private _unbindScrollToEvents($container?: HTMLElement) {\n const $rootContainer = $container\n ? $container\n : this.lenisInstance.rootElement;\n const $scrollToElements =\n $rootContainer?.querySelectorAll('[data-scroll-to]');\n $scrollToElements?.length &&\n $scrollToElements.forEach(($el: HTMLElement) => {\n $el.removeEventListener('click', this._onScrollToBind, false);\n });\n }\n\n /**\n * Callback - Resize callback.\n */\n private _onResize() {\n // Waiting the next frame to get the new current scroll value return by Lenis\n requestAnimationFrame(() => {\n this.coreInstance?.onResize({\n currentScroll: this.lenisInstance.scroll,\n });\n });\n }\n\n /**\n * Callback - Render callback.\n */\n private _onRender() {\n this.lenisInstance?.raf(Date.now());\n\n this.coreInstance?.onRender({\n currentScroll: this.lenisInstance.scroll,\n smooth: this.lenisInstance.isSmooth,\n });\n }\n\n /**\n * Callback - Scroll To callback.\n */\n private _onScrollTo(event: MouseEvent) {\n event.preventDefault();\n const $target = (event.currentTarget as HTMLElement) ?? null;\n if (!$target) return;\n const target =\n $target.getAttribute('data-scroll-to-href') ||\n $target.getAttribute('href');\n const offset = $target.getAttribute('data-scroll-to-offset') || 0;\n const duration =\n $target.getAttribute('data-scroll-to-duration') ||\n this.lenisOptions.duration ||\n defaultLenisOptions.duration;\n\n target &&\n this.scrollTo(target, {\n offset: typeof offset === 'string' ? parseInt(offset) : offset,\n duration:\n typeof duration === 'string'\n ? parseInt(duration)\n : duration,\n });\n }\n\n /**\n * Start RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public start(): void {\n if (this.rafPlaying) {\n return;\n }\n\n // Call lenis start method\n this.lenisInstance?.start();\n\n this.rafPlaying = true;\n this.initCustomTicker\n ? this.initCustomTicker(this._onRenderBind)\n : this._raf();\n }\n\n /**\n * Stop RequestAnimationFrame that active Lenis smooth and scroll progress.\n */\n public stop(): void {\n if (!this.rafPlaying) {\n return;\n }\n\n // Call lenis stop method\n this.lenisInstance?.stop();\n\n this.rafPlaying = false;\n this.destroyCustomTicker\n ? this.destroyCustomTicker(this._onRenderBind)\n : this.rafInstance && cancelAnimationFrame(this.rafInstance);\n }\n\n /**\n * Remove old scroll elements items and rebuild ScrollElements instances.\n */\n public removeScrollElements($oldContainer: HTMLElement): void {\n if (!$oldContainer) {\n console.error('Please provide a DOM Element as $oldContainer');\n return;\n }\n\n this._unbindScrollToEvents($oldContainer);\n this.coreInstance?.removeScrollElements($oldContainer);\n }\n\n /**\n * Add new scroll elements items and rebuild ScrollElements instances.\n */\n public addScrollElements($newContainer: HTMLElement): void {\n if (!$newContainer) {\n console.error('Please provide a DOM Element as $newContainer');\n return;\n }\n\n this.coreInstance?.addScrollElements($newContainer);\n requestAnimationFrame(() => {\n this._bindScrollToEvents($newContainer);\n });\n }\n\n /**\n * Trigger resize callback.\n */\n public resize(): void {\n this._onResizeBind();\n }\n\n /**\n * Trigger scroll to callback.\n */\n public scrollTo(\n target: lenisTargetScrollTo,\n options?: ILenisScrollToOptions\n ): void {\n this.lenisInstance?.scrollTo(target, {\n offset: options?.offset,\n lerp: options?.lerp,\n duration: options?.duration,\n immediate: options?.immediate,\n lock: options?.lock,\n force: options?.force,\n easing: options?.easing,\n onComplete: options?.onComplete,\n });\n }\n\n /**\n * RequestAnimationFrame that active Lenis smooth and scroll progress.\n *\n * @private\n *\n */\n private _raf() {\n this._onRenderBind();\n this.rafInstance = requestAnimationFrame(() => this._raf());\n }\n}\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","IORaf","this","observer","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_iterator","_step","_createForOfIteratorHelperLoose","done","observe","value","destroy","disconnect","$scrollElement","unobserve","scrollElement","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","closestNumber","array","reduce","prev","curr","Math","abs","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","modularInstance","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","intersection","metrics","currentScroll","translateValue","progress","lastProgress","progressModularModules","isInview","isInteractive","isInFold","isFirstResize","scrollClass","dataset","scrollOffset","scrollPosition","scrollModuleProgress","scrollCssProgress","scrollEventProgress","scrollSpeed","parseFloat","scrollDelay","scrollCall","scrollCallSelf","scrollIgnoreFold","scrollEnableTouchSpeed","start","end","offsetStart","offsetEnd","bcr","window","scrollY","scrollX","_getProgressModularModules","_resize","onResize","_ref2","onRender","_ref3","smooth","wSize","innerHeight","innerWidth","_computeProgress","isNaN","max","el","translate","x","y","matches","style","transform","match","parts","split","getTranslate","lerped","amt","lerp","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","_this$metrics$bcr","metricsSize","height","width","top","left","offset","undefined","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","forcedProgress","_setCssProgress","_setCustomEventProgress","modularModules","call","moduleName","moduleId","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","dispatchEvent","modulesIdNames","Object","keys","filter","key","modules","length","_step2","_iterator2","_step3","_iterator3","module","push","closestIntersectionValue","way","_this$attributes$scro","_this$attributes","callParameters","callSelf","_targetModuleId","targetModuleId","func","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","Array","_subscribeScrollElements","concat","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","index","indexOf","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","scrollElementItem","addScrollElements","$newContainer","ids","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","RO","resizeElements","_ref$resizeCallback","resizeCallback","$resizeElements","isFirstObserve","ResizeObserver","defaultLenisOptions","wrapper","content","document","documentElement","eventsTarget","duration","orientation","gestureOrientation","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","touchInertiaMultiplier","wheelMultiplier","touchMultiplier","normalizeWheel","autoResize","easing","t","min","pow","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoResize","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","lenisInstance","coreInstance","rafInstance","ROInstance","_onRenderBind","_onResizeBind","_onScrollToBind","_extends","assign","_onRender","_onScrollTo","_onResize","_this$lenisInstance","Lenis","on","setAttribute","options","requestAnimationFrame","rootElement","_bindEvents","warn","_this$coreInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_bindScrollToEvents","body","addEventListener","_unbindScrollToEvents","removeEventListener","$container","_this3","$rootContainer","$scrollToElements","_this4","_this5","_this5$coreInstance","scroll","_this$lenisInstance2","_this$coreInstance2","raf","Date","now","isSmooth","event","_event$currentTarget","preventDefault","$target","currentTarget","getAttribute","scrollTo","_this$lenisInstance3","_raf","_this$lenisInstance4","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance5","immediate","lock","force","onComplete","_this7"],"mappings":"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"} \ No newline at end of file diff --git a/dist/types/utils/translate.d.ts b/dist/types/utils/translate.d.ts index f7333b47..43414861 100644 --- a/dist/types/utils/translate.d.ts +++ b/dist/types/utils/translate.d.ts @@ -1,4 +1,4 @@ -export declare function getTranslate(el: Element): { +export declare function getTranslate(el: HTMLElement): { x: number; y: number; }; diff --git a/src/utils/translate.ts b/src/utils/translate.ts index 3cbbf614..ac0b2009 100644 --- a/src/utils/translate.ts +++ b/src/utils/translate.ts @@ -1,10 +1,7 @@ -export function getTranslate(el: Element) { +export function getTranslate(el: HTMLElement) { const translate = {x: 0, y: 0}; - - if (!window.getComputedStyle) return translate; - - const style = getComputedStyle(el); - const transform = style.transform + + const transform = el.style.transform let matches = transform.match(/translate3d\(([^)]+)\)/);