UNPKG

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