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