1// 2// A11Y: Text 3// 4 5var a11yText = { 6 'next': 'Show next slide', 7 'prev': 'Show previous slide', 8 'paginationBulletMessage': 'Go to slide {{index}}' 9}; 10if (document.getElementsByTagName('html')[0].getAttribute('lang') == 'de') { 11 a11yText = { 12 'next': 'Nächsten Slide anzeigen', 13 'prev': 'Vorherigen Slide anzeigen', 14 'paginationBulletMessage': 'Zeige Inhalt {{index}}' 15 }; 16}
vendor: 30,096 bytes, lines 16-1307
16 17 18/** 19 * SSR Window 4.0.2 20 * Better handling for window object in SSR environment 21 * https://github.com/nolimits4web/ssr-window 22 * 23 * Copyright 2021, Vladimir Kharlampidi 24 * 25 * Licensed under MIT 26 * 27 * Released on: December 13, 2021 28 */ 29/* eslint-disable no-param-reassign */ 30function isObject$1(obj) { 31 return (obj !== null && 32 typeof obj === 'object' && 33 'constructor' in obj && 34 obj.constructor === Object); 35} 36function extend$1(target = {}, src = {}) { 37 Object.keys(src).forEach((key) => { 38 if (typeof target[key] === 'undefined') 39 target[key] = src[key]; 40 else if (isObject$1(src[key]) && 41 isObject$1(target[key]) && 42 Object.keys(src[key]).length > 0) { 43 extend$1(target[key], src[key]); 44 } 45 }); 46} 47 48const ssrDocument = { 49 body: {}, 50 addEventListener() { }, 51 removeEventListener() { }, 52 activeElement: { 53 blur() { }, 54 nodeName: '', 55 }, 56 querySelector() { 57 return null; 58 }, 59 querySelectorAll() { 60 return []; 61 }, 62 getElementById() { 63 return null; 64 }, 65 createEvent() { 66 return { 67 initEvent() { }, 68 }; 69 }, 70 createElement() { 71 return { 72 children: [], 73 childNodes: [], 74 style: {}, 75 setAttribute() { }, 76 getElementsByTagName() { 77 return []; 78 }, 79 }; 80 }, 81 createElementNS() { 82 return {}; 83 }, 84 importNode() { 85 return null; 86 }, 87 location: { 88 hash: '', 89 host: '', 90 hostname: '', 91 href: '', 92 origin: '', 93 pathname: '', 94 protocol: '', 95 search: '', 96 }, 97}; 98function getDocument() { 99 const doc = typeof document !== 'undefined' ? document : {}; 100 extend$1(doc, ssrDocument); 101 return doc; 102} 103 104const ssrWindow = { 105 document: ssrDocument, 106 navigator: { 107 userAgent: '', 108 }, 109 location: { 110 hash: '', 111 host: '', 112 hostname: '', 113 href: '', 114 origin: '', 115 pathname: '', 116 protocol: '', 117 search: '', 118 }, 119 history: { 120 replaceState() { }, 121 pushState() { }, 122 go() { }, 123 back() { }, 124 }, 125 CustomEvent: function CustomEvent() { 126 return this; 127 }, 128 addEventListener() { }, 129 removeEventListener() { }, 130 getComputedStyle() { 131 return { 132 getPropertyValue() { 133 return ''; 134 }, 135 }; 136 }, 137 Image() { }, 138 Date() { }, 139 screen: {}, 140 setTimeout() { }, 141 clearTimeout() { }, 142 matchMedia() { 143 return {}; 144 }, 145 requestAnimationFrame(callback) { 146 if (typeof setTimeout === 'undefined') { 147 callback(); 148 return null; 149 } 150 return setTimeout(callback, 0); 151 }, 152 cancelAnimationFrame(id) { 153 if (typeof setTimeout === 'undefined') { 154 return; 155 } 156 clearTimeout(id); 157 }, 158}; 159function getWindow() { 160 const win = typeof window !== 'undefined' ? window : {}; 161 extend$1(win, ssrWindow); 162 return win; 163} 164 165/** 166 * Dom7 4.0.6 167 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API 168 * https://framework7.io/docs/dom7.html 169 * 170 * Copyright 2023, Vladimir Kharlampidi 171 * 172 * Licensed under MIT 173 * 174 * Released on: February 2, 2023 175 */ 176 177/* eslint-disable no-proto */ 178function makeReactive(obj) { 179 const proto = obj.__proto__; 180 Object.defineProperty(obj, '__proto__', { 181 get() { 182 return proto; 183 }, 184 185 set(value) { 186 proto.__proto__ = value; 187 } 188 189 }); 190} 191 192class Dom7 extends Array { 193 constructor(items) { 194 if (typeof items === 'number') { 195 super(items); 196 } else { 197 super(...(items || [])); 198 makeReactive(this); 199 } 200 } 201 202} 203 204function arrayFlat(arr = []) { 205 const res = []; 206 arr.forEach(el => { 207 if (Array.isArray(el)) { 208 res.push(...arrayFlat(el)); 209 } else { 210 res.push(el); 211 } 212 }); 213 return res; 214} 215function arrayFilter(arr, callback) { 216 return Array.prototype.filter.call(arr, callback); 217} 218function arrayUnique(arr) { 219 const uniqueArray = []; 220 221 for (let i = 0; i < arr.length; i += 1) { 222 if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); 223 } 224 225 return uniqueArray; 226} 227 228// eslint-disable-next-line 229 230function qsa(selector, context) { 231 if (typeof selector !== 'string') { 232 return [selector]; 233 } 234 235 const a = []; 236 const res = context.querySelectorAll(selector); 237 238 for (let i = 0; i < res.length; i += 1) { 239 a.push(res[i]); 240 } 241 242 return a; 243} 244 245function $(selector, context) { 246 const window = getWindow(); 247 const document = getDocument(); 248 let arr = []; 249 250 if (!context && selector instanceof Dom7) { 251 return selector; 252 } 253 254 if (!selector) { 255 return new Dom7(arr); 256 } 257 258 if (typeof selector === 'string') { 259 const html = selector.trim(); 260 261 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) { 262 let toCreate = 'div'; 263 if (html.indexOf('<li') === 0) toCreate = 'ul'; 264 if (html.indexOf('<tr') === 0) toCreate = 'tbody'; 265 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr'; 266 if (html.indexOf('<tbody') === 0) toCreate = 'table'; 267 if (html.indexOf('<option') === 0) toCreate = 'select'; 268 const tempParent = document.createElement(toCreate); 269 tempParent.innerHTML = html; 270 271 for (let i = 0; i < tempParent.childNodes.length; i += 1) { 272 arr.push(tempParent.childNodes[i]); 273 } 274 } else { 275 arr = qsa(selector.trim(), context || document); 276 } // arr = qsa(selector, document); 277 278 } else if (selector.nodeType || selector === window || selector === document) { 279 arr.push(selector); 280 } else if (Array.isArray(selector)) { 281 if (selector instanceof Dom7) return selector; 282 arr = selector; 283 } 284 285 return new Dom7(arrayUnique(arr)); 286} 287 288$.fn = Dom7.prototype; 289 290// eslint-disable-next-line 291 292function addClass(...classes) { 293 const classNames = arrayFlat(classes.map(c => c.split(' '))); 294 this.forEach(el => { 295 el.classList.add(...classNames); 296 }); 297 return this; 298} 299 300function removeClass(...classes) { 301 const classNames = arrayFlat(classes.map(c => c.split(' '))); 302 this.forEach(el => { 303 el.classList.remove(...classNames); 304 }); 305 return this; 306} 307 308function toggleClass(...classes) { 309 const classNames = arrayFlat(classes.map(c => c.split(' '))); 310 this.forEach(el => { 311 classNames.forEach(className => { 312 el.classList.toggle(className); 313 }); 314 }); 315} 316 317function hasClass(...classes) { 318 const classNames = arrayFlat(classes.map(c => c.split(' '))); 319 return arrayFilter(this, el => { 320 return classNames.filter(className => el.classList.contains(className)).length > 0; 321 }).length > 0; 322} 323 324function attr(attrs, value) { 325 if (arguments.length === 1 && typeof attrs === 'string') { 326 // Get attr 327 if (this[0]) return this[0].getAttribute(attrs); 328 return undefined; 329 } // Set attrs 330 331 332 for (let i = 0; i < this.length; i += 1) { 333 if (arguments.length === 2) { 334 // String 335 this[i].setAttribute(attrs, value); 336 } else { 337 // Object 338 for (const attrName in attrs) { 339 this[i][attrName] = attrs[attrName]; 340 this[i].setAttribute(attrName, attrs[attrName]); 341 } 342 } 343 } 344 345 return this; 346} 347 348function removeAttr(attr) { 349 for (let i = 0; i < this.length; i += 1) { 350 this[i].removeAttribute(attr); 351 } 352 353 return this; 354} 355 356function transform(transform) { 357 for (let i = 0; i < this.length; i += 1) { 358 this[i].style.transform = transform; 359 } 360 361 return this; 362} 363 364function transition$1(duration) { 365 for (let i = 0; i < this.length; i += 1) { 366 this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration; 367 } 368 369 return this; 370} 371 372function on(...args) { 373 let [eventType, targetSelector, listener, capture] = args; 374 375 if (typeof args[1] === 'function') { 376 [eventType, listener, capture] = args; 377 targetSelector = undefined; 378 } 379 380 if (!capture) capture = false; 381 382 function handleLiveEvent(e) { 383 const target = e.target; 384 if (!target) return; 385 const eventData = e.target.dom7EventData || []; 386 387 if (eventData.indexOf(e) < 0) { 388 eventData.unshift(e); 389 } 390 391 if ($(target).is(targetSelector)) listener.apply(target, eventData);else { 392 const parents = $(target).parents(); // eslint-disable-line 393 394 for (let k = 0; k < parents.length; k += 1) { 395 if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData); 396 } 397 } 398 } 399 400 function handleEvent(e) { 401 const eventData = e && e.target ? e.target.dom7EventData || [] : []; 402 403 if (eventData.indexOf(e) < 0) { 404 eventData.unshift(e); 405 } 406 407 listener.apply(this, eventData); 408 } 409 410 const events = eventType.split(' '); 411 let j; 412 413 for (let i = 0; i < this.length; i += 1) { 414 const el = this[i]; 415 416 if (!targetSelector) { 417 for (j = 0; j < events.length; j += 1) { 418 const event = events[j]; 419 if (!el.dom7Listeners) el.dom7Listeners = {}; 420 if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; 421 el.dom7Listeners[event].push({ 422 listener, 423 proxyListener: handleEvent 424 }); 425 el.addEventListener(event, handleEvent, capture); 426 } 427 } else { 428 // Live events 429 for (j = 0; j < events.length; j += 1) { 430 const event = events[j]; 431 if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; 432 if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; 433 el.dom7LiveListeners[event].push({ 434 listener, 435 proxyListener: handleLiveEvent 436 }); 437 el.addEventListener(event, handleLiveEvent, capture); 438 } 439 } 440 } 441 442 return this; 443} 444 445function off(...args) { 446 let [eventType, targetSelector, listener, capture] = args; 447 448 if (typeof args[1] === 'function') { 449 [eventType, listener, capture] = args; 450 targetSelector = undefined; 451 } 452 453 if (!capture) capture = false; 454 const events = eventType.split(' '); 455 456 for (let i = 0; i < events.length; i += 1) { 457 const event = events[i]; 458 459 for (let j = 0; j < this.length; j += 1) { 460 const el = this[j]; 461 let handlers; 462 463 if (!targetSelector && el.dom7Listeners) { 464 handlers = el.dom7Listeners[event]; 465 } else if (targetSelector && el.dom7LiveListeners) { 466 handlers = el.dom7LiveListeners[event]; 467 } 468 469 if (handlers && handlers.length) { 470 for (let k = handlers.length - 1; k >= 0; k -= 1) { 471 const handler = handlers[k]; 472 473 if (listener && handler.listener === listener) { 474 el.removeEventListener(event, handler.proxyListener, capture); 475 handlers.splice(k, 1); 476 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) { 477 el.removeEventListener(event, handler.proxyListener, capture); 478 handlers.splice(k, 1); 479 } else if (!listener) { 480 el.removeEventListener(event, handler.proxyListener, capture); 481 handlers.splice(k, 1); 482 } 483 } 484 } 485 } 486 } 487 488 return this; 489} 490 491function trigger(...args) { 492 const window = getWindow(); 493 const events = args[0].split(' '); 494 const eventData = args[1]; 495 496 for (let i = 0; i < events.length; i += 1) { 497 const event = events[i]; 498 499 for (let j = 0; j < this.length; j += 1) { 500 const el = this[j]; 501 502 if (window.CustomEvent) { 503 const evt = new window.CustomEvent(event, { 504 detail: eventData, 505 bubbles: true, 506 cancelable: true 507 }); 508 el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); 509 el.dispatchEvent(evt); 510 el.dom7EventData = []; 511 delete el.dom7EventData; 512 } 513 } 514 } 515 516 return this; 517} 518 519function transitionEnd$1(callback) { 520 const dom = this; 521 522 function fireCallBack(e) { 523 if (e.target !== this) return; 524 callback.call(this, e); 525 dom.off('transitionend', fireCallBack); 526 } 527 528 if (callback) { 529 dom.on('transitionend', fireCallBack); 530 } 531 532 return this; 533} 534 535function outerWidth(includeMargins) { 536 if (this.length > 0) { 537 if (includeMargins) { 538 const styles = this.styles(); 539 return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left')); 540 } 541 542 return this[0].offsetWidth; 543 } 544 545 return null; 546} 547 548function outerHeight(includeMargins) { 549 if (this.length > 0) { 550 if (includeMargins) { 551 const styles = this.styles(); 552 return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom')); 553 } 554 555 return this[0].offsetHeight; 556 } 557 558 return null; 559} 560 561function offset() { 562 if (this.length > 0) { 563 const window = getWindow(); 564 const document = getDocument(); 565 const el = this[0]; 566 const box = el.getBoundingClientRect(); 567 const body = document.body; 568 const clientTop = el.clientTop || body.clientTop || 0; 569 const clientLeft = el.clientLeft || body.clientLeft || 0; 570 const scrollTop = el === window ? window.scrollY : el.scrollTop; 571 const scrollLeft = el === window ? window.scrollX : el.scrollLeft; 572 return { 573 top: box.top + scrollTop - clientTop, 574 left: box.left + scrollLeft - clientLeft 575 }; 576 } 577 578 return null; 579} 580 581function styles() { 582 const window = getWindow(); 583 if (this[0]) return window.getComputedStyle(this[0], null); 584 return {}; 585} 586 587function css(props, value) { 588 const window = getWindow(); 589 let i; 590 591 if (arguments.length === 1) { 592 if (typeof props === 'string') { 593 // .css('width') 594 if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props); 595 } else { 596 // .css({ width: '100px' }) 597 for (i = 0; i < this.length; i += 1) { 598 for (const prop in props) { 599 this[i].style[prop] = props[prop]; 600 } 601 } 602 603 return this; 604 } 605 } 606 607 if (arguments.length === 2 && typeof props === 'string') { 608 // .css('width', '100px') 609 for (i = 0; i < this.length; i += 1) { 610 this[i].style[props] = value; 611 } 612 613 return this; 614 } 615 616 return this; 617} 618 619function each(callback) { 620 if (!callback) return this; 621 this.forEach((el, index) => { 622 callback.apply(el, [el, index]); 623 }); 624 return this; 625} 626 627function filter(callback) { 628 const result = arrayFilter(this, callback); 629 return $(result); 630} 631 632function html(html) { 633 if (typeof html === 'undefined') { 634 return this[0] ? this[0].innerHTML : null; 635 } 636 637 for (let i = 0; i < this.length; i += 1) { 638 this[i].innerHTML = html; 639 } 640 641 return this; 642} 643 644function text(text) { 645 if (typeof text === 'undefined') { 646 return this[0] ? this[0].textContent.trim() : null; 647 } 648 649 for (let i = 0; i < this.length; i += 1) { 650 this[i].textContent = text; 651 } 652 653 return this; 654} 655 656function is(selector) { 657 const window = getWindow(); 658 const document = getDocument(); 659 const el = this[0]; 660 let compareWith; 661 let i; 662 if (!el || typeof selector === 'undefined') return false; 663 664 if (typeof selector === 'string') { 665 if (el.matches) return el.matches(selector); 666 if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); 667 if (el.msMatchesSelector) return el.msMatchesSelector(selector); 668 compareWith = $(selector); 669 670 for (i = 0; i < compareWith.length; i += 1) { 671 if (compareWith[i] === el) return true; 672 } 673 674 return false; 675 } 676 677 if (selector === document) { 678 return el === document; 679 } 680 681 if (selector === window) { 682 return el === window; 683 } 684 685 if (selector.nodeType || selector instanceof Dom7) { 686 compareWith = selector.nodeType ? [selector] : selector; 687 688 for (i = 0; i < compareWith.length; i += 1) { 689 if (compareWith[i] === el) return true; 690 } 691 692 return false; 693 } 694 695 return false; 696} 697 698function index() { 699 let child = this[0]; 700 let i; 701 702 if (child) { 703 i = 0; // eslint-disable-next-line 704 705 while ((child = child.previousSibling) !== null) { 706 if (child.nodeType === 1) i += 1; 707 } 708 709 return i; 710 } 711 712 return undefined; 713} 714 715function eq(index) { 716 if (typeof index === 'undefined') return this; 717 const length = this.length; 718 719 if (index > length - 1) { 720 return $([]); 721 } 722 723 if (index < 0) { 724 const returnIndex = length + index; 725 if (returnIndex < 0) return $([]); 726 return $([this[returnIndex]]); 727 } 728 729 return $([this[index]]); 730} 731 732function append(...els) { 733 let newChild; 734 const document = getDocument(); 735 736 for (let k = 0; k < els.length; k += 1) { 737 newChild = els[k]; 738 739 for (let i = 0; i < this.length; i += 1) { 740 if (typeof newChild === 'string') { 741 const tempDiv = document.createElement('div'); 742 tempDiv.innerHTML = newChild; 743 744 while (tempDiv.firstChild) { 745 this[i].appendChild(tempDiv.firstChild); 746 } 747 } else if (newChild instanceof Dom7) { 748 for (let j = 0; j < newChild.length; j += 1) { 749 this[i].appendChild(newChild[j]); 750 } 751 } else { 752 this[i].appendChild(newChild); 753 } 754 } 755 } 756 757 return this; 758} 759 760function prepend(newChild) { 761 const document = getDocument(); 762 let i; 763 let j; 764 765 for (i = 0; i < this.length; i += 1) { 766 if (typeof newChild === 'string') { 767 const tempDiv = document.createElement('div'); 768 tempDiv.innerHTML = newChild; 769 770 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { 771 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); 772 } 773 } else if (newChild instanceof Dom7) { 774 for (j = 0; j < newChild.length; j += 1) { 775 this[i].insertBefore(newChild[j], this[i].childNodes[0]); 776 } 777 } else { 778 this[i].insertBefore(newChild, this[i].childNodes[0]); 779 } 780 } 781 782 return this; 783} 784 785function next(selector) { 786 if (this.length > 0) { 787 if (selector) { 788 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) { 789 return $([this[0].nextElementSibling]); 790 } 791 792 return $([]); 793 } 794 795 if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); 796 return $([]); 797 } 798 799 return $([]); 800} 801 802function nextAll(selector) { 803 const nextEls = []; 804 let el = this[0]; 805 if (!el) return $([]); 806 807 while (el.nextElementSibling) { 808 const next = el.nextElementSibling; // eslint-disable-line 809 810 if (selector) { 811 if ($(next).is(selector)) nextEls.push(next); 812 } else nextEls.push(next); 813 814 el = next; 815 } 816 817 return $(nextEls); 818} 819 820function prev(selector) { 821 if (this.length > 0) { 822 const el = this[0]; 823 824 if (selector) { 825 if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) { 826 return $([el.previousElementSibling]); 827 } 828 829 return $([]); 830 } 831 832 if (el.previousElementSibling) return $([el.previousElementSibling]); 833 return $([]); 834 } 835 836 return $([]); 837} 838 839function prevAll(selector) { 840 const prevEls = []; 841 let el = this[0]; 842 if (!el) return $([]); 843 844 while (el.previousElementSibling) { 845 const prev = el.previousElementSibling; // eslint-disable-line 846 847 if (selector) { 848 if ($(prev).is(selector)) prevEls.push(prev); 849 } else prevEls.push(prev); 850 851 el = prev; 852 } 853 854 return $(prevEls); 855} 856 857function parent(selector) { 858 const parents = []; // eslint-disable-line 859 860 for (let i = 0; i < this.length; i += 1) { 861 if (this[i].parentNode !== null) { 862 if (selector) { 863 if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode); 864 } else { 865 parents.push(this[i].parentNode); 866 } 867 } 868 } 869 870 return $(parents); 871} 872 873function parents(selector) { 874 const parents = []; // eslint-disable-line 875 876 for (let i = 0; i < this.length; i += 1) { 877 let parent = this[i].parentNode; // eslint-disable-line 878 879 while (parent) { 880 if (selector) { 881 if ($(parent).is(selector)) parents.push(parent); 882 } else { 883 parents.push(parent); 884 } 885 886 parent = parent.parentNode; 887 } 888 } 889 890 return $(parents); 891} 892 893function closest(selector) { 894 let closest = this; // eslint-disable-line 895 896 if (typeof selector === 'undefined') { 897 return $([]); 898 } 899 900 if (!closest.is(selector)) { 901 closest = closest.parents(selector).eq(0); 902 } 903 904 return closest; 905} 906 907function find(selector) { 908 const foundElements = []; 909 910 for (let i = 0; i < this.length; i += 1) { 911 const found = this[i].querySelectorAll(selector); 912 913 for (let j = 0; j < found.length; j += 1) { 914 foundElements.push(found[j]); 915 } 916 } 917 918 return $(foundElements); 919} 920 921function children(selector) { 922 const children = []; // eslint-disable-line 923 924 for (let i = 0; i < this.length; i += 1) { 925 const childNodes = this[i].children; 926 927 for (let j = 0; j < childNodes.length; j += 1) { 928 if (!selector || $(childNodes[j]).is(selector)) { 929 children.push(childNodes[j]); 930 } 931 } 932 } 933 934 return $(children); 935} 936 937function remove() { 938 for (let i = 0; i < this.length; i += 1) { 939 if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); 940 } 941 942 return this; 943} 944 945const Methods = { 946 addClass, 947 removeClass, 948 hasClass, 949 toggleClass, 950 attr, 951 removeAttr, 952 transform, 953 transition: transition$1, 954 on, 955 off, 956 trigger, 957 transitionEnd: transitionEnd$1, 958 outerWidth, 959 outerHeight, 960 styles, 961 offset, 962 css, 963 each, 964 html, 965 text, 966 is, 967 index, 968 eq, 969 append, 970 prepend, 971 next, 972 nextAll, 973 prev, 974 prevAll, 975 parent, 976 parents, 977 closest, 978 find, 979 children, 980 filter, 981 remove 982}; 983Object.keys(Methods).forEach(methodName => { 984 Object.defineProperty($.fn, methodName, { 985 value: Methods[methodName], 986 writable: true 987 }); 988}); 989 990function deleteProps(obj) { 991 const object = obj; 992 Object.keys(object).forEach(key => { 993 try { 994 object[key] = null; 995 } catch (e) {// no getter for object 996 } 997 998 try { 999 delete object[key]; 1000 } catch (e) {// something got wrong 1001 } 1002 }); 1003} 1004 1005function nextTick(callback, delay = 0) { 1006 return setTimeout(callback, delay); 1007} 1008 1009function now() { 1010 return Date.now(); 1011} 1012 1013function getComputedStyle$1(el) { 1014 const window = getWindow(); 1015 let style; 1016 1017 if (window.getComputedStyle) { 1018 style = window.getComputedStyle(el, null); 1019 } 1020 1021 if (!style && el.currentStyle) { 1022 style = el.currentStyle; 1023 } 1024 1025 if (!style) { 1026 style = el.style; 1027 } 1028 1029 return style; 1030} 1031 1032function getTranslate(el, axis = 'x') { 1033 const window = getWindow(); 1034 let matrix; 1035 let curTransform; 1036 let transformMatrix; 1037 const curStyle = getComputedStyle$1(el); 1038 1039 if (window.WebKitCSSMatrix) { 1040 curTransform = curStyle.transform || curStyle.webkitTransform; 1041 1042 if (curTransform.split(',').length > 6) { 1043 curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', '); 1044 } // Some old versions of Webkit choke when 'none' is passed; pass 1045 // empty string instead in this case 1046 1047 1048 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform); 1049 } else { 1050 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,'); 1051 matrix = transformMatrix.toString().split(','); 1052 } 1053 1054 if (axis === 'x') { 1055 // Latest Chrome and webkits Fix 1056 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix 1057 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers 1058 else curTransform = parseFloat(matrix[4]); 1059 } 1060 1061 if (axis === 'y') { 1062 // Latest Chrome and webkits Fix 1063 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix 1064 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers 1065 else curTransform = parseFloat(matrix[5]); 1066 } 1067 1068 return curTransform || 0; 1069} 1070 1071function isObject(o) { 1072 return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object'; 1073} 1074 1075function isNode(node) { 1076 // eslint-disable-next-line 1077 if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') { 1078 return node instanceof HTMLElement; 1079 } 1080 1081 return node && (node.nodeType === 1 || node.nodeType === 11); 1082} 1083 1084function extend(...args) { 1085 const to = Object(args[0]); 1086 const noExtend = ['__proto__', 'constructor', 'prototype']; 1087 1088 for (let i = 1; i < args.length; i += 1) { 1089 const nextSource = args[i]; 1090 1091 if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) { 1092 const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0); 1093 1094 for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) { 1095 const nextKey = keysArray[nextIndex]; 1096 const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); 1097 1098 if (desc !== undefined && desc.enumerable) { 1099 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 1100 if (nextSource[nextKey].__swiper__) { 1101 to[nextKey] = nextSource[nextKey]; 1102 } else { 1103 extend(to[nextKey], nextSource[nextKey]); 1104 } 1105 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) { 1106 to[nextKey] = {}; 1107 1108 if (nextSource[nextKey].__swiper__) { 1109 to[nextKey] = nextSource[nextKey]; 1110 } else { 1111 extend(to[nextKey], nextSource[nextKey]); 1112 } 1113 } else { 1114 to[nextKey] = nextSource[nextKey]; 1115 } 1116 } 1117 } 1118 } 1119 } 1120 1121 return to; 1122} 1123 1124function setCSSProperty(el, varName, varValue) { 1125 el.style.setProperty(varName, varValue); 1126} 1127 1128function animateCSSModeScroll({ 1129 swiper, 1130 targetPosition, 1131 side 1132}) { 1133 const window = getWindow(); 1134 const startPosition = -swiper.translate; 1135 let startTime = null; 1136 let time; 1137 const duration = swiper.params.speed; 1138 swiper.wrapperEl.style.scrollSnapType = 'none'; 1139 window.cancelAnimationFrame(swiper.cssModeFrameID); 1140 const dir = targetPosition > startPosition ? 'next' : 'prev'; 1141 1142 const isOutOfBound = (current, target) => { 1143 return dir === 'next' && current >= target || dir === 'prev' && current <= target; 1144 }; 1145 1146 const animate = () => { 1147 time = new Date().getTime(); 1148 1149 if (startTime === null) { 1150 startTime = time; 1151 } 1152 1153 const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); 1154 const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; 1155 let currentPosition = startPosition + easeProgress * (targetPosition - startPosition); 1156 1157 if (isOutOfBound(currentPosition, targetPosition)) { 1158 currentPosition = targetPosition; 1159 } 1160 1161 swiper.wrapperEl.scrollTo({ 1162 [side]: currentPosition 1163 }); 1164 1165 if (isOutOfBound(currentPosition, targetPosition)) { 1166 swiper.wrapperEl.style.overflow = 'hidden'; 1167 swiper.wrapperEl.style.scrollSnapType = ''; 1168 setTimeout(() => { 1169 swiper.wrapperEl.style.overflow = ''; 1170 swiper.wrapperEl.scrollTo({ 1171 [side]: currentPosition 1172 }); 1173 }); 1174 window.cancelAnimationFrame(swiper.cssModeFrameID); 1175 return; 1176 } 1177 1178 swiper.cssModeFrameID = window.requestAnimationFrame(animate); 1179 }; 1180 1181 animate(); 1182} 1183 1184let support; 1185 1186function calcSupport() { 1187 const window = getWindow(); 1188 const document = getDocument(); 1189 return { 1190 smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style, 1191 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch), 1192 passiveListener: function checkPassiveListener() { 1193 let supportsPassive = false; 1194 1195 try { 1196 const opts = Object.defineProperty({}, 'passive', { 1197 // eslint-disable-next-line 1198 get() { 1199 supportsPassive = true; 1200 } 1201 1202 }); 1203 window.addEventListener('testPassiveListener', null, opts); 1204 } catch (e) {// No support 1205 } 1206 1207 return supportsPassive; 1208 }(), 1209 gestures: function checkGestures() { 1210 return 'ongesturestart' in window; 1211 }() 1212 }; 1213} 1214 1215function getSupport() { 1216 if (!support) { 1217 support = calcSupport(); 1218 } 1219 1220 return support; 1221} 1222 1223let deviceCached; 1224 1225function calcDevice({ 1226 userAgent 1227} = {}) { 1228 const support = getSupport(); 1229 const window = getWindow(); 1230 const platform = window.navigator.platform; 1231 const ua = userAgent || window.navigator.userAgent; 1232 const device = { 1233 ios: false, 1234 android: false 1235 }; 1236 const screenWidth = window.screen.width; 1237 const screenHeight = window.screen.height; 1238 const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line 1239 1240 let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); 1241 const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); 1242 const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); 1243 const windows = platform === 'Win32'; 1244 let macos = platform === 'MacIntel'; // iPadOs 13 fix 1245 1246 const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810']; 1247 1248 if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) { 1249 ipad = ua.match(/(Version)\/([\d.]+)/); 1250 if (!ipad) ipad = [0, 1, '13_0_0']; 1251 macos = false; 1252 } // Android 1253 1254 1255 if (android && !windows) { 1256 device.os = 'android'; 1257 device.android = true; 1258 } 1259 1260 if (ipad || iphone || ipod) { 1261 device.os = 'ios'; 1262 device.ios = true; 1263 } // Export object 1264 1265 1266 return device; 1267} 1268 1269function getDevice(overrides = {}) { 1270 if (!deviceCached) { 1271 deviceCached = calcDevice(overrides); 1272 } 1273 1274 return deviceCached; 1275} 1276 1277let browser; 1278 1279function calcBrowser() { 1280 const window = getWindow(); 1281 1282 function isSafari() { 1283 const ua = window.navigator.userAgent.toLowerCase(); 1284 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0; 1285 } 1286 1287 return { 1288 isSafari: isSafari(), 1289 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent) 1290 }; 1291} 1292 1293function getBrowser() { 1294 if (!browser) { 1295 browser = calcBrowser(); 1296 } 1297 1298 return browser; 1299} 1300 1301function Resize({ 1302 swiper, 1303 on, 1304 emit 1305}) { 1306 const window = getWindow(); 1307 let observer = null;
vendor: 3,645 bytes, lines 1308-1435
1308 let animationFrame = null; 1309 1310 const resizeHandler = () => { 1311 if (!swiper || swiper.destroyed || !swiper.initialized) return; 1312 emit('beforeResize'); 1313 emit('resize'); 1314 }; 1315 1316 const createObserver = () => { 1317 if (!swiper || swiper.destroyed || !swiper.initialized) return; 1318 observer = new ResizeObserver(entries => { 1319 animationFrame = window.requestAnimationFrame(() => { 1320 const { 1321 width, 1322 height 1323 } = swiper; 1324 let newWidth = width; 1325 let newHeight = height; 1326 entries.forEach(({ 1327 contentBoxSize, 1328 contentRect, 1329 target 1330 }) => { 1331 if (target && target !== swiper.el) return; 1332 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize; 1333 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize; 1334 }); 1335 1336 if (newWidth !== width || newHeight !== height) { 1337 resizeHandler(); 1338 } 1339 }); 1340 }); 1341 observer.observe(swiper.el); 1342 }; 1343 1344 const removeObserver = () => { 1345 if (animationFrame) { 1346 window.cancelAnimationFrame(animationFrame); 1347 } 1348 1349 if (observer && observer.unobserve && swiper.el) { 1350 observer.unobserve(swiper.el); 1351 observer = null; 1352 } 1353 }; 1354 1355 const orientationChangeHandler = () => { 1356 if (!swiper || swiper.destroyed || !swiper.initialized) return; 1357 emit('orientationchange'); 1358 }; 1359 1360 on('init', () => { 1361 if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') { 1362 createObserver(); 1363 return; 1364 } 1365 1366 window.addEventListener('resize', resizeHandler); 1367 window.addEventListener('orientationchange', orientationChangeHandler); 1368 }); 1369 on('destroy', () => { 1370 removeObserver(); 1371 window.removeEventListener('resize', resizeHandler); 1372 window.removeEventListener('orientationchange', orientationChangeHandler); 1373 }); 1374} 1375 1376function Observer({ 1377 swiper, 1378 extendParams, 1379 on, 1380 emit 1381}) { 1382 const observers = []; 1383 const window = getWindow(); 1384 1385 const attach = (target, options = {}) => { 1386 const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver; 1387 const observer = new ObserverFunc(mutations => { 1388 // The observerUpdate event should only be triggered 1389 // once despite the number of mutations. Additional 1390 // triggers are redundant and are very costly 1391 if (mutations.length === 1) { 1392 emit('observerUpdate', mutations[0]); 1393 return; 1394 } 1395 1396 const observerUpdate = function observerUpdate() { 1397 emit('observerUpdate', mutations[0]); 1398 }; 1399 1400 if (window.requestAnimationFrame) { 1401 window.requestAnimationFrame(observerUpdate); 1402 } else { 1403 window.setTimeout(observerUpdate, 0); 1404 } 1405 }); 1406 observer.observe(target, { 1407 attributes: typeof options.attributes === 'undefined' ? true : options.attributes, 1408 childList: typeof options.childList === 'undefined' ? true : options.childList, 1409 characterData: typeof options.characterData === 'undefined' ? true : options.characterData 1410 }); 1411 observers.push(observer); 1412 }; 1413 1414 const init = () => { 1415 if (!swiper.params.observer) return; 1416 1417 if (swiper.params.observeParents) { 1418 const containerParents = swiper.$el.parents(); 1419 1420 for (let i = 0; i < containerParents.length; i += 1) { 1421 attach(containerParents[i]); 1422 } 1423 } // Observe container 1424 1425 1426 attach(swiper.$el[0], { 1427 childList: swiper.params.observeSlideChildren 1428 }); // Observe wrapper 1429 1430 attach(swiper.$wrapperEl[0], { 1431 attributes: false 1432 }); 1433 }; 1434 1435 const destroy = () => {
vendor: 2,638 bytes, lines 1436-1530
1436 observers.forEach(observer => { 1437 observer.disconnect(); 1438 }); 1439 observers.splice(0, observers.length); 1440 }; 1441 1442 extendParams({ 1443 observer: false, 1444 observeParents: false, 1445 observeSlideChildren: false 1446 }); 1447 on('init', init); 1448 on('destroy', destroy); 1449} 1450 1451/* eslint-disable no-underscore-dangle */ 1452var eventsEmitter = { 1453 on(events, handler, priority) { 1454 const self = this; 1455 if (!self.eventsListeners || self.destroyed) return self; 1456 if (typeof handler !== 'function') return self; 1457 const method = priority ? 'unshift' : 'push'; 1458 events.split(' ').forEach(event => { 1459 if (!self.eventsListeners[event]) self.eventsListeners[event] = []; 1460 self.eventsListeners[event][method](handler); 1461 }); 1462 return self; 1463 }, 1464 1465 once(events, handler, priority) { 1466 const self = this; 1467 if (!self.eventsListeners || self.destroyed) return self; 1468 if (typeof handler !== 'function') return self; 1469 1470 function onceHandler(...args) { 1471 self.off(events, onceHandler); 1472 1473 if (onceHandler.__emitterProxy) { 1474 delete onceHandler.__emitterProxy; 1475 } 1476 1477 handler.apply(self, args); 1478 } 1479 1480 onceHandler.__emitterProxy = handler; 1481 return self.on(events, onceHandler, priority); 1482 }, 1483 1484 onAny(handler, priority) { 1485 const self = this; 1486 if (!self.eventsListeners || self.destroyed) return self; 1487 if (typeof handler !== 'function') return self; 1488 const method = priority ? 'unshift' : 'push'; 1489 1490 if (self.eventsAnyListeners.indexOf(handler) < 0) { 1491 self.eventsAnyListeners[method](handler); 1492 } 1493 1494 return self; 1495 }, 1496 1497 offAny(handler) { 1498 const self = this; 1499 if (!self.eventsListeners || self.destroyed) return self; 1500 if (!self.eventsAnyListeners) return self; 1501 const index = self.eventsAnyListeners.indexOf(handler); 1502 1503 if (index >= 0) { 1504 self.eventsAnyListeners.splice(index, 1); 1505 } 1506 1507 return self; 1508 }, 1509 1510 off(events, handler) { 1511 const self = this; 1512 if (!self.eventsListeners || self.destroyed) return self; 1513 if (!self.eventsListeners) return self; 1514 events.split(' ').forEach(event => { 1515 if (typeof handler === 'undefined') { 1516 self.eventsListeners[event] = []; 1517 } else if (self.eventsListeners[event]) { 1518 self.eventsListeners[event].forEach((eventHandler, index) => { 1519 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) { 1520 self.eventsListeners[event].splice(index, 1); 1521 } 1522 }); 1523 } 1524 }); 1525 return self; 1526 }, 1527 1528 emit(...args) { 1529 const self = this; 1530 if (!self.eventsListeners || self.destroyed) return self
vendor: 11,833 bytes, lines 1530-1906
1530; 1531 if (!self.eventsListeners) return self; 1532 let events; 1533 let data; 1534 let context; 1535 1536 if (typeof args[0] === 'string' || Array.isArray(args[0])) { 1537 events = args[0]; 1538 data = args.slice(1, args.length); 1539 context = self; 1540 } else { 1541 events = args[0].events; 1542 data = args[0].data; 1543 context = args[0].context || self; 1544 } 1545 1546 data.unshift(context); 1547 const eventsArray = Array.isArray(events) ? events : events.split(' '); 1548 eventsArray.forEach(event => { 1549 if (self.eventsAnyListeners && self.eventsAnyListeners.length) { 1550 self.eventsAnyListeners.forEach(eventHandler => { 1551 eventHandler.apply(context, [event, ...data]); 1552 }); 1553 } 1554 1555 if (self.eventsListeners && self.eventsListeners[event]) { 1556 self.eventsListeners[event].forEach(eventHandler => { 1557 eventHandler.apply(context, data); 1558 }); 1559 } 1560 }); 1561 return self; 1562 } 1563 1564}; 1565 1566function updateSize() { 1567 const swiper = this; 1568 let width; 1569 let height; 1570 const $el = swiper.$el; 1571 1572 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) { 1573 width = swiper.params.width; 1574 } else { 1575 width = $el[0].clientWidth; 1576 } 1577 1578 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) { 1579 height = swiper.params.height; 1580 } else { 1581 height = $el[0].clientHeight; 1582 } 1583 1584 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) { 1585 return; 1586 } // Subtract paddings 1587 1588 1589 width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10); 1590 height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10); 1591 if (Number.isNaN(width)) width = 0; 1592 if (Number.isNaN(height)) height = 0; 1593 Object.assign(swiper, { 1594 width, 1595 height, 1596 size: swiper.isHorizontal() ? width : height 1597 }); 1598} 1599 1600function updateSlides() { 1601 const swiper = this; 1602 1603 function getDirectionLabel(property) { 1604 if (swiper.isHorizontal()) { 1605 return property; 1606 } // prettier-ignore 1607 1608 1609 return { 1610 'width': 'height', 1611 'margin-top': 'margin-left', 1612 'margin-bottom ': 'margin-right', 1613 'margin-left': 'margin-top', 1614 'margin-right': 'margin-bottom', 1615 'padding-left': 'padding-top', 1616 'padding-right': 'padding-bottom', 1617 'marginRight': 'marginBottom' 1618 }[property]; 1619 } 1620 1621 function getDirectionPropertyValue(node, label) { 1622 return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); 1623 } 1624 1625 const params = swiper.params; 1626 const { 1627 $wrapperEl, 1628 size: swiperSize, 1629 rtlTranslate: rtl, 1630 wrongRTL 1631 } = swiper; 1632 const isVirtual = swiper.virtual && params.virtual.enabled; 1633 const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length; 1634 const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); 1635 const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length; 1636 let snapGrid = []; 1637 const slidesGrid = []; 1638 const slidesSizesGrid = []; 1639 let offsetBefore = params.slidesOffsetBefore; 1640 1641 if (typeof offsetBefore === 'function') { 1642 offsetBefore = params.slidesOffsetBefore.call(swiper); 1643 } 1644 1645 let offsetAfter = params.slidesOffsetAfter; 1646 1647 if (typeof offsetAfter === 'function') { 1648 offsetAfter = params.slidesOffsetAfter.call(swiper); 1649 } 1650 1651 const previousSnapGridLength = swiper.snapGrid.length; 1652 const previousSlidesGridLength = swiper.slidesGrid.length; 1653 let spaceBetween = params.spaceBetween; 1654 let slidePosition = -offsetBefore; 1655 let prevSlideSize = 0; 1656 let index = 0; 1657 1658 if (typeof swiperSize === 'undefined') { 1659 return; 1660 } 1661 1662 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) { 1663 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize; 1664 } 1665 1666 swiper.virtualSize = -spaceBetween; // reset margins 1667 1668 if (rtl) slides.css({ 1669 marginLeft: '', 1670 marginBottom: '', 1671 marginTop: '' 1672 });else slides.css({ 1673 marginRight: '', 1674 marginBottom: '', 1675 marginTop: '' 1676 }); // reset cssMode offsets 1677 1678 if (params.centeredSlides && params.cssMode) { 1679 setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', ''); 1680 setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', ''); 1681 } 1682 1683 const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; 1684 1685 if (gridEnabled) { 1686 swiper.grid.initSlides(slidesLength); 1687 } // Calc slides 1688 1689 1690 let slideSize; 1691 const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => { 1692 return typeof params.breakpoints[key].slidesPerView !== 'undefined'; 1693 }).length > 0; 1694 1695 for (let i = 0; i < slidesLength; i += 1) { 1696 slideSize = 0; 1697 const slide = slides.eq(i); 1698 1699 if (gridEnabled) { 1700 swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel); 1701 } 1702 1703 if (slide.css('display') === 'none') continue; // eslint-disable-line 1704 1705 if (params.slidesPerView === 'auto') { 1706 if (shouldResetSlideSize) { 1707 slides[i].style[getDirectionLabel('width')] = ``; 1708 } 1709 1710 const slideStyles = getComputedStyle(slide[0]); 1711 const currentTransform = slide[0].style.transform; 1712 const currentWebKitTransform = slide[0].style.webkitTransform; 1713 1714 if (currentTransform) { 1715 slide[0].style.transform = 'none'; 1716 } 1717 1718 if (currentWebKitTransform) { 1719 slide[0].style.webkitTransform = 'none'; 1720 } 1721 1722 if (params.roundLengths) { 1723 slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true); 1724 } else { 1725 // eslint-disable-next-line 1726 const width = getDirectionPropertyValue(slideStyles, 'width'); 1727 const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left'); 1728 const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right'); 1729 const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left'); 1730 const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right'); 1731 const boxSizing = slideStyles.getPropertyValue('box-sizing'); 1732 1733 if (boxSizing && boxSizing === 'border-box') { 1734 slideSize = width + marginLeft + marginRight; 1735 } else { 1736 const { 1737 clientWidth, 1738 offsetWidth 1739 } = slide[0]; 1740 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth); 1741 } 1742 } 1743 1744 if (currentTransform) { 1745 slide[0].style.transform = currentTransform; 1746 } 1747 1748 if (currentWebKitTransform) { 1749 slide[0].style.webkitTransform = currentWebKitTransform; 1750 } 1751 1752 if (params.roundLengths) slideSize = Math.floor(slideSize); 1753 } else { 1754 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView; 1755 if (params.roundLengths) slideSize = Math.floor(slideSize); 1756 1757 if (slides[i]) { 1758 slides[i].style[getDirectionLabel('width')] = `${slideSize}px`; 1759 } 1760 } 1761 1762 if (slides[i]) { 1763 slides[i].swiperSlideSize = slideSize; 1764 } 1765 1766 slidesSizesGrid.push(slideSize); 1767 1768 if (params.centeredSlides) { 1769 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; 1770 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 1771 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween; 1772 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; 1773 if (params.roundLengths) slidePosition = Math.floor(slidePosition); 1774 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); 1775 slidesGrid.push(slidePosition); 1776 } else { 1777 if (params.roundLengths) slidePosition = Math.floor(slidePosition); 1778 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition); 1779 slidesGrid.push(slidePosition); 1780 slidePosition = slidePosition + slideSize + spaceBetween; 1781 } 1782 1783 swiper.virtualSize += slideSize + spaceBetween; 1784 prevSlideSize = slideSize; 1785 index += 1; 1786 } 1787 1788 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; 1789 1790 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) { 1791 $wrapperEl.css({ 1792 width: `${swiper.virtualSize + params.spaceBetween}px` 1793 }); 1794 } 1795 1796 if (params.setWrapperSize) { 1797 $wrapperEl.css({ 1798 [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px` 1799 }); 1800 } 1801 1802 if (gridEnabled) { 1803 swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); 1804 } // Remove last grid elements depending on width 1805 1806 1807 if (!params.centeredSlides) { 1808 const newSlidesGrid = []; 1809 1810 for (let i = 0; i < snapGrid.length; i += 1) { 1811 let slidesGridItem = snapGrid[i]; 1812 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); 1813 1814 if (snapGrid[i] <= swiper.virtualSize - swiperSize) { 1815 newSlidesGrid.push(slidesGridItem); 1816 } 1817 } 1818 1819 snapGrid = newSlidesGrid; 1820 1821 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) { 1822 snapGrid.push(swiper.virtualSize - swiperSize); 1823 } 1824 } 1825 1826 if (snapGrid.length === 0) snapGrid = [0]; 1827 1828 if (params.spaceBetween !== 0) { 1829 const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight'); 1830 slides.filter((_, slideIndex) => { 1831 if (!params.cssMode) return true; 1832 1833 if (slideIndex === slides.length - 1) { 1834 return false; 1835 } 1836 1837 return true; 1838 }).css({ 1839 [key]: `${spaceBetween}px` 1840 }); 1841 } 1842 1843 if (params.centeredSlides && params.centeredSlidesBounds) { 1844 let allSlidesSize = 0; 1845 slidesSizesGrid.forEach(slideSizeValue => { 1846 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); 1847 }); 1848 allSlidesSize -= params.spaceBetween; 1849 const maxSnap = allSlidesSize - swiperSize; 1850 snapGrid = snapGrid.map(snap => { 1851 if (snap < 0) return -offsetBefore; 1852 if (snap > maxSnap) return maxSnap + offsetAfter; 1853 return snap; 1854 }); 1855 } 1856 1857 if (params.centerInsufficientSlides) { 1858 let allSlidesSize = 0; 1859 slidesSizesGrid.forEach(slideSizeValue => { 1860 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); 1861 }); 1862 allSlidesSize -= params.spaceBetween; 1863 1864 if (allSlidesSize < swiperSize) { 1865 const allSlidesOffset = (swiperSize - allSlidesSize) / 2; 1866 snapGrid.forEach((snap, snapIndex) => { 1867 snapGrid[snapIndex] = snap - allSlidesOffset; 1868 }); 1869 slidesGrid.forEach((snap, snapIndex) => { 1870 slidesGrid[snapIndex] = snap + allSlidesOffset; 1871 }); 1872 } 1873 } 1874 1875 Object.assign(swiper, { 1876 slides, 1877 snapGrid, 1878 slidesGrid, 1879 slidesSizesGrid 1880 }); 1881 1882 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) { 1883 setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`); 1884 setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`); 1885 const addToSnapGrid = -swiper.snapGrid[0]; 1886 const addToSlidesGrid = -swiper.slidesGrid[0]; 1887 swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid); 1888 swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid); 1889 } 1890 1891 if (slidesLength !== previousSlidesLength) { 1892 swiper.emit('slidesLengthChange'); 1893 } 1894 1895 if (snapGrid.length !== previousSnapGridLength) { 1896 if (swiper.params.watchOverflow) swiper.checkOverflow(); 1897 swiper.emit('snapGridLengthChange'); 1898 } 1899 1900 if (slidesGrid.length !== previousSlidesGridLength) { 1901 swiper.emit('slidesGridLengthChange'); 1902 } 1903 1904 if (params.watchSlidesProgress) { 1905 swiper.updateSlidesOffset(); 1906 }
vendor: 67,443 bytes, lines 1907-4253
1907 1908 if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) { 1909 const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`; 1910 const hasClassBackfaceClassAdded = swiper.$el.hasClass(backFaceHiddenClass); 1911 1912 if (slidesLength <= params.maxBackfaceHiddenSlides) { 1913 if (!hasClassBackfaceClassAdded) swiper.$el.addClass(backFaceHiddenClass); 1914 } else if (hasClassBackfaceClassAdded) { 1915 swiper.$el.removeClass(backFaceHiddenClass); 1916 } 1917 } 1918} 1919 1920function updateAutoHeight(speed) { 1921 const swiper = this; 1922 const activeSlides = []; 1923 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 1924 let newHeight = 0; 1925 let i; 1926 1927 if (typeof speed === 'number') { 1928 swiper.setTransition(speed); 1929 } else if (speed === true) { 1930 swiper.setTransition(swiper.params.speed); 1931 } 1932 1933 const getSlideByIndex = index => { 1934 if (isVirtual) { 1935 return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0]; 1936 } 1937 1938 return swiper.slides.eq(index)[0]; 1939 }; // Find slides currently in view 1940 1941 1942 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) { 1943 if (swiper.params.centeredSlides) { 1944 (swiper.visibleSlides || $([])).each(slide => { 1945 activeSlides.push(slide); 1946 }); 1947 } else { 1948 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { 1949 const index = swiper.activeIndex + i; 1950 if (index > swiper.slides.length && !isVirtual) break; 1951 activeSlides.push(getSlideByIndex(index)); 1952 } 1953 } 1954 } else { 1955 activeSlides.push(getSlideByIndex(swiper.activeIndex)); 1956 } // Find new height from highest slide in view 1957 1958 1959 for (i = 0; i < activeSlides.length; i += 1) { 1960 if (typeof activeSlides[i] !== 'undefined') { 1961 const height = activeSlides[i].offsetHeight; 1962 newHeight = height > newHeight ? height : newHeight; 1963 } 1964 } // Update Height 1965 1966 1967 if (newHeight || newHeight === 0) swiper.$wrapperEl.css('height', `${newHeight}px`); 1968} 1969 1970function updateSlidesOffset() { 1971 const swiper = this; 1972 const slides = swiper.slides; 1973 1974 for (let i = 0; i < slides.length; i += 1) { 1975 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop; 1976 } 1977} 1978 1979function updateSlidesProgress(translate = this && this.translate || 0) { 1980 const swiper = this; 1981 const params = swiper.params; 1982 const { 1983 slides, 1984 rtlTranslate: rtl, 1985 snapGrid 1986 } = swiper; 1987 if (slides.length === 0) return; 1988 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset(); 1989 let offsetCenter = -translate; 1990 if (rtl) offsetCenter = translate; // Visible Slides 1991 1992 slides.removeClass(params.slideVisibleClass); 1993 swiper.visibleSlidesIndexes = []; 1994 swiper.visibleSlides = []; 1995 1996 for (let i = 0; i < slides.length; i += 1) { 1997 const slide = slides[i]; 1998 let slideOffset = slide.swiperSlideOffset; 1999 2000 if (params.cssMode && params.centeredSlides) { 2001 slideOffset -= slides[0].swiperSlideOffset; 2002 } 2003 2004 const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); 2005 const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween); 2006 const slideBefore = -(offsetCenter - slideOffset); 2007 const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; 2008 const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size; 2009 2010 if (isVisible) { 2011 swiper.visibleSlides.push(slide); 2012 swiper.visibleSlidesIndexes.push(i); 2013 slides.eq(i).addClass(params.slideVisibleClass); 2014 } 2015 2016 slide.progress = rtl ? -slideProgress : slideProgress; 2017 slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress; 2018 } 2019 2020 swiper.visibleSlides = $(swiper.visibleSlides); 2021} 2022 2023function updateProgress(translate) { 2024 const swiper = this; 2025 2026 if (typeof translate === 'undefined') { 2027 const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line 2028 2029 translate = swiper && swiper.translate && swiper.translate * multiplier || 0; 2030 } 2031 2032 const params = swiper.params; 2033 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 2034 let { 2035 progress, 2036 isBeginning, 2037 isEnd 2038 } = swiper; 2039 const wasBeginning = isBeginning; 2040 const wasEnd = isEnd; 2041 2042 if (translatesDiff === 0) { 2043 progress = 0; 2044 isBeginning = true; 2045 isEnd = true; 2046 } else { 2047 progress = (translate - swiper.minTranslate()) / translatesDiff; 2048 isBeginning = progress <= 0; 2049 isEnd = progress >= 1; 2050 } 2051 2052 Object.assign(swiper, { 2053 progress, 2054 isBeginning, 2055 isEnd 2056 }); 2057 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate); 2058 2059 if (isBeginning && !wasBeginning) { 2060 swiper.emit('reachBeginning toEdge'); 2061 } 2062 2063 if (isEnd && !wasEnd) { 2064 swiper.emit('reachEnd toEdge'); 2065 } 2066 2067 if (wasBeginning && !isBeginning || wasEnd && !isEnd) { 2068 swiper.emit('fromEdge'); 2069 } 2070 2071 swiper.emit('progress', progress); 2072} 2073 2074function updateSlidesClasses() { 2075 const swiper = this; 2076 const { 2077 slides, 2078 params, 2079 $wrapperEl, 2080 activeIndex, 2081 realIndex 2082 } = swiper; 2083 const isVirtual = swiper.virtual && params.virtual.enabled; 2084 slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`); 2085 let activeSlide; 2086 2087 if (isVirtual) { 2088 activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`); 2089 } else { 2090 activeSlide = slides.eq(activeIndex); 2091 } // Active classes 2092 2093 2094 activeSlide.addClass(params.slideActiveClass); 2095 2096 if (params.loop) { 2097 // Duplicate to all looped slides 2098 if (activeSlide.hasClass(params.slideDuplicateClass)) { 2099 $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); 2100 } else { 2101 $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`).addClass(params.slideDuplicateActiveClass); 2102 } 2103 } // Next Slide 2104 2105 2106 let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass); 2107 2108 if (params.loop && nextSlide.length === 0) { 2109 nextSlide = slides.eq(0); 2110 nextSlide.addClass(params.slideNextClass); 2111 } // Prev Slide 2112 2113 2114 let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass); 2115 2116 if (params.loop && prevSlide.length === 0) { 2117 prevSlide = slides.eq(-1); 2118 prevSlide.addClass(params.slidePrevClass); 2119 } 2120 2121 if (params.loop) { 2122 // Duplicate to all looped slides 2123 if (nextSlide.hasClass(params.slideDuplicateClass)) { 2124 $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); 2125 } else { 2126 $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${nextSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicateNextClass); 2127 } 2128 2129 if (prevSlide.hasClass(params.slideDuplicateClass)) { 2130 $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); 2131 } else { 2132 $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${prevSlide.attr('data-swiper-slide-index')}"]`).addClass(params.slideDuplicatePrevClass); 2133 } 2134 } 2135 2136 swiper.emitSlidesClasses(); 2137} 2138 2139function updateActiveIndex(newActiveIndex) { 2140 const swiper = this; 2141 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 2142 const { 2143 slidesGrid, 2144 snapGrid, 2145 params, 2146 activeIndex: previousIndex, 2147 realIndex: previousRealIndex, 2148 snapIndex: previousSnapIndex 2149 } = swiper; 2150 let activeIndex = newActiveIndex; 2151 let snapIndex; 2152 2153 if (typeof activeIndex === 'undefined') { 2154 for (let i = 0; i < slidesGrid.length; i += 1) { 2155 if (typeof slidesGrid[i + 1] !== 'undefined') { 2156 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) { 2157 activeIndex = i; 2158 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) { 2159 activeIndex = i + 1; 2160 } 2161 } else if (translate >= slidesGrid[i]) { 2162 activeIndex = i; 2163 } 2164 } // Normalize slideIndex 2165 2166 2167 if (params.normalizeSlideIndex) { 2168 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0; 2169 } 2170 } 2171 2172 if (snapGrid.indexOf(translate) >= 0) { 2173 snapIndex = snapGrid.indexOf(translate); 2174 } else { 2175 const skip = Math.min(params.slidesPerGroupSkip, activeIndex); 2176 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); 2177 } 2178 2179 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; 2180 2181 if (activeIndex === previousIndex) { 2182 if (snapIndex !== previousSnapIndex) { 2183 swiper.snapIndex = snapIndex; 2184 swiper.emit('snapIndexChange'); 2185 } 2186 2187 return; 2188 } // Get real index 2189 2190 2191 const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10); 2192 Object.assign(swiper, { 2193 snapIndex, 2194 realIndex, 2195 previousIndex, 2196 activeIndex 2197 }); 2198 swiper.emit('activeIndexChange'); 2199 swiper.emit('snapIndexChange'); 2200 2201 if (previousRealIndex !== realIndex) { 2202 swiper.emit('realIndexChange'); 2203 } 2204 2205 if (swiper.initialized || swiper.params.runCallbacksOnInit) { 2206 swiper.emit('slideChange'); 2207 } 2208} 2209 2210function updateClickedSlide(e) { 2211 const swiper = this; 2212 const params = swiper.params; 2213 const slide = $(e).closest(`.${params.slideClass}`)[0]; 2214 let slideFound = false; 2215 let slideIndex; 2216 2217 if (slide) { 2218 for (let i = 0; i < swiper.slides.length; i += 1) { 2219 if (swiper.slides[i] === slide) { 2220 slideFound = true; 2221 slideIndex = i; 2222 break; 2223 } 2224 } 2225 } 2226 2227 if (slide && slideFound) { 2228 swiper.clickedSlide = slide; 2229 2230 if (swiper.virtual && swiper.params.virtual.enabled) { 2231 swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10); 2232 } else { 2233 swiper.clickedIndex = slideIndex; 2234 } 2235 } else { 2236 swiper.clickedSlide = undefined; 2237 swiper.clickedIndex = undefined; 2238 return; 2239 } 2240 2241 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) { 2242 swiper.slideToClickedSlide(); 2243 } 2244} 2245 2246var update = { 2247 updateSize, 2248 updateSlides, 2249 updateAutoHeight, 2250 updateSlidesOffset, 2251 updateSlidesProgress, 2252 updateProgress, 2253 updateSlidesClasses, 2254 updateActiveIndex, 2255 updateClickedSlide 2256}; 2257 2258function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') { 2259 const swiper = this; 2260 const { 2261 params, 2262 rtlTranslate: rtl, 2263 translate, 2264 $wrapperEl 2265 } = swiper; 2266 2267 if (params.virtualTranslate) { 2268 return rtl ? -translate : translate; 2269 } 2270 2271 if (params.cssMode) { 2272 return translate; 2273 } 2274 2275 let currentTranslate = getTranslate($wrapperEl[0], axis); 2276 if (rtl) currentTranslate = -currentTranslate; 2277 return currentTranslate || 0; 2278} 2279 2280function setTranslate(translate, byController) { 2281 const swiper = this; 2282 const { 2283 rtlTranslate: rtl, 2284 params, 2285 $wrapperEl, 2286 wrapperEl, 2287 progress 2288 } = swiper; 2289 let x = 0; 2290 let y = 0; 2291 const z = 0; 2292 2293 if (swiper.isHorizontal()) { 2294 x = rtl ? -translate : translate; 2295 } else { 2296 y = translate; 2297 } 2298 2299 if (params.roundLengths) { 2300 x = Math.floor(x); 2301 y = Math.floor(y); 2302 } 2303 2304 if (params.cssMode) { 2305 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y; 2306 } else if (!params.virtualTranslate) { 2307 $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); 2308 } 2309 2310 swiper.previousTranslate = swiper.translate; 2311 swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress 2312 2313 let newProgress; 2314 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 2315 2316 if (translatesDiff === 0) { 2317 newProgress = 0; 2318 } else { 2319 newProgress = (translate - swiper.minTranslate()) / translatesDiff; 2320 } 2321 2322 if (newProgress !== progress) { 2323 swiper.updateProgress(translate); 2324 } 2325 2326 swiper.emit('setTranslate', swiper.translate, byController); 2327} 2328 2329function minTranslate() { 2330 return -this.snapGrid[0]; 2331} 2332 2333function maxTranslate() { 2334 return -this.snapGrid[this.snapGrid.length - 1]; 2335} 2336 2337function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) { 2338 const swiper = this; 2339 const { 2340 params, 2341 wrapperEl 2342 } = swiper; 2343 2344 if (swiper.animating && params.preventInteractionOnTransition) { 2345 return false; 2346 } 2347 2348 const minTranslate = swiper.minTranslate(); 2349 const maxTranslate = swiper.maxTranslate(); 2350 let newTranslate; 2351 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress 2352 2353 swiper.updateProgress(newTranslate); 2354 2355 if (params.cssMode) { 2356 const isH = swiper.isHorizontal(); 2357 2358 if (speed === 0) { 2359 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate; 2360 } else { 2361 if (!swiper.support.smoothScroll) { 2362 animateCSSModeScroll({ 2363 swiper, 2364 targetPosition: -newTranslate, 2365 side: isH ? 'left' : 'top' 2366 }); 2367 return true; 2368 } 2369 2370 wrapperEl.scrollTo({ 2371 [isH ? 'left' : 'top']: -newTranslate, 2372 behavior: 'smooth' 2373 }); 2374 } 2375 2376 return true; 2377 } 2378 2379 if (speed === 0) { 2380 swiper.setTransition(0); 2381 swiper.setTranslate(newTranslate); 2382 2383 if (runCallbacks) { 2384 swiper.emit('beforeTransitionStart', speed, internal); 2385 swiper.emit('transitionEnd'); 2386 } 2387 } else { 2388 swiper.setTransition(speed); 2389 swiper.setTranslate(newTranslate); 2390 2391 if (runCallbacks) { 2392 swiper.emit('beforeTransitionStart', speed, internal); 2393 swiper.emit('transitionStart'); 2394 } 2395 2396 if (!swiper.animating) { 2397 swiper.animating = true; 2398 2399 if (!swiper.onTranslateToWrapperTransitionEnd) { 2400 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { 2401 if (!swiper || swiper.destroyed) return; 2402 if (e.target !== this) return; 2403 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); 2404 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); 2405 swiper.onTranslateToWrapperTransitionEnd = null; 2406 delete swiper.onTranslateToWrapperTransitionEnd; 2407 2408 if (runCallbacks) { 2409 swiper.emit('transitionEnd'); 2410 } 2411 }; 2412 } 2413 2414 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd); 2415 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd); 2416 } 2417 } 2418 2419 return true; 2420} 2421 2422var translate = { 2423 getTranslate: getSwiperTranslate, 2424 setTranslate, 2425 minTranslate, 2426 maxTranslate, 2427 translateTo 2428}; 2429 2430function setTransition(duration, byController) { 2431 const swiper = this; 2432 2433 if (!swiper.params.cssMode) { 2434 swiper.$wrapperEl.transition(duration); 2435 } 2436 2437 swiper.emit('setTransition', duration, byController); 2438} 2439 2440function transitionEmit({ 2441 swiper, 2442 runCallbacks, 2443 direction, 2444 step 2445}) { 2446 const { 2447 activeIndex, 2448 previousIndex 2449 } = swiper; 2450 let dir = direction; 2451 2452 if (!dir) { 2453 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset'; 2454 } 2455 2456 swiper.emit(`transition${step}`); 2457 2458 if (runCallbacks && activeIndex !== previousIndex) { 2459 if (dir === 'reset') { 2460 swiper.emit(`slideResetTransition${step}`); 2461 return; 2462 } 2463 2464 swiper.emit(`slideChangeTransition${step}`); 2465 2466 if (dir === 'next') { 2467 swiper.emit(`slideNextTransition${step}`); 2468 } else { 2469 swiper.emit(`slidePrevTransition${step}`); 2470 } 2471 } 2472} 2473 2474function transitionStart(runCallbacks = true, direction) { 2475 const swiper = this; 2476 const { 2477 params 2478 } = swiper; 2479 if (params.cssMode) return; 2480 2481 if (params.autoHeight) { 2482 swiper.updateAutoHeight(); 2483 } 2484 2485 transitionEmit({ 2486 swiper, 2487 runCallbacks, 2488 direction, 2489 step: 'Start' 2490 }); 2491} 2492 2493function transitionEnd(runCallbacks = true, direction) { 2494 const swiper = this; 2495 const { 2496 params 2497 } = swiper; 2498 swiper.animating = false; 2499 if (params.cssMode) return; 2500 swiper.setTransition(0); 2501 transitionEmit({ 2502 swiper, 2503 runCallbacks, 2504 direction, 2505 step: 'End' 2506 }); 2507} 2508 2509var transition = { 2510 setTransition, 2511 transitionStart, 2512 transitionEnd 2513}; 2514 2515function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) { 2516 if (typeof index !== 'number' && typeof index !== 'string') { 2517 throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`); 2518 } 2519 2520 if (typeof index === 'string') { 2521 /** 2522 * The `index` argument converted from `string` to `number`. 2523 * @type {number} 2524 */ 2525 const indexAsNumber = parseInt(index, 10); 2526 /** 2527 * Determines whether the `index` argument is a valid `number` 2528 * after being converted from the `string` type. 2529 * @type {boolean} 2530 */ 2531 2532 const isValidNumber = isFinite(indexAsNumber); 2533 2534 if (!isValidNumber) { 2535 throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`); 2536 } // Knowing that the converted `index` is a valid number, 2537 // we can update the original argument's value. 2538 2539 2540 index = indexAsNumber; 2541 } 2542 2543 const swiper = this; 2544 let slideIndex = index; 2545 if (slideIndex < 0) slideIndex = 0; 2546 const { 2547 params, 2548 snapGrid, 2549 slidesGrid, 2550 previousIndex, 2551 activeIndex, 2552 rtlTranslate: rtl, 2553 wrapperEl, 2554 enabled 2555 } = swiper; 2556 2557 if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) { 2558 return false; 2559 } 2560 2561 const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); 2562 let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); 2563 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; 2564 const translate = -snapGrid[snapIndex]; // Normalize slideIndex 2565 2566 if (params.normalizeSlideIndex) { 2567 for (let i = 0; i < slidesGrid.length; i += 1) { 2568 const normalizedTranslate = -Math.floor(translate * 100); 2569 const normalizedGrid = Math.floor(slidesGrid[i] * 100); 2570 const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); 2571 2572 if (typeof slidesGrid[i + 1] !== 'undefined') { 2573 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) { 2574 slideIndex = i; 2575 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) { 2576 slideIndex = i + 1; 2577 } 2578 } else if (normalizedTranslate >= normalizedGrid) { 2579 slideIndex = i; 2580 } 2581 } 2582 } // Directions locks 2583 2584 2585 if (swiper.initialized && slideIndex !== activeIndex) { 2586 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) { 2587 return false; 2588 } 2589 2590 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) { 2591 if ((activeIndex || 0) !== slideIndex) return false; 2592 } 2593 } 2594 2595 if (slideIndex !== (previousIndex || 0) && runCallbacks) { 2596 swiper.emit('beforeSlideChangeStart'); 2597 } // Update progress 2598 2599 2600 swiper.updateProgress(translate); 2601 let direction; 2602 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index 2603 2604 if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) { 2605 swiper.updateActiveIndex(slideIndex); // Update Height 2606 2607 if (params.autoHeight) { 2608 swiper.updateAutoHeight(); 2609 } 2610 2611 swiper.updateSlidesClasses(); 2612 2613 if (params.effect !== 'slide') { 2614 swiper.setTranslate(translate); 2615 } 2616 2617 if (direction !== 'reset') { 2618 swiper.transitionStart(runCallbacks, direction); 2619 swiper.transitionEnd(runCallbacks, direction); 2620 } 2621 2622 return false; 2623 } 2624 2625 if (params.cssMode) { 2626 const isH = swiper.isHorizontal(); 2627 const t = rtl ? translate : -translate; 2628 2629 if (speed === 0) { 2630 const isVirtual = swiper.virtual && swiper.params.virtual.enabled; 2631 2632 if (isVirtual) { 2633 swiper.wrapperEl.style.scrollSnapType = 'none'; 2634 swiper._immediateVirtual = true; 2635 } 2636 2637 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t; 2638 2639 if (isVirtual) { 2640 requestAnimationFrame(() => { 2641 swiper.wrapperEl.style.scrollSnapType = ''; 2642 swiper._swiperImmediateVirtual = false; 2643 }); 2644 } 2645 } else { 2646 if (!swiper.support.smoothScroll) { 2647 animateCSSModeScroll({ 2648 swiper, 2649 targetPosition: t, 2650 side: isH ? 'left' : 'top' 2651 }); 2652 return true; 2653 } 2654 2655 wrapperEl.scrollTo({ 2656 [isH ? 'left' : 'top']: t, 2657 behavior: 'smooth' 2658 }); 2659 } 2660 2661 return true; 2662 } 2663 2664 swiper.setTransition(speed); 2665 swiper.setTranslate(translate); 2666 swiper.updateActiveIndex(slideIndex); 2667 swiper.updateSlidesClasses(); 2668 swiper.emit('beforeTransitionStart', speed, internal); 2669 swiper.transitionStart(runCallbacks, direction); 2670 2671 if (speed === 0) { 2672 swiper.transitionEnd(runCallbacks, direction); 2673 } else if (!swiper.animating) { 2674 swiper.animating = true; 2675 2676 if (!swiper.onSlideToWrapperTransitionEnd) { 2677 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { 2678 if (!swiper || swiper.destroyed) return; 2679 if (e.target !== this) return; 2680 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); 2681 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); 2682 swiper.onSlideToWrapperTransitionEnd = null; 2683 delete swiper.onSlideToWrapperTransitionEnd; 2684 swiper.transitionEnd(runCallbacks, direction); 2685 }; 2686 } 2687 2688 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd); 2689 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd); 2690 } 2691 2692 return true; 2693} 2694 2695function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) { 2696 if (typeof index === 'string') { 2697 /** 2698 * The `index` argument converted from `string` to `number`. 2699 * @type {number} 2700 */ 2701 const indexAsNumber = parseInt(index, 10); 2702 /** 2703 * Determines whether the `index` argument is a valid `number` 2704 * after being converted from the `string` type. 2705 * @type {boolean} 2706 */ 2707 2708 const isValidNumber = isFinite(indexAsNumber); 2709 2710 if (!isValidNumber) { 2711 throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`); 2712 } // Knowing that the converted `index` is a valid number, 2713 // we can update the original argument's value. 2714 2715 2716 index = indexAsNumber; 2717 } 2718 2719 const swiper = this; 2720 let newIndex = index; 2721 2722 if (swiper.params.loop) { 2723 newIndex += swiper.loopedSlides; 2724 } 2725 2726 return swiper.slideTo(newIndex, speed, runCallbacks, internal); 2727} 2728 2729/* eslint no-unused-vars: "off" */ 2730function slideNext(speed = this.params.speed, runCallbacks = true, internal) { 2731 const swiper = this; 2732 const { 2733 animating, 2734 enabled, 2735 params 2736 } = swiper; 2737 if (!enabled) return swiper; 2738 let perGroup = params.slidesPerGroup; 2739 2740 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 2741 perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1); 2742 } 2743 2744 const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; 2745 2746 if (params.loop) { 2747 if (animating && params.loopPreventsSlide) return false; 2748 swiper.loopFix(); // eslint-disable-next-line 2749 2750 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; 2751 } 2752 2753 if (params.rewind && swiper.isEnd) { 2754 return swiper.slideTo(0, speed, runCallbacks, internal); 2755 } 2756 2757 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal); 2758} 2759 2760/* eslint no-unused-vars: "off" */ 2761function slidePrev(speed = this.params.speed, runCallbacks = true, internal) { 2762 const swiper = this; 2763 const { 2764 params, 2765 animating, 2766 snapGrid, 2767 slidesGrid, 2768 rtlTranslate, 2769 enabled 2770 } = swiper; 2771 if (!enabled) return swiper; 2772 2773 if (params.loop) { 2774 if (animating && params.loopPreventsSlide) return false; 2775 swiper.loopFix(); // eslint-disable-next-line 2776 2777 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; 2778 } 2779 2780 const translate = rtlTranslate ? swiper.translate : -swiper.translate; 2781 2782 function normalize(val) { 2783 if (val < 0) return -Math.floor(Math.abs(val)); 2784 return Math.floor(val); 2785 } 2786 2787 const normalizedTranslate = normalize(translate); 2788 const normalizedSnapGrid = snapGrid.map(val => normalize(val)); 2789 let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; 2790 2791 if (typeof prevSnap === 'undefined' && params.cssMode) { 2792 let prevSnapIndex; 2793 snapGrid.forEach((snap, snapIndex) => { 2794 if (normalizedTranslate >= snap) { 2795 // prevSnap = snap; 2796 prevSnapIndex = snapIndex; 2797 } 2798 }); 2799 2800 if (typeof prevSnapIndex !== 'undefined') { 2801 prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; 2802 } 2803 } 2804 2805 let prevIndex = 0; 2806 2807 if (typeof prevSnap !== 'undefined') { 2808 prevIndex = slidesGrid.indexOf(prevSnap); 2809 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; 2810 2811 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) { 2812 prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1; 2813 prevIndex = Math.max(prevIndex, 0); 2814 } 2815 } 2816 2817 if (params.rewind && swiper.isBeginning) { 2818 const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 2819 return swiper.slideTo(lastIndex, speed, runCallbacks, internal); 2820 } 2821 2822 return swiper.slideTo(prevIndex, speed, runCallbacks, internal); 2823} 2824 2825/* eslint no-unused-vars: "off" */ 2826function slideReset(speed = this.params.speed, runCallbacks = true, internal) { 2827 const swiper = this; 2828 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); 2829} 2830 2831/* eslint no-unused-vars: "off" */ 2832function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) { 2833 const swiper = this; 2834 let index = swiper.activeIndex; 2835 const skip = Math.min(swiper.params.slidesPerGroupSkip, index); 2836 const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); 2837 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate; 2838 2839 if (translate >= swiper.snapGrid[snapIndex]) { 2840 // The current translate is on or after the current snap index, so the choice 2841 // is between the current index and the one after it. 2842 const currentSnap = swiper.snapGrid[snapIndex]; 2843 const nextSnap = swiper.snapGrid[snapIndex + 1]; 2844 2845 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { 2846 index += swiper.params.slidesPerGroup; 2847 } 2848 } else { 2849 // The current translate is before the current snap index, so the choice 2850 // is between the current index and the one before it. 2851 const prevSnap = swiper.snapGrid[snapIndex - 1]; 2852 const currentSnap = swiper.snapGrid[snapIndex]; 2853 2854 if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) { 2855 index -= swiper.params.slidesPerGroup; 2856 } 2857 } 2858 2859 index = Math.max(index, 0); 2860 index = Math.min(index, swiper.slidesGrid.length - 1); 2861 return swiper.slideTo(index, speed, runCallbacks, internal); 2862} 2863 2864function slideToClickedSlide() { 2865 const swiper = this; 2866 const { 2867 params, 2868 $wrapperEl 2869 } = swiper; 2870 const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView; 2871 let slideToIndex = swiper.clickedIndex; 2872 let realIndex; 2873 2874 if (params.loop) { 2875 if (swiper.animating) return; 2876 realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10); 2877 2878 if (params.centeredSlides) { 2879 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) { 2880 swiper.loopFix(); 2881 slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); 2882 nextTick(() => { 2883 swiper.slideTo(slideToIndex); 2884 }); 2885 } else { 2886 swiper.slideTo(slideToIndex); 2887 } 2888 } else if (slideToIndex > swiper.slides.length - slidesPerView) { 2889 swiper.loopFix(); 2890 slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`).eq(0).index(); 2891 nextTick(() => { 2892 swiper.slideTo(slideToIndex); 2893 }); 2894 } else { 2895 swiper.slideTo(slideToIndex); 2896 } 2897 } else { 2898 swiper.slideTo(slideToIndex); 2899 } 2900} 2901 2902var slide = { 2903 slideTo, 2904 slideToLoop, 2905 slideNext, 2906 slidePrev, 2907 slideReset, 2908 slideToClosest, 2909 slideToClickedSlide 2910}; 2911 2912function loopCreate() { 2913 const swiper = this; 2914 const document = getDocument(); 2915 const { 2916 params, 2917 $wrapperEl 2918 } = swiper; // Remove duplicated slides 2919 2920 const $selector = $wrapperEl.children().length > 0 ? $($wrapperEl.children()[0].parentNode) : $wrapperEl; 2921 $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove(); 2922 let slides = $selector.children(`.${params.slideClass}`); 2923 2924 if (params.loopFillGroupWithBlank) { 2925 const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup; 2926 2927 if (blankSlidesNum !== params.slidesPerGroup) { 2928 for (let i = 0; i < blankSlidesNum; i += 1) { 2929 const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`); 2930 $selector.append(blankNode); 2931 } 2932 2933 slides = $selector.children(`.${params.slideClass}`); 2934 } 2935 } 2936 2937 if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length; 2938 swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10)); 2939 swiper.loopedSlides += params.loopAdditionalSlides; 2940 2941 if (swiper.loopedSlides > slides.length && swiper.params.loopedSlidesLimit) { 2942 swiper.loopedSlides = slides.length; 2943 } 2944 2945 const prependSlides = []; 2946 const appendSlides = []; 2947 slides.each((el, index) => { 2948 const slide = $(el); 2949 slide.attr('data-swiper-slide-index', index); 2950 }); 2951 2952 for (let i = 0; i < swiper.loopedSlides; i += 1) { 2953 const index = i - Math.floor(i / slides.length) * slides.length; 2954 appendSlides.push(slides.eq(index)[0]); 2955 prependSlides.unshift(slides.eq(slides.length - index - 1)[0]); 2956 } 2957 2958 for (let i = 0; i < appendSlides.length; i += 1) { 2959 $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); 2960 } 2961 2962 for (let i = prependSlides.length - 1; i >= 0; i -= 1) { 2963 $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass)); 2964 } 2965} 2966 2967function loopFix() { 2968 const swiper = this; 2969 swiper.emit('beforeLoopFix'); 2970 const { 2971 activeIndex, 2972 slides, 2973 loopedSlides, 2974 allowSlidePrev, 2975 allowSlideNext, 2976 snapGrid, 2977 rtlTranslate: rtl 2978 } = swiper; 2979 let newIndex; 2980 swiper.allowSlidePrev = true; 2981 swiper.allowSlideNext = true; 2982 const snapTranslate = -snapGrid[activeIndex]; 2983 const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding 2984 2985 if (activeIndex < loopedSlides) { 2986 newIndex = slides.length - loopedSlides * 3 + activeIndex; 2987 newIndex += loopedSlides; 2988 const slideChanged = swiper.slideTo(newIndex, 0, false, true); 2989 2990 if (slideChanged && diff !== 0) { 2991 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); 2992 } 2993 } else if (activeIndex >= slides.length - loopedSlides) { 2994 // Fix For Positive Oversliding 2995 newIndex = -slides.length + activeIndex + loopedSlides; 2996 newIndex += loopedSlides; 2997 const slideChanged = swiper.slideTo(newIndex, 0, false, true); 2998 2999 if (slideChanged && diff !== 0) { 3000 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff); 3001 } 3002 } 3003 3004 swiper.allowSlidePrev = allowSlidePrev; 3005 swiper.allowSlideNext = allowSlideNext; 3006 swiper.emit('loopFix'); 3007} 3008 3009function loopDestroy() { 3010 const swiper = this; 3011 const { 3012 $wrapperEl, 3013 params, 3014 slides 3015 } = swiper; 3016 $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove(); 3017 slides.removeAttr('data-swiper-slide-index'); 3018} 3019 3020var loop = { 3021 loopCreate, 3022 loopFix, 3023 loopDestroy 3024}; 3025 3026function setGrabCursor(moving) { 3027 const swiper = this; 3028 if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return; 3029 const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl; 3030 el.style.cursor = 'move'; 3031 el.style.cursor = moving ? 'grabbing' : 'grab'; 3032} 3033 3034function unsetGrabCursor() { 3035 const swiper = this; 3036 3037 if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) { 3038 return; 3039 } 3040 3041 swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = ''; 3042} 3043 3044var grabCursor = { 3045 setGrabCursor, 3046 unsetGrabCursor 3047}; 3048 3049function closestElement(selector, base = this) { 3050 function __closestFrom(el) { 3051 if (!el || el === getDocument() || el === getWindow()) return null; 3052 if (el.assignedSlot) el = el.assignedSlot; 3053 const found = el.closest(selector); 3054 3055 if (!found && !el.getRootNode) { 3056 return null; 3057 } 3058 3059 return found || __closestFrom(el.getRootNode().host); 3060 } 3061 3062 return __closestFrom(base); 3063} 3064 3065function onTouchStart(event) { 3066 const swiper = this; 3067 const document = getDocument(); 3068 const window = getWindow(); 3069 const data = swiper.touchEventsData; 3070 const { 3071 params, 3072 touches, 3073 enabled 3074 } = swiper; 3075 if (!enabled) return; 3076 3077 if (swiper.animating && params.preventInteractionOnTransition) { 3078 return; 3079 } 3080 3081 if (!swiper.animating && params.cssMode && params.loop) { 3082 swiper.loopFix(); 3083 } 3084 3085 let e = event; 3086 if (e.originalEvent) e = e.originalEvent; 3087 let $targetEl = $(e.target); 3088 3089 if (params.touchEventsTarget === 'wrapper') { 3090 if (!$targetEl.closest(swiper.wrapperEl).length) return; 3091 } 3092 3093 data.isTouchEvent = e.type === 'touchstart'; 3094 if (!data.isTouchEvent && 'which' in e && e.which === 3) return; 3095 if (!data.isTouchEvent && 'button' in e && e.button > 0) return; 3096 if (data.isTouched && data.isMoved) return; // change target el for shadow root component 3097 3098 const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== ''; // eslint-disable-next-line 3099 3100 const eventPath = event.composedPath ? event.composedPath() : event.path; 3101 3102 if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) { 3103 $targetEl = $(eventPath[0]); 3104 } 3105 3106 const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`; 3107 const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element 3108 3109 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, $targetEl[0]) : $targetEl.closest(noSwipingSelector)[0])) { 3110 swiper.allowClick = true; 3111 return; 3112 } 3113 3114 if (params.swipeHandler) { 3115 if (!$targetEl.closest(params.swipeHandler)[0]) return; 3116 } 3117 3118 touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX; 3119 touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY; 3120 const startX = touches.currentX; 3121 const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore 3122 3123 const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; 3124 const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; 3125 3126 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) { 3127 if (edgeSwipeDetection === 'prevent') { 3128 event.preventDefault(); 3129 } else { 3130 return; 3131 } 3132 } 3133 3134 Object.assign(data, { 3135 isTouched: true, 3136 isMoved: false, 3137 allowTouchCallbacks: true, 3138 isScrolling: undefined, 3139 startMoving: undefined 3140 }); 3141 touches.startX = startX; 3142 touches.startY = startY; 3143 data.touchStartTime = now(); 3144 swiper.allowClick = true; 3145 swiper.updateSize(); 3146 swiper.swipeDirection = undefined; 3147 if (params.threshold > 0) data.allowThresholdMove = false; 3148 3149 if (e.type !== 'touchstart') { 3150 let preventDefault = true; 3151 3152 if ($targetEl.is(data.focusableElements)) { 3153 preventDefault = false; 3154 3155 if ($targetEl[0].nodeName === 'SELECT') { 3156 data.isTouched = false; 3157 } 3158 } 3159 3160 if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) { 3161 document.activeElement.blur(); 3162 } 3163 3164 const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault; 3165 3166 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) { 3167 e.preventDefault(); 3168 } 3169 } 3170 3171 if (swiper.params.freeMode && swiper.params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) { 3172 swiper.freeMode.onTouchStart(); 3173 } 3174 3175 swiper.emit('touchStart', e); 3176} 3177 3178function onTouchMove(event) { 3179 const document = getDocument(); 3180 const swiper = this; 3181 const data = swiper.touchEventsData; 3182 const { 3183 params, 3184 touches, 3185 rtlTranslate: rtl, 3186 enabled 3187 } = swiper; 3188 if (!enabled) return; 3189 let e = event; 3190 if (e.originalEvent) e = e.originalEvent; 3191 3192 if (!data.isTouched) { 3193 if (data.startMoving && data.isScrolling) { 3194 swiper.emit('touchMoveOpposite', e); 3195 } 3196 3197 return; 3198 } 3199 3200 if (data.isTouchEvent && e.type !== 'touchmove') return; 3201 const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]); 3202 const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX; 3203 const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY; 3204 3205 if (e.preventedByNestedSwiper) { 3206 touches.startX = pageX; 3207 touches.startY = pageY; 3208 return; 3209 } 3210 3211 if (!swiper.allowTouchMove) { 3212 if (!$(e.target).is(data.focusableElements)) { 3213 swiper.allowClick = false; 3214 } 3215 3216 if (data.isTouched) { 3217 Object.assign(touches, { 3218 startX: pageX, 3219 startY: pageY, 3220 currentX: pageX, 3221 currentY: pageY 3222 }); 3223 data.touchStartTime = now(); 3224 } 3225 3226 return; 3227 } 3228 3229 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { 3230 if (swiper.isVertical()) { 3231 // Vertical 3232 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) { 3233 data.isTouched = false; 3234 data.isMoved = false; 3235 return; 3236 } 3237 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) { 3238 return; 3239 } 3240 } 3241 3242 if (data.isTouchEvent && document.activeElement) { 3243 if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) { 3244 data.isMoved = true; 3245 swiper.allowClick = false; 3246 return; 3247 } 3248 } 3249 3250 if (data.allowTouchCallbacks) { 3251 swiper.emit('touchMove', e); 3252 } 3253 3254 if (e.targetTouches && e.targetTouches.length > 1) return; 3255 touches.currentX = pageX; 3256 touches.currentY = pageY; 3257 const diffX = touches.currentX - touches.startX; 3258 const diffY = touches.currentY - touches.startY; 3259 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return; 3260 3261 if (typeof data.isScrolling === 'undefined') { 3262 let touchAngle; 3263 3264 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) { 3265 data.isScrolling = false; 3266 } else { 3267 // eslint-disable-next-line 3268 if (diffX * diffX + diffY * diffY >= 25) { 3269 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI; 3270 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle; 3271 } 3272 } 3273 } 3274 3275 if (data.isScrolling) { 3276 swiper.emit('touchMoveOpposite', e); 3277 } 3278 3279 if (typeof data.startMoving === 'undefined') { 3280 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) { 3281 data.startMoving = true; 3282 } 3283 } 3284 3285 if (data.isScrolling) { 3286 data.isTouched = false; 3287 return; 3288 } 3289 3290 if (!data.startMoving) { 3291 return; 3292 } 3293 3294 swiper.allowClick = false; 3295 3296 if (!params.cssMode && e.cancelable) { 3297 e.preventDefault(); 3298 } 3299 3300 if (params.touchMoveStopPropagation && !params.nested) { 3301 e.stopPropagation(); 3302 } 3303 3304 if (!data.isMoved) { 3305 if (params.loop && !params.cssMode) { 3306 swiper.loopFix(); 3307 } 3308 3309 data.startTranslate = swiper.getTranslate(); 3310 swiper.setTransition(0); 3311 3312 if (swiper.animating) { 3313 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend'); 3314 } 3315 3316 data.allowMomentumBounce = false; // Grab Cursor 3317 3318 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 3319 swiper.setGrabCursor(true); 3320 } 3321 3322 swiper.emit('sliderFirstMove', e); 3323 } 3324 3325 swiper.emit('sliderMove', e); 3326 data.isMoved = true; 3327 let diff = swiper.isHorizontal() ? diffX : diffY; 3328 touches.diff = diff; 3329 diff *= params.touchRatio; 3330 if (rtl) diff = -diff; 3331 swiper.swipeDirection = diff > 0 ? 'prev' : 'next'; 3332 data.currentTranslate = diff + data.startTranslate; 3333 let disableParentSwiper = true; 3334 let resistanceRatio = params.resistanceRatio; 3335 3336 if (params.touchReleaseOnEdges) { 3337 resistanceRatio = 0; 3338 } 3339 3340 if (diff > 0 && data.currentTranslate > swiper.minTranslate()) { 3341 disableParentSwiper = false; 3342 if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio; 3343 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { 3344 disableParentSwiper = false; 3345 if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio; 3346 } 3347 3348 if (disableParentSwiper) { 3349 e.preventedByNestedSwiper = true; 3350 } // Directions locks 3351 3352 3353 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) { 3354 data.currentTranslate = data.startTranslate; 3355 } 3356 3357 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) { 3358 data.currentTranslate = data.startTranslate; 3359 } 3360 3361 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { 3362 data.currentTranslate = data.startTranslate; 3363 } // Threshold 3364 3365 3366 if (params.threshold > 0) { 3367 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { 3368 if (!data.allowThresholdMove) { 3369 data.allowThresholdMove = true; 3370 touches.startX = touches.currentX; 3371 touches.startY = touches.currentY; 3372 data.currentTranslate = data.startTranslate; 3373 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY; 3374 return; 3375 } 3376 } else { 3377 data.currentTranslate = data.startTranslate; 3378 return; 3379 } 3380 } 3381 3382 if (!params.followFinger || params.cssMode) return; // Update active index in free mode 3383 3384 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) { 3385 swiper.updateActiveIndex(); 3386 swiper.updateSlidesClasses(); 3387 } 3388 3389 if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) { 3390 swiper.freeMode.onTouchMove(); 3391 } // Update progress 3392 3393 3394 swiper.updateProgress(data.currentTranslate); // Update translate 3395 3396 swiper.setTranslate(data.currentTranslate); 3397} 3398 3399function onTouchEnd(event) { 3400 const swiper = this; 3401 const data = swiper.touchEventsData; 3402 const { 3403 params, 3404 touches, 3405 rtlTranslate: rtl, 3406 slidesGrid, 3407 enabled 3408 } = swiper; 3409 if (!enabled) return; 3410 let e = event; 3411 if (e.originalEvent) e = e.originalEvent; 3412 3413 if (data.allowTouchCallbacks) { 3414 swiper.emit('touchEnd', e); 3415 } 3416 3417 data.allowTouchCallbacks = false; 3418 3419 if (!data.isTouched) { 3420 if (data.isMoved && params.grabCursor) { 3421 swiper.setGrabCursor(false); 3422 } 3423 3424 data.isMoved = false; 3425 data.startMoving = false; 3426 return; 3427 } // Return Grab Cursor 3428 3429 3430 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) { 3431 swiper.setGrabCursor(false); 3432 } // Time diff 3433 3434 3435 const touchEndTime = now(); 3436 const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click 3437 3438 if (swiper.allowClick) { 3439 const pathTree = e.path || e.composedPath && e.composedPath(); 3440 swiper.updateClickedSlide(pathTree && pathTree[0] || e.target); 3441 swiper.emit('tap click', e); 3442 3443 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { 3444 swiper.emit('doubleTap doubleClick', e); 3445 } 3446 } 3447 3448 data.lastClickTime = now(); 3449 nextTick(() => { 3450 if (!swiper.destroyed) swiper.allowClick = true; 3451 }); 3452 3453 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) { 3454 data.isTouched = false; 3455 data.isMoved = false; 3456 data.startMoving = false; 3457 return; 3458 } 3459 3460 data.isTouched = false; 3461 data.isMoved = false; 3462 data.startMoving = false; 3463 let currentPos; 3464 3465 if (params.followFinger) { 3466 currentPos = rtl ? swiper.translate : -swiper.translate; 3467 } else { 3468 currentPos = -data.currentTranslate; 3469 } 3470 3471 if (params.cssMode) { 3472 return; 3473 } 3474 3475 if (swiper.params.freeMode && params.freeMode.enabled) { 3476 swiper.freeMode.onTouchEnd({ 3477 currentPos 3478 }); 3479 return; 3480 } // Find current slide 3481 3482 3483 let stopIndex = 0; 3484 let groupSize = swiper.slidesSizesGrid[0]; 3485 3486 for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) { 3487 const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 3488 3489 if (typeof slidesGrid[i + increment] !== 'undefined') { 3490 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) { 3491 stopIndex = i; 3492 groupSize = slidesGrid[i + increment] - slidesGrid[i]; 3493 } 3494 } else if (currentPos >= slidesGrid[i]) { 3495 stopIndex = i; 3496 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; 3497 } 3498 } 3499 3500 let rewindFirstIndex = null; 3501 let rewindLastIndex = null; 3502 3503 if (params.rewind) { 3504 if (swiper.isBeginning) { 3505 rewindLastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1; 3506 } else if (swiper.isEnd) { 3507 rewindFirstIndex = 0; 3508 } 3509 } // Find current slide size 3510 3511 3512 const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; 3513 const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; 3514 3515 if (timeDiff > params.longSwipesMs) { 3516 // Long touches 3517 if (!params.longSwipes) { 3518 swiper.slideTo(swiper.activeIndex); 3519 return; 3520 } 3521 3522 if (swiper.swipeDirection === 'next') { 3523 if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex); 3524 } 3525 3526 if (swiper.swipeDirection === 'prev') { 3527 if (ratio > 1 - params.longSwipesRatio) { 3528 swiper.slideTo(stopIndex + increment); 3529 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) { 3530 swiper.slideTo(rewindLastIndex); 3531 } else { 3532 swiper.slideTo(stopIndex); 3533 } 3534 } 3535 } else { 3536 // Short swipes 3537 if (!params.shortSwipes) { 3538 swiper.slideTo(swiper.activeIndex); 3539 return; 3540 } 3541 3542 const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl); 3543 3544 if (!isNavButtonTarget) { 3545 if (swiper.swipeDirection === 'next') { 3546 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment); 3547 } 3548 3549 if (swiper.swipeDirection === 'prev') { 3550 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex); 3551 } 3552 } else if (e.target === swiper.navigation.nextEl) { 3553 swiper.slideTo(stopIndex + increment); 3554 } else { 3555 swiper.slideTo(stopIndex); 3556 } 3557 } 3558} 3559 3560function onResize() { 3561 const swiper = this; 3562 const { 3563 params, 3564 el 3565 } = swiper; 3566 if (el && el.offsetWidth === 0) return; // Breakpoints 3567 3568 if (params.breakpoints) { 3569 swiper.setBreakpoint(); 3570 } // Save locks 3571 3572 3573 const { 3574 allowSlideNext, 3575 allowSlidePrev, 3576 snapGrid 3577 } = swiper; // Disable locks on resize 3578 3579 swiper.allowSlideNext = true; 3580 swiper.allowSlidePrev = true; 3581 swiper.updateSize(); 3582 swiper.updateSlides(); 3583 swiper.updateSlidesClasses(); 3584 3585 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) { 3586 swiper.slideTo(swiper.slides.length - 1, 0, false, true); 3587 } else { 3588 swiper.slideTo(swiper.activeIndex, 0, false, true); 3589 } 3590 3591 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { 3592 swiper.autoplay.run(); 3593 } // Return locks after resize 3594 3595 3596 swiper.allowSlidePrev = allowSlidePrev; 3597 swiper.allowSlideNext = allowSlideNext; 3598 3599 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { 3600 swiper.checkOverflow(); 3601 } 3602} 3603 3604function onClick(e) { 3605 const swiper = this; 3606 if (!swiper.enabled) return; 3607 3608 if (!swiper.allowClick) { 3609 if (swiper.params.preventClicks) e.preventDefault(); 3610 3611 if (swiper.params.preventClicksPropagation && swiper.animating) { 3612 e.stopPropagation(); 3613 e.stopImmediatePropagation(); 3614 } 3615 } 3616} 3617 3618function onScroll() { 3619 const swiper = this; 3620 const { 3621 wrapperEl, 3622 rtlTranslate, 3623 enabled 3624 } = swiper; 3625 if (!enabled) return; 3626 swiper.previousTranslate = swiper.translate; 3627 3628 if (swiper.isHorizontal()) { 3629 swiper.translate = -wrapperEl.scrollLeft; 3630 } else { 3631 swiper.translate = -wrapperEl.scrollTop; 3632 } // eslint-disable-next-line 3633 3634 3635 if (swiper.translate === 0) swiper.translate = 0; 3636 swiper.updateActiveIndex(); 3637 swiper.updateSlidesClasses(); 3638 let newProgress; 3639 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); 3640 3641 if (translatesDiff === 0) { 3642 newProgress = 0; 3643 } else { 3644 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; 3645 } 3646 3647 if (newProgress !== swiper.progress) { 3648 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate); 3649 } 3650 3651 swiper.emit('setTranslate', swiper.translate, false); 3652} 3653 3654let dummyEventAttached = false; 3655 3656function dummyEventListener() {} 3657 3658const events = (swiper, method) => { 3659 const document = getDocument(); 3660 const { 3661 params, 3662 touchEvents, 3663 el, 3664 wrapperEl, 3665 device, 3666 support 3667 } = swiper; 3668 const capture = !!params.nested; 3669 const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener'; 3670 const swiperMethod = method; // Touch Events 3671 3672 if (!support.touch) { 3673 el[domMethod](touchEvents.start, swiper.onTouchStart, false); 3674 document[domMethod](touchEvents.move, swiper.onTouchMove, capture); 3675 document[domMethod](touchEvents.end, swiper.onTouchEnd, false); 3676 } else { 3677 const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? { 3678 passive: true, 3679 capture: false 3680 } : false; 3681 el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener); 3682 el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? { 3683 passive: false, 3684 capture 3685 } : capture); 3686 el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener); 3687 3688 if (touchEvents.cancel) { 3689 el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener); 3690 } 3691 } // Prevent Links Clicks 3692 3693 3694 if (params.preventClicks || params.preventClicksPropagation) { 3695 el[domMethod]('click', swiper.onClick, true); 3696 } 3697 3698 if (params.cssMode) { 3699 wrapperEl[domMethod]('scroll', swiper.onScroll); 3700 } // Resize handler 3701 3702 3703 if (params.updateOnWindowResize) { 3704 swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true); 3705 } else { 3706 swiper[swiperMethod]('observerUpdate', onResize, true); 3707 } 3708}; 3709 3710function attachEvents() { 3711 const swiper = this; 3712 const document = getDocument(); 3713 const { 3714 params, 3715 support 3716 } = swiper; 3717 swiper.onTouchStart = onTouchStart.bind(swiper); 3718 swiper.onTouchMove = onTouchMove.bind(swiper); 3719 swiper.onTouchEnd = onTouchEnd.bind(swiper); 3720 3721 if (params.cssMode) { 3722 swiper.onScroll = onScroll.bind(swiper); 3723 } 3724 3725 swiper.onClick = onClick.bind(swiper); 3726 3727 if (support.touch && !dummyEventAttached) { 3728 document.addEventListener('touchstart', dummyEventListener); 3729 dummyEventAttached = true; 3730 } 3731 3732 events(swiper, 'on'); 3733} 3734 3735function detachEvents() { 3736 const swiper = this; 3737 events(swiper, 'off'); 3738} 3739 3740var events$1 = { 3741 attachEvents, 3742 detachEvents 3743}; 3744 3745const isGridEnabled = (swiper, params) => { 3746 return swiper.grid && params.grid && params.grid.rows > 1; 3747}; 3748 3749function setBreakpoint() { 3750 const swiper = this; 3751 const { 3752 activeIndex, 3753 initialized, 3754 loopedSlides = 0, 3755 params, 3756 $el 3757 } = swiper; 3758 const breakpoints = params.breakpoints; 3759 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters 3760 3761 const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el); 3762 if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; 3763 const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; 3764 const breakpointParams = breakpointOnlyParams || swiper.originalParams; 3765 const wasMultiRow = isGridEnabled(swiper, params); 3766 const isMultiRow = isGridEnabled(swiper, breakpointParams); 3767 const wasEnabled = params.enabled; 3768 3769 if (wasMultiRow && !isMultiRow) { 3770 $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`); 3771 swiper.emitContainerClasses(); 3772 } else if (!wasMultiRow && isMultiRow) { 3773 $el.addClass(`${params.containerModifierClass}grid`); 3774 3775 if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') { 3776 $el.addClass(`${params.containerModifierClass}grid-column`); 3777 } 3778 3779 swiper.emitContainerClasses(); 3780 } // Toggle navigation, pagination, scrollbar 3781 3782 3783 ['navigation', 'pagination', 'scrollbar'].forEach(prop => { 3784 const wasModuleEnabled = params[prop] && params[prop].enabled; 3785 const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled; 3786 3787 if (wasModuleEnabled && !isModuleEnabled) { 3788 swiper[prop].disable(); 3789 } 3790 3791 if (!wasModuleEnabled && isModuleEnabled) { 3792 swiper[prop].enable(); 3793 } 3794 }); 3795 const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction; 3796 const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged); 3797 3798 if (directionChanged && initialized) { 3799 swiper.changeDirection(); 3800 } 3801 3802 extend(swiper.params, breakpointParams); 3803 const isEnabled = swiper.params.enabled; 3804 Object.assign(swiper, { 3805 allowTouchMove: swiper.params.allowTouchMove, 3806 allowSlideNext: swiper.params.allowSlideNext, 3807 allowSlidePrev: swiper.params.allowSlidePrev 3808 }); 3809 3810 if (wasEnabled && !isEnabled) { 3811 swiper.disable(); 3812 } else if (!wasEnabled && isEnabled) { 3813 swiper.enable(); 3814 } 3815 3816 swiper.currentBreakpoint = breakpoint; 3817 swiper.emit('_beforeBreakpoint', breakpointParams); 3818 3819 if (needsReLoop && initialized) { 3820 swiper.loopDestroy(); 3821 swiper.loopCreate(); 3822 swiper.updateSlides(); 3823 swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false); 3824 } 3825 3826 swiper.emit('breakpoint', breakpointParams); 3827} 3828 3829function getBreakpoint(breakpoints, base = 'window', containerEl) { 3830 if (!breakpoints || base === 'container' && !containerEl) return undefined; 3831 let breakpoint = false; 3832 const window = getWindow(); 3833 const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight; 3834 const points = Object.keys(breakpoints).map(point => { 3835 if (typeof point === 'string' && point.indexOf('@') === 0) { 3836 const minRatio = parseFloat(point.substr(1)); 3837 const value = currentHeight * minRatio; 3838 return { 3839 value, 3840 point 3841 }; 3842 } 3843 3844 return { 3845 value: point, 3846 point 3847 }; 3848 }); 3849 points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); 3850 3851 for (let i = 0; i < points.length; i += 1) { 3852 const { 3853 point, 3854 value 3855 } = points[i]; 3856 3857 if (base === 'window') { 3858 if (window.matchMedia(`(min-width: ${value}px)`).matches) { 3859 breakpoint = point; 3860 } 3861 } else if (value <= containerEl.clientWidth) { 3862 breakpoint = point; 3863 } 3864 } 3865 3866 return breakpoint || 'max'; 3867} 3868 3869var breakpoints = { 3870 setBreakpoint, 3871 getBreakpoint 3872}; 3873 3874function prepareClasses(entries, prefix) { 3875 const resultClasses = []; 3876 entries.forEach(item => { 3877 if (typeof item === 'object') { 3878 Object.keys(item).forEach(classNames => { 3879 if (item[classNames]) { 3880 resultClasses.push(prefix + classNames); 3881 } 3882 }); 3883 } else if (typeof item === 'string') { 3884 resultClasses.push(prefix + item); 3885 } 3886 }); 3887 return resultClasses; 3888} 3889 3890function addClasses() { 3891 const swiper = this; 3892 const { 3893 classNames, 3894 params, 3895 rtl, 3896 $el, 3897 device, 3898 support 3899 } = swiper; // prettier-ignore 3900 3901 const suffixes = prepareClasses(['initialized', params.direction, { 3902 'pointer-events': !support.touch 3903 }, { 3904 'free-mode': swiper.params.freeMode && params.freeMode.enabled 3905 }, { 3906 'autoheight': params.autoHeight 3907 }, { 3908 'rtl': rtl 3909 }, { 3910 'grid': params.grid && params.grid.rows > 1 3911 }, { 3912 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column' 3913 }, { 3914 'android': device.android 3915 }, { 3916 'ios': device.ios 3917 }, { 3918 'css-mode': params.cssMode 3919 }, { 3920 'centered': params.cssMode && params.centeredSlides 3921 }, { 3922 'watch-progress': params.watchSlidesProgress 3923 }], params.containerModifierClass); 3924 classNames.push(...suffixes); 3925 $el.addClass([...classNames].join(' ')); 3926 swiper.emitContainerClasses(); 3927} 3928 3929function removeClasses() { 3930 const swiper = this; 3931 const { 3932 $el, 3933 classNames 3934 } = swiper; 3935 $el.removeClass(classNames.join(' ')); 3936 swiper.emitContainerClasses(); 3937} 3938 3939var classes = { 3940 addClasses, 3941 removeClasses 3942}; 3943 3944function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) { 3945 const window = getWindow(); 3946 let image; 3947 3948 function onReady() { 3949 if (callback) callback(); 3950 } 3951 3952 const isPicture = $(imageEl).parent('picture')[0]; 3953 3954 if (!isPicture && (!imageEl.complete || !checkForComplete)) { 3955 if (src) { 3956 image = new window.Image(); 3957 image.onload = onReady; 3958 image.onerror = onReady; 3959 3960 if (sizes) { 3961 image.sizes = sizes; 3962 } 3963 3964 if (srcset) { 3965 image.srcset = srcset; 3966 } 3967 3968 if (src) { 3969 image.src = src; 3970 } 3971 } else { 3972 onReady(); 3973 } 3974 } else { 3975 // image already loaded... 3976 onReady(); 3977 } 3978} 3979 3980function preloadImages() { 3981 const swiper = this; 3982 swiper.imagesToLoad = swiper.$el.find('img'); 3983 3984 function onReady() { 3985 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return; 3986 if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; 3987 3988 if (swiper.imagesLoaded === swiper.imagesToLoad.length) { 3989 if (swiper.params.updateOnImagesReady) swiper.update(); 3990 swiper.emit('imagesReady'); 3991 } 3992 } 3993 3994 for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { 3995 const imageEl = swiper.imagesToLoad[i]; 3996 swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady); 3997 } 3998} 3999 4000var images = { 4001 loadImage, 4002 preloadImages 4003}; 4004 4005function checkOverflow() { 4006 const swiper = this; 4007 const { 4008 isLocked: wasLocked, 4009 params 4010 } = swiper; 4011 const { 4012 slidesOffsetBefore 4013 } = params; 4014 4015 if (slidesOffsetBefore) { 4016 const lastSlideIndex = swiper.slides.length - 1; 4017 const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2; 4018 swiper.isLocked = swiper.size > lastSlideRightEdge; 4019 } else { 4020 swiper.isLocked = swiper.snapGrid.length === 1; 4021 } 4022 4023 if (params.allowSlideNext === true) { 4024 swiper.allowSlideNext = !swiper.isLocked; 4025 } 4026 4027 if (params.allowSlidePrev === true) { 4028 swiper.allowSlidePrev = !swiper.isLocked; 4029 } 4030 4031 if (wasLocked && wasLocked !== swiper.isLocked) { 4032 swiper.isEnd = false; 4033 } 4034 4035 if (wasLocked !== swiper.isLocked) { 4036 swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); 4037 } 4038} 4039 4040var checkOverflow$1 = { 4041 checkOverflow 4042}; 4043 4044var defaults = { 4045 init: true, 4046 direction: 'horizontal', 4047 touchEventsTarget: 'wrapper', 4048 initialSlide: 0, 4049 speed: 300, 4050 cssMode: false, 4051 updateOnWindowResize: true, 4052 resizeObserver: true, 4053 nested: false, 4054 createElements: false, 4055 enabled: true, 4056 focusableElements: 'input, select, option, textarea, button, video, label', 4057 // Overrides 4058 width: null, 4059 height: null, 4060 // 4061 preventInteractionOnTransition: false, 4062 // ssr 4063 userAgent: null, 4064 url: null, 4065 // To support iOS's swipe-to-go-back gesture (when being used in-app). 4066 edgeSwipeDetection: false, 4067 edgeSwipeThreshold: 20, 4068 // Autoheight 4069 autoHeight: false, 4070 // Set wrapper width 4071 setWrapperSize: false, 4072 // Virtual Translate 4073 virtualTranslate: false, 4074 // Effects 4075 effect: 'slide', 4076 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' 4077 // Breakpoints 4078 breakpoints: undefined, 4079 breakpointsBase: 'window', 4080 // Slides grid 4081 spaceBetween: 0, 4082 slidesPerView: 1, 4083 slidesPerGroup: 1, 4084 slidesPerGroupSkip: 0, 4085 slidesPerGroupAuto: false, 4086 centeredSlides: false, 4087 centeredSlidesBounds: false, 4088 slidesOffsetBefore: 0, 4089 // in px 4090 slidesOffsetAfter: 0, 4091 // in px 4092 normalizeSlideIndex: true, 4093 centerInsufficientSlides: false, 4094 // Disable swiper and hide navigation when container not overflow 4095 watchOverflow: true, 4096 // Round length 4097 roundLengths: false, 4098 // Touches 4099 touchRatio: 1, 4100 touchAngle: 45, 4101 simulateTouch: true, 4102 shortSwipes: true, 4103 longSwipes: true, 4104 longSwipesRatio: 0.5, 4105 longSwipesMs: 300, 4106 followFinger: true, 4107 allowTouchMove: true, 4108 threshold: 0, 4109 touchMoveStopPropagation: false, 4110 touchStartPreventDefault: true, 4111 touchStartForcePreventDefault: false, 4112 touchReleaseOnEdges: false, 4113 // Unique Navigation Elements 4114 uniqueNavElements: true, 4115 // Resistance 4116 resistance: true, 4117 resistanceRatio: 0.85, 4118 // Progress 4119 watchSlidesProgress: false, 4120 // Cursor 4121 grabCursor: false, 4122 // Clicks 4123 preventClicks: true, 4124 preventClicksPropagation: true, 4125 slideToClickedSlide: false, 4126 // Images 4127 preloadImages: true, 4128 updateOnImagesReady: true, 4129 // loop 4130 loop: false, 4131 loopAdditionalSlides: 0, 4132 loopedSlides: null, 4133 loopedSlidesLimit: true, 4134 loopFillGroupWithBlank: false, 4135 loopPreventsSlide: true, 4136 // rewind 4137 rewind: false, 4138 // Swiping/no swiping 4139 allowSlidePrev: true, 4140 allowSlideNext: true, 4141 swipeHandler: null, 4142 // '.swipe-handler', 4143 noSwiping: true, 4144 noSwipingClass: 'swiper-no-swiping', 4145 noSwipingSelector: null, 4146 // Passive Listeners 4147 passiveListeners: true, 4148 maxBackfaceHiddenSlides: 10, 4149 // NS 4150 containerModifierClass: 'swiper-', 4151 // NEW 4152 slideClass: 'swiper-slide', 4153 slideBlankClass: 'swiper-slide-invisible-blank', 4154 slideActiveClass: 'swiper-slide-active', 4155 slideDuplicateActiveClass: 'swiper-slide-duplicate-active', 4156 slideVisibleClass: 'swiper-slide-visible', 4157 slideDuplicateClass: 'swiper-slide-duplicate', 4158 slideNextClass: 'swiper-slide-next', 4159 slideDuplicateNextClass: 'swiper-slide-duplicate-next', 4160 slidePrevClass: 'swiper-slide-prev', 4161 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev', 4162 wrapperClass: 'swiper-wrapper', 4163 // Callbacks 4164 runCallbacksOnInit: true, 4165 // Internals 4166 _emitClasses: false 4167}; 4168 4169function moduleExtendParams(params, allModulesParams) { 4170 return function extendParams(obj = {}) { 4171 const moduleParamName = Object.keys(obj)[0]; 4172 const moduleParams = obj[moduleParamName]; 4173 4174 if (typeof moduleParams !== 'object' || moduleParams === null) { 4175 extend(allModulesParams, obj); 4176 return; 4177 } 4178 4179 if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) { 4180 params[moduleParamName] = { 4181 auto: true 4182 }; 4183 } 4184 4185 if (!(moduleParamName in params && 'enabled' in moduleParams)) { 4186 extend(allModulesParams, obj); 4187 return; 4188 } 4189 4190 if (params[moduleParamName] === true) { 4191 params[moduleParamName] = { 4192 enabled: true 4193 }; 4194 } 4195 4196 if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) { 4197 params[moduleParamName].enabled = true; 4198 } 4199 4200 if (!params[moduleParamName]) params[moduleParamName] = { 4201 enabled: false 4202 }; 4203 extend(allModulesParams, obj); 4204 }; 4205} 4206 4207/* eslint no-param-reassign: "off" */ 4208const prototypes = { 4209 eventsEmitter, 4210 update, 4211 translate, 4212 transition, 4213 slide, 4214 loop, 4215 grabCursor, 4216 events: events$1, 4217 breakpoints, 4218 checkOverflow: checkOverflow$1, 4219 classes, 4220 images 4221}; 4222const extendedDefaults = {}; 4223 4224class Swiper { 4225 constructor(...args) { 4226 let el; 4227 let params; 4228 4229 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') { 4230 params = args[0]; 4231 } else { 4232 [el, params] = args; 4233 } 4234 4235 if (!params) params = {}; 4236 params = extend({}, params); 4237 if (el && !params.el) params.el = el; 4238 4239 if (params.el && $(params.el).length > 1) { 4240 const swipers = []; 4241 $(params.el).each(containerEl => { 4242 const newParams = extend({}, params, { 4243 el: containerEl 4244 }); 4245 swipers.push(new Swiper(newParams)); 4246 }); // eslint-disable-next-line no-constructor-return 4247 4248 return swipers; 4249 } // Swiper Instance 4250 4251 4252 const swiper = this; 4253 swiper.__swiper__ = true;
vendor: 1,094 bytes, lines 4254-4285
4254 swiper.support = getSupport(); 4255 swiper.device = getDevice({ 4256 userAgent: params.userAgent 4257 }); 4258 swiper.browser = getBrowser(); 4259 swiper.eventsListeners = {}; 4260 swiper.eventsAnyListeners = []; 4261 swiper.modules = [...swiper.__modules__]; 4262 4263 if (params.modules && Array.isArray(params.modules)) { 4264 swiper.modules.push(...params.modules); 4265 } 4266 4267 const allModulesParams = {}; 4268 swiper.modules.forEach(mod => { 4269 mod({ 4270 swiper, 4271 extendParams: moduleExtendParams(params, allModulesParams), 4272 on: swiper.on.bind(swiper), 4273 once: swiper.once.bind(swiper), 4274 off: swiper.off.bind(swiper), 4275 emit: swiper.emit.bind(swiper) 4276 }); 4277 }); // Extend defaults with modules params 4278 4279 const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params 4280 4281 swiper.params = extend({}, swiperParams, extendedDefaults, params); 4282 swiper.originalParams = extend({}, swiper.params); 4283 swiper.passedParams = extend({}, params); // add event listeners 4284 4285 if (swiper.params && swiper.params.on) {
vendor: 9,791 bytes, lines 4286-4643
4286 Object.keys(swiper.params.on).forEach(eventName => { 4287 swiper.on(eventName, swiper.params.on[eventName]); 4288 }); 4289 } 4290 4291 if (swiper.params && swiper.params.onAny) { 4292 swiper.onAny(swiper.params.onAny); 4293 } // Save Dom lib 4294 4295 4296 swiper.$ = $; // Extend Swiper 4297 4298 Object.assign(swiper, { 4299 enabled: swiper.params.enabled, 4300 el, 4301 // Classes 4302 classNames: [], 4303 // Slides 4304 slides: $(), 4305 slidesGrid: [], 4306 snapGrid: [], 4307 slidesSizesGrid: [], 4308 4309 // isDirection 4310 isHorizontal() { 4311 return swiper.params.direction === 'horizontal'; 4312 }, 4313 4314 isVertical() { 4315 return swiper.params.direction === 'vertical'; 4316 }, 4317 4318 // Indexes 4319 activeIndex: 0, 4320 realIndex: 0, 4321 // 4322 isBeginning: true, 4323 isEnd: false, 4324 // Props 4325 translate: 0, 4326 previousTranslate: 0, 4327 progress: 0, 4328 velocity: 0, 4329 animating: false, 4330 // Locks 4331 allowSlideNext: swiper.params.allowSlideNext, 4332 allowSlidePrev: swiper.params.allowSlidePrev, 4333 // Touch Events 4334 touchEvents: function touchEvents() { 4335 const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel']; 4336 const desktop = ['pointerdown', 'pointermove', 'pointerup']; 4337 swiper.touchEventsTouch = { 4338 start: touch[0], 4339 move: touch[1], 4340 end: touch[2], 4341 cancel: touch[3] 4342 }; 4343 swiper.touchEventsDesktop = { 4344 start: desktop[0], 4345 move: desktop[1], 4346 end: desktop[2] 4347 }; 4348 return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop; 4349 }(), 4350 touchEventsData: { 4351 isTouched: undefined, 4352 isMoved: undefined, 4353 allowTouchCallbacks: undefined, 4354 touchStartTime: undefined, 4355 isScrolling: undefined, 4356 currentTranslate: undefined, 4357 startTranslate: undefined, 4358 allowThresholdMove: undefined, 4359 // Form elements to match 4360 focusableElements: swiper.params.focusableElements, 4361 // Last click time 4362 lastClickTime: now(), 4363 clickTimeout: undefined, 4364 // Velocities 4365 velocities: [], 4366 allowMomentumBounce: undefined, 4367 isTouchEvent: undefined, 4368 startMoving: undefined 4369 }, 4370 // Clicks 4371 allowClick: true, 4372 // Touches 4373 allowTouchMove: swiper.params.allowTouchMove, 4374 touches: { 4375 startX: 0, 4376 startY: 0, 4377 currentX: 0, 4378 currentY: 0, 4379 diff: 0 4380 }, 4381 // Images 4382 imagesToLoad: [], 4383 imagesLoaded: 0 4384 }); 4385 swiper.emit('_swiper'); // Init 4386 4387 if (swiper.params.init) { 4388 swiper.init(); 4389 } // Return app instance 4390 // eslint-disable-next-line no-constructor-return 4391 4392 4393 return swiper; 4394 } 4395 4396 enable() { 4397 const swiper = this; 4398 if (swiper.enabled) return; 4399 swiper.enabled = true; 4400 4401 if (swiper.params.grabCursor) { 4402 swiper.setGrabCursor(); 4403 } 4404 4405 swiper.emit('enable'); 4406 } 4407 4408 disable() { 4409 const swiper = this; 4410 if (!swiper.enabled) return; 4411 swiper.enabled = false; 4412 4413 if (swiper.params.grabCursor) { 4414 swiper.unsetGrabCursor(); 4415 } 4416 4417 swiper.emit('disable'); 4418 } 4419 4420 setProgress(progress, speed) { 4421 const swiper = this; 4422 progress = Math.min(Math.max(progress, 0), 1); 4423 const min = swiper.minTranslate(); 4424 const max = swiper.maxTranslate(); 4425 const current = (max - min) * progress + min; 4426 swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed); 4427 swiper.updateActiveIndex(); 4428 swiper.updateSlidesClasses(); 4429 } 4430 4431 emitContainerClasses() { 4432 const swiper = this; 4433 if (!swiper.params._emitClasses || !swiper.el) return; 4434 const cls = swiper.el.className.split(' ').filter(className => { 4435 return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0; 4436 }); 4437 swiper.emit('_containerClasses', cls.join(' ')); 4438 } 4439 4440 getSlideClasses(slideEl) { 4441 const swiper = this; 4442 if (swiper.destroyed) return ''; 4443 return slideEl.className.split(' ').filter(className => { 4444 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0; 4445 }).join(' '); 4446 } 4447 4448 emitSlidesClasses() { 4449 const swiper = this; 4450 if (!swiper.params._emitClasses || !swiper.el) return; 4451 const updates = []; 4452 swiper.slides.each(slideEl => { 4453 const classNames = swiper.getSlideClasses(slideEl); 4454 updates.push({ 4455 slideEl, 4456 classNames 4457 }); 4458 swiper.emit('_slideClass', slideEl, classNames); 4459 }); 4460 swiper.emit('_slideClasses', updates); 4461 } 4462 4463 slidesPerViewDynamic(view = 'current', exact = false) { 4464 const swiper = this; 4465 const { 4466 params, 4467 slides, 4468 slidesGrid, 4469 slidesSizesGrid, 4470 size: swiperSize, 4471 activeIndex 4472 } = swiper; 4473 let spv = 1; 4474 4475 if (params.centeredSlides) { 4476 let slideSize = slides[activeIndex].swiperSlideSize; 4477 let breakLoop; 4478 4479 for (let i = activeIndex + 1; i < slides.length; i += 1) { 4480 if (slides[i] && !breakLoop) { 4481 slideSize += slides[i].swiperSlideSize; 4482 spv += 1; 4483 if (slideSize > swiperSize) breakLoop = true; 4484 } 4485 } 4486 4487 for (let i = activeIndex - 1; i >= 0; i -= 1) { 4488 if (slides[i] && !breakLoop) { 4489 slideSize += slides[i].swiperSlideSize; 4490 spv += 1; 4491 if (slideSize > swiperSize) breakLoop = true; 4492 } 4493 } 4494 } else { 4495 // eslint-disable-next-line 4496 if (view === 'current') { 4497 for (let i = activeIndex + 1; i < slides.length; i += 1) { 4498 const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; 4499 4500 if (slideInView) { 4501 spv += 1; 4502 } 4503 } 4504 } else { 4505 // previous 4506 for (let i = activeIndex - 1; i >= 0; i -= 1) { 4507 const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; 4508 4509 if (slideInView) { 4510 spv += 1; 4511 } 4512 } 4513 } 4514 } 4515 4516 return spv; 4517 } 4518 4519 update() { 4520 const swiper = this; 4521 if (!swiper || swiper.destroyed) return; 4522 const { 4523 snapGrid, 4524 params 4525 } = swiper; // Breakpoints 4526 4527 if (params.breakpoints) { 4528 swiper.setBreakpoint(); 4529 } 4530 4531 swiper.updateSize(); 4532 swiper.updateSlides(); 4533 swiper.updateProgress(); 4534 swiper.updateSlidesClasses(); 4535 4536 function setTranslate() { 4537 const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate; 4538 const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate()); 4539 swiper.setTranslate(newTranslate); 4540 swiper.updateActiveIndex(); 4541 swiper.updateSlidesClasses(); 4542 } 4543 4544 let translated; 4545 4546 if (swiper.params.freeMode && swiper.params.freeMode.enabled) { 4547 setTranslate(); 4548 4549 if (swiper.params.autoHeight) { 4550 swiper.updateAutoHeight(); 4551 } 4552 } else { 4553 if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) { 4554 translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); 4555 } else { 4556 translated = swiper.slideTo(swiper.activeIndex, 0, false, true); 4557 } 4558 4559 if (!translated) { 4560 setTranslate(); 4561 } 4562 } 4563 4564 if (params.watchOverflow && snapGrid !== swiper.snapGrid) { 4565 swiper.checkOverflow(); 4566 } 4567 4568 swiper.emit('update'); 4569 } 4570 4571 changeDirection(newDirection, needUpdate = true) { 4572 const swiper = this; 4573 const currentDirection = swiper.params.direction; 4574 4575 if (!newDirection) { 4576 // eslint-disable-next-line 4577 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal'; 4578 } 4579 4580 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') { 4581 return swiper; 4582 } 4583 4584 swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`); 4585 swiper.emitContainerClasses(); 4586 swiper.params.direction = newDirection; 4587 swiper.slides.each(slideEl => { 4588 if (newDirection === 'vertical') { 4589 slideEl.style.width = ''; 4590 } else { 4591 slideEl.style.height = ''; 4592 } 4593 }); 4594 swiper.emit('changeDirection'); 4595 if (needUpdate) swiper.update(); 4596 return swiper; 4597 } 4598 4599 changeLanguageDirection(direction) { 4600 const swiper = this; 4601 if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return; 4602 swiper.rtl = direction === 'rtl'; 4603 swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl; 4604 4605 if (swiper.rtl) { 4606 swiper.$el.addClass(`${swiper.params.containerModifierClass}rtl`); 4607 swiper.el.dir = 'rtl'; 4608 } else { 4609 swiper.$el.removeClass(`${swiper.params.containerModifierClass}rtl`); 4610 swiper.el.dir = 'ltr'; 4611 } 4612 4613 swiper.update(); 4614 } 4615 4616 mount(el) { 4617 const swiper = this; 4618 if (swiper.mounted) return true; // Find el 4619 4620 const $el = $(el || swiper.params.el); 4621 el = $el[0]; 4622 4623 if (!el) { 4624 return false; 4625 } 4626 4627 el.swiper = swiper; 4628 4629 const getWrapperSelector = () => { 4630 return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`; 4631 }; 4632 4633 const getWrapper = () => { 4634 if (el && el.shadowRoot && el.shadowRoot.querySelector) { 4635 const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items 4636 4637 res.children = options => $el.children(options); 4638 4639 return res; 4640 } 4641 4642 if (!$el.children) { 4643 return $($el).children(getWrapperSelector())
vendor: 8,956 bytes, lines 4643-4972
4643; 4644 } 4645 4646 return $el.children(getWrapperSelector()); 4647 }; // Find Wrapper 4648 4649 4650 let $wrapperEl = getWrapper(); 4651 4652 if ($wrapperEl.length === 0 && swiper.params.createElements) { 4653 const document = getDocument(); 4654 const wrapper = document.createElement('div'); 4655 $wrapperEl = $(wrapper); 4656 wrapper.className = swiper.params.wrapperClass; 4657 $el.append(wrapper); 4658 $el.children(`.${swiper.params.slideClass}`).each(slideEl => { 4659 $wrapperEl.append(slideEl); 4660 }); 4661 } 4662 4663 Object.assign(swiper, { 4664 $el, 4665 el, 4666 $wrapperEl, 4667 wrapperEl: $wrapperEl[0], 4668 mounted: true, 4669 // RTL 4670 rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl', 4671 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'), 4672 wrongRTL: $wrapperEl.css('display') === '-webkit-box' 4673 }); 4674 return true; 4675 } 4676 4677 init(el) { 4678 const swiper = this; 4679 if (swiper.initialized) return swiper; 4680 const mounted = swiper.mount(el); 4681 if (mounted === false) return swiper; 4682 swiper.emit('beforeInit'); // Set breakpoint 4683 4684 if (swiper.params.breakpoints) { 4685 swiper.setBreakpoint(); 4686 } // Add Classes 4687 4688 4689 swiper.addClasses(); // Create loop 4690 4691 if (swiper.params.loop) { 4692 swiper.loopCreate(); 4693 } // Update size 4694 4695 4696 swiper.updateSize(); // Update slides 4697 4698 swiper.updateSlides(); 4699 4700 if (swiper.params.watchOverflow) { 4701 swiper.checkOverflow(); 4702 } // Set Grab Cursor 4703 4704 4705 if (swiper.params.grabCursor && swiper.enabled) { 4706 swiper.setGrabCursor(); 4707 } 4708 4709 if (swiper.params.preloadImages) { 4710 swiper.preloadImages(); 4711 } // Slide To Initial Slide 4712 4713 4714 if (swiper.params.loop) { 4715 swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true); 4716 } else { 4717 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true); 4718 } // Attach events 4719 4720 4721 swiper.attachEvents(); // Init Flag 4722 4723 swiper.initialized = true; // Emit 4724 4725 swiper.emit('init'); 4726 swiper.emit('afterInit'); 4727 return swiper; 4728 } 4729 4730 destroy(deleteInstance = true, cleanStyles = true) { 4731 const swiper = this; 4732 const { 4733 params, 4734 $el, 4735 $wrapperEl, 4736 slides 4737 } = swiper; 4738 4739 if (typeof swiper.params === 'undefined' || swiper.destroyed) { 4740 return null; 4741 } 4742 4743 swiper.emit('beforeDestroy'); // Init Flag 4744 4745 swiper.initialized = false; // Detach events 4746 4747 swiper.detachEvents(); // Destroy loop 4748 4749 if (params.loop) { 4750 swiper.loopDestroy(); 4751 } // Cleanup styles 4752 4753 4754 if (cleanStyles) { 4755 swiper.removeClasses(); 4756 $el.removeAttr('style'); 4757 $wrapperEl.removeAttr('style'); 4758 4759 if (slides && slides.length) { 4760 slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index'); 4761 } 4762 } 4763 4764 swiper.emit('destroy'); // Detach emitter events 4765 4766 Object.keys(swiper.eventsListeners).forEach(eventName => { 4767 swiper.off(eventName); 4768 }); 4769 4770 if (deleteInstance !== false) { 4771 swiper.$el[0].swiper = null; 4772 deleteProps(swiper); 4773 } 4774 4775 swiper.destroyed = true; 4776 return null; 4777 } 4778 4779 static extendDefaults(newDefaults) { 4780 extend(extendedDefaults, newDefaults); 4781 } 4782 4783 static get extendedDefaults() { 4784 return extendedDefaults; 4785 } 4786 4787 static get defaults() { 4788 return defaults; 4789 } 4790 4791 static installModule(mod) { 4792 if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; 4793 const modules = Swiper.prototype.__modules__; 4794 4795 if (typeof mod === 'function' && modules.indexOf(mod) < 0) { 4796 modules.push(mod); 4797 } 4798 } 4799 4800 static use(module) { 4801 if (Array.isArray(module)) { 4802 module.forEach(m => Swiper.installModule(m)); 4803 return Swiper; 4804 } 4805 4806 Swiper.installModule(module); 4807 return Swiper; 4808 } 4809 4810} 4811 4812Object.keys(prototypes).forEach(prototypeGroup => { 4813 Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => { 4814 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; 4815 }); 4816}); 4817Swiper.use([Resize, Observer]); 4818 4819/* eslint-disable consistent-return */ 4820function Keyboard({ 4821 swiper, 4822 extendParams, 4823 on, 4824 emit 4825}) { 4826 const document = getDocument(); 4827 const window = getWindow(); 4828 swiper.keyboard = { 4829 enabled: false 4830 }; 4831 extendParams({ 4832 keyboard: { 4833 enabled: false, 4834 onlyInViewport: true, 4835 pageUpDown: true 4836 } 4837 }); 4838 4839 function handle(event) { 4840 if (!swiper.enabled) return; 4841 const { 4842 rtlTranslate: rtl 4843 } = swiper; 4844 let e = event; 4845 if (e.originalEvent) e = e.originalEvent; // jquery fix 4846 4847 const kc = e.keyCode || e.charCode; 4848 const pageUpDown = swiper.params.keyboard.pageUpDown; 4849 const isPageUp = pageUpDown && kc === 33; 4850 const isPageDown = pageUpDown && kc === 34; 4851 const isArrowLeft = kc === 37; 4852 const isArrowRight = kc === 39; 4853 const isArrowUp = kc === 38; 4854 const isArrowDown = kc === 40; // Directions locks 4855 4856 if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) { 4857 return false; 4858 } 4859 4860 if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) { 4861 return false; 4862 } 4863 4864 if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { 4865 return undefined; 4866 } 4867 4868 if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) { 4869 return undefined; 4870 } 4871 4872 if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) { 4873 let inView = false; // Check that swiper should be inside of visible area of window 4874 4875 if (swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0) { 4876 return undefined; 4877 } 4878 4879 const $el = swiper.$el; 4880 const swiperWidth = $el[0].clientWidth; 4881 const swiperHeight = $el[0].clientHeight; 4882 const windowWidth = window.innerWidth; 4883 const windowHeight = window.innerHeight; 4884 const swiperOffset = swiper.$el.offset(); 4885 if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; 4886 const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]]; 4887 4888 for (let i = 0; i < swiperCoord.length; i += 1) { 4889 const point = swiperCoord[i]; 4890 4891 if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) { 4892 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line 4893 4894 inView = true; 4895 } 4896 } 4897 4898 if (!inView) return undefined; 4899 } 4900 4901 if (swiper.isHorizontal()) { 4902 if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { 4903 if (e.preventDefault) e.preventDefault();else e.returnValue = false; 4904 } 4905 4906 if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext(); 4907 if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev(); 4908 } else { 4909 if (isPageUp || isPageDown || isArrowUp || isArrowDown) { 4910 if (e.preventDefault) e.preventDefault();else e.returnValue = false; 4911 } 4912 4913 if (isPageDown || isArrowDown) swiper.slideNext(); 4914 if (isPageUp || isArrowUp) swiper.slidePrev(); 4915 } 4916 4917 emit('keyPress', kc); 4918 return undefined; 4919 } 4920 4921 function enable() { 4922 if (swiper.keyboard.enabled) return; 4923 $(document).on('keydown', handle); 4924 swiper.keyboard.enabled = true; 4925 } 4926 4927 function disable() { 4928 if (!swiper.keyboard.enabled) return; 4929 $(document).off('keydown', handle); 4930 swiper.keyboard.enabled = false; 4931 } 4932 4933 on('init', () => { 4934 if (swiper.params.keyboard.enabled) { 4935 enable(); 4936 } 4937 }); 4938 on('destroy', () => { 4939 if (swiper.keyboard.enabled) { 4940 disable(); 4941 } 4942 }); 4943 Object.assign(swiper.keyboard, { 4944 enable, 4945 disable 4946 }); 4947} 4948 4949function createElementIfNotDefined(swiper, originalParams, params, checkProps) { 4950 const document = getDocument(); 4951 4952 if (swiper.params.createElements) { 4953 Object.keys(checkProps).forEach(key => { 4954 if (!params[key] && params.auto === true) { 4955 let element = swiper.$el.children(`.${checkProps[key]}`)[0]; 4956 4957 if (!element) { 4958 element = document.createElement('div'); 4959 element.className = checkProps[key]; 4960 swiper.$el.append(element); 4961 } 4962 4963 params[key] = element; 4964 originalParams[key] = element; 4965 } 4966 }); 4967 } 4968 4969 return params; 4970} 4971 4972function
vendor: 5,861 bytes, lines 4972-5205
4972Navigation({ 4973 swiper, 4974 extendParams, 4975 on, 4976 emit 4977}) { 4978 extendParams({ 4979 navigation: { 4980 nextEl: null, 4981 prevEl: null, 4982 hideOnClick: false, 4983 disabledClass: 'swiper-button-disabled', 4984 hiddenClass: 'swiper-button-hidden', 4985 lockClass: 'swiper-button-lock', 4986 navigationDisabledClass: 'swiper-navigation-disabled' 4987 } 4988 }); 4989 swiper.navigation = { 4990 nextEl: null, 4991 $nextEl: null, 4992 prevEl: null, 4993 $prevEl: null 4994 }; 4995 4996 function getEl(el) { 4997 let $el; 4998 4999 if (el) { 5000 $el = $(el); 5001 5002 if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) { 5003 $el = swiper.$el.find(el); 5004 } 5005 } 5006 5007 return $el; 5008 } 5009 5010 function toggleEl($el, disabled) { 5011 const params = swiper.params.navigation; 5012 5013 if ($el && $el.length > 0) { 5014 $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass); 5015 if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled; 5016 5017 if (swiper.params.watchOverflow && swiper.enabled) { 5018 $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass); 5019 } 5020 } 5021 } 5022 5023 function update() { 5024 // Update Navigation Buttons 5025 if (swiper.params.loop) return; 5026 const { 5027 $nextEl, 5028 $prevEl 5029 } = swiper.navigation; 5030 toggleEl($prevEl, swiper.isBeginning && !swiper.params.rewind); 5031 toggleEl($nextEl, swiper.isEnd && !swiper.params.rewind); 5032 } 5033 5034 function onPrevClick(e) { 5035 e.preventDefault(); 5036 if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return; 5037 swiper.slidePrev(); 5038 emit('navigationPrev'); 5039 } 5040 5041 function onNextClick(e) { 5042 e.preventDefault(); 5043 if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return; 5044 swiper.slideNext(); 5045 emit('navigationNext'); 5046 } 5047 5048 function init() { 5049 const params = swiper.params.navigation; 5050 swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, { 5051 nextEl: 'swiper-button-next', 5052 prevEl: 'swiper-button-prev' 5053 }); 5054 if (!(params.nextEl || params.prevEl)) return; 5055 const $nextEl = getEl(params.nextEl); 5056 const $prevEl = getEl(params.prevEl); 5057 5058 if ($nextEl && $nextEl.length > 0) { 5059 $nextEl.on('click', onNextClick); 5060 } 5061 5062 if ($prevEl && $prevEl.length > 0) { 5063 $prevEl.on('click', onPrevClick); 5064 } 5065 5066 Object.assign(swiper.navigation, { 5067 $nextEl, 5068 nextEl: $nextEl && $nextEl[0], 5069 $prevEl, 5070 prevEl: $prevEl && $prevEl[0] 5071 }); 5072 5073 if (!swiper.enabled) { 5074 if ($nextEl) $nextEl.addClass(params.lockClass); 5075 if ($prevEl) $prevEl.addClass(params.lockClass); 5076 } 5077 } 5078 5079 function destroy() { 5080 const { 5081 $nextEl, 5082 $prevEl 5083 } = swiper.navigation; 5084 5085 if ($nextEl && $nextEl.length) { 5086 $nextEl.off('click', onNextClick); 5087 $nextEl.removeClass(swiper.params.navigation.disabledClass); 5088 } 5089 5090 if ($prevEl && $prevEl.length) { 5091 $prevEl.off('click', onPrevClick); 5092 $prevEl.removeClass(swiper.params.navigation.disabledClass); 5093 } 5094 } 5095 5096 on('init', () => { 5097 if (swiper.params.navigation.enabled === false) { 5098 // eslint-disable-next-line 5099 disable(); 5100 } else { 5101 init(); 5102 update(); 5103 } 5104 }); 5105 on('toEdge fromEdge lock unlock', () => { 5106 update(); 5107 }); 5108 on('destroy', () => { 5109 destroy(); 5110 }); 5111 on('enable disable', () => { 5112 const { 5113 $nextEl, 5114 $prevEl 5115 } = swiper.navigation; 5116 5117 if ($nextEl) { 5118 $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); 5119 } 5120 5121 if ($prevEl) { 5122 $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass); 5123 } 5124 }); 5125 on('click', (_s, e) => { 5126 const { 5127 $nextEl, 5128 $prevEl 5129 } = swiper.navigation; 5130 const targetEl = e.target; 5131 5132 if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) { 5133 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return; 5134 let isHidden; 5135 5136 if ($nextEl) { 5137 isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); 5138 } else if ($prevEl) { 5139 isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); 5140 } 5141 5142 if (isHidden === true) { 5143 emit('navigationShow'); 5144 } else { 5145 emit('navigationHide'); 5146 } 5147 5148 if ($nextEl) { 5149 $nextEl.toggleClass(swiper.params.navigation.hiddenClass); 5150 } 5151 5152 if ($prevEl) { 5153 $prevEl.toggleClass(swiper.params.navigation.hiddenClass); 5154 } 5155 } 5156 }); 5157 5158 const enable = () => { 5159 swiper.$el.removeClass(swiper.params.navigation.navigationDisabledClass); 5160 init(); 5161 update(); 5162 }; 5163 5164 const disable = () => { 5165 swiper.$el.addClass(swiper.params.navigation.navigationDisabledClass); 5166 destroy(); 5167 }; 5168 5169 Object.assign(swiper.navigation, { 5170 enable, 5171 disable, 5172 update, 5173 init, 5174 destroy 5175 }); 5176} 5177 5178function classesToSelector(classes = '') { 5179 return `.${classes.trim().replace(/([\.:!\/])/g, '\\$1') // eslint-disable-line 5180 .replace(/ /g, '.')}`; 5181} 5182 5183function A11y({ 5184 swiper, 5185 extendParams, 5186 on 5187}) { 5188 extendParams({ 5189 a11y: { 5190 enabled: true, 5191 notificationClass: 'swiper-notification', 5192 prevSlideMessage: 'Previous slide', 5193 nextSlideMessage: 'Next slide', 5194 firstSlideMessage: 'This is the first slide', 5195 lastSlideMessage: 'This is the last slide', 5196 paginationBulletMessage: 'Go to slide {{index}}', 5197 slideLabelMessage: '{{index}} / {{slidesLength}}', 5198 containerMessage: null, 5199 containerRoleDescriptionMessage: null, 5200 itemRoleDescriptionMessage: null, 5201 slideRole: 'group', 5202 id: null 5203 } 5204 }); 5205 swiper.a11y = {
5206 clicked: false 5207 }; 5208 let liveRegion = null; 5209 5210 function notify(message) { 5211 const notification = liveRegion; 5212 if (notification.length === 0) return; 5213 notification.html(''); 5214 notification.html(message); 5215 } 5216 5217 function getRandomNumber(size = 16) { 5218 const randomChar = () => Math.round(16 * Math.random()).toString(16); 5219 5220 return 'x'.repeat(size).replace(/x/g, randomChar); 5221 } 5222 5223 function makeElFocusable($el) { 5224 $el.attr('tabIndex', '0'); 5225 } 5226 5227 function makeElNotFocusable($el) { 5228 $el.attr('tabIndex', '-1'); 5229 } 5230 5231 function addElRole($el, role) { 5232 $el.attr('role', role); 5233 } 5234 5235 function addElRoleDescription($el, description) { 5236 $el.attr('aria-roledescription', description); 5237 } 5238 5239 function addElControls($el, controls) { 5240 $el.attr('aria-controls', controls); 5241 } 5242 5243 function addElLabel($el, label) { 5244 $el.attr('aria-label', label); 5245 } 5246 5247 function addElId($el, id) { 5248 $el.attr('id', id); 5249 } 5250 5251 function addElLive($el, live) { 5252 $el.attr('aria-live', live); 5253 } 5254 5255 function disableEl($el) { 5256 $el.attr('aria-disabled', true); 5257 } 5258 5259 function enableEl($el) { 5260 $el.attr('aria-disabled', false); 5261 } 5262 5263 function onEnterOrSpaceKey(e) { 5264 if (e.keyCode !== 13 && e.keyCode !== 32) return; 5265 const params = swiper.params.a11y; 5266 const $targetEl = $(e.target); 5267 5268 if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) { 5269 if (!(swiper.isEnd && !swiper.params.loop)) { 5270 swiper.slideNext(); 5271 } 5272 5273 if (swiper.isEnd) { 5274 notify(params.lastSlideMessage); 5275 } else { 5276 notify(params.nextSlideMessage); 5277 } 5278 } 5279 5280 if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) { 5281 if (!(swiper.isBeginning && !swiper.params.loop)) { 5282 swiper.slidePrev(); 5283 } 5284 5285 if (swiper.isBeginning) { 5286 notify(params.firstSlideMessage); 5287 } else { 5288 notify(params.prevSlideMessage); 5289 } 5290 } 5291 5292 if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) { 5293 $targetEl[0].click(); 5294 } 5295 } 5296 5297 function updateNavigation() { 5298 if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return; 5299 const { 5300 $nextEl, 5301 $prevEl 5302 } = swiper.navigation; 5303 5304 if ($prevEl && $prevEl.length > 0) { 5305 if (swiper.isBeginning) { 5306 disableEl($prevEl); 5307 makeElNotFocusable($prevEl); 5308 } else { 5309 enableEl($prevEl); 5310 makeElFocusable($prevEl); 5311 } 5312 } 5313 5314 if ($nextEl && $nextEl.length > 0) { 5315 if (swiper.isEnd) { 5316 disableEl($nextEl); 5317 makeElNotFocusable($nextEl); 5318 } else { 5319 enableEl($nextEl); 5320 makeElFocusable($nextEl); 5321 } 5322 } 5323 } 5324 5325 function hasPagination() { 5326 return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length; 5327 } 5328 5329 function hasClickablePagination() { 5330 return hasPagination() && swiper.params.pagination.clickable; 5331 } 5332 5333 function updatePagination() { 5334 const params = swiper.params.a11y; 5335 if (!hasPagination()) return; 5336 swiper.pagination.bullets.each(bulletEl => { 5337 const $bulletEl = $(bulletEl); 5338 5339 if (swiper.params.pagination.clickable) { 5340 makeElFocusable($bulletEl); 5341 5342 if (!swiper.params.pagination.renderBullet) { 5343 addElRole($bulletEl, 'button'); 5344 addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1)); 5345 } 5346 } 5347 5348 if ($bulletEl.is(`.${swiper.params.pagination.bulletActiveClass}`)) { 5349 $bulletEl.attr('aria-current', 'true'); 5350 } else { 5351 $bulletEl.removeAttr('aria-current'); 5352 } 5353 }); 5354 } 5355 5356 const initNavEl = ($el, wrapperId, message) => { 5357 makeElFocusable($el); 5358 5359 if ($el[0].tagName !== 'BUTTON') { 5360 addElRole($el, 'button'); 5361 $el.on('keydown', onEnterOrSpaceKey); 5362 } 5363 5364 addElLabel($el, message); 5365 addElControls($el, wrapperId); 5366 }; 5367 5368 const handlePointerDown = () => { 5369 swiper.a11y.clicked = true; 5370 }; 5371 5372 const handlePointerUp = () => { 5373 requestAnimationFrame(() => { 5374 requestAnimationFrame(() => { 5375 if (!swiper.destroyed) { 5376 swiper.a11y.clicked = false;
5377 } 5378 }); 5379 }); 5380 }; 5381 5382 const handleFocus = e => { 5383 if (swiper.a11y.clicked) return; 5384 const slideEl = e.target.closest(`.${swiper.params.slideClass}`); 5385 if (!slideEl || !swiper.slides.includes(slideEl)) return; 5386 const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex; 5387 const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl); 5388 if (isActive || isVisible) return; 5389 if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return; 5390 5391 if (swiper.isHorizontal()) { 5392 swiper.el.scrollLeft = 0; 5393 } else { 5394 swiper.el.scrollTop = 0; 5395 } 5396 5397 swiper.slideTo(swiper.slides.indexOf(slideEl), 0); 5398 }; 5399 5400 const initSlides = () => { 5401 const params = swiper.params.a11y; 5402 5403 if (params.itemRoleDescriptionMessage) { 5404 addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage); 5405 } 5406 5407 if (params.slideRole) { 5408 addElRole($(swiper.slides), params.slideRole); 5409 } 5410 5411 const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length; 5412 5413 if (params.slideLabelMessage) { 5414 swiper.slides.each((slideEl, index) => { 5415 const $slideEl = $(slideEl); 5416 const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index; 5417 const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength); 5418 addElLabel($slideEl, ariaLabelMessage); 5419 }); 5420 } 5421 }; 5422 5423 const init = () => { 5424 const params = swiper.params.a11y; 5425 swiper.$el.append(liveRegion); // Container 5426 5427 const $containerEl = swiper.$el; 5428 5429 if (params.containerRoleDescriptionMessage) { 5430 addElRoleDescription($containerEl, params.containerRoleDescriptionMessage); 5431 } 5432 5433 if (params.containerMessage) { 5434 addElLabel($containerEl, params.containerMessage); 5435 } // Wrapper 5436 5437 5438 const $wrapperEl = swiper.$wrapperEl; 5439 const wrapperId = params.id || $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`; 5440 const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite'; 5441 addElId($wrapperEl, wrapperId); 5442 addElLive($wrapperEl, live); // Slide 5443 5444 initSlides(); // Navigation 5445 5446 let $nextEl; 5447 let $prevEl; 5448 5449 if (swiper.navigation && swiper.navigation.$nextEl) { 5450 $nextEl = swiper.navigation.$nextEl; 5451 } 5452 5453 if (swiper.navigation && swiper.navigation.$prevEl) { 5454 $prevEl = swiper.navigation.$prevEl; 5455 } 5456 5457 if ($nextEl && $nextEl.length) { 5458 initNavEl($nextEl, wrapperId, params.nextSlideMessage); 5459 } 5460 5461 if ($prevEl && $prevEl.length) { 5462 initNavEl($prevEl, wrapperId, params.prevSlideMessage); 5463 } // Pagination 5464 5465 5466 if (hasClickablePagination()) { 5467 swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); 5468 } // Tab focus 5469 5470 5471 swiper.$el.on('focus', handleFocus, true); 5472 swiper.$el.on('pointerdown', handlePointerDown, true); 5473 swiper.$el.on('pointerup', handlePointerUp, true); 5474 }; 5475 5476 function destroy() { 5477 if (liveRegion && liveRegion.length > 0) liveRegion.remove(); 5478 let $nextEl; 5479 let $prevEl; 5480 5481 if (swiper.navigation && swiper.navigation.$nextEl) { 5482 $nextEl = swiper.navigation.$nextEl; 5483 } 5484 5485 if (swiper.navigation && swiper.navigation.$prevEl) { 5486 $prevEl = swiper.navigation.$prevEl; 5487 } 5488 5489 if ($nextEl) { 5490 $nextEl.off('keydown', onEnterOrSpaceKey); 5491 } 5492 5493 if ($prevEl) { 5494 $prevEl.off('keydown', onEnterOrSpaceKey); 5495 } // Pagination 5496 5497 5498 if (hasClickablePagination()) { 5499 swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey); 5500 } // Tab focus 5501 5502 5503 swiper.$el.off('focus', handleFocus, true); 5504 swiper.$el.off('pointerdown', handlePointerDown, true); 5505 swiper.$el.off('pointerup', handlePointerUp, true); 5506 } 5507 5508 on('beforeInit', () => { 5509 liveRegion = $(`<span class="${swiper.params.a11y.notificationClass}
5509" aria-live="assertive" aria-atomic="true"></span>`); 5510 }); 5511 on('afterInit', () => { 5512 if (!swiper.params.a11y.enabled) return; 5513 init(); 5514 }); 5515 on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => { 5516 if (!swiper.params.a11y.enabled) return; 5517 initSlides(); 5518 }); 5519 on('fromEdge toEdge afterInit lock unlock', () => { 5520 if (!swiper.params.a11y.enabled) return; 5521 updateNavigation(); 5522 }); 5523 on('paginationUpdate', () => { 5524 if (!swiper.params.a11y.enabled) return; 5525 updatePagination(); 5526 }); 5527 on('destroy', () => { 5528 if (!swiper.params.a11y.enabled) return; 5529 destroy(); 5530 }); 5531} 5532 5533// 5534Swiper.use([Navigation, Keyboard, A11y]); 5535function init() { 5536 Array.from(document.querySelectorAll('.slider-twitter .twitter-list')).forEach(function (node) { 5537 return new Swiper(node, { 5538 navigation: { 5539 nextEl: '.swiper-navigation-button-next', 5540 prevEl: '.swiper-navigation-button-prev', 5541 disabledClass: 'swiper-navigation-button-disabled' 5542 }, 5543 a11y: { 5544 prevSlideMessage: a11yText.prev, 5545 nextSlideMessage: a11yText.next 5546 }, 5547 keyboard: { 5548 enabled: false, 5549 onlyInViewport: true 5550 }, 5551 observer: true, 5552 observeParents: true, 5553 slidesPerView: 1, 5554 watchSlidesVisibility: true, 5555 slideVisibleClass: 'swiper-slide-visible', 5556 slideNextClass: 'swiper-slide-next', 5557 breakpoints: { 5558 '992': { 5559 slidesPerView: 2, 5560 slidesPerGroup: 2, 5561 spaceBetween: 40, 5562 centeredSlides: false 5563 }, 5564 '1200': { 5565 slidesPerView: 4, 5566 slidesPerGroup: 4, 5567 spaceBetween: 40, 5568 centeredSlides: false 5569 } 5570 }, 5571 on: { 5572 init: function init(swiper) { 5573 updateTabindex(swiper); 5574 }, 5575 slideChangeTransitionEnd: function slideChangeTransitionEnd(swiper) { 5576 updateTabindex(swiper); 5577 }, 5578 resize: function resize(swiper) { 5579 updateTabindex(swiper); 5580 } 5581 } 5582 }); 5583 }); 5584} 5585function updateTabindex(swiper) { 5586 swiper.slides.forEach(function (slide) { 5587 var isActive = slide.classList.contains('swiper-slide-visible'); 5588 var navigationElements = slide.querySelectorAll('a'); 5589 navigationElements.forEach(function (navigationElement) { 5590 navigationElement.setAttribute('tabindex', isActive ? '0' : '-1'); 5591 }); 5592 }); 5593} 5594 5595// 5596// Slider: No print 5597// 5598 5599var twitterSlider = document.querySelectorAll('.slider-twitter') || []; 5600twitterSlider.forEach(function (el) { 5601 el.parentNode.classList.add('hide-on-print'); 5602}); 5603var _swiper = {}; 5604var Init = init; 5605 5606export { Init, _swiper as default }; 5607//# sourceMappingURL=_swiper-1b6c4e52.js.map
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.