lenis 1.0.45 → 1.1.0

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.
@@ -0,0 +1,287 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define(factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Lenis = factory());
5
+ })(this, (function () { 'use strict';
6
+
7
+ function removeParentSticky(element) {
8
+ const position = getComputedStyle(element).position;
9
+
10
+ const isSticky = position === 'sticky';
11
+
12
+ if (isSticky) {
13
+ element.style.setProperty('position', 'static');
14
+ element.dataset.sticky = 'true';
15
+ }
16
+
17
+ if (element.offsetParent) {
18
+ removeParentSticky(element.offsetParent);
19
+ }
20
+ }
21
+
22
+ function addParentSticky(element) {
23
+ if (element?.dataset?.sticky === 'true') {
24
+ element.style.removeProperty('position');
25
+ delete element.dataset.sticky;
26
+ }
27
+
28
+ if (element.offsetParent) {
29
+ addParentSticky(element.offsetParent);
30
+ }
31
+ }
32
+
33
+ function offsetTop(element, accumulator = 0) {
34
+ const top = accumulator + element.offsetTop;
35
+ if (element.offsetParent) {
36
+ return offsetTop(element.offsetParent, top)
37
+ }
38
+ return top
39
+ }
40
+
41
+ function offsetLeft(element, accumulator = 0) {
42
+ const left = accumulator + element.offsetLeft;
43
+ if (element.offsetParent) {
44
+ return offsetLeft(element.offsetParent, left)
45
+ }
46
+ return left
47
+ }
48
+
49
+ function scrollTop(element, accumulator = 0) {
50
+ const top = accumulator + element.scrollTop;
51
+ if (element.offsetParent) {
52
+ return scrollTop(element.offsetParent, top)
53
+ }
54
+ return top + window.scrollY
55
+ }
56
+
57
+ function scrollLeft(element, accumulator = 0) {
58
+ const left = accumulator + element.scrollLeft;
59
+ if (element.offsetParent) {
60
+ return scrollLeft(element.offsetParent, left)
61
+ }
62
+ return left + window.scrollX
63
+ }
64
+
65
+ class Slide {
66
+ constructor(
67
+ element,
68
+ { align = ['start'], ignoreSticky = true, ignoreTransform = false } = {}
69
+ ) {
70
+ this.element = element;
71
+
72
+ this.ignoreSticky = ignoreSticky;
73
+ this.ignoreTransform = ignoreTransform;
74
+
75
+ this.align = [align].flat();
76
+
77
+ this.rect = {};
78
+
79
+ this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize);
80
+ this.wrapperResizeObserver.observe(document.body);
81
+
82
+ this.resizeObserver = new ResizeObserver(this.onResize);
83
+ this.resizeObserver.observe(this.element);
84
+ }
85
+
86
+ destroy() {
87
+ this.wrapperResizeObserver.disconnect();
88
+ this.resizeObserver.disconnect();
89
+ }
90
+
91
+ setRect({ top, left, width, height, element }) {
92
+ top = top ?? this.rect.top;
93
+ left = left ?? this.rect.left;
94
+ width = width ?? this.rect.width;
95
+ height = height ?? this.rect.height;
96
+ element = element ?? this.rect.element;
97
+
98
+ if (
99
+ top === this.rect.top &&
100
+ left === this.rect.left &&
101
+ width === this.rect.width &&
102
+ height === this.rect.height &&
103
+ element === this.rect.element
104
+ )
105
+ return
106
+
107
+ this.rect.top = top;
108
+ this.rect.y = top;
109
+ this.rect.width = width;
110
+ this.rect.height = height;
111
+ this.rect.left = left;
112
+ this.rect.x = left;
113
+ this.rect.bottom = top + height;
114
+ this.rect.right = left + width;
115
+ }
116
+
117
+ onWrapperResize = () => {
118
+ let top, left;
119
+
120
+ if (this.ignoreSticky) removeParentSticky(this.element);
121
+ if (this.ignoreTransform) {
122
+ top = offsetTop(this.element);
123
+ left = offsetLeft(this.element);
124
+ } else {
125
+ const rect = this.element.getBoundingClientRect();
126
+ top = rect.top + scrollTop(this.element);
127
+ left = rect.left + scrollLeft(this.element);
128
+ }
129
+ if (this.ignoreSticky) addParentSticky(this.element);
130
+
131
+ this.setRect({ top, left });
132
+ }
133
+
134
+ onResize = ([entry]) => {
135
+ const width = entry.borderBoxSize[0].inlineSize;
136
+ const height = entry.borderBoxSize[0].blockSize;
137
+
138
+ this.setRect({ width, height });
139
+ }
140
+ }
141
+
142
+ // TODO:
143
+ // - horizontal
144
+ // - fix trackpad snapping too soon due to velocity (fuck Apple)
145
+ // - fix wheel scrolling after limits (see console scroll to)
146
+ // - fix touch scroll, do not snap when not released
147
+ class Snap {
148
+ constructor(lenis, { type = 'mandatory', lerp, easing, duration, velocityThreshold = 1, onSnapStart, onSnapComplete, } = {}) {
149
+ this.onWindowResize = () => {
150
+ this.viewport.width = window.innerWidth;
151
+ this.viewport.height = window.innerHeight;
152
+ };
153
+ this.onScroll = ({ scroll, limit, lastVelocity, velocity, isScrolling, isTouching, userData, }) => {
154
+ if (this.isStopped)
155
+ return;
156
+ // console.log(scroll, velocity, type)
157
+ // return
158
+ const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity);
159
+ const isTurningBack = Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0;
160
+ // console.log({ lastVelocity, velocity, isTurningBack, isDecelerating })
161
+ // console.log('onScroll')
162
+ if (Math.abs(velocity) < this.velocityThreshold &&
163
+ // !isTouching &&
164
+ isDecelerating &&
165
+ !isTurningBack &&
166
+ (userData === null || userData === void 0 ? void 0 : userData.initiator) !== 'snap') {
167
+ scroll = Math.ceil(scroll);
168
+ let snaps = [0, ...this.snaps.values(), limit];
169
+ this.elements.forEach(({ rect, align }) => {
170
+ let snap;
171
+ align.forEach((align) => {
172
+ if (align === 'start') {
173
+ snap = rect.top;
174
+ }
175
+ else if (align === 'center') {
176
+ snap = rect.top + rect.height / 2 - this.viewport.height / 2;
177
+ }
178
+ else if (align === 'end') {
179
+ snap = rect.top + rect.height - this.viewport.height;
180
+ }
181
+ if (snap !== undefined) {
182
+ snaps.push(Math.ceil(snap));
183
+ }
184
+ });
185
+ });
186
+ snaps = snaps.sort((a, b) => Math.abs(a) - Math.abs(b));
187
+ let prevSnap = snaps.findLast((snap) => snap <= scroll);
188
+ if (prevSnap === undefined)
189
+ prevSnap = snaps[0];
190
+ const distanceToPrevSnap = Math.abs(scroll - prevSnap);
191
+ let nextSnap = snaps.find((snap) => snap >= scroll);
192
+ if (nextSnap === undefined)
193
+ nextSnap = snaps[snaps.length - 1];
194
+ const distanceToNextSnap = Math.abs(scroll - nextSnap);
195
+ const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap;
196
+ const distance = Math.abs(scroll - snap);
197
+ if (this.type === 'mandatory' ||
198
+ (this.type === 'proximity' && distance <= this.viewport.height)) {
199
+ // this.__isScrolling = true
200
+ // this.onSnapStart?.(snap)
201
+ // console.log('scroll to')
202
+ this.lenis.scrollTo(snap, {
203
+ lerp: this.options.lerp,
204
+ easing: this.options.easing,
205
+ duration: this.options.duration,
206
+ userData: { initiator: 'snap' },
207
+ onStart: () => {
208
+ var _a;
209
+ (_a = this.onSnapStart) === null || _a === void 0 ? void 0 : _a.call(this, snap);
210
+ },
211
+ onComplete: () => {
212
+ var _a;
213
+ (_a = this.onSnapComplete) === null || _a === void 0 ? void 0 : _a.call(this, snap);
214
+ },
215
+ });
216
+ }
217
+ // console.timeEnd('scroll')
218
+ }
219
+ };
220
+ this.lenis = lenis;
221
+ this.options = {
222
+ type,
223
+ lerp,
224
+ easing,
225
+ duration,
226
+ velocityThreshold,
227
+ };
228
+ this.type = type;
229
+ this.elements = new Map();
230
+ this.snaps = new Map();
231
+ this.velocityThreshold = velocityThreshold;
232
+ this.onSnapStart = onSnapStart;
233
+ this.onSnapComplete = onSnapComplete;
234
+ this.viewport = {
235
+ width: window.innerWidth,
236
+ height: window.innerHeight,
237
+ };
238
+ this.onWindowResize();
239
+ window.addEventListener('resize', this.onWindowResize);
240
+ this.lenis.on('scroll', this.onScroll);
241
+ }
242
+ // debug() {
243
+ // const element = document.createElement('div')
244
+ // element.style.cssText = `
245
+ // position: fixed;
246
+ // background: red;
247
+ // border-bottom: 1px solid red;
248
+ // left: 0;
249
+ // right: 0;
250
+ // top: 0;
251
+ // z-index: 9999;
252
+ // `
253
+ // document.body.appendChild(element)
254
+ // }
255
+ destroy() {
256
+ this.lenis.off('scroll', this.onScroll);
257
+ window.removeEventListener('resize', this.onWindowResize);
258
+ this.elements.forEach((slide) => slide.destroy());
259
+ }
260
+ start() {
261
+ this.isStopped = false;
262
+ }
263
+ stop() {
264
+ this.isStopped = true;
265
+ }
266
+ add(value) {
267
+ const id = crypto.randomUUID();
268
+ this.snaps.set(id, value);
269
+ return () => this.remove(id);
270
+ }
271
+ remove(id) {
272
+ this.snaps.delete(id);
273
+ }
274
+ addElement(element, options = {}) {
275
+ const id = crypto.randomUUID();
276
+ this.elements.set(id, new Slide(element, options));
277
+ return () => this.removeElement(id);
278
+ }
279
+ removeElement(id) {
280
+ this.elements.delete(id);
281
+ }
282
+ }
283
+
284
+ return Snap;
285
+
286
+ }));
287
+ //# sourceMappingURL=lenis-snap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenis-snap.js","sources":["../src/slide.js","../src/index.ts"],"sourcesContent":["function removeParentSticky(element) {\r\n const position = getComputedStyle(element).position\r\n\r\n const isSticky = position === 'sticky'\r\n\r\n if (isSticky) {\r\n element.style.setProperty('position', 'static')\r\n element.dataset.sticky = 'true'\r\n }\r\n\r\n if (element.offsetParent) {\r\n removeParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element) {\r\n if (element?.dataset?.sticky === 'true') {\r\n element.style.removeProperty('position')\r\n delete element.dataset.sticky\r\n }\r\n\r\n if (element.offsetParent) {\r\n addParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction offsetTop(element, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport default class Slide {\r\n constructor(\r\n element,\r\n { align = ['start'], ignoreSticky = true, ignoreTransform = false } = {}\r\n ) {\r\n this.element = element\r\n\r\n this.ignoreSticky = ignoreSticky\r\n this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n this.rect = {}\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({ top, left, width, height, element }) {\r\n top = top ?? this.rect.top\r\n left = left ?? this.rect.left\r\n width = width ?? this.rect.width\r\n height = height ?? this.rect.height\r\n element = element ?? this.rect.element\r\n\r\n if (\r\n top === this.rect.top &&\r\n left === this.rect.left &&\r\n width === this.rect.width &&\r\n height === this.rect.height &&\r\n element === this.rect.element\r\n )\r\n return\r\n\r\n this.rect.top = top\r\n this.rect.y = top\r\n this.rect.width = width\r\n this.rect.height = height\r\n this.rect.left = left\r\n this.rect.x = left\r\n this.rect.bottom = top + height\r\n this.rect.right = left + width\r\n }\r\n\r\n onWrapperResize = () => {\r\n let top, left\r\n\r\n if (this.ignoreSticky) removeParentSticky(this.element)\r\n if (this.ignoreTransform) {\r\n top = offsetTop(this.element)\r\n left = offsetLeft(this.element)\r\n } else {\r\n const rect = this.element.getBoundingClientRect()\r\n top = rect.top + scrollTop(this.element)\r\n left = rect.left + scrollLeft(this.element)\r\n }\r\n if (this.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]) => {\r\n const width = entry.borderBoxSize[0].inlineSize\r\n const height = entry.borderBoxSize[0].blockSize\r\n\r\n this.setRect({ width, height })\r\n }\r\n}\r\n","import Slide from './slide'\r\n\r\n// TODO:\r\n// - horizontal\r\n// - fix trackpad snapping too soon due to velocity (fuck Apple)\r\n// - fix wheel scrolling after limits (see console scroll to)\r\n// - fix touch scroll, do not snap when not released\r\n\r\nexport default class Snap {\r\n constructor(\r\n lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n onSnapStart,\r\n onSnapComplete,\r\n } = {}\r\n ) {\r\n this.lenis = lenis\r\n\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n }\r\n\r\n this.type = type\r\n this.elements = new Map()\r\n this.snaps = new Map()\r\n\r\n this.velocityThreshold = velocityThreshold\r\n this.onSnapStart = onSnapStart\r\n this.onSnapComplete = onSnapComplete\r\n\r\n this.viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n // debug() {\r\n // const element = document.createElement('div')\r\n // element.style.cssText = `\r\n // position: fixed;\r\n // background: red;\r\n // border-bottom: 1px solid red;\r\n // left: 0;\r\n // right: 0;\r\n // top: 0;\r\n // z-index: 9999;\r\n // `\r\n // document.body.appendChild(element)\r\n // }\r\n\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize)\r\n this.elements.forEach((slide) => slide.destroy())\r\n }\r\n\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n add(value) {\r\n const id = crypto.randomUUID()\r\n\r\n this.snaps.set(id, value)\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n remove(id) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n addElement(element, options = {}) {\r\n const id = crypto.randomUUID()\r\n\r\n this.elements.set(id, new Slide(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n removeElement(id) {\r\n this.elements.delete(id)\r\n }\r\n\r\n onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n onScroll = ({\r\n scroll,\r\n limit,\r\n lastVelocity,\r\n velocity,\r\n isScrolling,\r\n isTouching,\r\n userData,\r\n }) => {\r\n if (this.isStopped) return\r\n // console.log(scroll, velocity, type)\r\n\r\n // return\r\n const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity)\r\n const isTurningBack =\r\n Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0\r\n\r\n // console.log({ lastVelocity, velocity, isTurningBack, isDecelerating })\r\n\r\n // console.log('onScroll')\r\n\r\n if (\r\n Math.abs(velocity) < this.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n scroll = Math.ceil(scroll)\r\n\r\n let snaps = [0, ...this.snaps.values(), limit]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let snap\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n snap = rect.top\r\n } else if (align === 'center') {\r\n snap = rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n snap = rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (snap !== undefined) {\r\n snaps.push(Math.ceil(snap))\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a) - Math.abs(b))\r\n\r\n let prevSnap = snaps.findLast((snap) => snap <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap)\r\n\r\n let nextSnap = snaps.find((snap) => snap >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap)\r\n\r\n if (\r\n this.type === 'mandatory' ||\r\n (this.type === 'proximity' && distance <= this.viewport.height)\r\n ) {\r\n // this.__isScrolling = true\r\n // this.onSnapStart?.(snap)\r\n\r\n // console.log('scroll to')\r\n\r\n this.lenis.scrollTo(snap, {\r\n lerp: this.options.lerp,\r\n easing: this.options.easing,\r\n duration: this.options.duration,\r\n userData: { initiator: 'snap' },\r\n onStart: () => {\r\n this.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Lenis=e()}(this,(function(){"use strict";function removeParentSticky(t){"sticky"===getComputedStyle(t).position&&(t.style.setProperty("position","static"),t.dataset.sticky="true"),t.offsetParent&&removeParentSticky(t.offsetParent)}function addParentSticky(t){"true"===t?.dataset?.sticky&&(t.style.removeProperty("position"),delete t.dataset.sticky),t.offsetParent&&addParentSticky(t.offsetParent)}function offsetTop(t,e=0){const i=e+t.offsetTop;return t.offsetParent?offsetTop(t.offsetParent,i):i}function offsetLeft(t,e=0){const i=e+t.offsetLeft;return t.offsetParent?offsetLeft(t.offsetParent,i):i}function scrollTop(t,e=0){const i=e+t.scrollTop;return t.offsetParent?scrollTop(t.offsetParent,i):i+window.scrollY}function scrollLeft(t,e=0){const i=e+t.scrollLeft;return t.offsetParent?scrollLeft(t.offsetParent,i):i+window.scrollX}class Slide{constructor(t,{align:e=["start"],ignoreSticky:i=!0,ignoreTransform:s=!1}={}){this.element=t,this.ignoreSticky=i,this.ignoreTransform=s,this.align=[e].flat(),this.rect={},this.wrapperResizeObserver=new ResizeObserver(this.onWrapperResize),this.wrapperResizeObserver.observe(document.body),this.resizeObserver=new ResizeObserver(this.onResize),this.resizeObserver.observe(this.element)}destroy(){this.wrapperResizeObserver.disconnect(),this.resizeObserver.disconnect()}setRect({top:t,left:e,width:i,height:s,element:o}){t=t??this.rect.top,e=e??this.rect.left,i=i??this.rect.width,s=s??this.rect.height,o=o??this.rect.element,t===this.rect.top&&e===this.rect.left&&i===this.rect.width&&s===this.rect.height&&o===this.rect.element||(this.rect.top=t,this.rect.y=t,this.rect.width=i,this.rect.height=s,this.rect.left=e,this.rect.x=e,this.rect.bottom=t+s,this.rect.right=e+i)}onWrapperResize=()=>{let t,e;if(this.ignoreSticky&&removeParentSticky(this.element),this.ignoreTransform)t=offsetTop(this.element),e=offsetLeft(this.element);else{const i=this.element.getBoundingClientRect();t=i.top+scrollTop(this.element),e=i.left+scrollLeft(this.element)}this.ignoreSticky&&addParentSticky(this.element),this.setRect({top:t,left:e})};onResize=([t])=>{const e=t.borderBoxSize[0].inlineSize,i=t.borderBoxSize[0].blockSize;this.setRect({width:e,height:i})}}return class Snap{constructor(t,{type:e="mandatory",lerp:i,easing:s,duration:o,velocityThreshold:n=1,onSnapStart:r,onSnapComplete:h}={}){this.onWindowResize=()=>{this.viewport.width=window.innerWidth,this.viewport.height=window.innerHeight},this.onScroll=({scroll:t,limit:e,lastVelocity:i,velocity:s,isScrolling:o,isTouching:n,userData:r})=>{if(this.isStopped)return;const h=Math.abs(i)>Math.abs(s),l=Math.sign(i)!==Math.sign(s)&&0!==s;if(Math.abs(s)<this.velocityThreshold&&h&&!l&&"snap"!==(null==r?void 0:r.initiator)){t=Math.ceil(t);let i=[0,...this.snaps.values(),e];this.elements.forEach((({rect:t,align:e})=>{let s;e.forEach((e=>{"start"===e?s=t.top:"center"===e?s=t.top+t.height/2-this.viewport.height/2:"end"===e&&(s=t.top+t.height-this.viewport.height),void 0!==s&&i.push(Math.ceil(s))}))})),i=i.sort(((t,e)=>Math.abs(t)-Math.abs(e)));let s=i.findLast((e=>e<=t));void 0===s&&(s=i[0]);const o=Math.abs(t-s);let n=i.find((e=>e>=t));void 0===n&&(n=i[i.length-1]);const r=o<Math.abs(t-n)?s:n,h=Math.abs(t-r);("mandatory"===this.type||"proximity"===this.type&&h<=this.viewport.height)&&this.lenis.scrollTo(r,{lerp:this.options.lerp,easing:this.options.easing,duration:this.options.duration,userData:{initiator:"snap"},onStart:()=>{var t;null===(t=this.onSnapStart)||void 0===t||t.call(this,r)},onComplete:()=>{var t;null===(t=this.onSnapComplete)||void 0===t||t.call(this,r)}})}},this.lenis=t,this.options={type:e,lerp:i,easing:s,duration:o,velocityThreshold:n},this.type=e,this.elements=new Map,this.snaps=new Map,this.velocityThreshold=n,this.onSnapStart=r,this.onSnapComplete=h,this.viewport={width:window.innerWidth,height:window.innerHeight},this.onWindowResize(),window.addEventListener("resize",this.onWindowResize),this.lenis.on("scroll",this.onScroll)}destroy(){this.lenis.off("scroll",this.onScroll),window.removeEventListener("resize",this.onWindowResize),this.elements.forEach((t=>t.destroy()))}start(){this.isStopped=!1}stop(){this.isStopped=!0}add(t){const e=crypto.randomUUID();return this.snaps.set(e,t),()=>this.remove(e)}remove(t){this.snaps.delete(t)}addElement(t,e={}){const i=crypto.randomUUID();return this.elements.set(i,new Slide(t,e)),()=>this.removeElement(i)}removeElement(t){this.elements.delete(t)}}}));
2
+ //# sourceMappingURL=lenis-snap.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenis-snap.min.js","sources":["../src/slide.js","../src/index.ts"],"sourcesContent":["function removeParentSticky(element) {\r\n const position = getComputedStyle(element).position\r\n\r\n const isSticky = position === 'sticky'\r\n\r\n if (isSticky) {\r\n element.style.setProperty('position', 'static')\r\n element.dataset.sticky = 'true'\r\n }\r\n\r\n if (element.offsetParent) {\r\n removeParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element) {\r\n if (element?.dataset?.sticky === 'true') {\r\n element.style.removeProperty('position')\r\n delete element.dataset.sticky\r\n }\r\n\r\n if (element.offsetParent) {\r\n addParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction offsetTop(element, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport default class Slide {\r\n constructor(\r\n element,\r\n { align = ['start'], ignoreSticky = true, ignoreTransform = false } = {}\r\n ) {\r\n this.element = element\r\n\r\n this.ignoreSticky = ignoreSticky\r\n this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n this.rect = {}\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({ top, left, width, height, element }) {\r\n top = top ?? this.rect.top\r\n left = left ?? this.rect.left\r\n width = width ?? this.rect.width\r\n height = height ?? this.rect.height\r\n element = element ?? this.rect.element\r\n\r\n if (\r\n top === this.rect.top &&\r\n left === this.rect.left &&\r\n width === this.rect.width &&\r\n height === this.rect.height &&\r\n element === this.rect.element\r\n )\r\n return\r\n\r\n this.rect.top = top\r\n this.rect.y = top\r\n this.rect.width = width\r\n this.rect.height = height\r\n this.rect.left = left\r\n this.rect.x = left\r\n this.rect.bottom = top + height\r\n this.rect.right = left + width\r\n }\r\n\r\n onWrapperResize = () => {\r\n let top, left\r\n\r\n if (this.ignoreSticky) removeParentSticky(this.element)\r\n if (this.ignoreTransform) {\r\n top = offsetTop(this.element)\r\n left = offsetLeft(this.element)\r\n } else {\r\n const rect = this.element.getBoundingClientRect()\r\n top = rect.top + scrollTop(this.element)\r\n left = rect.left + scrollLeft(this.element)\r\n }\r\n if (this.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]) => {\r\n const width = entry.borderBoxSize[0].inlineSize\r\n const height = entry.borderBoxSize[0].blockSize\r\n\r\n this.setRect({ width, height })\r\n }\r\n}\r\n","import Slide from './slide'\r\n\r\n// TODO:\r\n// - horizontal\r\n// - fix trackpad snapping too soon due to velocity (fuck Apple)\r\n// - fix wheel scrolling after limits (see console scroll to)\r\n// - fix touch scroll, do not snap when not released\r\n\r\nexport default class Snap {\r\n constructor(\r\n lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n onSnapStart,\r\n onSnapComplete,\r\n } = {}\r\n ) {\r\n this.lenis = lenis\r\n\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n }\r\n\r\n this.type = type\r\n this.elements = new Map()\r\n this.snaps = new Map()\r\n\r\n this.velocityThreshold = velocityThreshold\r\n this.onSnapStart = onSnapStart\r\n this.onSnapComplete = onSnapComplete\r\n\r\n this.viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n // debug() {\r\n // const element = document.createElement('div')\r\n // element.style.cssText = `\r\n // position: fixed;\r\n // background: red;\r\n // border-bottom: 1px solid red;\r\n // left: 0;\r\n // right: 0;\r\n // top: 0;\r\n // z-index: 9999;\r\n // `\r\n // document.body.appendChild(element)\r\n // }\r\n\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize)\r\n this.elements.forEach((slide) => slide.destroy())\r\n }\r\n\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n add(value) {\r\n const id = crypto.randomUUID()\r\n\r\n this.snaps.set(id, value)\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n remove(id) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n addElement(element, options = {}) {\r\n const id = crypto.randomUUID()\r\n\r\n this.elements.set(id, new Slide(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n removeElement(id) {\r\n this.elements.delete(id)\r\n }\r\n\r\n onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n onScroll = ({\r\n scroll,\r\n limit,\r\n lastVelocity,\r\n velocity,\r\n isScrolling,\r\n isTouching,\r\n userData,\r\n }) => {\r\n if (this.isStopped) return\r\n // console.log(scroll, velocity, type)\r\n\r\n // return\r\n const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity)\r\n const isTurningBack =\r\n Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0\r\n\r\n // console.log({ lastVelocity, velocity, isTurningBack, isDecelerating })\r\n\r\n // console.log('onScroll')\r\n\r\n if (\r\n Math.abs(velocity) < this.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n scroll = Math.ceil(scroll)\r\n\r\n let snaps = [0, ...this.snaps.values(), limit]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let snap\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n snap = rect.top\r\n } else if (align === 'center') {\r\n snap = rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n snap = rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (snap !== undefined) {\r\n snaps.push(Math.ceil(snap))\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a) - Math.abs(b))\r\n\r\n let prevSnap = snaps.findLast((snap) => snap <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap)\r\n\r\n let nextSnap = snaps.find((snap) => snap >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap)\r\n\r\n if (\r\n this.type === 'mandatory' ||\r\n (this.type === 'proximity' && distance <= this.viewport.height)\r\n ) {\r\n // this.__isScrolling = true\r\n // this.onSnapStart?.(snap)\r\n\r\n // console.log('scroll to')\r\n\r\n this.lenis.scrollTo(snap, {\r\n lerp: this.options.lerp,\r\n easing: this.options.easing,\r\n duration: this.options.duration,\r\n userData: { initiator: 'snap' },\r\n onStart: () => {\r\n this.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n }\r\n}\r\n"],"names":["removeParentSticky","element","getComputedStyle","position","style","setProperty","dataset","sticky","offsetParent","addParentSticky","removeProperty","offsetTop","accumulator","top","offsetLeft","left","scrollTop","window","scrollY","scrollLeft","scrollX","Slide","constructor","align","ignoreSticky","ignoreTransform","this","flat","rect","wrapperResizeObserver","ResizeObserver","onWrapperResize","observe","document","body","resizeObserver","onResize","destroy","disconnect","setRect","width","height","y","x","bottom","right","getBoundingClientRect","entry","borderBoxSize","inlineSize","blockSize","Snap","lenis","type","lerp","easing","duration","velocityThreshold","onSnapStart","onSnapComplete","onWindowResize","viewport","innerWidth","innerHeight","onScroll","scroll","limit","lastVelocity","velocity","isScrolling","isTouching","userData","isStopped","isDecelerating","Math","abs","isTurningBack","sign","initiator","ceil","snaps","values","elements","forEach","snap","undefined","push","sort","a","b","prevSnap","findLast","distanceToPrevSnap","nextSnap","find","length","distance","scrollTo","options","onStart","_a","call","onComplete","Map","addEventListener","on","off","removeEventListener","slide","start","stop","add","value","id","crypto","randomUUID","set","remove","delete","addElement","removeElement"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function removeParentSticky(t){"sticky"===getComputedStyle(t).position&&(t.style.setProperty("position","static"),t.dataset.sticky="true"),t.offsetParent&&removeParentSticky(t.offsetParent)}function addParentSticky(t){"true"===t?.dataset?.sticky&&(t.style.removeProperty("position"),delete t.dataset.sticky),t.offsetParent&&addParentSticky(t.offsetParent)}function offsetTop(t,e=0){const i=e+t.offsetTop;return t.offsetParent?offsetTop(t.offsetParent,i):i}function offsetLeft(t,e=0){const i=e+t.offsetLeft;return t.offsetParent?offsetLeft(t.offsetParent,i):i}function scrollTop(t,e=0){const i=e+t.scrollTop;return t.offsetParent?scrollTop(t.offsetParent,i):i+window.scrollY}function scrollLeft(t,e=0){const i=e+t.scrollLeft;return t.offsetParent?scrollLeft(t.offsetParent,i):i+window.scrollX}class Slide{constructor(t,{align:e=["start"],ignoreSticky:i=!0,ignoreTransform:s=!1}={}){this.element=t,this.ignoreSticky=i,this.ignoreTransform=s,this.align=[e].flat(),this.rect={},this.wrapperResizeObserver=new ResizeObserver(this.onWrapperResize),this.wrapperResizeObserver.observe(document.body),this.resizeObserver=new ResizeObserver(this.onResize),this.resizeObserver.observe(this.element)}destroy(){this.wrapperResizeObserver.disconnect(),this.resizeObserver.disconnect()}setRect({top:t,left:e,width:i,height:s,element:o}){t=t??this.rect.top,e=e??this.rect.left,i=i??this.rect.width,s=s??this.rect.height,o=o??this.rect.element,t===this.rect.top&&e===this.rect.left&&i===this.rect.width&&s===this.rect.height&&o===this.rect.element||(this.rect.top=t,this.rect.y=t,this.rect.width=i,this.rect.height=s,this.rect.left=e,this.rect.x=e,this.rect.bottom=t+s,this.rect.right=e+i)}onWrapperResize=()=>{let t,e;if(this.ignoreSticky&&removeParentSticky(this.element),this.ignoreTransform)t=offsetTop(this.element),e=offsetLeft(this.element);else{const i=this.element.getBoundingClientRect();t=i.top+scrollTop(this.element),e=i.left+scrollLeft(this.element)}this.ignoreSticky&&addParentSticky(this.element),this.setRect({top:t,left:e})};onResize=([t])=>{const e=t.borderBoxSize[0].inlineSize,i=t.borderBoxSize[0].blockSize;this.setRect({width:e,height:i})}}class Snap{constructor(t,{type:e="mandatory",lerp:i,easing:s,duration:o,velocityThreshold:n=1,onSnapStart:r,onSnapComplete:h}={}){this.onWindowResize=()=>{this.viewport.width=window.innerWidth,this.viewport.height=window.innerHeight},this.onScroll=({scroll:t,limit:e,lastVelocity:i,velocity:s,isScrolling:o,isTouching:n,userData:r})=>{if(this.isStopped)return;const h=Math.abs(i)>Math.abs(s),l=Math.sign(i)!==Math.sign(s)&&0!==s;if(Math.abs(s)<this.velocityThreshold&&h&&!l&&"snap"!==(null==r?void 0:r.initiator)){t=Math.ceil(t);let i=[0,...this.snaps.values(),e];this.elements.forEach((({rect:t,align:e})=>{let s;e.forEach((e=>{"start"===e?s=t.top:"center"===e?s=t.top+t.height/2-this.viewport.height/2:"end"===e&&(s=t.top+t.height-this.viewport.height),void 0!==s&&i.push(Math.ceil(s))}))})),i=i.sort(((t,e)=>Math.abs(t)-Math.abs(e)));let s=i.findLast((e=>e<=t));void 0===s&&(s=i[0]);const o=Math.abs(t-s);let n=i.find((e=>e>=t));void 0===n&&(n=i[i.length-1]);const r=o<Math.abs(t-n)?s:n,h=Math.abs(t-r);("mandatory"===this.type||"proximity"===this.type&&h<=this.viewport.height)&&this.lenis.scrollTo(r,{lerp:this.options.lerp,easing:this.options.easing,duration:this.options.duration,userData:{initiator:"snap"},onStart:()=>{var t;null===(t=this.onSnapStart)||void 0===t||t.call(this,r)},onComplete:()=>{var t;null===(t=this.onSnapComplete)||void 0===t||t.call(this,r)}})}},this.lenis=t,this.options={type:e,lerp:i,easing:s,duration:o,velocityThreshold:n},this.type=e,this.elements=new Map,this.snaps=new Map,this.velocityThreshold=n,this.onSnapStart=r,this.onSnapComplete=h,this.viewport={width:window.innerWidth,height:window.innerHeight},this.onWindowResize(),window.addEventListener("resize",this.onWindowResize),this.lenis.on("scroll",this.onScroll)}destroy(){this.lenis.off("scroll",this.onScroll),window.removeEventListener("resize",this.onWindowResize),this.elements.forEach((t=>t.destroy()))}start(){this.isStopped=!1}stop(){this.isStopped=!0}add(t){const e=crypto.randomUUID();return this.snaps.set(e,t),()=>this.remove(e)}remove(t){this.snaps.delete(t)}addElement(t,e={}){const i=crypto.randomUUID();return this.elements.set(i,new Slide(t,e)),()=>this.removeElement(i)}removeElement(t){this.elements.delete(t)}}export{Snap as default};
2
+ //# sourceMappingURL=lenis-snap.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lenis-snap.mjs","sources":["../src/slide.js","../src/index.ts"],"sourcesContent":["function removeParentSticky(element) {\r\n const position = getComputedStyle(element).position\r\n\r\n const isSticky = position === 'sticky'\r\n\r\n if (isSticky) {\r\n element.style.setProperty('position', 'static')\r\n element.dataset.sticky = 'true'\r\n }\r\n\r\n if (element.offsetParent) {\r\n removeParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element) {\r\n if (element?.dataset?.sticky === 'true') {\r\n element.style.removeProperty('position')\r\n delete element.dataset.sticky\r\n }\r\n\r\n if (element.offsetParent) {\r\n addParentSticky(element.offsetParent)\r\n }\r\n}\r\n\r\nfunction offsetTop(element, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport default class Slide {\r\n constructor(\r\n element,\r\n { align = ['start'], ignoreSticky = true, ignoreTransform = false } = {}\r\n ) {\r\n this.element = element\r\n\r\n this.ignoreSticky = ignoreSticky\r\n this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n this.rect = {}\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({ top, left, width, height, element }) {\r\n top = top ?? this.rect.top\r\n left = left ?? this.rect.left\r\n width = width ?? this.rect.width\r\n height = height ?? this.rect.height\r\n element = element ?? this.rect.element\r\n\r\n if (\r\n top === this.rect.top &&\r\n left === this.rect.left &&\r\n width === this.rect.width &&\r\n height === this.rect.height &&\r\n element === this.rect.element\r\n )\r\n return\r\n\r\n this.rect.top = top\r\n this.rect.y = top\r\n this.rect.width = width\r\n this.rect.height = height\r\n this.rect.left = left\r\n this.rect.x = left\r\n this.rect.bottom = top + height\r\n this.rect.right = left + width\r\n }\r\n\r\n onWrapperResize = () => {\r\n let top, left\r\n\r\n if (this.ignoreSticky) removeParentSticky(this.element)\r\n if (this.ignoreTransform) {\r\n top = offsetTop(this.element)\r\n left = offsetLeft(this.element)\r\n } else {\r\n const rect = this.element.getBoundingClientRect()\r\n top = rect.top + scrollTop(this.element)\r\n left = rect.left + scrollLeft(this.element)\r\n }\r\n if (this.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]) => {\r\n const width = entry.borderBoxSize[0].inlineSize\r\n const height = entry.borderBoxSize[0].blockSize\r\n\r\n this.setRect({ width, height })\r\n }\r\n}\r\n","import Slide from './slide'\r\n\r\n// TODO:\r\n// - horizontal\r\n// - fix trackpad snapping too soon due to velocity (fuck Apple)\r\n// - fix wheel scrolling after limits (see console scroll to)\r\n// - fix touch scroll, do not snap when not released\r\n\r\nexport default class Snap {\r\n constructor(\r\n lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n onSnapStart,\r\n onSnapComplete,\r\n } = {}\r\n ) {\r\n this.lenis = lenis\r\n\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n }\r\n\r\n this.type = type\r\n this.elements = new Map()\r\n this.snaps = new Map()\r\n\r\n this.velocityThreshold = velocityThreshold\r\n this.onSnapStart = onSnapStart\r\n this.onSnapComplete = onSnapComplete\r\n\r\n this.viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n // debug() {\r\n // const element = document.createElement('div')\r\n // element.style.cssText = `\r\n // position: fixed;\r\n // background: red;\r\n // border-bottom: 1px solid red;\r\n // left: 0;\r\n // right: 0;\r\n // top: 0;\r\n // z-index: 9999;\r\n // `\r\n // document.body.appendChild(element)\r\n // }\r\n\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize)\r\n this.elements.forEach((slide) => slide.destroy())\r\n }\r\n\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n add(value) {\r\n const id = crypto.randomUUID()\r\n\r\n this.snaps.set(id, value)\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n remove(id) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n addElement(element, options = {}) {\r\n const id = crypto.randomUUID()\r\n\r\n this.elements.set(id, new Slide(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n removeElement(id) {\r\n this.elements.delete(id)\r\n }\r\n\r\n onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n onScroll = ({\r\n scroll,\r\n limit,\r\n lastVelocity,\r\n velocity,\r\n isScrolling,\r\n isTouching,\r\n userData,\r\n }) => {\r\n if (this.isStopped) return\r\n // console.log(scroll, velocity, type)\r\n\r\n // return\r\n const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity)\r\n const isTurningBack =\r\n Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0\r\n\r\n // console.log({ lastVelocity, velocity, isTurningBack, isDecelerating })\r\n\r\n // console.log('onScroll')\r\n\r\n if (\r\n Math.abs(velocity) < this.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n scroll = Math.ceil(scroll)\r\n\r\n let snaps = [0, ...this.snaps.values(), limit]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let snap\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n snap = rect.top\r\n } else if (align === 'center') {\r\n snap = rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n snap = rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (snap !== undefined) {\r\n snaps.push(Math.ceil(snap))\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a) - Math.abs(b))\r\n\r\n let prevSnap = snaps.findLast((snap) => snap <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap)\r\n\r\n let nextSnap = snaps.find((snap) => snap >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap)\r\n\r\n if (\r\n this.type === 'mandatory' ||\r\n (this.type === 'proximity' && distance <= this.viewport.height)\r\n ) {\r\n // this.__isScrolling = true\r\n // this.onSnapStart?.(snap)\r\n\r\n // console.log('scroll to')\r\n\r\n this.lenis.scrollTo(snap, {\r\n lerp: this.options.lerp,\r\n easing: this.options.easing,\r\n duration: this.options.duration,\r\n userData: { initiator: 'snap' },\r\n onStart: () => {\r\n this.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n }\r\n}\r\n"],"names":["removeParentSticky","element","getComputedStyle","position","style","setProperty","dataset","sticky","offsetParent","addParentSticky","removeProperty","offsetTop","accumulator","top","offsetLeft","left","scrollTop","window","scrollY","scrollLeft","scrollX","Slide","constructor","align","ignoreSticky","ignoreTransform","this","flat","rect","wrapperResizeObserver","ResizeObserver","onWrapperResize","observe","document","body","resizeObserver","onResize","destroy","disconnect","setRect","width","height","y","x","bottom","right","getBoundingClientRect","entry","borderBoxSize","inlineSize","blockSize","Snap","lenis","type","lerp","easing","duration","velocityThreshold","onSnapStart","onSnapComplete","onWindowResize","viewport","innerWidth","innerHeight","onScroll","scroll","limit","lastVelocity","velocity","isScrolling","isTouching","userData","isStopped","isDecelerating","Math","abs","isTurningBack","sign","initiator","ceil","snaps","values","elements","forEach","snap","undefined","push","sort","a","b","prevSnap","findLast","distanceToPrevSnap","nextSnap","find","length","distance","scrollTo","options","onStart","_a","call","onComplete","Map","addEventListener","on","off","removeEventListener","slide","start","stop","add","value","id","crypto","randomUUID","set","remove","delete","addElement","removeElement"],"mappings":"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"}
package/dist/lenis.d.ts CHANGED
@@ -19,18 +19,26 @@ type LenisOptions = {
19
19
  touchMultiplier?: number;
20
20
  wheelMultiplier?: number;
21
21
  autoResize?: boolean;
22
+ prevent?: boolean | ((node: Element) => boolean);
22
23
  __experimental__naiveDimensions?: boolean;
23
24
  };
24
25
  declare class Lenis {
25
- __isSmooth: boolean;
26
- __isScrolling: boolean;
26
+ __isScrolling: boolean | 'native' | 'smooth';
27
27
  __isStopped: boolean;
28
28
  __isLocked: boolean;
29
+ time: number;
30
+ userData: object;
31
+ lastVelocity: number;
32
+ velocity: number;
33
+ direction: 1 | -1 | undefined;
34
+ options: LenisOptions;
35
+ targetScroll: number;
36
+ animatedScroll: number;
29
37
  constructor({ wrapper, content, wheelEventsTarget, // deprecated
30
38
  eventsTarget, smoothWheel, syncTouch, syncTouchLerp, touchInertiaMultiplier, duration, // in seconds
31
39
  easing, lerp, infinite, orientation, // vertical, horizontal
32
40
  gestureOrientation, // vertical, horizontal, both
33
- touchMultiplier, wheelMultiplier, autoResize, __experimental__naiveDimensions, }?: LenisOptions);
41
+ touchMultiplier, wheelMultiplier, autoResize, prevent, __experimental__naiveDimensions, }?: LenisOptions);
34
42
  destroy(): void;
35
43
  on(event: string, callback: Function): any;
36
44
  off(event: string, callback: Function): any;
@@ -43,34 +51,37 @@ declare class Lenis {
43
51
  start(): void;
44
52
  stop(): void;
45
53
  raf(time: number): void;
46
- scrollTo(target: number | string | HTMLElement, { offset, immediate, lock, duration, easing, lerp, onComplete, force, // scroll even if stopped
47
- programmatic, }?: {
54
+ scrollTo(target: number | string | HTMLElement, { offset, immediate, lock, duration, easing, lerp, onStart, onComplete, force, // scroll even if stopped
55
+ programmatic, // called from outside of the class
56
+ userData, }?: {
48
57
  offset?: number;
49
58
  immediate?: boolean;
50
59
  lock?: boolean;
51
60
  duration?: number;
52
61
  easing?: EasingFunction;
53
62
  lerp?: number;
63
+ onStart?: (lenis: Lenis) => void;
54
64
  onComplete?: (lenis: Lenis) => void;
55
65
  force?: boolean;
56
66
  programmatic?: boolean;
67
+ userData?: object;
57
68
  }): void;
58
- get rootElement(): any;
69
+ get rootElement(): Window | HTMLElement;
59
70
  get limit(): any;
60
71
  get isHorizontal(): boolean;
61
- get actualScroll(): any;
62
- get scroll(): any;
72
+ get actualScroll(): number;
73
+ get scroll(): number;
63
74
  get progress(): number;
64
- get isSmooth(): boolean;
65
- private set isSmooth(value);
66
75
  get isScrolling(): boolean;
67
76
  private set isScrolling(value);
68
77
  get isStopped(): boolean;
69
78
  private set isStopped(value);
70
79
  get isLocked(): boolean;
71
80
  private set isLocked(value);
81
+ get isSmooth(): boolean;
72
82
  get className(): string;
73
- private toggleClassName;
83
+ private updateClassName;
84
+ private cleanUpClassName;
74
85
  }
75
86
 
76
87
  export { type LenisOptions, Lenis as default };