UNPKG

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