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.
Files changed (147) hide show
  1. package/README.md +17 -17
  2. package/lib/cdn/vevet.iife.min.js +9 -9
  3. package/lib/cjs/base/Module/index.js +2 -1
  4. package/lib/cjs/base/Module/index.js.map +1 -1
  5. package/lib/cjs/components/Canvas/index.js +1 -1
  6. package/lib/cjs/components/CanvasMedia/index.js +1 -1
  7. package/lib/cjs/components/Cursor/index.js +28 -13
  8. package/lib/cjs/components/Cursor/index.js.map +1 -1
  9. package/lib/cjs/components/InView/index.js +1 -1
  10. package/lib/cjs/components/Marquee/index.js +1 -1
  11. package/lib/cjs/components/Pointers/index.js +4 -1
  12. package/lib/cjs/components/Pointers/index.js.map +1 -1
  13. package/lib/cjs/components/Preloader/index.js +1 -1
  14. package/lib/cjs/components/ProgressPreloader/index.js +1 -1
  15. package/lib/cjs/components/Raf/index.js +1 -1
  16. package/lib/cjs/components/ScrollProgress/index.js +1 -1
  17. package/lib/cjs/components/Scrollbar/index.js +2 -1
  18. package/lib/cjs/components/Scrollbar/index.js.map +1 -1
  19. package/lib/cjs/components/Snap/Slide/index.js +1 -0
  20. package/lib/cjs/components/Snap/Slide/index.js.map +1 -1
  21. package/lib/cjs/components/Snap/Swipe/index.js +93 -37
  22. package/lib/cjs/components/Snap/Swipe/index.js.map +1 -1
  23. package/lib/cjs/components/Snap/Track/index.js +12 -1
  24. package/lib/cjs/components/Snap/Track/index.js.map +1 -1
  25. package/lib/cjs/components/Snap/Wheel/index.js +241 -65
  26. package/lib/cjs/components/Snap/Wheel/index.js.map +1 -1
  27. package/lib/cjs/components/Snap/index.js +75 -39
  28. package/lib/cjs/components/Snap/index.js.map +1 -1
  29. package/lib/cjs/components/SplitText/index.js +1 -1
  30. package/lib/cjs/components/Swipe/index.js +12 -5
  31. package/lib/cjs/components/Swipe/index.js.map +1 -1
  32. package/lib/cjs/components/Timeline/index.js +1 -1
  33. package/lib/cjs/internal/mergeWithNoUndefined.js +24 -0
  34. package/lib/cjs/internal/mergeWithNoUndefined.js.map +1 -0
  35. package/lib/cjs/manifest.json +1 -1
  36. package/lib/cjs/utils/common/toPixels.js +3 -0
  37. package/lib/cjs/utils/common/toPixels.js.map +1 -1
  38. package/lib/cjs/utils/listeners/onResize.js +1 -1
  39. package/lib/cjs/utils/listeners/onResize.js.map +1 -1
  40. package/lib/cjs/utils/math/inRange.js +4 -4
  41. package/lib/esm/base/Module/index.js +2 -1
  42. package/lib/esm/base/Module/index.js.map +1 -1
  43. package/lib/esm/components/Canvas/index.js +1 -1
  44. package/lib/esm/components/CanvasMedia/index.js +1 -1
  45. package/lib/esm/components/Cursor/index.js +28 -13
  46. package/lib/esm/components/Cursor/index.js.map +1 -1
  47. package/lib/esm/components/InView/index.js +1 -1
  48. package/lib/esm/components/Marquee/index.js +1 -1
  49. package/lib/esm/components/Pointers/index.js +4 -1
  50. package/lib/esm/components/Pointers/index.js.map +1 -1
  51. package/lib/esm/components/Preloader/index.js +1 -1
  52. package/lib/esm/components/ProgressPreloader/index.js +1 -1
  53. package/lib/esm/components/Raf/index.js +1 -1
  54. package/lib/esm/components/ScrollProgress/index.js +1 -1
  55. package/lib/esm/components/Scrollbar/index.js +2 -1
  56. package/lib/esm/components/Scrollbar/index.js.map +1 -1
  57. package/lib/esm/components/Snap/Slide/index.js +1 -0
  58. package/lib/esm/components/Snap/Slide/index.js.map +1 -1
  59. package/lib/esm/components/Snap/Swipe/index.js +92 -36
  60. package/lib/esm/components/Snap/Swipe/index.js.map +1 -1
  61. package/lib/esm/components/Snap/Track/index.js +12 -1
  62. package/lib/esm/components/Snap/Track/index.js.map +1 -1
  63. package/lib/esm/components/Snap/Wheel/index.js +218 -66
  64. package/lib/esm/components/Snap/Wheel/index.js.map +1 -1
  65. package/lib/esm/components/Snap/index.js +62 -29
  66. package/lib/esm/components/Snap/index.js.map +1 -1
  67. package/lib/esm/components/SplitText/index.js +1 -1
  68. package/lib/esm/components/Swipe/index.js +12 -5
  69. package/lib/esm/components/Swipe/index.js.map +1 -1
  70. package/lib/esm/components/Timeline/index.js +1 -1
  71. package/lib/esm/internal/mergeWithNoUndefined.js +10 -0
  72. package/lib/esm/internal/mergeWithNoUndefined.js.map +1 -0
  73. package/lib/esm/manifest.json +1 -1
  74. package/lib/esm/utils/common/toPixels.js +3 -0
  75. package/lib/esm/utils/common/toPixels.js.map +1 -1
  76. package/lib/esm/utils/listeners/onResize.js +1 -1
  77. package/lib/esm/utils/listeners/onResize.js.map +1 -1
  78. package/lib/esm/utils/math/inRange.js +4 -4
  79. package/lib/types/base/Module/index.d.ts.map +1 -1
  80. package/lib/types/components/Canvas/index.d.ts +1 -1
  81. package/lib/types/components/CanvasMedia/index.d.ts +1 -1
  82. package/lib/types/components/Cursor/index.d.ts +5 -1
  83. package/lib/types/components/Cursor/index.d.ts.map +1 -1
  84. package/lib/types/components/InView/index.d.ts +1 -1
  85. package/lib/types/components/Marquee/index.d.ts +1 -1
  86. package/lib/types/components/Pointers/index.d.ts +1 -1
  87. package/lib/types/components/Pointers/index.d.ts.map +1 -1
  88. package/lib/types/components/Preloader/index.d.ts +1 -1
  89. package/lib/types/components/ProgressPreloader/index.d.ts +1 -1
  90. package/lib/types/components/Raf/index.d.ts +1 -1
  91. package/lib/types/components/ScrollProgress/index.d.ts +1 -1
  92. package/lib/types/components/Scrollbar/index.d.ts +1 -1
  93. package/lib/types/components/Scrollbar/index.d.ts.map +1 -1
  94. package/lib/types/components/Snap/Slide/index.d.ts.map +1 -1
  95. package/lib/types/components/Snap/Swipe/index.d.ts +10 -1
  96. package/lib/types/components/Snap/Swipe/index.d.ts.map +1 -1
  97. package/lib/types/components/Snap/Track/index.d.ts +2 -0
  98. package/lib/types/components/Snap/Track/index.d.ts.map +1 -1
  99. package/lib/types/components/Snap/Wheel/index.d.ts +28 -6
  100. package/lib/types/components/Snap/Wheel/index.d.ts.map +1 -1
  101. package/lib/types/components/Snap/Wheel/types.d.ts +6 -6
  102. package/lib/types/components/Snap/Wheel/types.d.ts.map +1 -1
  103. package/lib/types/components/Snap/index.d.ts +12 -8
  104. package/lib/types/components/Snap/index.d.ts.map +1 -1
  105. package/lib/types/components/Snap/types.d.ts +19 -5
  106. package/lib/types/components/Snap/types.d.ts.map +1 -1
  107. package/lib/types/components/SplitText/index.d.ts +1 -1
  108. package/lib/types/components/Swipe/index.d.ts +1 -1
  109. package/lib/types/components/Swipe/index.d.ts.map +1 -1
  110. package/lib/types/components/Swipe/types.d.ts +9 -0
  111. package/lib/types/components/Swipe/types.d.ts.map +1 -1
  112. package/lib/types/components/Timeline/index.d.ts +1 -1
  113. package/lib/types/internal/mergeWithNoUndefined.d.ts +2 -0
  114. package/lib/types/internal/mergeWithNoUndefined.d.ts.map +1 -0
  115. package/lib/types/utils/common/toPixels.d.ts.map +1 -1
  116. package/lib/types/utils/listeners/onResize.d.ts +1 -0
  117. package/lib/types/utils/listeners/onResize.d.ts.map +1 -1
  118. package/lib/types/utils/math/inRange.d.ts +4 -4
  119. package/package.json +1 -1
  120. package/src/base/Module/index.ts +8 -5
  121. package/src/components/Canvas/index.ts +1 -1
  122. package/src/components/CanvasMedia/index.ts +1 -1
  123. package/src/components/Cursor/index.ts +35 -15
  124. package/src/components/InView/index.ts +1 -1
  125. package/src/components/Marquee/index.ts +1 -1
  126. package/src/components/Pointers/index.ts +5 -1
  127. package/src/components/Preloader/index.ts +1 -1
  128. package/src/components/ProgressPreloader/index.ts +1 -1
  129. package/src/components/Raf/index.ts +1 -1
  130. package/src/components/ScrollProgress/index.ts +1 -1
  131. package/src/components/Scrollbar/index.ts +2 -1
  132. package/src/components/Snap/Slide/index.ts +1 -0
  133. package/src/components/Snap/Swipe/index.ts +121 -49
  134. package/src/components/Snap/Track/index.ts +15 -1
  135. package/src/components/Snap/Wheel/index.ts +285 -73
  136. package/src/components/Snap/Wheel/types.ts +7 -7
  137. package/src/components/Snap/index.ts +54 -38
  138. package/src/components/Snap/types.ts +24 -5
  139. package/src/components/SplitText/index.ts +1 -1
  140. package/src/components/Swipe/index.ts +23 -5
  141. package/src/components/Swipe/types.ts +12 -0
  142. package/src/components/Timeline/index.ts +1 -1
  143. package/src/internal/mergeWithNoUndefined.ts +20 -0
  144. package/src/manifest.json +1 -1
  145. package/src/utils/common/toPixels.ts +2 -0
  146. package/src/utils/listeners/onResize.ts +2 -1
  147. 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
- /** Accummulated wheel value for `followWheel=false` */
15
- protected _noFollowAccum = 0;
17
+ /** Deltas history */
18
+ protected _deltas: number[] = [];
16
19
 
17
20
  /** Last time wheel event was fired */
18
- protected _lastNoFollowTime = 0;
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 (!snap.props.wheel) {
62
+ if (!props.wheel) {
40
63
  return;
41
64
  }
42
65
 
43
66
  event.preventDefault();
44
67
 
45
- const { wheelAxis } = snap.props;
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
- // Start callback
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
- this._hasStarted = true;
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
- // Normalize wheel data
57
- const axis = wheelAxis === 'auto' ? snap.axis : wheelAxis;
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._handleNotFollow(delta);
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 _handleNotFollow(delta: number) {
92
- const { snap } = this;
93
- const { props } = snap;
135
+ protected _handleNoFollow(delta: number) {
136
+ // vars
137
+ const { snap, isTouchPad, isGainingDelta } = this;
138
+ const { track, activeSlide, domSize } = snap;
94
139
 
95
- // check wheel throttling by active transition
96
- if (props.wheelThrottle === 'auto' && snap.isTransitioning) {
140
+ // Detect wheel throttling
141
+ if (this._detectNoFollowThrottle()) {
97
142
  return;
98
143
  }
99
144
 
100
- // check wheel throttling by time
101
- const timeDiff = +new Date() - this._lastNoFollowTime;
102
- if (
103
- typeof props.wheelThrottle === 'number' &&
104
- timeDiff < props.wheelThrottle
105
- ) {
106
- return;
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
- // scroll slide
110
- if (snap.track.isSlideScrolling) {
111
- this._handleFollow(delta);
112
- this._noFollowAccum = 0;
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
- // check minumum wheel threshold
118
- if (Math.abs(delta) < 0.5) {
119
- return;
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
- // accumulate wheel value
123
- this._noFollowAccum += Math.abs(delta);
124
- const direction = Math.sign(delta);
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
- // continue if accumulated value is more than threshold
127
- if (
128
- Math.abs(this._noFollowAccum) < Math.abs(props.wheelNoFollowThreshold)
129
- ) {
130
- return;
236
+ // NUMBER
237
+
238
+ if (typeof wheelThrottle === 'number') {
239
+ return timeDiff < wheelThrottle;
131
240
  }
132
241
 
133
- // detect transition direction
134
- if (direction === 1) {
135
- if (!snap.next()) {
136
- return;
137
- }
138
- } else if (!snap.prev()) {
139
- return;
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
- // reset
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 } = this.snap;
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
- if (!props.freemode) {
279
+ // Stick to the nearest magnet
280
+
281
+ if (!props.freemode || props.freemode === 'sticky') {
156
282
  if (props.followWheel && props.stickOnWheelEnd) {
157
- snap.stick();
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
- /** Destroy wheel listeners */
167
- protected _destroy() {
168
- this._destructor();
312
+ /** Save delta */
313
+ protected _addDelta(delta: number) {
314
+ if (this._deltas.length >= deltasCount) {
315
+ this._deltas.shift();
316
+ }
169
317
 
170
- if (this._debounceEnd) {
171
- clearTimeout(this._debounceEnd);
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` - value based on transition duration
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
  }