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