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