{"version":3,"file":"lenis.mjs","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"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    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  // 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(\r\n    from,\r\n    to,\r\n    { lerp = 0.1, duration = 1, easing = (t) => t, onStart, onUpdate }\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","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n  constructor({\r\n    wrapper,\r\n    content,\r\n    autoResize = true,\r\n    debounce: debounceValue = 250,\r\n  } = {}) {\r\n    this.wrapper = wrapper\r\n    this.content = content\r\n\r\n    if (autoResize) {\r\n      this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n      if (this.wrapper === 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    window.removeEventListener('resize', this.debouncedResize, false)\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    if (this.wrapper === 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","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\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n  constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n    this.element = element\r\n    this.wheelMultiplier = wheelMultiplier\r\n    this.touchMultiplier = touchMultiplier\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    window.addEventListener('resize', this.onWindowResize, false)\r\n    this.onWindowResize()\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    window.removeEventListener('resize', this.onWindowResize, false)\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    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) => {\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, deltaMode } = event\r\n\r\n    const multiplierX =\r\n      deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n    const multiplierY =\r\n      deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n    deltaX *= multiplierX\r\n    deltaY *= multiplierY\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  onWindowResize = () => {\r\n    this.windowWidth = window.innerWidth\r\n    this.windowHeight = window.innerHeight\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\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\n\r\nexport type LenisOptions = {\r\n  wrapper?: Window | HTMLElement\r\n  content?: HTMLElement\r\n  wheelEventsTarget?: Window | HTMLElement\r\n  eventsTarget?: Window | HTMLElement\r\n  smoothWheel?: boolean\r\n  syncTouch?: boolean\r\n  syncTouchLerp?: number\r\n  touchInertiaMultiplier?: number\r\n  duration?: number\r\n  easing?: EasingFunction\r\n  lerp?: number\r\n  infinite?: boolean\r\n  orientation?: Orientation\r\n  gestureOrientation?: GestureOrientation\r\n  touchMultiplier?: number\r\n  wheelMultiplier?: number\r\n  autoResize?: boolean\r\n  prevent?: boolean | ((node: Element) => boolean)\r\n  __experimental__naiveDimensions?: boolean\r\n}\r\n\r\nexport default class Lenis {\r\n  // __isSmooth: boolean = false // true if scroll should be animated\r\n  __isScrolling: boolean | 'native' | 'smooth' = false // true when scroll is animating\r\n  __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n  __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n  time: number\r\n  userData: object\r\n  lastVelocity: number\r\n  velocity: number\r\n  direction: 1 | -1 | undefined\r\n  options: LenisOptions\r\n  targetScroll: number\r\n  animatedScroll: number\r\n  // animate: Animate\r\n  // emitter: Emitter\r\n  // dimensions: Dimensions\r\n  // virtualScroll: VirtualScroll\r\n\r\n  constructor({\r\n    wrapper = window,\r\n    content = document.documentElement,\r\n    wheelEventsTarget = wrapper, // deprecated\r\n    eventsTarget = wheelEventsTarget,\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) => 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    autoResize = true,\r\n    prevent = false,\r\n    __experimental__naiveDimensions = false,\r\n  }: LenisOptions = {}) {\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      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      __experimental__naiveDimensions,\r\n    }\r\n\r\n    this.animate = new Animate()\r\n    this.emitter = new Emitter()\r\n    this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n    // this.toggleClassName('lenis', true)\r\n    this.updateClassName()\r\n\r\n    this.userData = {}\r\n    this.time = 0\r\n    this.velocity = this.lastVelocity = 0\r\n    this.isLocked = false\r\n    this.isStopped = false\r\n    // this.hasScrolled = false\r\n    // this.isSmooth = syncTouch || smoothWheel\r\n    // this.isSmooth = false\r\n    this.isScrolling = false\r\n    this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n    this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n    this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n      touchMultiplier,\r\n      wheelMultiplier,\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(\r\n      'scroll',\r\n      this.onNativeScroll,\r\n      false\r\n    )\r\n\r\n    this.virtualScroll.destroy()\r\n    this.dimensions.destroy()\r\n\r\n    this.cleanUpClassName()\r\n\r\n    // this.rootElement.className = ''\r\n\r\n    // this.toggleClassName('lenis', false)\r\n    // this.toggleClassName('lenis-smooth', false)\r\n    // this.toggleClassName('lenis-scrolling', false)\r\n    // this.toggleClassName('lenis-stopped', false)\r\n    // this.toggleClassName('lenis-locked', false)\r\n  }\r\n\r\n  on(event: string, callback: Function) {\r\n    return this.emitter.on(event, callback)\r\n  }\r\n\r\n  off(event: string, callback: Function) {\r\n    return this.emitter.off(event, callback)\r\n  }\r\n\r\n  private 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  private 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    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 isTapToStop =\r\n      this.options.syncTouch &&\r\n      isTouch &&\r\n      event.type === 'touchstart' &&\r\n      !this.isStopped &&\r\n      !this.isLocked\r\n\r\n    if (isTapToStop) {\r\n      this.reset()\r\n      return\r\n    }\r\n\r\n    const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n    // const isPullToRefresh =\r\n    //   this.options.gestureOrientation === 'vertical' &&\r\n    //   this.scroll === 0 &&\r\n    //   !this.options.infinite &&\r\n    //   deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n    const isUnknownGesture =\r\n      (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n      (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n    if (isClick || 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) =>\r\n          (typeof prevent === 'function' ? prevent?.(node) : prevent) ||\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') &&\r\n            !node.classList?.contains('lenis-stopped')) // nested lenis instance\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 && isTouch) ||\r\n      (this.options.smoothWheel && isWheel)\r\n\r\n    if (!isSmooth) {\r\n      this.isScrolling = 'native'\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\r\n    const hasTouchInertia = isTouchEnd && Math.abs(delta) > 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      ...(syncTouch\r\n        ? {\r\n            lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\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  resize() {\r\n    this.dimensions.resize()\r\n  }\r\n\r\n  private emit({ userData = {} } = {}) {\r\n    this.userData = userData\r\n    this.emitter.emit('scroll', this)\r\n    this.userData = {}\r\n  }\r\n\r\n  private onNativeScroll = () => {\r\n    clearTimeout(this.__resetVelocityTimeout)\r\n    delete this.__resetVelocityTimeout\r\n\r\n    if (this.__preventNextNativeScrollEvent) {\r\n      delete this.__preventNextNativeScrollEvent\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(this.animatedScroll - lastScroll)\r\n      // this.isSmooth = false\r\n      // this.isScrolling = this.hasScrolled ? 'native' : false\r\n      this.isScrolling = 'native'\r\n      this.emit()\r\n\r\n      if (this.velocity !== 0) {\r\n        this.__resetVelocityTimeout = setTimeout(() => {\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      // this.hasScrolled = true\r\n      // }, 50)\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  start() {\r\n    if (!this.isStopped) return\r\n    this.isStopped = false\r\n\r\n    this.reset()\r\n  }\r\n\r\n  stop() {\r\n    if (this.isStopped) return\r\n    this.isStopped = true\r\n    this.animate.stop()\r\n\r\n    this.reset()\r\n  }\r\n\r\n  raf(time: number) {\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: 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 = !duration && 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    }: {\r\n      offset?: number\r\n      immediate?: boolean\r\n      lock?: boolean\r\n      duration?: number\r\n      easing?: EasingFunction\r\n      lerp?: number\r\n      onStart?: (lenis: Lenis) => void\r\n      onComplete?: (lenis: Lenis) => void\r\n      force?: boolean\r\n      programmatic?: boolean\r\n      userData?: object\r\n    } = {}\r\n  ) {\r\n    if ((this.isStopped || this.isLocked) && !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      onComplete?.(this)\r\n      return\r\n    }\r\n\r\n    if (target === this.targetScroll) return\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: () => {\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) => {\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)\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({ userData })\r\n\r\n        if (completed) {\r\n          this.reset()\r\n          this.emit({ userData })\r\n          onComplete?.(this)\r\n\r\n          // avoid emitting event twice\r\n          this.__preventNextNativeScrollEvent = true\r\n          // requestAnimationFrame(() => {\r\n          //   delete this.__preventNextNativeScrollEvent\r\n          // })\r\n        }\r\n      },\r\n    })\r\n  }\r\n\r\n  get rootElement() {\r\n    return this.options.wrapper === window\r\n      ? document.documentElement\r\n      : this.options.wrapper\r\n  }\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  get isHorizontal() {\r\n    return this.options.orientation === 'horizontal'\r\n  }\r\n\r\n  get actualScroll(): number {\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(): number {\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(): number {\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  // private set isSmooth(value: boolean) {\r\n  //   if (this.__isSmooth !== value) {\r\n  //     this.__isSmooth = value\r\n  //     this.updateClassName()\r\n  //   }\r\n  // }\r\n\r\n  get isScrolling() {\r\n    return this.__isScrolling\r\n  }\r\n\r\n  private set isScrolling(value: boolean) {\r\n    if (this.__isScrolling !== value) {\r\n      this.__isScrolling = value\r\n      this.updateClassName()\r\n    }\r\n  }\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  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  get isSmooth() {\r\n    return this.isScrolling === 'smooth'\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.isLocked) className += ' lenis-locked'\r\n    if (this.isScrolling) className += ' lenis-scrolling'\r\n    if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n    // if (this.isScrolling === 'native') className += ' lenis-native'\r\n    // if (this.isSmooth) 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    // this.emitter.emit('className change', this)\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  // private toggleClassName(name: string, value: boolean) {\r\n  //   // this.rootElement.classList.toggle(name, value)\r\n  //   this.rootElement.className = this.className\r\n  //   this.emitter.emit('className change', this)\r\n  // }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","this","isRunning","completed","lerp","value","damp","x","y","lambda","dt","t","exp","to","round","currentTime","linearProgress","duration","easedProgress","easing","from","stop","onUpdate","fromTo","onStart","Dimensions","constructor","wrapper","content","autoResize","debounce","debounceValue","debouncedResize","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","resize","window","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","removeEventListener","onWrapperResize","onContentResize","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","VirtualScroll","element","wheelMultiplier","touchMultiplier","touchStart","emitter","onWindowResize","onWheel","passive","onTouchStart","onTouchMove","onTouchEnd","clientX","clientY","targetTouches","lastDelta","deltaX","deltaY","deltaMode","windowWidth","windowHeight","Lenis","document","documentElement","wheelEventsTarget","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","__experimental__naiveDimensions","__isScrolling","__isStopped","__isLocked","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","isTouching","options","isStopped","isLocked","reset","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","_a","hasAttribute","call","_b","_c","classList","_d","contains","_e","preventDefault","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","__resetVelocityTimeout","__preventNextNativeScrollEvent","lastScroll","animatedScroll","actualScroll","lastVelocity","direction","sign","lenisVersion","body","dimensions","updateClassName","userData","time","virtualScroll","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"}