{"version":3,"file":"locomotive-scroll.modern.mjs","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","constructor","scrollElements","rootMargin","root","IORaf","this","observer","_init","IntersectionObserver","entries","forEach","entry","$targetItem","find","item","$el","target","isIntersecting","isAlreadyIntersected","_setInview","_setOutOfView","scrollElement","observe","destroy","disconnect","$scrollElement","unobserve","setInteractivityOn","setInview","setInteractivityOff","setOutOfView","attributes","scrollRepeat","mapRange","inMin","inMax","outMin","outMax","value","closestNumber","array","reduce","prev","curr","Math","abs","PROGRESS_CSS_VAR","ScrollElement","id","subscribeElementUpdateFn","unsubscribeElementUpdateFn","needRaf","scrollOrientation","lenisInstance","_this$$el$dataset$scr","_this$$el$dataset$scr2","_this$$el$dataset$scr3","_this$$el$dataset$scr4","_this$$el$dataset$scr5","intersection","metrics","currentScroll","translateValue","progress","lastProgress","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","onRender","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","_unsubscribeAllScrollElements","removeScrollElements","$oldContainer","$scrollElementsToRemove","length","$scrollElementsToRemoveSet","Set","Array","index","has","splice","targetScrollElementToUpdate","targetScrollElement","_unsubscribeElementUpdate","filter","scrollElementItem","addScrollElements","$newContainer","ids","push","fromIndex","toObserve","_checkRafNeeded","scrollElementInstance","_subscribeElementUpdate","bind","scrollElementToUpdate","elements","attributesThatNeedRaf","removeAttribute","attributeToRemove","attribute","map","test","join","LocomotiveScroll","lenisOptions","autoStart","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","stop","_unbindEvents","_this$coreInstance","_bindScrollToEvents","onContentResize","onWrapperResize","_this$_originalOnCont","call","_this$_originalOnWrap","_unbindScrollToEvents","$container","_this$lenisInstance2","$rootContainer","$scrollToElements","addEventListener","_this$lenisInstance3","removeEventListener","_this$coreInstance2","_this$lenisInstance$s","_this$lenisInstance4","_this$lenisInstance5","_this$coreInstance3","_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$coreInstance4","_this$coreInstance5","resize","_this$lenisInstance0","lerp","immediate","lock","force","easing","onComplete"],"mappings":"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"}