PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / trunk
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments vtrunk
4.7.0 4.6.6 4.6.5 4.6.4 4.6.3 4.6.2 4.6.1 4.6.0 4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / dist / components / cjs / sc-image-slider.cjs.entry.js
surecart / dist / components / cjs Last commit date
MockProcessor-ad11752f.js 2 months ago MockProcessor-ad11752f.js.map 2 months ago add-query-args-49dcb630.js 1 year ago add-query-args-49dcb630.js.map 1 year ago address-7404695f.js 4 months ago address-7404695f.js.map 4 months ago animation-registry-b597d2f4.js 3 months ago animation-registry-b597d2f4.js.map 3 months ago app-globals-464bf4c9.js 2 months ago app-globals-464bf4c9.js.map 2 months ago consumer-b58230e6.js 2 months ago consumer-b58230e6.js.map 2 months ago currency-71fce0f0.js 1 year ago currency-71fce0f0.js.map 1 year ago error-66b4ae42.js 1 week ago error-66b4ae42.js.map 1 week ago fetch-5e8dc1d5.js 1 month ago fetch-5e8dc1d5.js.map 1 month ago floating-ui.dom.esm-7fad5c49.js 6 months ago floating-ui.dom.esm-7fad5c49.js.map 6 months ago form-data-0da9940f.js 1 year ago form-data-0da9940f.js.map 1 year ago functions-033a6a55.js 3 months ago functions-033a6a55.js.map 3 months ago geo-permission-8128c254.js 1 month ago geo-permission-8128c254.js.map 1 month ago getters-4e5fc4d4.js 1 week ago getters-4e5fc4d4.js.map 1 week ago getters-68a0d178.js 2 months ago getters-68a0d178.js.map 2 months ago getters-bc65a40b.js 2 months ago getters-bc65a40b.js.map 2 months ago getters-c3cd6c93.js 1 week ago getters-c3cd6c93.js.map 1 week ago getters-d68c08ed.js 2 months ago getters-d68c08ed.js.map 2 months ago google-5d965da2.js 1 week ago google-5d965da2.js.map 1 week ago google-8dbad1a6.js 1 week ago google-8dbad1a6.js.map 1 week ago google-maps-8b4e4fed.js 4 hours ago google-maps-8b4e4fed.js.map 4 hours ago index-7ced8198.js 2 months ago index-7ced8198.js.map 2 months ago index-a4a4f390.js 1 month ago index-a4a4f390.js.map 1 month ago index-adacfa36.js 1 year ago index-adacfa36.js.map 1 year ago index-be4abba1.js 2 months ago index-be4abba1.js.map 2 months ago index-c2d0eb49.js 1 week ago index-c2d0eb49.js.map 1 week ago index-c3de642f.js 2 months ago index-c3de642f.js.map 2 months ago index-f3933112.js 1 month ago index-f3933112.js.map 1 month ago index-fb76df07.js 2 years ago index-fb76df07.js.map 2 years ago index.cjs.js 1 week ago index.cjs.js.map 1 month ago inline-aa15f113.js 1 year ago inline-aa15f113.js.map 1 year ago lazy-2b509fa7.js 1 year ago lazy-2b509fa7.js.map 1 year ago library-08bc52a5.js 2 months ago library-08bc52a5.js.map 2 months ago loader.cjs.js 4 hours ago loader.cjs.js.map 1 year ago media-43b85f3d.js 1 year ago media-43b85f3d.js.map 1 year ago mutations-463da571.js 1 week ago mutations-463da571.js.map 1 week ago mutations-627c79a0.js 1 week ago mutations-627c79a0.js.map 1 week ago mutations-98f05402.js 1 week ago mutations-98f05402.js.map 1 week ago mutations-d5d6ddf1.js 2 months ago mutations-d5d6ddf1.js.map 2 months ago page-align-5a2ab493.js 1 year ago page-align-5a2ab493.js.map 1 year ago price-da3cab3d.js 4 months ago price-da3cab3d.js.map 4 months ago pure-bd6f0a6e.js 1 year ago pure-bd6f0a6e.js.map 1 year ago quantity-aa458329.js 3 months ago quantity-aa458329.js.map 3 months ago razorpay-88fe8897.js 3 months ago razorpay-88fe8897.js.map 3 months ago remove-query-args-b57e8cd3.js 1 year ago remove-query-args-b57e8cd3.js.map 1 year ago sc-address_5.cjs.entry.js 4 hours ago sc-address_5.cjs.entry.js.map 4 hours ago sc-alert.cjs.entry.js 1 month ago sc-alert.cjs.entry.js.map 1 year ago sc-avatar_2.cjs.entry.js 1 week ago sc-avatar_2.cjs.entry.js.map 1 month ago sc-badge-notice.cjs.entry.js 1 month ago sc-badge-notice.cjs.entry.js.map 1 year ago sc-block-ui.cjs.entry.js 1 month ago sc-block-ui.cjs.entry.js.map 5 months ago sc-breadcrumb.cjs.entry.js 1 month ago sc-breadcrumb.cjs.entry.js.map 1 year ago sc-breadcrumbs.cjs.entry.js 1 month ago sc-breadcrumbs.cjs.entry.js.map 1 year ago sc-button-group.cjs.entry.js 1 month ago sc-button-group.cjs.entry.js.map 1 year ago sc-button_6.cjs.entry.js 1 month ago sc-button_6.cjs.entry.js.map 1 month ago sc-cancel-dialog_3.cjs.entry.js 1 month ago sc-cancel-dialog_3.cjs.entry.js.map 1 month ago sc-cancel-discount_4.cjs.entry.js 1 month ago sc-cancel-discount_4.cjs.entry.js.map 2 months ago sc-card_2.cjs.entry.js 1 month ago sc-card_2.cjs.entry.js.map 4 months ago sc-cart-button.cjs.entry.js 1 week ago sc-cart-button.cjs.entry.js.map 1 year ago sc-cart-form-submit.cjs.entry.js 2 months ago sc-cart-form-submit.cjs.entry.js.map 1 year ago sc-cart-form.cjs.entry.js 1 week ago sc-cart-form.cjs.entry.js.map 1 month ago sc-cart-header.cjs.entry.js 1 week ago sc-cart-header.cjs.entry.js.map 1 year ago sc-cart-icon.cjs.entry.js 1 week ago sc-cart-icon.cjs.entry.js.map 1 year ago sc-cart-loader.cjs.entry.js 1 week ago sc-cart-loader.cjs.entry.js.map 1 year ago sc-cart-session-provider_3.cjs.entry.js 4 hours ago sc-cart-session-provider_3.cjs.entry.js.map 4 hours ago sc-cart-submit.cjs.entry.js 2 months ago sc-cart-submit.cjs.entry.js.map 1 year ago sc-cart.cjs.entry.js 1 week ago sc-cart.cjs.entry.js.map 2 months ago sc-cc-logo_2.cjs.entry.js 1 month ago sc-cc-logo_2.cjs.entry.js.map 1 month ago sc-charges-list.cjs.entry.js 1 month ago sc-charges-list.cjs.entry.js.map 2 months ago sc-checkout-autofill-provider_11.cjs.entry.js 4 hours ago sc-checkout-autofill-provider_11.cjs.entry.js.map 4 hours ago sc-checkout-form-errors.cjs.entry.js 2 months ago sc-checkout-form-errors.cjs.entry.js.map 1 year ago sc-checkout-mollie-payment_3.cjs.entry.js 1 week ago sc-checkout-mollie-payment_3.cjs.entry.js.map 2 months ago sc-checkout-product-bundle-component-variants.cjs.entry.js 1 week ago sc-checkout-product-bundle-component-variants.cjs.entry.js.map 1 month ago sc-checkout-product-price-variant-selector.cjs.entry.js 1 week ago sc-checkout-product-price-variant-selector.cjs.entry.js.map 4 weeks ago sc-checkout.cjs.entry.js 1 week ago sc-checkout.cjs.entry.js.map 1 month ago sc-choice-container.cjs.entry.js 1 month ago sc-choice-container.cjs.entry.js.map 1 year ago sc-choice.cjs.entry.js 1 month ago sc-choice.cjs.entry.js.map 1 year ago sc-choices.cjs.entry.js 1 month ago sc-choices.cjs.entry.js.map 1 year ago sc-column_2.cjs.entry.js 1 month ago sc-column_2.cjs.entry.js.map 1 month ago sc-compact-address_18.cjs.entry.js 4 hours ago sc-compact-address_18.cjs.entry.js.map 1 month ago sc-conditional-form.cjs.entry.js 1 week ago sc-conditional-form.cjs.entry.js.map 2 months ago sc-consumer.cjs.entry.js 2 months ago sc-consumer.cjs.entry.js.map 1 year ago sc-coupon-form.cjs.entry.js 1 week ago sc-coupon-form.cjs.entry.js.map 5 months ago sc-custom-order-price-input.cjs.entry.js 1 month ago sc-custom-order-price-input.cjs.entry.js.map 2 months ago sc-customer-details.cjs.entry.js 1 month ago sc-customer-details.cjs.entry.js.map 7 months ago sc-customer-edit.cjs.entry.js 1 month ago sc-customer-edit.cjs.entry.js.map 2 months ago sc-customer-email.cjs.entry.js 1 week ago sc-customer-email.cjs.entry.js.map 1 month ago sc-customer-firstname.cjs.entry.js 1 week ago sc-customer-firstname.cjs.entry.js.map 2 months ago sc-customer-lastname.cjs.entry.js 1 week ago sc-customer-lastname.cjs.entry.js.map 2 months ago sc-customer-name.cjs.entry.js 1 week ago sc-customer-name.cjs.entry.js.map 2 months ago sc-dashboard-customer-details.cjs.entry.js 1 month ago sc-dashboard-customer-details.cjs.entry.js.map 2 months ago sc-dashboard-downloads-list.cjs.entry.js 1 month ago sc-dashboard-downloads-list.cjs.entry.js.map 2 months ago sc-dialog.cjs.entry.js 1 month ago sc-dialog.cjs.entry.js.map 5 months ago sc-divider.cjs.entry.js 1 month ago sc-divider.cjs.entry.js.map 1 year ago sc-donation-choices.cjs.entry.js 2 months ago sc-donation-choices.cjs.entry.js.map 1 year ago sc-downloads-list.cjs.entry.js 1 month ago sc-downloads-list.cjs.entry.js.map 1 month ago sc-dropdown_3.cjs.entry.js 1 month ago sc-dropdown_3.cjs.entry.js.map 6 months ago sc-empty_3.cjs.entry.js 1 month ago sc-empty_3.cjs.entry.js.map 4 months ago sc-express-payment.cjs.entry.js 1 week ago sc-express-payment.cjs.entry.js.map 3 months ago sc-feature-demo-banner.cjs.entry.js 1 month ago sc-feature-demo-banner.cjs.entry.js.map 1 year ago sc-flex.cjs.entry.js 1 month ago sc-flex.cjs.entry.js.map 1 year ago sc-form-control_2.cjs.entry.js 1 month ago sc-form-control_2.cjs.entry.js.map 2 months ago sc-form-row.cjs.entry.js 1 month ago sc-form-row.cjs.entry.js.map 1 year ago sc-form.cjs.entry.js 1 month ago sc-form.cjs.entry.js.map 1 year ago sc-format-bytes.cjs.entry.js 2 months ago sc-format-bytes.cjs.entry.js.map 1 year ago sc-format-interval.cjs.entry.js 2 months ago sc-format-interval.cjs.entry.js.map 1 year ago sc-format-number.cjs.entry.js 2 months ago sc-format-number.cjs.entry.js.map 1 year ago sc-fulfillment-shipping-status-badge.cjs.entry.js 4 hours ago sc-fulfillment-shipping-status-badge.cjs.entry.js.map 4 hours ago sc-fulfillments.cjs.entry.js 4 hours ago sc-fulfillments.cjs.entry.js.map 4 hours ago sc-heading_2.cjs.entry.js 1 month ago sc-heading_2.cjs.entry.js.map 1 year ago sc-image-slider.cjs.entry.js 1 month ago sc-image-slider.cjs.entry.js.map 1 month ago sc-invoice-status-badge.cjs.entry.js 1 month ago sc-invoice-status-badge.cjs.entry.js.map 4 months ago sc-invoices-list.cjs.entry.js 1 month ago sc-invoices-list.cjs.entry.js.map 2 months ago sc-license.cjs.entry.js 1 month ago sc-license.cjs.entry.js.map 2 months ago sc-licenses-list.cjs.entry.js 1 month ago sc-licenses-list.cjs.entry.js.map 1 month ago sc-line-item-bump.cjs.entry.js 1 week ago sc-line-item-bump.cjs.entry.js.map 1 year ago sc-line-item-total.cjs.entry.js 1 week ago sc-line-item-total.cjs.entry.js.map 6 months ago sc-line-item.cjs.entry.js 1 month ago sc-line-item.cjs.entry.js.map 1 year ago sc-line-items-provider.cjs.entry.js 1 month ago sc-line-items-provider.cjs.entry.js.map 1 year ago sc-line-items.cjs.entry.js 1 week ago sc-line-items.cjs.entry.js.map 1 month ago sc-login-form.cjs.entry.js 1 month ago sc-login-form.cjs.entry.js.map 2 months ago sc-manual-payment-method_3.cjs.entry.js 1 month ago sc-manual-payment-method_3.cjs.entry.js.map 3 months ago sc-menu-divider.cjs.entry.js 1 month ago sc-menu-divider.cjs.entry.js.map 1 year ago sc-menu-label_2.cjs.entry.js 4 hours ago sc-menu-label_2.cjs.entry.js.map 4 hours ago sc-mollie-add-method.cjs.entry.js 1 month ago sc-mollie-add-method.cjs.entry.js.map 2 months ago sc-order-confirmation-customer.cjs.entry.js 2 months ago sc-order-confirmation-customer.cjs.entry.js.map 1 year ago sc-order-confirmation-details.cjs.entry.js 2 months ago sc-order-confirmation-details.cjs.entry.js.map 11 months ago sc-order-confirmation-line-items_2.cjs.entry.js 1 month ago sc-order-confirmation-line-items_2.cjs.entry.js.map 1 month ago sc-order-confirmation.cjs.entry.js 1 month ago sc-order-confirmation.cjs.entry.js.map 2 months ago sc-order-coupon-form.cjs.entry.js 1 week ago sc-order-coupon-form.cjs.entry.js.map 2 months ago sc-order-detail.cjs.entry.js 2 months ago sc-order-detail.cjs.entry.js.map 1 year ago sc-order-fulfillment-badge.cjs.entry.js 1 month ago sc-order-fulfillment-badge.cjs.entry.js.map 4 months ago sc-order-manual-instructions.cjs.entry.js 2 months ago sc-order-manual-instructions.cjs.entry.js.map 1 year ago sc-order-password.cjs.entry.js 2 months ago sc-order-password.cjs.entry.js.map 1 year ago sc-order-return-badge.cjs.entry.js 1 month ago sc-order-return-badge.cjs.entry.js.map 4 months ago sc-order-shipment-badge.cjs.entry.js 4 hours ago sc-order-shipment-badge.cjs.entry.js.map 4 hours ago sc-order-status-badge.cjs.entry.js 1 month ago sc-order-status-badge.cjs.entry.js.map 4 months ago sc-order-submit.cjs.entry.js 1 week ago sc-order-submit.cjs.entry.js.map 2 months ago sc-order-summary.cjs.entry.js 1 week ago sc-order-summary.cjs.entry.js.map 1 month ago sc-order.cjs.entry.js 1 month ago sc-order.cjs.entry.js.map 1 month ago sc-orders-list.cjs.entry.js 4 hours ago sc-orders-list.cjs.entry.js.map 4 hours ago sc-pagination.cjs.entry.js 2 months ago sc-pagination.cjs.entry.js.map 1 year ago sc-password-nag.cjs.entry.js 1 month ago sc-password-nag.cjs.entry.js.map 2 months ago sc-password.cjs.entry.js 1 month ago sc-password.cjs.entry.js.map 1 month ago sc-payment-method-choice_2.cjs.entry.js 1 month ago sc-payment-method-choice_2.cjs.entry.js.map 1 year ago sc-payment-method-details.cjs.entry.js 1 month ago sc-payment-method-details.cjs.entry.js.map 1 year ago sc-payment-methods-list.cjs.entry.js 1 month ago sc-payment-methods-list.cjs.entry.js.map 2 months ago sc-payment.cjs.entry.js 1 week ago sc-payment.cjs.entry.js.map 3 months ago sc-paypal-add-method.cjs.entry.js 1 month ago sc-paypal-add-method.cjs.entry.js.map 2 months ago sc-paypal-buttons_2.cjs.entry.js 1 week ago sc-paypal-buttons_2.cjs.entry.js.map 2 months ago sc-paystack-add-method.cjs.entry.js 1 month ago sc-paystack-add-method.cjs.entry.js.map 2 months ago sc-pill-option.cjs.entry.js 1 month ago sc-pill-option.cjs.entry.js.map 1 year ago sc-popover.cjs.entry.js 1 month ago sc-popover.cjs.entry.js.map 6 months ago sc-premium-tag.cjs.entry.js 1 month ago sc-premium-tag.cjs.entry.js.map 1 year ago sc-price-choice-container.cjs.entry.js 1 month ago sc-price-choice-container.cjs.entry.js.map 1 month ago sc-price-choice.cjs.entry.js 1 month ago sc-price-choice.cjs.entry.js.map 2 months ago sc-price-choices.cjs.entry.js 1 week ago sc-price-choices.cjs.entry.js.map 1 year ago sc-price-input.cjs.entry.js 1 month ago sc-price-input.cjs.entry.js.map 1 year ago sc-price-range_4.cjs.entry.js 1 month ago sc-price-range_4.cjs.entry.js.map 1 year ago sc-price.cjs.entry.js 2 months ago sc-price.cjs.entry.js.map 11 months ago sc-product-buy-button.cjs.entry.js 1 week ago sc-product-buy-button.cjs.entry.js.map 2 months ago sc-product-donation-amount-choice.cjs.entry.js 1 week ago sc-product-donation-amount-choice.cjs.entry.js.map 2 months ago sc-product-donation-choices.cjs.entry.js 1 week ago sc-product-donation-choices.cjs.entry.js.map 2 months ago sc-product-donation-custom-amount.cjs.entry.js 1 week ago sc-product-donation-custom-amount.cjs.entry.js.map 2 months ago sc-product-item-list.cjs.entry.js 1 week ago sc-product-item-list.cjs.entry.js.map 2 months ago sc-product-item.cjs.entry.js 1 month ago sc-product-item.cjs.entry.js.map 1 year ago sc-product-pills-variant-option.cjs.entry.js 1 week ago sc-product-pills-variant-option.cjs.entry.js.map 1 year ago sc-product-price-choices.cjs.entry.js 1 week ago sc-product-price-choices.cjs.entry.js.map 1 year ago sc-product-price-modal.cjs.entry.js 1 week ago sc-product-price-modal.cjs.entry.js.map 2 months ago sc-product-price.cjs.entry.js 1 week ago sc-product-price.cjs.entry.js.map 2 months ago sc-product-quantity.cjs.entry.js 1 week ago sc-product-quantity.cjs.entry.js.map 1 year ago sc-product-selected-price.cjs.entry.js 1 week ago sc-product-selected-price.cjs.entry.js.map 2 months ago sc-product-text.cjs.entry.js 1 week ago sc-product-text.cjs.entry.js.map 1 year ago sc-provider.cjs.entry.js 2 months ago sc-provider.cjs.entry.js.map 1 year ago sc-provisional-banner.cjs.entry.js 1 month ago sc-provisional-banner.cjs.entry.js.map 11 months ago sc-purchase-downloads-list.cjs.entry.js 1 month ago sc-purchase-downloads-list.cjs.entry.js.map 1 month ago sc-razorpay-add-method.cjs.entry.js 1 month ago sc-razorpay-add-method.cjs.entry.js.map 2 months ago sc-recurring-price-choice-container.cjs.entry.js 2 months ago sc-recurring-price-choice-container.cjs.entry.js.map 1 year ago sc-review-stars.cjs.entry.js 2 months ago sc-review-stars.cjs.entry.js.map 6 months ago sc-rich-text.cjs.entry.js 1 month ago sc-rich-text.cjs.entry.js.map 1 month ago sc-skeleton.cjs.entry.js 1 month ago sc-skeleton.cjs.entry.js.map 1 year ago sc-spacing.cjs.entry.js 1 month ago sc-spacing.cjs.entry.js.map 1 year ago sc-stripe-add-method.cjs.entry.js 1 month ago sc-stripe-add-method.cjs.entry.js.map 2 months ago sc-stripe-element.cjs.entry.js 1 week ago sc-stripe-element.cjs.entry.js.map 2 months ago sc-stripe-payment-element.cjs.entry.js 1 week ago sc-stripe-payment-element.cjs.entry.js.map 2 months ago sc-stripe-payment-request.cjs.entry.js 1 week ago sc-stripe-payment-request.cjs.entry.js.map 2 months ago sc-subscription-ad-hoc-confirm.cjs.entry.js 1 month ago sc-subscription-ad-hoc-confirm.cjs.entry.js.map 6 months ago sc-subscription-details_2.cjs.entry.js 1 month ago sc-subscription-details_2.cjs.entry.js.map 1 month ago sc-subscription-payment-method.cjs.entry.js 1 month ago sc-subscription-payment-method.cjs.entry.js.map 2 months ago sc-subscription-payment.cjs.entry.js 1 month ago sc-subscription-payment.cjs.entry.js.map 2 months ago sc-subscription-switch.cjs.entry.js 1 month ago sc-subscription-switch.cjs.entry.js.map 2 months ago sc-subscription-variation-confirm.cjs.entry.js 1 month ago sc-subscription-variation-confirm.cjs.entry.js.map 1 year ago sc-subscription.cjs.entry.js 1 month ago sc-subscription.cjs.entry.js.map 1 month ago sc-subscriptions-list.cjs.entry.js 1 month ago sc-subscriptions-list.cjs.entry.js.map 2 months ago sc-summary.cjs.entry.js 1 month ago sc-summary.cjs.entry.js.map 1 year ago sc-swap.cjs.entry.js 1 week ago sc-swap.cjs.entry.js.map 2 months ago sc-switch.cjs.entry.js 1 month ago sc-switch.cjs.entry.js.map 7 months ago sc-tab-group.cjs.entry.js 1 month ago sc-tab-group.cjs.entry.js.map 1 year ago sc-tab-panel.cjs.entry.js 1 month ago sc-tab-panel.cjs.entry.js.map 1 year ago sc-tab.cjs.entry.js 1 month ago sc-tab.cjs.entry.js.map 1 year ago sc-table-head.cjs.entry.js 1 month ago sc-table-head.cjs.entry.js.map 1 year ago sc-table_3.cjs.entry.js 1 month ago sc-table_3.cjs.entry.js.map 10 months ago sc-tag.cjs.entry.js 1 month ago sc-tag.cjs.entry.js.map 4 months ago sc-test-mode-info.cjs.entry.js 1 month ago sc-test-mode-info.cjs.entry.js.map 6 months ago sc-text.cjs.entry.js 1 month ago sc-text.cjs.entry.js.map 1 year ago sc-toggle.cjs.entry.js 1 month ago sc-toggle.cjs.entry.js.map 1 year ago sc-toggles.cjs.entry.js 1 month ago sc-toggles.cjs.entry.js.map 1 year ago sc-total.cjs.entry.js 1 week ago sc-total.cjs.entry.js.map 1 year ago sc-upcoming-invoice.cjs.entry.js 1 month ago sc-upcoming-invoice.cjs.entry.js.map 2 months ago sc-upgrade-required.cjs.entry.js 2 months ago sc-upgrade-required.cjs.entry.js.map 1 year ago sc-upsell-countdown-timer.cjs.entry.js 1 month ago sc-upsell-countdown-timer.cjs.entry.js.map 1 year ago sc-upsell-no-thanks-button.cjs.entry.js 1 week ago sc-upsell-no-thanks-button.cjs.entry.js.map 2 months ago sc-upsell-submit-button.cjs.entry.js 1 week ago sc-upsell-submit-button.cjs.entry.js.map 2 months ago sc-upsell-totals.cjs.entry.js 1 week ago sc-upsell-totals.cjs.entry.js.map 2 months ago sc-upsell.cjs.entry.js 1 week ago sc-upsell.cjs.entry.js.map 2 months ago sc-verification-code.cjs.entry.js 1 month ago sc-verification-code.cjs.entry.js.map 2 months ago sc-visually-hidden.cjs.entry.js 1 month ago sc-visually-hidden.cjs.entry.js.map 1 year ago sc-wordpress-password-edit.cjs.entry.js 1 month ago sc-wordpress-password-edit.cjs.entry.js.map 2 months ago sc-wordpress-user-edit.cjs.entry.js 1 month ago sc-wordpress-user-edit.cjs.entry.js.map 2 months ago sc-wordpress-user.cjs.entry.js 1 month ago sc-wordpress-user.cjs.entry.js.map 1 year ago store-01e8edc2.js 2 months ago store-01e8edc2.js.map 2 months ago store-401bdb4d.js 2 months ago store-401bdb4d.js.map 2 months ago store-9c215436.js 1 month ago store-9c215436.js.map 1 month ago surecart.cjs.js 4 hours ago surecart.cjs.js.map 1 year ago tax-a4582e73.js 1 year ago tax-a4582e73.js.map 1 year ago universe-1db52218.js 2 months ago universe-1db52218.js.map 2 months ago util-a15c420c.js 2 months ago util-a15c420c.js.map 2 months ago utils-a9d13080.js 3 months ago utils-a9d13080.js.map 3 months ago verification-19455819.js 1 month ago verification-19455819.js.map 1 month ago watchers-08c6f04b.js 1 week ago watchers-08c6f04b.js.map 1 week ago watchers-517825ae.js 2 months ago watchers-517825ae.js.map 2 months ago watchers-a136c7bc.js 1 week ago watchers-a136c7bc.js.map 1 week ago watchers-b5cd03f1.js 1 week ago watchers-b5cd03f1.js.map 1 week ago watchers-c1bcf0a8.js 1 week ago watchers-c1bcf0a8.js.map 1 week ago
sc-image-slider.cjs.entry.js
4620 lines
1 'use strict';
2
3 Object.defineProperty(exports, '__esModule', { value: true });
4
5 const index = require('./index-be4abba1.js');
6
7 /**
8 * SSR Window 4.0.2
9 * Better handling for window object in SSR environment
10 * https://github.com/nolimits4web/ssr-window
11 *
12 * Copyright 2021, Vladimir Kharlampidi
13 *
14 * Licensed under MIT
15 *
16 * Released on: December 13, 2021
17 */
18 /* eslint-disable no-param-reassign */
19 function isObject$1(obj) {
20 return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
21 }
22 function extend$1(target, src) {
23 if (target === void 0) {
24 target = {};
25 }
26 if (src === void 0) {
27 src = {};
28 }
29 Object.keys(src).forEach(key => {
30 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) {
31 extend$1(target[key], src[key]);
32 }
33 });
34 }
35 const ssrDocument = {
36 body: {},
37 addEventListener() {},
38 removeEventListener() {},
39 activeElement: {
40 blur() {},
41 nodeName: ''
42 },
43 querySelector() {
44 return null;
45 },
46 querySelectorAll() {
47 return [];
48 },
49 getElementById() {
50 return null;
51 },
52 createEvent() {
53 return {
54 initEvent() {}
55 };
56 },
57 createElement() {
58 return {
59 children: [],
60 childNodes: [],
61 style: {},
62 setAttribute() {},
63 getElementsByTagName() {
64 return [];
65 }
66 };
67 },
68 createElementNS() {
69 return {};
70 },
71 importNode() {
72 return null;
73 },
74 location: {
75 hash: '',
76 host: '',
77 hostname: '',
78 href: '',
79 origin: '',
80 pathname: '',
81 protocol: '',
82 search: ''
83 }
84 };
85 function getDocument() {
86 const doc = typeof document !== 'undefined' ? document : {};
87 extend$1(doc, ssrDocument);
88 return doc;
89 }
90 const ssrWindow = {
91 document: ssrDocument,
92 navigator: {
93 userAgent: ''
94 },
95 location: {
96 hash: '',
97 host: '',
98 hostname: '',
99 href: '',
100 origin: '',
101 pathname: '',
102 protocol: '',
103 search: ''
104 },
105 history: {
106 replaceState() {},
107 pushState() {},
108 go() {},
109 back() {}
110 },
111 CustomEvent: function CustomEvent() {
112 return this;
113 },
114 addEventListener() {},
115 removeEventListener() {},
116 getComputedStyle() {
117 return {
118 getPropertyValue() {
119 return '';
120 }
121 };
122 },
123 Image() {},
124 Date() {},
125 screen: {},
126 setTimeout() {},
127 clearTimeout() {},
128 matchMedia() {
129 return {};
130 },
131 requestAnimationFrame(callback) {
132 if (typeof setTimeout === 'undefined') {
133 callback();
134 return null;
135 }
136 return setTimeout(callback, 0);
137 },
138 cancelAnimationFrame(id) {
139 if (typeof setTimeout === 'undefined') {
140 return;
141 }
142 clearTimeout(id);
143 }
144 };
145 function getWindow() {
146 const win = typeof window !== 'undefined' ? window : {};
147 extend$1(win, ssrWindow);
148 return win;
149 }
150
151 function classesToTokens(classes) {
152 if (classes === void 0) {
153 classes = '';
154 }
155 return classes.trim().split(' ').filter(c => !!c.trim());
156 }
157
158 function deleteProps(obj) {
159 const object = obj;
160 Object.keys(object).forEach(key => {
161 try {
162 object[key] = null;
163 } catch (e) {
164 // no getter for object
165 }
166 try {
167 delete object[key];
168 } catch (e) {
169 // something got wrong
170 }
171 });
172 }
173 function nextTick(callback, delay) {
174 if (delay === void 0) {
175 delay = 0;
176 }
177 return setTimeout(callback, delay);
178 }
179 function now() {
180 return Date.now();
181 }
182 function getComputedStyle$1(el) {
183 const window = getWindow();
184 let style;
185 if (window.getComputedStyle) {
186 style = window.getComputedStyle(el, null);
187 }
188 if (!style && el.currentStyle) {
189 style = el.currentStyle;
190 }
191 if (!style) {
192 style = el.style;
193 }
194 return style;
195 }
196 function getTranslate(el, axis) {
197 if (axis === void 0) {
198 axis = 'x';
199 }
200 const window = getWindow();
201 let matrix;
202 let curTransform;
203 let transformMatrix;
204 const curStyle = getComputedStyle$1(el);
205 if (window.WebKitCSSMatrix) {
206 curTransform = curStyle.transform || curStyle.webkitTransform;
207 if (curTransform.split(',').length > 6) {
208 curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
209 }
210 // Some old versions of Webkit choke when 'none' is passed; pass
211 // empty string instead in this case
212 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
213 } else {
214 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
215 matrix = transformMatrix.toString().split(',');
216 }
217 if (axis === 'x') {
218 // Latest Chrome and webkits Fix
219 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
220 // Crazy IE10 Matrix
221 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
222 // Normal Browsers
223 else curTransform = parseFloat(matrix[4]);
224 }
225 if (axis === 'y') {
226 // Latest Chrome and webkits Fix
227 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
228 // Crazy IE10 Matrix
229 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
230 // Normal Browsers
231 else curTransform = parseFloat(matrix[5]);
232 }
233 return curTransform || 0;
234 }
235 function isObject(o) {
236 return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
237 }
238 function isNode(node) {
239 // eslint-disable-next-line
240 if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
241 return node instanceof HTMLElement;
242 }
243 return node && (node.nodeType === 1 || node.nodeType === 11);
244 }
245 function extend() {
246 const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
247 const noExtend = ['__proto__', 'constructor', 'prototype'];
248 for (let i = 1; i < arguments.length; i += 1) {
249 const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
250 if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
251 const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
252 for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
253 const nextKey = keysArray[nextIndex];
254 const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
255 if (desc !== undefined && desc.enumerable) {
256 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
257 if (nextSource[nextKey].__swiper__) {
258 to[nextKey] = nextSource[nextKey];
259 } else {
260 extend(to[nextKey], nextSource[nextKey]);
261 }
262 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
263 to[nextKey] = {};
264 if (nextSource[nextKey].__swiper__) {
265 to[nextKey] = nextSource[nextKey];
266 } else {
267 extend(to[nextKey], nextSource[nextKey]);
268 }
269 } else {
270 to[nextKey] = nextSource[nextKey];
271 }
272 }
273 }
274 }
275 }
276 return to;
277 }
278 function setCSSProperty(el, varName, varValue) {
279 el.style.setProperty(varName, varValue);
280 }
281 function animateCSSModeScroll(_ref) {
282 let {
283 swiper,
284 targetPosition,
285 side
286 } = _ref;
287 const window = getWindow();
288 const startPosition = -swiper.translate;
289 let startTime = null;
290 let time;
291 const duration = swiper.params.speed;
292 swiper.wrapperEl.style.scrollSnapType = 'none';
293 window.cancelAnimationFrame(swiper.cssModeFrameID);
294 const dir = targetPosition > startPosition ? 'next' : 'prev';
295 const isOutOfBound = (current, target) => {
296 return dir === 'next' && current >= target || dir === 'prev' && current <= target;
297 };
298 const animate = () => {
299 time = new Date().getTime();
300 if (startTime === null) {
301 startTime = time;
302 }
303 const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
304 const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
305 let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
306 if (isOutOfBound(currentPosition, targetPosition)) {
307 currentPosition = targetPosition;
308 }
309 swiper.wrapperEl.scrollTo({
310 [side]: currentPosition
311 });
312 if (isOutOfBound(currentPosition, targetPosition)) {
313 swiper.wrapperEl.style.overflow = 'hidden';
314 swiper.wrapperEl.style.scrollSnapType = '';
315 setTimeout(() => {
316 swiper.wrapperEl.style.overflow = '';
317 swiper.wrapperEl.scrollTo({
318 [side]: currentPosition
319 });
320 });
321 window.cancelAnimationFrame(swiper.cssModeFrameID);
322 return;
323 }
324 swiper.cssModeFrameID = window.requestAnimationFrame(animate);
325 };
326 animate();
327 }
328 function elementChildren(element, selector) {
329 if (selector === void 0) {
330 selector = '';
331 }
332 return [...element.children].filter(el => el.matches(selector));
333 }
334 function showWarning(text) {
335 try {
336 console.warn(text);
337 return;
338 } catch (err) {
339 // err
340 }
341 }
342 function createElement(tag, classes) {
343 if (classes === void 0) {
344 classes = [];
345 }
346 const el = document.createElement(tag);
347 el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));
348 return el;
349 }
350 function elementPrevAll(el, selector) {
351 const prevEls = [];
352 while (el.previousElementSibling) {
353 const prev = el.previousElementSibling; // eslint-disable-line
354 if (selector) {
355 if (prev.matches(selector)) prevEls.push(prev);
356 } else prevEls.push(prev);
357 el = prev;
358 }
359 return prevEls;
360 }
361 function elementNextAll(el, selector) {
362 const nextEls = [];
363 while (el.nextElementSibling) {
364 const next = el.nextElementSibling; // eslint-disable-line
365 if (selector) {
366 if (next.matches(selector)) nextEls.push(next);
367 } else nextEls.push(next);
368 el = next;
369 }
370 return nextEls;
371 }
372 function elementStyle(el, prop) {
373 const window = getWindow();
374 return window.getComputedStyle(el, null).getPropertyValue(prop);
375 }
376 function elementIndex(el) {
377 let child = el;
378 let i;
379 if (child) {
380 i = 0;
381 // eslint-disable-next-line
382 while ((child = child.previousSibling) !== null) {
383 if (child.nodeType === 1) i += 1;
384 }
385 return i;
386 }
387 return undefined;
388 }
389 function elementParents(el, selector) {
390 const parents = []; // eslint-disable-line
391 let parent = el.parentElement; // eslint-disable-line
392 while (parent) {
393 if (selector) {
394 if (parent.matches(selector)) parents.push(parent);
395 } else {
396 parents.push(parent);
397 }
398 parent = parent.parentElement;
399 }
400 return parents;
401 }
402 function elementOuterSize(el, size, includeMargins) {
403 const window = getWindow();
404 if (includeMargins) {
405 return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
406 }
407 return el.offsetWidth;
408 }
409 function makeElementsArray(el) {
410 return (Array.isArray(el) ? el : [el]).filter(e => !!e);
411 }
412
413 let support;
414 function calcSupport() {
415 const window = getWindow();
416 const document = getDocument();
417 return {
418 smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
419 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
420 };
421 }
422 function getSupport() {
423 if (!support) {
424 support = calcSupport();
425 }
426 return support;
427 }
428
429 let deviceCached;
430 function calcDevice(_temp) {
431 let {
432 userAgent
433 } = _temp === void 0 ? {} : _temp;
434 const support = getSupport();
435 const window = getWindow();
436 const platform = window.navigator.platform;
437 const ua = userAgent || window.navigator.userAgent;
438 const device = {
439 ios: false,
440 android: false
441 };
442 const screenWidth = window.screen.width;
443 const screenHeight = window.screen.height;
444 const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
445 let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
446 const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
447 const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
448 const windows = platform === 'Win32';
449 let macos = platform === 'MacIntel';
450
451 // iPadOs 13 fix
452 const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
453 if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
454 ipad = ua.match(/(Version)\/([\d.]+)/);
455 if (!ipad) ipad = [0, 1, '13_0_0'];
456 macos = false;
457 }
458
459 // Android
460 if (android && !windows) {
461 device.os = 'android';
462 device.android = true;
463 }
464 if (ipad || iphone || ipod) {
465 device.os = 'ios';
466 device.ios = true;
467 }
468
469 // Export object
470 return device;
471 }
472 function getDevice(overrides) {
473 if (overrides === void 0) {
474 overrides = {};
475 }
476 if (!deviceCached) {
477 deviceCached = calcDevice(overrides);
478 }
479 return deviceCached;
480 }
481
482 let browser;
483 function calcBrowser() {
484 const window = getWindow();
485 const device = getDevice();
486 let needPerspectiveFix = false;
487 function isSafari() {
488 const ua = window.navigator.userAgent.toLowerCase();
489 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
490 }
491 if (isSafari()) {
492 const ua = String(window.navigator.userAgent);
493 if (ua.includes('Version/')) {
494 const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));
495 needPerspectiveFix = major < 16 || major === 16 && minor < 2;
496 }
497 }
498 const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);
499 const isSafariBrowser = isSafari();
500 const need3dFix = isSafariBrowser || isWebView && device.ios;
501 return {
502 isSafari: needPerspectiveFix || isSafariBrowser,
503 needPerspectiveFix,
504 need3dFix,
505 isWebView
506 };
507 }
508 function getBrowser() {
509 if (!browser) {
510 browser = calcBrowser();
511 }
512 return browser;
513 }
514
515 function Resize(_ref) {
516 let {
517 swiper,
518 on,
519 emit
520 } = _ref;
521 const window = getWindow();
522 let observer = null;
523 let animationFrame = null;
524 const resizeHandler = () => {
525 if (!swiper || swiper.destroyed || !swiper.initialized) return;
526 emit('beforeResize');
527 emit('resize');
528 };
529 const createObserver = () => {
530 if (!swiper || swiper.destroyed || !swiper.initialized) return;
531 observer = new ResizeObserver(entries => {
532 animationFrame = window.requestAnimationFrame(() => {
533 const {
534 width,
535 height
536 } = swiper;
537 let newWidth = width;
538 let newHeight = height;
539 entries.forEach(_ref2 => {
540 let {
541 contentBoxSize,
542 contentRect,
543 target
544 } = _ref2;
545 if (target && target !== swiper.el) return;
546 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
547 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
548 });
549 if (newWidth !== width || newHeight !== height) {
550 resizeHandler();
551 }
552 });
553 });
554 observer.observe(swiper.el);
555 };
556 const removeObserver = () => {
557 if (animationFrame) {
558 window.cancelAnimationFrame(animationFrame);
559 }
560 if (observer && observer.unobserve && swiper.el) {
561 observer.unobserve(swiper.el);
562 observer = null;
563 }
564 };
565 const orientationChangeHandler = () => {
566 if (!swiper || swiper.destroyed || !swiper.initialized) return;
567 emit('orientationchange');
568 };
569 on('init', () => {
570 if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
571 createObserver();
572 return;
573 }
574 window.addEventListener('resize', resizeHandler);
575 window.addEventListener('orientationchange', orientationChangeHandler);
576 });
577 on('destroy', () => {
578 removeObserver();
579 window.removeEventListener('resize', resizeHandler);
580 window.removeEventListener('orientationchange', orientationChangeHandler);
581 });
582 }
583
584 function Observer(_ref) {
585 let {
586 swiper,
587 extendParams,
588 on,
589 emit
590 } = _ref;
591 const observers = [];
592 const window = getWindow();
593 const attach = function (target, options) {
594 if (options === void 0) {
595 options = {};
596 }
597 const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
598 const observer = new ObserverFunc(mutations => {
599 // The observerUpdate event should only be triggered
600 // once despite the number of mutations. Additional
601 // triggers are redundant and are very costly
602 if (swiper.__preventObserver__) return;
603 if (mutations.length === 1) {
604 emit('observerUpdate', mutations[0]);
605 return;
606 }
607 const observerUpdate = function observerUpdate() {
608 emit('observerUpdate', mutations[0]);
609 };
610 if (window.requestAnimationFrame) {
611 window.requestAnimationFrame(observerUpdate);
612 } else {
613 window.setTimeout(observerUpdate, 0);
614 }
615 });
616 observer.observe(target, {
617 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
618 childList: typeof options.childList === 'undefined' ? true : options.childList,
619 characterData: typeof options.characterData === 'undefined' ? true : options.characterData
620 });
621 observers.push(observer);
622 };
623 const init = () => {
624 if (!swiper.params.observer) return;
625 if (swiper.params.observeParents) {
626 const containerParents = elementParents(swiper.hostEl);
627 for (let i = 0; i < containerParents.length; i += 1) {
628 attach(containerParents[i]);
629 }
630 }
631 // Observe container
632 attach(swiper.hostEl, {
633 childList: swiper.params.observeSlideChildren
634 });
635
636 // Observe wrapper
637 attach(swiper.wrapperEl, {
638 attributes: false
639 });
640 };
641 const destroy = () => {
642 observers.forEach(observer => {
643 observer.disconnect();
644 });
645 observers.splice(0, observers.length);
646 };
647 extendParams({
648 observer: false,
649 observeParents: false,
650 observeSlideChildren: false
651 });
652 on('init', init);
653 on('destroy', destroy);
654 }
655
656 /* eslint-disable no-underscore-dangle */
657
658 var eventsEmitter = {
659 on(events, handler, priority) {
660 const self = this;
661 if (!self.eventsListeners || self.destroyed) return self;
662 if (typeof handler !== 'function') return self;
663 const method = priority ? 'unshift' : 'push';
664 events.split(' ').forEach(event => {
665 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
666 self.eventsListeners[event][method](handler);
667 });
668 return self;
669 },
670 once(events, handler, priority) {
671 const self = this;
672 if (!self.eventsListeners || self.destroyed) return self;
673 if (typeof handler !== 'function') return self;
674 function onceHandler() {
675 self.off(events, onceHandler);
676 if (onceHandler.__emitterProxy) {
677 delete onceHandler.__emitterProxy;
678 }
679 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
680 args[_key] = arguments[_key];
681 }
682 handler.apply(self, args);
683 }
684 onceHandler.__emitterProxy = handler;
685 return self.on(events, onceHandler, priority);
686 },
687 onAny(handler, priority) {
688 const self = this;
689 if (!self.eventsListeners || self.destroyed) return self;
690 if (typeof handler !== 'function') return self;
691 const method = priority ? 'unshift' : 'push';
692 if (self.eventsAnyListeners.indexOf(handler) < 0) {
693 self.eventsAnyListeners[method](handler);
694 }
695 return self;
696 },
697 offAny(handler) {
698 const self = this;
699 if (!self.eventsListeners || self.destroyed) return self;
700 if (!self.eventsAnyListeners) return self;
701 const index = self.eventsAnyListeners.indexOf(handler);
702 if (index >= 0) {
703 self.eventsAnyListeners.splice(index, 1);
704 }
705 return self;
706 },
707 off(events, handler) {
708 const self = this;
709 if (!self.eventsListeners || self.destroyed) return self;
710 if (!self.eventsListeners) return self;
711 events.split(' ').forEach(event => {
712 if (typeof handler === 'undefined') {
713 self.eventsListeners[event] = [];
714 } else if (self.eventsListeners[event]) {
715 self.eventsListeners[event].forEach((eventHandler, index) => {
716 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
717 self.eventsListeners[event].splice(index, 1);
718 }
719 });
720 }
721 });
722 return self;
723 },
724 emit() {
725 const self = this;
726 if (!self.eventsListeners || self.destroyed) return self;
727 if (!self.eventsListeners) return self;
728 let events;
729 let data;
730 let context;
731 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
732 args[_key2] = arguments[_key2];
733 }
734 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
735 events = args[0];
736 data = args.slice(1, args.length);
737 context = self;
738 } else {
739 events = args[0].events;
740 data = args[0].data;
741 context = args[0].context || self;
742 }
743 data.unshift(context);
744 const eventsArray = Array.isArray(events) ? events : events.split(' ');
745 eventsArray.forEach(event => {
746 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
747 self.eventsAnyListeners.forEach(eventHandler => {
748 eventHandler.apply(context, [event, ...data]);
749 });
750 }
751 if (self.eventsListeners && self.eventsListeners[event]) {
752 self.eventsListeners[event].forEach(eventHandler => {
753 eventHandler.apply(context, data);
754 });
755 }
756 });
757 return self;
758 }
759 };
760
761 function updateSize() {
762 const swiper = this;
763 let width;
764 let height;
765 const el = swiper.el;
766 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
767 width = swiper.params.width;
768 } else {
769 width = el.clientWidth;
770 }
771 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
772 height = swiper.params.height;
773 } else {
774 height = el.clientHeight;
775 }
776 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
777 return;
778 }
779
780 // Subtract paddings
781 width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);
782 height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);
783 if (Number.isNaN(width)) width = 0;
784 if (Number.isNaN(height)) height = 0;
785 Object.assign(swiper, {
786 width,
787 height,
788 size: swiper.isHorizontal() ? width : height
789 });
790 }
791
792 function updateSlides() {
793 const swiper = this;
794 function getDirectionPropertyValue(node, label) {
795 return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
796 }
797 const params = swiper.params;
798 const {
799 wrapperEl,
800 slidesEl,
801 size: swiperSize,
802 rtlTranslate: rtl,
803 wrongRTL
804 } = swiper;
805 const isVirtual = swiper.virtual && params.virtual.enabled;
806 const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
807 const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
808 const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
809 let snapGrid = [];
810 const slidesGrid = [];
811 const slidesSizesGrid = [];
812 let offsetBefore = params.slidesOffsetBefore;
813 if (typeof offsetBefore === 'function') {
814 offsetBefore = params.slidesOffsetBefore.call(swiper);
815 }
816 let offsetAfter = params.slidesOffsetAfter;
817 if (typeof offsetAfter === 'function') {
818 offsetAfter = params.slidesOffsetAfter.call(swiper);
819 }
820 const previousSnapGridLength = swiper.snapGrid.length;
821 const previousSlidesGridLength = swiper.slidesGrid.length;
822 let spaceBetween = params.spaceBetween;
823 let slidePosition = -offsetBefore;
824 let prevSlideSize = 0;
825 let index = 0;
826 if (typeof swiperSize === 'undefined') {
827 return;
828 }
829 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
830 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
831 } else if (typeof spaceBetween === 'string') {
832 spaceBetween = parseFloat(spaceBetween);
833 }
834 swiper.virtualSize = -spaceBetween;
835
836 // reset margins
837 slides.forEach(slideEl => {
838 if (rtl) {
839 slideEl.style.marginLeft = '';
840 } else {
841 slideEl.style.marginRight = '';
842 }
843 slideEl.style.marginBottom = '';
844 slideEl.style.marginTop = '';
845 });
846
847 // reset cssMode offsets
848 if (params.centeredSlides && params.cssMode) {
849 setCSSProperty(wrapperEl, '--swiper-centered-offset-before', '');
850 setCSSProperty(wrapperEl, '--swiper-centered-offset-after', '');
851 }
852 const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
853 if (gridEnabled) {
854 swiper.grid.initSlides(slides);
855 } else if (swiper.grid) {
856 swiper.grid.unsetSlides();
857 }
858
859 // Calc slides
860 let slideSize;
861 const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {
862 return typeof params.breakpoints[key].slidesPerView !== 'undefined';
863 }).length > 0;
864 for (let i = 0; i < slidesLength; i += 1) {
865 slideSize = 0;
866 let slide;
867 if (slides[i]) slide = slides[i];
868 if (gridEnabled) {
869 swiper.grid.updateSlide(i, slide, slides);
870 }
871 if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
872
873 if (params.slidesPerView === 'auto') {
874 if (shouldResetSlideSize) {
875 slides[i].style[swiper.getDirectionLabel('width')] = ``;
876 }
877 const slideStyles = getComputedStyle(slide);
878 const currentTransform = slide.style.transform;
879 const currentWebKitTransform = slide.style.webkitTransform;
880 if (currentTransform) {
881 slide.style.transform = 'none';
882 }
883 if (currentWebKitTransform) {
884 slide.style.webkitTransform = 'none';
885 }
886 if (params.roundLengths) {
887 slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);
888 } else {
889 // eslint-disable-next-line
890 const width = getDirectionPropertyValue(slideStyles, 'width');
891 const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
892 const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
893 const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
894 const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
895 const boxSizing = slideStyles.getPropertyValue('box-sizing');
896 if (boxSizing && boxSizing === 'border-box') {
897 slideSize = width + marginLeft + marginRight;
898 } else {
899 const {
900 clientWidth,
901 offsetWidth
902 } = slide;
903 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
904 }
905 }
906 if (currentTransform) {
907 slide.style.transform = currentTransform;
908 }
909 if (currentWebKitTransform) {
910 slide.style.webkitTransform = currentWebKitTransform;
911 }
912 if (params.roundLengths) slideSize = Math.floor(slideSize);
913 } else {
914 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
915 if (params.roundLengths) slideSize = Math.floor(slideSize);
916 if (slides[i]) {
917 slides[i].style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
918 }
919 }
920 if (slides[i]) {
921 slides[i].swiperSlideSize = slideSize;
922 }
923 slidesSizesGrid.push(slideSize);
924 if (params.centeredSlides) {
925 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
926 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
927 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
928 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
929 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
930 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
931 slidesGrid.push(slidePosition);
932 } else {
933 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
934 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
935 slidesGrid.push(slidePosition);
936 slidePosition = slidePosition + slideSize + spaceBetween;
937 }
938 swiper.virtualSize += slideSize + spaceBetween;
939 prevSlideSize = slideSize;
940 index += 1;
941 }
942 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
943 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
944 wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
945 }
946 if (params.setWrapperSize) {
947 wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
948 }
949 if (gridEnabled) {
950 swiper.grid.updateWrapperSize(slideSize, snapGrid);
951 }
952
953 // Remove last grid elements depending on width
954 if (!params.centeredSlides) {
955 const newSlidesGrid = [];
956 for (let i = 0; i < snapGrid.length; i += 1) {
957 let slidesGridItem = snapGrid[i];
958 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
959 if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
960 newSlidesGrid.push(slidesGridItem);
961 }
962 }
963 snapGrid = newSlidesGrid;
964 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
965 snapGrid.push(swiper.virtualSize - swiperSize);
966 }
967 }
968 if (isVirtual && params.loop) {
969 const size = slidesSizesGrid[0] + spaceBetween;
970 if (params.slidesPerGroup > 1) {
971 const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
972 const groupSize = size * params.slidesPerGroup;
973 for (let i = 0; i < groups; i += 1) {
974 snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
975 }
976 }
977 for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
978 if (params.slidesPerGroup === 1) {
979 snapGrid.push(snapGrid[snapGrid.length - 1] + size);
980 }
981 slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
982 swiper.virtualSize += size;
983 }
984 }
985 if (snapGrid.length === 0) snapGrid = [0];
986 if (spaceBetween !== 0) {
987 const key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');
988 slides.filter((_, slideIndex) => {
989 if (!params.cssMode || params.loop) return true;
990 if (slideIndex === slides.length - 1) {
991 return false;
992 }
993 return true;
994 }).forEach(slideEl => {
995 slideEl.style[key] = `${spaceBetween}px`;
996 });
997 }
998 if (params.centeredSlides && params.centeredSlidesBounds) {
999 let allSlidesSize = 0;
1000 slidesSizesGrid.forEach(slideSizeValue => {
1001 allSlidesSize += slideSizeValue + (spaceBetween || 0);
1002 });
1003 allSlidesSize -= spaceBetween;
1004 const maxSnap = allSlidesSize - swiperSize;
1005 snapGrid = snapGrid.map(snap => {
1006 if (snap <= 0) return -offsetBefore;
1007 if (snap > maxSnap) return maxSnap + offsetAfter;
1008 return snap;
1009 });
1010 }
1011 if (params.centerInsufficientSlides) {
1012 let allSlidesSize = 0;
1013 slidesSizesGrid.forEach(slideSizeValue => {
1014 allSlidesSize += slideSizeValue + (spaceBetween || 0);
1015 });
1016 allSlidesSize -= spaceBetween;
1017 const offsetSize = (params.slidesOffsetBefore || 0) + (params.slidesOffsetAfter || 0);
1018 if (allSlidesSize + offsetSize < swiperSize) {
1019 const allSlidesOffset = (swiperSize - allSlidesSize - offsetSize) / 2;
1020 snapGrid.forEach((snap, snapIndex) => {
1021 snapGrid[snapIndex] = snap - allSlidesOffset;
1022 });
1023 slidesGrid.forEach((snap, snapIndex) => {
1024 slidesGrid[snapIndex] = snap + allSlidesOffset;
1025 });
1026 }
1027 }
1028 Object.assign(swiper, {
1029 slides,
1030 snapGrid,
1031 slidesGrid,
1032 slidesSizesGrid
1033 });
1034 if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
1035 setCSSProperty(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);
1036 setCSSProperty(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
1037 const addToSnapGrid = -swiper.snapGrid[0];
1038 const addToSlidesGrid = -swiper.slidesGrid[0];
1039 swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);
1040 swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);
1041 }
1042 if (slidesLength !== previousSlidesLength) {
1043 swiper.emit('slidesLengthChange');
1044 }
1045 if (snapGrid.length !== previousSnapGridLength) {
1046 if (swiper.params.watchOverflow) swiper.checkOverflow();
1047 swiper.emit('snapGridLengthChange');
1048 }
1049 if (slidesGrid.length !== previousSlidesGridLength) {
1050 swiper.emit('slidesGridLengthChange');
1051 }
1052 if (params.watchSlidesProgress) {
1053 swiper.updateSlidesOffset();
1054 }
1055 swiper.emit('slidesUpdated');
1056 if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
1057 const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
1058 const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
1059 if (slidesLength <= params.maxBackfaceHiddenSlides) {
1060 if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
1061 } else if (hasClassBackfaceClassAdded) {
1062 swiper.el.classList.remove(backFaceHiddenClass);
1063 }
1064 }
1065 }
1066
1067 function updateAutoHeight(speed) {
1068 const swiper = this;
1069 const activeSlides = [];
1070 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1071 let newHeight = 0;
1072 let i;
1073 if (typeof speed === 'number') {
1074 swiper.setTransition(speed);
1075 } else if (speed === true) {
1076 swiper.setTransition(swiper.params.speed);
1077 }
1078 const getSlideByIndex = index => {
1079 if (isVirtual) {
1080 return swiper.slides[swiper.getSlideIndexByData(index)];
1081 }
1082 return swiper.slides[index];
1083 };
1084 // Find slides currently in view
1085 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1086 if (swiper.params.centeredSlides) {
1087 (swiper.visibleSlides || []).forEach(slide => {
1088 activeSlides.push(slide);
1089 });
1090 } else {
1091 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1092 const index = swiper.activeIndex + i;
1093 if (index > swiper.slides.length && !isVirtual) break;
1094 activeSlides.push(getSlideByIndex(index));
1095 }
1096 }
1097 } else {
1098 activeSlides.push(getSlideByIndex(swiper.activeIndex));
1099 }
1100
1101 // Find new height from highest slide in view
1102 for (i = 0; i < activeSlides.length; i += 1) {
1103 if (typeof activeSlides[i] !== 'undefined') {
1104 const height = activeSlides[i].offsetHeight;
1105 newHeight = height > newHeight ? height : newHeight;
1106 }
1107 }
1108
1109 // Update Height
1110 if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
1111 }
1112
1113 function updateSlidesOffset() {
1114 const swiper = this;
1115 const slides = swiper.slides;
1116 // eslint-disable-next-line
1117 const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
1118 for (let i = 0; i < slides.length; i += 1) {
1119 slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
1120 }
1121 }
1122
1123 const toggleSlideClasses$1 = (slideEl, condition, className) => {
1124 if (condition && !slideEl.classList.contains(className)) {
1125 slideEl.classList.add(className);
1126 } else if (!condition && slideEl.classList.contains(className)) {
1127 slideEl.classList.remove(className);
1128 }
1129 };
1130 function updateSlidesProgress(translate) {
1131 if (translate === void 0) {
1132 translate = this && this.translate || 0;
1133 }
1134 const swiper = this;
1135 const params = swiper.params;
1136 const {
1137 slides,
1138 rtlTranslate: rtl,
1139 snapGrid
1140 } = swiper;
1141 if (slides.length === 0) return;
1142 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
1143 let offsetCenter = -translate;
1144 if (rtl) offsetCenter = translate;
1145 swiper.visibleSlidesIndexes = [];
1146 swiper.visibleSlides = [];
1147 let spaceBetween = params.spaceBetween;
1148 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1149 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
1150 } else if (typeof spaceBetween === 'string') {
1151 spaceBetween = parseFloat(spaceBetween);
1152 }
1153 for (let i = 0; i < slides.length; i += 1) {
1154 const slide = slides[i];
1155 let slideOffset = slide.swiperSlideOffset;
1156 if (params.cssMode && params.centeredSlides) {
1157 slideOffset -= slides[0].swiperSlideOffset;
1158 }
1159 const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1160 const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1161 const slideBefore = -(offsetCenter - slideOffset);
1162 const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1163 const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
1164 const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
1165 if (isVisible) {
1166 swiper.visibleSlides.push(slide);
1167 swiper.visibleSlidesIndexes.push(i);
1168 }
1169 toggleSlideClasses$1(slide, isVisible, params.slideVisibleClass);
1170 toggleSlideClasses$1(slide, isFullyVisible, params.slideFullyVisibleClass);
1171 slide.progress = rtl ? -slideProgress : slideProgress;
1172 slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
1173 }
1174 }
1175
1176 function updateProgress(translate) {
1177 const swiper = this;
1178 if (typeof translate === 'undefined') {
1179 const multiplier = swiper.rtlTranslate ? -1 : 1;
1180 // eslint-disable-next-line
1181 translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
1182 }
1183 const params = swiper.params;
1184 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1185 let {
1186 progress,
1187 isBeginning,
1188 isEnd,
1189 progressLoop
1190 } = swiper;
1191 const wasBeginning = isBeginning;
1192 const wasEnd = isEnd;
1193 if (translatesDiff === 0) {
1194 progress = 0;
1195 isBeginning = true;
1196 isEnd = true;
1197 } else {
1198 progress = (translate - swiper.minTranslate()) / translatesDiff;
1199 const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
1200 const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
1201 isBeginning = isBeginningRounded || progress <= 0;
1202 isEnd = isEndRounded || progress >= 1;
1203 if (isBeginningRounded) progress = 0;
1204 if (isEndRounded) progress = 1;
1205 }
1206 if (params.loop) {
1207 const firstSlideIndex = swiper.getSlideIndexByData(0);
1208 const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
1209 const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
1210 const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
1211 const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
1212 const translateAbs = Math.abs(translate);
1213 if (translateAbs >= firstSlideTranslate) {
1214 progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
1215 } else {
1216 progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
1217 }
1218 if (progressLoop > 1) progressLoop -= 1;
1219 }
1220 Object.assign(swiper, {
1221 progress,
1222 progressLoop,
1223 isBeginning,
1224 isEnd
1225 });
1226 if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
1227 if (isBeginning && !wasBeginning) {
1228 swiper.emit('reachBeginning toEdge');
1229 }
1230 if (isEnd && !wasEnd) {
1231 swiper.emit('reachEnd toEdge');
1232 }
1233 if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
1234 swiper.emit('fromEdge');
1235 }
1236 swiper.emit('progress', progress);
1237 }
1238
1239 const toggleSlideClasses = (slideEl, condition, className) => {
1240 if (condition && !slideEl.classList.contains(className)) {
1241 slideEl.classList.add(className);
1242 } else if (!condition && slideEl.classList.contains(className)) {
1243 slideEl.classList.remove(className);
1244 }
1245 };
1246 function updateSlidesClasses() {
1247 const swiper = this;
1248 const {
1249 slides,
1250 params,
1251 slidesEl,
1252 activeIndex
1253 } = swiper;
1254 const isVirtual = swiper.virtual && params.virtual.enabled;
1255 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1256 const getFilteredSlide = selector => {
1257 return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
1258 };
1259 let activeSlide;
1260 let prevSlide;
1261 let nextSlide;
1262 if (isVirtual) {
1263 if (params.loop) {
1264 let slideIndex = activeIndex - swiper.virtual.slidesBefore;
1265 if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
1266 if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
1267 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
1268 } else {
1269 activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
1270 }
1271 } else {
1272 if (gridEnabled) {
1273 activeSlide = slides.filter(slideEl => slideEl.column === activeIndex)[0];
1274 nextSlide = slides.filter(slideEl => slideEl.column === activeIndex + 1)[0];
1275 prevSlide = slides.filter(slideEl => slideEl.column === activeIndex - 1)[0];
1276 } else {
1277 activeSlide = slides[activeIndex];
1278 }
1279 }
1280 if (activeSlide) {
1281 if (!gridEnabled) {
1282 // Next Slide
1283 nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1284 if (params.loop && !nextSlide) {
1285 nextSlide = slides[0];
1286 }
1287
1288 // Prev Slide
1289 prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1290 if (params.loop && !prevSlide === 0) {
1291 prevSlide = slides[slides.length - 1];
1292 }
1293 }
1294 }
1295 slides.forEach(slideEl => {
1296 toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);
1297 toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);
1298 toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);
1299 });
1300 swiper.emitSlidesClasses();
1301 }
1302
1303 const processLazyPreloader = (swiper, imageEl) => {
1304 if (!swiper || swiper.destroyed || !swiper.params) return;
1305 const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
1306 const slideEl = imageEl.closest(slideSelector());
1307 if (slideEl) {
1308 let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1309 if (!lazyEl && swiper.isElement) {
1310 if (slideEl.shadowRoot) {
1311 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1312 } else {
1313 // init later
1314 requestAnimationFrame(() => {
1315 if (slideEl.shadowRoot) {
1316 lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1317 if (lazyEl) lazyEl.remove();
1318 }
1319 });
1320 }
1321 }
1322 if (lazyEl) lazyEl.remove();
1323 }
1324 };
1325 const unlazy = (swiper, index) => {
1326 if (!swiper.slides[index]) return;
1327 const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
1328 if (imageEl) imageEl.removeAttribute('loading');
1329 };
1330 const preload = swiper => {
1331 if (!swiper || swiper.destroyed || !swiper.params) return;
1332 let amount = swiper.params.lazyPreloadPrevNext;
1333 const len = swiper.slides.length;
1334 if (!len || !amount || amount < 0) return;
1335 amount = Math.min(amount, len);
1336 const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
1337 const activeIndex = swiper.activeIndex;
1338 if (swiper.params.grid && swiper.params.grid.rows > 1) {
1339 const activeColumn = activeIndex;
1340 const preloadColumns = [activeColumn - amount];
1341 preloadColumns.push(...Array.from({
1342 length: amount
1343 }).map((_, i) => {
1344 return activeColumn + slidesPerView + i;
1345 }));
1346 swiper.slides.forEach((slideEl, i) => {
1347 if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
1348 });
1349 return;
1350 }
1351 const slideIndexLastInView = activeIndex + slidesPerView - 1;
1352 if (swiper.params.rewind || swiper.params.loop) {
1353 for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
1354 const realIndex = (i % len + len) % len;
1355 if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
1356 }
1357 } else {
1358 for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
1359 if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
1360 unlazy(swiper, i);
1361 }
1362 }
1363 }
1364 };
1365
1366 function getActiveIndexByTranslate(swiper) {
1367 const {
1368 slidesGrid,
1369 params
1370 } = swiper;
1371 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1372 let activeIndex;
1373 for (let i = 0; i < slidesGrid.length; i += 1) {
1374 if (typeof slidesGrid[i + 1] !== 'undefined') {
1375 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
1376 activeIndex = i;
1377 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1378 activeIndex = i + 1;
1379 }
1380 } else if (translate >= slidesGrid[i]) {
1381 activeIndex = i;
1382 }
1383 }
1384 // Normalize slideIndex
1385 if (params.normalizeSlideIndex) {
1386 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
1387 }
1388 return activeIndex;
1389 }
1390 function updateActiveIndex(newActiveIndex) {
1391 const swiper = this;
1392 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1393 const {
1394 snapGrid,
1395 params,
1396 activeIndex: previousIndex,
1397 realIndex: previousRealIndex,
1398 snapIndex: previousSnapIndex
1399 } = swiper;
1400 let activeIndex = newActiveIndex;
1401 let snapIndex;
1402 const getVirtualRealIndex = aIndex => {
1403 let realIndex = aIndex - swiper.virtual.slidesBefore;
1404 if (realIndex < 0) {
1405 realIndex = swiper.virtual.slides.length + realIndex;
1406 }
1407 if (realIndex >= swiper.virtual.slides.length) {
1408 realIndex -= swiper.virtual.slides.length;
1409 }
1410 return realIndex;
1411 };
1412 if (typeof activeIndex === 'undefined') {
1413 activeIndex = getActiveIndexByTranslate(swiper);
1414 }
1415 if (snapGrid.indexOf(translate) >= 0) {
1416 snapIndex = snapGrid.indexOf(translate);
1417 } else {
1418 const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1419 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1420 }
1421 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1422 if (activeIndex === previousIndex && !swiper.params.loop) {
1423 if (snapIndex !== previousSnapIndex) {
1424 swiper.snapIndex = snapIndex;
1425 swiper.emit('snapIndexChange');
1426 }
1427 return;
1428 }
1429 if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
1430 swiper.realIndex = getVirtualRealIndex(activeIndex);
1431 return;
1432 }
1433 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1434
1435 // Get real index
1436 let realIndex;
1437 if (swiper.virtual && params.virtual.enabled && params.loop) {
1438 realIndex = getVirtualRealIndex(activeIndex);
1439 } else if (gridEnabled) {
1440 const firstSlideInColumn = swiper.slides.filter(slideEl => slideEl.column === activeIndex)[0];
1441 let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);
1442 if (Number.isNaN(activeSlideIndex)) {
1443 activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
1444 }
1445 realIndex = Math.floor(activeSlideIndex / params.grid.rows);
1446 } else if (swiper.slides[activeIndex]) {
1447 const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');
1448 if (slideIndex) {
1449 realIndex = parseInt(slideIndex, 10);
1450 } else {
1451 realIndex = activeIndex;
1452 }
1453 } else {
1454 realIndex = activeIndex;
1455 }
1456 Object.assign(swiper, {
1457 previousSnapIndex,
1458 snapIndex,
1459 previousRealIndex,
1460 realIndex,
1461 previousIndex,
1462 activeIndex
1463 });
1464 if (swiper.initialized) {
1465 preload(swiper);
1466 }
1467 swiper.emit('activeIndexChange');
1468 swiper.emit('snapIndexChange');
1469 if (swiper.initialized || swiper.params.runCallbacksOnInit) {
1470 if (previousRealIndex !== realIndex) {
1471 swiper.emit('realIndexChange');
1472 }
1473 swiper.emit('slideChange');
1474 }
1475 }
1476
1477 function updateClickedSlide(el, path) {
1478 const swiper = this;
1479 const params = swiper.params;
1480 let slide = el.closest(`.${params.slideClass}, swiper-slide`);
1481 if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {
1482 [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {
1483 if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {
1484 slide = pathEl;
1485 }
1486 });
1487 }
1488 let slideFound = false;
1489 let slideIndex;
1490 if (slide) {
1491 for (let i = 0; i < swiper.slides.length; i += 1) {
1492 if (swiper.slides[i] === slide) {
1493 slideFound = true;
1494 slideIndex = i;
1495 break;
1496 }
1497 }
1498 }
1499 if (slide && slideFound) {
1500 swiper.clickedSlide = slide;
1501 if (swiper.virtual && swiper.params.virtual.enabled) {
1502 swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
1503 } else {
1504 swiper.clickedIndex = slideIndex;
1505 }
1506 } else {
1507 swiper.clickedSlide = undefined;
1508 swiper.clickedIndex = undefined;
1509 return;
1510 }
1511 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1512 swiper.slideToClickedSlide();
1513 }
1514 }
1515
1516 var update = {
1517 updateSize,
1518 updateSlides,
1519 updateAutoHeight,
1520 updateSlidesOffset,
1521 updateSlidesProgress,
1522 updateProgress,
1523 updateSlidesClasses,
1524 updateActiveIndex,
1525 updateClickedSlide
1526 };
1527
1528 function getSwiperTranslate(axis) {
1529 if (axis === void 0) {
1530 axis = this.isHorizontal() ? 'x' : 'y';
1531 }
1532 const swiper = this;
1533 const {
1534 params,
1535 rtlTranslate: rtl,
1536 translate,
1537 wrapperEl
1538 } = swiper;
1539 if (params.virtualTranslate) {
1540 return rtl ? -translate : translate;
1541 }
1542 if (params.cssMode) {
1543 return translate;
1544 }
1545 let currentTranslate = getTranslate(wrapperEl, axis);
1546 currentTranslate += swiper.cssOverflowAdjustment();
1547 if (rtl) currentTranslate = -currentTranslate;
1548 return currentTranslate || 0;
1549 }
1550
1551 function setTranslate(translate, byController) {
1552 const swiper = this;
1553 const {
1554 rtlTranslate: rtl,
1555 params,
1556 wrapperEl,
1557 progress
1558 } = swiper;
1559 let x = 0;
1560 let y = 0;
1561 const z = 0;
1562 if (swiper.isHorizontal()) {
1563 x = rtl ? -translate : translate;
1564 } else {
1565 y = translate;
1566 }
1567 if (params.roundLengths) {
1568 x = Math.floor(x);
1569 y = Math.floor(y);
1570 }
1571 swiper.previousTranslate = swiper.translate;
1572 swiper.translate = swiper.isHorizontal() ? x : y;
1573 if (params.cssMode) {
1574 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
1575 } else if (!params.virtualTranslate) {
1576 if (swiper.isHorizontal()) {
1577 x -= swiper.cssOverflowAdjustment();
1578 } else {
1579 y -= swiper.cssOverflowAdjustment();
1580 }
1581 wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
1582 }
1583
1584 // Check if we need to update progress
1585 let newProgress;
1586 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1587 if (translatesDiff === 0) {
1588 newProgress = 0;
1589 } else {
1590 newProgress = (translate - swiper.minTranslate()) / translatesDiff;
1591 }
1592 if (newProgress !== progress) {
1593 swiper.updateProgress(translate);
1594 }
1595 swiper.emit('setTranslate', swiper.translate, byController);
1596 }
1597
1598 function minTranslate() {
1599 return -this.snapGrid[0];
1600 }
1601
1602 function maxTranslate() {
1603 return -this.snapGrid[this.snapGrid.length - 1];
1604 }
1605
1606 function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
1607 if (translate === void 0) {
1608 translate = 0;
1609 }
1610 if (speed === void 0) {
1611 speed = this.params.speed;
1612 }
1613 if (runCallbacks === void 0) {
1614 runCallbacks = true;
1615 }
1616 if (translateBounds === void 0) {
1617 translateBounds = true;
1618 }
1619 const swiper = this;
1620 const {
1621 params,
1622 wrapperEl
1623 } = swiper;
1624 if (swiper.animating && params.preventInteractionOnTransition) {
1625 return false;
1626 }
1627 const minTranslate = swiper.minTranslate();
1628 const maxTranslate = swiper.maxTranslate();
1629 let newTranslate;
1630 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
1631
1632 // Update progress
1633 swiper.updateProgress(newTranslate);
1634 if (params.cssMode) {
1635 const isH = swiper.isHorizontal();
1636 if (speed === 0) {
1637 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1638 } else {
1639 if (!swiper.support.smoothScroll) {
1640 animateCSSModeScroll({
1641 swiper,
1642 targetPosition: -newTranslate,
1643 side: isH ? 'left' : 'top'
1644 });
1645 return true;
1646 }
1647 wrapperEl.scrollTo({
1648 [isH ? 'left' : 'top']: -newTranslate,
1649 behavior: 'smooth'
1650 });
1651 }
1652 return true;
1653 }
1654 if (speed === 0) {
1655 swiper.setTransition(0);
1656 swiper.setTranslate(newTranslate);
1657 if (runCallbacks) {
1658 swiper.emit('beforeTransitionStart', speed, internal);
1659 swiper.emit('transitionEnd');
1660 }
1661 } else {
1662 swiper.setTransition(speed);
1663 swiper.setTranslate(newTranslate);
1664 if (runCallbacks) {
1665 swiper.emit('beforeTransitionStart', speed, internal);
1666 swiper.emit('transitionStart');
1667 }
1668 if (!swiper.animating) {
1669 swiper.animating = true;
1670 if (!swiper.onTranslateToWrapperTransitionEnd) {
1671 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
1672 if (!swiper || swiper.destroyed) return;
1673 if (e.target !== this) return;
1674 swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1675 swiper.onTranslateToWrapperTransitionEnd = null;
1676 delete swiper.onTranslateToWrapperTransitionEnd;
1677 swiper.animating = false;
1678 if (runCallbacks) {
1679 swiper.emit('transitionEnd');
1680 }
1681 };
1682 }
1683 swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1684 }
1685 }
1686 return true;
1687 }
1688
1689 var translate = {
1690 getTranslate: getSwiperTranslate,
1691 setTranslate,
1692 minTranslate,
1693 maxTranslate,
1694 translateTo
1695 };
1696
1697 function setTransition(duration, byController) {
1698 const swiper = this;
1699 if (!swiper.params.cssMode) {
1700 swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
1701 swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';
1702 }
1703 swiper.emit('setTransition', duration, byController);
1704 }
1705
1706 function transitionEmit(_ref) {
1707 let {
1708 swiper,
1709 runCallbacks,
1710 direction,
1711 step
1712 } = _ref;
1713 const {
1714 activeIndex,
1715 previousIndex
1716 } = swiper;
1717 let dir = direction;
1718 if (!dir) {
1719 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
1720 }
1721 swiper.emit(`transition${step}`);
1722 if (runCallbacks && activeIndex !== previousIndex) {
1723 if (dir === 'reset') {
1724 swiper.emit(`slideResetTransition${step}`);
1725 return;
1726 }
1727 swiper.emit(`slideChangeTransition${step}`);
1728 if (dir === 'next') {
1729 swiper.emit(`slideNextTransition${step}`);
1730 } else {
1731 swiper.emit(`slidePrevTransition${step}`);
1732 }
1733 }
1734 }
1735
1736 function transitionStart(runCallbacks, direction) {
1737 if (runCallbacks === void 0) {
1738 runCallbacks = true;
1739 }
1740 const swiper = this;
1741 const {
1742 params
1743 } = swiper;
1744 if (params.cssMode) return;
1745 if (params.autoHeight) {
1746 swiper.updateAutoHeight();
1747 }
1748 transitionEmit({
1749 swiper,
1750 runCallbacks,
1751 direction,
1752 step: 'Start'
1753 });
1754 }
1755
1756 function transitionEnd(runCallbacks, direction) {
1757 if (runCallbacks === void 0) {
1758 runCallbacks = true;
1759 }
1760 const swiper = this;
1761 const {
1762 params
1763 } = swiper;
1764 swiper.animating = false;
1765 if (params.cssMode) return;
1766 swiper.setTransition(0);
1767 transitionEmit({
1768 swiper,
1769 runCallbacks,
1770 direction,
1771 step: 'End'
1772 });
1773 }
1774
1775 var transition = {
1776 setTransition,
1777 transitionStart,
1778 transitionEnd
1779 };
1780
1781 function slideTo(index, speed, runCallbacks, internal, initial) {
1782 if (index === void 0) {
1783 index = 0;
1784 }
1785 if (runCallbacks === void 0) {
1786 runCallbacks = true;
1787 }
1788 if (typeof index === 'string') {
1789 index = parseInt(index, 10);
1790 }
1791 const swiper = this;
1792 let slideIndex = index;
1793 if (slideIndex < 0) slideIndex = 0;
1794 const {
1795 params,
1796 snapGrid,
1797 slidesGrid,
1798 previousIndex,
1799 activeIndex,
1800 rtlTranslate: rtl,
1801 wrapperEl,
1802 enabled
1803 } = swiper;
1804 if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {
1805 return false;
1806 }
1807 if (typeof speed === 'undefined') {
1808 speed = swiper.params.speed;
1809 }
1810 const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
1811 let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
1812 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1813 const translate = -snapGrid[snapIndex];
1814 // Normalize slideIndex
1815 if (params.normalizeSlideIndex) {
1816 for (let i = 0; i < slidesGrid.length; i += 1) {
1817 const normalizedTranslate = -Math.floor(translate * 100);
1818 const normalizedGrid = Math.floor(slidesGrid[i] * 100);
1819 const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
1820 if (typeof slidesGrid[i + 1] !== 'undefined') {
1821 if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
1822 slideIndex = i;
1823 } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
1824 slideIndex = i + 1;
1825 }
1826 } else if (normalizedTranslate >= normalizedGrid) {
1827 slideIndex = i;
1828 }
1829 }
1830 }
1831 // Directions locks
1832 if (swiper.initialized && slideIndex !== activeIndex) {
1833 if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
1834 return false;
1835 }
1836 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
1837 if ((activeIndex || 0) !== slideIndex) {
1838 return false;
1839 }
1840 }
1841 }
1842 if (slideIndex !== (previousIndex || 0) && runCallbacks) {
1843 swiper.emit('beforeSlideChangeStart');
1844 }
1845
1846 // Update progress
1847 swiper.updateProgress(translate);
1848 let direction;
1849 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
1850
1851 // Update Index
1852 if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
1853 swiper.updateActiveIndex(slideIndex);
1854 // Update Height
1855 if (params.autoHeight) {
1856 swiper.updateAutoHeight();
1857 }
1858 swiper.updateSlidesClasses();
1859 if (params.effect !== 'slide') {
1860 swiper.setTranslate(translate);
1861 }
1862 if (direction !== 'reset') {
1863 swiper.transitionStart(runCallbacks, direction);
1864 swiper.transitionEnd(runCallbacks, direction);
1865 }
1866 return false;
1867 }
1868 if (params.cssMode) {
1869 const isH = swiper.isHorizontal();
1870 const t = rtl ? translate : -translate;
1871 if (speed === 0) {
1872 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1873 if (isVirtual) {
1874 swiper.wrapperEl.style.scrollSnapType = 'none';
1875 swiper._immediateVirtual = true;
1876 }
1877 if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
1878 swiper._cssModeVirtualInitialSet = true;
1879 requestAnimationFrame(() => {
1880 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1881 });
1882 } else {
1883 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1884 }
1885 if (isVirtual) {
1886 requestAnimationFrame(() => {
1887 swiper.wrapperEl.style.scrollSnapType = '';
1888 swiper._immediateVirtual = false;
1889 });
1890 }
1891 } else {
1892 if (!swiper.support.smoothScroll) {
1893 animateCSSModeScroll({
1894 swiper,
1895 targetPosition: t,
1896 side: isH ? 'left' : 'top'
1897 });
1898 return true;
1899 }
1900 wrapperEl.scrollTo({
1901 [isH ? 'left' : 'top']: t,
1902 behavior: 'smooth'
1903 });
1904 }
1905 return true;
1906 }
1907 swiper.setTransition(speed);
1908 swiper.setTranslate(translate);
1909 swiper.updateActiveIndex(slideIndex);
1910 swiper.updateSlidesClasses();
1911 swiper.emit('beforeTransitionStart', speed, internal);
1912 swiper.transitionStart(runCallbacks, direction);
1913 if (speed === 0) {
1914 swiper.transitionEnd(runCallbacks, direction);
1915 } else if (!swiper.animating) {
1916 swiper.animating = true;
1917 if (!swiper.onSlideToWrapperTransitionEnd) {
1918 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
1919 if (!swiper || swiper.destroyed) return;
1920 if (e.target !== this) return;
1921 swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1922 swiper.onSlideToWrapperTransitionEnd = null;
1923 delete swiper.onSlideToWrapperTransitionEnd;
1924 swiper.transitionEnd(runCallbacks, direction);
1925 };
1926 }
1927 swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1928 }
1929 return true;
1930 }
1931
1932 function slideToLoop(index, speed, runCallbacks, internal) {
1933 if (index === void 0) {
1934 index = 0;
1935 }
1936 if (runCallbacks === void 0) {
1937 runCallbacks = true;
1938 }
1939 if (typeof index === 'string') {
1940 const indexAsNumber = parseInt(index, 10);
1941 index = indexAsNumber;
1942 }
1943 const swiper = this;
1944 if (swiper.destroyed) return;
1945 if (typeof speed === 'undefined') {
1946 speed = swiper.params.speed;
1947 }
1948 const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
1949 let newIndex = index;
1950 if (swiper.params.loop) {
1951 if (swiper.virtual && swiper.params.virtual.enabled) {
1952 // eslint-disable-next-line
1953 newIndex = newIndex + swiper.virtual.slidesBefore;
1954 } else {
1955 let targetSlideIndex;
1956 if (gridEnabled) {
1957 const slideIndex = newIndex * swiper.params.grid.rows;
1958 targetSlideIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
1959 } else {
1960 targetSlideIndex = swiper.getSlideIndexByData(newIndex);
1961 }
1962 const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
1963 const {
1964 centeredSlides
1965 } = swiper.params;
1966 let slidesPerView = swiper.params.slidesPerView;
1967 if (slidesPerView === 'auto') {
1968 slidesPerView = swiper.slidesPerViewDynamic();
1969 } else {
1970 slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
1971 if (centeredSlides && slidesPerView % 2 === 0) {
1972 slidesPerView = slidesPerView + 1;
1973 }
1974 }
1975 let needLoopFix = cols - targetSlideIndex < slidesPerView;
1976 if (centeredSlides) {
1977 needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
1978 }
1979 if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {
1980 needLoopFix = false;
1981 }
1982 if (needLoopFix) {
1983 const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
1984 swiper.loopFix({
1985 direction,
1986 slideTo: true,
1987 activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
1988 slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
1989 });
1990 }
1991 if (gridEnabled) {
1992 const slideIndex = newIndex * swiper.params.grid.rows;
1993 newIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
1994 } else {
1995 newIndex = swiper.getSlideIndexByData(newIndex);
1996 }
1997 }
1998 }
1999 requestAnimationFrame(() => {
2000 swiper.slideTo(newIndex, speed, runCallbacks, internal);
2001 });
2002 return swiper;
2003 }
2004
2005 /* eslint no-unused-vars: "off" */
2006 function slideNext(speed, runCallbacks, internal) {
2007 if (runCallbacks === void 0) {
2008 runCallbacks = true;
2009 }
2010 const swiper = this;
2011 const {
2012 enabled,
2013 params,
2014 animating
2015 } = swiper;
2016 if (!enabled || swiper.destroyed) return swiper;
2017 if (typeof speed === 'undefined') {
2018 speed = swiper.params.speed;
2019 }
2020 let perGroup = params.slidesPerGroup;
2021 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2022 perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
2023 }
2024 const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
2025 const isVirtual = swiper.virtual && params.virtual.enabled;
2026 if (params.loop) {
2027 if (animating && !isVirtual && params.loopPreventsSliding) return false;
2028 swiper.loopFix({
2029 direction: 'next'
2030 });
2031 // eslint-disable-next-line
2032 swiper._clientLeft = swiper.wrapperEl.clientLeft;
2033 if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
2034 requestAnimationFrame(() => {
2035 swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2036 });
2037 return true;
2038 }
2039 }
2040 if (params.rewind && swiper.isEnd) {
2041 return swiper.slideTo(0, speed, runCallbacks, internal);
2042 }
2043 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2044 }
2045
2046 /* eslint no-unused-vars: "off" */
2047 function slidePrev(speed, runCallbacks, internal) {
2048 if (runCallbacks === void 0) {
2049 runCallbacks = true;
2050 }
2051 const swiper = this;
2052 const {
2053 params,
2054 snapGrid,
2055 slidesGrid,
2056 rtlTranslate,
2057 enabled,
2058 animating
2059 } = swiper;
2060 if (!enabled || swiper.destroyed) return swiper;
2061 if (typeof speed === 'undefined') {
2062 speed = swiper.params.speed;
2063 }
2064 const isVirtual = swiper.virtual && params.virtual.enabled;
2065 if (params.loop) {
2066 if (animating && !isVirtual && params.loopPreventsSliding) return false;
2067 swiper.loopFix({
2068 direction: 'prev'
2069 });
2070 // eslint-disable-next-line
2071 swiper._clientLeft = swiper.wrapperEl.clientLeft;
2072 }
2073 const translate = rtlTranslate ? swiper.translate : -swiper.translate;
2074 function normalize(val) {
2075 if (val < 0) return -Math.floor(Math.abs(val));
2076 return Math.floor(val);
2077 }
2078 const normalizedTranslate = normalize(translate);
2079 const normalizedSnapGrid = snapGrid.map(val => normalize(val));
2080 let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2081 if (typeof prevSnap === 'undefined' && params.cssMode) {
2082 let prevSnapIndex;
2083 snapGrid.forEach((snap, snapIndex) => {
2084 if (normalizedTranslate >= snap) {
2085 // prevSnap = snap;
2086 prevSnapIndex = snapIndex;
2087 }
2088 });
2089 if (typeof prevSnapIndex !== 'undefined') {
2090 prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
2091 }
2092 }
2093 let prevIndex = 0;
2094 if (typeof prevSnap !== 'undefined') {
2095 prevIndex = slidesGrid.indexOf(prevSnap);
2096 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
2097 if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2098 prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
2099 prevIndex = Math.max(prevIndex, 0);
2100 }
2101 }
2102 if (params.rewind && swiper.isBeginning) {
2103 const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
2104 return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
2105 } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
2106 requestAnimationFrame(() => {
2107 swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2108 });
2109 return true;
2110 }
2111 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2112 }
2113
2114 /* eslint no-unused-vars: "off" */
2115 function slideReset(speed, runCallbacks, internal) {
2116 if (runCallbacks === void 0) {
2117 runCallbacks = true;
2118 }
2119 const swiper = this;
2120 if (swiper.destroyed) return;
2121 if (typeof speed === 'undefined') {
2122 speed = swiper.params.speed;
2123 }
2124 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2125 }
2126
2127 /* eslint no-unused-vars: "off" */
2128 function slideToClosest(speed, runCallbacks, internal, threshold) {
2129 if (runCallbacks === void 0) {
2130 runCallbacks = true;
2131 }
2132 if (threshold === void 0) {
2133 threshold = 0.5;
2134 }
2135 const swiper = this;
2136 if (swiper.destroyed) return;
2137 if (typeof speed === 'undefined') {
2138 speed = swiper.params.speed;
2139 }
2140 let index = swiper.activeIndex;
2141 const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2142 const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2143 const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2144 if (translate >= swiper.snapGrid[snapIndex]) {
2145 // The current translate is on or after the current snap index, so the choice
2146 // is between the current index and the one after it.
2147 const currentSnap = swiper.snapGrid[snapIndex];
2148 const nextSnap = swiper.snapGrid[snapIndex + 1];
2149 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
2150 index += swiper.params.slidesPerGroup;
2151 }
2152 } else {
2153 // The current translate is before the current snap index, so the choice
2154 // is between the current index and the one before it.
2155 const prevSnap = swiper.snapGrid[snapIndex - 1];
2156 const currentSnap = swiper.snapGrid[snapIndex];
2157 if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {
2158 index -= swiper.params.slidesPerGroup;
2159 }
2160 }
2161 index = Math.max(index, 0);
2162 index = Math.min(index, swiper.slidesGrid.length - 1);
2163 return swiper.slideTo(index, speed, runCallbacks, internal);
2164 }
2165
2166 function slideToClickedSlide() {
2167 const swiper = this;
2168 if (swiper.destroyed) return;
2169 const {
2170 params,
2171 slidesEl
2172 } = swiper;
2173 const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2174 let slideToIndex = swiper.clickedIndex;
2175 let realIndex;
2176 const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
2177 if (params.loop) {
2178 if (swiper.animating) return;
2179 realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
2180 if (params.centeredSlides) {
2181 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
2182 swiper.loopFix();
2183 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2184 nextTick(() => {
2185 swiper.slideTo(slideToIndex);
2186 });
2187 } else {
2188 swiper.slideTo(slideToIndex);
2189 }
2190 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2191 swiper.loopFix();
2192 slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2193 nextTick(() => {
2194 swiper.slideTo(slideToIndex);
2195 });
2196 } else {
2197 swiper.slideTo(slideToIndex);
2198 }
2199 } else {
2200 swiper.slideTo(slideToIndex);
2201 }
2202 }
2203
2204 var slide = {
2205 slideTo,
2206 slideToLoop,
2207 slideNext,
2208 slidePrev,
2209 slideReset,
2210 slideToClosest,
2211 slideToClickedSlide
2212 };
2213
2214 function loopCreate(slideRealIndex) {
2215 const swiper = this;
2216 const {
2217 params,
2218 slidesEl
2219 } = swiper;
2220 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2221 const initSlides = () => {
2222 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
2223 slides.forEach((el, index) => {
2224 el.setAttribute('data-swiper-slide-index', index);
2225 });
2226 };
2227 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2228 const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
2229 const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
2230 const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
2231 const addBlankSlides = amountOfSlides => {
2232 for (let i = 0; i < amountOfSlides; i += 1) {
2233 const slideEl = swiper.isElement ? createElement('swiper-slide', [params.slideBlankClass]) : createElement('div', [params.slideClass, params.slideBlankClass]);
2234 swiper.slidesEl.append(slideEl);
2235 }
2236 };
2237 if (shouldFillGroup) {
2238 if (params.loopAddBlankSlides) {
2239 const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
2240 addBlankSlides(slidesToAdd);
2241 swiper.recalcSlides();
2242 swiper.updateSlides();
2243 } else {
2244 showWarning('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2245 }
2246 initSlides();
2247 } else if (shouldFillGrid) {
2248 if (params.loopAddBlankSlides) {
2249 const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
2250 addBlankSlides(slidesToAdd);
2251 swiper.recalcSlides();
2252 swiper.updateSlides();
2253 } else {
2254 showWarning('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2255 }
2256 initSlides();
2257 } else {
2258 initSlides();
2259 }
2260 swiper.loopFix({
2261 slideRealIndex,
2262 direction: params.centeredSlides ? undefined : 'next'
2263 });
2264 }
2265
2266 function loopFix(_temp) {
2267 let {
2268 slideRealIndex,
2269 slideTo = true,
2270 direction,
2271 setTranslate,
2272 activeSlideIndex,
2273 byController,
2274 byMousewheel
2275 } = _temp === void 0 ? {} : _temp;
2276 const swiper = this;
2277 if (!swiper.params.loop) return;
2278 swiper.emit('beforeLoopFix');
2279 const {
2280 slides,
2281 allowSlidePrev,
2282 allowSlideNext,
2283 slidesEl,
2284 params
2285 } = swiper;
2286 const {
2287 centeredSlides
2288 } = params;
2289 swiper.allowSlidePrev = true;
2290 swiper.allowSlideNext = true;
2291 if (swiper.virtual && params.virtual.enabled) {
2292 if (slideTo) {
2293 if (!params.centeredSlides && swiper.snapIndex === 0) {
2294 swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
2295 } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
2296 swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
2297 } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
2298 swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
2299 }
2300 }
2301 swiper.allowSlidePrev = allowSlidePrev;
2302 swiper.allowSlideNext = allowSlideNext;
2303 swiper.emit('loopFix');
2304 return;
2305 }
2306 let slidesPerView = params.slidesPerView;
2307 if (slidesPerView === 'auto') {
2308 slidesPerView = swiper.slidesPerViewDynamic();
2309 } else {
2310 slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
2311 if (centeredSlides && slidesPerView % 2 === 0) {
2312 slidesPerView = slidesPerView + 1;
2313 }
2314 }
2315 const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
2316 let loopedSlides = slidesPerGroup;
2317 if (loopedSlides % slidesPerGroup !== 0) {
2318 loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
2319 }
2320 loopedSlides += params.loopAdditionalSlides;
2321 swiper.loopedSlides = loopedSlides;
2322 const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2323 if (slides.length < slidesPerView + loopedSlides) {
2324 showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');
2325 } else if (gridEnabled && params.grid.fill === 'row') {
2326 showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');
2327 }
2328 const prependSlidesIndexes = [];
2329 const appendSlidesIndexes = [];
2330 let activeIndex = swiper.activeIndex;
2331 if (typeof activeSlideIndex === 'undefined') {
2332 activeSlideIndex = swiper.getSlideIndex(slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);
2333 } else {
2334 activeIndex = activeSlideIndex;
2335 }
2336 const isNext = direction === 'next' || !direction;
2337 const isPrev = direction === 'prev' || !direction;
2338 let slidesPrepended = 0;
2339 let slidesAppended = 0;
2340 const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
2341 const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
2342 const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);
2343 // prepend last slides before start
2344 if (activeColIndexWithShift < loopedSlides) {
2345 slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
2346 for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
2347 const index = i - Math.floor(i / cols) * cols;
2348 if (gridEnabled) {
2349 const colIndexToPrepend = cols - index - 1;
2350 for (let i = slides.length - 1; i >= 0; i -= 1) {
2351 if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);
2352 }
2353 // slides.forEach((slide, slideIndex) => {
2354 // if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);
2355 // });
2356 } else {
2357 prependSlidesIndexes.push(cols - index - 1);
2358 }
2359 }
2360 } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
2361 slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
2362 for (let i = 0; i < slidesAppended; i += 1) {
2363 const index = i - Math.floor(i / cols) * cols;
2364 if (gridEnabled) {
2365 slides.forEach((slide, slideIndex) => {
2366 if (slide.column === index) appendSlidesIndexes.push(slideIndex);
2367 });
2368 } else {
2369 appendSlidesIndexes.push(index);
2370 }
2371 }
2372 }
2373 swiper.__preventObserver__ = true;
2374 requestAnimationFrame(() => {
2375 swiper.__preventObserver__ = false;
2376 });
2377 if (isPrev) {
2378 prependSlidesIndexes.forEach(index => {
2379 slides[index].swiperLoopMoveDOM = true;
2380 slidesEl.prepend(slides[index]);
2381 slides[index].swiperLoopMoveDOM = false;
2382 });
2383 }
2384 if (isNext) {
2385 appendSlidesIndexes.forEach(index => {
2386 slides[index].swiperLoopMoveDOM = true;
2387 slidesEl.append(slides[index]);
2388 slides[index].swiperLoopMoveDOM = false;
2389 });
2390 }
2391 swiper.recalcSlides();
2392 if (params.slidesPerView === 'auto') {
2393 swiper.updateSlides();
2394 } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
2395 swiper.slides.forEach((slide, slideIndex) => {
2396 swiper.grid.updateSlide(slideIndex, slide, swiper.slides);
2397 });
2398 }
2399 if (params.watchSlidesProgress) {
2400 swiper.updateSlidesOffset();
2401 }
2402 if (slideTo) {
2403 if (prependSlidesIndexes.length > 0 && isPrev) {
2404 if (typeof slideRealIndex === 'undefined') {
2405 const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2406 const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
2407 const diff = newSlideTranslate - currentSlideTranslate;
2408 if (byMousewheel) {
2409 swiper.setTranslate(swiper.translate - diff);
2410 } else {
2411 swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);
2412 if (setTranslate) {
2413 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2414 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2415 }
2416 }
2417 } else {
2418 if (setTranslate) {
2419 const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
2420 swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
2421 swiper.touchEventsData.currentTranslate = swiper.translate;
2422 }
2423 }
2424 } else if (appendSlidesIndexes.length > 0 && isNext) {
2425 if (typeof slideRealIndex === 'undefined') {
2426 const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2427 const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
2428 const diff = newSlideTranslate - currentSlideTranslate;
2429 if (byMousewheel) {
2430 swiper.setTranslate(swiper.translate - diff);
2431 } else {
2432 swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
2433 if (setTranslate) {
2434 swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2435 swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2436 }
2437 }
2438 } else {
2439 const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
2440 swiper.slideTo(swiper.activeIndex - shift, 0, false, true);
2441 }
2442 }
2443 }
2444 swiper.allowSlidePrev = allowSlidePrev;
2445 swiper.allowSlideNext = allowSlideNext;
2446 if (swiper.controller && swiper.controller.control && !byController) {
2447 const loopParams = {
2448 slideRealIndex,
2449 direction,
2450 setTranslate,
2451 activeSlideIndex,
2452 byController: true
2453 };
2454 if (Array.isArray(swiper.controller.control)) {
2455 swiper.controller.control.forEach(c => {
2456 if (!c.destroyed && c.params.loop) c.loopFix({
2457 ...loopParams,
2458 slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false
2459 });
2460 });
2461 } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
2462 swiper.controller.control.loopFix({
2463 ...loopParams,
2464 slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false
2465 });
2466 }
2467 }
2468 swiper.emit('loopFix');
2469 }
2470
2471 function loopDestroy() {
2472 const swiper = this;
2473 const {
2474 params,
2475 slidesEl
2476 } = swiper;
2477 if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2478 swiper.recalcSlides();
2479 const newSlidesOrder = [];
2480 swiper.slides.forEach(slideEl => {
2481 const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
2482 newSlidesOrder[index] = slideEl;
2483 });
2484 swiper.slides.forEach(slideEl => {
2485 slideEl.removeAttribute('data-swiper-slide-index');
2486 });
2487 newSlidesOrder.forEach(slideEl => {
2488 slidesEl.append(slideEl);
2489 });
2490 swiper.recalcSlides();
2491 swiper.slideTo(swiper.realIndex, 0);
2492 }
2493
2494 var loop = {
2495 loopCreate,
2496 loopFix,
2497 loopDestroy
2498 };
2499
2500 function setGrabCursor(moving) {
2501 const swiper = this;
2502 if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
2503 const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
2504 if (swiper.isElement) {
2505 swiper.__preventObserver__ = true;
2506 }
2507 el.style.cursor = 'move';
2508 el.style.cursor = moving ? 'grabbing' : 'grab';
2509 if (swiper.isElement) {
2510 requestAnimationFrame(() => {
2511 swiper.__preventObserver__ = false;
2512 });
2513 }
2514 }
2515
2516 function unsetGrabCursor() {
2517 const swiper = this;
2518 if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
2519 return;
2520 }
2521 if (swiper.isElement) {
2522 swiper.__preventObserver__ = true;
2523 }
2524 swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
2525 if (swiper.isElement) {
2526 requestAnimationFrame(() => {
2527 swiper.__preventObserver__ = false;
2528 });
2529 }
2530 }
2531
2532 var grabCursor = {
2533 setGrabCursor,
2534 unsetGrabCursor
2535 };
2536
2537 // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
2538 function closestElement(selector, base) {
2539 if (base === void 0) {
2540 base = this;
2541 }
2542 function __closestFrom(el) {
2543 if (!el || el === getDocument() || el === getWindow()) return null;
2544 if (el.assignedSlot) el = el.assignedSlot;
2545 const found = el.closest(selector);
2546 if (!found && !el.getRootNode) {
2547 return null;
2548 }
2549 return found || __closestFrom(el.getRootNode().host);
2550 }
2551 return __closestFrom(base);
2552 }
2553 function preventEdgeSwipe(swiper, event, startX) {
2554 const window = getWindow();
2555 const {
2556 params
2557 } = swiper;
2558 const edgeSwipeDetection = params.edgeSwipeDetection;
2559 const edgeSwipeThreshold = params.edgeSwipeThreshold;
2560 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
2561 if (edgeSwipeDetection === 'prevent') {
2562 event.preventDefault();
2563 return true;
2564 }
2565 return false;
2566 }
2567 return true;
2568 }
2569 function onTouchStart(event) {
2570 const swiper = this;
2571 const document = getDocument();
2572 let e = event;
2573 if (e.originalEvent) e = e.originalEvent;
2574 const data = swiper.touchEventsData;
2575 if (e.type === 'pointerdown') {
2576 if (data.pointerId !== null && data.pointerId !== e.pointerId) {
2577 return;
2578 }
2579 data.pointerId = e.pointerId;
2580 } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {
2581 data.touchId = e.targetTouches[0].identifier;
2582 }
2583 if (e.type === 'touchstart') {
2584 // don't proceed touch event
2585 preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
2586 return;
2587 }
2588 const {
2589 params,
2590 touches,
2591 enabled
2592 } = swiper;
2593 if (!enabled) return;
2594 if (!params.simulateTouch && e.pointerType === 'mouse') return;
2595 if (swiper.animating && params.preventInteractionOnTransition) {
2596 return;
2597 }
2598 if (!swiper.animating && params.cssMode && params.loop) {
2599 swiper.loopFix();
2600 }
2601 let targetEl = e.target;
2602 if (params.touchEventsTarget === 'wrapper') {
2603 if (!swiper.wrapperEl.contains(targetEl)) return;
2604 }
2605 if ('which' in e && e.which === 3) return;
2606 if ('button' in e && e.button > 0) return;
2607 if (data.isTouched && data.isMoved) return;
2608
2609 // change target el for shadow root component
2610 const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
2611 // eslint-disable-next-line
2612 const eventPath = e.composedPath ? e.composedPath() : e.path;
2613 if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
2614 targetEl = eventPath[0];
2615 }
2616 const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
2617 const isTargetShadow = !!(e.target && e.target.shadowRoot);
2618
2619 // use closestElement for shadow root element to get the actual closest for nested shadow root element
2620 if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
2621 swiper.allowClick = true;
2622 return;
2623 }
2624 if (params.swipeHandler) {
2625 if (!targetEl.closest(params.swipeHandler)) return;
2626 }
2627 touches.currentX = e.pageX;
2628 touches.currentY = e.pageY;
2629 const startX = touches.currentX;
2630 const startY = touches.currentY;
2631
2632 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
2633
2634 if (!preventEdgeSwipe(swiper, e, startX)) {
2635 return;
2636 }
2637 Object.assign(data, {
2638 isTouched: true,
2639 isMoved: false,
2640 allowTouchCallbacks: true,
2641 isScrolling: undefined,
2642 startMoving: undefined
2643 });
2644 touches.startX = startX;
2645 touches.startY = startY;
2646 data.touchStartTime = now();
2647 swiper.allowClick = true;
2648 swiper.updateSize();
2649 swiper.swipeDirection = undefined;
2650 if (params.threshold > 0) data.allowThresholdMove = false;
2651 let preventDefault = true;
2652 if (targetEl.matches(data.focusableElements)) {
2653 preventDefault = false;
2654 if (targetEl.nodeName === 'SELECT') {
2655 data.isTouched = false;
2656 }
2657 }
2658 if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl) {
2659 document.activeElement.blur();
2660 }
2661 const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2662 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
2663 e.preventDefault();
2664 }
2665 if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
2666 swiper.freeMode.onTouchStart();
2667 }
2668 swiper.emit('touchStart', e);
2669 }
2670
2671 function onTouchMove(event) {
2672 const document = getDocument();
2673 const swiper = this;
2674 const data = swiper.touchEventsData;
2675 const {
2676 params,
2677 touches,
2678 rtlTranslate: rtl,
2679 enabled
2680 } = swiper;
2681 if (!enabled) return;
2682 if (!params.simulateTouch && event.pointerType === 'mouse') return;
2683 let e = event;
2684 if (e.originalEvent) e = e.originalEvent;
2685 if (e.type === 'pointermove') {
2686 if (data.touchId !== null) return; // return from pointer if we use touch
2687 const id = e.pointerId;
2688 if (id !== data.pointerId) return;
2689 }
2690 let targetTouch;
2691 if (e.type === 'touchmove') {
2692 targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];
2693 if (!targetTouch || targetTouch.identifier !== data.touchId) return;
2694 } else {
2695 targetTouch = e;
2696 }
2697 if (!data.isTouched) {
2698 if (data.startMoving && data.isScrolling) {
2699 swiper.emit('touchMoveOpposite', e);
2700 }
2701 return;
2702 }
2703 const pageX = targetTouch.pageX;
2704 const pageY = targetTouch.pageY;
2705 if (e.preventedByNestedSwiper) {
2706 touches.startX = pageX;
2707 touches.startY = pageY;
2708 return;
2709 }
2710 if (!swiper.allowTouchMove) {
2711 if (!e.target.matches(data.focusableElements)) {
2712 swiper.allowClick = false;
2713 }
2714 if (data.isTouched) {
2715 Object.assign(touches, {
2716 startX: pageX,
2717 startY: pageY,
2718 currentX: pageX,
2719 currentY: pageY
2720 });
2721 data.touchStartTime = now();
2722 }
2723 return;
2724 }
2725 if (params.touchReleaseOnEdges && !params.loop) {
2726 if (swiper.isVertical()) {
2727 // Vertical
2728 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
2729 data.isTouched = false;
2730 data.isMoved = false;
2731 return;
2732 }
2733 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
2734 return;
2735 }
2736 }
2737 if (document.activeElement) {
2738 if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
2739 data.isMoved = true;
2740 swiper.allowClick = false;
2741 return;
2742 }
2743 }
2744 if (data.allowTouchCallbacks) {
2745 swiper.emit('touchMove', e);
2746 }
2747 touches.previousX = touches.currentX;
2748 touches.previousY = touches.currentY;
2749 touches.currentX = pageX;
2750 touches.currentY = pageY;
2751 const diffX = touches.currentX - touches.startX;
2752 const diffY = touches.currentY - touches.startY;
2753 if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
2754 if (typeof data.isScrolling === 'undefined') {
2755 let touchAngle;
2756 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
2757 data.isScrolling = false;
2758 } else {
2759 // eslint-disable-next-line
2760 if (diffX * diffX + diffY * diffY >= 25) {
2761 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
2762 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
2763 }
2764 }
2765 }
2766 if (data.isScrolling) {
2767 swiper.emit('touchMoveOpposite', e);
2768 }
2769 if (typeof data.startMoving === 'undefined') {
2770 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2771 data.startMoving = true;
2772 }
2773 }
2774 if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) {
2775 data.isTouched = false;
2776 return;
2777 }
2778 if (!data.startMoving) {
2779 return;
2780 }
2781 swiper.allowClick = false;
2782 if (!params.cssMode && e.cancelable) {
2783 e.preventDefault();
2784 }
2785 if (params.touchMoveStopPropagation && !params.nested) {
2786 e.stopPropagation();
2787 }
2788 let diff = swiper.isHorizontal() ? diffX : diffY;
2789 let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
2790 if (params.oneWayMovement) {
2791 diff = Math.abs(diff) * (rtl ? 1 : -1);
2792 touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
2793 }
2794 touches.diff = diff;
2795 diff *= params.touchRatio;
2796 if (rtl) {
2797 diff = -diff;
2798 touchesDiff = -touchesDiff;
2799 }
2800 const prevTouchesDirection = swiper.touchesDirection;
2801 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
2802 swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
2803 const isLoop = swiper.params.loop && !params.cssMode;
2804 const allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;
2805 if (!data.isMoved) {
2806 if (isLoop && allowLoopFix) {
2807 swiper.loopFix({
2808 direction: swiper.swipeDirection
2809 });
2810 }
2811 data.startTranslate = swiper.getTranslate();
2812 swiper.setTransition(0);
2813 if (swiper.animating) {
2814 const evt = new window.CustomEvent('transitionend', {
2815 bubbles: true,
2816 cancelable: true,
2817 detail: {
2818 bySwiperTouchMove: true
2819 }
2820 });
2821 swiper.wrapperEl.dispatchEvent(evt);
2822 }
2823 data.allowMomentumBounce = false;
2824 // Grab Cursor
2825 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2826 swiper.setGrabCursor(true);
2827 }
2828 swiper.emit('sliderFirstMove', e);
2829 }
2830 let loopFixed;
2831 new Date().getTime();
2832 if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
2833 Object.assign(touches, {
2834 startX: pageX,
2835 startY: pageY,
2836 currentX: pageX,
2837 currentY: pageY,
2838 startTranslate: data.currentTranslate
2839 });
2840 data.loopSwapReset = true;
2841 data.startTranslate = data.currentTranslate;
2842 return;
2843 }
2844 swiper.emit('sliderMove', e);
2845 data.isMoved = true;
2846 data.currentTranslate = diff + data.startTranslate;
2847 let disableParentSwiper = true;
2848 let resistanceRatio = params.resistanceRatio;
2849 if (params.touchReleaseOnEdges) {
2850 resistanceRatio = 0;
2851 }
2852 if (diff > 0) {
2853 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] : swiper.minTranslate())) {
2854 swiper.loopFix({
2855 direction: 'prev',
2856 setTranslate: true,
2857 activeSlideIndex: 0
2858 });
2859 }
2860 if (data.currentTranslate > swiper.minTranslate()) {
2861 disableParentSwiper = false;
2862 if (params.resistance) {
2863 data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
2864 }
2865 }
2866 } else if (diff < 0) {
2867 if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] : swiper.maxTranslate())) {
2868 swiper.loopFix({
2869 direction: 'next',
2870 setTranslate: true,
2871 activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
2872 });
2873 }
2874 if (data.currentTranslate < swiper.maxTranslate()) {
2875 disableParentSwiper = false;
2876 if (params.resistance) {
2877 data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
2878 }
2879 }
2880 }
2881 if (disableParentSwiper) {
2882 e.preventedByNestedSwiper = true;
2883 }
2884
2885 // Directions locks
2886 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
2887 data.currentTranslate = data.startTranslate;
2888 }
2889 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
2890 data.currentTranslate = data.startTranslate;
2891 }
2892 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
2893 data.currentTranslate = data.startTranslate;
2894 }
2895
2896 // Threshold
2897 if (params.threshold > 0) {
2898 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2899 if (!data.allowThresholdMove) {
2900 data.allowThresholdMove = true;
2901 touches.startX = touches.currentX;
2902 touches.startY = touches.currentY;
2903 data.currentTranslate = data.startTranslate;
2904 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2905 return;
2906 }
2907 } else {
2908 data.currentTranslate = data.startTranslate;
2909 return;
2910 }
2911 }
2912 if (!params.followFinger || params.cssMode) return;
2913
2914 // Update active index in free mode
2915 if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
2916 swiper.updateActiveIndex();
2917 swiper.updateSlidesClasses();
2918 }
2919 if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
2920 swiper.freeMode.onTouchMove();
2921 }
2922 // Update progress
2923 swiper.updateProgress(data.currentTranslate);
2924 // Update translate
2925 swiper.setTranslate(data.currentTranslate);
2926 }
2927
2928 function onTouchEnd(event) {
2929 const swiper = this;
2930 const data = swiper.touchEventsData;
2931 let e = event;
2932 if (e.originalEvent) e = e.originalEvent;
2933 let targetTouch;
2934 const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';
2935 if (!isTouchEvent) {
2936 if (data.touchId !== null) return; // return from pointer if we use touch
2937 if (e.pointerId !== data.pointerId) return;
2938 targetTouch = e;
2939 } else {
2940 targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];
2941 if (!targetTouch || targetTouch.identifier !== data.touchId) return;
2942 }
2943 if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {
2944 const proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
2945 if (!proceed) {
2946 return;
2947 }
2948 }
2949 data.pointerId = null;
2950 data.touchId = null;
2951 const {
2952 params,
2953 touches,
2954 rtlTranslate: rtl,
2955 slidesGrid,
2956 enabled
2957 } = swiper;
2958 if (!enabled) return;
2959 if (!params.simulateTouch && e.pointerType === 'mouse') return;
2960 if (data.allowTouchCallbacks) {
2961 swiper.emit('touchEnd', e);
2962 }
2963 data.allowTouchCallbacks = false;
2964 if (!data.isTouched) {
2965 if (data.isMoved && params.grabCursor) {
2966 swiper.setGrabCursor(false);
2967 }
2968 data.isMoved = false;
2969 data.startMoving = false;
2970 return;
2971 }
2972
2973 // Return Grab Cursor
2974 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2975 swiper.setGrabCursor(false);
2976 }
2977
2978 // Time diff
2979 const touchEndTime = now();
2980 const timeDiff = touchEndTime - data.touchStartTime;
2981
2982 // Tap, doubleTap, Click
2983 if (swiper.allowClick) {
2984 const pathTree = e.path || e.composedPath && e.composedPath();
2985 swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
2986 swiper.emit('tap click', e);
2987 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
2988 swiper.emit('doubleTap doubleClick', e);
2989 }
2990 }
2991 data.lastClickTime = now();
2992 nextTick(() => {
2993 if (!swiper.destroyed) swiper.allowClick = true;
2994 });
2995 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
2996 data.isTouched = false;
2997 data.isMoved = false;
2998 data.startMoving = false;
2999 return;
3000 }
3001 data.isTouched = false;
3002 data.isMoved = false;
3003 data.startMoving = false;
3004 let currentPos;
3005 if (params.followFinger) {
3006 currentPos = rtl ? swiper.translate : -swiper.translate;
3007 } else {
3008 currentPos = -data.currentTranslate;
3009 }
3010 if (params.cssMode) {
3011 return;
3012 }
3013 if (params.freeMode && params.freeMode.enabled) {
3014 swiper.freeMode.onTouchEnd({
3015 currentPos
3016 });
3017 return;
3018 }
3019
3020 // Find current slide
3021 const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
3022 let stopIndex = 0;
3023 let groupSize = swiper.slidesSizesGrid[0];
3024 for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
3025 const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3026 if (typeof slidesGrid[i + increment] !== 'undefined') {
3027 if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
3028 stopIndex = i;
3029 groupSize = slidesGrid[i + increment] - slidesGrid[i];
3030 }
3031 } else if (swipeToLast || currentPos >= slidesGrid[i]) {
3032 stopIndex = i;
3033 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3034 }
3035 }
3036 let rewindFirstIndex = null;
3037 let rewindLastIndex = null;
3038 if (params.rewind) {
3039 if (swiper.isBeginning) {
3040 rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
3041 } else if (swiper.isEnd) {
3042 rewindFirstIndex = 0;
3043 }
3044 }
3045 // Find current slide size
3046 const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3047 const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3048 if (timeDiff > params.longSwipesMs) {
3049 // Long touches
3050 if (!params.longSwipes) {
3051 swiper.slideTo(swiper.activeIndex);
3052 return;
3053 }
3054 if (swiper.swipeDirection === 'next') {
3055 if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
3056 }
3057 if (swiper.swipeDirection === 'prev') {
3058 if (ratio > 1 - params.longSwipesRatio) {
3059 swiper.slideTo(stopIndex + increment);
3060 } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
3061 swiper.slideTo(rewindLastIndex);
3062 } else {
3063 swiper.slideTo(stopIndex);
3064 }
3065 }
3066 } else {
3067 // Short swipes
3068 if (!params.shortSwipes) {
3069 swiper.slideTo(swiper.activeIndex);
3070 return;
3071 }
3072 const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
3073 if (!isNavButtonTarget) {
3074 if (swiper.swipeDirection === 'next') {
3075 swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
3076 }
3077 if (swiper.swipeDirection === 'prev') {
3078 swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
3079 }
3080 } else if (e.target === swiper.navigation.nextEl) {
3081 swiper.slideTo(stopIndex + increment);
3082 } else {
3083 swiper.slideTo(stopIndex);
3084 }
3085 }
3086 }
3087
3088 function onResize() {
3089 const swiper = this;
3090 const {
3091 params,
3092 el
3093 } = swiper;
3094 if (el && el.offsetWidth === 0) return;
3095
3096 // Breakpoints
3097 if (params.breakpoints) {
3098 swiper.setBreakpoint();
3099 }
3100
3101 // Save locks
3102 const {
3103 allowSlideNext,
3104 allowSlidePrev,
3105 snapGrid
3106 } = swiper;
3107 const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
3108
3109 // Disable locks on resize
3110 swiper.allowSlideNext = true;
3111 swiper.allowSlidePrev = true;
3112 swiper.updateSize();
3113 swiper.updateSlides();
3114 swiper.updateSlidesClasses();
3115 const isVirtualLoop = isVirtual && params.loop;
3116 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
3117 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3118 } else {
3119 if (swiper.params.loop && !isVirtual) {
3120 swiper.slideToLoop(swiper.realIndex, 0, false, true);
3121 } else {
3122 swiper.slideTo(swiper.activeIndex, 0, false, true);
3123 }
3124 }
3125 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3126 clearTimeout(swiper.autoplay.resizeTimeout);
3127 swiper.autoplay.resizeTimeout = setTimeout(() => {
3128 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3129 swiper.autoplay.resume();
3130 }
3131 }, 500);
3132 }
3133 // Return locks after resize
3134 swiper.allowSlidePrev = allowSlidePrev;
3135 swiper.allowSlideNext = allowSlideNext;
3136 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3137 swiper.checkOverflow();
3138 }
3139 }
3140
3141 function onClick(e) {
3142 const swiper = this;
3143 if (!swiper.enabled) return;
3144 if (!swiper.allowClick) {
3145 if (swiper.params.preventClicks) e.preventDefault();
3146 if (swiper.params.preventClicksPropagation && swiper.animating) {
3147 e.stopPropagation();
3148 e.stopImmediatePropagation();
3149 }
3150 }
3151 }
3152
3153 function onScroll() {
3154 const swiper = this;
3155 const {
3156 wrapperEl,
3157 rtlTranslate,
3158 enabled
3159 } = swiper;
3160 if (!enabled) return;
3161 swiper.previousTranslate = swiper.translate;
3162 if (swiper.isHorizontal()) {
3163 swiper.translate = -wrapperEl.scrollLeft;
3164 } else {
3165 swiper.translate = -wrapperEl.scrollTop;
3166 }
3167 // eslint-disable-next-line
3168 if (swiper.translate === 0) swiper.translate = 0;
3169 swiper.updateActiveIndex();
3170 swiper.updateSlidesClasses();
3171 let newProgress;
3172 const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
3173 if (translatesDiff === 0) {
3174 newProgress = 0;
3175 } else {
3176 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
3177 }
3178 if (newProgress !== swiper.progress) {
3179 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
3180 }
3181 swiper.emit('setTranslate', swiper.translate, false);
3182 }
3183
3184 function onLoad(e) {
3185 const swiper = this;
3186 processLazyPreloader(swiper, e.target);
3187 if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
3188 return;
3189 }
3190 swiper.update();
3191 }
3192
3193 function onDocumentTouchStart() {
3194 const swiper = this;
3195 if (swiper.documentTouchHandlerProceeded) return;
3196 swiper.documentTouchHandlerProceeded = true;
3197 if (swiper.params.touchReleaseOnEdges) {
3198 swiper.el.style.touchAction = 'auto';
3199 }
3200 }
3201
3202 const events = (swiper, method) => {
3203 const document = getDocument();
3204 const {
3205 params,
3206 el,
3207 wrapperEl,
3208 device
3209 } = swiper;
3210 const capture = !!params.nested;
3211 const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
3212 const swiperMethod = method;
3213 if (!el || typeof el === 'string') return;
3214
3215 // Touch Events
3216 document[domMethod]('touchstart', swiper.onDocumentTouchStart, {
3217 passive: false,
3218 capture
3219 });
3220 el[domMethod]('touchstart', swiper.onTouchStart, {
3221 passive: false
3222 });
3223 el[domMethod]('pointerdown', swiper.onTouchStart, {
3224 passive: false
3225 });
3226 document[domMethod]('touchmove', swiper.onTouchMove, {
3227 passive: false,
3228 capture
3229 });
3230 document[domMethod]('pointermove', swiper.onTouchMove, {
3231 passive: false,
3232 capture
3233 });
3234 document[domMethod]('touchend', swiper.onTouchEnd, {
3235 passive: true
3236 });
3237 document[domMethod]('pointerup', swiper.onTouchEnd, {
3238 passive: true
3239 });
3240 document[domMethod]('pointercancel', swiper.onTouchEnd, {
3241 passive: true
3242 });
3243 document[domMethod]('touchcancel', swiper.onTouchEnd, {
3244 passive: true
3245 });
3246 document[domMethod]('pointerout', swiper.onTouchEnd, {
3247 passive: true
3248 });
3249 document[domMethod]('pointerleave', swiper.onTouchEnd, {
3250 passive: true
3251 });
3252 document[domMethod]('contextmenu', swiper.onTouchEnd, {
3253 passive: true
3254 });
3255
3256 // Prevent Links Clicks
3257 if (params.preventClicks || params.preventClicksPropagation) {
3258 el[domMethod]('click', swiper.onClick, true);
3259 }
3260 if (params.cssMode) {
3261 wrapperEl[domMethod]('scroll', swiper.onScroll);
3262 }
3263
3264 // Resize handler
3265 if (params.updateOnWindowResize) {
3266 swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
3267 } else {
3268 swiper[swiperMethod]('observerUpdate', onResize, true);
3269 }
3270
3271 // Images loader
3272 el[domMethod]('load', swiper.onLoad, {
3273 capture: true
3274 });
3275 };
3276 function attachEvents() {
3277 const swiper = this;
3278 const {
3279 params
3280 } = swiper;
3281 swiper.onTouchStart = onTouchStart.bind(swiper);
3282 swiper.onTouchMove = onTouchMove.bind(swiper);
3283 swiper.onTouchEnd = onTouchEnd.bind(swiper);
3284 swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
3285 if (params.cssMode) {
3286 swiper.onScroll = onScroll.bind(swiper);
3287 }
3288 swiper.onClick = onClick.bind(swiper);
3289 swiper.onLoad = onLoad.bind(swiper);
3290 events(swiper, 'on');
3291 }
3292 function detachEvents() {
3293 const swiper = this;
3294 events(swiper, 'off');
3295 }
3296 var events$1 = {
3297 attachEvents,
3298 detachEvents
3299 };
3300
3301 const isGridEnabled = (swiper, params) => {
3302 return swiper.grid && params.grid && params.grid.rows > 1;
3303 };
3304 function setBreakpoint() {
3305 const swiper = this;
3306 const {
3307 realIndex,
3308 initialized,
3309 params,
3310 el
3311 } = swiper;
3312 const breakpoints = params.breakpoints;
3313 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
3314
3315 // Get breakpoint for window width and update parameters
3316 const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
3317 if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
3318 const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3319 const breakpointParams = breakpointOnlyParams || swiper.originalParams;
3320 const wasMultiRow = isGridEnabled(swiper, params);
3321 const isMultiRow = isGridEnabled(swiper, breakpointParams);
3322 const wasGrabCursor = swiper.params.grabCursor;
3323 const isGrabCursor = breakpointParams.grabCursor;
3324 const wasEnabled = params.enabled;
3325 if (wasMultiRow && !isMultiRow) {
3326 el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
3327 swiper.emitContainerClasses();
3328 } else if (!wasMultiRow && isMultiRow) {
3329 el.classList.add(`${params.containerModifierClass}grid`);
3330 if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
3331 el.classList.add(`${params.containerModifierClass}grid-column`);
3332 }
3333 swiper.emitContainerClasses();
3334 }
3335 if (wasGrabCursor && !isGrabCursor) {
3336 swiper.unsetGrabCursor();
3337 } else if (!wasGrabCursor && isGrabCursor) {
3338 swiper.setGrabCursor();
3339 }
3340
3341 // Toggle navigation, pagination, scrollbar
3342 ['navigation', 'pagination', 'scrollbar'].forEach(prop => {
3343 if (typeof breakpointParams[prop] === 'undefined') return;
3344 const wasModuleEnabled = params[prop] && params[prop].enabled;
3345 const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
3346 if (wasModuleEnabled && !isModuleEnabled) {
3347 swiper[prop].disable();
3348 }
3349 if (!wasModuleEnabled && isModuleEnabled) {
3350 swiper[prop].enable();
3351 }
3352 });
3353 const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3354 const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3355 const wasLoop = params.loop;
3356 if (directionChanged && initialized) {
3357 swiper.changeDirection();
3358 }
3359 extend(swiper.params, breakpointParams);
3360 const isEnabled = swiper.params.enabled;
3361 const hasLoop = swiper.params.loop;
3362 Object.assign(swiper, {
3363 allowTouchMove: swiper.params.allowTouchMove,
3364 allowSlideNext: swiper.params.allowSlideNext,
3365 allowSlidePrev: swiper.params.allowSlidePrev
3366 });
3367 if (wasEnabled && !isEnabled) {
3368 swiper.disable();
3369 } else if (!wasEnabled && isEnabled) {
3370 swiper.enable();
3371 }
3372 swiper.currentBreakpoint = breakpoint;
3373 swiper.emit('_beforeBreakpoint', breakpointParams);
3374 if (initialized) {
3375 if (needsReLoop) {
3376 swiper.loopDestroy();
3377 swiper.loopCreate(realIndex);
3378 swiper.updateSlides();
3379 } else if (!wasLoop && hasLoop) {
3380 swiper.loopCreate(realIndex);
3381 swiper.updateSlides();
3382 } else if (wasLoop && !hasLoop) {
3383 swiper.loopDestroy();
3384 }
3385 }
3386 swiper.emit('breakpoint', breakpointParams);
3387 }
3388
3389 function getBreakpoint(breakpoints, base, containerEl) {
3390 if (base === void 0) {
3391 base = 'window';
3392 }
3393 if (!breakpoints || base === 'container' && !containerEl) return undefined;
3394 let breakpoint = false;
3395 const window = getWindow();
3396 const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
3397 const points = Object.keys(breakpoints).map(point => {
3398 if (typeof point === 'string' && point.indexOf('@') === 0) {
3399 const minRatio = parseFloat(point.substr(1));
3400 const value = currentHeight * minRatio;
3401 return {
3402 value,
3403 point
3404 };
3405 }
3406 return {
3407 value: point,
3408 point
3409 };
3410 });
3411 points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
3412 for (let i = 0; i < points.length; i += 1) {
3413 const {
3414 point,
3415 value
3416 } = points[i];
3417 if (base === 'window') {
3418 if (window.matchMedia(`(min-width: ${value}px)`).matches) {
3419 breakpoint = point;
3420 }
3421 } else if (value <= containerEl.clientWidth) {
3422 breakpoint = point;
3423 }
3424 }
3425 return breakpoint || 'max';
3426 }
3427
3428 var breakpoints = {
3429 setBreakpoint,
3430 getBreakpoint
3431 };
3432
3433 function prepareClasses(entries, prefix) {
3434 const resultClasses = [];
3435 entries.forEach(item => {
3436 if (typeof item === 'object') {
3437 Object.keys(item).forEach(classNames => {
3438 if (item[classNames]) {
3439 resultClasses.push(prefix + classNames);
3440 }
3441 });
3442 } else if (typeof item === 'string') {
3443 resultClasses.push(prefix + item);
3444 }
3445 });
3446 return resultClasses;
3447 }
3448 function addClasses() {
3449 const swiper = this;
3450 const {
3451 classNames,
3452 params,
3453 rtl,
3454 el,
3455 device
3456 } = swiper;
3457 // prettier-ignore
3458 const suffixes = prepareClasses(['initialized', params.direction, {
3459 'free-mode': swiper.params.freeMode && params.freeMode.enabled
3460 }, {
3461 'autoheight': params.autoHeight
3462 }, {
3463 'rtl': rtl
3464 }, {
3465 'grid': params.grid && params.grid.rows > 1
3466 }, {
3467 'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
3468 }, {
3469 'android': device.android
3470 }, {
3471 'ios': device.ios
3472 }, {
3473 'css-mode': params.cssMode
3474 }, {
3475 'centered': params.cssMode && params.centeredSlides
3476 }, {
3477 'watch-progress': params.watchSlidesProgress
3478 }], params.containerModifierClass);
3479 classNames.push(...suffixes);
3480 el.classList.add(...classNames);
3481 swiper.emitContainerClasses();
3482 }
3483
3484 function removeClasses() {
3485 const swiper = this;
3486 const {
3487 el,
3488 classNames
3489 } = swiper;
3490 if (!el || typeof el === 'string') return;
3491 el.classList.remove(...classNames);
3492 swiper.emitContainerClasses();
3493 }
3494
3495 var classes = {
3496 addClasses,
3497 removeClasses
3498 };
3499
3500 function checkOverflow() {
3501 const swiper = this;
3502 const {
3503 isLocked: wasLocked,
3504 params
3505 } = swiper;
3506 const {
3507 slidesOffsetBefore
3508 } = params;
3509 if (slidesOffsetBefore) {
3510 const lastSlideIndex = swiper.slides.length - 1;
3511 const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
3512 swiper.isLocked = swiper.size > lastSlideRightEdge;
3513 } else {
3514 swiper.isLocked = swiper.snapGrid.length === 1;
3515 }
3516 if (params.allowSlideNext === true) {
3517 swiper.allowSlideNext = !swiper.isLocked;
3518 }
3519 if (params.allowSlidePrev === true) {
3520 swiper.allowSlidePrev = !swiper.isLocked;
3521 }
3522 if (wasLocked && wasLocked !== swiper.isLocked) {
3523 swiper.isEnd = false;
3524 }
3525 if (wasLocked !== swiper.isLocked) {
3526 swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
3527 }
3528 }
3529 var checkOverflow$1 = {
3530 checkOverflow
3531 };
3532
3533 var defaults = {
3534 init: true,
3535 direction: 'horizontal',
3536 oneWayMovement: false,
3537 swiperElementNodeName: 'SWIPER-CONTAINER',
3538 touchEventsTarget: 'wrapper',
3539 initialSlide: 0,
3540 speed: 300,
3541 cssMode: false,
3542 updateOnWindowResize: true,
3543 resizeObserver: true,
3544 nested: false,
3545 createElements: false,
3546 eventsPrefix: 'swiper',
3547 enabled: true,
3548 focusableElements: 'input, select, option, textarea, button, video, label',
3549 // Overrides
3550 width: null,
3551 height: null,
3552 //
3553 preventInteractionOnTransition: false,
3554 // ssr
3555 userAgent: null,
3556 url: null,
3557 // To support iOS's swipe-to-go-back gesture (when being used in-app).
3558 edgeSwipeDetection: false,
3559 edgeSwipeThreshold: 20,
3560 // Autoheight
3561 autoHeight: false,
3562 // Set wrapper width
3563 setWrapperSize: false,
3564 // Virtual Translate
3565 virtualTranslate: false,
3566 // Effects
3567 effect: 'slide',
3568 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3569
3570 // Breakpoints
3571 breakpoints: undefined,
3572 breakpointsBase: 'window',
3573 // Slides grid
3574 spaceBetween: 0,
3575 slidesPerView: 1,
3576 slidesPerGroup: 1,
3577 slidesPerGroupSkip: 0,
3578 slidesPerGroupAuto: false,
3579 centeredSlides: false,
3580 centeredSlidesBounds: false,
3581 slidesOffsetBefore: 0,
3582 // in px
3583 slidesOffsetAfter: 0,
3584 // in px
3585 normalizeSlideIndex: true,
3586 centerInsufficientSlides: false,
3587 // Disable swiper and hide navigation when container not overflow
3588 watchOverflow: true,
3589 // Round length
3590 roundLengths: false,
3591 // Touches
3592 touchRatio: 1,
3593 touchAngle: 45,
3594 simulateTouch: true,
3595 shortSwipes: true,
3596 longSwipes: true,
3597 longSwipesRatio: 0.5,
3598 longSwipesMs: 300,
3599 followFinger: true,
3600 allowTouchMove: true,
3601 threshold: 5,
3602 touchMoveStopPropagation: false,
3603 touchStartPreventDefault: true,
3604 touchStartForcePreventDefault: false,
3605 touchReleaseOnEdges: false,
3606 // Unique Navigation Elements
3607 uniqueNavElements: true,
3608 // Resistance
3609 resistance: true,
3610 resistanceRatio: 0.85,
3611 // Progress
3612 watchSlidesProgress: false,
3613 // Cursor
3614 grabCursor: false,
3615 // Clicks
3616 preventClicks: true,
3617 preventClicksPropagation: true,
3618 slideToClickedSlide: false,
3619 // loop
3620 loop: false,
3621 loopAddBlankSlides: true,
3622 loopAdditionalSlides: 0,
3623 loopPreventsSliding: true,
3624 // rewind
3625 rewind: false,
3626 // Swiping/no swiping
3627 allowSlidePrev: true,
3628 allowSlideNext: true,
3629 swipeHandler: null,
3630 // '.swipe-handler',
3631 noSwiping: true,
3632 noSwipingClass: 'swiper-no-swiping',
3633 noSwipingSelector: null,
3634 // Passive Listeners
3635 passiveListeners: true,
3636 maxBackfaceHiddenSlides: 10,
3637 // NS
3638 containerModifierClass: 'swiper-',
3639 // NEW
3640 slideClass: 'swiper-slide',
3641 slideBlankClass: 'swiper-slide-blank',
3642 slideActiveClass: 'swiper-slide-active',
3643 slideVisibleClass: 'swiper-slide-visible',
3644 slideFullyVisibleClass: 'swiper-slide-fully-visible',
3645 slideNextClass: 'swiper-slide-next',
3646 slidePrevClass: 'swiper-slide-prev',
3647 wrapperClass: 'swiper-wrapper',
3648 lazyPreloaderClass: 'swiper-lazy-preloader',
3649 lazyPreloadPrevNext: 0,
3650 // Callbacks
3651 runCallbacksOnInit: true,
3652 // Internals
3653 _emitClasses: false
3654 };
3655
3656 function moduleExtendParams(params, allModulesParams) {
3657 return function extendParams(obj) {
3658 if (obj === void 0) {
3659 obj = {};
3660 }
3661 const moduleParamName = Object.keys(obj)[0];
3662 const moduleParams = obj[moduleParamName];
3663 if (typeof moduleParams !== 'object' || moduleParams === null) {
3664 extend(allModulesParams, obj);
3665 return;
3666 }
3667 if (params[moduleParamName] === true) {
3668 params[moduleParamName] = {
3669 enabled: true
3670 };
3671 }
3672 if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
3673 params[moduleParamName].auto = true;
3674 }
3675 if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
3676 params[moduleParamName].auto = true;
3677 }
3678 if (!(moduleParamName in params && 'enabled' in moduleParams)) {
3679 extend(allModulesParams, obj);
3680 return;
3681 }
3682 if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
3683 params[moduleParamName].enabled = true;
3684 }
3685 if (!params[moduleParamName]) params[moduleParamName] = {
3686 enabled: false
3687 };
3688 extend(allModulesParams, obj);
3689 };
3690 }
3691
3692 /* eslint no-param-reassign: "off" */
3693 const prototypes = {
3694 eventsEmitter,
3695 update,
3696 translate,
3697 transition,
3698 slide,
3699 loop,
3700 grabCursor,
3701 events: events$1,
3702 breakpoints,
3703 checkOverflow: checkOverflow$1,
3704 classes
3705 };
3706 const extendedDefaults = {};
3707 class Swiper {
3708 constructor() {
3709 let el;
3710 let params;
3711 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3712 args[_key] = arguments[_key];
3713 }
3714 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
3715 params = args[0];
3716 } else {
3717 [el, params] = args;
3718 }
3719 if (!params) params = {};
3720 params = extend({}, params);
3721 if (el && !params.el) params.el = el;
3722 const document = getDocument();
3723 if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
3724 const swipers = [];
3725 document.querySelectorAll(params.el).forEach(containerEl => {
3726 const newParams = extend({}, params, {
3727 el: containerEl
3728 });
3729 swipers.push(new Swiper(newParams));
3730 });
3731 // eslint-disable-next-line no-constructor-return
3732 return swipers;
3733 }
3734
3735 // Swiper Instance
3736 const swiper = this;
3737 swiper.__swiper__ = true;
3738 swiper.support = getSupport();
3739 swiper.device = getDevice({
3740 userAgent: params.userAgent
3741 });
3742 swiper.browser = getBrowser();
3743 swiper.eventsListeners = {};
3744 swiper.eventsAnyListeners = [];
3745 swiper.modules = [...swiper.__modules__];
3746 if (params.modules && Array.isArray(params.modules)) {
3747 swiper.modules.push(...params.modules);
3748 }
3749 const allModulesParams = {};
3750 swiper.modules.forEach(mod => {
3751 mod({
3752 params,
3753 swiper,
3754 extendParams: moduleExtendParams(params, allModulesParams),
3755 on: swiper.on.bind(swiper),
3756 once: swiper.once.bind(swiper),
3757 off: swiper.off.bind(swiper),
3758 emit: swiper.emit.bind(swiper)
3759 });
3760 });
3761
3762 // Extend defaults with modules params
3763 const swiperParams = extend({}, defaults, allModulesParams);
3764
3765 // Extend defaults with passed params
3766 swiper.params = extend({}, swiperParams, extendedDefaults, params);
3767 swiper.originalParams = extend({}, swiper.params);
3768 swiper.passedParams = extend({}, params);
3769
3770 // add event listeners
3771 if (swiper.params && swiper.params.on) {
3772 Object.keys(swiper.params.on).forEach(eventName => {
3773 swiper.on(eventName, swiper.params.on[eventName]);
3774 });
3775 }
3776 if (swiper.params && swiper.params.onAny) {
3777 swiper.onAny(swiper.params.onAny);
3778 }
3779
3780 // Extend Swiper
3781 Object.assign(swiper, {
3782 enabled: swiper.params.enabled,
3783 el,
3784 // Classes
3785 classNames: [],
3786 // Slides
3787 slides: [],
3788 slidesGrid: [],
3789 snapGrid: [],
3790 slidesSizesGrid: [],
3791 // isDirection
3792 isHorizontal() {
3793 return swiper.params.direction === 'horizontal';
3794 },
3795 isVertical() {
3796 return swiper.params.direction === 'vertical';
3797 },
3798 // Indexes
3799 activeIndex: 0,
3800 realIndex: 0,
3801 //
3802 isBeginning: true,
3803 isEnd: false,
3804 // Props
3805 translate: 0,
3806 previousTranslate: 0,
3807 progress: 0,
3808 velocity: 0,
3809 animating: false,
3810 cssOverflowAdjustment() {
3811 // Returns 0 unless `translate` is > 2**23
3812 // Should be subtracted from css values to prevent overflow
3813 return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
3814 },
3815 // Locks
3816 allowSlideNext: swiper.params.allowSlideNext,
3817 allowSlidePrev: swiper.params.allowSlidePrev,
3818 // Touch Events
3819 touchEventsData: {
3820 isTouched: undefined,
3821 isMoved: undefined,
3822 allowTouchCallbacks: undefined,
3823 touchStartTime: undefined,
3824 isScrolling: undefined,
3825 currentTranslate: undefined,
3826 startTranslate: undefined,
3827 allowThresholdMove: undefined,
3828 // Form elements to match
3829 focusableElements: swiper.params.focusableElements,
3830 // Last click time
3831 lastClickTime: 0,
3832 clickTimeout: undefined,
3833 // Velocities
3834 velocities: [],
3835 allowMomentumBounce: undefined,
3836 startMoving: undefined,
3837 pointerId: null,
3838 touchId: null
3839 },
3840 // Clicks
3841 allowClick: true,
3842 // Touches
3843 allowTouchMove: swiper.params.allowTouchMove,
3844 touches: {
3845 startX: 0,
3846 startY: 0,
3847 currentX: 0,
3848 currentY: 0,
3849 diff: 0
3850 },
3851 // Images
3852 imagesToLoad: [],
3853 imagesLoaded: 0
3854 });
3855 swiper.emit('_swiper');
3856
3857 // Init
3858 if (swiper.params.init) {
3859 swiper.init();
3860 }
3861
3862 // Return app instance
3863 // eslint-disable-next-line no-constructor-return
3864 return swiper;
3865 }
3866 getDirectionLabel(property) {
3867 if (this.isHorizontal()) {
3868 return property;
3869 }
3870 // prettier-ignore
3871 return {
3872 'width': 'height',
3873 'margin-top': 'margin-left',
3874 'margin-bottom ': 'margin-right',
3875 'margin-left': 'margin-top',
3876 'margin-right': 'margin-bottom',
3877 'padding-left': 'padding-top',
3878 'padding-right': 'padding-bottom',
3879 'marginRight': 'marginBottom'
3880 }[property];
3881 }
3882 getSlideIndex(slideEl) {
3883 const {
3884 slidesEl,
3885 params
3886 } = this;
3887 const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3888 const firstSlideIndex = elementIndex(slides[0]);
3889 return elementIndex(slideEl) - firstSlideIndex;
3890 }
3891 getSlideIndexByData(index) {
3892 return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0]);
3893 }
3894 recalcSlides() {
3895 const swiper = this;
3896 const {
3897 slidesEl,
3898 params
3899 } = swiper;
3900 swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3901 }
3902 enable() {
3903 const swiper = this;
3904 if (swiper.enabled) return;
3905 swiper.enabled = true;
3906 if (swiper.params.grabCursor) {
3907 swiper.setGrabCursor();
3908 }
3909 swiper.emit('enable');
3910 }
3911 disable() {
3912 const swiper = this;
3913 if (!swiper.enabled) return;
3914 swiper.enabled = false;
3915 if (swiper.params.grabCursor) {
3916 swiper.unsetGrabCursor();
3917 }
3918 swiper.emit('disable');
3919 }
3920 setProgress(progress, speed) {
3921 const swiper = this;
3922 progress = Math.min(Math.max(progress, 0), 1);
3923 const min = swiper.minTranslate();
3924 const max = swiper.maxTranslate();
3925 const current = (max - min) * progress + min;
3926 swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
3927 swiper.updateActiveIndex();
3928 swiper.updateSlidesClasses();
3929 }
3930 emitContainerClasses() {
3931 const swiper = this;
3932 if (!swiper.params._emitClasses || !swiper.el) return;
3933 const cls = swiper.el.className.split(' ').filter(className => {
3934 return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
3935 });
3936 swiper.emit('_containerClasses', cls.join(' '));
3937 }
3938 getSlideClasses(slideEl) {
3939 const swiper = this;
3940 if (swiper.destroyed) return '';
3941 return slideEl.className.split(' ').filter(className => {
3942 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
3943 }).join(' ');
3944 }
3945 emitSlidesClasses() {
3946 const swiper = this;
3947 if (!swiper.params._emitClasses || !swiper.el) return;
3948 const updates = [];
3949 swiper.slides.forEach(slideEl => {
3950 const classNames = swiper.getSlideClasses(slideEl);
3951 updates.push({
3952 slideEl,
3953 classNames
3954 });
3955 swiper.emit('_slideClass', slideEl, classNames);
3956 });
3957 swiper.emit('_slideClasses', updates);
3958 }
3959 slidesPerViewDynamic(view, exact) {
3960 if (view === void 0) {
3961 view = 'current';
3962 }
3963 if (exact === void 0) {
3964 exact = false;
3965 }
3966 const swiper = this;
3967 const {
3968 params,
3969 slides,
3970 slidesGrid,
3971 slidesSizesGrid,
3972 size: swiperSize,
3973 activeIndex
3974 } = swiper;
3975 let spv = 1;
3976 if (typeof params.slidesPerView === 'number') return params.slidesPerView;
3977 if (params.centeredSlides) {
3978 let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;
3979 let breakLoop;
3980 for (let i = activeIndex + 1; i < slides.length; i += 1) {
3981 if (slides[i] && !breakLoop) {
3982 slideSize += Math.ceil(slides[i].swiperSlideSize);
3983 spv += 1;
3984 if (slideSize > swiperSize) breakLoop = true;
3985 }
3986 }
3987 for (let i = activeIndex - 1; i >= 0; i -= 1) {
3988 if (slides[i] && !breakLoop) {
3989 slideSize += slides[i].swiperSlideSize;
3990 spv += 1;
3991 if (slideSize > swiperSize) breakLoop = true;
3992 }
3993 }
3994 } else {
3995 // eslint-disable-next-line
3996 if (view === 'current') {
3997 for (let i = activeIndex + 1; i < slides.length; i += 1) {
3998 const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
3999 if (slideInView) {
4000 spv += 1;
4001 }
4002 }
4003 } else {
4004 // previous
4005 for (let i = activeIndex - 1; i >= 0; i -= 1) {
4006 const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
4007 if (slideInView) {
4008 spv += 1;
4009 }
4010 }
4011 }
4012 }
4013 return spv;
4014 }
4015 update() {
4016 const swiper = this;
4017 if (!swiper || swiper.destroyed) return;
4018 const {
4019 snapGrid,
4020 params
4021 } = swiper;
4022 // Breakpoints
4023 if (params.breakpoints) {
4024 swiper.setBreakpoint();
4025 }
4026 [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
4027 if (imageEl.complete) {
4028 processLazyPreloader(swiper, imageEl);
4029 }
4030 });
4031 swiper.updateSize();
4032 swiper.updateSlides();
4033 swiper.updateProgress();
4034 swiper.updateSlidesClasses();
4035 function setTranslate() {
4036 const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
4037 const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
4038 swiper.setTranslate(newTranslate);
4039 swiper.updateActiveIndex();
4040 swiper.updateSlidesClasses();
4041 }
4042 let translated;
4043 if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
4044 setTranslate();
4045 if (params.autoHeight) {
4046 swiper.updateAutoHeight();
4047 }
4048 } else {
4049 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
4050 const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
4051 translated = swiper.slideTo(slides.length - 1, 0, false, true);
4052 } else {
4053 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
4054 }
4055 if (!translated) {
4056 setTranslate();
4057 }
4058 }
4059 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
4060 swiper.checkOverflow();
4061 }
4062 swiper.emit('update');
4063 }
4064 changeDirection(newDirection, needUpdate) {
4065 if (needUpdate === void 0) {
4066 needUpdate = true;
4067 }
4068 const swiper = this;
4069 const currentDirection = swiper.params.direction;
4070 if (!newDirection) {
4071 // eslint-disable-next-line
4072 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
4073 }
4074 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
4075 return swiper;
4076 }
4077 swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
4078 swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
4079 swiper.emitContainerClasses();
4080 swiper.params.direction = newDirection;
4081 swiper.slides.forEach(slideEl => {
4082 if (newDirection === 'vertical') {
4083 slideEl.style.width = '';
4084 } else {
4085 slideEl.style.height = '';
4086 }
4087 });
4088 swiper.emit('changeDirection');
4089 if (needUpdate) swiper.update();
4090 return swiper;
4091 }
4092 changeLanguageDirection(direction) {
4093 const swiper = this;
4094 if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
4095 swiper.rtl = direction === 'rtl';
4096 swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
4097 if (swiper.rtl) {
4098 swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
4099 swiper.el.dir = 'rtl';
4100 } else {
4101 swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
4102 swiper.el.dir = 'ltr';
4103 }
4104 swiper.update();
4105 }
4106 mount(element) {
4107 const swiper = this;
4108 if (swiper.mounted) return true;
4109
4110 // Find el
4111 let el = element || swiper.params.el;
4112 if (typeof el === 'string') {
4113 el = document.querySelector(el);
4114 }
4115 if (!el) {
4116 return false;
4117 }
4118 el.swiper = swiper;
4119 if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {
4120 swiper.isElement = true;
4121 }
4122 const getWrapperSelector = () => {
4123 return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;
4124 };
4125 const getWrapper = () => {
4126 if (el && el.shadowRoot && el.shadowRoot.querySelector) {
4127 const res = el.shadowRoot.querySelector(getWrapperSelector());
4128 // Children needs to return slot items
4129 return res;
4130 }
4131 return elementChildren(el, getWrapperSelector())[0];
4132 };
4133 // Find Wrapper
4134 let wrapperEl = getWrapper();
4135 if (!wrapperEl && swiper.params.createElements) {
4136 wrapperEl = createElement('div', swiper.params.wrapperClass);
4137 el.append(wrapperEl);
4138 elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {
4139 wrapperEl.append(slideEl);
4140 });
4141 }
4142 Object.assign(swiper, {
4143 el,
4144 wrapperEl,
4145 slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
4146 hostEl: swiper.isElement ? el.parentNode.host : el,
4147 mounted: true,
4148 // RTL
4149 rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',
4150 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),
4151 wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'
4152 });
4153 return true;
4154 }
4155 init(el) {
4156 const swiper = this;
4157 if (swiper.initialized) return swiper;
4158 const mounted = swiper.mount(el);
4159 if (mounted === false) return swiper;
4160 swiper.emit('beforeInit');
4161
4162 // Set breakpoint
4163 if (swiper.params.breakpoints) {
4164 swiper.setBreakpoint();
4165 }
4166
4167 // Add Classes
4168 swiper.addClasses();
4169
4170 // Update size
4171 swiper.updateSize();
4172
4173 // Update slides
4174 swiper.updateSlides();
4175 if (swiper.params.watchOverflow) {
4176 swiper.checkOverflow();
4177 }
4178
4179 // Set Grab Cursor
4180 if (swiper.params.grabCursor && swiper.enabled) {
4181 swiper.setGrabCursor();
4182 }
4183
4184 // Slide To Initial Slide
4185 if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
4186 swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
4187 } else {
4188 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
4189 }
4190
4191 // Create loop
4192 if (swiper.params.loop) {
4193 swiper.loopCreate();
4194 }
4195
4196 // Attach events
4197 swiper.attachEvents();
4198 const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')];
4199 if (swiper.isElement) {
4200 lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]'));
4201 }
4202 lazyElements.forEach(imageEl => {
4203 if (imageEl.complete) {
4204 processLazyPreloader(swiper, imageEl);
4205 } else {
4206 imageEl.addEventListener('load', e => {
4207 processLazyPreloader(swiper, e.target);
4208 });
4209 }
4210 });
4211 preload(swiper);
4212
4213 // Init Flag
4214 swiper.initialized = true;
4215 preload(swiper);
4216
4217 // Emit
4218 swiper.emit('init');
4219 swiper.emit('afterInit');
4220 return swiper;
4221 }
4222 destroy(deleteInstance, cleanStyles) {
4223 if (deleteInstance === void 0) {
4224 deleteInstance = true;
4225 }
4226 if (cleanStyles === void 0) {
4227 cleanStyles = true;
4228 }
4229 const swiper = this;
4230 const {
4231 params,
4232 el,
4233 wrapperEl,
4234 slides
4235 } = swiper;
4236 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
4237 return null;
4238 }
4239 swiper.emit('beforeDestroy');
4240
4241 // Init Flag
4242 swiper.initialized = false;
4243
4244 // Detach events
4245 swiper.detachEvents();
4246
4247 // Destroy loop
4248 if (params.loop) {
4249 swiper.loopDestroy();
4250 }
4251
4252 // Cleanup styles
4253 if (cleanStyles) {
4254 swiper.removeClasses();
4255 if (el && typeof el !== 'string') {
4256 el.removeAttribute('style');
4257 }
4258 if (wrapperEl) {
4259 wrapperEl.removeAttribute('style');
4260 }
4261 if (slides && slides.length) {
4262 slides.forEach(slideEl => {
4263 slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
4264 slideEl.removeAttribute('style');
4265 slideEl.removeAttribute('data-swiper-slide-index');
4266 });
4267 }
4268 }
4269 swiper.emit('destroy');
4270
4271 // Detach emitter events
4272 Object.keys(swiper.eventsListeners).forEach(eventName => {
4273 swiper.off(eventName);
4274 });
4275 if (deleteInstance !== false) {
4276 if (swiper.el && typeof swiper.el !== 'string') {
4277 swiper.el.swiper = null;
4278 }
4279 deleteProps(swiper);
4280 }
4281 swiper.destroyed = true;
4282 return null;
4283 }
4284 static extendDefaults(newDefaults) {
4285 extend(extendedDefaults, newDefaults);
4286 }
4287 static get extendedDefaults() {
4288 return extendedDefaults;
4289 }
4290 static get defaults() {
4291 return defaults;
4292 }
4293 static installModule(mod) {
4294 if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
4295 const modules = Swiper.prototype.__modules__;
4296 if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
4297 modules.push(mod);
4298 }
4299 }
4300 static use(module) {
4301 if (Array.isArray(module)) {
4302 module.forEach(m => Swiper.installModule(m));
4303 return Swiper;
4304 }
4305 Swiper.installModule(module);
4306 return Swiper;
4307 }
4308 }
4309 Object.keys(prototypes).forEach(prototypeGroup => {
4310 Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {
4311 Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
4312 });
4313 });
4314 Swiper.use([Resize, Observer]);
4315
4316 function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
4317 if (swiper.params.createElements) {
4318 Object.keys(checkProps).forEach(key => {
4319 if (!params[key] && params.auto === true) {
4320 let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];
4321 if (!element) {
4322 element = createElement('div', checkProps[key]);
4323 element.className = checkProps[key];
4324 swiper.el.append(element);
4325 }
4326 params[key] = element;
4327 originalParams[key] = element;
4328 }
4329 });
4330 }
4331 return params;
4332 }
4333
4334 function Navigation(_ref) {
4335 let {
4336 swiper,
4337 extendParams,
4338 on,
4339 emit
4340 } = _ref;
4341 extendParams({
4342 navigation: {
4343 nextEl: null,
4344 prevEl: null,
4345 hideOnClick: false,
4346 disabledClass: 'swiper-button-disabled',
4347 hiddenClass: 'swiper-button-hidden',
4348 lockClass: 'swiper-button-lock',
4349 navigationDisabledClass: 'swiper-navigation-disabled'
4350 }
4351 });
4352 swiper.navigation = {
4353 nextEl: null,
4354 prevEl: null
4355 };
4356 function getEl(el) {
4357 let res;
4358 if (el && typeof el === 'string' && swiper.isElement) {
4359 res = swiper.el.querySelector(el);
4360 if (res) return res;
4361 }
4362 if (el) {
4363 if (typeof el === 'string') res = [...document.querySelectorAll(el)];
4364 if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
4365 res = swiper.el.querySelector(el);
4366 } else if (res && res.length === 1) {
4367 res = res[0];
4368 }
4369 }
4370 if (el && !res) return el;
4371 // if (Array.isArray(res) && res.length === 1) res = res[0];
4372 return res;
4373 }
4374 function toggleEl(el, disabled) {
4375 const params = swiper.params.navigation;
4376 el = makeElementsArray(el);
4377 el.forEach(subEl => {
4378 if (subEl) {
4379 subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));
4380 if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;
4381 if (swiper.params.watchOverflow && swiper.enabled) {
4382 subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
4383 }
4384 }
4385 });
4386 }
4387 function update() {
4388 // Update Navigation Buttons
4389 const {
4390 nextEl,
4391 prevEl
4392 } = swiper.navigation;
4393 if (swiper.params.loop) {
4394 toggleEl(prevEl, false);
4395 toggleEl(nextEl, false);
4396 return;
4397 }
4398 toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
4399 toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
4400 }
4401 function onPrevClick(e) {
4402 e.preventDefault();
4403 if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;
4404 swiper.slidePrev();
4405 emit('navigationPrev');
4406 }
4407 function onNextClick(e) {
4408 e.preventDefault();
4409 if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;
4410 swiper.slideNext();
4411 emit('navigationNext');
4412 }
4413 function init() {
4414 const params = swiper.params.navigation;
4415 swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
4416 nextEl: 'swiper-button-next',
4417 prevEl: 'swiper-button-prev'
4418 });
4419 if (!(params.nextEl || params.prevEl)) return;
4420 let nextEl = getEl(params.nextEl);
4421 let prevEl = getEl(params.prevEl);
4422 Object.assign(swiper.navigation, {
4423 nextEl,
4424 prevEl
4425 });
4426 nextEl = makeElementsArray(nextEl);
4427 prevEl = makeElementsArray(prevEl);
4428 const initButton = (el, dir) => {
4429 if (el) {
4430 el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
4431 }
4432 if (!swiper.enabled && el) {
4433 el.classList.add(...params.lockClass.split(' '));
4434 }
4435 };
4436 nextEl.forEach(el => initButton(el, 'next'));
4437 prevEl.forEach(el => initButton(el, 'prev'));
4438 }
4439 function destroy() {
4440 let {
4441 nextEl,
4442 prevEl
4443 } = swiper.navigation;
4444 nextEl = makeElementsArray(nextEl);
4445 prevEl = makeElementsArray(prevEl);
4446 const destroyButton = (el, dir) => {
4447 el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
4448 el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));
4449 };
4450 nextEl.forEach(el => destroyButton(el, 'next'));
4451 prevEl.forEach(el => destroyButton(el, 'prev'));
4452 }
4453 on('init', () => {
4454 if (swiper.params.navigation.enabled === false) {
4455 // eslint-disable-next-line
4456 disable();
4457 } else {
4458 init();
4459 update();
4460 }
4461 });
4462 on('toEdge fromEdge lock unlock', () => {
4463 update();
4464 });
4465 on('destroy', () => {
4466 destroy();
4467 });
4468 on('enable disable', () => {
4469 let {
4470 nextEl,
4471 prevEl
4472 } = swiper.navigation;
4473 nextEl = makeElementsArray(nextEl);
4474 prevEl = makeElementsArray(prevEl);
4475 if (swiper.enabled) {
4476 update();
4477 return;
4478 }
4479 [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));
4480 });
4481 on('click', (_s, e) => {
4482 let {
4483 nextEl,
4484 prevEl
4485 } = swiper.navigation;
4486 nextEl = makeElementsArray(nextEl);
4487 prevEl = makeElementsArray(prevEl);
4488 const targetEl = e.target;
4489 let targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl);
4490 if (swiper.isElement && !targetIsButton) {
4491 const path = e.path || e.composedPath && e.composedPath();
4492 if (path) {
4493 targetIsButton = path.find(pathEl => nextEl.includes(pathEl) || prevEl.includes(pathEl));
4494 }
4495 }
4496 if (swiper.params.navigation.hideOnClick && !targetIsButton) {
4497 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
4498 let isHidden;
4499 if (nextEl.length) {
4500 isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
4501 } else if (prevEl.length) {
4502 isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
4503 }
4504 if (isHidden === true) {
4505 emit('navigationShow');
4506 } else {
4507 emit('navigationHide');
4508 }
4509 [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));
4510 }
4511 });
4512 const enable = () => {
4513 swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));
4514 init();
4515 update();
4516 };
4517 const disable = () => {
4518 swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));
4519 destroy();
4520 };
4521 Object.assign(swiper.navigation, {
4522 enable,
4523 disable,
4524 update,
4525 init,
4526 destroy
4527 });
4528 }
4529
4530 const scImageSliderCss = "@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\") format(\"woff\");font-weight:400;font-style:normal}:root{--swiper-theme-color:#007aff;}.swiper,swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1;display:block}.swiper-vertical>.swiper-wrapper{flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:flex;transition-property:transform;transition-timing-function:var(--swiper-wrapper-transition-timing-function, initial);box-sizing:content-box}.swiper-android .swiper-slide,.swiper-wrapper{transform:translate3d(0px, 0, 0)}.swiper-horizontal{touch-action:pan-y}.swiper-vertical{touch-action:pan-x}.swiper-slide,swiper-slide{flex-shrink:0;width:100%;height:100%;position:relative;transition-property:transform;display:block}.swiper-slide-invisible-blank{visibility:hidden}.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);backface-visibility:hidden}.swiper-3d.swiper-css-mode .swiper-wrapper{perspective:1200px}.swiper-3d .swiper-wrapper{transform-style:preserve-3d}.swiper-3d{perspective:1200px}.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))}.swiper-css-mode>.swiper-wrapper{overflow:auto;scrollbar-width:none;-ms-overflow-style:none;}.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-wrapper>.swiper-slide{scroll-snap-align:center center;scroll-snap-stop:always}.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-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:not(.swiper-watch-progress) .swiper-lazy-preloader,swiper-container:not(.swiper-watch-progress) .swiper-lazy-preloader,.swiper-watch-progress .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{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}:host{display:block}.image-slider{user-select:none;}.image-slider__thumbs{margin-top:var(--sc-slider-spacing, var(--sc-spacing-small));display:flex;align-items:stretch}.image-slider__thumbs .swiper{flex:1}.image-slider__thumbs .image-slider__navigation{display:none}.image-slider__thumbs--has-navigation .image-slider__navigation{display:flex;outline:none;border:none;background:none}.image-slider__navigation{display:flex;flex-direction:column;justify-content:center;align-items:center;font-size:24px;cursor:pointer}.image-slider__navigation.image-slider--is-prev{padding-right:8px}.image-slider__navigation.image-slider--is-next{padding-left:8px}.image-slider__navigation.swiper-button-disabled{opacity:0.25;cursor:default}.image-slider__slider{height:var(--sc-product-slider-height, auto);cursor:grab}.image-slider__slider .swiper-slide-img{width:100%;height:100%;text-align:center;border-radius:var(--sc-border-radius-medium);background:rgba(0, 0, 0, 0.1)}.image-slider__slider .swiper-slide-img img{display:block;margin:auto;max-width:100%;height:auto;object-fit:contain;border-radius:var(--sc-border-radius-medium)}.image-slider__thumb{cursor:pointer;width:100%;background:rgba(0, 0, 0, 0.1);border-radius:var(--sc-border-radius-medium);border:none;padding:0}.image-slider__thumb img{width:100%;height:auto;display:block;object-fit:var(--sc-image-slideshow-thumb-object-fit, cover);aspect-ratio:var(--sc-image-slideshow-thumb-aspect-ratio, 4/3);border-radius:var(--sc-border-radius-medium)}.image-slider__thumb--is-active img{outline:var(--sc-image-slideshow-thumb-active-outline, 2px solid var(--sc-focus-ring-color-primary, var(--sc-color-primary-500)));outline-offset:-2px}.image-slider--is-fixed-height .image-slider__slider .swiper-slide-img{background:transparent}.image-slider--is-fixed-height .image-slider__slider .swiper-slide-img img{max-height:100%}";
4531 const ScImageSliderStyle0 = scImageSliderCss;
4532
4533 const ScImageSlider = class {
4534 constructor(hostRef) {
4535 index.registerInstance(this, hostRef);
4536 this.images = undefined;
4537 this.thumbnails = [];
4538 this.hasThumbnails = undefined;
4539 this.thumbnailsPerPage = 5;
4540 this.autoHeight = undefined;
4541 this.currentSliderIndex = 0;
4542 this.imagesData = [];
4543 this.thumbnailsData = [];
4544 }
4545 handleThumbPaginate() {
4546 if (!this.thumbsSwiper)
4547 return;
4548 const slideInView = this.currentSliderIndex >= this.thumbsSwiper.activeIndex && this.currentSliderIndex < this.thumbsSwiper.activeIndex + this.thumbnailsPerPage;
4549 if (!slideInView) {
4550 this.thumbsSwiper.slideTo(this.currentSliderIndex);
4551 }
4552 }
4553 parseImages(newValue) {
4554 if (newValue)
4555 this.imagesData = typeof newValue == 'string' ? JSON.parse(newValue) : newValue;
4556 }
4557 parseThumnails(newValue) {
4558 if (newValue)
4559 this.thumbnailsData = typeof newValue == 'string' ? JSON.parse(newValue) : newValue;
4560 }
4561 componentWillLoad() {
4562 this.parseImages(this.images);
4563 this.parseThumnails(this.thumbnails);
4564 }
4565 componentDidUpdate() {
4566 this.swiper.update();
4567 }
4568 componentDidLoad() {
4569 if (this.swiperContainerRef) {
4570 this.swiper = new Swiper(this.swiperContainerRef, {
4571 direction: 'horizontal',
4572 loop: false,
4573 autoHeight: this.autoHeight,
4574 centeredSlides: true,
4575 on: {
4576 slideChange: swiper => {
4577 this.currentSliderIndex = swiper.activeIndex;
4578 },
4579 },
4580 });
4581 }
4582 if (this.swiperThumbsRef) {
4583 this.thumbsSwiper = new Swiper(this.swiperThumbsRef, {
4584 modules: [Navigation],
4585 direction: 'horizontal',
4586 loop: false,
4587 slidesPerView: this.thumbnailsPerPage,
4588 slidesPerGroup: this.thumbnailsPerPage,
4589 spaceBetween: 10,
4590 centerInsufficientSlides: true,
4591 slideToClickedSlide: true,
4592 navigation: {
4593 nextEl: this.next,
4594 prevEl: this.previous,
4595 },
4596 });
4597 }
4598 }
4599 disconnectedCallback() {
4600 this.swiper.destroy(true, true);
4601 if (this.thumbsSwiper) {
4602 this.thumbsSwiper.destroy(true, true);
4603 }
4604 }
4605 render() {
4606 var _a, _b, _c;
4607 const thumbnails = ((_a = this.thumbnailsData) === null || _a === void 0 ? void 0 : _a.length) ? this.thumbnailsData : this.imagesData;
4608 return (index.h("div", { key: '384b6f7289aa4332cc3dc73335595ede8cd0f609', class: { 'image-slider': true, 'image-slider--is-fixed-height': !this.autoHeight }, part: "base" }, index.h("div", { key: 'b1785d5c39c8379ad1f4c8d8c4edb951168c283e', class: "swiper", ref: el => (this.swiperContainerRef = el) }, index.h("div", { key: '58751dc62da941f3d37895c42140e6a6b8c1e226', class: "swiper-wrapper" }, (this.imagesData || []).map(({ src, alt, srcset, width, height, sizes, title }, index$1) => (index.h("div", { key: index$1, class: "swiper-slide image-slider__slider" }, index.h("div", { class: "swiper-slide-img" }, index.h("img", { src: src, alt: alt, srcset: srcset, width: width, height: height, sizes: sizes, loading: index$1 > 0 ? 'lazy' : 'eager', ...(title ? { title } : {}) }))))))), this.hasThumbnails && (index.h("div", { key: '2567d6ae0cc925947b89819d2ba825f37653a68f', class: { 'image-slider__thumbs': true, 'image-slider__thumbs--has-navigation': this.images.length > 5 } }, index.h("button", { key: 'f5b6cff0dfe6cb162f3579bee089a1cf0a9e1d9c', disabled: (_b = this.thumbsSwiper) === null || _b === void 0 ? void 0 : _b.isBeginning, class: "image-slider__navigation image-slider--is-prev", ref: el => (this.previous = el) }, index.h("sc-visually-hidden", { key: 'bda210a19d0eaba6272981a6cbc7b0ff7c503204' }, wp.i18n.__('Go to previous product slide.', 'surecart')), index.h("sc-icon", { key: '3e10af39a7be8bc3c01e95ebf5195918e591c2c9', name: "chevron-left", "aria-hidden": "true", "tab-index": "0" })), index.h("div", { key: 'e7c07f3618356207bd2a2a18262609d169ca720b', class: "swiper", ref: el => (this.swiperThumbsRef = el) }, index.h("div", { key: 'f5e4e36e5df95e2dfdf2b896d86d6357ce8d5bb3', class: "swiper-wrapper", role: "radiogroup", "aria-label": wp.i18n.sprintf(wp.i18n.__('Products slide options section. There are %d options present.', 'surecart'), (thumbnails === null || thumbnails === void 0 ? void 0 : thumbnails.length) || 0) }, (thumbnails || []).map(({ src, alt, srcset, width, height, sizes, title }, index$1) => (index.h("button", { class: { 'swiper-slide': true, 'image-slider__thumb': true, 'image-slider__thumb--is-active': this.currentSliderIndex === index$1 }, onClick: () => { var _a, _b; return (_b = (_a = this.swiper) === null || _a === void 0 ? void 0 : _a.slideTo) === null || _b === void 0 ? void 0 : _b.call(_a, index$1); }, role: "radio", "aria-checked": this.currentSliderIndex === index$1 ? 'true' : 'false', tabindex: "0" }, index.h("img", { src: src, alt: wp.i18n.sprintf(wp.i18n.__('Product image number %d, %s', 'surecart'), index$1 + 1, alt), ...(title ? { title } : {}), srcset: srcset, width: width, height: height, sizes: sizes, loading: index$1 > this.thumbnailsPerPage - 1 ? 'lazy' : 'eager' })))))), index.h("button", { key: '0011af5c94972a4aa23ef518eeed3693b034c647', disabled: (_c = this.thumbsSwiper) === null || _c === void 0 ? void 0 : _c.isEnd, class: "image-slider__navigation image-slider--is-next", ref: el => (this.next = el) }, index.h("sc-visually-hidden", { key: '92311353c23636b5f35dbd7d4046795abf474e0c' }, wp.i18n.__('Go to next product slide.', 'surecart')), index.h("sc-icon", { key: 'c11535d45088e0643e5367e307d99beee47679bc', name: "chevron-right", "aria-hidden": "true", "tab-index": "0" }))))));
4609 }
4610 static get watchers() { return {
4611 "currentSliderIndex": ["handleThumbPaginate"],
4612 "images": ["parseImages"],
4613 "thumbnails": ["parseThumnails"]
4614 }; }
4615 };
4616 ScImageSlider.style = ScImageSliderStyle0;
4617
4618 exports.sc_image_slider = ScImageSlider;
4619
4620 //# sourceMappingURL=sc-image-slider.cjs.entry.js.map