UNPKG

133 kBJavaScriptView Raw
1/**
2 * Swiper 10.0.4
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * https://swiperjs.com
5 *
6 * Copyright 2014-2023 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: July 8, 2023
11 */
12
13var Swiper = (function () {
14 'use strict';
15
16 /**
17 * SSR Window 4.0.2
18 * Better handling for window object in SSR environment
19 * https://github.com/nolimits4web/ssr-window
20 *
21 * Copyright 2021, Vladimir Kharlampidi
22 *
23 * Licensed under MIT
24 *
25 * Released on: December 13, 2021
26 */
27 /* eslint-disable no-param-reassign */
28 function isObject$1(obj) {
29 return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
30 }
31 function extend$1(target, src) {
32 if (target === void 0) {
33 target = {};
34 }
35 if (src === void 0) {
36 src = {};
37 }
38 Object.keys(src).forEach(key => {
39 if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) {
40 extend$1(target[key], src[key]);
41 }
42 });
43 }
44 const ssrDocument = {
45 body: {},
46 addEventListener() {},
47 removeEventListener() {},
48 activeElement: {
49 blur() {},
50 nodeName: ''
51 },
52 querySelector() {
53 return null;
54 },
55 querySelectorAll() {
56 return [];
57 },
58 getElementById() {
59 return null;
60 },
61 createEvent() {
62 return {
63 initEvent() {}
64 };
65 },
66 createElement() {
67 return {
68 children: [],
69 childNodes: [],
70 style: {},
71 setAttribute() {},
72 getElementsByTagName() {
73 return [];
74 }
75 };
76 },
77 createElementNS() {
78 return {};
79 },
80 importNode() {
81 return null;
82 },
83 location: {
84 hash: '',
85 host: '',
86 hostname: '',
87 href: '',
88 origin: '',
89 pathname: '',
90 protocol: '',
91 search: ''
92 }
93 };
94 function getDocument() {
95 const doc = typeof document !== 'undefined' ? document : {};
96 extend$1(doc, ssrDocument);
97 return doc;
98 }
99 const ssrWindow = {
100 document: ssrDocument,
101 navigator: {
102 userAgent: ''
103 },
104 location: {
105 hash: '',
106 host: '',
107 hostname: '',
108 href: '',
109 origin: '',
110 pathname: '',
111 protocol: '',
112 search: ''
113 },
114 history: {
115 replaceState() {},
116 pushState() {},
117 go() {},
118 back() {}
119 },
120 CustomEvent: function CustomEvent() {
121 return this;
122 },
123 addEventListener() {},
124 removeEventListener() {},
125 getComputedStyle() {
126 return {
127 getPropertyValue() {
128 return '';
129 }
130 };
131 },
132 Image() {},
133 Date() {},
134 screen: {},
135 setTimeout() {},
136 clearTimeout() {},
137 matchMedia() {
138 return {};
139 },
140 requestAnimationFrame(callback) {
141 if (typeof setTimeout === 'undefined') {
142 callback();
143 return null;
144 }
145 return setTimeout(callback, 0);
146 },
147 cancelAnimationFrame(id) {
148 if (typeof setTimeout === 'undefined') {
149 return;
150 }
151 clearTimeout(id);
152 }
153 };
154 function getWindow() {
155 const win = typeof window !== 'undefined' ? window : {};
156 extend$1(win, ssrWindow);
157 return win;
158 }
159
160 function deleteProps(obj) {
161 const object = obj;
162 Object.keys(object).forEach(key => {
163 try {
164 object[key] = null;
165 } catch (e) {
166 // no getter for object
167 }
168 try {
169 delete object[key];
170 } catch (e) {
171 // something got wrong
172 }
173 });
174 }
175 function nextTick(callback, delay) {
176 if (delay === void 0) {
177 delay = 0;
178 }
179 return setTimeout(callback, delay);
180 }
181 function now() {
182 return Date.now();
183 }
184 function getComputedStyle$1(el) {
185 const window = getWindow();
186 let style;
187 if (window.getComputedStyle) {
188 style = window.getComputedStyle(el, null);
189 }
190 if (!style && el.currentStyle) {
191 style = el.currentStyle;
192 }
193 if (!style) {
194 style = el.style;
195 }
196 return style;
197 }
198 function getTranslate(el, axis) {
199 if (axis === void 0) {
200 axis = 'x';
201 }
202 const window = getWindow();
203 let matrix;
204 let curTransform;
205 let transformMatrix;
206 const curStyle = getComputedStyle$1(el);
207 if (window.WebKitCSSMatrix) {
208 curTransform = curStyle.transform || curStyle.webkitTransform;
209 if (curTransform.split(',').length > 6) {
210 curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
211 }
212 // Some old versions of Webkit choke when 'none' is passed; pass
213 // empty string instead in this case
214 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
215 } else {
216 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
217 matrix = transformMatrix.toString().split(',');
218 }
219 if (axis === 'x') {
220 // Latest Chrome and webkits Fix
221 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
222 // Crazy IE10 Matrix
223 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
224 // Normal Browsers
225 else curTransform = parseFloat(matrix[4]);
226 }
227 if (axis === 'y') {
228 // Latest Chrome and webkits Fix
229 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
230 // Crazy IE10 Matrix
231 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
232 // Normal Browsers
233 else curTransform = parseFloat(matrix[5]);
234 }
235 return curTransform || 0;
236 }
237 function isObject(o) {
238 return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
239 }
240 function isNode(node) {
241 // eslint-disable-next-line
242 if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
243 return node instanceof HTMLElement;
244 }
245 return node && (node.nodeType === 1 || node.nodeType === 11);
246 }
247 function extend() {
248 const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
249 const noExtend = ['__proto__', 'constructor', 'prototype'];
250 for (let i = 1; i < arguments.length; i += 1) {
251 const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
252 if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
253 const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
254 for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
255 const nextKey = keysArray[nextIndex];
256 const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
257 if (desc !== undefined && desc.enumerable) {
258 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
259 if (nextSource[nextKey].__swiper__) {
260 to[nextKey] = nextSource[nextKey];
261 } else {
262 extend(to[nextKey], nextSource[nextKey]);
263 }
264 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
265 to[nextKey] = {};
266 if (nextSource[nextKey].__swiper__) {
267 to[nextKey] = nextSource[nextKey];
268 } else {
269 extend(to[nextKey], nextSource[nextKey]);
270 }
271 } else {
272 to[nextKey] = nextSource[nextKey];
273 }
274 }
275 }
276 }
277 }
278 return to;
279 }
280 function setCSSProperty(el, varName, varValue) {
281 el.style.setProperty(varName, varValue);
282 }
283 function animateCSSModeScroll(_ref) {
284 let {
285 swiper,
286 targetPosition,
287 side
288 } = _ref;
289 const window = getWindow();
290 const startPosition = -swiper.translate;
291 let startTime = null;
292 let time;
293 const duration = swiper.params.speed;
294 swiper.wrapperEl.style.scrollSnapType = 'none';
295 window.cancelAnimationFrame(swiper.cssModeFrameID);
296 const dir = targetPosition > startPosition ? 'next' : 'prev';
297 const isOutOfBound = (current, target) => {
298 return dir === 'next' && current >= target || dir === 'prev' && current <= target;
299 };
300 const animate = () => {
301 time = new Date().getTime();
302 if (startTime === null) {
303 startTime = time;
304 }
305 const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
306 const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
307 let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
308 if (isOutOfBound(currentPosition, targetPosition)) {
309 currentPosition = targetPosition;
310 }
311 swiper.wrapperEl.scrollTo({
312 [side]: currentPosition
313 });
314 if (isOutOfBound(currentPosition, targetPosition)) {
315 swiper.wrapperEl.style.overflow = 'hidden';
316 swiper.wrapperEl.style.scrollSnapType = '';
317 setTimeout(() => {
318 swiper.wrapperEl.style.overflow = '';
319 swiper.wrapperEl.scrollTo({
320 [side]: currentPosition
321 });
322 });
323 window.cancelAnimationFrame(swiper.cssModeFrameID);
324 return;
325 }
326 swiper.cssModeFrameID = window.requestAnimationFrame(animate);
327 };
328 animate();
329 }
330 function elementChildren(element, selector) {
331 if (selector === void 0) {
332 selector = '';
333 }
334 return [...element.children].filter(el => el.matches(selector));
335 }
336 function createElement(tag, classes) {
337 if (classes === void 0) {
338 classes = [];
339 }
340 const el = document.createElement(tag);
341 el.classList.add(...(Array.isArray(classes) ? classes : [classes]));
342 return el;
343 }
344 function elementPrevAll(el, selector) {
345 const prevEls = [];
346 while (el.previousElementSibling) {
347 const prev = el.previousElementSibling; // eslint-disable-line
348 if (selector) {
349 if (prev.matches(selector)) prevEls.push(prev);
350 } else prevEls.push(prev);
351 el = prev;
352 }
353 return prevEls;
354 }
355 function elementNextAll(el, selector) {
356 const nextEls = [];
357 while (el.nextElementSibling) {
358 const next = el.nextElementSibling; // eslint-disable-line
359 if (selector) {
360 if (next.matches(selector)) nextEls.push(next);
361 } else nextEls.push(next);
362 el = next;
363 }
364 return nextEls;
365 }
366 function elementStyle(el, prop) {
367 const window = getWindow();
368 return window.getComputedStyle(el, null).getPropertyValue(prop);
369 }
370 function elementIndex(el) {
371 let child = el;
372 let i;
373 if (child) {
374 i = 0;
375 // eslint-disable-next-line
376 while ((child = child.previousSibling) !== null) {
377 if (child.nodeType === 1) i += 1;
378 }
379 return i;
380 }
381 return undefined;
382 }
383 function elementParents(el, selector) {
384 const parents = []; // eslint-disable-line
385 let parent = el.parentElement; // eslint-disable-line
386 while (parent) {
387 if (selector) {
388 if (parent.matches(selector)) parents.push(parent);
389 } else {
390 parents.push(parent);
391 }
392 parent = parent.parentElement;
393 }
394 return parents;
395 }
396 function elementOuterSize(el, size, includeMargins) {
397 const window = getWindow();
398 if (includeMargins) {
399 return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
400 }
401 return el.offsetWidth;
402 }
403
404 let support;
405 function calcSupport() {
406 const window = getWindow();
407 const document = getDocument();
408 return {
409 smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
410 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
411 };
412 }
413 function getSupport() {
414 if (!support) {
415 support = calcSupport();
416 }
417 return support;
418 }
419
420 let deviceCached;
421 function calcDevice(_temp) {
422 let {
423 userAgent
424 } = _temp === void 0 ? {} : _temp;
425 const support = getSupport();
426 const window = getWindow();
427 const platform = window.navigator.platform;
428 const ua = userAgent || window.navigator.userAgent;
429 const device = {
430 ios: false,
431 android: false
432 };
433 const screenWidth = window.screen.width;
434 const screenHeight = window.screen.height;
435 const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
436 let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
437 const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
438 const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
439 const windows = platform === 'Win32';
440 let macos = platform === 'MacIntel';
441
442 // iPadOs 13 fix
443 const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
444 if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
445 ipad = ua.match(/(Version)\/([\d.]+)/);
446 if (!ipad) ipad = [0, 1, '13_0_0'];
447 macos = false;
448 }
449
450 // Android
451 if (android && !windows) {
452 device.os = 'android';
453 device.android = true;
454 }
455 if (ipad || iphone || ipod) {
456 device.os = 'ios';
457 device.ios = true;
458 }
459
460 // Export object
461 return device;
462 }
463 function getDevice(overrides) {
464 if (overrides === void 0) {
465 overrides = {};
466 }
467 if (!deviceCached) {
468 deviceCached = calcDevice(overrides);
469 }
470 return deviceCached;
471 }
472
473 let browser;
474 function calcBrowser() {
475 const window = getWindow();
476 let needPerspectiveFix = false;
477 function isSafari() {
478 const ua = window.navigator.userAgent.toLowerCase();
479 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
480 }
481 if (isSafari()) {
482 const ua = String(window.navigator.userAgent);
483 if (ua.includes('Version/')) {
484 const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));
485 needPerspectiveFix = major < 16 || major === 16 && minor < 2;
486 }
487 }
488 return {
489 isSafari: needPerspectiveFix || isSafari(),
490 needPerspectiveFix,
491 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)
492 };
493 }
494 function getBrowser() {
495 if (!browser) {
496 browser = calcBrowser();
497 }
498 return browser;
499 }
500
501 function Resize(_ref) {
502 let {
503 swiper,
504 on,
505 emit
506 } = _ref;
507 const window = getWindow();
508 let observer = null;
509 let animationFrame = null;
510 const resizeHandler = () => {
511 if (!swiper || swiper.destroyed || !swiper.initialized) return;
512 emit('beforeResize');
513 emit('resize');
514 };
515 const createObserver = () => {
516 if (!swiper || swiper.destroyed || !swiper.initialized) return;
517 observer = new ResizeObserver(entries => {
518 animationFrame = window.requestAnimationFrame(() => {
519 const {
520 width,
521 height
522 } = swiper;
523 let newWidth = width;
524 let newHeight = height;
525 entries.forEach(_ref2 => {
526 let {
527 contentBoxSize,
528 contentRect,
529 target
530 } = _ref2;
531 if (target && target !== swiper.el) return;
532 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
533 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
534 });
535 if (newWidth !== width || newHeight !== height) {
536 resizeHandler();
537 }
538 });
539 });
540 observer.observe(swiper.el);
541 };
542 const removeObserver = () => {
543 if (animationFrame) {
544 window.cancelAnimationFrame(animationFrame);
545 }
546 if (observer && observer.unobserve && swiper.el) {
547 observer.unobserve(swiper.el);
548 observer = null;
549 }
550 };
551 const orientationChangeHandler = () => {
552 if (!swiper || swiper.destroyed || !swiper.initialized) return;
553 emit('orientationchange');
554 };
555 on('init', () => {
556 if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
557 createObserver();
558 return;
559 }
560 window.addEventListener('resize', resizeHandler);
561 window.addEventListener('orientationchange', orientationChangeHandler);
562 });
563 on('destroy', () => {
564 removeObserver();
565 window.removeEventListener('resize', resizeHandler);
566 window.removeEventListener('orientationchange', orientationChangeHandler);
567 });
568 }
569
570 function Observer(_ref) {
571 let {
572 swiper,
573 extendParams,
574 on,
575 emit
576 } = _ref;
577 const observers = [];
578 const window = getWindow();
579 const attach = function (target, options) {
580 if (options === void 0) {
581 options = {};
582 }
583 const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
584 const observer = new ObserverFunc(mutations => {
585 // The observerUpdate event should only be triggered
586 // once despite the number of mutations. Additional
587 // triggers are redundant and are very costly
588 if (swiper.__preventObserver__) return;
589 if (mutations.length === 1) {
590 emit('observerUpdate', mutations[0]);
591 return;
592 }
593 const observerUpdate = function observerUpdate() {
594 emit('observerUpdate', mutations[0]);
595 };
596 if (window.requestAnimationFrame) {
597 window.requestAnimationFrame(observerUpdate);
598 } else {
599 window.setTimeout(observerUpdate, 0);
600 }
601 });
602 observer.observe(target, {
603 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
604 childList: typeof options.childList === 'undefined' ? true : options.childList,
605 characterData: typeof options.characterData === 'undefined' ? true : options.characterData
606 });
607 observers.push(observer);
608 };
609 const init = () => {
610 if (!swiper.params.observer) return;
611 if (swiper.params.observeParents) {
612 const containerParents = elementParents(swiper.el);
613 for (let i = 0; i < containerParents.length; i += 1) {
614 attach(containerParents[i]);
615 }
616 }
617 // Observe container
618 attach(swiper.el, {
619 childList: swiper.params.observeSlideChildren
620 });
621
622 // Observe wrapper
623 attach(swiper.wrapperEl, {
624 attributes: false
625 });
626 };
627 const destroy = () => {
628 observers.forEach(observer => {
629 observer.disconnect();
630 });
631 observers.splice(0, observers.length);
632 };
633 extendParams({
634 observer: false,
635 observeParents: false,
636 observeSlideChildren: false
637 });
638 on('init', init);
639 on('destroy', destroy);
640 }
641
642 /* eslint-disable no-underscore-dangle */
643
644 var eventsEmitter = {
645 on(events, handler, priority) {
646 const self = this;
647 if (!self.eventsListeners || self.destroyed) return self;
648 if (typeof handler !== 'function') return self;
649 const method = priority ? 'unshift' : 'push';
650 events.split(' ').forEach(event => {
651 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
652 self.eventsListeners[event][method](handler);
653 });
654 return self;
655 },
656 once(events, handler, priority) {
657 const self = this;
658 if (!self.eventsListeners || self.destroyed) return self;
659 if (typeof handler !== 'function') return self;
660 function onceHandler() {
661 self.off(events, onceHandler);
662 if (onceHandler.__emitterProxy) {
663 delete onceHandler.__emitterProxy;
664 }
665 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
666 args[_key] = arguments[_key];
667 }
668 handler.apply(self, args);
669 }
670 onceHandler.__emitterProxy = handler;
671 return self.on(events, onceHandler, priority);
672 },
673 onAny(handler, priority) {
674 const self = this;
675 if (!self.eventsListeners || self.destroyed) return self;
676 if (typeof handler !== 'function') return self;
677 const method = priority ? 'unshift' : 'push';
678 if (self.eventsAnyListeners.indexOf(handler) < 0) {
679 self.eventsAnyListeners[method](handler);
680 }
681 return self;
682 },
683 offAny(handler) {
684 const self = this;
685 if (!self.eventsListeners || self.destroyed) return self;
686 if (!self.eventsAnyListeners) return self;
687 const index = self.eventsAnyListeners.indexOf(handler);
688 if (index >= 0) {
689 self.eventsAnyListeners.splice(index, 1);
690 }
691 return self;
692 },
693 off(events, handler) {
694 const self = this;
695 if (!self.eventsListeners || self.destroyed) return self;
696 if (!self.eventsListeners) return self;
697 events.split(' ').forEach(event => {
698 if (typeof handler === 'undefined') {
699 self.eventsListeners[event] = [];
700 } else if (self.eventsListeners[event]) {
701 self.eventsListeners[event].forEach((eventHandler, index) => {
702 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
703 self.eventsListeners[event].splice(index, 1);
704 }
705 });
706 }
707 });
708 return self;
709 },
710 emit() {
711 const self = this;
712 if (!self.eventsListeners || self.destroyed) return self;
713 if (!self.eventsListeners) return self;
714 let events;
715 let data;
716 let context;
717 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
718 args[_key2] = arguments[_key2];
719 }
720 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
721 events = args[0];
722 data = args.slice(1, args.length);
723 context = self;
724 } else {
725 events = args[0].events;
726 data = args[0].data;
727 context = args[0].context || self;
728 }
729 data.unshift(context);
730 const eventsArray = Array.isArray(events) ? events : events.split(' ');
731 eventsArray.forEach(event => {
732 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
733 self.eventsAnyListeners.forEach(eventHandler => {
734 eventHandler.apply(context, [event, ...data]);
735 });
736 }
737 if (self.eventsListeners && self.eventsListeners[event]) {
738 self.eventsListeners[event].forEach(eventHandler => {
739 eventHandler.apply(context, data);
740 });
741 }
742 });
743 return self;
744 }
745 };
746
747 function updateSize() {
748 const swiper = this;
749 let width;
750 let height;
751 const el = swiper.el;
752 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
753 width = swiper.params.width;
754 } else {
755 width = el.clientWidth;
756 }
757 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
758 height = swiper.params.height;
759 } else {
760 height = el.clientHeight;
761 }
762 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
763 return;
764 }
765
766 // Subtract paddings
767 width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);
768 height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);
769 if (Number.isNaN(width)) width = 0;
770 if (Number.isNaN(height)) height = 0;
771 Object.assign(swiper, {
772 width,
773 height,
774 size: swiper.isHorizontal() ? width : height
775 });
776 }
777
778 function updateSlides() {
779 const swiper = this;
780 function getDirectionLabel(property) {
781 if (swiper.isHorizontal()) {
782 return property;
783 }
784 // prettier-ignore
785 return {
786 'width': 'height',
787 'margin-top': 'margin-left',
788 'margin-bottom ': 'margin-right',
789 'margin-left': 'margin-top',
790 'margin-right': 'margin-bottom',
791 'padding-left': 'padding-top',
792 'padding-right': 'padding-bottom',
793 'marginRight': 'marginBottom'
794 }[property];
795 }
796 function getDirectionPropertyValue(node, label) {
797 return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);
798 }
799 const params = swiper.params;
800 const {
801 wrapperEl,
802 slidesEl,
803 size: swiperSize,
804 rtlTranslate: rtl,
805 wrongRTL
806 } = swiper;
807 const isVirtual = swiper.virtual && params.virtual.enabled;
808 const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
809 const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
810 const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
811 let snapGrid = [];
812 const slidesGrid = [];
813 const slidesSizesGrid = [];
814 let offsetBefore = params.slidesOffsetBefore;
815 if (typeof offsetBefore === 'function') {
816 offsetBefore = params.slidesOffsetBefore.call(swiper);
817 }
818 let offsetAfter = params.slidesOffsetAfter;
819 if (typeof offsetAfter === 'function') {
820 offsetAfter = params.slidesOffsetAfter.call(swiper);
821 }
822 const previousSnapGridLength = swiper.snapGrid.length;
823 const previousSlidesGridLength = swiper.slidesGrid.length;
824 let spaceBetween = params.spaceBetween;
825 let slidePosition = -offsetBefore;
826 let prevSlideSize = 0;
827 let index = 0;
828 if (typeof swiperSize === 'undefined') {
829 return;
830 }
831 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
832 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
833 } else if (typeof spaceBetween === 'string') {
834 spaceBetween = parseFloat(spaceBetween);
835 }
836 swiper.virtualSize = -spaceBetween;
837
838 // reset margins
839 slides.forEach(slideEl => {
840 if (rtl) {
841 slideEl.style.marginLeft = '';
842 } else {
843 slideEl.style.marginRight = '';
844 }
845 slideEl.style.marginBottom = '';
846 slideEl.style.marginTop = '';
847 });
848
849 // reset cssMode offsets
850 if (params.centeredSlides && params.cssMode) {
851 setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');
852 setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');
853 }
854 const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
855 if (gridEnabled) {
856 swiper.grid.initSlides(slidesLength);
857 }
858
859 // Calc slides
860 let slideSize;
861 const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {
862 return typeof params.breakpoints[key].slidesPerView !== 'undefined';
863 }).length > 0;
864 for (let i = 0; i < slidesLength; i += 1) {
865 slideSize = 0;
866 let slide;
867 if (slides[i]) slide = slides[i];
868 if (gridEnabled) {
869 swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);
870 }
871 if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
872
873 if (params.slidesPerView === 'auto') {
874 if (shouldResetSlideSize) {
875 slides[i].style[getDirectionLabel('width')] = ``;
876 }
877 const slideStyles = getComputedStyle(slide);
878 const currentTransform = slide.style.transform;
879 const currentWebKitTransform = slide.style.webkitTransform;
880 if (currentTransform) {
881 slide.style.transform = 'none';
882 }
883 if (currentWebKitTransform) {
884 slide.style.webkitTransform = 'none';
885 }
886 if (params.roundLengths) {
887 slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);
888 } else {
889 // eslint-disable-next-line
890 const width = getDirectionPropertyValue(slideStyles, 'width');
891 const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
892 const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
893 const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
894 const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
895 const boxSizing = slideStyles.getPropertyValue('box-sizing');
896 if (boxSizing && boxSizing === 'border-box') {
897 slideSize = width + marginLeft + marginRight;
898 } else {
899 const {
900 clientWidth,
901 offsetWidth
902 } = slide;
903 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
904 }
905 }
906 if (currentTransform) {
907 slide.style.transform = currentTransform;
908 }
909 if (currentWebKitTransform) {
910 slide.style.webkitTransform = currentWebKitTransform;
911 }
912 if (params.roundLengths) slideSize = Math.floor(slideSize);
913 } else {
914 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
915 if (params.roundLengths) slideSize = Math.floor(slideSize);
916 if (slides[i]) {
917 slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;
918 }
919 }
920 if (slides[i]) {
921 slides[i].swiperSlideSize = slideSize;
922 }
923 slidesSizesGrid.push(slideSize);
924 if (params.centeredSlides) {
925 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
926 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
927 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
928 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
929 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
930 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
931 slidesGrid.push(slidePosition);
932 } else {
933 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
934 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
935 slidesGrid.push(slidePosition);
936 slidePosition = slidePosition + slideSize + spaceBetween;
937 }
938 swiper.virtualSize += slideSize + spaceBetween;
939 prevSlideSize = slideSize;
940 index += 1;
941 }
942 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
943 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
944 wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
945 }
946 if (params.setWrapperSize) {
947 wrapperEl.style[getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
948 }
949 if (gridEnabled) {
950 swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);
951 }
952
953 // Remove last grid elements depending on width
954 if (!params.centeredSlides) {
955 const newSlidesGrid = [];
956 for (let i = 0; i < snapGrid.length; i += 1) {
957 let slidesGridItem = snapGrid[i];
958 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
959 if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
960 newSlidesGrid.push(slidesGridItem);
961 }
962 }
963 snapGrid = newSlidesGrid;
964 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
965 snapGrid.push(swiper.virtualSize - swiperSize);
966 }
967 }
968 if (isVirtual && params.loop) {
969 const size = slidesSizesGrid[0] + spaceBetween;
970 if (params.slidesPerGroup > 1) {
971 const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
972 const groupSize = size * params.slidesPerGroup;
973 for (let i = 0; i < groups; i += 1) {
974 snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
975 }
976 }
977 for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
978 if (params.slidesPerGroup === 1) {
979 snapGrid.push(snapGrid[snapGrid.length - 1] + size);
980 }
981 slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
982 swiper.virtualSize += size;
983 }
984 }
985 if (snapGrid.length === 0) snapGrid = [0];
986 if (spaceBetween !== 0) {
987 const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');
988 slides.filter((_, slideIndex) => {
989 if (!params.cssMode || params.loop) return true;
990 if (slideIndex === slides.length - 1) {
991 return false;
992 }
993 return true;
994 }).forEach(slideEl => {
995 slideEl.style[key] = `${spaceBetween}px`;
996 });
997 }
998 if (params.centeredSlides && params.centeredSlidesBounds) {
999 let allSlidesSize = 0;
1000 slidesSizesGrid.forEach(slideSizeValue => {
1001 allSlidesSize += slideSizeValue + (spaceBetween || 0);
1002 });
1003 allSlidesSize -= spaceBetween;
1004 const maxSnap = allSlidesSize - swiperSize;
1005 snapGrid = snapGrid.map(snap => {
1006 if (snap <= 0) return -offsetBefore;
1007 if (snap > maxSnap) return maxSnap + offsetAfter;
1008 return snap;
1009 });
1010 }
1011 if (params.centerInsufficientSlides) {
1012 let allSlidesSize = 0;
1013 slidesSizesGrid.forEach(slideSizeValue => {
1014 allSlidesSize += slideSizeValue + (spaceBetween || 0);
1015 });
1016 allSlidesSize -= spaceBetween;
1017 if (allSlidesSize < swiperSize) {
1018 const allSlidesOffset = (swiperSize - allSlidesSize) / 2;
1019 snapGrid.forEach((snap, snapIndex) => {
1020 snapGrid[snapIndex] = snap - allSlidesOffset;
1021 });
1022 slidesGrid.forEach((snap, snapIndex) => {
1023 slidesGrid[snapIndex] = snap + allSlidesOffset;
1024 });
1025 }
1026 }
1027 Object.assign(swiper, {
1028 slides,
1029 snapGrid,
1030 slidesGrid,
1031 slidesSizesGrid
1032 });
1033 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
1034 setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);
1035 setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
1036 const addToSnapGrid = -swiper.snapGrid[0];
1037 const addToSlidesGrid = -swiper.slidesGrid[0];
1038 swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);
1039 swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);
1040 }
1041 if (slidesLength !== previousSlidesLength) {
1042 swiper.emit('slidesLengthChange');
1043 }
1044 if (snapGrid.length !== previousSnapGridLength) {
1045 if (swiper.params.watchOverflow) swiper.checkOverflow();
1046 swiper.emit('snapGridLengthChange');
1047 }
1048 if (slidesGrid.length !== previousSlidesGridLength) {
1049 swiper.emit('slidesGridLengthChange');
1050 }
1051 if (params.watchSlidesProgress) {
1052 swiper.updateSlidesOffset();
1053 }
1054 if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
1055 const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
1056 const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
1057 if (slidesLength <= params.maxBackfaceHiddenSlides) {
1058 if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
1059 } else if (hasClassBackfaceClassAdded) {
1060 swiper.el.classList.remove(backFaceHiddenClass);
1061 }
1062 }
1063 }
1064
1065 function updateAutoHeight(speed) {
1066 const swiper = this;
1067 const activeSlides = [];
1068 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1069 let newHeight = 0;
1070 let i;
1071 if (typeof speed === 'number') {
1072 swiper.setTransition(speed);
1073 } else if (speed === true) {
1074 swiper.setTransition(swiper.params.speed);
1075 }
1076 const getSlideByIndex = index => {
1077 if (isVirtual) {
1078 return swiper.slides[swiper.getSlideIndexByData(index)];
1079 }
1080 return swiper.slides[index];
1081 };
1082 // Find slides currently in view
1083 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1084 if (swiper.params.centeredSlides) {
1085 (swiper.visibleSlides || []).forEach(slide => {
1086 activeSlides.push(slide);
1087 });
1088 } else {
1089 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1090 const index = swiper.activeIndex + i;
1091 if (index > swiper.slides.length && !isVirtual) break;
1092 activeSlides.push(getSlideByIndex(index));
1093 }
1094 }
1095 } else {
1096 activeSlides.push(getSlideByIndex(swiper.activeIndex));
1097 }
1098
1099 // Find new height from highest slide in view
1100 for (i = 0; i < activeSlides.length; i += 1) {
1101 if (typeof activeSlides[i] !== 'undefined') {
1102 const height = activeSlides[i].offsetHeight;
1103 newHeight = height > newHeight ? height : newHeight;
1104 }
1105 }
1106
1107 // Update Height
1108 if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
1109 }
1110
1111 function updateSlidesOffset() {
1112 const swiper = this;
1113 const slides = swiper.slides;
1114 // eslint-disable-next-line
1115 const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
1116 for (let i = 0; i < slides.length; i += 1) {
1117 slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
1118 }
1119 }
1120
1121 function updateSlidesProgress(translate) {
1122 if (translate === void 0) {
1123 translate = this && this.translate || 0;
1124 }
1125 const swiper = this;
1126 const params = swiper.params;
1127 const {
1128 slides,
1129 rtlTranslate: rtl,
1130 snapGrid
1131 } = swiper;
1132 if (slides.length === 0) return;
1133 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
1134 let offsetCenter = -translate;
1135 if (rtl) offsetCenter = translate;
1136
1137 // Visible Slides
1138 slides.forEach(slideEl => {
1139 slideEl.classList.remove(params.slideVisibleClass);
1140 });
1141 swiper.visibleSlidesIndexes = [];
1142 swiper.visibleSlides = [];
1143 let spaceBetween = params.spaceBetween;
1144 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1145 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
1146 } else if (typeof spaceBetween === 'string') {
1147 spaceBetween = parseFloat(spaceBetween);
1148 }
1149 for (let i = 0; i < slides.length; i += 1) {
1150 const slide = slides[i];
1151 let slideOffset = slide.swiperSlideOffset;
1152 if (params.cssMode && params.centeredSlides) {
1153 slideOffset -= slides[0].swiperSlideOffset;
1154 }
1155 const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1156 const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1157 const slideBefore = -(offsetCenter - slideOffset);
1158 const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1159 const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
1160 if (isVisible) {
1161 swiper.visibleSlides.push(slide);
1162 swiper.visibleSlidesIndexes.push(i);
1163 slides[i].classList.add(params.slideVisibleClass);
1164 }
1165 slide.progress = rtl ? -slideProgress : slideProgress;
1166 slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
1167 }
1168 }
1169
1170 function updateProgress(translate) {
1171 const swiper = this;
1172 if (typeof translate === 'undefined') {
1173 const multiplier = swiper.rtlTranslate ? -1 : 1;
1174 // eslint-disable-next-line
1175 translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
1176 }
1177 const params = swiper.params;
1178 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1179 let {
1180 progress,
1181 isBeginning,
1182 isEnd,
1183 progressLoop
1184 } = swiper;
1185 const wasBeginning = isBeginning;
1186 const wasEnd = isEnd;
1187 if (translatesDiff === 0) {
1188 progress = 0;
1189 isBeginning = true;
1190 isEnd = true;
1191 } else {
1192 progress = (translate - swiper.minTranslate()) / translatesDiff;
1193 const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
1194 const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
1195 isBeginning = isBeginningRounded || progress <= 0;
1196 isEnd = isEndRounded || progress >= 1;
1197 if (isBeginningRounded) progress = 0;
1198 if (isEndRounded) progress = 1;
1199 }
1200 if (params.loop) {
1201 const firstSlideIndex = swiper.getSlideIndexByData(0);
1202 const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
1203 const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
1204 const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
1205 const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
1206 const translateAbs = Math.abs(translate);
1207 if (translateAbs >= firstSlideTranslate) {
1208 progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
1209 } else {
1210 progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
1211 }
1212 if (progressLoop > 1) progressLoop -= 1;
1213 }
1214 Object.assign(swiper, {
1215 progress,
1216 progressLoop,
1217 isBeginning,
1218 isEnd
1219 });
1220 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
1221 if (isBeginning && !wasBeginning) {
1222 swiper.emit('reachBeginning toEdge');
1223 }
1224 if (isEnd && !wasEnd) {
1225 swiper.emit('reachEnd toEdge');
1226 }
1227 if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
1228 swiper.emit('fromEdge');
1229 }
1230 swiper.emit('progress', progress);
1231 }
1232
1233 function updateSlidesClasses() {
1234 const swiper = this;
1235 const {
1236 slides,
1237 params,
1238 slidesEl,
1239 activeIndex
1240 } = swiper;
1241 const isVirtual = swiper.virtual && params.virtual.enabled;
1242 const getFilteredSlide = selector => {
1243 return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
1244 };
1245 slides.forEach(slideEl => {
1246 slideEl.classList.remove(params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
1247 });
1248 let activeSlide;
1249 if (isVirtual) {
1250 if (params.loop) {
1251 let slideIndex = activeIndex - swiper.virtual.slidesBefore;
1252 if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
1253 if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
1254 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
1255 } else {
1256 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
1257 }
1258 } else {
1259 activeSlide = slides[activeIndex];
1260 }
1261 if (activeSlide) {
1262 // Active classes
1263 activeSlide.classList.add(params.slideActiveClass);
1264
1265 // Next Slide
1266 let nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1267 if (params.loop && !nextSlide) {
1268 nextSlide = slides[0];
1269 }
1270 if (nextSlide) {
1271 nextSlide.classList.add(params.slideNextClass);
1272 }
1273 // Prev Slide
1274 let prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1275 if (params.loop && !prevSlide === 0) {
1276 prevSlide = slides[slides.length - 1];
1277 }
1278 if (prevSlide) {
1279 prevSlide.classList.add(params.slidePrevClass);
1280 }
1281 }
1282 swiper.emitSlidesClasses();
1283 }
1284
1285 const processLazyPreloader = (swiper, imageEl) => {
1286 if (!swiper || swiper.destroyed || !swiper.params) return;
1287 const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
1288 const slideEl = imageEl.closest(slideSelector());
1289 if (slideEl) {
1290 const lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1291 if (lazyEl) lazyEl.remove();
1292 }
1293 };
1294 const unlazy = (swiper, index) => {
1295 if (!swiper.slides[index]) return;
1296 const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
1297 if (imageEl) imageEl.removeAttribute('loading');
1298 };
1299 const preload = swiper => {
1300 if (!swiper || swiper.destroyed || !swiper.params) return;
1301 let amount = swiper.params.lazyPreloadPrevNext;
1302 const len = swiper.slides.length;
1303 if (!len || !amount || amount < 0) return;
1304 amount = Math.min(amount, len);
1305 const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
1306 const activeIndex = swiper.activeIndex;
1307 if (swiper.params.grid && swiper.params.grid.rows > 1) {
1308 const activeColumn = activeIndex;
1309 const preloadColumns = [activeColumn - amount];
1310 preloadColumns.push(...Array.from({
1311 length: amount
1312 }).map((_, i) => {
1313 return activeColumn + slidesPerView + i;
1314 }));
1315 swiper.slides.forEach((slideEl, i) => {
1316 if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
1317 });
1318 return;
1319 }
1320 const slideIndexLastInView = activeIndex + slidesPerView - 1;
1321 if (swiper.params.rewind || swiper.params.loop) {
1322 for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
1323 const realIndex = (i % len + len) % len;
1324 if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
1325 }
1326 } else {
1327 for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
1328 if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
1329 unlazy(swiper, i);
1330 }
1331 }
1332 }
1333 };
1334
1335 function getActiveIndexByTranslate(swiper) {
1336 const {
1337 slidesGrid,
1338 params
1339 } = swiper;
1340 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1341 let activeIndex;
1342 for (let i = 0; i < slidesGrid.length; i += 1) {
1343 if (typeof slidesGrid[i + 1] !== 'undefined') {
1344 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
1345 activeIndex = i;
1346 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1347 activeIndex = i + 1;
1348 }
1349 } else if (translate >= slidesGrid[i]) {
1350 activeIndex = i;
1351 }
1352 }
1353 // Normalize slideIndex
1354 if (params.normalizeSlideIndex) {
1355 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
1356 }
1357 return activeIndex;
1358 }
1359 function updateActiveIndex(newActiveIndex) {
1360 const swiper = this;
1361 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1362 const {
1363 snapGrid,
1364 params,
1365 activeIndex: previousIndex,
1366 realIndex: previousRealIndex,
1367 snapIndex: previousSnapIndex
1368 } = swiper;
1369 let activeIndex = newActiveIndex;
1370 let snapIndex;
1371 const getVirtualRealIndex = aIndex => {
1372 let realIndex = aIndex - swiper.virtual.slidesBefore;
1373 if (realIndex < 0) {
1374 realIndex = swiper.virtual.slides.length + realIndex;
1375 }
1376 if (realIndex >= swiper.virtual.slides.length) {
1377 realIndex -= swiper.virtual.slides.length;
1378 }
1379 return realIndex;
1380 };
1381 if (typeof activeIndex === 'undefined') {
1382 activeIndex = getActiveIndexByTranslate(swiper);
1383 }
1384 if (snapGrid.indexOf(translate) >= 0) {
1385 snapIndex = snapGrid.indexOf(translate);
1386 } else {
1387 const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1388 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1389 }
1390 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1391 if (activeIndex === previousIndex) {
1392 if (snapIndex !== previousSnapIndex) {
1393 swiper.snapIndex = snapIndex;
1394 swiper.emit('snapIndexChange');
1395 }
1396 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
1397 swiper.realIndex = getVirtualRealIndex(activeIndex);
1398 }
1399 return;
1400 }
1401 // Get real index
1402 let realIndex;
1403 if (swiper.virtual && params.virtual.enabled && params.loop) {
1404 realIndex = getVirtualRealIndex(activeIndex);
1405 } else if (swiper.slides[activeIndex]) {
1406 realIndex = parseInt(swiper.slides[activeIndex].getAttribute('data-swiper-slide-index') || activeIndex, 10);
1407 } else {
1408 realIndex = activeIndex;
1409 }
1410 Object.assign(swiper, {
1411 previousSnapIndex,
1412 snapIndex,
1413 previousRealIndex,
1414 realIndex,
1415 previousIndex,
1416 activeIndex
1417 });
1418 if (swiper.initialized) {
1419 preload(swiper);
1420 }
1421 swiper.emit('activeIndexChange');
1422 swiper.emit('snapIndexChange');
1423 if (previousRealIndex !== realIndex) {
1424 swiper.emit('realIndexChange');
1425 }
1426 if (swiper.initialized || swiper.params.runCallbacksOnInit) {
1427 swiper.emit('slideChange');
1428 }
1429 }
1430
1431 function updateClickedSlide(e) {
1432 const swiper = this;
1433 const params = swiper.params;
1434 const slide = e.closest(`.${params.slideClass}, swiper-slide`);
1435 let slideFound = false;
1436 let slideIndex;
1437 if (slide) {
1438 for (let i = 0; i < swiper.slides.length; i += 1) {
1439 if (swiper.slides[i] === slide) {
1440 slideFound = true;
1441 slideIndex = i;
1442 break;
1443 }
1444 }
1445 }
1446 if (slide && slideFound) {
1447 swiper.clickedSlide = slide;
1448 if (swiper.virtual && swiper.params.virtual.enabled) {
1449 swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
1450 } else {
1451 swiper.clickedIndex = slideIndex;
1452 }
1453 } else {
1454 swiper.clickedSlide = undefined;
1455 swiper.clickedIndex = undefined;
1456 return;
1457 }
1458 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1459 swiper.slideToClickedSlide();
1460 }
1461 }
1462
1463 var update = {
1464 updateSize,
1465 updateSlides,
1466 updateAutoHeight,
1467 updateSlidesOffset,
1468 updateSlidesProgress,
1469 updateProgress,
1470 updateSlidesClasses,
1471 updateActiveIndex,
1472 updateClickedSlide
1473 };
1474
1475 function getSwiperTranslate(axis) {
1476 if (axis === void 0) {
1477 axis = this.isHorizontal() ? 'x' : 'y';
1478 }
1479 const swiper = this;
1480 const {
1481 params,
1482 rtlTranslate: rtl,
1483 translate,
1484 wrapperEl
1485 } = swiper;
1486 if (params.virtualTranslate) {
1487 return rtl ? -translate : translate;
1488 }
1489 if (params.cssMode) {
1490 return translate;
1491 }
1492 let currentTranslate = getTranslate(wrapperEl, axis);
1493 currentTranslate += swiper.cssOverflowAdjustment();
1494 if (rtl) currentTranslate = -currentTranslate;
1495 return currentTranslate || 0;
1496 }
1497
1498 function setTranslate(translate, byController) {
1499 const swiper = this;
1500 const {
1501 rtlTranslate: rtl,
1502 params,
1503 wrapperEl,
1504 progress
1505 } = swiper;
1506 let x = 0;
1507 let y = 0;
1508 const z = 0;
1509 if (swiper.isHorizontal()) {
1510 x = rtl ? -translate : translate;
1511 } else {
1512 y = translate;
1513 }
1514 if (params.roundLengths) {
1515 x = Math.floor(x);
1516 y = Math.floor(y);
1517 }
1518 swiper.previousTranslate = swiper.translate;
1519 swiper.translate = swiper.isHorizontal() ? x : y;
1520 if (params.cssMode) {
1521 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
1522 } else if (!params.virtualTranslate) {
1523 if (swiper.isHorizontal()) {
1524 x -= swiper.cssOverflowAdjustment();
1525 } else {
1526 y -= swiper.cssOverflowAdjustment();
1527 }
1528 wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
1529 }
1530
1531 // Check if we need to update progress
1532 let newProgress;
1533 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1534 if (translatesDiff === 0) {
1535 newProgress = 0;
1536 } else {
1537 newProgress = (translate - swiper.minTranslate()) / translatesDiff;
1538 }
1539 if (newProgress !== progress) {
1540 swiper.updateProgress(translate);
1541 }
1542 swiper.emit('setTranslate', swiper.translate, byController);
1543 }
1544
1545 function minTranslate() {
1546 return -this.snapGrid[0];
1547 }
1548
1549 function maxTranslate() {
1550 return -this.snapGrid[this.snapGrid.length - 1];
1551 }
1552
1553 function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
1554 if (translate === void 0) {
1555 translate = 0;
1556 }
1557 if (speed === void 0) {
1558 speed = this.params.speed;
1559 }
1560 if (runCallbacks === void 0) {
1561 runCallbacks = true;
1562 }
1563 if (translateBounds === void 0) {
1564 translateBounds = true;
1565 }
1566 const swiper = this;
1567 const {
1568 params,
1569 wrapperEl
1570 } = swiper;
1571 if (swiper.animating && params.preventInteractionOnTransition) {
1572 return false;
1573 }
1574 const minTranslate = swiper.minTranslate();
1575 const maxTranslate = swiper.maxTranslate();
1576 let newTranslate;
1577 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
1578
1579 // Update progress
1580 swiper.updateProgress(newTranslate);
1581 if (params.cssMode) {
1582 const isH = swiper.isHorizontal();
1583 if (speed === 0) {
1584 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1585 } else {
1586 if (!swiper.support.smoothScroll) {
1587 animateCSSModeScroll({
1588 swiper,
1589 targetPosition: -newTranslate,
1590 side: isH ? 'left' : 'top'
1591 });
1592 return true;
1593 }
1594 wrapperEl.scrollTo({
1595 [isH ? 'left' : 'top']: -newTranslate,
1596 behavior: 'smooth'
1597 });
1598 }
1599 return true;
1600 }
1601 if (speed === 0) {
1602 swiper.setTransition(0);
1603 swiper.setTranslate(newTranslate);
1604 if (runCallbacks) {
1605 swiper.emit('beforeTransitionStart', speed, internal);
1606 swiper.emit('transitionEnd');
1607 }
1608 } else {
1609 swiper.setTransition(speed);
1610 swiper.setTranslate(newTranslate);
1611 if (runCallbacks) {
1612 swiper.emit('beforeTransitionStart', speed, internal);
1613 swiper.emit('transitionStart');
1614 }
1615 if (!swiper.animating) {
1616 swiper.animating = true;
1617 if (!swiper.onTranslateToWrapperTransitionEnd) {
1618 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
1619 if (!swiper || swiper.destroyed) return;
1620 if (e.target !== this) return;
1621 swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1622 swiper.onTranslateToWrapperTransitionEnd = null;
1623 delete swiper.onTranslateToWrapperTransitionEnd;
1624 if (runCallbacks) {
1625 swiper.emit('transitionEnd');
1626 }
1627 };
1628 }
1629 swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1630 }
1631 }
1632 return true;
1633 }
1634
1635 var translate = {
1636 getTranslate: getSwiperTranslate,
1637 setTranslate,
1638 minTranslate,
1639 maxTranslate,
1640 translateTo
1641 };
1642
1643 function setTransition(duration, byController) {
1644 const swiper = this;
1645 if (!swiper.params.cssMode) {
1646 swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
1647 }
1648 swiper.emit('setTransition', duration, byController);
1649 }
1650
1651 function transitionEmit(_ref) {
1652 let {
1653 swiper,
1654 runCallbacks,
1655 direction,
1656 step
1657 } = _ref;
1658 const {
1659 activeIndex,
1660 previousIndex
1661 } = swiper;
1662 let dir = direction;
1663 if (!dir) {
1664 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
1665 }
1666 swiper.emit(`transition${step}`);
1667 if (runCallbacks && activeIndex !== previousIndex) {
1668 if (dir === 'reset') {
1669 swiper.emit(`slideResetTransition${step}`);
1670 return;
1671 }
1672 swiper.emit(`slideChangeTransition${step}`);
1673 if (dir === 'next') {
1674 swiper.emit(`slideNextTransition${step}`);
1675 } else {
1676 swiper.emit(`slidePrevTransition${step}`);
1677 }
1678 }
1679 }
1680
1681 function transitionStart(runCallbacks, direction) {
1682 if (runCallbacks === void 0) {
1683 runCallbacks = true;
1684 }
1685 const swiper = this;
1686 const {
1687 params
1688 } = swiper;
1689 if (params.cssMode) return;
1690 if (params.autoHeight) {
1691 swiper.updateAutoHeight();
1692 }
1693 transitionEmit({
1694 swiper,
1695 runCallbacks,
1696 direction,
1697 step: 'Start'
1698 });
1699 }
1700
1701 function transitionEnd(runCallbacks, direction) {
1702 if (runCallbacks === void 0) {
1703 runCallbacks = true;
1704 }
1705 const swiper = this;
1706 const {
1707 params
1708 } = swiper;
1709 swiper.animating = false;
1710 if (params.cssMode) return;
1711 swiper.setTransition(0);
1712 transitionEmit({
1713 swiper,
1714 runCallbacks,
1715 direction,
1716 step: 'End'
1717 });
1718 }
1719
1720 var transition = {
1721 setTransition,
1722 transitionStart,
1723 transitionEnd
1724 };
1725
1726 function slideTo(index, speed, runCallbacks, internal, initial) {
1727 if (index === void 0) {
1728 index = 0;
1729 }
1730 if (speed === void 0) {
1731 speed = this.params.speed;
1732 }
1733 if (runCallbacks === void 0) {
1734 runCallbacks = true;
1735 }
1736 if (typeof index === 'string') {
1737 index = parseInt(index, 10);
1738 }
1739 const swiper = this;
1740 let slideIndex = index;
1741 if (slideIndex < 0) slideIndex = 0;
1742 const {
1743 params,
1744 snapGrid,
1745 slidesGrid,
1746 previousIndex,
1747 activeIndex,
1748 rtlTranslate: rtl,
1749 wrapperEl,
1750 enabled
1751 } = swiper;
1752 if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {
1753 return false;
1754 }
1755 const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
1756 let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
1757 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1758 const translate = -snapGrid[snapIndex];
1759 // Normalize slideIndex
1760 if (params.normalizeSlideIndex) {
1761 for (let i = 0; i < slidesGrid.length; i += 1) {
1762 const normalizedTranslate = -Math.floor(translate * 100);
1763 const normalizedGrid = Math.floor(slidesGrid[i] * 100);
1764 const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
1765 if (typeof slidesGrid[i + 1] !== 'undefined') {
1766 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
1767 slideIndex = i;
1768 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
1769 slideIndex = i + 1;
1770 }
1771 } else if (normalizedTranslate >= normalizedGrid) {
1772 slideIndex = i;
1773 }
1774 }
1775 }
1776 // Directions locks
1777 if (swiper.initialized && slideIndex !== activeIndex) {
1778 if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
1779 return false;
1780 }
1781 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
1782 if ((activeIndex || 0) !== slideIndex) {
1783 return false;
1784 }
1785 }
1786 }
1787 if (slideIndex !== (previousIndex || 0) && runCallbacks) {
1788 swiper.emit('beforeSlideChangeStart');
1789 }
1790
1791 // Update progress
1792 swiper.updateProgress(translate);
1793 let direction;
1794 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
1795
1796 // Update Index
1797 if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
1798 swiper.updateActiveIndex(slideIndex);
1799 // Update Height
1800 if (params.autoHeight) {
1801 swiper.updateAutoHeight();
1802 }
1803 swiper.updateSlidesClasses();
1804 if (params.effect !== 'slide') {
1805 swiper.setTranslate(translate);
1806 }
1807 if (direction !== 'reset') {
1808 swiper.transitionStart(runCallbacks, direction);
1809 swiper.transitionEnd(runCallbacks, direction);
1810 }
1811 return false;
1812 }
1813 if (params.cssMode) {
1814 const isH = swiper.isHorizontal();
1815 const t = rtl ? translate : -translate;
1816 if (speed === 0) {
1817 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1818 if (isVirtual) {
1819 swiper.wrapperEl.style.scrollSnapType = 'none';
1820 swiper._immediateVirtual = true;
1821 }
1822 if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
1823 swiper._cssModeVirtualInitialSet = true;
1824 requestAnimationFrame(() => {
1825 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1826 });
1827 } else {
1828 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1829 }
1830 if (isVirtual) {
1831 requestAnimationFrame(() => {
1832 swiper.wrapperEl.style.scrollSnapType = '';
1833 swiper._immediateVirtual = false;
1834 });
1835 }
1836 } else {
1837 if (!swiper.support.smoothScroll) {
1838 animateCSSModeScroll({
1839 swiper,
1840 targetPosition: t,
1841 side: isH ? 'left' : 'top'
1842 });
1843 return true;
1844 }
1845 wrapperEl.scrollTo({
1846 [isH ? 'left' : 'top']: t,
1847 behavior: 'smooth'
1848 });
1849 }
1850 return true;
1851 }
1852 swiper.setTransition(speed);
1853 swiper.setTranslate(translate);
1854 swiper.updateActiveIndex(slideIndex);
1855 swiper.updateSlidesClasses();
1856 swiper.emit('beforeTransitionStart', speed, internal);
1857 swiper.transitionStart(runCallbacks, direction);
1858 if (speed === 0) {
1859 swiper.transitionEnd(runCallbacks, direction);
1860 } else if (!swiper.animating) {
1861 swiper.animating = true;
1862 if (!swiper.onSlideToWrapperTransitionEnd) {
1863 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
1864 if (!swiper || swiper.destroyed) return;
1865 if (e.target !== this) return;
1866 swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1867 swiper.onSlideToWrapperTransitionEnd = null;
1868 delete swiper.onSlideToWrapperTransitionEnd;
1869 swiper.transitionEnd(runCallbacks, direction);
1870 };
1871 }
1872 swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1873 }
1874 return true;
1875 }
1876
1877 function slideToLoop(index, speed, runCallbacks, internal) {
1878 if (index === void 0) {
1879 index = 0;
1880 }
1881 if (speed === void 0) {
1882 speed = this.params.speed;
1883 }
1884 if (runCallbacks === void 0) {
1885 runCallbacks = true;
1886 }
1887 if (typeof index === 'string') {
1888 const indexAsNumber = parseInt(index, 10);
1889 index = indexAsNumber;
1890 }
1891 const swiper = this;
1892 let newIndex = index;
1893 if (swiper.params.loop) {
1894 if (swiper.virtual && swiper.params.virtual.enabled) {
1895 // eslint-disable-next-line
1896 newIndex = newIndex + swiper.virtual.slidesBefore;
1897 } else {
1898 newIndex = swiper.getSlideIndexByData(newIndex);
1899 }
1900 }
1901 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
1902 }
1903
1904 /* eslint no-unused-vars: "off" */
1905 function slideNext(speed, runCallbacks, internal) {
1906 if (speed === void 0) {
1907 speed = this.params.speed;
1908 }
1909 if (runCallbacks === void 0) {
1910 runCallbacks = true;
1911 }
1912 const swiper = this;
1913 const {
1914 enabled,
1915 params,
1916 animating
1917 } = swiper;
1918 if (!enabled) return swiper;
1919 let perGroup = params.slidesPerGroup;
1920 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
1921 perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
1922 }
1923 const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
1924 const isVirtual = swiper.virtual && params.virtual.enabled;
1925 if (params.loop) {
1926 if (animating && !isVirtual && params.loopPreventsSliding) return false;
1927 swiper.loopFix({
1928 direction: 'next'
1929 });
1930 // eslint-disable-next-line
1931 swiper._clientLeft = swiper.wrapperEl.clientLeft;
1932 }
1933 if (params.rewind && swiper.isEnd) {
1934 return swiper.slideTo(0, speed, runCallbacks, internal);
1935 }
1936 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
1937 }
1938
1939 /* eslint no-unused-vars: "off" */
1940 function slidePrev(speed, runCallbacks, internal) {
1941 if (speed === void 0) {
1942 speed = this.params.speed;
1943 }
1944 if (runCallbacks === void 0) {
1945 runCallbacks = true;
1946 }
1947 const swiper = this;
1948 const {
1949 params,
1950 snapGrid,
1951 slidesGrid,
1952 rtlTranslate,
1953 enabled,
1954 animating
1955 } = swiper;
1956 if (!enabled) return swiper;
1957 const isVirtual = swiper.virtual && params.virtual.enabled;
1958 if (params.loop) {
1959 if (animating && !isVirtual && params.loopPreventsSliding) return false;
1960 swiper.loopFix({
1961 direction: 'prev'
1962 });
1963 // eslint-disable-next-line
1964 swiper._clientLeft = swiper.wrapperEl.clientLeft;
1965 }
1966 const translate = rtlTranslate ? swiper.translate : -swiper.translate;
1967 function normalize(val) {
1968 if (val < 0) return -Math.floor(Math.abs(val));
1969 return Math.floor(val);
1970 }
1971 const normalizedTranslate = normalize(translate);
1972 const normalizedSnapGrid = snapGrid.map(val => normalize(val));
1973 let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
1974 if (typeof prevSnap === 'undefined' && params.cssMode) {
1975 let prevSnapIndex;
1976 snapGrid.forEach((snap, snapIndex) => {
1977 if (normalizedTranslate >= snap) {
1978 // prevSnap = snap;
1979 prevSnapIndex = snapIndex;
1980 }
1981 });
1982 if (typeof prevSnapIndex !== 'undefined') {
1983 prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
1984 }
1985 }
1986 let prevIndex = 0;
1987 if (typeof prevSnap !== 'undefined') {
1988 prevIndex = slidesGrid.indexOf(prevSnap);
1989 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
1990 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
1991 prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
1992 prevIndex = Math.max(prevIndex, 0);
1993 }
1994 }
1995 if (params.rewind && swiper.isBeginning) {
1996 const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
1997 return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
1998 }
1999 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2000 }
2001
2002 /* eslint no-unused-vars: "off" */
2003 function slideReset(speed, runCallbacks, internal) {
2004 if (speed === void 0) {
2005 speed = this.params.speed;
2006 }
2007 if (runCallbacks === void 0) {
2008 runCallbacks = true;
2009 }
2010 const swiper = this;
2011 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2012 }
2013
2014 /* eslint no-unused-vars: "off" */
2015 function slideToClosest(speed, runCallbacks, internal, threshold) {
2016 if (speed === void 0) {
2017 speed = this.params.speed;
2018 }
2019 if (runCallbacks === void 0) {
2020 runCallbacks = true;
2021 }
2022 if (threshold === void 0) {
2023 threshold = 0.5;
2024 }
2025 const swiper = this;
2026 let index = swiper.activeIndex;
2027 const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2028 const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2029 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2030 if (translate >= swiper.snapGrid[snapIndex]) {
2031 // The current translate is on or after the current snap index, so the choice
2032 // is between the current index and the one after it.
2033 const currentSnap = swiper.snapGrid[snapIndex];
2034 const nextSnap = swiper.snapGrid[snapIndex + 1];
2035 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
2036 index += swiper.params.slidesPerGroup;
2037 }
2038 } else {
2039 // The current translate is before the current snap index, so the choice
2040 // is between the current index and the one before it.
2041 const prevSnap = swiper.snapGrid[snapIndex - 1];
2042 const currentSnap = swiper.snapGrid[snapIndex];
2043 if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {
2044 index -= swiper.params.slidesPerGroup;
2045 }
2046 }
2047 index = Math.max(index, 0);
2048 index = Math.min(index, swiper.slidesGrid.length - 1);
2049 return swiper.slideTo(index, speed, runCallbacks, internal);
2050 }
2051
2052 function slideToClickedSlide() {
2053 const swiper = this;
2054 const {
2055 params,
2056 slidesEl
2057 } = swiper;
2058 const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2059 let slideToIndex = swiper.clickedIndex;
2060 let realIndex;
2061 const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
2062 if (params.loop) {
2063 if (swiper.animating) return;
2064 realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
2065 if (params.centeredSlides) {
2066 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
2067 swiper.loopFix();
2068 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2069 nextTick(() => {
2070 swiper.slideTo(slideToIndex);
2071 });
2072 } else {
2073 swiper.slideTo(slideToIndex);
2074 }
2075 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2076 swiper.loopFix();
2077 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2078 nextTick(() => {
2079 swiper.slideTo(slideToIndex);
2080 });
2081 } else {
2082 swiper.slideTo(slideToIndex);
2083 }
2084 } else {
2085 swiper.slideTo(slideToIndex);
2086 }
2087 }
2088
2089 var slide = {
2090 slideTo,
2091 slideToLoop,
2092 slideNext,
2093 slidePrev,
2094 slideReset,
2095 slideToClosest,
2096 slideToClickedSlide
2097 };
2098
2099 function loopCreate(slideRealIndex) {
2100 const swiper = this;
2101 const {
2102 params,
2103 slidesEl
2104 } = swiper;
2105 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2106 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
2107 slides.forEach((el, index) => {
2108 el.setAttribute('data-swiper-slide-index', index);
2109 });
2110 swiper.loopFix({
2111 slideRealIndex,
2112 direction: params.centeredSlides ? undefined : 'next'
2113 });
2114 }
2115
2116 function loopFix(_temp) {
2117 let {
2118 slideRealIndex,
2119 slideTo = true,
2120 direction,
2121 setTranslate,
2122 activeSlideIndex,
2123 byController,
2124 byMousewheel
2125 } = _temp === void 0 ? {} : _temp;
2126 const swiper = this;
2127 if (!swiper.params.loop) return;
2128 swiper.emit('beforeLoopFix');
2129 const {
2130 slides,
2131 allowSlidePrev,
2132 allowSlideNext,
2133 slidesEl,
2134 params
2135 } = swiper;
2136 swiper.allowSlidePrev = true;
2137 swiper.allowSlideNext = true;
2138 if (swiper.virtual && params.virtual.enabled) {
2139 if (slideTo) {
2140 if (!params.centeredSlides && swiper.snapIndex === 0) {
2141 swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
2142 } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
2143 swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
2144 } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
2145 swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
2146 }
2147 }
2148 swiper.allowSlidePrev = allowSlidePrev;
2149 swiper.allowSlideNext = allowSlideNext;
2150 swiper.emit('loopFix');
2151 return;
2152 }
2153 const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
2154 let loopedSlides = params.loopedSlides || slidesPerView;
2155 if (loopedSlides % params.slidesPerGroup !== 0) {
2156 loopedSlides += params.slidesPerGroup - loopedSlides % params.slidesPerGroup;
2157 }
2158 swiper.loopedSlides = loopedSlides;
2159 const prependSlidesIndexes = [];
2160 const appendSlidesIndexes = [];
2161 let activeIndex = swiper.activeIndex;
2162 if (typeof activeSlideIndex === 'undefined') {
2163 activeSlideIndex = swiper.getSlideIndex(swiper.slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);
2164 } else {
2165 activeIndex = activeSlideIndex;
2166 }
2167 const isNext = direction === 'next' || !direction;
2168 const isPrev = direction === 'prev' || !direction;
2169 let slidesPrepended = 0;
2170 let slidesAppended = 0;
2171 // prepend last slides before start
2172 if (activeSlideIndex < loopedSlides) {
2173 slidesPrepended = Math.max(loopedSlides - activeSlideIndex, params.slidesPerGroup);
2174 for (let i = 0; i < loopedSlides - activeSlideIndex; i += 1) {
2175 const index = i - Math.floor(i / slides.length) * slides.length;
2176 prependSlidesIndexes.push(slides.length - index - 1);
2177 }
2178 } else if (activeSlideIndex /* + slidesPerView */ > swiper.slides.length - loopedSlides * 2) {
2179 slidesAppended = Math.max(activeSlideIndex - (swiper.slides.length - loopedSlides * 2), params.slidesPerGroup);
2180 for (let i = 0; i < slidesAppended; i += 1) {
2181 const index = i - Math.floor(i / slides.length) * slides.length;
2182 appendSlidesIndexes.push(index);
2183 }
2184 }
2185 if (isPrev) {
2186 prependSlidesIndexes.forEach(index => {
2187 swiper.slides[index].swiperLoopMoveDOM = true;
2188 slidesEl.prepend(swiper.slides[index]);
2189 swiper.slides[index].swiperLoopMoveDOM = false;
2190 });
2191 }
2192 if (isNext) {
2193 appendSlidesIndexes.forEach(index => {
2194 swiper.slides[index].swiperLoopMoveDOM = true;
2195 slidesEl.append(swiper.slides[index]);
2196 swiper.slides[index].swiperLoopMoveDOM = false;
2197 });
2198 }
2199 swiper.recalcSlides();
2200 if (params.slidesPerView === 'auto') {
2201 swiper.updateSlides();
2202 }
2203 if (params.watchSlidesProgress) {
2204 swiper.updateSlidesOffset();
2205 }
2206 if (slideTo) {
2207 if (prependSlidesIndexes.length > 0 && isPrev) {
2208 if (typeof slideRealIndex === 'undefined') {
2209 const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2210 const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
2211 const diff = newSlideTranslate - currentSlideTranslate;
2212 if (byMousewheel) {
2213 swiper.setTranslate(swiper.translate - diff);
2214 } else {
2215 swiper.slideTo(activeIndex + slidesPrepended, 0, false, true);
2216 if (setTranslate) {
2217 swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;
2218 }
2219 }
2220 } else {
2221 if (setTranslate) {
2222 swiper.slideToLoop(slideRealIndex, 0, false, true);
2223 }
2224 }
2225 } else if (appendSlidesIndexes.length > 0 && isNext) {
2226 if (typeof slideRealIndex === 'undefined') {
2227 const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2228 const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
2229 const diff = newSlideTranslate - currentSlideTranslate;
2230 if (byMousewheel) {
2231 swiper.setTranslate(swiper.translate - diff);
2232 } else {
2233 swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
2234 if (setTranslate) {
2235 swiper.touches[swiper.isHorizontal() ? 'startX' : 'startY'] += diff;
2236 }
2237 }
2238 } else {
2239 swiper.slideToLoop(slideRealIndex, 0, false, true);
2240 }
2241 }
2242 }
2243 swiper.allowSlidePrev = allowSlidePrev;
2244 swiper.allowSlideNext = allowSlideNext;
2245 if (swiper.controller && swiper.controller.control && !byController) {
2246 const loopParams = {
2247 slideRealIndex,
2248 slideTo: false,
2249 direction,
2250 setTranslate,
2251 activeSlideIndex,
2252 byController: true
2253 };
2254 if (Array.isArray(swiper.controller.control)) {
2255 swiper.controller.control.forEach(c => {
2256 if (!c.destroyed && c.params.loop) c.loopFix(loopParams);
2257 });
2258 } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
2259 swiper.controller.control.loopFix(loopParams);
2260 }
2261 }
2262 swiper.emit('loopFix');
2263 }
2264
2265 function loopDestroy() {
2266 const swiper = this;
2267 const {
2268 params,
2269 slidesEl
2270 } = swiper;
2271 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2272 swiper.recalcSlides();
2273 const newSlidesOrder = [];
2274 swiper.slides.forEach(slideEl => {
2275 const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
2276 newSlidesOrder[index] = slideEl;
2277 });
2278 swiper.slides.forEach(slideEl => {
2279 slideEl.removeAttribute('data-swiper-slide-index');
2280 });
2281 newSlidesOrder.forEach(slideEl => {
2282 slidesEl.append(slideEl);
2283 });
2284 swiper.recalcSlides();
2285 swiper.slideTo(swiper.realIndex, 0);
2286 }
2287
2288 var loop = {
2289 loopCreate,
2290 loopFix,
2291 loopDestroy
2292 };
2293
2294 function setGrabCursor(moving) {
2295 const swiper = this;
2296 if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
2297 const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
2298 if (swiper.isElement) {
2299 swiper.__preventObserver__ = true;
2300 }
2301 el.style.cursor = 'move';
2302 el.style.cursor = moving ? 'grabbing' : 'grab';
2303 if (swiper.isElement) {
2304 requestAnimationFrame(() => {
2305 swiper.__preventObserver__ = false;
2306 });
2307 }
2308 }
2309
2310 function unsetGrabCursor() {
2311 const swiper = this;
2312 if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
2313 return;
2314 }
2315 if (swiper.isElement) {
2316 swiper.__preventObserver__ = true;
2317 }
2318 swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
2319 if (swiper.isElement) {
2320 requestAnimationFrame(() => {
2321 swiper.__preventObserver__ = false;
2322 });
2323 }
2324 }
2325
2326 var grabCursor = {
2327 setGrabCursor,
2328 unsetGrabCursor
2329 };
2330
2331 // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
2332 function closestElement(selector, base) {
2333 if (base === void 0) {
2334 base = this;
2335 }
2336 function __closestFrom(el) {
2337 if (!el || el === getDocument() || el === getWindow()) return null;
2338 if (el.assignedSlot) el = el.assignedSlot;
2339 const found = el.closest(selector);
2340 if (!found && !el.getRootNode) {
2341 return null;
2342 }
2343 return found || __closestFrom(el.getRootNode().host);
2344 }
2345 return __closestFrom(base);
2346 }
2347 function onTouchStart(event) {
2348 const swiper = this;
2349 const document = getDocument();
2350 const window = getWindow();
2351 const data = swiper.touchEventsData;
2352 data.evCache.push(event);
2353 const {
2354 params,
2355 touches,
2356 enabled
2357 } = swiper;
2358 if (!enabled) return;
2359 if (!params.simulateTouch && event.pointerType === 'mouse') return;
2360 if (swiper.animating && params.preventInteractionOnTransition) {
2361 return;
2362 }
2363 if (!swiper.animating && params.cssMode && params.loop) {
2364 swiper.loopFix();
2365 }
2366 let e = event;
2367 if (e.originalEvent) e = e.originalEvent;
2368 let targetEl = e.target;
2369 if (params.touchEventsTarget === 'wrapper') {
2370 if (!swiper.wrapperEl.contains(targetEl)) return;
2371 }
2372 if ('which' in e && e.which === 3) return;
2373 if ('button' in e && e.button > 0) return;
2374 if (data.isTouched && data.isMoved) return;
2375
2376 // change target el for shadow root component
2377 const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
2378 // eslint-disable-next-line
2379 const eventPath = event.composedPath ? event.composedPath() : event.path;
2380 if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
2381 targetEl = eventPath[0];
2382 }
2383 const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
2384 const isTargetShadow = !!(e.target && e.target.shadowRoot);
2385
2386 // use closestElement for shadow root element to get the actual closest for nested shadow root element
2387 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
2388 swiper.allowClick = true;
2389 return;
2390 }
2391 if (params.swipeHandler) {
2392 if (!targetEl.closest(params.swipeHandler)) return;
2393 }
2394 touches.currentX = e.pageX;
2395 touches.currentY = e.pageY;
2396 const startX = touches.currentX;
2397 const startY = touches.currentY;
2398
2399 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
2400
2401 const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
2402 const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
2403 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
2404 if (edgeSwipeDetection === 'prevent') {
2405 event.preventDefault();
2406 } else {
2407 return;
2408 }
2409 }
2410 Object.assign(data, {
2411 isTouched: true,
2412 isMoved: false,
2413 allowTouchCallbacks: true,
2414 isScrolling: undefined,
2415 startMoving: undefined
2416 });
2417 touches.startX = startX;
2418 touches.startY = startY;
2419 data.touchStartTime = now();
2420 swiper.allowClick = true;
2421 swiper.updateSize();
2422 swiper.swipeDirection = undefined;
2423 if (params.threshold > 0) data.allowThresholdMove = false;
2424 let preventDefault = true;
2425 if (targetEl.matches(data.focusableElements)) {
2426 preventDefault = false;
2427 if (targetEl.nodeName === 'SELECT') {
2428 data.isTouched = false;
2429 }
2430 }
2431 if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {
2432 document.activeElement.blur();
2433 }
2434 const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2435 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
2436 e.preventDefault();
2437 }
2438 if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
2439 swiper.freeMode.onTouchStart();
2440 }
2441 swiper.emit('touchStart', e);
2442 }
2443
2444 function onTouchMove(event) {
2445 const document = getDocument();
2446 const swiper = this;
2447 const data = swiper.touchEventsData;
2448 const {
2449 params,
2450 touches,
2451 rtlTranslate: rtl,
2452 enabled
2453 } = swiper;
2454 if (!enabled) return;
2455 if (!params.simulateTouch && event.pointerType === 'mouse') return;
2456 let e = event;
2457 if (e.originalEvent) e = e.originalEvent;
2458 if (!data.isTouched) {
2459 if (data.startMoving && data.isScrolling) {
2460 swiper.emit('touchMoveOpposite', e);
2461 }
2462 return;
2463 }
2464 const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
2465 if (pointerIndex >= 0) data.evCache[pointerIndex] = e;
2466 const targetTouch = data.evCache.length > 1 ? data.evCache[0] : e;
2467 const pageX = targetTouch.pageX;
2468 const pageY = targetTouch.pageY;
2469 if (e.preventedByNestedSwiper) {
2470 touches.startX = pageX;
2471 touches.startY = pageY;
2472 return;
2473 }
2474 if (!swiper.allowTouchMove) {
2475 if (!e.target.matches(data.focusableElements)) {
2476 swiper.allowClick = false;
2477 }
2478 if (data.isTouched) {
2479 Object.assign(touches, {
2480 startX: pageX,
2481 startY: pageY,
2482 prevX: swiper.touches.currentX,
2483 prevY: swiper.touches.currentY,
2484 currentX: pageX,
2485 currentY: pageY
2486 });
2487 data.touchStartTime = now();
2488 }
2489 return;
2490 }
2491 if (params.touchReleaseOnEdges && !params.loop) {
2492 if (swiper.isVertical()) {
2493 // Vertical
2494 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
2495 data.isTouched = false;
2496 data.isMoved = false;
2497 return;
2498 }
2499 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
2500 return;
2501 }
2502 }
2503 if (document.activeElement) {
2504 if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
2505 data.isMoved = true;
2506 swiper.allowClick = false;
2507 return;
2508 }
2509 }
2510 if (data.allowTouchCallbacks) {
2511 swiper.emit('touchMove', e);
2512 }
2513 if (e.targetTouches && e.targetTouches.length > 1) return;
2514 touches.currentX = pageX;
2515 touches.currentY = pageY;
2516 const diffX = touches.currentX - touches.startX;
2517 const diffY = touches.currentY - touches.startY;
2518 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
2519 if (typeof data.isScrolling === 'undefined') {
2520 let touchAngle;
2521 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
2522 data.isScrolling = false;
2523 } else {
2524 // eslint-disable-next-line
2525 if (diffX * diffX + diffY * diffY >= 25) {
2526 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
2527 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
2528 }
2529 }
2530 }
2531 if (data.isScrolling) {
2532 swiper.emit('touchMoveOpposite', e);
2533 }
2534 if (typeof data.startMoving === 'undefined') {
2535 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2536 data.startMoving = true;
2537 }
2538 }
2539 if (data.isScrolling || swiper.zoom && swiper.params.zoom && swiper.params.zoom.enabled && data.evCache.length > 1) {
2540 data.isTouched = false;
2541 return;
2542 }
2543 if (!data.startMoving) {
2544 return;
2545 }
2546 swiper.allowClick = false;
2547 if (!params.cssMode && e.cancelable) {
2548 e.preventDefault();
2549 }
2550 if (params.touchMoveStopPropagation && !params.nested) {
2551 e.stopPropagation();
2552 }
2553 let diff = swiper.isHorizontal() ? diffX : diffY;
2554 let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
2555 if (params.oneWayMovement) {
2556 diff = Math.abs(diff) * (rtl ? 1 : -1);
2557 touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
2558 }
2559 touches.diff = diff;
2560 diff *= params.touchRatio;
2561 if (rtl) {
2562 diff = -diff;
2563 touchesDiff = -touchesDiff;
2564 }
2565 const prevTouchesDirection = swiper.touchesDirection;
2566 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
2567 swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
2568 const isLoop = swiper.params.loop && !params.cssMode;
2569 if (!data.isMoved) {
2570 if (isLoop) {
2571 swiper.loopFix({
2572 direction: swiper.swipeDirection
2573 });
2574 }
2575 data.startTranslate = swiper.getTranslate();
2576 swiper.setTransition(0);
2577 if (swiper.animating) {
2578 const evt = new window.CustomEvent('transitionend', {
2579 bubbles: true,
2580 cancelable: true
2581 });
2582 swiper.wrapperEl.dispatchEvent(evt);
2583 }
2584 data.allowMomentumBounce = false;
2585 // Grab Cursor
2586 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2587 swiper.setGrabCursor(true);
2588 }
2589 swiper.emit('sliderFirstMove', e);
2590 }
2591 let loopFixed;
2592 if (data.isMoved && prevTouchesDirection !== swiper.touchesDirection && isLoop && Math.abs(diff) >= 1) {
2593 // need another loop fix
2594 swiper.loopFix({
2595 direction: swiper.swipeDirection,
2596 setTranslate: true
2597 });
2598 loopFixed = true;
2599 }
2600 swiper.emit('sliderMove', e);
2601 data.isMoved = true;
2602 data.currentTranslate = diff + data.startTranslate;
2603 let disableParentSwiper = true;
2604 let resistanceRatio = params.resistanceRatio;
2605 if (params.touchReleaseOnEdges) {
2606 resistanceRatio = 0;
2607 }
2608 if (diff > 0) {
2609 if (isLoop && !loopFixed && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.size / 2 : swiper.minTranslate())) {
2610 swiper.loopFix({
2611 direction: 'prev',
2612 setTranslate: true,
2613 activeSlideIndex: 0
2614 });
2615 }
2616 if (data.currentTranslate > swiper.minTranslate()) {
2617 disableParentSwiper = false;
2618 if (params.resistance) {
2619 data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
2620 }
2621 }
2622 } else if (diff < 0) {
2623 if (isLoop && !loopFixed && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.size / 2 : swiper.maxTranslate())) {
2624 swiper.loopFix({
2625 direction: 'next',
2626 setTranslate: true,
2627 activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
2628 });
2629 }
2630 if (data.currentTranslate < swiper.maxTranslate()) {
2631 disableParentSwiper = false;
2632 if (params.resistance) {
2633 data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
2634 }
2635 }
2636 }
2637 if (disableParentSwiper) {
2638 e.preventedByNestedSwiper = true;
2639 }
2640
2641 // Directions locks
2642 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
2643 data.currentTranslate = data.startTranslate;
2644 }
2645 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
2646 data.currentTranslate = data.startTranslate;
2647 }
2648 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
2649 data.currentTranslate = data.startTranslate;
2650 }
2651
2652 // Threshold
2653 if (params.threshold > 0) {
2654 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2655 if (!data.allowThresholdMove) {
2656 data.allowThresholdMove = true;
2657 touches.startX = touches.currentX;
2658 touches.startY = touches.currentY;
2659 data.currentTranslate = data.startTranslate;
2660 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2661 return;
2662 }
2663 } else {
2664 data.currentTranslate = data.startTranslate;
2665 return;
2666 }
2667 }
2668 if (!params.followFinger || params.cssMode) return;
2669
2670 // Update active index in free mode
2671 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
2672 swiper.updateActiveIndex();
2673 swiper.updateSlidesClasses();
2674 }
2675 if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
2676 swiper.freeMode.onTouchMove();
2677 }
2678 // Update progress
2679 swiper.updateProgress(data.currentTranslate);
2680 // Update translate
2681 swiper.setTranslate(data.currentTranslate);
2682 }
2683
2684 function onTouchEnd(event) {
2685 const swiper = this;
2686 const data = swiper.touchEventsData;
2687 const pointerIndex = data.evCache.findIndex(cachedEv => cachedEv.pointerId === event.pointerId);
2688 if (pointerIndex >= 0) {
2689 data.evCache.splice(pointerIndex, 1);
2690 }
2691 if (['pointercancel', 'pointerout', 'pointerleave'].includes(event.type)) {
2692 const proceed = event.type === 'pointercancel' && (swiper.browser.isSafari || swiper.browser.isWebView);
2693 if (!proceed) {
2694 return;
2695 }
2696 }
2697 const {
2698 params,
2699 touches,
2700 rtlTranslate: rtl,
2701 slidesGrid,
2702 enabled
2703 } = swiper;
2704 if (!enabled) return;
2705 if (!params.simulateTouch && event.pointerType === 'mouse') return;
2706 let e = event;
2707 if (e.originalEvent) e = e.originalEvent;
2708 if (data.allowTouchCallbacks) {
2709 swiper.emit('touchEnd', e);
2710 }
2711 data.allowTouchCallbacks = false;
2712 if (!data.isTouched) {
2713 if (data.isMoved && params.grabCursor) {
2714 swiper.setGrabCursor(false);
2715 }
2716 data.isMoved = false;
2717 data.startMoving = false;
2718 return;
2719 }
2720 // Return Grab Cursor
2721 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2722 swiper.setGrabCursor(false);
2723 }
2724
2725 // Time diff
2726 const touchEndTime = now();
2727 const timeDiff = touchEndTime - data.touchStartTime;
2728
2729 // Tap, doubleTap, Click
2730 if (swiper.allowClick) {
2731 const pathTree = e.path || e.composedPath && e.composedPath();
2732 swiper.updateClickedSlide(pathTree && pathTree[0] || e.target);
2733 swiper.emit('tap click', e);
2734 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
2735 swiper.emit('doubleTap doubleClick', e);
2736 }
2737 }
2738 data.lastClickTime = now();
2739 nextTick(() => {
2740 if (!swiper.destroyed) swiper.allowClick = true;
2741 });
2742 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
2743 data.isTouched = false;
2744 data.isMoved = false;
2745 data.startMoving = false;
2746 return;
2747 }
2748 data.isTouched = false;
2749 data.isMoved = false;
2750 data.startMoving = false;
2751 let currentPos;
2752 if (params.followFinger) {
2753 currentPos = rtl ? swiper.translate : -swiper.translate;
2754 } else {
2755 currentPos = -data.currentTranslate;
2756 }
2757 if (params.cssMode) {
2758 return;
2759 }
2760 if (params.freeMode && params.freeMode.enabled) {
2761 swiper.freeMode.onTouchEnd({
2762 currentPos
2763 });
2764 return;
2765 }
2766
2767 // Find current slide
2768 let stopIndex = 0;
2769 let groupSize = swiper.slidesSizesGrid[0];
2770 for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
2771 const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
2772 if (typeof slidesGrid[i + increment] !== 'undefined') {
2773 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
2774 stopIndex = i;
2775 groupSize = slidesGrid[i + increment] - slidesGrid[i];
2776 }
2777 } else if (currentPos >= slidesGrid[i]) {
2778 stopIndex = i;
2779 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
2780 }
2781 }
2782 let rewindFirstIndex = null;
2783 let rewindLastIndex = null;
2784 if (params.rewind) {
2785 if (swiper.isBeginning) {
2786 rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
2787 } else if (swiper.isEnd) {
2788 rewindFirstIndex = 0;
2789 }
2790 }
2791 // Find current slide size
2792 const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
2793 const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
2794 if (timeDiff > params.longSwipesMs) {
2795 // Long touches
2796 if (!params.longSwipes) {
2797 swiper.slideTo(swiper.activeIndex);
2798 return;
2799 }
2800 if (swiper.swipeDirection === 'next') {
2801 if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
2802 }
2803 if (swiper.swipeDirection === 'prev') {
2804 if (ratio > 1 - params.longSwipesRatio) {
2805 swiper.slideTo(stopIndex + increment);
2806 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
2807 swiper.slideTo(rewindLastIndex);
2808 } else {
2809 swiper.slideTo(stopIndex);
2810 }
2811 }
2812 } else {
2813 // Short swipes
2814 if (!params.shortSwipes) {
2815 swiper.slideTo(swiper.activeIndex);
2816 return;
2817 }
2818 const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
2819 if (!isNavButtonTarget) {
2820 if (swiper.swipeDirection === 'next') {
2821 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
2822 }
2823 if (swiper.swipeDirection === 'prev') {
2824 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
2825 }
2826 } else if (e.target === swiper.navigation.nextEl) {
2827 swiper.slideTo(stopIndex + increment);
2828 } else {
2829 swiper.slideTo(stopIndex);
2830 }
2831 }
2832 }
2833
2834 function onResize() {
2835 const swiper = this;
2836 const {
2837 params,
2838 el
2839 } = swiper;
2840 if (el && el.offsetWidth === 0) return;
2841
2842 // Breakpoints
2843 if (params.breakpoints) {
2844 swiper.setBreakpoint();
2845 }
2846
2847 // Save locks
2848 const {
2849 allowSlideNext,
2850 allowSlidePrev,
2851 snapGrid
2852 } = swiper;
2853 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
2854
2855 // Disable locks on resize
2856 swiper.allowSlideNext = true;
2857 swiper.allowSlidePrev = true;
2858 swiper.updateSize();
2859 swiper.updateSlides();
2860 swiper.updateSlidesClasses();
2861 const isVirtualLoop = isVirtual && params.loop;
2862 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
2863 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
2864 } else {
2865 if (swiper.params.loop && !isVirtual) {
2866 swiper.slideToLoop(swiper.realIndex, 0, false, true);
2867 } else {
2868 swiper.slideTo(swiper.activeIndex, 0, false, true);
2869 }
2870 }
2871 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
2872 clearTimeout(swiper.autoplay.resizeTimeout);
2873 swiper.autoplay.resizeTimeout = setTimeout(() => {
2874 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
2875 swiper.autoplay.resume();
2876 }
2877 }, 500);
2878 }
2879 // Return locks after resize
2880 swiper.allowSlidePrev = allowSlidePrev;
2881 swiper.allowSlideNext = allowSlideNext;
2882 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
2883 swiper.checkOverflow();
2884 }
2885 }
2886
2887 function onClick(e) {
2888 const swiper = this;
2889 if (!swiper.enabled) return;
2890 if (!swiper.allowClick) {
2891 if (swiper.params.preventClicks) e.preventDefault();
2892 if (swiper.params.preventClicksPropagation && swiper.animating) {
2893 e.stopPropagation();
2894 e.stopImmediatePropagation();
2895 }
2896 }
2897 }
2898
2899 function onScroll() {
2900 const swiper = this;
2901 const {
2902 wrapperEl,
2903 rtlTranslate,
2904 enabled
2905 } = swiper;
2906 if (!enabled) return;
2907 swiper.previousTranslate = swiper.translate;
2908 if (swiper.isHorizontal()) {
2909 swiper.translate = -wrapperEl.scrollLeft;
2910 } else {
2911 swiper.translate = -wrapperEl.scrollTop;
2912 }
2913 // eslint-disable-next-line
2914 if (swiper.translate === 0) swiper.translate = 0;
2915 swiper.updateActiveIndex();
2916 swiper.updateSlidesClasses();
2917 let newProgress;
2918 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
2919 if (translatesDiff === 0) {
2920 newProgress = 0;
2921 } else {
2922 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
2923 }
2924 if (newProgress !== swiper.progress) {
2925 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
2926 }
2927 swiper.emit('setTranslate', swiper.translate, false);
2928 }
2929
2930 function onLoad(e) {
2931 const swiper = this;
2932 processLazyPreloader(swiper, e.target);
2933 if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
2934 return;
2935 }
2936 swiper.update();
2937 }
2938
2939 let dummyEventAttached = false;
2940 function dummyEventListener() {}
2941 const events = (swiper, method) => {
2942 const document = getDocument();
2943 const {
2944 params,
2945 el,
2946 wrapperEl,
2947 device
2948 } = swiper;
2949 const capture = !!params.nested;
2950 const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
2951 const swiperMethod = method;
2952
2953 // Touch Events
2954 el[domMethod]('pointerdown', swiper.onTouchStart, {
2955 passive: false
2956 });
2957 document[domMethod]('pointermove', swiper.onTouchMove, {
2958 passive: false,
2959 capture
2960 });
2961 document[domMethod]('pointerup', swiper.onTouchEnd, {
2962 passive: true
2963 });
2964 document[domMethod]('pointercancel', swiper.onTouchEnd, {
2965 passive: true
2966 });
2967 document[domMethod]('pointerout', swiper.onTouchEnd, {
2968 passive: true
2969 });
2970 document[domMethod]('pointerleave', swiper.onTouchEnd, {
2971 passive: true
2972 });
2973
2974 // Prevent Links Clicks
2975 if (params.preventClicks || params.preventClicksPropagation) {
2976 el[domMethod]('click', swiper.onClick, true);
2977 }
2978 if (params.cssMode) {
2979 wrapperEl[domMethod]('scroll', swiper.onScroll);
2980 }
2981
2982 // Resize handler
2983 if (params.updateOnWindowResize) {
2984 swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
2985 } else {
2986 swiper[swiperMethod]('observerUpdate', onResize, true);
2987 }
2988
2989 // Images loader
2990 el[domMethod]('load', swiper.onLoad, {
2991 capture: true
2992 });
2993 };
2994 function attachEvents() {
2995 const swiper = this;
2996 const document = getDocument();
2997 const {
2998 params
2999 } = swiper;
3000 swiper.onTouchStart = onTouchStart.bind(swiper);
3001 swiper.onTouchMove = onTouchMove.bind(swiper);
3002 swiper.onTouchEnd = onTouchEnd.bind(swiper);
3003 if (params.cssMode) {
3004 swiper.onScroll = onScroll.bind(swiper);
3005 }
3006 swiper.onClick = onClick.bind(swiper);
3007 swiper.onLoad = onLoad.bind(swiper);
3008 if (!dummyEventAttached) {
3009 document.addEventListener('touchstart', dummyEventListener);
3010 dummyEventAttached = true;
3011 }
3012 events(swiper, 'on');
3013 }
3014 function detachEvents() {
3015 const swiper = this;
3016 events(swiper, 'off');
3017 }
3018 var events$1 = {
3019 attachEvents,
3020 detachEvents
3021 };
3022
3023 const isGridEnabled = (swiper, params) => {
3024 return swiper.grid && params.grid && params.grid.rows > 1;
3025 };
3026 function setBreakpoint() {
3027 const swiper = this;
3028 const {
3029 realIndex,
3030 initialized,
3031 params,
3032 el
3033 } = swiper;
3034 const breakpoints = params.breakpoints;
3035 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
3036
3037 // Get breakpoint for window width and update parameters
3038 const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
3039 if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
3040 const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3041 const breakpointParams = breakpointOnlyParams || swiper.originalParams;
3042 const wasMultiRow = isGridEnabled(swiper, params);
3043 const isMultiRow = isGridEnabled(swiper, breakpointParams);
3044 const wasEnabled = params.enabled;
3045 if (wasMultiRow && !isMultiRow) {
3046 el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
3047 swiper.emitContainerClasses();
3048 } else if (!wasMultiRow && isMultiRow) {
3049 el.classList.add(`${params.containerModifierClass}grid`);
3050 if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
3051 el.classList.add(`${params.containerModifierClass}grid-column`);
3052 }
3053 swiper.emitContainerClasses();
3054 }
3055
3056 // Toggle navigation, pagination, scrollbar
3057 ['navigation', 'pagination', 'scrollbar'].forEach(prop => {
3058 if (typeof breakpointParams[prop] === 'undefined') return;
3059 const wasModuleEnabled = params[prop] && params[prop].enabled;
3060 const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
3061 if (wasModuleEnabled && !isModuleEnabled) {
3062 swiper[prop].disable();
3063 }
3064 if (!wasModuleEnabled && isModuleEnabled) {
3065 swiper[prop].enable();
3066 }
3067 });
3068 const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3069 const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3070 if (directionChanged && initialized) {
3071 swiper.changeDirection();
3072 }
3073 extend(swiper.params, breakpointParams);
3074 const isEnabled = swiper.params.enabled;
3075 Object.assign(swiper, {
3076 allowTouchMove: swiper.params.allowTouchMove,
3077 allowSlideNext: swiper.params.allowSlideNext,
3078 allowSlidePrev: swiper.params.allowSlidePrev
3079 });
3080 if (wasEnabled && !isEnabled) {
3081 swiper.disable();
3082 } else if (!wasEnabled && isEnabled) {
3083 swiper.enable();
3084 }
3085 swiper.currentBreakpoint = breakpoint;
3086 swiper.emit('_beforeBreakpoint', breakpointParams);
3087 if (needsReLoop && initialized) {
3088 swiper.loopDestroy();
3089 swiper.loopCreate(realIndex);
3090 swiper.updateSlides();
3091 }
3092 swiper.emit('breakpoint', breakpointParams);
3093 }
3094
3095 function getBreakpoint(breakpoints, base, containerEl) {
3096 if (base === void 0) {
3097 base = 'window';
3098 }
3099 if (!breakpoints || base === 'container' && !containerEl) return undefined;
3100 let breakpoint = false;
3101 const window = getWindow();
3102 const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
3103 const points = Object.keys(breakpoints).map(point => {
3104 if (typeof point === 'string' && point.indexOf('@') === 0) {
3105 const minRatio = parseFloat(point.substr(1));
3106 const value = currentHeight * minRatio;
3107 return {
3108 value,
3109 point
3110 };
3111 }
3112 return {
3113 value: point,
3114 point
3115 };
3116 });
3117 points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
3118 for (let i = 0; i < points.length; i += 1) {
3119 const {
3120 point,
3121 value
3122 } = points[i];
3123 if (base === 'window') {
3124 if (window.matchMedia(`(min-width: ${value}px)`).matches) {
3125 breakpoint = point;
3126 }
3127 } else if (value <= containerEl.clientWidth) {
3128 breakpoint = point;
3129 }
3130 }
3131 return breakpoint || 'max';
3132 }
3133
3134 var breakpoints = {
3135 setBreakpoint,
3136 getBreakpoint
3137 };
3138
3139 function prepareClasses(entries, prefix) {
3140 const resultClasses = [];
3141 entries.forEach(item => {
3142 if (typeof item === 'object') {
3143 Object.keys(item).forEach(classNames => {
3144 if (item[classNames]) {
3145 resultClasses.push(prefix + classNames);
3146 }
3147 });
3148 } else if (typeof item === 'string') {
3149 resultClasses.push(prefix + item);
3150 }
3151 });
3152 return resultClasses;
3153 }
3154 function addClasses() {
3155 const swiper = this;
3156 const {
3157 classNames,
3158 params,
3159 rtl,
3160 el,
3161 device
3162 } = swiper;
3163 // prettier-ignore
3164 const suffixes = prepareClasses(['initialized', params.direction, {
3165 'free-mode': swiper.params.freeMode && params.freeMode.enabled
3166 }, {
3167 'autoheight': params.autoHeight
3168 }, {
3169 'rtl': rtl
3170 }, {
3171 'grid': params.grid && params.grid.rows > 1
3172 }, {
3173 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
3174 }, {
3175 'android': device.android
3176 }, {
3177 'ios': device.ios
3178 }, {
3179 'css-mode': params.cssMode
3180 }, {
3181 'centered': params.cssMode && params.centeredSlides
3182 }, {
3183 'watch-progress': params.watchSlidesProgress
3184 }], params.containerModifierClass);
3185 classNames.push(...suffixes);
3186 el.classList.add(...classNames);
3187 swiper.emitContainerClasses();
3188 }
3189
3190 function removeClasses() {
3191 const swiper = this;
3192 const {
3193 el,
3194 classNames
3195 } = swiper;
3196 el.classList.remove(...classNames);
3197 swiper.emitContainerClasses();
3198 }
3199
3200 var classes = {
3201 addClasses,
3202 removeClasses
3203 };
3204
3205 function checkOverflow() {
3206 const swiper = this;
3207 const {
3208 isLocked: wasLocked,
3209 params
3210 } = swiper;
3211 const {
3212 slidesOffsetBefore
3213 } = params;
3214 if (slidesOffsetBefore) {
3215 const lastSlideIndex = swiper.slides.length - 1;
3216 const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
3217 swiper.isLocked = swiper.size > lastSlideRightEdge;
3218 } else {
3219 swiper.isLocked = swiper.snapGrid.length === 1;
3220 }
3221 if (params.allowSlideNext === true) {
3222 swiper.allowSlideNext = !swiper.isLocked;
3223 }
3224 if (params.allowSlidePrev === true) {
3225 swiper.allowSlidePrev = !swiper.isLocked;
3226 }
3227 if (wasLocked && wasLocked !== swiper.isLocked) {
3228 swiper.isEnd = false;
3229 }
3230 if (wasLocked !== swiper.isLocked) {
3231 swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
3232 }
3233 }
3234 var checkOverflow$1 = {
3235 checkOverflow
3236 };
3237
3238 var defaults = {
3239 init: true,
3240 direction: 'horizontal',
3241 oneWayMovement: false,
3242 touchEventsTarget: 'wrapper',
3243 initialSlide: 0,
3244 speed: 300,
3245 cssMode: false,
3246 updateOnWindowResize: true,
3247 resizeObserver: true,
3248 nested: false,
3249 createElements: false,
3250 enabled: true,
3251 focusableElements: 'input, select, option, textarea, button, video, label',
3252 // Overrides
3253 width: null,
3254 height: null,
3255 //
3256 preventInteractionOnTransition: false,
3257 // ssr
3258 userAgent: null,
3259 url: null,
3260 // To support iOS's swipe-to-go-back gesture (when being used in-app).
3261 edgeSwipeDetection: false,
3262 edgeSwipeThreshold: 20,
3263 // Autoheight
3264 autoHeight: false,
3265 // Set wrapper width
3266 setWrapperSize: false,
3267 // Virtual Translate
3268 virtualTranslate: false,
3269 // Effects
3270 effect: 'slide',
3271 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3272
3273 // Breakpoints
3274 breakpoints: undefined,
3275 breakpointsBase: 'window',
3276 // Slides grid
3277 spaceBetween: 0,
3278 slidesPerView: 1,
3279 slidesPerGroup: 1,
3280 slidesPerGroupSkip: 0,
3281 slidesPerGroupAuto: false,
3282 centeredSlides: false,
3283 centeredSlidesBounds: false,
3284 slidesOffsetBefore: 0,
3285 // in px
3286 slidesOffsetAfter: 0,
3287 // in px
3288 normalizeSlideIndex: true,
3289 centerInsufficientSlides: false,
3290 // Disable swiper and hide navigation when container not overflow
3291 watchOverflow: true,
3292 // Round length
3293 roundLengths: false,
3294 // Touches
3295 touchRatio: 1,
3296 touchAngle: 45,
3297 simulateTouch: true,
3298 shortSwipes: true,
3299 longSwipes: true,
3300 longSwipesRatio: 0.5,
3301 longSwipesMs: 300,
3302 followFinger: true,
3303 allowTouchMove: true,
3304 threshold: 5,
3305 touchMoveStopPropagation: false,
3306 touchStartPreventDefault: true,
3307 touchStartForcePreventDefault: false,
3308 touchReleaseOnEdges: false,
3309 // Unique Navigation Elements
3310 uniqueNavElements: true,
3311 // Resistance
3312 resistance: true,
3313 resistanceRatio: 0.85,
3314 // Progress
3315 watchSlidesProgress: false,
3316 // Cursor
3317 grabCursor: false,
3318 // Clicks
3319 preventClicks: true,
3320 preventClicksPropagation: true,
3321 slideToClickedSlide: false,
3322 // loop
3323 loop: false,
3324 loopedSlides: null,
3325 loopPreventsSliding: true,
3326 // rewind
3327 rewind: false,
3328 // Swiping/no swiping
3329 allowSlidePrev: true,
3330 allowSlideNext: true,
3331 swipeHandler: null,
3332 // '.swipe-handler',
3333 noSwiping: true,
3334 noSwipingClass: 'swiper-no-swiping',
3335 noSwipingSelector: null,
3336 // Passive Listeners
3337 passiveListeners: true,
3338 maxBackfaceHiddenSlides: 10,
3339 // NS
3340 containerModifierClass: 'swiper-',
3341 // NEW
3342 slideClass: 'swiper-slide',
3343 slideActiveClass: 'swiper-slide-active',
3344 slideVisibleClass: 'swiper-slide-visible',
3345 slideNextClass: 'swiper-slide-next',
3346 slidePrevClass: 'swiper-slide-prev',
3347 wrapperClass: 'swiper-wrapper',
3348 lazyPreloaderClass: 'swiper-lazy-preloader',
3349 lazyPreloadPrevNext: 0,
3350 // Callbacks
3351 runCallbacksOnInit: true,
3352 // Internals
3353 _emitClasses: false
3354 };
3355
3356 function moduleExtendParams(params, allModulesParams) {
3357 return function extendParams(obj) {
3358 if (obj === void 0) {
3359 obj = {};
3360 }
3361 const moduleParamName = Object.keys(obj)[0];
3362 const moduleParams = obj[moduleParamName];
3363 if (typeof moduleParams !== 'object' || moduleParams === null) {
3364 extend(allModulesParams, obj);
3365 return;
3366 }
3367 if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {
3368 params[moduleParamName] = {
3369 auto: true
3370 };
3371 }
3372 if (!(moduleParamName in params && 'enabled' in moduleParams)) {
3373 extend(allModulesParams, obj);
3374 return;
3375 }
3376 if (params[moduleParamName] === true) {
3377 params[moduleParamName] = {
3378 enabled: true
3379 };
3380 }
3381 if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
3382 params[moduleParamName].enabled = true;
3383 }
3384 if (!params[moduleParamName]) params[moduleParamName] = {
3385 enabled: false
3386 };
3387 extend(allModulesParams, obj);
3388 };
3389 }
3390
3391 /* eslint no-param-reassign: "off" */
3392 const prototypes = {
3393 eventsEmitter,
3394 update,
3395 translate,
3396 transition,
3397 slide,
3398 loop,
3399 grabCursor,
3400 events: events$1,
3401 breakpoints,
3402 checkOverflow: checkOverflow$1,
3403 classes
3404 };
3405 const extendedDefaults = {};
3406 class Swiper {
3407 constructor() {
3408 let el;
3409 let params;
3410 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3411 args[_key] = arguments[_key];
3412 }
3413 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
3414 params = args[0];
3415 } else {
3416 [el, params] = args;
3417 }
3418 if (!params) params = {};
3419 params = extend({}, params);
3420 if (el && !params.el) params.el = el;
3421 const document = getDocument();
3422 if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
3423 const swipers = [];
3424 document.querySelectorAll(params.el).forEach(containerEl => {
3425 const newParams = extend({}, params, {
3426 el: containerEl
3427 });
3428 swipers.push(new Swiper(newParams));
3429 });
3430 // eslint-disable-next-line no-constructor-return
3431 return swipers;
3432 }
3433
3434 // Swiper Instance
3435 const swiper = this;
3436 swiper.__swiper__ = true;
3437 swiper.support = getSupport();
3438 swiper.device = getDevice({
3439 userAgent: params.userAgent
3440 });
3441 swiper.browser = getBrowser();
3442 swiper.eventsListeners = {};
3443 swiper.eventsAnyListeners = [];
3444 swiper.modules = [...swiper.__modules__];
3445 if (params.modules && Array.isArray(params.modules)) {
3446 swiper.modules.push(...params.modules);
3447 }
3448 const allModulesParams = {};
3449 swiper.modules.forEach(mod => {
3450 mod({
3451 params,
3452 swiper,
3453 extendParams: moduleExtendParams(params, allModulesParams),
3454 on: swiper.on.bind(swiper),
3455 once: swiper.once.bind(swiper),
3456 off: swiper.off.bind(swiper),
3457 emit: swiper.emit.bind(swiper)
3458 });
3459 });
3460
3461 // Extend defaults with modules params
3462 const swiperParams = extend({}, defaults, allModulesParams);
3463
3464 // Extend defaults with passed params
3465 swiper.params = extend({}, swiperParams, extendedDefaults, params);
3466 swiper.originalParams = extend({}, swiper.params);
3467 swiper.passedParams = extend({}, params);
3468
3469 // add event listeners
3470 if (swiper.params && swiper.params.on) {
3471 Object.keys(swiper.params.on).forEach(eventName => {
3472 swiper.on(eventName, swiper.params.on[eventName]);
3473 });
3474 }
3475 if (swiper.params && swiper.params.onAny) {
3476 swiper.onAny(swiper.params.onAny);
3477 }
3478
3479 // Extend Swiper
3480 Object.assign(swiper, {
3481 enabled: swiper.params.enabled,
3482 el,
3483 // Classes
3484 classNames: [],
3485 // Slides
3486 slides: [],
3487 slidesGrid: [],
3488 snapGrid: [],
3489 slidesSizesGrid: [],
3490 // isDirection
3491 isHorizontal() {
3492 return swiper.params.direction === 'horizontal';
3493 },
3494 isVertical() {
3495 return swiper.params.direction === 'vertical';
3496 },
3497 // Indexes
3498 activeIndex: 0,
3499 realIndex: 0,
3500 //
3501 isBeginning: true,
3502 isEnd: false,
3503 // Props
3504 translate: 0,
3505 previousTranslate: 0,
3506 progress: 0,
3507 velocity: 0,
3508 animating: false,
3509 cssOverflowAdjustment() {
3510 // Returns 0 unless `translate` is > 2**23
3511 // Should be subtracted from css values to prevent overflow
3512 return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
3513 },
3514 // Locks
3515 allowSlideNext: swiper.params.allowSlideNext,
3516 allowSlidePrev: swiper.params.allowSlidePrev,
3517 // Touch Events
3518 touchEventsData: {
3519 isTouched: undefined,
3520 isMoved: undefined,
3521 allowTouchCallbacks: undefined,
3522 touchStartTime: undefined,
3523 isScrolling: undefined,
3524 currentTranslate: undefined,
3525 startTranslate: undefined,
3526 allowThresholdMove: undefined,
3527 // Form elements to match
3528 focusableElements: swiper.params.focusableElements,
3529 // Last click time
3530 lastClickTime: 0,
3531 clickTimeout: undefined,
3532 // Velocities
3533 velocities: [],
3534 allowMomentumBounce: undefined,
3535 startMoving: undefined,
3536 evCache: []
3537 },
3538 // Clicks
3539 allowClick: true,
3540 // Touches
3541 allowTouchMove: swiper.params.allowTouchMove,
3542 touches: {
3543 startX: 0,
3544 startY: 0,
3545 currentX: 0,
3546 currentY: 0,
3547 diff: 0
3548 },
3549 // Images
3550 imagesToLoad: [],
3551 imagesLoaded: 0
3552 });
3553 swiper.emit('_swiper');
3554
3555 // Init
3556 if (swiper.params.init) {
3557 swiper.init();
3558 }
3559
3560 // Return app instance
3561 // eslint-disable-next-line no-constructor-return
3562 return swiper;
3563 }
3564 getSlideIndex(slideEl) {
3565 const {
3566 slidesEl,
3567 params
3568 } = this;
3569 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3570 const firstSlideIndex = elementIndex(slides[0]);
3571 return elementIndex(slideEl) - firstSlideIndex;
3572 }
3573 getSlideIndexByData(index) {
3574 return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);
3575 }
3576 recalcSlides() {
3577 const swiper = this;
3578 const {
3579 slidesEl,
3580 params
3581 } = swiper;
3582 swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3583 }
3584 enable() {
3585 const swiper = this;
3586 if (swiper.enabled) return;
3587 swiper.enabled = true;
3588 if (swiper.params.grabCursor) {
3589 swiper.setGrabCursor();
3590 }
3591 swiper.emit('enable');
3592 }
3593 disable() {
3594 const swiper = this;
3595 if (!swiper.enabled) return;
3596 swiper.enabled = false;
3597 if (swiper.params.grabCursor) {
3598 swiper.unsetGrabCursor();
3599 }
3600 swiper.emit('disable');
3601 }
3602 setProgress(progress, speed) {
3603 const swiper = this;
3604 progress = Math.min(Math.max(progress, 0), 1);
3605 const min = swiper.minTranslate();
3606 const max = swiper.maxTranslate();
3607 const current = (max - min) * progress + min;
3608 swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
3609 swiper.updateActiveIndex();
3610 swiper.updateSlidesClasses();
3611 }
3612 emitContainerClasses() {
3613 const swiper = this;
3614 if (!swiper.params._emitClasses || !swiper.el) return;
3615 const cls = swiper.el.className.split(' ').filter(className => {
3616 return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
3617 });
3618 swiper.emit('_containerClasses', cls.join(' '));
3619 }
3620 getSlideClasses(slideEl) {
3621 const swiper = this;
3622 if (swiper.destroyed) return '';
3623 return slideEl.className.split(' ').filter(className => {
3624 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
3625 }).join(' ');
3626 }
3627 emitSlidesClasses() {
3628 const swiper = this;
3629 if (!swiper.params._emitClasses || !swiper.el) return;
3630 const updates = [];
3631 swiper.slides.forEach(slideEl => {
3632 const classNames = swiper.getSlideClasses(slideEl);
3633 updates.push({
3634 slideEl,
3635 classNames
3636 });
3637 swiper.emit('_slideClass', slideEl, classNames);
3638 });
3639 swiper.emit('_slideClasses', updates);
3640 }
3641 slidesPerViewDynamic(view, exact) {
3642 if (view === void 0) {
3643 view = 'current';
3644 }
3645 if (exact === void 0) {
3646 exact = false;
3647 }
3648 const swiper = this;
3649 const {
3650 params,
3651 slides,
3652 slidesGrid,
3653 slidesSizesGrid,
3654 size: swiperSize,
3655 activeIndex
3656 } = swiper;
3657 let spv = 1;
3658 if (params.centeredSlides) {
3659 let slideSize = slides[activeIndex] ? slides[activeIndex].swiperSlideSize : 0;
3660 let breakLoop;
3661 for (let i = activeIndex + 1; i < slides.length; i += 1) {
3662 if (slides[i] && !breakLoop) {
3663 slideSize += slides[i].swiperSlideSize;
3664 spv += 1;
3665 if (slideSize > swiperSize) breakLoop = true;
3666 }
3667 }
3668 for (let i = activeIndex - 1; i >= 0; i -= 1) {
3669 if (slides[i] && !breakLoop) {
3670 slideSize += slides[i].swiperSlideSize;
3671 spv += 1;
3672 if (slideSize > swiperSize) breakLoop = true;
3673 }
3674 }
3675 } else {
3676 // eslint-disable-next-line
3677 if (view === 'current') {
3678 for (let i = activeIndex + 1; i < slides.length; i += 1) {
3679 const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
3680 if (slideInView) {
3681 spv += 1;
3682 }
3683 }
3684 } else {
3685 // previous
3686 for (let i = activeIndex - 1; i >= 0; i -= 1) {
3687 const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
3688 if (slideInView) {
3689 spv += 1;
3690 }
3691 }
3692 }
3693 }
3694 return spv;
3695 }
3696 update() {
3697 const swiper = this;
3698 if (!swiper || swiper.destroyed) return;
3699 const {
3700 snapGrid,
3701 params
3702 } = swiper;
3703 // Breakpoints
3704 if (params.breakpoints) {
3705 swiper.setBreakpoint();
3706 }
3707 [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
3708 if (imageEl.complete) {
3709 processLazyPreloader(swiper, imageEl);
3710 }
3711 });
3712 swiper.updateSize();
3713 swiper.updateSlides();
3714 swiper.updateProgress();
3715 swiper.updateSlidesClasses();
3716 function setTranslate() {
3717 const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
3718 const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
3719 swiper.setTranslate(newTranslate);
3720 swiper.updateActiveIndex();
3721 swiper.updateSlidesClasses();
3722 }
3723 let translated;
3724 if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
3725 setTranslate();
3726 if (params.autoHeight) {
3727 swiper.updateAutoHeight();
3728 }
3729 } else {
3730 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
3731 const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
3732 translated = swiper.slideTo(slides.length - 1, 0, false, true);
3733 } else {
3734 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
3735 }
3736 if (!translated) {
3737 setTranslate();
3738 }
3739 }
3740 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
3741 swiper.checkOverflow();
3742 }
3743 swiper.emit('update');
3744 }
3745 changeDirection(newDirection, needUpdate) {
3746 if (needUpdate === void 0) {
3747 needUpdate = true;
3748 }
3749 const swiper = this;
3750 const currentDirection = swiper.params.direction;
3751 if (!newDirection) {
3752 // eslint-disable-next-line
3753 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
3754 }
3755 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
3756 return swiper;
3757 }
3758 swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
3759 swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
3760 swiper.emitContainerClasses();
3761 swiper.params.direction = newDirection;
3762 swiper.slides.forEach(slideEl => {
3763 if (newDirection === 'vertical') {
3764 slideEl.style.width = '';
3765 } else {
3766 slideEl.style.height = '';
3767 }
3768 });
3769 swiper.emit('changeDirection');
3770 if (needUpdate) swiper.update();
3771 return swiper;
3772 }
3773 changeLanguageDirection(direction) {
3774 const swiper = this;
3775 if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
3776 swiper.rtl = direction === 'rtl';
3777 swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
3778 if (swiper.rtl) {
3779 swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
3780 swiper.el.dir = 'rtl';
3781 } else {
3782 swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
3783 swiper.el.dir = 'ltr';
3784 }
3785 swiper.update();
3786 }
3787 mount(element) {
3788 const swiper = this;
3789 if (swiper.mounted) return true;
3790
3791 // Find el
3792 let el = element || swiper.params.el;
3793 if (typeof el === 'string') {
3794 el = document.querySelector(el);
3795 }
3796 if (!el) {
3797 return false;
3798 }
3799 el.swiper = swiper;
3800 if (el.parentNode && el.parentNode.host) {
3801 swiper.isElement = true;
3802 }
3803 const getWrapperSelector = () => {
3804 return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;
3805 };
3806 const getWrapper = () => {
3807 if (el && el.shadowRoot && el.shadowRoot.querySelector) {
3808 const res = el.shadowRoot.querySelector(getWrapperSelector());
3809 // Children needs to return slot items
3810 return res;
3811 }
3812 return elementChildren(el, getWrapperSelector())[0];
3813 };
3814 // Find Wrapper
3815 let wrapperEl = getWrapper();
3816 if (!wrapperEl && swiper.params.createElements) {
3817 wrapperEl = createElement('div', swiper.params.wrapperClass);
3818 el.append(wrapperEl);
3819 elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {
3820 wrapperEl.append(slideEl);
3821 });
3822 }
3823 Object.assign(swiper, {
3824 el,
3825 wrapperEl,
3826 slidesEl: swiper.isElement ? el.parentNode.host : wrapperEl,
3827 hostEl: swiper.isElement ? el.parentNode.host : el,
3828 mounted: true,
3829 // RTL
3830 rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',
3831 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),
3832 wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'
3833 });
3834 return true;
3835 }
3836 init(el) {
3837 const swiper = this;
3838 if (swiper.initialized) return swiper;
3839 const mounted = swiper.mount(el);
3840 if (mounted === false) return swiper;
3841 swiper.emit('beforeInit');
3842
3843 // Set breakpoint
3844 if (swiper.params.breakpoints) {
3845 swiper.setBreakpoint();
3846 }
3847
3848 // Add Classes
3849 swiper.addClasses();
3850
3851 // Update size
3852 swiper.updateSize();
3853
3854 // Update slides
3855 swiper.updateSlides();
3856 if (swiper.params.watchOverflow) {
3857 swiper.checkOverflow();
3858 }
3859
3860 // Set Grab Cursor
3861 if (swiper.params.grabCursor && swiper.enabled) {
3862 swiper.setGrabCursor();
3863 }
3864
3865 // Slide To Initial Slide
3866 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
3867 swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
3868 } else {
3869 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
3870 }
3871
3872 // Create loop
3873 if (swiper.params.loop) {
3874 swiper.loopCreate();
3875 }
3876
3877 // Attach events
3878 swiper.attachEvents();
3879 [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
3880 if (imageEl.complete) {
3881 processLazyPreloader(swiper, imageEl);
3882 } else {
3883 imageEl.addEventListener('load', e => {
3884 processLazyPreloader(swiper, e.target);
3885 });
3886 }
3887 });
3888 preload(swiper);
3889
3890 // Init Flag
3891 swiper.initialized = true;
3892 preload(swiper);
3893
3894 // Emit
3895 swiper.emit('init');
3896 swiper.emit('afterInit');
3897 return swiper;
3898 }
3899 destroy(deleteInstance, cleanStyles) {
3900 if (deleteInstance === void 0) {
3901 deleteInstance = true;
3902 }
3903 if (cleanStyles === void 0) {
3904 cleanStyles = true;
3905 }
3906 const swiper = this;
3907 const {
3908 params,
3909 el,
3910 wrapperEl,
3911 slides
3912 } = swiper;
3913 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
3914 return null;
3915 }
3916 swiper.emit('beforeDestroy');
3917
3918 // Init Flag
3919 swiper.initialized = false;
3920
3921 // Detach events
3922 swiper.detachEvents();
3923
3924 // Destroy loop
3925 if (params.loop) {
3926 swiper.loopDestroy();
3927 }
3928
3929 // Cleanup styles
3930 if (cleanStyles) {
3931 swiper.removeClasses();
3932 el.removeAttribute('style');
3933 wrapperEl.removeAttribute('style');
3934 if (slides && slides.length) {
3935 slides.forEach(slideEl => {
3936 slideEl.classList.remove(params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
3937 slideEl.removeAttribute('style');
3938 slideEl.removeAttribute('data-swiper-slide-index');
3939 });
3940 }
3941 }
3942 swiper.emit('destroy');
3943
3944 // Detach emitter events
3945 Object.keys(swiper.eventsListeners).forEach(eventName => {
3946 swiper.off(eventName);
3947 });
3948 if (deleteInstance !== false) {
3949 swiper.el.swiper = null;
3950 deleteProps(swiper);
3951 }
3952 swiper.destroyed = true;
3953 return null;
3954 }
3955 static extendDefaults(newDefaults) {
3956 extend(extendedDefaults, newDefaults);
3957 }
3958 static get extendedDefaults() {
3959 return extendedDefaults;
3960 }
3961 static get defaults() {
3962 return defaults;
3963 }
3964 static installModule(mod) {
3965 if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
3966 const modules = Swiper.prototype.__modules__;
3967 if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
3968 modules.push(mod);
3969 }
3970 }
3971 static use(module) {
3972 if (Array.isArray(module)) {
3973 module.forEach(m => Swiper.installModule(m));
3974 return Swiper;
3975 }
3976 Swiper.installModule(module);
3977 return Swiper;
3978 }
3979 }
3980 Object.keys(prototypes).forEach(prototypeGroup => {
3981 Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {
3982 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
3983 });
3984 });
3985 Swiper.use([Resize, Observer]);
3986
3987 return Swiper;
3988
3989})();