vevet 5.0.11 → 5.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.
- package/README.md +17 -17
- package/lib/cdn/vevet.iife.min.js +9 -9
- package/lib/cjs/base/Module/index.js +2 -1
- package/lib/cjs/base/Module/index.js.map +1 -1
- package/lib/cjs/components/Canvas/index.js +1 -1
- package/lib/cjs/components/CanvasMedia/index.js +1 -1
- package/lib/cjs/components/Cursor/index.js +28 -13
- package/lib/cjs/components/Cursor/index.js.map +1 -1
- package/lib/cjs/components/InView/index.js +1 -1
- package/lib/cjs/components/Marquee/index.js +1 -1
- package/lib/cjs/components/Pointers/index.js +4 -1
- package/lib/cjs/components/Pointers/index.js.map +1 -1
- package/lib/cjs/components/Preloader/index.js +1 -1
- package/lib/cjs/components/ProgressPreloader/index.js +1 -1
- package/lib/cjs/components/Raf/index.js +1 -1
- package/lib/cjs/components/ScrollProgress/index.js +1 -1
- package/lib/cjs/components/Scrollbar/index.js +2 -1
- package/lib/cjs/components/Scrollbar/index.js.map +1 -1
- package/lib/cjs/components/Snap/Slide/index.js +1 -0
- package/lib/cjs/components/Snap/Slide/index.js.map +1 -1
- package/lib/cjs/components/Snap/Swipe/index.js +93 -37
- package/lib/cjs/components/Snap/Swipe/index.js.map +1 -1
- package/lib/cjs/components/Snap/Track/index.js +12 -1
- package/lib/cjs/components/Snap/Track/index.js.map +1 -1
- package/lib/cjs/components/Snap/Wheel/index.js +241 -65
- package/lib/cjs/components/Snap/Wheel/index.js.map +1 -1
- package/lib/cjs/components/Snap/index.js +75 -39
- package/lib/cjs/components/Snap/index.js.map +1 -1
- package/lib/cjs/components/SplitText/index.js +1 -1
- package/lib/cjs/components/Swipe/index.js +12 -5
- package/lib/cjs/components/Swipe/index.js.map +1 -1
- package/lib/cjs/components/Timeline/index.js +1 -1
- package/lib/cjs/internal/mergeWithNoUndefined.js +24 -0
- package/lib/cjs/internal/mergeWithNoUndefined.js.map +1 -0
- package/lib/cjs/manifest.json +1 -1
- package/lib/cjs/utils/common/toPixels.js +3 -0
- package/lib/cjs/utils/common/toPixels.js.map +1 -1
- package/lib/cjs/utils/listeners/onResize.js +1 -1
- package/lib/cjs/utils/listeners/onResize.js.map +1 -1
- package/lib/cjs/utils/math/inRange.js +4 -4
- package/lib/esm/base/Module/index.js +2 -1
- package/lib/esm/base/Module/index.js.map +1 -1
- package/lib/esm/components/Canvas/index.js +1 -1
- package/lib/esm/components/CanvasMedia/index.js +1 -1
- package/lib/esm/components/Cursor/index.js +28 -13
- package/lib/esm/components/Cursor/index.js.map +1 -1
- package/lib/esm/components/InView/index.js +1 -1
- package/lib/esm/components/Marquee/index.js +1 -1
- package/lib/esm/components/Pointers/index.js +4 -1
- package/lib/esm/components/Pointers/index.js.map +1 -1
- package/lib/esm/components/Preloader/index.js +1 -1
- package/lib/esm/components/ProgressPreloader/index.js +1 -1
- package/lib/esm/components/Raf/index.js +1 -1
- package/lib/esm/components/ScrollProgress/index.js +1 -1
- package/lib/esm/components/Scrollbar/index.js +2 -1
- package/lib/esm/components/Scrollbar/index.js.map +1 -1
- package/lib/esm/components/Snap/Slide/index.js +1 -0
- package/lib/esm/components/Snap/Slide/index.js.map +1 -1
- package/lib/esm/components/Snap/Swipe/index.js +92 -36
- package/lib/esm/components/Snap/Swipe/index.js.map +1 -1
- package/lib/esm/components/Snap/Track/index.js +12 -1
- package/lib/esm/components/Snap/Track/index.js.map +1 -1
- package/lib/esm/components/Snap/Wheel/index.js +218 -66
- package/lib/esm/components/Snap/Wheel/index.js.map +1 -1
- package/lib/esm/components/Snap/index.js +62 -29
- package/lib/esm/components/Snap/index.js.map +1 -1
- package/lib/esm/components/SplitText/index.js +1 -1
- package/lib/esm/components/Swipe/index.js +12 -5
- package/lib/esm/components/Swipe/index.js.map +1 -1
- package/lib/esm/components/Timeline/index.js +1 -1
- package/lib/esm/internal/mergeWithNoUndefined.js +10 -0
- package/lib/esm/internal/mergeWithNoUndefined.js.map +1 -0
- package/lib/esm/manifest.json +1 -1
- package/lib/esm/utils/common/toPixels.js +3 -0
- package/lib/esm/utils/common/toPixels.js.map +1 -1
- package/lib/esm/utils/listeners/onResize.js +1 -1
- package/lib/esm/utils/listeners/onResize.js.map +1 -1
- package/lib/esm/utils/math/inRange.js +4 -4
- package/lib/types/base/Module/index.d.ts.map +1 -1
- package/lib/types/components/Canvas/index.d.ts +1 -1
- package/lib/types/components/CanvasMedia/index.d.ts +1 -1
- package/lib/types/components/Cursor/index.d.ts +5 -1
- package/lib/types/components/Cursor/index.d.ts.map +1 -1
- package/lib/types/components/InView/index.d.ts +1 -1
- package/lib/types/components/Marquee/index.d.ts +1 -1
- package/lib/types/components/Pointers/index.d.ts +1 -1
- package/lib/types/components/Pointers/index.d.ts.map +1 -1
- package/lib/types/components/Preloader/index.d.ts +1 -1
- package/lib/types/components/ProgressPreloader/index.d.ts +1 -1
- package/lib/types/components/Raf/index.d.ts +1 -1
- package/lib/types/components/ScrollProgress/index.d.ts +1 -1
- package/lib/types/components/Scrollbar/index.d.ts +1 -1
- package/lib/types/components/Scrollbar/index.d.ts.map +1 -1
- package/lib/types/components/Snap/Slide/index.d.ts.map +1 -1
- package/lib/types/components/Snap/Swipe/index.d.ts +10 -1
- package/lib/types/components/Snap/Swipe/index.d.ts.map +1 -1
- package/lib/types/components/Snap/Track/index.d.ts +2 -0
- package/lib/types/components/Snap/Track/index.d.ts.map +1 -1
- package/lib/types/components/Snap/Wheel/index.d.ts +28 -6
- package/lib/types/components/Snap/Wheel/index.d.ts.map +1 -1
- package/lib/types/components/Snap/Wheel/types.d.ts +6 -6
- package/lib/types/components/Snap/Wheel/types.d.ts.map +1 -1
- package/lib/types/components/Snap/index.d.ts +12 -8
- package/lib/types/components/Snap/index.d.ts.map +1 -1
- package/lib/types/components/Snap/types.d.ts +19 -5
- package/lib/types/components/Snap/types.d.ts.map +1 -1
- package/lib/types/components/SplitText/index.d.ts +1 -1
- package/lib/types/components/Swipe/index.d.ts +1 -1
- package/lib/types/components/Swipe/index.d.ts.map +1 -1
- package/lib/types/components/Swipe/types.d.ts +9 -0
- package/lib/types/components/Swipe/types.d.ts.map +1 -1
- package/lib/types/components/Timeline/index.d.ts +1 -1
- package/lib/types/internal/mergeWithNoUndefined.d.ts +2 -0
- package/lib/types/internal/mergeWithNoUndefined.d.ts.map +1 -0
- package/lib/types/utils/common/toPixels.d.ts.map +1 -1
- package/lib/types/utils/listeners/onResize.d.ts +1 -0
- package/lib/types/utils/listeners/onResize.d.ts.map +1 -1
- package/lib/types/utils/math/inRange.d.ts +4 -4
- package/package.json +1 -1
- package/src/base/Module/index.ts +8 -5
- package/src/components/Canvas/index.ts +1 -1
- package/src/components/CanvasMedia/index.ts +1 -1
- package/src/components/Cursor/index.ts +35 -15
- package/src/components/InView/index.ts +1 -1
- package/src/components/Marquee/index.ts +1 -1
- package/src/components/Pointers/index.ts +5 -1
- package/src/components/Preloader/index.ts +1 -1
- package/src/components/ProgressPreloader/index.ts +1 -1
- package/src/components/Raf/index.ts +1 -1
- package/src/components/ScrollProgress/index.ts +1 -1
- package/src/components/Scrollbar/index.ts +2 -1
- package/src/components/Snap/Slide/index.ts +1 -0
- package/src/components/Snap/Swipe/index.ts +121 -49
- package/src/components/Snap/Track/index.ts +15 -1
- package/src/components/Snap/Wheel/index.ts +285 -73
- package/src/components/Snap/Wheel/types.ts +7 -7
- package/src/components/Snap/index.ts +54 -38
- package/src/components/Snap/types.ts +24 -5
- package/src/components/SplitText/index.ts +1 -1
- package/src/components/Swipe/index.ts +23 -5
- package/src/components/Swipe/types.ts +12 -0
- package/src/components/Timeline/index.ts +1 -1
- package/src/internal/mergeWithNoUndefined.ts +20 -0
- package/src/manifest.json +1 -1
- package/src/utils/common/toPixels.ts +2 -0
- package/src/utils/listeners/onResize.ts +2 -1
- package/src/utils/math/inRange.ts +4 -4
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { addEventListener, normalizeWheel } from '@/utils';
|
|
1
|
+
import { addEventListener, clamp, normalizeWheel } from '@/utils';
|
|
2
2
|
import { Snap } from '..';
|
|
3
|
+
import { initVevet } from '@/global/initVevet';
|
|
4
|
+
|
|
5
|
+
const deltasCount = 6;
|
|
3
6
|
|
|
4
7
|
export class SnapWheel {
|
|
5
8
|
/** Listeners to destruct */
|
|
@@ -11,11 +14,11 @@ export class SnapWheel {
|
|
|
11
14
|
/** Debounce wheel end event */
|
|
12
15
|
protected _debounceEnd?: NodeJS.Timeout;
|
|
13
16
|
|
|
14
|
-
/**
|
|
15
|
-
protected
|
|
17
|
+
/** Deltas history */
|
|
18
|
+
protected _deltas: number[] = [];
|
|
16
19
|
|
|
17
20
|
/** Last time wheel event was fired */
|
|
18
|
-
protected
|
|
21
|
+
protected _lastWheelTime = 0;
|
|
19
22
|
|
|
20
23
|
constructor(protected _snap: Snap) {
|
|
21
24
|
_snap.on('destroy', () => this._destroy(), { protected: true });
|
|
@@ -25,54 +28,95 @@ export class SnapWheel {
|
|
|
25
28
|
);
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
/** Destroy wheel listeners */
|
|
32
|
+
protected _destroy() {
|
|
33
|
+
this._destructor();
|
|
34
|
+
|
|
35
|
+
if (this._debounceEnd) {
|
|
36
|
+
clearTimeout(this._debounceEnd);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
28
40
|
/** Snap component */
|
|
29
41
|
protected get snap() {
|
|
30
42
|
return this._snap;
|
|
31
43
|
}
|
|
32
44
|
|
|
45
|
+
/** Get absolute deltas */
|
|
46
|
+
protected get absDeltas() {
|
|
47
|
+
return this._deltas.map((d) => Math.abs(d));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Get last wheel time */
|
|
51
|
+
protected get lastWheelTime() {
|
|
52
|
+
return this._lastWheelTime;
|
|
53
|
+
}
|
|
54
|
+
|
|
33
55
|
/**
|
|
34
56
|
* Handles wheel events
|
|
35
57
|
*/
|
|
36
58
|
protected _handleWheel(event: WheelEvent) {
|
|
37
59
|
const { snap } = this;
|
|
60
|
+
const { props } = snap;
|
|
38
61
|
|
|
39
|
-
if (!
|
|
62
|
+
if (!props.wheel) {
|
|
40
63
|
return;
|
|
41
64
|
}
|
|
42
65
|
|
|
43
66
|
event.preventDefault();
|
|
44
67
|
|
|
45
|
-
|
|
68
|
+
// Get delta
|
|
69
|
+
const wheelData = normalizeWheel(event);
|
|
70
|
+
const wheelAxis = props.wheelAxis === 'auto' ? snap.axis : props.wheelAxis;
|
|
71
|
+
const delta = wheelAxis === 'x' ? wheelData.pixelX : wheelData.pixelY;
|
|
72
|
+
|
|
73
|
+
// Start
|
|
74
|
+
this._handleStart(delta);
|
|
75
|
+
|
|
76
|
+
// Start
|
|
77
|
+
this._handleMove(delta, event);
|
|
78
|
+
|
|
79
|
+
// Debounce End
|
|
80
|
+
if (this._debounceEnd) {
|
|
81
|
+
clearTimeout(this._debounceEnd);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// End callback
|
|
85
|
+
this._debounceEnd = setTimeout(() => this._handleEnd(), 200);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Handle wheel start */
|
|
89
|
+
protected _handleStart(delta: number) {
|
|
90
|
+
if (this._hasStarted || Math.abs(delta) < 2) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
this._hasStarted = true;
|
|
46
95
|
|
|
47
|
-
|
|
96
|
+
this.snap.callbacks.emit('wheelStart', undefined);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Handle wheel move */
|
|
100
|
+
protected _handleMove(delta: number, event: WheelEvent) {
|
|
48
101
|
if (!this._hasStarted) {
|
|
49
|
-
|
|
50
|
-
snap.callbacks.emit('wheelStart', undefined);
|
|
102
|
+
return;
|
|
51
103
|
}
|
|
52
104
|
|
|
105
|
+
const { snap } = this;
|
|
106
|
+
const { props } = snap;
|
|
107
|
+
|
|
108
|
+
// Save delta
|
|
109
|
+
this._addDelta(delta);
|
|
110
|
+
|
|
53
111
|
// Move callback
|
|
54
112
|
snap.callbacks.emit('wheel', event);
|
|
55
113
|
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
const wheelData = normalizeWheel(event);
|
|
59
|
-
const wheelDelta = axis === 'x' ? wheelData.pixelX : wheelData.pixelY;
|
|
60
|
-
const delta = wheelDelta * snap.props.wheelSpeed;
|
|
61
|
-
|
|
62
|
-
// Update wheel target
|
|
63
|
-
if (snap.props.followWheel) {
|
|
114
|
+
// Handle wheel logic
|
|
115
|
+
if (props.followWheel) {
|
|
64
116
|
this._handleFollow(delta);
|
|
65
117
|
} else {
|
|
66
|
-
this.
|
|
118
|
+
this._handleNoFollow(delta);
|
|
67
119
|
}
|
|
68
|
-
|
|
69
|
-
// Debounce End
|
|
70
|
-
if (this._debounceEnd) {
|
|
71
|
-
clearTimeout(this._debounceEnd);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// End callback
|
|
75
|
-
this._debounceEnd = setTimeout(() => this._handleEnd(), 100);
|
|
76
120
|
}
|
|
77
121
|
|
|
78
122
|
/** Handle `followWheel=true` */
|
|
@@ -83,79 +127,181 @@ export class SnapWheel {
|
|
|
83
127
|
snap.cancelTransition();
|
|
84
128
|
|
|
85
129
|
// Update track target
|
|
86
|
-
snap.track.iterateTarget(delta);
|
|
130
|
+
snap.track.iterateTarget(delta * snap.props.wheelSpeed);
|
|
87
131
|
snap.track.clampTarget();
|
|
88
132
|
}
|
|
89
133
|
|
|
90
134
|
/** Handle `followWheel=false` */
|
|
91
|
-
protected
|
|
92
|
-
|
|
93
|
-
const {
|
|
135
|
+
protected _handleNoFollow(delta: number) {
|
|
136
|
+
// vars
|
|
137
|
+
const { snap, isTouchPad, isGainingDelta } = this;
|
|
138
|
+
const { track, activeSlide, domSize } = snap;
|
|
94
139
|
|
|
95
|
-
//
|
|
96
|
-
if (
|
|
140
|
+
// Detect wheel throttling
|
|
141
|
+
if (this._detectNoFollowThrottle()) {
|
|
97
142
|
return;
|
|
98
143
|
}
|
|
99
144
|
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
) {
|
|
106
|
-
|
|
145
|
+
// Detect if need to throttle or follow
|
|
146
|
+
|
|
147
|
+
let shouldFollow = false;
|
|
148
|
+
let isThrottled = true;
|
|
149
|
+
|
|
150
|
+
if (!shouldFollow) {
|
|
151
|
+
if (track.isSlideScrolling) {
|
|
152
|
+
if (activeSlide.coord === 0) {
|
|
153
|
+
if (delta > 0) {
|
|
154
|
+
shouldFollow = true;
|
|
155
|
+
}
|
|
156
|
+
} else if (activeSlide.coord === domSize - activeSlide.size) {
|
|
157
|
+
if (delta < 0) {
|
|
158
|
+
shouldFollow = true;
|
|
159
|
+
}
|
|
160
|
+
} else {
|
|
161
|
+
shouldFollow = true;
|
|
162
|
+
isThrottled = false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
107
165
|
}
|
|
108
166
|
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
167
|
+
// Throttle
|
|
168
|
+
|
|
169
|
+
if (isThrottled) {
|
|
170
|
+
if (
|
|
171
|
+
!isTouchPad ||
|
|
172
|
+
(isTouchPad && (isGainingDelta || this.absDeltas.length === 1))
|
|
173
|
+
) {
|
|
174
|
+
const direction = Math.sign(delta);
|
|
175
|
+
|
|
176
|
+
if (shouldFollow) {
|
|
177
|
+
snap.cancelTransition();
|
|
178
|
+
|
|
179
|
+
track.iterateTarget(direction);
|
|
180
|
+
track.clampTarget();
|
|
181
|
+
|
|
182
|
+
if (!isTouchPad) {
|
|
183
|
+
track.current = track.target;
|
|
184
|
+
}
|
|
185
|
+
} else if (direction === 1) {
|
|
186
|
+
if (!snap.props.loop && snap.activeIndex === snap.slides.length - 1) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
this._lastWheelTime = +new Date();
|
|
191
|
+
|
|
192
|
+
snap.next();
|
|
193
|
+
} else {
|
|
194
|
+
if (!snap.props.loop && snap.activeIndex === 0) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
this._lastWheelTime = +new Date();
|
|
199
|
+
|
|
200
|
+
snap.prev();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
113
203
|
|
|
114
204
|
return;
|
|
115
205
|
}
|
|
116
206
|
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
207
|
+
// Follow wheel
|
|
208
|
+
|
|
209
|
+
if (shouldFollow) {
|
|
210
|
+
snap.cancelTransition();
|
|
211
|
+
|
|
212
|
+
const deltaWithSpeed = delta * snap.props.wheelSpeed;
|
|
213
|
+
|
|
214
|
+
const start = Math.min(...activeSlide.magnets);
|
|
215
|
+
const end = Math.max(...activeSlide.magnets);
|
|
216
|
+
|
|
217
|
+
const loopedTarget = track.loopCoord(track.target);
|
|
218
|
+
|
|
219
|
+
const clampedLoopedTarget = clamp(
|
|
220
|
+
loopedTarget + deltaWithSpeed,
|
|
221
|
+
start,
|
|
222
|
+
end,
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
track.target += clampedLoopedTarget - loopedTarget;
|
|
226
|
+
track.clampTarget();
|
|
120
227
|
}
|
|
228
|
+
}
|
|
121
229
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
230
|
+
/** Detect if wheel should be throttled */
|
|
231
|
+
protected _detectNoFollowThrottle() {
|
|
232
|
+
const { isTouchPad, snap } = this;
|
|
233
|
+
const { wheelThrottle } = snap.props;
|
|
234
|
+
const timeDiff = +new Date() - this._lastWheelTime;
|
|
125
235
|
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return;
|
|
236
|
+
// NUMBER
|
|
237
|
+
|
|
238
|
+
if (typeof wheelThrottle === 'number') {
|
|
239
|
+
return timeDiff < wheelThrottle;
|
|
131
240
|
}
|
|
132
241
|
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
242
|
+
// AUTO
|
|
243
|
+
|
|
244
|
+
if (isTouchPad) {
|
|
245
|
+
return this.snap.isTransitioning;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const visibleScrollableSlides = snap.scrollableSlides.filter(
|
|
249
|
+
(slide) => slide.isVisible,
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
if (visibleScrollableSlides.length && snap.isTransitioning) {
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (timeDiff < 500) {
|
|
257
|
+
return true;
|
|
140
258
|
}
|
|
141
259
|
|
|
142
|
-
|
|
143
|
-
this._noFollowAccum = 0;
|
|
144
|
-
this._lastNoFollowTime = +new Date();
|
|
260
|
+
return false;
|
|
145
261
|
}
|
|
146
262
|
|
|
147
263
|
/** Handle wheel end */
|
|
148
264
|
protected _handleEnd() {
|
|
265
|
+
if (!this._hasStarted) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
149
269
|
const { snap } = this;
|
|
150
|
-
const { props } =
|
|
270
|
+
const { props, activeSlide, track } = snap;
|
|
271
|
+
|
|
272
|
+
const lastThreeDeltas = this._deltas.slice(-3).reduce((a, b) => a + b, 0);
|
|
151
273
|
|
|
274
|
+
// Reset states
|
|
275
|
+
|
|
276
|
+
this._deltas = [];
|
|
152
277
|
this._hasStarted = false;
|
|
153
|
-
this._noFollowAccum = 0;
|
|
154
278
|
|
|
155
|
-
|
|
279
|
+
// Stick to the nearest magnet
|
|
280
|
+
|
|
281
|
+
if (!props.freemode || props.freemode === 'sticky') {
|
|
156
282
|
if (props.followWheel && props.stickOnWheelEnd) {
|
|
157
|
-
|
|
283
|
+
// Classic stick when scrolling stops
|
|
284
|
+
|
|
285
|
+
const slideThreshold =
|
|
286
|
+
Math.abs(props.stickOnWheelEndThreshold) / activeSlide.size;
|
|
287
|
+
|
|
288
|
+
if (
|
|
289
|
+
activeSlide.progress > slideThreshold &&
|
|
290
|
+
!track.isSlideScrolling &&
|
|
291
|
+
lastThreeDeltas > 0
|
|
292
|
+
) {
|
|
293
|
+
snap.next();
|
|
294
|
+
} else if (
|
|
295
|
+
activeSlide.progress < -slideThreshold &&
|
|
296
|
+
!track.isSlideScrolling &&
|
|
297
|
+
lastThreeDeltas < 0
|
|
298
|
+
) {
|
|
299
|
+
snap.prev();
|
|
300
|
+
} else {
|
|
301
|
+
snap.stick();
|
|
302
|
+
}
|
|
158
303
|
} else if (!props.followWheel && !snap.isTransitioning) {
|
|
304
|
+
// Stick if something goes wrong when followWheel is disabled
|
|
159
305
|
snap.stick();
|
|
160
306
|
}
|
|
161
307
|
}
|
|
@@ -163,12 +309,78 @@ export class SnapWheel {
|
|
|
163
309
|
snap.callbacks.emit('wheelEnd', undefined);
|
|
164
310
|
}
|
|
165
311
|
|
|
166
|
-
/**
|
|
167
|
-
protected
|
|
168
|
-
this.
|
|
312
|
+
/** Save delta */
|
|
313
|
+
protected _addDelta(delta: number) {
|
|
314
|
+
if (this._deltas.length >= deltasCount) {
|
|
315
|
+
this._deltas.shift();
|
|
316
|
+
}
|
|
169
317
|
|
|
170
|
-
|
|
171
|
-
|
|
318
|
+
this._deltas.push(delta);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Detect if touchpad */
|
|
322
|
+
protected get isTouchPad() {
|
|
323
|
+
return !this.isStableDelta || this.isSmallDelta;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/** Detects if deltas are stable */
|
|
327
|
+
protected get isStableDelta() {
|
|
328
|
+
const deltas = this.absDeltas;
|
|
329
|
+
const precision = 0.8;
|
|
330
|
+
|
|
331
|
+
// get difference between deltas
|
|
332
|
+
const diffs = deltas.map((d, i) => {
|
|
333
|
+
const prev = deltas[i - 1];
|
|
334
|
+
if (!deltas[i - 1]) {
|
|
335
|
+
return 0;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return d - prev;
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
const zeroDiffs = diffs.filter((d) => d === 0);
|
|
342
|
+
|
|
343
|
+
return zeroDiffs.length > diffs.length * precision;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** Detects if the latest delta is small */
|
|
347
|
+
protected get isSmallDelta() {
|
|
348
|
+
const deltas = this.absDeltas;
|
|
349
|
+
|
|
350
|
+
if (deltas.length === 0) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const last = deltas[deltas.length - 1];
|
|
355
|
+
|
|
356
|
+
return last < 50;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** Detect if delta is gaining its value */
|
|
360
|
+
protected get isGainingDelta() {
|
|
361
|
+
const vevet = initVevet();
|
|
362
|
+
const deltas = this.absDeltas;
|
|
363
|
+
const precision = vevet.osName.includes('window') ? 1.5 : 1.2;
|
|
364
|
+
|
|
365
|
+
if (deltas.length < deltasCount) {
|
|
366
|
+
return false;
|
|
172
367
|
}
|
|
368
|
+
|
|
369
|
+
const lastDeltas = deltas.slice(-deltasCount);
|
|
370
|
+
|
|
371
|
+
const half1 = lastDeltas.slice(0, Math.floor(lastDeltas.length / 2));
|
|
372
|
+
const half2 = lastDeltas.slice(Math.floor(lastDeltas.length / 2));
|
|
373
|
+
|
|
374
|
+
const avg1 = this._getAverage(half1);
|
|
375
|
+
const avg2 = this._getAverage(half2);
|
|
376
|
+
|
|
377
|
+
const isGaining = avg2 > avg1 * precision;
|
|
378
|
+
|
|
379
|
+
return isGaining;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** Get average value in an array */
|
|
383
|
+
protected _getAverage(array: number[]) {
|
|
384
|
+
return array.length ? array.reduce((a, b) => a + b, 0) / array.length : 0;
|
|
173
385
|
}
|
|
174
386
|
}
|
|
@@ -28,22 +28,22 @@ export interface ISnapWheelProps {
|
|
|
28
28
|
* Throttle wheel events, value in milliseconds.
|
|
29
29
|
* Works only if `followWheel` is disabled.
|
|
30
30
|
*
|
|
31
|
-
* - `auto` -
|
|
31
|
+
* - `auto` - automatic detection when `wheel` is enabled
|
|
32
32
|
* - `number - value in milliseconds
|
|
33
33
|
*
|
|
34
34
|
* @default `auto`
|
|
35
35
|
*/
|
|
36
36
|
wheelThrottle?: number | 'auto';
|
|
37
37
|
|
|
38
|
-
/**
|
|
39
|
-
* Minimum distance in pixels to trigger snap update. Works only if `followWheel` is disabled.
|
|
40
|
-
* @default 100
|
|
41
|
-
*/
|
|
42
|
-
wheelNoFollowThreshold?: number;
|
|
43
|
-
|
|
44
38
|
/**
|
|
45
39
|
* Enable snapping on wheel stop. Works with `followWheel` enabled.
|
|
46
40
|
* @default true
|
|
47
41
|
*/
|
|
48
42
|
stickOnWheelEnd?: boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Snapping threshold for `stickOnWheelEnd`
|
|
46
|
+
* @default 30
|
|
47
|
+
*/
|
|
48
|
+
stickOnWheelEndThreshold?: number;
|
|
49
49
|
}
|