UNPKG

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