UNPKG

299 kBJavaScriptView Raw
1/**
2 * Swiper 6.5.6
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * https://swiperjs.com
5 *
6 * Copyright 2014-2021 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: April 9, 2021
11 */
12
13function _defineProperties(target, props) {
14 for (var i = 0; i < props.length; i++) {
15 var descriptor = props[i];
16 descriptor.enumerable = descriptor.enumerable || false;
17 descriptor.configurable = true;
18 if ("value" in descriptor) descriptor.writable = true;
19 Object.defineProperty(target, descriptor.key, descriptor);
20 }
21}
22
23function _createClass(Constructor, protoProps, staticProps) {
24 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
25 if (staticProps) _defineProperties(Constructor, staticProps);
26 return Constructor;
27}
28
29function _extends() {
30 _extends = Object.assign || function (target) {
31 for (var i = 1; i < arguments.length; i++) {
32 var source = arguments[i];
33
34 for (var key in source) {
35 if (Object.prototype.hasOwnProperty.call(source, key)) {
36 target[key] = source[key];
37 }
38 }
39 }
40
41 return target;
42 };
43
44 return _extends.apply(this, arguments);
45}
46
47/**
48 * SSR Window 3.0.0
49 * Better handling for window object in SSR environment
50 * https://github.com/nolimits4web/ssr-window
51 *
52 * Copyright 2020, Vladimir Kharlampidi
53 *
54 * Licensed under MIT
55 *
56 * Released on: November 9, 2020
57 */
58
59/* eslint-disable no-param-reassign */
60function isObject$1(obj) {
61 return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
62}
63
64function extend$1(target, src) {
65 if (target === void 0) {
66 target = {};
67 }
68
69 if (src === void 0) {
70 src = {};
71 }
72
73 Object.keys(src).forEach(function (key) {
74 if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) {
75 extend$1(target[key], src[key]);
76 }
77 });
78}
79
80var ssrDocument = {
81 body: {},
82 addEventListener: function addEventListener() {},
83 removeEventListener: function removeEventListener() {},
84 activeElement: {
85 blur: function blur() {},
86 nodeName: ''
87 },
88 querySelector: function querySelector() {
89 return null;
90 },
91 querySelectorAll: function querySelectorAll() {
92 return [];
93 },
94 getElementById: function getElementById() {
95 return null;
96 },
97 createEvent: function createEvent() {
98 return {
99 initEvent: function initEvent() {}
100 };
101 },
102 createElement: function createElement() {
103 return {
104 children: [],
105 childNodes: [],
106 style: {},
107 setAttribute: function setAttribute() {},
108 getElementsByTagName: function getElementsByTagName() {
109 return [];
110 }
111 };
112 },
113 createElementNS: function createElementNS() {
114 return {};
115 },
116 importNode: function importNode() {
117 return null;
118 },
119 location: {
120 hash: '',
121 host: '',
122 hostname: '',
123 href: '',
124 origin: '',
125 pathname: '',
126 protocol: '',
127 search: ''
128 }
129};
130
131function getDocument() {
132 var doc = typeof document !== 'undefined' ? document : {};
133 extend$1(doc, ssrDocument);
134 return doc;
135}
136
137var ssrWindow = {
138 document: ssrDocument,
139 navigator: {
140 userAgent: ''
141 },
142 location: {
143 hash: '',
144 host: '',
145 hostname: '',
146 href: '',
147 origin: '',
148 pathname: '',
149 protocol: '',
150 search: ''
151 },
152 history: {
153 replaceState: function replaceState() {},
154 pushState: function pushState() {},
155 go: function go() {},
156 back: function back() {}
157 },
158 CustomEvent: function CustomEvent() {
159 return this;
160 },
161 addEventListener: function addEventListener() {},
162 removeEventListener: function removeEventListener() {},
163 getComputedStyle: function getComputedStyle() {
164 return {
165 getPropertyValue: function getPropertyValue() {
166 return '';
167 }
168 };
169 },
170 Image: function Image() {},
171 Date: function Date() {},
172 screen: {},
173 setTimeout: function setTimeout() {},
174 clearTimeout: function clearTimeout() {},
175 matchMedia: function matchMedia() {
176 return {};
177 },
178 requestAnimationFrame: function requestAnimationFrame(callback) {
179 if (typeof setTimeout === 'undefined') {
180 callback();
181 return null;
182 }
183
184 return setTimeout(callback, 0);
185 },
186 cancelAnimationFrame: function cancelAnimationFrame(id) {
187 if (typeof setTimeout === 'undefined') {
188 return;
189 }
190
191 clearTimeout(id);
192 }
193};
194
195function getWindow() {
196 var win = typeof window !== 'undefined' ? window : {};
197 extend$1(win, ssrWindow);
198 return win;
199}
200
201/**
202 * Dom7 3.0.0
203 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
204 * https://framework7.io/docs/dom7.html
205 *
206 * Copyright 2020, Vladimir Kharlampidi
207 *
208 * Licensed under MIT
209 *
210 * Released on: November 9, 2020
211 */
212
213function _inheritsLoose(subClass, superClass) {
214 subClass.prototype = Object.create(superClass.prototype);
215 subClass.prototype.constructor = subClass;
216 subClass.__proto__ = superClass;
217}
218
219function _getPrototypeOf(o) {
220 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
221 return o.__proto__ || Object.getPrototypeOf(o);
222 };
223 return _getPrototypeOf(o);
224}
225
226function _setPrototypeOf(o, p) {
227 _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
228 o.__proto__ = p;
229 return o;
230 };
231
232 return _setPrototypeOf(o, p);
233}
234
235function _isNativeReflectConstruct() {
236 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
237 if (Reflect.construct.sham) return false;
238 if (typeof Proxy === "function") return true;
239
240 try {
241 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
242 return true;
243 } catch (e) {
244 return false;
245 }
246}
247
248function _construct(Parent, args, Class) {
249 if (_isNativeReflectConstruct()) {
250 _construct = Reflect.construct;
251 } else {
252 _construct = function _construct(Parent, args, Class) {
253 var a = [null];
254 a.push.apply(a, args);
255 var Constructor = Function.bind.apply(Parent, a);
256 var instance = new Constructor();
257 if (Class) _setPrototypeOf(instance, Class.prototype);
258 return instance;
259 };
260 }
261
262 return _construct.apply(null, arguments);
263}
264
265function _isNativeFunction(fn) {
266 return Function.toString.call(fn).indexOf("[native code]") !== -1;
267}
268
269function _wrapNativeSuper(Class) {
270 var _cache = typeof Map === "function" ? new Map() : undefined;
271
272 _wrapNativeSuper = function _wrapNativeSuper(Class) {
273 if (Class === null || !_isNativeFunction(Class)) return Class;
274
275 if (typeof Class !== "function") {
276 throw new TypeError("Super expression must either be null or a function");
277 }
278
279 if (typeof _cache !== "undefined") {
280 if (_cache.has(Class)) return _cache.get(Class);
281
282 _cache.set(Class, Wrapper);
283 }
284
285 function Wrapper() {
286 return _construct(Class, arguments, _getPrototypeOf(this).constructor);
287 }
288
289 Wrapper.prototype = Object.create(Class.prototype, {
290 constructor: {
291 value: Wrapper,
292 enumerable: false,
293 writable: true,
294 configurable: true
295 }
296 });
297 return _setPrototypeOf(Wrapper, Class);
298 };
299
300 return _wrapNativeSuper(Class);
301}
302
303function _assertThisInitialized(self) {
304 if (self === void 0) {
305 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
306 }
307
308 return self;
309}
310/* eslint-disable no-proto */
311
312
313function makeReactive(obj) {
314 var proto = obj.__proto__;
315 Object.defineProperty(obj, '__proto__', {
316 get: function get() {
317 return proto;
318 },
319 set: function set(value) {
320 proto.__proto__ = value;
321 }
322 });
323}
324
325var Dom7 = /*#__PURE__*/function (_Array) {
326 _inheritsLoose(Dom7, _Array);
327
328 function Dom7(items) {
329 var _this;
330
331 _this = _Array.call.apply(_Array, [this].concat(items)) || this;
332 makeReactive(_assertThisInitialized(_this));
333 return _this;
334 }
335
336 return Dom7;
337}( /*#__PURE__*/_wrapNativeSuper(Array));
338
339function arrayFlat(arr) {
340 if (arr === void 0) {
341 arr = [];
342 }
343
344 var res = [];
345 arr.forEach(function (el) {
346 if (Array.isArray(el)) {
347 res.push.apply(res, arrayFlat(el));
348 } else {
349 res.push(el);
350 }
351 });
352 return res;
353}
354
355function arrayFilter(arr, callback) {
356 return Array.prototype.filter.call(arr, callback);
357}
358
359function arrayUnique(arr) {
360 var uniqueArray = [];
361
362 for (var i = 0; i < arr.length; i += 1) {
363 if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);
364 }
365
366 return uniqueArray;
367}
368
369function qsa(selector, context) {
370 if (typeof selector !== 'string') {
371 return [selector];
372 }
373
374 var a = [];
375 var res = context.querySelectorAll(selector);
376
377 for (var i = 0; i < res.length; i += 1) {
378 a.push(res[i]);
379 }
380
381 return a;
382}
383
384function $(selector, context) {
385 var window = getWindow();
386 var document = getDocument();
387 var arr = [];
388
389 if (!context && selector instanceof Dom7) {
390 return selector;
391 }
392
393 if (!selector) {
394 return new Dom7(arr);
395 }
396
397 if (typeof selector === 'string') {
398 var html = selector.trim();
399
400 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
401 var toCreate = 'div';
402 if (html.indexOf('<li') === 0) toCreate = 'ul';
403 if (html.indexOf('<tr') === 0) toCreate = 'tbody';
404 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';
405 if (html.indexOf('<tbody') === 0) toCreate = 'table';
406 if (html.indexOf('<option') === 0) toCreate = 'select';
407 var tempParent = document.createElement(toCreate);
408 tempParent.innerHTML = html;
409
410 for (var i = 0; i < tempParent.childNodes.length; i += 1) {
411 arr.push(tempParent.childNodes[i]);
412 }
413 } else {
414 arr = qsa(selector.trim(), context || document);
415 } // arr = qsa(selector, document);
416
417 } else if (selector.nodeType || selector === window || selector === document) {
418 arr.push(selector);
419 } else if (Array.isArray(selector)) {
420 if (selector instanceof Dom7) return selector;
421 arr = selector;
422 }
423
424 return new Dom7(arrayUnique(arr));
425}
426
427$.fn = Dom7.prototype;
428
429function addClass() {
430 for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {
431 classes[_key] = arguments[_key];
432 }
433
434 var classNames = arrayFlat(classes.map(function (c) {
435 return c.split(' ');
436 }));
437 this.forEach(function (el) {
438 var _el$classList;
439
440 (_el$classList = el.classList).add.apply(_el$classList, classNames);
441 });
442 return this;
443}
444
445function removeClass() {
446 for (var _len2 = arguments.length, classes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
447 classes[_key2] = arguments[_key2];
448 }
449
450 var classNames = arrayFlat(classes.map(function (c) {
451 return c.split(' ');
452 }));
453 this.forEach(function (el) {
454 var _el$classList2;
455
456 (_el$classList2 = el.classList).remove.apply(_el$classList2, classNames);
457 });
458 return this;
459}
460
461function toggleClass() {
462 for (var _len3 = arguments.length, classes = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
463 classes[_key3] = arguments[_key3];
464 }
465
466 var classNames = arrayFlat(classes.map(function (c) {
467 return c.split(' ');
468 }));
469 this.forEach(function (el) {
470 classNames.forEach(function (className) {
471 el.classList.toggle(className);
472 });
473 });
474}
475
476function hasClass() {
477 for (var _len4 = arguments.length, classes = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
478 classes[_key4] = arguments[_key4];
479 }
480
481 var classNames = arrayFlat(classes.map(function (c) {
482 return c.split(' ');
483 }));
484 return arrayFilter(this, function (el) {
485 return classNames.filter(function (className) {
486 return el.classList.contains(className);
487 }).length > 0;
488 }).length > 0;
489}
490
491function attr(attrs, value) {
492 if (arguments.length === 1 && typeof attrs === 'string') {
493 // Get attr
494 if (this[0]) return this[0].getAttribute(attrs);
495 return undefined;
496 } // Set attrs
497
498
499 for (var i = 0; i < this.length; i += 1) {
500 if (arguments.length === 2) {
501 // String
502 this[i].setAttribute(attrs, value);
503 } else {
504 // Object
505 for (var attrName in attrs) {
506 this[i][attrName] = attrs[attrName];
507 this[i].setAttribute(attrName, attrs[attrName]);
508 }
509 }
510 }
511
512 return this;
513}
514
515function removeAttr(attr) {
516 for (var i = 0; i < this.length; i += 1) {
517 this[i].removeAttribute(attr);
518 }
519
520 return this;
521}
522
523function transform(transform) {
524 for (var i = 0; i < this.length; i += 1) {
525 this[i].style.transform = transform;
526 }
527
528 return this;
529}
530
531function transition$1(duration) {
532 for (var i = 0; i < this.length; i += 1) {
533 this[i].style.transitionDuration = typeof duration !== 'string' ? duration + "ms" : duration;
534 }
535
536 return this;
537}
538
539function on() {
540 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
541 args[_key5] = arguments[_key5];
542 }
543
544 var eventType = args[0],
545 targetSelector = args[1],
546 listener = args[2],
547 capture = args[3];
548
549 if (typeof args[1] === 'function') {
550 eventType = args[0];
551 listener = args[1];
552 capture = args[2];
553 targetSelector = undefined;
554 }
555
556 if (!capture) capture = false;
557
558 function handleLiveEvent(e) {
559 var target = e.target;
560 if (!target) return;
561 var eventData = e.target.dom7EventData || [];
562
563 if (eventData.indexOf(e) < 0) {
564 eventData.unshift(e);
565 }
566
567 if ($(target).is(targetSelector)) listener.apply(target, eventData);else {
568 var _parents = $(target).parents(); // eslint-disable-line
569
570
571 for (var k = 0; k < _parents.length; k += 1) {
572 if ($(_parents[k]).is(targetSelector)) listener.apply(_parents[k], eventData);
573 }
574 }
575 }
576
577 function handleEvent(e) {
578 var eventData = e && e.target ? e.target.dom7EventData || [] : [];
579
580 if (eventData.indexOf(e) < 0) {
581 eventData.unshift(e);
582 }
583
584 listener.apply(this, eventData);
585 }
586
587 var events = eventType.split(' ');
588 var j;
589
590 for (var i = 0; i < this.length; i += 1) {
591 var el = this[i];
592
593 if (!targetSelector) {
594 for (j = 0; j < events.length; j += 1) {
595 var event = events[j];
596 if (!el.dom7Listeners) el.dom7Listeners = {};
597 if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];
598 el.dom7Listeners[event].push({
599 listener: listener,
600 proxyListener: handleEvent
601 });
602 el.addEventListener(event, handleEvent, capture);
603 }
604 } else {
605 // Live events
606 for (j = 0; j < events.length; j += 1) {
607 var _event = events[j];
608 if (!el.dom7LiveListeners) el.dom7LiveListeners = {};
609 if (!el.dom7LiveListeners[_event]) el.dom7LiveListeners[_event] = [];
610
611 el.dom7LiveListeners[_event].push({
612 listener: listener,
613 proxyListener: handleLiveEvent
614 });
615
616 el.addEventListener(_event, handleLiveEvent, capture);
617 }
618 }
619 }
620
621 return this;
622}
623
624function off() {
625 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
626 args[_key6] = arguments[_key6];
627 }
628
629 var eventType = args[0],
630 targetSelector = args[1],
631 listener = args[2],
632 capture = args[3];
633
634 if (typeof args[1] === 'function') {
635 eventType = args[0];
636 listener = args[1];
637 capture = args[2];
638 targetSelector = undefined;
639 }
640
641 if (!capture) capture = false;
642 var events = eventType.split(' ');
643
644 for (var i = 0; i < events.length; i += 1) {
645 var event = events[i];
646
647 for (var j = 0; j < this.length; j += 1) {
648 var el = this[j];
649 var handlers = void 0;
650
651 if (!targetSelector && el.dom7Listeners) {
652 handlers = el.dom7Listeners[event];
653 } else if (targetSelector && el.dom7LiveListeners) {
654 handlers = el.dom7LiveListeners[event];
655 }
656
657 if (handlers && handlers.length) {
658 for (var k = handlers.length - 1; k >= 0; k -= 1) {
659 var handler = handlers[k];
660
661 if (listener && handler.listener === listener) {
662 el.removeEventListener(event, handler.proxyListener, capture);
663 handlers.splice(k, 1);
664 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
665 el.removeEventListener(event, handler.proxyListener, capture);
666 handlers.splice(k, 1);
667 } else if (!listener) {
668 el.removeEventListener(event, handler.proxyListener, capture);
669 handlers.splice(k, 1);
670 }
671 }
672 }
673 }
674 }
675
676 return this;
677}
678
679function trigger() {
680 var window = getWindow();
681
682 for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
683 args[_key9] = arguments[_key9];
684 }
685
686 var events = args[0].split(' ');
687 var eventData = args[1];
688
689 for (var i = 0; i < events.length; i += 1) {
690 var event = events[i];
691
692 for (var j = 0; j < this.length; j += 1) {
693 var el = this[j];
694
695 if (window.CustomEvent) {
696 var evt = new window.CustomEvent(event, {
697 detail: eventData,
698 bubbles: true,
699 cancelable: true
700 });
701 el.dom7EventData = args.filter(function (data, dataIndex) {
702 return dataIndex > 0;
703 });
704 el.dispatchEvent(evt);
705 el.dom7EventData = [];
706 delete el.dom7EventData;
707 }
708 }
709 }
710
711 return this;
712}
713
714function transitionEnd$1(callback) {
715 var dom = this;
716
717 function fireCallBack(e) {
718 if (e.target !== this) return;
719 callback.call(this, e);
720 dom.off('transitionend', fireCallBack);
721 }
722
723 if (callback) {
724 dom.on('transitionend', fireCallBack);
725 }
726
727 return this;
728}
729
730function outerWidth(includeMargins) {
731 if (this.length > 0) {
732 if (includeMargins) {
733 var _styles = this.styles();
734
735 return this[0].offsetWidth + parseFloat(_styles.getPropertyValue('margin-right')) + parseFloat(_styles.getPropertyValue('margin-left'));
736 }
737
738 return this[0].offsetWidth;
739 }
740
741 return null;
742}
743
744function outerHeight(includeMargins) {
745 if (this.length > 0) {
746 if (includeMargins) {
747 var _styles2 = this.styles();
748
749 return this[0].offsetHeight + parseFloat(_styles2.getPropertyValue('margin-top')) + parseFloat(_styles2.getPropertyValue('margin-bottom'));
750 }
751
752 return this[0].offsetHeight;
753 }
754
755 return null;
756}
757
758function offset() {
759 if (this.length > 0) {
760 var window = getWindow();
761 var document = getDocument();
762 var el = this[0];
763 var box = el.getBoundingClientRect();
764 var body = document.body;
765 var clientTop = el.clientTop || body.clientTop || 0;
766 var clientLeft = el.clientLeft || body.clientLeft || 0;
767 var scrollTop = el === window ? window.scrollY : el.scrollTop;
768 var scrollLeft = el === window ? window.scrollX : el.scrollLeft;
769 return {
770 top: box.top + scrollTop - clientTop,
771 left: box.left + scrollLeft - clientLeft
772 };
773 }
774
775 return null;
776}
777
778function styles() {
779 var window = getWindow();
780 if (this[0]) return window.getComputedStyle(this[0], null);
781 return {};
782}
783
784function css(props, value) {
785 var window = getWindow();
786 var i;
787
788 if (arguments.length === 1) {
789 if (typeof props === 'string') {
790 // .css('width')
791 if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);
792 } else {
793 // .css({ width: '100px' })
794 for (i = 0; i < this.length; i += 1) {
795 for (var _prop in props) {
796 this[i].style[_prop] = props[_prop];
797 }
798 }
799
800 return this;
801 }
802 }
803
804 if (arguments.length === 2 && typeof props === 'string') {
805 // .css('width', '100px')
806 for (i = 0; i < this.length; i += 1) {
807 this[i].style[props] = value;
808 }
809
810 return this;
811 }
812
813 return this;
814}
815
816function each(callback) {
817 if (!callback) return this;
818 this.forEach(function (el, index) {
819 callback.apply(el, [el, index]);
820 });
821 return this;
822}
823
824function filter(callback) {
825 var result = arrayFilter(this, callback);
826 return $(result);
827}
828
829function html(html) {
830 if (typeof html === 'undefined') {
831 return this[0] ? this[0].innerHTML : null;
832 }
833
834 for (var i = 0; i < this.length; i += 1) {
835 this[i].innerHTML = html;
836 }
837
838 return this;
839}
840
841function text(text) {
842 if (typeof text === 'undefined') {
843 return this[0] ? this[0].textContent.trim() : null;
844 }
845
846 for (var i = 0; i < this.length; i += 1) {
847 this[i].textContent = text;
848 }
849
850 return this;
851}
852
853function is(selector) {
854 var window = getWindow();
855 var document = getDocument();
856 var el = this[0];
857 var compareWith;
858 var i;
859 if (!el || typeof selector === 'undefined') return false;
860
861 if (typeof selector === 'string') {
862 if (el.matches) return el.matches(selector);
863 if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);
864 if (el.msMatchesSelector) return el.msMatchesSelector(selector);
865 compareWith = $(selector);
866
867 for (i = 0; i < compareWith.length; i += 1) {
868 if (compareWith[i] === el) return true;
869 }
870
871 return false;
872 }
873
874 if (selector === document) {
875 return el === document;
876 }
877
878 if (selector === window) {
879 return el === window;
880 }
881
882 if (selector.nodeType || selector instanceof Dom7) {
883 compareWith = selector.nodeType ? [selector] : selector;
884
885 for (i = 0; i < compareWith.length; i += 1) {
886 if (compareWith[i] === el) return true;
887 }
888
889 return false;
890 }
891
892 return false;
893}
894
895function index() {
896 var child = this[0];
897 var i;
898
899 if (child) {
900 i = 0; // eslint-disable-next-line
901
902 while ((child = child.previousSibling) !== null) {
903 if (child.nodeType === 1) i += 1;
904 }
905
906 return i;
907 }
908
909 return undefined;
910}
911
912function eq(index) {
913 if (typeof index === 'undefined') return this;
914 var length = this.length;
915
916 if (index > length - 1) {
917 return $([]);
918 }
919
920 if (index < 0) {
921 var returnIndex = length + index;
922 if (returnIndex < 0) return $([]);
923 return $([this[returnIndex]]);
924 }
925
926 return $([this[index]]);
927}
928
929function append() {
930 var newChild;
931 var document = getDocument();
932
933 for (var k = 0; k < arguments.length; k += 1) {
934 newChild = k < 0 || arguments.length <= k ? undefined : arguments[k];
935
936 for (var i = 0; i < this.length; i += 1) {
937 if (typeof newChild === 'string') {
938 var tempDiv = document.createElement('div');
939 tempDiv.innerHTML = newChild;
940
941 while (tempDiv.firstChild) {
942 this[i].appendChild(tempDiv.firstChild);
943 }
944 } else if (newChild instanceof Dom7) {
945 for (var j = 0; j < newChild.length; j += 1) {
946 this[i].appendChild(newChild[j]);
947 }
948 } else {
949 this[i].appendChild(newChild);
950 }
951 }
952 }
953
954 return this;
955}
956
957function prepend(newChild) {
958 var document = getDocument();
959 var i;
960 var j;
961
962 for (i = 0; i < this.length; i += 1) {
963 if (typeof newChild === 'string') {
964 var tempDiv = document.createElement('div');
965 tempDiv.innerHTML = newChild;
966
967 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
968 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
969 }
970 } else if (newChild instanceof Dom7) {
971 for (j = 0; j < newChild.length; j += 1) {
972 this[i].insertBefore(newChild[j], this[i].childNodes[0]);
973 }
974 } else {
975 this[i].insertBefore(newChild, this[i].childNodes[0]);
976 }
977 }
978
979 return this;
980}
981
982function next(selector) {
983 if (this.length > 0) {
984 if (selector) {
985 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
986 return $([this[0].nextElementSibling]);
987 }
988
989 return $([]);
990 }
991
992 if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);
993 return $([]);
994 }
995
996 return $([]);
997}
998
999function nextAll(selector) {
1000 var nextEls = [];
1001 var el = this[0];
1002 if (!el) return $([]);
1003
1004 while (el.nextElementSibling) {
1005 var _next = el.nextElementSibling; // eslint-disable-line
1006
1007 if (selector) {
1008 if ($(_next).is(selector)) nextEls.push(_next);
1009 } else nextEls.push(_next);
1010
1011 el = _next;
1012 }
1013
1014 return $(nextEls);
1015}
1016
1017function prev(selector) {
1018 if (this.length > 0) {
1019 var el = this[0];
1020
1021 if (selector) {
1022 if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
1023 return $([el.previousElementSibling]);
1024 }
1025
1026 return $([]);
1027 }
1028
1029 if (el.previousElementSibling) return $([el.previousElementSibling]);
1030 return $([]);
1031 }
1032
1033 return $([]);
1034}
1035
1036function prevAll(selector) {
1037 var prevEls = [];
1038 var el = this[0];
1039 if (!el) return $([]);
1040
1041 while (el.previousElementSibling) {
1042 var _prev = el.previousElementSibling; // eslint-disable-line
1043
1044 if (selector) {
1045 if ($(_prev).is(selector)) prevEls.push(_prev);
1046 } else prevEls.push(_prev);
1047
1048 el = _prev;
1049 }
1050
1051 return $(prevEls);
1052}
1053
1054function parent(selector) {
1055 var parents = []; // eslint-disable-line
1056
1057 for (var i = 0; i < this.length; i += 1) {
1058 if (this[i].parentNode !== null) {
1059 if (selector) {
1060 if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);
1061 } else {
1062 parents.push(this[i].parentNode);
1063 }
1064 }
1065 }
1066
1067 return $(parents);
1068}
1069
1070function parents(selector) {
1071 var parents = []; // eslint-disable-line
1072
1073 for (var i = 0; i < this.length; i += 1) {
1074 var _parent = this[i].parentNode; // eslint-disable-line
1075
1076 while (_parent) {
1077 if (selector) {
1078 if ($(_parent).is(selector)) parents.push(_parent);
1079 } else {
1080 parents.push(_parent);
1081 }
1082
1083 _parent = _parent.parentNode;
1084 }
1085 }
1086
1087 return $(parents);
1088}
1089
1090function closest(selector) {
1091 var closest = this; // eslint-disable-line
1092
1093 if (typeof selector === 'undefined') {
1094 return $([]);
1095 }
1096
1097 if (!closest.is(selector)) {
1098 closest = closest.parents(selector).eq(0);
1099 }
1100
1101 return closest;
1102}
1103
1104function find(selector) {
1105 var foundElements = [];
1106
1107 for (var i = 0; i < this.length; i += 1) {
1108 try {
1109 var found = this[i].querySelectorAll(selector);
1110 } catch (err) {
1111 console.log(selector);
1112 }
1113
1114 for (var j = 0; j < found.length; j += 1) {
1115 foundElements.push(found[j]);
1116 }
1117 }
1118
1119 return $(foundElements);
1120}
1121
1122function children(selector) {
1123 var children = []; // eslint-disable-line
1124
1125 for (var i = 0; i < this.length; i += 1) {
1126 var childNodes = this[i].children;
1127
1128 for (var j = 0; j < childNodes.length; j += 1) {
1129 if (!selector || $(childNodes[j]).is(selector)) {
1130 children.push(childNodes[j]);
1131 }
1132 }
1133 }
1134
1135 return $(children);
1136}
1137
1138function remove() {
1139 for (var i = 0; i < this.length; i += 1) {
1140 if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);
1141 }
1142
1143 return this;
1144}
1145
1146var Methods = {
1147 addClass: addClass,
1148 removeClass: removeClass,
1149 hasClass: hasClass,
1150 toggleClass: toggleClass,
1151 attr: attr,
1152 removeAttr: removeAttr,
1153 transform: transform,
1154 transition: transition$1,
1155 on: on,
1156 off: off,
1157 trigger: trigger,
1158 transitionEnd: transitionEnd$1,
1159 outerWidth: outerWidth,
1160 outerHeight: outerHeight,
1161 styles: styles,
1162 offset: offset,
1163 css: css,
1164 each: each,
1165 html: html,
1166 text: text,
1167 is: is,
1168 index: index,
1169 eq: eq,
1170 append: append,
1171 prepend: prepend,
1172 next: next,
1173 nextAll: nextAll,
1174 prev: prev,
1175 prevAll: prevAll,
1176 parent: parent,
1177 parents: parents,
1178 closest: closest,
1179 find: find,
1180 children: children,
1181 filter: filter,
1182 remove: remove
1183};
1184Object.keys(Methods).forEach(function (methodName) {
1185 Object.defineProperty($.fn, methodName, {
1186 value: Methods[methodName],
1187 writable: true
1188 });
1189});
1190
1191function deleteProps(obj) {
1192 var object = obj;
1193 Object.keys(object).forEach(function (key) {
1194 try {
1195 object[key] = null;
1196 } catch (e) {// no getter for object
1197 }
1198
1199 try {
1200 delete object[key];
1201 } catch (e) {// something got wrong
1202 }
1203 });
1204}
1205
1206function nextTick(callback, delay) {
1207 if (delay === void 0) {
1208 delay = 0;
1209 }
1210
1211 return setTimeout(callback, delay);
1212}
1213
1214function now() {
1215 return Date.now();
1216}
1217
1218function getComputedStyle$1(el) {
1219 var window = getWindow();
1220 var style;
1221
1222 if (window.getComputedStyle) {
1223 style = window.getComputedStyle(el, null);
1224 }
1225
1226 if (!style && el.currentStyle) {
1227 style = el.currentStyle;
1228 }
1229
1230 if (!style) {
1231 style = el.style;
1232 }
1233
1234 return style;
1235}
1236
1237function getTranslate(el, axis) {
1238 if (axis === void 0) {
1239 axis = 'x';
1240 }
1241
1242 var window = getWindow();
1243 var matrix;
1244 var curTransform;
1245 var transformMatrix;
1246 var curStyle = getComputedStyle$1(el);
1247
1248 if (window.WebKitCSSMatrix) {
1249 curTransform = curStyle.transform || curStyle.webkitTransform;
1250
1251 if (curTransform.split(',').length > 6) {
1252 curTransform = curTransform.split(', ').map(function (a) {
1253 return a.replace(',', '.');
1254 }).join(', ');
1255 } // Some old versions of Webkit choke when 'none' is passed; pass
1256 // empty string instead in this case
1257
1258
1259 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
1260 } else {
1261 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
1262 matrix = transformMatrix.toString().split(',');
1263 }
1264
1265 if (axis === 'x') {
1266 // Latest Chrome and webkits Fix
1267 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix
1268 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers
1269 else curTransform = parseFloat(matrix[4]);
1270 }
1271
1272 if (axis === 'y') {
1273 // Latest Chrome and webkits Fix
1274 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix
1275 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers
1276 else curTransform = parseFloat(matrix[5]);
1277 }
1278
1279 return curTransform || 0;
1280}
1281
1282function isObject(o) {
1283 return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
1284}
1285
1286function extend() {
1287 var to = Object(arguments.length <= 0 ? undefined : arguments[0]);
1288 var noExtend = ['__proto__', 'constructor', 'prototype'];
1289
1290 for (var i = 1; i < arguments.length; i += 1) {
1291 var nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
1292
1293 if (nextSource !== undefined && nextSource !== null) {
1294 var keysArray = Object.keys(Object(nextSource)).filter(function (key) {
1295 return noExtend.indexOf(key) < 0;
1296 });
1297
1298 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
1299 var nextKey = keysArray[nextIndex];
1300 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
1301
1302 if (desc !== undefined && desc.enumerable) {
1303 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
1304 if (nextSource[nextKey].__swiper__) {
1305 to[nextKey] = nextSource[nextKey];
1306 } else {
1307 extend(to[nextKey], nextSource[nextKey]);
1308 }
1309 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
1310 to[nextKey] = {};
1311
1312 if (nextSource[nextKey].__swiper__) {
1313 to[nextKey] = nextSource[nextKey];
1314 } else {
1315 extend(to[nextKey], nextSource[nextKey]);
1316 }
1317 } else {
1318 to[nextKey] = nextSource[nextKey];
1319 }
1320 }
1321 }
1322 }
1323 }
1324
1325 return to;
1326}
1327
1328function bindModuleMethods(instance, obj) {
1329 Object.keys(obj).forEach(function (key) {
1330 if (isObject(obj[key])) {
1331 Object.keys(obj[key]).forEach(function (subKey) {
1332 if (typeof obj[key][subKey] === 'function') {
1333 obj[key][subKey] = obj[key][subKey].bind(instance);
1334 }
1335 });
1336 }
1337
1338 instance[key] = obj[key];
1339 });
1340}
1341
1342function classesToSelector(classes) {
1343 if (classes === void 0) {
1344 classes = '';
1345 }
1346
1347 return "." + classes.trim().replace(/([\.:\/])/g, '\\$1') // eslint-disable-line
1348 .replace(/ /g, '.');
1349}
1350
1351var support;
1352
1353function calcSupport() {
1354 var window = getWindow();
1355 var document = getDocument();
1356 return {
1357 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),
1358 pointerEvents: !!window.PointerEvent && 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints >= 0,
1359 observer: function checkObserver() {
1360 return 'MutationObserver' in window || 'WebkitMutationObserver' in window;
1361 }(),
1362 passiveListener: function checkPassiveListener() {
1363 var supportsPassive = false;
1364
1365 try {
1366 var opts = Object.defineProperty({}, 'passive', {
1367 // eslint-disable-next-line
1368 get: function get() {
1369 supportsPassive = true;
1370 }
1371 });
1372 window.addEventListener('testPassiveListener', null, opts);
1373 } catch (e) {// No support
1374 }
1375
1376 return supportsPassive;
1377 }(),
1378 gestures: function checkGestures() {
1379 return 'ongesturestart' in window;
1380 }()
1381 };
1382}
1383
1384function getSupport() {
1385 if (!support) {
1386 support = calcSupport();
1387 }
1388
1389 return support;
1390}
1391
1392var device;
1393
1394function calcDevice(_temp) {
1395 var _ref = _temp === void 0 ? {} : _temp,
1396 userAgent = _ref.userAgent;
1397
1398 var support = getSupport();
1399 var window = getWindow();
1400 var platform = window.navigator.platform;
1401 var ua = userAgent || window.navigator.userAgent;
1402 var device = {
1403 ios: false,
1404 android: false
1405 };
1406 var screenWidth = window.screen.width;
1407 var screenHeight = window.screen.height;
1408 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
1409
1410 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
1411 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
1412 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
1413 var windows = platform === 'Win32';
1414 var macos = platform === 'MacIntel'; // iPadOs 13 fix
1415
1416 var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
1417
1418 if (!ipad && macos && support.touch && iPadScreens.indexOf(screenWidth + "x" + screenHeight) >= 0) {
1419 ipad = ua.match(/(Version)\/([\d.]+)/);
1420 if (!ipad) ipad = [0, 1, '13_0_0'];
1421 macos = false;
1422 } // Android
1423
1424
1425 if (android && !windows) {
1426 device.os = 'android';
1427 device.android = true;
1428 }
1429
1430 if (ipad || iphone || ipod) {
1431 device.os = 'ios';
1432 device.ios = true;
1433 } // Export object
1434
1435
1436 return device;
1437}
1438
1439function getDevice(overrides) {
1440 if (overrides === void 0) {
1441 overrides = {};
1442 }
1443
1444 if (!device) {
1445 device = calcDevice(overrides);
1446 }
1447
1448 return device;
1449}
1450
1451var browser;
1452
1453function calcBrowser() {
1454 var window = getWindow();
1455
1456 function isSafari() {
1457 var ua = window.navigator.userAgent.toLowerCase();
1458 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
1459 }
1460
1461 return {
1462 isEdge: !!window.navigator.userAgent.match(/Edge/g),
1463 isSafari: isSafari(),
1464 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)
1465 };
1466}
1467
1468function getBrowser() {
1469 if (!browser) {
1470 browser = calcBrowser();
1471 }
1472
1473 return browser;
1474}
1475
1476var supportsResizeObserver = function supportsResizeObserver() {
1477 var window = getWindow();
1478 return typeof window.ResizeObserver !== 'undefined';
1479};
1480
1481var Resize = {
1482 name: 'resize',
1483 create: function create() {
1484 var swiper = this;
1485 extend(swiper, {
1486 resize: {
1487 observer: null,
1488 createObserver: function createObserver() {
1489 if (!swiper || swiper.destroyed || !swiper.initialized) return;
1490 swiper.resize.observer = new ResizeObserver(function (entries) {
1491 var width = swiper.width,
1492 height = swiper.height;
1493 var newWidth = width;
1494 var newHeight = height;
1495 entries.forEach(function (_ref) {
1496 var contentBoxSize = _ref.contentBoxSize,
1497 contentRect = _ref.contentRect,
1498 target = _ref.target;
1499 if (target && target !== swiper.el) return;
1500 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
1501 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
1502 });
1503
1504 if (newWidth !== width || newHeight !== height) {
1505 swiper.resize.resizeHandler();
1506 }
1507 });
1508 swiper.resize.observer.observe(swiper.el);
1509 },
1510 removeObserver: function removeObserver() {
1511 if (swiper.resize.observer && swiper.resize.observer.unobserve && swiper.el) {
1512 swiper.resize.observer.unobserve(swiper.el);
1513 swiper.resize.observer = null;
1514 }
1515 },
1516 resizeHandler: function resizeHandler() {
1517 if (!swiper || swiper.destroyed || !swiper.initialized) return;
1518 swiper.emit('beforeResize');
1519 swiper.emit('resize');
1520 },
1521 orientationChangeHandler: function orientationChangeHandler() {
1522 if (!swiper || swiper.destroyed || !swiper.initialized) return;
1523 swiper.emit('orientationchange');
1524 }
1525 }
1526 });
1527 },
1528 on: {
1529 init: function init(swiper) {
1530 var window = getWindow();
1531
1532 if (swiper.params.resizeObserver && supportsResizeObserver()) {
1533 swiper.resize.createObserver();
1534 return;
1535 } // Emit resize
1536
1537
1538 window.addEventListener('resize', swiper.resize.resizeHandler); // Emit orientationchange
1539
1540 window.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
1541 },
1542 destroy: function destroy(swiper) {
1543 var window = getWindow();
1544 swiper.resize.removeObserver();
1545 window.removeEventListener('resize', swiper.resize.resizeHandler);
1546 window.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
1547 }
1548 }
1549};
1550
1551var Observer = {
1552 attach: function attach(target, options) {
1553 if (options === void 0) {
1554 options = {};
1555 }
1556
1557 var window = getWindow();
1558 var swiper = this;
1559 var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
1560 var observer = new ObserverFunc(function (mutations) {
1561 // The observerUpdate event should only be triggered
1562 // once despite the number of mutations. Additional
1563 // triggers are redundant and are very costly
1564 if (mutations.length === 1) {
1565 swiper.emit('observerUpdate', mutations[0]);
1566 return;
1567 }
1568
1569 var observerUpdate = function observerUpdate() {
1570 swiper.emit('observerUpdate', mutations[0]);
1571 };
1572
1573 if (window.requestAnimationFrame) {
1574 window.requestAnimationFrame(observerUpdate);
1575 } else {
1576 window.setTimeout(observerUpdate, 0);
1577 }
1578 });
1579 observer.observe(target, {
1580 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
1581 childList: typeof options.childList === 'undefined' ? true : options.childList,
1582 characterData: typeof options.characterData === 'undefined' ? true : options.characterData
1583 });
1584 swiper.observer.observers.push(observer);
1585 },
1586 init: function init() {
1587 var swiper = this;
1588 if (!swiper.support.observer || !swiper.params.observer) return;
1589
1590 if (swiper.params.observeParents) {
1591 var containerParents = swiper.$el.parents();
1592
1593 for (var i = 0; i < containerParents.length; i += 1) {
1594 swiper.observer.attach(containerParents[i]);
1595 }
1596 } // Observe container
1597
1598
1599 swiper.observer.attach(swiper.$el[0], {
1600 childList: swiper.params.observeSlideChildren
1601 }); // Observe wrapper
1602
1603 swiper.observer.attach(swiper.$wrapperEl[0], {
1604 attributes: false
1605 });
1606 },
1607 destroy: function destroy() {
1608 var swiper = this;
1609 swiper.observer.observers.forEach(function (observer) {
1610 observer.disconnect();
1611 });
1612 swiper.observer.observers = [];
1613 }
1614};
1615var Observer$1 = {
1616 name: 'observer',
1617 params: {
1618 observer: false,
1619 observeParents: false,
1620 observeSlideChildren: false
1621 },
1622 create: function create() {
1623 var swiper = this;
1624 bindModuleMethods(swiper, {
1625 observer: _extends({}, Observer, {
1626 observers: []
1627 })
1628 });
1629 },
1630 on: {
1631 init: function init(swiper) {
1632 swiper.observer.init();
1633 },
1634 destroy: function destroy(swiper) {
1635 swiper.observer.destroy();
1636 }
1637 }
1638};
1639
1640var modular = {
1641 useParams: function useParams(instanceParams) {
1642 var instance = this;
1643 if (!instance.modules) return;
1644 Object.keys(instance.modules).forEach(function (moduleName) {
1645 var module = instance.modules[moduleName]; // Extend params
1646
1647 if (module.params) {
1648 extend(instanceParams, module.params);
1649 }
1650 });
1651 },
1652 useModules: function useModules(modulesParams) {
1653 if (modulesParams === void 0) {
1654 modulesParams = {};
1655 }
1656
1657 var instance = this;
1658 if (!instance.modules) return;
1659 Object.keys(instance.modules).forEach(function (moduleName) {
1660 var module = instance.modules[moduleName];
1661 var moduleParams = modulesParams[moduleName] || {}; // Add event listeners
1662
1663 if (module.on && instance.on) {
1664 Object.keys(module.on).forEach(function (moduleEventName) {
1665 instance.on(moduleEventName, module.on[moduleEventName]);
1666 });
1667 } // Module create callback
1668
1669
1670 if (module.create) {
1671 module.create.bind(instance)(moduleParams);
1672 }
1673 });
1674 }
1675};
1676
1677/* eslint-disable no-underscore-dangle */
1678var eventsEmitter = {
1679 on: function on(events, handler, priority) {
1680 var self = this;
1681 if (typeof handler !== 'function') return self;
1682 var method = priority ? 'unshift' : 'push';
1683 events.split(' ').forEach(function (event) {
1684 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
1685 self.eventsListeners[event][method](handler);
1686 });
1687 return self;
1688 },
1689 once: function once(events, handler, priority) {
1690 var self = this;
1691 if (typeof handler !== 'function') return self;
1692
1693 function onceHandler() {
1694 self.off(events, onceHandler);
1695
1696 if (onceHandler.__emitterProxy) {
1697 delete onceHandler.__emitterProxy;
1698 }
1699
1700 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
1701 args[_key] = arguments[_key];
1702 }
1703
1704 handler.apply(self, args);
1705 }
1706
1707 onceHandler.__emitterProxy = handler;
1708 return self.on(events, onceHandler, priority);
1709 },
1710 onAny: function onAny(handler, priority) {
1711 var self = this;
1712 if (typeof handler !== 'function') return self;
1713 var method = priority ? 'unshift' : 'push';
1714
1715 if (self.eventsAnyListeners.indexOf(handler) < 0) {
1716 self.eventsAnyListeners[method](handler);
1717 }
1718
1719 return self;
1720 },
1721 offAny: function offAny(handler) {
1722 var self = this;
1723 if (!self.eventsAnyListeners) return self;
1724 var index = self.eventsAnyListeners.indexOf(handler);
1725
1726 if (index >= 0) {
1727 self.eventsAnyListeners.splice(index, 1);
1728 }
1729
1730 return self;
1731 },
1732 off: function off(events, handler) {
1733 var self = this;
1734 if (!self.eventsListeners) return self;
1735 events.split(' ').forEach(function (event) {
1736 if (typeof handler === 'undefined') {
1737 self.eventsListeners[event] = [];
1738 } else if (self.eventsListeners[event]) {
1739 self.eventsListeners[event].forEach(function (eventHandler, index) {
1740 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
1741 self.eventsListeners[event].splice(index, 1);
1742 }
1743 });
1744 }
1745 });
1746 return self;
1747 },
1748 emit: function emit() {
1749 var self = this;
1750 if (!self.eventsListeners) return self;
1751 var events;
1752 var data;
1753 var context;
1754
1755 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
1756 args[_key2] = arguments[_key2];
1757 }
1758
1759 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
1760 events = args[0];
1761 data = args.slice(1, args.length);
1762 context = self;
1763 } else {
1764 events = args[0].events;
1765 data = args[0].data;
1766 context = args[0].context || self;
1767 }
1768
1769 data.unshift(context);
1770 var eventsArray = Array.isArray(events) ? events : events.split(' ');
1771 eventsArray.forEach(function (event) {
1772 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
1773 self.eventsAnyListeners.forEach(function (eventHandler) {
1774 eventHandler.apply(context, [event].concat(data));
1775 });
1776 }
1777
1778 if (self.eventsListeners && self.eventsListeners[event]) {
1779 self.eventsListeners[event].forEach(function (eventHandler) {
1780 eventHandler.apply(context, data);
1781 });
1782 }
1783 });
1784 return self;
1785 }
1786};
1787
1788function updateSize() {
1789 var swiper = this;
1790 var width;
1791 var height;
1792 var $el = swiper.$el;
1793
1794 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
1795 width = swiper.params.width;
1796 } else {
1797 width = $el[0].clientWidth;
1798 }
1799
1800 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
1801 height = swiper.params.height;
1802 } else {
1803 height = $el[0].clientHeight;
1804 }
1805
1806 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
1807 return;
1808 } // Subtract paddings
1809
1810
1811 width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);
1812 height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);
1813 if (Number.isNaN(width)) width = 0;
1814 if (Number.isNaN(height)) height = 0;
1815 extend(swiper, {
1816 width: width,
1817 height: height,
1818 size: swiper.isHorizontal() ? width : height
1819 });
1820}
1821
1822function updateSlides() {
1823 var swiper = this;
1824
1825 var getDirectionLabel = function getDirectionLabel(property) {
1826 if (swiper.isHorizontal()) {
1827 return property;
1828 } // prettier-ignore
1829
1830
1831 return {
1832 'width': 'height',
1833 'margin-top': 'margin-left',
1834 'margin-bottom ': 'margin-right',
1835 'margin-left': 'margin-top',
1836 'margin-right': 'margin-bottom',
1837 'padding-left': 'padding-top',
1838 'padding-right': 'padding-bottom',
1839 'marginRight': 'marginBottom'
1840 }[property];
1841 };
1842
1843 var getDirectionPropertyValue = function getDirectionPropertyValue(node, label) {
1844 return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);
1845 };
1846
1847 var params = swiper.params;
1848 var $wrapperEl = swiper.$wrapperEl,
1849 swiperSize = swiper.size,
1850 rtl = swiper.rtlTranslate,
1851 wrongRTL = swiper.wrongRTL;
1852 var isVirtual = swiper.virtual && params.virtual.enabled;
1853 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
1854 var slides = $wrapperEl.children("." + swiper.params.slideClass);
1855 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
1856 var snapGrid = [];
1857 var slidesGrid = [];
1858 var slidesSizesGrid = [];
1859
1860 function slidesForMargin(slideEl, slideIndex) {
1861 if (!params.cssMode) return true;
1862
1863 if (slideIndex === slides.length - 1) {
1864 return false;
1865 }
1866
1867 return true;
1868 }
1869
1870 var offsetBefore = params.slidesOffsetBefore;
1871
1872 if (typeof offsetBefore === 'function') {
1873 offsetBefore = params.slidesOffsetBefore.call(swiper);
1874 }
1875
1876 var offsetAfter = params.slidesOffsetAfter;
1877
1878 if (typeof offsetAfter === 'function') {
1879 offsetAfter = params.slidesOffsetAfter.call(swiper);
1880 }
1881
1882 var previousSnapGridLength = swiper.snapGrid.length;
1883 var previousSlidesGridLength = swiper.slidesGrid.length;
1884 var spaceBetween = params.spaceBetween;
1885 var slidePosition = -offsetBefore;
1886 var prevSlideSize = 0;
1887 var index = 0;
1888
1889 if (typeof swiperSize === 'undefined') {
1890 return;
1891 }
1892
1893 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1894 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
1895 }
1896
1897 swiper.virtualSize = -spaceBetween; // reset margins
1898
1899 if (rtl) slides.css({
1900 marginLeft: '',
1901 marginTop: ''
1902 });else slides.css({
1903 marginRight: '',
1904 marginBottom: ''
1905 });
1906 var slidesNumberEvenToRows;
1907
1908 if (params.slidesPerColumn > 1) {
1909 if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
1910 slidesNumberEvenToRows = slidesLength;
1911 } else {
1912 slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
1913 }
1914
1915 if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
1916 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
1917 }
1918 } // Calc slides
1919
1920
1921 var slideSize;
1922 var slidesPerColumn = params.slidesPerColumn;
1923 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
1924 var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
1925
1926 for (var i = 0; i < slidesLength; i += 1) {
1927 slideSize = 0;
1928 var slide = slides.eq(i);
1929
1930 if (params.slidesPerColumn > 1) {
1931 // Set slides order
1932 var newSlideOrderIndex = void 0;
1933 var column = void 0;
1934 var row = void 0;
1935
1936 if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
1937 var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
1938 var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
1939 var columnsInGroup = groupIndex === 0 ? params.slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
1940 row = Math.floor(slideIndexInGroup / columnsInGroup);
1941 column = slideIndexInGroup - row * columnsInGroup + groupIndex * params.slidesPerGroup;
1942 newSlideOrderIndex = column + row * slidesNumberEvenToRows / slidesPerColumn;
1943 slide.css({
1944 '-webkit-box-ordinal-group': newSlideOrderIndex,
1945 '-moz-box-ordinal-group': newSlideOrderIndex,
1946 '-ms-flex-order': newSlideOrderIndex,
1947 '-webkit-order': newSlideOrderIndex,
1948 order: newSlideOrderIndex
1949 });
1950 } else if (params.slidesPerColumnFill === 'column') {
1951 column = Math.floor(i / slidesPerColumn);
1952 row = i - column * slidesPerColumn;
1953
1954 if (column > numFullColumns || column === numFullColumns && row === slidesPerColumn - 1) {
1955 row += 1;
1956
1957 if (row >= slidesPerColumn) {
1958 row = 0;
1959 column += 1;
1960 }
1961 }
1962 } else {
1963 row = Math.floor(i / slidesPerRow);
1964 column = i - row * slidesPerRow;
1965 }
1966
1967 slide.css(getDirectionLabel('margin-top'), row !== 0 && params.spaceBetween && params.spaceBetween + "px");
1968 }
1969
1970 if (slide.css('display') === 'none') continue; // eslint-disable-line
1971
1972 if (params.slidesPerView === 'auto') {
1973 var slideStyles = getComputedStyle(slide[0]);
1974 var currentTransform = slide[0].style.transform;
1975 var currentWebKitTransform = slide[0].style.webkitTransform;
1976
1977 if (currentTransform) {
1978 slide[0].style.transform = 'none';
1979 }
1980
1981 if (currentWebKitTransform) {
1982 slide[0].style.webkitTransform = 'none';
1983 }
1984
1985 if (params.roundLengths) {
1986 slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);
1987 } else {
1988 // eslint-disable-next-line
1989 var width = getDirectionPropertyValue(slideStyles, 'width');
1990 var paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
1991 var paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
1992 var marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
1993 var marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
1994 var boxSizing = slideStyles.getPropertyValue('box-sizing');
1995
1996 if (boxSizing && boxSizing === 'border-box') {
1997 slideSize = width + marginLeft + marginRight;
1998 } else {
1999 var _slide$ = slide[0],
2000 clientWidth = _slide$.clientWidth,
2001 offsetWidth = _slide$.offsetWidth;
2002 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
2003 }
2004 }
2005
2006 if (currentTransform) {
2007 slide[0].style.transform = currentTransform;
2008 }
2009
2010 if (currentWebKitTransform) {
2011 slide[0].style.webkitTransform = currentWebKitTransform;
2012 }
2013
2014 if (params.roundLengths) slideSize = Math.floor(slideSize);
2015 } else {
2016 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
2017 if (params.roundLengths) slideSize = Math.floor(slideSize);
2018
2019 if (slides[i]) {
2020 slides[i].style[getDirectionLabel('width')] = slideSize + "px";
2021 }
2022 }
2023
2024 if (slides[i]) {
2025 slides[i].swiperSlideSize = slideSize;
2026 }
2027
2028 slidesSizesGrid.push(slideSize);
2029
2030 if (params.centeredSlides) {
2031 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
2032 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
2033 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
2034 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
2035 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
2036 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
2037 slidesGrid.push(slidePosition);
2038 } else {
2039 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
2040 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
2041 slidesGrid.push(slidePosition);
2042 slidePosition = slidePosition + slideSize + spaceBetween;
2043 }
2044
2045 swiper.virtualSize += slideSize + spaceBetween;
2046 prevSlideSize = slideSize;
2047 index += 1;
2048 }
2049
2050 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
2051 var newSlidesGrid;
2052
2053 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
2054 $wrapperEl.css({
2055 width: swiper.virtualSize + params.spaceBetween + "px"
2056 });
2057 }
2058
2059 if (params.setWrapperSize) {
2060 var _$wrapperEl$css;
2061
2062 $wrapperEl.css((_$wrapperEl$css = {}, _$wrapperEl$css[getDirectionLabel('width')] = swiper.virtualSize + params.spaceBetween + "px", _$wrapperEl$css));
2063 }
2064
2065 if (params.slidesPerColumn > 1) {
2066 var _$wrapperEl$css2;
2067
2068 swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
2069 swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
2070 $wrapperEl.css((_$wrapperEl$css2 = {}, _$wrapperEl$css2[getDirectionLabel('width')] = swiper.virtualSize + params.spaceBetween + "px", _$wrapperEl$css2));
2071
2072 if (params.centeredSlides) {
2073 newSlidesGrid = [];
2074
2075 for (var _i = 0; _i < snapGrid.length; _i += 1) {
2076 var slidesGridItem = snapGrid[_i];
2077 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
2078 if (snapGrid[_i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
2079 }
2080
2081 snapGrid = newSlidesGrid;
2082 }
2083 } // Remove last grid elements depending on width
2084
2085
2086 if (!params.centeredSlides) {
2087 newSlidesGrid = [];
2088
2089 for (var _i2 = 0; _i2 < snapGrid.length; _i2 += 1) {
2090 var _slidesGridItem = snapGrid[_i2];
2091 if (params.roundLengths) _slidesGridItem = Math.floor(_slidesGridItem);
2092
2093 if (snapGrid[_i2] <= swiper.virtualSize - swiperSize) {
2094 newSlidesGrid.push(_slidesGridItem);
2095 }
2096 }
2097
2098 snapGrid = newSlidesGrid;
2099
2100 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
2101 snapGrid.push(swiper.virtualSize - swiperSize);
2102 }
2103 }
2104
2105 if (snapGrid.length === 0) snapGrid = [0];
2106
2107 if (params.spaceBetween !== 0) {
2108 var _slides$filter$css;
2109
2110 var key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');
2111 slides.filter(slidesForMargin).css((_slides$filter$css = {}, _slides$filter$css[key] = spaceBetween + "px", _slides$filter$css));
2112 }
2113
2114 if (params.centeredSlides && params.centeredSlidesBounds) {
2115 var allSlidesSize = 0;
2116 slidesSizesGrid.forEach(function (slideSizeValue) {
2117 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
2118 });
2119 allSlidesSize -= params.spaceBetween;
2120 var maxSnap = allSlidesSize - swiperSize;
2121 snapGrid = snapGrid.map(function (snap) {
2122 if (snap < 0) return -offsetBefore;
2123 if (snap > maxSnap) return maxSnap + offsetAfter;
2124 return snap;
2125 });
2126 }
2127
2128 if (params.centerInsufficientSlides) {
2129 var _allSlidesSize = 0;
2130 slidesSizesGrid.forEach(function (slideSizeValue) {
2131 _allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
2132 });
2133 _allSlidesSize -= params.spaceBetween;
2134
2135 if (_allSlidesSize < swiperSize) {
2136 var allSlidesOffset = (swiperSize - _allSlidesSize) / 2;
2137 snapGrid.forEach(function (snap, snapIndex) {
2138 snapGrid[snapIndex] = snap - allSlidesOffset;
2139 });
2140 slidesGrid.forEach(function (snap, snapIndex) {
2141 slidesGrid[snapIndex] = snap + allSlidesOffset;
2142 });
2143 }
2144 }
2145
2146 extend(swiper, {
2147 slides: slides,
2148 snapGrid: snapGrid,
2149 slidesGrid: slidesGrid,
2150 slidesSizesGrid: slidesSizesGrid
2151 });
2152
2153 if (slidesLength !== previousSlidesLength) {
2154 swiper.emit('slidesLengthChange');
2155 }
2156
2157 if (snapGrid.length !== previousSnapGridLength) {
2158 if (swiper.params.watchOverflow) swiper.checkOverflow();
2159 swiper.emit('snapGridLengthChange');
2160 }
2161
2162 if (slidesGrid.length !== previousSlidesGridLength) {
2163 swiper.emit('slidesGridLengthChange');
2164 }
2165
2166 if (params.watchSlidesProgress || params.watchSlidesVisibility) {
2167 swiper.updateSlidesOffset();
2168 }
2169}
2170
2171function updateAutoHeight(speed) {
2172 var swiper = this;
2173 var activeSlides = [];
2174 var newHeight = 0;
2175 var i;
2176
2177 if (typeof speed === 'number') {
2178 swiper.setTransition(speed);
2179 } else if (speed === true) {
2180 swiper.setTransition(swiper.params.speed);
2181 } // Find slides currently in view
2182
2183
2184 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
2185 if (swiper.params.centeredSlides) {
2186 swiper.visibleSlides.each(function (slide) {
2187 activeSlides.push(slide);
2188 });
2189 } else {
2190 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
2191 var index = swiper.activeIndex + i;
2192 if (index > swiper.slides.length) break;
2193 activeSlides.push(swiper.slides.eq(index)[0]);
2194 }
2195 }
2196 } else {
2197 activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
2198 } // Find new height from highest slide in view
2199
2200
2201 for (i = 0; i < activeSlides.length; i += 1) {
2202 if (typeof activeSlides[i] !== 'undefined') {
2203 var height = activeSlides[i].offsetHeight;
2204 newHeight = height > newHeight ? height : newHeight;
2205 }
2206 } // Update Height
2207
2208
2209 if (newHeight) swiper.$wrapperEl.css('height', newHeight + "px");
2210}
2211
2212function updateSlidesOffset() {
2213 var swiper = this;
2214 var slides = swiper.slides;
2215
2216 for (var i = 0; i < slides.length; i += 1) {
2217 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
2218 }
2219}
2220
2221function updateSlidesProgress(translate) {
2222 if (translate === void 0) {
2223 translate = this && this.translate || 0;
2224 }
2225
2226 var swiper = this;
2227 var params = swiper.params;
2228 var slides = swiper.slides,
2229 rtl = swiper.rtlTranslate;
2230 if (slides.length === 0) return;
2231 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
2232 var offsetCenter = -translate;
2233 if (rtl) offsetCenter = translate; // Visible Slides
2234
2235 slides.removeClass(params.slideVisibleClass);
2236 swiper.visibleSlidesIndexes = [];
2237 swiper.visibleSlides = [];
2238
2239 for (var i = 0; i < slides.length; i += 1) {
2240 var slide = slides[i];
2241 var slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + params.spaceBetween);
2242
2243 if (params.watchSlidesVisibility || params.centeredSlides && params.autoHeight) {
2244 var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
2245 var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
2246 var isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
2247
2248 if (isVisible) {
2249 swiper.visibleSlides.push(slide);
2250 swiper.visibleSlidesIndexes.push(i);
2251 slides.eq(i).addClass(params.slideVisibleClass);
2252 }
2253 }
2254
2255 slide.progress = rtl ? -slideProgress : slideProgress;
2256 }
2257
2258 swiper.visibleSlides = $(swiper.visibleSlides);
2259}
2260
2261function updateProgress(translate) {
2262 var swiper = this;
2263
2264 if (typeof translate === 'undefined') {
2265 var multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line
2266
2267 translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
2268 }
2269
2270 var params = swiper.params;
2271 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
2272 var progress = swiper.progress,
2273 isBeginning = swiper.isBeginning,
2274 isEnd = swiper.isEnd;
2275 var wasBeginning = isBeginning;
2276 var wasEnd = isEnd;
2277
2278 if (translatesDiff === 0) {
2279 progress = 0;
2280 isBeginning = true;
2281 isEnd = true;
2282 } else {
2283 progress = (translate - swiper.minTranslate()) / translatesDiff;
2284 isBeginning = progress <= 0;
2285 isEnd = progress >= 1;
2286 }
2287
2288 extend(swiper, {
2289 progress: progress,
2290 isBeginning: isBeginning,
2291 isEnd: isEnd
2292 });
2293 if (params.watchSlidesProgress || params.watchSlidesVisibility || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
2294
2295 if (isBeginning && !wasBeginning) {
2296 swiper.emit('reachBeginning toEdge');
2297 }
2298
2299 if (isEnd && !wasEnd) {
2300 swiper.emit('reachEnd toEdge');
2301 }
2302
2303 if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
2304 swiper.emit('fromEdge');
2305 }
2306
2307 swiper.emit('progress', progress);
2308}
2309
2310function updateSlidesClasses() {
2311 var swiper = this;
2312 var slides = swiper.slides,
2313 params = swiper.params,
2314 $wrapperEl = swiper.$wrapperEl,
2315 activeIndex = swiper.activeIndex,
2316 realIndex = swiper.realIndex;
2317 var isVirtual = swiper.virtual && params.virtual.enabled;
2318 slides.removeClass(params.slideActiveClass + " " + params.slideNextClass + " " + params.slidePrevClass + " " + params.slideDuplicateActiveClass + " " + params.slideDuplicateNextClass + " " + params.slideDuplicatePrevClass);
2319 var activeSlide;
2320
2321 if (isVirtual) {
2322 activeSlide = swiper.$wrapperEl.find("." + params.slideClass + "[data-swiper-slide-index=\"" + activeIndex + "\"]");
2323 } else {
2324 activeSlide = slides.eq(activeIndex);
2325 } // Active classes
2326
2327
2328 activeSlide.addClass(params.slideActiveClass);
2329
2330 if (params.loop) {
2331 // Duplicate to all looped slides
2332 if (activeSlide.hasClass(params.slideDuplicateClass)) {
2333 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + realIndex + "\"]").addClass(params.slideDuplicateActiveClass);
2334 } else {
2335 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + realIndex + "\"]").addClass(params.slideDuplicateActiveClass);
2336 }
2337 } // Next Slide
2338
2339
2340 var nextSlide = activeSlide.nextAll("." + params.slideClass).eq(0).addClass(params.slideNextClass);
2341
2342 if (params.loop && nextSlide.length === 0) {
2343 nextSlide = slides.eq(0);
2344 nextSlide.addClass(params.slideNextClass);
2345 } // Prev Slide
2346
2347
2348 var prevSlide = activeSlide.prevAll("." + params.slideClass).eq(0).addClass(params.slidePrevClass);
2349
2350 if (params.loop && prevSlide.length === 0) {
2351 prevSlide = slides.eq(-1);
2352 prevSlide.addClass(params.slidePrevClass);
2353 }
2354
2355 if (params.loop) {
2356 // Duplicate to all looped slides
2357 if (nextSlide.hasClass(params.slideDuplicateClass)) {
2358 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + nextSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicateNextClass);
2359 } else {
2360 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + nextSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicateNextClass);
2361 }
2362
2363 if (prevSlide.hasClass(params.slideDuplicateClass)) {
2364 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + prevSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicatePrevClass);
2365 } else {
2366 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + prevSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicatePrevClass);
2367 }
2368 }
2369
2370 swiper.emitSlidesClasses();
2371}
2372
2373function updateActiveIndex(newActiveIndex) {
2374 var swiper = this;
2375 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2376 var slidesGrid = swiper.slidesGrid,
2377 snapGrid = swiper.snapGrid,
2378 params = swiper.params,
2379 previousIndex = swiper.activeIndex,
2380 previousRealIndex = swiper.realIndex,
2381 previousSnapIndex = swiper.snapIndex;
2382 var activeIndex = newActiveIndex;
2383 var snapIndex;
2384
2385 if (typeof activeIndex === 'undefined') {
2386 for (var i = 0; i < slidesGrid.length; i += 1) {
2387 if (typeof slidesGrid[i + 1] !== 'undefined') {
2388 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
2389 activeIndex = i;
2390 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
2391 activeIndex = i + 1;
2392 }
2393 } else if (translate >= slidesGrid[i]) {
2394 activeIndex = i;
2395 }
2396 } // Normalize slideIndex
2397
2398
2399 if (params.normalizeSlideIndex) {
2400 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
2401 }
2402 }
2403
2404 if (snapGrid.indexOf(translate) >= 0) {
2405 snapIndex = snapGrid.indexOf(translate);
2406 } else {
2407 var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
2408 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
2409 }
2410
2411 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
2412
2413 if (activeIndex === previousIndex) {
2414 if (snapIndex !== previousSnapIndex) {
2415 swiper.snapIndex = snapIndex;
2416 swiper.emit('snapIndexChange');
2417 }
2418
2419 return;
2420 } // Get real index
2421
2422
2423 var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
2424 extend(swiper, {
2425 snapIndex: snapIndex,
2426 realIndex: realIndex,
2427 previousIndex: previousIndex,
2428 activeIndex: activeIndex
2429 });
2430 swiper.emit('activeIndexChange');
2431 swiper.emit('snapIndexChange');
2432
2433 if (previousRealIndex !== realIndex) {
2434 swiper.emit('realIndexChange');
2435 }
2436
2437 if (swiper.initialized || swiper.params.runCallbacksOnInit) {
2438 swiper.emit('slideChange');
2439 }
2440}
2441
2442function updateClickedSlide(e) {
2443 var swiper = this;
2444 var params = swiper.params;
2445 var slide = $(e.target).closest("." + params.slideClass)[0];
2446 var slideFound = false;
2447 var slideIndex;
2448
2449 if (slide) {
2450 for (var i = 0; i < swiper.slides.length; i += 1) {
2451 if (swiper.slides[i] === slide) {
2452 slideFound = true;
2453 slideIndex = i;
2454 break;
2455 }
2456 }
2457 }
2458
2459 if (slide && slideFound) {
2460 swiper.clickedSlide = slide;
2461
2462 if (swiper.virtual && swiper.params.virtual.enabled) {
2463 swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
2464 } else {
2465 swiper.clickedIndex = slideIndex;
2466 }
2467 } else {
2468 swiper.clickedSlide = undefined;
2469 swiper.clickedIndex = undefined;
2470 return;
2471 }
2472
2473 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
2474 swiper.slideToClickedSlide();
2475 }
2476}
2477
2478var update = {
2479 updateSize: updateSize,
2480 updateSlides: updateSlides,
2481 updateAutoHeight: updateAutoHeight,
2482 updateSlidesOffset: updateSlidesOffset,
2483 updateSlidesProgress: updateSlidesProgress,
2484 updateProgress: updateProgress,
2485 updateSlidesClasses: updateSlidesClasses,
2486 updateActiveIndex: updateActiveIndex,
2487 updateClickedSlide: updateClickedSlide
2488};
2489
2490function getSwiperTranslate(axis) {
2491 if (axis === void 0) {
2492 axis = this.isHorizontal() ? 'x' : 'y';
2493 }
2494
2495 var swiper = this;
2496 var params = swiper.params,
2497 rtl = swiper.rtlTranslate,
2498 translate = swiper.translate,
2499 $wrapperEl = swiper.$wrapperEl;
2500
2501 if (params.virtualTranslate) {
2502 return rtl ? -translate : translate;
2503 }
2504
2505 if (params.cssMode) {
2506 return translate;
2507 }
2508
2509 var currentTranslate = getTranslate($wrapperEl[0], axis);
2510 if (rtl) currentTranslate = -currentTranslate;
2511 return currentTranslate || 0;
2512}
2513
2514function setTranslate(translate, byController) {
2515 var swiper = this;
2516 var rtl = swiper.rtlTranslate,
2517 params = swiper.params,
2518 $wrapperEl = swiper.$wrapperEl,
2519 wrapperEl = swiper.wrapperEl,
2520 progress = swiper.progress;
2521 var x = 0;
2522 var y = 0;
2523 var z = 0;
2524
2525 if (swiper.isHorizontal()) {
2526 x = rtl ? -translate : translate;
2527 } else {
2528 y = translate;
2529 }
2530
2531 if (params.roundLengths) {
2532 x = Math.floor(x);
2533 y = Math.floor(y);
2534 }
2535
2536 if (params.cssMode) {
2537 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
2538 } else if (!params.virtualTranslate) {
2539 $wrapperEl.transform("translate3d(" + x + "px, " + y + "px, " + z + "px)");
2540 }
2541
2542 swiper.previousTranslate = swiper.translate;
2543 swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress
2544
2545 var newProgress;
2546 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
2547
2548 if (translatesDiff === 0) {
2549 newProgress = 0;
2550 } else {
2551 newProgress = (translate - swiper.minTranslate()) / translatesDiff;
2552 }
2553
2554 if (newProgress !== progress) {
2555 swiper.updateProgress(translate);
2556 }
2557
2558 swiper.emit('setTranslate', swiper.translate, byController);
2559}
2560
2561function minTranslate() {
2562 return -this.snapGrid[0];
2563}
2564
2565function maxTranslate() {
2566 return -this.snapGrid[this.snapGrid.length - 1];
2567}
2568
2569function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
2570 if (translate === void 0) {
2571 translate = 0;
2572 }
2573
2574 if (speed === void 0) {
2575 speed = this.params.speed;
2576 }
2577
2578 if (runCallbacks === void 0) {
2579 runCallbacks = true;
2580 }
2581
2582 if (translateBounds === void 0) {
2583 translateBounds = true;
2584 }
2585
2586 var swiper = this;
2587 var params = swiper.params,
2588 wrapperEl = swiper.wrapperEl;
2589
2590 if (swiper.animating && params.preventInteractionOnTransition) {
2591 return false;
2592 }
2593
2594 var minTranslate = swiper.minTranslate();
2595 var maxTranslate = swiper.maxTranslate();
2596 var newTranslate;
2597 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress
2598
2599 swiper.updateProgress(newTranslate);
2600
2601 if (params.cssMode) {
2602 var isH = swiper.isHorizontal();
2603
2604 if (speed === 0) {
2605 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
2606 } else {
2607 // eslint-disable-next-line
2608 if (wrapperEl.scrollTo) {
2609 var _wrapperEl$scrollTo;
2610
2611 wrapperEl.scrollTo((_wrapperEl$scrollTo = {}, _wrapperEl$scrollTo[isH ? 'left' : 'top'] = -newTranslate, _wrapperEl$scrollTo.behavior = 'smooth', _wrapperEl$scrollTo));
2612 } else {
2613 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
2614 }
2615 }
2616
2617 return true;
2618 }
2619
2620 if (speed === 0) {
2621 swiper.setTransition(0);
2622 swiper.setTranslate(newTranslate);
2623
2624 if (runCallbacks) {
2625 swiper.emit('beforeTransitionStart', speed, internal);
2626 swiper.emit('transitionEnd');
2627 }
2628 } else {
2629 swiper.setTransition(speed);
2630 swiper.setTranslate(newTranslate);
2631
2632 if (runCallbacks) {
2633 swiper.emit('beforeTransitionStart', speed, internal);
2634 swiper.emit('transitionStart');
2635 }
2636
2637 if (!swiper.animating) {
2638 swiper.animating = true;
2639
2640 if (!swiper.onTranslateToWrapperTransitionEnd) {
2641 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
2642 if (!swiper || swiper.destroyed) return;
2643 if (e.target !== this) return;
2644 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
2645 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
2646 swiper.onTranslateToWrapperTransitionEnd = null;
2647 delete swiper.onTranslateToWrapperTransitionEnd;
2648
2649 if (runCallbacks) {
2650 swiper.emit('transitionEnd');
2651 }
2652 };
2653 }
2654
2655 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
2656 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
2657 }
2658 }
2659
2660 return true;
2661}
2662
2663var translate = {
2664 getTranslate: getSwiperTranslate,
2665 setTranslate: setTranslate,
2666 minTranslate: minTranslate,
2667 maxTranslate: maxTranslate,
2668 translateTo: translateTo
2669};
2670
2671function setTransition(duration, byController) {
2672 var swiper = this;
2673
2674 if (!swiper.params.cssMode) {
2675 swiper.$wrapperEl.transition(duration);
2676 }
2677
2678 swiper.emit('setTransition', duration, byController);
2679}
2680
2681function transitionStart(runCallbacks, direction) {
2682 if (runCallbacks === void 0) {
2683 runCallbacks = true;
2684 }
2685
2686 var swiper = this;
2687 var activeIndex = swiper.activeIndex,
2688 params = swiper.params,
2689 previousIndex = swiper.previousIndex;
2690 if (params.cssMode) return;
2691
2692 if (params.autoHeight) {
2693 swiper.updateAutoHeight();
2694 }
2695
2696 var dir = direction;
2697
2698 if (!dir) {
2699 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
2700 }
2701
2702 swiper.emit('transitionStart');
2703
2704 if (runCallbacks && activeIndex !== previousIndex) {
2705 if (dir === 'reset') {
2706 swiper.emit('slideResetTransitionStart');
2707 return;
2708 }
2709
2710 swiper.emit('slideChangeTransitionStart');
2711
2712 if (dir === 'next') {
2713 swiper.emit('slideNextTransitionStart');
2714 } else {
2715 swiper.emit('slidePrevTransitionStart');
2716 }
2717 }
2718}
2719
2720function transitionEnd(runCallbacks, direction) {
2721 if (runCallbacks === void 0) {
2722 runCallbacks = true;
2723 }
2724
2725 var swiper = this;
2726 var activeIndex = swiper.activeIndex,
2727 previousIndex = swiper.previousIndex,
2728 params = swiper.params;
2729 swiper.animating = false;
2730 if (params.cssMode) return;
2731 swiper.setTransition(0);
2732 var dir = direction;
2733
2734 if (!dir) {
2735 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
2736 }
2737
2738 swiper.emit('transitionEnd');
2739
2740 if (runCallbacks && activeIndex !== previousIndex) {
2741 if (dir === 'reset') {
2742 swiper.emit('slideResetTransitionEnd');
2743 return;
2744 }
2745
2746 swiper.emit('slideChangeTransitionEnd');
2747
2748 if (dir === 'next') {
2749 swiper.emit('slideNextTransitionEnd');
2750 } else {
2751 swiper.emit('slidePrevTransitionEnd');
2752 }
2753 }
2754}
2755
2756var transition = {
2757 setTransition: setTransition,
2758 transitionStart: transitionStart,
2759 transitionEnd: transitionEnd
2760};
2761
2762function slideTo(index, speed, runCallbacks, internal) {
2763 if (index === void 0) {
2764 index = 0;
2765 }
2766
2767 if (speed === void 0) {
2768 speed = this.params.speed;
2769 }
2770
2771 if (runCallbacks === void 0) {
2772 runCallbacks = true;
2773 }
2774
2775 if (typeof index !== 'number' && typeof index !== 'string') {
2776 throw new Error("The 'index' argument cannot have type other than 'number' or 'string'. [" + typeof index + "] given.");
2777 }
2778
2779 if (typeof index === 'string') {
2780 /**
2781 * The `index` argument converted from `string` to `number`.
2782 * @type {number}
2783 */
2784 var indexAsNumber = parseInt(index, 10);
2785 /**
2786 * Determines whether the `index` argument is a valid `number`
2787 * after being converted from the `string` type.
2788 * @type {boolean}
2789 */
2790
2791 var isValidNumber = isFinite(indexAsNumber);
2792
2793 if (!isValidNumber) {
2794 throw new Error("The passed-in 'index' (string) couldn't be converted to 'number'. [" + index + "] given.");
2795 } // Knowing that the converted `index` is a valid number,
2796 // we can update the original argument's value.
2797
2798
2799 index = indexAsNumber;
2800 }
2801
2802 var swiper = this;
2803 var slideIndex = index;
2804 if (slideIndex < 0) slideIndex = 0;
2805 var params = swiper.params,
2806 snapGrid = swiper.snapGrid,
2807 slidesGrid = swiper.slidesGrid,
2808 previousIndex = swiper.previousIndex,
2809 activeIndex = swiper.activeIndex,
2810 rtl = swiper.rtlTranslate,
2811 wrapperEl = swiper.wrapperEl;
2812
2813 if (swiper.animating && params.preventInteractionOnTransition) {
2814 return false;
2815 }
2816
2817 var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
2818 var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
2819 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
2820
2821 if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
2822 swiper.emit('beforeSlideChangeStart');
2823 }
2824
2825 var translate = -snapGrid[snapIndex]; // Update progress
2826
2827 swiper.updateProgress(translate); // Normalize slideIndex
2828
2829 if (params.normalizeSlideIndex) {
2830 for (var i = 0; i < slidesGrid.length; i += 1) {
2831 var normalizedTranslate = -Math.floor(translate * 100);
2832 var normalizedGird = Math.floor(slidesGrid[i] * 100);
2833 var normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
2834
2835 if (typeof slidesGrid[i + 1] !== 'undefined') {
2836 if (normalizedTranslate >= normalizedGird && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGird) / 2) {
2837 slideIndex = i;
2838 } else if (normalizedTranslate >= normalizedGird && normalizedTranslate < normalizedGridNext) {
2839 slideIndex = i + 1;
2840 }
2841 } else if (normalizedTranslate >= normalizedGird) {
2842 slideIndex = i;
2843 }
2844 }
2845 } // Directions locks
2846
2847
2848 if (swiper.initialized && slideIndex !== activeIndex) {
2849 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
2850 return false;
2851 }
2852
2853 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
2854 if ((activeIndex || 0) !== slideIndex) return false;
2855 }
2856 }
2857
2858 var direction;
2859 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index
2860
2861 if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
2862 swiper.updateActiveIndex(slideIndex); // Update Height
2863
2864 if (params.autoHeight) {
2865 swiper.updateAutoHeight();
2866 }
2867
2868 swiper.updateSlidesClasses();
2869
2870 if (params.effect !== 'slide') {
2871 swiper.setTranslate(translate);
2872 }
2873
2874 if (direction !== 'reset') {
2875 swiper.transitionStart(runCallbacks, direction);
2876 swiper.transitionEnd(runCallbacks, direction);
2877 }
2878
2879 return false;
2880 }
2881
2882 if (params.cssMode) {
2883 var isH = swiper.isHorizontal();
2884 var t = -translate;
2885
2886 if (rtl) {
2887 t = wrapperEl.scrollWidth - wrapperEl.offsetWidth - t;
2888 }
2889
2890 if (speed === 0) {
2891 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
2892 } else {
2893 // eslint-disable-next-line
2894 if (wrapperEl.scrollTo) {
2895 var _wrapperEl$scrollTo;
2896
2897 wrapperEl.scrollTo((_wrapperEl$scrollTo = {}, _wrapperEl$scrollTo[isH ? 'left' : 'top'] = t, _wrapperEl$scrollTo.behavior = 'smooth', _wrapperEl$scrollTo));
2898 } else {
2899 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
2900 }
2901 }
2902
2903 return true;
2904 }
2905
2906 if (speed === 0) {
2907 swiper.setTransition(0);
2908 swiper.setTranslate(translate);
2909 swiper.updateActiveIndex(slideIndex);
2910 swiper.updateSlidesClasses();
2911 swiper.emit('beforeTransitionStart', speed, internal);
2912 swiper.transitionStart(runCallbacks, direction);
2913 swiper.transitionEnd(runCallbacks, direction);
2914 } else {
2915 swiper.setTransition(speed);
2916 swiper.setTranslate(translate);
2917 swiper.updateActiveIndex(slideIndex);
2918 swiper.updateSlidesClasses();
2919 swiper.emit('beforeTransitionStart', speed, internal);
2920 swiper.transitionStart(runCallbacks, direction);
2921
2922 if (!swiper.animating) {
2923 swiper.animating = true;
2924
2925 if (!swiper.onSlideToWrapperTransitionEnd) {
2926 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
2927 if (!swiper || swiper.destroyed) return;
2928 if (e.target !== this) return;
2929 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2930 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2931 swiper.onSlideToWrapperTransitionEnd = null;
2932 delete swiper.onSlideToWrapperTransitionEnd;
2933 swiper.transitionEnd(runCallbacks, direction);
2934 };
2935 }
2936
2937 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
2938 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
2939 }
2940 }
2941
2942 return true;
2943}
2944
2945function slideToLoop(index, speed, runCallbacks, internal) {
2946 if (index === void 0) {
2947 index = 0;
2948 }
2949
2950 if (speed === void 0) {
2951 speed = this.params.speed;
2952 }
2953
2954 if (runCallbacks === void 0) {
2955 runCallbacks = true;
2956 }
2957
2958 var swiper = this;
2959 var newIndex = index;
2960
2961 if (swiper.params.loop) {
2962 newIndex += swiper.loopedSlides;
2963 }
2964
2965 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
2966}
2967
2968/* eslint no-unused-vars: "off" */
2969function slideNext(speed, runCallbacks, internal) {
2970 if (speed === void 0) {
2971 speed = this.params.speed;
2972 }
2973
2974 if (runCallbacks === void 0) {
2975 runCallbacks = true;
2976 }
2977
2978 var swiper = this;
2979 var params = swiper.params,
2980 animating = swiper.animating;
2981 var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
2982
2983 if (params.loop) {
2984 if (animating && params.loopPreventsSlide) return false;
2985 swiper.loopFix(); // eslint-disable-next-line
2986
2987 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
2988 }
2989
2990 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2991}
2992
2993/* eslint no-unused-vars: "off" */
2994function slidePrev(speed, runCallbacks, internal) {
2995 if (speed === void 0) {
2996 speed = this.params.speed;
2997 }
2998
2999 if (runCallbacks === void 0) {
3000 runCallbacks = true;
3001 }
3002
3003 var swiper = this;
3004 var params = swiper.params,
3005 animating = swiper.animating,
3006 snapGrid = swiper.snapGrid,
3007 slidesGrid = swiper.slidesGrid,
3008 rtlTranslate = swiper.rtlTranslate;
3009
3010 if (params.loop) {
3011 if (animating && params.loopPreventsSlide) return false;
3012 swiper.loopFix(); // eslint-disable-next-line
3013
3014 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
3015 }
3016
3017 var translate = rtlTranslate ? swiper.translate : -swiper.translate;
3018
3019 function normalize(val) {
3020 if (val < 0) return -Math.floor(Math.abs(val));
3021 return Math.floor(val);
3022 }
3023
3024 var normalizedTranslate = normalize(translate);
3025 var normalizedSnapGrid = snapGrid.map(function (val) {
3026 return normalize(val);
3027 });
3028 snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
3029 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
3030
3031 if (typeof prevSnap === 'undefined' && params.cssMode) {
3032 snapGrid.forEach(function (snap) {
3033 if (!prevSnap && normalizedTranslate >= snap) prevSnap = snap;
3034 });
3035 }
3036
3037 var prevIndex;
3038
3039 if (typeof prevSnap !== 'undefined') {
3040 prevIndex = slidesGrid.indexOf(prevSnap);
3041 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
3042 }
3043
3044 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
3045}
3046
3047/* eslint no-unused-vars: "off" */
3048function slideReset(speed, runCallbacks, internal) {
3049 if (speed === void 0) {
3050 speed = this.params.speed;
3051 }
3052
3053 if (runCallbacks === void 0) {
3054 runCallbacks = true;
3055 }
3056
3057 var swiper = this;
3058 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
3059}
3060
3061/* eslint no-unused-vars: "off" */
3062function slideToClosest(speed, runCallbacks, internal, threshold) {
3063 if (speed === void 0) {
3064 speed = this.params.speed;
3065 }
3066
3067 if (runCallbacks === void 0) {
3068 runCallbacks = true;
3069 }
3070
3071 if (threshold === void 0) {
3072 threshold = 0.5;
3073 }
3074
3075 var swiper = this;
3076 var index = swiper.activeIndex;
3077 var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
3078 var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
3079 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
3080
3081 if (translate >= swiper.snapGrid[snapIndex]) {
3082 // The current translate is on or after the current snap index, so the choice
3083 // is between the current index and the one after it.
3084 var currentSnap = swiper.snapGrid[snapIndex];
3085 var nextSnap = swiper.snapGrid[snapIndex + 1];
3086
3087 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
3088 index += swiper.params.slidesPerGroup;
3089 }
3090 } else {
3091 // The current translate is before the current snap index, so the choice
3092 // is between the current index and the one before it.
3093 var prevSnap = swiper.snapGrid[snapIndex - 1];
3094 var _currentSnap = swiper.snapGrid[snapIndex];
3095
3096 if (translate - prevSnap <= (_currentSnap - prevSnap) * threshold) {
3097 index -= swiper.params.slidesPerGroup;
3098 }
3099 }
3100
3101 index = Math.max(index, 0);
3102 index = Math.min(index, swiper.slidesGrid.length - 1);
3103 return swiper.slideTo(index, speed, runCallbacks, internal);
3104}
3105
3106function slideToClickedSlide() {
3107 var swiper = this;
3108 var params = swiper.params,
3109 $wrapperEl = swiper.$wrapperEl;
3110 var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
3111 var slideToIndex = swiper.clickedIndex;
3112 var realIndex;
3113
3114 if (params.loop) {
3115 if (swiper.animating) return;
3116 realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
3117
3118 if (params.centeredSlides) {
3119 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
3120 swiper.loopFix();
3121 slideToIndex = $wrapperEl.children("." + params.slideClass + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + params.slideDuplicateClass + ")").eq(0).index();
3122 nextTick(function () {
3123 swiper.slideTo(slideToIndex);
3124 });
3125 } else {
3126 swiper.slideTo(slideToIndex);
3127 }
3128 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
3129 swiper.loopFix();
3130 slideToIndex = $wrapperEl.children("." + params.slideClass + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + params.slideDuplicateClass + ")").eq(0).index();
3131 nextTick(function () {
3132 swiper.slideTo(slideToIndex);
3133 });
3134 } else {
3135 swiper.slideTo(slideToIndex);
3136 }
3137 } else {
3138 swiper.slideTo(slideToIndex);
3139 }
3140}
3141
3142var slide = {
3143 slideTo: slideTo,
3144 slideToLoop: slideToLoop,
3145 slideNext: slideNext,
3146 slidePrev: slidePrev,
3147 slideReset: slideReset,
3148 slideToClosest: slideToClosest,
3149 slideToClickedSlide: slideToClickedSlide
3150};
3151
3152function loopCreate() {
3153 var swiper = this;
3154 var document = getDocument();
3155 var params = swiper.params,
3156 $wrapperEl = swiper.$wrapperEl; // Remove duplicated slides
3157
3158 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass).remove();
3159 var slides = $wrapperEl.children("." + params.slideClass);
3160
3161 if (params.loopFillGroupWithBlank) {
3162 var blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;
3163
3164 if (blankSlidesNum !== params.slidesPerGroup) {
3165 for (var i = 0; i < blankSlidesNum; i += 1) {
3166 var blankNode = $(document.createElement('div')).addClass(params.slideClass + " " + params.slideBlankClass);
3167 $wrapperEl.append(blankNode);
3168 }
3169
3170 slides = $wrapperEl.children("." + params.slideClass);
3171 }
3172 }
3173
3174 if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;
3175 swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
3176 swiper.loopedSlides += params.loopAdditionalSlides;
3177
3178 if (swiper.loopedSlides > slides.length) {
3179 swiper.loopedSlides = slides.length;
3180 }
3181
3182 var prependSlides = [];
3183 var appendSlides = [];
3184 slides.each(function (el, index) {
3185 var slide = $(el);
3186
3187 if (index < swiper.loopedSlides) {
3188 appendSlides.push(el);
3189 }
3190
3191 if (index < slides.length && index >= slides.length - swiper.loopedSlides) {
3192 prependSlides.push(el);
3193 }
3194
3195 slide.attr('data-swiper-slide-index', index);
3196 });
3197
3198 for (var _i = 0; _i < appendSlides.length; _i += 1) {
3199 $wrapperEl.append($(appendSlides[_i].cloneNode(true)).addClass(params.slideDuplicateClass));
3200 }
3201
3202 for (var _i2 = prependSlides.length - 1; _i2 >= 0; _i2 -= 1) {
3203 $wrapperEl.prepend($(prependSlides[_i2].cloneNode(true)).addClass(params.slideDuplicateClass));
3204 }
3205}
3206
3207function loopFix() {
3208 var swiper = this;
3209 swiper.emit('beforeLoopFix');
3210 var activeIndex = swiper.activeIndex,
3211 slides = swiper.slides,
3212 loopedSlides = swiper.loopedSlides,
3213 allowSlidePrev = swiper.allowSlidePrev,
3214 allowSlideNext = swiper.allowSlideNext,
3215 snapGrid = swiper.snapGrid,
3216 rtl = swiper.rtlTranslate;
3217 var newIndex;
3218 swiper.allowSlidePrev = true;
3219 swiper.allowSlideNext = true;
3220 var snapTranslate = -snapGrid[activeIndex];
3221 var diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding
3222
3223 if (activeIndex < loopedSlides) {
3224 newIndex = slides.length - loopedSlides * 3 + activeIndex;
3225 newIndex += loopedSlides;
3226 var slideChanged = swiper.slideTo(newIndex, 0, false, true);
3227
3228 if (slideChanged && diff !== 0) {
3229 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
3230 }
3231 } else if (activeIndex >= slides.length - loopedSlides) {
3232 // Fix For Positive Oversliding
3233 newIndex = -slides.length + activeIndex + loopedSlides;
3234 newIndex += loopedSlides;
3235
3236 var _slideChanged = swiper.slideTo(newIndex, 0, false, true);
3237
3238 if (_slideChanged && diff !== 0) {
3239 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
3240 }
3241 }
3242
3243 swiper.allowSlidePrev = allowSlidePrev;
3244 swiper.allowSlideNext = allowSlideNext;
3245 swiper.emit('loopFix');
3246}
3247
3248function loopDestroy() {
3249 var swiper = this;
3250 var $wrapperEl = swiper.$wrapperEl,
3251 params = swiper.params,
3252 slides = swiper.slides;
3253 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + ",." + params.slideClass + "." + params.slideBlankClass).remove();
3254 slides.removeAttr('data-swiper-slide-index');
3255}
3256
3257var loop = {
3258 loopCreate: loopCreate,
3259 loopFix: loopFix,
3260 loopDestroy: loopDestroy
3261};
3262
3263function setGrabCursor(moving) {
3264 var swiper = this;
3265 if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
3266 var el = swiper.el;
3267 el.style.cursor = 'move';
3268 el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
3269 el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
3270 el.style.cursor = moving ? 'grabbing' : 'grab';
3271}
3272
3273function unsetGrabCursor() {
3274 var swiper = this;
3275
3276 if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
3277 return;
3278 }
3279
3280 swiper.el.style.cursor = '';
3281}
3282
3283var grabCursor = {
3284 setGrabCursor: setGrabCursor,
3285 unsetGrabCursor: unsetGrabCursor
3286};
3287
3288function appendSlide(slides) {
3289 var swiper = this;
3290 var $wrapperEl = swiper.$wrapperEl,
3291 params = swiper.params;
3292
3293 if (params.loop) {
3294 swiper.loopDestroy();
3295 }
3296
3297 if (typeof slides === 'object' && 'length' in slides) {
3298 for (var i = 0; i < slides.length; i += 1) {
3299 if (slides[i]) $wrapperEl.append(slides[i]);
3300 }
3301 } else {
3302 $wrapperEl.append(slides);
3303 }
3304
3305 if (params.loop) {
3306 swiper.loopCreate();
3307 }
3308
3309 if (!(params.observer && swiper.support.observer)) {
3310 swiper.update();
3311 }
3312}
3313
3314function prependSlide(slides) {
3315 var swiper = this;
3316 var params = swiper.params,
3317 $wrapperEl = swiper.$wrapperEl,
3318 activeIndex = swiper.activeIndex;
3319
3320 if (params.loop) {
3321 swiper.loopDestroy();
3322 }
3323
3324 var newActiveIndex = activeIndex + 1;
3325
3326 if (typeof slides === 'object' && 'length' in slides) {
3327 for (var i = 0; i < slides.length; i += 1) {
3328 if (slides[i]) $wrapperEl.prepend(slides[i]);
3329 }
3330
3331 newActiveIndex = activeIndex + slides.length;
3332 } else {
3333 $wrapperEl.prepend(slides);
3334 }
3335
3336 if (params.loop) {
3337 swiper.loopCreate();
3338 }
3339
3340 if (!(params.observer && swiper.support.observer)) {
3341 swiper.update();
3342 }
3343
3344 swiper.slideTo(newActiveIndex, 0, false);
3345}
3346
3347function addSlide(index, slides) {
3348 var swiper = this;
3349 var $wrapperEl = swiper.$wrapperEl,
3350 params = swiper.params,
3351 activeIndex = swiper.activeIndex;
3352 var activeIndexBuffer = activeIndex;
3353
3354 if (params.loop) {
3355 activeIndexBuffer -= swiper.loopedSlides;
3356 swiper.loopDestroy();
3357 swiper.slides = $wrapperEl.children("." + params.slideClass);
3358 }
3359
3360 var baseLength = swiper.slides.length;
3361
3362 if (index <= 0) {
3363 swiper.prependSlide(slides);
3364 return;
3365 }
3366
3367 if (index >= baseLength) {
3368 swiper.appendSlide(slides);
3369 return;
3370 }
3371
3372 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
3373 var slidesBuffer = [];
3374
3375 for (var i = baseLength - 1; i >= index; i -= 1) {
3376 var currentSlide = swiper.slides.eq(i);
3377 currentSlide.remove();
3378 slidesBuffer.unshift(currentSlide);
3379 }
3380
3381 if (typeof slides === 'object' && 'length' in slides) {
3382 for (var _i = 0; _i < slides.length; _i += 1) {
3383 if (slides[_i]) $wrapperEl.append(slides[_i]);
3384 }
3385
3386 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
3387 } else {
3388 $wrapperEl.append(slides);
3389 }
3390
3391 for (var _i2 = 0; _i2 < slidesBuffer.length; _i2 += 1) {
3392 $wrapperEl.append(slidesBuffer[_i2]);
3393 }
3394
3395 if (params.loop) {
3396 swiper.loopCreate();
3397 }
3398
3399 if (!(params.observer && swiper.support.observer)) {
3400 swiper.update();
3401 }
3402
3403 if (params.loop) {
3404 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
3405 } else {
3406 swiper.slideTo(newActiveIndex, 0, false);
3407 }
3408}
3409
3410function removeSlide(slidesIndexes) {
3411 var swiper = this;
3412 var params = swiper.params,
3413 $wrapperEl = swiper.$wrapperEl,
3414 activeIndex = swiper.activeIndex;
3415 var activeIndexBuffer = activeIndex;
3416
3417 if (params.loop) {
3418 activeIndexBuffer -= swiper.loopedSlides;
3419 swiper.loopDestroy();
3420 swiper.slides = $wrapperEl.children("." + params.slideClass);
3421 }
3422
3423 var newActiveIndex = activeIndexBuffer;
3424 var indexToRemove;
3425
3426 if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
3427 for (var i = 0; i < slidesIndexes.length; i += 1) {
3428 indexToRemove = slidesIndexes[i];
3429 if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();
3430 if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
3431 }
3432
3433 newActiveIndex = Math.max(newActiveIndex, 0);
3434 } else {
3435 indexToRemove = slidesIndexes;
3436 if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();
3437 if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
3438 newActiveIndex = Math.max(newActiveIndex, 0);
3439 }
3440
3441 if (params.loop) {
3442 swiper.loopCreate();
3443 }
3444
3445 if (!(params.observer && swiper.support.observer)) {
3446 swiper.update();
3447 }
3448
3449 if (params.loop) {
3450 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
3451 } else {
3452 swiper.slideTo(newActiveIndex, 0, false);
3453 }
3454}
3455
3456function removeAllSlides() {
3457 var swiper = this;
3458 var slidesIndexes = [];
3459
3460 for (var i = 0; i < swiper.slides.length; i += 1) {
3461 slidesIndexes.push(i);
3462 }
3463
3464 swiper.removeSlide(slidesIndexes);
3465}
3466
3467var manipulation = {
3468 appendSlide: appendSlide,
3469 prependSlide: prependSlide,
3470 addSlide: addSlide,
3471 removeSlide: removeSlide,
3472 removeAllSlides: removeAllSlides
3473};
3474
3475function onTouchStart(event) {
3476 var swiper = this;
3477 var document = getDocument();
3478 var window = getWindow();
3479 var data = swiper.touchEventsData;
3480 var params = swiper.params,
3481 touches = swiper.touches;
3482
3483 if (swiper.animating && params.preventInteractionOnTransition) {
3484 return;
3485 }
3486
3487 var e = event;
3488 if (e.originalEvent) e = e.originalEvent;
3489 var $targetEl = $(e.target);
3490
3491 if (params.touchEventsTarget === 'wrapper') {
3492 if (!$targetEl.closest(swiper.wrapperEl).length) return;
3493 }
3494
3495 data.isTouchEvent = e.type === 'touchstart';
3496 if (!data.isTouchEvent && 'which' in e && e.which === 3) return;
3497 if (!data.isTouchEvent && 'button' in e && e.button > 0) return;
3498 if (data.isTouched && data.isMoved) return; // change target el for shadow root componenet
3499
3500 var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
3501
3502 if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {
3503 $targetEl = $(event.path[0]);
3504 }
3505
3506 if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : "." + params.noSwipingClass)[0]) {
3507 swiper.allowClick = true;
3508 return;
3509 }
3510
3511 if (params.swipeHandler) {
3512 if (!$targetEl.closest(params.swipeHandler)[0]) return;
3513 }
3514
3515 touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
3516 touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
3517 var startX = touches.currentX;
3518 var startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
3519
3520 var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
3521 var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
3522
3523 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
3524 if (edgeSwipeDetection === 'prevent') {
3525 event.preventDefault();
3526 } else {
3527 return;
3528 }
3529 }
3530
3531 extend(data, {
3532 isTouched: true,
3533 isMoved: false,
3534 allowTouchCallbacks: true,
3535 isScrolling: undefined,
3536 startMoving: undefined
3537 });
3538 touches.startX = startX;
3539 touches.startY = startY;
3540 data.touchStartTime = now();
3541 swiper.allowClick = true;
3542 swiper.updateSize();
3543 swiper.swipeDirection = undefined;
3544 if (params.threshold > 0) data.allowThresholdMove = false;
3545
3546 if (e.type !== 'touchstart') {
3547 var preventDefault = true;
3548 if ($targetEl.is(data.formElements)) preventDefault = false;
3549
3550 if (document.activeElement && $(document.activeElement).is(data.formElements) && document.activeElement !== $targetEl[0]) {
3551 document.activeElement.blur();
3552 }
3553
3554 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
3555
3556 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {
3557 e.preventDefault();
3558 }
3559 }
3560
3561 swiper.emit('touchStart', e);
3562}
3563
3564function onTouchMove(event) {
3565 var document = getDocument();
3566 var swiper = this;
3567 var data = swiper.touchEventsData;
3568 var params = swiper.params,
3569 touches = swiper.touches,
3570 rtl = swiper.rtlTranslate;
3571 var e = event;
3572 if (e.originalEvent) e = e.originalEvent;
3573
3574 if (!data.isTouched) {
3575 if (data.startMoving && data.isScrolling) {
3576 swiper.emit('touchMoveOpposite', e);
3577 }
3578
3579 return;
3580 }
3581
3582 if (data.isTouchEvent && e.type !== 'touchmove') return;
3583 var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
3584 var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
3585 var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
3586
3587 if (e.preventedByNestedSwiper) {
3588 touches.startX = pageX;
3589 touches.startY = pageY;
3590 return;
3591 }
3592
3593 if (!swiper.allowTouchMove) {
3594 // isMoved = true;
3595 swiper.allowClick = false;
3596
3597 if (data.isTouched) {
3598 extend(touches, {
3599 startX: pageX,
3600 startY: pageY,
3601 currentX: pageX,
3602 currentY: pageY
3603 });
3604 data.touchStartTime = now();
3605 }
3606
3607 return;
3608 }
3609
3610 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
3611 if (swiper.isVertical()) {
3612 // Vertical
3613 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
3614 data.isTouched = false;
3615 data.isMoved = false;
3616 return;
3617 }
3618 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
3619 return;
3620 }
3621 }
3622
3623 if (data.isTouchEvent && document.activeElement) {
3624 if (e.target === document.activeElement && $(e.target).is(data.formElements)) {
3625 data.isMoved = true;
3626 swiper.allowClick = false;
3627 return;
3628 }
3629 }
3630
3631 if (data.allowTouchCallbacks) {
3632 swiper.emit('touchMove', e);
3633 }
3634
3635 if (e.targetTouches && e.targetTouches.length > 1) return;
3636 touches.currentX = pageX;
3637 touches.currentY = pageY;
3638 var diffX = touches.currentX - touches.startX;
3639 var diffY = touches.currentY - touches.startY;
3640 if (swiper.params.threshold && Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) < swiper.params.threshold) return;
3641
3642 if (typeof data.isScrolling === 'undefined') {
3643 var touchAngle;
3644
3645 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
3646 data.isScrolling = false;
3647 } else {
3648 // eslint-disable-next-line
3649 if (diffX * diffX + diffY * diffY >= 25) {
3650 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
3651 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
3652 }
3653 }
3654 }
3655
3656 if (data.isScrolling) {
3657 swiper.emit('touchMoveOpposite', e);
3658 }
3659
3660 if (typeof data.startMoving === 'undefined') {
3661 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
3662 data.startMoving = true;
3663 }
3664 }
3665
3666 if (data.isScrolling) {
3667 data.isTouched = false;
3668 return;
3669 }
3670
3671 if (!data.startMoving) {
3672 return;
3673 }
3674
3675 swiper.allowClick = false;
3676
3677 if (!params.cssMode && e.cancelable) {
3678 e.preventDefault();
3679 }
3680
3681 if (params.touchMoveStopPropagation && !params.nested) {
3682 e.stopPropagation();
3683 }
3684
3685 if (!data.isMoved) {
3686 if (params.loop) {
3687 swiper.loopFix();
3688 }
3689
3690 data.startTranslate = swiper.getTranslate();
3691 swiper.setTransition(0);
3692
3693 if (swiper.animating) {
3694 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
3695 }
3696
3697 data.allowMomentumBounce = false; // Grab Cursor
3698
3699 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
3700 swiper.setGrabCursor(true);
3701 }
3702
3703 swiper.emit('sliderFirstMove', e);
3704 }
3705
3706 swiper.emit('sliderMove', e);
3707 data.isMoved = true;
3708 var diff = swiper.isHorizontal() ? diffX : diffY;
3709 touches.diff = diff;
3710 diff *= params.touchRatio;
3711 if (rtl) diff = -diff;
3712 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
3713 data.currentTranslate = diff + data.startTranslate;
3714 var disableParentSwiper = true;
3715 var resistanceRatio = params.resistanceRatio;
3716
3717 if (params.touchReleaseOnEdges) {
3718 resistanceRatio = 0;
3719 }
3720
3721 if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {
3722 disableParentSwiper = false;
3723 if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + Math.pow(-swiper.minTranslate() + data.startTranslate + diff, resistanceRatio);
3724 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
3725 disableParentSwiper = false;
3726 if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - Math.pow(swiper.maxTranslate() - data.startTranslate - diff, resistanceRatio);
3727 }
3728
3729 if (disableParentSwiper) {
3730 e.preventedByNestedSwiper = true;
3731 } // Directions locks
3732
3733
3734 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
3735 data.currentTranslate = data.startTranslate;
3736 }
3737
3738 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
3739 data.currentTranslate = data.startTranslate;
3740 }
3741
3742 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
3743 data.currentTranslate = data.startTranslate;
3744 } // Threshold
3745
3746
3747 if (params.threshold > 0) {
3748 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
3749 if (!data.allowThresholdMove) {
3750 data.allowThresholdMove = true;
3751 touches.startX = touches.currentX;
3752 touches.startY = touches.currentY;
3753 data.currentTranslate = data.startTranslate;
3754 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
3755 return;
3756 }
3757 } else {
3758 data.currentTranslate = data.startTranslate;
3759 return;
3760 }
3761 }
3762
3763 if (!params.followFinger || params.cssMode) return; // Update active index in free mode
3764
3765 if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
3766 swiper.updateActiveIndex();
3767 swiper.updateSlidesClasses();
3768 }
3769
3770 if (params.freeMode) {
3771 // Velocity
3772 if (data.velocities.length === 0) {
3773 data.velocities.push({
3774 position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
3775 time: data.touchStartTime
3776 });
3777 }
3778
3779 data.velocities.push({
3780 position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
3781 time: now()
3782 });
3783 } // Update progress
3784
3785
3786 swiper.updateProgress(data.currentTranslate); // Update translate
3787
3788 swiper.setTranslate(data.currentTranslate);
3789}
3790
3791function onTouchEnd(event) {
3792 var swiper = this;
3793 var data = swiper.touchEventsData;
3794 var params = swiper.params,
3795 touches = swiper.touches,
3796 rtl = swiper.rtlTranslate,
3797 $wrapperEl = swiper.$wrapperEl,
3798 slidesGrid = swiper.slidesGrid,
3799 snapGrid = swiper.snapGrid;
3800 var e = event;
3801 if (e.originalEvent) e = e.originalEvent;
3802
3803 if (data.allowTouchCallbacks) {
3804 swiper.emit('touchEnd', e);
3805 }
3806
3807 data.allowTouchCallbacks = false;
3808
3809 if (!data.isTouched) {
3810 if (data.isMoved && params.grabCursor) {
3811 swiper.setGrabCursor(false);
3812 }
3813
3814 data.isMoved = false;
3815 data.startMoving = false;
3816 return;
3817 } // Return Grab Cursor
3818
3819
3820 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
3821 swiper.setGrabCursor(false);
3822 } // Time diff
3823
3824
3825 var touchEndTime = now();
3826 var timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click
3827
3828 if (swiper.allowClick) {
3829 swiper.updateClickedSlide(e);
3830 swiper.emit('tap click', e);
3831
3832 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
3833 swiper.emit('doubleTap doubleClick', e);
3834 }
3835 }
3836
3837 data.lastClickTime = now();
3838 nextTick(function () {
3839 if (!swiper.destroyed) swiper.allowClick = true;
3840 });
3841
3842 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
3843 data.isTouched = false;
3844 data.isMoved = false;
3845 data.startMoving = false;
3846 return;
3847 }
3848
3849 data.isTouched = false;
3850 data.isMoved = false;
3851 data.startMoving = false;
3852 var currentPos;
3853
3854 if (params.followFinger) {
3855 currentPos = rtl ? swiper.translate : -swiper.translate;
3856 } else {
3857 currentPos = -data.currentTranslate;
3858 }
3859
3860 if (params.cssMode) {
3861 return;
3862 }
3863
3864 if (params.freeMode) {
3865 if (currentPos < -swiper.minTranslate()) {
3866 swiper.slideTo(swiper.activeIndex);
3867 return;
3868 }
3869
3870 if (currentPos > -swiper.maxTranslate()) {
3871 if (swiper.slides.length < snapGrid.length) {
3872 swiper.slideTo(snapGrid.length - 1);
3873 } else {
3874 swiper.slideTo(swiper.slides.length - 1);
3875 }
3876
3877 return;
3878 }
3879
3880 if (params.freeModeMomentum) {
3881 if (data.velocities.length > 1) {
3882 var lastMoveEvent = data.velocities.pop();
3883 var velocityEvent = data.velocities.pop();
3884 var distance = lastMoveEvent.position - velocityEvent.position;
3885 var time = lastMoveEvent.time - velocityEvent.time;
3886 swiper.velocity = distance / time;
3887 swiper.velocity /= 2;
3888
3889 if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
3890 swiper.velocity = 0;
3891 } // this implies that the user stopped moving a finger then released.
3892 // There would be no events with distance zero, so the last event is stale.
3893
3894
3895 if (time > 150 || now() - lastMoveEvent.time > 300) {
3896 swiper.velocity = 0;
3897 }
3898 } else {
3899 swiper.velocity = 0;
3900 }
3901
3902 swiper.velocity *= params.freeModeMomentumVelocityRatio;
3903 data.velocities.length = 0;
3904 var momentumDuration = 1000 * params.freeModeMomentumRatio;
3905 var momentumDistance = swiper.velocity * momentumDuration;
3906 var newPosition = swiper.translate + momentumDistance;
3907 if (rtl) newPosition = -newPosition;
3908 var doBounce = false;
3909 var afterBouncePosition;
3910 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
3911 var needsLoopFix;
3912
3913 if (newPosition < swiper.maxTranslate()) {
3914 if (params.freeModeMomentumBounce) {
3915 if (newPosition + swiper.maxTranslate() < -bounceAmount) {
3916 newPosition = swiper.maxTranslate() - bounceAmount;
3917 }
3918
3919 afterBouncePosition = swiper.maxTranslate();
3920 doBounce = true;
3921 data.allowMomentumBounce = true;
3922 } else {
3923 newPosition = swiper.maxTranslate();
3924 }
3925
3926 if (params.loop && params.centeredSlides) needsLoopFix = true;
3927 } else if (newPosition > swiper.minTranslate()) {
3928 if (params.freeModeMomentumBounce) {
3929 if (newPosition - swiper.minTranslate() > bounceAmount) {
3930 newPosition = swiper.minTranslate() + bounceAmount;
3931 }
3932
3933 afterBouncePosition = swiper.minTranslate();
3934 doBounce = true;
3935 data.allowMomentumBounce = true;
3936 } else {
3937 newPosition = swiper.minTranslate();
3938 }
3939
3940 if (params.loop && params.centeredSlides) needsLoopFix = true;
3941 } else if (params.freeModeSticky) {
3942 var nextSlide;
3943
3944 for (var j = 0; j < snapGrid.length; j += 1) {
3945 if (snapGrid[j] > -newPosition) {
3946 nextSlide = j;
3947 break;
3948 }
3949 }
3950
3951 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
3952 newPosition = snapGrid[nextSlide];
3953 } else {
3954 newPosition = snapGrid[nextSlide - 1];
3955 }
3956
3957 newPosition = -newPosition;
3958 }
3959
3960 if (needsLoopFix) {
3961 swiper.once('transitionEnd', function () {
3962 swiper.loopFix();
3963 });
3964 } // Fix duration
3965
3966
3967 if (swiper.velocity !== 0) {
3968 if (rtl) {
3969 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
3970 } else {
3971 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
3972 }
3973
3974 if (params.freeModeSticky) {
3975 // If freeModeSticky is active and the user ends a swipe with a slow-velocity
3976 // event, then durations can be 20+ seconds to slide one (or zero!) slides.
3977 // It's easy to see this when simulating touch with mouse events. To fix this,
3978 // limit single-slide swipes to the default slide duration. This also has the
3979 // nice side effect of matching slide speed if the user stopped moving before
3980 // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
3981 // For faster swipes, also apply limits (albeit higher ones).
3982 var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
3983 var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
3984
3985 if (moveDistance < currentSlideSize) {
3986 momentumDuration = params.speed;
3987 } else if (moveDistance < 2 * currentSlideSize) {
3988 momentumDuration = params.speed * 1.5;
3989 } else {
3990 momentumDuration = params.speed * 2.5;
3991 }
3992 }
3993 } else if (params.freeModeSticky) {
3994 swiper.slideToClosest();
3995 return;
3996 }
3997
3998 if (params.freeModeMomentumBounce && doBounce) {
3999 swiper.updateProgress(afterBouncePosition);
4000 swiper.setTransition(momentumDuration);
4001 swiper.setTranslate(newPosition);
4002 swiper.transitionStart(true, swiper.swipeDirection);
4003 swiper.animating = true;
4004 $wrapperEl.transitionEnd(function () {
4005 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
4006 swiper.emit('momentumBounce');
4007 swiper.setTransition(params.speed);
4008 setTimeout(function () {
4009 swiper.setTranslate(afterBouncePosition);
4010 $wrapperEl.transitionEnd(function () {
4011 if (!swiper || swiper.destroyed) return;
4012 swiper.transitionEnd();
4013 });
4014 }, 0);
4015 });
4016 } else if (swiper.velocity) {
4017 swiper.updateProgress(newPosition);
4018 swiper.setTransition(momentumDuration);
4019 swiper.setTranslate(newPosition);
4020 swiper.transitionStart(true, swiper.swipeDirection);
4021
4022 if (!swiper.animating) {
4023 swiper.animating = true;
4024 $wrapperEl.transitionEnd(function () {
4025 if (!swiper || swiper.destroyed) return;
4026 swiper.transitionEnd();
4027 });
4028 }
4029 } else {
4030 swiper.emit('_freeModeNoMomentumRelease');
4031 swiper.updateProgress(newPosition);
4032 }
4033
4034 swiper.updateActiveIndex();
4035 swiper.updateSlidesClasses();
4036 } else if (params.freeModeSticky) {
4037 swiper.slideToClosest();
4038 return;
4039 } else if (params.freeMode) {
4040 swiper.emit('_freeModeNoMomentumRelease');
4041 }
4042
4043 if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
4044 swiper.updateProgress();
4045 swiper.updateActiveIndex();
4046 swiper.updateSlidesClasses();
4047 }
4048
4049 return;
4050 } // Find current slide
4051
4052
4053 var stopIndex = 0;
4054 var groupSize = swiper.slidesSizesGrid[0];
4055
4056 for (var i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
4057 var _increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
4058
4059 if (typeof slidesGrid[i + _increment] !== 'undefined') {
4060 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + _increment]) {
4061 stopIndex = i;
4062 groupSize = slidesGrid[i + _increment] - slidesGrid[i];
4063 }
4064 } else if (currentPos >= slidesGrid[i]) {
4065 stopIndex = i;
4066 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
4067 }
4068 } // Find current slide size
4069
4070
4071 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
4072 var increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
4073
4074 if (timeDiff > params.longSwipesMs) {
4075 // Long touches
4076 if (!params.longSwipes) {
4077 swiper.slideTo(swiper.activeIndex);
4078 return;
4079 }
4080
4081 if (swiper.swipeDirection === 'next') {
4082 if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
4083 }
4084
4085 if (swiper.swipeDirection === 'prev') {
4086 if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
4087 }
4088 } else {
4089 // Short swipes
4090 if (!params.shortSwipes) {
4091 swiper.slideTo(swiper.activeIndex);
4092 return;
4093 }
4094
4095 var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
4096
4097 if (!isNavButtonTarget) {
4098 if (swiper.swipeDirection === 'next') {
4099 swiper.slideTo(stopIndex + increment);
4100 }
4101
4102 if (swiper.swipeDirection === 'prev') {
4103 swiper.slideTo(stopIndex);
4104 }
4105 } else if (e.target === swiper.navigation.nextEl) {
4106 swiper.slideTo(stopIndex + increment);
4107 } else {
4108 swiper.slideTo(stopIndex);
4109 }
4110 }
4111}
4112
4113function onResize() {
4114 var swiper = this;
4115 var params = swiper.params,
4116 el = swiper.el;
4117 if (el && el.offsetWidth === 0) return; // Breakpoints
4118
4119 if (params.breakpoints) {
4120 swiper.setBreakpoint();
4121 } // Save locks
4122
4123
4124 var allowSlideNext = swiper.allowSlideNext,
4125 allowSlidePrev = swiper.allowSlidePrev,
4126 snapGrid = swiper.snapGrid; // Disable locks on resize
4127
4128 swiper.allowSlideNext = true;
4129 swiper.allowSlidePrev = true;
4130 swiper.updateSize();
4131 swiper.updateSlides();
4132 swiper.updateSlidesClasses();
4133
4134 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {
4135 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
4136 } else {
4137 swiper.slideTo(swiper.activeIndex, 0, false, true);
4138 }
4139
4140 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
4141 swiper.autoplay.run();
4142 } // Return locks after resize
4143
4144
4145 swiper.allowSlidePrev = allowSlidePrev;
4146 swiper.allowSlideNext = allowSlideNext;
4147
4148 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
4149 swiper.checkOverflow();
4150 }
4151}
4152
4153function onClick(e) {
4154 var swiper = this;
4155
4156 if (!swiper.allowClick) {
4157 if (swiper.params.preventClicks) e.preventDefault();
4158
4159 if (swiper.params.preventClicksPropagation && swiper.animating) {
4160 e.stopPropagation();
4161 e.stopImmediatePropagation();
4162 }
4163 }
4164}
4165
4166function onScroll() {
4167 var swiper = this;
4168 var wrapperEl = swiper.wrapperEl,
4169 rtlTranslate = swiper.rtlTranslate;
4170 swiper.previousTranslate = swiper.translate;
4171
4172 if (swiper.isHorizontal()) {
4173 if (rtlTranslate) {
4174 swiper.translate = wrapperEl.scrollWidth - wrapperEl.offsetWidth - wrapperEl.scrollLeft;
4175 } else {
4176 swiper.translate = -wrapperEl.scrollLeft;
4177 }
4178 } else {
4179 swiper.translate = -wrapperEl.scrollTop;
4180 } // eslint-disable-next-line
4181
4182
4183 if (swiper.translate === -0) swiper.translate = 0;
4184 swiper.updateActiveIndex();
4185 swiper.updateSlidesClasses();
4186 var newProgress;
4187 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
4188
4189 if (translatesDiff === 0) {
4190 newProgress = 0;
4191 } else {
4192 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
4193 }
4194
4195 if (newProgress !== swiper.progress) {
4196 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
4197 }
4198
4199 swiper.emit('setTranslate', swiper.translate, false);
4200}
4201
4202var dummyEventAttached = false;
4203
4204function dummyEventListener() {}
4205
4206function attachEvents() {
4207 var swiper = this;
4208 var document = getDocument();
4209 var params = swiper.params,
4210 touchEvents = swiper.touchEvents,
4211 el = swiper.el,
4212 wrapperEl = swiper.wrapperEl,
4213 device = swiper.device,
4214 support = swiper.support;
4215 swiper.onTouchStart = onTouchStart.bind(swiper);
4216 swiper.onTouchMove = onTouchMove.bind(swiper);
4217 swiper.onTouchEnd = onTouchEnd.bind(swiper);
4218
4219 if (params.cssMode) {
4220 swiper.onScroll = onScroll.bind(swiper);
4221 }
4222
4223 swiper.onClick = onClick.bind(swiper);
4224 var capture = !!params.nested; // Touch Events
4225
4226 if (!support.touch && support.pointerEvents) {
4227 el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
4228 document.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
4229 document.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
4230 } else {
4231 if (support.touch) {
4232 var passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {
4233 passive: true,
4234 capture: false
4235 } : false;
4236 el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
4237 el.addEventListener(touchEvents.move, swiper.onTouchMove, support.passiveListener ? {
4238 passive: false,
4239 capture: capture
4240 } : capture);
4241 el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
4242
4243 if (touchEvents.cancel) {
4244 el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
4245 }
4246
4247 if (!dummyEventAttached) {
4248 document.addEventListener('touchstart', dummyEventListener);
4249 dummyEventAttached = true;
4250 }
4251 }
4252
4253 if (params.simulateTouch && !device.ios && !device.android || params.simulateTouch && !support.touch && device.ios) {
4254 el.addEventListener('mousedown', swiper.onTouchStart, false);
4255 document.addEventListener('mousemove', swiper.onTouchMove, capture);
4256 document.addEventListener('mouseup', swiper.onTouchEnd, false);
4257 }
4258 } // Prevent Links Clicks
4259
4260
4261 if (params.preventClicks || params.preventClicksPropagation) {
4262 el.addEventListener('click', swiper.onClick, true);
4263 }
4264
4265 if (params.cssMode) {
4266 wrapperEl.addEventListener('scroll', swiper.onScroll);
4267 } // Resize handler
4268
4269
4270 if (params.updateOnWindowResize) {
4271 swiper.on(device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
4272 } else {
4273 swiper.on('observerUpdate', onResize, true);
4274 }
4275}
4276
4277function detachEvents() {
4278 var swiper = this;
4279 var document = getDocument();
4280 var params = swiper.params,
4281 touchEvents = swiper.touchEvents,
4282 el = swiper.el,
4283 wrapperEl = swiper.wrapperEl,
4284 device = swiper.device,
4285 support = swiper.support;
4286 var capture = !!params.nested; // Touch Events
4287
4288 if (!support.touch && support.pointerEvents) {
4289 el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
4290 document.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
4291 document.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
4292 } else {
4293 if (support.touch) {
4294 var passiveListener = touchEvents.start === 'onTouchStart' && support.passiveListener && params.passiveListeners ? {
4295 passive: true,
4296 capture: false
4297 } : false;
4298 el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
4299 el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
4300 el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
4301
4302 if (touchEvents.cancel) {
4303 el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
4304 }
4305 }
4306
4307 if (params.simulateTouch && !device.ios && !device.android || params.simulateTouch && !support.touch && device.ios) {
4308 el.removeEventListener('mousedown', swiper.onTouchStart, false);
4309 document.removeEventListener('mousemove', swiper.onTouchMove, capture);
4310 document.removeEventListener('mouseup', swiper.onTouchEnd, false);
4311 }
4312 } // Prevent Links Clicks
4313
4314
4315 if (params.preventClicks || params.preventClicksPropagation) {
4316 el.removeEventListener('click', swiper.onClick, true);
4317 }
4318
4319 if (params.cssMode) {
4320 wrapperEl.removeEventListener('scroll', swiper.onScroll);
4321 } // Resize handler
4322
4323
4324 swiper.off(device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize);
4325}
4326
4327var events = {
4328 attachEvents: attachEvents,
4329 detachEvents: detachEvents
4330};
4331
4332function setBreakpoint() {
4333 var swiper = this;
4334 var activeIndex = swiper.activeIndex,
4335 initialized = swiper.initialized,
4336 _swiper$loopedSlides = swiper.loopedSlides,
4337 loopedSlides = _swiper$loopedSlides === void 0 ? 0 : _swiper$loopedSlides,
4338 params = swiper.params,
4339 $el = swiper.$el;
4340 var breakpoints = params.breakpoints;
4341 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters
4342
4343 var breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
4344
4345 if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
4346 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
4347
4348 if (breakpointOnlyParams) {
4349 ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
4350 var paramValue = breakpointOnlyParams[param];
4351 if (typeof paramValue === 'undefined') return;
4352
4353 if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
4354 breakpointOnlyParams[param] = 'auto';
4355 } else if (param === 'slidesPerView') {
4356 breakpointOnlyParams[param] = parseFloat(paramValue);
4357 } else {
4358 breakpointOnlyParams[param] = parseInt(paramValue, 10);
4359 }
4360 });
4361 }
4362
4363 var breakpointParams = breakpointOnlyParams || swiper.originalParams;
4364 var wasMultiRow = params.slidesPerColumn > 1;
4365 var isMultiRow = breakpointParams.slidesPerColumn > 1;
4366
4367 if (wasMultiRow && !isMultiRow) {
4368 $el.removeClass(params.containerModifierClass + "multirow " + params.containerModifierClass + "multirow-column");
4369 swiper.emitContainerClasses();
4370 } else if (!wasMultiRow && isMultiRow) {
4371 $el.addClass(params.containerModifierClass + "multirow");
4372
4373 if (breakpointParams.slidesPerColumnFill === 'column') {
4374 $el.addClass(params.containerModifierClass + "multirow-column");
4375 }
4376
4377 swiper.emitContainerClasses();
4378 }
4379
4380 var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
4381 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
4382
4383 if (directionChanged && initialized) {
4384 swiper.changeDirection();
4385 }
4386
4387 extend(swiper.params, breakpointParams);
4388 extend(swiper, {
4389 allowTouchMove: swiper.params.allowTouchMove,
4390 allowSlideNext: swiper.params.allowSlideNext,
4391 allowSlidePrev: swiper.params.allowSlidePrev
4392 });
4393 swiper.currentBreakpoint = breakpoint;
4394 swiper.emit('_beforeBreakpoint', breakpointParams);
4395
4396 if (needsReLoop && initialized) {
4397 swiper.loopDestroy();
4398 swiper.loopCreate();
4399 swiper.updateSlides();
4400 swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);
4401 }
4402
4403 swiper.emit('breakpoint', breakpointParams);
4404 }
4405}
4406
4407function getBreakpoint(breakpoints, base, containerEl) {
4408 if (base === void 0) {
4409 base = 'window';
4410 }
4411
4412 if (!breakpoints || base === 'container' && !containerEl) return undefined;
4413 var breakpoint = false;
4414 var window = getWindow();
4415 var currentWidth = base === 'window' ? window.innerWidth : containerEl.clientWidth;
4416 var currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
4417 var points = Object.keys(breakpoints).map(function (point) {
4418 if (typeof point === 'string' && point.indexOf('@') === 0) {
4419 var minRatio = parseFloat(point.substr(1));
4420 var value = currentHeight * minRatio;
4421 return {
4422 value: value,
4423 point: point
4424 };
4425 }
4426
4427 return {
4428 value: point,
4429 point: point
4430 };
4431 });
4432 points.sort(function (a, b) {
4433 return parseInt(a.value, 10) - parseInt(b.value, 10);
4434 });
4435
4436 for (var i = 0; i < points.length; i += 1) {
4437 var _points$i = points[i],
4438 point = _points$i.point,
4439 value = _points$i.value;
4440
4441 if (value <= currentWidth) {
4442 breakpoint = point;
4443 }
4444 }
4445
4446 return breakpoint || 'max';
4447}
4448
4449var breakpoints = {
4450 setBreakpoint: setBreakpoint,
4451 getBreakpoint: getBreakpoint
4452};
4453
4454function prepareClasses(entries, prefix) {
4455 var resultClasses = [];
4456 entries.forEach(function (item) {
4457 if (typeof item === 'object') {
4458 Object.keys(item).forEach(function (classNames) {
4459 if (item[classNames]) {
4460 resultClasses.push(prefix + classNames);
4461 }
4462 });
4463 } else if (typeof item === 'string') {
4464 resultClasses.push(prefix + item);
4465 }
4466 });
4467 return resultClasses;
4468}
4469
4470function addClasses() {
4471 var swiper = this;
4472 var classNames = swiper.classNames,
4473 params = swiper.params,
4474 rtl = swiper.rtl,
4475 $el = swiper.$el,
4476 device = swiper.device,
4477 support = swiper.support; // prettier-ignore
4478
4479 var suffixes = prepareClasses(['initialized', params.direction, {
4480 'pointer-events': support.pointerEvents && !support.touch
4481 }, {
4482 'free-mode': params.freeMode
4483 }, {
4484 'autoheight': params.autoHeight
4485 }, {
4486 'rtl': rtl
4487 }, {
4488 'multirow': params.slidesPerColumn > 1
4489 }, {
4490 'multirow-column': params.slidesPerColumn > 1 && params.slidesPerColumnFill === 'column'
4491 }, {
4492 'android': device.android
4493 }, {
4494 'ios': device.ios
4495 }, {
4496 'css-mode': params.cssMode
4497 }], params.containerModifierClass);
4498 classNames.push.apply(classNames, suffixes);
4499 $el.addClass([].concat(classNames).join(' '));
4500 swiper.emitContainerClasses();
4501}
4502
4503function removeClasses() {
4504 var swiper = this;
4505 var $el = swiper.$el,
4506 classNames = swiper.classNames;
4507 $el.removeClass(classNames.join(' '));
4508 swiper.emitContainerClasses();
4509}
4510
4511var classes = {
4512 addClasses: addClasses,
4513 removeClasses: removeClasses
4514};
4515
4516function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {
4517 var window = getWindow();
4518 var image;
4519
4520 function onReady() {
4521 if (callback) callback();
4522 }
4523
4524 var isPicture = $(imageEl).parent('picture')[0];
4525
4526 if (!isPicture && (!imageEl.complete || !checkForComplete)) {
4527 if (src) {
4528 image = new window.Image();
4529 image.onload = onReady;
4530 image.onerror = onReady;
4531
4532 if (sizes) {
4533 image.sizes = sizes;
4534 }
4535
4536 if (srcset) {
4537 image.srcset = srcset;
4538 }
4539
4540 if (src) {
4541 image.src = src;
4542 }
4543 } else {
4544 onReady();
4545 }
4546 } else {
4547 // image already loaded...
4548 onReady();
4549 }
4550}
4551
4552function preloadImages() {
4553 var swiper = this;
4554 swiper.imagesToLoad = swiper.$el.find('img');
4555
4556 function onReady() {
4557 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;
4558 if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;
4559
4560 if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
4561 if (swiper.params.updateOnImagesReady) swiper.update();
4562 swiper.emit('imagesReady');
4563 }
4564 }
4565
4566 for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
4567 var imageEl = swiper.imagesToLoad[i];
4568 swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);
4569 }
4570}
4571
4572var images = {
4573 loadImage: loadImage,
4574 preloadImages: preloadImages
4575};
4576
4577function checkOverflow() {
4578 var swiper = this;
4579 var params = swiper.params;
4580 var wasLocked = swiper.isLocked;
4581 var lastSlidePosition = swiper.slides.length > 0 && params.slidesOffsetBefore + params.spaceBetween * (swiper.slides.length - 1) + swiper.slides[0].offsetWidth * swiper.slides.length;
4582
4583 if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
4584 swiper.isLocked = lastSlidePosition <= swiper.size;
4585 } else {
4586 swiper.isLocked = swiper.snapGrid.length === 1;
4587 }
4588
4589 swiper.allowSlideNext = !swiper.isLocked;
4590 swiper.allowSlidePrev = !swiper.isLocked; // events
4591
4592 if (wasLocked !== swiper.isLocked) swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
4593
4594 if (wasLocked && wasLocked !== swiper.isLocked) {
4595 swiper.isEnd = false;
4596 if (swiper.navigation) swiper.navigation.update();
4597 }
4598}
4599
4600var checkOverflow$1 = {
4601 checkOverflow: checkOverflow
4602};
4603
4604var defaults = {
4605 init: true,
4606 direction: 'horizontal',
4607 touchEventsTarget: 'container',
4608 initialSlide: 0,
4609 speed: 300,
4610 cssMode: false,
4611 updateOnWindowResize: true,
4612 resizeObserver: false,
4613 nested: false,
4614 // Overrides
4615 width: null,
4616 height: null,
4617 //
4618 preventInteractionOnTransition: false,
4619 // ssr
4620 userAgent: null,
4621 url: null,
4622 // To support iOS's swipe-to-go-back gesture (when being used in-app).
4623 edgeSwipeDetection: false,
4624 edgeSwipeThreshold: 20,
4625 // Free mode
4626 freeMode: false,
4627 freeModeMomentum: true,
4628 freeModeMomentumRatio: 1,
4629 freeModeMomentumBounce: true,
4630 freeModeMomentumBounceRatio: 1,
4631 freeModeMomentumVelocityRatio: 1,
4632 freeModeSticky: false,
4633 freeModeMinimumVelocity: 0.02,
4634 // Autoheight
4635 autoHeight: false,
4636 // Set wrapper width
4637 setWrapperSize: false,
4638 // Virtual Translate
4639 virtualTranslate: false,
4640 // Effects
4641 effect: 'slide',
4642 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
4643 // Breakpoints
4644 breakpoints: undefined,
4645 breakpointsBase: 'window',
4646 // Slides grid
4647 spaceBetween: 0,
4648 slidesPerView: 1,
4649 slidesPerColumn: 1,
4650 slidesPerColumnFill: 'column',
4651 slidesPerGroup: 1,
4652 slidesPerGroupSkip: 0,
4653 centeredSlides: false,
4654 centeredSlidesBounds: false,
4655 slidesOffsetBefore: 0,
4656 // in px
4657 slidesOffsetAfter: 0,
4658 // in px
4659 normalizeSlideIndex: true,
4660 centerInsufficientSlides: false,
4661 // Disable swiper and hide navigation when container not overflow
4662 watchOverflow: false,
4663 // Round length
4664 roundLengths: false,
4665 // Touches
4666 touchRatio: 1,
4667 touchAngle: 45,
4668 simulateTouch: true,
4669 shortSwipes: true,
4670 longSwipes: true,
4671 longSwipesRatio: 0.5,
4672 longSwipesMs: 300,
4673 followFinger: true,
4674 allowTouchMove: true,
4675 threshold: 0,
4676 touchMoveStopPropagation: false,
4677 touchStartPreventDefault: true,
4678 touchStartForcePreventDefault: false,
4679 touchReleaseOnEdges: false,
4680 // Unique Navigation Elements
4681 uniqueNavElements: true,
4682 // Resistance
4683 resistance: true,
4684 resistanceRatio: 0.85,
4685 // Progress
4686 watchSlidesProgress: false,
4687 watchSlidesVisibility: false,
4688 // Cursor
4689 grabCursor: false,
4690 // Clicks
4691 preventClicks: true,
4692 preventClicksPropagation: true,
4693 slideToClickedSlide: false,
4694 // Images
4695 preloadImages: true,
4696 updateOnImagesReady: true,
4697 // loop
4698 loop: false,
4699 loopAdditionalSlides: 0,
4700 loopedSlides: null,
4701 loopFillGroupWithBlank: false,
4702 loopPreventsSlide: true,
4703 // Swiping/no swiping
4704 allowSlidePrev: true,
4705 allowSlideNext: true,
4706 swipeHandler: null,
4707 // '.swipe-handler',
4708 noSwiping: true,
4709 noSwipingClass: 'swiper-no-swiping',
4710 noSwipingSelector: null,
4711 // Passive Listeners
4712 passiveListeners: true,
4713 // NS
4714 containerModifierClass: 'swiper-container-',
4715 // NEW
4716 slideClass: 'swiper-slide',
4717 slideBlankClass: 'swiper-slide-invisible-blank',
4718 slideActiveClass: 'swiper-slide-active',
4719 slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
4720 slideVisibleClass: 'swiper-slide-visible',
4721 slideDuplicateClass: 'swiper-slide-duplicate',
4722 slideNextClass: 'swiper-slide-next',
4723 slideDuplicateNextClass: 'swiper-slide-duplicate-next',
4724 slidePrevClass: 'swiper-slide-prev',
4725 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
4726 wrapperClass: 'swiper-wrapper',
4727 // Callbacks
4728 runCallbacksOnInit: true,
4729 // Internals
4730 _emitClasses: false
4731};
4732
4733var prototypes = {
4734 modular: modular,
4735 eventsEmitter: eventsEmitter,
4736 update: update,
4737 translate: translate,
4738 transition: transition,
4739 slide: slide,
4740 loop: loop,
4741 grabCursor: grabCursor,
4742 manipulation: manipulation,
4743 events: events,
4744 breakpoints: breakpoints,
4745 checkOverflow: checkOverflow$1,
4746 classes: classes,
4747 images: images
4748};
4749var extendedDefaults = {};
4750
4751var Swiper = /*#__PURE__*/function () {
4752 function Swiper() {
4753 var el;
4754 var params;
4755
4756 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
4757 args[_key] = arguments[_key];
4758 }
4759
4760 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
4761 params = args[0];
4762 } else {
4763 el = args[0];
4764 params = args[1];
4765 }
4766
4767 if (!params) params = {};
4768 params = extend({}, params);
4769 if (el && !params.el) params.el = el;
4770
4771 if (params.el && $(params.el).length > 1) {
4772 var swipers = [];
4773 $(params.el).each(function (containerEl) {
4774 var newParams = extend({}, params, {
4775 el: containerEl
4776 });
4777 swipers.push(new Swiper(newParams));
4778 });
4779 return swipers;
4780 } // Swiper Instance
4781
4782
4783 var swiper = this;
4784 swiper.__swiper__ = true;
4785 swiper.support = getSupport();
4786 swiper.device = getDevice({
4787 userAgent: params.userAgent
4788 });
4789 swiper.browser = getBrowser();
4790 swiper.eventsListeners = {};
4791 swiper.eventsAnyListeners = [];
4792
4793 if (typeof swiper.modules === 'undefined') {
4794 swiper.modules = {};
4795 }
4796
4797 Object.keys(swiper.modules).forEach(function (moduleName) {
4798 var module = swiper.modules[moduleName];
4799
4800 if (module.params) {
4801 var moduleParamName = Object.keys(module.params)[0];
4802 var moduleParams = module.params[moduleParamName];
4803 if (typeof moduleParams !== 'object' || moduleParams === null) return;
4804 if (!(moduleParamName in params && 'enabled' in moduleParams)) return;
4805
4806 if (params[moduleParamName] === true) {
4807 params[moduleParamName] = {
4808 enabled: true
4809 };
4810 }
4811
4812 if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
4813 params[moduleParamName].enabled = true;
4814 }
4815
4816 if (!params[moduleParamName]) params[moduleParamName] = {
4817 enabled: false
4818 };
4819 }
4820 }); // Extend defaults with modules params
4821
4822 var swiperParams = extend({}, defaults);
4823 swiper.useParams(swiperParams); // Extend defaults with passed params
4824
4825 swiper.params = extend({}, swiperParams, extendedDefaults, params);
4826 swiper.originalParams = extend({}, swiper.params);
4827 swiper.passedParams = extend({}, params); // add event listeners
4828
4829 if (swiper.params && swiper.params.on) {
4830 Object.keys(swiper.params.on).forEach(function (eventName) {
4831 swiper.on(eventName, swiper.params.on[eventName]);
4832 });
4833 }
4834
4835 if (swiper.params && swiper.params.onAny) {
4836 swiper.onAny(swiper.params.onAny);
4837 } // Save Dom lib
4838
4839
4840 swiper.$ = $; // Extend Swiper
4841
4842 extend(swiper, {
4843 el: el,
4844 // Classes
4845 classNames: [],
4846 // Slides
4847 slides: $(),
4848 slidesGrid: [],
4849 snapGrid: [],
4850 slidesSizesGrid: [],
4851 // isDirection
4852 isHorizontal: function isHorizontal() {
4853 return swiper.params.direction === 'horizontal';
4854 },
4855 isVertical: function isVertical() {
4856 return swiper.params.direction === 'vertical';
4857 },
4858 // Indexes
4859 activeIndex: 0,
4860 realIndex: 0,
4861 //
4862 isBeginning: true,
4863 isEnd: false,
4864 // Props
4865 translate: 0,
4866 previousTranslate: 0,
4867 progress: 0,
4868 velocity: 0,
4869 animating: false,
4870 // Locks
4871 allowSlideNext: swiper.params.allowSlideNext,
4872 allowSlidePrev: swiper.params.allowSlidePrev,
4873 // Touch Events
4874 touchEvents: function touchEvents() {
4875 var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
4876 var desktop = ['mousedown', 'mousemove', 'mouseup'];
4877
4878 if (swiper.support.pointerEvents) {
4879 desktop = ['pointerdown', 'pointermove', 'pointerup'];
4880 }
4881
4882 swiper.touchEventsTouch = {
4883 start: touch[0],
4884 move: touch[1],
4885 end: touch[2],
4886 cancel: touch[3]
4887 };
4888 swiper.touchEventsDesktop = {
4889 start: desktop[0],
4890 move: desktop[1],
4891 end: desktop[2]
4892 };
4893 return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
4894 }(),
4895 touchEventsData: {
4896 isTouched: undefined,
4897 isMoved: undefined,
4898 allowTouchCallbacks: undefined,
4899 touchStartTime: undefined,
4900 isScrolling: undefined,
4901 currentTranslate: undefined,
4902 startTranslate: undefined,
4903 allowThresholdMove: undefined,
4904 // Form elements to match
4905 formElements: 'input, select, option, textarea, button, video, label',
4906 // Last click time
4907 lastClickTime: now(),
4908 clickTimeout: undefined,
4909 // Velocities
4910 velocities: [],
4911 allowMomentumBounce: undefined,
4912 isTouchEvent: undefined,
4913 startMoving: undefined
4914 },
4915 // Clicks
4916 allowClick: true,
4917 // Touches
4918 allowTouchMove: swiper.params.allowTouchMove,
4919 touches: {
4920 startX: 0,
4921 startY: 0,
4922 currentX: 0,
4923 currentY: 0,
4924 diff: 0
4925 },
4926 // Images
4927 imagesToLoad: [],
4928 imagesLoaded: 0
4929 }); // Install Modules
4930
4931 swiper.useModules();
4932 swiper.emit('_swiper'); // Init
4933
4934 if (swiper.params.init) {
4935 swiper.init();
4936 } // Return app instance
4937
4938
4939 return swiper;
4940 }
4941
4942 var _proto = Swiper.prototype;
4943
4944 _proto.emitContainerClasses = function emitContainerClasses() {
4945 var swiper = this;
4946 if (!swiper.params._emitClasses || !swiper.el) return;
4947 var classes = swiper.el.className.split(' ').filter(function (className) {
4948 return className.indexOf('swiper-container') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
4949 });
4950 swiper.emit('_containerClasses', classes.join(' '));
4951 };
4952
4953 _proto.getSlideClasses = function getSlideClasses(slideEl) {
4954 var swiper = this;
4955 return slideEl.className.split(' ').filter(function (className) {
4956 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
4957 }).join(' ');
4958 };
4959
4960 _proto.emitSlidesClasses = function emitSlidesClasses() {
4961 var swiper = this;
4962 if (!swiper.params._emitClasses || !swiper.el) return;
4963 var updates = [];
4964 swiper.slides.each(function (slideEl) {
4965 var classNames = swiper.getSlideClasses(slideEl);
4966 updates.push({
4967 slideEl: slideEl,
4968 classNames: classNames
4969 });
4970 swiper.emit('_slideClass', slideEl, classNames);
4971 });
4972 swiper.emit('_slideClasses', updates);
4973 };
4974
4975 _proto.slidesPerViewDynamic = function slidesPerViewDynamic() {
4976 var swiper = this;
4977 var params = swiper.params,
4978 slides = swiper.slides,
4979 slidesGrid = swiper.slidesGrid,
4980 swiperSize = swiper.size,
4981 activeIndex = swiper.activeIndex;
4982 var spv = 1;
4983
4984 if (params.centeredSlides) {
4985 var slideSize = slides[activeIndex].swiperSlideSize;
4986 var breakLoop;
4987
4988 for (var i = activeIndex + 1; i < slides.length; i += 1) {
4989 if (slides[i] && !breakLoop) {
4990 slideSize += slides[i].swiperSlideSize;
4991 spv += 1;
4992 if (slideSize > swiperSize) breakLoop = true;
4993 }
4994 }
4995
4996 for (var _i = activeIndex - 1; _i >= 0; _i -= 1) {
4997 if (slides[_i] && !breakLoop) {
4998 slideSize += slides[_i].swiperSlideSize;
4999 spv += 1;
5000 if (slideSize > swiperSize) breakLoop = true;
5001 }
5002 }
5003 } else {
5004 for (var _i2 = activeIndex + 1; _i2 < slides.length; _i2 += 1) {
5005 if (slidesGrid[_i2] - slidesGrid[activeIndex] < swiperSize) {
5006 spv += 1;
5007 }
5008 }
5009 }
5010
5011 return spv;
5012 };
5013
5014 _proto.update = function update() {
5015 var swiper = this;
5016 if (!swiper || swiper.destroyed) return;
5017 var snapGrid = swiper.snapGrid,
5018 params = swiper.params; // Breakpoints
5019
5020 if (params.breakpoints) {
5021 swiper.setBreakpoint();
5022 }
5023
5024 swiper.updateSize();
5025 swiper.updateSlides();
5026 swiper.updateProgress();
5027 swiper.updateSlidesClasses();
5028
5029 function setTranslate() {
5030 var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
5031 var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
5032 swiper.setTranslate(newTranslate);
5033 swiper.updateActiveIndex();
5034 swiper.updateSlidesClasses();
5035 }
5036
5037 var translated;
5038
5039 if (swiper.params.freeMode) {
5040 setTranslate();
5041
5042 if (swiper.params.autoHeight) {
5043 swiper.updateAutoHeight();
5044 }
5045 } else {
5046 if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
5047 translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
5048 } else {
5049 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
5050 }
5051
5052 if (!translated) {
5053 setTranslate();
5054 }
5055 }
5056
5057 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
5058 swiper.checkOverflow();
5059 }
5060
5061 swiper.emit('update');
5062 };
5063
5064 _proto.changeDirection = function changeDirection(newDirection, needUpdate) {
5065 if (needUpdate === void 0) {
5066 needUpdate = true;
5067 }
5068
5069 var swiper = this;
5070 var currentDirection = swiper.params.direction;
5071
5072 if (!newDirection) {
5073 // eslint-disable-next-line
5074 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
5075 }
5076
5077 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
5078 return swiper;
5079 }
5080
5081 swiper.$el.removeClass("" + swiper.params.containerModifierClass + currentDirection).addClass("" + swiper.params.containerModifierClass + newDirection);
5082 swiper.emitContainerClasses();
5083 swiper.params.direction = newDirection;
5084 swiper.slides.each(function (slideEl) {
5085 if (newDirection === 'vertical') {
5086 slideEl.style.width = '';
5087 } else {
5088 slideEl.style.height = '';
5089 }
5090 });
5091 swiper.emit('changeDirection');
5092 if (needUpdate) swiper.update();
5093 return swiper;
5094 };
5095
5096 _proto.mount = function mount(el) {
5097 var swiper = this;
5098 if (swiper.mounted) return true; // Find el
5099
5100 var $el = $(el || swiper.params.el);
5101 el = $el[0];
5102
5103 if (!el) {
5104 return false;
5105 }
5106
5107 el.swiper = swiper; // Find Wrapper
5108
5109 var $wrapperEl;
5110
5111 if (el && el.shadowRoot && el.shadowRoot.querySelector) {
5112 $wrapperEl = $(el.shadowRoot.querySelector("." + swiper.params.wrapperClass)); // Children needs to return slot items
5113
5114 $wrapperEl.children = function (options) {
5115 return $el.children(options);
5116 };
5117 } else {
5118 $wrapperEl = $el.children("." + swiper.params.wrapperClass);
5119 }
5120
5121 extend(swiper, {
5122 $el: $el,
5123 el: el,
5124 $wrapperEl: $wrapperEl,
5125 wrapperEl: $wrapperEl[0],
5126 mounted: true,
5127 // RTL
5128 rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',
5129 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
5130 wrongRTL: $wrapperEl.css('display') === '-webkit-box'
5131 });
5132 return true;
5133 };
5134
5135 _proto.init = function init(el) {
5136 var swiper = this;
5137 if (swiper.initialized) return swiper;
5138 var mounted = swiper.mount(el);
5139 if (mounted === false) return swiper;
5140 swiper.emit('beforeInit'); // Set breakpoint
5141
5142 if (swiper.params.breakpoints) {
5143 swiper.setBreakpoint();
5144 } // Add Classes
5145
5146
5147 swiper.addClasses(); // Create loop
5148
5149 if (swiper.params.loop) {
5150 swiper.loopCreate();
5151 } // Update size
5152
5153
5154 swiper.updateSize(); // Update slides
5155
5156 swiper.updateSlides();
5157
5158 if (swiper.params.watchOverflow) {
5159 swiper.checkOverflow();
5160 } // Set Grab Cursor
5161
5162
5163 if (swiper.params.grabCursor) {
5164 swiper.setGrabCursor();
5165 }
5166
5167 if (swiper.params.preloadImages) {
5168 swiper.preloadImages();
5169 } // Slide To Initial Slide
5170
5171
5172 if (swiper.params.loop) {
5173 swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
5174 } else {
5175 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
5176 } // Attach events
5177
5178
5179 swiper.attachEvents(); // Init Flag
5180
5181 swiper.initialized = true; // Emit
5182
5183 swiper.emit('init');
5184 swiper.emit('afterInit');
5185 return swiper;
5186 };
5187
5188 _proto.destroy = function destroy(deleteInstance, cleanStyles) {
5189 if (deleteInstance === void 0) {
5190 deleteInstance = true;
5191 }
5192
5193 if (cleanStyles === void 0) {
5194 cleanStyles = true;
5195 }
5196
5197 var swiper = this;
5198 var params = swiper.params,
5199 $el = swiper.$el,
5200 $wrapperEl = swiper.$wrapperEl,
5201 slides = swiper.slides;
5202
5203 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
5204 return null;
5205 }
5206
5207 swiper.emit('beforeDestroy'); // Init Flag
5208
5209 swiper.initialized = false; // Detach events
5210
5211 swiper.detachEvents(); // Destroy loop
5212
5213 if (params.loop) {
5214 swiper.loopDestroy();
5215 } // Cleanup styles
5216
5217
5218 if (cleanStyles) {
5219 swiper.removeClasses();
5220 $el.removeAttr('style');
5221 $wrapperEl.removeAttr('style');
5222
5223 if (slides && slides.length) {
5224 slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');
5225 }
5226 }
5227
5228 swiper.emit('destroy'); // Detach emitter events
5229
5230 Object.keys(swiper.eventsListeners).forEach(function (eventName) {
5231 swiper.off(eventName);
5232 });
5233
5234 if (deleteInstance !== false) {
5235 swiper.$el[0].swiper = null;
5236 deleteProps(swiper);
5237 }
5238
5239 swiper.destroyed = true;
5240 return null;
5241 };
5242
5243 Swiper.extendDefaults = function extendDefaults(newDefaults) {
5244 extend(extendedDefaults, newDefaults);
5245 };
5246
5247 Swiper.installModule = function installModule(module) {
5248 if (!Swiper.prototype.modules) Swiper.prototype.modules = {};
5249 var name = module.name || Object.keys(Swiper.prototype.modules).length + "_" + now();
5250 Swiper.prototype.modules[name] = module;
5251 };
5252
5253 Swiper.use = function use(module) {
5254 if (Array.isArray(module)) {
5255 module.forEach(function (m) {
5256 return Swiper.installModule(m);
5257 });
5258 return Swiper;
5259 }
5260
5261 Swiper.installModule(module);
5262 return Swiper;
5263 };
5264
5265 _createClass(Swiper, null, [{
5266 key: "extendedDefaults",
5267 get: function get() {
5268 return extendedDefaults;
5269 }
5270 }, {
5271 key: "defaults",
5272 get: function get() {
5273 return defaults;
5274 }
5275 }]);
5276
5277 return Swiper;
5278}();
5279
5280Object.keys(prototypes).forEach(function (prototypeGroup) {
5281 Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
5282 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
5283 });
5284});
5285Swiper.use([Resize, Observer$1]);
5286
5287var Virtual = {
5288 update: function update(force) {
5289 var swiper = this;
5290 var _swiper$params = swiper.params,
5291 slidesPerView = _swiper$params.slidesPerView,
5292 slidesPerGroup = _swiper$params.slidesPerGroup,
5293 centeredSlides = _swiper$params.centeredSlides;
5294 var _swiper$params$virtua = swiper.params.virtual,
5295 addSlidesBefore = _swiper$params$virtua.addSlidesBefore,
5296 addSlidesAfter = _swiper$params$virtua.addSlidesAfter;
5297 var _swiper$virtual = swiper.virtual,
5298 previousFrom = _swiper$virtual.from,
5299 previousTo = _swiper$virtual.to,
5300 slides = _swiper$virtual.slides,
5301 previousSlidesGrid = _swiper$virtual.slidesGrid,
5302 renderSlide = _swiper$virtual.renderSlide,
5303 previousOffset = _swiper$virtual.offset;
5304 swiper.updateActiveIndex();
5305 var activeIndex = swiper.activeIndex || 0;
5306 var offsetProp;
5307 if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
5308 var slidesAfter;
5309 var slidesBefore;
5310
5311 if (centeredSlides) {
5312 slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
5313 slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
5314 } else {
5315 slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
5316 slidesBefore = slidesPerGroup + addSlidesBefore;
5317 }
5318
5319 var from = Math.max((activeIndex || 0) - slidesBefore, 0);
5320 var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
5321 var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
5322 extend(swiper.virtual, {
5323 from: from,
5324 to: to,
5325 offset: offset,
5326 slidesGrid: swiper.slidesGrid
5327 });
5328
5329 function onRendered() {
5330 swiper.updateSlides();
5331 swiper.updateProgress();
5332 swiper.updateSlidesClasses();
5333
5334 if (swiper.lazy && swiper.params.lazy.enabled) {
5335 swiper.lazy.load();
5336 }
5337 }
5338
5339 if (previousFrom === from && previousTo === to && !force) {
5340 if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
5341 swiper.slides.css(offsetProp, offset + "px");
5342 }
5343
5344 swiper.updateProgress();
5345 return;
5346 }
5347
5348 if (swiper.params.virtual.renderExternal) {
5349 swiper.params.virtual.renderExternal.call(swiper, {
5350 offset: offset,
5351 from: from,
5352 to: to,
5353 slides: function getSlides() {
5354 var slidesToRender = [];
5355
5356 for (var i = from; i <= to; i += 1) {
5357 slidesToRender.push(slides[i]);
5358 }
5359
5360 return slidesToRender;
5361 }()
5362 });
5363
5364 if (swiper.params.virtual.renderExternalUpdate) {
5365 onRendered();
5366 }
5367
5368 return;
5369 }
5370
5371 var prependIndexes = [];
5372 var appendIndexes = [];
5373
5374 if (force) {
5375 swiper.$wrapperEl.find("." + swiper.params.slideClass).remove();
5376 } else {
5377 for (var i = previousFrom; i <= previousTo; i += 1) {
5378 if (i < from || i > to) {
5379 swiper.$wrapperEl.find("." + swiper.params.slideClass + "[data-swiper-slide-index=\"" + i + "\"]").remove();
5380 }
5381 }
5382 }
5383
5384 for (var _i = 0; _i < slides.length; _i += 1) {
5385 if (_i >= from && _i <= to) {
5386 if (typeof previousTo === 'undefined' || force) {
5387 appendIndexes.push(_i);
5388 } else {
5389 if (_i > previousTo) appendIndexes.push(_i);
5390 if (_i < previousFrom) prependIndexes.push(_i);
5391 }
5392 }
5393 }
5394
5395 appendIndexes.forEach(function (index) {
5396 swiper.$wrapperEl.append(renderSlide(slides[index], index));
5397 });
5398 prependIndexes.sort(function (a, b) {
5399 return b - a;
5400 }).forEach(function (index) {
5401 swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
5402 });
5403 swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, offset + "px");
5404 onRendered();
5405 },
5406 renderSlide: function renderSlide(slide, index) {
5407 var swiper = this;
5408 var params = swiper.params.virtual;
5409
5410 if (params.cache && swiper.virtual.cache[index]) {
5411 return swiper.virtual.cache[index];
5412 }
5413
5414 var $slideEl = params.renderSlide ? $(params.renderSlide.call(swiper, slide, index)) : $("<div class=\"" + swiper.params.slideClass + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>");
5415 if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);
5416 if (params.cache) swiper.virtual.cache[index] = $slideEl;
5417 return $slideEl;
5418 },
5419 appendSlide: function appendSlide(slides) {
5420 var swiper = this;
5421
5422 if (typeof slides === 'object' && 'length' in slides) {
5423 for (var i = 0; i < slides.length; i += 1) {
5424 if (slides[i]) swiper.virtual.slides.push(slides[i]);
5425 }
5426 } else {
5427 swiper.virtual.slides.push(slides);
5428 }
5429
5430 swiper.virtual.update(true);
5431 },
5432 prependSlide: function prependSlide(slides) {
5433 var swiper = this;
5434 var activeIndex = swiper.activeIndex;
5435 var newActiveIndex = activeIndex + 1;
5436 var numberOfNewSlides = 1;
5437
5438 if (Array.isArray(slides)) {
5439 for (var i = 0; i < slides.length; i += 1) {
5440 if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
5441 }
5442
5443 newActiveIndex = activeIndex + slides.length;
5444 numberOfNewSlides = slides.length;
5445 } else {
5446 swiper.virtual.slides.unshift(slides);
5447 }
5448
5449 if (swiper.params.virtual.cache) {
5450 var cache = swiper.virtual.cache;
5451 var newCache = {};
5452 Object.keys(cache).forEach(function (cachedIndex) {
5453 var $cachedEl = cache[cachedIndex];
5454 var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
5455
5456 if (cachedElIndex) {
5457 $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
5458 }
5459
5460 newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
5461 });
5462 swiper.virtual.cache = newCache;
5463 }
5464
5465 swiper.virtual.update(true);
5466 swiper.slideTo(newActiveIndex, 0);
5467 },
5468 removeSlide: function removeSlide(slidesIndexes) {
5469 var swiper = this;
5470 if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
5471 var activeIndex = swiper.activeIndex;
5472
5473 if (Array.isArray(slidesIndexes)) {
5474 for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
5475 swiper.virtual.slides.splice(slidesIndexes[i], 1);
5476
5477 if (swiper.params.virtual.cache) {
5478 delete swiper.virtual.cache[slidesIndexes[i]];
5479 }
5480
5481 if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
5482 activeIndex = Math.max(activeIndex, 0);
5483 }
5484 } else {
5485 swiper.virtual.slides.splice(slidesIndexes, 1);
5486
5487 if (swiper.params.virtual.cache) {
5488 delete swiper.virtual.cache[slidesIndexes];
5489 }
5490
5491 if (slidesIndexes < activeIndex) activeIndex -= 1;
5492 activeIndex = Math.max(activeIndex, 0);
5493 }
5494
5495 swiper.virtual.update(true);
5496 swiper.slideTo(activeIndex, 0);
5497 },
5498 removeAllSlides: function removeAllSlides() {
5499 var swiper = this;
5500 swiper.virtual.slides = [];
5501
5502 if (swiper.params.virtual.cache) {
5503 swiper.virtual.cache = {};
5504 }
5505
5506 swiper.virtual.update(true);
5507 swiper.slideTo(0, 0);
5508 }
5509};
5510var Virtual$1 = {
5511 name: 'virtual',
5512 params: {
5513 virtual: {
5514 enabled: false,
5515 slides: [],
5516 cache: true,
5517 renderSlide: null,
5518 renderExternal: null,
5519 renderExternalUpdate: true,
5520 addSlidesBefore: 0,
5521 addSlidesAfter: 0
5522 }
5523 },
5524 create: function create() {
5525 var swiper = this;
5526 bindModuleMethods(swiper, {
5527 virtual: _extends({}, Virtual, {
5528 slides: swiper.params.virtual.slides,
5529 cache: {}
5530 })
5531 });
5532 },
5533 on: {
5534 beforeInit: function beforeInit(swiper) {
5535 if (!swiper.params.virtual.enabled) return;
5536 swiper.classNames.push(swiper.params.containerModifierClass + "virtual");
5537 var overwriteParams = {
5538 watchSlidesProgress: true
5539 };
5540 extend(swiper.params, overwriteParams);
5541 extend(swiper.originalParams, overwriteParams);
5542
5543 if (!swiper.params.initialSlide) {
5544 swiper.virtual.update();
5545 }
5546 },
5547 setTranslate: function setTranslate(swiper) {
5548 if (!swiper.params.virtual.enabled) return;
5549 swiper.virtual.update();
5550 }
5551 }
5552};
5553
5554var Keyboard = {
5555 handle: function handle(event) {
5556 var swiper = this;
5557 var window = getWindow();
5558 var document = getDocument();
5559 var rtl = swiper.rtlTranslate;
5560 var e = event;
5561 if (e.originalEvent) e = e.originalEvent; // jquery fix
5562
5563 var kc = e.keyCode || e.charCode;
5564 var pageUpDown = swiper.params.keyboard.pageUpDown;
5565 var isPageUp = pageUpDown && kc === 33;
5566 var isPageDown = pageUpDown && kc === 34;
5567 var isArrowLeft = kc === 37;
5568 var isArrowRight = kc === 39;
5569 var isArrowUp = kc === 38;
5570 var isArrowDown = kc === 40; // Directions locks
5571
5572 if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
5573 return false;
5574 }
5575
5576 if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
5577 return false;
5578 }
5579
5580 if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
5581 return undefined;
5582 }
5583
5584 if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
5585 return undefined;
5586 }
5587
5588 if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
5589 var inView = false; // Check that swiper should be inside of visible area of window
5590
5591 if (swiper.$el.parents("." + swiper.params.slideClass).length > 0 && swiper.$el.parents("." + swiper.params.slideActiveClass).length === 0) {
5592 return undefined;
5593 }
5594
5595 var $el = swiper.$el;
5596 var swiperWidth = $el[0].clientWidth;
5597 var swiperHeight = $el[0].clientHeight;
5598 var windowWidth = window.innerWidth;
5599 var windowHeight = window.innerHeight;
5600 var swiperOffset = swiper.$el.offset();
5601 if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;
5602 var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
5603
5604 for (var i = 0; i < swiperCoord.length; i += 1) {
5605 var point = swiperCoord[i];
5606
5607 if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
5608 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
5609
5610 inView = true;
5611 }
5612 }
5613
5614 if (!inView) return undefined;
5615 }
5616
5617 if (swiper.isHorizontal()) {
5618 if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
5619 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5620 }
5621
5622 if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();
5623 if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();
5624 } else {
5625 if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
5626 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5627 }
5628
5629 if (isPageDown || isArrowDown) swiper.slideNext();
5630 if (isPageUp || isArrowUp) swiper.slidePrev();
5631 }
5632
5633 swiper.emit('keyPress', kc);
5634 return undefined;
5635 },
5636 enable: function enable() {
5637 var swiper = this;
5638 var document = getDocument();
5639 if (swiper.keyboard.enabled) return;
5640 $(document).on('keydown', swiper.keyboard.handle);
5641 swiper.keyboard.enabled = true;
5642 },
5643 disable: function disable() {
5644 var swiper = this;
5645 var document = getDocument();
5646 if (!swiper.keyboard.enabled) return;
5647 $(document).off('keydown', swiper.keyboard.handle);
5648 swiper.keyboard.enabled = false;
5649 }
5650};
5651var Keyboard$1 = {
5652 name: 'keyboard',
5653 params: {
5654 keyboard: {
5655 enabled: false,
5656 onlyInViewport: true,
5657 pageUpDown: true
5658 }
5659 },
5660 create: function create() {
5661 var swiper = this;
5662 bindModuleMethods(swiper, {
5663 keyboard: _extends({
5664 enabled: false
5665 }, Keyboard)
5666 });
5667 },
5668 on: {
5669 init: function init(swiper) {
5670 if (swiper.params.keyboard.enabled) {
5671 swiper.keyboard.enable();
5672 }
5673 },
5674 destroy: function destroy(swiper) {
5675 if (swiper.keyboard.enabled) {
5676 swiper.keyboard.disable();
5677 }
5678 }
5679 }
5680};
5681
5682function isEventSupported() {
5683 var document = getDocument();
5684 var eventName = 'onwheel';
5685 var isSupported = (eventName in document);
5686
5687 if (!isSupported) {
5688 var element = document.createElement('div');
5689 element.setAttribute(eventName, 'return;');
5690 isSupported = typeof element[eventName] === 'function';
5691 }
5692
5693 if (!isSupported && document.implementation && document.implementation.hasFeature && // always returns true in newer browsers as per the standard.
5694 // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
5695 document.implementation.hasFeature('', '') !== true) {
5696 // This is the only way to test support for the `wheel` event in IE9+.
5697 isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
5698 }
5699
5700 return isSupported;
5701}
5702
5703var Mousewheel = {
5704 lastScrollTime: now(),
5705 lastEventBeforeSnap: undefined,
5706 recentWheelEvents: [],
5707 event: function event() {
5708 var window = getWindow();
5709 if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll';
5710 return isEventSupported() ? 'wheel' : 'mousewheel';
5711 },
5712 normalize: function normalize(e) {
5713 // Reasonable defaults
5714 var PIXEL_STEP = 10;
5715 var LINE_HEIGHT = 40;
5716 var PAGE_HEIGHT = 800;
5717 var sX = 0;
5718 var sY = 0; // spinX, spinY
5719
5720 var pX = 0;
5721 var pY = 0; // pixelX, pixelY
5722 // Legacy
5723
5724 if ('detail' in e) {
5725 sY = e.detail;
5726 }
5727
5728 if ('wheelDelta' in e) {
5729 sY = -e.wheelDelta / 120;
5730 }
5731
5732 if ('wheelDeltaY' in e) {
5733 sY = -e.wheelDeltaY / 120;
5734 }
5735
5736 if ('wheelDeltaX' in e) {
5737 sX = -e.wheelDeltaX / 120;
5738 } // side scrolling on FF with DOMMouseScroll
5739
5740
5741 if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
5742 sX = sY;
5743 sY = 0;
5744 }
5745
5746 pX = sX * PIXEL_STEP;
5747 pY = sY * PIXEL_STEP;
5748
5749 if ('deltaY' in e) {
5750 pY = e.deltaY;
5751 }
5752
5753 if ('deltaX' in e) {
5754 pX = e.deltaX;
5755 }
5756
5757 if (e.shiftKey && !pX) {
5758 // if user scrolls with shift he wants horizontal scroll
5759 pX = pY;
5760 pY = 0;
5761 }
5762
5763 if ((pX || pY) && e.deltaMode) {
5764 if (e.deltaMode === 1) {
5765 // delta in LINE units
5766 pX *= LINE_HEIGHT;
5767 pY *= LINE_HEIGHT;
5768 } else {
5769 // delta in PAGE units
5770 pX *= PAGE_HEIGHT;
5771 pY *= PAGE_HEIGHT;
5772 }
5773 } // Fall-back if spin cannot be determined
5774
5775
5776 if (pX && !sX) {
5777 sX = pX < 1 ? -1 : 1;
5778 }
5779
5780 if (pY && !sY) {
5781 sY = pY < 1 ? -1 : 1;
5782 }
5783
5784 return {
5785 spinX: sX,
5786 spinY: sY,
5787 pixelX: pX,
5788 pixelY: pY
5789 };
5790 },
5791 handleMouseEnter: function handleMouseEnter() {
5792 var swiper = this;
5793 swiper.mouseEntered = true;
5794 },
5795 handleMouseLeave: function handleMouseLeave() {
5796 var swiper = this;
5797 swiper.mouseEntered = false;
5798 },
5799 handle: function handle(event) {
5800 var e = event;
5801 var disableParentSwiper = true;
5802 var swiper = this;
5803 var params = swiper.params.mousewheel;
5804
5805 if (swiper.params.cssMode) {
5806 e.preventDefault();
5807 }
5808
5809 var target = swiper.$el;
5810
5811 if (swiper.params.mousewheel.eventsTarget !== 'container') {
5812 target = $(swiper.params.mousewheel.eventsTarget);
5813 }
5814
5815 if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true;
5816 if (e.originalEvent) e = e.originalEvent; // jquery fix
5817
5818 var delta = 0;
5819 var rtlFactor = swiper.rtlTranslate ? -1 : 1;
5820 var data = Mousewheel.normalize(e);
5821
5822 if (params.forceToAxis) {
5823 if (swiper.isHorizontal()) {
5824 if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
5825 } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
5826 } else {
5827 delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
5828 }
5829
5830 if (delta === 0) return true;
5831 if (params.invert) delta = -delta; // Get the scroll positions
5832
5833 var positions = swiper.getTranslate() + delta * params.sensitivity;
5834 if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
5835 if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true:
5836 // the disableParentSwiper will be true.
5837 // When loop is false:
5838 // if the scroll positions is not on edge,
5839 // then the disableParentSwiper will be true.
5840 // if the scroll on edge positions,
5841 // then the disableParentSwiper will be false.
5842
5843 disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
5844 if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
5845
5846 if (!swiper.params.freeMode) {
5847 // Register the new event in a variable which stores the relevant data
5848 var newEvent = {
5849 time: now(),
5850 delta: Math.abs(delta),
5851 direction: Math.sign(delta),
5852 raw: event
5853 }; // Keep the most recent events
5854
5855 var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
5856
5857 if (recentWheelEvents.length >= 2) {
5858 recentWheelEvents.shift(); // only store the last N events
5859 }
5860
5861 var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
5862 recentWheelEvents.push(newEvent); // If there is at least one previous recorded event:
5863 // If direction has changed or
5864 // if the scroll is quicker than the previous one:
5865 // Animate the slider.
5866 // Else (this is the first time the wheel is moved):
5867 // Animate the slider.
5868
5869 if (prevEvent) {
5870 if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
5871 swiper.mousewheel.animateSlider(newEvent);
5872 }
5873 } else {
5874 swiper.mousewheel.animateSlider(newEvent);
5875 } // If it's time to release the scroll:
5876 // Return now so you don't hit the preventDefault.
5877
5878
5879 if (swiper.mousewheel.releaseScroll(newEvent)) {
5880 return true;
5881 }
5882 } else {
5883 // Freemode or scrollContainer:
5884 // If we recently snapped after a momentum scroll, then ignore wheel events
5885 // to give time for the deceleration to finish. Stop ignoring after 500 msecs
5886 // or if it's a new scroll (larger delta or inverse sign as last event before
5887 // an end-of-momentum snap).
5888 var _newEvent = {
5889 time: now(),
5890 delta: Math.abs(delta),
5891 direction: Math.sign(delta)
5892 };
5893 var lastEventBeforeSnap = swiper.mousewheel.lastEventBeforeSnap;
5894 var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction;
5895
5896 if (!ignoreWheelEvents) {
5897 swiper.mousewheel.lastEventBeforeSnap = undefined;
5898
5899 if (swiper.params.loop) {
5900 swiper.loopFix();
5901 }
5902
5903 var position = swiper.getTranslate() + delta * params.sensitivity;
5904 var wasBeginning = swiper.isBeginning;
5905 var wasEnd = swiper.isEnd;
5906 if (position >= swiper.minTranslate()) position = swiper.minTranslate();
5907 if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
5908 swiper.setTransition(0);
5909 swiper.setTranslate(position);
5910 swiper.updateProgress();
5911 swiper.updateActiveIndex();
5912 swiper.updateSlidesClasses();
5913
5914 if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
5915 swiper.updateSlidesClasses();
5916 }
5917
5918 if (swiper.params.freeModeSticky) {
5919 // When wheel scrolling starts with sticky (aka snap) enabled, then detect
5920 // the end of a momentum scroll by storing recent (N=15?) wheel events.
5921 // 1. do all N events have decreasing or same (absolute value) delta?
5922 // 2. did all N events arrive in the last M (M=500?) msecs?
5923 // 3. does the earliest event have an (absolute value) delta that's
5924 // at least P (P=1?) larger than the most recent event's delta?
5925 // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
5926 // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
5927 // Snap immediately and ignore remaining wheel events in this scroll.
5928 // See comment above for "remaining wheel events in this scroll" determination.
5929 // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
5930 clearTimeout(swiper.mousewheel.timeout);
5931 swiper.mousewheel.timeout = undefined;
5932 var _recentWheelEvents = swiper.mousewheel.recentWheelEvents;
5933
5934 if (_recentWheelEvents.length >= 15) {
5935 _recentWheelEvents.shift(); // only store the last N events
5936
5937 }
5938
5939 var _prevEvent = _recentWheelEvents.length ? _recentWheelEvents[_recentWheelEvents.length - 1] : undefined;
5940
5941 var firstEvent = _recentWheelEvents[0];
5942
5943 _recentWheelEvents.push(_newEvent);
5944
5945 if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) {
5946 // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
5947 _recentWheelEvents.splice(0);
5948 } else if (_recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) {
5949 // We're at the end of the deceleration of a momentum scroll, so there's no need
5950 // to wait for more events. Snap ASAP on the next tick.
5951 // Also, because there's some remaining momentum we'll bias the snap in the
5952 // direction of the ongoing scroll because it's better UX for the scroll to snap
5953 // in the same direction as the scroll instead of reversing to snap. Therefore,
5954 // if it's already scrolled more than 20% in the current direction, keep going.
5955 var snapToThreshold = delta > 0 ? 0.8 : 0.2;
5956 swiper.mousewheel.lastEventBeforeSnap = _newEvent;
5957
5958 _recentWheelEvents.splice(0);
5959
5960 swiper.mousewheel.timeout = nextTick(function () {
5961 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5962 }, 0); // no delay; move on next tick
5963 }
5964
5965 if (!swiper.mousewheel.timeout) {
5966 // if we get here, then we haven't detected the end of a momentum scroll, so
5967 // we'll consider a scroll "complete" when there haven't been any wheel events
5968 // for 500ms.
5969 swiper.mousewheel.timeout = nextTick(function () {
5970 var snapToThreshold = 0.5;
5971 swiper.mousewheel.lastEventBeforeSnap = _newEvent;
5972
5973 _recentWheelEvents.splice(0);
5974
5975 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5976 }, 500);
5977 }
5978 } // Emit event
5979
5980
5981 if (!ignoreWheelEvents) swiper.emit('scroll', e); // Stop autoplay
5982
5983 if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions
5984
5985 if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;
5986 }
5987 }
5988
5989 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5990 return false;
5991 },
5992 animateSlider: function animateSlider(newEvent) {
5993 var swiper = this;
5994 var window = getWindow();
5995
5996 if (this.params.mousewheel.thresholdDelta && newEvent.delta < this.params.mousewheel.thresholdDelta) {
5997 // Prevent if delta of wheel scroll delta is below configured threshold
5998 return false;
5999 }
6000
6001 if (this.params.mousewheel.thresholdTime && now() - swiper.mousewheel.lastScrollTime < this.params.mousewheel.thresholdTime) {
6002 // Prevent if time between scrolls is below configured threshold
6003 return false;
6004 } // If the movement is NOT big enough and
6005 // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
6006 // Don't go any further (avoid insignificant scroll movement).
6007
6008
6009 if (newEvent.delta >= 6 && now() - swiper.mousewheel.lastScrollTime < 60) {
6010 // Return false as a default
6011 return true;
6012 } // If user is scrolling towards the end:
6013 // If the slider hasn't hit the latest slide or
6014 // if the slider is a loop and
6015 // if the slider isn't moving right now:
6016 // Go to next slide and
6017 // emit a scroll event.
6018 // Else (the user is scrolling towards the beginning) and
6019 // if the slider hasn't hit the first slide or
6020 // if the slider is a loop and
6021 // if the slider isn't moving right now:
6022 // Go to prev slide and
6023 // emit a scroll event.
6024
6025
6026 if (newEvent.direction < 0) {
6027 if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
6028 swiper.slideNext();
6029 swiper.emit('scroll', newEvent.raw);
6030 }
6031 } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
6032 swiper.slidePrev();
6033 swiper.emit('scroll', newEvent.raw);
6034 } // If you got here is because an animation has been triggered so store the current time
6035
6036
6037 swiper.mousewheel.lastScrollTime = new window.Date().getTime(); // Return false as a default
6038
6039 return false;
6040 },
6041 releaseScroll: function releaseScroll(newEvent) {
6042 var swiper = this;
6043 var params = swiper.params.mousewheel;
6044
6045 if (newEvent.direction < 0) {
6046 if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
6047 // Return true to animate scroll on edges
6048 return true;
6049 }
6050 } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
6051 // Return true to animate scroll on edges
6052 return true;
6053 }
6054
6055 return false;
6056 },
6057 enable: function enable() {
6058 var swiper = this;
6059 var event = Mousewheel.event();
6060
6061 if (swiper.params.cssMode) {
6062 swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
6063 return true;
6064 }
6065
6066 if (!event) return false;
6067 if (swiper.mousewheel.enabled) return false;
6068 var target = swiper.$el;
6069
6070 if (swiper.params.mousewheel.eventsTarget !== 'container') {
6071 target = $(swiper.params.mousewheel.eventsTarget);
6072 }
6073
6074 target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
6075 target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
6076 target.on(event, swiper.mousewheel.handle);
6077 swiper.mousewheel.enabled = true;
6078 return true;
6079 },
6080 disable: function disable() {
6081 var swiper = this;
6082 var event = Mousewheel.event();
6083
6084 if (swiper.params.cssMode) {
6085 swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
6086 return true;
6087 }
6088
6089 if (!event) return false;
6090 if (!swiper.mousewheel.enabled) return false;
6091 var target = swiper.$el;
6092
6093 if (swiper.params.mousewheel.eventsTarget !== 'container') {
6094 target = $(swiper.params.mousewheel.eventsTarget);
6095 }
6096
6097 target.off(event, swiper.mousewheel.handle);
6098 swiper.mousewheel.enabled = false;
6099 return true;
6100 }
6101};
6102var Mousewheel$1 = {
6103 name: 'mousewheel',
6104 params: {
6105 mousewheel: {
6106 enabled: false,
6107 releaseOnEdges: false,
6108 invert: false,
6109 forceToAxis: false,
6110 sensitivity: 1,
6111 eventsTarget: 'container',
6112 thresholdDelta: null,
6113 thresholdTime: null
6114 }
6115 },
6116 create: function create() {
6117 var swiper = this;
6118 bindModuleMethods(swiper, {
6119 mousewheel: {
6120 enabled: false,
6121 lastScrollTime: now(),
6122 lastEventBeforeSnap: undefined,
6123 recentWheelEvents: [],
6124 enable: Mousewheel.enable,
6125 disable: Mousewheel.disable,
6126 handle: Mousewheel.handle,
6127 handleMouseEnter: Mousewheel.handleMouseEnter,
6128 handleMouseLeave: Mousewheel.handleMouseLeave,
6129 animateSlider: Mousewheel.animateSlider,
6130 releaseScroll: Mousewheel.releaseScroll
6131 }
6132 });
6133 },
6134 on: {
6135 init: function init(swiper) {
6136 if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
6137 swiper.mousewheel.disable();
6138 }
6139
6140 if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable();
6141 },
6142 destroy: function destroy(swiper) {
6143 if (swiper.params.cssMode) {
6144 swiper.mousewheel.enable();
6145 }
6146
6147 if (swiper.mousewheel.enabled) swiper.mousewheel.disable();
6148 }
6149 }
6150};
6151
6152var Navigation = {
6153 toggleEl: function toggleEl($el, disabled) {
6154 $el[disabled ? 'addClass' : 'removeClass'](this.params.navigation.disabledClass);
6155 if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;
6156 },
6157 update: function update() {
6158 // Update Navigation Buttons
6159 var swiper = this;
6160 var params = swiper.params.navigation;
6161 var toggleEl = swiper.navigation.toggleEl;
6162 if (swiper.params.loop) return;
6163 var _swiper$navigation = swiper.navigation,
6164 $nextEl = _swiper$navigation.$nextEl,
6165 $prevEl = _swiper$navigation.$prevEl;
6166
6167 if ($prevEl && $prevEl.length > 0) {
6168 if (swiper.isBeginning) {
6169 toggleEl($prevEl, true);
6170 } else {
6171 toggleEl($prevEl, false);
6172 }
6173
6174 $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
6175 }
6176
6177 if ($nextEl && $nextEl.length > 0) {
6178 if (swiper.isEnd) {
6179 toggleEl($nextEl, true);
6180 } else {
6181 toggleEl($nextEl, false);
6182 }
6183
6184 $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
6185 }
6186 },
6187 onPrevClick: function onPrevClick(e) {
6188 var swiper = this;
6189 e.preventDefault();
6190 if (swiper.isBeginning && !swiper.params.loop) return;
6191 swiper.slidePrev();
6192 },
6193 onNextClick: function onNextClick(e) {
6194 var swiper = this;
6195 e.preventDefault();
6196 if (swiper.isEnd && !swiper.params.loop) return;
6197 swiper.slideNext();
6198 },
6199 init: function init() {
6200 var swiper = this;
6201 var params = swiper.params.navigation;
6202 if (!(params.nextEl || params.prevEl)) return;
6203 var $nextEl;
6204 var $prevEl;
6205
6206 if (params.nextEl) {
6207 $nextEl = $(params.nextEl);
6208
6209 if (swiper.params.uniqueNavElements && typeof params.nextEl === 'string' && $nextEl.length > 1 && swiper.$el.find(params.nextEl).length === 1) {
6210 $nextEl = swiper.$el.find(params.nextEl);
6211 }
6212 }
6213
6214 if (params.prevEl) {
6215 $prevEl = $(params.prevEl);
6216
6217 if (swiper.params.uniqueNavElements && typeof params.prevEl === 'string' && $prevEl.length > 1 && swiper.$el.find(params.prevEl).length === 1) {
6218 $prevEl = swiper.$el.find(params.prevEl);
6219 }
6220 }
6221
6222 if ($nextEl && $nextEl.length > 0) {
6223 $nextEl.on('click', swiper.navigation.onNextClick);
6224 }
6225
6226 if ($prevEl && $prevEl.length > 0) {
6227 $prevEl.on('click', swiper.navigation.onPrevClick);
6228 }
6229
6230 extend(swiper.navigation, {
6231 $nextEl: $nextEl,
6232 nextEl: $nextEl && $nextEl[0],
6233 $prevEl: $prevEl,
6234 prevEl: $prevEl && $prevEl[0]
6235 });
6236 },
6237 destroy: function destroy() {
6238 var swiper = this;
6239 var _swiper$navigation2 = swiper.navigation,
6240 $nextEl = _swiper$navigation2.$nextEl,
6241 $prevEl = _swiper$navigation2.$prevEl;
6242
6243 if ($nextEl && $nextEl.length) {
6244 $nextEl.off('click', swiper.navigation.onNextClick);
6245 $nextEl.removeClass(swiper.params.navigation.disabledClass);
6246 }
6247
6248 if ($prevEl && $prevEl.length) {
6249 $prevEl.off('click', swiper.navigation.onPrevClick);
6250 $prevEl.removeClass(swiper.params.navigation.disabledClass);
6251 }
6252 }
6253};
6254var Navigation$1 = {
6255 name: 'navigation',
6256 params: {
6257 navigation: {
6258 nextEl: null,
6259 prevEl: null,
6260 hideOnClick: false,
6261 disabledClass: 'swiper-button-disabled',
6262 hiddenClass: 'swiper-button-hidden',
6263 lockClass: 'swiper-button-lock'
6264 }
6265 },
6266 create: function create() {
6267 var swiper = this;
6268 bindModuleMethods(swiper, {
6269 navigation: _extends({}, Navigation)
6270 });
6271 },
6272 on: {
6273 init: function init(swiper) {
6274 swiper.navigation.init();
6275 swiper.navigation.update();
6276 },
6277 toEdge: function toEdge(swiper) {
6278 swiper.navigation.update();
6279 },
6280 fromEdge: function fromEdge(swiper) {
6281 swiper.navigation.update();
6282 },
6283 destroy: function destroy(swiper) {
6284 swiper.navigation.destroy();
6285 },
6286 click: function click(swiper, e) {
6287 var _swiper$navigation3 = swiper.navigation,
6288 $nextEl = _swiper$navigation3.$nextEl,
6289 $prevEl = _swiper$navigation3.$prevEl;
6290 var targetEl = e.target;
6291
6292 if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) {
6293 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
6294 var isHidden;
6295
6296 if ($nextEl) {
6297 isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
6298 } else if ($prevEl) {
6299 isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
6300 }
6301
6302 if (isHidden === true) {
6303 swiper.emit('navigationShow');
6304 } else {
6305 swiper.emit('navigationHide');
6306 }
6307
6308 if ($nextEl) {
6309 $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
6310 }
6311
6312 if ($prevEl) {
6313 $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
6314 }
6315 }
6316 }
6317 }
6318};
6319
6320var Pagination = {
6321 update: function update() {
6322 // Render || Update Pagination bullets/items
6323 var swiper = this;
6324 var rtl = swiper.rtl;
6325 var params = swiper.params.pagination;
6326 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
6327 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
6328 var $el = swiper.pagination.$el; // Current/Total
6329
6330 var current;
6331 var total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
6332
6333 if (swiper.params.loop) {
6334 current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
6335
6336 if (current > slidesLength - 1 - swiper.loopedSlides * 2) {
6337 current -= slidesLength - swiper.loopedSlides * 2;
6338 }
6339
6340 if (current > total - 1) current -= total;
6341 if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;
6342 } else if (typeof swiper.snapIndex !== 'undefined') {
6343 current = swiper.snapIndex;
6344 } else {
6345 current = swiper.activeIndex || 0;
6346 } // Types
6347
6348
6349 if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
6350 var bullets = swiper.pagination.bullets;
6351 var firstIndex;
6352 var lastIndex;
6353 var midIndex;
6354
6355 if (params.dynamicBullets) {
6356 swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
6357 $el.css(swiper.isHorizontal() ? 'width' : 'height', swiper.pagination.bulletSize * (params.dynamicMainBullets + 4) + "px");
6358
6359 if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
6360 swiper.pagination.dynamicBulletIndex += current - swiper.previousIndex;
6361
6362 if (swiper.pagination.dynamicBulletIndex > params.dynamicMainBullets - 1) {
6363 swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
6364 } else if (swiper.pagination.dynamicBulletIndex < 0) {
6365 swiper.pagination.dynamicBulletIndex = 0;
6366 }
6367 }
6368
6369 firstIndex = current - swiper.pagination.dynamicBulletIndex;
6370 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
6371 midIndex = (lastIndex + firstIndex) / 2;
6372 }
6373
6374 bullets.removeClass(params.bulletActiveClass + " " + params.bulletActiveClass + "-next " + params.bulletActiveClass + "-next-next " + params.bulletActiveClass + "-prev " + params.bulletActiveClass + "-prev-prev " + params.bulletActiveClass + "-main");
6375
6376 if ($el.length > 1) {
6377 bullets.each(function (bullet) {
6378 var $bullet = $(bullet);
6379 var bulletIndex = $bullet.index();
6380
6381 if (bulletIndex === current) {
6382 $bullet.addClass(params.bulletActiveClass);
6383 }
6384
6385 if (params.dynamicBullets) {
6386 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
6387 $bullet.addClass(params.bulletActiveClass + "-main");
6388 }
6389
6390 if (bulletIndex === firstIndex) {
6391 $bullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
6392 }
6393
6394 if (bulletIndex === lastIndex) {
6395 $bullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
6396 }
6397 }
6398 });
6399 } else {
6400 var $bullet = bullets.eq(current);
6401 var bulletIndex = $bullet.index();
6402 $bullet.addClass(params.bulletActiveClass);
6403
6404 if (params.dynamicBullets) {
6405 var $firstDisplayedBullet = bullets.eq(firstIndex);
6406 var $lastDisplayedBullet = bullets.eq(lastIndex);
6407
6408 for (var i = firstIndex; i <= lastIndex; i += 1) {
6409 bullets.eq(i).addClass(params.bulletActiveClass + "-main");
6410 }
6411
6412 if (swiper.params.loop) {
6413 if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
6414 for (var _i = params.dynamicMainBullets; _i >= 0; _i -= 1) {
6415 bullets.eq(bullets.length - _i).addClass(params.bulletActiveClass + "-main");
6416 }
6417
6418 bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(params.bulletActiveClass + "-prev");
6419 } else {
6420 $firstDisplayedBullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
6421 $lastDisplayedBullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
6422 }
6423 } else {
6424 $firstDisplayedBullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
6425 $lastDisplayedBullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
6426 }
6427 }
6428 }
6429
6430 if (params.dynamicBullets) {
6431 var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
6432 var bulletsOffset = (swiper.pagination.bulletSize * dynamicBulletsLength - swiper.pagination.bulletSize) / 2 - midIndex * swiper.pagination.bulletSize;
6433 var offsetProp = rtl ? 'right' : 'left';
6434 bullets.css(swiper.isHorizontal() ? offsetProp : 'top', bulletsOffset + "px");
6435 }
6436 }
6437
6438 if (params.type === 'fraction') {
6439 $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1));
6440 $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));
6441 }
6442
6443 if (params.type === 'progressbar') {
6444 var progressbarDirection;
6445
6446 if (params.progressbarOpposite) {
6447 progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
6448 } else {
6449 progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
6450 }
6451
6452 var scale = (current + 1) / total;
6453 var scaleX = 1;
6454 var scaleY = 1;
6455
6456 if (progressbarDirection === 'horizontal') {
6457 scaleX = scale;
6458 } else {
6459 scaleY = scale;
6460 }
6461
6462 $el.find(classesToSelector(params.progressbarFillClass)).transform("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")").transition(swiper.params.speed);
6463 }
6464
6465 if (params.type === 'custom' && params.renderCustom) {
6466 $el.html(params.renderCustom(swiper, current + 1, total));
6467 swiper.emit('paginationRender', $el[0]);
6468 } else {
6469 swiper.emit('paginationUpdate', $el[0]);
6470 }
6471
6472 $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
6473 },
6474 render: function render() {
6475 // Render Container
6476 var swiper = this;
6477 var params = swiper.params.pagination;
6478 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
6479 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
6480 var $el = swiper.pagination.$el;
6481 var paginationHTML = '';
6482
6483 if (params.type === 'bullets') {
6484 var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
6485
6486 if (swiper.params.freeMode && !swiper.params.loop && numberOfBullets > slidesLength) {
6487 numberOfBullets = slidesLength;
6488 }
6489
6490 for (var i = 0; i < numberOfBullets; i += 1) {
6491 if (params.renderBullet) {
6492 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
6493 } else {
6494 paginationHTML += "<" + params.bulletElement + " class=\"" + params.bulletClass + "\"></" + params.bulletElement + ">";
6495 }
6496 }
6497
6498 $el.html(paginationHTML);
6499 swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));
6500 }
6501
6502 if (params.type === 'fraction') {
6503 if (params.renderFraction) {
6504 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
6505 } else {
6506 paginationHTML = "<span class=\"" + params.currentClass + "\"></span>" + ' / ' + ("<span class=\"" + params.totalClass + "\"></span>");
6507 }
6508
6509 $el.html(paginationHTML);
6510 }
6511
6512 if (params.type === 'progressbar') {
6513 if (params.renderProgressbar) {
6514 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
6515 } else {
6516 paginationHTML = "<span class=\"" + params.progressbarFillClass + "\"></span>";
6517 }
6518
6519 $el.html(paginationHTML);
6520 }
6521
6522 if (params.type !== 'custom') {
6523 swiper.emit('paginationRender', swiper.pagination.$el[0]);
6524 }
6525 },
6526 init: function init() {
6527 var swiper = this;
6528 var params = swiper.params.pagination;
6529 if (!params.el) return;
6530 var $el = $(params.el);
6531 if ($el.length === 0) return;
6532
6533 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {
6534 $el = swiper.$el.find(params.el);
6535 }
6536
6537 if (params.type === 'bullets' && params.clickable) {
6538 $el.addClass(params.clickableClass);
6539 }
6540
6541 $el.addClass(params.modifierClass + params.type);
6542
6543 if (params.type === 'bullets' && params.dynamicBullets) {
6544 $el.addClass("" + params.modifierClass + params.type + "-dynamic");
6545 swiper.pagination.dynamicBulletIndex = 0;
6546
6547 if (params.dynamicMainBullets < 1) {
6548 params.dynamicMainBullets = 1;
6549 }
6550 }
6551
6552 if (params.type === 'progressbar' && params.progressbarOpposite) {
6553 $el.addClass(params.progressbarOppositeClass);
6554 }
6555
6556 if (params.clickable) {
6557 $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {
6558 e.preventDefault();
6559 var index = $(this).index() * swiper.params.slidesPerGroup;
6560 if (swiper.params.loop) index += swiper.loopedSlides;
6561 swiper.slideTo(index);
6562 });
6563 }
6564
6565 extend(swiper.pagination, {
6566 $el: $el,
6567 el: $el[0]
6568 });
6569 },
6570 destroy: function destroy() {
6571 var swiper = this;
6572 var params = swiper.params.pagination;
6573 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
6574 var $el = swiper.pagination.$el;
6575 $el.removeClass(params.hiddenClass);
6576 $el.removeClass(params.modifierClass + params.type);
6577 if (swiper.pagination.bullets) swiper.pagination.bullets.removeClass(params.bulletActiveClass);
6578
6579 if (params.clickable) {
6580 $el.off('click', classesToSelector(params.bulletClass));
6581 }
6582 }
6583};
6584var Pagination$1 = {
6585 name: 'pagination',
6586 params: {
6587 pagination: {
6588 el: null,
6589 bulletElement: 'span',
6590 clickable: false,
6591 hideOnClick: false,
6592 renderBullet: null,
6593 renderProgressbar: null,
6594 renderFraction: null,
6595 renderCustom: null,
6596 progressbarOpposite: false,
6597 type: 'bullets',
6598 // 'bullets' or 'progressbar' or 'fraction' or 'custom'
6599 dynamicBullets: false,
6600 dynamicMainBullets: 1,
6601 formatFractionCurrent: function formatFractionCurrent(number) {
6602 return number;
6603 },
6604 formatFractionTotal: function formatFractionTotal(number) {
6605 return number;
6606 },
6607 bulletClass: 'swiper-pagination-bullet',
6608 bulletActiveClass: 'swiper-pagination-bullet-active',
6609 modifierClass: 'swiper-pagination-',
6610 // NEW
6611 currentClass: 'swiper-pagination-current',
6612 totalClass: 'swiper-pagination-total',
6613 hiddenClass: 'swiper-pagination-hidden',
6614 progressbarFillClass: 'swiper-pagination-progressbar-fill',
6615 progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
6616 clickableClass: 'swiper-pagination-clickable',
6617 // NEW
6618 lockClass: 'swiper-pagination-lock'
6619 }
6620 },
6621 create: function create() {
6622 var swiper = this;
6623 bindModuleMethods(swiper, {
6624 pagination: _extends({
6625 dynamicBulletIndex: 0
6626 }, Pagination)
6627 });
6628 },
6629 on: {
6630 init: function init(swiper) {
6631 swiper.pagination.init();
6632 swiper.pagination.render();
6633 swiper.pagination.update();
6634 },
6635 activeIndexChange: function activeIndexChange(swiper) {
6636 if (swiper.params.loop) {
6637 swiper.pagination.update();
6638 } else if (typeof swiper.snapIndex === 'undefined') {
6639 swiper.pagination.update();
6640 }
6641 },
6642 snapIndexChange: function snapIndexChange(swiper) {
6643 if (!swiper.params.loop) {
6644 swiper.pagination.update();
6645 }
6646 },
6647 slidesLengthChange: function slidesLengthChange(swiper) {
6648 if (swiper.params.loop) {
6649 swiper.pagination.render();
6650 swiper.pagination.update();
6651 }
6652 },
6653 snapGridLengthChange: function snapGridLengthChange(swiper) {
6654 if (!swiper.params.loop) {
6655 swiper.pagination.render();
6656 swiper.pagination.update();
6657 }
6658 },
6659 destroy: function destroy(swiper) {
6660 swiper.pagination.destroy();
6661 },
6662 click: function click(swiper, e) {
6663 var targetEl = e.target;
6664
6665 if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && swiper.pagination.$el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) {
6666 if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
6667 var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
6668
6669 if (isHidden === true) {
6670 swiper.emit('paginationShow');
6671 } else {
6672 swiper.emit('paginationHide');
6673 }
6674
6675 swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
6676 }
6677 }
6678 }
6679};
6680
6681var Scrollbar = {
6682 setTranslate: function setTranslate() {
6683 var swiper = this;
6684 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6685 var scrollbar = swiper.scrollbar,
6686 rtl = swiper.rtlTranslate,
6687 progress = swiper.progress;
6688 var dragSize = scrollbar.dragSize,
6689 trackSize = scrollbar.trackSize,
6690 $dragEl = scrollbar.$dragEl,
6691 $el = scrollbar.$el;
6692 var params = swiper.params.scrollbar;
6693 var newSize = dragSize;
6694 var newPos = (trackSize - dragSize) * progress;
6695
6696 if (rtl) {
6697 newPos = -newPos;
6698
6699 if (newPos > 0) {
6700 newSize = dragSize - newPos;
6701 newPos = 0;
6702 } else if (-newPos + dragSize > trackSize) {
6703 newSize = trackSize + newPos;
6704 }
6705 } else if (newPos < 0) {
6706 newSize = dragSize + newPos;
6707 newPos = 0;
6708 } else if (newPos + dragSize > trackSize) {
6709 newSize = trackSize - newPos;
6710 }
6711
6712 if (swiper.isHorizontal()) {
6713 $dragEl.transform("translate3d(" + newPos + "px, 0, 0)");
6714 $dragEl[0].style.width = newSize + "px";
6715 } else {
6716 $dragEl.transform("translate3d(0px, " + newPos + "px, 0)");
6717 $dragEl[0].style.height = newSize + "px";
6718 }
6719
6720 if (params.hide) {
6721 clearTimeout(swiper.scrollbar.timeout);
6722 $el[0].style.opacity = 1;
6723 swiper.scrollbar.timeout = setTimeout(function () {
6724 $el[0].style.opacity = 0;
6725 $el.transition(400);
6726 }, 1000);
6727 }
6728 },
6729 setTransition: function setTransition(duration) {
6730 var swiper = this;
6731 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6732 swiper.scrollbar.$dragEl.transition(duration);
6733 },
6734 updateSize: function updateSize() {
6735 var swiper = this;
6736 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6737 var scrollbar = swiper.scrollbar;
6738 var $dragEl = scrollbar.$dragEl,
6739 $el = scrollbar.$el;
6740 $dragEl[0].style.width = '';
6741 $dragEl[0].style.height = '';
6742 var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
6743 var divider = swiper.size / swiper.virtualSize;
6744 var moveDivider = divider * (trackSize / swiper.size);
6745 var dragSize;
6746
6747 if (swiper.params.scrollbar.dragSize === 'auto') {
6748 dragSize = trackSize * divider;
6749 } else {
6750 dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
6751 }
6752
6753 if (swiper.isHorizontal()) {
6754 $dragEl[0].style.width = dragSize + "px";
6755 } else {
6756 $dragEl[0].style.height = dragSize + "px";
6757 }
6758
6759 if (divider >= 1) {
6760 $el[0].style.display = 'none';
6761 } else {
6762 $el[0].style.display = '';
6763 }
6764
6765 if (swiper.params.scrollbar.hide) {
6766 $el[0].style.opacity = 0;
6767 }
6768
6769 extend(scrollbar, {
6770 trackSize: trackSize,
6771 divider: divider,
6772 moveDivider: moveDivider,
6773 dragSize: dragSize
6774 });
6775 scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
6776 },
6777 getPointerPosition: function getPointerPosition(e) {
6778 var swiper = this;
6779
6780 if (swiper.isHorizontal()) {
6781 return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX;
6782 }
6783
6784 return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY;
6785 },
6786 setDragPosition: function setDragPosition(e) {
6787 var swiper = this;
6788 var scrollbar = swiper.scrollbar,
6789 rtl = swiper.rtlTranslate;
6790 var $el = scrollbar.$el,
6791 dragSize = scrollbar.dragSize,
6792 trackSize = scrollbar.trackSize,
6793 dragStartPos = scrollbar.dragStartPos;
6794 var positionRatio;
6795 positionRatio = (scrollbar.getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
6796 positionRatio = Math.max(Math.min(positionRatio, 1), 0);
6797
6798 if (rtl) {
6799 positionRatio = 1 - positionRatio;
6800 }
6801
6802 var position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
6803 swiper.updateProgress(position);
6804 swiper.setTranslate(position);
6805 swiper.updateActiveIndex();
6806 swiper.updateSlidesClasses();
6807 },
6808 onDragStart: function onDragStart(e) {
6809 var swiper = this;
6810 var params = swiper.params.scrollbar;
6811 var scrollbar = swiper.scrollbar,
6812 $wrapperEl = swiper.$wrapperEl;
6813 var $el = scrollbar.$el,
6814 $dragEl = scrollbar.$dragEl;
6815 swiper.scrollbar.isTouched = true;
6816 swiper.scrollbar.dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
6817 e.preventDefault();
6818 e.stopPropagation();
6819 $wrapperEl.transition(100);
6820 $dragEl.transition(100);
6821 scrollbar.setDragPosition(e);
6822 clearTimeout(swiper.scrollbar.dragTimeout);
6823 $el.transition(0);
6824
6825 if (params.hide) {
6826 $el.css('opacity', 1);
6827 }
6828
6829 if (swiper.params.cssMode) {
6830 swiper.$wrapperEl.css('scroll-snap-type', 'none');
6831 }
6832
6833 swiper.emit('scrollbarDragStart', e);
6834 },
6835 onDragMove: function onDragMove(e) {
6836 var swiper = this;
6837 var scrollbar = swiper.scrollbar,
6838 $wrapperEl = swiper.$wrapperEl;
6839 var $el = scrollbar.$el,
6840 $dragEl = scrollbar.$dragEl;
6841 if (!swiper.scrollbar.isTouched) return;
6842 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
6843 scrollbar.setDragPosition(e);
6844 $wrapperEl.transition(0);
6845 $el.transition(0);
6846 $dragEl.transition(0);
6847 swiper.emit('scrollbarDragMove', e);
6848 },
6849 onDragEnd: function onDragEnd(e) {
6850 var swiper = this;
6851 var params = swiper.params.scrollbar;
6852 var scrollbar = swiper.scrollbar,
6853 $wrapperEl = swiper.$wrapperEl;
6854 var $el = scrollbar.$el;
6855 if (!swiper.scrollbar.isTouched) return;
6856 swiper.scrollbar.isTouched = false;
6857
6858 if (swiper.params.cssMode) {
6859 swiper.$wrapperEl.css('scroll-snap-type', '');
6860 $wrapperEl.transition('');
6861 }
6862
6863 if (params.hide) {
6864 clearTimeout(swiper.scrollbar.dragTimeout);
6865 swiper.scrollbar.dragTimeout = nextTick(function () {
6866 $el.css('opacity', 0);
6867 $el.transition(400);
6868 }, 1000);
6869 }
6870
6871 swiper.emit('scrollbarDragEnd', e);
6872
6873 if (params.snapOnRelease) {
6874 swiper.slideToClosest();
6875 }
6876 },
6877 enableDraggable: function enableDraggable() {
6878 var swiper = this;
6879 if (!swiper.params.scrollbar.el) return;
6880 var document = getDocument();
6881 var scrollbar = swiper.scrollbar,
6882 touchEventsTouch = swiper.touchEventsTouch,
6883 touchEventsDesktop = swiper.touchEventsDesktop,
6884 params = swiper.params,
6885 support = swiper.support;
6886 var $el = scrollbar.$el;
6887 var target = $el[0];
6888 var activeListener = support.passiveListener && params.passiveListeners ? {
6889 passive: false,
6890 capture: false
6891 } : false;
6892 var passiveListener = support.passiveListener && params.passiveListeners ? {
6893 passive: true,
6894 capture: false
6895 } : false;
6896 if (!target) return;
6897
6898 if (!support.touch) {
6899 target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
6900 document.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
6901 document.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
6902 } else {
6903 target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
6904 target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
6905 target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
6906 }
6907 },
6908 disableDraggable: function disableDraggable() {
6909 var swiper = this;
6910 if (!swiper.params.scrollbar.el) return;
6911 var document = getDocument();
6912 var scrollbar = swiper.scrollbar,
6913 touchEventsTouch = swiper.touchEventsTouch,
6914 touchEventsDesktop = swiper.touchEventsDesktop,
6915 params = swiper.params,
6916 support = swiper.support;
6917 var $el = scrollbar.$el;
6918 var target = $el[0];
6919 var activeListener = support.passiveListener && params.passiveListeners ? {
6920 passive: false,
6921 capture: false
6922 } : false;
6923 var passiveListener = support.passiveListener && params.passiveListeners ? {
6924 passive: true,
6925 capture: false
6926 } : false;
6927 if (!target) return;
6928
6929 if (!support.touch) {
6930 target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
6931 document.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
6932 document.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
6933 } else {
6934 target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
6935 target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
6936 target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
6937 }
6938 },
6939 init: function init() {
6940 var swiper = this;
6941 if (!swiper.params.scrollbar.el) return;
6942 var scrollbar = swiper.scrollbar,
6943 $swiperEl = swiper.$el;
6944 var params = swiper.params.scrollbar;
6945 var $el = $(params.el);
6946
6947 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
6948 $el = $swiperEl.find(params.el);
6949 }
6950
6951 var $dragEl = $el.find("." + swiper.params.scrollbar.dragClass);
6952
6953 if ($dragEl.length === 0) {
6954 $dragEl = $("<div class=\"" + swiper.params.scrollbar.dragClass + "\"></div>");
6955 $el.append($dragEl);
6956 }
6957
6958 extend(scrollbar, {
6959 $el: $el,
6960 el: $el[0],
6961 $dragEl: $dragEl,
6962 dragEl: $dragEl[0]
6963 });
6964
6965 if (params.draggable) {
6966 scrollbar.enableDraggable();
6967 }
6968 },
6969 destroy: function destroy() {
6970 var swiper = this;
6971 swiper.scrollbar.disableDraggable();
6972 }
6973};
6974var Scrollbar$1 = {
6975 name: 'scrollbar',
6976 params: {
6977 scrollbar: {
6978 el: null,
6979 dragSize: 'auto',
6980 hide: false,
6981 draggable: false,
6982 snapOnRelease: true,
6983 lockClass: 'swiper-scrollbar-lock',
6984 dragClass: 'swiper-scrollbar-drag'
6985 }
6986 },
6987 create: function create() {
6988 var swiper = this;
6989 bindModuleMethods(swiper, {
6990 scrollbar: _extends({
6991 isTouched: false,
6992 timeout: null,
6993 dragTimeout: null
6994 }, Scrollbar)
6995 });
6996 },
6997 on: {
6998 init: function init(swiper) {
6999 swiper.scrollbar.init();
7000 swiper.scrollbar.updateSize();
7001 swiper.scrollbar.setTranslate();
7002 },
7003 update: function update(swiper) {
7004 swiper.scrollbar.updateSize();
7005 },
7006 resize: function resize(swiper) {
7007 swiper.scrollbar.updateSize();
7008 },
7009 observerUpdate: function observerUpdate(swiper) {
7010 swiper.scrollbar.updateSize();
7011 },
7012 setTranslate: function setTranslate(swiper) {
7013 swiper.scrollbar.setTranslate();
7014 },
7015 setTransition: function setTransition(swiper, duration) {
7016 swiper.scrollbar.setTransition(duration);
7017 },
7018 destroy: function destroy(swiper) {
7019 swiper.scrollbar.destroy();
7020 }
7021 }
7022};
7023
7024var Parallax = {
7025 setTransform: function setTransform(el, progress) {
7026 var swiper = this;
7027 var rtl = swiper.rtl;
7028 var $el = $(el);
7029 var rtlFactor = rtl ? -1 : 1;
7030 var p = $el.attr('data-swiper-parallax') || '0';
7031 var x = $el.attr('data-swiper-parallax-x');
7032 var y = $el.attr('data-swiper-parallax-y');
7033 var scale = $el.attr('data-swiper-parallax-scale');
7034 var opacity = $el.attr('data-swiper-parallax-opacity');
7035
7036 if (x || y) {
7037 x = x || '0';
7038 y = y || '0';
7039 } else if (swiper.isHorizontal()) {
7040 x = p;
7041 y = '0';
7042 } else {
7043 y = p;
7044 x = '0';
7045 }
7046
7047 if (x.indexOf('%') >= 0) {
7048 x = parseInt(x, 10) * progress * rtlFactor + "%";
7049 } else {
7050 x = x * progress * rtlFactor + "px";
7051 }
7052
7053 if (y.indexOf('%') >= 0) {
7054 y = parseInt(y, 10) * progress + "%";
7055 } else {
7056 y = y * progress + "px";
7057 }
7058
7059 if (typeof opacity !== 'undefined' && opacity !== null) {
7060 var currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
7061 $el[0].style.opacity = currentOpacity;
7062 }
7063
7064 if (typeof scale === 'undefined' || scale === null) {
7065 $el.transform("translate3d(" + x + ", " + y + ", 0px)");
7066 } else {
7067 var currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
7068 $el.transform("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")");
7069 }
7070 },
7071 setTranslate: function setTranslate() {
7072 var swiper = this;
7073 var $el = swiper.$el,
7074 slides = swiper.slides,
7075 progress = swiper.progress,
7076 snapGrid = swiper.snapGrid;
7077 $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
7078 swiper.parallax.setTransform(el, progress);
7079 });
7080 slides.each(function (slideEl, slideIndex) {
7081 var slideProgress = slideEl.progress;
7082
7083 if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
7084 slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
7085 }
7086
7087 slideProgress = Math.min(Math.max(slideProgress, -1), 1);
7088 $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
7089 swiper.parallax.setTransform(el, slideProgress);
7090 });
7091 });
7092 },
7093 setTransition: function setTransition(duration) {
7094 if (duration === void 0) {
7095 duration = this.params.speed;
7096 }
7097
7098 var swiper = this;
7099 var $el = swiper.$el;
7100 $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (parallaxEl) {
7101 var $parallaxEl = $(parallaxEl);
7102 var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
7103 if (duration === 0) parallaxDuration = 0;
7104 $parallaxEl.transition(parallaxDuration);
7105 });
7106 }
7107};
7108var Parallax$1 = {
7109 name: 'parallax',
7110 params: {
7111 parallax: {
7112 enabled: false
7113 }
7114 },
7115 create: function create() {
7116 var swiper = this;
7117 bindModuleMethods(swiper, {
7118 parallax: _extends({}, Parallax)
7119 });
7120 },
7121 on: {
7122 beforeInit: function beforeInit(swiper) {
7123 if (!swiper.params.parallax.enabled) return;
7124 swiper.params.watchSlidesProgress = true;
7125 swiper.originalParams.watchSlidesProgress = true;
7126 },
7127 init: function init(swiper) {
7128 if (!swiper.params.parallax.enabled) return;
7129 swiper.parallax.setTranslate();
7130 },
7131 setTranslate: function setTranslate(swiper) {
7132 if (!swiper.params.parallax.enabled) return;
7133 swiper.parallax.setTranslate();
7134 },
7135 setTransition: function setTransition(swiper, duration) {
7136 if (!swiper.params.parallax.enabled) return;
7137 swiper.parallax.setTransition(duration);
7138 }
7139 }
7140};
7141
7142var Zoom = {
7143 // Calc Scale From Multi-touches
7144 getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
7145 if (e.targetTouches.length < 2) return 1;
7146 var x1 = e.targetTouches[0].pageX;
7147 var y1 = e.targetTouches[0].pageY;
7148 var x2 = e.targetTouches[1].pageX;
7149 var y2 = e.targetTouches[1].pageY;
7150 var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
7151 return distance;
7152 },
7153 // Events
7154 onGestureStart: function onGestureStart(e) {
7155 var swiper = this;
7156 var support = swiper.support;
7157 var params = swiper.params.zoom;
7158 var zoom = swiper.zoom;
7159 var gesture = zoom.gesture;
7160 zoom.fakeGestureTouched = false;
7161 zoom.fakeGestureMoved = false;
7162
7163 if (!support.gestures) {
7164 if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) {
7165 return;
7166 }
7167
7168 zoom.fakeGestureTouched = true;
7169 gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
7170 }
7171
7172 if (!gesture.$slideEl || !gesture.$slideEl.length) {
7173 gesture.$slideEl = $(e.target).closest("." + swiper.params.slideClass);
7174 if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
7175 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
7176 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
7177 gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
7178
7179 if (gesture.$imageWrapEl.length === 0) {
7180 gesture.$imageEl = undefined;
7181 return;
7182 }
7183 }
7184
7185 if (gesture.$imageEl) {
7186 gesture.$imageEl.transition(0);
7187 }
7188
7189 swiper.zoom.isScaling = true;
7190 },
7191 onGestureChange: function onGestureChange(e) {
7192 var swiper = this;
7193 var support = swiper.support;
7194 var params = swiper.params.zoom;
7195 var zoom = swiper.zoom;
7196 var gesture = zoom.gesture;
7197
7198 if (!support.gestures) {
7199 if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) {
7200 return;
7201 }
7202
7203 zoom.fakeGestureMoved = true;
7204 gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
7205 }
7206
7207 if (!gesture.$imageEl || gesture.$imageEl.length === 0) {
7208 if (e.type === 'gesturechange') zoom.onGestureStart(e);
7209 return;
7210 }
7211
7212 if (support.gestures) {
7213 zoom.scale = e.scale * zoom.currentScale;
7214 } else {
7215 zoom.scale = gesture.scaleMove / gesture.scaleStart * zoom.currentScale;
7216 }
7217
7218 if (zoom.scale > gesture.maxRatio) {
7219 zoom.scale = gesture.maxRatio - 1 + Math.pow(zoom.scale - gesture.maxRatio + 1, 0.5);
7220 }
7221
7222 if (zoom.scale < params.minRatio) {
7223 zoom.scale = params.minRatio + 1 - Math.pow(params.minRatio - zoom.scale + 1, 0.5);
7224 }
7225
7226 gesture.$imageEl.transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
7227 },
7228 onGestureEnd: function onGestureEnd(e) {
7229 var swiper = this;
7230 var device = swiper.device;
7231 var support = swiper.support;
7232 var params = swiper.params.zoom;
7233 var zoom = swiper.zoom;
7234 var gesture = zoom.gesture;
7235
7236 if (!support.gestures) {
7237 if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
7238 return;
7239 }
7240
7241 if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) {
7242 return;
7243 }
7244
7245 zoom.fakeGestureTouched = false;
7246 zoom.fakeGestureMoved = false;
7247 }
7248
7249 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7250 zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
7251 gesture.$imageEl.transition(swiper.params.speed).transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
7252 zoom.currentScale = zoom.scale;
7253 zoom.isScaling = false;
7254 if (zoom.scale === 1) gesture.$slideEl = undefined;
7255 },
7256 onTouchStart: function onTouchStart(e) {
7257 var swiper = this;
7258 var device = swiper.device;
7259 var zoom = swiper.zoom;
7260 var gesture = zoom.gesture,
7261 image = zoom.image;
7262 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7263 if (image.isTouched) return;
7264 if (device.android && e.cancelable) e.preventDefault();
7265 image.isTouched = true;
7266 image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
7267 image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
7268 },
7269 onTouchMove: function onTouchMove(e) {
7270 var swiper = this;
7271 var zoom = swiper.zoom;
7272 var gesture = zoom.gesture,
7273 image = zoom.image,
7274 velocity = zoom.velocity;
7275 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7276 swiper.allowClick = false;
7277 if (!image.isTouched || !gesture.$slideEl) return;
7278
7279 if (!image.isMoved) {
7280 image.width = gesture.$imageEl[0].offsetWidth;
7281 image.height = gesture.$imageEl[0].offsetHeight;
7282 image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
7283 image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
7284 gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
7285 gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
7286 gesture.$imageWrapEl.transition(0);
7287
7288 if (swiper.rtl) {
7289 image.startX = -image.startX;
7290 image.startY = -image.startY;
7291 }
7292 } // Define if we need image drag
7293
7294
7295 var scaledWidth = image.width * zoom.scale;
7296 var scaledHeight = image.height * zoom.scale;
7297 if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;
7298 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
7299 image.maxX = -image.minX;
7300 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
7301 image.maxY = -image.minY;
7302 image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
7303 image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
7304
7305 if (!image.isMoved && !zoom.isScaling) {
7306 if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
7307 image.isTouched = false;
7308 return;
7309 }
7310
7311 if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
7312 image.isTouched = false;
7313 return;
7314 }
7315 }
7316
7317 if (e.cancelable) {
7318 e.preventDefault();
7319 }
7320
7321 e.stopPropagation();
7322 image.isMoved = true;
7323 image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;
7324 image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;
7325
7326 if (image.currentX < image.minX) {
7327 image.currentX = image.minX + 1 - Math.pow(image.minX - image.currentX + 1, 0.8);
7328 }
7329
7330 if (image.currentX > image.maxX) {
7331 image.currentX = image.maxX - 1 + Math.pow(image.currentX - image.maxX + 1, 0.8);
7332 }
7333
7334 if (image.currentY < image.minY) {
7335 image.currentY = image.minY + 1 - Math.pow(image.minY - image.currentY + 1, 0.8);
7336 }
7337
7338 if (image.currentY > image.maxY) {
7339 image.currentY = image.maxY - 1 + Math.pow(image.currentY - image.maxY + 1, 0.8);
7340 } // Velocity
7341
7342
7343 if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
7344 if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
7345 if (!velocity.prevTime) velocity.prevTime = Date.now();
7346 velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
7347 velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
7348 if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
7349 if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
7350 velocity.prevPositionX = image.touchesCurrent.x;
7351 velocity.prevPositionY = image.touchesCurrent.y;
7352 velocity.prevTime = Date.now();
7353 gesture.$imageWrapEl.transform("translate3d(" + image.currentX + "px, " + image.currentY + "px,0)");
7354 },
7355 onTouchEnd: function onTouchEnd() {
7356 var swiper = this;
7357 var zoom = swiper.zoom;
7358 var gesture = zoom.gesture,
7359 image = zoom.image,
7360 velocity = zoom.velocity;
7361 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7362
7363 if (!image.isTouched || !image.isMoved) {
7364 image.isTouched = false;
7365 image.isMoved = false;
7366 return;
7367 }
7368
7369 image.isTouched = false;
7370 image.isMoved = false;
7371 var momentumDurationX = 300;
7372 var momentumDurationY = 300;
7373 var momentumDistanceX = velocity.x * momentumDurationX;
7374 var newPositionX = image.currentX + momentumDistanceX;
7375 var momentumDistanceY = velocity.y * momentumDurationY;
7376 var newPositionY = image.currentY + momentumDistanceY; // Fix duration
7377
7378 if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
7379 if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
7380 var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
7381 image.currentX = newPositionX;
7382 image.currentY = newPositionY; // Define if we need image drag
7383
7384 var scaledWidth = image.width * zoom.scale;
7385 var scaledHeight = image.height * zoom.scale;
7386 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
7387 image.maxX = -image.minX;
7388 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
7389 image.maxY = -image.minY;
7390 image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
7391 image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
7392 gesture.$imageWrapEl.transition(momentumDuration).transform("translate3d(" + image.currentX + "px, " + image.currentY + "px,0)");
7393 },
7394 onTransitionEnd: function onTransitionEnd() {
7395 var swiper = this;
7396 var zoom = swiper.zoom;
7397 var gesture = zoom.gesture;
7398
7399 if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
7400 if (gesture.$imageEl) {
7401 gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
7402 }
7403
7404 if (gesture.$imageWrapEl) {
7405 gesture.$imageWrapEl.transform('translate3d(0,0,0)');
7406 }
7407
7408 zoom.scale = 1;
7409 zoom.currentScale = 1;
7410 gesture.$slideEl = undefined;
7411 gesture.$imageEl = undefined;
7412 gesture.$imageWrapEl = undefined;
7413 }
7414 },
7415 // Toggle Zoom
7416 toggle: function toggle(e) {
7417 var swiper = this;
7418 var zoom = swiper.zoom;
7419
7420 if (zoom.scale && zoom.scale !== 1) {
7421 // Zoom Out
7422 zoom.out();
7423 } else {
7424 // Zoom In
7425 zoom.in(e);
7426 }
7427 },
7428 in: function _in(e) {
7429 var swiper = this;
7430 var window = getWindow();
7431 var zoom = swiper.zoom;
7432 var params = swiper.params.zoom;
7433 var gesture = zoom.gesture,
7434 image = zoom.image;
7435
7436 if (!gesture.$slideEl) {
7437 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
7438 gesture.$slideEl = swiper.$wrapperEl.children("." + swiper.params.slideActiveClass);
7439 } else {
7440 gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
7441 }
7442
7443 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
7444 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
7445 }
7446
7447 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7448 gesture.$slideEl.addClass("" + params.zoomedSlideClass);
7449 var touchX;
7450 var touchY;
7451 var offsetX;
7452 var offsetY;
7453 var diffX;
7454 var diffY;
7455 var translateX;
7456 var translateY;
7457 var imageWidth;
7458 var imageHeight;
7459 var scaledWidth;
7460 var scaledHeight;
7461 var translateMinX;
7462 var translateMinY;
7463 var translateMaxX;
7464 var translateMaxY;
7465 var slideWidth;
7466 var slideHeight;
7467
7468 if (typeof image.touchesStart.x === 'undefined' && e) {
7469 touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
7470 touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
7471 } else {
7472 touchX = image.touchesStart.x;
7473 touchY = image.touchesStart.y;
7474 }
7475
7476 zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
7477 zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
7478
7479 if (e) {
7480 slideWidth = gesture.$slideEl[0].offsetWidth;
7481 slideHeight = gesture.$slideEl[0].offsetHeight;
7482 offsetX = gesture.$slideEl.offset().left + window.scrollX;
7483 offsetY = gesture.$slideEl.offset().top + window.scrollY;
7484 diffX = offsetX + slideWidth / 2 - touchX;
7485 diffY = offsetY + slideHeight / 2 - touchY;
7486 imageWidth = gesture.$imageEl[0].offsetWidth;
7487 imageHeight = gesture.$imageEl[0].offsetHeight;
7488 scaledWidth = imageWidth * zoom.scale;
7489 scaledHeight = imageHeight * zoom.scale;
7490 translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
7491 translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
7492 translateMaxX = -translateMinX;
7493 translateMaxY = -translateMinY;
7494 translateX = diffX * zoom.scale;
7495 translateY = diffY * zoom.scale;
7496
7497 if (translateX < translateMinX) {
7498 translateX = translateMinX;
7499 }
7500
7501 if (translateX > translateMaxX) {
7502 translateX = translateMaxX;
7503 }
7504
7505 if (translateY < translateMinY) {
7506 translateY = translateMinY;
7507 }
7508
7509 if (translateY > translateMaxY) {
7510 translateY = translateMaxY;
7511 }
7512 } else {
7513 translateX = 0;
7514 translateY = 0;
7515 }
7516
7517 gesture.$imageWrapEl.transition(300).transform("translate3d(" + translateX + "px, " + translateY + "px,0)");
7518 gesture.$imageEl.transition(300).transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
7519 },
7520 out: function out() {
7521 var swiper = this;
7522 var zoom = swiper.zoom;
7523 var params = swiper.params.zoom;
7524 var gesture = zoom.gesture;
7525
7526 if (!gesture.$slideEl) {
7527 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
7528 gesture.$slideEl = swiper.$wrapperEl.children("." + swiper.params.slideActiveClass);
7529 } else {
7530 gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
7531 }
7532
7533 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
7534 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
7535 }
7536
7537 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
7538 zoom.scale = 1;
7539 zoom.currentScale = 1;
7540 gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
7541 gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
7542 gesture.$slideEl.removeClass("" + params.zoomedSlideClass);
7543 gesture.$slideEl = undefined;
7544 },
7545 toggleGestures: function toggleGestures(method) {
7546 var swiper = this;
7547 var zoom = swiper.zoom;
7548 var selector = zoom.slideSelector,
7549 passive = zoom.passiveListener;
7550 swiper.$wrapperEl[method]('gesturestart', selector, zoom.onGestureStart, passive);
7551 swiper.$wrapperEl[method]('gesturechange', selector, zoom.onGestureChange, passive);
7552 swiper.$wrapperEl[method]('gestureend', selector, zoom.onGestureEnd, passive);
7553 },
7554 enableGestures: function enableGestures() {
7555 if (this.zoom.gesturesEnabled) return;
7556 this.zoom.gesturesEnabled = true;
7557 this.zoom.toggleGestures('on');
7558 },
7559 disableGestures: function disableGestures() {
7560 if (!this.zoom.gesturesEnabled) return;
7561 this.zoom.gesturesEnabled = false;
7562 this.zoom.toggleGestures('off');
7563 },
7564 // Attach/Detach Events
7565 enable: function enable() {
7566 var swiper = this;
7567 var support = swiper.support;
7568 var zoom = swiper.zoom;
7569 if (zoom.enabled) return;
7570 zoom.enabled = true;
7571 var passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? {
7572 passive: true,
7573 capture: false
7574 } : false;
7575 var activeListenerWithCapture = support.passiveListener ? {
7576 passive: false,
7577 capture: true
7578 } : true;
7579 var slideSelector = "." + swiper.params.slideClass;
7580 swiper.zoom.passiveListener = passiveListener;
7581 swiper.zoom.slideSelector = slideSelector; // Scale image
7582
7583 if (support.gestures) {
7584 swiper.$wrapperEl.on(swiper.touchEvents.start, swiper.zoom.enableGestures, passiveListener);
7585 swiper.$wrapperEl.on(swiper.touchEvents.end, swiper.zoom.disableGestures, passiveListener);
7586 } else if (swiper.touchEvents.start === 'touchstart') {
7587 swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
7588 swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
7589 swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
7590
7591 if (swiper.touchEvents.cancel) {
7592 swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
7593 }
7594 } // Move image
7595
7596
7597 swiper.$wrapperEl.on(swiper.touchEvents.move, "." + swiper.params.zoom.containerClass, zoom.onTouchMove, activeListenerWithCapture);
7598 },
7599 disable: function disable() {
7600 var swiper = this;
7601 var zoom = swiper.zoom;
7602 if (!zoom.enabled) return;
7603 var support = swiper.support;
7604 swiper.zoom.enabled = false;
7605 var passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? {
7606 passive: true,
7607 capture: false
7608 } : false;
7609 var activeListenerWithCapture = support.passiveListener ? {
7610 passive: false,
7611 capture: true
7612 } : true;
7613 var slideSelector = "." + swiper.params.slideClass; // Scale image
7614
7615 if (support.gestures) {
7616 swiper.$wrapperEl.off(swiper.touchEvents.start, swiper.zoom.enableGestures, passiveListener);
7617 swiper.$wrapperEl.off(swiper.touchEvents.end, swiper.zoom.disableGestures, passiveListener);
7618 } else if (swiper.touchEvents.start === 'touchstart') {
7619 swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
7620 swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
7621 swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
7622
7623 if (swiper.touchEvents.cancel) {
7624 swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
7625 }
7626 } // Move image
7627
7628
7629 swiper.$wrapperEl.off(swiper.touchEvents.move, "." + swiper.params.zoom.containerClass, zoom.onTouchMove, activeListenerWithCapture);
7630 }
7631};
7632var Zoom$1 = {
7633 name: 'zoom',
7634 params: {
7635 zoom: {
7636 enabled: false,
7637 maxRatio: 3,
7638 minRatio: 1,
7639 toggle: true,
7640 containerClass: 'swiper-zoom-container',
7641 zoomedSlideClass: 'swiper-slide-zoomed'
7642 }
7643 },
7644 create: function create() {
7645 var swiper = this;
7646 bindModuleMethods(swiper, {
7647 zoom: _extends({
7648 enabled: false,
7649 scale: 1,
7650 currentScale: 1,
7651 isScaling: false,
7652 gesture: {
7653 $slideEl: undefined,
7654 slideWidth: undefined,
7655 slideHeight: undefined,
7656 $imageEl: undefined,
7657 $imageWrapEl: undefined,
7658 maxRatio: 3
7659 },
7660 image: {
7661 isTouched: undefined,
7662 isMoved: undefined,
7663 currentX: undefined,
7664 currentY: undefined,
7665 minX: undefined,
7666 minY: undefined,
7667 maxX: undefined,
7668 maxY: undefined,
7669 width: undefined,
7670 height: undefined,
7671 startX: undefined,
7672 startY: undefined,
7673 touchesStart: {},
7674 touchesCurrent: {}
7675 },
7676 velocity: {
7677 x: undefined,
7678 y: undefined,
7679 prevPositionX: undefined,
7680 prevPositionY: undefined,
7681 prevTime: undefined
7682 }
7683 }, Zoom)
7684 });
7685 var scale = 1;
7686 Object.defineProperty(swiper.zoom, 'scale', {
7687 get: function get() {
7688 return scale;
7689 },
7690 set: function set(value) {
7691 if (scale !== value) {
7692 var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
7693 var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
7694 swiper.emit('zoomChange', value, imageEl, slideEl);
7695 }
7696
7697 scale = value;
7698 }
7699 });
7700 },
7701 on: {
7702 init: function init(swiper) {
7703 if (swiper.params.zoom.enabled) {
7704 swiper.zoom.enable();
7705 }
7706 },
7707 destroy: function destroy(swiper) {
7708 swiper.zoom.disable();
7709 },
7710 touchStart: function touchStart(swiper, e) {
7711 if (!swiper.zoom.enabled) return;
7712 swiper.zoom.onTouchStart(e);
7713 },
7714 touchEnd: function touchEnd(swiper, e) {
7715 if (!swiper.zoom.enabled) return;
7716 swiper.zoom.onTouchEnd(e);
7717 },
7718 doubleTap: function doubleTap(swiper, e) {
7719 if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
7720 swiper.zoom.toggle(e);
7721 }
7722 },
7723 transitionEnd: function transitionEnd(swiper) {
7724 if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
7725 swiper.zoom.onTransitionEnd();
7726 }
7727 },
7728 slideChange: function slideChange(swiper) {
7729 if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
7730 swiper.zoom.onTransitionEnd();
7731 }
7732 }
7733 }
7734};
7735
7736var Lazy = {
7737 loadInSlide: function loadInSlide(index, loadInDuplicate) {
7738 if (loadInDuplicate === void 0) {
7739 loadInDuplicate = true;
7740 }
7741
7742 var swiper = this;
7743 var params = swiper.params.lazy;
7744 if (typeof index === 'undefined') return;
7745 if (swiper.slides.length === 0) return;
7746 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
7747 var $slideEl = isVirtual ? swiper.$wrapperEl.children("." + swiper.params.slideClass + "[data-swiper-slide-index=\"" + index + "\"]") : swiper.slides.eq(index);
7748 var $images = $slideEl.find("." + params.elementClass + ":not(." + params.loadedClass + "):not(." + params.loadingClass + ")");
7749
7750 if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
7751 $images.push($slideEl[0]);
7752 }
7753
7754 if ($images.length === 0) return;
7755 $images.each(function (imageEl) {
7756 var $imageEl = $(imageEl);
7757 $imageEl.addClass(params.loadingClass);
7758 var background = $imageEl.attr('data-background');
7759 var src = $imageEl.attr('data-src');
7760 var srcset = $imageEl.attr('data-srcset');
7761 var sizes = $imageEl.attr('data-sizes');
7762 var $pictureEl = $imageEl.parent('picture');
7763 swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, function () {
7764 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return;
7765
7766 if (background) {
7767 $imageEl.css('background-image', "url(\"" + background + "\")");
7768 $imageEl.removeAttr('data-background');
7769 } else {
7770 if (srcset) {
7771 $imageEl.attr('srcset', srcset);
7772 $imageEl.removeAttr('data-srcset');
7773 }
7774
7775 if (sizes) {
7776 $imageEl.attr('sizes', sizes);
7777 $imageEl.removeAttr('data-sizes');
7778 }
7779
7780 if ($pictureEl.length) {
7781 $pictureEl.children('source').each(function (sourceEl) {
7782 var $source = $(sourceEl);
7783
7784 if ($source.attr('data-srcset')) {
7785 $source.attr('srcset', $source.attr('data-srcset'));
7786 $source.removeAttr('data-srcset');
7787 }
7788 });
7789 }
7790
7791 if (src) {
7792 $imageEl.attr('src', src);
7793 $imageEl.removeAttr('data-src');
7794 }
7795 }
7796
7797 $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
7798 $slideEl.find("." + params.preloaderClass).remove();
7799
7800 if (swiper.params.loop && loadInDuplicate) {
7801 var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
7802
7803 if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
7804 var originalSlide = swiper.$wrapperEl.children("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + swiper.params.slideDuplicateClass + ")");
7805 swiper.lazy.loadInSlide(originalSlide.index(), false);
7806 } else {
7807 var duplicatedSlide = swiper.$wrapperEl.children("." + swiper.params.slideDuplicateClass + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]");
7808 swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
7809 }
7810 }
7811
7812 swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
7813
7814 if (swiper.params.autoHeight) {
7815 swiper.updateAutoHeight();
7816 }
7817 });
7818 swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
7819 });
7820 },
7821 load: function load() {
7822 var swiper = this;
7823 var $wrapperEl = swiper.$wrapperEl,
7824 swiperParams = swiper.params,
7825 slides = swiper.slides,
7826 activeIndex = swiper.activeIndex;
7827 var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
7828 var params = swiperParams.lazy;
7829 var slidesPerView = swiperParams.slidesPerView;
7830
7831 if (slidesPerView === 'auto') {
7832 slidesPerView = 0;
7833 }
7834
7835 function slideExist(index) {
7836 if (isVirtual) {
7837 if ($wrapperEl.children("." + swiperParams.slideClass + "[data-swiper-slide-index=\"" + index + "\"]").length) {
7838 return true;
7839 }
7840 } else if (slides[index]) return true;
7841
7842 return false;
7843 }
7844
7845 function slideIndex(slideEl) {
7846 if (isVirtual) {
7847 return $(slideEl).attr('data-swiper-slide-index');
7848 }
7849
7850 return $(slideEl).index();
7851 }
7852
7853 if (!swiper.lazy.initialImageLoaded) swiper.lazy.initialImageLoaded = true;
7854
7855 if (swiper.params.watchSlidesVisibility) {
7856 $wrapperEl.children("." + swiperParams.slideVisibleClass).each(function (slideEl) {
7857 var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
7858 swiper.lazy.loadInSlide(index);
7859 });
7860 } else if (slidesPerView > 1) {
7861 for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
7862 if (slideExist(i)) swiper.lazy.loadInSlide(i);
7863 }
7864 } else {
7865 swiper.lazy.loadInSlide(activeIndex);
7866 }
7867
7868 if (params.loadPrevNext) {
7869 if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) {
7870 var amount = params.loadPrevNextAmount;
7871 var spv = slidesPerView;
7872 var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
7873 var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides
7874
7875 for (var _i = activeIndex + slidesPerView; _i < maxIndex; _i += 1) {
7876 if (slideExist(_i)) swiper.lazy.loadInSlide(_i);
7877 } // Prev Slides
7878
7879
7880 for (var _i2 = minIndex; _i2 < activeIndex; _i2 += 1) {
7881 if (slideExist(_i2)) swiper.lazy.loadInSlide(_i2);
7882 }
7883 } else {
7884 var nextSlide = $wrapperEl.children("." + swiperParams.slideNextClass);
7885 if (nextSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(nextSlide));
7886 var prevSlide = $wrapperEl.children("." + swiperParams.slidePrevClass);
7887 if (prevSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(prevSlide));
7888 }
7889 }
7890 },
7891 checkInViewOnLoad: function checkInViewOnLoad() {
7892 var window = getWindow();
7893 var swiper = this;
7894 if (!swiper || swiper.destroyed) return;
7895 var $scrollElement = swiper.params.lazy.scrollingElement ? $(swiper.params.lazy.scrollingElement) : $(window);
7896 var isWindow = $scrollElement[0] === window;
7897 var scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;
7898 var scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;
7899 var swiperOffset = swiper.$el.offset();
7900 var rtl = swiper.rtlTranslate;
7901 var inView = false;
7902 if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;
7903 var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]];
7904
7905 for (var i = 0; i < swiperCoord.length; i += 1) {
7906 var point = swiperCoord[i];
7907
7908 if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) {
7909 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
7910
7911 inView = true;
7912 }
7913 }
7914
7915 if (inView) {
7916 swiper.lazy.load();
7917 $scrollElement.off('scroll', swiper.lazy.checkInViewOnLoad);
7918 } else if (!swiper.lazy.scrollHandlerAttached) {
7919 swiper.lazy.scrollHandlerAttached = true;
7920 $scrollElement.on('scroll', swiper.lazy.checkInViewOnLoad);
7921 }
7922 }
7923};
7924var Lazy$1 = {
7925 name: 'lazy',
7926 params: {
7927 lazy: {
7928 checkInView: false,
7929 enabled: false,
7930 loadPrevNext: false,
7931 loadPrevNextAmount: 1,
7932 loadOnTransitionStart: false,
7933 scrollingElement: '',
7934 elementClass: 'swiper-lazy',
7935 loadingClass: 'swiper-lazy-loading',
7936 loadedClass: 'swiper-lazy-loaded',
7937 preloaderClass: 'swiper-lazy-preloader'
7938 }
7939 },
7940 create: function create() {
7941 var swiper = this;
7942 bindModuleMethods(swiper, {
7943 lazy: _extends({
7944 initialImageLoaded: false
7945 }, Lazy)
7946 });
7947 },
7948 on: {
7949 beforeInit: function beforeInit(swiper) {
7950 if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
7951 swiper.params.preloadImages = false;
7952 }
7953 },
7954 init: function init(swiper) {
7955 if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
7956 if (swiper.params.lazy.checkInView) {
7957 swiper.lazy.checkInViewOnLoad();
7958 } else {
7959 swiper.lazy.load();
7960 }
7961 }
7962 },
7963 scroll: function scroll(swiper) {
7964 if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
7965 swiper.lazy.load();
7966 }
7967 },
7968 'scrollbarDragMove resize _freeModeNoMomentumRelease': function lazyLoad(swiper) {
7969 if (swiper.params.lazy.enabled) {
7970 swiper.lazy.load();
7971 }
7972 },
7973 transitionStart: function transitionStart(swiper) {
7974 if (swiper.params.lazy.enabled) {
7975 if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded) {
7976 swiper.lazy.load();
7977 }
7978 }
7979 },
7980 transitionEnd: function transitionEnd(swiper) {
7981 if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
7982 swiper.lazy.load();
7983 }
7984 },
7985 slideChange: function slideChange(swiper) {
7986 if (swiper.params.lazy.enabled && swiper.params.cssMode) {
7987 swiper.lazy.load();
7988 }
7989 }
7990 }
7991};
7992
7993var Controller = {
7994 LinearSpline: function LinearSpline(x, y) {
7995 var binarySearch = function search() {
7996 var maxIndex;
7997 var minIndex;
7998 var guess;
7999 return function (array, val) {
8000 minIndex = -1;
8001 maxIndex = array.length;
8002
8003 while (maxIndex - minIndex > 1) {
8004 guess = maxIndex + minIndex >> 1;
8005
8006 if (array[guess] <= val) {
8007 minIndex = guess;
8008 } else {
8009 maxIndex = guess;
8010 }
8011 }
8012
8013 return maxIndex;
8014 };
8015 }();
8016
8017 this.x = x;
8018 this.y = y;
8019 this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value:
8020 // (x1,y1) is the known point before given value,
8021 // (x3,y3) is the known point after given value.
8022
8023 var i1;
8024 var i3;
8025
8026 this.interpolate = function interpolate(x2) {
8027 if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2):
8028
8029 i3 = binarySearch(this.x, x2);
8030 i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already:
8031 // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
8032
8033 return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
8034 };
8035
8036 return this;
8037 },
8038 // xxx: for now i will just save one spline function to to
8039 getInterpolateFunction: function getInterpolateFunction(c) {
8040 var swiper = this;
8041
8042 if (!swiper.controller.spline) {
8043 swiper.controller.spline = swiper.params.loop ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
8044 }
8045 },
8046 setTranslate: function setTranslate(_setTranslate, byController) {
8047 var swiper = this;
8048 var controlled = swiper.controller.control;
8049 var multiplier;
8050 var controlledTranslate;
8051 var Swiper = swiper.constructor;
8052
8053 function setControlledTranslate(c) {
8054 // this will create an Interpolate function based on the snapGrids
8055 // x is the Grid of the scrolled scroller and y will be the controlled scroller
8056 // it makes sense to create this only once and recall it for the interpolation
8057 // the function does a lot of value caching for performance
8058 var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
8059
8060 if (swiper.params.controller.by === 'slide') {
8061 swiper.controller.getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
8062 // but it did not work out
8063
8064 controlledTranslate = -swiper.controller.spline.interpolate(-translate);
8065 }
8066
8067 if (!controlledTranslate || swiper.params.controller.by === 'container') {
8068 multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
8069 controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
8070 }
8071
8072 if (swiper.params.controller.inverse) {
8073 controlledTranslate = c.maxTranslate() - controlledTranslate;
8074 }
8075
8076 c.updateProgress(controlledTranslate);
8077 c.setTranslate(controlledTranslate, swiper);
8078 c.updateActiveIndex();
8079 c.updateSlidesClasses();
8080 }
8081
8082 if (Array.isArray(controlled)) {
8083 for (var i = 0; i < controlled.length; i += 1) {
8084 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
8085 setControlledTranslate(controlled[i]);
8086 }
8087 }
8088 } else if (controlled instanceof Swiper && byController !== controlled) {
8089 setControlledTranslate(controlled);
8090 }
8091 },
8092 setTransition: function setTransition(duration, byController) {
8093 var swiper = this;
8094 var Swiper = swiper.constructor;
8095 var controlled = swiper.controller.control;
8096 var i;
8097
8098 function setControlledTransition(c) {
8099 c.setTransition(duration, swiper);
8100
8101 if (duration !== 0) {
8102 c.transitionStart();
8103
8104 if (c.params.autoHeight) {
8105 nextTick(function () {
8106 c.updateAutoHeight();
8107 });
8108 }
8109
8110 c.$wrapperEl.transitionEnd(function () {
8111 if (!controlled) return;
8112
8113 if (c.params.loop && swiper.params.controller.by === 'slide') {
8114 c.loopFix();
8115 }
8116
8117 c.transitionEnd();
8118 });
8119 }
8120 }
8121
8122 if (Array.isArray(controlled)) {
8123 for (i = 0; i < controlled.length; i += 1) {
8124 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
8125 setControlledTransition(controlled[i]);
8126 }
8127 }
8128 } else if (controlled instanceof Swiper && byController !== controlled) {
8129 setControlledTransition(controlled);
8130 }
8131 }
8132};
8133var Controller$1 = {
8134 name: 'controller',
8135 params: {
8136 controller: {
8137 control: undefined,
8138 inverse: false,
8139 by: 'slide' // or 'container'
8140
8141 }
8142 },
8143 create: function create() {
8144 var swiper = this;
8145 bindModuleMethods(swiper, {
8146 controller: _extends({
8147 control: swiper.params.controller.control
8148 }, Controller)
8149 });
8150 },
8151 on: {
8152 update: function update(swiper) {
8153 if (!swiper.controller.control) return;
8154
8155 if (swiper.controller.spline) {
8156 swiper.controller.spline = undefined;
8157 delete swiper.controller.spline;
8158 }
8159 },
8160 resize: function resize(swiper) {
8161 if (!swiper.controller.control) return;
8162
8163 if (swiper.controller.spline) {
8164 swiper.controller.spline = undefined;
8165 delete swiper.controller.spline;
8166 }
8167 },
8168 observerUpdate: function observerUpdate(swiper) {
8169 if (!swiper.controller.control) return;
8170
8171 if (swiper.controller.spline) {
8172 swiper.controller.spline = undefined;
8173 delete swiper.controller.spline;
8174 }
8175 },
8176 setTranslate: function setTranslate(swiper, translate, byController) {
8177 if (!swiper.controller.control) return;
8178 swiper.controller.setTranslate(translate, byController);
8179 },
8180 setTransition: function setTransition(swiper, duration, byController) {
8181 if (!swiper.controller.control) return;
8182 swiper.controller.setTransition(duration, byController);
8183 }
8184 }
8185};
8186
8187var A11y = {
8188 getRandomNumber: function getRandomNumber(size) {
8189 if (size === void 0) {
8190 size = 16;
8191 }
8192
8193 var randomChar = function randomChar() {
8194 return Math.round(16 * Math.random()).toString(16);
8195 };
8196
8197 return 'x'.repeat(size).replace(/x/g, randomChar);
8198 },
8199 makeElFocusable: function makeElFocusable($el) {
8200 $el.attr('tabIndex', '0');
8201 return $el;
8202 },
8203 makeElNotFocusable: function makeElNotFocusable($el) {
8204 $el.attr('tabIndex', '-1');
8205 return $el;
8206 },
8207 addElRole: function addElRole($el, role) {
8208 $el.attr('role', role);
8209 return $el;
8210 },
8211 addElRoleDescription: function addElRoleDescription($el, description) {
8212 $el.attr('aria-roledescription', description);
8213 return $el;
8214 },
8215 addElControls: function addElControls($el, controls) {
8216 $el.attr('aria-controls', controls);
8217 return $el;
8218 },
8219 addElLabel: function addElLabel($el, label) {
8220 $el.attr('aria-label', label);
8221 return $el;
8222 },
8223 addElId: function addElId($el, id) {
8224 $el.attr('id', id);
8225 return $el;
8226 },
8227 addElLive: function addElLive($el, live) {
8228 $el.attr('aria-live', live);
8229 return $el;
8230 },
8231 disableEl: function disableEl($el) {
8232 $el.attr('aria-disabled', true);
8233 return $el;
8234 },
8235 enableEl: function enableEl($el) {
8236 $el.attr('aria-disabled', false);
8237 return $el;
8238 },
8239 onEnterOrSpaceKey: function onEnterOrSpaceKey(e) {
8240 if (e.keyCode !== 13 && e.keyCode !== 32) return;
8241 var swiper = this;
8242 var params = swiper.params.a11y;
8243 var $targetEl = $(e.target);
8244
8245 if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
8246 if (!(swiper.isEnd && !swiper.params.loop)) {
8247 swiper.slideNext();
8248 }
8249
8250 if (swiper.isEnd) {
8251 swiper.a11y.notify(params.lastSlideMessage);
8252 } else {
8253 swiper.a11y.notify(params.nextSlideMessage);
8254 }
8255 }
8256
8257 if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
8258 if (!(swiper.isBeginning && !swiper.params.loop)) {
8259 swiper.slidePrev();
8260 }
8261
8262 if (swiper.isBeginning) {
8263 swiper.a11y.notify(params.firstSlideMessage);
8264 } else {
8265 swiper.a11y.notify(params.prevSlideMessage);
8266 }
8267 }
8268
8269 if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) {
8270 $targetEl[0].click();
8271 }
8272 },
8273 notify: function notify(message) {
8274 var swiper = this;
8275 var notification = swiper.a11y.liveRegion;
8276 if (notification.length === 0) return;
8277 notification.html('');
8278 notification.html(message);
8279 },
8280 updateNavigation: function updateNavigation() {
8281 var swiper = this;
8282 if (swiper.params.loop || !swiper.navigation) return;
8283 var _swiper$navigation = swiper.navigation,
8284 $nextEl = _swiper$navigation.$nextEl,
8285 $prevEl = _swiper$navigation.$prevEl;
8286
8287 if ($prevEl && $prevEl.length > 0) {
8288 if (swiper.isBeginning) {
8289 swiper.a11y.disableEl($prevEl);
8290 swiper.a11y.makeElNotFocusable($prevEl);
8291 } else {
8292 swiper.a11y.enableEl($prevEl);
8293 swiper.a11y.makeElFocusable($prevEl);
8294 }
8295 }
8296
8297 if ($nextEl && $nextEl.length > 0) {
8298 if (swiper.isEnd) {
8299 swiper.a11y.disableEl($nextEl);
8300 swiper.a11y.makeElNotFocusable($nextEl);
8301 } else {
8302 swiper.a11y.enableEl($nextEl);
8303 swiper.a11y.makeElFocusable($nextEl);
8304 }
8305 }
8306 },
8307 updatePagination: function updatePagination() {
8308 var swiper = this;
8309 var params = swiper.params.a11y;
8310
8311 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
8312 swiper.pagination.bullets.each(function (bulletEl) {
8313 var $bulletEl = $(bulletEl);
8314 swiper.a11y.makeElFocusable($bulletEl);
8315
8316 if (!swiper.params.pagination.renderBullet) {
8317 swiper.a11y.addElRole($bulletEl, 'button');
8318 swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1));
8319 }
8320 });
8321 }
8322 },
8323 init: function init() {
8324 var swiper = this;
8325 var params = swiper.params.a11y;
8326 swiper.$el.append(swiper.a11y.liveRegion); // Container
8327
8328 var $containerEl = swiper.$el;
8329
8330 if (params.containerRoleDescriptionMessage) {
8331 swiper.a11y.addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);
8332 }
8333
8334 if (params.containerMessage) {
8335 swiper.a11y.addElLabel($containerEl, params.containerMessage);
8336 } // Wrapper
8337
8338
8339 var $wrapperEl = swiper.$wrapperEl;
8340 var wrapperId = $wrapperEl.attr('id') || "swiper-wrapper-" + swiper.a11y.getRandomNumber(16);
8341 var live;
8342 swiper.a11y.addElId($wrapperEl, wrapperId);
8343
8344 if (swiper.params.autoplay && swiper.params.autoplay.enabled) {
8345 live = 'off';
8346 } else {
8347 live = 'polite';
8348 }
8349
8350 swiper.a11y.addElLive($wrapperEl, live); // Slide
8351
8352 if (params.itemRoleDescriptionMessage) {
8353 swiper.a11y.addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);
8354 }
8355
8356 swiper.a11y.addElRole($(swiper.slides), 'group');
8357 swiper.slides.each(function (slideEl) {
8358 var $slideEl = $(slideEl);
8359 var ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, $slideEl.index() + 1).replace(/\{\{slidesLength\}\}/, swiper.slides.length);
8360 swiper.a11y.addElLabel($slideEl, ariaLabelMessage);
8361 }); // Navigation
8362
8363 var $nextEl;
8364 var $prevEl;
8365
8366 if (swiper.navigation && swiper.navigation.$nextEl) {
8367 $nextEl = swiper.navigation.$nextEl;
8368 }
8369
8370 if (swiper.navigation && swiper.navigation.$prevEl) {
8371 $prevEl = swiper.navigation.$prevEl;
8372 }
8373
8374 if ($nextEl && $nextEl.length) {
8375 swiper.a11y.makeElFocusable($nextEl);
8376
8377 if ($nextEl[0].tagName !== 'BUTTON') {
8378 swiper.a11y.addElRole($nextEl, 'button');
8379 $nextEl.on('keydown', swiper.a11y.onEnterOrSpaceKey);
8380 }
8381
8382 swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
8383 swiper.a11y.addElControls($nextEl, wrapperId);
8384 }
8385
8386 if ($prevEl && $prevEl.length) {
8387 swiper.a11y.makeElFocusable($prevEl);
8388
8389 if ($prevEl[0].tagName !== 'BUTTON') {
8390 swiper.a11y.addElRole($prevEl, 'button');
8391 $prevEl.on('keydown', swiper.a11y.onEnterOrSpaceKey);
8392 }
8393
8394 swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
8395 swiper.a11y.addElControls($prevEl, wrapperId);
8396 } // Pagination
8397
8398
8399 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
8400 swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), swiper.a11y.onEnterOrSpaceKey);
8401 }
8402 },
8403 destroy: function destroy() {
8404 var swiper = this;
8405 if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) swiper.a11y.liveRegion.remove();
8406 var $nextEl;
8407 var $prevEl;
8408
8409 if (swiper.navigation && swiper.navigation.$nextEl) {
8410 $nextEl = swiper.navigation.$nextEl;
8411 }
8412
8413 if (swiper.navigation && swiper.navigation.$prevEl) {
8414 $prevEl = swiper.navigation.$prevEl;
8415 }
8416
8417 if ($nextEl) {
8418 $nextEl.off('keydown', swiper.a11y.onEnterOrSpaceKey);
8419 }
8420
8421 if ($prevEl) {
8422 $prevEl.off('keydown', swiper.a11y.onEnterOrSpaceKey);
8423 } // Pagination
8424
8425
8426 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
8427 swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), swiper.a11y.onEnterOrSpaceKey);
8428 }
8429 }
8430};
8431var A11y$1 = {
8432 name: 'a11y',
8433 params: {
8434 a11y: {
8435 enabled: true,
8436 notificationClass: 'swiper-notification',
8437 prevSlideMessage: 'Previous slide',
8438 nextSlideMessage: 'Next slide',
8439 firstSlideMessage: 'This is the first slide',
8440 lastSlideMessage: 'This is the last slide',
8441 paginationBulletMessage: 'Go to slide {{index}}',
8442 slideLabelMessage: '{{index}} / {{slidesLength}}',
8443 containerMessage: null,
8444 containerRoleDescriptionMessage: null,
8445 itemRoleDescriptionMessage: null
8446 }
8447 },
8448 create: function create() {
8449 var swiper = this;
8450 bindModuleMethods(swiper, {
8451 a11y: _extends({}, A11y, {
8452 liveRegion: $("<span class=\"" + swiper.params.a11y.notificationClass + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")
8453 })
8454 });
8455 },
8456 on: {
8457 afterInit: function afterInit(swiper) {
8458 if (!swiper.params.a11y.enabled) return;
8459 swiper.a11y.init();
8460 swiper.a11y.updateNavigation();
8461 },
8462 toEdge: function toEdge(swiper) {
8463 if (!swiper.params.a11y.enabled) return;
8464 swiper.a11y.updateNavigation();
8465 },
8466 fromEdge: function fromEdge(swiper) {
8467 if (!swiper.params.a11y.enabled) return;
8468 swiper.a11y.updateNavigation();
8469 },
8470 paginationUpdate: function paginationUpdate(swiper) {
8471 if (!swiper.params.a11y.enabled) return;
8472 swiper.a11y.updatePagination();
8473 },
8474 destroy: function destroy(swiper) {
8475 if (!swiper.params.a11y.enabled) return;
8476 swiper.a11y.destroy();
8477 }
8478 }
8479};
8480
8481var History = {
8482 init: function init() {
8483 var swiper = this;
8484 var window = getWindow();
8485 if (!swiper.params.history) return;
8486
8487 if (!window.history || !window.history.pushState) {
8488 swiper.params.history.enabled = false;
8489 swiper.params.hashNavigation.enabled = true;
8490 return;
8491 }
8492
8493 var history = swiper.history;
8494 history.initialized = true;
8495 history.paths = History.getPathValues(swiper.params.url);
8496 if (!history.paths.key && !history.paths.value) return;
8497 history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
8498
8499 if (!swiper.params.history.replaceState) {
8500 window.addEventListener('popstate', swiper.history.setHistoryPopState);
8501 }
8502 },
8503 destroy: function destroy() {
8504 var swiper = this;
8505 var window = getWindow();
8506
8507 if (!swiper.params.history.replaceState) {
8508 window.removeEventListener('popstate', swiper.history.setHistoryPopState);
8509 }
8510 },
8511 setHistoryPopState: function setHistoryPopState() {
8512 var swiper = this;
8513 swiper.history.paths = History.getPathValues(swiper.params.url);
8514 swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
8515 },
8516 getPathValues: function getPathValues(urlOverride) {
8517 var window = getWindow();
8518 var location;
8519
8520 if (urlOverride) {
8521 location = new URL(urlOverride);
8522 } else {
8523 location = window.location;
8524 }
8525
8526 var pathArray = location.pathname.slice(1).split('/').filter(function (part) {
8527 return part !== '';
8528 });
8529 var total = pathArray.length;
8530 var key = pathArray[total - 2];
8531 var value = pathArray[total - 1];
8532 return {
8533 key: key,
8534 value: value
8535 };
8536 },
8537 setHistory: function setHistory(key, index) {
8538 var swiper = this;
8539 var window = getWindow();
8540 if (!swiper.history.initialized || !swiper.params.history.enabled) return;
8541 var location;
8542
8543 if (swiper.params.url) {
8544 location = new URL(swiper.params.url);
8545 } else {
8546 location = window.location;
8547 }
8548
8549 var slide = swiper.slides.eq(index);
8550 var value = History.slugify(slide.attr('data-history'));
8551
8552 if (!location.pathname.includes(key)) {
8553 value = key + "/" + value;
8554 }
8555
8556 var currentState = window.history.state;
8557
8558 if (currentState && currentState.value === value) {
8559 return;
8560 }
8561
8562 if (swiper.params.history.replaceState) {
8563 window.history.replaceState({
8564 value: value
8565 }, null, value);
8566 } else {
8567 window.history.pushState({
8568 value: value
8569 }, null, value);
8570 }
8571 },
8572 slugify: function slugify(text) {
8573 return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
8574 },
8575 scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
8576 var swiper = this;
8577
8578 if (value) {
8579 for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
8580 var slide = swiper.slides.eq(i);
8581 var slideHistory = History.slugify(slide.attr('data-history'));
8582
8583 if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
8584 var index = slide.index();
8585 swiper.slideTo(index, speed, runCallbacks);
8586 }
8587 }
8588 } else {
8589 swiper.slideTo(0, speed, runCallbacks);
8590 }
8591 }
8592};
8593var History$1 = {
8594 name: 'history',
8595 params: {
8596 history: {
8597 enabled: false,
8598 replaceState: false,
8599 key: 'slides'
8600 }
8601 },
8602 create: function create() {
8603 var swiper = this;
8604 bindModuleMethods(swiper, {
8605 history: _extends({}, History)
8606 });
8607 },
8608 on: {
8609 init: function init(swiper) {
8610 if (swiper.params.history.enabled) {
8611 swiper.history.init();
8612 }
8613 },
8614 destroy: function destroy(swiper) {
8615 if (swiper.params.history.enabled) {
8616 swiper.history.destroy();
8617 }
8618 },
8619 transitionEnd: function transitionEnd(swiper) {
8620 if (swiper.history.initialized) {
8621 swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
8622 }
8623 },
8624 slideChange: function slideChange(swiper) {
8625 if (swiper.history.initialized && swiper.params.cssMode) {
8626 swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
8627 }
8628 }
8629 }
8630};
8631
8632var HashNavigation = {
8633 onHashCange: function onHashCange() {
8634 var swiper = this;
8635 var document = getDocument();
8636 swiper.emit('hashChange');
8637 var newHash = document.location.hash.replace('#', '');
8638 var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
8639
8640 if (newHash !== activeSlideHash) {
8641 var newIndex = swiper.$wrapperEl.children("." + swiper.params.slideClass + "[data-hash=\"" + newHash + "\"]").index();
8642 if (typeof newIndex === 'undefined') return;
8643 swiper.slideTo(newIndex);
8644 }
8645 },
8646 setHash: function setHash() {
8647 var swiper = this;
8648 var window = getWindow();
8649 var document = getDocument();
8650 if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) return;
8651
8652 if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
8653 window.history.replaceState(null, null, "#" + swiper.slides.eq(swiper.activeIndex).attr('data-hash') || '');
8654 swiper.emit('hashSet');
8655 } else {
8656 var slide = swiper.slides.eq(swiper.activeIndex);
8657 var hash = slide.attr('data-hash') || slide.attr('data-history');
8658 document.location.hash = hash || '';
8659 swiper.emit('hashSet');
8660 }
8661 },
8662 init: function init() {
8663 var swiper = this;
8664 var document = getDocument();
8665 var window = getWindow();
8666 if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
8667 swiper.hashNavigation.initialized = true;
8668 var hash = document.location.hash.replace('#', '');
8669
8670 if (hash) {
8671 var speed = 0;
8672
8673 for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
8674 var slide = swiper.slides.eq(i);
8675 var slideHash = slide.attr('data-hash') || slide.attr('data-history');
8676
8677 if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
8678 var index = slide.index();
8679 swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
8680 }
8681 }
8682 }
8683
8684 if (swiper.params.hashNavigation.watchState) {
8685 $(window).on('hashchange', swiper.hashNavigation.onHashCange);
8686 }
8687 },
8688 destroy: function destroy() {
8689 var swiper = this;
8690 var window = getWindow();
8691
8692 if (swiper.params.hashNavigation.watchState) {
8693 $(window).off('hashchange', swiper.hashNavigation.onHashCange);
8694 }
8695 }
8696};
8697var HashNavigation$1 = {
8698 name: 'hash-navigation',
8699 params: {
8700 hashNavigation: {
8701 enabled: false,
8702 replaceState: false,
8703 watchState: false
8704 }
8705 },
8706 create: function create() {
8707 var swiper = this;
8708 bindModuleMethods(swiper, {
8709 hashNavigation: _extends({
8710 initialized: false
8711 }, HashNavigation)
8712 });
8713 },
8714 on: {
8715 init: function init(swiper) {
8716 if (swiper.params.hashNavigation.enabled) {
8717 swiper.hashNavigation.init();
8718 }
8719 },
8720 destroy: function destroy(swiper) {
8721 if (swiper.params.hashNavigation.enabled) {
8722 swiper.hashNavigation.destroy();
8723 }
8724 },
8725 transitionEnd: function transitionEnd(swiper) {
8726 if (swiper.hashNavigation.initialized) {
8727 swiper.hashNavigation.setHash();
8728 }
8729 },
8730 slideChange: function slideChange(swiper) {
8731 if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
8732 swiper.hashNavigation.setHash();
8733 }
8734 }
8735 }
8736};
8737
8738var Autoplay = {
8739 run: function run() {
8740 var swiper = this;
8741 var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
8742 var delay = swiper.params.autoplay.delay;
8743
8744 if ($activeSlideEl.attr('data-swiper-autoplay')) {
8745 delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
8746 }
8747
8748 clearTimeout(swiper.autoplay.timeout);
8749 swiper.autoplay.timeout = nextTick(function () {
8750 var autoplayResult;
8751
8752 if (swiper.params.autoplay.reverseDirection) {
8753 if (swiper.params.loop) {
8754 swiper.loopFix();
8755 autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
8756 swiper.emit('autoplay');
8757 } else if (!swiper.isBeginning) {
8758 autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
8759 swiper.emit('autoplay');
8760 } else if (!swiper.params.autoplay.stopOnLastSlide) {
8761 autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
8762 swiper.emit('autoplay');
8763 } else {
8764 swiper.autoplay.stop();
8765 }
8766 } else if (swiper.params.loop) {
8767 swiper.loopFix();
8768 autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
8769 swiper.emit('autoplay');
8770 } else if (!swiper.isEnd) {
8771 autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
8772 swiper.emit('autoplay');
8773 } else if (!swiper.params.autoplay.stopOnLastSlide) {
8774 autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);
8775 swiper.emit('autoplay');
8776 } else {
8777 swiper.autoplay.stop();
8778 }
8779
8780 if (swiper.params.cssMode && swiper.autoplay.running) swiper.autoplay.run();else if (autoplayResult === false) {
8781 swiper.autoplay.run();
8782 }
8783 }, delay);
8784 },
8785 start: function start() {
8786 var swiper = this;
8787 if (typeof swiper.autoplay.timeout !== 'undefined') return false;
8788 if (swiper.autoplay.running) return false;
8789 swiper.autoplay.running = true;
8790 swiper.emit('autoplayStart');
8791 swiper.autoplay.run();
8792 return true;
8793 },
8794 stop: function stop() {
8795 var swiper = this;
8796 if (!swiper.autoplay.running) return false;
8797 if (typeof swiper.autoplay.timeout === 'undefined') return false;
8798
8799 if (swiper.autoplay.timeout) {
8800 clearTimeout(swiper.autoplay.timeout);
8801 swiper.autoplay.timeout = undefined;
8802 }
8803
8804 swiper.autoplay.running = false;
8805 swiper.emit('autoplayStop');
8806 return true;
8807 },
8808 pause: function pause(speed) {
8809 var swiper = this;
8810 if (!swiper.autoplay.running) return;
8811 if (swiper.autoplay.paused) return;
8812 if (swiper.autoplay.timeout) clearTimeout(swiper.autoplay.timeout);
8813 swiper.autoplay.paused = true;
8814
8815 if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
8816 swiper.autoplay.paused = false;
8817 swiper.autoplay.run();
8818 } else {
8819 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
8820 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
8821 }
8822 },
8823 onVisibilityChange: function onVisibilityChange() {
8824 var swiper = this;
8825 var document = getDocument();
8826
8827 if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
8828 swiper.autoplay.pause();
8829 }
8830
8831 if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
8832 swiper.autoplay.run();
8833 swiper.autoplay.paused = false;
8834 }
8835 },
8836 onTransitionEnd: function onTransitionEnd(e) {
8837 var swiper = this;
8838 if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;
8839 if (e.target !== swiper.$wrapperEl[0]) return;
8840 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
8841 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
8842 swiper.autoplay.paused = false;
8843
8844 if (!swiper.autoplay.running) {
8845 swiper.autoplay.stop();
8846 } else {
8847 swiper.autoplay.run();
8848 }
8849 }
8850};
8851var Autoplay$1 = {
8852 name: 'autoplay',
8853 params: {
8854 autoplay: {
8855 enabled: false,
8856 delay: 3000,
8857 waitForTransition: true,
8858 disableOnInteraction: true,
8859 stopOnLastSlide: false,
8860 reverseDirection: false
8861 }
8862 },
8863 create: function create() {
8864 var swiper = this;
8865 bindModuleMethods(swiper, {
8866 autoplay: _extends({}, Autoplay, {
8867 running: false,
8868 paused: false
8869 })
8870 });
8871 },
8872 on: {
8873 init: function init(swiper) {
8874 if (swiper.params.autoplay.enabled) {
8875 swiper.autoplay.start();
8876 var document = getDocument();
8877 document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
8878 }
8879 },
8880 beforeTransitionStart: function beforeTransitionStart(swiper, speed, internal) {
8881 if (swiper.autoplay.running) {
8882 if (internal || !swiper.params.autoplay.disableOnInteraction) {
8883 swiper.autoplay.pause(speed);
8884 } else {
8885 swiper.autoplay.stop();
8886 }
8887 }
8888 },
8889 sliderFirstMove: function sliderFirstMove(swiper) {
8890 if (swiper.autoplay.running) {
8891 if (swiper.params.autoplay.disableOnInteraction) {
8892 swiper.autoplay.stop();
8893 } else {
8894 swiper.autoplay.pause();
8895 }
8896 }
8897 },
8898 touchEnd: function touchEnd(swiper) {
8899 if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
8900 swiper.autoplay.run();
8901 }
8902 },
8903 destroy: function destroy(swiper) {
8904 if (swiper.autoplay.running) {
8905 swiper.autoplay.stop();
8906 }
8907
8908 var document = getDocument();
8909 document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
8910 }
8911 }
8912};
8913
8914var Fade = {
8915 setTranslate: function setTranslate() {
8916 var swiper = this;
8917 var slides = swiper.slides;
8918
8919 for (var i = 0; i < slides.length; i += 1) {
8920 var $slideEl = swiper.slides.eq(i);
8921 var offset = $slideEl[0].swiperSlideOffset;
8922 var tx = -offset;
8923 if (!swiper.params.virtualTranslate) tx -= swiper.translate;
8924 var ty = 0;
8925
8926 if (!swiper.isHorizontal()) {
8927 ty = tx;
8928 tx = 0;
8929 }
8930
8931 var slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
8932 $slideEl.css({
8933 opacity: slideOpacity
8934 }).transform("translate3d(" + tx + "px, " + ty + "px, 0px)");
8935 }
8936 },
8937 setTransition: function setTransition(duration) {
8938 var swiper = this;
8939 var slides = swiper.slides,
8940 $wrapperEl = swiper.$wrapperEl;
8941 slides.transition(duration);
8942
8943 if (swiper.params.virtualTranslate && duration !== 0) {
8944 var eventTriggered = false;
8945 slides.transitionEnd(function () {
8946 if (eventTriggered) return;
8947 if (!swiper || swiper.destroyed) return;
8948 eventTriggered = true;
8949 swiper.animating = false;
8950 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
8951
8952 for (var i = 0; i < triggerEvents.length; i += 1) {
8953 $wrapperEl.trigger(triggerEvents[i]);
8954 }
8955 });
8956 }
8957 }
8958};
8959var EffectFade = {
8960 name: 'effect-fade',
8961 params: {
8962 fadeEffect: {
8963 crossFade: false
8964 }
8965 },
8966 create: function create() {
8967 var swiper = this;
8968 bindModuleMethods(swiper, {
8969 fadeEffect: _extends({}, Fade)
8970 });
8971 },
8972 on: {
8973 beforeInit: function beforeInit(swiper) {
8974 if (swiper.params.effect !== 'fade') return;
8975 swiper.classNames.push(swiper.params.containerModifierClass + "fade");
8976 var overwriteParams = {
8977 slidesPerView: 1,
8978 slidesPerColumn: 1,
8979 slidesPerGroup: 1,
8980 watchSlidesProgress: true,
8981 spaceBetween: 0,
8982 virtualTranslate: true
8983 };
8984 extend(swiper.params, overwriteParams);
8985 extend(swiper.originalParams, overwriteParams);
8986 },
8987 setTranslate: function setTranslate(swiper) {
8988 if (swiper.params.effect !== 'fade') return;
8989 swiper.fadeEffect.setTranslate();
8990 },
8991 setTransition: function setTransition(swiper, duration) {
8992 if (swiper.params.effect !== 'fade') return;
8993 swiper.fadeEffect.setTransition(duration);
8994 }
8995 }
8996};
8997
8998var Cube = {
8999 setTranslate: function setTranslate() {
9000 var swiper = this;
9001 var $el = swiper.$el,
9002 $wrapperEl = swiper.$wrapperEl,
9003 slides = swiper.slides,
9004 swiperWidth = swiper.width,
9005 swiperHeight = swiper.height,
9006 rtl = swiper.rtlTranslate,
9007 swiperSize = swiper.size,
9008 browser = swiper.browser;
9009 var params = swiper.params.cubeEffect;
9010 var isHorizontal = swiper.isHorizontal();
9011 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
9012 var wrapperRotate = 0;
9013 var $cubeShadowEl;
9014
9015 if (params.shadow) {
9016 if (isHorizontal) {
9017 $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
9018
9019 if ($cubeShadowEl.length === 0) {
9020 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
9021 $wrapperEl.append($cubeShadowEl);
9022 }
9023
9024 $cubeShadowEl.css({
9025 height: swiperWidth + "px"
9026 });
9027 } else {
9028 $cubeShadowEl = $el.find('.swiper-cube-shadow');
9029
9030 if ($cubeShadowEl.length === 0) {
9031 $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
9032 $el.append($cubeShadowEl);
9033 }
9034 }
9035 }
9036
9037 for (var i = 0; i < slides.length; i += 1) {
9038 var $slideEl = slides.eq(i);
9039 var slideIndex = i;
9040
9041 if (isVirtual) {
9042 slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
9043 }
9044
9045 var slideAngle = slideIndex * 90;
9046 var round = Math.floor(slideAngle / 360);
9047
9048 if (rtl) {
9049 slideAngle = -slideAngle;
9050 round = Math.floor(-slideAngle / 360);
9051 }
9052
9053 var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
9054 var tx = 0;
9055 var ty = 0;
9056 var tz = 0;
9057
9058 if (slideIndex % 4 === 0) {
9059 tx = -round * 4 * swiperSize;
9060 tz = 0;
9061 } else if ((slideIndex - 1) % 4 === 0) {
9062 tx = 0;
9063 tz = -round * 4 * swiperSize;
9064 } else if ((slideIndex - 2) % 4 === 0) {
9065 tx = swiperSize + round * 4 * swiperSize;
9066 tz = swiperSize;
9067 } else if ((slideIndex - 3) % 4 === 0) {
9068 tx = -swiperSize;
9069 tz = 3 * swiperSize + swiperSize * 4 * round;
9070 }
9071
9072 if (rtl) {
9073 tx = -tx;
9074 }
9075
9076 if (!isHorizontal) {
9077 ty = tx;
9078 tx = 0;
9079 }
9080
9081 var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
9082
9083 if (progress <= 1 && progress > -1) {
9084 wrapperRotate = slideIndex * 90 + progress * 90;
9085 if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
9086 }
9087
9088 $slideEl.transform(transform);
9089
9090 if (params.slideShadows) {
9091 // Set shadows
9092 var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
9093 var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
9094
9095 if (shadowBefore.length === 0) {
9096 shadowBefore = $("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>");
9097 $slideEl.append(shadowBefore);
9098 }
9099
9100 if (shadowAfter.length === 0) {
9101 shadowAfter = $("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>");
9102 $slideEl.append(shadowAfter);
9103 }
9104
9105 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
9106 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
9107 }
9108 }
9109
9110 $wrapperEl.css({
9111 '-webkit-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
9112 '-moz-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
9113 '-ms-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
9114 'transform-origin': "50% 50% -" + swiperSize / 2 + "px"
9115 });
9116
9117 if (params.shadow) {
9118 if (isHorizontal) {
9119 $cubeShadowEl.transform("translate3d(0px, " + (swiperWidth / 2 + params.shadowOffset) + "px, " + -swiperWidth / 2 + "px) rotateX(90deg) rotateZ(0deg) scale(" + params.shadowScale + ")");
9120 } else {
9121 var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
9122 var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
9123 var scale1 = params.shadowScale;
9124 var scale2 = params.shadowScale / multiplier;
9125 var offset = params.shadowOffset;
9126 $cubeShadowEl.transform("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + (swiperHeight / 2 + offset) + "px, " + -swiperHeight / 2 / scale2 + "px) rotateX(-90deg)");
9127 }
9128 }
9129
9130 var zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;
9131 $wrapperEl.transform("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)");
9132 },
9133 setTransition: function setTransition(duration) {
9134 var swiper = this;
9135 var $el = swiper.$el,
9136 slides = swiper.slides;
9137 slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
9138
9139 if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
9140 $el.find('.swiper-cube-shadow').transition(duration);
9141 }
9142 }
9143};
9144var EffectCube = {
9145 name: 'effect-cube',
9146 params: {
9147 cubeEffect: {
9148 slideShadows: true,
9149 shadow: true,
9150 shadowOffset: 20,
9151 shadowScale: 0.94
9152 }
9153 },
9154 create: function create() {
9155 var swiper = this;
9156 bindModuleMethods(swiper, {
9157 cubeEffect: _extends({}, Cube)
9158 });
9159 },
9160 on: {
9161 beforeInit: function beforeInit(swiper) {
9162 if (swiper.params.effect !== 'cube') return;
9163 swiper.classNames.push(swiper.params.containerModifierClass + "cube");
9164 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
9165 var overwriteParams = {
9166 slidesPerView: 1,
9167 slidesPerColumn: 1,
9168 slidesPerGroup: 1,
9169 watchSlidesProgress: true,
9170 resistanceRatio: 0,
9171 spaceBetween: 0,
9172 centeredSlides: false,
9173 virtualTranslate: true
9174 };
9175 extend(swiper.params, overwriteParams);
9176 extend(swiper.originalParams, overwriteParams);
9177 },
9178 setTranslate: function setTranslate(swiper) {
9179 if (swiper.params.effect !== 'cube') return;
9180 swiper.cubeEffect.setTranslate();
9181 },
9182 setTransition: function setTransition(swiper, duration) {
9183 if (swiper.params.effect !== 'cube') return;
9184 swiper.cubeEffect.setTransition(duration);
9185 }
9186 }
9187};
9188
9189var Flip = {
9190 setTranslate: function setTranslate() {
9191 var swiper = this;
9192 var slides = swiper.slides,
9193 rtl = swiper.rtlTranslate;
9194
9195 for (var i = 0; i < slides.length; i += 1) {
9196 var $slideEl = slides.eq(i);
9197 var progress = $slideEl[0].progress;
9198
9199 if (swiper.params.flipEffect.limitRotation) {
9200 progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
9201 }
9202
9203 var offset = $slideEl[0].swiperSlideOffset;
9204 var rotate = -180 * progress;
9205 var rotateY = rotate;
9206 var rotateX = 0;
9207 var tx = -offset;
9208 var ty = 0;
9209
9210 if (!swiper.isHorizontal()) {
9211 ty = tx;
9212 tx = 0;
9213 rotateX = -rotateY;
9214 rotateY = 0;
9215 } else if (rtl) {
9216 rotateY = -rotateY;
9217 }
9218
9219 $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
9220
9221 if (swiper.params.flipEffect.slideShadows) {
9222 // Set shadows
9223 var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
9224 var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
9225
9226 if (shadowBefore.length === 0) {
9227 shadowBefore = $("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>");
9228 $slideEl.append(shadowBefore);
9229 }
9230
9231 if (shadowAfter.length === 0) {
9232 shadowAfter = $("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>");
9233 $slideEl.append(shadowAfter);
9234 }
9235
9236 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
9237 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
9238 }
9239
9240 $slideEl.transform("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)");
9241 }
9242 },
9243 setTransition: function setTransition(duration) {
9244 var swiper = this;
9245 var slides = swiper.slides,
9246 activeIndex = swiper.activeIndex,
9247 $wrapperEl = swiper.$wrapperEl;
9248 slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
9249
9250 if (swiper.params.virtualTranslate && duration !== 0) {
9251 var eventTriggered = false; // eslint-disable-next-line
9252
9253 slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
9254 if (eventTriggered) return;
9255 if (!swiper || swiper.destroyed) return; // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
9256
9257 eventTriggered = true;
9258 swiper.animating = false;
9259 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
9260
9261 for (var i = 0; i < triggerEvents.length; i += 1) {
9262 $wrapperEl.trigger(triggerEvents[i]);
9263 }
9264 });
9265 }
9266 }
9267};
9268var EffectFlip = {
9269 name: 'effect-flip',
9270 params: {
9271 flipEffect: {
9272 slideShadows: true,
9273 limitRotation: true
9274 }
9275 },
9276 create: function create() {
9277 var swiper = this;
9278 bindModuleMethods(swiper, {
9279 flipEffect: _extends({}, Flip)
9280 });
9281 },
9282 on: {
9283 beforeInit: function beforeInit(swiper) {
9284 if (swiper.params.effect !== 'flip') return;
9285 swiper.classNames.push(swiper.params.containerModifierClass + "flip");
9286 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
9287 var overwriteParams = {
9288 slidesPerView: 1,
9289 slidesPerColumn: 1,
9290 slidesPerGroup: 1,
9291 watchSlidesProgress: true,
9292 spaceBetween: 0,
9293 virtualTranslate: true
9294 };
9295 extend(swiper.params, overwriteParams);
9296 extend(swiper.originalParams, overwriteParams);
9297 },
9298 setTranslate: function setTranslate(swiper) {
9299 if (swiper.params.effect !== 'flip') return;
9300 swiper.flipEffect.setTranslate();
9301 },
9302 setTransition: function setTransition(swiper, duration) {
9303 if (swiper.params.effect !== 'flip') return;
9304 swiper.flipEffect.setTransition(duration);
9305 }
9306 }
9307};
9308
9309var Coverflow = {
9310 setTranslate: function setTranslate() {
9311 var swiper = this;
9312 var swiperWidth = swiper.width,
9313 swiperHeight = swiper.height,
9314 slides = swiper.slides,
9315 slidesSizesGrid = swiper.slidesSizesGrid;
9316 var params = swiper.params.coverflowEffect;
9317 var isHorizontal = swiper.isHorizontal();
9318 var transform = swiper.translate;
9319 var center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
9320 var rotate = isHorizontal ? params.rotate : -params.rotate;
9321 var translate = params.depth; // Each slide offset from center
9322
9323 for (var i = 0, length = slides.length; i < length; i += 1) {
9324 var $slideEl = slides.eq(i);
9325 var slideSize = slidesSizesGrid[i];
9326 var slideOffset = $slideEl[0].swiperSlideOffset;
9327 var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * params.modifier;
9328 var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
9329 var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0
9330
9331 var translateZ = -translate * Math.abs(offsetMultiplier);
9332 var stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders
9333
9334 if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
9335 stretch = parseFloat(params.stretch) / 100 * slideSize;
9336 }
9337
9338 var translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
9339 var translateX = isHorizontal ? stretch * offsetMultiplier : 0;
9340 var scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values
9341
9342 if (Math.abs(translateX) < 0.001) translateX = 0;
9343 if (Math.abs(translateY) < 0.001) translateY = 0;
9344 if (Math.abs(translateZ) < 0.001) translateZ = 0;
9345 if (Math.abs(rotateY) < 0.001) rotateY = 0;
9346 if (Math.abs(rotateX) < 0.001) rotateX = 0;
9347 if (Math.abs(scale) < 0.001) scale = 0;
9348 var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg) scale(" + scale + ")";
9349 $slideEl.transform(slideTransform);
9350 $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
9351
9352 if (params.slideShadows) {
9353 // Set shadows
9354 var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
9355 var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
9356
9357 if ($shadowBeforeEl.length === 0) {
9358 $shadowBeforeEl = $("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>");
9359 $slideEl.append($shadowBeforeEl);
9360 }
9361
9362 if ($shadowAfterEl.length === 0) {
9363 $shadowAfterEl = $("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>");
9364 $slideEl.append($shadowAfterEl);
9365 }
9366
9367 if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
9368 if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
9369 }
9370 }
9371 },
9372 setTransition: function setTransition(duration) {
9373 var swiper = this;
9374 swiper.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
9375 }
9376};
9377var EffectCoverflow = {
9378 name: 'effect-coverflow',
9379 params: {
9380 coverflowEffect: {
9381 rotate: 50,
9382 stretch: 0,
9383 depth: 100,
9384 scale: 1,
9385 modifier: 1,
9386 slideShadows: true
9387 }
9388 },
9389 create: function create() {
9390 var swiper = this;
9391 bindModuleMethods(swiper, {
9392 coverflowEffect: _extends({}, Coverflow)
9393 });
9394 },
9395 on: {
9396 beforeInit: function beforeInit(swiper) {
9397 if (swiper.params.effect !== 'coverflow') return;
9398 swiper.classNames.push(swiper.params.containerModifierClass + "coverflow");
9399 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
9400 swiper.params.watchSlidesProgress = true;
9401 swiper.originalParams.watchSlidesProgress = true;
9402 },
9403 setTranslate: function setTranslate(swiper) {
9404 if (swiper.params.effect !== 'coverflow') return;
9405 swiper.coverflowEffect.setTranslate();
9406 },
9407 setTransition: function setTransition(swiper, duration) {
9408 if (swiper.params.effect !== 'coverflow') return;
9409 swiper.coverflowEffect.setTransition(duration);
9410 }
9411 }
9412};
9413
9414var Thumbs = {
9415 init: function init() {
9416 var swiper = this;
9417 var thumbsParams = swiper.params.thumbs;
9418 if (swiper.thumbs.initialized) return false;
9419 swiper.thumbs.initialized = true;
9420 var SwiperClass = swiper.constructor;
9421
9422 if (thumbsParams.swiper instanceof SwiperClass) {
9423 swiper.thumbs.swiper = thumbsParams.swiper;
9424 extend(swiper.thumbs.swiper.originalParams, {
9425 watchSlidesProgress: true,
9426 slideToClickedSlide: false
9427 });
9428 extend(swiper.thumbs.swiper.params, {
9429 watchSlidesProgress: true,
9430 slideToClickedSlide: false
9431 });
9432 } else if (isObject(thumbsParams.swiper)) {
9433 swiper.thumbs.swiper = new SwiperClass(extend({}, thumbsParams.swiper, {
9434 watchSlidesVisibility: true,
9435 watchSlidesProgress: true,
9436 slideToClickedSlide: false
9437 }));
9438 swiper.thumbs.swiperCreated = true;
9439 }
9440
9441 swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
9442 swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
9443 return true;
9444 },
9445 onThumbClick: function onThumbClick() {
9446 var swiper = this;
9447 var thumbsSwiper = swiper.thumbs.swiper;
9448 if (!thumbsSwiper) return;
9449 var clickedIndex = thumbsSwiper.clickedIndex;
9450 var clickedSlide = thumbsSwiper.clickedSlide;
9451 if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return;
9452 if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
9453 var slideToIndex;
9454
9455 if (thumbsSwiper.params.loop) {
9456 slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
9457 } else {
9458 slideToIndex = clickedIndex;
9459 }
9460
9461 if (swiper.params.loop) {
9462 var currentIndex = swiper.activeIndex;
9463
9464 if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
9465 swiper.loopFix(); // eslint-disable-next-line
9466
9467 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
9468 currentIndex = swiper.activeIndex;
9469 }
9470
9471 var prevIndex = swiper.slides.eq(currentIndex).prevAll("[data-swiper-slide-index=\"" + slideToIndex + "\"]").eq(0).index();
9472 var nextIndex = swiper.slides.eq(currentIndex).nextAll("[data-swiper-slide-index=\"" + slideToIndex + "\"]").eq(0).index();
9473 if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex;
9474 }
9475
9476 swiper.slideTo(slideToIndex);
9477 },
9478 update: function update(initial) {
9479 var swiper = this;
9480 var thumbsSwiper = swiper.thumbs.swiper;
9481 if (!thumbsSwiper) return;
9482 var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
9483 var autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
9484 var useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
9485
9486 if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
9487 var currentThumbsIndex = thumbsSwiper.activeIndex;
9488 var newThumbsIndex;
9489 var direction;
9490
9491 if (thumbsSwiper.params.loop) {
9492 if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
9493 thumbsSwiper.loopFix(); // eslint-disable-next-line
9494
9495 thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
9496 currentThumbsIndex = thumbsSwiper.activeIndex;
9497 } // Find actual thumbs index to slide to
9498
9499
9500 var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll("[data-swiper-slide-index=\"" + swiper.realIndex + "\"]").eq(0).index();
9501 var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll("[data-swiper-slide-index=\"" + swiper.realIndex + "\"]").eq(0).index();
9502 if (typeof prevThumbsIndex === 'undefined') newThumbsIndex = nextThumbsIndex;else if (typeof nextThumbsIndex === 'undefined') newThumbsIndex = prevThumbsIndex;else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) newThumbsIndex = currentThumbsIndex;else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) newThumbsIndex = nextThumbsIndex;else newThumbsIndex = prevThumbsIndex;
9503 direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
9504 } else {
9505 newThumbsIndex = swiper.realIndex;
9506 direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
9507 }
9508
9509 if (useOffset) {
9510 newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
9511 }
9512
9513 if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
9514 if (thumbsSwiper.params.centeredSlides) {
9515 if (newThumbsIndex > currentThumbsIndex) {
9516 newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
9517 } else {
9518 newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
9519 }
9520 } else if (newThumbsIndex > currentThumbsIndex) {
9521 newThumbsIndex = newThumbsIndex - slidesPerView + 1;
9522 }
9523
9524 thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
9525 }
9526 } // Activate thumbs
9527
9528
9529 var thumbsToActivate = 1;
9530 var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
9531
9532 if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
9533 thumbsToActivate = swiper.params.slidesPerView;
9534 }
9535
9536 if (!swiper.params.thumbs.multipleActiveThumbs) {
9537 thumbsToActivate = 1;
9538 }
9539
9540 thumbsToActivate = Math.floor(thumbsToActivate);
9541 thumbsSwiper.slides.removeClass(thumbActiveClass);
9542
9543 if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
9544 for (var i = 0; i < thumbsToActivate; i += 1) {
9545 thumbsSwiper.$wrapperEl.children("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]").addClass(thumbActiveClass);
9546 }
9547 } else {
9548 for (var _i = 0; _i < thumbsToActivate; _i += 1) {
9549 thumbsSwiper.slides.eq(swiper.realIndex + _i).addClass(thumbActiveClass);
9550 }
9551 }
9552 }
9553};
9554var Thumbs$1 = {
9555 name: 'thumbs',
9556 params: {
9557 thumbs: {
9558 swiper: null,
9559 multipleActiveThumbs: true,
9560 autoScrollOffset: 0,
9561 slideThumbActiveClass: 'swiper-slide-thumb-active',
9562 thumbsContainerClass: 'swiper-container-thumbs'
9563 }
9564 },
9565 create: function create() {
9566 var swiper = this;
9567 bindModuleMethods(swiper, {
9568 thumbs: _extends({
9569 swiper: null,
9570 initialized: false
9571 }, Thumbs)
9572 });
9573 },
9574 on: {
9575 beforeInit: function beforeInit(swiper) {
9576 var thumbs = swiper.params.thumbs;
9577 if (!thumbs || !thumbs.swiper) return;
9578 swiper.thumbs.init();
9579 swiper.thumbs.update(true);
9580 },
9581 slideChange: function slideChange(swiper) {
9582 if (!swiper.thumbs.swiper) return;
9583 swiper.thumbs.update();
9584 },
9585 update: function update(swiper) {
9586 if (!swiper.thumbs.swiper) return;
9587 swiper.thumbs.update();
9588 },
9589 resize: function resize(swiper) {
9590 if (!swiper.thumbs.swiper) return;
9591 swiper.thumbs.update();
9592 },
9593 observerUpdate: function observerUpdate(swiper) {
9594 if (!swiper.thumbs.swiper) return;
9595 swiper.thumbs.update();
9596 },
9597 setTransition: function setTransition(swiper, duration) {
9598 var thumbsSwiper = swiper.thumbs.swiper;
9599 if (!thumbsSwiper) return;
9600 thumbsSwiper.setTransition(duration);
9601 },
9602 beforeDestroy: function beforeDestroy(swiper) {
9603 var thumbsSwiper = swiper.thumbs.swiper;
9604 if (!thumbsSwiper) return;
9605
9606 if (swiper.thumbs.swiperCreated && thumbsSwiper) {
9607 thumbsSwiper.destroy();
9608 }
9609 }
9610 }
9611};
9612
9613// Swiper Class
9614var components = [Virtual$1, Keyboard$1, Mousewheel$1, Navigation$1, Pagination$1, Scrollbar$1, Parallax$1, Zoom$1, Lazy$1, Controller$1, A11y$1, History$1, HashNavigation$1, Autoplay$1, EffectFade, EffectCube, EffectFlip, EffectCoverflow, Thumbs$1];
9615Swiper.use(components);
9616
9617export default Swiper;
9618export { Swiper };
9619//# sourceMappingURL=swiper-bundle.esm.browser.js.map