UNPKG

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