{"version":3,"file":"lenis.modern.mjs","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.js"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n  return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n  return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n  return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n  return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n  return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n  // Advance the animation by the given delta time\r\n  advance(deltaTime) {\r\n    if (!this.isRunning) return\r\n\r\n    let completed = false\r\n\r\n    if (this.lerp) {\r\n      this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n      if (Math.round(this.value) === this.to) {\r\n        this.value = this.to\r\n        completed = true\r\n      }\r\n    } else {\r\n      this.currentTime += deltaTime\r\n      const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n      completed = linearProgress >= 1\r\n      const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n      this.value = this.from + (this.to - this.from) * easedProgress\r\n    }\r\n\r\n    // Call the onUpdate callback with the current value and completed status\r\n    this.onUpdate?.(this.value, { completed })\r\n\r\n    if (completed) {\r\n      this.stop()\r\n    }\r\n  }\r\n\r\n  // Stop the animation\r\n  stop() {\r\n    this.isRunning = false\r\n  }\r\n\r\n  // Set up the animation from a starting value to an ending value\r\n  // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n  fromTo(from, to, { lerp = 0.1, duration = 1, easing = (t) => t, onUpdate }) {\r\n    this.from = this.value = from\r\n    this.to = to\r\n    this.lerp = lerp\r\n    this.duration = duration\r\n    this.easing = easing\r\n    this.currentTime = 0\r\n    this.isRunning = true\r\n\r\n    this.onUpdate = onUpdate\r\n  }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n  constructor({ wrapper, content, autoResize = true } = {}) {\r\n    this.wrapper = wrapper\r\n    this.content = content\r\n\r\n    if (autoResize) {\r\n      const resize = debounce(this.resize, 250)\r\n\r\n      if (this.wrapper !== window) {\r\n        this.wrapperResizeObserver = new ResizeObserver(resize)\r\n        this.wrapperResizeObserver.observe(this.wrapper)\r\n      }\r\n\r\n      this.contentResizeObserver = new ResizeObserver(resize)\r\n      this.contentResizeObserver.observe(this.content)\r\n    }\r\n\r\n    this.resize()\r\n  }\r\n\r\n  destroy() {\r\n    this.wrapperResizeObserver?.disconnect()\r\n    this.contentResizeObserver?.disconnect()\r\n  }\r\n\r\n  resize = () => {\r\n    this.onWrapperResize()\r\n    this.onContentResize()\r\n  }\r\n\r\n  onWrapperResize = () => {\r\n    if (this.wrapper === window) {\r\n      this.width = window.innerWidth\r\n      this.height = window.innerHeight\r\n    } else {\r\n      this.width = this.wrapper.clientWidth\r\n      this.height = this.wrapper.clientHeight\r\n    }\r\n  }\r\n\r\n  onContentResize = () => {\r\n    this.scrollHeight = this.content.scrollHeight\r\n    this.scrollWidth = this.content.scrollWidth\r\n  }\r\n\r\n  get limit() {\r\n    return {\r\n      x: this.scrollWidth - this.width,\r\n      y: this.scrollHeight - this.height,\r\n    }\r\n  }\r\n}\r\n","export function debounce(callback, delay) {\r\n  let timer\r\n  return function () {\r\n    let args = arguments\r\n    let context = this\r\n    clearTimeout(timer)\r\n    timer = setTimeout(function () {\r\n      callback.apply(context, args)\r\n    }, delay)\r\n  }\r\n}\r\n","export class Emitter {\r\n  constructor() {\r\n    this.events = {}\r\n  }\r\n\r\n  emit(event, ...args) {\r\n    let callbacks = this.events[event] || []\r\n    for (let i = 0, length = callbacks.length; i < length; i++) {\r\n      callbacks[i](...args)\r\n    }\r\n  }\r\n\r\n  on(event, cb) {\r\n    // Add the callback to the event's callback list, or create a new list with the callback\r\n    this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n    // Return an unsubscribe function\r\n    return () => {\r\n      this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n    }\r\n  }\r\n\r\n  off(event, callback) {\r\n    this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n  }\r\n\r\n  destroy() {\r\n    this.events = {}\r\n  }\r\n}\r\n","import { Emitter } from './emitter'\r\nimport { clamp } from './maths'\r\n\r\nexport class VirtualScroll {\r\n  constructor(\r\n    element,\r\n    { wheelMultiplier = 1, touchMultiplier = 2, normalizeWheel = false }\r\n  ) {\r\n    this.element = element\r\n    this.wheelMultiplier = wheelMultiplier\r\n    this.touchMultiplier = touchMultiplier\r\n    this.normalizeWheel = normalizeWheel\r\n\r\n    this.touchStart = {\r\n      x: null,\r\n      y: null,\r\n    }\r\n\r\n    this.emitter = new Emitter()\r\n\r\n    this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n    this.element.addEventListener('touchstart', this.onTouchStart, {\r\n      passive: false,\r\n    })\r\n    this.element.addEventListener('touchmove', this.onTouchMove, {\r\n      passive: false,\r\n    })\r\n    this.element.addEventListener('touchend', this.onTouchEnd, {\r\n      passive: false,\r\n    })\r\n  }\r\n\r\n  // Add an event listener for the given event and callback\r\n  on(event, callback) {\r\n    return this.emitter.on(event, callback)\r\n  }\r\n\r\n  // Remove all event listeners and clean up\r\n  destroy() {\r\n    this.emitter.destroy()\r\n\r\n    this.element.removeEventListener('wheel', this.onWheel, {\r\n      passive: false,\r\n    })\r\n    this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n      passive: false,\r\n    })\r\n    this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n      passive: false,\r\n    })\r\n    this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n      passive: false,\r\n    })\r\n  }\r\n\r\n  // Event handler for 'touchstart' event\r\n  onTouchStart = (event) => {\r\n    const { clientX, clientY } = event.targetTouches\r\n      ? event.targetTouches[0]\r\n      : event\r\n\r\n    this.touchStart.x = clientX\r\n    this.touchStart.y = clientY\r\n\r\n    this.lastDelta = {\r\n      x: 0,\r\n      y: 0,\r\n    }\r\n  }\r\n\r\n  // Event handler for 'touchmove' event\r\n  onTouchMove = (event) => {\r\n    const { clientX, clientY } = event.targetTouches\r\n      ? event.targetTouches[0]\r\n      : event\r\n\r\n    const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n    const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n    this.touchStart.x = clientX\r\n    this.touchStart.y = clientY\r\n\r\n    this.lastDelta = {\r\n      x: deltaX,\r\n      y: deltaY,\r\n    }\r\n\r\n    this.emitter.emit('scroll', {\r\n      deltaX,\r\n      deltaY,\r\n      event,\r\n    })\r\n  }\r\n\r\n  onTouchEnd = (event) => {\r\n    this.emitter.emit('scroll', {\r\n      deltaX: this.lastDelta.x,\r\n      deltaY: this.lastDelta.y,\r\n      event,\r\n    })\r\n  }\r\n\r\n  // Event handler for 'wheel' event\r\n  onWheel = (event) => {\r\n    let { deltaX, deltaY } = event\r\n\r\n    if (this.normalizeWheel) {\r\n      deltaX = clamp(-100, deltaX, 100)\r\n      deltaY = clamp(-100, deltaY, 100)\r\n    }\r\n\r\n    deltaX *= this.wheelMultiplier\r\n    deltaY *= this.wheelMultiplier\r\n\r\n    this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n  }\r\n}\r\n","import { version } from '../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\nexport default class Lenis {\r\n  // isScrolling = true when scroll is animating\r\n  // isStopped = true if user should not be able to scroll - enable/disable programmatically\r\n  // isSmooth = true if scroll should be animated\r\n  // isLocked = same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n  /**\r\n   * @typedef {(t: number) => number} EasingFunction\r\n   * @typedef {'vertical' | 'horizontal'} Orientation\r\n   * @typedef {'vertical' | 'horizontal' | 'both'} GestureOrientation\r\n   *\r\n   * @typedef LenisOptions\r\n   * @property {Window | HTMLElement} [wrapper]\r\n   * @property {HTMLElement} [content]\r\n   * @property {Window | HTMLElement} [wheelEventsTarget]\r\n   * @property {boolean} [smoothWheel]\r\n   * @property {boolean} [smoothTouch]\r\n   * @property {boolean} [syncTouch]\r\n   * @property {number} [syncTouchLerp]\r\n   * @property {number} [touchInertiaMultiplier]\r\n   * @property {number} [duration]\r\n   * @property {EasingFunction} [easing]\r\n   * @property {number} [lerp]\r\n   * @property {boolean} [infinite]\r\n   * @property {Orientation} [orientation]\r\n   * @property {GestureOrientation} [gestureOrientation]\r\n   * @property {number} [touchMultiplier]\r\n   * @property {number} [wheelMultiplier]\r\n   * @property {boolean} [normalizeWheel]\r\n   * @property {boolean} [autoResize]\r\n   *\r\n   * @param {LenisOptions}\r\n   */\r\n  constructor({\r\n    wrapper = window,\r\n    content = document.documentElement,\r\n    wheelEventsTarget = wrapper,\r\n    smoothWheel = true,\r\n    smoothTouch = false,\r\n    syncTouch = false,\r\n    syncTouchLerp = 0.1,\r\n    __iosNoInertiaSyncTouchLerp = 0.4, // should be 1 but had to leave 0.4 for iOS (testing purpose)\r\n    touchInertiaMultiplier = 35,\r\n    duration, // in seconds\r\n    easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n    lerp = duration && 0.1,\r\n    infinite = false,\r\n    orientation = 'vertical', // vertical, horizontal\r\n    gestureOrientation = 'vertical', // vertical, horizontal, both\r\n    touchMultiplier = 1,\r\n    wheelMultiplier = 1,\r\n    normalizeWheel = false,\r\n    autoResize = true,\r\n  } = {}) {\r\n    window.lenisVersion = version\r\n\r\n    // if wrapper is html or body, fallback to window\r\n    if (wrapper === document.documentElement || wrapper === document.body) {\r\n      wrapper = window\r\n    }\r\n\r\n    this.options = {\r\n      wrapper,\r\n      content,\r\n      wheelEventsTarget,\r\n      smoothWheel,\r\n      smoothTouch,\r\n      syncTouch,\r\n      syncTouchLerp,\r\n      __iosNoInertiaSyncTouchLerp,\r\n      touchInertiaMultiplier,\r\n      duration,\r\n      easing,\r\n      lerp,\r\n      infinite,\r\n      gestureOrientation,\r\n      orientation,\r\n      touchMultiplier,\r\n      wheelMultiplier,\r\n      normalizeWheel,\r\n      autoResize,\r\n    }\r\n\r\n    this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n    this.rootElement.classList.add('lenis')\r\n\r\n    this.velocity = 0\r\n    this.isStopped = false\r\n    this.isSmooth = smoothWheel || smoothTouch\r\n    this.isScrolling = false\r\n    this.targetScroll = this.animatedScroll = this.actualScroll\r\n    this.animate = new Animate()\r\n    this.emitter = new Emitter()\r\n\r\n    this.options.wrapper.addEventListener('scroll', this.onScroll, {\r\n      passive: false,\r\n    })\r\n\r\n    this.virtualScroll = new VirtualScroll(wheelEventsTarget, {\r\n      touchMultiplier,\r\n      wheelMultiplier,\r\n      normalizeWheel,\r\n    })\r\n    this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n  }\r\n\r\n  destroy() {\r\n    this.emitter.destroy()\r\n\r\n    this.options.wrapper.removeEventListener('scroll', this.onScroll, {\r\n      passive: false,\r\n    })\r\n\r\n    this.virtualScroll.destroy()\r\n    this.dimensions.destroy()\r\n\r\n    this.rootElement.classList.remove('lenis')\r\n    this.rootElement.classList.remove('lenis-smooth')\r\n    this.rootElement.classList.remove('lenis-scrolling')\r\n    this.rootElement.classList.remove('lenis-stopped')\r\n  }\r\n\r\n  on(event, callback) {\r\n    return this.emitter.on(event, callback)\r\n  }\r\n\r\n  off(event, callback) {\r\n    return this.emitter.off(event, callback)\r\n  }\r\n\r\n  setScroll(scroll) {\r\n    // apply scroll value immediately\r\n    if (this.isHorizontal) {\r\n      this.rootElement.scrollLeft = scroll\r\n    } else {\r\n      this.rootElement.scrollTop = scroll\r\n    }\r\n  }\r\n\r\n  onVirtualScroll = ({ deltaX, deltaY, event }) => {\r\n    // keep zoom feature\r\n    if (event.ctrlKey) return\r\n\r\n    const isTouch = event.type.includes('touch')\r\n    const isWheel = event.type.includes('wheel')\r\n\r\n    if (\r\n      (this.options.gestureOrientation === 'vertical' && deltaY === 0) || // trackpad previous/next page gesture\r\n      (this.options.gestureOrientation === 'horizontal' && deltaX === 0) ||\r\n      (isTouch &&\r\n        this.options.gestureOrientation === 'vertical' &&\r\n        this.scroll === 0 &&\r\n        !this.options.infinite &&\r\n        deltaY <= 0) // touch pull to refresh\r\n    )\r\n      return\r\n\r\n    // catch if scrolling on nested scroll elements\r\n    let composedPath = event.composedPath()\r\n    composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n    if (\r\n      !!composedPath.find(\r\n        (node) =>\r\n          node.hasAttribute?.('data-lenis-prevent') ||\r\n          (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n          (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n          node.classList?.contains('lenis') // nested lenis instance\r\n      )\r\n    )\r\n      return\r\n\r\n    if (this.isStopped || this.isLocked) {\r\n      event.preventDefault()\r\n      return\r\n    }\r\n\r\n    this.isSmooth =\r\n      ((this.options.smoothTouch || this.options.syncTouch) && isTouch) ||\r\n      (this.options.smoothWheel && isWheel)\r\n\r\n    if (!this.isSmooth) {\r\n      this.isScrolling = false\r\n      this.animate.stop()\r\n      return\r\n    }\r\n\r\n    event.preventDefault()\r\n\r\n    let delta = deltaY\r\n    if (this.options.gestureOrientation === 'both') {\r\n      delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n    } else if (this.options.gestureOrientation === 'horizontal') {\r\n      delta = deltaX\r\n    }\r\n\r\n    const syncTouch = isTouch && this.options.syncTouch\r\n    const isTouchEnd = isTouch && event.type === 'touchend'\r\n    const hasTouchInertia = isTouchEnd && Math.abs(delta) > 1\r\n    if (hasTouchInertia) {\r\n      delta = this.velocity * this.options.touchInertiaMultiplier\r\n    }\r\n\r\n    this.scrollTo(this.targetScroll + delta, {\r\n      programmatic: false,\r\n      ...(syncTouch && {\r\n        lerp: hasTouchInertia\r\n          ? this.syncTouchLerp\r\n          : this.options.__iosNoInertiaSyncTouchLerp,\r\n      }),\r\n    })\r\n  }\r\n\r\n  resize() {\r\n    this.dimensions.resize()\r\n  }\r\n\r\n  emit() {\r\n    this.emitter.emit('scroll', this)\r\n  }\r\n\r\n  onScroll = () => {\r\n    if (!this.isScrolling) {\r\n      const lastScroll = this.animatedScroll\r\n      this.animatedScroll = this.targetScroll = this.actualScroll\r\n      this.velocity = 0\r\n      this.direction = Math.sign(this.animatedScroll - lastScroll)\r\n      this.emit()\r\n    }\r\n  }\r\n\r\n  reset() {\r\n    this.isLocked = false\r\n    this.isScrolling = false\r\n    this.velocity = 0\r\n    this.animate.stop()\r\n  }\r\n\r\n  start() {\r\n    this.isStopped = false\r\n\r\n    this.reset()\r\n  }\r\n\r\n  stop() {\r\n    this.isStopped = true\r\n    this.animate.stop()\r\n\r\n    this.reset()\r\n  }\r\n\r\n  raf(time) {\r\n    const deltaTime = time - (this.time || time)\r\n    this.time = time\r\n\r\n    this.animate.advance(deltaTime * 0.001)\r\n  }\r\n\r\n  scrollTo(\r\n    target,\r\n    {\r\n      offset = 0,\r\n      immediate = false,\r\n      lock = false,\r\n      duration = this.options.duration,\r\n      easing = this.options.easing,\r\n      lerp = !duration && this.options.lerp,\r\n      onComplete = null,\r\n      force = false, // scroll even if stopped\r\n      programmatic = true, // called from outside of the class\r\n    } = {}\r\n  ) {\r\n    if (this.isStopped && !force) return\r\n\r\n    // keywords\r\n    if (['top', 'left', 'start'].includes(target)) {\r\n      target = 0\r\n    } else if (['bottom', 'right', 'end'].includes(target)) {\r\n      target = this.limit\r\n    } else {\r\n      let node\r\n\r\n      if (typeof target === 'string') {\r\n        // CSS selector\r\n        node = document.querySelector(target)\r\n      } else if (target?.nodeType) {\r\n        // Node element\r\n        node = target\r\n      }\r\n\r\n      if (node) {\r\n        if (this.options.wrapper !== window) {\r\n          // nested scroll offset correction\r\n          const wrapperRect = this.options.wrapper.getBoundingClientRect()\r\n          offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n        }\r\n\r\n        const rect = node.getBoundingClientRect()\r\n\r\n        target =\r\n          (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n      }\r\n    }\r\n\r\n    if (typeof target !== 'number') return\r\n\r\n    target += offset\r\n    target = Math.round(target)\r\n\r\n    if (this.options.infinite) {\r\n      if (programmatic) {\r\n        this.targetScroll = this.animatedScroll = this.scroll\r\n      }\r\n    } else {\r\n      target = clamp(0, target, this.limit)\r\n    }\r\n\r\n    if (immediate) {\r\n      this.animatedScroll = this.targetScroll = target\r\n      this.setScroll(this.scroll)\r\n      this.reset()\r\n      this.emit()\r\n      onComplete?.()\r\n      return\r\n    }\r\n\r\n    if (!programmatic) {\r\n      if (target === this.targetScroll) return\r\n\r\n      this.targetScroll = target\r\n    }\r\n\r\n    this.animate.fromTo(this.animatedScroll, target, {\r\n      duration,\r\n      easing,\r\n      lerp,\r\n      onUpdate: (value, { completed }) => {\r\n        // started\r\n        if (lock) this.isLocked = true\r\n        this.isScrolling = true\r\n\r\n        // updated\r\n        this.velocity = value - this.animatedScroll\r\n        this.direction = Math.sign(this.velocity)\r\n\r\n        this.animatedScroll = value\r\n        this.setScroll(this.scroll)\r\n\r\n        if (programmatic) {\r\n          // wheel during programmatic should stop it\r\n          this.targetScroll = value\r\n        }\r\n\r\n        // completed\r\n        if (completed) {\r\n          if (lock) this.isLocked = false\r\n          requestAnimationFrame(() => {\r\n            //avoid double scroll event\r\n            this.isScrolling = false\r\n          })\r\n          this.velocity = 0\r\n          onComplete?.()\r\n        }\r\n\r\n        this.emit()\r\n      },\r\n    })\r\n  }\r\n\r\n  get rootElement() {\r\n    return this.options.wrapper === window\r\n      ? this.options.content\r\n      : this.options.wrapper\r\n  }\r\n\r\n  get limit() {\r\n    return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n  }\r\n\r\n  get isHorizontal() {\r\n    return this.options.orientation === 'horizontal'\r\n  }\r\n\r\n  get actualScroll() {\r\n    // value browser takes into account\r\n    return this.isHorizontal\r\n      ? this.rootElement.scrollLeft\r\n      : this.rootElement.scrollTop\r\n  }\r\n\r\n  get scroll() {\r\n    return this.options.infinite\r\n      ? modulo(this.animatedScroll, this.limit)\r\n      : this.animatedScroll\r\n  }\r\n\r\n  get progress() {\r\n    // avoid progress to be NaN\r\n    return this.limit === 0 ? 1 : this.scroll / this.limit\r\n  }\r\n\r\n  get isSmooth() {\r\n    return this.__isSmooth\r\n  }\r\n\r\n  set isSmooth(value) {\r\n    if (this.__isSmooth !== value) {\r\n      this.rootElement.classList.toggle('lenis-smooth', value)\r\n      this.__isSmooth = value\r\n    }\r\n  }\r\n\r\n  get isScrolling() {\r\n    return this.__isScrolling\r\n  }\r\n\r\n  set isScrolling(value) {\r\n    if (this.__isScrolling !== value) {\r\n      this.rootElement.classList.toggle('lenis-scrolling', value)\r\n      this.__isScrolling = value\r\n    }\r\n  }\r\n\r\n  get isStopped() {\r\n    return this.__isStopped\r\n  }\r\n\r\n  set isStopped(value) {\r\n    if (this.__isStopped !== value) {\r\n      this.rootElement.classList.toggle('lenis-stopped', value)\r\n      this.__isStopped = value\r\n    }\r\n  }\r\n\r\n  get className() {\r\n    let className = 'lenis'\r\n    if (this.isStopped) className += ' lenis-stopped'\r\n    if (this.isScrolling) className += ' lenis-scrolling'\r\n    if (this.isSmooth) className += ' lenis-smooth'\r\n    return className\r\n  }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","_this$onUpdate","this","isRunning","completed","lerp","value","x","y","to","t","exp","round","currentTime","linearProgress","duration","easedProgress","easing","from","onUpdate","call","stop","fromTo","Dimensions","constructor","wrapper","content","autoResize","resize","onWrapperResize","onContentResize","window","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","debounce","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","_this$wrapperResizeOb","_this$contentResizeOb","disconnect","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","_this$events$event","push","_this$events$event2","filter","off","_this$events$event3","VirtualScroll","element","wheelMultiplier","touchMultiplier","normalizeWheel","onTouchStart","clientX","clientY","targetTouches","touchStart","lastDelta","onTouchMove","deltaX","deltaY","emitter","onTouchEnd","onWheel","addEventListener","passive","removeEventListener","Lenis","document","documentElement","wheelEventsTarget","smoothWheel","smoothTouch","syncTouch","syncTouchLerp","__iosNoInertiaSyncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","options","scroll","composedPath","slice","indexOf","rootElement","find","node","_node$classList","hasAttribute","classList","contains","isStopped","isLocked","preventDefault","isSmooth","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","_extends","programmatic","onScroll","lastScroll","animatedScroll","actualScroll","direction","sign","lenisVersion","body","dimensions","add","virtualScroll","remove","setScroll","isHorizontal","scrollLeft","scrollTop","reset","start","raf","time","target","offset","immediate","lock","onComplete","force","_target","querySelector","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","requestAnimationFrame","d","progress","__isSmooth","toggle","__isScrolling","__isStopped","className"],"mappings":"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"}