{"version":3,"file":"locomotive-scroll.cjs","sources":["../core/IO.ts","../utils/maths.ts","../core/ScrollElement.ts","../core/Core.ts","../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 type { IIOOptions } from '../types';\nimport ScrollElement from './ScrollElement';\n\nexport default class IO {\n    public scrollElements: ScrollElement[];\n    private rootMargin: string;\n    private root: HTMLElement | null;\n    private IORaf: boolean;\n    private observer!: IntersectionObserver;\n\n    constructor({\n        scrollElements,\n        rootMargin = '-1px -1px -1px -1px',\n        root = null,\n        IORaf,\n    }: IIOOptions) {\n        // Parameters\n        this.scrollElements = scrollElements;\n        this.rootMargin = rootMargin;\n        this.root = root;\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            root: this.root,\n            rootMargin: this.rootMargin,\n        };\n\n        // Callback\n        const onIntersect = (entries: IntersectionObserverEntry[]) => {\n            entries.forEach((entry) => {\n                const $targetItem: ScrollElement | undefined =\n                    this.scrollElements.find(\n                        (item) => item.$el === entry.target\n                    );\n\n                if (entry.isIntersecting) {\n                    $targetItem && ($targetItem.isAlreadyIntersected = true);\n                    this._setInview(entry);\n                } else if ($targetItem && $targetItem.isAlreadyIntersected) {\n                    this._setOutOfView(entry);\n                }\n            });\n        };\n\n        // Instance\n        this.observer = new IntersectionObserver(onIntersect, observerOptions);\n\n        // Observe each default elements\n        for (const scrollElement of this.scrollElements) {\n            const $scrollElement = scrollElement.$el;\n            this.observe($scrollElement);\n        }\n    }\n\n    /**\n     * Lifecyle - Destroy Intersection Observer.\n     */\n    public destroy() {\n        this.observer.disconnect();\n    }\n\n    /**\n     * Subscribe element to the Intersection Observer.\n     *\n     * @param {HTMLElement} $scrollElement - DOM Element to observe.\n     */\n    public observe($scrollElement: HTMLElement) {\n        if (!$scrollElement) {\n            return;\n        }\n\n        this.observer.observe($scrollElement);\n    }\n\n    /**\n     * Unsubscribe element to the Intersection Observer.\n     *\n     * @param {HTMLElement} $scrollElement - DOM Element to unobserve.\n     */\n    public unobserve($scrollElement: HTMLElement) {\n        if (!$scrollElement) {\n            return;\n        }\n\n        this.observer.unobserve($scrollElement);\n    }\n\n    /**\n     * Find ScrollElementReference instance and trigger inview callbacks.\n     *\n     * @private\n     *\n     * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n     */\n    private _setInview(entry: IntersectionObserverEntry) {\n        const scrollElement = this.scrollElements.find(\n            (scrollElement) => scrollElement.$el === entry.target\n        );\n\n        this.IORaf && scrollElement?.setInteractivityOn();\n        !this.IORaf && scrollElement?.setInview();\n    }\n\n    /**\n     * Find ScrollElementReference instance and trigger out of view callbacks.\n     *\n     * @private\n     *\n     * @param {IntersectionObserverEntry} entry - DOM Element to observe.\n     */\n    private _setOutOfView(entry: IntersectionObserverEntry) {\n        const scrollElement = this.scrollElements.find(\n            (scrollElement) => scrollElement.$el === entry.target\n        );\n\n        this.IORaf && scrollElement?.setInteractivityOff();\n        !this.IORaf && scrollElement?.setOutOfView();\n\n        // Unobserve if element doesn't have repeat attribute\n        if (!scrollElement?.attributes.scrollRepeat && !this.IORaf) {\n            this.unobserve(entry.target as HTMLElement);\n        }\n    }\n}\n","// https://greensock.com/docs/v3/GSAP/gsap.utils\n\n/**\n * Clamp a value to fit within a specific range (ex: clamp(0, 100, -12) --> 0).\n *\n * @param {number} min   - Minimum value expected.\n * @param {number} max   - Maximum value expected.\n * @param {number} value - Current value.\n *\n * @returns {number} - Clamped value.\n */\nexport function clamp(min: number, max: number, value: number): number {\n    return value < min ? min : value > max ? max : value;\n}\n\n/**\n * Map one range to another (ex: mapRange(-10, 10, 0, 100, 5) --> 75).\n *\n * @param {number} inMin  - Current minimum value.\n * @param {number} inMax  - Current maximum value.\n * @param {number} outMin - Maximum value expected.\n * @param {number} outMax - Maximum value expected.\n * @param {number} value  - Current value.\n *\n * @returns {number} - New value that should be between minimum value expected and maximum value.\n */\nexport function mapRange(\n    inMin: number,\n    inMax: number,\n    outMin: number,\n    outMax: number,\n    value: number\n): number {\n    const inRange = inMax - inMin;\n    const outRange = outMax - outMin;\n    return outMin + (((value - inMin) / inRange) * outRange || 0);\n}\n\n/**\n * Map a number within a range to a progress between 0 to 1 (ex: normalize(100, 200, 150) --> 0.5).\n *\n * @param {number} min   - Current minimum value.\n * @param {number} max   - Current maximum value.\n * @param {number} value - Current value.\n *\n * @returns {number} - New value that should be between 0 and 1.\n */\nexport function normalize(min: number, max: number, value: number): number {\n    return mapRange(min, max, 0, 1, value);\n}\n\n/**\n * Get closest number from an array.\n *\n * @param {number[]} array  - Numbers array.\n * @param {number}   target - Reference value.\n *\n * @returns {number} - Closest number.\n */\nexport function closestNumber(array: number[], target: number): number {\n    return array.reduce((prev, curr) => {\n        return Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev;\n    });\n}\n","/**\n * Scroll Element\n *\n * Give tools to compute element progress in the viewport and triggers callbacks to animate it.\n *\n * Features functions to:\n *\n * - scrollClass - Add a custom class when the element is intersected by the offset\n * - scrollOffset - Determine offsets to intersect the element\n * - scrollPosition - Determine the element positions to consider an element as intersected.\n * - 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 when the element is intersected\n */\n\nimport type {\n    IScrollElementOptions,\n    IScrollElementAttributes,\n    IScrollElementIntersection,\n    IScrollElementMetrics,\n    IScrollElementCallbacksValues,\n    scrollOrientation,\n} from '../types';\nimport { clamp, closestNumber, normalize, mapRange } from '../utils/maths';\n\n/** Constants */\nconst INVIEW_CLASS = 'is-inview';\nconst PROGRESS_CSS_VAR = '--progress';\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 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    private lenisInstance: any;\n\n    // Cached functions to avoid orientation checks every frame\n    private getWindowSize: () => number;\n    private getMetricsStart: (bcr: DOMRect) => number;\n    private getMetricsSize: (bcr: DOMRect) => number;\n\n    // Position handlers for intersection.start (includes wSize)\n    private readonly startPositionHandlers: Record<string, (offsetStart: number, wSize: number, viewport: number, size: number) => number> = {\n        'start': (offsetStart, wSize, viewport) => offsetStart - wSize + viewport,\n        'middle': (offsetStart, wSize, viewport, size) => offsetStart - wSize + viewport + size * 0.5,\n        'end': (offsetStart, wSize, viewport, size) => offsetStart - wSize + viewport + size,\n        'fold': () => 0,\n    };\n\n    // Position handlers for intersection.end (DOES NOT include wSize - critical difference)\n    private readonly endPositionHandlers: Record<string, (offsetStart: number, viewport: number, size: number) => number> = {\n        'start': (offsetStart, viewport) => offsetStart - viewport,\n        'middle': (offsetStart, viewport, size) => offsetStart - viewport + size * 0.5,\n        'end': (offsetStart, viewport, size) => offsetStart - viewport + size,\n    };\n\n    constructor({\n        $el,\n        id,\n        subscribeElementUpdateFn,\n        unsubscribeElementUpdateFn,\n        needRaf,\n        scrollOrientation,\n        lenisInstance,\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        // Lenis instance\n        this.lenisInstance = lenisInstance;\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            scrollCssProgress: this.$el.dataset['scrollCssProgress'] !== undefined,\n            scrollEventProgress:\n                this.$el.dataset['scrollEventProgress'] ?? null,\n            scrollSpeed:\n                this.$el.dataset['scrollSpeed'] !== undefined\n                    ? parseFloat(this.$el.dataset['scrollSpeed'])\n                    : null,\n            scrollRepeat: this.$el.dataset['scrollRepeat'] !== undefined,\n            scrollCall: this.$el.dataset['scrollCall'] ?? null,\n            scrollIgnoreFold: this.$el.dataset['scrollIgnoreFold'] !== undefined,\n            scrollEnableTouchSpeed:\n                this.$el.dataset['scrollEnableTouchSpeed'] !== undefined,\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 = this.lenisInstance.scroll;\n\n        // Parallax\n        this.translateValue = 0;\n\n        // Progress\n        this.progress = 0;\n        this.lastProgress = null;\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        // Cache orientation-dependent functions to avoid repeated conditionals\n        this.getWindowSize = this.scrollOrientation === 'vertical'\n            ? () => this.lenisInstance.dimensions.height\n            : () => this.lenisInstance.dimensions.width;\n\n        this.getMetricsStart = this.scrollOrientation === 'vertical'\n            ? (bcr: DOMRect) => bcr.top\n            : (bcr: DOMRect) => bcr.left;\n\n        this.getMetricsSize = this.scrollOrientation === 'vertical'\n            ? (bcr: DOMRect) => bcr.height\n            : (bcr: DOMRect) => bcr.width;\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        // 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 = this.getWindowSize();\n        this.currentScroll = currentScroll;\n        this._computeProgress();\n\n        // Parallax\n        if (\n            this.attributes.scrollSpeed &&\n            !isNaN(this.attributes.scrollSpeed)\n        ) {\n            // if touch detected or smooth disabled\n            if (!this.attributes.scrollEnableTouchSpeed && !smooth) {\n                if (this.translateValue) {\n                    this.$el.style.transform = `translate3d(0, 0, 0)`;\n                }\n                this.translateValue = 0;\n\n            // if mousewheel or smooth enabled\n            } else {\n                // Check fold condition\n                if (this.isInFold) {\n                    const progress = Math.max(0, this.progress);\n                    this.translateValue =\n                        progress * wSize * this.attributes.scrollSpeed * -1;\n                } else {\n                    const progress = mapRange(0, 1, -1, 1, this.progress);\n                    this.translateValue =\n                        progress * wSize * this.attributes.scrollSpeed * -1;\n                }\n\n                this.$el.style.transform =\n                    this.scrollOrientation === 'vertical'\n                        ? `translate3d(0, ${this.translateValue}px, 0)`\n                        : `translate3d(${this.translateValue}px, 0, 0)`;\n            }\n        }\n    }\n\n    /**\n     * Inview callback\n     */\n    public setInview() {\n        if (this.isInview) {\n            return;\n        }\n\n        this.isInview = true;\n        this.$el.classList.add(this.attributes.scrollClass);\n\n        const way = 'enter';\n        const from = 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 = 'leave';\n        const from = 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 wSize = this.getWindowSize();\n        const metricsStart = this.getMetricsStart(this.metrics.bcr);\n        const metricsSize = this.getMetricsSize(this.metrics.bcr);\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     * Uses handler-based approach for cleaner, more maintainable code.\n     *\n     * @private\n     */\n    private _computeIntersection() {\n        const wSize = this.getWindowSize();\n        const metricsSize = this.getMetricsSize(this.metrics.bcr);\n\n        // Parse offset\n        const offset = this.attributes.scrollOffset.split(',');\n        const offsetStart = offset[0]?.trim() ?? '0';\n        const offsetEnd = offset[1]?.trim() ?? '0';\n\n        // Parse positions\n        const scrollPosition = this.attributes.scrollPosition.split(',');\n        let scrollPositionStart = scrollPosition[0]?.trim() ?? 'start';\n        const scrollPositionEnd = scrollPosition[1]?.trim() ?? 'end';\n\n        // Calculate viewport offsets\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        // Calculate intersection.start using handlers\n        const startHandler = this.startPositionHandlers[scrollPositionStart];\n        this.intersection.start = startHandler\n            ? startHandler(this.metrics.offsetStart, wSize, viewportStart, metricsSize)\n            : this.metrics.offsetStart - wSize + viewportStart; // default fallback\n\n        // Calculate intersection.end using handlers\n        const endHandler = this.endPositionHandlers[scrollPositionEnd];\n        this.intersection.end = endHandler\n            ? endHandler(this.metrics.offsetStart, viewportEnd, metricsSize)\n            : this.metrics.offsetStart - viewportEnd + metricsSize; // default fallback\n\n        // Ensure end > start\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                case 'middle':\n                    this.intersection.end = this.intersection.start + metricsSize * 0.5;\n                    break;\n                case 'end':\n                    this.intersection.end = this.intersection.start + metricsSize;\n                    break;\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            // 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     * Function to get scroll call from.\n     *\n     * @private\n     */\n    _getScrollCallFrom() {\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     * Lifecyle - Destroy and cleanup the scroll element.\n     *\n     * Removes all CSS modifications and clears references to prevent memory leaks.\n     */\n    public destroy(): void {\n        // Remove CSS variables\n        if (this.attributes.scrollCssProgress) {\n            this.$el.style.removeProperty(PROGRESS_CSS_VAR);\n        }\n\n        // Remove transform if parallax was applied\n        if (this.attributes.scrollSpeed) {\n            this.$el.style.removeProperty('transform');\n        }\n\n        // Remove class if added\n        if (this.isInview && this.attributes.scrollClass) {\n            this.$el.classList.remove(this.attributes.scrollClass);\n        }\n    }\n\n    /**\n     * Function to dispatch a custom event.\n     *\n     * @private\n     *\n     * @param {string} way - Enter or leave.\n     * @param {string} from - Start or end.\n     */\n    _dispatchCall(way: string, from: string) {\n        const customEventName = this.attributes.scrollCall;\n\n        if (!customEventName) return;\n\n        // Using CustomEvent API (https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent)\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 * Integrates Lenis with Locomotive's built-in animation system\n */\n\nimport type {\n    CoreOptions,\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    '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\n/** Default scroll attribute values */\nconst DEFAULT_SCROLL_OFFSET = '0,0';\nconst DEFAULT_SCROLL_POSITION = 'top,bottom';\n\nexport default class Core {\n    private $scrollContainer!: HTMLElement;\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    private lenisInstance: any;\n\n    constructor({\n        $el,\n        triggerRootMargin,\n        rafRootMargin,\n        scrollOrientation,\n        lenisInstance,\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        // Lenis instance\n        this.lenisInstance = lenisInstance;\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 = this.toElementArray($scrollElements);\n        this._subscribeScrollElements($scrollElementsArr);\n\n        // Determine IO root (null for window, wrapper element for custom container)\n        const ioRoot = this.lenisInstance.options.wrapper === window\n            ? null\n            : this.lenisInstance.options.wrapper as HTMLElement;\n\n        // Trigger IO\n        this.IOTriggerInstance = new IO({\n            scrollElements: [...this.triggeredScrollElements],\n            root: ioRoot,\n            rootMargin: this.triggerRootMargin,\n            IORaf: false,\n        });\n\n        // Raf IO\n        this.IORafInstance = new IO({\n            scrollElements: [...this.RAFScrollElements],\n            root: ioRoot,\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        const $scrollElementsToRemoveSet = new Set(Array.from($scrollElementsToRemove));\n\n        // 1. Remove from IO\n        for (let index = 0; index < this.triggeredScrollElements.length; index++) {\n            const scrollElement = this.triggeredScrollElements[index];\n            if ($scrollElementsToRemoveSet.has(scrollElement.$el)) {\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            if ($scrollElementsToRemoveSet.has(scrollElement.$el)) {\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, 0);\n        const fromIndex = maxID + 1;\n        const $scrollElementsArr = this.toElementArray($scrollElements);\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                lenisInstance: this.lenisInstance,\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        // Destroy all scroll elements to clean up CSS and references\n        for (const scrollElement of this.scrollElements) {\n            scrollElement.destroy();\n        }\n\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     * Convert NodeListOf<Element> to HTMLElement array.\n     *\n     * @private\n     *\n     * @param {NodeListOf<Element>} elements - The NodeList to convert.\n     *\n     * @returns {HTMLElement[]}\n     */\n    private toElementArray(elements: NodeListOf<Element>): HTMLElement[] {\n        return Array.from(elements) as HTMLElement[];\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 !== DEFAULT_SCROLL_OFFSET) {\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 !== DEFAULT_SCROLL_POSITION) {\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","import { version } from './package.json'\nimport Lenis from 'lenis';\nimport Core from './core/Core';\nimport type {\n    ILenisScrollToOptions,\n    ILenisScrollValues,\n    ILocomotiveScrollOptions,\n    lenisTargetScrollTo,\n} from './types';\nimport type { LenisOptions } from 'lenis';\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/darkroomengineering/lenis lenis.js}.\n */\n\nexport default class LocomotiveScroll {\n    public rafPlaying: boolean;\n    public lenisInstance: Lenis | null = null;\n\n    private coreInstance: Core | null = null;\n\n    private lenisOptions?: LenisOptions;\n    private triggerRootMargin?: string;\n    private rafRootMargin?: string;\n    private rafInstance?: number;\n    private autoStart?: boolean;\n    private isTouchDevice: boolean;\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    private _originalOnContentResize?: () => void;\n    private _originalOnWrapperResize?: () => void;\n\n    constructor({\n        lenisOptions = {},\n        triggerRootMargin,\n        rafRootMargin,\n        autoStart = true,\n        scrollCallback = () => {},\n        initCustomTicker,\n        destroyCustomTicker,\n    }: ILocomotiveScrollOptions = {}) {\n\n        // Set version\n        window.locomotiveScrollVersion = version;\n\n        // Get arguments\n        Object.assign(this, {\n            lenisOptions,\n            triggerRootMargin,\n            rafRootMargin,\n            autoStart,\n            scrollCallback,\n            initCustomTicker,\n            destroyCustomTicker,\n        });\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        // Detect if device has touch capability\n        this.isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\n        // Init\n        this._init();\n    }\n\n    /**\n     * Lifecyle - Initialize instance.\n     *\n     * @private\n     */\n    private _init(): void {\n        \n        // Create Lenis instance\n        this.lenisInstance = new Lenis({\n            ...this.lenisOptions\n        });\n\n        // Subscribe to scroll callback if provided\n        if (this.scrollCallback) {\n            this.lenisInstance.on('scroll', this.scrollCallback);\n        }\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            // lenisInstance is guaranteed to exist at this point (created above)\n            this.coreInstance = new Core({\n                $el: this.lenisInstance!.rootElement,\n                triggerRootMargin: this.triggerRootMargin,\n                rafRootMargin: this.rafRootMargin,\n                scrollOrientation: this.lenisInstance!.options.orientation,\n                lenisInstance: this.lenisInstance!,\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\n        // Destroy Core after RAF to ensure any pending Intersection Observer callbacks complete\n        // This prevents race conditions when destroy() is called while IO callbacks are queued\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        // Hook into Lenis dimensions resize callbacks\n        // onContentResize: called when content size changes (images load, dynamic content)\n        // onWrapperResize: called when wrapper size changes (window resize, layout changes)\n        if (this.lenisInstance) {\n            this._originalOnContentResize = this.lenisInstance.dimensions.onContentResize.bind(\n                this.lenisInstance.dimensions\n            );\n            this._originalOnWrapperResize = this.lenisInstance.dimensions.onWrapperResize.bind(\n                this.lenisInstance.dimensions\n            );\n\n            this.lenisInstance.dimensions.onContentResize = () => {\n                this._originalOnContentResize?.();\n                this._onResizeBind();\n            };\n\n            this.lenisInstance.dimensions.onWrapperResize = () => {\n                this._originalOnWrapperResize?.();\n                this._onResizeBind();\n            };\n        }\n    }\n\n    /**\n     * Events - Unsubscribe listened events.\n     */\n    private _unbindEvents() {\n        this._unbindScrollToEvents();\n\n        // Restore original Lenis dimensions resize callbacks\n        if (this.lenisInstance) {\n            if (this._originalOnContentResize) {\n                this.lenisInstance.dimensions.onContentResize = this._originalOnContentResize;\n            }\n            if (this._originalOnWrapperResize) {\n                this.lenisInstance.dimensions.onWrapperResize = this._originalOnWrapperResize;\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): void => {\n                ($el as HTMLElement).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) => {\n                ($el as HTMLElement).removeEventListener('click', this._onScrollToBind, false);\n            });\n    }\n\n    /**\n     * Callback - Resize callback.\n     *\n     * Called synchronously after Lenis updates its dimensions via onContentResize/onWrapperResize.\n     * All dimension values are already up-to-date when this executes.\n     */\n    private _onResize() {\n        this.coreInstance?.onResize({\n            currentScroll: this.lenisInstance?.scroll ?? 0,\n            smooth: !this.isTouchDevice,\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 ?? 0,\n            smooth: !this.isTouchDevice,\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.lenisInstance?.options.duration\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\nexport * from './types';\n"],"names":["IO","_ref","scrollElements","_ref$rootMargin","rootMargin","_ref$root","root","IORaf","observer","this","_init","_proto","prototype","_this","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","_step","_iterator","_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","PROGRESS_CSS_VAR","ScrollElement","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","id","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","lenisInstance","intersection","metrics","currentScroll","translateValue","progress","lastProgress","isInview","isInteractive","isInFold","isFirstResize","getWindowSize","getMetricsStart","getMetricsSize","startPositionHandlers","start","offsetStart","wSize","viewport","middle","size","end","fold","endPositionHandlers","scrollClass","dataset","scrollOffset","scrollPosition","scrollCssProgress","undefined","scrollEventProgress","scrollSpeed","parseFloat","scrollCall","scrollIgnoreFold","scrollEnableTouchSpeed","offsetEnd","bcr","scroll","dimensions","height","width","top","left","_resize","onResize","_ref2","onRender","_ref3","smooth","_computeProgress","isNaN","max","style","transform","classList","add","from","_getScrollCallFrom","_dispatchCall","remove","getBoundingClientRect","_computeMetrics","_computeIntersection","metricsStart","metricsSize","_offset$0$trim","_offset$","_offset$1$trim","_offset$2","_scrollPosition$0$tri","_scrollPosition$","_scrollPosition$1$tri","_scrollPosition$2","offset","split","trim","scrollPositionStart","scrollPositionEnd","viewportStart","includes","parseInt","replace","viewportEnd","startHandler","endHandler","forcedProgress","_setCssProgress","_setCustomEventProgress","currentProgress","setProperty","toString","customEventName","customEvent","CustomEvent","detail","window","dispatchEvent","closestIntersectionValue","removeProperty","way","ATTRIBUTES_THAT_NEED_RAF","Core","triggerRootMargin","rafRootMargin","$scrollContainer","triggeredScrollElements","RAFScrollElements","scrollElementsToUpdate","IOTriggerInstance","IORafInstance","console","error","$scrollElements","querySelectorAll","$scrollElementsArr","toElementArray","_subscribeScrollElements","ioRoot","options","wrapper","concat","_unsubscribeAllScrollElements","_step2","_iterator2","removeScrollElements","$oldContainer","$scrollElementsToRemove","length","$scrollElementsToRemoveSet","Set","Array","index","has","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","filter","scrollElementItem","addScrollElements","$newContainer","ids","push","fromIndex","apply","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","_step3","_iterator3","scrollElementToUpdate","elements","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","_iterator4","_step4","LocomotiveScroll","_temp","_ref$lenisOptions","lenisOptions","_ref$autoStart","autoStart","_ref$scrollCallback","scrollCallback","initCustomTicker","destroyCustomTicker","rafPlaying","coreInstance","rafInstance","isTouchDevice","_onRenderBind","_onResizeBind","_onScrollToBind","_originalOnContentResize","_originalOnWrapperResize","locomotiveScrollVersion","Object","assign","_onRender","_onScrollTo","_onResize","navigator","maxTouchPoints","Lenis","_extends","on","document","documentElement","setAttribute","orientation","requestAnimationFrame","rootElement","_bindEvents","warn","_this$lenisInstance","_this2","stop","_unbindEvents","_this2$coreInstance","_this3","_bindScrollToEvents","onContentResize","onWrapperResize","_unbindScrollToEvents","$container","_this$lenisInstance2","_this4","$rootContainer","$scrollToElements","addEventListener","_this$lenisInstance3","_this5","removeEventListener","_this$coreInstance","_this$lenisInstance$s","_this$lenisInstance4","_this$lenisInstance5","_this$coreInstance2","_this$lenisInstance$s2","_this$lenisInstance6","raf","Date","now","event","_event$currentTarget","_this$lenisInstance7","preventDefault","$target","currentTarget","getAttribute","duration","scrollTo","_this$lenisInstance8","_raf","_this$lenisInstance9","cancelAnimationFrame","_this$coreInstance3","_this$coreInstance4","_this6","resize","_this$lenisInstance0","lerp","immediate","lock","force","easing","onComplete","_this7"],"mappings":"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"}