UNPKG

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