UNPKG

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