lenis 1.3.18-dev.0 → 1.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/vue/src/provider.ts","../packages/vue/src/store.ts","../packages/vue/src/use-lenis.ts"],"sourcesContent":["// import Tempus from '@darkroom.engineering/tempus'\nimport Lenis, { type ScrollCallback } from 'lenis'\nimport type {\n HTMLAttributes,\n InjectionKey,\n Plugin,\n PropType,\n ShallowRef,\n ToRefs,\n} from 'vue'\nimport {\n defineComponent,\n h,\n onWatcherCleanup,\n provide,\n reactive,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport const LenisSymbol: InjectionKey<ShallowRef<Lenis | undefined>> =\n Symbol('LenisContext')\nexport const AddCallbackSymbol: InjectionKey<\n ((callback: ScrollCallback, priority: number) => void) | undefined\n> = Symbol('AddCallback')\nexport const RemoveCallbackSymbol: InjectionKey<\n ((callback: ScrollCallback) => void) | undefined\n> = Symbol('RemoveCallback')\n\nexport type LenisExposed = {\n wrapper?: HTMLDivElement\n content?: HTMLDivElement\n lenis?: Lenis\n}\n\nconst VueLenisImpl = defineComponent({\n name: 'VueLenis',\n props: {\n root: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n autoRaf: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n options: {\n type: Object as PropType<ConstructorParameters<typeof Lenis>[0]>,\n default: () => ({}),\n },\n props: {\n type: Object as PropType<HTMLAttributes>,\n default: () => ({}),\n },\n },\n setup(props, { slots, expose }) {\n const lenisRef = shallowRef<Lenis>()\n // const tempusCleanupRef = shallowRef<() => void>()\n const wrapper = ref<HTMLDivElement>()\n const content = ref<HTMLDivElement>()\n // Setup exposed properties\n expose<ToRefs<LenisExposed>>({\n lenis: lenisRef,\n wrapper,\n content,\n })\n\n // Sync options\n watch(\n [() => props.options, wrapper, content],\n () => {\n const isClient = typeof window !== 'undefined'\n\n if (!isClient) return\n\n if (!(props.root || (wrapper.value && content.value))) return\n\n lenisRef.value = new Lenis({\n ...props.options,\n ...(!props.root\n ? {\n wrapper: wrapper.value,\n content: content.value,\n }\n : {}),\n autoRaf: props.options?.autoRaf ?? props.autoRaf,\n })\n\n onWatcherCleanup(() => {\n lenisRef.value?.destroy()\n lenisRef.value = undefined\n })\n },\n { deep: true, immediate: true }\n )\n\n const callbacks = reactive<\n { callback: ScrollCallback; priority: number }[]\n >([])\n\n function addCallback(callback: ScrollCallback, priority: number) {\n callbacks.push({ callback, priority })\n callbacks.sort((a, b) => a.priority - b.priority)\n }\n\n function removeCallback(callback: ScrollCallback) {\n callbacks.splice(\n callbacks.findIndex((cb) => cb.callback === callback),\n 1\n )\n }\n\n const onScroll: ScrollCallback = (data) => {\n for (const { callback } of callbacks) {\n callback(data)\n }\n }\n\n watch(\n [lenisRef, () => props.root],\n ([lenis, root]) => {\n lenis?.on('scroll', onScroll)\n\n if (root) {\n globalLenis.value = lenis\n globalAddCallback.value = addCallback\n globalRemoveCallback.value = removeCallback\n\n onWatcherCleanup(() => {\n globalLenis.value = undefined\n globalAddCallback.value = undefined\n globalRemoveCallback.value = undefined\n })\n }\n },\n { immediate: true }\n )\n\n if (!props.root) {\n provide(LenisSymbol, lenisRef)\n provide(AddCallbackSymbol, addCallback)\n provide(RemoveCallbackSymbol, removeCallback)\n }\n\n return () => {\n if (props.root) {\n return slots.default?.()\n }\n return h('div', { ref: wrapper, ...props?.props }, [\n h('div', { ref: content }, slots.default?.()),\n ])\n }\n },\n})\n\nexport const VueLenis = VueLenisImpl as typeof VueLenisImpl & {\n new (): LenisExposed\n}\n\nexport const vueLenisPlugin: Plugin = (app) => {\n app.component('vue-lenis', VueLenis)\n // Setup a global provide to silence top level useLenis injection warning\n app.provide(LenisSymbol, shallowRef(undefined))\n app.provide(AddCallbackSymbol, undefined)\n app.provide(RemoveCallbackSymbol, undefined)\n}\n\n// @ts-expect-error\ndeclare module '@vue/runtime-core' {\n export interface GlobalComponents {\n 'vue-lenis': typeof VueLenis\n }\n}\n","import type Lenis from 'lenis'\nimport type { ScrollCallback } from 'lenis'\nimport { shallowRef } from 'vue'\n\nexport const globalLenis = shallowRef<Lenis>()\nexport const globalAddCallback =\n shallowRef<(callback: ScrollCallback, priority: number) => void>()\nexport const globalRemoveCallback =\n shallowRef<(callback: ScrollCallback) => void>()\n","import type { ScrollCallback } from 'lenis'\nimport { computed, inject, nextTick, onWatcherCleanup, watch } from 'vue'\nimport {\n AddCallbackSymbol,\n LenisSymbol,\n RemoveCallbackSymbol,\n} from './provider'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport function useLenis(callback?: ScrollCallback, priority = 0) {\n const lenisInjection = inject(LenisSymbol)\n const addCallbackInjection = inject(AddCallbackSymbol)\n const removeCallbackInjection = inject(RemoveCallbackSymbol)\n\n const addCallback = computed(() =>\n addCallbackInjection ? addCallbackInjection : globalAddCallback.value\n )\n const removeCallback = computed(() =>\n removeCallbackInjection\n ? removeCallbackInjection\n : globalRemoveCallback.value\n )\n\n const lenis = computed(() =>\n lenisInjection?.value ? lenisInjection.value : globalLenis.value\n )\n\n if (typeof window !== 'undefined') {\n // Wait two ticks to make sure the lenis instance is mounted\n nextTick(() => {\n nextTick(() => {\n // @ts-expect-error - import.meta.env is available in vite and nuxt\n if (!lenis.value && import.meta.env.DEV) {\n console.warn(\n 'No lenis instance found, either mount a root lenis instance or wrap your component in a lenis provider'\n )\n }\n })\n })\n }\n\n watch(\n [lenis, addCallback, removeCallback],\n ([lenis, addCallback, removeCallback]) => {\n if (!(lenis && addCallback && removeCallback && callback)) return\n\n addCallback?.(callback, priority)\n callback?.(lenis!)\n\n onWatcherCleanup(() => {\n removeCallback?.(callback)\n })\n },\n {\n immediate: true,\n }\n )\n return lenis\n}\n"],"mappings":"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","names":["shallowRef","shallowRef","onWatcherCleanup","watch","watch","lenis","addCallback","removeCallback","onWatcherCleanup"]}
1
+ {"version":3,"sources":["../packages/vue/src/provider.ts","../packages/vue/src/store.ts","../packages/vue/src/use-lenis.ts"],"sourcesContent":["import Lenis, { type ScrollCallback } from 'lenis'\nimport type {\n HTMLAttributes,\n InjectionKey,\n Plugin,\n PropType,\n ShallowRef,\n ToRefs,\n} from 'vue'\nimport {\n defineComponent,\n h,\n onWatcherCleanup,\n provide,\n reactive,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport const LenisSymbol: InjectionKey<ShallowRef<Lenis | undefined>> =\n Symbol('LenisContext')\nexport const AddCallbackSymbol: InjectionKey<\n ((callback: ScrollCallback, priority: number) => void) | undefined\n> = Symbol('AddCallback')\nexport const RemoveCallbackSymbol: InjectionKey<\n ((callback: ScrollCallback) => void) | undefined\n> = Symbol('RemoveCallback')\n\nexport type LenisExposed = {\n wrapper?: HTMLDivElement\n content?: HTMLDivElement\n lenis?: Lenis\n}\n\nconst VueLenisImpl = defineComponent({\n name: 'VueLenis',\n props: {\n root: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n autoRaf: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n options: {\n type: Object as PropType<ConstructorParameters<typeof Lenis>[0]>,\n default: () => ({}),\n },\n props: {\n type: Object as PropType<HTMLAttributes>,\n default: () => ({}),\n },\n },\n setup(props, { slots, expose }) {\n const lenisRef = shallowRef<Lenis>()\n const wrapper = ref<HTMLDivElement>()\n const content = ref<HTMLDivElement>()\n // Setup exposed properties\n expose<ToRefs<LenisExposed>>({\n lenis: lenisRef,\n wrapper,\n content,\n })\n\n // Sync options\n watch(\n [() => props.options, wrapper, content],\n () => {\n const isClient = typeof window !== 'undefined'\n\n if (!isClient) return\n\n if (!(props.root || (wrapper.value && content.value))) return\n\n lenisRef.value = new Lenis({\n ...props.options,\n ...(!props.root\n ? {\n wrapper: wrapper.value,\n content: content.value,\n }\n : {}),\n autoRaf: props.options?.autoRaf ?? props.autoRaf,\n })\n\n onWatcherCleanup(() => {\n lenisRef.value?.destroy()\n lenisRef.value = undefined\n })\n },\n { deep: true, immediate: true }\n )\n\n const callbacks = reactive<\n { callback: ScrollCallback; priority: number }[]\n >([])\n\n function addCallback(callback: ScrollCallback, priority: number) {\n callbacks.push({ callback, priority })\n callbacks.sort((a, b) => a.priority - b.priority)\n }\n\n function removeCallback(callback: ScrollCallback) {\n callbacks.splice(\n callbacks.findIndex((cb) => cb.callback === callback),\n 1\n )\n }\n\n const onScroll: ScrollCallback = (data) => {\n for (const { callback } of callbacks) {\n callback(data)\n }\n }\n\n watch(\n [lenisRef, () => props.root],\n ([lenis, root]) => {\n lenis?.on('scroll', onScroll)\n\n if (root) {\n globalLenis.value = lenis\n globalAddCallback.value = addCallback\n globalRemoveCallback.value = removeCallback\n\n onWatcherCleanup(() => {\n globalLenis.value = undefined\n globalAddCallback.value = undefined\n globalRemoveCallback.value = undefined\n })\n }\n },\n { immediate: true }\n )\n\n if (!props.root) {\n provide(LenisSymbol, lenisRef)\n provide(AddCallbackSymbol, addCallback)\n provide(RemoveCallbackSymbol, removeCallback)\n }\n\n return () => {\n if (props.root) {\n return slots.default?.()\n }\n return h('div', { ref: wrapper, ...props?.props }, [\n h('div', { ref: content }, slots.default?.()),\n ])\n }\n },\n})\n\nexport const VueLenis = VueLenisImpl as typeof VueLenisImpl & {\n new (): LenisExposed\n}\n\nexport const vueLenisPlugin: Plugin = (app) => {\n app.component('vue-lenis', VueLenis)\n // Setup a global provide to silence top level useLenis injection warning\n app.provide(LenisSymbol, shallowRef(undefined))\n app.provide(AddCallbackSymbol, undefined)\n app.provide(RemoveCallbackSymbol, undefined)\n}\n\n// @ts-expect-error\ndeclare module '@vue/runtime-core' {\n export interface GlobalComponents {\n 'vue-lenis': typeof VueLenis\n }\n}\n","import type Lenis from 'lenis'\nimport type { ScrollCallback } from 'lenis'\nimport { shallowRef } from 'vue'\n\nexport const globalLenis = shallowRef<Lenis>()\nexport const globalAddCallback =\n shallowRef<(callback: ScrollCallback, priority: number) => void>()\nexport const globalRemoveCallback =\n shallowRef<(callback: ScrollCallback) => void>()\n","import type { ScrollCallback } from 'lenis'\nimport { computed, inject, nextTick, onWatcherCleanup, watch } from 'vue'\nimport {\n AddCallbackSymbol,\n LenisSymbol,\n RemoveCallbackSymbol,\n} from './provider'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport function useLenis(callback?: ScrollCallback, priority = 0) {\n const lenisInjection = inject(LenisSymbol)\n const addCallbackInjection = inject(AddCallbackSymbol)\n const removeCallbackInjection = inject(RemoveCallbackSymbol)\n\n const addCallback = computed(() =>\n addCallbackInjection ? addCallbackInjection : globalAddCallback.value\n )\n const removeCallback = computed(() =>\n removeCallbackInjection\n ? removeCallbackInjection\n : globalRemoveCallback.value\n )\n\n const lenis = computed(() =>\n lenisInjection?.value ? lenisInjection.value : globalLenis.value\n )\n\n if (typeof window !== 'undefined') {\n // Wait two ticks to make sure the lenis instance is mounted\n nextTick(() => {\n nextTick(() => {\n // @ts-expect-error - import.meta.env is available in vite and nuxt\n if (!lenis.value && import.meta.env.DEV) {\n console.warn(\n 'No lenis instance found, either mount a root lenis instance or wrap your component in a lenis provider'\n )\n }\n })\n })\n }\n\n watch(\n [lenis, addCallback, removeCallback],\n ([lenis, addCallback, removeCallback]) => {\n if (!(lenis && addCallback && removeCallback && callback)) return\n\n addCallback?.(callback, priority)\n callback?.(lenis!)\n\n onWatcherCleanup(() => {\n removeCallback?.(callback)\n })\n },\n {\n immediate: true,\n }\n )\n return lenis\n}\n"],"mappings":"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","names":["shallowRef","shallowRef","onWatcherCleanup","watch","watch","lenis","addCallback","removeCallback","onWatcherCleanup"]}
package/dist/lenis.css CHANGED
@@ -1 +1 @@
1
- html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent-touch]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-property:overflow;transition-duration:1ms;transition-behavior:allow-discrete}
1
+ html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-vertical],.lenis [data-lenis-prevent-horizontal]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-property:overflow;transition-duration:1ms;transition-behavior:allow-discrete}
package/dist/lenis.d.ts CHANGED
@@ -157,7 +157,7 @@ type LenisOptions = {
157
157
  syncTouchLerp?: number;
158
158
  /**
159
159
  * Manage the the strength of `syncTouch` inertia
160
- * @default 35
160
+ * @default 1.7
161
161
  */
162
162
  touchInertiaExponent?: number;
163
163
  /**
@@ -218,12 +218,12 @@ type LenisOptions = {
218
218
  */
219
219
  overscroll?: boolean;
220
220
  /**
221
- * If `true`, Lenis will not try to detect the size of the content and wrapper
221
+ * If `true`, Lenis will automatically run `requestAnimationFrame` loop
222
222
  * @default false
223
223
  */
224
224
  autoRaf?: boolean;
225
225
  /**
226
- * If `true`, Lenis will automatically run `requestAnimationFrame` loop
226
+ * If `true`, Lenis will handle anchor links automatically
227
227
  * @default false
228
228
  */
229
229
  anchors?: boolean | ScrollToOptions;
@@ -255,6 +255,11 @@ type LenisOptions = {
255
255
  declare global {
256
256
  interface Window {
257
257
  lenisVersion: string;
258
+ lenis: {
259
+ version?: string;
260
+ horizontal?: boolean;
261
+ snap?: boolean;
262
+ };
258
263
  }
259
264
  }
260
265
 
@@ -395,7 +400,7 @@ declare class Lenis {
395
400
  lerp, duration, easing, onStart, onComplete, force, // scroll even if stopped
396
401
  userData, }?: ScrollToOptions): void;
397
402
  private preventNextNativeScrollEvent;
398
- private checkNestedScroll;
403
+ private hasNestedScroll;
399
404
  /**
400
405
  * The root element on which lenis is instanced
401
406
  */
package/dist/lenis.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "1.3.18-dev.0";
2
+ var version = "1.3.18";
3
3
 
4
4
  // packages/core/src/maths.ts
5
5
  function clamp(min, input, max) {
@@ -101,7 +101,7 @@ var Dimensions = class {
101
101
  if (autoResize) {
102
102
  this.debouncedResize = debounce(this.resize, debounceValue);
103
103
  if (this.wrapper instanceof Window) {
104
- window.addEventListener("resize", this.debouncedResize, false);
104
+ window.addEventListener("resize", this.debouncedResize);
105
105
  } else {
106
106
  this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize);
107
107
  this.wrapperResizeObserver.observe(this.wrapper);
@@ -123,7 +123,7 @@ var Dimensions = class {
123
123
  this.wrapperResizeObserver?.disconnect();
124
124
  this.contentResizeObserver?.disconnect();
125
125
  if (this.wrapper === window && this.debouncedResize) {
126
- window.removeEventListener("resize", this.debouncedResize, false);
126
+ window.removeEventListener("resize", this.debouncedResize);
127
127
  }
128
128
  }
129
129
  resize = () => {
@@ -214,7 +214,7 @@ var VirtualScroll = class {
214
214
  constructor(element, options = { wheelMultiplier: 1, touchMultiplier: 1 }) {
215
215
  this.element = element;
216
216
  this.options = options;
217
- window.addEventListener("resize", this.onWindowResize, false);
217
+ window.addEventListener("resize", this.onWindowResize);
218
218
  this.onWindowResize();
219
219
  this.element.addEventListener("wheel", this.onWheel, listenerOptions);
220
220
  this.element.addEventListener(
@@ -254,7 +254,7 @@ var VirtualScroll = class {
254
254
  /** Remove all event listeners and clean up */
255
255
  destroy() {
256
256
  this.emitter.destroy();
257
- window.removeEventListener("resize", this.onWindowResize, false);
257
+ window.removeEventListener("resize", this.onWindowResize);
258
258
  this.element.removeEventListener("wheel", this.onWheel, listenerOptions);
259
259
  this.element.removeEventListener(
260
260
  "touchstart",
@@ -429,6 +429,13 @@ var Lenis = class {
429
429
  stopInertiaOnNavigate = false
430
430
  } = {}) {
431
431
  window.lenisVersion = version;
432
+ if (!window.lenis) {
433
+ window.lenis = {};
434
+ }
435
+ window.lenis.version = version;
436
+ if (orientation === "horizontal") {
437
+ window.lenis.horizontal = true;
438
+ }
432
439
  if (!wrapper || wrapper === document.documentElement) {
433
440
  wrapper = window;
434
441
  }
@@ -467,21 +474,19 @@ var Lenis = class {
467
474
  this.dimensions = new Dimensions(wrapper, content, { autoResize });
468
475
  this.updateClassName();
469
476
  this.targetScroll = this.animatedScroll = this.actualScroll;
470
- this.options.wrapper.addEventListener("scroll", this.onNativeScroll, false);
477
+ this.options.wrapper.addEventListener("scroll", this.onNativeScroll);
471
478
  this.options.wrapper.addEventListener("scrollend", this.onScrollEnd, {
472
479
  capture: true
473
480
  });
474
481
  if (this.options.anchors || this.options.stopInertiaOnNavigate) {
475
482
  this.options.wrapper.addEventListener(
476
483
  "click",
477
- this.onClick,
478
- false
484
+ this.onClick
479
485
  );
480
486
  }
481
487
  this.options.wrapper.addEventListener(
482
488
  "pointerdown",
483
- this.onPointerDown,
484
- false
489
+ this.onPointerDown
485
490
  );
486
491
  this.virtualScroll = new VirtualScroll(eventsTarget, {
487
492
  touchMultiplier,
@@ -490,9 +495,7 @@ var Lenis = class {
490
495
  this.virtualScroll.on("scroll", this.onVirtualScroll);
491
496
  if (this.options.autoToggle) {
492
497
  this.checkOverflow();
493
- this.rootElement.addEventListener("transitionend", this.onTransitionEnd, {
494
- passive: true
495
- });
498
+ this.rootElement.addEventListener("transitionend", this.onTransitionEnd);
496
499
  }
497
500
  if (this.options.autoRaf) {
498
501
  this._rafId = requestAnimationFrame(this.raf);
@@ -503,24 +506,18 @@ var Lenis = class {
503
506
  */
504
507
  destroy() {
505
508
  this.emitter.destroy();
506
- this.options.wrapper.removeEventListener(
507
- "scroll",
508
- this.onNativeScroll,
509
- false
510
- );
509
+ this.options.wrapper.removeEventListener("scroll", this.onNativeScroll);
511
510
  this.options.wrapper.removeEventListener("scrollend", this.onScrollEnd, {
512
511
  capture: true
513
512
  });
514
513
  this.options.wrapper.removeEventListener(
515
514
  "pointerdown",
516
- this.onPointerDown,
517
- false
515
+ this.onPointerDown
518
516
  );
519
517
  if (this.options.anchors || this.options.stopInertiaOnNavigate) {
520
518
  this.options.wrapper.removeEventListener(
521
519
  "click",
522
- this.onClick,
523
- false
520
+ this.onClick
524
521
  );
525
522
  }
526
523
  this.virtualScroll.destroy();
@@ -632,8 +629,12 @@ var Lenis = class {
632
629
  let composedPath = event.composedPath();
633
630
  composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement));
634
631
  const prevent = this.options.prevent;
632
+ const gestureOrientation = Math.abs(deltaX) >= Math.abs(deltaY) ? "horizontal" : "vertical";
635
633
  if (composedPath.find(
636
- (node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel") || this.options.allowNestedScroll && this.checkNestedScroll(node, { deltaX, deltaY }))
634
+ (node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || gestureOrientation === "vertical" && node.hasAttribute?.("data-lenis-prevent-vertical") || gestureOrientation === "horizontal" && node.hasAttribute?.("data-lenis-prevent-horizontal") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel") || this.options.allowNestedScroll && this.hasNestedScroll(node, {
635
+ deltaX,
636
+ deltaY
637
+ }))
637
638
  ))
638
639
  return;
639
640
  if (this.isStopped || this.isLocked) {
@@ -921,7 +922,7 @@ var Lenis = class {
921
922
  this._preventNextNativeScrollEvent = false;
922
923
  });
923
924
  }
924
- checkNestedScroll(node, { deltaX, deltaY }) {
925
+ hasNestedScroll(node, { deltaX, deltaY }) {
925
926
  const time = Date.now();
926
927
  if (!node._lenis) node._lenis = {};
927
928
  const cache = node._lenis;
@@ -929,24 +930,31 @@ var Lenis = class {
929
930
  let hasOverflowY;
930
931
  let isScrollableX;
931
932
  let isScrollableY;
933
+ let hasOverscrollBehaviorX;
934
+ let hasOverscrollBehaviorY;
932
935
  let scrollWidth;
933
936
  let scrollHeight;
934
937
  let clientWidth;
935
938
  let clientHeight;
936
- const gestureOrientation = this.options.gestureOrientation;
937
939
  if (time - (cache.time ?? 0) > 2e3) {
938
940
  cache.time = Date.now();
939
941
  const computedStyle = window.getComputedStyle(node);
940
942
  cache.computedStyle = computedStyle;
941
- const overflowXString = computedStyle.overflowX;
942
- const overflowYString = computedStyle.overflowY;
943
- hasOverflowX = ["auto", "overlay", "scroll"].includes(overflowXString);
944
- hasOverflowY = ["auto", "overlay", "scroll"].includes(overflowYString);
943
+ hasOverflowX = ["auto", "overlay", "scroll"].includes(
944
+ computedStyle.overflowX
945
+ );
946
+ hasOverflowY = ["auto", "overlay", "scroll"].includes(
947
+ computedStyle.overflowY
948
+ );
949
+ hasOverscrollBehaviorX = ["auto"].includes(
950
+ computedStyle.overscrollBehaviorX
951
+ );
952
+ hasOverscrollBehaviorY = ["auto"].includes(
953
+ computedStyle.overscrollBehaviorY
954
+ );
945
955
  cache.hasOverflowX = hasOverflowX;
946
956
  cache.hasOverflowY = hasOverflowY;
947
957
  if (!(hasOverflowX || hasOverflowY)) return false;
948
- if (gestureOrientation === "vertical" && !hasOverflowY) return false;
949
- if (gestureOrientation === "horizontal" && !hasOverflowX) return false;
950
958
  scrollWidth = node.scrollWidth;
951
959
  scrollHeight = node.scrollHeight;
952
960
  clientWidth = node.clientWidth;
@@ -959,6 +967,8 @@ var Lenis = class {
959
967
  cache.scrollHeight = scrollHeight;
960
968
  cache.clientWidth = clientWidth;
961
969
  cache.clientHeight = clientHeight;
970
+ cache.hasOverscrollBehaviorX = hasOverscrollBehaviorX;
971
+ cache.hasOverscrollBehaviorY = hasOverscrollBehaviorY;
962
972
  } else {
963
973
  isScrollableX = cache.isScrollableX;
964
974
  isScrollableY = cache.isScrollableY;
@@ -968,50 +978,39 @@ var Lenis = class {
968
978
  scrollHeight = cache.scrollHeight;
969
979
  clientWidth = cache.clientWidth;
970
980
  clientHeight = cache.clientHeight;
981
+ hasOverscrollBehaviorX = cache.hasOverscrollBehaviorX;
982
+ hasOverscrollBehaviorY = cache.hasOverscrollBehaviorY;
971
983
  }
972
- if (!((hasOverflowX || hasOverflowY) && (isScrollableX || isScrollableY))) {
973
- return false;
974
- }
975
- if (gestureOrientation === "vertical" && !(hasOverflowY && isScrollableY))
976
- return false;
977
- if (gestureOrientation === "horizontal" && !(hasOverflowX && isScrollableX))
984
+ if (!(hasOverflowX && isScrollableX || hasOverflowY && isScrollableY)) {
978
985
  return false;
979
- let orientation;
980
- if (gestureOrientation === "horizontal") {
981
- orientation = "x";
982
- } else if (gestureOrientation === "vertical") {
983
- orientation = "y";
984
- } else {
985
- const isScrollingX = deltaX !== 0;
986
- const isScrollingY = deltaY !== 0;
987
- if (isScrollingX && hasOverflowX && isScrollableX) {
988
- orientation = "x";
989
- }
990
- if (isScrollingY && hasOverflowY && isScrollableY) {
991
- orientation = "y";
992
- }
993
986
  }
994
- if (!orientation) return false;
987
+ const orientation = Math.abs(deltaX) >= Math.abs(deltaY) ? "horizontal" : "vertical";
995
988
  let scroll;
996
989
  let maxScroll;
997
990
  let delta;
998
991
  let hasOverflow;
999
992
  let isScrollable;
1000
- if (orientation === "x") {
1001
- scroll = node.scrollLeft;
993
+ let hasOverscrollBehavior;
994
+ if (orientation === "horizontal") {
995
+ scroll = Math.round(node.scrollLeft);
1002
996
  maxScroll = scrollWidth - clientWidth;
1003
997
  delta = deltaX;
1004
998
  hasOverflow = hasOverflowX;
1005
999
  isScrollable = isScrollableX;
1006
- } else if (orientation === "y") {
1007
- scroll = node.scrollTop;
1000
+ hasOverscrollBehavior = hasOverscrollBehaviorX;
1001
+ } else if (orientation === "vertical") {
1002
+ scroll = Math.round(node.scrollTop);
1008
1003
  maxScroll = scrollHeight - clientHeight;
1009
1004
  delta = deltaY;
1010
1005
  hasOverflow = hasOverflowY;
1011
1006
  isScrollable = isScrollableY;
1007
+ hasOverscrollBehavior = hasOverscrollBehaviorY;
1012
1008
  } else {
1013
1009
  return false;
1014
1010
  }
1011
+ if (!hasOverscrollBehavior && (scroll >= maxScroll || scroll <= 0)) {
1012
+ return true;
1013
+ }
1015
1014
  const willScroll = delta > 0 ? scroll < maxScroll : scroll > 0;
1016
1015
  return willScroll && hasOverflow && isScrollable;
1017
1016
  }