UNPKG

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