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