{"mappings":"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","names":["version","clamp","min","input","max","lerp","x","y","t","damp","lambda","deltaTime","modulo","n","d","Animate","completed","linearProgress","easedProgress","from","to","duration","easing","onStart","onUpdate","debounce","callback","delay","timer","args","context","Dimensions","wrapper","content","autoResize","debounceValue","Emitter","event","callbacks","i","length","cb","LINE_HEIGHT","listenerOptions","VirtualScroll","element","options","clientX","clientY","deltaX","deltaY","deltaMode","multiplierX","multiplierY","Lenis","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","infinite","orientation","gestureOrientation","touchMultiplier","wheelMultiplier","prevent","virtualScroll","overscroll","autoRaf","anchors","__experimental__naiveDimensions","e","scroll","anchor","node","id","data","isTouch","isWheel","isClickOrTap","isUnknownGesture","composedPath","delta","isSyncTouch","hasTouchInertia","lastScroll","time","target","offset","immediate","lock","onComplete","force","programmatic","userData","wrapperRect","rect","value","className"],"sources":["../esm/npm/lenis@1.1.20/node_modules/lenis/package.json","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/maths.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/animate.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/debounce.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/dimensions.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/emitter.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/virtual-scroll.ts","../esm/npm/lenis@1.1.20/node_modules/lenis/packages/core/src/lenis.ts"],"sourcesContent":["{\r\n  \"name\": \"lenis\",\r\n  \"version\": \"1.1.20\",\r\n  \"description\": \"How smooth scroll should be\",\r\n  \"type\": \"module\",\r\n  \"sideEffects\": false,\r\n  \"author\": \"darkroom.engineering\",\r\n  \"license\": \"MIT\",\r\n  \"repository\": {\r\n    \"type\": \"git\",\r\n    \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n  },\r\n  \"bugs\": {\r\n    \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n  },\r\n  \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n  \"funding\": {\r\n    \"type\": \"github\",\r\n    \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n  },\r\n  \"keywords\": [\r\n    \"scroll\",\r\n    \"smooth\",\r\n    \"lenis\",\r\n    \"react\",\r\n    \"vue\"\r\n  ],\r\n  \"scripts\": {\r\n    \"build\": \"pnpm build:core \u0026\u0026 pnpm build:all\",\r\n    \"build:core\": \"tsup --config tsup.core.ts\",\r\n    \"build:all\": \"tsup\",\r\n    \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n    \"dev:build\": \"tsup --watch\",\r\n    \"dev:playground\": \"pnpm --filter playground dev\",\r\n    \"readme\": \"node ./scripts/update-readme.js\",\r\n    \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n    \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n    \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n    \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n    \"postversion\": \"pnpm build \u0026\u0026 pnpm readme\",\r\n    \"publish:main\": \"npm publish\",\r\n    \"publish:dev\": \"npm publish --tag dev\"\r\n  },\r\n  \"files\": [\r\n    \"dist\"\r\n  ],\r\n  \"devDependencies\": {\r\n    \"terser\": \"^5.37.0\",\r\n    \"tsup\": \"^8.2.4\",\r\n    \"typescript\": \"^5.4.5\"\r\n  },\r\n  \"peerDependencies\": {\r\n    \"react\": \"\u003e=17.0.0\",\r\n    \"vue\": \"\u003e=3.0.0\"\r\n  },\r\n  \"peerDependenciesMeta\": {\r\n    \"react\": {\r\n      \"optional\": true\r\n    },\r\n    \"vue\": {\r\n      \"optional\": true\r\n    }\r\n  },\r\n  \"unpkg\": \"./dist/lenis.mjs\",\r\n  \"main\": \"./dist/lenis.mjs\",\r\n  \"module\": \"./dist/lenis.mjs\",\r\n  \"types\": \"./dist/lenis.d.ts\",\r\n  \"exports\": {\r\n    \".\": {\r\n      \"types\": \"./dist/lenis.d.ts\",\r\n      \"default\": \"./dist/lenis.mjs\"\r\n    },\r\n    \"./react\": {\r\n      \"types\": \"./dist/lenis-react.d.ts\",\r\n      \"default\": \"./dist/lenis-react.mjs\"\r\n    },\r\n    \"./snap\": {\r\n      \"types\": \"./dist/lenis-snap.d.ts\",\r\n      \"default\": \"./dist/lenis-snap.mjs\"\r\n    },\r\n    \"./vue\": {\r\n      \"types\": \"./dist/lenis-vue.d.ts\",\r\n      \"default\": \"./dist/lenis-vue.mjs\"\r\n    },\r\n    \"./dist/*\": \"./dist/*\"\r\n  }\r\n}\r\n","/**\r\n * Clamp a value between a minimum and maximum value\r\n *\r\n * @param min Minimum value\r\n * @param input Value to clamp\r\n * @param max Maximum value\r\n * @returns Clamped value\r\n */\r\nexport function clamp(min: number, input: number, max: number) {\r\n  return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n/**\r\n * Truncate a floating-point number to a specified number of decimal places\r\n *\r\n * @param value Value to truncate\r\n * @param decimals Number of decimal places to truncate to\r\n * @returns Truncated value\r\n */\r\nexport function truncate(value: number, decimals = 0) {\r\n  return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n/**\r\n *  Linearly interpolate between two values using an amount (0 \u003c= t \u003c= 1)\r\n *\r\n * @param x First value\r\n * @param y Second value\r\n * @param t Amount to interpolate (0 \u003c= t \u003c= 1)\r\n * @returns Interpolated value\r\n */\r\nexport function lerp(x: number, y: number, t: number) {\r\n  return (1 - t) * x + t * y\r\n}\r\n\r\n/**\r\n * Damp a value over time using a damping factor\r\n * {@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}\r\n *\r\n * @param x Initial value\r\n * @param y Target value\r\n * @param lambda Damping factor\r\n * @param dt Time elapsed since the last update\r\n * @returns Damped value\r\n */\r\nexport function damp(x: number, y: number, lambda: number, deltaTime: number) {\r\n  return lerp(x, y, 1 - Math.exp(-lambda * deltaTime))\r\n}\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 * {@link https://anguscroll.com/just/just-modulo}\r\n *\r\n * @param n Dividend\r\n * @param d Divisor\r\n * @returns Modulo\r\n */\r\nexport function modulo(n: number, d: number) {\r\n  return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\nimport type { EasingFunction, FromToOptions, OnUpdateCallback } from './types'\r\n\r\n/**\r\n * Animate class to handle value animations with lerping or easing\r\n *\r\n * @example\r\n * const animate = new Animate()\r\n * animate.fromTo(0, 100, { duration: 1, easing: (t) =\u003e t })\r\n * animate.advance(0.5) // 50\r\n */\r\nexport class Animate {\r\n  isRunning = false\r\n  value = 0\r\n  from = 0\r\n  to = 0\r\n  currentTime = 0\r\n\r\n  // These are instanciated in the fromTo method\r\n  lerp?: number\r\n  duration?: number\r\n  easing?: EasingFunction\r\n  onUpdate?: OnUpdateCallback\r\n\r\n  /**\r\n   * Advance the animation by the given delta time\r\n   *\r\n   * @param deltaTime - The time in seconds to advance the animation\r\n   */\r\n  advance(deltaTime: number) {\r\n    if (!this.isRunning) return\r\n\r\n    let completed = false\r\n\r\n    if (this.duration \u0026\u0026 this.easing) {\r\n      this.currentTime += deltaTime\r\n      const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n      completed = linearProgress \u003e= 1\r\n      const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n      this.value = this.from + (this.to - this.from) * easedProgress\r\n    } else 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      // If no easing or lerp, just jump to the end value\r\n      this.value = this.to\r\n      completed = true\r\n    }\r\n\r\n    if (completed) {\r\n      this.stop()\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\r\n  /** Stop the animation */\r\n  stop() {\r\n    this.isRunning = false\r\n  }\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   *\r\n   * @param from - The starting value\r\n   * @param to - The ending value\r\n   * @param options - Options for the animation\r\n   */\r\n  fromTo(\r\n    from: number,\r\n    to: number,\r\n    { lerp, duration, easing, onStart, onUpdate }: FromToOptions\r\n  ) {\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    onStart?.()\r\n    this.onUpdate = onUpdate\r\n  }\r\n}\r\n","export function debounce\u003cCB extends (...args: any[]) =\u003e void\u003e(\r\n  callback: CB,\r\n  delay: number\r\n) {\r\n  let timer: number | undefined\r\n  return function \u003cT\u003e(this: T, ...args: Parameters\u003ctypeof callback\u003e) {\r\n    let context = this\r\n    clearTimeout(timer)\r\n    timer = setTimeout(() =\u003e {\r\n      timer = undefined\r\n      callback.apply(context, args)\r\n    }, delay)\r\n  }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\n/**\r\n * Dimensions class to handle the size of the content and wrapper\r\n *\r\n * @example\r\n * const dimensions = new Dimensions(wrapper, content)\r\n * dimensions.on('resize', (e) =\u003e {\r\n *   console.log(e.width, e.height)\r\n * })\r\n */\r\nexport class Dimensions {\r\n  width = 0\r\n  height = 0\r\n  scrollHeight = 0\r\n  scrollWidth = 0\r\n\r\n  // These are instanciated in the constructor as they need information from the options\r\n  private debouncedResize?: (...args: unknown[]) =\u003e void\r\n  private wrapperResizeObserver?: ResizeObserver\r\n  private contentResizeObserver?: ResizeObserver\r\n\r\n  constructor(\r\n    private wrapper: HTMLElement | Window | Element,\r\n    private content: HTMLElement | Element,\r\n    { autoResize = true, debounce: debounceValue = 250 } = {}\r\n  ) {\r\n    if (autoResize) {\r\n      this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n      if (this.wrapper instanceof Window) {\r\n        window.addEventListener('resize', this.debouncedResize, false)\r\n      } else {\r\n        this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n        this.wrapperResizeObserver.observe(this.wrapper)\r\n      }\r\n\r\n      this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\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    if (this.wrapper === window \u0026\u0026 this.debouncedResize) {\r\n      window.removeEventListener('resize', this.debouncedResize, false)\r\n    }\r\n  }\r\n\r\n  resize = () =\u003e {\r\n    this.onWrapperResize()\r\n    this.onContentResize()\r\n  }\r\n\r\n  onWrapperResize = () =\u003e {\r\n    if (this.wrapper instanceof 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 = () =\u003e {\r\n    if (this.wrapper instanceof Window) {\r\n      this.scrollHeight = this.content.scrollHeight\r\n      this.scrollWidth = this.content.scrollWidth\r\n    } else {\r\n      this.scrollHeight = this.wrapper.scrollHeight\r\n      this.scrollWidth = this.wrapper.scrollWidth\r\n    }\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","/**\r\n * Emitter class to handle events\r\n * @example\r\n * const emitter = new Emitter()\r\n * emitter.on('event', (data) =\u003e {\r\n *   console.log(data)\r\n * })\r\n * emitter.emit('event', 'data')\r\n */\r\nexport class Emitter {\r\n  private events: Record\u003c\r\n    string,\r\n    Array\u003c(...args: unknown[]) =\u003e void\u003e | undefined\r\n  \u003e = {}\r\n\r\n  /**\r\n   * Emit an event with the given data\r\n   * @param event Event name\r\n   * @param args Data to pass to the event handlers\r\n   */\r\n  emit(event: string, ...args: unknown[]) {\r\n    let callbacks = this.events[event] || []\r\n    for (let i = 0, length = callbacks.length; i \u003c length; i++) {\r\n      callbacks[i]?.(...args)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add a callback to the event\r\n   * @param event Event name\r\n   * @param cb Callback function\r\n   * @returns Unsubscribe function\r\n   */\r\n  on\u003cCB extends (...args: any[]) =\u003e void\u003e(event: string, cb: 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 () =\u003e {\r\n      this.events[event] = this.events[event]?.filter((i) =\u003e cb !== i)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a callback from the event\r\n   * @param event Event name\r\n   * @param callback Callback function\r\n   */\r\n  off\u003cCB extends (...args: any[]) =\u003e void\u003e(event: string, callback: CB) {\r\n    this.events[event] = this.events[event]?.filter((i) =\u003e callback !== i)\r\n  }\r\n\r\n  /**\r\n   * Remove all event listeners and clean up\r\n   */\r\n  destroy() {\r\n    this.events = {}\r\n  }\r\n}\r\n","import { Emitter } from './emitter'\r\nimport type { VirtualScrollCallback } from './types'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\nconst listenerOptions: AddEventListenerOptions = { passive: false }\r\n\r\nexport class VirtualScroll {\r\n  touchStart = {\r\n    x: 0,\r\n    y: 0,\r\n  }\r\n  lastDelta = {\r\n    x: 0,\r\n    y: 0,\r\n  }\r\n  window = {\r\n    width: 0,\r\n    height: 0,\r\n  }\r\n  private emitter = new Emitter()\r\n\r\n  constructor(\r\n    private element: HTMLElement,\r\n    private options = { wheelMultiplier: 1, touchMultiplier: 1 }\r\n  ) {\r\n    window.addEventListener('resize', this.onWindowResize, false)\r\n    this.onWindowResize()\r\n\r\n    this.element.addEventListener('wheel', this.onWheel, listenerOptions)\r\n    this.element.addEventListener(\r\n      'touchstart',\r\n      this.onTouchStart,\r\n      listenerOptions\r\n    )\r\n    this.element.addEventListener(\r\n      'touchmove',\r\n      this.onTouchMove,\r\n      listenerOptions\r\n    )\r\n    this.element.addEventListener('touchend', this.onTouchEnd, listenerOptions)\r\n  }\r\n\r\n  /**\r\n   * Add an event listener for the given event and callback\r\n   *\r\n   * @param event Event name\r\n   * @param callback Callback function\r\n   */\r\n  on(event: string, callback: VirtualScrollCallback) {\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    window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n    this.element.removeEventListener('wheel', this.onWheel, listenerOptions)\r\n    this.element.removeEventListener(\r\n      'touchstart',\r\n      this.onTouchStart,\r\n      listenerOptions\r\n    )\r\n    this.element.removeEventListener(\r\n      'touchmove',\r\n      this.onTouchMove,\r\n      listenerOptions\r\n    )\r\n    this.element.removeEventListener(\r\n      'touchend',\r\n      this.onTouchEnd,\r\n      listenerOptions\r\n    )\r\n  }\r\n\r\n  /**\r\n   * Event handler for 'touchstart' event\r\n   *\r\n   * @param event Touch event\r\n   */\r\n  onTouchStart = (event: TouchEvent) =\u003e {\r\n    // @ts-expect-error - event.targetTouches is not defined\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    this.emitter.emit('scroll', {\r\n      deltaX: 0,\r\n      deltaY: 0,\r\n      event,\r\n    })\r\n  }\r\n\r\n  /** Event handler for 'touchmove' event */\r\n  onTouchMove = (event: TouchEvent) =\u003e {\r\n    // @ts-expect-error - event.targetTouches is not defined\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.options.touchMultiplier\r\n    const deltaY = -(clientY - this.touchStart.y) * this.options.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: TouchEvent) =\u003e {\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: WheelEvent) =\u003e {\r\n    let { deltaX, deltaY, deltaMode } = event\r\n\r\n    const multiplierX =\r\n      deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.width : 1\r\n    const multiplierY =\r\n      deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.height : 1\r\n\r\n    deltaX *= multiplierX\r\n    deltaY *= multiplierY\r\n\r\n    deltaX *= this.options.wheelMultiplier\r\n    deltaY *= this.options.wheelMultiplier\r\n\r\n    this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n  }\r\n\r\n  onWindowResize = () =\u003e {\r\n    this.window = {\r\n      width: window.innerWidth,\r\n      height: window.innerHeight,\r\n    }\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 type {\r\n  LenisEvent,\r\n  LenisOptions,\r\n  ScrollCallback,\r\n  Scrolling,\r\n  ScrollToOptions,\r\n  UserData,\r\n  VirtualScrollCallback,\r\n  VirtualScrollData,\r\n} from './types'\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\ntype OptionalPick\u003cT, F extends keyof T\u003e = Omit\u003cT, F\u003e \u0026 Partial\u003cPick\u003cT, F\u003e\u003e\r\n\r\nexport class Lenis {\r\n  private _isScrolling: Scrolling = false // true when scroll is animating\r\n  private _isStopped = false // true if user should not be able to scroll - enable/disable programmatically\r\n  private _isLocked = false // same as isStopped but enabled/disabled when scroll reaches target\r\n  private _preventNextNativeScrollEvent = false\r\n  private _resetVelocityTimeout: number | null = null\r\n  private __rafID: number | null = null\r\n\r\n  /**\r\n   * Whether or not the user is touching the screen\r\n   */\r\n  isTouching?: boolean\r\n  /**\r\n   * The time in ms since the lenis instance was created\r\n   */\r\n  time = 0\r\n  /**\r\n   * User data that will be forwarded through the scroll event\r\n   *\r\n   * @example\r\n   * lenis.scrollTo(100, {\r\n   *   userData: {\r\n   *     foo: 'bar'\r\n   *   }\r\n   * })\r\n   */\r\n  userData: UserData = {}\r\n  /**\r\n   * The last velocity of the scroll\r\n   */\r\n  lastVelocity = 0\r\n  /**\r\n   * The current velocity of the scroll\r\n   */\r\n  velocity = 0\r\n  /**\r\n   * The direction of the scroll\r\n   */\r\n  direction: 1 | -1 | 0 = 0\r\n  /**\r\n   * The options passed to the lenis instance\r\n   */\r\n  options: OptionalPick\u003c\r\n    Required\u003cLenisOptions\u003e,\r\n    'duration' | 'prevent' | 'virtualScroll'\r\n  \u003e\r\n  /**\r\n   * The target scroll value\r\n   */\r\n  targetScroll: number\r\n  /**\r\n   * The animated scroll value\r\n   */\r\n  animatedScroll: number\r\n\r\n  // These are instanciated here as they don't need information from the options\r\n  private readonly animate = new Animate()\r\n  private readonly emitter = new Emitter()\r\n  // These are instanciated in the constructor as they need information from the options\r\n  readonly dimensions: Dimensions // This is not private because it's used in the Snap class\r\n  private readonly virtualScroll: VirtualScroll\r\n\r\n  constructor({\r\n    wrapper = window,\r\n    content = document.documentElement,\r\n    eventsTarget = wrapper,\r\n    smoothWheel = true,\r\n    syncTouch = false,\r\n    syncTouchLerp = 0.075,\r\n    touchInertiaMultiplier = 35,\r\n    duration, // in seconds\r\n    easing = (t) =\u003e Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n    lerp = 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    autoResize = true,\r\n    prevent,\r\n    virtualScroll,\r\n    overscroll = true,\r\n    autoRaf = false,\r\n    anchors = false,\r\n    __experimental__naiveDimensions = false,\r\n  }: LenisOptions = {}) {\r\n    // Set version\r\n    window.lenisVersion = version\r\n\r\n    // Check if wrapper is \u003chtml\u003e, fallback to window\r\n    if (!wrapper || wrapper === document.documentElement) {\r\n      wrapper = window\r\n    }\r\n\r\n    // Setup options\r\n    this.options = {\r\n      wrapper,\r\n      content,\r\n      eventsTarget,\r\n      smoothWheel,\r\n      syncTouch,\r\n      syncTouchLerp,\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      autoResize,\r\n      prevent,\r\n      virtualScroll,\r\n      overscroll,\r\n      autoRaf,\r\n      anchors,\r\n      __experimental__naiveDimensions,\r\n    }\r\n\r\n    // Setup dimensions instance\r\n    this.dimensions = new Dimensions(wrapper, content, { autoResize })\r\n\r\n    // Setup class name\r\n    this.updateClassName()\r\n\r\n    // Set the initial scroll value for all scroll information\r\n    this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n    // Add event listeners\r\n    this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n    this.options.wrapper.addEventListener('scrollend', this.onScrollEnd, {\r\n      capture: true,\r\n    })\r\n\r\n    if (this.options.anchors \u0026\u0026 this.options.wrapper === window) {\r\n      this.options.wrapper.addEventListener(\r\n        'click',\r\n        this.onClick as EventListener,\r\n        false\r\n      )\r\n    }\r\n\r\n    this.options.wrapper.addEventListener(\r\n      'pointerdown',\r\n      this.onPointerDown as EventListener,\r\n      false\r\n    )\r\n\r\n    // Setup virtual scroll instance\r\n    this.virtualScroll = new VirtualScroll(eventsTarget as HTMLElement, {\r\n      touchMultiplier,\r\n      wheelMultiplier,\r\n    })\r\n    this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n\r\n    if (this.options.autoRaf) {\r\n      this.__rafID = requestAnimationFrame(this.raf)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroy the lenis instance, remove all event listeners and clean up the class name\r\n   */\r\n  destroy() {\r\n    this.emitter.destroy()\r\n\r\n    this.options.wrapper.removeEventListener(\r\n      'scroll',\r\n      this.onNativeScroll,\r\n      false\r\n    )\r\n\r\n    this.options.wrapper.removeEventListener('scrollend', this.onScrollEnd, {\r\n      capture: true,\r\n    })\r\n\r\n    this.options.wrapper.removeEventListener(\r\n      'pointerdown',\r\n      this.onPointerDown as EventListener,\r\n      false\r\n    )\r\n\r\n    if (this.options.anchors \u0026\u0026 this.options.wrapper === window) {\r\n      this.options.wrapper.removeEventListener(\r\n        'click',\r\n        this.onClick as EventListener,\r\n        false\r\n      )\r\n    }\r\n\r\n    this.virtualScroll.destroy()\r\n    this.dimensions.destroy()\r\n\r\n    this.cleanUpClassName()\r\n\r\n    if (this.__rafID) {\r\n      cancelAnimationFrame(this.__rafID)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Add an event listener for the given event and callback\r\n   *\r\n   * @param event Event name\r\n   * @param callback Callback function\r\n   * @returns Unsubscribe function\r\n   */\r\n  on(event: 'scroll', callback: ScrollCallback): () =\u003e void\r\n  on(event: 'virtual-scroll', callback: VirtualScrollCallback): () =\u003e void\r\n  on(event: LenisEvent, callback: any) {\r\n    return this.emitter.on(event, callback)\r\n  }\r\n\r\n  /**\r\n   * Remove an event listener for the given event and callback\r\n   *\r\n   * @param event Event name\r\n   * @param callback Callback function\r\n   */\r\n  off(event: 'scroll', callback: ScrollCallback): void\r\n  off(event: 'virtual-scroll', callback: VirtualScrollCallback): void\r\n  off(event: LenisEvent, callback: any) {\r\n    return this.emitter.off(event, callback)\r\n  }\r\n\r\n  private onScrollEnd = (e: Event | CustomEvent) =\u003e {\r\n    if (!(e instanceof CustomEvent)) {\r\n      if (this.isScrolling === 'smooth' || this.isScrolling === false) {\r\n        e.stopPropagation()\r\n      }\r\n    }\r\n  }\r\n\r\n  private dispatchScrollendEvent = () =\u003e {\r\n    this.options.wrapper.dispatchEvent(\r\n      new CustomEvent('scrollend', {\r\n        bubbles: this.options.wrapper === window,\r\n        // cancelable: false,\r\n        detail: {\r\n          lenisScrollEnd: true,\r\n        },\r\n      })\r\n    )\r\n  }\r\n\r\n  private setScroll(scroll: number) {\r\n    // behavior: 'instant' bypasses the scroll-behavior CSS property\r\n\r\n    if (this.isHorizontal) {\r\n      this.options.wrapper.scrollTo({ left: scroll, behavior: 'instant' })\r\n    } else {\r\n      this.options.wrapper.scrollTo({ top: scroll, behavior: 'instant' })\r\n    }\r\n  }\r\n\r\n  private onClick = (event: PointerEvent | MouseEvent) =\u003e {\r\n    const path = event.composedPath()\r\n    const anchor = path.find(\r\n      (node) =\u003e\r\n        node instanceof HTMLAnchorElement \u0026\u0026\r\n        node.getAttribute('href')?.startsWith('#')\r\n    ) as HTMLAnchorElement | undefined\r\n    if (anchor) {\r\n      const id = anchor.getAttribute('href')\r\n      if (id) {\r\n        const options =\r\n          typeof this.options.anchors === 'object' \u0026\u0026 this.options.anchors\r\n            ? this.options.anchors\r\n            : undefined\r\n        this.scrollTo(id, options)\r\n      }\r\n    }\r\n  }\r\n\r\n  private onPointerDown = (event: PointerEvent | MouseEvent) =\u003e {\r\n    if (event.button === 1) {\r\n      this.reset()\r\n    }\r\n  }\r\n\r\n  private onVirtualScroll = (data: VirtualScrollData) =\u003e {\r\n    if (\r\n      typeof this.options.virtualScroll === 'function' \u0026\u0026\r\n      this.options.virtualScroll(data) === false\r\n    )\r\n      return\r\n\r\n    const { deltaX, deltaY, event } = data\r\n\r\n    this.emitter.emit('virtual-scroll', { deltaX, deltaY, event })\r\n\r\n    // keep zoom feature\r\n    if (event.ctrlKey) return\r\n    // @ts-ignore\r\n    if (event.lenisStopPropagation) return\r\n\r\n    const isTouch = event.type.includes('touch')\r\n    const isWheel = event.type.includes('wheel')\r\n\r\n    this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n    // if (event.type === 'touchend') {\r\n    //   console.log('touchend', this.scroll)\r\n    //   // this.lastVelocity = this.velocity\r\n    //   // this.velocity = 0\r\n    //   // this.isScrolling = false\r\n    //   this.emit({ type: 'touchend' })\r\n    //   // alert('touchend')\r\n    //   return\r\n    // }\r\n\r\n    const isClickOrTap = deltaX === 0 \u0026\u0026 deltaY === 0\r\n\r\n    const isTapToStop =\r\n      this.options.syncTouch \u0026\u0026\r\n      isTouch \u0026\u0026\r\n      event.type === 'touchstart' \u0026\u0026\r\n      isClickOrTap \u0026\u0026\r\n      !this.isStopped \u0026\u0026\r\n      !this.isLocked\r\n\r\n    if (isTapToStop) {\r\n      this.reset()\r\n      return\r\n    }\r\n\r\n    // const isPullToRefresh =\r\n    //   this.options.gestureOrientation === 'vertical' \u0026\u0026\r\n    //   this.scroll === 0 \u0026\u0026\r\n    //   !this.options.infinite \u0026\u0026\r\n    //   deltaY \u003c= 5 // touch pull to refresh, not reliable yet\r\n\r\n    const isUnknownGesture =\r\n      (this.options.gestureOrientation === 'vertical' \u0026\u0026 deltaY === 0) ||\r\n      (this.options.gestureOrientation === 'horizontal' \u0026\u0026 deltaX === 0)\r\n\r\n    if (isClickOrTap || isUnknownGesture) {\r\n      // console.log('prevent')\r\n      return\r\n    }\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    const prevent = this.options.prevent\r\n\r\n    if (\r\n      !!composedPath.find(\r\n        (node) =\u003e\r\n          node instanceof HTMLElement \u0026\u0026\r\n          ((typeof prevent === 'function' \u0026\u0026 prevent?.(node)) ||\r\n            node.hasAttribute?.('data-lenis-prevent') ||\r\n            (isTouch \u0026\u0026 node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n            (isWheel \u0026\u0026 node.hasAttribute?.('data-lenis-prevent-wheel')))\r\n      )\r\n    )\r\n      return\r\n\r\n    if (this.isStopped || this.isLocked) {\r\n      event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n      return\r\n    }\r\n\r\n    const isSmooth =\r\n      (this.options.syncTouch \u0026\u0026 isTouch) ||\r\n      (this.options.smoothWheel \u0026\u0026 isWheel)\r\n\r\n    if (!isSmooth) {\r\n      this.isScrolling = 'native'\r\n      this.animate.stop()\r\n      // @ts-ignore\r\n      event.lenisStopPropagation = true\r\n      return\r\n    }\r\n\r\n    let delta = deltaY\r\n    if (this.options.gestureOrientation === 'both') {\r\n      delta = Math.abs(deltaY) \u003e Math.abs(deltaX) ? deltaY : deltaX\r\n    } else if (this.options.gestureOrientation === 'horizontal') {\r\n      delta = deltaX\r\n    }\r\n\r\n    if (\r\n      !this.options.overscroll ||\r\n      this.options.infinite ||\r\n      (this.options.wrapper !== window \u0026\u0026\r\n        ((this.animatedScroll \u003e 0 \u0026\u0026 this.animatedScroll \u003c this.limit) ||\r\n          (this.animatedScroll === 0 \u0026\u0026 deltaY \u003e 0) ||\r\n          (this.animatedScroll === this.limit \u0026\u0026 deltaY \u003c 0)))\r\n    ) {\r\n      // @ts-ignore\r\n      event.lenisStopPropagation = true\r\n      // event.stopPropagation()\r\n    }\r\n\r\n    event.preventDefault()\r\n\r\n    const isSyncTouch = isTouch \u0026\u0026 this.options.syncTouch\r\n    const isTouchEnd = isTouch \u0026\u0026 event.type === 'touchend'\r\n\r\n    const hasTouchInertia = isTouchEnd \u0026\u0026 Math.abs(delta) \u003e 5\r\n\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      ...(isSyncTouch\r\n        ? {\r\n            lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n            // immediate: !hasTouchInertia,\r\n          }\r\n        : {\r\n            lerp: this.options.lerp,\r\n            duration: this.options.duration,\r\n            easing: this.options.easing,\r\n          }),\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Force lenis to recalculate the dimensions\r\n   */\r\n  resize() {\r\n    this.dimensions.resize()\r\n    this.animatedScroll = this.targetScroll = this.actualScroll\r\n    this.emit()\r\n  }\r\n\r\n  private emit() {\r\n    this.emitter.emit('scroll', this)\r\n  }\r\n\r\n  private onNativeScroll = () =\u003e {\r\n    if (this._resetVelocityTimeout !== null) {\r\n      clearTimeout(this._resetVelocityTimeout)\r\n      this._resetVelocityTimeout = null\r\n    }\r\n\r\n    if (this._preventNextNativeScrollEvent) {\r\n      this._preventNextNativeScrollEvent = false\r\n      return\r\n    }\r\n\r\n    if (this.isScrolling === false || this.isScrolling === 'native') {\r\n      const lastScroll = this.animatedScroll\r\n      this.animatedScroll = this.targetScroll = this.actualScroll\r\n      this.lastVelocity = this.velocity\r\n      this.velocity = this.animatedScroll - lastScroll\r\n      this.direction = Math.sign(\r\n        this.animatedScroll - lastScroll\r\n      ) as Lenis['direction']\r\n\r\n      if (!this.isStopped) {\r\n        this.isScrolling = 'native'\r\n      }\r\n\r\n      this.emit()\r\n\r\n      if (this.velocity !== 0) {\r\n        this._resetVelocityTimeout = setTimeout(() =\u003e {\r\n          this.lastVelocity = this.velocity\r\n          this.velocity = 0\r\n          this.isScrolling = false\r\n          this.emit()\r\n        }, 400)\r\n      }\r\n    }\r\n  }\r\n\r\n  private reset() {\r\n    this.isLocked = false\r\n    this.isScrolling = false\r\n    this.animatedScroll = this.targetScroll = this.actualScroll\r\n    this.lastVelocity = this.velocity = 0\r\n    this.animate.stop()\r\n  }\r\n\r\n  /**\r\n   * Start lenis scroll after it has been stopped\r\n   */\r\n  start() {\r\n    if (!this.isStopped) return\r\n    this.reset()\r\n\r\n    this.isStopped = false\r\n  }\r\n\r\n  /**\r\n   * Stop lenis scroll\r\n   */\r\n  stop() {\r\n    if (this.isStopped) return\r\n    this.reset()\r\n\r\n    this.isStopped = true\r\n  }\r\n\r\n  /**\r\n   * RequestAnimationFrame for lenis\r\n   *\r\n   * @param time The time in ms from an external clock like `requestAnimationFrame` or Tempus\r\n   */\r\n  raf = (time: number) =\u003e {\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    if (this.options.autoRaf) {\r\n      this.__rafID = requestAnimationFrame(this.raf)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Scroll to a target value\r\n   *\r\n   * @param target The target value to scroll to\r\n   * @param options The options for the scroll\r\n   *\r\n   * @example\r\n   * lenis.scrollTo(100, {\r\n   *   offset: 100,\r\n   *   duration: 1,\r\n   *   easing: (t) =\u003e 1 - Math.cos((t * Math.PI) / 2),\r\n   *   lerp: 0.1,\r\n   *   onStart: () =\u003e {\r\n   *     console.log('onStart')\r\n   *   },\r\n   *   onComplete: () =\u003e {\r\n   *     console.log('onComplete')\r\n   *   },\r\n   * })\r\n   */\r\n  scrollTo(\r\n    target: number | string | HTMLElement,\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 = this.options.lerp,\r\n      onStart,\r\n      onComplete,\r\n      force = false, // scroll even if stopped\r\n      programmatic = true, // called from outside of the class\r\n      userData,\r\n    }: ScrollToOptions = {}\r\n  ) {\r\n    if ((this.isStopped || this.isLocked) \u0026\u0026 !force) return\r\n\r\n    // keywords\r\n    if (\r\n      typeof target === 'string' \u0026\u0026\r\n      ['top', 'left', 'start'].includes(target)\r\n    ) {\r\n      target = 0\r\n    } else if (\r\n      typeof target === 'string' \u0026\u0026\r\n      ['bottom', 'right', 'end'].includes(target)\r\n    ) {\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 instanceof HTMLElement \u0026\u0026 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.rootElement.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 (target === this.targetScroll) {\r\n      onStart?.(this)\r\n      onComplete?.(this)\r\n      return\r\n    }\r\n\r\n    this.userData = userData ?? {}\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.preventNextNativeScrollEvent()\r\n      this.emit()\r\n      onComplete?.(this)\r\n      this.userData = {}\r\n\r\n      requestAnimationFrame(() =\u003e {\r\n        this.dispatchScrollendEvent()\r\n      })\r\n      return\r\n    }\r\n\r\n    if (!programmatic) {\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      onStart: () =\u003e {\r\n        // started\r\n        if (lock) this.isLocked = true\r\n        this.isScrolling = 'smooth'\r\n        onStart?.(this)\r\n      },\r\n      onUpdate: (value: number, completed: boolean) =\u003e {\r\n        this.isScrolling = 'smooth'\r\n\r\n        // updated\r\n        this.lastVelocity = this.velocity\r\n        this.velocity = value - this.animatedScroll\r\n        this.direction = Math.sign(this.velocity) as Lenis['direction']\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        if (!completed) this.emit()\r\n\r\n        if (completed) {\r\n          this.reset()\r\n          this.emit()\r\n          onComplete?.(this)\r\n          this.userData = {}\r\n\r\n          requestAnimationFrame(() =\u003e {\r\n            this.dispatchScrollendEvent()\r\n          })\r\n\r\n          // avoid emitting event twice\r\n          this.preventNextNativeScrollEvent()\r\n        }\r\n      },\r\n    })\r\n  }\r\n\r\n  private preventNextNativeScrollEvent() {\r\n    this._preventNextNativeScrollEvent = true\r\n\r\n    requestAnimationFrame(() =\u003e {\r\n      this._preventNextNativeScrollEvent = false\r\n    })\r\n  }\r\n\r\n  /**\r\n   * The root element on which lenis is instanced\r\n   */\r\n  get rootElement() {\r\n    return (\r\n      this.options.wrapper === window\r\n        ? document.documentElement\r\n        : this.options.wrapper\r\n    ) as HTMLElement\r\n  }\r\n\r\n  /**\r\n   * The limit which is the maximum scroll value\r\n   */\r\n  get limit() {\r\n    if (this.options.__experimental__naiveDimensions) {\r\n      if (this.isHorizontal) {\r\n        return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n      } else {\r\n        return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n      }\r\n    } else {\r\n      return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Whether or not the scroll is horizontal\r\n   */\r\n  get isHorizontal() {\r\n    return this.options.orientation === 'horizontal'\r\n  }\r\n\r\n  /**\r\n   * The actual scroll value\r\n   */\r\n  get actualScroll() {\r\n    // value browser takes into account\r\n    // it has to be this way because of DOCTYPE declaration\r\n    const wrapper = this.options.wrapper as Window | HTMLElement\r\n\r\n    return this.isHorizontal\r\n      ? (wrapper as Window).scrollX ?? (wrapper as HTMLElement).scrollLeft\r\n      : (wrapper as Window).scrollY ?? (wrapper as HTMLElement).scrollTop\r\n  }\r\n\r\n  /**\r\n   * The current scroll value\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  /**\r\n   * The progress of the scroll relative to the limit\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  /**\r\n   * Current scroll state\r\n   */\r\n  get isScrolling() {\r\n    return this._isScrolling\r\n  }\r\n\r\n  private set isScrolling(value: Scrolling) {\r\n    if (this._isScrolling !== value) {\r\n      this._isScrolling = value\r\n      this.updateClassName()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if lenis is stopped\r\n   */\r\n  get isStopped() {\r\n    return this._isStopped\r\n  }\r\n\r\n  private set isStopped(value: boolean) {\r\n    if (this._isStopped !== value) {\r\n      this._isStopped = value\r\n      this.updateClassName()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if lenis is locked\r\n   */\r\n  get isLocked() {\r\n    return this._isLocked\r\n  }\r\n\r\n  private set isLocked(value: boolean) {\r\n    if (this._isLocked !== value) {\r\n      this._isLocked = value\r\n      this.updateClassName()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if lenis is smooth scrolling\r\n   */\r\n  get isSmooth() {\r\n    return this.isScrolling === 'smooth'\r\n  }\r\n\r\n  /**\r\n   * The class name applied to the wrapper element\r\n   */\r\n  get className() {\r\n    let className = 'lenis'\r\n    if (this.isStopped) className += ' lenis-stopped'\r\n    if (this.isLocked) className += ' lenis-locked'\r\n    if (this.isScrolling) className += ' lenis-scrolling'\r\n    if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n    return className\r\n  }\r\n\r\n  private updateClassName() {\r\n    this.cleanUpClassName()\r\n\r\n    this.rootElement.className =\r\n      `${this.rootElement.className} ${this.className}`.trim()\r\n  }\r\n\r\n  private cleanUpClassName() {\r\n    this.rootElement.className = this.rootElement.className\r\n      .replace(/lenis(-\\w+)?/g, '')\r\n      .trim()\r\n  }\r\n}\r\n"],"version":3}
