Browse code

Refactor and rewrite as contao bundle

Benjamin Roth authored on04/11/2022 22:32:32
Showing1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,473 +0,0 @@
1
-import { getWindow, getDocument } from 'ssr-window';
2
-import $ from '../../utils/dom';
3
-import { now, nextTick, bindModuleMethods } from '../../utils/utils';
4
-
5
-function isEventSupported() {
6
-  var document = getDocument();
7
-  var eventName = 'onwheel';
8
-  var isSupported = (eventName in document);
9
-
10
-  if (!isSupported) {
11
-    var element = document.createElement('div');
12
-    element.setAttribute(eventName, 'return;');
13
-    isSupported = typeof element[eventName] === 'function';
14
-  }
15
-
16
-  if (!isSupported && document.implementation && document.implementation.hasFeature && // always returns true in newer browsers as per the standard.
17
-  // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
18
-  document.implementation.hasFeature('', '') !== true) {
19
-    // This is the only way to test support for the `wheel` event in IE9+.
20
-    isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
21
-  }
22
-
23
-  return isSupported;
24
-}
25
-
26
-var Mousewheel = {
27
-  lastScrollTime: now(),
28
-  lastEventBeforeSnap: undefined,
29
-  recentWheelEvents: [],
30
-  event: function event() {
31
-    var window = getWindow();
32
-    if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll';
33
-    return isEventSupported() ? 'wheel' : 'mousewheel';
34
-  },
35
-  normalize: function normalize(e) {
36
-    // Reasonable defaults
37
-    var PIXEL_STEP = 10;
38
-    var LINE_HEIGHT = 40;
39
-    var PAGE_HEIGHT = 800;
40
-    var sX = 0;
41
-    var sY = 0; // spinX, spinY
42
-
43
-    var pX = 0;
44
-    var pY = 0; // pixelX, pixelY
45
-    // Legacy
46
-
47
-    if ('detail' in e) {
48
-      sY = e.detail;
49
-    }
50
-
51
-    if ('wheelDelta' in e) {
52
-      sY = -e.wheelDelta / 120;
53
-    }
54
-
55
-    if ('wheelDeltaY' in e) {
56
-      sY = -e.wheelDeltaY / 120;
57
-    }
58
-
59
-    if ('wheelDeltaX' in e) {
60
-      sX = -e.wheelDeltaX / 120;
61
-    } // side scrolling on FF with DOMMouseScroll
62
-
63
-
64
-    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
65
-      sX = sY;
66
-      sY = 0;
67
-    }
68
-
69
-    pX = sX * PIXEL_STEP;
70
-    pY = sY * PIXEL_STEP;
71
-
72
-    if ('deltaY' in e) {
73
-      pY = e.deltaY;
74
-    }
75
-
76
-    if ('deltaX' in e) {
77
-      pX = e.deltaX;
78
-    }
79
-
80
-    if (e.shiftKey && !pX) {
81
-      // if user scrolls with shift he wants horizontal scroll
82
-      pX = pY;
83
-      pY = 0;
84
-    }
85
-
86
-    if ((pX || pY) && e.deltaMode) {
87
-      if (e.deltaMode === 1) {
88
-        // delta in LINE units
89
-        pX *= LINE_HEIGHT;
90
-        pY *= LINE_HEIGHT;
91
-      } else {
92
-        // delta in PAGE units
93
-        pX *= PAGE_HEIGHT;
94
-        pY *= PAGE_HEIGHT;
95
-      }
96
-    } // Fall-back if spin cannot be determined
97
-
98
-
99
-    if (pX && !sX) {
100
-      sX = pX < 1 ? -1 : 1;
101
-    }
102
-
103
-    if (pY && !sY) {
104
-      sY = pY < 1 ? -1 : 1;
105
-    }
106
-
107
-    return {
108
-      spinX: sX,
109
-      spinY: sY,
110
-      pixelX: pX,
111
-      pixelY: pY
112
-    };
113
-  },
114
-  handleMouseEnter: function handleMouseEnter() {
115
-    var swiper = this;
116
-    swiper.mouseEntered = true;
117
-  },
118
-  handleMouseLeave: function handleMouseLeave() {
119
-    var swiper = this;
120
-    swiper.mouseEntered = false;
121
-  },
122
-  handle: function handle(event) {
123
-    var e = event;
124
-    var disableParentSwiper = true;
125
-    var swiper = this;
126
-    var params = swiper.params.mousewheel;
127
-
128
-    if (swiper.params.cssMode) {
129
-      e.preventDefault();
130
-    }
131
-
132
-    var target = swiper.$el;
133
-
134
-    if (swiper.params.mousewheel.eventsTarget !== 'container') {
135
-      target = $(swiper.params.mousewheel.eventsTarget);
136
-    }
137
-
138
-    if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true;
139
-    if (e.originalEvent) e = e.originalEvent; // jquery fix
140
-
141
-    var delta = 0;
142
-    var rtlFactor = swiper.rtlTranslate ? -1 : 1;
143
-    var data = Mousewheel.normalize(e);
144
-
145
-    if (params.forceToAxis) {
146
-      if (swiper.isHorizontal()) {
147
-        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
148
-      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
149
-    } else {
150
-      delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
151
-    }
152
-
153
-    if (delta === 0) return true;
154
-    if (params.invert) delta = -delta; // Get the scroll positions
155
-
156
-    var positions = swiper.getTranslate() + delta * params.sensitivity;
157
-    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
158
-    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true:
159
-    //     the disableParentSwiper will be true.
160
-    // When loop is false:
161
-    //     if the scroll positions is not on edge,
162
-    //     then the disableParentSwiper will be true.
163
-    //     if the scroll on edge positions,
164
-    //     then the disableParentSwiper will be false.
165
-
166
-    disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
167
-    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
168
-
169
-    if (!swiper.params.freeMode) {
170
-      // Register the new event in a variable which stores the relevant data
171
-      var newEvent = {
172
-        time: now(),
173
-        delta: Math.abs(delta),
174
-        direction: Math.sign(delta),
175
-        raw: event
176
-      }; // Keep the most recent events
177
-
178
-      var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
179
-
180
-      if (recentWheelEvents.length >= 2) {
181
-        recentWheelEvents.shift(); // only store the last N events
182
-      }
183
-
184
-      var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
185
-      recentWheelEvents.push(newEvent); // If there is at least one previous recorded event:
186
-      //   If direction has changed or
187
-      //   if the scroll is quicker than the previous one:
188
-      //     Animate the slider.
189
-      // Else (this is the first time the wheel is moved):
190
-      //     Animate the slider.
191
-
192
-      if (prevEvent) {
193
-        if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
194
-          swiper.mousewheel.animateSlider(newEvent);
195
-        }
196
-      } else {
197
-        swiper.mousewheel.animateSlider(newEvent);
198
-      } // If it's time to release the scroll:
199
-      //   Return now so you don't hit the preventDefault.
200
-
201
-
202
-      if (swiper.mousewheel.releaseScroll(newEvent)) {
203
-        return true;
204
-      }
205
-    } else {
206
-      // Freemode or scrollContainer:
207
-      // If we recently snapped after a momentum scroll, then ignore wheel events
208
-      // to give time for the deceleration to finish. Stop ignoring after 500 msecs
209
-      // or if it's a new scroll (larger delta or inverse sign as last event before
210
-      // an end-of-momentum snap).
211
-      var _newEvent = {
212
-        time: now(),
213
-        delta: Math.abs(delta),
214
-        direction: Math.sign(delta)
215
-      };
216
-      var lastEventBeforeSnap = swiper.mousewheel.lastEventBeforeSnap;
217
-      var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction;
218
-
219
-      if (!ignoreWheelEvents) {
220
-        swiper.mousewheel.lastEventBeforeSnap = undefined;
221
-
222
-        if (swiper.params.loop) {
223
-          swiper.loopFix();
224
-        }
225
-
226
-        var position = swiper.getTranslate() + delta * params.sensitivity;
227
-        var wasBeginning = swiper.isBeginning;
228
-        var wasEnd = swiper.isEnd;
229
-        if (position >= swiper.minTranslate()) position = swiper.minTranslate();
230
-        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
231
-        swiper.setTransition(0);
232
-        swiper.setTranslate(position);
233
-        swiper.updateProgress();
234
-        swiper.updateActiveIndex();
235
-        swiper.updateSlidesClasses();
236
-
237
-        if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
238
-          swiper.updateSlidesClasses();
239
-        }
240
-
241
-        if (swiper.params.freeModeSticky) {
242
-          // When wheel scrolling starts with sticky (aka snap) enabled, then detect
243
-          // the end of a momentum scroll by storing recent (N=15?) wheel events.
244
-          // 1. do all N events have decreasing or same (absolute value) delta?
245
-          // 2. did all N events arrive in the last M (M=500?) msecs?
246
-          // 3. does the earliest event have an (absolute value) delta that's
247
-          //    at least P (P=1?) larger than the most recent event's delta?
248
-          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
249
-          // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
250
-          // Snap immediately and ignore remaining wheel events in this scroll.
251
-          // See comment above for "remaining wheel events in this scroll" determination.
252
-          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
253
-          clearTimeout(swiper.mousewheel.timeout);
254
-          swiper.mousewheel.timeout = undefined;
255
-          var _recentWheelEvents = swiper.mousewheel.recentWheelEvents;
256
-
257
-          if (_recentWheelEvents.length >= 15) {
258
-            _recentWheelEvents.shift(); // only store the last N events
259
-
260
-          }
261
-
262
-          var _prevEvent = _recentWheelEvents.length ? _recentWheelEvents[_recentWheelEvents.length - 1] : undefined;
263
-
264
-          var firstEvent = _recentWheelEvents[0];
265
-
266
-          _recentWheelEvents.push(_newEvent);
267
-
268
-          if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) {
269
-            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
270
-            _recentWheelEvents.splice(0);
271
-          } else if (_recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) {
272
-            // We're at the end of the deceleration of a momentum scroll, so there's no need
273
-            // to wait for more events. Snap ASAP on the next tick.
274
-            // Also, because there's some remaining momentum we'll bias the snap in the
275
-            // direction of the ongoing scroll because it's better UX for the scroll to snap
276
-            // in the same direction as the scroll instead of reversing to snap.  Therefore,
277
-            // if it's already scrolled more than 20% in the current direction, keep going.
278
-            var snapToThreshold = delta > 0 ? 0.8 : 0.2;
279
-            swiper.mousewheel.lastEventBeforeSnap = _newEvent;
280
-
281
-            _recentWheelEvents.splice(0);
282
-
283
-            swiper.mousewheel.timeout = nextTick(function () {
284
-              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
285
-            }, 0); // no delay; move on next tick
286
-          }
287
-
288
-          if (!swiper.mousewheel.timeout) {
289
-            // if we get here, then we haven't detected the end of a momentum scroll, so
290
-            // we'll consider a scroll "complete" when there haven't been any wheel events
291
-            // for 500ms.
292
-            swiper.mousewheel.timeout = nextTick(function () {
293
-              var snapToThreshold = 0.5;
294
-              swiper.mousewheel.lastEventBeforeSnap = _newEvent;
295
-
296
-              _recentWheelEvents.splice(0);
297
-
298
-              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
299
-            }, 500);
300
-          }
301
-        } // Emit event
302
-
303
-
304
-        if (!ignoreWheelEvents) swiper.emit('scroll', e); // Stop autoplay
305
-
306
-        if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions
307
-
308
-        if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;
309
-      }
310
-    }
311
-
312
-    if (e.preventDefault) e.preventDefault();else e.returnValue = false;
313
-    return false;
314
-  },
315
-  animateSlider: function animateSlider(newEvent) {
316
-    var swiper = this;
317
-    var window = getWindow();
318
-
319
-    if (this.params.mousewheel.thresholdDelta && newEvent.delta < this.params.mousewheel.thresholdDelta) {
320
-      // Prevent if delta of wheel scroll delta is below configured threshold
321
-      return false;
322
-    }
323
-
324
-    if (this.params.mousewheel.thresholdTime && now() - swiper.mousewheel.lastScrollTime < this.params.mousewheel.thresholdTime) {
325
-      // Prevent if time between scrolls is below configured threshold
326
-      return false;
327
-    } // If the movement is NOT big enough and
328
-    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
329
-    //   Don't go any further (avoid insignificant scroll movement).
330
-
331
-
332
-    if (newEvent.delta >= 6 && now() - swiper.mousewheel.lastScrollTime < 60) {
333
-      // Return false as a default
334
-      return true;
335
-    } // If user is scrolling towards the end:
336
-    //   If the slider hasn't hit the latest slide or
337
-    //   if the slider is a loop and
338
-    //   if the slider isn't moving right now:
339
-    //     Go to next slide and
340
-    //     emit a scroll event.
341
-    // Else (the user is scrolling towards the beginning) and
342
-    // if the slider hasn't hit the first slide or
343
-    // if the slider is a loop and
344
-    // if the slider isn't moving right now:
345
-    //   Go to prev slide and
346
-    //   emit a scroll event.
347
-
348
-
349
-    if (newEvent.direction < 0) {
350
-      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
351
-        swiper.slideNext();
352
-        swiper.emit('scroll', newEvent.raw);
353
-      }
354
-    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
355
-      swiper.slidePrev();
356
-      swiper.emit('scroll', newEvent.raw);
357
-    } // If you got here is because an animation has been triggered so store the current time
358
-
359
-
360
-    swiper.mousewheel.lastScrollTime = new window.Date().getTime(); // Return false as a default
361
-
362
-    return false;
363
-  },
364
-  releaseScroll: function releaseScroll(newEvent) {
365
-    var swiper = this;
366
-    var params = swiper.params.mousewheel;
367
-
368
-    if (newEvent.direction < 0) {
369
-      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
370
-        // Return true to animate scroll on edges
371
-        return true;
372
-      }
373
-    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
374
-      // Return true to animate scroll on edges
375
-      return true;
376
-    }
377
-
378
-    return false;
379
-  },
380
-  enable: function enable() {
381
-    var swiper = this;
382
-    var event = Mousewheel.event();
383
-
384
-    if (swiper.params.cssMode) {
385
-      swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
386
-      return true;
387
-    }
388
-
389
-    if (!event) return false;
390
-    if (swiper.mousewheel.enabled) return false;
391
-    var target = swiper.$el;
392
-
393
-    if (swiper.params.mousewheel.eventsTarget !== 'container') {
394
-      target = $(swiper.params.mousewheel.eventsTarget);
395
-    }
396
-
397
-    target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
398
-    target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
399
-    target.on(event, swiper.mousewheel.handle);
400
-    swiper.mousewheel.enabled = true;
401
-    return true;
402
-  },
403
-  disable: function disable() {
404
-    var swiper = this;
405
-    var event = Mousewheel.event();
406
-
407
-    if (swiper.params.cssMode) {
408
-      swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
409
-      return true;
410
-    }
411
-
412
-    if (!event) return false;
413
-    if (!swiper.mousewheel.enabled) return false;
414
-    var target = swiper.$el;
415
-
416
-    if (swiper.params.mousewheel.eventsTarget !== 'container') {
417
-      target = $(swiper.params.mousewheel.eventsTarget);
418
-    }
419
-
420
-    target.off(event, swiper.mousewheel.handle);
421
-    swiper.mousewheel.enabled = false;
422
-    return true;
423
-  }
424
-};
425
-export default {
426
-  name: 'mousewheel',
427
-  params: {
428
-    mousewheel: {
429
-      enabled: false,
430
-      releaseOnEdges: false,
431
-      invert: false,
432
-      forceToAxis: false,
433
-      sensitivity: 1,
434
-      eventsTarget: 'container',
435
-      thresholdDelta: null,
436
-      thresholdTime: null
437
-    }
438
-  },
439
-  create: function create() {
440
-    var swiper = this;
441
-    bindModuleMethods(swiper, {
442
-      mousewheel: {
443
-        enabled: false,
444
-        lastScrollTime: now(),
445
-        lastEventBeforeSnap: undefined,
446
-        recentWheelEvents: [],
447
-        enable: Mousewheel.enable,
448
-        disable: Mousewheel.disable,
449
-        handle: Mousewheel.handle,
450
-        handleMouseEnter: Mousewheel.handleMouseEnter,
451
-        handleMouseLeave: Mousewheel.handleMouseLeave,
452
-        animateSlider: Mousewheel.animateSlider,
453
-        releaseScroll: Mousewheel.releaseScroll
454
-      }
455
-    });
456
-  },
457
-  on: {
458
-    init: function init(swiper) {
459
-      if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
460
-        swiper.mousewheel.disable();
461
-      }
462
-
463
-      if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable();
464
-    },
465
-    destroy: function destroy(swiper) {
466
-      if (swiper.params.cssMode) {
467
-        swiper.mousewheel.enable();
468
-      }
469
-
470
-      if (swiper.mousewheel.enabled) swiper.mousewheel.disable();
471
-    }
472
-  }
473
-};
474 0
\ No newline at end of file
Browse code

swiper.js version 6.5.0

Benjamin Roth authored on14/03/2021 15:29:46
Showing1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,473 @@
1
+import { getWindow, getDocument } from 'ssr-window';
2
+import $ from '../../utils/dom';
3
+import { now, nextTick, bindModuleMethods } from '../../utils/utils';
4
+
5
+function isEventSupported() {
6
+  var document = getDocument();
7
+  var eventName = 'onwheel';
8
+  var isSupported = (eventName in document);
9
+
10
+  if (!isSupported) {
11
+    var element = document.createElement('div');
12
+    element.setAttribute(eventName, 'return;');
13
+    isSupported = typeof element[eventName] === 'function';
14
+  }
15
+
16
+  if (!isSupported && document.implementation && document.implementation.hasFeature && // always returns true in newer browsers as per the standard.
17
+  // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
18
+  document.implementation.hasFeature('', '') !== true) {
19
+    // This is the only way to test support for the `wheel` event in IE9+.
20
+    isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
21
+  }
22
+
23
+  return isSupported;
24
+}
25
+
26
+var Mousewheel = {
27
+  lastScrollTime: now(),
28
+  lastEventBeforeSnap: undefined,
29
+  recentWheelEvents: [],
30
+  event: function event() {
31
+    var window = getWindow();
32
+    if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll';
33
+    return isEventSupported() ? 'wheel' : 'mousewheel';
34
+  },
35
+  normalize: function normalize(e) {
36
+    // Reasonable defaults
37
+    var PIXEL_STEP = 10;
38
+    var LINE_HEIGHT = 40;
39
+    var PAGE_HEIGHT = 800;
40
+    var sX = 0;
41
+    var sY = 0; // spinX, spinY
42
+
43
+    var pX = 0;
44
+    var pY = 0; // pixelX, pixelY
45
+    // Legacy
46
+
47
+    if ('detail' in e) {
48
+      sY = e.detail;
49
+    }
50
+
51
+    if ('wheelDelta' in e) {
52
+      sY = -e.wheelDelta / 120;
53
+    }
54
+
55
+    if ('wheelDeltaY' in e) {
56
+      sY = -e.wheelDeltaY / 120;
57
+    }
58
+
59
+    if ('wheelDeltaX' in e) {
60
+      sX = -e.wheelDeltaX / 120;
61
+    } // side scrolling on FF with DOMMouseScroll
62
+
63
+
64
+    if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
65
+      sX = sY;
66
+      sY = 0;
67
+    }
68
+
69
+    pX = sX * PIXEL_STEP;
70
+    pY = sY * PIXEL_STEP;
71
+
72
+    if ('deltaY' in e) {
73
+      pY = e.deltaY;
74
+    }
75
+
76
+    if ('deltaX' in e) {
77
+      pX = e.deltaX;
78
+    }
79
+
80
+    if (e.shiftKey && !pX) {
81
+      // if user scrolls with shift he wants horizontal scroll
82
+      pX = pY;
83
+      pY = 0;
84
+    }
85
+
86
+    if ((pX || pY) && e.deltaMode) {
87
+      if (e.deltaMode === 1) {
88
+        // delta in LINE units
89
+        pX *= LINE_HEIGHT;
90
+        pY *= LINE_HEIGHT;
91
+      } else {
92
+        // delta in PAGE units
93
+        pX *= PAGE_HEIGHT;
94
+        pY *= PAGE_HEIGHT;
95
+      }
96
+    } // Fall-back if spin cannot be determined
97
+
98
+
99
+    if (pX && !sX) {
100
+      sX = pX < 1 ? -1 : 1;
101
+    }
102
+
103
+    if (pY && !sY) {
104
+      sY = pY < 1 ? -1 : 1;
105
+    }
106
+
107
+    return {
108
+      spinX: sX,
109
+      spinY: sY,
110
+      pixelX: pX,
111
+      pixelY: pY
112
+    };
113
+  },
114
+  handleMouseEnter: function handleMouseEnter() {
115
+    var swiper = this;
116
+    swiper.mouseEntered = true;
117
+  },
118
+  handleMouseLeave: function handleMouseLeave() {
119
+    var swiper = this;
120
+    swiper.mouseEntered = false;
121
+  },
122
+  handle: function handle(event) {
123
+    var e = event;
124
+    var disableParentSwiper = true;
125
+    var swiper = this;
126
+    var params = swiper.params.mousewheel;
127
+
128
+    if (swiper.params.cssMode) {
129
+      e.preventDefault();
130
+    }
131
+
132
+    var target = swiper.$el;
133
+
134
+    if (swiper.params.mousewheel.eventsTarget !== 'container') {
135
+      target = $(swiper.params.mousewheel.eventsTarget);
136
+    }
137
+
138
+    if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true;
139
+    if (e.originalEvent) e = e.originalEvent; // jquery fix
140
+
141
+    var delta = 0;
142
+    var rtlFactor = swiper.rtlTranslate ? -1 : 1;
143
+    var data = Mousewheel.normalize(e);
144
+
145
+    if (params.forceToAxis) {
146
+      if (swiper.isHorizontal()) {
147
+        if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
148
+      } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
149
+    } else {
150
+      delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
151
+    }
152
+
153
+    if (delta === 0) return true;
154
+    if (params.invert) delta = -delta; // Get the scroll positions
155
+
156
+    var positions = swiper.getTranslate() + delta * params.sensitivity;
157
+    if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
158
+    if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true:
159
+    //     the disableParentSwiper will be true.
160
+    // When loop is false:
161
+    //     if the scroll positions is not on edge,
162
+    //     then the disableParentSwiper will be true.
163
+    //     if the scroll on edge positions,
164
+    //     then the disableParentSwiper will be false.
165
+
166
+    disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
167
+    if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
168
+
169
+    if (!swiper.params.freeMode) {
170
+      // Register the new event in a variable which stores the relevant data
171
+      var newEvent = {
172
+        time: now(),
173
+        delta: Math.abs(delta),
174
+        direction: Math.sign(delta),
175
+        raw: event
176
+      }; // Keep the most recent events
177
+
178
+      var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
179
+
180
+      if (recentWheelEvents.length >= 2) {
181
+        recentWheelEvents.shift(); // only store the last N events
182
+      }
183
+
184
+      var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
185
+      recentWheelEvents.push(newEvent); // If there is at least one previous recorded event:
186
+      //   If direction has changed or
187
+      //   if the scroll is quicker than the previous one:
188
+      //     Animate the slider.
189
+      // Else (this is the first time the wheel is moved):
190
+      //     Animate the slider.
191
+
192
+      if (prevEvent) {
193
+        if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
194
+          swiper.mousewheel.animateSlider(newEvent);
195
+        }
196
+      } else {
197
+        swiper.mousewheel.animateSlider(newEvent);
198
+      } // If it's time to release the scroll:
199
+      //   Return now so you don't hit the preventDefault.
200
+
201
+
202
+      if (swiper.mousewheel.releaseScroll(newEvent)) {
203
+        return true;
204
+      }
205
+    } else {
206
+      // Freemode or scrollContainer:
207
+      // If we recently snapped after a momentum scroll, then ignore wheel events
208
+      // to give time for the deceleration to finish. Stop ignoring after 500 msecs
209
+      // or if it's a new scroll (larger delta or inverse sign as last event before
210
+      // an end-of-momentum snap).
211
+      var _newEvent = {
212
+        time: now(),
213
+        delta: Math.abs(delta),
214
+        direction: Math.sign(delta)
215
+      };
216
+      var lastEventBeforeSnap = swiper.mousewheel.lastEventBeforeSnap;
217
+      var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction;
218
+
219
+      if (!ignoreWheelEvents) {
220
+        swiper.mousewheel.lastEventBeforeSnap = undefined;
221
+
222
+        if (swiper.params.loop) {
223
+          swiper.loopFix();
224
+        }
225
+
226
+        var position = swiper.getTranslate() + delta * params.sensitivity;
227
+        var wasBeginning = swiper.isBeginning;
228
+        var wasEnd = swiper.isEnd;
229
+        if (position >= swiper.minTranslate()) position = swiper.minTranslate();
230
+        if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
231
+        swiper.setTransition(0);
232
+        swiper.setTranslate(position);
233
+        swiper.updateProgress();
234
+        swiper.updateActiveIndex();
235
+        swiper.updateSlidesClasses();
236
+
237
+        if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
238
+          swiper.updateSlidesClasses();
239
+        }
240
+
241
+        if (swiper.params.freeModeSticky) {
242
+          // When wheel scrolling starts with sticky (aka snap) enabled, then detect
243
+          // the end of a momentum scroll by storing recent (N=15?) wheel events.
244
+          // 1. do all N events have decreasing or same (absolute value) delta?
245
+          // 2. did all N events arrive in the last M (M=500?) msecs?
246
+          // 3. does the earliest event have an (absolute value) delta that's
247
+          //    at least P (P=1?) larger than the most recent event's delta?
248
+          // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
249
+          // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
250
+          // Snap immediately and ignore remaining wheel events in this scroll.
251
+          // See comment above for "remaining wheel events in this scroll" determination.
252
+          // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
253
+          clearTimeout(swiper.mousewheel.timeout);
254
+          swiper.mousewheel.timeout = undefined;
255
+          var _recentWheelEvents = swiper.mousewheel.recentWheelEvents;
256
+
257
+          if (_recentWheelEvents.length >= 15) {
258
+            _recentWheelEvents.shift(); // only store the last N events
259
+
260
+          }
261
+
262
+          var _prevEvent = _recentWheelEvents.length ? _recentWheelEvents[_recentWheelEvents.length - 1] : undefined;
263
+
264
+          var firstEvent = _recentWheelEvents[0];
265
+
266
+          _recentWheelEvents.push(_newEvent);
267
+
268
+          if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) {
269
+            // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
270
+            _recentWheelEvents.splice(0);
271
+          } else if (_recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) {
272
+            // We're at the end of the deceleration of a momentum scroll, so there's no need
273
+            // to wait for more events. Snap ASAP on the next tick.
274
+            // Also, because there's some remaining momentum we'll bias the snap in the
275
+            // direction of the ongoing scroll because it's better UX for the scroll to snap
276
+            // in the same direction as the scroll instead of reversing to snap.  Therefore,
277
+            // if it's already scrolled more than 20% in the current direction, keep going.
278
+            var snapToThreshold = delta > 0 ? 0.8 : 0.2;
279
+            swiper.mousewheel.lastEventBeforeSnap = _newEvent;
280
+
281
+            _recentWheelEvents.splice(0);
282
+
283
+            swiper.mousewheel.timeout = nextTick(function () {
284
+              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
285
+            }, 0); // no delay; move on next tick
286
+          }
287
+
288
+          if (!swiper.mousewheel.timeout) {
289
+            // if we get here, then we haven't detected the end of a momentum scroll, so
290
+            // we'll consider a scroll "complete" when there haven't been any wheel events
291
+            // for 500ms.
292
+            swiper.mousewheel.timeout = nextTick(function () {
293
+              var snapToThreshold = 0.5;
294
+              swiper.mousewheel.lastEventBeforeSnap = _newEvent;
295
+
296
+              _recentWheelEvents.splice(0);
297
+
298
+              swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
299
+            }, 500);
300
+          }
301
+        } // Emit event
302
+
303
+
304
+        if (!ignoreWheelEvents) swiper.emit('scroll', e); // Stop autoplay
305
+
306
+        if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions
307
+
308
+        if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;
309
+      }
310
+    }
311
+
312
+    if (e.preventDefault) e.preventDefault();else e.returnValue = false;
313
+    return false;
314
+  },
315
+  animateSlider: function animateSlider(newEvent) {
316
+    var swiper = this;
317
+    var window = getWindow();
318
+
319
+    if (this.params.mousewheel.thresholdDelta && newEvent.delta < this.params.mousewheel.thresholdDelta) {
320
+      // Prevent if delta of wheel scroll delta is below configured threshold
321
+      return false;
322
+    }
323
+
324
+    if (this.params.mousewheel.thresholdTime && now() - swiper.mousewheel.lastScrollTime < this.params.mousewheel.thresholdTime) {
325
+      // Prevent if time between scrolls is below configured threshold
326
+      return false;
327
+    } // If the movement is NOT big enough and
328
+    // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
329
+    //   Don't go any further (avoid insignificant scroll movement).
330
+
331
+
332
+    if (newEvent.delta >= 6 && now() - swiper.mousewheel.lastScrollTime < 60) {
333
+      // Return false as a default
334
+      return true;
335
+    } // If user is scrolling towards the end:
336
+    //   If the slider hasn't hit the latest slide or
337
+    //   if the slider is a loop and
338
+    //   if the slider isn't moving right now:
339
+    //     Go to next slide and
340
+    //     emit a scroll event.
341
+    // Else (the user is scrolling towards the beginning) and
342
+    // if the slider hasn't hit the first slide or
343
+    // if the slider is a loop and
344
+    // if the slider isn't moving right now:
345
+    //   Go to prev slide and
346
+    //   emit a scroll event.
347
+
348
+
349
+    if (newEvent.direction < 0) {
350
+      if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
351
+        swiper.slideNext();
352
+        swiper.emit('scroll', newEvent.raw);
353
+      }
354
+    } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
355
+      swiper.slidePrev();
356
+      swiper.emit('scroll', newEvent.raw);
357
+    } // If you got here is because an animation has been triggered so store the current time
358
+
359
+
360
+    swiper.mousewheel.lastScrollTime = new window.Date().getTime(); // Return false as a default
361
+
362
+    return false;
363
+  },
364
+  releaseScroll: function releaseScroll(newEvent) {
365
+    var swiper = this;
366
+    var params = swiper.params.mousewheel;
367
+
368
+    if (newEvent.direction < 0) {
369
+      if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
370
+        // Return true to animate scroll on edges
371
+        return true;
372
+      }
373
+    } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
374
+      // Return true to animate scroll on edges
375
+      return true;
376
+    }
377
+
378
+    return false;
379
+  },
380
+  enable: function enable() {
381
+    var swiper = this;
382
+    var event = Mousewheel.event();
383
+
384
+    if (swiper.params.cssMode) {
385
+      swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
386
+      return true;
387
+    }
388
+
389
+    if (!event) return false;
390
+    if (swiper.mousewheel.enabled) return false;
391
+    var target = swiper.$el;
392
+
393
+    if (swiper.params.mousewheel.eventsTarget !== 'container') {
394
+      target = $(swiper.params.mousewheel.eventsTarget);
395
+    }
396
+
397
+    target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
398
+    target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
399
+    target.on(event, swiper.mousewheel.handle);
400
+    swiper.mousewheel.enabled = true;
401
+    return true;
402
+  },
403
+  disable: function disable() {
404
+    var swiper = this;
405
+    var event = Mousewheel.event();
406
+
407
+    if (swiper.params.cssMode) {
408
+      swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
409
+      return true;
410
+    }
411
+
412
+    if (!event) return false;
413
+    if (!swiper.mousewheel.enabled) return false;
414
+    var target = swiper.$el;
415
+
416
+    if (swiper.params.mousewheel.eventsTarget !== 'container') {
417
+      target = $(swiper.params.mousewheel.eventsTarget);
418
+    }
419
+
420
+    target.off(event, swiper.mousewheel.handle);
421
+    swiper.mousewheel.enabled = false;
422
+    return true;
423
+  }
424
+};
425
+export default {
426
+  name: 'mousewheel',
427
+  params: {
428
+    mousewheel: {
429
+      enabled: false,
430
+      releaseOnEdges: false,
431
+      invert: false,
432
+      forceToAxis: false,
433
+      sensitivity: 1,
434
+      eventsTarget: 'container',
435
+      thresholdDelta: null,
436
+      thresholdTime: null
437
+    }
438
+  },
439
+  create: function create() {
440
+    var swiper = this;
441
+    bindModuleMethods(swiper, {
442
+      mousewheel: {
443
+        enabled: false,
444
+        lastScrollTime: now(),
445
+        lastEventBeforeSnap: undefined,
446
+        recentWheelEvents: [],
447
+        enable: Mousewheel.enable,
448
+        disable: Mousewheel.disable,
449
+        handle: Mousewheel.handle,
450
+        handleMouseEnter: Mousewheel.handleMouseEnter,
451
+        handleMouseLeave: Mousewheel.handleMouseLeave,
452
+        animateSlider: Mousewheel.animateSlider,
453
+        releaseScroll: Mousewheel.releaseScroll
454
+      }
455
+    });
456
+  },
457
+  on: {
458
+    init: function init(swiper) {
459
+      if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
460
+        swiper.mousewheel.disable();
461
+      }
462
+
463
+      if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable();
464
+    },
465
+    destroy: function destroy(swiper) {
466
+      if (swiper.params.cssMode) {
467
+        swiper.mousewheel.enable();
468
+      }
469
+
470
+      if (swiper.mousewheel.enabled) swiper.mousewheel.disable();
471
+    }
472
+  }
473
+};
0 474
\ No newline at end of file