From ed124752e67ced0e0f1c4433e3ce2a4dd63787b2 Mon Sep 17 00:00:00 2001 From: Agent Isai <43097272+AgentIsai@users.noreply.github.com> Date: Wed, 11 Dec 2024 06:53:26 +0000 Subject: [PATCH] Fix? --- themes/hugoplate/assets/js/main.js | 37 + .../assets/plugins/maps/google-map.js | 179 + .../assets/plugins/swiper/swiper-bundle.css | 667 + .../assets/plugins/swiper/swiper-bundle.js | 11853 ++++++++++++++++ themes/hugoplate/assets/scss/base.scss | 59 + themes/hugoplate/assets/scss/buttons.scss | 15 + themes/hugoplate/assets/scss/components.scss | 74 + themes/hugoplate/assets/scss/custom.scss | 2 + themes/hugoplate/assets/scss/main.scss | 30 + .../assets/scss/module-overrides.scss | 58 + themes/hugoplate/assets/scss/navigation.scss | 87 + themes/hugoplate/assets/scss/utilities.scss | 20 + themes/hugoplate/layouts/404.en.html | 26 + themes/hugoplate/layouts/_default/baseof.html | 54 + themes/hugoplate/layouts/_default/list.html | 20 + themes/hugoplate/layouts/_default/single.html | 16 + .../hugoplate/layouts/_default/taxonomy.html | 21 + themes/hugoplate/layouts/_default/terms.html | 41 + themes/hugoplate/layouts/about/list.html | 13 + themes/hugoplate/layouts/authors/list.html | 16 + themes/hugoplate/layouts/authors/single.html | 48 + themes/hugoplate/layouts/blog/list.html | 29 + themes/hugoplate/layouts/blog/single.html | 95 + themes/hugoplate/layouts/contact/list.html | 120 + themes/hugoplate/layouts/index.html | 144 + .../layouts/partials/call-to-action.html | 33 + .../partials/components/author-card.html | 30 + .../partials/components/blog-card.html | 37 + .../partials/components/breadcrumb.html | 30 + .../components/language-switcher.html | 28 + .../partials/components/pagination.html | 138 + .../partials/components/theme-switcher.html | 70 + .../components/tw-size-indicator.html | 9 + .../layouts/partials/essentials/footer.html | 57 + .../layouts/partials/essentials/head.html | 61 + .../layouts/partials/essentials/header.html | 139 + .../layouts/partials/essentials/script.html | 58 + .../layouts/partials/essentials/style.html | 82 + .../layouts/partials/page-header.html | 9 + .../layouts/partials/widgets/categories.html | 23 + .../layouts/partials/widgets/tags.html | 23 + .../partials/widgets/widget-wrapper.html | 3 + 42 files changed, 14554 insertions(+) create mode 100755 themes/hugoplate/assets/js/main.js create mode 100644 themes/hugoplate/assets/plugins/maps/google-map.js create mode 100644 themes/hugoplate/assets/plugins/swiper/swiper-bundle.css create mode 100644 themes/hugoplate/assets/plugins/swiper/swiper-bundle.js create mode 100755 themes/hugoplate/assets/scss/base.scss create mode 100755 themes/hugoplate/assets/scss/buttons.scss create mode 100755 themes/hugoplate/assets/scss/components.scss create mode 100644 themes/hugoplate/assets/scss/custom.scss create mode 100755 themes/hugoplate/assets/scss/main.scss create mode 100644 themes/hugoplate/assets/scss/module-overrides.scss create mode 100755 themes/hugoplate/assets/scss/navigation.scss create mode 100755 themes/hugoplate/assets/scss/utilities.scss create mode 100755 themes/hugoplate/layouts/404.en.html create mode 100755 themes/hugoplate/layouts/_default/baseof.html create mode 100755 themes/hugoplate/layouts/_default/list.html create mode 100755 themes/hugoplate/layouts/_default/single.html create mode 100755 themes/hugoplate/layouts/_default/taxonomy.html create mode 100755 themes/hugoplate/layouts/_default/terms.html create mode 100644 themes/hugoplate/layouts/about/list.html create mode 100644 themes/hugoplate/layouts/authors/list.html create mode 100755 themes/hugoplate/layouts/authors/single.html create mode 100644 themes/hugoplate/layouts/blog/list.html create mode 100644 themes/hugoplate/layouts/blog/single.html create mode 100755 themes/hugoplate/layouts/contact/list.html create mode 100755 themes/hugoplate/layouts/index.html create mode 100644 themes/hugoplate/layouts/partials/call-to-action.html create mode 100755 themes/hugoplate/layouts/partials/components/author-card.html create mode 100644 themes/hugoplate/layouts/partials/components/blog-card.html create mode 100644 themes/hugoplate/layouts/partials/components/breadcrumb.html create mode 100644 themes/hugoplate/layouts/partials/components/language-switcher.html create mode 100755 themes/hugoplate/layouts/partials/components/pagination.html create mode 100644 themes/hugoplate/layouts/partials/components/theme-switcher.html create mode 100644 themes/hugoplate/layouts/partials/components/tw-size-indicator.html create mode 100755 themes/hugoplate/layouts/partials/essentials/footer.html create mode 100755 themes/hugoplate/layouts/partials/essentials/head.html create mode 100755 themes/hugoplate/layouts/partials/essentials/header.html create mode 100755 themes/hugoplate/layouts/partials/essentials/script.html create mode 100755 themes/hugoplate/layouts/partials/essentials/style.html create mode 100755 themes/hugoplate/layouts/partials/page-header.html create mode 100755 themes/hugoplate/layouts/partials/widgets/categories.html create mode 100755 themes/hugoplate/layouts/partials/widgets/tags.html create mode 100755 themes/hugoplate/layouts/partials/widgets/widget-wrapper.html diff --git a/themes/hugoplate/assets/js/main.js b/themes/hugoplate/assets/js/main.js new file mode 100755 index 0000000..bce9565 --- /dev/null +++ b/themes/hugoplate/assets/js/main.js @@ -0,0 +1,37 @@ +// main script +(function () { + "use strict"; + + + // Dropdown Menu Toggler For Mobile + // ---------------------------------------- + const dropdownMenuToggler = document.querySelectorAll( + ".nav-dropdown > .nav-link", + ); + + dropdownMenuToggler.forEach((toggler) => { + toggler?.addEventListener("click", (e) => { + e.target.closest('.nav-item').classList.toggle("active"); + }); + }); + + // Testimonial Slider + // ---------------------------------------- + new Swiper(".testimonial-slider", { + spaceBetween: 24, + loop: true, + pagination: { + el: ".testimonial-slider-pagination", + type: "bullets", + clickable: true, + }, + breakpoints: { + 768: { + slidesPerView: 2, + }, + 992: { + slidesPerView: 3, + }, + }, + }); +})(); diff --git a/themes/hugoplate/assets/plugins/maps/google-map.js b/themes/hugoplate/assets/plugins/maps/google-map.js new file mode 100644 index 0000000..884b5b1 --- /dev/null +++ b/themes/hugoplate/assets/plugins/maps/google-map.js @@ -0,0 +1,179 @@ +/*!*************************************************** + * Google Map + *****************************************************/ + +window.marker = null; + +function initialize() { + var map, + mapId = document.getElementById("map"); + var latitude = mapId.getAttribute("data-latitude"); + var longitude = mapId.getAttribute("data-longitude"); + var mapMarker = mapId.getAttribute("data-marker"); + var mapMarkerName = mapId.getAttribute("data-marker-name"); + var nottingham = new google.maps.LatLng(latitude, longitude); + var style = [ + { + featureType: "administrative", + elementType: "all", + stylers: [ + { + saturation: "-100", + }, + ], + }, + { + featureType: "administrative.province", + elementType: "all", + stylers: [ + { + visibility: "off", + }, + ], + }, + { + featureType: "landscape", + elementType: "all", + stylers: [ + { + saturation: -100, + }, + { + lightness: 65, + }, + { + visibility: "on", + }, + ], + }, + { + featureType: "poi", + elementType: "all", + stylers: [ + { + saturation: -100, + }, + { + lightness: "50", + }, + { + visibility: "simplified", + }, + ], + }, + { + featureType: "road", + elementType: "all", + stylers: [ + { + saturation: "-100", + }, + ], + }, + { + featureType: "road.highway", + elementType: "all", + stylers: [ + { + visibility: "simplified", + }, + ], + }, + { + featureType: "road.arterial", + elementType: "all", + stylers: [ + { + lightness: "30", + }, + ], + }, + { + featureType: "road.local", + elementType: "all", + stylers: [ + { + lightness: "40", + }, + ], + }, + { + featureType: "transit", + elementType: "all", + stylers: [ + { + saturation: -100, + }, + { + visibility: "simplified", + }, + ], + }, + { + featureType: "water", + elementType: "geometry", + stylers: [ + { + hue: "#ffff00", + }, + { + lightness: -25, + }, + { + saturation: -97, + }, + ], + }, + { + featureType: "water", + elementType: "labels", + stylers: [ + { + lightness: -25, + }, + { + saturation: -100, + }, + ], + }, + ]; + var mapOptions = { + center: nottingham, + mapTypeId: google.maps.MapTypeId.ROADMAP, + backgroundColor: "#000", + zoom: 15, + panControl: !1, + zoomControl: !0, + mapTypeControl: !1, + scaleControl: !1, + streetViewControl: !1, + overviewMapControl: !1, + zoomControlOptions: { + style: google.maps.ZoomControlStyle.LARGE, + }, + }; + map = new google.maps.Map(document.getElementById("map"), mapOptions); + var mapType = new google.maps.StyledMapType(style, { + name: "Grayscale", + }); + map.mapTypes.set("grey", mapType); + map.setMapTypeId("grey"); + var marker_image = mapMarker; + var pinIcon = new google.maps.MarkerImage( + marker_image, + null, + null, + null, + new google.maps.Size(30, 50), + ); + marker = new google.maps.Marker({ + position: nottingham, + map: map, + icon: pinIcon, + title: mapMarkerName, + }); +} +var map = document.getElementById("map"); +if (map != null) { + google.maps.event.addDomListener(window, "load", initialize); +} diff --git a/themes/hugoplate/assets/plugins/swiper/swiper-bundle.css b/themes/hugoplate/assets/plugins/swiper/swiper-bundle.css new file mode 100644 index 0000000..6f0c194 --- /dev/null +++ b/themes/hugoplate/assets/plugins/swiper/swiper-bundle.css @@ -0,0 +1,667 @@ +/** + * Swiper 8.0.7 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2022 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: March 4, 2022 + */ + +@font-face { + font-family: "swiper-icons"; + src: url("data:application/font-woff;charset=utf-8;base64, d09GRgABAAAAAAZgABAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAGRAAAABoAAAAci6qHkUdERUYAAAWgAAAAIwAAACQAYABXR1BPUwAABhQAAAAuAAAANuAY7+xHU1VCAAAFxAAAAFAAAABm2fPczU9TLzIAAAHcAAAASgAAAGBP9V5RY21hcAAAAkQAAACIAAABYt6F0cBjdnQgAAACzAAAAAQAAAAEABEBRGdhc3AAAAWYAAAACAAAAAj//wADZ2x5ZgAAAywAAADMAAAD2MHtryVoZWFkAAABbAAAADAAAAA2E2+eoWhoZWEAAAGcAAAAHwAAACQC9gDzaG10eAAAAigAAAAZAAAArgJkABFsb2NhAAAC0AAAAFoAAABaFQAUGG1heHAAAAG8AAAAHwAAACAAcABAbmFtZQAAA/gAAAE5AAACXvFdBwlwb3N0AAAFNAAAAGIAAACE5s74hXjaY2BkYGAAYpf5Hu/j+W2+MnAzMYDAzaX6QjD6/4//Bxj5GA8AuRwMYGkAPywL13jaY2BkYGA88P8Agx4j+/8fQDYfA1AEBWgDAIB2BOoAeNpjYGRgYNBh4GdgYgABEMnIABJzYNADCQAACWgAsQB42mNgYfzCOIGBlYGB0YcxjYGBwR1Kf2WQZGhhYGBiYGVmgAFGBiQQkOaawtDAoMBQxXjg/wEGPcYDDA4wNUA2CCgwsAAAO4EL6gAAeNpj2M0gyAACqxgGNWBkZ2D4/wMA+xkDdgAAAHjaY2BgYGaAYBkGRgYQiAHyGMF8FgYHIM3DwMHABGQrMOgyWDLEM1T9/w8UBfEMgLzE////P/5//f/V/xv+r4eaAAeMbAxwIUYmIMHEgKYAYjUcsDAwsLKxc3BycfPw8jEQA/gZBASFhEVExcQlJKWkZWTl5BUUlZRVVNXUNTQZBgMAAMR+E+gAEQFEAAAAKgAqACoANAA+AEgAUgBcAGYAcAB6AIQAjgCYAKIArAC2AMAAygDUAN4A6ADyAPwBBgEQARoBJAEuATgBQgFMAVYBYAFqAXQBfgGIAZIBnAGmAbIBzgHsAAB42u2NMQ6CUAyGW568x9AneYYgm4MJbhKFaExIOAVX8ApewSt4Bic4AfeAid3VOBixDxfPYEza5O+Xfi04YADggiUIULCuEJK8VhO4bSvpdnktHI5QCYtdi2sl8ZnXaHlqUrNKzdKcT8cjlq+rwZSvIVczNiezsfnP/uznmfPFBNODM2K7MTQ45YEAZqGP81AmGGcF3iPqOop0r1SPTaTbVkfUe4HXj97wYE+yNwWYxwWu4v1ugWHgo3S1XdZEVqWM7ET0cfnLGxWfkgR42o2PvWrDMBSFj/IHLaF0zKjRgdiVMwScNRAoWUoH78Y2icB/yIY09An6AH2Bdu/UB+yxopYshQiEvnvu0dURgDt8QeC8PDw7Fpji3fEA4z/PEJ6YOB5hKh4dj3EvXhxPqH/SKUY3rJ7srZ4FZnh1PMAtPhwP6fl2PMJMPDgeQ4rY8YT6Gzao0eAEA409DuggmTnFnOcSCiEiLMgxCiTI6Cq5DZUd3Qmp10vO0LaLTd2cjN4fOumlc7lUYbSQcZFkutRG7g6JKZKy0RmdLY680CDnEJ+UMkpFFe1RN7nxdVpXrC4aTtnaurOnYercZg2YVmLN/d/gczfEimrE/fs/bOuq29Zmn8tloORaXgZgGa78yO9/cnXm2BpaGvq25Dv9S4E9+5SIc9PqupJKhYFSSl47+Qcr1mYNAAAAeNptw0cKwkAAAMDZJA8Q7OUJvkLsPfZ6zFVERPy8qHh2YER+3i/BP83vIBLLySsoKimrqKqpa2hp6+jq6RsYGhmbmJqZSy0sraxtbO3sHRydnEMU4uR6yx7JJXveP7WrDycAAAAAAAH//wACeNpjYGRgYOABYhkgZgJCZgZNBkYGLQZtIJsFLMYAAAw3ALgAeNolizEKgDAQBCchRbC2sFER0YD6qVQiBCv/H9ezGI6Z5XBAw8CBK/m5iQQVauVbXLnOrMZv2oLdKFa8Pjuru2hJzGabmOSLzNMzvutpB3N42mNgZGBg4GKQYzBhYMxJLMlj4GBgAYow/P/PAJJhLM6sSoWKfWCAAwDAjgbRAAB42mNgYGBkAIIbCZo5IPrmUn0hGA0AO8EFTQAA"); + font-weight: 400; + font-style: normal; +} +:root { + --swiper-theme-color: #007aff; +} +.swiper { + margin-left: auto; + margin-right: auto; + position: relative; + overflow: hidden; + list-style: none; + padding: 0; + /* Fix of Webkit flickering */ + z-index: 1; +} +.swiper-vertical > .swiper-wrapper { + flex-direction: column; +} +.swiper-wrapper { + position: relative; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + transition-property: transform; + box-sizing: content-box; +} +.swiper-android .swiper-slide, +.swiper-wrapper { + transform: translate3d(0px, 0, 0); +} +.swiper-pointer-events { + touch-action: pan-y; +} +.swiper-pointer-events.swiper-vertical { + touch-action: pan-x; +} +.swiper-slide { + flex-shrink: 0; + width: 100%; + height: 100%; + position: relative; + transition-property: transform; +} +.swiper-slide-invisible-blank { + visibility: hidden; +} +/* Auto Height */ +.swiper-autoheight, +.swiper-autoheight .swiper-slide { + height: auto; +} +.swiper-autoheight .swiper-wrapper { + align-items: flex-start; + transition-property: transform, height; +} +.swiper-backface-hidden .swiper-slide { + transform: translateZ(0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +/* 3D Effects */ +.swiper-3d, +.swiper-3d.swiper-css-mode .swiper-wrapper { + perspective: 1200px; +} +.swiper-3d .swiper-wrapper, +.swiper-3d .swiper-slide, +.swiper-3d .swiper-slide-shadow, +.swiper-3d .swiper-slide-shadow-left, +.swiper-3d .swiper-slide-shadow-right, +.swiper-3d .swiper-slide-shadow-top, +.swiper-3d .swiper-slide-shadow-bottom, +.swiper-3d .swiper-cube-shadow { + transform-style: preserve-3d; +} +.swiper-3d .swiper-slide-shadow, +.swiper-3d .swiper-slide-shadow-left, +.swiper-3d .swiper-slide-shadow-right, +.swiper-3d .swiper-slide-shadow-top, +.swiper-3d .swiper-slide-shadow-bottom { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 10; +} +.swiper-3d .swiper-slide-shadow { + background: rgba(0, 0, 0, 0.15); +} +.swiper-3d .swiper-slide-shadow-left { + background-image: linear-gradient( + to left, + rgba(0, 0, 0, 0.5), + rgba(0, 0, 0, 0) + ); +} +.swiper-3d .swiper-slide-shadow-right { + background-image: linear-gradient( + to right, + rgba(0, 0, 0, 0.5), + rgba(0, 0, 0, 0) + ); +} +.swiper-3d .swiper-slide-shadow-top { + background-image: linear-gradient( + to top, + rgba(0, 0, 0, 0.5), + rgba(0, 0, 0, 0) + ); +} +.swiper-3d .swiper-slide-shadow-bottom { + background-image: linear-gradient( + to bottom, + rgba(0, 0, 0, 0.5), + rgba(0, 0, 0, 0) + ); +} +/* CSS Mode */ +.swiper-css-mode > .swiper-wrapper { + overflow: auto; + scrollbar-width: none; + /* For Firefox */ + -ms-overflow-style: none; + /* For Internet Explorer and Edge */ +} +.swiper-css-mode > .swiper-wrapper::-webkit-scrollbar { + display: none; +} +.swiper-css-mode > .swiper-wrapper > .swiper-slide { + scroll-snap-align: start start; +} +.swiper-horizontal.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: x mandatory; +} +.swiper-vertical.swiper-css-mode > .swiper-wrapper { + scroll-snap-type: y mandatory; +} +.swiper-centered > .swiper-wrapper::before { + content: ""; + flex-shrink: 0; + order: 9999; +} +.swiper-centered.swiper-horizontal + > .swiper-wrapper + > .swiper-slide:first-child { + margin-inline-start: var(--swiper-centered-offset-before); +} +.swiper-centered.swiper-horizontal > .swiper-wrapper::before { + height: 100%; + min-height: 1px; + width: var(--swiper-centered-offset-after); +} +.swiper-centered.swiper-vertical > .swiper-wrapper > .swiper-slide:first-child { + margin-block-start: var(--swiper-centered-offset-before); +} +.swiper-centered.swiper-vertical > .swiper-wrapper::before { + width: 100%; + min-width: 1px; + height: var(--swiper-centered-offset-after); +} +.swiper-centered > .swiper-wrapper > .swiper-slide { + scroll-snap-align: center center; +} +.swiper-virtual .swiper-slide { + -webkit-backface-visibility: hidden; + transform: translateZ(0); +} +.swiper-virtual.swiper-css-mode .swiper-wrapper::after { + content: ""; + position: absolute; + left: 0; + top: 0; + pointer-events: none; +} +.swiper-virtual.swiper-css-mode.swiper-horizontal .swiper-wrapper::after { + height: 1px; + width: var(--swiper-virtual-size); +} +.swiper-virtual.swiper-css-mode.swiper-vertical .swiper-wrapper::after { + width: 1px; + height: var(--swiper-virtual-size); +} +:root { + --swiper-navigation-size: 44px; + /* + --swiper-navigation-color: var(--swiper-theme-color); + */ +} +.swiper-button-prev, +.swiper-button-next { + position: absolute; + top: 50%; + width: calc(var(--swiper-navigation-size) / 44 * 27); + height: var(--swiper-navigation-size); + margin-top: calc(0px - (var(--swiper-navigation-size) / 2)); + z-index: 10; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--swiper-navigation-color, var(--swiper-theme-color)); +} +.swiper-button-prev.swiper-button-disabled, +.swiper-button-next.swiper-button-disabled { + opacity: 0.35; + cursor: auto; + pointer-events: none; +} +.swiper-button-prev:after, +.swiper-button-next:after { + font-family: swiper-icons; + font-size: var(--swiper-navigation-size); + text-transform: none !important; + letter-spacing: 0; + text-transform: none; + font-variant: initial; + line-height: 1; +} +.swiper-button-prev, +.swiper-rtl .swiper-button-next { + left: 10px; + right: auto; +} +.swiper-button-prev:after, +.swiper-rtl .swiper-button-next:after { + content: "prev"; +} +.swiper-button-next, +.swiper-rtl .swiper-button-prev { + right: 10px; + left: auto; +} +.swiper-button-next:after, +.swiper-rtl .swiper-button-prev:after { + content: "next"; +} +.swiper-button-lock { + display: none; +} +:root { + /* + --swiper-pagination-color: var(--swiper-theme-color); + --swiper-pagination-bullet-size: 8px; + --swiper-pagination-bullet-width: 8px; + --swiper-pagination-bullet-height: 8px; + --swiper-pagination-bullet-inactive-color: #000; + --swiper-pagination-bullet-inactive-opacity: 0.2; + --swiper-pagination-bullet-opacity: 1; + --swiper-pagination-bullet-horizontal-gap: 4px; + --swiper-pagination-bullet-vertical-gap: 6px; + */ +} +.swiper-pagination { + position: absolute; + text-align: center; + transition: 300ms opacity; + transform: translate3d(0, 0, 0); + z-index: 10; +} +.swiper-pagination.swiper-pagination-hidden { + opacity: 0; +} +/* Common Styles */ +.swiper-pagination-fraction, +.swiper-pagination-custom, +.swiper-horizontal > .swiper-pagination-bullets, +.swiper-pagination-bullets.swiper-pagination-horizontal { + bottom: 10px; + left: 0; + width: 100%; +} +/* Bullets */ +.swiper-pagination-bullets-dynamic { + overflow: hidden; + font-size: 0; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet { + transform: scale(0.33); + position: relative; +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active { + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main { + transform: scale(1); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev { + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev { + transform: scale(0.33); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next { + transform: scale(0.66); +} +.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next { + transform: scale(0.33); +} +.swiper-pagination-bullet { + width: var( + --swiper-pagination-bullet-width, + var(--swiper-pagination-bullet-size, 8px) + ); + height: var( + --swiper-pagination-bullet-height, + var(--swiper-pagination-bullet-size, 8px) + ); + display: inline-block; + border-radius: 50%; + background: var(--swiper-pagination-bullet-inactive-color, #000); + opacity: var(--swiper-pagination-bullet-inactive-opacity, 0.2); +} +button.swiper-pagination-bullet { + border: none; + margin: 0; + padding: 0; + box-shadow: none; + -webkit-appearance: none; + appearance: none; +} +.swiper-pagination-clickable .swiper-pagination-bullet { + cursor: pointer; +} +.swiper-pagination-bullet:only-child { + display: none !important; +} +.swiper-pagination-bullet-active { + opacity: var(--swiper-pagination-bullet-opacity, 1); + background: var(--swiper-pagination-color, var(--swiper-theme-color)); +} +.swiper-vertical > .swiper-pagination-bullets, +.swiper-pagination-vertical.swiper-pagination-bullets { + right: 10px; + top: 50%; + transform: translate3d(0px, -50%, 0); +} +.swiper-vertical > .swiper-pagination-bullets .swiper-pagination-bullet, +.swiper-pagination-vertical.swiper-pagination-bullets + .swiper-pagination-bullet { + margin: var(--swiper-pagination-bullet-vertical-gap, 6px) 0; + display: block; +} +.swiper-vertical > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic, +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + top: 50%; + transform: translateY(-50%); + width: 8px; +} +.swiper-vertical + > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic + .swiper-pagination-bullet, +.swiper-pagination-vertical.swiper-pagination-bullets.swiper-pagination-bullets-dynamic + .swiper-pagination-bullet { + display: inline-block; + transition: + 200ms transform, + 200ms top; +} +.swiper-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet, +.swiper-pagination-horizontal.swiper-pagination-bullets + .swiper-pagination-bullet { + margin: 0 var(--swiper-pagination-bullet-horizontal-gap, 4px); +} +.swiper-horizontal + > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic, +.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic { + left: 50%; + transform: translateX(-50%); + white-space: nowrap; +} +.swiper-horizontal + > .swiper-pagination-bullets.swiper-pagination-bullets-dynamic + .swiper-pagination-bullet, +.swiper-pagination-horizontal.swiper-pagination-bullets.swiper-pagination-bullets-dynamic + .swiper-pagination-bullet { + transition: + 200ms transform, + 200ms left; +} +.swiper-horizontal.swiper-rtl + > .swiper-pagination-bullets-dynamic + .swiper-pagination-bullet { + transition: + 200ms transform, + 200ms right; +} +/* Progress */ +.swiper-pagination-progressbar { + background: rgba(0, 0, 0, 0.25); + position: absolute; +} +.swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + background: var(--swiper-pagination-color, var(--swiper-theme-color)); + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + transform: scale(0); + transform-origin: left top; +} +.swiper-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill { + transform-origin: right top; +} +.swiper-horizontal > .swiper-pagination-progressbar, +.swiper-pagination-progressbar.swiper-pagination-horizontal, +.swiper-vertical + > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite, +.swiper-pagination-progressbar.swiper-pagination-vertical.swiper-pagination-progressbar-opposite { + width: 100%; + height: 4px; + left: 0; + top: 0; +} +.swiper-vertical > .swiper-pagination-progressbar, +.swiper-pagination-progressbar.swiper-pagination-vertical, +.swiper-horizontal + > .swiper-pagination-progressbar.swiper-pagination-progressbar-opposite, +.swiper-pagination-progressbar.swiper-pagination-horizontal.swiper-pagination-progressbar-opposite { + width: 4px; + height: 100%; + left: 0; + top: 0; +} +.swiper-pagination-lock { + display: none; +} +/* Scrollbar */ +.swiper-scrollbar { + border-radius: 10px; + position: relative; + -ms-touch-action: none; + background: rgba(0, 0, 0, 0.1); +} +.swiper-horizontal > .swiper-scrollbar { + position: absolute; + left: 1%; + bottom: 3px; + z-index: 50; + height: 5px; + width: 98%; +} +.swiper-vertical > .swiper-scrollbar { + position: absolute; + right: 3px; + top: 1%; + z-index: 50; + width: 5px; + height: 98%; +} +.swiper-scrollbar-drag { + height: 100%; + width: 100%; + position: relative; + background: rgba(0, 0, 0, 0.5); + border-radius: 10px; + left: 0; + top: 0; +} +.swiper-scrollbar-cursor-drag { + cursor: move; +} +.swiper-scrollbar-lock { + display: none; +} +.swiper-zoom-container { + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + text-align: center; +} +.swiper-zoom-container > img, +.swiper-zoom-container > svg, +.swiper-zoom-container > canvas { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} +.swiper-slide-zoomed { + cursor: move; +} +/* Preloader */ +:root { + /* + --swiper-preloader-color: var(--swiper-theme-color); + */ +} +.swiper-lazy-preloader { + width: 42px; + height: 42px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -21px; + margin-top: -21px; + z-index: 10; + transform-origin: 50%; + box-sizing: border-box; + border: 4px solid var(--swiper-preloader-color, var(--swiper-theme-color)); + border-radius: 50%; + border-top-color: transparent; +} +.swiper-slide-visible .swiper-lazy-preloader { + animation: swiper-preloader-spin 1s infinite linear; +} +.swiper-lazy-preloader-white { + --swiper-preloader-color: #fff; +} +.swiper-lazy-preloader-black { + --swiper-preloader-color: #000; +} +@keyframes swiper-preloader-spin { + 100% { + transform: rotate(360deg); + } +} +/* a11y */ +.swiper .swiper-notification { + position: absolute; + left: 0; + top: 0; + pointer-events: none; + opacity: 0; + z-index: -1000; +} +.swiper-free-mode > .swiper-wrapper { + transition-timing-function: ease-out; + margin: 0 auto; +} +.swiper-grid > .swiper-wrapper { + flex-wrap: wrap; +} +.swiper-grid-column > .swiper-wrapper { + flex-wrap: wrap; + flex-direction: column; +} +.swiper-fade.swiper-free-mode .swiper-slide { + transition-timing-function: ease-out; +} +.swiper-fade .swiper-slide { + pointer-events: none; + transition-property: opacity; +} +.swiper-fade .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-fade .swiper-slide-active, +.swiper-fade .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-cube { + overflow: visible; +} +.swiper-cube .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; + visibility: hidden; + transform-origin: 0 0; + width: 100%; + height: 100%; +} +.swiper-cube .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-cube.swiper-rtl .swiper-slide { + transform-origin: 100% 0; +} +.swiper-cube .swiper-slide-active, +.swiper-cube .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-cube .swiper-slide-active, +.swiper-cube .swiper-slide-next, +.swiper-cube .swiper-slide-prev, +.swiper-cube .swiper-slide-next + .swiper-slide { + pointer-events: auto; + visibility: visible; +} +.swiper-cube .swiper-slide-shadow-top, +.swiper-cube .swiper-slide-shadow-bottom, +.swiper-cube .swiper-slide-shadow-left, +.swiper-cube .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-cube .swiper-cube-shadow { + position: absolute; + left: 0; + bottom: 0px; + width: 100%; + height: 100%; + opacity: 0.6; + z-index: 0; +} +.swiper-cube .swiper-cube-shadow:before { + content: ""; + background: #000; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + filter: blur(50px); +} +.swiper-flip { + overflow: visible; +} +.swiper-flip .swiper-slide { + pointer-events: none; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + z-index: 1; +} +.swiper-flip .swiper-slide .swiper-slide { + pointer-events: none; +} +.swiper-flip .swiper-slide-active, +.swiper-flip .swiper-slide-active .swiper-slide-active { + pointer-events: auto; +} +.swiper-flip .swiper-slide-shadow-top, +.swiper-flip .swiper-slide-shadow-bottom, +.swiper-flip .swiper-slide-shadow-left, +.swiper-flip .swiper-slide-shadow-right { + z-index: 0; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.swiper-creative .swiper-slide { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; + transition-property: transform, opacity, height; +} +.swiper-cards { + overflow: visible; +} +.swiper-cards .swiper-slide { + transform-origin: center bottom; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + overflow: hidden; +} diff --git a/themes/hugoplate/assets/plugins/swiper/swiper-bundle.js b/themes/hugoplate/assets/plugins/swiper/swiper-bundle.js new file mode 100644 index 0000000..9c90ea5 --- /dev/null +++ b/themes/hugoplate/assets/plugins/swiper/swiper-bundle.js @@ -0,0 +1,11853 @@ +/** + * Swiper 8.0.7 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2022 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: March 4, 2022 + */ + +(function (global, factory) { + typeof exports === "object" && typeof module !== "undefined" + ? (module.exports = factory()) + : typeof define === "function" && define.amd + ? define(factory) + : ((global = + typeof globalThis !== "undefined" ? globalThis : global || self), + (global.Swiper = factory())); +})(this, function () { + "use strict"; + + /** + * SSR Window 4.0.2 + * Better handling for window object in SSR environment + * https://github.com/nolimits4web/ssr-window + * + * Copyright 2021, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: December 13, 2021 + */ + + /* eslint-disable no-param-reassign */ + function isObject$1(obj) { + return ( + obj !== null && + typeof obj === "object" && + "constructor" in obj && + obj.constructor === Object + ); + } + + function extend$1(target, src) { + if (target === void 0) { + target = {}; + } + + if (src === void 0) { + src = {}; + } + + Object.keys(src).forEach((key) => { + if (typeof target[key] === "undefined") target[key] = src[key]; + else if ( + isObject$1(src[key]) && + isObject$1(target[key]) && + Object.keys(src[key]).length > 0 + ) { + extend$1(target[key], src[key]); + } + }); + } + + const ssrDocument = { + body: {}, + + addEventListener() {}, + + removeEventListener() {}, + + activeElement: { + blur() {}, + + nodeName: "", + }, + + querySelector() { + return null; + }, + + querySelectorAll() { + return []; + }, + + getElementById() { + return null; + }, + + createEvent() { + return { + initEvent() {}, + }; + }, + + createElement() { + return { + children: [], + childNodes: [], + style: {}, + + setAttribute() {}, + + getElementsByTagName() { + return []; + }, + }; + }, + + createElementNS() { + return {}; + }, + + importNode() { + return null; + }, + + location: { + hash: "", + host: "", + hostname: "", + href: "", + origin: "", + pathname: "", + protocol: "", + search: "", + }, + }; + + function getDocument() { + const doc = typeof document !== "undefined" ? document : {}; + extend$1(doc, ssrDocument); + return doc; + } + + const ssrWindow = { + document: ssrDocument, + navigator: { + userAgent: "", + }, + location: { + hash: "", + host: "", + hostname: "", + href: "", + origin: "", + pathname: "", + protocol: "", + search: "", + }, + history: { + replaceState() {}, + + pushState() {}, + + go() {}, + + back() {}, + }, + CustomEvent: function CustomEvent() { + return this; + }, + + addEventListener() {}, + + removeEventListener() {}, + + getComputedStyle() { + return { + getPropertyValue() { + return ""; + }, + }; + }, + + Image() {}, + + Date() {}, + + screen: {}, + + setTimeout() {}, + + clearTimeout() {}, + + matchMedia() { + return {}; + }, + + requestAnimationFrame(callback) { + if (typeof setTimeout === "undefined") { + callback(); + return null; + } + + return setTimeout(callback, 0); + }, + + cancelAnimationFrame(id) { + if (typeof setTimeout === "undefined") { + return; + } + + clearTimeout(id); + }, + }; + + function getWindow() { + const win = typeof window !== "undefined" ? window : {}; + extend$1(win, ssrWindow); + return win; + } + + /** + * Dom7 4.0.4 + * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API + * https://framework7.io/docs/dom7.html + * + * Copyright 2022, Vladimir Kharlampidi + * + * Licensed under MIT + * + * Released on: January 11, 2022 + */ + /* eslint-disable no-proto */ + + function makeReactive(obj) { + const proto = obj.__proto__; + Object.defineProperty(obj, "__proto__", { + get() { + return proto; + }, + + set(value) { + proto.__proto__ = value; + }, + }); + } + + class Dom7 extends Array { + constructor(items) { + if (typeof items === "number") { + super(items); + } else { + super(...(items || [])); + makeReactive(this); + } + } + } + + function arrayFlat(arr) { + if (arr === void 0) { + arr = []; + } + + const res = []; + arr.forEach((el) => { + if (Array.isArray(el)) { + res.push(...arrayFlat(el)); + } else { + res.push(el); + } + }); + return res; + } + + function arrayFilter(arr, callback) { + return Array.prototype.filter.call(arr, callback); + } + + function arrayUnique(arr) { + const uniqueArray = []; + + for (let i = 0; i < arr.length; i += 1) { + if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]); + } + + return uniqueArray; + } + + function qsa(selector, context) { + if (typeof selector !== "string") { + return [selector]; + } + + const a = []; + const res = context.querySelectorAll(selector); + + for (let i = 0; i < res.length; i += 1) { + a.push(res[i]); + } + + return a; + } + + function $(selector, context) { + const window = getWindow(); + const document = getDocument(); + let arr = []; + + if (!context && selector instanceof Dom7) { + return selector; + } + + if (!selector) { + return new Dom7(arr); + } + + if (typeof selector === "string") { + const html = selector.trim(); + + if (html.indexOf("<") >= 0 && html.indexOf(">") >= 0) { + let toCreate = "div"; + if (html.indexOf(" c.split(" "))); + this.forEach((el) => { + el.classList.add(...classNames); + }); + return this; + } + + function removeClass() { + for ( + var _len2 = arguments.length, classes = new Array(_len2), _key2 = 0; + _key2 < _len2; + _key2++ + ) { + classes[_key2] = arguments[_key2]; + } + + const classNames = arrayFlat(classes.map((c) => c.split(" "))); + this.forEach((el) => { + el.classList.remove(...classNames); + }); + return this; + } + + function toggleClass() { + for ( + var _len3 = arguments.length, classes = new Array(_len3), _key3 = 0; + _key3 < _len3; + _key3++ + ) { + classes[_key3] = arguments[_key3]; + } + + const classNames = arrayFlat(classes.map((c) => c.split(" "))); + this.forEach((el) => { + classNames.forEach((className) => { + el.classList.toggle(className); + }); + }); + } + + function hasClass() { + for ( + var _len4 = arguments.length, classes = new Array(_len4), _key4 = 0; + _key4 < _len4; + _key4++ + ) { + classes[_key4] = arguments[_key4]; + } + + const classNames = arrayFlat(classes.map((c) => c.split(" "))); + return ( + arrayFilter(this, (el) => { + return ( + classNames.filter((className) => el.classList.contains(className)) + .length > 0 + ); + }).length > 0 + ); + } + + function attr(attrs, value) { + if (arguments.length === 1 && typeof attrs === "string") { + // Get attr + if (this[0]) return this[0].getAttribute(attrs); + return undefined; + } // Set attrs + + for (let i = 0; i < this.length; i += 1) { + if (arguments.length === 2) { + // String + this[i].setAttribute(attrs, value); + } else { + // Object + for (const attrName in attrs) { + this[i][attrName] = attrs[attrName]; + this[i].setAttribute(attrName, attrs[attrName]); + } + } + } + + return this; + } + + function removeAttr(attr) { + for (let i = 0; i < this.length; i += 1) { + this[i].removeAttribute(attr); + } + + return this; + } + + function transform(transform) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transform = transform; + } + + return this; + } + + function transition$1(duration) { + for (let i = 0; i < this.length; i += 1) { + this[i].style.transitionDuration = + typeof duration !== "string" ? `${duration}ms` : duration; + } + + return this; + } + + function on() { + for ( + var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; + _key5 < _len5; + _key5++ + ) { + args[_key5] = arguments[_key5]; + } + + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === "function") { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + + function handleLiveEvent(e) { + const target = e.target; + if (!target) return; + const eventData = e.target.dom7EventData || []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + if ($(target).is(targetSelector)) listener.apply(target, eventData); + else { + const parents = $(target).parents(); // eslint-disable-line + + for (let k = 0; k < parents.length; k += 1) { + if ($(parents[k]).is(targetSelector)) + listener.apply(parents[k], eventData); + } + } + } + + function handleEvent(e) { + const eventData = e && e.target ? e.target.dom7EventData || [] : []; + + if (eventData.indexOf(e) < 0) { + eventData.unshift(e); + } + + listener.apply(this, eventData); + } + + const events = eventType.split(" "); + let j; + + for (let i = 0; i < this.length; i += 1) { + const el = this[i]; + + if (!targetSelector) { + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7Listeners) el.dom7Listeners = {}; + if (!el.dom7Listeners[event]) el.dom7Listeners[event] = []; + el.dom7Listeners[event].push({ + listener, + proxyListener: handleEvent, + }); + el.addEventListener(event, handleEvent, capture); + } + } else { + // Live events + for (j = 0; j < events.length; j += 1) { + const event = events[j]; + if (!el.dom7LiveListeners) el.dom7LiveListeners = {}; + if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = []; + el.dom7LiveListeners[event].push({ + listener, + proxyListener: handleLiveEvent, + }); + el.addEventListener(event, handleLiveEvent, capture); + } + } + } + + return this; + } + + function off() { + for ( + var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; + _key6 < _len6; + _key6++ + ) { + args[_key6] = arguments[_key6]; + } + + let [eventType, targetSelector, listener, capture] = args; + + if (typeof args[1] === "function") { + [eventType, listener, capture] = args; + targetSelector = undefined; + } + + if (!capture) capture = false; + const events = eventType.split(" "); + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + let handlers; + + if (!targetSelector && el.dom7Listeners) { + handlers = el.dom7Listeners[event]; + } else if (targetSelector && el.dom7LiveListeners) { + handlers = el.dom7LiveListeners[event]; + } + + if (handlers && handlers.length) { + for (let k = handlers.length - 1; k >= 0; k -= 1) { + const handler = handlers[k]; + + if (listener && handler.listener === listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if ( + listener && + handler.listener && + handler.listener.dom7proxy && + handler.listener.dom7proxy === listener + ) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } else if (!listener) { + el.removeEventListener(event, handler.proxyListener, capture); + handlers.splice(k, 1); + } + } + } + } + } + + return this; + } + + function trigger() { + const window = getWindow(); + + for ( + var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; + _key9 < _len9; + _key9++ + ) { + args[_key9] = arguments[_key9]; + } + + const events = args[0].split(" "); + const eventData = args[1]; + + for (let i = 0; i < events.length; i += 1) { + const event = events[i]; + + for (let j = 0; j < this.length; j += 1) { + const el = this[j]; + + if (window.CustomEvent) { + const evt = new window.CustomEvent(event, { + detail: eventData, + bubbles: true, + cancelable: true, + }); + el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0); + el.dispatchEvent(evt); + el.dom7EventData = []; + delete el.dom7EventData; + } + } + } + + return this; + } + + function transitionEnd$1(callback) { + const dom = this; + + function fireCallBack(e) { + if (e.target !== this) return; + callback.call(this, e); + dom.off("transitionend", fireCallBack); + } + + if (callback) { + dom.on("transitionend", fireCallBack); + } + + return this; + } + + function outerWidth(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return ( + this[0].offsetWidth + + parseFloat(styles.getPropertyValue("margin-right")) + + parseFloat(styles.getPropertyValue("margin-left")) + ); + } + + return this[0].offsetWidth; + } + + return null; + } + + function outerHeight(includeMargins) { + if (this.length > 0) { + if (includeMargins) { + const styles = this.styles(); + return ( + this[0].offsetHeight + + parseFloat(styles.getPropertyValue("margin-top")) + + parseFloat(styles.getPropertyValue("margin-bottom")) + ); + } + + return this[0].offsetHeight; + } + + return null; + } + + function offset() { + if (this.length > 0) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + const box = el.getBoundingClientRect(); + const body = document.body; + const clientTop = el.clientTop || body.clientTop || 0; + const clientLeft = el.clientLeft || body.clientLeft || 0; + const scrollTop = el === window ? window.scrollY : el.scrollTop; + const scrollLeft = el === window ? window.scrollX : el.scrollLeft; + return { + top: box.top + scrollTop - clientTop, + left: box.left + scrollLeft - clientLeft, + }; + } + + return null; + } + + function styles() { + const window = getWindow(); + if (this[0]) return window.getComputedStyle(this[0], null); + return {}; + } + + function css(props, value) { + const window = getWindow(); + let i; + + if (arguments.length === 1) { + if (typeof props === "string") { + // .css('width') + if (this[0]) + return window.getComputedStyle(this[0], null).getPropertyValue(props); + } else { + // .css({ width: '100px' }) + for (i = 0; i < this.length; i += 1) { + for (const prop in props) { + this[i].style[prop] = props[prop]; + } + } + + return this; + } + } + + if (arguments.length === 2 && typeof props === "string") { + // .css('width', '100px') + for (i = 0; i < this.length; i += 1) { + this[i].style[props] = value; + } + + return this; + } + + return this; + } + + function each(callback) { + if (!callback) return this; + this.forEach((el, index) => { + callback.apply(el, [el, index]); + }); + return this; + } + + function filter(callback) { + const result = arrayFilter(this, callback); + return $(result); + } + + function html(html) { + if (typeof html === "undefined") { + return this[0] ? this[0].innerHTML : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].innerHTML = html; + } + + return this; + } + + function text(text) { + if (typeof text === "undefined") { + return this[0] ? this[0].textContent.trim() : null; + } + + for (let i = 0; i < this.length; i += 1) { + this[i].textContent = text; + } + + return this; + } + + function is(selector) { + const window = getWindow(); + const document = getDocument(); + const el = this[0]; + let compareWith; + let i; + if (!el || typeof selector === "undefined") return false; + + if (typeof selector === "string") { + if (el.matches) return el.matches(selector); + if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector); + if (el.msMatchesSelector) return el.msMatchesSelector(selector); + compareWith = $(selector); + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + if (selector === document) { + return el === document; + } + + if (selector === window) { + return el === window; + } + + if (selector.nodeType || selector instanceof Dom7) { + compareWith = selector.nodeType ? [selector] : selector; + + for (i = 0; i < compareWith.length; i += 1) { + if (compareWith[i] === el) return true; + } + + return false; + } + + return false; + } + + function index() { + let child = this[0]; + let i; + + if (child) { + i = 0; // eslint-disable-next-line + + while ((child = child.previousSibling) !== null) { + if (child.nodeType === 1) i += 1; + } + + return i; + } + + return undefined; + } + + function eq(index) { + if (typeof index === "undefined") return this; + const length = this.length; + + if (index > length - 1) { + return $([]); + } + + if (index < 0) { + const returnIndex = length + index; + if (returnIndex < 0) return $([]); + return $([this[returnIndex]]); + } + + return $([this[index]]); + } + + function append() { + let newChild; + const document = getDocument(); + + for (let k = 0; k < arguments.length; k += 1) { + newChild = k < 0 || arguments.length <= k ? undefined : arguments[k]; + + for (let i = 0; i < this.length; i += 1) { + if (typeof newChild === "string") { + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = newChild; + + while (tempDiv.firstChild) { + this[i].appendChild(tempDiv.firstChild); + } + } else if (newChild instanceof Dom7) { + for (let j = 0; j < newChild.length; j += 1) { + this[i].appendChild(newChild[j]); + } + } else { + this[i].appendChild(newChild); + } + } + } + + return this; + } + + function prepend(newChild) { + const document = getDocument(); + let i; + let j; + + for (i = 0; i < this.length; i += 1) { + if (typeof newChild === "string") { + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = newChild; + + for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) { + this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]); + } + } else if (newChild instanceof Dom7) { + for (j = 0; j < newChild.length; j += 1) { + this[i].insertBefore(newChild[j], this[i].childNodes[0]); + } + } else { + this[i].insertBefore(newChild, this[i].childNodes[0]); + } + } + + return this; + } + + function next(selector) { + if (this.length > 0) { + if (selector) { + if ( + this[0].nextElementSibling && + $(this[0].nextElementSibling).is(selector) + ) { + return $([this[0].nextElementSibling]); + } + + return $([]); + } + + if (this[0].nextElementSibling) return $([this[0].nextElementSibling]); + return $([]); + } + + return $([]); + } + + function nextAll(selector) { + const nextEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.nextElementSibling) { + const next = el.nextElementSibling; // eslint-disable-line + + if (selector) { + if ($(next).is(selector)) nextEls.push(next); + } else nextEls.push(next); + + el = next; + } + + return $(nextEls); + } + + function prev(selector) { + if (this.length > 0) { + const el = this[0]; + + if (selector) { + if ( + el.previousElementSibling && + $(el.previousElementSibling).is(selector) + ) { + return $([el.previousElementSibling]); + } + + return $([]); + } + + if (el.previousElementSibling) return $([el.previousElementSibling]); + return $([]); + } + + return $([]); + } + + function prevAll(selector) { + const prevEls = []; + let el = this[0]; + if (!el) return $([]); + + while (el.previousElementSibling) { + const prev = el.previousElementSibling; // eslint-disable-line + + if (selector) { + if ($(prev).is(selector)) prevEls.push(prev); + } else prevEls.push(prev); + + el = prev; + } + + return $(prevEls); + } + + function parent(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode !== null) { + if (selector) { + if ($(this[i].parentNode).is(selector)) + parents.push(this[i].parentNode); + } else { + parents.push(this[i].parentNode); + } + } + } + + return $(parents); + } + + function parents(selector) { + const parents = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + let parent = this[i].parentNode; // eslint-disable-line + + while (parent) { + if (selector) { + if ($(parent).is(selector)) parents.push(parent); + } else { + parents.push(parent); + } + + parent = parent.parentNode; + } + } + + return $(parents); + } + + function closest(selector) { + let closest = this; // eslint-disable-line + + if (typeof selector === "undefined") { + return $([]); + } + + if (!closest.is(selector)) { + closest = closest.parents(selector).eq(0); + } + + return closest; + } + + function find(selector) { + const foundElements = []; + + for (let i = 0; i < this.length; i += 1) { + const found = this[i].querySelectorAll(selector); + + for (let j = 0; j < found.length; j += 1) { + foundElements.push(found[j]); + } + } + + return $(foundElements); + } + + function children(selector) { + const children = []; // eslint-disable-line + + for (let i = 0; i < this.length; i += 1) { + const childNodes = this[i].children; + + for (let j = 0; j < childNodes.length; j += 1) { + if (!selector || $(childNodes[j]).is(selector)) { + children.push(childNodes[j]); + } + } + } + + return $(children); + } + + function remove() { + for (let i = 0; i < this.length; i += 1) { + if (this[i].parentNode) this[i].parentNode.removeChild(this[i]); + } + + return this; + } + + const Methods = { + addClass, + removeClass, + hasClass, + toggleClass, + attr, + removeAttr, + transform, + transition: transition$1, + on, + off, + trigger, + transitionEnd: transitionEnd$1, + outerWidth, + outerHeight, + styles, + offset, + css, + each, + html, + text, + is, + index, + eq, + append, + prepend, + next, + nextAll, + prev, + prevAll, + parent, + parents, + closest, + find, + children, + filter, + remove, + }; + Object.keys(Methods).forEach((methodName) => { + Object.defineProperty($.fn, methodName, { + value: Methods[methodName], + writable: true, + }); + }); + + function deleteProps(obj) { + const object = obj; + Object.keys(object).forEach((key) => { + try { + object[key] = null; + } catch (e) { + // no getter for object + } + + try { + delete object[key]; + } catch (e) { + // something got wrong + } + }); + } + + function nextTick(callback, delay) { + if (delay === void 0) { + delay = 0; + } + + return setTimeout(callback, delay); + } + + function now() { + return Date.now(); + } + + function getComputedStyle$1(el) { + const window = getWindow(); + let style; + + if (window.getComputedStyle) { + style = window.getComputedStyle(el, null); + } + + if (!style && el.currentStyle) { + style = el.currentStyle; + } + + if (!style) { + style = el.style; + } + + return style; + } + + function getTranslate(el, axis) { + if (axis === void 0) { + axis = "x"; + } + + const window = getWindow(); + let matrix; + let curTransform; + let transformMatrix; + const curStyle = getComputedStyle$1(el); + + if (window.WebKitCSSMatrix) { + curTransform = curStyle.transform || curStyle.webkitTransform; + + if (curTransform.split(",").length > 6) { + curTransform = curTransform + .split(", ") + .map((a) => a.replace(",", ".")) + .join(", "); + } // Some old versions of Webkit choke when 'none' is passed; pass + // empty string instead in this case + + transformMatrix = new window.WebKitCSSMatrix( + curTransform === "none" ? "" : curTransform, + ); + } else { + transformMatrix = + curStyle.MozTransform || + curStyle.OTransform || + curStyle.MsTransform || + curStyle.msTransform || + curStyle.transform || + curStyle + .getPropertyValue("transform") + .replace("translate(", "matrix(1, 0, 0, 1,"); + matrix = transformMatrix.toString().split(","); + } + + if (axis === "x") { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m41; // Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[12]); // Normal Browsers + else curTransform = parseFloat(matrix[4]); + } + + if (axis === "y") { + // Latest Chrome and webkits Fix + if (window.WebKitCSSMatrix) + curTransform = transformMatrix.m42; // Crazy IE10 Matrix + else if (matrix.length === 16) + curTransform = parseFloat(matrix[13]); // Normal Browsers + else curTransform = parseFloat(matrix[5]); + } + + return curTransform || 0; + } + + function isObject(o) { + return ( + typeof o === "object" && + o !== null && + o.constructor && + Object.prototype.toString.call(o).slice(8, -1) === "Object" + ); + } + + function isNode(node) { + // eslint-disable-next-line + if ( + typeof window !== "undefined" && + typeof window.HTMLElement !== "undefined" + ) { + return node instanceof HTMLElement; + } + + return node && (node.nodeType === 1 || node.nodeType === 11); + } + + function extend() { + const to = Object(arguments.length <= 0 ? undefined : arguments[0]); + const noExtend = ["__proto__", "constructor", "prototype"]; + + for (let i = 1; i < arguments.length; i += 1) { + const nextSource = + i < 0 || arguments.length <= i ? undefined : arguments[i]; + + if ( + nextSource !== undefined && + nextSource !== null && + !isNode(nextSource) + ) { + const keysArray = Object.keys(Object(nextSource)).filter( + (key) => noExtend.indexOf(key) < 0, + ); + + for ( + let nextIndex = 0, len = keysArray.length; + nextIndex < len; + nextIndex += 1 + ) { + const nextKey = keysArray[nextIndex]; + const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey); + + if (desc !== undefined && desc.enumerable) { + if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) { + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else if ( + !isObject(to[nextKey]) && + isObject(nextSource[nextKey]) + ) { + to[nextKey] = {}; + + if (nextSource[nextKey].__swiper__) { + to[nextKey] = nextSource[nextKey]; + } else { + extend(to[nextKey], nextSource[nextKey]); + } + } else { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + } + + return to; + } + + function setCSSProperty(el, varName, varValue) { + el.style.setProperty(varName, varValue); + } + + function animateCSSModeScroll(_ref) { + let { swiper, targetPosition, side } = _ref; + const window = getWindow(); + const startPosition = -swiper.translate; + let startTime = null; + let time; + const duration = swiper.params.speed; + swiper.wrapperEl.style.scrollSnapType = "none"; + window.cancelAnimationFrame(swiper.cssModeFrameID); + const dir = targetPosition > startPosition ? "next" : "prev"; + + const isOutOfBound = (current, target) => { + return ( + (dir === "next" && current >= target) || + (dir === "prev" && current <= target) + ); + }; + + const animate = () => { + time = new Date().getTime(); + + if (startTime === null) { + startTime = time; + } + + const progress = Math.max(Math.min((time - startTime) / duration, 1), 0); + const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2; + let currentPosition = + startPosition + easeProgress * (targetPosition - startPosition); + + if (isOutOfBound(currentPosition, targetPosition)) { + currentPosition = targetPosition; + } + + swiper.wrapperEl.scrollTo({ + [side]: currentPosition, + }); + + if (isOutOfBound(currentPosition, targetPosition)) { + swiper.wrapperEl.style.overflow = "hidden"; + swiper.wrapperEl.style.scrollSnapType = ""; + setTimeout(() => { + swiper.wrapperEl.style.overflow = ""; + swiper.wrapperEl.scrollTo({ + [side]: currentPosition, + }); + }); + window.cancelAnimationFrame(swiper.cssModeFrameID); + return; + } + + swiper.cssModeFrameID = window.requestAnimationFrame(animate); + }; + + animate(); + } + + let support; + + function calcSupport() { + const window = getWindow(); + const document = getDocument(); + return { + smoothScroll: + document.documentElement && + "scrollBehavior" in document.documentElement.style, + touch: !!( + "ontouchstart" in window || + (window.DocumentTouch && document instanceof window.DocumentTouch) + ), + passiveListener: (function checkPassiveListener() { + let supportsPassive = false; + + try { + const opts = Object.defineProperty({}, "passive", { + // eslint-disable-next-line + get() { + supportsPassive = true; + }, + }); + window.addEventListener("testPassiveListener", null, opts); + } catch (e) { + // No support + } + + return supportsPassive; + })(), + gestures: (function checkGestures() { + return "ongesturestart" in window; + })(), + }; + } + + function getSupport() { + if (!support) { + support = calcSupport(); + } + + return support; + } + + let deviceCached; + + function calcDevice(_temp) { + let { userAgent } = _temp === void 0 ? {} : _temp; + const support = getSupport(); + const window = getWindow(); + const platform = window.navigator.platform; + const ua = userAgent || window.navigator.userAgent; + const device = { + ios: false, + android: false, + }; + const screenWidth = window.screen.width; + const screenHeight = window.screen.height; + const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line + + let ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/); + const windows = platform === "Win32"; + let macos = platform === "MacIntel"; // iPadOs 13 fix + + const iPadScreens = [ + "1024x1366", + "1366x1024", + "834x1194", + "1194x834", + "834x1112", + "1112x834", + "768x1024", + "1024x768", + "820x1180", + "1180x820", + "810x1080", + "1080x810", + ]; + + if ( + !ipad && + macos && + support.touch && + iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0 + ) { + ipad = ua.match(/(Version)\/([\d.]+)/); + if (!ipad) ipad = [0, 1, "13_0_0"]; + macos = false; + } // Android + + if (android && !windows) { + device.os = "android"; + device.android = true; + } + + if (ipad || iphone || ipod) { + device.os = "ios"; + device.ios = true; + } // Export object + + return device; + } + + function getDevice(overrides) { + if (overrides === void 0) { + overrides = {}; + } + + if (!deviceCached) { + deviceCached = calcDevice(overrides); + } + + return deviceCached; + } + + let browser; + + function calcBrowser() { + const window = getWindow(); + + function isSafari() { + const ua = window.navigator.userAgent.toLowerCase(); + return ( + ua.indexOf("safari") >= 0 && + ua.indexOf("chrome") < 0 && + ua.indexOf("android") < 0 + ); + } + + return { + isSafari: isSafari(), + isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test( + window.navigator.userAgent, + ), + }; + } + + function getBrowser() { + if (!browser) { + browser = calcBrowser(); + } + + return browser; + } + + function Resize(_ref) { + let { swiper, on, emit } = _ref; + const window = getWindow(); + let observer = null; + let animationFrame = null; + + const resizeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit("beforeResize"); + emit("resize"); + }; + + const createObserver = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + observer = new ResizeObserver((entries) => { + animationFrame = window.requestAnimationFrame(() => { + const { width, height } = swiper; + let newWidth = width; + let newHeight = height; + entries.forEach((_ref2) => { + let { contentBoxSize, contentRect, target } = _ref2; + if (target && target !== swiper.el) return; + newWidth = contentRect + ? contentRect.width + : (contentBoxSize[0] || contentBoxSize).inlineSize; + newHeight = contentRect + ? contentRect.height + : (contentBoxSize[0] || contentBoxSize).blockSize; + }); + + if (newWidth !== width || newHeight !== height) { + resizeHandler(); + } + }); + }); + observer.observe(swiper.el); + }; + + const removeObserver = () => { + if (animationFrame) { + window.cancelAnimationFrame(animationFrame); + } + + if (observer && observer.unobserve && swiper.el) { + observer.unobserve(swiper.el); + observer = null; + } + }; + + const orientationChangeHandler = () => { + if (!swiper || swiper.destroyed || !swiper.initialized) return; + emit("orientationchange"); + }; + + on("init", () => { + if ( + swiper.params.resizeObserver && + typeof window.ResizeObserver !== "undefined" + ) { + createObserver(); + return; + } + + window.addEventListener("resize", resizeHandler); + window.addEventListener("orientationchange", orientationChangeHandler); + }); + on("destroy", () => { + removeObserver(); + window.removeEventListener("resize", resizeHandler); + window.removeEventListener("orientationchange", orientationChangeHandler); + }); + } + + function Observer(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const observers = []; + const window = getWindow(); + + const attach = function (target, options) { + if (options === void 0) { + options = {}; + } + + const ObserverFunc = + window.MutationObserver || window.WebkitMutationObserver; + const observer = new ObserverFunc((mutations) => { + // The observerUpdate event should only be triggered + // once despite the number of mutations. Additional + // triggers are redundant and are very costly + if (mutations.length === 1) { + emit("observerUpdate", mutations[0]); + return; + } + + const observerUpdate = function observerUpdate() { + emit("observerUpdate", mutations[0]); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(observerUpdate); + } else { + window.setTimeout(observerUpdate, 0); + } + }); + observer.observe(target, { + attributes: + typeof options.attributes === "undefined" ? true : options.attributes, + childList: + typeof options.childList === "undefined" ? true : options.childList, + characterData: + typeof options.characterData === "undefined" + ? true + : options.characterData, + }); + observers.push(observer); + }; + + const init = () => { + if (!swiper.params.observer) return; + + if (swiper.params.observeParents) { + const containerParents = swiper.$el.parents(); + + for (let i = 0; i < containerParents.length; i += 1) { + attach(containerParents[i]); + } + } // Observe container + + attach(swiper.$el[0], { + childList: swiper.params.observeSlideChildren, + }); // Observe wrapper + + attach(swiper.$wrapperEl[0], { + attributes: false, + }); + }; + + const destroy = () => { + observers.forEach((observer) => { + observer.disconnect(); + }); + observers.splice(0, observers.length); + }; + + extendParams({ + observer: false, + observeParents: false, + observeSlideChildren: false, + }); + on("init", init); + on("destroy", destroy); + } + + /* eslint-disable no-underscore-dangle */ + var eventsEmitter = { + on(events, handler, priority) { + const self = this; + if (typeof handler !== "function") return self; + const method = priority ? "unshift" : "push"; + events.split(" ").forEach((event) => { + if (!self.eventsListeners[event]) self.eventsListeners[event] = []; + self.eventsListeners[event][method](handler); + }); + return self; + }, + + once(events, handler, priority) { + const self = this; + if (typeof handler !== "function") return self; + + function onceHandler() { + self.off(events, onceHandler); + + if (onceHandler.__emitterProxy) { + delete onceHandler.__emitterProxy; + } + + for ( + var _len = arguments.length, args = new Array(_len), _key = 0; + _key < _len; + _key++ + ) { + args[_key] = arguments[_key]; + } + + handler.apply(self, args); + } + + onceHandler.__emitterProxy = handler; + return self.on(events, onceHandler, priority); + }, + + onAny(handler, priority) { + const self = this; + if (typeof handler !== "function") return self; + const method = priority ? "unshift" : "push"; + + if (self.eventsAnyListeners.indexOf(handler) < 0) { + self.eventsAnyListeners[method](handler); + } + + return self; + }, + + offAny(handler) { + const self = this; + if (!self.eventsAnyListeners) return self; + const index = self.eventsAnyListeners.indexOf(handler); + + if (index >= 0) { + self.eventsAnyListeners.splice(index, 1); + } + + return self; + }, + + off(events, handler) { + const self = this; + if (!self.eventsListeners) return self; + events.split(" ").forEach((event) => { + if (typeof handler === "undefined") { + self.eventsListeners[event] = []; + } else if (self.eventsListeners[event]) { + self.eventsListeners[event].forEach((eventHandler, index) => { + if ( + eventHandler === handler || + (eventHandler.__emitterProxy && + eventHandler.__emitterProxy === handler) + ) { + self.eventsListeners[event].splice(index, 1); + } + }); + } + }); + return self; + }, + + emit() { + const self = this; + if (!self.eventsListeners) return self; + let events; + let data; + let context; + + for ( + var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; + _key2 < _len2; + _key2++ + ) { + args[_key2] = arguments[_key2]; + } + + if (typeof args[0] === "string" || Array.isArray(args[0])) { + events = args[0]; + data = args.slice(1, args.length); + context = self; + } else { + events = args[0].events; + data = args[0].data; + context = args[0].context || self; + } + + data.unshift(context); + const eventsArray = Array.isArray(events) ? events : events.split(" "); + eventsArray.forEach((event) => { + if (self.eventsAnyListeners && self.eventsAnyListeners.length) { + self.eventsAnyListeners.forEach((eventHandler) => { + eventHandler.apply(context, [event, ...data]); + }); + } + + if (self.eventsListeners && self.eventsListeners[event]) { + self.eventsListeners[event].forEach((eventHandler) => { + eventHandler.apply(context, data); + }); + } + }); + return self; + }, + }; + + function updateSize() { + const swiper = this; + let width; + let height; + const $el = swiper.$el; + + if ( + typeof swiper.params.width !== "undefined" && + swiper.params.width !== null + ) { + width = swiper.params.width; + } else { + width = $el[0].clientWidth; + } + + if ( + typeof swiper.params.height !== "undefined" && + swiper.params.height !== null + ) { + height = swiper.params.height; + } else { + height = $el[0].clientHeight; + } + + if ( + (width === 0 && swiper.isHorizontal()) || + (height === 0 && swiper.isVertical()) + ) { + return; + } // Subtract paddings + + width = + width - + parseInt($el.css("padding-left") || 0, 10) - + parseInt($el.css("padding-right") || 0, 10); + height = + height - + parseInt($el.css("padding-top") || 0, 10) - + parseInt($el.css("padding-bottom") || 0, 10); + if (Number.isNaN(width)) width = 0; + if (Number.isNaN(height)) height = 0; + Object.assign(swiper, { + width, + height, + size: swiper.isHorizontal() ? width : height, + }); + } + + function updateSlides() { + const swiper = this; + + function getDirectionLabel(property) { + if (swiper.isHorizontal()) { + return property; + } // prettier-ignore + + return { + width: "height", + "margin-top": "margin-left", + "margin-bottom ": "margin-right", + "margin-left": "margin-top", + "margin-right": "margin-bottom", + "padding-left": "padding-top", + "padding-right": "padding-bottom", + marginRight: "marginBottom", + }[property]; + } + + function getDirectionPropertyValue(node, label) { + return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0); + } + + const params = swiper.params; + const { + $wrapperEl, + size: swiperSize, + rtlTranslate: rtl, + wrongRTL, + } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + const previousSlidesLength = isVirtual + ? swiper.virtual.slides.length + : swiper.slides.length; + const slides = $wrapperEl.children(`.${swiper.params.slideClass}`); + const slidesLength = isVirtual + ? swiper.virtual.slides.length + : slides.length; + let snapGrid = []; + const slidesGrid = []; + const slidesSizesGrid = []; + let offsetBefore = params.slidesOffsetBefore; + + if (typeof offsetBefore === "function") { + offsetBefore = params.slidesOffsetBefore.call(swiper); + } + + let offsetAfter = params.slidesOffsetAfter; + + if (typeof offsetAfter === "function") { + offsetAfter = params.slidesOffsetAfter.call(swiper); + } + + const previousSnapGridLength = swiper.snapGrid.length; + const previousSlidesGridLength = swiper.slidesGrid.length; + let spaceBetween = params.spaceBetween; + let slidePosition = -offsetBefore; + let prevSlideSize = 0; + let index = 0; + + if (typeof swiperSize === "undefined") { + return; + } + + if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) { + spaceBetween = + (parseFloat(spaceBetween.replace("%", "")) / 100) * swiperSize; + } + + swiper.virtualSize = -spaceBetween; // reset margins + + if (rtl) + slides.css({ + marginLeft: "", + marginBottom: "", + marginTop: "", + }); + else + slides.css({ + marginRight: "", + marginBottom: "", + marginTop: "", + }); // reset cssMode offsets + + if (params.centeredSlides && params.cssMode) { + setCSSProperty(swiper.wrapperEl, "--swiper-centered-offset-before", ""); + setCSSProperty(swiper.wrapperEl, "--swiper-centered-offset-after", ""); + } + + const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid; + + if (gridEnabled) { + swiper.grid.initSlides(slidesLength); + } // Calc slides + + let slideSize; + const shouldResetSlideSize = + params.slidesPerView === "auto" && + params.breakpoints && + Object.keys(params.breakpoints).filter((key) => { + return typeof params.breakpoints[key].slidesPerView !== "undefined"; + }).length > 0; + + for (let i = 0; i < slidesLength; i += 1) { + slideSize = 0; + const slide = slides.eq(i); + + if (gridEnabled) { + swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel); + } + + if (slide.css("display") === "none") continue; // eslint-disable-line + + if (params.slidesPerView === "auto") { + if (shouldResetSlideSize) { + slides[i].style[getDirectionLabel("width")] = ``; + } + + const slideStyles = getComputedStyle(slide[0]); + const currentTransform = slide[0].style.transform; + const currentWebKitTransform = slide[0].style.webkitTransform; + + if (currentTransform) { + slide[0].style.transform = "none"; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = "none"; + } + + if (params.roundLengths) { + slideSize = swiper.isHorizontal() + ? slide.outerWidth(true) + : slide.outerHeight(true); + } else { + // eslint-disable-next-line + const width = getDirectionPropertyValue(slideStyles, "width"); + const paddingLeft = getDirectionPropertyValue( + slideStyles, + "padding-left", + ); + const paddingRight = getDirectionPropertyValue( + slideStyles, + "padding-right", + ); + const marginLeft = getDirectionPropertyValue( + slideStyles, + "margin-left", + ); + const marginRight = getDirectionPropertyValue( + slideStyles, + "margin-right", + ); + const boxSizing = slideStyles.getPropertyValue("box-sizing"); + + if (boxSizing && boxSizing === "border-box") { + slideSize = width + marginLeft + marginRight; + } else { + const { clientWidth, offsetWidth } = slide[0]; + slideSize = + width + + paddingLeft + + paddingRight + + marginLeft + + marginRight + + (offsetWidth - clientWidth); + } + } + + if (currentTransform) { + slide[0].style.transform = currentTransform; + } + + if (currentWebKitTransform) { + slide[0].style.webkitTransform = currentWebKitTransform; + } + + if (params.roundLengths) slideSize = Math.floor(slideSize); + } else { + slideSize = + (swiperSize - (params.slidesPerView - 1) * spaceBetween) / + params.slidesPerView; + if (params.roundLengths) slideSize = Math.floor(slideSize); + + if (slides[i]) { + slides[i].style[getDirectionLabel("width")] = `${slideSize}px`; + } + } + + if (slides[i]) { + slides[i].swiperSlideSize = slideSize; + } + + slidesSizesGrid.push(slideSize); + + if (params.centeredSlides) { + slidePosition = + slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween; + if (prevSlideSize === 0 && i !== 0) + slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (i === 0) + slidePosition = slidePosition - swiperSize / 2 - spaceBetween; + if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0; + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + } else { + if (params.roundLengths) slidePosition = Math.floor(slidePosition); + if ( + (index - Math.min(swiper.params.slidesPerGroupSkip, index)) % + swiper.params.slidesPerGroup === + 0 + ) + snapGrid.push(slidePosition); + slidesGrid.push(slidePosition); + slidePosition = slidePosition + slideSize + spaceBetween; + } + + swiper.virtualSize += slideSize + spaceBetween; + prevSlideSize = slideSize; + index += 1; + } + + swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter; + + if ( + rtl && + wrongRTL && + (params.effect === "slide" || params.effect === "coverflow") + ) { + $wrapperEl.css({ + width: `${swiper.virtualSize + params.spaceBetween}px`, + }); + } + + if (params.setWrapperSize) { + $wrapperEl.css({ + [getDirectionLabel("width")]: `${ + swiper.virtualSize + params.spaceBetween + }px`, + }); + } + + if (gridEnabled) { + swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel); + } // Remove last grid elements depending on width + + if (!params.centeredSlides) { + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem); + + if (snapGrid[i] <= swiper.virtualSize - swiperSize) { + newSlidesGrid.push(slidesGridItem); + } + } + + snapGrid = newSlidesGrid; + + if ( + Math.floor(swiper.virtualSize - swiperSize) - + Math.floor(snapGrid[snapGrid.length - 1]) > + 1 + ) { + snapGrid.push(swiper.virtualSize - swiperSize); + } + } + + if (snapGrid.length === 0) snapGrid = [0]; + + if (params.spaceBetween !== 0) { + const key = + swiper.isHorizontal() && rtl + ? "marginLeft" + : getDirectionLabel("marginRight"); + slides + .filter((_, slideIndex) => { + if (!params.cssMode) return true; + + if (slideIndex === slides.length - 1) { + return false; + } + + return true; + }) + .css({ + [key]: `${spaceBetween}px`, + }); + } + + if (params.centeredSlides && params.centeredSlidesBounds) { + let allSlidesSize = 0; + slidesSizesGrid.forEach((slideSizeValue) => { + allSlidesSize += + slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + const maxSnap = allSlidesSize - swiperSize; + snapGrid = snapGrid.map((snap) => { + if (snap < 0) return -offsetBefore; + if (snap > maxSnap) return maxSnap + offsetAfter; + return snap; + }); + } + + if (params.centerInsufficientSlides) { + let allSlidesSize = 0; + slidesSizesGrid.forEach((slideSizeValue) => { + allSlidesSize += + slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0); + }); + allSlidesSize -= params.spaceBetween; + + if (allSlidesSize < swiperSize) { + const allSlidesOffset = (swiperSize - allSlidesSize) / 2; + snapGrid.forEach((snap, snapIndex) => { + snapGrid[snapIndex] = snap - allSlidesOffset; + }); + slidesGrid.forEach((snap, snapIndex) => { + slidesGrid[snapIndex] = snap + allSlidesOffset; + }); + } + } + + Object.assign(swiper, { + slides, + snapGrid, + slidesGrid, + slidesSizesGrid, + }); + + if ( + params.centeredSlides && + params.cssMode && + !params.centeredSlidesBounds + ) { + setCSSProperty( + swiper.wrapperEl, + "--swiper-centered-offset-before", + `${-snapGrid[0]}px`, + ); + setCSSProperty( + swiper.wrapperEl, + "--swiper-centered-offset-after", + `${ + swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2 + }px`, + ); + const addToSnapGrid = -swiper.snapGrid[0]; + const addToSlidesGrid = -swiper.slidesGrid[0]; + swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid); + swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid); + } + + if (slidesLength !== previousSlidesLength) { + swiper.emit("slidesLengthChange"); + } + + if (snapGrid.length !== previousSnapGridLength) { + if (swiper.params.watchOverflow) swiper.checkOverflow(); + swiper.emit("snapGridLengthChange"); + } + + if (slidesGrid.length !== previousSlidesGridLength) { + swiper.emit("slidesGridLengthChange"); + } + + if (params.watchSlidesProgress) { + swiper.updateSlidesOffset(); + } + + if ( + !isVirtual && + !params.cssMode && + (params.effect === "slide" || params.effect === "fade") + ) { + const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`; + const hasClassBackfaceClassAdded = + swiper.$el.hasClass(backFaceHiddenClass); + + if (slidesLength <= params.maxBackfaceHiddenSlides) { + if (!hasClassBackfaceClassAdded) + swiper.$el.addClass(backFaceHiddenClass); + } else if (hasClassBackfaceClassAdded) { + swiper.$el.removeClass(backFaceHiddenClass); + } + } + } + + function updateAutoHeight(speed) { + const swiper = this; + const activeSlides = []; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let newHeight = 0; + let i; + + if (typeof speed === "number") { + swiper.setTransition(speed); + } else if (speed === true) { + swiper.setTransition(swiper.params.speed); + } + + const getSlideByIndex = (index) => { + if (isVirtual) { + return swiper.slides.filter( + (el) => + parseInt(el.getAttribute("data-swiper-slide-index"), 10) === index, + )[0]; + } + + return swiper.slides.eq(index)[0]; + }; // Find slides currently in view + + if ( + swiper.params.slidesPerView !== "auto" && + swiper.params.slidesPerView > 1 + ) { + if (swiper.params.centeredSlides) { + swiper.visibleSlides.each((slide) => { + activeSlides.push(slide); + }); + } else { + for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) { + const index = swiper.activeIndex + i; + if (index > swiper.slides.length && !isVirtual) break; + activeSlides.push(getSlideByIndex(index)); + } + } + } else { + activeSlides.push(getSlideByIndex(swiper.activeIndex)); + } // Find new height from highest slide in view + + for (i = 0; i < activeSlides.length; i += 1) { + if (typeof activeSlides[i] !== "undefined") { + const height = activeSlides[i].offsetHeight; + newHeight = height > newHeight ? height : newHeight; + } + } // Update Height + + if (newHeight || newHeight === 0) + swiper.$wrapperEl.css("height", `${newHeight}px`); + } + + function updateSlidesOffset() { + const swiper = this; + const slides = swiper.slides; + + for (let i = 0; i < slides.length; i += 1) { + slides[i].swiperSlideOffset = swiper.isHorizontal() + ? slides[i].offsetLeft + : slides[i].offsetTop; + } + } + + function updateSlidesProgress(translate) { + if (translate === void 0) { + translate = (this && this.translate) || 0; + } + + const swiper = this; + const params = swiper.params; + const { slides, rtlTranslate: rtl, snapGrid } = swiper; + if (slides.length === 0) return; + if (typeof slides[0].swiperSlideOffset === "undefined") + swiper.updateSlidesOffset(); + let offsetCenter = -translate; + if (rtl) offsetCenter = translate; // Visible Slides + + slides.removeClass(params.slideVisibleClass); + swiper.visibleSlidesIndexes = []; + swiper.visibleSlides = []; + + for (let i = 0; i < slides.length; i += 1) { + const slide = slides[i]; + let slideOffset = slide.swiperSlideOffset; + + if (params.cssMode && params.centeredSlides) { + slideOffset -= slides[0].swiperSlideOffset; + } + + const slideProgress = + (offsetCenter + + (params.centeredSlides ? swiper.minTranslate() : 0) - + slideOffset) / + (slide.swiperSlideSize + params.spaceBetween); + const originalSlideProgress = + (offsetCenter - + snapGrid[0] + + (params.centeredSlides ? swiper.minTranslate() : 0) - + slideOffset) / + (slide.swiperSlideSize + params.spaceBetween); + const slideBefore = -(offsetCenter - slideOffset); + const slideAfter = slideBefore + swiper.slidesSizesGrid[i]; + const isVisible = + (slideBefore >= 0 && slideBefore < swiper.size - 1) || + (slideAfter > 1 && slideAfter <= swiper.size) || + (slideBefore <= 0 && slideAfter >= swiper.size); + + if (isVisible) { + swiper.visibleSlides.push(slide); + swiper.visibleSlidesIndexes.push(i); + slides.eq(i).addClass(params.slideVisibleClass); + } + + slide.progress = rtl ? -slideProgress : slideProgress; + slide.originalProgress = rtl + ? -originalSlideProgress + : originalSlideProgress; + } + + swiper.visibleSlides = $(swiper.visibleSlides); + } + + function updateProgress(translate) { + const swiper = this; + + if (typeof translate === "undefined") { + const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line + + translate = + (swiper && swiper.translate && swiper.translate * multiplier) || 0; + } + + const params = swiper.params; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + let { progress, isBeginning, isEnd } = swiper; + const wasBeginning = isBeginning; + const wasEnd = isEnd; + + if (translatesDiff === 0) { + progress = 0; + isBeginning = true; + isEnd = true; + } else { + progress = (translate - swiper.minTranslate()) / translatesDiff; + isBeginning = progress <= 0; + isEnd = progress >= 1; + } + + Object.assign(swiper, { + progress, + isBeginning, + isEnd, + }); + if ( + params.watchSlidesProgress || + (params.centeredSlides && params.autoHeight) + ) + swiper.updateSlidesProgress(translate); + + if (isBeginning && !wasBeginning) { + swiper.emit("reachBeginning toEdge"); + } + + if (isEnd && !wasEnd) { + swiper.emit("reachEnd toEdge"); + } + + if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) { + swiper.emit("fromEdge"); + } + + swiper.emit("progress", progress); + } + + function updateSlidesClasses() { + const swiper = this; + const { slides, params, $wrapperEl, activeIndex, realIndex } = swiper; + const isVirtual = swiper.virtual && params.virtual.enabled; + slides.removeClass( + `${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`, + ); + let activeSlide; + + if (isVirtual) { + activeSlide = swiper.$wrapperEl.find( + `.${params.slideClass}[data-swiper-slide-index="${activeIndex}"]`, + ); + } else { + activeSlide = slides.eq(activeIndex); + } // Active classes + + activeSlide.addClass(params.slideActiveClass); + + if (params.loop) { + // Duplicate to all looped slides + if (activeSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children( + `.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index="${realIndex}"]`, + ) + .addClass(params.slideDuplicateActiveClass); + } else { + $wrapperEl + .children( + `.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index="${realIndex}"]`, + ) + .addClass(params.slideDuplicateActiveClass); + } + } // Next Slide + + let nextSlide = activeSlide + .nextAll(`.${params.slideClass}`) + .eq(0) + .addClass(params.slideNextClass); + + if (params.loop && nextSlide.length === 0) { + nextSlide = slides.eq(0); + nextSlide.addClass(params.slideNextClass); + } // Prev Slide + + let prevSlide = activeSlide + .prevAll(`.${params.slideClass}`) + .eq(0) + .addClass(params.slidePrevClass); + + if (params.loop && prevSlide.length === 0) { + prevSlide = slides.eq(-1); + prevSlide.addClass(params.slidePrevClass); + } + + if (params.loop) { + // Duplicate to all looped slides + if (nextSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children( + `.${params.slideClass}:not(.${ + params.slideDuplicateClass + })[data-swiper-slide-index="${nextSlide.attr( + "data-swiper-slide-index", + )}"]`, + ) + .addClass(params.slideDuplicateNextClass); + } else { + $wrapperEl + .children( + `.${params.slideClass}.${ + params.slideDuplicateClass + }[data-swiper-slide-index="${nextSlide.attr( + "data-swiper-slide-index", + )}"]`, + ) + .addClass(params.slideDuplicateNextClass); + } + + if (prevSlide.hasClass(params.slideDuplicateClass)) { + $wrapperEl + .children( + `.${params.slideClass}:not(.${ + params.slideDuplicateClass + })[data-swiper-slide-index="${prevSlide.attr( + "data-swiper-slide-index", + )}"]`, + ) + .addClass(params.slideDuplicatePrevClass); + } else { + $wrapperEl + .children( + `.${params.slideClass}.${ + params.slideDuplicateClass + }[data-swiper-slide-index="${prevSlide.attr( + "data-swiper-slide-index", + )}"]`, + ) + .addClass(params.slideDuplicatePrevClass); + } + } + + swiper.emitSlidesClasses(); + } + + function updateActiveIndex(newActiveIndex) { + const swiper = this; + const translate = swiper.rtlTranslate + ? swiper.translate + : -swiper.translate; + const { + slidesGrid, + snapGrid, + params, + activeIndex: previousIndex, + realIndex: previousRealIndex, + snapIndex: previousSnapIndex, + } = swiper; + let activeIndex = newActiveIndex; + let snapIndex; + + if (typeof activeIndex === "undefined") { + for (let i = 0; i < slidesGrid.length; i += 1) { + if (typeof slidesGrid[i + 1] !== "undefined") { + if ( + translate >= slidesGrid[i] && + translate < + slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2 + ) { + activeIndex = i; + } else if ( + translate >= slidesGrid[i] && + translate < slidesGrid[i + 1] + ) { + activeIndex = i + 1; + } + } else if (translate >= slidesGrid[i]) { + activeIndex = i; + } + } // Normalize slideIndex + + if (params.normalizeSlideIndex) { + if (activeIndex < 0 || typeof activeIndex === "undefined") + activeIndex = 0; + } + } + + if (snapGrid.indexOf(translate) >= 0) { + snapIndex = snapGrid.indexOf(translate); + } else { + const skip = Math.min(params.slidesPerGroupSkip, activeIndex); + snapIndex = + skip + Math.floor((activeIndex - skip) / params.slidesPerGroup); + } + + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if (activeIndex === previousIndex) { + if (snapIndex !== previousSnapIndex) { + swiper.snapIndex = snapIndex; + swiper.emit("snapIndexChange"); + } + + return; + } // Get real index + + const realIndex = parseInt( + swiper.slides.eq(activeIndex).attr("data-swiper-slide-index") || + activeIndex, + 10, + ); + Object.assign(swiper, { + snapIndex, + realIndex, + previousIndex, + activeIndex, + }); + swiper.emit("activeIndexChange"); + swiper.emit("snapIndexChange"); + + if (previousRealIndex !== realIndex) { + swiper.emit("realIndexChange"); + } + + if (swiper.initialized || swiper.params.runCallbacksOnInit) { + swiper.emit("slideChange"); + } + } + + function updateClickedSlide(e) { + const swiper = this; + const params = swiper.params; + const slide = $(e).closest(`.${params.slideClass}`)[0]; + let slideFound = false; + let slideIndex; + + if (slide) { + for (let i = 0; i < swiper.slides.length; i += 1) { + if (swiper.slides[i] === slide) { + slideFound = true; + slideIndex = i; + break; + } + } + } + + if (slide && slideFound) { + swiper.clickedSlide = slide; + + if (swiper.virtual && swiper.params.virtual.enabled) { + swiper.clickedIndex = parseInt( + $(slide).attr("data-swiper-slide-index"), + 10, + ); + } else { + swiper.clickedIndex = slideIndex; + } + } else { + swiper.clickedSlide = undefined; + swiper.clickedIndex = undefined; + return; + } + + if ( + params.slideToClickedSlide && + swiper.clickedIndex !== undefined && + swiper.clickedIndex !== swiper.activeIndex + ) { + swiper.slideToClickedSlide(); + } + } + + var update = { + updateSize, + updateSlides, + updateAutoHeight, + updateSlidesOffset, + updateSlidesProgress, + updateProgress, + updateSlidesClasses, + updateActiveIndex, + updateClickedSlide, + }; + + function getSwiperTranslate(axis) { + if (axis === void 0) { + axis = this.isHorizontal() ? "x" : "y"; + } + + const swiper = this; + const { params, rtlTranslate: rtl, translate, $wrapperEl } = swiper; + + if (params.virtualTranslate) { + return rtl ? -translate : translate; + } + + if (params.cssMode) { + return translate; + } + + let currentTranslate = getTranslate($wrapperEl[0], axis); + if (rtl) currentTranslate = -currentTranslate; + return currentTranslate || 0; + } + + function setTranslate(translate, byController) { + const swiper = this; + const { + rtlTranslate: rtl, + params, + $wrapperEl, + wrapperEl, + progress, + } = swiper; + let x = 0; + let y = 0; + const z = 0; + + if (swiper.isHorizontal()) { + x = rtl ? -translate : translate; + } else { + y = translate; + } + + if (params.roundLengths) { + x = Math.floor(x); + y = Math.floor(y); + } + + if (params.cssMode) { + wrapperEl[swiper.isHorizontal() ? "scrollLeft" : "scrollTop"] = + swiper.isHorizontal() ? -x : -y; + } else if (!params.virtualTranslate) { + $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`); + } + + swiper.previousTranslate = swiper.translate; + swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress + + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== progress) { + swiper.updateProgress(translate); + } + + swiper.emit("setTranslate", swiper.translate, byController); + } + + function minTranslate() { + return -this.snapGrid[0]; + } + + function maxTranslate() { + return -this.snapGrid[this.snapGrid.length - 1]; + } + + function translateTo( + translate, + speed, + runCallbacks, + translateBounds, + internal, + ) { + if (translate === void 0) { + translate = 0; + } + + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + if (translateBounds === void 0) { + translateBounds = true; + } + + const swiper = this; + const { params, wrapperEl } = swiper; + + if (swiper.animating && params.preventInteractionOnTransition) { + return false; + } + + const minTranslate = swiper.minTranslate(); + const maxTranslate = swiper.maxTranslate(); + let newTranslate; + if (translateBounds && translate > minTranslate) + newTranslate = minTranslate; + else if (translateBounds && translate < maxTranslate) + newTranslate = maxTranslate; + else newTranslate = translate; // Update progress + + swiper.updateProgress(newTranslate); + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + + if (speed === 0) { + wrapperEl[isH ? "scrollLeft" : "scrollTop"] = -newTranslate; + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: -newTranslate, + side: isH ? "left" : "top", + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? "left" : "top"]: -newTranslate, + behavior: "smooth", + }); + } + + return true; + } + + if (speed === 0) { + swiper.setTransition(0); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit("beforeTransitionStart", speed, internal); + swiper.emit("transitionEnd"); + } + } else { + swiper.setTransition(speed); + swiper.setTranslate(newTranslate); + + if (runCallbacks) { + swiper.emit("beforeTransitionStart", speed, internal); + swiper.emit("transitionStart"); + } + + if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onTranslateToWrapperTransitionEnd) { + swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener( + "transitionend", + swiper.onTranslateToWrapperTransitionEnd, + ); + swiper.$wrapperEl[0].removeEventListener( + "webkitTransitionEnd", + swiper.onTranslateToWrapperTransitionEnd, + ); + swiper.onTranslateToWrapperTransitionEnd = null; + delete swiper.onTranslateToWrapperTransitionEnd; + + if (runCallbacks) { + swiper.emit("transitionEnd"); + } + }; + } + + swiper.$wrapperEl[0].addEventListener( + "transitionend", + swiper.onTranslateToWrapperTransitionEnd, + ); + swiper.$wrapperEl[0].addEventListener( + "webkitTransitionEnd", + swiper.onTranslateToWrapperTransitionEnd, + ); + } + } + + return true; + } + + var translate = { + getTranslate: getSwiperTranslate, + setTranslate, + minTranslate, + maxTranslate, + translateTo, + }; + + function setTransition(duration, byController) { + const swiper = this; + + if (!swiper.params.cssMode) { + swiper.$wrapperEl.transition(duration); + } + + swiper.emit("setTransition", duration, byController); + } + + function transitionEmit(_ref) { + let { swiper, runCallbacks, direction, step } = _ref; + const { activeIndex, previousIndex } = swiper; + let dir = direction; + + if (!dir) { + if (activeIndex > previousIndex) dir = "next"; + else if (activeIndex < previousIndex) dir = "prev"; + else dir = "reset"; + } + + swiper.emit(`transition${step}`); + + if (runCallbacks && activeIndex !== previousIndex) { + if (dir === "reset") { + swiper.emit(`slideResetTransition${step}`); + return; + } + + swiper.emit(`slideChangeTransition${step}`); + + if (dir === "next") { + swiper.emit(`slideNextTransition${step}`); + } else { + swiper.emit(`slidePrevTransition${step}`); + } + } + } + + function transitionStart(runCallbacks, direction) { + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + const { params } = swiper; + if (params.cssMode) return; + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + transitionEmit({ + swiper, + runCallbacks, + direction, + step: "Start", + }); + } + + function transitionEnd(runCallbacks, direction) { + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + const { params } = swiper; + swiper.animating = false; + if (params.cssMode) return; + swiper.setTransition(0); + transitionEmit({ + swiper, + runCallbacks, + direction, + step: "End", + }); + } + + var transition = { + setTransition, + transitionStart, + transitionEnd, + }; + + function slideTo(index, speed, runCallbacks, internal, initial) { + if (index === void 0) { + index = 0; + } + + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + if (typeof index !== "number" && typeof index !== "string") { + throw new Error( + `The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`, + ); + } + + if (typeof index === "string") { + /** + * The `index` argument converted from `string` to `number`. + * @type {number} + */ + const indexAsNumber = parseInt(index, 10); + /** + * Determines whether the `index` argument is a valid `number` + * after being converted from the `string` type. + * @type {boolean} + */ + + const isValidNumber = isFinite(indexAsNumber); + + if (!isValidNumber) { + throw new Error( + `The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`, + ); + } // Knowing that the converted `index` is a valid number, + // we can update the original argument's value. + + index = indexAsNumber; + } + + const swiper = this; + let slideIndex = index; + if (slideIndex < 0) slideIndex = 0; + const { + params, + snapGrid, + slidesGrid, + previousIndex, + activeIndex, + rtlTranslate: rtl, + wrapperEl, + enabled, + } = swiper; + + if ( + (swiper.animating && params.preventInteractionOnTransition) || + (!enabled && !internal && !initial) + ) { + return false; + } + + const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex); + let snapIndex = + skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup); + if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1; + + if ( + (activeIndex || params.initialSlide || 0) === (previousIndex || 0) && + runCallbacks + ) { + swiper.emit("beforeSlideChangeStart"); + } + + const translate = -snapGrid[snapIndex]; // Update progress + + swiper.updateProgress(translate); // Normalize slideIndex + + if (params.normalizeSlideIndex) { + for (let i = 0; i < slidesGrid.length; i += 1) { + const normalizedTranslate = -Math.floor(translate * 100); + const normalizedGrid = Math.floor(slidesGrid[i] * 100); + const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100); + + if (typeof slidesGrid[i + 1] !== "undefined") { + if ( + normalizedTranslate >= normalizedGrid && + normalizedTranslate < + normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2 + ) { + slideIndex = i; + } else if ( + normalizedTranslate >= normalizedGrid && + normalizedTranslate < normalizedGridNext + ) { + slideIndex = i + 1; + } + } else if (normalizedTranslate >= normalizedGrid) { + slideIndex = i; + } + } + } // Directions locks + + if (swiper.initialized && slideIndex !== activeIndex) { + if ( + !swiper.allowSlideNext && + translate < swiper.translate && + translate < swiper.minTranslate() + ) { + return false; + } + + if ( + !swiper.allowSlidePrev && + translate > swiper.translate && + translate > swiper.maxTranslate() + ) { + if ((activeIndex || 0) !== slideIndex) return false; + } + } + + let direction; + if (slideIndex > activeIndex) direction = "next"; + else if (slideIndex < activeIndex) direction = "prev"; + else direction = "reset"; // Update Index + + if ( + (rtl && -translate === swiper.translate) || + (!rtl && translate === swiper.translate) + ) { + swiper.updateActiveIndex(slideIndex); // Update Height + + if (params.autoHeight) { + swiper.updateAutoHeight(); + } + + swiper.updateSlidesClasses(); + + if (params.effect !== "slide") { + swiper.setTranslate(translate); + } + + if (direction !== "reset") { + swiper.transitionStart(runCallbacks, direction); + swiper.transitionEnd(runCallbacks, direction); + } + + return false; + } + + if (params.cssMode) { + const isH = swiper.isHorizontal(); + const t = rtl ? translate : -translate; + + if (speed === 0) { + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + + if (isVirtual) { + swiper.wrapperEl.style.scrollSnapType = "none"; + swiper._immediateVirtual = true; + } + + wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t; + + if (isVirtual) { + requestAnimationFrame(() => { + swiper.wrapperEl.style.scrollSnapType = ""; + swiper._swiperImmediateVirtual = false; + }); + } + } else { + if (!swiper.support.smoothScroll) { + animateCSSModeScroll({ + swiper, + targetPosition: t, + side: isH ? "left" : "top", + }); + return true; + } + + wrapperEl.scrollTo({ + [isH ? "left" : "top"]: t, + behavior: "smooth", + }); + } + + return true; + } + + swiper.setTransition(speed); + swiper.setTranslate(translate); + swiper.updateActiveIndex(slideIndex); + swiper.updateSlidesClasses(); + swiper.emit("beforeTransitionStart", speed, internal); + swiper.transitionStart(runCallbacks, direction); + + if (speed === 0) { + swiper.transitionEnd(runCallbacks, direction); + } else if (!swiper.animating) { + swiper.animating = true; + + if (!swiper.onSlideToWrapperTransitionEnd) { + swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) { + if (!swiper || swiper.destroyed) return; + if (e.target !== this) return; + swiper.$wrapperEl[0].removeEventListener( + "transitionend", + swiper.onSlideToWrapperTransitionEnd, + ); + swiper.$wrapperEl[0].removeEventListener( + "webkitTransitionEnd", + swiper.onSlideToWrapperTransitionEnd, + ); + swiper.onSlideToWrapperTransitionEnd = null; + delete swiper.onSlideToWrapperTransitionEnd; + swiper.transitionEnd(runCallbacks, direction); + }; + } + + swiper.$wrapperEl[0].addEventListener( + "transitionend", + swiper.onSlideToWrapperTransitionEnd, + ); + swiper.$wrapperEl[0].addEventListener( + "webkitTransitionEnd", + swiper.onSlideToWrapperTransitionEnd, + ); + } + + return true; + } + + function slideToLoop(index, speed, runCallbacks, internal) { + if (index === void 0) { + index = 0; + } + + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + let newIndex = index; + + if (swiper.params.loop) { + newIndex += swiper.loopedSlides; + } + + return swiper.slideTo(newIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideNext(speed, runCallbacks, internal) { + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + const { animating, enabled, params } = swiper; + if (!enabled) return swiper; + let perGroup = params.slidesPerGroup; + + if ( + params.slidesPerView === "auto" && + params.slidesPerGroup === 1 && + params.slidesPerGroupAuto + ) { + perGroup = Math.max(swiper.slidesPerViewDynamic("current", true), 1); + } + + const increment = + swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + if (params.rewind && swiper.isEnd) { + return swiper.slideTo(0, speed, runCallbacks, internal); + } + + return swiper.slideTo( + swiper.activeIndex + increment, + speed, + runCallbacks, + internal, + ); + } + + /* eslint no-unused-vars: "off" */ + function slidePrev(speed, runCallbacks, internal) { + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + const { params, animating, snapGrid, slidesGrid, rtlTranslate, enabled } = + swiper; + if (!enabled) return swiper; + + if (params.loop) { + if (animating && params.loopPreventsSlide) return false; + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + } + + const translate = rtlTranslate ? swiper.translate : -swiper.translate; + + function normalize(val) { + if (val < 0) return -Math.floor(Math.abs(val)); + return Math.floor(val); + } + + const normalizedTranslate = normalize(translate); + const normalizedSnapGrid = snapGrid.map((val) => normalize(val)); + let prevSnap = + snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1]; + + if (typeof prevSnap === "undefined" && params.cssMode) { + let prevSnapIndex; + snapGrid.forEach((snap, snapIndex) => { + if (normalizedTranslate >= snap) { + // prevSnap = snap; + prevSnapIndex = snapIndex; + } + }); + + if (typeof prevSnapIndex !== "undefined") { + prevSnap = + snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex]; + } + } + + let prevIndex = 0; + + if (typeof prevSnap !== "undefined") { + prevIndex = slidesGrid.indexOf(prevSnap); + if (prevIndex < 0) prevIndex = swiper.activeIndex - 1; + + if ( + params.slidesPerView === "auto" && + params.slidesPerGroup === 1 && + params.slidesPerGroupAuto + ) { + prevIndex = + prevIndex - swiper.slidesPerViewDynamic("previous", true) + 1; + prevIndex = Math.max(prevIndex, 0); + } + } + + if (params.rewind && swiper.isBeginning) { + const lastIndex = + swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual + ? swiper.virtual.slides.length - 1 + : swiper.slides.length - 1; + return swiper.slideTo(lastIndex, speed, runCallbacks, internal); + } + + return swiper.slideTo(prevIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideReset(speed, runCallbacks, internal) { + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + const swiper = this; + return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal); + } + + /* eslint no-unused-vars: "off" */ + function slideToClosest(speed, runCallbacks, internal, threshold) { + if (speed === void 0) { + speed = this.params.speed; + } + + if (runCallbacks === void 0) { + runCallbacks = true; + } + + if (threshold === void 0) { + threshold = 0.5; + } + + const swiper = this; + let index = swiper.activeIndex; + const skip = Math.min(swiper.params.slidesPerGroupSkip, index); + const snapIndex = + skip + Math.floor((index - skip) / swiper.params.slidesPerGroup); + const translate = swiper.rtlTranslate + ? swiper.translate + : -swiper.translate; + + if (translate >= swiper.snapGrid[snapIndex]) { + // The current translate is on or after the current snap index, so the choice + // is between the current index and the one after it. + const currentSnap = swiper.snapGrid[snapIndex]; + const nextSnap = swiper.snapGrid[snapIndex + 1]; + + if (translate - currentSnap > (nextSnap - currentSnap) * threshold) { + index += swiper.params.slidesPerGroup; + } + } else { + // The current translate is before the current snap index, so the choice + // is between the current index and the one before it. + const prevSnap = swiper.snapGrid[snapIndex - 1]; + const currentSnap = swiper.snapGrid[snapIndex]; + + if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) { + index -= swiper.params.slidesPerGroup; + } + } + + index = Math.max(index, 0); + index = Math.min(index, swiper.slidesGrid.length - 1); + return swiper.slideTo(index, speed, runCallbacks, internal); + } + + function slideToClickedSlide() { + const swiper = this; + const { params, $wrapperEl } = swiper; + const slidesPerView = + params.slidesPerView === "auto" + ? swiper.slidesPerViewDynamic() + : params.slidesPerView; + let slideToIndex = swiper.clickedIndex; + let realIndex; + + if (params.loop) { + if (swiper.animating) return; + realIndex = parseInt( + $(swiper.clickedSlide).attr("data-swiper-slide-index"), + 10, + ); + + if (params.centeredSlides) { + if ( + slideToIndex < swiper.loopedSlides - slidesPerView / 2 || + slideToIndex > + swiper.slides.length - swiper.loopedSlides + slidesPerView / 2 + ) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children( + `.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`, + ) + .eq(0) + .index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else if (slideToIndex > swiper.slides.length - slidesPerView) { + swiper.loopFix(); + slideToIndex = $wrapperEl + .children( + `.${params.slideClass}[data-swiper-slide-index="${realIndex}"]:not(.${params.slideDuplicateClass})`, + ) + .eq(0) + .index(); + nextTick(() => { + swiper.slideTo(slideToIndex); + }); + } else { + swiper.slideTo(slideToIndex); + } + } else { + swiper.slideTo(slideToIndex); + } + } + + var slide = { + slideTo, + slideToLoop, + slideNext, + slidePrev, + slideReset, + slideToClosest, + slideToClickedSlide, + }; + + function loopCreate() { + const swiper = this; + const document = getDocument(); + const { params, $wrapperEl } = swiper; // Remove duplicated slides + + const $selector = + $wrapperEl.children().length > 0 + ? $($wrapperEl.children()[0].parentNode) + : $wrapperEl; + $selector + .children(`.${params.slideClass}.${params.slideDuplicateClass}`) + .remove(); + let slides = $selector.children(`.${params.slideClass}`); + + if (params.loopFillGroupWithBlank) { + const blankSlidesNum = + params.slidesPerGroup - (slides.length % params.slidesPerGroup); + + if (blankSlidesNum !== params.slidesPerGroup) { + for (let i = 0; i < blankSlidesNum; i += 1) { + const blankNode = $(document.createElement("div")).addClass( + `${params.slideClass} ${params.slideBlankClass}`, + ); + $selector.append(blankNode); + } + + slides = $selector.children(`.${params.slideClass}`); + } + } + + if (params.slidesPerView === "auto" && !params.loopedSlides) + params.loopedSlides = slides.length; + swiper.loopedSlides = Math.ceil( + parseFloat(params.loopedSlides || params.slidesPerView, 10), + ); + swiper.loopedSlides += params.loopAdditionalSlides; + + if (swiper.loopedSlides > slides.length) { + swiper.loopedSlides = slides.length; + } + + const prependSlides = []; + const appendSlides = []; + slides.each((el, index) => { + const slide = $(el); + + if (index < swiper.loopedSlides) { + appendSlides.push(el); + } + + if ( + index < slides.length && + index >= slides.length - swiper.loopedSlides + ) { + prependSlides.push(el); + } + + slide.attr("data-swiper-slide-index", index); + }); + + for (let i = 0; i < appendSlides.length; i += 1) { + $selector.append( + $(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass), + ); + } + + for (let i = prependSlides.length - 1; i >= 0; i -= 1) { + $selector.prepend( + $(prependSlides[i].cloneNode(true)).addClass( + params.slideDuplicateClass, + ), + ); + } + } + + function loopFix() { + const swiper = this; + swiper.emit("beforeLoopFix"); + const { + activeIndex, + slides, + loopedSlides, + allowSlidePrev, + allowSlideNext, + snapGrid, + rtlTranslate: rtl, + } = swiper; + let newIndex; + swiper.allowSlidePrev = true; + swiper.allowSlideNext = true; + const snapTranslate = -snapGrid[activeIndex]; + const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding + + if (activeIndex < loopedSlides) { + newIndex = slides.length - loopedSlides * 3 + activeIndex; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate( + (rtl ? -swiper.translate : swiper.translate) - diff, + ); + } + } else if (activeIndex >= slides.length - loopedSlides) { + // Fix For Positive Oversliding + newIndex = -slides.length + activeIndex + loopedSlides; + newIndex += loopedSlides; + const slideChanged = swiper.slideTo(newIndex, 0, false, true); + + if (slideChanged && diff !== 0) { + swiper.setTranslate( + (rtl ? -swiper.translate : swiper.translate) - diff, + ); + } + } + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + swiper.emit("loopFix"); + } + + function loopDestroy() { + const swiper = this; + const { $wrapperEl, params, slides } = swiper; + $wrapperEl + .children( + `.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`, + ) + .remove(); + slides.removeAttr("data-swiper-slide-index"); + } + + var loop = { + loopCreate, + loopFix, + loopDestroy, + }; + + function setGrabCursor(moving) { + const swiper = this; + if ( + swiper.support.touch || + !swiper.params.simulateTouch || + (swiper.params.watchOverflow && swiper.isLocked) || + swiper.params.cssMode + ) + return; + const el = + swiper.params.touchEventsTarget === "container" + ? swiper.el + : swiper.wrapperEl; + el.style.cursor = "move"; + el.style.cursor = moving ? "-webkit-grabbing" : "-webkit-grab"; + el.style.cursor = moving ? "-moz-grabbin" : "-moz-grab"; + el.style.cursor = moving ? "grabbing" : "grab"; + } + + function unsetGrabCursor() { + const swiper = this; + + if ( + swiper.support.touch || + (swiper.params.watchOverflow && swiper.isLocked) || + swiper.params.cssMode + ) { + return; + } + + swiper[ + swiper.params.touchEventsTarget === "container" ? "el" : "wrapperEl" + ].style.cursor = ""; + } + + var grabCursor = { + setGrabCursor, + unsetGrabCursor, + }; + + function closestElement(selector, base) { + if (base === void 0) { + base = this; + } + + function __closestFrom(el) { + if (!el || el === getDocument() || el === getWindow()) return null; + if (el.assignedSlot) el = el.assignedSlot; + const found = el.closest(selector); + return found || __closestFrom(el.getRootNode().host); + } + + return __closestFrom(base); + } + + function onTouchStart(event) { + const swiper = this; + const document = getDocument(); + const window = getWindow(); + const data = swiper.touchEventsData; + const { params, touches, enabled } = swiper; + if (!enabled) return; + + if (swiper.animating && params.preventInteractionOnTransition) { + return; + } + + if (!swiper.animating && params.cssMode && params.loop) { + swiper.loopFix(); + } + + let e = event; + if (e.originalEvent) e = e.originalEvent; + let $targetEl = $(e.target); + + if (params.touchEventsTarget === "wrapper") { + if (!$targetEl.closest(swiper.wrapperEl).length) return; + } + + data.isTouchEvent = e.type === "touchstart"; + if (!data.isTouchEvent && "which" in e && e.which === 3) return; + if (!data.isTouchEvent && "button" in e && e.button > 0) return; + if (data.isTouched && data.isMoved) return; // change target el for shadow root component + + const swipingClassHasValue = + !!params.noSwipingClass && params.noSwipingClass !== ""; + + if ( + swipingClassHasValue && + e.target && + e.target.shadowRoot && + event.path && + event.path[0] + ) { + $targetEl = $(event.path[0]); + } + + const noSwipingSelector = params.noSwipingSelector + ? params.noSwipingSelector + : `.${params.noSwipingClass}`; + const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element + + if ( + params.noSwiping && + (isTargetShadow + ? closestElement(noSwipingSelector, e.target) + : $targetEl.closest(noSwipingSelector)[0]) + ) { + swiper.allowClick = true; + return; + } + + if (params.swipeHandler) { + if (!$targetEl.closest(params.swipeHandler)[0]) return; + } + + touches.currentX = + e.type === "touchstart" ? e.targetTouches[0].pageX : e.pageX; + touches.currentY = + e.type === "touchstart" ? e.targetTouches[0].pageY : e.pageY; + const startX = touches.currentX; + const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore + + const edgeSwipeDetection = + params.edgeSwipeDetection || params.iOSEdgeSwipeDetection; + const edgeSwipeThreshold = + params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold; + + if ( + edgeSwipeDetection && + (startX <= edgeSwipeThreshold || + startX >= window.innerWidth - edgeSwipeThreshold) + ) { + if (edgeSwipeDetection === "prevent") { + event.preventDefault(); + } else { + return; + } + } + + Object.assign(data, { + isTouched: true, + isMoved: false, + allowTouchCallbacks: true, + isScrolling: undefined, + startMoving: undefined, + }); + touches.startX = startX; + touches.startY = startY; + data.touchStartTime = now(); + swiper.allowClick = true; + swiper.updateSize(); + swiper.swipeDirection = undefined; + if (params.threshold > 0) data.allowThresholdMove = false; + + if (e.type !== "touchstart") { + let preventDefault = true; + + if ($targetEl.is(data.focusableElements)) { + preventDefault = false; + + if ($targetEl[0].nodeName === "SELECT") { + data.isTouched = false; + } + } + + if ( + document.activeElement && + $(document.activeElement).is(data.focusableElements) && + document.activeElement !== $targetEl[0] + ) { + document.activeElement.blur(); + } + + const shouldPreventDefault = + preventDefault && + swiper.allowTouchMove && + params.touchStartPreventDefault; + + if ( + (params.touchStartForcePreventDefault || shouldPreventDefault) && + !$targetEl[0].isContentEditable + ) { + e.preventDefault(); + } + } + + if ( + swiper.params.freeMode && + swiper.params.freeMode.enabled && + swiper.freeMode && + swiper.animating && + !params.cssMode + ) { + swiper.freeMode.onTouchStart(); + } + + swiper.emit("touchStart", e); + } + + function onTouchMove(event) { + const document = getDocument(); + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches, rtlTranslate: rtl, enabled } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (!data.isTouched) { + if (data.startMoving && data.isScrolling) { + swiper.emit("touchMoveOpposite", e); + } + + return; + } + + if (data.isTouchEvent && e.type !== "touchmove") return; + const targetTouch = + e.type === "touchmove" && + e.targetTouches && + (e.targetTouches[0] || e.changedTouches[0]); + const pageX = e.type === "touchmove" ? targetTouch.pageX : e.pageX; + const pageY = e.type === "touchmove" ? targetTouch.pageY : e.pageY; + + if (e.preventedByNestedSwiper) { + touches.startX = pageX; + touches.startY = pageY; + return; + } + + if (!swiper.allowTouchMove) { + if (!$(e.target).is(data.focusableElements)) { + swiper.allowClick = false; + } + + if (data.isTouched) { + Object.assign(touches, { + startX: pageX, + startY: pageY, + currentX: pageX, + currentY: pageY, + }); + data.touchStartTime = now(); + } + + return; + } + + if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) { + if (swiper.isVertical()) { + // Vertical + if ( + (pageY < touches.startY && + swiper.translate <= swiper.maxTranslate()) || + (pageY > touches.startY && swiper.translate >= swiper.minTranslate()) + ) { + data.isTouched = false; + data.isMoved = false; + return; + } + } else if ( + (pageX < touches.startX && swiper.translate <= swiper.maxTranslate()) || + (pageX > touches.startX && swiper.translate >= swiper.minTranslate()) + ) { + return; + } + } + + if (data.isTouchEvent && document.activeElement) { + if ( + e.target === document.activeElement && + $(e.target).is(data.focusableElements) + ) { + data.isMoved = true; + swiper.allowClick = false; + return; + } + } + + if (data.allowTouchCallbacks) { + swiper.emit("touchMove", e); + } + + if (e.targetTouches && e.targetTouches.length > 1) return; + touches.currentX = pageX; + touches.currentY = pageY; + const diffX = touches.currentX - touches.startX; + const diffY = touches.currentY - touches.startY; + if ( + swiper.params.threshold && + Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold + ) + return; + + if (typeof data.isScrolling === "undefined") { + let touchAngle; + + if ( + (swiper.isHorizontal() && touches.currentY === touches.startY) || + (swiper.isVertical() && touches.currentX === touches.startX) + ) { + data.isScrolling = false; + } else { + // eslint-disable-next-line + if (diffX * diffX + diffY * diffY >= 25) { + touchAngle = + (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI; + data.isScrolling = swiper.isHorizontal() + ? touchAngle > params.touchAngle + : 90 - touchAngle > params.touchAngle; + } + } + } + + if (data.isScrolling) { + swiper.emit("touchMoveOpposite", e); + } + + if (typeof data.startMoving === "undefined") { + if ( + touches.currentX !== touches.startX || + touches.currentY !== touches.startY + ) { + data.startMoving = true; + } + } + + if (data.isScrolling) { + data.isTouched = false; + return; + } + + if (!data.startMoving) { + return; + } + + swiper.allowClick = false; + + if (!params.cssMode && e.cancelable) { + e.preventDefault(); + } + + if (params.touchMoveStopPropagation && !params.nested) { + e.stopPropagation(); + } + + if (!data.isMoved) { + if (params.loop && !params.cssMode) { + swiper.loopFix(); + } + + data.startTranslate = swiper.getTranslate(); + swiper.setTransition(0); + + if (swiper.animating) { + swiper.$wrapperEl.trigger("webkitTransitionEnd transitionend"); + } + + data.allowMomentumBounce = false; // Grab Cursor + + if ( + params.grabCursor && + (swiper.allowSlideNext === true || swiper.allowSlidePrev === true) + ) { + swiper.setGrabCursor(true); + } + + swiper.emit("sliderFirstMove", e); + } + + swiper.emit("sliderMove", e); + data.isMoved = true; + let diff = swiper.isHorizontal() ? diffX : diffY; + touches.diff = diff; + diff *= params.touchRatio; + if (rtl) diff = -diff; + swiper.swipeDirection = diff > 0 ? "prev" : "next"; + data.currentTranslate = diff + data.startTranslate; + let disableParentSwiper = true; + let resistanceRatio = params.resistanceRatio; + + if (params.touchReleaseOnEdges) { + resistanceRatio = 0; + } + + if (diff > 0 && data.currentTranslate > swiper.minTranslate()) { + disableParentSwiper = false; + if (params.resistance) + data.currentTranslate = + swiper.minTranslate() - + 1 + + (-swiper.minTranslate() + data.startTranslate + diff) ** + resistanceRatio; + } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) { + disableParentSwiper = false; + if (params.resistance) + data.currentTranslate = + swiper.maxTranslate() + + 1 - + (swiper.maxTranslate() - data.startTranslate - diff) ** + resistanceRatio; + } + + if (disableParentSwiper) { + e.preventedByNestedSwiper = true; + } // Directions locks + + if ( + !swiper.allowSlideNext && + swiper.swipeDirection === "next" && + data.currentTranslate < data.startTranslate + ) { + data.currentTranslate = data.startTranslate; + } + + if ( + !swiper.allowSlidePrev && + swiper.swipeDirection === "prev" && + data.currentTranslate > data.startTranslate + ) { + data.currentTranslate = data.startTranslate; + } + + if (!swiper.allowSlidePrev && !swiper.allowSlideNext) { + data.currentTranslate = data.startTranslate; + } // Threshold + + if (params.threshold > 0) { + if (Math.abs(diff) > params.threshold || data.allowThresholdMove) { + if (!data.allowThresholdMove) { + data.allowThresholdMove = true; + touches.startX = touches.currentX; + touches.startY = touches.currentY; + data.currentTranslate = data.startTranslate; + touches.diff = swiper.isHorizontal() + ? touches.currentX - touches.startX + : touches.currentY - touches.startY; + return; + } + } else { + data.currentTranslate = data.startTranslate; + return; + } + } + + if (!params.followFinger || params.cssMode) return; // Update active index in free mode + + if ( + (params.freeMode && params.freeMode.enabled && swiper.freeMode) || + params.watchSlidesProgress + ) { + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) { + swiper.freeMode.onTouchMove(); + } // Update progress + + swiper.updateProgress(data.currentTranslate); // Update translate + + swiper.setTranslate(data.currentTranslate); + } + + function onTouchEnd(event) { + const swiper = this; + const data = swiper.touchEventsData; + const { params, touches, rtlTranslate: rtl, slidesGrid, enabled } = swiper; + if (!enabled) return; + let e = event; + if (e.originalEvent) e = e.originalEvent; + + if (data.allowTouchCallbacks) { + swiper.emit("touchEnd", e); + } + + data.allowTouchCallbacks = false; + + if (!data.isTouched) { + if (data.isMoved && params.grabCursor) { + swiper.setGrabCursor(false); + } + + data.isMoved = false; + data.startMoving = false; + return; + } // Return Grab Cursor + + if ( + params.grabCursor && + data.isMoved && + data.isTouched && + (swiper.allowSlideNext === true || swiper.allowSlidePrev === true) + ) { + swiper.setGrabCursor(false); + } // Time diff + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click + + if (swiper.allowClick) { + const pathTree = e.path || (e.composedPath && e.composedPath()); + swiper.updateClickedSlide((pathTree && pathTree[0]) || e.target); + swiper.emit("tap click", e); + + if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) { + swiper.emit("doubleTap doubleClick", e); + } + } + + data.lastClickTime = now(); + nextTick(() => { + if (!swiper.destroyed) swiper.allowClick = true; + }); + + if ( + !data.isTouched || + !data.isMoved || + !swiper.swipeDirection || + touches.diff === 0 || + data.currentTranslate === data.startTranslate + ) { + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + return; + } + + data.isTouched = false; + data.isMoved = false; + data.startMoving = false; + let currentPos; + + if (params.followFinger) { + currentPos = rtl ? swiper.translate : -swiper.translate; + } else { + currentPos = -data.currentTranslate; + } + + if (params.cssMode) { + return; + } + + if (swiper.params.freeMode && params.freeMode.enabled) { + swiper.freeMode.onTouchEnd({ + currentPos, + }); + return; + } // Find current slide + + let stopIndex = 0; + let groupSize = swiper.slidesSizesGrid[0]; + + for ( + let i = 0; + i < slidesGrid.length; + i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup + ) { + const increment = + i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (typeof slidesGrid[i + increment] !== "undefined") { + if ( + currentPos >= slidesGrid[i] && + currentPos < slidesGrid[i + increment] + ) { + stopIndex = i; + groupSize = slidesGrid[i + increment] - slidesGrid[i]; + } + } else if (currentPos >= slidesGrid[i]) { + stopIndex = i; + groupSize = + slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2]; + } + } + + let rewindFirstIndex = null; + let rewindLastIndex = null; + + if (params.rewind) { + if (swiper.isBeginning) { + rewindLastIndex = + swiper.params.virtual && + swiper.params.virtual.enabled && + swiper.virtual + ? swiper.virtual.slides.length - 1 + : swiper.slides.length - 1; + } else if (swiper.isEnd) { + rewindFirstIndex = 0; + } + } // Find current slide size + + const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize; + const increment = + stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup; + + if (timeDiff > params.longSwipesMs) { + // Long touches + if (!params.longSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (swiper.swipeDirection === "next") { + if (ratio >= params.longSwipesRatio) + swiper.slideTo( + params.rewind && swiper.isEnd + ? rewindFirstIndex + : stopIndex + increment, + ); + else swiper.slideTo(stopIndex); + } + + if (swiper.swipeDirection === "prev") { + if (ratio > 1 - params.longSwipesRatio) { + swiper.slideTo(stopIndex + increment); + } else if ( + rewindLastIndex !== null && + ratio < 0 && + Math.abs(ratio) > params.longSwipesRatio + ) { + swiper.slideTo(rewindLastIndex); + } else { + swiper.slideTo(stopIndex); + } + } + } else { + // Short swipes + if (!params.shortSwipes) { + swiper.slideTo(swiper.activeIndex); + return; + } + + const isNavButtonTarget = + swiper.navigation && + (e.target === swiper.navigation.nextEl || + e.target === swiper.navigation.prevEl); + + if (!isNavButtonTarget) { + if (swiper.swipeDirection === "next") { + swiper.slideTo( + rewindFirstIndex !== null + ? rewindFirstIndex + : stopIndex + increment, + ); + } + + if (swiper.swipeDirection === "prev") { + swiper.slideTo( + rewindLastIndex !== null ? rewindLastIndex : stopIndex, + ); + } + } else if (e.target === swiper.navigation.nextEl) { + swiper.slideTo(stopIndex + increment); + } else { + swiper.slideTo(stopIndex); + } + } + } + + function onResize() { + const swiper = this; + const { params, el } = swiper; + if (el && el.offsetWidth === 0) return; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } // Save locks + + const { allowSlideNext, allowSlidePrev, snapGrid } = swiper; // Disable locks on resize + + swiper.allowSlideNext = true; + swiper.allowSlidePrev = true; + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateSlidesClasses(); + + if ( + (params.slidesPerView === "auto" || params.slidesPerView > 1) && + swiper.isEnd && + !swiper.isBeginning && + !swiper.params.centeredSlides + ) { + swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) { + swiper.autoplay.run(); + } // Return locks after resize + + swiper.allowSlidePrev = allowSlidePrev; + swiper.allowSlideNext = allowSlideNext; + + if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + } + + function onClick(e) { + const swiper = this; + if (!swiper.enabled) return; + + if (!swiper.allowClick) { + if (swiper.params.preventClicks) e.preventDefault(); + + if (swiper.params.preventClicksPropagation && swiper.animating) { + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + } + + function onScroll() { + const swiper = this; + const { wrapperEl, rtlTranslate, enabled } = swiper; + if (!enabled) return; + swiper.previousTranslate = swiper.translate; + + if (swiper.isHorizontal()) { + swiper.translate = -wrapperEl.scrollLeft; + } else { + swiper.translate = -wrapperEl.scrollTop; + } // eslint-disable-next-line + + if (swiper.translate === -0) swiper.translate = 0; + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + let newProgress; + const translatesDiff = swiper.maxTranslate() - swiper.minTranslate(); + + if (translatesDiff === 0) { + newProgress = 0; + } else { + newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff; + } + + if (newProgress !== swiper.progress) { + swiper.updateProgress( + rtlTranslate ? -swiper.translate : swiper.translate, + ); + } + + swiper.emit("setTranslate", swiper.translate, false); + } + + let dummyEventAttached = false; + + function dummyEventListener() {} + + const events = (swiper, method) => { + const document = getDocument(); + const { params, touchEvents, el, wrapperEl, device, support } = swiper; + const capture = !!params.nested; + const domMethod = + method === "on" ? "addEventListener" : "removeEventListener"; + const swiperMethod = method; // Touch Events + + if (!support.touch) { + el[domMethod](touchEvents.start, swiper.onTouchStart, false); + document[domMethod](touchEvents.move, swiper.onTouchMove, capture); + document[domMethod](touchEvents.end, swiper.onTouchEnd, false); + } else { + const passiveListener = + touchEvents.start === "touchstart" && + support.passiveListener && + params.passiveListeners + ? { + passive: true, + capture: false, + } + : false; + el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener); + el[domMethod]( + touchEvents.move, + swiper.onTouchMove, + support.passiveListener + ? { + passive: false, + capture, + } + : capture, + ); + el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener); + + if (touchEvents.cancel) { + el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener); + } + } // Prevent Links Clicks + + if (params.preventClicks || params.preventClicksPropagation) { + el[domMethod]("click", swiper.onClick, true); + } + + if (params.cssMode) { + wrapperEl[domMethod]("scroll", swiper.onScroll); + } // Resize handler + + if (params.updateOnWindowResize) { + swiper[swiperMethod]( + device.ios || device.android + ? "resize orientationchange observerUpdate" + : "resize observerUpdate", + onResize, + true, + ); + } else { + swiper[swiperMethod]("observerUpdate", onResize, true); + } + }; + + function attachEvents() { + const swiper = this; + const document = getDocument(); + const { params, support } = swiper; + swiper.onTouchStart = onTouchStart.bind(swiper); + swiper.onTouchMove = onTouchMove.bind(swiper); + swiper.onTouchEnd = onTouchEnd.bind(swiper); + + if (params.cssMode) { + swiper.onScroll = onScroll.bind(swiper); + } + + swiper.onClick = onClick.bind(swiper); + + if (support.touch && !dummyEventAttached) { + document.addEventListener("touchstart", dummyEventListener); + dummyEventAttached = true; + } + + events(swiper, "on"); + } + + function detachEvents() { + const swiper = this; + events(swiper, "off"); + } + + var events$1 = { + attachEvents, + detachEvents, + }; + + const isGridEnabled = (swiper, params) => { + return swiper.grid && params.grid && params.grid.rows > 1; + }; + + function setBreakpoint() { + const swiper = this; + const { activeIndex, initialized, loopedSlides = 0, params, $el } = swiper; + const breakpoints = params.breakpoints; + if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) + return; // Get breakpoint for window width and update parameters + + const breakpoint = swiper.getBreakpoint( + breakpoints, + swiper.params.breakpointsBase, + swiper.el, + ); + if (!breakpoint || swiper.currentBreakpoint === breakpoint) return; + const breakpointOnlyParams = + breakpoint in breakpoints ? breakpoints[breakpoint] : undefined; + const breakpointParams = breakpointOnlyParams || swiper.originalParams; + const wasMultiRow = isGridEnabled(swiper, params); + const isMultiRow = isGridEnabled(swiper, breakpointParams); + const wasEnabled = params.enabled; + + if (wasMultiRow && !isMultiRow) { + $el.removeClass( + `${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`, + ); + swiper.emitContainerClasses(); + } else if (!wasMultiRow && isMultiRow) { + $el.addClass(`${params.containerModifierClass}grid`); + + if ( + (breakpointParams.grid.fill && + breakpointParams.grid.fill === "column") || + (!breakpointParams.grid.fill && params.grid.fill === "column") + ) { + $el.addClass(`${params.containerModifierClass}grid-column`); + } + + swiper.emitContainerClasses(); + } + + const directionChanged = + breakpointParams.direction && + breakpointParams.direction !== params.direction; + const needsReLoop = + params.loop && + (breakpointParams.slidesPerView !== params.slidesPerView || + directionChanged); + + if (directionChanged && initialized) { + swiper.changeDirection(); + } + + extend(swiper.params, breakpointParams); + const isEnabled = swiper.params.enabled; + Object.assign(swiper, { + allowTouchMove: swiper.params.allowTouchMove, + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + }); + + if (wasEnabled && !isEnabled) { + swiper.disable(); + } else if (!wasEnabled && isEnabled) { + swiper.enable(); + } + + swiper.currentBreakpoint = breakpoint; + swiper.emit("_beforeBreakpoint", breakpointParams); + + if (needsReLoop && initialized) { + swiper.loopDestroy(); + swiper.loopCreate(); + swiper.updateSlides(); + swiper.slideTo( + activeIndex - loopedSlides + swiper.loopedSlides, + 0, + false, + ); + } + + swiper.emit("breakpoint", breakpointParams); + } + + function getBreakpoint(breakpoints, base, containerEl) { + if (base === void 0) { + base = "window"; + } + + if (!breakpoints || (base === "container" && !containerEl)) + return undefined; + let breakpoint = false; + const window = getWindow(); + const currentHeight = + base === "window" ? window.innerHeight : containerEl.clientHeight; + const points = Object.keys(breakpoints).map((point) => { + if (typeof point === "string" && point.indexOf("@") === 0) { + const minRatio = parseFloat(point.substr(1)); + const value = currentHeight * minRatio; + return { + value, + point, + }; + } + + return { + value: point, + point, + }; + }); + points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10)); + + for (let i = 0; i < points.length; i += 1) { + const { point, value } = points[i]; + + if (base === "window") { + if (window.matchMedia(`(min-width: ${value}px)`).matches) { + breakpoint = point; + } + } else if (value <= containerEl.clientWidth) { + breakpoint = point; + } + } + + return breakpoint || "max"; + } + + var breakpoints = { + setBreakpoint, + getBreakpoint, + }; + + function prepareClasses(entries, prefix) { + const resultClasses = []; + entries.forEach((item) => { + if (typeof item === "object") { + Object.keys(item).forEach((classNames) => { + if (item[classNames]) { + resultClasses.push(prefix + classNames); + } + }); + } else if (typeof item === "string") { + resultClasses.push(prefix + item); + } + }); + return resultClasses; + } + + function addClasses() { + const swiper = this; + const { + classNames, + params, + rtl, + $el, + device, + support + } = swiper; // prettier-ignore + + const suffixes = prepareClasses( + [ + "initialized", + params.direction, + { + "pointer-events": !support.touch, + }, + { + "free-mode": swiper.params.freeMode && params.freeMode.enabled, + }, + { + autoheight: params.autoHeight, + }, + { + rtl: rtl, + }, + { + grid: params.grid && params.grid.rows > 1, + }, + { + "grid-column": + params.grid && + params.grid.rows > 1 && + params.grid.fill === "column", + }, + { + android: device.android, + }, + { + ios: device.ios, + }, + { + "css-mode": params.cssMode, + }, + { + centered: params.cssMode && params.centeredSlides, + }, + ], + params.containerModifierClass, + ); + classNames.push(...suffixes); + $el.addClass([...classNames].join(" ")); + swiper.emitContainerClasses(); + } + + function removeClasses() { + const swiper = this; + const { $el, classNames } = swiper; + $el.removeClass(classNames.join(" ")); + swiper.emitContainerClasses(); + } + + var classes = { + addClasses, + removeClasses, + }; + + function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) { + const window = getWindow(); + let image; + + function onReady() { + if (callback) callback(); + } + + const isPicture = $(imageEl).parent("picture")[0]; + + if (!isPicture && (!imageEl.complete || !checkForComplete)) { + if (src) { + image = new window.Image(); + image.onload = onReady; + image.onerror = onReady; + + if (sizes) { + image.sizes = sizes; + } + + if (srcset) { + image.srcset = srcset; + } + + if (src) { + image.src = src; + } + } else { + onReady(); + } + } else { + // image already loaded... + onReady(); + } + } + + function preloadImages() { + const swiper = this; + swiper.imagesToLoad = swiper.$el.find("img"); + + function onReady() { + if ( + typeof swiper === "undefined" || + swiper === null || + !swiper || + swiper.destroyed + ) + return; + if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1; + + if (swiper.imagesLoaded === swiper.imagesToLoad.length) { + if (swiper.params.updateOnImagesReady) swiper.update(); + swiper.emit("imagesReady"); + } + } + + for (let i = 0; i < swiper.imagesToLoad.length; i += 1) { + const imageEl = swiper.imagesToLoad[i]; + swiper.loadImage( + imageEl, + imageEl.currentSrc || imageEl.getAttribute("src"), + imageEl.srcset || imageEl.getAttribute("srcset"), + imageEl.sizes || imageEl.getAttribute("sizes"), + true, + onReady, + ); + } + } + + var images = { + loadImage, + preloadImages, + }; + + function checkOverflow() { + const swiper = this; + const { isLocked: wasLocked, params } = swiper; + const { slidesOffsetBefore } = params; + + if (slidesOffsetBefore) { + const lastSlideIndex = swiper.slides.length - 1; + const lastSlideRightEdge = + swiper.slidesGrid[lastSlideIndex] + + swiper.slidesSizesGrid[lastSlideIndex] + + slidesOffsetBefore * 2; + swiper.isLocked = swiper.size > lastSlideRightEdge; + } else { + swiper.isLocked = swiper.snapGrid.length === 1; + } + + if (params.allowSlideNext === true) { + swiper.allowSlideNext = !swiper.isLocked; + } + + if (params.allowSlidePrev === true) { + swiper.allowSlidePrev = !swiper.isLocked; + } + + if (wasLocked && wasLocked !== swiper.isLocked) { + swiper.isEnd = false; + } + + if (wasLocked !== swiper.isLocked) { + swiper.emit(swiper.isLocked ? "lock" : "unlock"); + } + } + + var checkOverflow$1 = { + checkOverflow, + }; + + var defaults = { + init: true, + direction: "horizontal", + touchEventsTarget: "wrapper", + initialSlide: 0, + speed: 300, + cssMode: false, + updateOnWindowResize: true, + resizeObserver: true, + nested: false, + createElements: false, + enabled: true, + focusableElements: "input, select, option, textarea, button, video, label", + // Overrides + width: null, + height: null, + // + preventInteractionOnTransition: false, + // ssr + userAgent: null, + url: null, + // To support iOS's swipe-to-go-back gesture (when being used in-app). + edgeSwipeDetection: false, + edgeSwipeThreshold: 20, + // Autoheight + autoHeight: false, + // Set wrapper width + setWrapperSize: false, + // Virtual Translate + virtualTranslate: false, + // Effects + effect: "slide", + // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip' + // Breakpoints + breakpoints: undefined, + breakpointsBase: "window", + // Slides grid + spaceBetween: 0, + slidesPerView: 1, + slidesPerGroup: 1, + slidesPerGroupSkip: 0, + slidesPerGroupAuto: false, + centeredSlides: false, + centeredSlidesBounds: false, + slidesOffsetBefore: 0, + // in px + slidesOffsetAfter: 0, + // in px + normalizeSlideIndex: true, + centerInsufficientSlides: false, + // Disable swiper and hide navigation when container not overflow + watchOverflow: true, + // Round length + roundLengths: false, + // Touches + touchRatio: 1, + touchAngle: 45, + simulateTouch: true, + shortSwipes: true, + longSwipes: true, + longSwipesRatio: 0.5, + longSwipesMs: 300, + followFinger: true, + allowTouchMove: true, + threshold: 0, + touchMoveStopPropagation: false, + touchStartPreventDefault: true, + touchStartForcePreventDefault: false, + touchReleaseOnEdges: false, + // Unique Navigation Elements + uniqueNavElements: true, + // Resistance + resistance: true, + resistanceRatio: 0.85, + // Progress + watchSlidesProgress: false, + // Cursor + grabCursor: false, + // Clicks + preventClicks: true, + preventClicksPropagation: true, + slideToClickedSlide: false, + // Images + preloadImages: true, + updateOnImagesReady: true, + // loop + loop: false, + loopAdditionalSlides: 0, + loopedSlides: null, + loopFillGroupWithBlank: false, + loopPreventsSlide: true, + // rewind + rewind: false, + // Swiping/no swiping + allowSlidePrev: true, + allowSlideNext: true, + swipeHandler: null, + // '.swipe-handler', + noSwiping: true, + noSwipingClass: "swiper-no-swiping", + noSwipingSelector: null, + // Passive Listeners + passiveListeners: true, + maxBackfaceHiddenSlides: 10, + // NS + containerModifierClass: "swiper-", + // NEW + slideClass: "swiper-slide", + slideBlankClass: "swiper-slide-invisible-blank", + slideActiveClass: "swiper-slide-active", + slideDuplicateActiveClass: "swiper-slide-duplicate-active", + slideVisibleClass: "swiper-slide-visible", + slideDuplicateClass: "swiper-slide-duplicate", + slideNextClass: "swiper-slide-next", + slideDuplicateNextClass: "swiper-slide-duplicate-next", + slidePrevClass: "swiper-slide-prev", + slideDuplicatePrevClass: "swiper-slide-duplicate-prev", + wrapperClass: "swiper-wrapper", + // Callbacks + runCallbacksOnInit: true, + // Internals + _emitClasses: false, + }; + + function moduleExtendParams(params, allModulesParams) { + return function extendParams(obj) { + if (obj === void 0) { + obj = {}; + } + + const moduleParamName = Object.keys(obj)[0]; + const moduleParams = obj[moduleParamName]; + + if (typeof moduleParams !== "object" || moduleParams === null) { + extend(allModulesParams, obj); + return; + } + + if ( + ["navigation", "pagination", "scrollbar"].indexOf(moduleParamName) >= + 0 && + params[moduleParamName] === true + ) { + params[moduleParamName] = { + auto: true, + }; + } + + if (!(moduleParamName in params && "enabled" in moduleParams)) { + extend(allModulesParams, obj); + return; + } + + if (params[moduleParamName] === true) { + params[moduleParamName] = { + enabled: true, + }; + } + + if ( + typeof params[moduleParamName] === "object" && + !("enabled" in params[moduleParamName]) + ) { + params[moduleParamName].enabled = true; + } + + if (!params[moduleParamName]) + params[moduleParamName] = { + enabled: false, + }; + extend(allModulesParams, obj); + }; + } + + /* eslint no-param-reassign: "off" */ + const prototypes = { + eventsEmitter, + update, + translate, + transition, + slide, + loop, + grabCursor, + events: events$1, + breakpoints, + checkOverflow: checkOverflow$1, + classes, + images, + }; + const extendedDefaults = {}; + + class Swiper { + constructor() { + let el; + let params; + + for ( + var _len = arguments.length, args = new Array(_len), _key = 0; + _key < _len; + _key++ + ) { + args[_key] = arguments[_key]; + } + + if ( + args.length === 1 && + args[0].constructor && + Object.prototype.toString.call(args[0]).slice(8, -1) === "Object" + ) { + params = args[0]; + } else { + [el, params] = args; + } + + if (!params) params = {}; + params = extend({}, params); + if (el && !params.el) params.el = el; + + if (params.el && $(params.el).length > 1) { + const swipers = []; + $(params.el).each((containerEl) => { + const newParams = extend({}, params, { + el: containerEl, + }); + swipers.push(new Swiper(newParams)); + }); + return swipers; + } // Swiper Instance + + const swiper = this; + swiper.__swiper__ = true; + swiper.support = getSupport(); + swiper.device = getDevice({ + userAgent: params.userAgent, + }); + swiper.browser = getBrowser(); + swiper.eventsListeners = {}; + swiper.eventsAnyListeners = []; + swiper.modules = [...swiper.__modules__]; + + if (params.modules && Array.isArray(params.modules)) { + swiper.modules.push(...params.modules); + } + + const allModulesParams = {}; + swiper.modules.forEach((mod) => { + mod({ + swiper, + extendParams: moduleExtendParams(params, allModulesParams), + on: swiper.on.bind(swiper), + once: swiper.once.bind(swiper), + off: swiper.off.bind(swiper), + emit: swiper.emit.bind(swiper), + }); + }); // Extend defaults with modules params + + const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params + + swiper.params = extend({}, swiperParams, extendedDefaults, params); + swiper.originalParams = extend({}, swiper.params); + swiper.passedParams = extend({}, params); // add event listeners + + if (swiper.params && swiper.params.on) { + Object.keys(swiper.params.on).forEach((eventName) => { + swiper.on(eventName, swiper.params.on[eventName]); + }); + } + + if (swiper.params && swiper.params.onAny) { + swiper.onAny(swiper.params.onAny); + } // Save Dom lib + + swiper.$ = $; // Extend Swiper + + Object.assign(swiper, { + enabled: swiper.params.enabled, + el, + // Classes + classNames: [], + // Slides + slides: $(), + slidesGrid: [], + snapGrid: [], + slidesSizesGrid: [], + + // isDirection + isHorizontal() { + return swiper.params.direction === "horizontal"; + }, + + isVertical() { + return swiper.params.direction === "vertical"; + }, + + // Indexes + activeIndex: 0, + realIndex: 0, + // + isBeginning: true, + isEnd: false, + // Props + translate: 0, + previousTranslate: 0, + progress: 0, + velocity: 0, + animating: false, + // Locks + allowSlideNext: swiper.params.allowSlideNext, + allowSlidePrev: swiper.params.allowSlidePrev, + // Touch Events + touchEvents: (function touchEvents() { + const touch = ["touchstart", "touchmove", "touchend", "touchcancel"]; + const desktop = ["pointerdown", "pointermove", "pointerup"]; + swiper.touchEventsTouch = { + start: touch[0], + move: touch[1], + end: touch[2], + cancel: touch[3], + }; + swiper.touchEventsDesktop = { + start: desktop[0], + move: desktop[1], + end: desktop[2], + }; + return swiper.support.touch || !swiper.params.simulateTouch + ? swiper.touchEventsTouch + : swiper.touchEventsDesktop; + })(), + touchEventsData: { + isTouched: undefined, + isMoved: undefined, + allowTouchCallbacks: undefined, + touchStartTime: undefined, + isScrolling: undefined, + currentTranslate: undefined, + startTranslate: undefined, + allowThresholdMove: undefined, + // Form elements to match + focusableElements: swiper.params.focusableElements, + // Last click time + lastClickTime: now(), + clickTimeout: undefined, + // Velocities + velocities: [], + allowMomentumBounce: undefined, + isTouchEvent: undefined, + startMoving: undefined, + }, + // Clicks + allowClick: true, + // Touches + allowTouchMove: swiper.params.allowTouchMove, + touches: { + startX: 0, + startY: 0, + currentX: 0, + currentY: 0, + diff: 0, + }, + // Images + imagesToLoad: [], + imagesLoaded: 0, + }); + swiper.emit("_swiper"); // Init + + if (swiper.params.init) { + swiper.init(); + } // Return app instance + + return swiper; + } + + enable() { + const swiper = this; + if (swiper.enabled) return; + swiper.enabled = true; + + if (swiper.params.grabCursor) { + swiper.setGrabCursor(); + } + + swiper.emit("enable"); + } + + disable() { + const swiper = this; + if (!swiper.enabled) return; + swiper.enabled = false; + + if (swiper.params.grabCursor) { + swiper.unsetGrabCursor(); + } + + swiper.emit("disable"); + } + + setProgress(progress, speed) { + const swiper = this; + progress = Math.min(Math.max(progress, 0), 1); + const min = swiper.minTranslate(); + const max = swiper.maxTranslate(); + const current = (max - min) * progress + min; + swiper.translateTo(current, typeof speed === "undefined" ? 0 : speed); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + emitContainerClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const cls = swiper.el.className.split(" ").filter((className) => { + return ( + className.indexOf("swiper") === 0 || + className.indexOf(swiper.params.containerModifierClass) === 0 + ); + }); + swiper.emit("_containerClasses", cls.join(" ")); + } + + getSlideClasses(slideEl) { + const swiper = this; + return slideEl.className + .split(" ") + .filter((className) => { + return ( + className.indexOf("swiper-slide") === 0 || + className.indexOf(swiper.params.slideClass) === 0 + ); + }) + .join(" "); + } + + emitSlidesClasses() { + const swiper = this; + if (!swiper.params._emitClasses || !swiper.el) return; + const updates = []; + swiper.slides.each((slideEl) => { + const classNames = swiper.getSlideClasses(slideEl); + updates.push({ + slideEl, + classNames, + }); + swiper.emit("_slideClass", slideEl, classNames); + }); + swiper.emit("_slideClasses", updates); + } + + slidesPerViewDynamic(view, exact) { + if (view === void 0) { + view = "current"; + } + + if (exact === void 0) { + exact = false; + } + + const swiper = this; + const { + params, + slides, + slidesGrid, + slidesSizesGrid, + size: swiperSize, + activeIndex, + } = swiper; + let spv = 1; + + if (params.centeredSlides) { + let slideSize = slides[activeIndex].swiperSlideSize; + let breakLoop; + + for (let i = activeIndex + 1; i < slides.length; i += 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + + for (let i = activeIndex - 1; i >= 0; i -= 1) { + if (slides[i] && !breakLoop) { + slideSize += slides[i].swiperSlideSize; + spv += 1; + if (slideSize > swiperSize) breakLoop = true; + } + } + } else { + // eslint-disable-next-line + if (view === "current") { + for (let i = activeIndex + 1; i < slides.length; i += 1) { + const slideInView = exact + ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < + swiperSize + : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } else { + // previous + for (let i = activeIndex - 1; i >= 0; i -= 1) { + const slideInView = + slidesGrid[activeIndex] - slidesGrid[i] < swiperSize; + + if (slideInView) { + spv += 1; + } + } + } + } + + return spv; + } + + update() { + const swiper = this; + if (!swiper || swiper.destroyed) return; + const { snapGrid, params } = swiper; // Breakpoints + + if (params.breakpoints) { + swiper.setBreakpoint(); + } + + swiper.updateSize(); + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + function setTranslate() { + const translateValue = swiper.rtlTranslate + ? swiper.translate * -1 + : swiper.translate; + const newTranslate = Math.min( + Math.max(translateValue, swiper.maxTranslate()), + swiper.minTranslate(), + ); + swiper.setTranslate(newTranslate); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + let translated; + + if (swiper.params.freeMode && swiper.params.freeMode.enabled) { + setTranslate(); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + } else { + if ( + (swiper.params.slidesPerView === "auto" || + swiper.params.slidesPerView > 1) && + swiper.isEnd && + !swiper.params.centeredSlides + ) { + translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true); + } else { + translated = swiper.slideTo(swiper.activeIndex, 0, false, true); + } + + if (!translated) { + setTranslate(); + } + } + + if (params.watchOverflow && snapGrid !== swiper.snapGrid) { + swiper.checkOverflow(); + } + + swiper.emit("update"); + } + + changeDirection(newDirection, needUpdate) { + if (needUpdate === void 0) { + needUpdate = true; + } + + const swiper = this; + const currentDirection = swiper.params.direction; + + if (!newDirection) { + // eslint-disable-next-line + newDirection = + currentDirection === "horizontal" ? "vertical" : "horizontal"; + } + + if ( + newDirection === currentDirection || + (newDirection !== "horizontal" && newDirection !== "vertical") + ) { + return swiper; + } + + swiper.$el + .removeClass( + `${swiper.params.containerModifierClass}${currentDirection}`, + ) + .addClass(`${swiper.params.containerModifierClass}${newDirection}`); + swiper.emitContainerClasses(); + swiper.params.direction = newDirection; + swiper.slides.each((slideEl) => { + if (newDirection === "vertical") { + slideEl.style.width = ""; + } else { + slideEl.style.height = ""; + } + }); + swiper.emit("changeDirection"); + if (needUpdate) swiper.update(); + return swiper; + } + + mount(el) { + const swiper = this; + if (swiper.mounted) return true; // Find el + + const $el = $(el || swiper.params.el); + el = $el[0]; + + if (!el) { + return false; + } + + el.swiper = swiper; + + const getWrapperSelector = () => { + return `.${(swiper.params.wrapperClass || "") + .trim() + .split(" ") + .join(".")}`; + }; + + const getWrapper = () => { + if (el && el.shadowRoot && el.shadowRoot.querySelector) { + const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items + + res.children = (options) => $el.children(options); + + return res; + } + + return $el.children(getWrapperSelector()); + }; // Find Wrapper + + let $wrapperEl = getWrapper(); + + if ($wrapperEl.length === 0 && swiper.params.createElements) { + const document = getDocument(); + const wrapper = document.createElement("div"); + $wrapperEl = $(wrapper); + wrapper.className = swiper.params.wrapperClass; + $el.append(wrapper); + $el.children(`.${swiper.params.slideClass}`).each((slideEl) => { + $wrapperEl.append(slideEl); + }); + } + + Object.assign(swiper, { + $el, + el, + $wrapperEl, + wrapperEl: $wrapperEl[0], + mounted: true, + // RTL + rtl: el.dir.toLowerCase() === "rtl" || $el.css("direction") === "rtl", + rtlTranslate: + swiper.params.direction === "horizontal" && + (el.dir.toLowerCase() === "rtl" || $el.css("direction") === "rtl"), + wrongRTL: $wrapperEl.css("display") === "-webkit-box", + }); + return true; + } + + init(el) { + const swiper = this; + if (swiper.initialized) return swiper; + const mounted = swiper.mount(el); + if (mounted === false) return swiper; + swiper.emit("beforeInit"); // Set breakpoint + + if (swiper.params.breakpoints) { + swiper.setBreakpoint(); + } // Add Classes + + swiper.addClasses(); // Create loop + + if (swiper.params.loop) { + swiper.loopCreate(); + } // Update size + + swiper.updateSize(); // Update slides + + swiper.updateSlides(); + + if (swiper.params.watchOverflow) { + swiper.checkOverflow(); + } // Set Grab Cursor + + if (swiper.params.grabCursor && swiper.enabled) { + swiper.setGrabCursor(); + } + + if (swiper.params.preloadImages) { + swiper.preloadImages(); + } // Slide To Initial Slide + + if (swiper.params.loop) { + swiper.slideTo( + swiper.params.initialSlide + swiper.loopedSlides, + 0, + swiper.params.runCallbacksOnInit, + false, + true, + ); + } else { + swiper.slideTo( + swiper.params.initialSlide, + 0, + swiper.params.runCallbacksOnInit, + false, + true, + ); + } // Attach events + + swiper.attachEvents(); // Init Flag + + swiper.initialized = true; // Emit + + swiper.emit("init"); + swiper.emit("afterInit"); + return swiper; + } + + destroy(deleteInstance, cleanStyles) { + if (deleteInstance === void 0) { + deleteInstance = true; + } + + if (cleanStyles === void 0) { + cleanStyles = true; + } + + const swiper = this; + const { params, $el, $wrapperEl, slides } = swiper; + + if (typeof swiper.params === "undefined" || swiper.destroyed) { + return null; + } + + swiper.emit("beforeDestroy"); // Init Flag + + swiper.initialized = false; // Detach events + + swiper.detachEvents(); // Destroy loop + + if (params.loop) { + swiper.loopDestroy(); + } // Cleanup styles + + if (cleanStyles) { + swiper.removeClasses(); + $el.removeAttr("style"); + $wrapperEl.removeAttr("style"); + + if (slides && slides.length) { + slides + .removeClass( + [ + params.slideVisibleClass, + params.slideActiveClass, + params.slideNextClass, + params.slidePrevClass, + ].join(" "), + ) + .removeAttr("style") + .removeAttr("data-swiper-slide-index"); + } + } + + swiper.emit("destroy"); // Detach emitter events + + Object.keys(swiper.eventsListeners).forEach((eventName) => { + swiper.off(eventName); + }); + + if (deleteInstance !== false) { + swiper.$el[0].swiper = null; + deleteProps(swiper); + } + + swiper.destroyed = true; + return null; + } + + static extendDefaults(newDefaults) { + extend(extendedDefaults, newDefaults); + } + + static get extendedDefaults() { + return extendedDefaults; + } + + static get defaults() { + return defaults; + } + + static installModule(mod) { + if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = []; + const modules = Swiper.prototype.__modules__; + + if (typeof mod === "function" && modules.indexOf(mod) < 0) { + modules.push(mod); + } + } + + static use(module) { + if (Array.isArray(module)) { + module.forEach((m) => Swiper.installModule(m)); + return Swiper; + } + + Swiper.installModule(module); + return Swiper; + } + } + + Object.keys(prototypes).forEach((prototypeGroup) => { + Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => { + Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod]; + }); + }); + Swiper.use([Resize, Observer]); + + function Virtual(_ref) { + let { swiper, extendParams, on, emit } = _ref; + extendParams({ + virtual: { + enabled: false, + slides: [], + cache: true, + renderSlide: null, + renderExternal: null, + renderExternalUpdate: true, + addSlidesBefore: 0, + addSlidesAfter: 0, + }, + }); + let cssModeTimeout; + swiper.virtual = { + cache: {}, + from: undefined, + to: undefined, + slides: [], + offset: 0, + slidesGrid: [], + }; + + function renderSlide(slide, index) { + const params = swiper.params.virtual; + + if (params.cache && swiper.virtual.cache[index]) { + return swiper.virtual.cache[index]; + } + + const $slideEl = params.renderSlide + ? $(params.renderSlide.call(swiper, slide, index)) + : $( + `
${slide}
`, + ); + if (!$slideEl.attr("data-swiper-slide-index")) + $slideEl.attr("data-swiper-slide-index", index); + if (params.cache) swiper.virtual.cache[index] = $slideEl; + return $slideEl; + } + + function update(force) { + const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params; + const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual; + const { + from: previousFrom, + to: previousTo, + slides, + slidesGrid: previousSlidesGrid, + offset: previousOffset, + } = swiper.virtual; + + if (!swiper.params.cssMode) { + swiper.updateActiveIndex(); + } + + const activeIndex = swiper.activeIndex || 0; + let offsetProp; + if (swiper.rtlTranslate) offsetProp = "right"; + else offsetProp = swiper.isHorizontal() ? "left" : "top"; + let slidesAfter; + let slidesBefore; + + if (centeredSlides) { + slidesAfter = + Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter; + slidesBefore = + Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore; + } else { + slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter; + slidesBefore = slidesPerGroup + addSlidesBefore; + } + + const from = Math.max((activeIndex || 0) - slidesBefore, 0); + const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1); + const offset = + (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0); + Object.assign(swiper.virtual, { + from, + to, + offset, + slidesGrid: swiper.slidesGrid, + }); + + function onRendered() { + swiper.updateSlides(); + swiper.updateProgress(); + swiper.updateSlidesClasses(); + + if (swiper.lazy && swiper.params.lazy.enabled) { + swiper.lazy.load(); + } + + emit("virtualUpdate"); + } + + if (previousFrom === from && previousTo === to && !force) { + if ( + swiper.slidesGrid !== previousSlidesGrid && + offset !== previousOffset + ) { + swiper.slides.css(offsetProp, `${offset}px`); + } + + swiper.updateProgress(); + emit("virtualUpdate"); + return; + } + + if (swiper.params.virtual.renderExternal) { + swiper.params.virtual.renderExternal.call(swiper, { + offset, + from, + to, + slides: (function getSlides() { + const slidesToRender = []; + + for (let i = from; i <= to; i += 1) { + slidesToRender.push(slides[i]); + } + + return slidesToRender; + })(), + }); + + if (swiper.params.virtual.renderExternalUpdate) { + onRendered(); + } else { + emit("virtualUpdate"); + } + + return; + } + + const prependIndexes = []; + const appendIndexes = []; + + if (force) { + swiper.$wrapperEl.find(`.${swiper.params.slideClass}`).remove(); + } else { + for (let i = previousFrom; i <= previousTo; i += 1) { + if (i < from || i > to) { + swiper.$wrapperEl + .find( + `.${swiper.params.slideClass}[data-swiper-slide-index="${i}"]`, + ) + .remove(); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + if (i >= from && i <= to) { + if (typeof previousTo === "undefined" || force) { + appendIndexes.push(i); + } else { + if (i > previousTo) appendIndexes.push(i); + if (i < previousFrom) prependIndexes.push(i); + } + } + } + + appendIndexes.forEach((index) => { + swiper.$wrapperEl.append(renderSlide(slides[index], index)); + }); + prependIndexes + .sort((a, b) => b - a) + .forEach((index) => { + swiper.$wrapperEl.prepend(renderSlide(slides[index], index)); + }); + swiper.$wrapperEl + .children(".swiper-slide") + .css(offsetProp, `${offset}px`); + onRendered(); + } + + function appendSlide(slides) { + if (typeof slides === "object" && "length" in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.push(slides[i]); + } + } else { + swiper.virtual.slides.push(slides); + } + + update(true); + } + + function prependSlide(slides) { + const activeIndex = swiper.activeIndex; + let newActiveIndex = activeIndex + 1; + let numberOfNewSlides = 1; + + if (Array.isArray(slides)) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) swiper.virtual.slides.unshift(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + numberOfNewSlides = slides.length; + } else { + swiper.virtual.slides.unshift(slides); + } + + if (swiper.params.virtual.cache) { + const cache = swiper.virtual.cache; + const newCache = {}; + Object.keys(cache).forEach((cachedIndex) => { + const $cachedEl = cache[cachedIndex]; + const cachedElIndex = $cachedEl.attr("data-swiper-slide-index"); + + if (cachedElIndex) { + $cachedEl.attr( + "data-swiper-slide-index", + parseInt(cachedElIndex, 10) + numberOfNewSlides, + ); + } + + newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl; + }); + swiper.virtual.cache = newCache; + } + + update(true); + swiper.slideTo(newActiveIndex, 0); + } + + function removeSlide(slidesIndexes) { + if (typeof slidesIndexes === "undefined" || slidesIndexes === null) + return; + let activeIndex = swiper.activeIndex; + + if (Array.isArray(slidesIndexes)) { + for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) { + swiper.virtual.slides.splice(slidesIndexes[i], 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes[i]]; + } + + if (slidesIndexes[i] < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + } else { + swiper.virtual.slides.splice(slidesIndexes, 1); + + if (swiper.params.virtual.cache) { + delete swiper.virtual.cache[slidesIndexes]; + } + + if (slidesIndexes < activeIndex) activeIndex -= 1; + activeIndex = Math.max(activeIndex, 0); + } + + update(true); + swiper.slideTo(activeIndex, 0); + } + + function removeAllSlides() { + swiper.virtual.slides = []; + + if (swiper.params.virtual.cache) { + swiper.virtual.cache = {}; + } + + update(true); + swiper.slideTo(0, 0); + } + + on("beforeInit", () => { + if (!swiper.params.virtual.enabled) return; + swiper.virtual.slides = swiper.params.virtual.slides; + swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`); + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + + if (!swiper.params.initialSlide) { + update(); + } + }); + on("setTranslate", () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode && !swiper._immediateVirtual) { + clearTimeout(cssModeTimeout); + cssModeTimeout = setTimeout(() => { + update(); + }, 100); + } else { + update(); + } + }); + on("init update resize", () => { + if (!swiper.params.virtual.enabled) return; + + if (swiper.params.cssMode) { + setCSSProperty( + swiper.wrapperEl, + "--swiper-virtual-size", + `${swiper.virtualSize}px`, + ); + } + }); + Object.assign(swiper.virtual, { + appendSlide, + prependSlide, + removeSlide, + removeAllSlides, + update, + }); + } + + /* eslint-disable consistent-return */ + function Keyboard(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const document = getDocument(); + const window = getWindow(); + swiper.keyboard = { + enabled: false, + }; + extendParams({ + keyboard: { + enabled: false, + onlyInViewport: true, + pageUpDown: true, + }, + }); + + function handle(event) { + if (!swiper.enabled) return; + const { rtlTranslate: rtl } = swiper; + let e = event; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + const kc = e.keyCode || e.charCode; + const pageUpDown = swiper.params.keyboard.pageUpDown; + const isPageUp = pageUpDown && kc === 33; + const isPageDown = pageUpDown && kc === 34; + const isArrowLeft = kc === 37; + const isArrowRight = kc === 39; + const isArrowUp = kc === 38; + const isArrowDown = kc === 40; // Directions locks + + if ( + !swiper.allowSlideNext && + ((swiper.isHorizontal() && isArrowRight) || + (swiper.isVertical() && isArrowDown) || + isPageDown) + ) { + return false; + } + + if ( + !swiper.allowSlidePrev && + ((swiper.isHorizontal() && isArrowLeft) || + (swiper.isVertical() && isArrowUp) || + isPageUp) + ) { + return false; + } + + if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { + return undefined; + } + + if ( + document.activeElement && + document.activeElement.nodeName && + (document.activeElement.nodeName.toLowerCase() === "input" || + document.activeElement.nodeName.toLowerCase() === "textarea") + ) { + return undefined; + } + + if ( + swiper.params.keyboard.onlyInViewport && + (isPageUp || + isPageDown || + isArrowLeft || + isArrowRight || + isArrowUp || + isArrowDown) + ) { + let inView = false; // Check that swiper should be inside of visible area of window + + if ( + swiper.$el.parents(`.${swiper.params.slideClass}`).length > 0 && + swiper.$el.parents(`.${swiper.params.slideActiveClass}`).length === 0 + ) { + return undefined; + } + + const $el = swiper.$el; + const swiperWidth = $el[0].clientWidth; + const swiperHeight = $el[0].clientHeight; + const windowWidth = window.innerWidth; + const windowHeight = window.innerHeight; + const swiperOffset = swiper.$el.offset(); + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + swiperWidth, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + swiperHeight], + [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight], + ]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if ( + point[0] >= 0 && + point[0] <= windowWidth && + point[1] >= 0 && + point[1] <= windowHeight + ) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + if (!inView) return undefined; + } + + if (swiper.isHorizontal()) { + if (isPageUp || isPageDown || isArrowLeft || isArrowRight) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + + if ( + ((isPageDown || isArrowRight) && !rtl) || + ((isPageUp || isArrowLeft) && rtl) + ) + swiper.slideNext(); + if ( + ((isPageUp || isArrowLeft) && !rtl) || + ((isPageDown || isArrowRight) && rtl) + ) + swiper.slidePrev(); + } else { + if (isPageUp || isPageDown || isArrowUp || isArrowDown) { + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + } + + if (isPageDown || isArrowDown) swiper.slideNext(); + if (isPageUp || isArrowUp) swiper.slidePrev(); + } + + emit("keyPress", kc); + return undefined; + } + + function enable() { + if (swiper.keyboard.enabled) return; + $(document).on("keydown", handle); + swiper.keyboard.enabled = true; + } + + function disable() { + if (!swiper.keyboard.enabled) return; + $(document).off("keydown", handle); + swiper.keyboard.enabled = false; + } + + on("init", () => { + if (swiper.params.keyboard.enabled) { + enable(); + } + }); + on("destroy", () => { + if (swiper.keyboard.enabled) { + disable(); + } + }); + Object.assign(swiper.keyboard, { + enable, + disable, + }); + } + + /* eslint-disable consistent-return */ + function Mousewheel(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const window = getWindow(); + extendParams({ + mousewheel: { + enabled: false, + releaseOnEdges: false, + invert: false, + forceToAxis: false, + sensitivity: 1, + eventsTarget: "container", + thresholdDelta: null, + thresholdTime: null, + }, + }); + swiper.mousewheel = { + enabled: false, + }; + let timeout; + let lastScrollTime = now(); + let lastEventBeforeSnap; + const recentWheelEvents = []; + + function normalize(e) { + // Reasonable defaults + const PIXEL_STEP = 10; + const LINE_HEIGHT = 40; + const PAGE_HEIGHT = 800; + let sX = 0; + let sY = 0; // spinX, spinY + + let pX = 0; + let pY = 0; // pixelX, pixelY + // Legacy + + if ("detail" in e) { + sY = e.detail; + } + + if ("wheelDelta" in e) { + sY = -e.wheelDelta / 120; + } + + if ("wheelDeltaY" in e) { + sY = -e.wheelDeltaY / 120; + } + + if ("wheelDeltaX" in e) { + sX = -e.wheelDeltaX / 120; + } // side scrolling on FF with DOMMouseScroll + + if ("axis" in e && e.axis === e.HORIZONTAL_AXIS) { + sX = sY; + sY = 0; + } + + pX = sX * PIXEL_STEP; + pY = sY * PIXEL_STEP; + + if ("deltaY" in e) { + pY = e.deltaY; + } + + if ("deltaX" in e) { + pX = e.deltaX; + } + + if (e.shiftKey && !pX) { + // if user scrolls with shift he wants horizontal scroll + pX = pY; + pY = 0; + } + + if ((pX || pY) && e.deltaMode) { + if (e.deltaMode === 1) { + // delta in LINE units + pX *= LINE_HEIGHT; + pY *= LINE_HEIGHT; + } else { + // delta in PAGE units + pX *= PAGE_HEIGHT; + pY *= PAGE_HEIGHT; + } + } // Fall-back if spin cannot be determined + + if (pX && !sX) { + sX = pX < 1 ? -1 : 1; + } + + if (pY && !sY) { + sY = pY < 1 ? -1 : 1; + } + + return { + spinX: sX, + spinY: sY, + pixelX: pX, + pixelY: pY, + }; + } + + function handleMouseEnter() { + if (!swiper.enabled) return; + swiper.mouseEntered = true; + } + + function handleMouseLeave() { + if (!swiper.enabled) return; + swiper.mouseEntered = false; + } + + function animateSlider(newEvent) { + if ( + swiper.params.mousewheel.thresholdDelta && + newEvent.delta < swiper.params.mousewheel.thresholdDelta + ) { + // Prevent if delta of wheel scroll delta is below configured threshold + return false; + } + + if ( + swiper.params.mousewheel.thresholdTime && + now() - lastScrollTime < swiper.params.mousewheel.thresholdTime + ) { + // Prevent if time between scrolls is below configured threshold + return false; + } // If the movement is NOT big enough and + // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider): + // Don't go any further (avoid insignificant scroll movement). + + if (newEvent.delta >= 6 && now() - lastScrollTime < 60) { + // Return false as a default + return true; + } // If user is scrolling towards the end: + // If the slider hasn't hit the latest slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to next slide and + // emit a scroll event. + // Else (the user is scrolling towards the beginning) and + // if the slider hasn't hit the first slide or + // if the slider is a loop and + // if the slider isn't moving right now: + // Go to prev slide and + // emit a scroll event. + + if (newEvent.direction < 0) { + if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) { + swiper.slideNext(); + emit("scroll", newEvent.raw); + } + } else if ( + (!swiper.isBeginning || swiper.params.loop) && + !swiper.animating + ) { + swiper.slidePrev(); + emit("scroll", newEvent.raw); + } // If you got here is because an animation has been triggered so store the current time + + lastScrollTime = new window.Date().getTime(); // Return false as a default + + return false; + } + + function releaseScroll(newEvent) { + const params = swiper.params.mousewheel; + + if (newEvent.direction < 0) { + if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) { + // Return true to animate scroll on edges + return true; + } + } else if ( + swiper.isBeginning && + !swiper.params.loop && + params.releaseOnEdges + ) { + // Return true to animate scroll on edges + return true; + } + + return false; + } + + function handle(event) { + let e = event; + let disableParentSwiper = true; + if (!swiper.enabled) return; + const params = swiper.params.mousewheel; + + if (swiper.params.cssMode) { + e.preventDefault(); + } + + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== "container") { + target = $(swiper.params.mousewheel.eventsTarget); + } + + if ( + !swiper.mouseEntered && + !target[0].contains(e.target) && + !params.releaseOnEdges + ) + return true; + if (e.originalEvent) e = e.originalEvent; // jquery fix + + let delta = 0; + const rtlFactor = swiper.rtlTranslate ? -1 : 1; + const data = normalize(e); + + if (params.forceToAxis) { + if (swiper.isHorizontal()) { + if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) + delta = -data.pixelX * rtlFactor; + else return true; + } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) + delta = -data.pixelY; + else return true; + } else { + delta = + Math.abs(data.pixelX) > Math.abs(data.pixelY) + ? -data.pixelX * rtlFactor + : -data.pixelY; + } + + if (delta === 0) return true; + if (params.invert) delta = -delta; // Get the scroll positions + + let positions = swiper.getTranslate() + delta * params.sensitivity; + if (positions >= swiper.minTranslate()) positions = swiper.minTranslate(); + if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true: + // the disableParentSwiper will be true. + // When loop is false: + // if the scroll positions is not on edge, + // then the disableParentSwiper will be true. + // if the scroll on edge positions, + // then the disableParentSwiper will be false. + + disableParentSwiper = swiper.params.loop + ? true + : !( + positions === swiper.minTranslate() || + positions === swiper.maxTranslate() + ); + if (disableParentSwiper && swiper.params.nested) e.stopPropagation(); + + if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) { + // Register the new event in a variable which stores the relevant data + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta), + raw: event, + }; // Keep the most recent events + + if (recentWheelEvents.length >= 2) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length + ? recentWheelEvents[recentWheelEvents.length - 1] + : undefined; + recentWheelEvents.push(newEvent); // If there is at least one previous recorded event: + // If direction has changed or + // if the scroll is quicker than the previous one: + // Animate the slider. + // Else (this is the first time the wheel is moved): + // Animate the slider. + + if (prevEvent) { + if ( + newEvent.direction !== prevEvent.direction || + newEvent.delta > prevEvent.delta || + newEvent.time > prevEvent.time + 150 + ) { + animateSlider(newEvent); + } + } else { + animateSlider(newEvent); + } // If it's time to release the scroll: + // Return now so you don't hit the preventDefault. + + if (releaseScroll(newEvent)) { + return true; + } + } else { + // Freemode or scrollContainer: + // If we recently snapped after a momentum scroll, then ignore wheel events + // to give time for the deceleration to finish. Stop ignoring after 500 msecs + // or if it's a new scroll (larger delta or inverse sign as last event before + // an end-of-momentum snap). + const newEvent = { + time: now(), + delta: Math.abs(delta), + direction: Math.sign(delta), + }; + const ignoreWheelEvents = + lastEventBeforeSnap && + newEvent.time < lastEventBeforeSnap.time + 500 && + newEvent.delta <= lastEventBeforeSnap.delta && + newEvent.direction === lastEventBeforeSnap.direction; + + if (!ignoreWheelEvents) { + lastEventBeforeSnap = undefined; + + if (swiper.params.loop) { + swiper.loopFix(); + } + + let position = swiper.getTranslate() + delta * params.sensitivity; + const wasBeginning = swiper.isBeginning; + const wasEnd = swiper.isEnd; + if (position >= swiper.minTranslate()) + position = swiper.minTranslate(); + if (position <= swiper.maxTranslate()) + position = swiper.maxTranslate(); + swiper.setTransition(0); + swiper.setTranslate(position); + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + + if ( + (!wasBeginning && swiper.isBeginning) || + (!wasEnd && swiper.isEnd) + ) { + swiper.updateSlidesClasses(); + } + + if (swiper.params.freeMode.sticky) { + // When wheel scrolling starts with sticky (aka snap) enabled, then detect + // the end of a momentum scroll by storing recent (N=15?) wheel events. + // 1. do all N events have decreasing or same (absolute value) delta? + // 2. did all N events arrive in the last M (M=500?) msecs? + // 3. does the earliest event have an (absolute value) delta that's + // at least P (P=1?) larger than the most recent event's delta? + // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels? + // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration. + // Snap immediately and ignore remaining wheel events in this scroll. + // See comment above for "remaining wheel events in this scroll" determination. + // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event. + clearTimeout(timeout); + timeout = undefined; + + if (recentWheelEvents.length >= 15) { + recentWheelEvents.shift(); // only store the last N events + } + + const prevEvent = recentWheelEvents.length + ? recentWheelEvents[recentWheelEvents.length - 1] + : undefined; + const firstEvent = recentWheelEvents[0]; + recentWheelEvents.push(newEvent); + + if ( + prevEvent && + (newEvent.delta > prevEvent.delta || + newEvent.direction !== prevEvent.direction) + ) { + // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log. + recentWheelEvents.splice(0); + } else if ( + recentWheelEvents.length >= 15 && + newEvent.time - firstEvent.time < 500 && + firstEvent.delta - newEvent.delta >= 1 && + newEvent.delta <= 6 + ) { + // We're at the end of the deceleration of a momentum scroll, so there's no need + // to wait for more events. Snap ASAP on the next tick. + // Also, because there's some remaining momentum we'll bias the snap in the + // direction of the ongoing scroll because it's better UX for the scroll to snap + // in the same direction as the scroll instead of reversing to snap. Therefore, + // if it's already scrolled more than 20% in the current direction, keep going. + const snapToThreshold = delta > 0 ? 0.8 : 0.2; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + timeout = nextTick(() => { + swiper.slideToClosest( + swiper.params.speed, + true, + undefined, + snapToThreshold, + ); + }, 0); // no delay; move on next tick + } + + if (!timeout) { + // if we get here, then we haven't detected the end of a momentum scroll, so + // we'll consider a scroll "complete" when there haven't been any wheel events + // for 500ms. + timeout = nextTick(() => { + const snapToThreshold = 0.5; + lastEventBeforeSnap = newEvent; + recentWheelEvents.splice(0); + swiper.slideToClosest( + swiper.params.speed, + true, + undefined, + snapToThreshold, + ); + }, 500); + } + } // Emit event + + if (!ignoreWheelEvents) emit("scroll", e); // Stop autoplay + + if ( + swiper.params.autoplay && + swiper.params.autoplayDisableOnInteraction + ) + swiper.autoplay.stop(); // Return page scroll on edge positions + + if ( + position === swiper.minTranslate() || + position === swiper.maxTranslate() + ) + return true; + } + } + + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + return false; + } + + function events(method) { + let target = swiper.$el; + + if (swiper.params.mousewheel.eventsTarget !== "container") { + target = $(swiper.params.mousewheel.eventsTarget); + } + + target[method]("mouseenter", handleMouseEnter); + target[method]("mouseleave", handleMouseLeave); + target[method]("wheel", handle); + } + + function enable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.removeEventListener("wheel", handle); + return true; + } + + if (swiper.mousewheel.enabled) return false; + events("on"); + swiper.mousewheel.enabled = true; + return true; + } + + function disable() { + if (swiper.params.cssMode) { + swiper.wrapperEl.addEventListener(event, handle); + return true; + } + + if (!swiper.mousewheel.enabled) return false; + events("off"); + swiper.mousewheel.enabled = false; + return true; + } + + on("init", () => { + if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) { + disable(); + } + + if (swiper.params.mousewheel.enabled) enable(); + }); + on("destroy", () => { + if (swiper.params.cssMode) { + enable(); + } + + if (swiper.mousewheel.enabled) disable(); + }); + Object.assign(swiper.mousewheel, { + enable, + disable, + }); + } + + function createElementIfNotDefined( + swiper, + originalParams, + params, + checkProps, + ) { + const document = getDocument(); + + if (swiper.params.createElements) { + Object.keys(checkProps).forEach((key) => { + if (!params[key] && params.auto === true) { + let element = swiper.$el.children(`.${checkProps[key]}`)[0]; + + if (!element) { + element = document.createElement("div"); + element.className = checkProps[key]; + swiper.$el.append(element); + } + + params[key] = element; + originalParams[key] = element; + } + }); + } + + return params; + } + + function Navigation(_ref) { + let { swiper, extendParams, on, emit } = _ref; + extendParams({ + navigation: { + nextEl: null, + prevEl: null, + hideOnClick: false, + disabledClass: "swiper-button-disabled", + hiddenClass: "swiper-button-hidden", + lockClass: "swiper-button-lock", + }, + }); + swiper.navigation = { + nextEl: null, + $nextEl: null, + prevEl: null, + $prevEl: null, + }; + + function getEl(el) { + let $el; + + if (el) { + $el = $(el); + + if ( + swiper.params.uniqueNavElements && + typeof el === "string" && + $el.length > 1 && + swiper.$el.find(el).length === 1 + ) { + $el = swiper.$el.find(el); + } + } + + return $el; + } + + function toggleEl($el, disabled) { + const params = swiper.params.navigation; + + if ($el && $el.length > 0) { + $el[disabled ? "addClass" : "removeClass"](params.disabledClass); + if ($el[0] && $el[0].tagName === "BUTTON") $el[0].disabled = disabled; + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? "addClass" : "removeClass"](params.lockClass); + } + } + } + + function update() { + // Update Navigation Buttons + if (swiper.params.loop) return; + const { $nextEl, $prevEl } = swiper.navigation; + toggleEl($prevEl, swiper.isBeginning && !swiper.params.rewind); + toggleEl($nextEl, swiper.isEnd && !swiper.params.rewind); + } + + function onPrevClick(e) { + e.preventDefault(); + if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) + return; + swiper.slidePrev(); + } + + function onNextClick(e) { + e.preventDefault(); + if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return; + swiper.slideNext(); + } + + function init() { + const params = swiper.params.navigation; + swiper.params.navigation = createElementIfNotDefined( + swiper, + swiper.originalParams.navigation, + swiper.params.navigation, + { + nextEl: "swiper-button-next", + prevEl: "swiper-button-prev", + }, + ); + if (!(params.nextEl || params.prevEl)) return; + const $nextEl = getEl(params.nextEl); + const $prevEl = getEl(params.prevEl); + + if ($nextEl && $nextEl.length > 0) { + $nextEl.on("click", onNextClick); + } + + if ($prevEl && $prevEl.length > 0) { + $prevEl.on("click", onPrevClick); + } + + Object.assign(swiper.navigation, { + $nextEl, + nextEl: $nextEl && $nextEl[0], + $prevEl, + prevEl: $prevEl && $prevEl[0], + }); + + if (!swiper.enabled) { + if ($nextEl) $nextEl.addClass(params.lockClass); + if ($prevEl) $prevEl.addClass(params.lockClass); + } + } + + function destroy() { + const { $nextEl, $prevEl } = swiper.navigation; + + if ($nextEl && $nextEl.length) { + $nextEl.off("click", onNextClick); + $nextEl.removeClass(swiper.params.navigation.disabledClass); + } + + if ($prevEl && $prevEl.length) { + $prevEl.off("click", onPrevClick); + $prevEl.removeClass(swiper.params.navigation.disabledClass); + } + } + + on("init", () => { + init(); + update(); + }); + on("toEdge fromEdge lock unlock", () => { + update(); + }); + on("destroy", () => { + destroy(); + }); + on("enable disable", () => { + const { $nextEl, $prevEl } = swiper.navigation; + + if ($nextEl) { + $nextEl[swiper.enabled ? "removeClass" : "addClass"]( + swiper.params.navigation.lockClass, + ); + } + + if ($prevEl) { + $prevEl[swiper.enabled ? "removeClass" : "addClass"]( + swiper.params.navigation.lockClass, + ); + } + }); + on("click", (_s, e) => { + const { $nextEl, $prevEl } = swiper.navigation; + const targetEl = e.target; + + if ( + swiper.params.navigation.hideOnClick && + !$(targetEl).is($prevEl) && + !$(targetEl).is($nextEl) + ) { + if ( + swiper.pagination && + swiper.params.pagination && + swiper.params.pagination.clickable && + (swiper.pagination.el === targetEl || + swiper.pagination.el.contains(targetEl)) + ) + return; + let isHidden; + + if ($nextEl) { + isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass); + } else if ($prevEl) { + isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass); + } + + if (isHidden === true) { + emit("navigationShow"); + } else { + emit("navigationHide"); + } + + if ($nextEl) { + $nextEl.toggleClass(swiper.params.navigation.hiddenClass); + } + + if ($prevEl) { + $prevEl.toggleClass(swiper.params.navigation.hiddenClass); + } + } + }); + Object.assign(swiper.navigation, { + update, + init, + destroy, + }); + } + + function classesToSelector(classes) { + if (classes === void 0) { + classes = ""; + } + + return `.${classes + .trim() + .replace(/([\.:!\/])/g, "\\$1") // eslint-disable-line + .replace(/ /g, ".")}`; + } + + function Pagination(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const pfx = "swiper-pagination"; + extendParams({ + pagination: { + el: null, + bulletElement: "span", + clickable: false, + hideOnClick: false, + renderBullet: null, + renderProgressbar: null, + renderFraction: null, + renderCustom: null, + progressbarOpposite: false, + type: "bullets", + // 'bullets' or 'progressbar' or 'fraction' or 'custom' + dynamicBullets: false, + dynamicMainBullets: 1, + formatFractionCurrent: (number) => number, + formatFractionTotal: (number) => number, + bulletClass: `${pfx}-bullet`, + bulletActiveClass: `${pfx}-bullet-active`, + modifierClass: `${pfx}-`, + currentClass: `${pfx}-current`, + totalClass: `${pfx}-total`, + hiddenClass: `${pfx}-hidden`, + progressbarFillClass: `${pfx}-progressbar-fill`, + progressbarOppositeClass: `${pfx}-progressbar-opposite`, + clickableClass: `${pfx}-clickable`, + lockClass: `${pfx}-lock`, + horizontalClass: `${pfx}-horizontal`, + verticalClass: `${pfx}-vertical`, + }, + }); + swiper.pagination = { + el: null, + $el: null, + bullets: [], + }; + let bulletSize; + let dynamicBulletIndex = 0; + + function isPaginationDisabled() { + return ( + !swiper.params.pagination.el || + !swiper.pagination.el || + !swiper.pagination.$el || + swiper.pagination.$el.length === 0 + ); + } + + function setSideBullets($bulletEl, position) { + const { bulletActiveClass } = swiper.params.pagination; + $bulletEl[position]() + .addClass(`${bulletActiveClass}-${position}`) + [position]() + .addClass(`${bulletActiveClass}-${position}-${position}`); + } + + function update() { + // Render || Update Pagination bullets/items + const rtl = swiper.rtl; + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = + swiper.virtual && swiper.params.virtual.enabled + ? swiper.virtual.slides.length + : swiper.slides.length; + const $el = swiper.pagination.$el; // Current/Total + + let current; + const total = swiper.params.loop + ? Math.ceil( + (slidesLength - swiper.loopedSlides * 2) / + swiper.params.slidesPerGroup, + ) + : swiper.snapGrid.length; + + if (swiper.params.loop) { + current = Math.ceil( + (swiper.activeIndex - swiper.loopedSlides) / + swiper.params.slidesPerGroup, + ); + + if (current > slidesLength - 1 - swiper.loopedSlides * 2) { + current -= slidesLength - swiper.loopedSlides * 2; + } + + if (current > total - 1) current -= total; + if (current < 0 && swiper.params.paginationType !== "bullets") + current = total + current; + } else if (typeof swiper.snapIndex !== "undefined") { + current = swiper.snapIndex; + } else { + current = swiper.activeIndex || 0; + } // Types + + if ( + params.type === "bullets" && + swiper.pagination.bullets && + swiper.pagination.bullets.length > 0 + ) { + const bullets = swiper.pagination.bullets; + let firstIndex; + let lastIndex; + let midIndex; + + if (params.dynamicBullets) { + bulletSize = bullets + .eq(0) + [swiper.isHorizontal() ? "outerWidth" : "outerHeight"](true); + $el.css( + swiper.isHorizontal() ? "width" : "height", + `${bulletSize * (params.dynamicMainBullets + 4)}px`, + ); + + if ( + params.dynamicMainBullets > 1 && + swiper.previousIndex !== undefined + ) { + dynamicBulletIndex += + current - (swiper.previousIndex - swiper.loopedSlides || 0); + + if (dynamicBulletIndex > params.dynamicMainBullets - 1) { + dynamicBulletIndex = params.dynamicMainBullets - 1; + } else if (dynamicBulletIndex < 0) { + dynamicBulletIndex = 0; + } + } + + firstIndex = Math.max(current - dynamicBulletIndex, 0); + lastIndex = + firstIndex + + (Math.min(bullets.length, params.dynamicMainBullets) - 1); + midIndex = (lastIndex + firstIndex) / 2; + } + + bullets.removeClass( + ["", "-next", "-next-next", "-prev", "-prev-prev", "-main"] + .map((suffix) => `${params.bulletActiveClass}${suffix}`) + .join(" "), + ); + + if ($el.length > 1) { + bullets.each((bullet) => { + const $bullet = $(bullet); + const bulletIndex = $bullet.index(); + + if (bulletIndex === current) { + $bullet.addClass(params.bulletActiveClass); + } + + if (params.dynamicBullets) { + if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) { + $bullet.addClass(`${params.bulletActiveClass}-main`); + } + + if (bulletIndex === firstIndex) { + setSideBullets($bullet, "prev"); + } + + if (bulletIndex === lastIndex) { + setSideBullets($bullet, "next"); + } + } + }); + } else { + const $bullet = bullets.eq(current); + const bulletIndex = $bullet.index(); + $bullet.addClass(params.bulletActiveClass); + + if (params.dynamicBullets) { + const $firstDisplayedBullet = bullets.eq(firstIndex); + const $lastDisplayedBullet = bullets.eq(lastIndex); + + for (let i = firstIndex; i <= lastIndex; i += 1) { + bullets.eq(i).addClass(`${params.bulletActiveClass}-main`); + } + + if (swiper.params.loop) { + if (bulletIndex >= bullets.length) { + for (let i = params.dynamicMainBullets; i >= 0; i -= 1) { + bullets + .eq(bullets.length - i) + .addClass(`${params.bulletActiveClass}-main`); + } + + bullets + .eq(bullets.length - params.dynamicMainBullets - 1) + .addClass(`${params.bulletActiveClass}-prev`); + } else { + setSideBullets($firstDisplayedBullet, "prev"); + setSideBullets($lastDisplayedBullet, "next"); + } + } else { + setSideBullets($firstDisplayedBullet, "prev"); + setSideBullets($lastDisplayedBullet, "next"); + } + } + } + + if (params.dynamicBullets) { + const dynamicBulletsLength = Math.min( + bullets.length, + params.dynamicMainBullets + 4, + ); + const bulletsOffset = + (bulletSize * dynamicBulletsLength - bulletSize) / 2 - + midIndex * bulletSize; + const offsetProp = rtl ? "right" : "left"; + bullets.css( + swiper.isHorizontal() ? offsetProp : "top", + `${bulletsOffset}px`, + ); + } + } + + if (params.type === "fraction") { + $el + .find(classesToSelector(params.currentClass)) + .text(params.formatFractionCurrent(current + 1)); + $el + .find(classesToSelector(params.totalClass)) + .text(params.formatFractionTotal(total)); + } + + if (params.type === "progressbar") { + let progressbarDirection; + + if (params.progressbarOpposite) { + progressbarDirection = swiper.isHorizontal() + ? "vertical" + : "horizontal"; + } else { + progressbarDirection = swiper.isHorizontal() + ? "horizontal" + : "vertical"; + } + + const scale = (current + 1) / total; + let scaleX = 1; + let scaleY = 1; + + if (progressbarDirection === "horizontal") { + scaleX = scale; + } else { + scaleY = scale; + } + + $el + .find(classesToSelector(params.progressbarFillClass)) + .transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`) + .transition(swiper.params.speed); + } + + if (params.type === "custom" && params.renderCustom) { + $el.html(params.renderCustom(swiper, current + 1, total)); + emit("paginationRender", $el[0]); + } else { + emit("paginationUpdate", $el[0]); + } + + if (swiper.params.watchOverflow && swiper.enabled) { + $el[swiper.isLocked ? "addClass" : "removeClass"](params.lockClass); + } + } + + function render() { + // Render Container + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const slidesLength = + swiper.virtual && swiper.params.virtual.enabled + ? swiper.virtual.slides.length + : swiper.slides.length; + const $el = swiper.pagination.$el; + let paginationHTML = ""; + + if (params.type === "bullets") { + let numberOfBullets = swiper.params.loop + ? Math.ceil( + (slidesLength - swiper.loopedSlides * 2) / + swiper.params.slidesPerGroup, + ) + : swiper.snapGrid.length; + + if ( + swiper.params.freeMode && + swiper.params.freeMode.enabled && + !swiper.params.loop && + numberOfBullets > slidesLength + ) { + numberOfBullets = slidesLength; + } + + for (let i = 0; i < numberOfBullets; i += 1) { + if (params.renderBullet) { + paginationHTML += params.renderBullet.call( + swiper, + i, + params.bulletClass, + ); + } else { + paginationHTML += `<${params.bulletElement} class="${params.bulletClass}">`; + } + } + + $el.html(paginationHTML); + swiper.pagination.bullets = $el.find( + classesToSelector(params.bulletClass), + ); + } + + if (params.type === "fraction") { + if (params.renderFraction) { + paginationHTML = params.renderFraction.call( + swiper, + params.currentClass, + params.totalClass, + ); + } else { + paginationHTML = + `` + + " / " + + ``; + } + + $el.html(paginationHTML); + } + + if (params.type === "progressbar") { + if (params.renderProgressbar) { + paginationHTML = params.renderProgressbar.call( + swiper, + params.progressbarFillClass, + ); + } else { + paginationHTML = ``; + } + + $el.html(paginationHTML); + } + + if (params.type !== "custom") { + emit("paginationRender", swiper.pagination.$el[0]); + } + } + + function init() { + swiper.params.pagination = createElementIfNotDefined( + swiper, + swiper.originalParams.pagination, + swiper.params.pagination, + { + el: "swiper-pagination", + }, + ); + const params = swiper.params.pagination; + if (!params.el) return; + let $el = $(params.el); + if ($el.length === 0) return; + + if ( + swiper.params.uniqueNavElements && + typeof params.el === "string" && + $el.length > 1 + ) { + $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper + + if ($el.length > 1) { + $el = $el.filter((el) => { + if ($(el).parents(".swiper")[0] !== swiper.el) return false; + return true; + }); + } + } + + if (params.type === "bullets" && params.clickable) { + $el.addClass(params.clickableClass); + } + + $el.addClass(params.modifierClass + params.type); + $el.addClass( + swiper.isHorizontal() ? params.horizontalClass : params.verticalClass, + ); + + if (params.type === "bullets" && params.dynamicBullets) { + $el.addClass(`${params.modifierClass}${params.type}-dynamic`); + dynamicBulletIndex = 0; + + if (params.dynamicMainBullets < 1) { + params.dynamicMainBullets = 1; + } + } + + if (params.type === "progressbar" && params.progressbarOpposite) { + $el.addClass(params.progressbarOppositeClass); + } + + if (params.clickable) { + $el.on( + "click", + classesToSelector(params.bulletClass), + function onClick(e) { + e.preventDefault(); + let index = $(this).index() * swiper.params.slidesPerGroup; + if (swiper.params.loop) index += swiper.loopedSlides; + swiper.slideTo(index); + }, + ); + } + + Object.assign(swiper.pagination, { + $el, + el: $el[0], + }); + + if (!swiper.enabled) { + $el.addClass(params.lockClass); + } + } + + function destroy() { + const params = swiper.params.pagination; + if (isPaginationDisabled()) return; + const $el = swiper.pagination.$el; + $el.removeClass(params.hiddenClass); + $el.removeClass(params.modifierClass + params.type); + $el.removeClass( + swiper.isHorizontal() ? params.horizontalClass : params.verticalClass, + ); + if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) + swiper.pagination.bullets.removeClass(params.bulletActiveClass); + + if (params.clickable) { + $el.off("click", classesToSelector(params.bulletClass)); + } + } + + on("init", () => { + init(); + render(); + update(); + }); + on("activeIndexChange", () => { + if (swiper.params.loop) { + update(); + } else if (typeof swiper.snapIndex === "undefined") { + update(); + } + }); + on("snapIndexChange", () => { + if (!swiper.params.loop) { + update(); + } + }); + on("slidesLengthChange", () => { + if (swiper.params.loop) { + render(); + update(); + } + }); + on("snapGridLengthChange", () => { + if (!swiper.params.loop) { + render(); + update(); + } + }); + on("destroy", () => { + destroy(); + }); + on("enable disable", () => { + const { $el } = swiper.pagination; + + if ($el) { + $el[swiper.enabled ? "removeClass" : "addClass"]( + swiper.params.pagination.lockClass, + ); + } + }); + on("lock unlock", () => { + update(); + }); + on("click", (_s, e) => { + const targetEl = e.target; + const { $el } = swiper.pagination; + + if ( + swiper.params.pagination.el && + swiper.params.pagination.hideOnClick && + $el.length > 0 && + !$(targetEl).hasClass(swiper.params.pagination.bulletClass) + ) { + if ( + swiper.navigation && + ((swiper.navigation.nextEl && + targetEl === swiper.navigation.nextEl) || + (swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) + ) + return; + const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass); + + if (isHidden === true) { + emit("paginationShow"); + } else { + emit("paginationHide"); + } + + $el.toggleClass(swiper.params.pagination.hiddenClass); + } + }); + Object.assign(swiper.pagination, { + render, + update, + init, + destroy, + }); + } + + function Scrollbar(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const document = getDocument(); + let isTouched = false; + let timeout = null; + let dragTimeout = null; + let dragStartPos; + let dragSize; + let trackSize; + let divider; + extendParams({ + scrollbar: { + el: null, + dragSize: "auto", + hide: false, + draggable: false, + snapOnRelease: true, + lockClass: "swiper-scrollbar-lock", + dragClass: "swiper-scrollbar-drag", + }, + }); + swiper.scrollbar = { + el: null, + dragEl: null, + $el: null, + $dragEl: null, + }; + + function setTranslate() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { scrollbar, rtlTranslate: rtl, progress } = swiper; + const { $dragEl, $el } = scrollbar; + const params = swiper.params.scrollbar; + let newSize = dragSize; + let newPos = (trackSize - dragSize) * progress; + + if (rtl) { + newPos = -newPos; + + if (newPos > 0) { + newSize = dragSize - newPos; + newPos = 0; + } else if (-newPos + dragSize > trackSize) { + newSize = trackSize + newPos; + } + } else if (newPos < 0) { + newSize = dragSize + newPos; + newPos = 0; + } else if (newPos + dragSize > trackSize) { + newSize = trackSize - newPos; + } + + if (swiper.isHorizontal()) { + $dragEl.transform(`translate3d(${newPos}px, 0, 0)`); + $dragEl[0].style.width = `${newSize}px`; + } else { + $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`); + $dragEl[0].style.height = `${newSize}px`; + } + + if (params.hide) { + clearTimeout(timeout); + $el[0].style.opacity = 1; + timeout = setTimeout(() => { + $el[0].style.opacity = 0; + $el.transition(400); + }, 1000); + } + } + + function setTransition(duration) { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + swiper.scrollbar.$dragEl.transition(duration); + } + + function updateSize() { + if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return; + const { scrollbar } = swiper; + const { $dragEl, $el } = scrollbar; + $dragEl[0].style.width = ""; + $dragEl[0].style.height = ""; + trackSize = swiper.isHorizontal() + ? $el[0].offsetWidth + : $el[0].offsetHeight; + divider = + swiper.size / + (swiper.virtualSize + + swiper.params.slidesOffsetBefore - + (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0)); + + if (swiper.params.scrollbar.dragSize === "auto") { + dragSize = trackSize * divider; + } else { + dragSize = parseInt(swiper.params.scrollbar.dragSize, 10); + } + + if (swiper.isHorizontal()) { + $dragEl[0].style.width = `${dragSize}px`; + } else { + $dragEl[0].style.height = `${dragSize}px`; + } + + if (divider >= 1) { + $el[0].style.display = "none"; + } else { + $el[0].style.display = ""; + } + + if (swiper.params.scrollbar.hide) { + $el[0].style.opacity = 0; + } + + if (swiper.params.watchOverflow && swiper.enabled) { + scrollbar.$el[swiper.isLocked ? "addClass" : "removeClass"]( + swiper.params.scrollbar.lockClass, + ); + } + } + + function getPointerPosition(e) { + if (swiper.isHorizontal()) { + return e.type === "touchstart" || e.type === "touchmove" + ? e.targetTouches[0].clientX + : e.clientX; + } + + return e.type === "touchstart" || e.type === "touchmove" + ? e.targetTouches[0].clientY + : e.clientY; + } + + function setDragPosition(e) { + const { scrollbar, rtlTranslate: rtl } = swiper; + const { $el } = scrollbar; + let positionRatio; + positionRatio = + (getPointerPosition(e) - + $el.offset()[swiper.isHorizontal() ? "left" : "top"] - + (dragStartPos !== null ? dragStartPos : dragSize / 2)) / + (trackSize - dragSize); + positionRatio = Math.max(Math.min(positionRatio, 1), 0); + + if (rtl) { + positionRatio = 1 - positionRatio; + } + + const position = + swiper.minTranslate() + + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio; + swiper.updateProgress(position); + swiper.setTranslate(position); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + + function onDragStart(e) { + const params = swiper.params.scrollbar; + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + isTouched = true; + dragStartPos = + e.target === $dragEl[0] || e.target === $dragEl + ? getPointerPosition(e) - + e.target.getBoundingClientRect()[ + swiper.isHorizontal() ? "left" : "top" + ] + : null; + e.preventDefault(); + e.stopPropagation(); + $wrapperEl.transition(100); + $dragEl.transition(100); + setDragPosition(e); + clearTimeout(dragTimeout); + $el.transition(0); + + if (params.hide) { + $el.css("opacity", 1); + } + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css("scroll-snap-type", "none"); + } + + emit("scrollbarDragStart", e); + } + + function onDragMove(e) { + const { scrollbar, $wrapperEl } = swiper; + const { $el, $dragEl } = scrollbar; + if (!isTouched) return; + if (e.preventDefault) e.preventDefault(); + else e.returnValue = false; + setDragPosition(e); + $wrapperEl.transition(0); + $el.transition(0); + $dragEl.transition(0); + emit("scrollbarDragMove", e); + } + + function onDragEnd(e) { + const params = swiper.params.scrollbar; + const { scrollbar, $wrapperEl } = swiper; + const { $el } = scrollbar; + if (!isTouched) return; + isTouched = false; + + if (swiper.params.cssMode) { + swiper.$wrapperEl.css("scroll-snap-type", ""); + $wrapperEl.transition(""); + } + + if (params.hide) { + clearTimeout(dragTimeout); + dragTimeout = nextTick(() => { + $el.css("opacity", 0); + $el.transition(400); + }, 1000); + } + + emit("scrollbarDragEnd", e); + + if (params.snapOnRelease) { + swiper.slideToClosest(); + } + } + + function events(method) { + const { + scrollbar, + touchEventsTouch, + touchEventsDesktop, + params, + support, + } = swiper; + const $el = scrollbar.$el; + const target = $el[0]; + const activeListener = + support.passiveListener && params.passiveListeners + ? { + passive: false, + capture: false, + } + : false; + const passiveListener = + support.passiveListener && params.passiveListeners + ? { + passive: true, + capture: false, + } + : false; + if (!target) return; + const eventMethod = + method === "on" ? "addEventListener" : "removeEventListener"; + + if (!support.touch) { + target[eventMethod]( + touchEventsDesktop.start, + onDragStart, + activeListener, + ); + document[eventMethod]( + touchEventsDesktop.move, + onDragMove, + activeListener, + ); + document[eventMethod]( + touchEventsDesktop.end, + onDragEnd, + passiveListener, + ); + } else { + target[eventMethod]( + touchEventsTouch.start, + onDragStart, + activeListener, + ); + target[eventMethod](touchEventsTouch.move, onDragMove, activeListener); + target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener); + } + } + + function enableDraggable() { + if (!swiper.params.scrollbar.el) return; + events("on"); + } + + function disableDraggable() { + if (!swiper.params.scrollbar.el) return; + events("off"); + } + + function init() { + const { scrollbar, $el: $swiperEl } = swiper; + swiper.params.scrollbar = createElementIfNotDefined( + swiper, + swiper.originalParams.scrollbar, + swiper.params.scrollbar, + { + el: "swiper-scrollbar", + }, + ); + const params = swiper.params.scrollbar; + if (!params.el) return; + let $el = $(params.el); + + if ( + swiper.params.uniqueNavElements && + typeof params.el === "string" && + $el.length > 1 && + $swiperEl.find(params.el).length === 1 + ) { + $el = $swiperEl.find(params.el); + } + + let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`); + + if ($dragEl.length === 0) { + $dragEl = $(`
`); + $el.append($dragEl); + } + + Object.assign(scrollbar, { + $el, + el: $el[0], + $dragEl, + dragEl: $dragEl[0], + }); + + if (params.draggable) { + enableDraggable(); + } + + if ($el) { + $el[swiper.enabled ? "removeClass" : "addClass"]( + swiper.params.scrollbar.lockClass, + ); + } + } + + function destroy() { + disableDraggable(); + } + + on("init", () => { + init(); + updateSize(); + setTranslate(); + }); + on("update resize observerUpdate lock unlock", () => { + updateSize(); + }); + on("setTranslate", () => { + setTranslate(); + }); + on("setTransition", (_s, duration) => { + setTransition(duration); + }); + on("enable disable", () => { + const { $el } = swiper.scrollbar; + + if ($el) { + $el[swiper.enabled ? "removeClass" : "addClass"]( + swiper.params.scrollbar.lockClass, + ); + } + }); + on("destroy", () => { + destroy(); + }); + Object.assign(swiper.scrollbar, { + updateSize, + setTranslate, + init, + destroy, + }); + } + + function Parallax(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + parallax: { + enabled: false, + }, + }); + + const setTransform = (el, progress) => { + const { rtl } = swiper; + const $el = $(el); + const rtlFactor = rtl ? -1 : 1; + const p = $el.attr("data-swiper-parallax") || "0"; + let x = $el.attr("data-swiper-parallax-x"); + let y = $el.attr("data-swiper-parallax-y"); + const scale = $el.attr("data-swiper-parallax-scale"); + const opacity = $el.attr("data-swiper-parallax-opacity"); + + if (x || y) { + x = x || "0"; + y = y || "0"; + } else if (swiper.isHorizontal()) { + x = p; + y = "0"; + } else { + y = p; + x = "0"; + } + + if (x.indexOf("%") >= 0) { + x = `${parseInt(x, 10) * progress * rtlFactor}%`; + } else { + x = `${x * progress * rtlFactor}px`; + } + + if (y.indexOf("%") >= 0) { + y = `${parseInt(y, 10) * progress}%`; + } else { + y = `${y * progress}px`; + } + + if (typeof opacity !== "undefined" && opacity !== null) { + const currentOpacity = + opacity - (opacity - 1) * (1 - Math.abs(progress)); + $el[0].style.opacity = currentOpacity; + } + + if (typeof scale === "undefined" || scale === null) { + $el.transform(`translate3d(${x}, ${y}, 0px)`); + } else { + const currentScale = scale - (scale - 1) * (1 - Math.abs(progress)); + $el.transform(`translate3d(${x}, ${y}, 0px) scale(${currentScale})`); + } + }; + + const setTranslate = () => { + const { $el, slides, progress, snapGrid } = swiper; + $el + .children( + "[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]", + ) + .each((el) => { + setTransform(el, progress); + }); + slides.each((slideEl, slideIndex) => { + let slideProgress = slideEl.progress; + + if ( + swiper.params.slidesPerGroup > 1 && + swiper.params.slidesPerView !== "auto" + ) { + slideProgress += + Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1); + } + + slideProgress = Math.min(Math.max(slideProgress, -1), 1); + $(slideEl) + .find( + "[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]", + ) + .each((el) => { + setTransform(el, slideProgress); + }); + }); + }; + + const setTransition = function (duration) { + if (duration === void 0) { + duration = swiper.params.speed; + } + + const { $el } = swiper; + $el + .find( + "[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]", + ) + .each((parallaxEl) => { + const $parallaxEl = $(parallaxEl); + let parallaxDuration = + parseInt($parallaxEl.attr("data-swiper-parallax-duration"), 10) || + duration; + if (duration === 0) parallaxDuration = 0; + $parallaxEl.transition(parallaxDuration); + }); + }; + + on("beforeInit", () => { + if (!swiper.params.parallax.enabled) return; + swiper.params.watchSlidesProgress = true; + swiper.originalParams.watchSlidesProgress = true; + }); + on("init", () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on("setTranslate", () => { + if (!swiper.params.parallax.enabled) return; + setTranslate(); + }); + on("setTransition", (_swiper, duration) => { + if (!swiper.params.parallax.enabled) return; + setTransition(duration); + }); + } + + function Zoom(_ref) { + let { swiper, extendParams, on, emit } = _ref; + const window = getWindow(); + extendParams({ + zoom: { + enabled: false, + maxRatio: 3, + minRatio: 1, + toggle: true, + containerClass: "swiper-zoom-container", + zoomedSlideClass: "swiper-slide-zoomed", + }, + }); + swiper.zoom = { + enabled: false, + }; + let currentScale = 1; + let isScaling = false; + let gesturesEnabled; + let fakeGestureTouched; + let fakeGestureMoved; + const gesture = { + $slideEl: undefined, + slideWidth: undefined, + slideHeight: undefined, + $imageEl: undefined, + $imageWrapEl: undefined, + maxRatio: 3, + }; + const image = { + isTouched: undefined, + isMoved: undefined, + currentX: undefined, + currentY: undefined, + minX: undefined, + minY: undefined, + maxX: undefined, + maxY: undefined, + width: undefined, + height: undefined, + startX: undefined, + startY: undefined, + touchesStart: {}, + touchesCurrent: {}, + }; + const velocity = { + x: undefined, + y: undefined, + prevPositionX: undefined, + prevPositionY: undefined, + prevTime: undefined, + }; + let scale = 1; + Object.defineProperty(swiper.zoom, "scale", { + get() { + return scale; + }, + + set(value) { + if (scale !== value) { + const imageEl = gesture.$imageEl ? gesture.$imageEl[0] : undefined; + const slideEl = gesture.$slideEl ? gesture.$slideEl[0] : undefined; + emit("zoomChange", value, imageEl, slideEl); + } + + scale = value; + }, + }); + + function getDistanceBetweenTouches(e) { + if (e.targetTouches.length < 2) return 1; + const x1 = e.targetTouches[0].pageX; + const y1 = e.targetTouches[0].pageY; + const x2 = e.targetTouches[1].pageX; + const y2 = e.targetTouches[1].pageY; + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + return distance; + } // Events + + function onGestureStart(e) { + const support = swiper.support; + const params = swiper.params.zoom; + fakeGestureTouched = false; + fakeGestureMoved = false; + + if (!support.gestures) { + if ( + e.type !== "touchstart" || + (e.type === "touchstart" && e.targetTouches.length < 2) + ) { + return; + } + + fakeGestureTouched = true; + gesture.scaleStart = getDistanceBetweenTouches(e); + } + + if (!gesture.$slideEl || !gesture.$slideEl.length) { + gesture.$slideEl = $(e.target).closest(`.${swiper.params.slideClass}`); + if (gesture.$slideEl.length === 0) + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + gesture.$imageEl = gesture.$slideEl + .find(`.${params.containerClass}`) + .eq(0) + .find("picture, img, svg, canvas, .swiper-zoom-target") + .eq(0); + gesture.$imageWrapEl = gesture.$imageEl.parent( + `.${params.containerClass}`, + ); + gesture.maxRatio = + gesture.$imageWrapEl.attr("data-swiper-zoom") || params.maxRatio; + + if (gesture.$imageWrapEl.length === 0) { + gesture.$imageEl = undefined; + return; + } + } + + if (gesture.$imageEl) { + gesture.$imageEl.transition(0); + } + + isScaling = true; + } + + function onGestureChange(e) { + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if ( + e.type !== "touchmove" || + (e.type === "touchmove" && e.targetTouches.length < 2) + ) { + return; + } + + fakeGestureMoved = true; + gesture.scaleMove = getDistanceBetweenTouches(e); + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) { + if (e.type === "gesturechange") onGestureStart(e); + return; + } + + if (support.gestures) { + zoom.scale = e.scale * currentScale; + } else { + zoom.scale = (gesture.scaleMove / gesture.scaleStart) * currentScale; + } + + if (zoom.scale > gesture.maxRatio) { + zoom.scale = + gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5; + } + + if (zoom.scale < params.minRatio) { + zoom.scale = + params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5; + } + + gesture.$imageEl.transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function onGestureEnd(e) { + const device = swiper.device; + const support = swiper.support; + const params = swiper.params.zoom; + const zoom = swiper.zoom; + + if (!support.gestures) { + if (!fakeGestureTouched || !fakeGestureMoved) { + return; + } + + if ( + e.type !== "touchend" || + (e.type === "touchend" && + e.changedTouches.length < 2 && + !device.android) + ) { + return; + } + + fakeGestureTouched = false; + fakeGestureMoved = false; + } + + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + zoom.scale = Math.max( + Math.min(zoom.scale, gesture.maxRatio), + params.minRatio, + ); + gesture.$imageEl + .transition(swiper.params.speed) + .transform(`translate3d(0,0,0) scale(${zoom.scale})`); + currentScale = zoom.scale; + isScaling = false; + if (zoom.scale === 1) gesture.$slideEl = undefined; + } + + function onTouchStart(e) { + const device = swiper.device; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + if (image.isTouched) return; + if (device.android && e.cancelable) e.preventDefault(); + image.isTouched = true; + image.touchesStart.x = + e.type === "touchstart" ? e.targetTouches[0].pageX : e.pageX; + image.touchesStart.y = + e.type === "touchstart" ? e.targetTouches[0].pageY : e.pageY; + } + + function onTouchMove(e) { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + swiper.allowClick = false; + if (!image.isTouched || !gesture.$slideEl) return; + + if (!image.isMoved) { + image.width = gesture.$imageEl[0].offsetWidth; + image.height = gesture.$imageEl[0].offsetHeight; + image.startX = getTranslate(gesture.$imageWrapEl[0], "x") || 0; + image.startY = getTranslate(gesture.$imageWrapEl[0], "y") || 0; + gesture.slideWidth = gesture.$slideEl[0].offsetWidth; + gesture.slideHeight = gesture.$slideEl[0].offsetHeight; + gesture.$imageWrapEl.transition(0); + } // Define if we need image drag + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + if ( + scaledWidth < gesture.slideWidth && + scaledHeight < gesture.slideHeight + ) + return; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.touchesCurrent.x = + e.type === "touchmove" ? e.targetTouches[0].pageX : e.pageX; + image.touchesCurrent.y = + e.type === "touchmove" ? e.targetTouches[0].pageY : e.pageY; + + if (!image.isMoved && !isScaling) { + if ( + swiper.isHorizontal() && + ((Math.floor(image.minX) === Math.floor(image.startX) && + image.touchesCurrent.x < image.touchesStart.x) || + (Math.floor(image.maxX) === Math.floor(image.startX) && + image.touchesCurrent.x > image.touchesStart.x)) + ) { + image.isTouched = false; + return; + } + + if ( + !swiper.isHorizontal() && + ((Math.floor(image.minY) === Math.floor(image.startY) && + image.touchesCurrent.y < image.touchesStart.y) || + (Math.floor(image.maxY) === Math.floor(image.startY) && + image.touchesCurrent.y > image.touchesStart.y)) + ) { + image.isTouched = false; + return; + } + } + + if (e.cancelable) { + e.preventDefault(); + } + + e.stopPropagation(); + image.isMoved = true; + image.currentX = + image.touchesCurrent.x - image.touchesStart.x + image.startX; + image.currentY = + image.touchesCurrent.y - image.touchesStart.y + image.startY; + + if (image.currentX < image.minX) { + image.currentX = + image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8; + } + + if (image.currentX > image.maxX) { + image.currentX = + image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8; + } + + if (image.currentY < image.minY) { + image.currentY = + image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8; + } + + if (image.currentY > image.maxY) { + image.currentY = + image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8; + } // Velocity + + if (!velocity.prevPositionX) + velocity.prevPositionX = image.touchesCurrent.x; + if (!velocity.prevPositionY) + velocity.prevPositionY = image.touchesCurrent.y; + if (!velocity.prevTime) velocity.prevTime = Date.now(); + velocity.x = + (image.touchesCurrent.x - velocity.prevPositionX) / + (Date.now() - velocity.prevTime) / + 2; + velocity.y = + (image.touchesCurrent.y - velocity.prevPositionY) / + (Date.now() - velocity.prevTime) / + 2; + if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) + velocity.x = 0; + if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) + velocity.y = 0; + velocity.prevPositionX = image.touchesCurrent.x; + velocity.prevPositionY = image.touchesCurrent.y; + velocity.prevTime = Date.now(); + gesture.$imageWrapEl.transform( + `translate3d(${image.currentX}px, ${image.currentY}px,0)`, + ); + } + + function onTouchEnd() { + const zoom = swiper.zoom; + if (!gesture.$imageEl || gesture.$imageEl.length === 0) return; + + if (!image.isTouched || !image.isMoved) { + image.isTouched = false; + image.isMoved = false; + return; + } + + image.isTouched = false; + image.isMoved = false; + let momentumDurationX = 300; + let momentumDurationY = 300; + const momentumDistanceX = velocity.x * momentumDurationX; + const newPositionX = image.currentX + momentumDistanceX; + const momentumDistanceY = velocity.y * momentumDurationY; + const newPositionY = image.currentY + momentumDistanceY; // Fix duration + + if (velocity.x !== 0) + momentumDurationX = Math.abs( + (newPositionX - image.currentX) / velocity.x, + ); + if (velocity.y !== 0) + momentumDurationY = Math.abs( + (newPositionY - image.currentY) / velocity.y, + ); + const momentumDuration = Math.max(momentumDurationX, momentumDurationY); + image.currentX = newPositionX; + image.currentY = newPositionY; // Define if we need image drag + + const scaledWidth = image.width * zoom.scale; + const scaledHeight = image.height * zoom.scale; + image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0); + image.maxX = -image.minX; + image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0); + image.maxY = -image.minY; + image.currentX = Math.max( + Math.min(image.currentX, image.maxX), + image.minX, + ); + image.currentY = Math.max( + Math.min(image.currentY, image.maxY), + image.minY, + ); + gesture.$imageWrapEl + .transition(momentumDuration) + .transform(`translate3d(${image.currentX}px, ${image.currentY}px,0)`); + } + + function onTransitionEnd() { + const zoom = swiper.zoom; + + if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) { + if (gesture.$imageEl) { + gesture.$imageEl.transform("translate3d(0,0,0) scale(1)"); + } + + if (gesture.$imageWrapEl) { + gesture.$imageWrapEl.transform("translate3d(0,0,0)"); + } + + zoom.scale = 1; + currentScale = 1; + gesture.$slideEl = undefined; + gesture.$imageEl = undefined; + gesture.$imageWrapEl = undefined; + } + } + + function zoomIn(e) { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if (e && e.target) { + gesture.$slideEl = $(e.target).closest( + `.${swiper.params.slideClass}`, + ); + } + + if (!gesture.$slideEl) { + if ( + swiper.params.virtual && + swiper.params.virtual.enabled && + swiper.virtual + ) { + gesture.$slideEl = swiper.$wrapperEl.children( + `.${swiper.params.slideActiveClass}`, + ); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + } + + gesture.$imageEl = gesture.$slideEl + .find(`.${params.containerClass}`) + .eq(0) + .find("picture, img, svg, canvas, .swiper-zoom-target") + .eq(0); + gesture.$imageWrapEl = gesture.$imageEl.parent( + `.${params.containerClass}`, + ); + } + + if ( + !gesture.$imageEl || + gesture.$imageEl.length === 0 || + !gesture.$imageWrapEl || + gesture.$imageWrapEl.length === 0 + ) + return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = "hidden"; + swiper.wrapperEl.style.touchAction = "none"; + } + + gesture.$slideEl.addClass(`${params.zoomedSlideClass}`); + let touchX; + let touchY; + let offsetX; + let offsetY; + let diffX; + let diffY; + let translateX; + let translateY; + let imageWidth; + let imageHeight; + let scaledWidth; + let scaledHeight; + let translateMinX; + let translateMinY; + let translateMaxX; + let translateMaxY; + let slideWidth; + let slideHeight; + + if (typeof image.touchesStart.x === "undefined" && e) { + touchX = e.type === "touchend" ? e.changedTouches[0].pageX : e.pageX; + touchY = e.type === "touchend" ? e.changedTouches[0].pageY : e.pageY; + } else { + touchX = image.touchesStart.x; + touchY = image.touchesStart.y; + } + + zoom.scale = + gesture.$imageWrapEl.attr("data-swiper-zoom") || params.maxRatio; + currentScale = + gesture.$imageWrapEl.attr("data-swiper-zoom") || params.maxRatio; + + if (e) { + slideWidth = gesture.$slideEl[0].offsetWidth; + slideHeight = gesture.$slideEl[0].offsetHeight; + offsetX = gesture.$slideEl.offset().left + window.scrollX; + offsetY = gesture.$slideEl.offset().top + window.scrollY; + diffX = offsetX + slideWidth / 2 - touchX; + diffY = offsetY + slideHeight / 2 - touchY; + imageWidth = gesture.$imageEl[0].offsetWidth; + imageHeight = gesture.$imageEl[0].offsetHeight; + scaledWidth = imageWidth * zoom.scale; + scaledHeight = imageHeight * zoom.scale; + translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0); + translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0); + translateMaxX = -translateMinX; + translateMaxY = -translateMinY; + translateX = diffX * zoom.scale; + translateY = diffY * zoom.scale; + + if (translateX < translateMinX) { + translateX = translateMinX; + } + + if (translateX > translateMaxX) { + translateX = translateMaxX; + } + + if (translateY < translateMinY) { + translateY = translateMinY; + } + + if (translateY > translateMaxY) { + translateY = translateMaxY; + } + } else { + translateX = 0; + translateY = 0; + } + + gesture.$imageWrapEl + .transition(300) + .transform(`translate3d(${translateX}px, ${translateY}px,0)`); + gesture.$imageEl + .transition(300) + .transform(`translate3d(0,0,0) scale(${zoom.scale})`); + } + + function zoomOut() { + const zoom = swiper.zoom; + const params = swiper.params.zoom; + + if (!gesture.$slideEl) { + if ( + swiper.params.virtual && + swiper.params.virtual.enabled && + swiper.virtual + ) { + gesture.$slideEl = swiper.$wrapperEl.children( + `.${swiper.params.slideActiveClass}`, + ); + } else { + gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); + } + + gesture.$imageEl = gesture.$slideEl + .find(`.${params.containerClass}`) + .eq(0) + .find("picture, img, svg, canvas, .swiper-zoom-target") + .eq(0); + gesture.$imageWrapEl = gesture.$imageEl.parent( + `.${params.containerClass}`, + ); + } + + if ( + !gesture.$imageEl || + gesture.$imageEl.length === 0 || + !gesture.$imageWrapEl || + gesture.$imageWrapEl.length === 0 + ) + return; + + if (swiper.params.cssMode) { + swiper.wrapperEl.style.overflow = ""; + swiper.wrapperEl.style.touchAction = ""; + } + + zoom.scale = 1; + currentScale = 1; + gesture.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"); + gesture.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"); + gesture.$slideEl.removeClass(`${params.zoomedSlideClass}`); + gesture.$slideEl = undefined; + } // Toggle Zoom + + function zoomToggle(e) { + const zoom = swiper.zoom; + + if (zoom.scale && zoom.scale !== 1) { + // Zoom Out + zoomOut(); + } else { + // Zoom In + zoomIn(e); + } + } + + function getListeners() { + const support = swiper.support; + const passiveListener = + swiper.touchEvents.start === "touchstart" && + support.passiveListener && + swiper.params.passiveListeners + ? { + passive: true, + capture: false, + } + : false; + const activeListenerWithCapture = support.passiveListener + ? { + passive: false, + capture: true, + } + : true; + return { + passiveListener, + activeListenerWithCapture, + }; + } + + function getSlideSelector() { + return `.${swiper.params.slideClass}`; + } + + function toggleGestures(method) { + const { passiveListener } = getListeners(); + const slideSelector = getSlideSelector(); + swiper.$wrapperEl[method]( + "gesturestart", + slideSelector, + onGestureStart, + passiveListener, + ); + swiper.$wrapperEl[method]( + "gesturechange", + slideSelector, + onGestureChange, + passiveListener, + ); + swiper.$wrapperEl[method]( + "gestureend", + slideSelector, + onGestureEnd, + passiveListener, + ); + } + + function enableGestures() { + if (gesturesEnabled) return; + gesturesEnabled = true; + toggleGestures("on"); + } + + function disableGestures() { + if (!gesturesEnabled) return; + gesturesEnabled = false; + toggleGestures("off"); + } // Attach/Detach Events + + function enable() { + const zoom = swiper.zoom; + if (zoom.enabled) return; + zoom.enabled = true; + const support = swiper.support; + const { passiveListener, activeListenerWithCapture } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.on( + swiper.touchEvents.start, + enableGestures, + passiveListener, + ); + swiper.$wrapperEl.on( + swiper.touchEvents.end, + disableGestures, + passiveListener, + ); + } else if (swiper.touchEvents.start === "touchstart") { + swiper.$wrapperEl.on( + swiper.touchEvents.start, + slideSelector, + onGestureStart, + passiveListener, + ); + swiper.$wrapperEl.on( + swiper.touchEvents.move, + slideSelector, + onGestureChange, + activeListenerWithCapture, + ); + swiper.$wrapperEl.on( + swiper.touchEvents.end, + slideSelector, + onGestureEnd, + passiveListener, + ); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.on( + swiper.touchEvents.cancel, + slideSelector, + onGestureEnd, + passiveListener, + ); + } + } // Move image + + swiper.$wrapperEl.on( + swiper.touchEvents.move, + `.${swiper.params.zoom.containerClass}`, + onTouchMove, + activeListenerWithCapture, + ); + } + + function disable() { + const zoom = swiper.zoom; + if (!zoom.enabled) return; + const support = swiper.support; + zoom.enabled = false; + const { passiveListener, activeListenerWithCapture } = getListeners(); + const slideSelector = getSlideSelector(); // Scale image + + if (support.gestures) { + swiper.$wrapperEl.off( + swiper.touchEvents.start, + enableGestures, + passiveListener, + ); + swiper.$wrapperEl.off( + swiper.touchEvents.end, + disableGestures, + passiveListener, + ); + } else if (swiper.touchEvents.start === "touchstart") { + swiper.$wrapperEl.off( + swiper.touchEvents.start, + slideSelector, + onGestureStart, + passiveListener, + ); + swiper.$wrapperEl.off( + swiper.touchEvents.move, + slideSelector, + onGestureChange, + activeListenerWithCapture, + ); + swiper.$wrapperEl.off( + swiper.touchEvents.end, + slideSelector, + onGestureEnd, + passiveListener, + ); + + if (swiper.touchEvents.cancel) { + swiper.$wrapperEl.off( + swiper.touchEvents.cancel, + slideSelector, + onGestureEnd, + passiveListener, + ); + } + } // Move image + + swiper.$wrapperEl.off( + swiper.touchEvents.move, + `.${swiper.params.zoom.containerClass}`, + onTouchMove, + activeListenerWithCapture, + ); + } + + on("init", () => { + if (swiper.params.zoom.enabled) { + enable(); + } + }); + on("destroy", () => { + disable(); + }); + on("touchStart", (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchStart(e); + }); + on("touchEnd", (_s, e) => { + if (!swiper.zoom.enabled) return; + onTouchEnd(); + }); + on("doubleTap", (_s, e) => { + if ( + !swiper.animating && + swiper.params.zoom.enabled && + swiper.zoom.enabled && + swiper.params.zoom.toggle + ) { + zoomToggle(e); + } + }); + on("transitionEnd", () => { + if (swiper.zoom.enabled && swiper.params.zoom.enabled) { + onTransitionEnd(); + } + }); + on("slideChange", () => { + if ( + swiper.zoom.enabled && + swiper.params.zoom.enabled && + swiper.params.cssMode + ) { + onTransitionEnd(); + } + }); + Object.assign(swiper.zoom, { + enable, + disable, + in: zoomIn, + out: zoomOut, + toggle: zoomToggle, + }); + } + + function Lazy(_ref) { + let { swiper, extendParams, on, emit } = _ref; + extendParams({ + lazy: { + checkInView: false, + enabled: false, + loadPrevNext: false, + loadPrevNextAmount: 1, + loadOnTransitionStart: false, + scrollingElement: "", + elementClass: "swiper-lazy", + loadingClass: "swiper-lazy-loading", + loadedClass: "swiper-lazy-loaded", + preloaderClass: "swiper-lazy-preloader", + }, + }); + swiper.lazy = {}; + let scrollHandlerAttached = false; + let initialImageLoaded = false; + + function loadInSlide(index, loadInDuplicate) { + if (loadInDuplicate === void 0) { + loadInDuplicate = true; + } + + const params = swiper.params.lazy; + if (typeof index === "undefined") return; + if (swiper.slides.length === 0) return; + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + const $slideEl = isVirtual + ? swiper.$wrapperEl.children( + `.${swiper.params.slideClass}[data-swiper-slide-index="${index}"]`, + ) + : swiper.slides.eq(index); + const $images = $slideEl.find( + `.${params.elementClass}:not(.${params.loadedClass}):not(.${params.loadingClass})`, + ); + + if ( + $slideEl.hasClass(params.elementClass) && + !$slideEl.hasClass(params.loadedClass) && + !$slideEl.hasClass(params.loadingClass) + ) { + $images.push($slideEl[0]); + } + + if ($images.length === 0) return; + $images.each((imageEl) => { + const $imageEl = $(imageEl); + $imageEl.addClass(params.loadingClass); + const background = $imageEl.attr("data-background"); + const src = $imageEl.attr("data-src"); + const srcset = $imageEl.attr("data-srcset"); + const sizes = $imageEl.attr("data-sizes"); + const $pictureEl = $imageEl.parent("picture"); + swiper.loadImage( + $imageEl[0], + src || background, + srcset, + sizes, + false, + () => { + if ( + typeof swiper === "undefined" || + swiper === null || + !swiper || + (swiper && !swiper.params) || + swiper.destroyed + ) + return; + + if (background) { + $imageEl.css("background-image", `url("${background}")`); + $imageEl.removeAttr("data-background"); + } else { + if (srcset) { + $imageEl.attr("srcset", srcset); + $imageEl.removeAttr("data-srcset"); + } + + if (sizes) { + $imageEl.attr("sizes", sizes); + $imageEl.removeAttr("data-sizes"); + } + + if ($pictureEl.length) { + $pictureEl.children("source").each((sourceEl) => { + const $source = $(sourceEl); + + if ($source.attr("data-srcset")) { + $source.attr("srcset", $source.attr("data-srcset")); + $source.removeAttr("data-srcset"); + } + }); + } + + if (src) { + $imageEl.attr("src", src); + $imageEl.removeAttr("data-src"); + } + } + + $imageEl + .addClass(params.loadedClass) + .removeClass(params.loadingClass); + $slideEl.find(`.${params.preloaderClass}`).remove(); + + if (swiper.params.loop && loadInDuplicate) { + const slideOriginalIndex = $slideEl.attr( + "data-swiper-slide-index", + ); + + if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) { + const originalSlide = swiper.$wrapperEl.children( + `[data-swiper-slide-index="${slideOriginalIndex}"]:not(.${swiper.params.slideDuplicateClass})`, + ); + loadInSlide(originalSlide.index(), false); + } else { + const duplicatedSlide = swiper.$wrapperEl.children( + `.${swiper.params.slideDuplicateClass}[data-swiper-slide-index="${slideOriginalIndex}"]`, + ); + loadInSlide(duplicatedSlide.index(), false); + } + } + + emit("lazyImageReady", $slideEl[0], $imageEl[0]); + + if (swiper.params.autoHeight) { + swiper.updateAutoHeight(); + } + }, + ); + emit("lazyImageLoad", $slideEl[0], $imageEl[0]); + }); + } + + function load() { + const { $wrapperEl, params: swiperParams, slides, activeIndex } = swiper; + const isVirtual = swiper.virtual && swiperParams.virtual.enabled; + const params = swiperParams.lazy; + let slidesPerView = swiperParams.slidesPerView; + + if (slidesPerView === "auto") { + slidesPerView = 0; + } + + function slideExist(index) { + if (isVirtual) { + if ( + $wrapperEl.children( + `.${swiperParams.slideClass}[data-swiper-slide-index="${index}"]`, + ).length + ) { + return true; + } + } else if (slides[index]) return true; + + return false; + } + + function slideIndex(slideEl) { + if (isVirtual) { + return $(slideEl).attr("data-swiper-slide-index"); + } + + return $(slideEl).index(); + } + + if (!initialImageLoaded) initialImageLoaded = true; + + if (swiper.params.watchSlidesProgress) { + $wrapperEl + .children(`.${swiperParams.slideVisibleClass}`) + .each((slideEl) => { + const index = isVirtual + ? $(slideEl).attr("data-swiper-slide-index") + : $(slideEl).index(); + loadInSlide(index); + }); + } else if (slidesPerView > 1) { + for (let i = activeIndex; i < activeIndex + slidesPerView; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + loadInSlide(activeIndex); + } + + if (params.loadPrevNext) { + if ( + slidesPerView > 1 || + (params.loadPrevNextAmount && params.loadPrevNextAmount > 1) + ) { + const amount = params.loadPrevNextAmount; + const spv = slidesPerView; + const maxIndex = Math.min( + activeIndex + spv + Math.max(amount, spv), + slides.length, + ); + const minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides + + for (let i = activeIndex + slidesPerView; i < maxIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } // Prev Slides + + for (let i = minIndex; i < activeIndex; i += 1) { + if (slideExist(i)) loadInSlide(i); + } + } else { + const nextSlide = $wrapperEl.children( + `.${swiperParams.slideNextClass}`, + ); + if (nextSlide.length > 0) loadInSlide(slideIndex(nextSlide)); + const prevSlide = $wrapperEl.children( + `.${swiperParams.slidePrevClass}`, + ); + if (prevSlide.length > 0) loadInSlide(slideIndex(prevSlide)); + } + } + } + + function checkInViewOnLoad() { + const window = getWindow(); + if (!swiper || swiper.destroyed) return; + const $scrollElement = swiper.params.lazy.scrollingElement + ? $(swiper.params.lazy.scrollingElement) + : $(window); + const isWindow = $scrollElement[0] === window; + const scrollElementWidth = isWindow + ? window.innerWidth + : $scrollElement[0].offsetWidth; + const scrollElementHeight = isWindow + ? window.innerHeight + : $scrollElement[0].offsetHeight; + const swiperOffset = swiper.$el.offset(); + const { rtlTranslate: rtl } = swiper; + let inView = false; + if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft; + const swiperCoord = [ + [swiperOffset.left, swiperOffset.top], + [swiperOffset.left + swiper.width, swiperOffset.top], + [swiperOffset.left, swiperOffset.top + swiper.height], + [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height], + ]; + + for (let i = 0; i < swiperCoord.length; i += 1) { + const point = swiperCoord[i]; + + if ( + point[0] >= 0 && + point[0] <= scrollElementWidth && + point[1] >= 0 && + point[1] <= scrollElementHeight + ) { + if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line + + inView = true; + } + } + + const passiveListener = + swiper.touchEvents.start === "touchstart" && + swiper.support.passiveListener && + swiper.params.passiveListeners + ? { + passive: true, + capture: false, + } + : false; + + if (inView) { + load(); + $scrollElement.off("scroll", checkInViewOnLoad, passiveListener); + } else if (!scrollHandlerAttached) { + scrollHandlerAttached = true; + $scrollElement.on("scroll", checkInViewOnLoad, passiveListener); + } + } + + on("beforeInit", () => { + if (swiper.params.lazy.enabled && swiper.params.preloadImages) { + swiper.params.preloadImages = false; + } + }); + on("init", () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on("scroll", () => { + if ( + swiper.params.freeMode && + swiper.params.freeMode.enabled && + !swiper.params.freeMode.sticky + ) { + load(); + } + }); + on("scrollbarDragMove resize _freeModeNoMomentumRelease", () => { + if (swiper.params.lazy.enabled) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on("transitionStart", () => { + if (swiper.params.lazy.enabled) { + if ( + swiper.params.lazy.loadOnTransitionStart || + (!swiper.params.lazy.loadOnTransitionStart && !initialImageLoaded) + ) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + } + }); + on("transitionEnd", () => { + if ( + swiper.params.lazy.enabled && + !swiper.params.lazy.loadOnTransitionStart + ) { + if (swiper.params.lazy.checkInView) { + checkInViewOnLoad(); + } else { + load(); + } + } + }); + on("slideChange", () => { + const { + lazy, + cssMode, + watchSlidesProgress, + touchReleaseOnEdges, + resistanceRatio, + } = swiper.params; + + if ( + lazy.enabled && + (cssMode || + (watchSlidesProgress && + (touchReleaseOnEdges || resistanceRatio === 0))) + ) { + load(); + } + }); + Object.assign(swiper.lazy, { + load, + loadInSlide, + }); + } + + /* eslint no-bitwise: ["error", { "allow": [">>"] }] */ + function Controller(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + controller: { + control: undefined, + inverse: false, + by: "slide", // or 'container' + }, + }); + swiper.controller = { + control: undefined, + }; + + function LinearSpline(x, y) { + const binarySearch = (function search() { + let maxIndex; + let minIndex; + let guess; + return (array, val) => { + minIndex = -1; + maxIndex = array.length; + + while (maxIndex - minIndex > 1) { + guess = (maxIndex + minIndex) >> 1; + + if (array[guess] <= val) { + minIndex = guess; + } else { + maxIndex = guess; + } + } + + return maxIndex; + }; + })(); + + this.x = x; + this.y = y; + this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value: + // (x1,y1) is the known point before given value, + // (x3,y3) is the known point after given value. + + let i1; + let i3; + + this.interpolate = function interpolate(x2) { + if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2): + + i3 = binarySearch(this.x, x2); + i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already: + // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1 + + return ( + ((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / + (this.x[i3] - this.x[i1]) + + this.y[i1] + ); + }; + + return this; + } // xxx: for now i will just save one spline function to to + + function getInterpolateFunction(c) { + if (!swiper.controller.spline) { + swiper.controller.spline = swiper.params.loop + ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) + : new LinearSpline(swiper.snapGrid, c.snapGrid); + } + } + + function setTranslate(_t, byController) { + const controlled = swiper.controller.control; + let multiplier; + let controlledTranslate; + const Swiper = swiper.constructor; + + function setControlledTranslate(c) { + // this will create an Interpolate function based on the snapGrids + // x is the Grid of the scrolled scroller and y will be the controlled scroller + // it makes sense to create this only once and recall it for the interpolation + // the function does a lot of value caching for performance + const translate = swiper.rtlTranslate + ? -swiper.translate + : swiper.translate; + + if (swiper.params.controller.by === "slide") { + getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid + // but it did not work out + + controlledTranslate = -swiper.controller.spline.interpolate( + -translate, + ); + } + + if ( + !controlledTranslate || + swiper.params.controller.by === "container" + ) { + multiplier = + (c.maxTranslate() - c.minTranslate()) / + (swiper.maxTranslate() - swiper.minTranslate()); + controlledTranslate = + (translate - swiper.minTranslate()) * multiplier + c.minTranslate(); + } + + if (swiper.params.controller.inverse) { + controlledTranslate = c.maxTranslate() - controlledTranslate; + } + + c.updateProgress(controlledTranslate); + c.setTranslate(controlledTranslate, swiper); + c.updateActiveIndex(); + c.updateSlidesClasses(); + } + + if (Array.isArray(controlled)) { + for (let i = 0; i < controlled.length; i += 1) { + if ( + controlled[i] !== byController && + controlled[i] instanceof Swiper + ) { + setControlledTranslate(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTranslate(controlled); + } + } + + function setTransition(duration, byController) { + const Swiper = swiper.constructor; + const controlled = swiper.controller.control; + let i; + + function setControlledTransition(c) { + c.setTransition(duration, swiper); + + if (duration !== 0) { + c.transitionStart(); + + if (c.params.autoHeight) { + nextTick(() => { + c.updateAutoHeight(); + }); + } + + c.$wrapperEl.transitionEnd(() => { + if (!controlled) return; + + if (c.params.loop && swiper.params.controller.by === "slide") { + c.loopFix(); + } + + c.transitionEnd(); + }); + } + } + + if (Array.isArray(controlled)) { + for (i = 0; i < controlled.length; i += 1) { + if ( + controlled[i] !== byController && + controlled[i] instanceof Swiper + ) { + setControlledTransition(controlled[i]); + } + } + } else if (controlled instanceof Swiper && byController !== controlled) { + setControlledTransition(controlled); + } + } + + function removeSpline() { + if (!swiper.controller.control) return; + + if (swiper.controller.spline) { + swiper.controller.spline = undefined; + delete swiper.controller.spline; + } + } + + on("beforeInit", () => { + swiper.controller.control = swiper.params.controller.control; + }); + on("update", () => { + removeSpline(); + }); + on("resize", () => { + removeSpline(); + }); + on("observerUpdate", () => { + removeSpline(); + }); + on("setTranslate", (_s, translate, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTranslate(translate, byController); + }); + on("setTransition", (_s, duration, byController) => { + if (!swiper.controller.control) return; + swiper.controller.setTransition(duration, byController); + }); + Object.assign(swiper.controller, { + setTranslate, + setTransition, + }); + } + + function A11y(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + a11y: { + enabled: true, + notificationClass: "swiper-notification", + prevSlideMessage: "Previous slide", + nextSlideMessage: "Next slide", + firstSlideMessage: "This is the first slide", + lastSlideMessage: "This is the last slide", + paginationBulletMessage: "Go to slide {{index}}", + slideLabelMessage: "{{index}} / {{slidesLength}}", + containerMessage: null, + containerRoleDescriptionMessage: null, + itemRoleDescriptionMessage: null, + slideRole: "group", + }, + }); + let liveRegion = null; + + function notify(message) { + const notification = liveRegion; + if (notification.length === 0) return; + notification.html(""); + notification.html(message); + } + + function getRandomNumber(size) { + if (size === void 0) { + size = 16; + } + + const randomChar = () => Math.round(16 * Math.random()).toString(16); + + return "x".repeat(size).replace(/x/g, randomChar); + } + + function makeElFocusable($el) { + $el.attr("tabIndex", "0"); + } + + function makeElNotFocusable($el) { + $el.attr("tabIndex", "-1"); + } + + function addElRole($el, role) { + $el.attr("role", role); + } + + function addElRoleDescription($el, description) { + $el.attr("aria-roledescription", description); + } + + function addElControls($el, controls) { + $el.attr("aria-controls", controls); + } + + function addElLabel($el, label) { + $el.attr("aria-label", label); + } + + function addElId($el, id) { + $el.attr("id", id); + } + + function addElLive($el, live) { + $el.attr("aria-live", live); + } + + function disableEl($el) { + $el.attr("aria-disabled", true); + } + + function enableEl($el) { + $el.attr("aria-disabled", false); + } + + function onEnterOrSpaceKey(e) { + if (e.keyCode !== 13 && e.keyCode !== 32) return; + const params = swiper.params.a11y; + const $targetEl = $(e.target); + + if ( + swiper.navigation && + swiper.navigation.$nextEl && + $targetEl.is(swiper.navigation.$nextEl) + ) { + if (!(swiper.isEnd && !swiper.params.loop)) { + swiper.slideNext(); + } + + if (swiper.isEnd) { + notify(params.lastSlideMessage); + } else { + notify(params.nextSlideMessage); + } + } + + if ( + swiper.navigation && + swiper.navigation.$prevEl && + $targetEl.is(swiper.navigation.$prevEl) + ) { + if (!(swiper.isBeginning && !swiper.params.loop)) { + swiper.slidePrev(); + } + + if (swiper.isBeginning) { + notify(params.firstSlideMessage); + } else { + notify(params.prevSlideMessage); + } + } + + if ( + swiper.pagination && + $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass)) + ) { + $targetEl[0].click(); + } + } + + function updateNavigation() { + if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) + return; + const { $nextEl, $prevEl } = swiper.navigation; + + if ($prevEl && $prevEl.length > 0) { + if (swiper.isBeginning) { + disableEl($prevEl); + makeElNotFocusable($prevEl); + } else { + enableEl($prevEl); + makeElFocusable($prevEl); + } + } + + if ($nextEl && $nextEl.length > 0) { + if (swiper.isEnd) { + disableEl($nextEl); + makeElNotFocusable($nextEl); + } else { + enableEl($nextEl); + makeElFocusable($nextEl); + } + } + } + + function hasPagination() { + return ( + swiper.pagination && + swiper.pagination.bullets && + swiper.pagination.bullets.length + ); + } + + function hasClickablePagination() { + return hasPagination() && swiper.params.pagination.clickable; + } + + function updatePagination() { + const params = swiper.params.a11y; + if (!hasPagination()) return; + swiper.pagination.bullets.each((bulletEl) => { + const $bulletEl = $(bulletEl); + + if (swiper.params.pagination.clickable) { + makeElFocusable($bulletEl); + + if (!swiper.params.pagination.renderBullet) { + addElRole($bulletEl, "button"); + addElLabel( + $bulletEl, + params.paginationBulletMessage.replace( + /\{\{index\}\}/, + $bulletEl.index() + 1, + ), + ); + } + } + + if ($bulletEl.is(`.${swiper.params.pagination.bulletActiveClass}`)) { + $bulletEl.attr("aria-current", "true"); + } else { + $bulletEl.removeAttr("aria-current"); + } + }); + } + + const initNavEl = ($el, wrapperId, message) => { + makeElFocusable($el); + + if ($el[0].tagName !== "BUTTON") { + addElRole($el, "button"); + $el.on("keydown", onEnterOrSpaceKey); + } + + addElLabel($el, message); + addElControls($el, wrapperId); + }; + + const handleFocus = (e) => { + const slideEl = e.target.closest(`.${swiper.params.slideClass}`); + if (!slideEl || !swiper.slides.includes(slideEl)) return; + const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex; + const isVisible = + swiper.params.watchSlidesProgress && + swiper.visibleSlides && + swiper.visibleSlides.includes(slideEl); + if (isActive || isVisible) return; + swiper.slideTo(swiper.slides.indexOf(slideEl), 0); + }; + + function init() { + const params = swiper.params.a11y; + swiper.$el.append(liveRegion); // Container + + const $containerEl = swiper.$el; + + if (params.containerRoleDescriptionMessage) { + addElRoleDescription( + $containerEl, + params.containerRoleDescriptionMessage, + ); + } + + if (params.containerMessage) { + addElLabel($containerEl, params.containerMessage); + } // Wrapper + + const $wrapperEl = swiper.$wrapperEl; + const wrapperId = + $wrapperEl.attr("id") || `swiper-wrapper-${getRandomNumber(16)}`; + const live = + swiper.params.autoplay && swiper.params.autoplay.enabled + ? "off" + : "polite"; + addElId($wrapperEl, wrapperId); + addElLive($wrapperEl, live); // Slide + + if (params.itemRoleDescriptionMessage) { + addElRoleDescription( + $(swiper.slides), + params.itemRoleDescriptionMessage, + ); + } + + addElRole($(swiper.slides), params.slideRole); + const slidesLength = swiper.params.loop + ? swiper.slides.filter( + (el) => !el.classList.contains(swiper.params.slideDuplicateClass), + ).length + : swiper.slides.length; + swiper.slides.each((slideEl, index) => { + const $slideEl = $(slideEl); + const slideIndex = swiper.params.loop + ? parseInt($slideEl.attr("data-swiper-slide-index"), 10) + : index; + const ariaLabelMessage = params.slideLabelMessage + .replace(/\{\{index\}\}/, slideIndex + 1) + .replace(/\{\{slidesLength\}\}/, slidesLength); + addElLabel($slideEl, ariaLabelMessage); + }); // Navigation + + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl && $nextEl.length) { + initNavEl($nextEl, wrapperId, params.nextSlideMessage); + } + + if ($prevEl && $prevEl.length) { + initNavEl($prevEl, wrapperId, params.prevSlideMessage); + } // Pagination + + if (hasClickablePagination()) { + swiper.pagination.$el.on( + "keydown", + classesToSelector(swiper.params.pagination.bulletClass), + onEnterOrSpaceKey, + ); + } // Tab focus + + swiper.$el.on("focus", handleFocus, true); + } + + function destroy() { + if (liveRegion && liveRegion.length > 0) liveRegion.remove(); + let $nextEl; + let $prevEl; + + if (swiper.navigation && swiper.navigation.$nextEl) { + $nextEl = swiper.navigation.$nextEl; + } + + if (swiper.navigation && swiper.navigation.$prevEl) { + $prevEl = swiper.navigation.$prevEl; + } + + if ($nextEl) { + $nextEl.off("keydown", onEnterOrSpaceKey); + } + + if ($prevEl) { + $prevEl.off("keydown", onEnterOrSpaceKey); + } // Pagination + + if (hasClickablePagination()) { + swiper.pagination.$el.off( + "keydown", + classesToSelector(swiper.params.pagination.bulletClass), + onEnterOrSpaceKey, + ); + } // Tab focus + + swiper.$el.off("focus", handleFocus, true); + } + + on("beforeInit", () => { + liveRegion = $( + ``, + ); + }); + on("afterInit", () => { + if (!swiper.params.a11y.enabled) return; + init(); + }); + on("fromEdge toEdge afterInit lock unlock", () => { + if (!swiper.params.a11y.enabled) return; + updateNavigation(); + }); + on("paginationUpdate", () => { + if (!swiper.params.a11y.enabled) return; + updatePagination(); + }); + on("destroy", () => { + if (!swiper.params.a11y.enabled) return; + destroy(); + }); + } + + function History(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + history: { + enabled: false, + root: "", + replaceState: false, + key: "slides", + }, + }); + let initialized = false; + let paths = {}; + + const slugify = (text) => { + return text + .toString() + .replace(/\s+/g, "-") + .replace(/[^\w-]+/g, "") + .replace(/--+/g, "-") + .replace(/^-+/, "") + .replace(/-+$/, ""); + }; + + const getPathValues = (urlOverride) => { + const window = getWindow(); + let location; + + if (urlOverride) { + location = new URL(urlOverride); + } else { + location = window.location; + } + + const pathArray = location.pathname + .slice(1) + .split("/") + .filter((part) => part !== ""); + const total = pathArray.length; + const key = pathArray[total - 2]; + const value = pathArray[total - 1]; + return { + key, + value, + }; + }; + + const setHistory = (key, index) => { + const window = getWindow(); + if (!initialized || !swiper.params.history.enabled) return; + let location; + + if (swiper.params.url) { + location = new URL(swiper.params.url); + } else { + location = window.location; + } + + const slide = swiper.slides.eq(index); + let value = slugify(slide.attr("data-history")); + + if (swiper.params.history.root.length > 0) { + let root = swiper.params.history.root; + if (root[root.length - 1] === "/") + root = root.slice(0, root.length - 1); + value = `${root}/${key}/${value}`; + } else if (!location.pathname.includes(key)) { + value = `${key}/${value}`; + } + + const currentState = window.history.state; + + if (currentState && currentState.value === value) { + return; + } + + if (swiper.params.history.replaceState) { + window.history.replaceState( + { + value, + }, + null, + value, + ); + } else { + window.history.pushState( + { + value, + }, + null, + value, + ); + } + }; + + const scrollToSlide = (speed, value, runCallbacks) => { + if (value) { + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHistory = slugify(slide.attr("data-history")); + + if ( + slideHistory === value && + !slide.hasClass(swiper.params.slideDuplicateClass) + ) { + const index = slide.index(); + swiper.slideTo(index, speed, runCallbacks); + } + } + } else { + swiper.slideTo(0, speed, runCallbacks); + } + }; + + const setHistoryPopState = () => { + paths = getPathValues(swiper.params.url); + scrollToSlide(swiper.params.speed, swiper.paths.value, false); + }; + + const init = () => { + const window = getWindow(); + if (!swiper.params.history) return; + + if (!window.history || !window.history.pushState) { + swiper.params.history.enabled = false; + swiper.params.hashNavigation.enabled = true; + return; + } + + initialized = true; + paths = getPathValues(swiper.params.url); + if (!paths.key && !paths.value) return; + scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit); + + if (!swiper.params.history.replaceState) { + window.addEventListener("popstate", setHistoryPopState); + } + }; + + const destroy = () => { + const window = getWindow(); + + if (!swiper.params.history.replaceState) { + window.removeEventListener("popstate", setHistoryPopState); + } + }; + + on("init", () => { + if (swiper.params.history.enabled) { + init(); + } + }); + on("destroy", () => { + if (swiper.params.history.enabled) { + destroy(); + } + }); + on("transitionEnd _freeModeNoMomentumRelease", () => { + if (initialized) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + on("slideChange", () => { + if (initialized && swiper.params.cssMode) { + setHistory(swiper.params.history.key, swiper.activeIndex); + } + }); + } + + function HashNavigation(_ref) { + let { swiper, extendParams, emit, on } = _ref; + let initialized = false; + const document = getDocument(); + const window = getWindow(); + extendParams({ + hashNavigation: { + enabled: false, + replaceState: false, + watchState: false, + }, + }); + + const onHashChange = () => { + emit("hashChange"); + const newHash = document.location.hash.replace("#", ""); + const activeSlideHash = swiper.slides + .eq(swiper.activeIndex) + .attr("data-hash"); + + if (newHash !== activeSlideHash) { + const newIndex = swiper.$wrapperEl + .children(`.${swiper.params.slideClass}[data-hash="${newHash}"]`) + .index(); + if (typeof newIndex === "undefined") return; + swiper.slideTo(newIndex); + } + }; + + const setHash = () => { + if (!initialized || !swiper.params.hashNavigation.enabled) return; + + if ( + swiper.params.hashNavigation.replaceState && + window.history && + window.history.replaceState + ) { + window.history.replaceState( + null, + null, + `#${swiper.slides.eq(swiper.activeIndex).attr("data-hash")}` || "", + ); + emit("hashSet"); + } else { + const slide = swiper.slides.eq(swiper.activeIndex); + const hash = slide.attr("data-hash") || slide.attr("data-history"); + document.location.hash = hash || ""; + emit("hashSet"); + } + }; + + const init = () => { + if ( + !swiper.params.hashNavigation.enabled || + (swiper.params.history && swiper.params.history.enabled) + ) + return; + initialized = true; + const hash = document.location.hash.replace("#", ""); + + if (hash) { + const speed = 0; + + for (let i = 0, length = swiper.slides.length; i < length; i += 1) { + const slide = swiper.slides.eq(i); + const slideHash = + slide.attr("data-hash") || slide.attr("data-history"); + + if ( + slideHash === hash && + !slide.hasClass(swiper.params.slideDuplicateClass) + ) { + const index = slide.index(); + swiper.slideTo( + index, + speed, + swiper.params.runCallbacksOnInit, + true, + ); + } + } + } + + if (swiper.params.hashNavigation.watchState) { + $(window).on("hashchange", onHashChange); + } + }; + + const destroy = () => { + if (swiper.params.hashNavigation.watchState) { + $(window).off("hashchange", onHashChange); + } + }; + + on("init", () => { + if (swiper.params.hashNavigation.enabled) { + init(); + } + }); + on("destroy", () => { + if (swiper.params.hashNavigation.enabled) { + destroy(); + } + }); + on("transitionEnd _freeModeNoMomentumRelease", () => { + if (initialized) { + setHash(); + } + }); + on("slideChange", () => { + if (initialized && swiper.params.cssMode) { + setHash(); + } + }); + } + + /* eslint no-underscore-dangle: "off" */ + function Autoplay(_ref) { + let { swiper, extendParams, on, emit } = _ref; + let timeout; + swiper.autoplay = { + running: false, + paused: false, + }; + extendParams({ + autoplay: { + enabled: false, + delay: 3000, + waitForTransition: true, + disableOnInteraction: true, + stopOnLastSlide: false, + reverseDirection: false, + pauseOnMouseEnter: false, + }, + }); + + function run() { + const $activeSlideEl = swiper.slides.eq(swiper.activeIndex); + let delay = swiper.params.autoplay.delay; + + if ($activeSlideEl.attr("data-swiper-autoplay")) { + delay = + $activeSlideEl.attr("data-swiper-autoplay") || + swiper.params.autoplay.delay; + } + + clearTimeout(timeout); + timeout = nextTick(() => { + let autoplayResult; + + if (swiper.params.autoplay.reverseDirection) { + if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit("autoplay"); + } else if (!swiper.isBeginning) { + autoplayResult = swiper.slidePrev(swiper.params.speed, true, true); + emit("autoplay"); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo( + swiper.slides.length - 1, + swiper.params.speed, + true, + true, + ); + emit("autoplay"); + } else { + stop(); + } + } else if (swiper.params.loop) { + swiper.loopFix(); + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit("autoplay"); + } else if (!swiper.isEnd) { + autoplayResult = swiper.slideNext(swiper.params.speed, true, true); + emit("autoplay"); + } else if (!swiper.params.autoplay.stopOnLastSlide) { + autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true); + emit("autoplay"); + } else { + stop(); + } + + if (swiper.params.cssMode && swiper.autoplay.running) run(); + else if (autoplayResult === false) { + run(); + } + }, delay); + } + + function start() { + if (typeof timeout !== "undefined") return false; + if (swiper.autoplay.running) return false; + swiper.autoplay.running = true; + emit("autoplayStart"); + run(); + return true; + } + + function stop() { + if (!swiper.autoplay.running) return false; + if (typeof timeout === "undefined") return false; + + if (timeout) { + clearTimeout(timeout); + timeout = undefined; + } + + swiper.autoplay.running = false; + emit("autoplayStop"); + return true; + } + + function pause(speed) { + if (!swiper.autoplay.running) return; + if (swiper.autoplay.paused) return; + if (timeout) clearTimeout(timeout); + swiper.autoplay.paused = true; + + if (speed === 0 || !swiper.params.autoplay.waitForTransition) { + swiper.autoplay.paused = false; + run(); + } else { + ["transitionend", "webkitTransitionEnd"].forEach((event) => { + swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd); + }); + } + } + + function onVisibilityChange() { + const document = getDocument(); + + if (document.visibilityState === "hidden" && swiper.autoplay.running) { + pause(); + } + + if (document.visibilityState === "visible" && swiper.autoplay.paused) { + run(); + swiper.autoplay.paused = false; + } + } + + function onTransitionEnd(e) { + if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return; + if (e.target !== swiper.$wrapperEl[0]) return; + ["transitionend", "webkitTransitionEnd"].forEach((event) => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + swiper.autoplay.paused = false; + + if (!swiper.autoplay.running) { + stop(); + } else { + run(); + } + } + + function onMouseEnter() { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + emit("autoplayPause"); + pause(); + } + + ["transitionend", "webkitTransitionEnd"].forEach((event) => { + swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd); + }); + } + + function onMouseLeave() { + if (swiper.params.autoplay.disableOnInteraction) { + return; + } + + swiper.autoplay.paused = false; + emit("autoplayResume"); + run(); + } + + function attachMouseEvents() { + if (swiper.params.autoplay.pauseOnMouseEnter) { + swiper.$el.on("mouseenter", onMouseEnter); + swiper.$el.on("mouseleave", onMouseLeave); + } + } + + function detachMouseEvents() { + swiper.$el.off("mouseenter", onMouseEnter); + swiper.$el.off("mouseleave", onMouseLeave); + } + + on("init", () => { + if (swiper.params.autoplay.enabled) { + start(); + const document = getDocument(); + document.addEventListener("visibilitychange", onVisibilityChange); + attachMouseEvents(); + } + }); + on("beforeTransitionStart", (_s, speed, internal) => { + if (swiper.autoplay.running) { + if (internal || !swiper.params.autoplay.disableOnInteraction) { + swiper.autoplay.pause(speed); + } else { + stop(); + } + } + }); + on("sliderFirstMove", () => { + if (swiper.autoplay.running) { + if (swiper.params.autoplay.disableOnInteraction) { + stop(); + } else { + pause(); + } + } + }); + on("touchEnd", () => { + if ( + swiper.params.cssMode && + swiper.autoplay.paused && + !swiper.params.autoplay.disableOnInteraction + ) { + run(); + } + }); + on("destroy", () => { + detachMouseEvents(); + + if (swiper.autoplay.running) { + stop(); + } + + const document = getDocument(); + document.removeEventListener("visibilitychange", onVisibilityChange); + }); + Object.assign(swiper.autoplay, { + pause, + run, + start, + stop, + }); + } + + function Thumb(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + thumbs: { + swiper: null, + multipleActiveThumbs: true, + autoScrollOffset: 0, + slideThumbActiveClass: "swiper-slide-thumb-active", + thumbsContainerClass: "swiper-thumbs", + }, + }); + let initialized = false; + let swiperCreated = false; + swiper.thumbs = { + swiper: null, + }; + + function onThumbClick() { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const clickedIndex = thumbsSwiper.clickedIndex; + const clickedSlide = thumbsSwiper.clickedSlide; + if ( + clickedSlide && + $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass) + ) + return; + if (typeof clickedIndex === "undefined" || clickedIndex === null) return; + let slideToIndex; + + if (thumbsSwiper.params.loop) { + slideToIndex = parseInt( + $(thumbsSwiper.clickedSlide).attr("data-swiper-slide-index"), + 10, + ); + } else { + slideToIndex = clickedIndex; + } + + if (swiper.params.loop) { + let currentIndex = swiper.activeIndex; + + if ( + swiper.slides + .eq(currentIndex) + .hasClass(swiper.params.slideDuplicateClass) + ) { + swiper.loopFix(); // eslint-disable-next-line + + swiper._clientLeft = swiper.$wrapperEl[0].clientLeft; + currentIndex = swiper.activeIndex; + } + + const prevIndex = swiper.slides + .eq(currentIndex) + .prevAll(`[data-swiper-slide-index="${slideToIndex}"]`) + .eq(0) + .index(); + const nextIndex = swiper.slides + .eq(currentIndex) + .nextAll(`[data-swiper-slide-index="${slideToIndex}"]`) + .eq(0) + .index(); + if (typeof prevIndex === "undefined") slideToIndex = nextIndex; + else if (typeof nextIndex === "undefined") slideToIndex = prevIndex; + else if (nextIndex - currentIndex < currentIndex - prevIndex) + slideToIndex = nextIndex; + else slideToIndex = prevIndex; + } + + swiper.slideTo(slideToIndex); + } + + function init() { + const { thumbs: thumbsParams } = swiper.params; + if (initialized) return false; + initialized = true; + const SwiperClass = swiper.constructor; + + if (thumbsParams.swiper instanceof SwiperClass) { + swiper.thumbs.swiper = thumbsParams.swiper; + Object.assign(swiper.thumbs.swiper.originalParams, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + Object.assign(swiper.thumbs.swiper.params, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + } else if (isObject(thumbsParams.swiper)) { + const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper); + Object.assign(thumbsSwiperParams, { + watchSlidesProgress: true, + slideToClickedSlide: false, + }); + swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams); + swiperCreated = true; + } + + swiper.thumbs.swiper.$el.addClass( + swiper.params.thumbs.thumbsContainerClass, + ); + swiper.thumbs.swiper.on("tap", onThumbClick); + return true; + } + + function update(initial) { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + const slidesPerView = + thumbsSwiper.params.slidesPerView === "auto" + ? thumbsSwiper.slidesPerViewDynamic() + : thumbsSwiper.params.slidesPerView; + const autoScrollOffset = swiper.params.thumbs.autoScrollOffset; + const useOffset = autoScrollOffset && !thumbsSwiper.params.loop; + + if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) { + let currentThumbsIndex = thumbsSwiper.activeIndex; + let newThumbsIndex; + let direction; + + if (thumbsSwiper.params.loop) { + if ( + thumbsSwiper.slides + .eq(currentThumbsIndex) + .hasClass(thumbsSwiper.params.slideDuplicateClass) + ) { + thumbsSwiper.loopFix(); // eslint-disable-next-line + + thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft; + currentThumbsIndex = thumbsSwiper.activeIndex; + } // Find actual thumbs index to slide to + + const prevThumbsIndex = thumbsSwiper.slides + .eq(currentThumbsIndex) + .prevAll(`[data-swiper-slide-index="${swiper.realIndex}"]`) + .eq(0) + .index(); + const nextThumbsIndex = thumbsSwiper.slides + .eq(currentThumbsIndex) + .nextAll(`[data-swiper-slide-index="${swiper.realIndex}"]`) + .eq(0) + .index(); + + if (typeof prevThumbsIndex === "undefined") { + newThumbsIndex = nextThumbsIndex; + } else if (typeof nextThumbsIndex === "undefined") { + newThumbsIndex = prevThumbsIndex; + } else if ( + nextThumbsIndex - currentThumbsIndex === + currentThumbsIndex - prevThumbsIndex + ) { + newThumbsIndex = + thumbsSwiper.params.slidesPerGroup > 1 + ? nextThumbsIndex + : currentThumbsIndex; + } else if ( + nextThumbsIndex - currentThumbsIndex < + currentThumbsIndex - prevThumbsIndex + ) { + newThumbsIndex = nextThumbsIndex; + } else { + newThumbsIndex = prevThumbsIndex; + } + + direction = + swiper.activeIndex > swiper.previousIndex ? "next" : "prev"; + } else { + newThumbsIndex = swiper.realIndex; + direction = newThumbsIndex > swiper.previousIndex ? "next" : "prev"; + } + + if (useOffset) { + newThumbsIndex += + direction === "next" ? autoScrollOffset : -1 * autoScrollOffset; + } + + if ( + thumbsSwiper.visibleSlidesIndexes && + thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0 + ) { + if (thumbsSwiper.params.centeredSlides) { + if (newThumbsIndex > currentThumbsIndex) { + newThumbsIndex = + newThumbsIndex - Math.floor(slidesPerView / 2) + 1; + } else { + newThumbsIndex = + newThumbsIndex + Math.floor(slidesPerView / 2) - 1; + } + } else if ( + newThumbsIndex > currentThumbsIndex && + thumbsSwiper.params.slidesPerGroup === 1 + ); + + thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined); + } + } // Activate thumbs + + let thumbsToActivate = 1; + const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass; + + if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) { + thumbsToActivate = swiper.params.slidesPerView; + } + + if (!swiper.params.thumbs.multipleActiveThumbs) { + thumbsToActivate = 1; + } + + thumbsToActivate = Math.floor(thumbsToActivate); + thumbsSwiper.slides.removeClass(thumbActiveClass); + + if ( + thumbsSwiper.params.loop || + (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) + ) { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.$wrapperEl + .children(`[data-swiper-slide-index="${swiper.realIndex + i}"]`) + .addClass(thumbActiveClass); + } + } else { + for (let i = 0; i < thumbsToActivate; i += 1) { + thumbsSwiper.slides + .eq(swiper.realIndex + i) + .addClass(thumbActiveClass); + } + } + } + + on("beforeInit", () => { + const { thumbs } = swiper.params; + if (!thumbs || !thumbs.swiper) return; + init(); + update(true); + }); + on("slideChange update resize observerUpdate", () => { + if (!swiper.thumbs.swiper) return; + update(); + }); + on("setTransition", (_s, duration) => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + thumbsSwiper.setTransition(duration); + }); + on("beforeDestroy", () => { + const thumbsSwiper = swiper.thumbs.swiper; + if (!thumbsSwiper) return; + + if (swiperCreated && thumbsSwiper) { + thumbsSwiper.destroy(); + } + }); + Object.assign(swiper.thumbs, { + init, + update, + }); + } + + function freeMode(_ref) { + let { swiper, extendParams, emit, once } = _ref; + extendParams({ + freeMode: { + enabled: false, + momentum: true, + momentumRatio: 1, + momentumBounce: true, + momentumBounceRatio: 1, + momentumVelocityRatio: 1, + sticky: false, + minimumVelocity: 0.02, + }, + }); + + function onTouchStart() { + const translate = swiper.getTranslate(); + swiper.setTranslate(translate); + swiper.setTransition(0); + swiper.touchEventsData.velocities.length = 0; + swiper.freeMode.onTouchEnd({ + currentPos: swiper.rtl ? swiper.translate : -swiper.translate, + }); + } + + function onTouchMove() { + const { touchEventsData: data, touches } = swiper; // Velocity + + if (data.velocities.length === 0) { + data.velocities.push({ + position: touches[swiper.isHorizontal() ? "startX" : "startY"], + time: data.touchStartTime, + }); + } + + data.velocities.push({ + position: touches[swiper.isHorizontal() ? "currentX" : "currentY"], + time: now(), + }); + } + + function onTouchEnd(_ref2) { + let { currentPos } = _ref2; + const { + params, + $wrapperEl, + rtlTranslate: rtl, + snapGrid, + touchEventsData: data, + } = swiper; // Time diff + + const touchEndTime = now(); + const timeDiff = touchEndTime - data.touchStartTime; + + if (currentPos < -swiper.minTranslate()) { + swiper.slideTo(swiper.activeIndex); + return; + } + + if (currentPos > -swiper.maxTranslate()) { + if (swiper.slides.length < snapGrid.length) { + swiper.slideTo(snapGrid.length - 1); + } else { + swiper.slideTo(swiper.slides.length - 1); + } + + return; + } + + if (params.freeMode.momentum) { + if (data.velocities.length > 1) { + const lastMoveEvent = data.velocities.pop(); + const velocityEvent = data.velocities.pop(); + const distance = lastMoveEvent.position - velocityEvent.position; + const time = lastMoveEvent.time - velocityEvent.time; + swiper.velocity = distance / time; + swiper.velocity /= 2; + + if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) { + swiper.velocity = 0; + } // this implies that the user stopped moving a finger then released. + // There would be no events with distance zero, so the last event is stale. + + if (time > 150 || now() - lastMoveEvent.time > 300) { + swiper.velocity = 0; + } + } else { + swiper.velocity = 0; + } + + swiper.velocity *= params.freeMode.momentumVelocityRatio; + data.velocities.length = 0; + let momentumDuration = 1000 * params.freeMode.momentumRatio; + const momentumDistance = swiper.velocity * momentumDuration; + let newPosition = swiper.translate + momentumDistance; + if (rtl) newPosition = -newPosition; + let doBounce = false; + let afterBouncePosition; + const bounceAmount = + Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio; + let needsLoopFix; + + if (newPosition < swiper.maxTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition + swiper.maxTranslate() < -bounceAmount) { + newPosition = swiper.maxTranslate() - bounceAmount; + } + + afterBouncePosition = swiper.maxTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.maxTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (newPosition > swiper.minTranslate()) { + if (params.freeMode.momentumBounce) { + if (newPosition - swiper.minTranslate() > bounceAmount) { + newPosition = swiper.minTranslate() + bounceAmount; + } + + afterBouncePosition = swiper.minTranslate(); + doBounce = true; + data.allowMomentumBounce = true; + } else { + newPosition = swiper.minTranslate(); + } + + if (params.loop && params.centeredSlides) needsLoopFix = true; + } else if (params.freeMode.sticky) { + let nextSlide; + + for (let j = 0; j < snapGrid.length; j += 1) { + if (snapGrid[j] > -newPosition) { + nextSlide = j; + break; + } + } + + if ( + Math.abs(snapGrid[nextSlide] - newPosition) < + Math.abs(snapGrid[nextSlide - 1] - newPosition) || + swiper.swipeDirection === "next" + ) { + newPosition = snapGrid[nextSlide]; + } else { + newPosition = snapGrid[nextSlide - 1]; + } + + newPosition = -newPosition; + } + + if (needsLoopFix) { + once("transitionEnd", () => { + swiper.loopFix(); + }); + } // Fix duration + + if (swiper.velocity !== 0) { + if (rtl) { + momentumDuration = Math.abs( + (-newPosition - swiper.translate) / swiper.velocity, + ); + } else { + momentumDuration = Math.abs( + (newPosition - swiper.translate) / swiper.velocity, + ); + } + + if (params.freeMode.sticky) { + // If freeMode.sticky is active and the user ends a swipe with a slow-velocity + // event, then durations can be 20+ seconds to slide one (or zero!) slides. + // It's easy to see this when simulating touch with mouse events. To fix this, + // limit single-slide swipes to the default slide duration. This also has the + // nice side effect of matching slide speed if the user stopped moving before + // lifting finger or mouse vs. moving slowly before lifting the finger/mouse. + // For faster swipes, also apply limits (albeit higher ones). + const moveDistance = Math.abs( + (rtl ? -newPosition : newPosition) - swiper.translate, + ); + const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex]; + + if (moveDistance < currentSlideSize) { + momentumDuration = params.speed; + } else if (moveDistance < 2 * currentSlideSize) { + momentumDuration = params.speed * 1.5; + } else { + momentumDuration = params.speed * 2.5; + } + } + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } + + if (params.freeMode.momentumBounce && doBounce) { + swiper.updateProgress(afterBouncePosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed || !data.allowMomentumBounce) + return; + emit("momentumBounce"); + swiper.setTransition(params.speed); + setTimeout(() => { + swiper.setTranslate(afterBouncePosition); + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + }, 0); + }); + } else if (swiper.velocity) { + emit("_freeModeNoMomentumRelease"); + swiper.updateProgress(newPosition); + swiper.setTransition(momentumDuration); + swiper.setTranslate(newPosition); + swiper.transitionStart(true, swiper.swipeDirection); + + if (!swiper.animating) { + swiper.animating = true; + $wrapperEl.transitionEnd(() => { + if (!swiper || swiper.destroyed) return; + swiper.transitionEnd(); + }); + } + } else { + swiper.updateProgress(newPosition); + } + + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } else if (params.freeMode.sticky) { + swiper.slideToClosest(); + return; + } else if (params.freeMode) { + emit("_freeModeNoMomentumRelease"); + } + + if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) { + swiper.updateProgress(); + swiper.updateActiveIndex(); + swiper.updateSlidesClasses(); + } + } + + Object.assign(swiper, { + freeMode: { + onTouchStart, + onTouchMove, + onTouchEnd, + }, + }); + } + + function Grid(_ref) { + let { swiper, extendParams } = _ref; + extendParams({ + grid: { + rows: 1, + fill: "column", + }, + }); + let slidesNumberEvenToRows; + let slidesPerRow; + let numFullColumns; + + const initSlides = (slidesLength) => { + const { slidesPerView } = swiper.params; + const { rows, fill } = swiper.params.grid; + slidesPerRow = slidesNumberEvenToRows / rows; + numFullColumns = Math.floor(slidesLength / rows); + + if (Math.floor(slidesLength / rows) === slidesLength / rows) { + slidesNumberEvenToRows = slidesLength; + } else { + slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows; + } + + if (slidesPerView !== "auto" && fill === "row") { + slidesNumberEvenToRows = Math.max( + slidesNumberEvenToRows, + slidesPerView * rows, + ); + } + }; + + const updateSlide = (i, slide, slidesLength, getDirectionLabel) => { + const { slidesPerGroup, spaceBetween } = swiper.params; + const { rows, fill } = swiper.params.grid; // Set slides order + + let newSlideOrderIndex; + let column; + let row; + + if (fill === "row" && slidesPerGroup > 1) { + const groupIndex = Math.floor(i / (slidesPerGroup * rows)); + const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex; + const columnsInGroup = + groupIndex === 0 + ? slidesPerGroup + : Math.min( + Math.ceil( + (slidesLength - groupIndex * rows * slidesPerGroup) / rows, + ), + slidesPerGroup, + ); + row = Math.floor(slideIndexInGroup / columnsInGroup); + column = + slideIndexInGroup - + row * columnsInGroup + + groupIndex * slidesPerGroup; + newSlideOrderIndex = column + (row * slidesNumberEvenToRows) / rows; + slide.css({ + "-webkit-order": newSlideOrderIndex, + order: newSlideOrderIndex, + }); + } else if (fill === "column") { + column = Math.floor(i / rows); + row = i - column * rows; + + if ( + column > numFullColumns || + (column === numFullColumns && row === rows - 1) + ) { + row += 1; + + if (row >= rows) { + row = 0; + column += 1; + } + } + } else { + row = Math.floor(i / slidesPerRow); + column = i - row * slidesPerRow; + } + + slide.css( + getDirectionLabel("margin-top"), + row !== 0 ? spaceBetween && `${spaceBetween}px` : "", + ); + }; + + const updateWrapperSize = (slideSize, snapGrid, getDirectionLabel) => { + const { spaceBetween, centeredSlides, roundLengths } = swiper.params; + const { rows } = swiper.params.grid; + swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows; + swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween; + swiper.$wrapperEl.css({ + [getDirectionLabel("width")]: `${swiper.virtualSize + spaceBetween}px`, + }); + + if (centeredSlides) { + snapGrid.splice(0, snapGrid.length); + const newSlidesGrid = []; + + for (let i = 0; i < snapGrid.length; i += 1) { + let slidesGridItem = snapGrid[i]; + if (roundLengths) slidesGridItem = Math.floor(slidesGridItem); + if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) + newSlidesGrid.push(slidesGridItem); + } + + snapGrid.push(...newSlidesGrid); + } + }; + + swiper.grid = { + initSlides, + updateSlide, + updateWrapperSize, + }; + } + + function appendSlide(slides) { + const swiper = this; + const { $wrapperEl, params } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + if (typeof slides === "object" && "length" in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + } else { + $wrapperEl.append(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + } + + function prependSlide(slides) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + + if (params.loop) { + swiper.loopDestroy(); + } + + let newActiveIndex = activeIndex + 1; + + if (typeof slides === "object" && "length" in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.prepend(slides[i]); + } + + newActiveIndex = activeIndex + slides.length; + } else { + $wrapperEl.prepend(slides); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + swiper.slideTo(newActiveIndex, 0, false); + } + + function addSlide(index, slides) { + const swiper = this; + const { $wrapperEl, params, activeIndex } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + const baseLength = swiper.slides.length; + + if (index <= 0) { + swiper.prependSlide(slides); + return; + } + + if (index >= baseLength) { + swiper.appendSlide(slides); + return; + } + + let newActiveIndex = + activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer; + const slidesBuffer = []; + + for (let i = baseLength - 1; i >= index; i -= 1) { + const currentSlide = swiper.slides.eq(i); + currentSlide.remove(); + slidesBuffer.unshift(currentSlide); + } + + if (typeof slides === "object" && "length" in slides) { + for (let i = 0; i < slides.length; i += 1) { + if (slides[i]) $wrapperEl.append(slides[i]); + } + + newActiveIndex = + activeIndexBuffer > index + ? activeIndexBuffer + slides.length + : activeIndexBuffer; + } else { + $wrapperEl.append(slides); + } + + for (let i = 0; i < slidesBuffer.length; i += 1) { + $wrapperEl.append(slidesBuffer[i]); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeSlide(slidesIndexes) { + const swiper = this; + const { params, $wrapperEl, activeIndex } = swiper; + let activeIndexBuffer = activeIndex; + + if (params.loop) { + activeIndexBuffer -= swiper.loopedSlides; + swiper.loopDestroy(); + swiper.slides = $wrapperEl.children(`.${params.slideClass}`); + } + + let newActiveIndex = activeIndexBuffer; + let indexToRemove; + + if (typeof slidesIndexes === "object" && "length" in slidesIndexes) { + for (let i = 0; i < slidesIndexes.length; i += 1) { + indexToRemove = slidesIndexes[i]; + if (swiper.slides[indexToRemove]) + swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + } + + newActiveIndex = Math.max(newActiveIndex, 0); + } else { + indexToRemove = slidesIndexes; + if (swiper.slides[indexToRemove]) + swiper.slides.eq(indexToRemove).remove(); + if (indexToRemove < newActiveIndex) newActiveIndex -= 1; + newActiveIndex = Math.max(newActiveIndex, 0); + } + + if (params.loop) { + swiper.loopCreate(); + } + + if (!params.observer) { + swiper.update(); + } + + if (params.loop) { + swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false); + } else { + swiper.slideTo(newActiveIndex, 0, false); + } + } + + function removeAllSlides() { + const swiper = this; + const slidesIndexes = []; + + for (let i = 0; i < swiper.slides.length; i += 1) { + slidesIndexes.push(i); + } + + swiper.removeSlide(slidesIndexes); + } + + function Manipulation(_ref) { + let { swiper } = _ref; + Object.assign(swiper, { + appendSlide: appendSlide.bind(swiper), + prependSlide: prependSlide.bind(swiper), + addSlide: addSlide.bind(swiper), + removeSlide: removeSlide.bind(swiper), + removeAllSlides: removeAllSlides.bind(swiper), + }); + } + + function effectInit(params) { + const { + effect, + swiper, + on, + setTranslate, + setTransition, + overwriteParams, + perspective, + } = params; + on("beforeInit", () => { + if (swiper.params.effect !== effect) return; + swiper.classNames.push( + `${swiper.params.containerModifierClass}${effect}`, + ); + + if (perspective && perspective()) { + swiper.classNames.push(`${swiper.params.containerModifierClass}3d`); + } + + const overwriteParamsResult = overwriteParams ? overwriteParams() : {}; + Object.assign(swiper.params, overwriteParamsResult); + Object.assign(swiper.originalParams, overwriteParamsResult); + }); + on("setTranslate", () => { + if (swiper.params.effect !== effect) return; + setTranslate(); + }); + on("setTransition", (_s, duration) => { + if (swiper.params.effect !== effect) return; + setTransition(duration); + }); + let requireUpdateOnVirtual; + on("virtualUpdate", () => { + if (!swiper.slides.length) { + requireUpdateOnVirtual = true; + } + + requestAnimationFrame(() => { + if (requireUpdateOnVirtual && swiper.slides.length) { + setTranslate(); + requireUpdateOnVirtual = false; + } + }); + }); + } + + function effectTarget(effectParams, $slideEl) { + if (effectParams.transformEl) { + return $slideEl.find(effectParams.transformEl).css({ + "backface-visibility": "hidden", + "-webkit-backface-visibility": "hidden", + }); + } + + return $slideEl; + } + + function effectVirtualTransitionEnd(_ref) { + let { swiper, duration, transformEl, allSlides } = _ref; + const { slides, activeIndex, $wrapperEl } = swiper; + + if (swiper.params.virtualTranslate && duration !== 0) { + let eventTriggered = false; + let $transitionEndTarget; + + if (allSlides) { + $transitionEndTarget = transformEl ? slides.find(transformEl) : slides; + } else { + $transitionEndTarget = transformEl + ? slides.eq(activeIndex).find(transformEl) + : slides.eq(activeIndex); + } + + $transitionEndTarget.transitionEnd(() => { + if (eventTriggered) return; + if (!swiper || swiper.destroyed) return; + eventTriggered = true; + swiper.animating = false; + const triggerEvents = ["webkitTransitionEnd", "transitionend"]; + + for (let i = 0; i < triggerEvents.length; i += 1) { + $wrapperEl.trigger(triggerEvents[i]); + } + }); + } + } + + function EffectFade(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + fadeEffect: { + crossFade: false, + transformEl: null, + }, + }); + + const setTranslate = () => { + const { slides } = swiper; + const params = swiper.params.fadeEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = swiper.slides.eq(i); + const offset = $slideEl[0].swiperSlideOffset; + let tx = -offset; + if (!swiper.params.virtualTranslate) tx -= swiper.translate; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + } + + const slideOpacity = swiper.params.fadeEffect.crossFade + ? Math.max(1 - Math.abs($slideEl[0].progress), 0) + : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0); + const $targetEl = effectTarget(params, $slideEl); + $targetEl + .css({ + opacity: slideOpacity, + }) + .transform(`translate3d(${tx}px, ${ty}px, 0px)`); + } + }; + + const setTransition = (duration) => { + const { transformEl } = swiper.params.fadeEffect; + const $transitionElements = transformEl + ? swiper.slides.find(transformEl) + : swiper.slides; + $transitionElements.transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true, + }); + }; + + effectInit({ + effect: "fade", + swiper, + on, + setTranslate, + setTransition, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode, + }), + }); + } + + function EffectCube(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + cubeEffect: { + slideShadows: true, + shadow: true, + shadowOffset: 20, + shadowScale: 0.94, + }, + }); + + const setTranslate = () => { + const { + $el, + $wrapperEl, + slides, + width: swiperWidth, + height: swiperHeight, + rtlTranslate: rtl, + size: swiperSize, + browser, + } = swiper; + const params = swiper.params.cubeEffect; + const isHorizontal = swiper.isHorizontal(); + const isVirtual = swiper.virtual && swiper.params.virtual.enabled; + let wrapperRotate = 0; + let $cubeShadowEl; + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl = $wrapperEl.find(".swiper-cube-shadow"); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $wrapperEl.append($cubeShadowEl); + } + + $cubeShadowEl.css({ + height: `${swiperWidth}px`, + }); + } else { + $cubeShadowEl = $el.find(".swiper-cube-shadow"); + + if ($cubeShadowEl.length === 0) { + $cubeShadowEl = $('
'); + $el.append($cubeShadowEl); + } + } + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let slideIndex = i; + + if (isVirtual) { + slideIndex = parseInt($slideEl.attr("data-swiper-slide-index"), 10); + } + + let slideAngle = slideIndex * 90; + let round = Math.floor(slideAngle / 360); + + if (rtl) { + slideAngle = -slideAngle; + round = Math.floor(-slideAngle / 360); + } + + const progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + let tx = 0; + let ty = 0; + let tz = 0; + + if (slideIndex % 4 === 0) { + tx = -round * 4 * swiperSize; + tz = 0; + } else if ((slideIndex - 1) % 4 === 0) { + tx = 0; + tz = -round * 4 * swiperSize; + } else if ((slideIndex - 2) % 4 === 0) { + tx = swiperSize + round * 4 * swiperSize; + tz = swiperSize; + } else if ((slideIndex - 3) % 4 === 0) { + tx = -swiperSize; + tz = 3 * swiperSize + swiperSize * 4 * round; + } + + if (rtl) { + tx = -tx; + } + + if (!isHorizontal) { + ty = tx; + tx = 0; + } + + const transform = `rotateX(${ + isHorizontal ? 0 : -slideAngle + }deg) rotateY(${ + isHorizontal ? slideAngle : 0 + }deg) translate3d(${tx}px, ${ty}px, ${tz}px)`; + + if (progress <= 1 && progress > -1) { + wrapperRotate = slideIndex * 90 + progress * 90; + if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90; + } + + $slideEl.transform(transform); + + if (params.slideShadows) { + // Set shadows + let shadowBefore = isHorizontal + ? $slideEl.find(".swiper-slide-shadow-left") + : $slideEl.find(".swiper-slide-shadow-top"); + let shadowAfter = isHorizontal + ? $slideEl.find(".swiper-slide-shadow-right") + : $slideEl.find(".swiper-slide-shadow-bottom"); + + if (shadowBefore.length === 0) { + shadowBefore = $( + `
`, + ); + $slideEl.append(shadowBefore); + } + + if (shadowAfter.length === 0) { + shadowAfter = $( + `
`, + ); + $slideEl.append(shadowAfter); + } + + if (shadowBefore.length) + shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) + shadowAfter[0].style.opacity = Math.max(progress, 0); + } + } + + $wrapperEl.css({ + "-webkit-transform-origin": `50% 50% -${swiperSize / 2}px`, + "transform-origin": `50% 50% -${swiperSize / 2}px`, + }); + + if (params.shadow) { + if (isHorizontal) { + $cubeShadowEl.transform( + `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${ + -swiperWidth / 2 + }px) rotateX(90deg) rotateZ(0deg) scale(${params.shadowScale})`, + ); + } else { + const shadowAngle = + Math.abs(wrapperRotate) - + Math.floor(Math.abs(wrapperRotate) / 90) * 90; + const multiplier = + 1.5 - + (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2 + + Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2); + const scale1 = params.shadowScale; + const scale2 = params.shadowScale / multiplier; + const offset = params.shadowOffset; + $cubeShadowEl.transform( + `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${ + swiperHeight / 2 + offset + }px, ${-swiperHeight / 2 / scale2}px) rotateX(-90deg)`, + ); + } + } + + const zFactor = + browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0; + $wrapperEl.transform( + `translate3d(0px,0,${zFactor}px) rotateX(${ + swiper.isHorizontal() ? 0 : wrapperRotate + }deg) rotateY(${swiper.isHorizontal() ? -wrapperRotate : 0}deg)`, + ); + }; + + const setTransition = (duration) => { + const { $el, slides } = swiper; + slides + .transition(duration) + .find( + ".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left", + ) + .transition(duration); + + if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) { + $el.find(".swiper-cube-shadow").transition(duration); + } + }; + + effectInit({ + effect: "cube", + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + resistanceRatio: 0, + spaceBetween: 0, + centeredSlides: false, + virtualTranslate: true, + }), + }); + } + + function createShadow(params, $slideEl, side) { + const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ""}`; + const $shadowContainer = params.transformEl + ? $slideEl.find(params.transformEl) + : $slideEl; + let $shadowEl = $shadowContainer.children(`.${shadowClass}`); + + if (!$shadowEl.length) { + $shadowEl = $( + `
`, + ); + $shadowContainer.append($shadowEl); + } + + return $shadowEl; + } + + function EffectFlip(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + flipEffect: { + slideShadows: true, + limitRotation: true, + transformEl: null, + }, + }); + + const setTranslate = () => { + const { slides, rtlTranslate: rtl } = swiper; + const params = swiper.params.flipEffect; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + let progress = $slideEl[0].progress; + + if (swiper.params.flipEffect.limitRotation) { + progress = Math.max(Math.min($slideEl[0].progress, 1), -1); + } + + const offset = $slideEl[0].swiperSlideOffset; + const rotate = -180 * progress; + let rotateY = rotate; + let rotateX = 0; + let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let ty = 0; + + if (!swiper.isHorizontal()) { + ty = tx; + tx = 0; + rotateX = -rotateY; + rotateY = 0; + } else if (rtl) { + rotateY = -rotateY; + } + + $slideEl[0].style.zIndex = + -Math.abs(Math.round(progress)) + slides.length; + + if (params.slideShadows) { + // Set shadows + let shadowBefore = swiper.isHorizontal() + ? $slideEl.find(".swiper-slide-shadow-left") + : $slideEl.find(".swiper-slide-shadow-top"); + let shadowAfter = swiper.isHorizontal() + ? $slideEl.find(".swiper-slide-shadow-right") + : $slideEl.find(".swiper-slide-shadow-bottom"); + + if (shadowBefore.length === 0) { + shadowBefore = createShadow( + params, + $slideEl, + swiper.isHorizontal() ? "left" : "top", + ); + } + + if (shadowAfter.length === 0) { + shadowAfter = createShadow( + params, + $slideEl, + swiper.isHorizontal() ? "right" : "bottom", + ); + } + + if (shadowBefore.length) + shadowBefore[0].style.opacity = Math.max(-progress, 0); + if (shadowAfter.length) + shadowAfter[0].style.opacity = Math.max(progress, 0); + } + + const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = (duration) => { + const { transformEl } = swiper.params.flipEffect; + const $transitionElements = transformEl + ? swiper.slides.find(transformEl) + : swiper.slides; + $transitionElements + .transition(duration) + .find( + ".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left", + ) + .transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + }); + }; + + effectInit({ + effect: "flip", + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + slidesPerView: 1, + slidesPerGroup: 1, + watchSlidesProgress: true, + spaceBetween: 0, + virtualTranslate: !swiper.params.cssMode, + }), + }); + } + + function EffectCoverflow(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + coverflowEffect: { + rotate: 50, + stretch: 0, + depth: 100, + scale: 1, + modifier: 1, + slideShadows: true, + transformEl: null, + }, + }); + + const setTranslate = () => { + const { + width: swiperWidth, + height: swiperHeight, + slides, + slidesSizesGrid, + } = swiper; + const params = swiper.params.coverflowEffect; + const isHorizontal = swiper.isHorizontal(); + const transform = swiper.translate; + const center = isHorizontal + ? -transform + swiperWidth / 2 + : -transform + swiperHeight / 2; + const rotate = isHorizontal ? params.rotate : -params.rotate; + const translate = params.depth; // Each slide offset from center + + for (let i = 0, length = slides.length; i < length; i += 1) { + const $slideEl = slides.eq(i); + const slideSize = slidesSizesGrid[i]; + const slideOffset = $slideEl[0].swiperSlideOffset; + const centerOffset = (center - slideOffset - slideSize / 2) / slideSize; + const offsetMultiplier = + typeof params.modifier === "function" + ? params.modifier(centerOffset) + : centerOffset * params.modifier; + let rotateY = isHorizontal ? rotate * offsetMultiplier : 0; + let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0 + + let translateZ = -translate * Math.abs(offsetMultiplier); + let stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders + + if (typeof stretch === "string" && stretch.indexOf("%") !== -1) { + stretch = (parseFloat(params.stretch) / 100) * slideSize; + } + + let translateY = isHorizontal ? 0 : stretch * offsetMultiplier; + let translateX = isHorizontal ? stretch * offsetMultiplier : 0; + let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values + + if (Math.abs(translateX) < 0.001) translateX = 0; + if (Math.abs(translateY) < 0.001) translateY = 0; + if (Math.abs(translateZ) < 0.001) translateZ = 0; + if (Math.abs(rotateY) < 0.001) rotateY = 0; + if (Math.abs(rotateX) < 0.001) rotateX = 0; + if (Math.abs(scale) < 0.001) scale = 0; + const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(${scale})`; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(slideTransform); + $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1; + + if (params.slideShadows) { + // Set shadows + let $shadowBeforeEl = isHorizontal + ? $slideEl.find(".swiper-slide-shadow-left") + : $slideEl.find(".swiper-slide-shadow-top"); + let $shadowAfterEl = isHorizontal + ? $slideEl.find(".swiper-slide-shadow-right") + : $slideEl.find(".swiper-slide-shadow-bottom"); + + if ($shadowBeforeEl.length === 0) { + $shadowBeforeEl = createShadow( + params, + $slideEl, + isHorizontal ? "left" : "top", + ); + } + + if ($shadowAfterEl.length === 0) { + $shadowAfterEl = createShadow( + params, + $slideEl, + isHorizontal ? "right" : "bottom", + ); + } + + if ($shadowBeforeEl.length) + $shadowBeforeEl[0].style.opacity = + offsetMultiplier > 0 ? offsetMultiplier : 0; + if ($shadowAfterEl.length) + $shadowAfterEl[0].style.opacity = + -offsetMultiplier > 0 ? -offsetMultiplier : 0; + } + } + }; + + const setTransition = (duration) => { + const { transformEl } = swiper.params.coverflowEffect; + const $transitionElements = transformEl + ? swiper.slides.find(transformEl) + : swiper.slides; + $transitionElements + .transition(duration) + .find( + ".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left", + ) + .transition(duration); + }; + + effectInit({ + effect: "coverflow", + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true, + }), + }); + } + + function EffectCreative(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + creativeEffect: { + transformEl: null, + limitProgress: 1, + shadowPerProgress: false, + progressMultiplier: 1, + perspective: true, + prev: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1, + }, + next: { + translate: [0, 0, 0], + rotate: [0, 0, 0], + opacity: 1, + scale: 1, + }, + }, + }); + + const getTranslateValue = (value) => { + if (typeof value === "string") return value; + return `${value}px`; + }; + + const setTranslate = () => { + const { slides, $wrapperEl, slidesSizesGrid } = swiper; + const params = swiper.params.creativeEffect; + const { progressMultiplier: multiplier } = params; + const isCenteredSlides = swiper.params.centeredSlides; + + if (isCenteredSlides) { + const margin = + slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0; + $wrapperEl.transform(`translateX(calc(50% - ${margin}px))`); + } + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min( + Math.max($slideEl[0].progress, -params.limitProgress), + params.limitProgress, + ); + let originalProgress = progress; + + if (!isCenteredSlides) { + originalProgress = Math.min( + Math.max($slideEl[0].originalProgress, -params.limitProgress), + params.limitProgress, + ); + } + + const offset = $slideEl[0].swiperSlideOffset; + const t = [ + swiper.params.cssMode ? -offset - swiper.translate : -offset, + 0, + 0, + ]; + const r = [0, 0, 0]; + let custom = false; + + if (!swiper.isHorizontal()) { + t[1] = t[0]; + t[0] = 0; + } + + let data = { + translate: [0, 0, 0], + rotate: [0, 0, 0], + scale: 1, + opacity: 1, + }; + + if (progress < 0) { + data = params.next; + custom = true; + } else if (progress > 0) { + data = params.prev; + custom = true; + } // set translate + + t.forEach((value, index) => { + t[index] = `calc(${value}px + (${getTranslateValue( + data.translate[index], + )} * ${Math.abs(progress * multiplier)}))`; + }); // set rotates + + r.forEach((value, index) => { + r[index] = data.rotate[index] * Math.abs(progress * multiplier); + }); + $slideEl[0].style.zIndex = + -Math.abs(Math.round(slideProgress)) + slides.length; + const translateString = t.join(", "); + const rotateString = `rotateX(${r[0]}deg) rotateY(${r[1]}deg) rotateZ(${r[2]}deg)`; + const scaleString = + originalProgress < 0 + ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` + : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`; + const opacityString = + originalProgress < 0 + ? 1 + (1 - data.opacity) * originalProgress * multiplier + : 1 - (1 - data.opacity) * originalProgress * multiplier; + const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`; // Set shadows + + if ((custom && data.shadow) || !custom) { + let $shadowEl = $slideEl.children(".swiper-slide-shadow"); + + if ($shadowEl.length === 0 && data.shadow) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) { + const shadowOpacity = params.shadowPerProgress + ? progress * (1 / params.limitProgress) + : progress; + $shadowEl[0].style.opacity = Math.min( + Math.max(Math.abs(shadowOpacity), 0), + 1, + ); + } + } + + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform).css({ + opacity: opacityString, + }); + + if (data.origin) { + $targetEl.css("transform-origin", data.origin); + } + } + }; + + const setTransition = (duration) => { + const { transformEl } = swiper.params.creativeEffect; + const $transitionElements = transformEl + ? swiper.slides.find(transformEl) + : swiper.slides; + $transitionElements + .transition(duration) + .find(".swiper-slide-shadow") + .transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + allSlides: true, + }); + }; + + effectInit({ + effect: "creative", + swiper, + on, + setTranslate, + setTransition, + perspective: () => swiper.params.creativeEffect.perspective, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode, + }), + }); + } + + function EffectCards(_ref) { + let { swiper, extendParams, on } = _ref; + extendParams({ + cardsEffect: { + slideShadows: true, + transformEl: null, + }, + }); + + const setTranslate = () => { + const { slides, activeIndex } = swiper; + const params = swiper.params.cardsEffect; + const { startTranslate, isTouched } = swiper.touchEventsData; + const currentTranslate = swiper.translate; + + for (let i = 0; i < slides.length; i += 1) { + const $slideEl = slides.eq(i); + const slideProgress = $slideEl[0].progress; + const progress = Math.min(Math.max(slideProgress, -4), 4); + let offset = $slideEl[0].swiperSlideOffset; + + if (swiper.params.centeredSlides && !swiper.params.cssMode) { + swiper.$wrapperEl.transform(`translateX(${swiper.minTranslate()}px)`); + } + + if (swiper.params.centeredSlides && swiper.params.cssMode) { + offset -= slides[0].swiperSlideOffset; + } + + let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset; + let tY = 0; + const tZ = -100 * Math.abs(progress); + let scale = 1; + let rotate = -2 * progress; + let tXAdd = 8 - Math.abs(progress) * 0.75; + const slideIndex = + swiper.virtual && swiper.params.virtual.enabled + ? swiper.virtual.from + i + : i; + const isSwipeToNext = + (slideIndex === activeIndex || slideIndex === activeIndex - 1) && + progress > 0 && + progress < 1 && + (isTouched || swiper.params.cssMode) && + currentTranslate < startTranslate; + const isSwipeToPrev = + (slideIndex === activeIndex || slideIndex === activeIndex + 1) && + progress < 0 && + progress > -1 && + (isTouched || swiper.params.cssMode) && + currentTranslate > startTranslate; + + if (isSwipeToNext || isSwipeToPrev) { + const subProgress = + (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5; + rotate += -28 * progress * subProgress; + scale += -0.5 * subProgress; + tXAdd += 96 * subProgress; + tY = `${-25 * subProgress * Math.abs(progress)}%`; + } + + if (progress < 0) { + // next + tX = `calc(${tX}px + (${tXAdd * Math.abs(progress)}%))`; + } else if (progress > 0) { + // prev + tX = `calc(${tX}px + (-${tXAdd * Math.abs(progress)}%))`; + } else { + tX = `${tX}px`; + } + + if (!swiper.isHorizontal()) { + const prevY = tY; + tY = tX; + tX = prevY; + } + + const scaleString = + progress < 0 + ? `${1 + (1 - scale) * progress}` + : `${1 - (1 - scale) * progress}`; + const transform = ` + translate3d(${tX}, ${tY}, ${tZ}px) + rotateZ(${rotate}deg) + scale(${scaleString}) + `; + + if (params.slideShadows) { + // Set shadows + let $shadowEl = $slideEl.find(".swiper-slide-shadow"); + + if ($shadowEl.length === 0) { + $shadowEl = createShadow(params, $slideEl); + } + + if ($shadowEl.length) + $shadowEl[0].style.opacity = Math.min( + Math.max((Math.abs(progress) - 0.5) / 0.5, 0), + 1, + ); + } + + $slideEl[0].style.zIndex = + -Math.abs(Math.round(slideProgress)) + slides.length; + const $targetEl = effectTarget(params, $slideEl); + $targetEl.transform(transform); + } + }; + + const setTransition = (duration) => { + const { transformEl } = swiper.params.cardsEffect; + const $transitionElements = transformEl + ? swiper.slides.find(transformEl) + : swiper.slides; + $transitionElements + .transition(duration) + .find(".swiper-slide-shadow") + .transition(duration); + effectVirtualTransitionEnd({ + swiper, + duration, + transformEl, + }); + }; + + effectInit({ + effect: "cards", + swiper, + on, + setTranslate, + setTransition, + perspective: () => true, + overwriteParams: () => ({ + watchSlidesProgress: true, + virtualTranslate: !swiper.params.cssMode, + }), + }); + } + + // Swiper Class + const modules = [ + Virtual, + Keyboard, + Mousewheel, + Navigation, + Pagination, + Scrollbar, + Parallax, + Zoom, + Lazy, + Controller, + A11y, + History, + HashNavigation, + Autoplay, + Thumb, + freeMode, + Grid, + Manipulation, + EffectFade, + EffectCube, + EffectFlip, + EffectCoverflow, + EffectCreative, + EffectCards, + ]; + Swiper.use(modules); + + return Swiper; +}); diff --git a/themes/hugoplate/assets/scss/base.scss b/themes/hugoplate/assets/scss/base.scss new file mode 100755 index 0000000..2fac7c2 --- /dev/null +++ b/themes/hugoplate/assets/scss/base.scss @@ -0,0 +1,59 @@ +html { + @apply text-base-sm md:text-base; +} + +body { + @apply bg-body text-base dark:bg-darkmode-body font-primary font-normal leading-relaxed text-text dark:text-darkmode-text; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + @apply font-secondary font-bold leading-tight text-dark dark:text-darkmode-dark; +} + +h1, +.h1 { + @apply text-h1-sm md:text-h1; +} + +h2, +.h2 { + @apply text-h2-sm md:text-h2; +} + +h3, +.h3 { + @apply text-h3-sm md:text-h3; +} + +h4, +.h4 { + @apply text-h4; +} + +h5, +.h5 { + @apply text-h5; +} + +h6, +.h6 { + @apply text-h6; +} + +b, +strong { + @apply font-semibold; +} + +code { + @apply after:border-none; +} + +blockquote > p { + @apply my-0 #{!important}; +} diff --git a/themes/hugoplate/assets/scss/buttons.scss b/themes/hugoplate/assets/scss/buttons.scss new file mode 100755 index 0000000..b44a41d --- /dev/null +++ b/themes/hugoplate/assets/scss/buttons.scss @@ -0,0 +1,15 @@ +.btn { + @apply inline-block rounded border border-transparent px-5 py-2 font-semibold capitalize transition; +} + +.btn-sm { + @apply rounded-sm px-4 py-1.5 text-sm; +} + +.btn-primary { + @apply border-primary bg-primary dark:border-darkmode-primary dark:text-dark text-white dark:bg-darkmode-primary; +} + +.btn-outline-primary { + @apply border-dark text-dark hover:bg-dark dark:hover:text-dark bg-transparent hover:text-white dark:border-darkmode-primary dark:text-white dark:hover:bg-darkmode-primary; +} diff --git a/themes/hugoplate/assets/scss/components.scss b/themes/hugoplate/assets/scss/components.scss new file mode 100755 index 0000000..213d5a1 --- /dev/null +++ b/themes/hugoplate/assets/scss/components.scss @@ -0,0 +1,74 @@ +main { + min-height: 70vh; +} + +// section style +.section { + @apply py-24 xl:py-28; + &-sm { + @apply py-16 xl:py-20; + } +} + +// container +.container { + @apply mx-auto px-4 2xl:max-w-[1320px]; +} + +// form style +.form-input { + @apply bg-theme-light text-dark placeholder:text-light focus:border-primary dark:border-darkmode-border dark:bg-darkmode-theme-light dark:text-darkmode-light w-full rounded border-transparent px-6 py-4 focus:ring-transparent; +} + +.form-label { + @apply font-secondary text-dark dark:text-darkmode-light mb-4 block text-xl font-normal; +} + +// social icons +.social-icons { + @apply space-x-4; + li { + @apply inline-block; + a { + @apply bg-primary dark:bg-darkmode-primary dark:text-dark flex h-9 w-9 items-center justify-center rounded text-center leading-9 text-white; + svg { + @apply h-5 w-5; + } + } + } +} + +// swiper pagination +.swiper-pagination-bullet { + @apply bg-theme-light dark:bg-darkmode-theme-light h-2.5 w-2.5 opacity-100 mx-1.5 #{!important}; + + &-active { + @apply bg-primary dark:bg-darkmode-primary h-4 w-4 #{!important}; + } +} + +// content style +.content { + @apply prose max-w-none; + @apply prose-headings:mb-[.3em] prose-headings:mt-[.6em] prose-headings:text-dark prose-headings:dark:text-darkmode-dark; + @apply prose-h1:text-h1-sm md:prose-h1:text-h1; + @apply prose-h2:text-h2-sm md:prose-h2:text-h2; + @apply prose-h3:text-h3-sm md:prose-h3:text-h3; + @apply prose-img:max-w-full prose-img:rounded; + @apply prose-hr:border-border prose-hr:dark:border-darkmode-border; + @apply prose-p:text-base prose-p:text-text prose-p:dark:text-darkmode-text; + @apply prose-blockquote:rounded-lg prose-blockquote:border prose-blockquote:border-l-[10px] prose-blockquote:border-primary prose-blockquote:bg-theme-light prose-blockquote:px-8 prose-blockquote:py-10 prose-blockquote:font-secondary prose-blockquote:text-2xl prose-blockquote:not-italic prose-blockquote:text-dark prose-blockquote:dark:border-darkmode-primary prose-blockquote:dark:bg-darkmode-theme-light prose-blockquote:dark:text-darkmode-light; + @apply prose-pre:rounded-lg prose-pre:bg-theme-light prose-pre:dark:bg-darkmode-theme-light; + @apply prose-code:px-1 prose-code:dark:text-darkmode-light; + @apply prose-strong:text-dark prose-strong:dark:text-darkmode-text; + @apply prose-a:text-text prose-a:underline hover:prose-a:text-primary prose-a:dark:text-darkmode-text hover:prose-a:dark:text-darkmode-primary; + @apply prose-li:text-text prose-li:dark:text-darkmode-text; + @apply prose-table:relative prose-table:overflow-hidden prose-table:rounded-lg prose-table:before:absolute prose-table:before:left-0 prose-table:before:top-0 prose-table:before:h-full prose-table:before:w-full prose-table:before:rounded-[inherit] prose-table:before:border prose-table:before:content-[""] prose-table:before:dark:border-darkmode-border; + @apply prose-thead:border-border prose-thead:bg-theme-light prose-thead:dark:border-darkmode-border prose-thead:dark:bg-darkmode-theme-light; + @apply prose-th:relative prose-th:z-10 prose-th:px-4 prose-th:py-[18px] prose-th:text-dark prose-th:dark:text-darkmode-text; + @apply prose-tr:border-border prose-tr:dark:border-darkmode-border; + @apply prose-td:relative prose-td:z-10 prose-td:px-3 prose-td:py-[18px] prose-td:dark:text-darkmode-text; + .btn { + @apply dark:hover:text-dark no-underline hover:text-white #{!important}; + } +} diff --git a/themes/hugoplate/assets/scss/custom.scss b/themes/hugoplate/assets/scss/custom.scss new file mode 100644 index 0000000..6dc68fe --- /dev/null +++ b/themes/hugoplate/assets/scss/custom.scss @@ -0,0 +1,2 @@ +// DO NOT WRITE ANY STYLE IN THIS FILE +// If you want to add your own styles, please write it in the `./assets/scss/custom.scss` file. diff --git a/themes/hugoplate/assets/scss/main.scss b/themes/hugoplate/assets/scss/main.scss new file mode 100755 index 0000000..4bbaf78 --- /dev/null +++ b/themes/hugoplate/assets/scss/main.scss @@ -0,0 +1,30 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + @import "base"; +} + +@layer components { + @import "components"; + @import "navigation"; + @import "buttons"; +} + +@layer utilities { + @import "utilities"; +} + +@import "search"; +@import "social-share"; +@import "gallery-slider"; +@import "images"; +@import "toc"; +@import "tab"; +@import "accordion"; +@import "modal"; +@import "notice"; + +@import "module-overrides"; +@import "custom"; diff --git a/themes/hugoplate/assets/scss/module-overrides.scss b/themes/hugoplate/assets/scss/module-overrides.scss new file mode 100644 index 0000000..d1a0f25 --- /dev/null +++ b/themes/hugoplate/assets/scss/module-overrides.scss @@ -0,0 +1,58 @@ +// table of contents +.table-of-content { + @apply overflow-hidden rounded; +} + +// share icons +.share-icons { + .share-link { + @apply h-9 w-9 rounded leading-9; + @apply bg-primary hover:bg-primary dark:bg-darkmode-primary dark:hover:bg-darkmode-primary; + } + .share-icon svg { + @apply dark:fill-dark; + } +} + +// notice +.notice { + @apply rounded-lg; +} + +// tab +.tab { + @apply border-border dark:border-darkmode-border overflow-hidden rounded-lg border; + &-nav { + @apply border-border bg-theme-light dark:border-darkmode-border dark:bg-darkmode-theme-light pl-4; + + &-item { + @apply text-dark dark:text-darkmode-dark px-8 text-lg #{!important}; + &.active { + @apply border-dark dark:border-darkmode-primary; + } + } + } + &-content { + &-panel { + @apply px-4 pt-0 #{!important}; + } + } +} + +// accordion +.accordion { + @apply border-border bg-theme-light dark:border-darkmode-border dark:bg-darkmode-theme-light mb-6 overflow-hidden rounded-lg border; + &-header { + @apply text-dark dark:text-darkmode-dark; + } +} + +// cookie consent +.cookie-box { + @apply rounded-lg #{!important}; +} + +// slider +.gallery-slider { + @apply ml-0 #{!important}; +} diff --git a/themes/hugoplate/assets/scss/navigation.scss b/themes/hugoplate/assets/scss/navigation.scss new file mode 100755 index 0000000..24fc9e1 --- /dev/null +++ b/themes/hugoplate/assets/scss/navigation.scss @@ -0,0 +1,87 @@ +// navbar toggler +input#nav-toggle:checked + label #show-button { + @apply hidden; +} + +input#nav-toggle:checked + label #hide-button { + @apply block; +} + +input#nav-toggle:checked ~ #nav-menu { + @apply block; +} + +.header { + @apply bg-body dark:bg-darkmode-body py-6; +} + +// navbar items +.navbar { + @apply relative flex flex-wrap items-center justify-between; +} + +.navbar-brand { + @apply text-dark dark:text-darkmode-dark text-xl font-semibold; + image { + @apply max-h-full max-w-full; + } +} + +.navbar-nav { + @apply text-center lg:text-left; +} + +// .nav-item { +// @apply mx-3; +// } + +.nav-link { + @apply text-dark hover:text-primary dark:text-darkmode-dark dark:hover:text-darkmode-primary block p-3 cursor-pointer font-semibold transition lg:px-2 lg:py-3; +} + +.nav-dropdown { + @apply mr-0; + & > svg { + @apply pointer-events-none; + } + &.active { + .nav-dropdown-list { + @apply block; + } + } +} + +.nav-dropdown-list { + @apply bg-body dark:bg-darkmode-body z-10 min-w-[180px] rounded p-4 shadow hidden lg:invisible lg:absolute lg:block lg:opacity-0; +} + +.nav-dropdown-item { + @apply [&:not(:last-child)]:mb-2; +} + +.nav-dropdown-link { + @apply text-dark hover:text-primary dark:text-darkmode-text dark:hover:text-darkmode-primary block py-1 font-semibold transition; +} + +//theme-switcher +.theme-switcher { + @apply inline-flex; + + label { + @apply bg-border relative inline-block h-4 w-6 cursor-pointer rounded-2xl lg:w-10; + } + + input { + @apply absolute opacity-0; + } + + span { + @apply bg-dark absolute -top-1 left-0 flex h-6 w-6 items-center justify-center rounded-full transition-all duration-300 dark:bg-white; + } + + input:checked + label { + span { + @apply lg:left-4; + } + } +} diff --git a/themes/hugoplate/assets/scss/utilities.scss b/themes/hugoplate/assets/scss/utilities.scss new file mode 100755 index 0000000..154570e --- /dev/null +++ b/themes/hugoplate/assets/scss/utilities.scss @@ -0,0 +1,20 @@ +.bg-gradient { + @apply dark:from-darkmode-theme-light dark:to-darkmode-body bg-gradient-to-b from-[rgba(249,249,249,1)] from-[0.53%] to-white to-[83.28%]; +} + +.rounded-sm { + @apply rounded-[4px]; +} +.rounded { + @apply rounded-[6px]; +} +.rounded-lg { + @apply rounded-[12px]; +} +.rounded-xl { + @apply rounded-[16px]; +} + +.shadow { + box-shadow: 0px 4px 40px rgba(0, 0, 0, 0.05); +} diff --git a/themes/hugoplate/layouts/404.en.html b/themes/hugoplate/layouts/404.en.html new file mode 100755 index 0000000..c97d093 --- /dev/null +++ b/themes/hugoplate/layouts/404.en.html @@ -0,0 +1,26 @@ +{{ define "main" }} +
+
+
+
+ + 404 + +

Page not found!

+
+

+ The page you are looking for might have been removed, had its name + changed, or is temporarily unavailable. +

+
+ + Back to Home + +
+
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/_default/baseof.html b/themes/hugoplate/layouts/_default/baseof.html new file mode 100755 index 0000000..fa185d9 --- /dev/null +++ b/themes/hugoplate/layouts/_default/baseof.html @@ -0,0 +1,54 @@ + + + + + + {{ partial "essentials/head.html" . }} + + + + {{ partialCached "essentials/style.html" . }} + + + + + + {{ if hugo.IsProduction }} + {{ partialCached "preloader.html" . }} + {{ partialCached "gtm-noscript.html" . }} + {{ else }} + {{ partial "preloader.html" . }} + + + + {{ partial "components/tw-size-indicator.html" . }} + {{ end }} + + + + {{ partialCached "announcement.html" . }} + + + + {{ partial "essentials/header.html" . }} + {{ partial "search-modal.html" (dict "Context" . ) }} + + +
+ {{ block "main" . }}{{ end }} +
+ + + {{ partial "essentials/footer.html" . }} + + + + {{ partialCached "essentials/script.html" . }} + + diff --git a/themes/hugoplate/layouts/_default/list.html b/themes/hugoplate/layouts/_default/list.html new file mode 100755 index 0000000..457b96f --- /dev/null +++ b/themes/hugoplate/layouts/_default/list.html @@ -0,0 +1,20 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+ +
+
+{{ end }} diff --git a/themes/hugoplate/layouts/_default/single.html b/themes/hugoplate/layouts/_default/single.html new file mode 100755 index 0000000..5e2cb0f --- /dev/null +++ b/themes/hugoplate/layouts/_default/single.html @@ -0,0 +1,16 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+
+
+
+ {{ .Content }} +
+
+
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/_default/taxonomy.html b/themes/hugoplate/layouts/_default/taxonomy.html new file mode 100755 index 0000000..ec083f8 --- /dev/null +++ b/themes/hugoplate/layouts/_default/taxonomy.html @@ -0,0 +1,21 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+
+ +
+
+ {{ range .Data.Pages }} +
+ {{ partial "components/blog-card" . }} +
+ {{ end }} +
+
+
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/_default/terms.html b/themes/hugoplate/layouts/_default/terms.html new file mode 100755 index 0000000..7e6f648 --- /dev/null +++ b/themes/hugoplate/layouts/_default/terms.html @@ -0,0 +1,41 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+ +
+
+{{ end }} diff --git a/themes/hugoplate/layouts/about/list.html b/themes/hugoplate/layouts/about/list.html new file mode 100644 index 0000000..8205241 --- /dev/null +++ b/themes/hugoplate/layouts/about/list.html @@ -0,0 +1,13 @@ +{{ define "main" }} +
+
+
+
+ {{ partial "image" (dict "Src" .Params.image "Context" .Page "Alt" .Title "Class" "mx-auto mb-6" "Size" "200x200") }} +

{{ .Title }}

+
{{ .Content }}
+
+
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/authors/list.html b/themes/hugoplate/layouts/authors/list.html new file mode 100644 index 0000000..e45cd39 --- /dev/null +++ b/themes/hugoplate/layouts/authors/list.html @@ -0,0 +1,16 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+
+ {{ range .RegularPages }} +
+ {{ partial "components/author-card" . }} +
+ {{ end }} +
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/authors/single.html b/themes/hugoplate/layouts/authors/single.html new file mode 100755 index 0000000..18c3601 --- /dev/null +++ b/themes/hugoplate/layouts/authors/single.html @@ -0,0 +1,48 @@ +{{ define "main" }} +
+
+
+
+ {{ $image:= .Params.image }} + {{ if $image }} + {{ partial "image" (dict "Src" $image "Context" .Page "Alt" .Title "Class" "mx-auto" "Size" "200x200") }} + {{ else if .Params.Email }} + {{ .Title }} + {{ end }} +

{{ .Title }}

+
+ {{ .Content }} +
+ +
+
+ +
+ {{ $filterByAuthor := where site.RegularPages "Params.author" "==" .Title }} + {{ range $filterByAuthor }} +
+ {{ partial "components/blog-card" . }} +
+ {{ end }} +
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/blog/list.html b/themes/hugoplate/layouts/blog/list.html new file mode 100644 index 0000000..84b56e9 --- /dev/null +++ b/themes/hugoplate/layouts/blog/list.html @@ -0,0 +1,29 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+
+ +
+
+ {{ $paginator:= .Paginate .RegularPages }} + {{ range $paginator.Pages }} +
+ {{ partial "components/blog-card" . }} +
+ {{ end }} +
+ {{ partial "components/pagination.html" . }} +
+ +
+ + {{ $widget:= site.Params.widgets.sidebar }} + {{ partialCached "widgets/widget-wrapper" ( dict "Widgets" $widget "Scope" . ) }} +
+
+
+
+{{ end }} diff --git a/themes/hugoplate/layouts/blog/single.html b/themes/hugoplate/layouts/blog/single.html new file mode 100644 index 0000000..283acba --- /dev/null +++ b/themes/hugoplate/layouts/blog/single.html @@ -0,0 +1,95 @@ +{{ define "main" }} +
+
+
+
+ {{ $image:= .Params.image }} + {{ if $image }} +
+ {{ partial "image" (dict "Src" $image "Context" .Page "Alt" .Title "Class" "w-full rounded") }} +
+ {{ end }} +

+ {{ .Title }} +

+ +
+ {{ partial "toc.html" (dict "Class" "blog" "Collapsed" false "TableOfContents" .TableOfContents ) }} + {{ .Content }} +
+
+ {{ $tags:= .Params.tags }} + {{ if $tags }} +
+
{{ T "tags" }} :
+ +
+ {{ end }} +
+ {{ partial "social-share" (dict "Context" . "Class" "share-icons" "Title" (T "share") "Whatsapp" false "Telegram" false "Linkedin" false "Pinterest" false "Tumblr" false "Vk" false) }} +
+
+ + {{ if site.Config.Services.Disqus.Shortname }} +
+ {{ template "_internal/disqus.html" . }} +
+ {{ end }} +
+
+ + + {{ $related := (where site.RegularPages "Section" "in" site.Params.mainSections) | intersect (where site.RegularPages ".Title" "!=" .Title) | union (site.RegularPages.Related . ) }} + {{ $related = $related | shuffle | first 3 }} + {{ with $related }} +
+

{{ T "related_posts" }}

+
+ {{ range . }} +
+ {{ partial "components/blog-card" . }} +
+ {{ end }} +
+
+ {{ end }} +
+
+{{ end }} diff --git a/themes/hugoplate/layouts/contact/list.html b/themes/hugoplate/layouts/contact/list.html new file mode 100755 index 0000000..207f889 --- /dev/null +++ b/themes/hugoplate/layouts/contact/list.html @@ -0,0 +1,120 @@ +{{ define "main" }} + {{ partial "page-header" . }} + + +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ + + {{ with site.Params.google_map }} + {{ if .enable }} +
+ {{ end }} + {{ end }} + + {{ with site.Params.subscription }} + {{ if .enable }} + +
+
+ + +
+ + +
+
+ + +
+ + + {{ end }} + {{ end }} + + {{ if site.Params.google_map.enable }} + {{ $gmap:= resources.Get "plugins/maps/google-map.js" }} + + + {{ end }} + +{{ end }} diff --git a/themes/hugoplate/layouts/index.html b/themes/hugoplate/layouts/index.html new file mode 100755 index 0000000..8d20538 --- /dev/null +++ b/themes/hugoplate/layouts/index.html @@ -0,0 +1,144 @@ +{{ define "main" }} + + {{ with .Params.banner }} +
+
+
+
+

+ {{ .title | markdownify }} +

+

+ {{ .content | markdownify }} +

+ {{ with .button }} + {{ if .enable }} + + {{ .label }} + + + {{ end }} + {{ end }} +
+
+ {{ partial "image" (dict "Src" .image "Alt" "Banner image" "Loading" "eager" "Class" "mx-auto lg:!max-w-[800px]" "DisplayXL" "800x" ) }} +
+
+
+
+ {{ end }} + + + + {{ range $i, $e:= .Params.features }} +
+
+
+
+ {{ partial "image" (dict "Src" .image "Alt" "feature image" "DisplayXL" "520x" "DisplayLG" "425x" "DisplayMD" "360x") }} +
+
+

+ {{ .title | markdownify }} +

+

+ {{ .content | markdownify }} +

+
    + {{ range .bulletpoints }} +
  • + + {{ . | markdownify }} +
  • + {{ end }} +
+ {{ with .button }} + {{ if .enable }} + + {{ .label }} + + + {{ end }} + {{ end }} +
+
+
+
+ {{ end }} + + + + {{ with site.GetPage "sections/testimonial" }} + {{ if .Params.enable }} +
+
+
+
+

+ {{ .Title | markdownify }} +

+

+ {{ .Params.description | markdownify }} +

+
+
+
+
+ {{ range .Params.testimonials }} +
+
+
+ + + +
+
+ {{ .content | markdownify }} +
+
+
+ {{ partial "image" (dict "Src" .avatar "Size" "50x50" "Class" "rounded-full" "Alt" .name) }} +
+
+

+ {{ .name }} +

+

+ {{ .designation | markdownify }} +

+
+
+
+
+ {{ end }} +
+
+
+
+
+
+
+ {{ end }} + {{ end }} + +{{ end }} diff --git a/themes/hugoplate/layouts/partials/call-to-action.html b/themes/hugoplate/layouts/partials/call-to-action.html new file mode 100644 index 0000000..dce0837 --- /dev/null +++ b/themes/hugoplate/layouts/partials/call-to-action.html @@ -0,0 +1,33 @@ + +{{ with site.GetPage "sections/call-to-action" }} + {{ if .Params.enable }} +
+
+
+
+
+ {{ partial "image" (dict "Src" .image "Alt" "call to action" "Class" "w-full") }} +
+
+

+ {{ .Title | markdownify }} +

+

+ {{ .Params.description | markdownify }} +

+ {{ with .Params.button }} + {{ if .enable }} + + {{ .label }} + + {{ end }} + {{ end }} +
+
+
+
+
+ {{ end }} +{{ end }} + diff --git a/themes/hugoplate/layouts/partials/components/author-card.html b/themes/hugoplate/layouts/partials/components/author-card.html new file mode 100755 index 0000000..f28f6d5 --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/author-card.html @@ -0,0 +1,30 @@ +
+ {{ $image:= .Params.image }} + {{ if $image }} + {{ partial "image" (dict "Src" $image "Context" .Page "Alt" .Title "Class" "mx-auto mb-6 rounded" "size" "120x120") }} + {{ else if .Params.Email }} + {{ .Title }} + {{ end }} +

+ {{ .Title }} +

+

+ {{ .Summary }} +

+ +
diff --git a/themes/hugoplate/layouts/partials/components/blog-card.html b/themes/hugoplate/layouts/partials/components/blog-card.html new file mode 100644 index 0000000..6b85691 --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/blog-card.html @@ -0,0 +1,37 @@ +
+ {{ $image:= .Params.image }} + {{ if $image }} + {{ partial "image" (dict "Src" $image "Context" .Page "Alt" .Title "Class" "mb-6 w-full rounded") }} + {{ end }} +

+ + {{ .Title }} + +

+ {{ $categories:= .Params.categories }} + {{ if $categories }} + + {{ end }} +

{{ .Summary }}

+ + {{ T "read_more" }} + +
diff --git a/themes/hugoplate/layouts/partials/components/breadcrumb.html b/themes/hugoplate/layouts/partials/components/breadcrumb.html new file mode 100644 index 0000000..eba367c --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/breadcrumb.html @@ -0,0 +1,30 @@ +{{ $context := .Context }} +{{ $class := .Class }} +{{ $base := site.Home.Permalink }} + + + diff --git a/themes/hugoplate/layouts/partials/components/language-switcher.html b/themes/hugoplate/layouts/partials/components/language-switcher.html new file mode 100644 index 0000000..bbee9dd --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/language-switcher.html @@ -0,0 +1,28 @@ + +{{ $class := .Class }} +{{ $context := .Context }} +{{ $pageLang := $context.Lang }} +{{ $base:= urls.Parse site.Home.Permalink }} +{{ $siteLanguages := site.Home.AllTranslations }} +{{ $pageLink := replace (replace $context.RelPermalink (add $pageLang "/") "") $base.Path "/" }} + +{{ if $context.IsTranslated }} + +{{ end }} diff --git a/themes/hugoplate/layouts/partials/components/pagination.html b/themes/hugoplate/layouts/partials/components/pagination.html new file mode 100755 index 0000000..6701887 --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/pagination.html @@ -0,0 +1,138 @@ +{{ $paginator := .Paginator }} + +{{ $adjacent_links := 2 }} + +{{ $max_links := (add (mul $adjacent_links 2) 1) }} + +{{ $lower_limit := (add $adjacent_links 1) }} + +{{ $upper_limit := (sub $paginator.TotalPages $adjacent_links) }} + +{{ if gt $paginator.TotalPages 1 }} + +{{ end }} diff --git a/themes/hugoplate/layouts/partials/components/theme-switcher.html b/themes/hugoplate/layouts/partials/components/theme-switcher.html new file mode 100644 index 0000000..309cbd2 --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/theme-switcher.html @@ -0,0 +1,70 @@ + +{{ $class := .Class }} +{{ if site.Params.theme_switcher }} + + + + +{{ end }} diff --git a/themes/hugoplate/layouts/partials/components/tw-size-indicator.html b/themes/hugoplate/layouts/partials/components/tw-size-indicator.html new file mode 100644 index 0000000..38e54cf --- /dev/null +++ b/themes/hugoplate/layouts/partials/components/tw-size-indicator.html @@ -0,0 +1,9 @@ +
+ all + + + + + +
diff --git a/themes/hugoplate/layouts/partials/essentials/footer.html b/themes/hugoplate/layouts/partials/essentials/footer.html new file mode 100755 index 0000000..f76fc36 --- /dev/null +++ b/themes/hugoplate/layouts/partials/essentials/footer.html @@ -0,0 +1,57 @@ + diff --git a/themes/hugoplate/layouts/partials/essentials/head.html b/themes/hugoplate/layouts/partials/essentials/head.html new file mode 100755 index 0000000..bb7b1a7 --- /dev/null +++ b/themes/hugoplate/layouts/partials/essentials/head.html @@ -0,0 +1,61 @@ + + + + + + + + + +{{ partialCached "favicon" . }} + + + +{{ partialCached "manifest" . }} + + + +{{ partialCached "site-verifications.html" . }} + + + +{{ partial "basic-seo.html" . }} + + + +{{ partialCached "custom-script.html" . }} + + + +{{ if and site.Config.Services.GoogleAnalytics.ID (ne site.Config.Services.GoogleAnalytics.ID "G-MEASUREMENT_ID") }} + {{ template "_internal/google_analytics.html" . }} +{{ end }} + + + +{{ partialCached "gtm.html" . }} + + + +{{ partial "search-index.html" . }} + + + +{{/* {{ partialCached "matomo-analytics.html" . }} */}} + + +{{/* {{ partialCached "baidu-analytics.html" . }} */}} + + +{{/* {{ partialCached "plausible-analytics.html" . }} */}} + + +{{/* {{ partialCached "counter-analytics.html" . }} */}} + + +{{/* {{ partialCached "crisp-chat.html" . }} */}} + + +{{ partial "mermaid/assets/js" . }} diff --git a/themes/hugoplate/layouts/partials/essentials/header.html b/themes/hugoplate/layouts/partials/essentials/header.html new file mode 100755 index 0000000..15749fa --- /dev/null +++ b/themes/hugoplate/layouts/partials/essentials/header.html @@ -0,0 +1,139 @@ +
+ +
diff --git a/themes/hugoplate/layouts/partials/essentials/script.html b/themes/hugoplate/layouts/partials/essentials/script.html new file mode 100755 index 0000000..4d11a0d --- /dev/null +++ b/themes/hugoplate/layouts/partials/essentials/script.html @@ -0,0 +1,58 @@ + +{{ $scripts := slice }} +{{ $scriptsLazy := slice }} +{{ range site.Params.plugins.js }} + {{ if findRE "^http" .link }} + + {{ else }} + {{ if not .lazy }} + {{ $scripts = $scripts | append (resources.Get .link) }} + {{ else }} + {{ $scriptsLazy = $scriptsLazy | append (resources.Get .link) }} + {{ end }} + {{ end }} +{{ end }} + + + +{{ $scripts = $scripts | append (resources.Get "js/main.js") }} +{{ $scripts = $scripts | resources.Concat "js/script.js" }} + +{{ $scriptsLazy = $scriptsLazy | resources.Concat "js/script-lazy.js" }} + +{{ if hugo.IsProduction }} + {{ $scripts = $scripts | minify | fingerprint }} + {{ $scriptsLazy = $scriptsLazy | minify | fingerprint }} +{{ end }} + +{{/* scripts */}} + + +{{/* scripts lazy */}} + + + +{{ partialCached "pwa.html" . }} + + + +{{ partialCached "cookie-consent.html" . }} + + + +{{ partialCached "adsense-script.html" . }} + + + +{{ partialCached "announcement-script.html" . }} diff --git a/themes/hugoplate/layouts/partials/essentials/style.html b/themes/hugoplate/layouts/partials/essentials/style.html new file mode 100755 index 0000000..5609469 --- /dev/null +++ b/themes/hugoplate/layouts/partials/essentials/style.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + +{{ $pf:= site.Data.theme.fonts.font_family.primary }} +{{ $sf:= site.Data.theme.fonts.font_family.secondary }} + + + + + +{{ $styles := slice }} +{{ $stylesLazy := slice }} +{{ range site.Params.plugins.css }} + {{ if findRE "^http" .link }} + + {{ else }} + {{ if not .lazy }} + {{ $styles = $styles | append (resources.Get .link) }} + {{ else }} + {{ $stylesLazy = $stylesLazy | append (resources.Get .link) }} + {{ end }} + {{ end }} +{{ end }} + +{{/* main style */}} +{{ $styles = $styles | append (resources.Get "scss/main.scss" | toCSS) }} +{{ $styles = $styles | resources.Concat "css/style.css" }} +{{ $styles = $styles | css.PostCSS }} + +{{ $stylesLazy = $stylesLazy | resources.Concat "css/style-lazy.css" }} +{{ $stylesLazy = $stylesLazy | css.PostCSS }} + +{{ if hugo.IsProduction }} + {{ $styles = $styles | resources.ExecuteAsTemplate "css/style.css" . | minify | fingerprint | resources.PostProcess }} + {{ $stylesLazy = $stylesLazy | resources.ExecuteAsTemplate "css/style-lazy.css" . | minify | fingerprint | resources.PostProcess }} +{{ else }} + {{ $styles = $styles | resources.ExecuteAsTemplate "css/style.css" . }} + {{ $stylesLazy = $stylesLazy | resources.ExecuteAsTemplate "css/style-lazy.css" . }} +{{ end }} + +{{/* styles */}} + + +{{/* styles lazy */}} + diff --git a/themes/hugoplate/layouts/partials/page-header.html b/themes/hugoplate/layouts/partials/page-header.html new file mode 100755 index 0000000..c0b2baa --- /dev/null +++ b/themes/hugoplate/layouts/partials/page-header.html @@ -0,0 +1,9 @@ +
+
+
+

{{ T (printf "%s" (lower .Title)) | default .Title | title }}

+ {{ partial "components/breadcrumb" (dict "Context" . "Class" "mt-6") }} +
+
+
diff --git a/themes/hugoplate/layouts/partials/widgets/categories.html b/themes/hugoplate/layouts/partials/widgets/categories.html new file mode 100755 index 0000000..1a0792b --- /dev/null +++ b/themes/hugoplate/layouts/partials/widgets/categories.html @@ -0,0 +1,23 @@ + +{{ if isset site.Taxonomies "categories" }} + {{ if not (eq (len site.Taxonomies.categories) 0) }} +
+
{{ T "categories" }}
+
+ +
+
+ {{ end }} +{{ end }} diff --git a/themes/hugoplate/layouts/partials/widgets/tags.html b/themes/hugoplate/layouts/partials/widgets/tags.html new file mode 100755 index 0000000..605b20c --- /dev/null +++ b/themes/hugoplate/layouts/partials/widgets/tags.html @@ -0,0 +1,23 @@ + +{{ if isset site.Taxonomies "tags" }} + {{ if not (eq (len site.Taxonomies.tags) 0) }} +
+
{{ T "tags" }}
+
+ +
+
+ {{ end }} +{{ end }} diff --git a/themes/hugoplate/layouts/partials/widgets/widget-wrapper.html b/themes/hugoplate/layouts/partials/widgets/widget-wrapper.html new file mode 100755 index 0000000..03a8a44 --- /dev/null +++ b/themes/hugoplate/layouts/partials/widgets/widget-wrapper.html @@ -0,0 +1,3 @@ +{{ range .Widgets }} + {{ partial ( print "widgets/" . ) $.Scope }} +{{ end }}