{"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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"}