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