lenis 1.1.13 → 1.1.14-dev.3
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.
- package/README.md +28 -15
- package/dist/lenis-react.d.ts +11 -11
- package/dist/lenis-vue.d.ts +68 -0
- package/dist/lenis.mjs +854 -2
- package/dist/lenis.mjs.map +1 -1
- package/package.json +24 -33
- package/dist/lenis-react.mjs +0 -2
- package/dist/lenis-react.mjs.map +0 -1
- package/dist/lenis-snap.js +0 -342
- package/dist/lenis-snap.js.map +0 -1
- package/dist/lenis-snap.min.js +0 -2
- package/dist/lenis-snap.min.js.map +0 -1
- package/dist/lenis-snap.mjs +0 -2
- package/dist/lenis-snap.mjs.map +0 -1
- package/dist/lenis.css +0 -20
- package/dist/lenis.js +0 -923
- package/dist/lenis.js.map +0 -1
- package/dist/lenis.min.js +0 -2
- package/dist/lenis.min.js.map +0 -1
package/dist/lenis-snap.js
DELETED
|
@@ -1,342 +0,0 @@
|
|
|
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 debounce(callback, delay) {
|
|
8
|
-
let timer;
|
|
9
|
-
return function (...args) {
|
|
10
|
-
let context = this;
|
|
11
|
-
clearTimeout(timer);
|
|
12
|
-
timer = setTimeout(() => {
|
|
13
|
-
timer = undefined;
|
|
14
|
-
callback.apply(context, args);
|
|
15
|
-
}, delay);
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function removeParentSticky(element) {
|
|
20
|
-
const position = getComputedStyle(element).position;
|
|
21
|
-
const isSticky = position === 'sticky';
|
|
22
|
-
if (isSticky) {
|
|
23
|
-
element.style.setProperty('position', 'static');
|
|
24
|
-
element.dataset.sticky = 'true';
|
|
25
|
-
}
|
|
26
|
-
if (element.offsetParent) {
|
|
27
|
-
removeParentSticky(element.offsetParent);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function addParentSticky(element) {
|
|
31
|
-
var _a;
|
|
32
|
-
if (((_a = element === null || element === void 0 ? void 0 : element.dataset) === null || _a === void 0 ? void 0 : _a.sticky) === 'true') {
|
|
33
|
-
element.style.removeProperty('position');
|
|
34
|
-
delete element.dataset.sticky;
|
|
35
|
-
}
|
|
36
|
-
if (element.offsetParent) {
|
|
37
|
-
addParentSticky(element.offsetParent);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
function offsetTop(element, accumulator = 0) {
|
|
41
|
-
const top = accumulator + element.offsetTop;
|
|
42
|
-
if (element.offsetParent) {
|
|
43
|
-
return offsetTop(element.offsetParent, top);
|
|
44
|
-
}
|
|
45
|
-
return top;
|
|
46
|
-
}
|
|
47
|
-
function offsetLeft(element, accumulator = 0) {
|
|
48
|
-
const left = accumulator + element.offsetLeft;
|
|
49
|
-
if (element.offsetParent) {
|
|
50
|
-
return offsetLeft(element.offsetParent, left);
|
|
51
|
-
}
|
|
52
|
-
return left;
|
|
53
|
-
}
|
|
54
|
-
function scrollTop(element, accumulator = 0) {
|
|
55
|
-
const top = accumulator + element.scrollTop;
|
|
56
|
-
if (element.offsetParent) {
|
|
57
|
-
return scrollTop(element.offsetParent, top);
|
|
58
|
-
}
|
|
59
|
-
return top + window.scrollY;
|
|
60
|
-
}
|
|
61
|
-
function scrollLeft(element, accumulator = 0) {
|
|
62
|
-
const left = accumulator + element.scrollLeft;
|
|
63
|
-
if (element.offsetParent) {
|
|
64
|
-
return scrollLeft(element.offsetParent, left);
|
|
65
|
-
}
|
|
66
|
-
return left + window.scrollX;
|
|
67
|
-
}
|
|
68
|
-
class SnapElement {
|
|
69
|
-
constructor(element, { align = ['start'], ignoreSticky = true, ignoreTransform = false, } = {}) {
|
|
70
|
-
// @ts-ignore
|
|
71
|
-
this.rect = {};
|
|
72
|
-
this.onWrapperResize = () => {
|
|
73
|
-
let top, left;
|
|
74
|
-
if (this.options.ignoreSticky)
|
|
75
|
-
removeParentSticky(this.element);
|
|
76
|
-
if (this.options.ignoreTransform) {
|
|
77
|
-
top = offsetTop(this.element);
|
|
78
|
-
left = offsetLeft(this.element);
|
|
79
|
-
}
|
|
80
|
-
else {
|
|
81
|
-
const rect = this.element.getBoundingClientRect();
|
|
82
|
-
top = rect.top + scrollTop(this.element);
|
|
83
|
-
left = rect.left + scrollLeft(this.element);
|
|
84
|
-
}
|
|
85
|
-
if (this.options.ignoreSticky)
|
|
86
|
-
addParentSticky(this.element);
|
|
87
|
-
this.setRect({ top, left });
|
|
88
|
-
};
|
|
89
|
-
this.onResize = ([entry]) => {
|
|
90
|
-
const width = entry.borderBoxSize[0].inlineSize;
|
|
91
|
-
const height = entry.borderBoxSize[0].blockSize;
|
|
92
|
-
this.setRect({ width, height });
|
|
93
|
-
};
|
|
94
|
-
this.element = element;
|
|
95
|
-
this.options = { align, ignoreSticky, ignoreTransform };
|
|
96
|
-
// this.ignoreSticky = ignoreSticky
|
|
97
|
-
// this.ignoreTransform = ignoreTransform
|
|
98
|
-
this.align = [align].flat();
|
|
99
|
-
// TODO: assing rect immediately
|
|
100
|
-
this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize);
|
|
101
|
-
this.wrapperResizeObserver.observe(document.body);
|
|
102
|
-
this.onWrapperResize();
|
|
103
|
-
this.resizeObserver = new ResizeObserver(this.onResize);
|
|
104
|
-
this.resizeObserver.observe(this.element);
|
|
105
|
-
this.setRect({
|
|
106
|
-
width: this.element.offsetWidth,
|
|
107
|
-
height: this.element.offsetHeight,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
destroy() {
|
|
111
|
-
this.wrapperResizeObserver.disconnect();
|
|
112
|
-
this.resizeObserver.disconnect();
|
|
113
|
-
}
|
|
114
|
-
setRect({ top, left, width, height, element, } = {}) {
|
|
115
|
-
top = top !== null && top !== void 0 ? top : this.rect.top;
|
|
116
|
-
left = left !== null && left !== void 0 ? left : this.rect.left;
|
|
117
|
-
width = width !== null && width !== void 0 ? width : this.rect.width;
|
|
118
|
-
height = height !== null && height !== void 0 ? height : this.rect.height;
|
|
119
|
-
element = element !== null && element !== void 0 ? element : this.rect.element;
|
|
120
|
-
if (top === this.rect.top &&
|
|
121
|
-
left === this.rect.left &&
|
|
122
|
-
width === this.rect.width &&
|
|
123
|
-
height === this.rect.height &&
|
|
124
|
-
element === this.rect.element)
|
|
125
|
-
return;
|
|
126
|
-
this.rect.top = top;
|
|
127
|
-
this.rect.y = top;
|
|
128
|
-
this.rect.width = width;
|
|
129
|
-
this.rect.height = height;
|
|
130
|
-
this.rect.left = left;
|
|
131
|
-
this.rect.x = left;
|
|
132
|
-
this.rect.bottom = top + height;
|
|
133
|
-
this.rect.right = left + width;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
let index = 0;
|
|
138
|
-
function uid() {
|
|
139
|
-
return index++;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Snap class to handle the snap functionality
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* const snap = new Snap(lenis, {
|
|
147
|
-
* type: 'mandatory', // 'mandatory', 'proximity'
|
|
148
|
-
* lerp: 0.1,
|
|
149
|
-
* duration: 1,
|
|
150
|
-
* easing: (t) => t,
|
|
151
|
-
* onSnapStart: (snap) => {
|
|
152
|
-
* console.log('onSnapStart', snap)
|
|
153
|
-
* },
|
|
154
|
-
* onSnapComplete: (snap) => {
|
|
155
|
-
* console.log('onSnapComplete', snap)
|
|
156
|
-
* },
|
|
157
|
-
* })
|
|
158
|
-
*
|
|
159
|
-
* snap.add(500) // snap at 500px
|
|
160
|
-
*
|
|
161
|
-
* const removeSnap = snap.add(500)
|
|
162
|
-
*
|
|
163
|
-
* if (someCondition) {
|
|
164
|
-
* removeSnap()
|
|
165
|
-
* }
|
|
166
|
-
*/
|
|
167
|
-
class Snap {
|
|
168
|
-
constructor(lenis, { type = 'mandatory', lerp, easing, duration, velocityThreshold = 1, debounce: debounceDelay = 0, onSnapStart, onSnapComplete, } = {}) {
|
|
169
|
-
this.lenis = lenis;
|
|
170
|
-
this.elements = new Map();
|
|
171
|
-
this.snaps = new Map();
|
|
172
|
-
this.viewport = {
|
|
173
|
-
width: window.innerWidth,
|
|
174
|
-
height: window.innerHeight,
|
|
175
|
-
};
|
|
176
|
-
this.isStopped = false;
|
|
177
|
-
this.onWindowResize = () => {
|
|
178
|
-
this.viewport.width = window.innerWidth;
|
|
179
|
-
this.viewport.height = window.innerHeight;
|
|
180
|
-
};
|
|
181
|
-
this.onScroll = ({
|
|
182
|
-
// scroll,
|
|
183
|
-
// limit,
|
|
184
|
-
lastVelocity, velocity,
|
|
185
|
-
// isScrolling,
|
|
186
|
-
userData, }) => {
|
|
187
|
-
if (this.isStopped)
|
|
188
|
-
return;
|
|
189
|
-
// return
|
|
190
|
-
const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity);
|
|
191
|
-
const isTurningBack = Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0;
|
|
192
|
-
if (Math.abs(velocity) < this.options.velocityThreshold &&
|
|
193
|
-
// !isTouching &&
|
|
194
|
-
isDecelerating &&
|
|
195
|
-
!isTurningBack &&
|
|
196
|
-
(userData === null || userData === void 0 ? void 0 : userData.initiator) !== 'snap') {
|
|
197
|
-
this.onSnapDebounced();
|
|
198
|
-
}
|
|
199
|
-
};
|
|
200
|
-
this.onSnap = () => {
|
|
201
|
-
let { scroll, isHorizontal } = this.lenis;
|
|
202
|
-
scroll = Math.ceil(this.lenis.scroll);
|
|
203
|
-
let snaps = [...this.snaps.values()];
|
|
204
|
-
this.elements.forEach(({ rect, align }) => {
|
|
205
|
-
let value;
|
|
206
|
-
align.forEach((align) => {
|
|
207
|
-
if (align === 'start') {
|
|
208
|
-
value = rect.top;
|
|
209
|
-
}
|
|
210
|
-
else if (align === 'center') {
|
|
211
|
-
value = isHorizontal
|
|
212
|
-
? rect.left + rect.width / 2 - this.viewport.width / 2
|
|
213
|
-
: rect.top + rect.height / 2 - this.viewport.height / 2;
|
|
214
|
-
}
|
|
215
|
-
else if (align === 'end') {
|
|
216
|
-
value = isHorizontal
|
|
217
|
-
? rect.left + rect.width - this.viewport.width
|
|
218
|
-
: rect.top + rect.height - this.viewport.height;
|
|
219
|
-
}
|
|
220
|
-
if (typeof value === 'number') {
|
|
221
|
-
snaps.push({ value: Math.ceil(value), userData: {} });
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value));
|
|
226
|
-
let prevSnap = snaps.findLast(({ value }) => value <= scroll);
|
|
227
|
-
if (prevSnap === undefined)
|
|
228
|
-
prevSnap = snaps[0];
|
|
229
|
-
const distanceToPrevSnap = Math.abs(scroll - prevSnap.value);
|
|
230
|
-
let nextSnap = snaps.find(({ value }) => value >= scroll);
|
|
231
|
-
if (nextSnap === undefined)
|
|
232
|
-
nextSnap = snaps[snaps.length - 1];
|
|
233
|
-
const distanceToNextSnap = Math.abs(scroll - nextSnap.value);
|
|
234
|
-
const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap;
|
|
235
|
-
const distance = Math.abs(scroll - snap.value);
|
|
236
|
-
if (this.options.type === 'mandatory' ||
|
|
237
|
-
(this.options.type === 'proximity' &&
|
|
238
|
-
distance <=
|
|
239
|
-
(isHorizontal
|
|
240
|
-
? this.lenis.dimensions.width
|
|
241
|
-
: this.lenis.dimensions.height))) {
|
|
242
|
-
// this.__isScrolling = true
|
|
243
|
-
// this.onSnapStart?.(snap)
|
|
244
|
-
// console.log('scroll to')
|
|
245
|
-
this.lenis.scrollTo(snap.value, {
|
|
246
|
-
lerp: this.options.lerp,
|
|
247
|
-
easing: this.options.easing,
|
|
248
|
-
duration: this.options.duration,
|
|
249
|
-
userData: { initiator: 'snap' },
|
|
250
|
-
onStart: () => {
|
|
251
|
-
var _a, _b;
|
|
252
|
-
(_b = (_a = this.options).onSnapStart) === null || _b === void 0 ? void 0 : _b.call(_a, snap);
|
|
253
|
-
},
|
|
254
|
-
onComplete: () => {
|
|
255
|
-
var _a, _b;
|
|
256
|
-
(_b = (_a = this.options).onSnapComplete) === null || _b === void 0 ? void 0 : _b.call(_a, snap);
|
|
257
|
-
},
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
// console.timeEnd('scroll')
|
|
261
|
-
};
|
|
262
|
-
this.options = {
|
|
263
|
-
type,
|
|
264
|
-
lerp,
|
|
265
|
-
easing,
|
|
266
|
-
duration,
|
|
267
|
-
velocityThreshold,
|
|
268
|
-
debounce: debounceDelay,
|
|
269
|
-
onSnapStart,
|
|
270
|
-
onSnapComplete,
|
|
271
|
-
};
|
|
272
|
-
this.onWindowResize();
|
|
273
|
-
window.addEventListener('resize', this.onWindowResize, false);
|
|
274
|
-
this.onSnapDebounced = debounce(this.onSnap, this.options.debounce);
|
|
275
|
-
this.lenis.on('scroll', this.onScroll);
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Destroy the snap instance
|
|
279
|
-
*/
|
|
280
|
-
destroy() {
|
|
281
|
-
this.lenis.off('scroll', this.onScroll);
|
|
282
|
-
window.removeEventListener('resize', this.onWindowResize, false);
|
|
283
|
-
this.elements.forEach((element) => element.destroy());
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Start the snap after it has been stopped
|
|
287
|
-
*/
|
|
288
|
-
start() {
|
|
289
|
-
this.isStopped = false;
|
|
290
|
-
}
|
|
291
|
-
/**
|
|
292
|
-
* Stop the snap
|
|
293
|
-
*/
|
|
294
|
-
stop() {
|
|
295
|
-
this.isStopped = true;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Add a snap to the snap instance
|
|
299
|
-
*
|
|
300
|
-
* @param value The value to snap to
|
|
301
|
-
* @param userData User data that will be forwarded through the snap event
|
|
302
|
-
* @returns Unsubscribe function
|
|
303
|
-
*/
|
|
304
|
-
add(value, userData = {}) {
|
|
305
|
-
const id = uid();
|
|
306
|
-
this.snaps.set(id, { value, userData });
|
|
307
|
-
return () => this.remove(id);
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* Remove a snap from the snap instance
|
|
311
|
-
*
|
|
312
|
-
* @param id The snap id of the snap to remove
|
|
313
|
-
*/
|
|
314
|
-
remove(id) {
|
|
315
|
-
this.snaps.delete(id);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Add an element to the snap instance
|
|
319
|
-
*
|
|
320
|
-
* @param element The element to add
|
|
321
|
-
* @param options The options for the element
|
|
322
|
-
* @returns Unsubscribe function
|
|
323
|
-
*/
|
|
324
|
-
addElement(element, options = {}) {
|
|
325
|
-
const id = uid();
|
|
326
|
-
this.elements.set(id, new SnapElement(element, options));
|
|
327
|
-
return () => this.removeElement(id);
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* Remove an element from the snap instance
|
|
331
|
-
*
|
|
332
|
-
* @param id The snap id of the snap element to remove
|
|
333
|
-
*/
|
|
334
|
-
removeElement(id) {
|
|
335
|
-
this.elements.delete(id);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
return Snap;
|
|
340
|
-
|
|
341
|
-
}));
|
|
342
|
-
//# sourceMappingURL=lenis-snap.js.map
|
package/dist/lenis-snap.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lenis-snap.js","sources":["../../src/debounce.ts","../../src/element.ts","../../src/uid.ts","../../src/index.ts"],"sourcesContent":["export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(() => {\r\n timer = undefined\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","function removeParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport type SnapElementOptions = {\r\n align?: string[]\r\n ignoreSticky?: boolean\r\n ignoreTransform?: boolean\r\n}\r\n\r\ntype Rect = {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n x: number\r\n y: number\r\n bottom: number\r\n right: number\r\n element: HTMLElement\r\n}\r\n\r\nexport class SnapElement {\r\n element: HTMLElement\r\n options: SnapElementOptions\r\n align: string[]\r\n // @ts-ignore\r\n rect: Rect = {}\r\n wrapperResizeObserver: ResizeObserver\r\n resizeObserver: ResizeObserver\r\n\r\n constructor(\r\n element: HTMLElement,\r\n {\r\n align = ['start'],\r\n ignoreSticky = true,\r\n ignoreTransform = false,\r\n }: SnapElementOptions = {}\r\n ) {\r\n this.element = element\r\n\r\n this.options = { align, ignoreSticky, ignoreTransform }\r\n\r\n // this.ignoreSticky = ignoreSticky\r\n // this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n // TODO: assing rect immediately\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n this.onWrapperResize()\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n this.setRect({\r\n width: this.element.offsetWidth,\r\n height: this.element.offsetHeight,\r\n })\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({\r\n top,\r\n left,\r\n width,\r\n height,\r\n element,\r\n }: {\r\n top?: number\r\n left?: number\r\n width?: number\r\n height?: number\r\n element?: HTMLElement\r\n } = {}) {\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.options.ignoreSticky) removeParentSticky(this.element)\r\n if (this.options.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.options.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]: ResizeObserverEntry[]) => {\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","let index = 0\r\n\r\nexport type UID = number\r\n\r\nexport function uid(): UID {\r\n return index++\r\n}\r\n","import Lenis, { type UserData } from 'lenis'\r\nimport { debounce } from './debounce'\r\nimport { SnapElement, SnapElementOptions } from './element'\r\nimport type { SnapItem, SnapOptions } from './types'\r\nimport { UID, uid } from './uid'\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// - arrow, spacebar\r\n\r\n// Types\r\nexport * from './types'\r\n\r\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\r\n\r\n/**\r\n * Snap class to handle the snap functionality\r\n *\r\n * @example\r\n * const snap = new Snap(lenis, {\r\n * type: 'mandatory', // 'mandatory', 'proximity'\r\n * lerp: 0.1,\r\n * duration: 1,\r\n * easing: (t) => t,\r\n * onSnapStart: (snap) => {\r\n * console.log('onSnapStart', snap)\r\n * },\r\n * onSnapComplete: (snap) => {\r\n * console.log('onSnapComplete', snap)\r\n * },\r\n * })\r\n *\r\n * snap.add(500) // snap at 500px\r\n *\r\n * const removeSnap = snap.add(500)\r\n *\r\n * if (someCondition) {\r\n * removeSnap()\r\n * }\r\n */\r\nexport default class Snap {\r\n options: RequiredPick<SnapOptions, 'type' | 'velocityThreshold' | 'debounce'>\r\n elements = new Map<UID, SnapElement>()\r\n snaps = new Map<UID, SnapItem>()\r\n viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n isStopped = false\r\n onSnapDebounced: () => void\r\n\r\n constructor(\r\n private lenis: Lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n debounce: debounceDelay = 0,\r\n onSnapStart,\r\n onSnapComplete,\r\n }: SnapOptions = {}\r\n ) {\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n debounce: debounceDelay,\r\n onSnapStart,\r\n onSnapComplete,\r\n }\r\n\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n\r\n this.onSnapDebounced = debounce(this.onSnap, this.options.debounce)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n /**\r\n * Destroy the snap instance\r\n */\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n this.elements.forEach((element) => element.destroy())\r\n }\r\n\r\n /**\r\n * Start the snap after it has been stopped\r\n */\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n /**\r\n * Stop the snap\r\n */\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n /**\r\n * Add a snap to the snap instance\r\n *\r\n * @param value The value to snap to\r\n * @param userData User data that will be forwarded through the snap event\r\n * @returns Unsubscribe function\r\n */\r\n add(value: number, userData: UserData = {}) {\r\n const id = uid()\r\n\r\n this.snaps.set(id, { value, userData })\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n /**\r\n * Remove a snap from the snap instance\r\n *\r\n * @param id The snap id of the snap to remove\r\n */\r\n remove(id: UID) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n /**\r\n * Add an element to the snap instance\r\n *\r\n * @param element The element to add\r\n * @param options The options for the element\r\n * @returns Unsubscribe function\r\n */\r\n addElement(element: HTMLElement, options = {} as SnapElementOptions) {\r\n const id = uid()\r\n\r\n this.elements.set(id, new SnapElement(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n /**\r\n * Remove an element from the snap instance\r\n *\r\n * @param id The snap id of the snap element to remove\r\n */\r\n removeElement(id: UID) {\r\n this.elements.delete(id)\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n private onScroll = ({\r\n // scroll,\r\n // limit,\r\n lastVelocity,\r\n velocity,\r\n // isScrolling,\r\n userData,\r\n }: // isHorizontal,\r\n Lenis) => {\r\n if (this.isStopped) return\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 if (\r\n Math.abs(velocity) < this.options.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n this.onSnapDebounced()\r\n }\r\n }\r\n\r\n private onSnap = () => {\r\n let { scroll, isHorizontal } = this.lenis\r\n scroll = Math.ceil(this.lenis.scroll)\r\n\r\n let snaps = [...this.snaps.values()] as SnapItem[]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let value: number | undefined\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n value = rect.top\r\n } else if (align === 'center') {\r\n value = isHorizontal\r\n ? rect.left + rect.width / 2 - this.viewport.width / 2\r\n : rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n value = isHorizontal\r\n ? rect.left + rect.width - this.viewport.width\r\n : rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (typeof value === 'number') {\r\n snaps.push({ value: Math.ceil(value), userData: {} })\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\r\n\r\n let prevSnap = snaps.findLast(({ value }) => value <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap.value)\r\n\r\n let nextSnap = snaps.find(({ value }) => value >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap.value)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap.value)\r\n\r\n if (\r\n this.options.type === 'mandatory' ||\r\n (this.options.type === 'proximity' &&\r\n distance <=\r\n (isHorizontal\r\n ? this.lenis.dimensions.width\r\n : this.lenis.dimensions.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.value, {\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.options.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.options.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/dist/lenis-snap.min.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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){var e;"true"===(null===(e=null==t?void 0:t.dataset)||void 0===e?void 0:e.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 SnapElement{constructor(t,{align:e=["start"],ignoreSticky:i=!0,ignoreTransform:s=!1}={}){this.rect={},this.onWrapperResize=()=>{let t,e;if(this.options.ignoreSticky&&removeParentSticky(this.element),this.options.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.options.ignoreSticky&&addParentSticky(this.element),this.setRect({top:t,left:e})},this.onResize=([t])=>{const e=t.borderBoxSize[0].inlineSize,i=t.borderBoxSize[0].blockSize;this.setRect({width:e,height:i})},this.element=t,this.options={align:e,ignoreSticky:i,ignoreTransform:s},this.align=[e].flat(),this.wrapperResizeObserver=new ResizeObserver(this.onWrapperResize),this.wrapperResizeObserver.observe(document.body),this.onWrapperResize(),this.resizeObserver=new ResizeObserver(this.onResize),this.resizeObserver.observe(this.element),this.setRect({width:this.element.offsetWidth,height:this.element.offsetHeight})}destroy(){this.wrapperResizeObserver.disconnect(),this.resizeObserver.disconnect()}setRect({top:t,left:e,width:i,height:s,element:o}={}){t=null!=t?t:this.rect.top,e=null!=e?e:this.rect.left,i=null!=i?i:this.rect.width,s=null!=s?s:this.rect.height,o=null!=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)}}let t=0;function uid(){return t++}return class Snap{constructor(t,{type:e="mandatory",lerp:i,easing:s,duration:o,velocityThreshold:n=1,debounce:r=0,onSnapStart:h,onSnapComplete:l}={}){this.lenis=t,this.elements=new Map,this.snaps=new Map,this.viewport={width:window.innerWidth,height:window.innerHeight},this.isStopped=!1,this.onWindowResize=()=>{this.viewport.width=window.innerWidth,this.viewport.height=window.innerHeight},this.onScroll=({lastVelocity:t,velocity:e,userData:i})=>{if(this.isStopped)return;const s=Math.abs(t)>Math.abs(e),o=Math.sign(t)!==Math.sign(e)&&0!==e;Math.abs(e)<this.options.velocityThreshold&&s&&!o&&"snap"!==(null==i?void 0:i.initiator)&&this.onSnapDebounced()},this.onSnap=()=>{let{scroll:t,isHorizontal:e}=this.lenis;t=Math.ceil(this.lenis.scroll);let i=[...this.snaps.values()];this.elements.forEach((({rect:t,align:s})=>{let o;s.forEach((s=>{"start"===s?o=t.top:"center"===s?o=e?t.left+t.width/2-this.viewport.width/2:t.top+t.height/2-this.viewport.height/2:"end"===s&&(o=e?t.left+t.width-this.viewport.width:t.top+t.height-this.viewport.height),"number"==typeof o&&i.push({value:Math.ceil(o),userData:{}})}))})),i=i.sort(((t,e)=>Math.abs(t.value)-Math.abs(e.value)));let s=i.findLast((({value:e})=>e<=t));void 0===s&&(s=i[0]);const o=Math.abs(t-s.value);let n=i.find((({value:e})=>e>=t));void 0===n&&(n=i[i.length-1]);const r=o<Math.abs(t-n.value)?s:n,h=Math.abs(t-r.value);("mandatory"===this.options.type||"proximity"===this.options.type&&h<=(e?this.lenis.dimensions.width:this.lenis.dimensions.height))&&this.lenis.scrollTo(r.value,{lerp:this.options.lerp,easing:this.options.easing,duration:this.options.duration,userData:{initiator:"snap"},onStart:()=>{var t,e;null===(e=(t=this.options).onSnapStart)||void 0===e||e.call(t,r)},onComplete:()=>{var t,e;null===(e=(t=this.options).onSnapComplete)||void 0===e||e.call(t,r)}})},this.options={type:e,lerp:i,easing:s,duration:o,velocityThreshold:n,debounce:r,onSnapStart:h,onSnapComplete:l},this.onWindowResize(),window.addEventListener("resize",this.onWindowResize,!1),this.onSnapDebounced=function debounce(t,e){let i;return function(...s){let o=this;clearTimeout(i),i=setTimeout((()=>{i=void 0,t.apply(o,s)}),e)}}(this.onSnap,this.options.debounce),this.lenis.on("scroll",this.onScroll)}destroy(){this.lenis.off("scroll",this.onScroll),window.removeEventListener("resize",this.onWindowResize,!1),this.elements.forEach((t=>t.destroy()))}start(){this.isStopped=!1}stop(){this.isStopped=!0}add(t,e={}){const i=uid();return this.snaps.set(i,{value:t,userData:e}),()=>this.remove(i)}remove(t){this.snaps.delete(t)}addElement(t,e={}){const i=uid();return this.elements.set(i,new SnapElement(t,e)),()=>this.removeElement(i)}removeElement(t){this.elements.delete(t)}}}));
|
|
2
|
-
//# sourceMappingURL=lenis-snap.min.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lenis-snap.min.js","sources":["../../src/element.ts","../../src/uid.ts","../../src/index.ts","../../src/debounce.ts"],"sourcesContent":["function removeParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport type SnapElementOptions = {\r\n align?: string[]\r\n ignoreSticky?: boolean\r\n ignoreTransform?: boolean\r\n}\r\n\r\ntype Rect = {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n x: number\r\n y: number\r\n bottom: number\r\n right: number\r\n element: HTMLElement\r\n}\r\n\r\nexport class SnapElement {\r\n element: HTMLElement\r\n options: SnapElementOptions\r\n align: string[]\r\n // @ts-ignore\r\n rect: Rect = {}\r\n wrapperResizeObserver: ResizeObserver\r\n resizeObserver: ResizeObserver\r\n\r\n constructor(\r\n element: HTMLElement,\r\n {\r\n align = ['start'],\r\n ignoreSticky = true,\r\n ignoreTransform = false,\r\n }: SnapElementOptions = {}\r\n ) {\r\n this.element = element\r\n\r\n this.options = { align, ignoreSticky, ignoreTransform }\r\n\r\n // this.ignoreSticky = ignoreSticky\r\n // this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n // TODO: assing rect immediately\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n this.onWrapperResize()\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n this.setRect({\r\n width: this.element.offsetWidth,\r\n height: this.element.offsetHeight,\r\n })\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({\r\n top,\r\n left,\r\n width,\r\n height,\r\n element,\r\n }: {\r\n top?: number\r\n left?: number\r\n width?: number\r\n height?: number\r\n element?: HTMLElement\r\n } = {}) {\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.options.ignoreSticky) removeParentSticky(this.element)\r\n if (this.options.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.options.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]: ResizeObserverEntry[]) => {\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","let index = 0\r\n\r\nexport type UID = number\r\n\r\nexport function uid(): UID {\r\n return index++\r\n}\r\n","import Lenis, { type UserData } from 'lenis'\r\nimport { debounce } from './debounce'\r\nimport { SnapElement, SnapElementOptions } from './element'\r\nimport type { SnapItem, SnapOptions } from './types'\r\nimport { UID, uid } from './uid'\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// - arrow, spacebar\r\n\r\n// Types\r\nexport * from './types'\r\n\r\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\r\n\r\n/**\r\n * Snap class to handle the snap functionality\r\n *\r\n * @example\r\n * const snap = new Snap(lenis, {\r\n * type: 'mandatory', // 'mandatory', 'proximity'\r\n * lerp: 0.1,\r\n * duration: 1,\r\n * easing: (t) => t,\r\n * onSnapStart: (snap) => {\r\n * console.log('onSnapStart', snap)\r\n * },\r\n * onSnapComplete: (snap) => {\r\n * console.log('onSnapComplete', snap)\r\n * },\r\n * })\r\n *\r\n * snap.add(500) // snap at 500px\r\n *\r\n * const removeSnap = snap.add(500)\r\n *\r\n * if (someCondition) {\r\n * removeSnap()\r\n * }\r\n */\r\nexport default class Snap {\r\n options: RequiredPick<SnapOptions, 'type' | 'velocityThreshold' | 'debounce'>\r\n elements = new Map<UID, SnapElement>()\r\n snaps = new Map<UID, SnapItem>()\r\n viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n isStopped = false\r\n onSnapDebounced: () => void\r\n\r\n constructor(\r\n private lenis: Lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n debounce: debounceDelay = 0,\r\n onSnapStart,\r\n onSnapComplete,\r\n }: SnapOptions = {}\r\n ) {\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n debounce: debounceDelay,\r\n onSnapStart,\r\n onSnapComplete,\r\n }\r\n\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n\r\n this.onSnapDebounced = debounce(this.onSnap, this.options.debounce)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n /**\r\n * Destroy the snap instance\r\n */\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n this.elements.forEach((element) => element.destroy())\r\n }\r\n\r\n /**\r\n * Start the snap after it has been stopped\r\n */\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n /**\r\n * Stop the snap\r\n */\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n /**\r\n * Add a snap to the snap instance\r\n *\r\n * @param value The value to snap to\r\n * @param userData User data that will be forwarded through the snap event\r\n * @returns Unsubscribe function\r\n */\r\n add(value: number, userData: UserData = {}) {\r\n const id = uid()\r\n\r\n this.snaps.set(id, { value, userData })\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n /**\r\n * Remove a snap from the snap instance\r\n *\r\n * @param id The snap id of the snap to remove\r\n */\r\n remove(id: UID) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n /**\r\n * Add an element to the snap instance\r\n *\r\n * @param element The element to add\r\n * @param options The options for the element\r\n * @returns Unsubscribe function\r\n */\r\n addElement(element: HTMLElement, options = {} as SnapElementOptions) {\r\n const id = uid()\r\n\r\n this.elements.set(id, new SnapElement(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n /**\r\n * Remove an element from the snap instance\r\n *\r\n * @param id The snap id of the snap element to remove\r\n */\r\n removeElement(id: UID) {\r\n this.elements.delete(id)\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n private onScroll = ({\r\n // scroll,\r\n // limit,\r\n lastVelocity,\r\n velocity,\r\n // isScrolling,\r\n userData,\r\n }: // isHorizontal,\r\n Lenis) => {\r\n if (this.isStopped) return\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 if (\r\n Math.abs(velocity) < this.options.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n this.onSnapDebounced()\r\n }\r\n }\r\n\r\n private onSnap = () => {\r\n let { scroll, isHorizontal } = this.lenis\r\n scroll = Math.ceil(this.lenis.scroll)\r\n\r\n let snaps = [...this.snaps.values()] as SnapItem[]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let value: number | undefined\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n value = rect.top\r\n } else if (align === 'center') {\r\n value = isHorizontal\r\n ? rect.left + rect.width / 2 - this.viewport.width / 2\r\n : rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n value = isHorizontal\r\n ? rect.left + rect.width - this.viewport.width\r\n : rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (typeof value === 'number') {\r\n snaps.push({ value: Math.ceil(value), userData: {} })\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\r\n\r\n let prevSnap = snaps.findLast(({ value }) => value <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap.value)\r\n\r\n let nextSnap = snaps.find(({ value }) => value >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap.value)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap.value)\r\n\r\n if (\r\n this.options.type === 'mandatory' ||\r\n (this.options.type === 'proximity' &&\r\n distance <=\r\n (isHorizontal\r\n ? this.lenis.dimensions.width\r\n : this.lenis.dimensions.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.value, {\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.options.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.options.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n}\r\n","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(() => {\r\n timer = undefined\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n"],"names":["removeParentSticky","element","getComputedStyle","position","style","setProperty","dataset","sticky","offsetParent","addParentSticky","_a","removeProperty","offsetTop","accumulator","top","offsetLeft","left","scrollTop","window","scrollY","scrollLeft","scrollX","SnapElement","constructor","align","ignoreSticky","ignoreTransform","this","rect","onWrapperResize","options","getBoundingClientRect","setRect","onResize","entry","width","borderBoxSize","inlineSize","height","blockSize","flat","wrapperResizeObserver","ResizeObserver","observe","document","body","resizeObserver","offsetWidth","offsetHeight","destroy","disconnect","y","x","bottom","right","index","uid","Snap","lenis","type","lerp","easing","duration","velocityThreshold","debounce","debounceDelay","onSnapStart","onSnapComplete","elements","Map","snaps","viewport","innerWidth","innerHeight","isStopped","onWindowResize","onScroll","lastVelocity","velocity","userData","isDecelerating","Math","abs","isTurningBack","sign","initiator","onSnapDebounced","onSnap","scroll","isHorizontal","ceil","values","forEach","value","push","sort","a","b","prevSnap","findLast","undefined","distanceToPrevSnap","nextSnap","find","length","snap","distance","dimensions","scrollTo","onStart","_b","call","onComplete","addEventListener","callback","delay","timer","args","context","clearTimeout","setTimeout","apply","on","off","removeEventListener","start","stop","add","id","set","remove","delete","addElement","removeElement"],"mappings":"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"}
|
package/dist/lenis-snap.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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){var e;"true"===(null===(e=null==t?void 0:t.dataset)||void 0===e?void 0:e.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 SnapElement{constructor(t,{align:e=["start"],ignoreSticky:i=!0,ignoreTransform:s=!1}={}){this.rect={},this.onWrapperResize=()=>{let t,e;if(this.options.ignoreSticky&&removeParentSticky(this.element),this.options.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.options.ignoreSticky&&addParentSticky(this.element),this.setRect({top:t,left:e})},this.onResize=([t])=>{const e=t.borderBoxSize[0].inlineSize,i=t.borderBoxSize[0].blockSize;this.setRect({width:e,height:i})},this.element=t,this.options={align:e,ignoreSticky:i,ignoreTransform:s},this.align=[e].flat(),this.wrapperResizeObserver=new ResizeObserver(this.onWrapperResize),this.wrapperResizeObserver.observe(document.body),this.onWrapperResize(),this.resizeObserver=new ResizeObserver(this.onResize),this.resizeObserver.observe(this.element),this.setRect({width:this.element.offsetWidth,height:this.element.offsetHeight})}destroy(){this.wrapperResizeObserver.disconnect(),this.resizeObserver.disconnect()}setRect({top:t,left:e,width:i,height:s,element:o}={}){t=null!=t?t:this.rect.top,e=null!=e?e:this.rect.left,i=null!=i?i:this.rect.width,s=null!=s?s:this.rect.height,o=null!=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)}}let t=0;function uid(){return t++}class Snap{constructor(t,{type:e="mandatory",lerp:i,easing:s,duration:o,velocityThreshold:n=1,debounce:r=0,onSnapStart:h,onSnapComplete:l}={}){this.lenis=t,this.elements=new Map,this.snaps=new Map,this.viewport={width:window.innerWidth,height:window.innerHeight},this.isStopped=!1,this.onWindowResize=()=>{this.viewport.width=window.innerWidth,this.viewport.height=window.innerHeight},this.onScroll=({lastVelocity:t,velocity:e,userData:i})=>{if(this.isStopped)return;const s=Math.abs(t)>Math.abs(e),o=Math.sign(t)!==Math.sign(e)&&0!==e;Math.abs(e)<this.options.velocityThreshold&&s&&!o&&"snap"!==(null==i?void 0:i.initiator)&&this.onSnapDebounced()},this.onSnap=()=>{let{scroll:t,isHorizontal:e}=this.lenis;t=Math.ceil(this.lenis.scroll);let i=[...this.snaps.values()];this.elements.forEach((({rect:t,align:s})=>{let o;s.forEach((s=>{"start"===s?o=t.top:"center"===s?o=e?t.left+t.width/2-this.viewport.width/2:t.top+t.height/2-this.viewport.height/2:"end"===s&&(o=e?t.left+t.width-this.viewport.width:t.top+t.height-this.viewport.height),"number"==typeof o&&i.push({value:Math.ceil(o),userData:{}})}))})),i=i.sort(((t,e)=>Math.abs(t.value)-Math.abs(e.value)));let s=i.findLast((({value:e})=>e<=t));void 0===s&&(s=i[0]);const o=Math.abs(t-s.value);let n=i.find((({value:e})=>e>=t));void 0===n&&(n=i[i.length-1]);const r=o<Math.abs(t-n.value)?s:n,h=Math.abs(t-r.value);("mandatory"===this.options.type||"proximity"===this.options.type&&h<=(e?this.lenis.dimensions.width:this.lenis.dimensions.height))&&this.lenis.scrollTo(r.value,{lerp:this.options.lerp,easing:this.options.easing,duration:this.options.duration,userData:{initiator:"snap"},onStart:()=>{var t,e;null===(e=(t=this.options).onSnapStart)||void 0===e||e.call(t,r)},onComplete:()=>{var t,e;null===(e=(t=this.options).onSnapComplete)||void 0===e||e.call(t,r)}})},this.options={type:e,lerp:i,easing:s,duration:o,velocityThreshold:n,debounce:r,onSnapStart:h,onSnapComplete:l},this.onWindowResize(),window.addEventListener("resize",this.onWindowResize,!1),this.onSnapDebounced=function debounce(t,e){let i;return function(...s){let o=this;clearTimeout(i),i=setTimeout((()=>{i=void 0,t.apply(o,s)}),e)}}(this.onSnap,this.options.debounce),this.lenis.on("scroll",this.onScroll)}destroy(){this.lenis.off("scroll",this.onScroll),window.removeEventListener("resize",this.onWindowResize,!1),this.elements.forEach((t=>t.destroy()))}start(){this.isStopped=!1}stop(){this.isStopped=!0}add(t,e={}){const i=uid();return this.snaps.set(i,{value:t,userData:e}),()=>this.remove(i)}remove(t){this.snaps.delete(t)}addElement(t,e={}){const i=uid();return this.elements.set(i,new SnapElement(t,e)),()=>this.removeElement(i)}removeElement(t){this.elements.delete(t)}}export{Snap as default};
|
|
2
|
-
//# sourceMappingURL=lenis-snap.mjs.map
|
package/dist/lenis-snap.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lenis-snap.mjs","sources":["../../src/element.ts","../../src/uid.ts","../../src/index.ts","../../src/debounce.ts"],"sourcesContent":["function removeParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element: HTMLElement) {\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 as HTMLElement)\r\n }\r\n}\r\n\r\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport type SnapElementOptions = {\r\n align?: string[]\r\n ignoreSticky?: boolean\r\n ignoreTransform?: boolean\r\n}\r\n\r\ntype Rect = {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n x: number\r\n y: number\r\n bottom: number\r\n right: number\r\n element: HTMLElement\r\n}\r\n\r\nexport class SnapElement {\r\n element: HTMLElement\r\n options: SnapElementOptions\r\n align: string[]\r\n // @ts-ignore\r\n rect: Rect = {}\r\n wrapperResizeObserver: ResizeObserver\r\n resizeObserver: ResizeObserver\r\n\r\n constructor(\r\n element: HTMLElement,\r\n {\r\n align = ['start'],\r\n ignoreSticky = true,\r\n ignoreTransform = false,\r\n }: SnapElementOptions = {}\r\n ) {\r\n this.element = element\r\n\r\n this.options = { align, ignoreSticky, ignoreTransform }\r\n\r\n // this.ignoreSticky = ignoreSticky\r\n // this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n // TODO: assing rect immediately\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n this.onWrapperResize()\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n this.setRect({\r\n width: this.element.offsetWidth,\r\n height: this.element.offsetHeight,\r\n })\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({\r\n top,\r\n left,\r\n width,\r\n height,\r\n element,\r\n }: {\r\n top?: number\r\n left?: number\r\n width?: number\r\n height?: number\r\n element?: HTMLElement\r\n } = {}) {\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.options.ignoreSticky) removeParentSticky(this.element)\r\n if (this.options.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.options.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]: ResizeObserverEntry[]) => {\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","let index = 0\r\n\r\nexport type UID = number\r\n\r\nexport function uid(): UID {\r\n return index++\r\n}\r\n","import Lenis, { type UserData } from 'lenis'\r\nimport { debounce } from './debounce'\r\nimport { SnapElement, SnapElementOptions } from './element'\r\nimport type { SnapItem, SnapOptions } from './types'\r\nimport { UID, uid } from './uid'\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// - arrow, spacebar\r\n\r\n// Types\r\nexport * from './types'\r\n\r\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\r\n\r\n/**\r\n * Snap class to handle the snap functionality\r\n *\r\n * @example\r\n * const snap = new Snap(lenis, {\r\n * type: 'mandatory', // 'mandatory', 'proximity'\r\n * lerp: 0.1,\r\n * duration: 1,\r\n * easing: (t) => t,\r\n * onSnapStart: (snap) => {\r\n * console.log('onSnapStart', snap)\r\n * },\r\n * onSnapComplete: (snap) => {\r\n * console.log('onSnapComplete', snap)\r\n * },\r\n * })\r\n *\r\n * snap.add(500) // snap at 500px\r\n *\r\n * const removeSnap = snap.add(500)\r\n *\r\n * if (someCondition) {\r\n * removeSnap()\r\n * }\r\n */\r\nexport default class Snap {\r\n options: RequiredPick<SnapOptions, 'type' | 'velocityThreshold' | 'debounce'>\r\n elements = new Map<UID, SnapElement>()\r\n snaps = new Map<UID, SnapItem>()\r\n viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n isStopped = false\r\n onSnapDebounced: () => void\r\n\r\n constructor(\r\n private lenis: Lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold = 1,\r\n debounce: debounceDelay = 0,\r\n onSnapStart,\r\n onSnapComplete,\r\n }: SnapOptions = {}\r\n ) {\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n velocityThreshold,\r\n debounce: debounceDelay,\r\n onSnapStart,\r\n onSnapComplete,\r\n }\r\n\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n\r\n this.onSnapDebounced = debounce(this.onSnap, this.options.debounce)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n /**\r\n * Destroy the snap instance\r\n */\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n this.elements.forEach((element) => element.destroy())\r\n }\r\n\r\n /**\r\n * Start the snap after it has been stopped\r\n */\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n /**\r\n * Stop the snap\r\n */\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n /**\r\n * Add a snap to the snap instance\r\n *\r\n * @param value The value to snap to\r\n * @param userData User data that will be forwarded through the snap event\r\n * @returns Unsubscribe function\r\n */\r\n add(value: number, userData: UserData = {}) {\r\n const id = uid()\r\n\r\n this.snaps.set(id, { value, userData })\r\n\r\n return () => this.remove(id)\r\n }\r\n\r\n /**\r\n * Remove a snap from the snap instance\r\n *\r\n * @param id The snap id of the snap to remove\r\n */\r\n remove(id: UID) {\r\n this.snaps.delete(id)\r\n }\r\n\r\n /**\r\n * Add an element to the snap instance\r\n *\r\n * @param element The element to add\r\n * @param options The options for the element\r\n * @returns Unsubscribe function\r\n */\r\n addElement(element: HTMLElement, options = {} as SnapElementOptions) {\r\n const id = uid()\r\n\r\n this.elements.set(id, new SnapElement(element, options))\r\n\r\n return () => this.removeElement(id)\r\n }\r\n\r\n /**\r\n * Remove an element from the snap instance\r\n *\r\n * @param id The snap id of the snap element to remove\r\n */\r\n removeElement(id: UID) {\r\n this.elements.delete(id)\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n private onScroll = ({\r\n // scroll,\r\n // limit,\r\n lastVelocity,\r\n velocity,\r\n // isScrolling,\r\n userData,\r\n }: // isHorizontal,\r\n Lenis) => {\r\n if (this.isStopped) return\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 if (\r\n Math.abs(velocity) < this.options.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n this.onSnapDebounced()\r\n }\r\n }\r\n\r\n private onSnap = () => {\r\n let { scroll, isHorizontal } = this.lenis\r\n scroll = Math.ceil(this.lenis.scroll)\r\n\r\n let snaps = [...this.snaps.values()] as SnapItem[]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let value: number | undefined\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n value = rect.top\r\n } else if (align === 'center') {\r\n value = isHorizontal\r\n ? rect.left + rect.width / 2 - this.viewport.width / 2\r\n : rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n value = isHorizontal\r\n ? rect.left + rect.width - this.viewport.width\r\n : rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (typeof value === 'number') {\r\n snaps.push({ value: Math.ceil(value), userData: {} })\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\r\n\r\n let prevSnap = snaps.findLast(({ value }) => value <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap.value)\r\n\r\n let nextSnap = snaps.find(({ value }) => value >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap.value)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap.value)\r\n\r\n if (\r\n this.options.type === 'mandatory' ||\r\n (this.options.type === 'proximity' &&\r\n distance <=\r\n (isHorizontal\r\n ? this.lenis.dimensions.width\r\n : this.lenis.dimensions.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.value, {\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.options.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.options.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n}\r\n","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(() => {\r\n timer = undefined\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n"],"names":["removeParentSticky","element","getComputedStyle","position","style","setProperty","dataset","sticky","offsetParent","addParentSticky","_a","removeProperty","offsetTop","accumulator","top","offsetLeft","left","scrollTop","window","scrollY","scrollLeft","scrollX","SnapElement","constructor","align","ignoreSticky","ignoreTransform","this","rect","onWrapperResize","options","getBoundingClientRect","setRect","onResize","entry","width","borderBoxSize","inlineSize","height","blockSize","flat","wrapperResizeObserver","ResizeObserver","observe","document","body","resizeObserver","offsetWidth","offsetHeight","destroy","disconnect","y","x","bottom","right","index","uid","Snap","lenis","type","lerp","easing","duration","velocityThreshold","debounce","debounceDelay","onSnapStart","onSnapComplete","elements","Map","snaps","viewport","innerWidth","innerHeight","isStopped","onWindowResize","onScroll","lastVelocity","velocity","userData","isDecelerating","Math","abs","isTurningBack","sign","initiator","onSnapDebounced","onSnap","scroll","isHorizontal","ceil","values","forEach","value","push","sort","a","b","prevSnap","findLast","undefined","distanceToPrevSnap","nextSnap","find","length","snap","distance","dimensions","scrollTo","onStart","_b","call","onComplete","addEventListener","callback","delay","timer","args","context","clearTimeout","setTimeout","apply","on","off","removeEventListener","start","stop","add","id","set","remove","delete","addElement","removeElement"],"mappings":"AAAA,SAASA,mBAAmBC,GAGI,WAFbC,iBAAiBD,GAASE,WAKzCF,EAAQG,MAAMC,YAAY,WAAY,UACtCJ,EAAQK,QAAQC,OAAS,QAGvBN,EAAQO,cACVR,mBAAmBC,EAAQO,aAE/B,CAEA,SAASC,gBAAgBR,SACU,UAAX,QAAlBS,EAAAT,aAAA,EAAAA,EAASK,eAAS,IAAAI,OAAA,EAAAA,EAAAH,UACpBN,EAAQG,MAAMO,eAAe,mBACtBV,EAAQK,QAAQC,QAGrBN,EAAQO,cACVC,gBAAgBR,EAAQO,aAE5B,CAEA,SAASI,UAAUX,EAAsBY,EAAc,GACrD,MAAMC,EAAMD,EAAcZ,EAAQW,UAClC,OAAIX,EAAQO,aACHI,UAAUX,EAAQO,aAA6BM,GAEjDA,CACT,CAEA,SAASC,WAAWd,EAAsBY,EAAc,GACtD,MAAMG,EAAOH,EAAcZ,EAAQc,WACnC,OAAId,EAAQO,aACHO,WAAWd,EAAQO,aAA6BQ,GAElDA,CACT,CAEA,SAASC,UAAUhB,EAAsBY,EAAc,GACrD,MAAMC,EAAMD,EAAcZ,EAAQgB,UAClC,OAAIhB,EAAQO,aACHS,UAAUhB,EAAQO,aAA6BM,GAEjDA,EAAMI,OAAOC,OACtB,CAEA,SAASC,WAAWnB,EAAsBY,EAAc,GACtD,MAAMG,EAAOH,EAAcZ,EAAQmB,WACnC,OAAInB,EAAQO,aACHY,WAAWnB,EAAQO,aAA6BQ,GAElDA,EAAOE,OAAOG,OACvB,OAoBaC,YASX,WAAAC,CACEtB,GACAuB,MACEA,EAAQ,CAAC,SAAQC,aACjBA,GAAe,EAAIC,gBACnBA,GAAkB,GACI,CAAA,GAV1BC,KAAIC,KAAS,GA8EbD,KAAeE,gBAAG,KAChB,IAAIf,EAAKE,EAGT,GADIW,KAAKG,QAAQL,cAAczB,mBAAmB2B,KAAK1B,SACnD0B,KAAKG,QAAQJ,gBACfZ,EAAMF,UAAUe,KAAK1B,SACrBe,EAAOD,WAAWY,KAAK1B,aAClB,CACL,MAAM2B,EAAOD,KAAK1B,QAAQ8B,wBAC1BjB,EAAMc,EAAKd,IAAMG,UAAUU,KAAK1B,SAChCe,EAAOY,EAAKZ,KAAOI,WAAWO,KAAK1B,QACpC,CACG0B,KAAKG,QAAQL,cAAchB,gBAAgBkB,KAAK1B,SAEpD0B,KAAKK,QAAQ,CAAElB,MAAKE,QAAO,EAG7BW,KAAAM,SAAW,EAAEC,MACX,MAAMC,EAAQD,EAAME,cAAc,GAAGC,WAC/BC,EAASJ,EAAME,cAAc,GAAGG,UAEtCZ,KAAKK,QAAQ,CAAEG,QAAOG,UAAS,EAvF/BX,KAAK1B,QAAUA,EAEf0B,KAAKG,QAAU,CAAEN,QAAOC,eAAcC,mBAKtCC,KAAKH,MAAQ,CAACA,GAAOgB,OAIrBb,KAAKc,sBAAwB,IAAIC,eAAef,KAAKE,iBACrDF,KAAKc,sBAAsBE,QAAQC,SAASC,MAC5ClB,KAAKE,kBAELF,KAAKmB,eAAiB,IAAIJ,eAAef,KAAKM,UAC9CN,KAAKmB,eAAeH,QAAQhB,KAAK1B,SACjC0B,KAAKK,QAAQ,CACXG,MAAOR,KAAK1B,QAAQ8C,YACpBT,OAAQX,KAAK1B,QAAQ+C,cAExB,CAED,OAAAC,GACEtB,KAAKc,sBAAsBS,aAC3BvB,KAAKmB,eAAeI,YACrB,CAED,OAAAlB,EAAQlB,IACNA,EAAGE,KACHA,EAAImB,MACJA,EAAKG,OACLA,EAAMrC,QACNA,GAOE,IACFa,EAAMA,QAAAA,EAAOa,KAAKC,KAAKd,IACvBE,EAAOA,QAAAA,EAAQW,KAAKC,KAAKZ,KACzBmB,EAAQA,QAAAA,EAASR,KAAKC,KAAKO,MAC3BG,EAASA,QAAAA,EAAUX,KAAKC,KAAKU,OAC7BrC,EAAUA,QAAAA,EAAW0B,KAAKC,KAAK3B,QAG7Ba,IAAQa,KAAKC,KAAKd,KAClBE,IAASW,KAAKC,KAAKZ,MACnBmB,IAAUR,KAAKC,KAAKO,OACpBG,IAAWX,KAAKC,KAAKU,QACrBrC,IAAY0B,KAAKC,KAAK3B,UAIxB0B,KAAKC,KAAKd,IAAMA,EAChBa,KAAKC,KAAKuB,EAAIrC,EACda,KAAKC,KAAKO,MAAQA,EAClBR,KAAKC,KAAKU,OAASA,EACnBX,KAAKC,KAAKZ,KAAOA,EACjBW,KAAKC,KAAKwB,EAAIpC,EACdW,KAAKC,KAAKyB,OAASvC,EAAMwB,EACzBX,KAAKC,KAAK0B,MAAQtC,EAAOmB,EAC1B,EC7JH,IAAIoB,EAAQ,WAIIC,MACd,OAAOD,GACT,CCqCc,MAAOE,KAWnB,WAAAlC,CACUmC,GACRC,KACEA,EAAO,YAAWC,KAClBA,EAAIC,OACJA,EAAMC,SACNA,EAAQC,kBACRA,EAAoB,EACpBC,SAAUC,EAAgB,EAACC,YAC3BA,EAAWC,eACXA,GACe,IAVTxC,KAAK+B,MAALA,EAVV/B,KAAAyC,SAAW,IAAIC,IACf1C,KAAA2C,MAAQ,IAAID,IACZ1C,KAAA4C,SAAW,CACTpC,MAAOjB,OAAOsD,WACdlC,OAAQpB,OAAOuD,aAEjB9C,KAAS+C,WAAG,EA0GJ/C,KAAcgD,eAAG,KACvBhD,KAAK4C,SAASpC,MAAQjB,OAAOsD,WAC7B7C,KAAK4C,SAASjC,OAASpB,OAAOuD,WAAW,EAGnC9C,KAAAiD,SAAW,EAGjBC,eACAC,WAEAC,eAGA,GAAIpD,KAAK+C,UAAW,OAGpB,MAAMM,EAAiBC,KAAKC,IAAIL,GAAgBI,KAAKC,IAAIJ,GACnDK,EACJF,KAAKG,KAAKP,KAAkBI,KAAKG,KAAKN,IAA0B,IAAbA,EAGnDG,KAAKC,IAAIJ,GAAYnD,KAAKG,QAAQiC,mBAElCiB,IACCG,GACuB,UAAxBJ,aAAA,EAAAA,EAAUM,YAEV1D,KAAK2D,iBACN,EAGK3D,KAAM4D,OAAG,KACf,IAAIC,OAAEA,EAAMC,aAAEA,GAAiB9D,KAAK+B,MACpC8B,EAASP,KAAKS,KAAK/D,KAAK+B,MAAM8B,QAE9B,IAAIlB,EAAQ,IAAI3C,KAAK2C,MAAMqB,UAE3BhE,KAAKyC,SAASwB,SAAQ,EAAGhE,OAAMJ,YAC7B,IAAIqE,EAEJrE,EAAMoE,SAASpE,IACC,UAAVA,EACFqE,EAAQjE,EAAKd,IACM,WAAVU,EACTqE,EAAQJ,EACJ7D,EAAKZ,KAAOY,EAAKO,MAAQ,EAAIR,KAAK4C,SAASpC,MAAQ,EACnDP,EAAKd,IAAMc,EAAKU,OAAS,EAAIX,KAAK4C,SAASjC,OAAS,EACrC,QAAVd,IACTqE,EAAQJ,EACJ7D,EAAKZ,KAAOY,EAAKO,MAAQR,KAAK4C,SAASpC,MACvCP,EAAKd,IAAMc,EAAKU,OAASX,KAAK4C,SAASjC,QAGxB,iBAAVuD,GACTvB,EAAMwB,KAAK,CAAED,MAAOZ,KAAKS,KAAKG,GAAQd,SAAU,CAAE,GACnD,GACD,IAGJT,EAAQA,EAAMyB,MAAK,CAACC,EAAGC,IAAMhB,KAAKC,IAAIc,EAAEH,OAASZ,KAAKC,IAAIe,EAAEJ,SAE5D,IAAIK,EAAW5B,EAAM6B,UAAS,EAAGN,WAAYA,GAASL,SACrCY,IAAbF,IAAwBA,EAAW5B,EAAM,IAC7C,MAAM+B,EAAqBpB,KAAKC,IAAIM,EAASU,EAASL,OAEtD,IAAIS,EAAWhC,EAAMiC,MAAK,EAAGV,WAAYA,GAASL,SACjCY,IAAbE,IAAwBA,EAAWhC,EAAMA,EAAMkC,OAAS,IAC5D,MAEMC,EAAOJ,EAFcpB,KAAKC,IAAIM,EAASc,EAAST,OAECK,EAAWI,EAE5DI,EAAWzB,KAAKC,IAAIM,EAASiB,EAAKZ,QAGhB,cAAtBlE,KAAKG,QAAQ6B,MACU,cAAtBhC,KAAKG,QAAQ6B,MACZ+C,IACGjB,EACG9D,KAAK+B,MAAMiD,WAAWxE,MACtBR,KAAK+B,MAAMiD,WAAWrE,UAO9BX,KAAK+B,MAAMkD,SAASH,EAAKZ,MAAO,CAC9BjC,KAAMjC,KAAKG,QAAQ8B,KACnBC,OAAQlC,KAAKG,QAAQ+B,OACrBC,SAAUnC,KAAKG,QAAQgC,SACvBiB,SAAU,CAAEM,UAAW,QACvBwB,QAAS,aACiB,QAAxBC,GAAApG,EAAAiB,KAAKG,SAAQoC,mBAAW,IAAA4C,GAAAA,EAAAC,KAAArG,EAAG+F,EAAK,EAElCO,WAAY,aACiB,QAA3BF,GAAApG,EAAAiB,KAAKG,SAAQqC,sBAAc,IAAA2C,GAAAA,EAAAC,KAAArG,EAAG+F,EAAK,GAGxC,EA7LD9E,KAAKG,QAAU,CACb6B,OACAC,OACAC,SACAC,WACAC,oBACAC,SAAUC,EACVC,cACAC,kBAGFxC,KAAKgD,iBACLzD,OAAO+F,iBAAiB,SAAUtF,KAAKgD,gBAAgB,GAEvDhD,KAAK2D,gBCjFO,SAAAtB,SACdkD,EACAC,GAEA,IAAIC,EACJ,OAAO,YAAyBC,GAC9B,IAAIC,EAAU3F,KACd4F,aAAaH,GACbA,EAAQI,YAAW,KACjBJ,OAAQhB,EACRc,EAASO,MAAMH,EAASD,EAAK,GAC5BF,EACL,CACF,CDoE2BnD,CAASrC,KAAK4D,OAAQ5D,KAAKG,QAAQkC,UAE1DrC,KAAK+B,MAAMgE,GAAG,SAAU/F,KAAKiD,SAC9B,CAKD,OAAA3B,GACEtB,KAAK+B,MAAMiE,IAAI,SAAUhG,KAAKiD,UAC9B1D,OAAO0G,oBAAoB,SAAUjG,KAAKgD,gBAAgB,GAC1DhD,KAAKyC,SAASwB,SAAS3F,GAAYA,EAAQgD,WAC5C,CAKD,KAAA4E,GACElG,KAAK+C,WAAY,CAClB,CAKD,IAAAoD,GACEnG,KAAK+C,WAAY,CAClB,CASD,GAAAqD,CAAIlC,EAAed,EAAqB,IACtC,MAAMiD,EAAKxE,MAIX,OAFA7B,KAAK2C,MAAM2D,IAAID,EAAI,CAAEnC,QAAOd,aAErB,IAAMpD,KAAKuG,OAAOF,EAC1B,CAOD,MAAAE,CAAOF,GACLrG,KAAK2C,MAAM6D,OAAOH,EACnB,CASD,UAAAI,CAAWnI,EAAsB6B,EAAU,IACzC,MAAMkG,EAAKxE,MAIX,OAFA7B,KAAKyC,SAAS6D,IAAID,EAAI,IAAI1G,YAAYrB,EAAS6B,IAExC,IAAMH,KAAK0G,cAAcL,EACjC,CAOD,aAAAK,CAAcL,GACZrG,KAAKyC,SAAS+D,OAAOH,EACtB"}
|
package/dist/lenis.css
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
html.lenis,
|
|
2
|
-
html.lenis body {
|
|
3
|
-
height: auto;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
.lenis.lenis-smooth {
|
|
7
|
-
scroll-behavior: auto !important;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
.lenis.lenis-smooth [data-lenis-prevent] {
|
|
11
|
-
overscroll-behavior: contain;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
.lenis.lenis-stopped {
|
|
15
|
-
overflow: hidden;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.lenis.lenis-smooth iframe {
|
|
19
|
-
pointer-events: none;
|
|
20
|
-
}
|