UNPKG

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