@salla.sa/twilight-components 3.0.17 → 3.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{Helper-DSYelC4c.js → Helper-DqKJCL8G.js} +1 -1
- package/dist/cjs/{filepond-l9D0Yv7b.js → filepond-Byu0lc8z.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-poster-8SrbLptI.js → filepond-plugin-file-poster-qwx7lYZ-.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-size-DGD6oJy0.js → filepond-plugin-file-validate-size-C-n0P4TT.js} +1 -1
- package/dist/cjs/{filepond-plugin-file-validate-type-BIvrhp3w.js → filepond-plugin-file-validate-type-C8VOOXdT.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-edit-4xKikdXG.js → filepond-plugin-image-edit-B9KG763Y.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-exif-orientation-C3BvwxQh.js → filepond-plugin-image-exif-orientation-Czt4pYzU.js} +1 -1
- package/dist/cjs/{filepond-plugin-image-preview-CBq_GY0V.js → filepond-plugin-image-preview-BFm1Zl0o.js} +1 -1
- package/dist/cjs/free-shipping-timer-6QBe5BNS.js +156 -0
- package/dist/cjs/helpers-NV7wgP50.js +602 -0
- package/dist/cjs/{index-BAwxpXnB.js → index-CFW798jX.js} +2 -2
- package/dist/cjs/{intlTelInput-xw-HaAEN.js → intlTelInput-CLa2B89b.js} +1 -1
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/salla-accordion-body_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-accordion_6.cjs.entry.js +2 -2
- package/dist/cjs/salla-add-product-button_5.cjs.entry.js +46 -3
- package/dist/cjs/salla-advertisement.cjs.entry.js +1 -1
- package/dist/cjs/salla-alert_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-app-install-alert.cjs.entry.js +1 -1
- package/dist/cjs/salla-applied-filters.cjs.entry.js +2 -2
- package/dist/cjs/salla-apps-icons.cjs.entry.js +1 -1
- package/dist/cjs/salla-attachment-view_9.cjs.entry.js +11 -11
- package/dist/cjs/salla-badge.cjs.entry.js +1 -1
- package/dist/cjs/salla-basket-gap.cjs.entry.js +1 -1
- package/dist/cjs/salla-bullet-delivery_3.cjs.entry.js +590 -134
- package/dist/cjs/salla-cart-coupons.cjs.entry.js +1 -1
- package/dist/cjs/salla-cart-item-offers_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-cart-summary-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-cashback-banner.cjs.entry.js +1 -1
- package/dist/cjs/salla-comment-factors.cjs.entry.js +1 -1
- package/dist/cjs/salla-comment-form_9.cjs.entry.js +2 -2
- package/dist/cjs/salla-conditional-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-contacts.cjs.entry.js +1 -1
- package/dist/cjs/salla-cookies-bar.cjs.entry.js +1 -1
- package/dist/cjs/salla-count-down.cjs.entry.js +1 -1
- package/dist/cjs/salla-custom-fields.cjs.entry.js +1 -1
- package/dist/cjs/salla-delivery-promise.cjs.entry.js +2 -2
- package/dist/cjs/salla-edit-order-button.cjs.entry.js +1 -1
- package/dist/cjs/salla-filters-widget.cjs.entry.js +2 -2
- package/dist/cjs/salla-filters.cjs.entry.js +2 -2
- package/dist/cjs/salla-free-shipping-banner.cjs.entry.js +95 -9
- package/dist/cjs/salla-free-shipping-tag.cjs.entry.js +18 -5
- package/dist/cjs/salla-fulfillment-methods.cjs.entry.js +1 -1
- package/dist/cjs/salla-gift-card-redeem_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-gifting.cjs.entry.js +13 -6
- package/dist/cjs/salla-hook.cjs.entry.js +1 -1
- package/dist/cjs/salla-infinite-scroll.cjs.entry.js +2 -2
- package/dist/cjs/salla-installment.cjs.entry.js +1 -1
- package/dist/cjs/salla-list-tile.cjs.entry.js +1 -1
- package/dist/cjs/salla-localization-modal.cjs.entry.js +1 -1
- package/dist/cjs/salla-login-modal.cjs.entry.js +7 -2
- package/dist/cjs/salla-loyalty-banner_10.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-exchange-product-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-points-banner.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-points-history.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty-prize-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-loyalty.cjs.entry.js +1 -1
- package/dist/cjs/salla-maintenance-alert.cjs.entry.js +1 -1
- package/dist/cjs/salla-map_3.cjs.entry.js +1 -1
- package/dist/cjs/salla-menu.cjs.entry.js +1 -1
- package/dist/cjs/salla-metadata.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product-cart_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product-options-modal_2.cjs.entry.js +1 -1
- package/dist/cjs/salla-multiple-bundle-product.cjs.entry.js +1 -1
- package/dist/cjs/salla-next-order-coupon.cjs.entry.js +1 -1
- package/dist/cjs/salla-notification-item_2.cjs.entry.js +2 -2
- package/dist/cjs/salla-offer-modal.cjs.entry.js +1 -1
- package/dist/cjs/salla-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-branch.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-cancel.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details-multiple-bundle-product.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details-options.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-details.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit-product-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-edit.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-items.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-options-modal.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-payment.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-rewards.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-shipments.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-summary.cjs.entry.js +1 -1
- package/dist/cjs/salla-order-totals-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-orders.cjs.entry.js +2 -2
- package/dist/cjs/salla-payments.cjs.entry.js +1 -1
- package/dist/cjs/salla-placeholder.cjs.entry.js +1 -1
- package/dist/cjs/salla-price-range.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-card-embed.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-product-size-guide.cjs.entry.js +1 -1
- package/dist/cjs/salla-products-list.cjs.entry.js +13 -5
- package/dist/cjs/salla-products-slider.cjs.entry.js +2 -2
- package/dist/cjs/salla-quick-order.cjs.entry.js +1 -1
- package/dist/cjs/salla-rating-modal-v2.cjs.entry.js +7 -4
- package/dist/cjs/salla-rating-modal.cjs.entry.js +2 -2
- package/dist/cjs/salla-review-factors-tags.cjs.entry.js +1 -1
- package/dist/cjs/salla-review-order-item.cjs.entry.js +1 -1
- package/dist/cjs/salla-scopes.cjs.entry.js +1 -1
- package/dist/cjs/salla-search-product-card.cjs.entry.js +1 -1
- package/dist/cjs/salla-search.cjs.entry.js +2 -2
- package/dist/cjs/salla-skeleton.cjs.entry.js +1 -1
- package/dist/cjs/salla-social-share.cjs.entry.js +1 -1
- package/dist/cjs/salla-social.cjs.entry.js +1 -1
- package/dist/cjs/salla-tab-content_3.cjs.entry.js +1 -1
- package/dist/cjs/salla-thank-you-header.cjs.entry.js +1 -1
- package/dist/cjs/salla-thank-you-page.cjs.entry.js +1 -1
- package/dist/cjs/salla-tiered-offer.cjs.entry.js +1 -1
- package/dist/cjs/salla-trust-badges.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-menu.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-profile.cjs.entry.js +1 -1
- package/dist/cjs/salla-user-settings.cjs.entry.js +1 -1
- package/dist/cjs/salla-verify.cjs.entry.js +1 -1
- package/dist/cjs/salla-wallet.cjs.entry.js +1 -1
- package/dist/cjs/salla-wishlist-actions.cjs.entry.js +1 -1
- package/dist/cjs/salla-wishlist-summary.cjs.entry.js +2 -2
- package/dist/cjs/twilight.cjs.js +2 -2
- package/dist/cjs/{vanilla-picker-Cm_uNdps.js → vanilla-picker-Vx_7G7bs.js} +1 -1
- package/dist/collection/components/salla-bullet-delivery/api-service.js +156 -25
- package/dist/collection/components/salla-bullet-delivery/helpers.js +143 -15
- package/dist/collection/components/salla-bullet-delivery/icons.js +17 -0
- package/dist/collection/components/salla-bullet-delivery/salla-bullet-delivery.css +490 -52
- package/dist/collection/components/salla-bullet-delivery/salla-bullet-delivery.js +489 -106
- package/dist/collection/components/salla-bullet-delivery/selector-tracker.js +106 -0
- package/dist/collection/components/salla-free-shipping-banner/salla-free-shipping-banner.css +18 -4
- package/dist/collection/components/salla-free-shipping-banner/salla-free-shipping-banner.js +94 -11
- package/dist/collection/components/salla-free-shipping-tag/salla-free-shipping-tag.css +6 -0
- package/dist/collection/components/salla-free-shipping-tag/salla-free-shipping-tag.js +18 -2
- package/dist/collection/components/salla-gifting/salla-gifting.css +16 -1
- package/dist/collection/components/salla-gifting/salla-gifting.js +11 -4
- package/dist/collection/components/salla-login-modal/salla-login-modal.js +6 -1
- package/dist/collection/components/salla-products-list/salla-products-list.js +11 -3
- package/dist/collection/components/salla-quick-buy/salla-quick-buy.js +44 -1
- package/dist/collection/components/salla-rating-modal/salla-rating-modal-v2.js +5 -2
- package/dist/collection/shared/free-shipping-timer.js +130 -0
- package/dist/components/free-shipping-timer.js +150 -0
- package/dist/components/helpers.js +299 -40
- package/dist/components/index.js +2 -2
- package/dist/components/salla-bullet-delivery.js +595 -133
- package/dist/components/salla-free-shipping-banner.js +95 -8
- package/dist/components/salla-free-shipping-tag.js +17 -3
- package/dist/components/salla-gifting.js +12 -5
- package/dist/components/salla-login-modal2.js +6 -1
- package/dist/components/salla-products-list2.js +11 -3
- package/dist/components/salla-quick-buy2.js +44 -1
- package/dist/components/salla-rating-modal-v22.js +5 -2
- package/dist/docs.json +25 -5
- package/dist/esm/{Helper-POCi7J93.js → Helper-I0CAizv1.js} +1 -1
- package/dist/esm/{filepond-Ct76xW02.js → filepond-DTUYXV0J.js} +1 -1
- package/dist/esm/{filepond-plugin-file-poster-C1OkzGRs.js → filepond-plugin-file-poster-DydZjneT.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-size-gdd-69cO.js → filepond-plugin-file-validate-size-nbsCU2t9.js} +1 -1
- package/dist/esm/{filepond-plugin-file-validate-type-BaZ2QTzl.js → filepond-plugin-file-validate-type-Cl5B_DIy.js} +1 -1
- package/dist/esm/{filepond-plugin-image-edit-CsoNvf0i.js → filepond-plugin-image-edit-bzskFyFR.js} +1 -1
- package/dist/esm/{filepond-plugin-image-exif-orientation-BHDSe3nH.js → filepond-plugin-image-exif-orientation-MBDuxLaX.js} +1 -1
- package/dist/esm/{filepond-plugin-image-preview-CD_S17z3.js → filepond-plugin-image-preview-N6wzEryW.js} +1 -1
- package/dist/esm/free-shipping-timer-CnTwkF6y.js +150 -0
- package/dist/esm/helpers-Cnh7Qptl.js +568 -0
- package/dist/esm/{index-DmGAR42j.js → index-C9zdeQFI.js} +2 -2
- package/dist/esm/{intlTelInput-D76Q4XFx.js → intlTelInput-B5L9nYtO.js} +1 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/salla-accordion-body_2.entry.js +1 -1
- package/dist/esm/salla-accordion_6.entry.js +2 -2
- package/dist/esm/salla-add-product-button_5.entry.js +46 -3
- package/dist/esm/salla-advertisement.entry.js +1 -1
- package/dist/esm/salla-alert_2.entry.js +1 -1
- package/dist/esm/salla-app-install-alert.entry.js +1 -1
- package/dist/esm/salla-applied-filters.entry.js +2 -2
- package/dist/esm/salla-apps-icons.entry.js +1 -1
- package/dist/esm/salla-attachment-view_9.entry.js +11 -11
- package/dist/esm/salla-badge.entry.js +1 -1
- package/dist/esm/salla-basket-gap.entry.js +1 -1
- package/dist/esm/salla-bullet-delivery_3.entry.js +590 -134
- package/dist/esm/salla-cart-coupons.entry.js +1 -1
- package/dist/esm/salla-cart-item-offers_2.entry.js +1 -1
- package/dist/esm/salla-cart-summary-card.entry.js +1 -1
- package/dist/esm/salla-cashback-banner.entry.js +1 -1
- package/dist/esm/salla-comment-factors.entry.js +1 -1
- package/dist/esm/salla-comment-form_9.entry.js +2 -2
- package/dist/esm/salla-conditional-offer.entry.js +1 -1
- package/dist/esm/salla-contacts.entry.js +1 -1
- package/dist/esm/salla-cookies-bar.entry.js +1 -1
- package/dist/esm/salla-count-down.entry.js +1 -1
- package/dist/esm/salla-custom-fields.entry.js +1 -1
- package/dist/esm/salla-delivery-promise.entry.js +2 -2
- package/dist/esm/salla-edit-order-button.entry.js +1 -1
- package/dist/esm/salla-filters-widget.entry.js +2 -2
- package/dist/esm/salla-filters.entry.js +2 -2
- package/dist/esm/salla-free-shipping-banner.entry.js +94 -8
- package/dist/esm/salla-free-shipping-tag.entry.js +17 -4
- package/dist/esm/salla-fulfillment-methods.entry.js +1 -1
- package/dist/esm/salla-gift-card-redeem_2.entry.js +1 -1
- package/dist/esm/salla-gifting.entry.js +13 -6
- package/dist/esm/salla-hook.entry.js +1 -1
- package/dist/esm/salla-infinite-scroll.entry.js +2 -2
- package/dist/esm/salla-installment.entry.js +1 -1
- package/dist/esm/salla-list-tile.entry.js +1 -1
- package/dist/esm/salla-localization-modal.entry.js +1 -1
- package/dist/esm/salla-login-modal.entry.js +7 -2
- package/dist/esm/salla-loyalty-banner_10.entry.js +1 -1
- package/dist/esm/salla-loyalty-exchange-product-card.entry.js +1 -1
- package/dist/esm/salla-loyalty-points-banner.entry.js +1 -1
- package/dist/esm/salla-loyalty-points-history.entry.js +1 -1
- package/dist/esm/salla-loyalty-prize-item.entry.js +1 -1
- package/dist/esm/salla-loyalty.entry.js +1 -1
- package/dist/esm/salla-maintenance-alert.entry.js +1 -1
- package/dist/esm/salla-map_3.entry.js +1 -1
- package/dist/esm/salla-menu.entry.js +1 -1
- package/dist/esm/salla-metadata.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product-cart_2.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product-options-modal_2.entry.js +1 -1
- package/dist/esm/salla-multiple-bundle-product.entry.js +1 -1
- package/dist/esm/salla-next-order-coupon.entry.js +1 -1
- package/dist/esm/salla-notification-item_2.entry.js +2 -2
- package/dist/esm/salla-offer-modal.entry.js +1 -1
- package/dist/esm/salla-offer.entry.js +1 -1
- package/dist/esm/salla-order-branch.entry.js +1 -1
- package/dist/esm/salla-order-cancel.entry.js +1 -1
- package/dist/esm/salla-order-details-multiple-bundle-product.entry.js +1 -1
- package/dist/esm/salla-order-details-options.entry.js +1 -1
- package/dist/esm/salla-order-details.entry.js +1 -1
- package/dist/esm/salla-order-edit-item.entry.js +1 -1
- package/dist/esm/salla-order-edit-product-card.entry.js +1 -1
- package/dist/esm/salla-order-edit.entry.js +1 -1
- package/dist/esm/salla-order-items.entry.js +1 -1
- package/dist/esm/salla-order-options-modal.entry.js +1 -1
- package/dist/esm/salla-order-payment.entry.js +1 -1
- package/dist/esm/salla-order-rewards.entry.js +1 -1
- package/dist/esm/salla-order-shipments.entry.js +1 -1
- package/dist/esm/salla-order-summary.entry.js +1 -1
- package/dist/esm/salla-order-totals-card.entry.js +1 -1
- package/dist/esm/salla-orders.entry.js +2 -2
- package/dist/esm/salla-payments.entry.js +1 -1
- package/dist/esm/salla-placeholder.entry.js +1 -1
- package/dist/esm/salla-price-range.entry.js +1 -1
- package/dist/esm/salla-product-card-embed.entry.js +1 -1
- package/dist/esm/salla-product-card.entry.js +1 -1
- package/dist/esm/salla-product-size-guide.entry.js +1 -1
- package/dist/esm/salla-products-list.entry.js +13 -5
- package/dist/esm/salla-products-slider.entry.js +2 -2
- package/dist/esm/salla-quick-order.entry.js +1 -1
- package/dist/esm/salla-rating-modal-v2.entry.js +7 -4
- package/dist/esm/salla-rating-modal.entry.js +2 -2
- package/dist/esm/salla-review-factors-tags.entry.js +1 -1
- package/dist/esm/salla-review-order-item.entry.js +1 -1
- package/dist/esm/salla-scopes.entry.js +1 -1
- package/dist/esm/salla-search-product-card.entry.js +1 -1
- package/dist/esm/salla-search.entry.js +2 -2
- package/dist/esm/salla-skeleton.entry.js +1 -1
- package/dist/esm/salla-social-share.entry.js +1 -1
- package/dist/esm/salla-social.entry.js +1 -1
- package/dist/esm/salla-tab-content_3.entry.js +1 -1
- package/dist/esm/salla-thank-you-header.entry.js +1 -1
- package/dist/esm/salla-thank-you-page.entry.js +1 -1
- package/dist/esm/salla-tiered-offer.entry.js +1 -1
- package/dist/esm/salla-trust-badges.entry.js +1 -1
- package/dist/esm/salla-user-menu.entry.js +1 -1
- package/dist/esm/salla-user-profile.entry.js +1 -1
- package/dist/esm/salla-user-settings.entry.js +1 -1
- package/dist/esm/salla-verify.entry.js +1 -1
- package/dist/esm/salla-wallet.entry.js +1 -1
- package/dist/esm/salla-wishlist-actions.entry.js +1 -1
- package/dist/esm/salla-wishlist-summary.entry.js +2 -2
- package/dist/esm/twilight.js +3 -3
- package/dist/esm/{vanilla-picker-BlIXJyvJ.js → vanilla-picker-CAeu4f87.js} +1 -1
- package/dist/twilight/{p-84d725d4.entry.js → p-01d5cd61.entry.js} +1 -1
- package/dist/twilight/{p-60f4357f.entry.js → p-0213fde4.entry.js} +1 -1
- package/dist/twilight/{p-8f0af317.entry.js → p-036fbfc0.entry.js} +1 -1
- package/dist/twilight/{p-90d4129f.entry.js → p-0add41ce.entry.js} +1 -1
- package/dist/twilight/{p-fed66bcb.entry.js → p-0b0d4942.entry.js} +1 -1
- package/dist/twilight/{p-86ca22d5.entry.js → p-17bcbf9b.entry.js} +1 -1
- package/dist/twilight/{p-b66df976.entry.js → p-1867f7d4.entry.js} +1 -1
- package/dist/twilight/p-194ff38c.entry.js +4 -0
- package/dist/twilight/{p-4057b692.entry.js → p-20f9c62f.entry.js} +1 -1
- package/dist/twilight/{p-783c6346.entry.js → p-252748d9.entry.js} +1 -1
- package/dist/twilight/{p-3d5e862c.entry.js → p-290ce0bc.entry.js} +1 -1
- package/dist/twilight/{p-d68625f7.entry.js → p-2b930157.entry.js} +1 -1
- package/dist/twilight/{p-184ea04c.entry.js → p-2e4e15c5.entry.js} +1 -1
- package/dist/twilight/p-2e6537a3.entry.js +4 -0
- package/dist/twilight/{p-2a3e2404.entry.js → p-30d64bd1.entry.js} +1 -1
- package/dist/twilight/{p-5d4fadd2.entry.js → p-32495dd2.entry.js} +1 -1
- package/dist/twilight/{p-cd7029fc.entry.js → p-32d9da31.entry.js} +1 -1
- package/dist/twilight/{p-7e854633.entry.js → p-32f100f8.entry.js} +1 -1
- package/dist/twilight/{p-dc3ff1f0.entry.js → p-386b3dcd.entry.js} +1 -1
- package/dist/twilight/{p-e8090773.entry.js → p-3a4e86d1.entry.js} +1 -1
- package/dist/twilight/{p-a0a57259.entry.js → p-3b766a79.entry.js} +1 -1
- package/dist/twilight/{p-a5d2ad5e.entry.js → p-3b7a45ec.entry.js} +1 -1
- package/dist/twilight/{p-33ff7967.entry.js → p-3bb0e184.entry.js} +1 -1
- package/dist/twilight/{p-8b39a9f7.entry.js → p-3cc6ca6c.entry.js} +1 -1
- package/dist/twilight/{p-0a794d6f.entry.js → p-4070f808.entry.js} +1 -1
- package/dist/twilight/{p-d2c1457e.entry.js → p-412fb721.entry.js} +1 -1
- package/dist/twilight/{p-fce39869.entry.js → p-427c13b6.entry.js} +1 -1
- package/dist/twilight/{p-49195cb6.entry.js → p-45e0a5d0.entry.js} +1 -1
- package/dist/twilight/{p-cd866be6.entry.js → p-4d615f9f.entry.js} +1 -1
- package/dist/twilight/{p-4f794057.entry.js → p-4d7fc363.entry.js} +1 -1
- package/dist/twilight/{p-9eb92980.entry.js → p-5009f654.entry.js} +1 -1
- package/dist/twilight/{p-f4411a04.entry.js → p-50853b76.entry.js} +1 -1
- package/dist/twilight/{p-b9695308.entry.js → p-550ad1a6.entry.js} +1 -1
- package/dist/twilight/{p-4839d408.entry.js → p-575014c4.entry.js} +1 -1
- package/dist/twilight/{p-f10b887a.entry.js → p-5aee5e44.entry.js} +1 -1
- package/dist/twilight/{p-622bfb21.entry.js → p-619c709c.entry.js} +1 -1
- package/dist/twilight/{p-74f206cf.entry.js → p-6d572fe0.entry.js} +1 -1
- package/dist/twilight/{p-26fec98c.entry.js → p-6f84c662.entry.js} +1 -1
- package/dist/twilight/{p-4a1aa85f.entry.js → p-703b9253.entry.js} +1 -1
- package/dist/twilight/{p-509ad773.entry.js → p-73dea22d.entry.js} +1 -1
- package/dist/twilight/{p-6c7cae8a.entry.js → p-74285af9.entry.js} +1 -1
- package/dist/twilight/{p-31260fae.entry.js → p-777d28f6.entry.js} +1 -1
- package/dist/twilight/{p-4702959a.entry.js → p-7db6ccfe.entry.js} +1 -1
- package/dist/twilight/{p-e89a1905.entry.js → p-7db8d545.entry.js} +1 -1
- package/dist/twilight/{p-0c6a024f.entry.js → p-7fa4d0b6.entry.js} +1 -1
- package/dist/twilight/{p-2e8f95d0.entry.js → p-825c5b73.entry.js} +1 -1
- package/dist/twilight/{p-e5545546.entry.js → p-8262e669.entry.js} +1 -1
- package/dist/twilight/{p-bab5d057.entry.js → p-86d55a6b.entry.js} +1 -1
- package/dist/twilight/{p-0225f396.entry.js → p-8712f7c7.entry.js} +1 -1
- package/dist/twilight/{p-a53e2c74.entry.js → p-8948b58c.entry.js} +1 -1
- package/dist/twilight/{p-37b68ef3.entry.js → p-8b8cf457.entry.js} +1 -1
- package/dist/twilight/{p-8e8e40bc.entry.js → p-8c2992e7.entry.js} +1 -1
- package/dist/twilight/{p-eb160c2e.entry.js → p-8c548259.entry.js} +1 -1
- package/dist/twilight/{p-5d775867.entry.js → p-8eb3fd92.entry.js} +1 -1
- package/dist/twilight/p-908716fb.entry.js +4 -0
- package/dist/twilight/{p-62ba0971.entry.js → p-90a59027.entry.js} +1 -1
- package/dist/twilight/{p-ae9c0abe.entry.js → p-9683535f.entry.js} +1 -1
- package/dist/twilight/{p-89cff0c8.entry.js → p-982e9124.entry.js} +1 -1
- package/dist/twilight/{p-a17784e6.entry.js → p-995b898f.entry.js} +1 -1
- package/dist/twilight/{p-3a3d4cb7.entry.js → p-99cb3dba.entry.js} +1 -1
- package/dist/twilight/{p-6757344a.entry.js → p-9a0218a6.entry.js} +1 -1
- package/dist/twilight/{p-7d337f25.entry.js → p-9cf31ff4.entry.js} +1 -1
- package/dist/twilight/{p-d495cce0.entry.js → p-9d1a5007.entry.js} +1 -1
- package/dist/twilight/{p-57b93850.entry.js → p-9e429047.entry.js} +1 -1
- package/dist/twilight/{p-40083f25.entry.js → p-9e542951.entry.js} +1 -1
- package/dist/twilight/{p-Dhq3oJAe.js → p-BcT9tEVW.js} +1 -1
- package/dist/twilight/{p-Dza6OBFg.js → p-Bgu5gtOF.js} +1 -1
- package/dist/twilight/p-C9zdeQFI.js +5 -0
- package/dist/twilight/{p-BbZqYBfp.js → p-CSGj1pY-.js} +1 -1
- package/dist/twilight/{p-Nyk6-1lq.js → p-CWWgpQ8Q.js} +1 -1
- package/dist/twilight/{p-BwzmoZpm.js → p-Cfz9xit3.js} +1 -1
- package/dist/twilight/{p-iCJI7qYe.js → p-CmYSalnM.js} +1 -1
- package/dist/twilight/p-CnTwkF6y.js +4 -0
- package/dist/twilight/p-Cnh7Qptl.js +4 -0
- package/dist/twilight/{p-DVWVl151.js → p-Dav_R_d2.js} +1 -1
- package/dist/twilight/{p-B7rn1taO.js → p-JGEddAgs.js} +1 -1
- package/dist/twilight/{p-CAc7tX2K.js → p-RflSBQNB.js} +1 -1
- package/dist/twilight/{p-De2wEjqS.js → p-Xgbueas7.js} +1 -1
- package/dist/twilight/{p-64d49f5d.entry.js → p-a070cce0.entry.js} +1 -1
- package/dist/twilight/p-a0bfedad.entry.js +4 -0
- package/dist/twilight/{p-bf29daf3.entry.js → p-a22d9931.entry.js} +1 -1
- package/dist/twilight/{p-2153c6fd.entry.js → p-a3959219.entry.js} +1 -1
- package/dist/twilight/p-a3ca61af.entry.js +4 -0
- package/dist/twilight/{p-0e1248c4.entry.js → p-a55b5c44.entry.js} +1 -1
- package/dist/twilight/{p-24423a8d.entry.js → p-a5fc8358.entry.js} +1 -1
- package/dist/twilight/{p-66f6d722.entry.js → p-aabcd09f.entry.js} +1 -1
- package/dist/twilight/{p-4c801f91.entry.js → p-ad00021e.entry.js} +1 -1
- package/dist/twilight/{p-fae2a8d0.entry.js → p-ade9a68c.entry.js} +1 -1
- package/dist/twilight/{p-83ccad19.entry.js → p-b5e0065a.entry.js} +1 -1
- package/dist/twilight/{p-2a8d6e7e.entry.js → p-bbb09d92.entry.js} +1 -1
- package/dist/twilight/{p-f034968b.entry.js → p-c2df20f8.entry.js} +1 -1
- package/dist/twilight/{p-b38c38fe.entry.js → p-c4274188.entry.js} +1 -1
- package/dist/twilight/{p-d63ce284.entry.js → p-c5e2c781.entry.js} +1 -1
- package/dist/twilight/{p-07450aed.entry.js → p-c64b2b22.entry.js} +1 -1
- package/dist/twilight/{p-14752d03.entry.js → p-c92cc92f.entry.js} +1 -1
- package/dist/twilight/{p-d6c5bf2a.entry.js → p-cb54adac.entry.js} +1 -1
- package/dist/twilight/{p-7750bace.entry.js → p-ce1e45a3.entry.js} +1 -1
- package/dist/twilight/{p-e4d90663.entry.js → p-d0acd7ff.entry.js} +1 -1
- package/dist/twilight/{p-f9b9af72.entry.js → p-d0f903ac.entry.js} +1 -1
- package/dist/twilight/{p-7df4ee74.entry.js → p-d57b49ff.entry.js} +1 -1
- package/dist/twilight/p-db3efb27.entry.js +4 -0
- package/dist/twilight/{p-e81c4521.entry.js → p-db73d0bf.entry.js} +1 -1
- package/dist/twilight/{p-bfb70998.entry.js → p-e20d5e75.entry.js} +1 -1
- package/dist/twilight/{p-1982520c.entry.js → p-e223beca.entry.js} +1 -1
- package/dist/twilight/{p-20939237.entry.js → p-e37da59f.entry.js} +1 -1
- package/dist/twilight/p-e3991836.entry.js +4 -0
- package/dist/twilight/{p-fe413496.entry.js → p-e455709f.entry.js} +1 -1
- package/dist/twilight/{p-cc2c52bb.entry.js → p-e921b2d1.entry.js} +1 -1
- package/dist/twilight/{p-acd48ae7.entry.js → p-ec356e5a.entry.js} +1 -1
- package/dist/twilight/{p-7a985c8c.entry.js → p-eeefc285.entry.js} +1 -1
- package/dist/twilight/{p-120b4694.entry.js → p-f3b12754.entry.js} +1 -1
- package/dist/twilight/{p-c3c99d9e.entry.js → p-f6279a13.entry.js} +1 -1
- package/dist/twilight/{p-b819de23.entry.js → p-f83efc62.entry.js} +1 -1
- package/dist/twilight/{p-8b43035f.entry.js → p-fa622715.entry.js} +1 -1
- package/dist/twilight/{p-b87ea253.entry.js → p-faf00404.entry.js} +1 -1
- package/dist/twilight/twilight.esm.js +1 -1
- package/dist/types/components/salla-bullet-delivery/api-service.d.ts +23 -7
- package/dist/types/components/salla-bullet-delivery/helpers.d.ts +61 -6
- package/dist/types/components/salla-bullet-delivery/icons.d.ts +14 -0
- package/dist/types/components/salla-bullet-delivery/interfaces.d.ts +36 -1
- package/dist/types/components/salla-bullet-delivery/salla-bullet-delivery.d.ts +82 -3
- package/dist/types/components/salla-bullet-delivery/selector-tracker.d.ts +30 -0
- package/dist/types/components/salla-free-shipping-banner/salla-free-shipping-banner.d.ts +19 -5
- package/dist/types/components/salla-free-shipping-tag/salla-free-shipping-tag.d.ts +6 -1
- package/dist/types/components/salla-gifting/salla-gifting.d.ts +1 -0
- package/dist/types/components/salla-quick-buy/salla-quick-buy.d.ts +6 -0
- package/dist/types/components/salla-rating-modal/salla-rating-modal-v2.d.ts +1 -0
- package/dist/types/components.d.ts +11 -25
- package/dist/types/shared/free-shipping-timer.d.ts +36 -0
- package/package.json +5 -5
- package/dist/cjs/free-shipping-DkIKD6ch.js +0 -31
- package/dist/cjs/helpers-8bMfm_mm.js +0 -329
- package/dist/components/free-shipping.js +0 -29
- package/dist/esm/free-shipping-Brg4wsgg.js +0 -29
- package/dist/esm/helpers-DqzaeXrL.js +0 -309
- package/dist/twilight/p-12a8aed8.entry.js +0 -4
- package/dist/twilight/p-4f443e36.entry.js +0 -4
- package/dist/twilight/p-5b81a3d9.entry.js +0 -4
- package/dist/twilight/p-93f26336.entry.js +0 -4
- package/dist/twilight/p-Brg4wsgg.js +0 -4
- package/dist/twilight/p-DmGAR42j.js +0 -5
- package/dist/twilight/p-DqzaeXrL.js +0 -4
- package/dist/twilight/p-c7c868b4.entry.js +0 -4
- package/dist/twilight/p-d5a2ba68.entry.js +0 -4
- package/dist/twilight/p-f8ff074f.entry.js +0 -4
|
@@ -1,11 +1,115 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Crafted with ❤ by Salla
|
|
3
3
|
*/
|
|
4
|
-
import { h, r as registerInstance, c as createEvent, H as Host, a as getElement } from './index-
|
|
5
|
-
import { a as isSaudiArabia, b as bulletDeliveryAPI, r as requireRegionAndDistrictForSA,
|
|
4
|
+
import { h, r as registerInstance, c as createEvent, H as Host, a as getElement } from './index-C9zdeQFI.js';
|
|
5
|
+
import { a as isSaudiArabia, b as bulletDeliveryAPI, r as requireRegionAndDistrictForSA, c as clearBranchCache, h as hasSessionAddressIntent, g as getIntentCityId, d as getIntentCountryId, e as getIntentRegionId, f as getIntentDistrictId, j as getBranchCities, C as CACHE_TTL, k as isBranchSelectable, l as getBranchDiscountRange, m as filterBranches, n as getIntentBranchId, o as findNearestBranch, p as clearApiCache, q as getIntentSubtitle, i as isMapOriginIntent, s as isBranchVisible, t as getBranchReadinessLabel, u as groupBranchSchedule, v as getBranchWeekSchedule, w as getBranchPhoneHref, x as getBranchWhatsappHref, y as getBranchDiscount, z as formatBranchDistance, A as getBranchDirectionsHref, B as isBranchAlwaysOpen, D as formatBranchClockTime, E as getBranchReadyTodayTime, F as isBranchBusy, G as getIntentCountryCode } from './helpers-Cnh7Qptl.js';
|
|
6
6
|
import { L as Location } from './location-BO5AoBAP.js';
|
|
7
7
|
import { S as Search } from './search-BscTeWDc.js';
|
|
8
8
|
|
|
9
|
+
const SESSION_STORAGE_NAME = "sc_selector_session";
|
|
10
|
+
const TRACKING_TIMEOUT_MS = 5000;
|
|
11
|
+
const CLOSE_REASONS = {
|
|
12
|
+
closeButtonClick: "close_button",
|
|
13
|
+
backdropClick: "backdrop",
|
|
14
|
+
};
|
|
15
|
+
const toCloseReason = (reason) => CLOSE_REASONS[reason ?? ""] ?? "escape";
|
|
16
|
+
const uuid = () => typeof crypto.randomUUID === "function"
|
|
17
|
+
? crypto.randomUUID()
|
|
18
|
+
: "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => (Number(c) ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (Number(c) / 4)))).toString(16));
|
|
19
|
+
const allocatedBranchIds = (intent) => {
|
|
20
|
+
const value = intent?.allocation_headers?.["s-scope-allocation-id"] ?? intent?.branch_id;
|
|
21
|
+
const ids = String(value ?? "")
|
|
22
|
+
.split(",")
|
|
23
|
+
.map(Number)
|
|
24
|
+
.filter((id) => Number.isSafeInteger(id) && id > 0);
|
|
25
|
+
return [...new Set(ids)].sort((a, b) => a - b);
|
|
26
|
+
};
|
|
27
|
+
const sameIds = (a, b) => a.length === b.length && a.every((id) => b.includes(id));
|
|
28
|
+
class SelectorTracker {
|
|
29
|
+
constructor() {
|
|
30
|
+
this.impressionId = null;
|
|
31
|
+
this.visibleAt = 0;
|
|
32
|
+
}
|
|
33
|
+
viewed(context) {
|
|
34
|
+
this.guarded(() => {
|
|
35
|
+
this.impressionId = uuid();
|
|
36
|
+
this.visibleAt = Date.now();
|
|
37
|
+
this.send("Branch Selector Viewed", { ...context });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
dismissed(context, reason, hadAcceptedSelection) {
|
|
41
|
+
this.guarded(() => this.send("Branch Selector Dismissed", {
|
|
42
|
+
...context,
|
|
43
|
+
close_reason: reason,
|
|
44
|
+
had_accepted_selection: hadAcceptedSelection,
|
|
45
|
+
elapsed_ms: this.visibleAt ? Date.now() - this.visibleAt : 0,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
result(context, result) {
|
|
49
|
+
this.guarded(() => {
|
|
50
|
+
const session = this.session();
|
|
51
|
+
const seq = session.seq + 1;
|
|
52
|
+
const accepted = result.outcome === "accepted";
|
|
53
|
+
const firstAccepted = session.first_accepted_branch_ids ?? (accepted ? result.new_branch_ids : null);
|
|
54
|
+
// A draft or a failed attempt replaces the stored intent, so the last accepted branches live here.
|
|
55
|
+
const previous = session.last_accepted_branch_ids ?? result.previous_branch_ids;
|
|
56
|
+
this.save({
|
|
57
|
+
...session,
|
|
58
|
+
seq,
|
|
59
|
+
first_accepted_branch_ids: firstAccepted,
|
|
60
|
+
last_accepted_branch_ids: accepted ? result.new_branch_ids : previous,
|
|
61
|
+
});
|
|
62
|
+
this.send("Branch Selector Completed", {
|
|
63
|
+
...context,
|
|
64
|
+
...result,
|
|
65
|
+
previous_branch_ids: previous,
|
|
66
|
+
selection_attempt_id: uuid(),
|
|
67
|
+
selection_seq: seq,
|
|
68
|
+
first_accepted_branch_ids: firstAccepted,
|
|
69
|
+
changed: accepted && previous.length > 0 && !sameIds(previous, result.new_branch_ids),
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
guarded(track) {
|
|
74
|
+
try {
|
|
75
|
+
track();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Tracking must never break the selector.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
send(event, properties) {
|
|
82
|
+
const body = {
|
|
83
|
+
event,
|
|
84
|
+
session_id: this.session().id,
|
|
85
|
+
impression_id: this.impressionId,
|
|
86
|
+
...properties,
|
|
87
|
+
};
|
|
88
|
+
// Use the configured transport without the SDK's shared notification suppression.
|
|
89
|
+
// Tracking failures stay silent while concurrent customer requests keep their alerts.
|
|
90
|
+
// keepalive lets the request outlive the reload that follows a confirmed selection.
|
|
91
|
+
Promise.resolve(salla.api.axios.post("selector-events", body, {
|
|
92
|
+
timeout: TRACKING_TIMEOUT_MS,
|
|
93
|
+
adapter: ["fetch", "xhr"],
|
|
94
|
+
fetchOptions: { keepalive: true },
|
|
95
|
+
})).catch(() => undefined);
|
|
96
|
+
}
|
|
97
|
+
session() {
|
|
98
|
+
const stored = Salla.storage.session.get(this.storageName());
|
|
99
|
+
if (stored?.id)
|
|
100
|
+
return stored;
|
|
101
|
+
const fresh = { id: uuid(), seq: 0, first_accepted_branch_ids: null };
|
|
102
|
+
this.save(fresh);
|
|
103
|
+
return fresh;
|
|
104
|
+
}
|
|
105
|
+
storageName() {
|
|
106
|
+
return `${SESSION_STORAGE_NAME}:${Salla.config.get("store.id")}`;
|
|
107
|
+
}
|
|
108
|
+
save(session) {
|
|
109
|
+
Salla.storage.session.set(this.storageName(), session);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
9
113
|
var LocationIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 172 172" width="172" height="172">
|
|
10
114
|
<!-- White rounded background -->
|
|
11
115
|
<rect width="172" height="172" rx="64" fill="#FFFFFF"/>
|
|
@@ -170,24 +274,6 @@ var GetDirections = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none"
|
|
|
170
274
|
</svg>
|
|
171
275
|
`;
|
|
172
276
|
|
|
173
|
-
var GPS = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
174
|
-
<path
|
|
175
|
-
d="M13.3258 7.65006C13.3258 10.7797 10.7888 13.3167 7.65916 13.3167C4.52955 13.3167 1.99249 10.7797 1.99249 7.65006C1.99249 4.52045 4.52955 1.9834 7.65916 1.9834C10.7888 1.9834 13.3258 4.52045 13.3258 7.65006Z"
|
|
176
|
-
stroke="#555555" stroke-width="1.3" />
|
|
177
|
-
<path d="M14.65 7.65039H13.3167" stroke="#555555" stroke-width="1.3" stroke-linecap="round"
|
|
178
|
-
stroke-linejoin="round" />
|
|
179
|
-
<path d="M1.98336 7.65039L0.650024 7.65039" stroke="#555555" stroke-width="1.3"
|
|
180
|
-
stroke-linecap="round" stroke-linejoin="round" />
|
|
181
|
-
<path d="M7.65002 0.650065L7.65002 1.9834" stroke="#555555" stroke-width="1.3"
|
|
182
|
-
stroke-linecap="round" stroke-linejoin="round" />
|
|
183
|
-
<path d="M7.65002 13.3171L7.65002 14.6504" stroke="#555555" stroke-width="1.3"
|
|
184
|
-
stroke-linecap="round" stroke-linejoin="round" />
|
|
185
|
-
<path
|
|
186
|
-
d="M9.64999 7.65039C9.64999 8.75496 8.75456 9.65039 7.64999 9.65039C6.54542 9.65039 5.64999 8.75496 5.64999 7.65039C5.64999 6.54582 6.54542 5.65039 7.64999 5.65039C8.75456 5.65039 9.64999 6.54582 9.64999 7.65039Z"
|
|
187
|
-
stroke="#555555" stroke-width="1.3" />
|
|
188
|
-
</svg>
|
|
189
|
-
`;
|
|
190
|
-
|
|
191
277
|
var MiniMap = `<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
192
278
|
<rect x="1.90958" y="0.576577" width="30.8468" height="30.8468" rx="9.22523" style="fill:#E8E8E8" stroke="white" stroke-width="1.15315"/>
|
|
193
279
|
<path d="M17.9096 6.77445L28.7204 5.33301H32.4681L32.7564 11.8195V23.6393L10.4141 23.9276V10.8105L17.9096 6.77445Z" style="fill:#97E7C8"/>
|
|
@@ -197,23 +283,36 @@ var MiniMap = `<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns
|
|
|
197
283
|
</svg>
|
|
198
284
|
`;
|
|
199
285
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
286
|
+
/**
|
|
287
|
+
* Inline icons shared with the checkout pickup picker (Checkout-Module INV-1414), kept byte-identical
|
|
288
|
+
* so both surfaces render the same glyphs.
|
|
289
|
+
*/
|
|
290
|
+
/** Checkout `LightningIcon.vue` — the "save delivery fees" pickup-tab badge. */
|
|
291
|
+
const LightningIcon = `<svg width="7" height="10" viewBox="0 0 7 10" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5.41015 0.036C5.73815 0.084 5.96415 0.222 6.08815 0.45C6.21215 0.678 6.21415 0.952 6.09415 1.272C6.03815 1.432 5.89415 1.72 5.66215 2.136L5.13415 3.108C5.03015 3.308 4.96215 3.44 4.93015 3.504C4.91415 3.544 4.90215 3.576 4.89415 3.6C4.89415 3.656 4.91815 3.7 4.96615 3.732C4.99015 3.74 5.02615 3.748 5.07415 3.756H5.51815C5.79815 3.756 5.99015 3.76 6.09415 3.768C6.30215 3.784 6.45815 3.832 6.56215 3.912C6.70615 4.008 6.81215 4.138 6.88015 4.302C6.94815 4.466 6.97015 4.636 6.94615 4.812C6.93015 4.948 6.85815 5.1 6.73015 5.268C6.66615 5.356 6.53815 5.508 6.34615 5.724L3.65815 8.82C3.35415 9.172 3.14815 9.398 3.04015 9.498C2.93215 9.598 2.83415 9.664 2.74615 9.696C2.58615 9.768 2.43415 9.766 2.29015 9.69C2.14615 9.614 2.05415 9.488 2.01415 9.312C1.99815 9.208 1.99615 9.08 2.00815 8.928C2.02015 8.776 2.07415 8.472 2.17015 8.016L2.50615 6.432C2.57815 6.104 2.61815 5.888 2.62615 5.784C2.63415 5.728 2.62215 5.686 2.59015 5.658C2.55815 5.63 2.52615 5.612 2.49415 5.604C2.39815 5.588 2.18615 5.58 1.85815 5.58H1.60615C1.19815 5.58 0.918154 5.568 0.766154 5.544C0.462154 5.504 0.246154 5.38 0.118154 5.172C-0.00984615 4.964 -0.0338462 4.704 0.0461538 4.392C0.0861538 4.24 0.190154 3.968 0.358154 3.576L1.25815 1.464C1.41015 1.112 1.51815 0.872 1.58215 0.744C1.71015 0.512 1.85815 0.34 2.02615 0.228C2.19415 0.116 2.40215 0.048 2.65015 0.024C2.79415 0.008 3.05415 0 3.43015 0H4.47415C4.93815 0 5.25015 0.012 5.41015 0.036Z" fill="white"/></svg>`;
|
|
292
|
+
/** Pickup-instructions line on the branch card (design-provided). */
|
|
293
|
+
const NotesIcon = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.58709 4.67775L11.769 5.52554M7.90501 7.20895L9.49598 7.63284M7.98415 11.9777L8.62054 12.1472C10.4205 12.6268 11.3205 12.8666 12.0295 12.4595C12.7385 12.0525 12.9797 11.1576 13.462 9.36777L14.1441 6.83657C14.6264 5.04674 14.8675 4.15183 14.4582 3.44681C14.0488 2.7418 13.1488 2.50201 11.3489 2.02242L10.7125 1.85287C8.91249 1.37328 8.0125 1.13349 7.30349 1.54053C6.59447 1.94757 6.35332 2.84249 5.87102 4.63231L5.18894 7.16351C4.70664 8.95334 4.46549 9.84825 4.87484 10.5533C5.28419 11.2583 6.18418 11.4981 7.98415 11.9777Z" stroke="#555555" stroke-width="1.125" stroke-linecap="round"/><path d="M8.00016 13.964L7.36527 14.1369C5.56952 14.6259 4.67164 14.8704 3.96429 14.4554C3.25694 14.0404 3.01636 13.1279 2.53519 11.303L1.85471 8.72211C1.37354 6.89717 1.13295 5.98471 1.54134 5.26586C1.89461 4.64404 2.66683 4.66668 3.66683 4.66661" stroke="#555555" stroke-width="1.125" stroke-linecap="round"/></svg>`;
|
|
294
|
+
/** Pickup-availability (preparation time) line on the branch card (design-provided). */
|
|
295
|
+
const PickupAvailabilityIcon = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="8.00016" cy="8.00004" r="6.66667" stroke="#555555" stroke-width="1.125"/><path d="M8 5.33337V8.00004L9.33333 9.33337" stroke="#555555" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
296
|
+
/** Working-hours (open/closed status) line on the branch card (design-provided). */
|
|
297
|
+
const WorkingHoursIcon = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.00014 14.6667C4.31824 14.6667 1.3335 11.6819 1.3335 8.00004C1.3335 4.31814 4.31826 1.33337 8.00016 1.33337C10.9853 1.33337 13.484 3.2953 14.3335 6.00004H12.6668" stroke="#666666" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/><path d="M8 5.33337V8.00004L9.33333 9.33337" stroke="#666666" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/><path d="M14.6367 8.66667C14.6565 8.44724 14.6667 8.22486 14.6667 8M10 14.6667C10.2277 14.5917 10.4502 14.5043 10.6667 14.4052M13.8604 11.3333C13.989 11.0856 14.1036 10.8288 14.2034 10.5641M12.1283 13.4862C12.358 13.2961 12.5754 13.0905 12.7792 12.871" stroke="#666666" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/></svg>`;
|
|
298
|
+
/** Location (country, city, district) line on the branch card (design-provided). */
|
|
299
|
+
const BranchLocationIcon = `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="8.00016" cy="4.66667" r="2.66667" stroke="#555555" stroke-width="1.125"/><path d="M8 7.33337L8 12" stroke="#555555" stroke-width="1.125" stroke-linecap="round"/><path d="M11.3332 12.6666C11.3332 13.403 9.84079 14 7.99984 14C6.15889 14 4.6665 13.403 4.6665 12.6666" stroke="#555555" stroke-width="1.125" stroke-linecap="round"/></svg>`;
|
|
212
300
|
|
|
213
|
-
const sallaBulletDeliveryCss = "/*!twlt*/@charset \"UTF-8\";@supports (interpolate-size: allow-keywords) and (block-size: calc-size(auto, size)){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body,.s-bullet-delivery-inner{interpolate-size:allow-keywords}.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{overflow:clip;transition:block-size 500ms ease}.s-bullet-delivery-inner{overflow:clip;transition:block-size 500ms ease;block-size:calc-size(auto, size)}}@media screen and (min-width: 640px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body:has(.s-searchable-dropdown--open){overflow:visible !important}}.s-bullet-delivery-form-actions.s-bullet-delivery-form-actions--single{padding-bottom:0;flex-direction:column;gap:0}.s-bullet-delivery-addresses-list.s-scrollbar::-webkit-scrollbar-track,.s-bullet-delivery-branches-list.s-scrollbar::-webkit-scrollbar-track{background-color:transparent}.s-bullet-delivery-back-to-list-link{display:inline-flex;align-items:center;justify-content:center;gap:2px;width:100%;margin-top:12px;background:none;border:none;color:var(--color-primary, #004956);font-size:14px;font-weight:500;cursor:pointer;padding:0}.s-bullet-delivery-back-to-list-link i{font-size:12px}.first-letter-cap::first-letter{text-transform:uppercase}.s-bullet-delivery-location-permission-btn{display:flex;align-items:center;gap:10px;width:100%;padding:12px;border:none;border-radius:8px;background:#fdf2f2;cursor:pointer;text-align:start}.s-bullet-delivery-location-permission-icon{display:inline-flex;flex-shrink:0;width:34px;height:34px}.s-bullet-delivery-location-permission-icon svg{width:100%;height:100%}.s-bullet-delivery-location-permission-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:#444}.s-bullet-delivery-location-permission-arrow{flex-shrink:0;font-size:16px;color:#666}.s-bullet-delivery-location-distance-warning{display:flex;align-items:center;gap:10px;width:100%;padding:12px;border-radius:8px;background:#fff8e1;animation:s-bullet-delivery-fade-in 200ms ease}.s-bullet-delivery-location-distance-warning-icon{display:inline-flex;flex-shrink:0;width:34px;height:34px}.s-bullet-delivery-location-distance-warning-icon svg{width:100%;height:100%}.s-bullet-delivery-location-distance-warning-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:#444}.s-bullet-delivery-map-container{width:100%;height:320px;border-radius:8px;overflow:hidden;margin-bottom:12px}.s-bullet-delivery-map-container gmap-map{display:block;width:100%;height:100%}.s-bullet-delivery-address-confirm{display:flex;flex-direction:column;gap:20px;animation:s-bullet-delivery-fade-in 200ms ease}.s-bullet-delivery-address-confirm-card{display:flex;align-items:center;gap:12px;border:1px solid #eee;border-radius:6px;padding:12px}.s-bullet-delivery-address-map-icon{overflow:hidden;border-radius:9px}.s-bullet-delivery-address-confirm-details{display:flex;flex-direction:column;align-items:flex-start;flex:1;min-width:0}.s-bullet-delivery-address-confirm-label{font-size:12px;line-height:16px;color:#666}.s-bullet-delivery-address-confirm-text{font-size:14px;font-weight:700;color:#333;margin:0;word-break:break-word}.s-bullet-delivery-address-confirm-description{display:flex;flex-direction:column;gap:8px}.s-bullet-delivery-address-confirm-description-label{font-size:14px;font-weight:500;color:#444}.s-bullet-delivery-address-confirm-description-optional{font-weight:400;color:#999;margin-inline-start:4px}.s-bullet-delivery-address-confirm-description-input{width:100%;border:1px solid #eee;border-radius:8px;padding:10px 12px;font-size:14px;margin-bottom:16px}.s-bullet-delivery-login-prompt{display:block;width:100%;text-align:center;background:none;border:none;color:var(--color-primary, #004956);font-size:14px;font-weight:500;cursor:pointer;padding:12px 0}@keyframes s-bullet-delivery-fade-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.branch-status-badge{display:inline-flex;align-items:center;justify-content:center;padding:2px 6px;max-height:20px;border-radius:20px;font-size:9px;font-weight:500;border:1px solid transparent;white-space:nowrap}.branch-status-badge.green{color:#43a047;background:#e8f5e9;border-color:#43a047}.branch-status-badge.blue{color:#1e88e5;background:#e3f2fd;border-color:#1e88e5}.branch-status-badge.red{color:#e53935;background:#fdf2f2;border-color:#e53935}.branch-status-badge.yellow{color:#f9a825;background:#fff8e1;border-color:#f9a825}.branch-status-badge.gray{color:#757575;background:#f5f5f5;border-color:#757575}.branch-status-badge.brown{color:#6d4c41;background:#efebe9;border-color:#6d4c41}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}.visible{visibility:visible}.static{position:static}.mb-1{margin-bottom:0.25rem}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.resize{resize:both}.flex-col{flex-direction:column}.items-center{align-items:center}.gap-1{gap:0.25rem}.text-start{text-align:start}.\\!text-blue-600{--tw-text-opacity:1 !important;color:rgb(37 99 235 / var(--tw-text-opacity, 1)) !important}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-hidden{display:none}.form-input{height:2.5rem;width:100%;border-radius:0.375rem;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.form-input:focus{border-color:var(--color-primary);--tw-ring-color:transparent}.form-input:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.form-input:focus:is(.dark *){border-color:var(--color-primary)}@media (min-width: 640px){.form-input{font-size:0.875rem;line-height:1.25rem}}.\\!btn{display:inline-flex;flex:1 1 0%;align-items:center;justify-content:center;white-space:nowrap;border-radius:0.375rem;padding-left:1.5rem;padding-right:1.5rem;padding-bottom:0.625rem;padding-top:0.5rem;font-size:0.875rem;line-height:1.25rem;font-weight:700;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.\\!btn:hover{opacity:0.8}.btn{display:inline-flex;flex:1 1 0%;align-items:center;justify-content:center;white-space:nowrap;border-radius:0.375rem;padding-left:1.5rem;padding-right:1.5rem;padding-bottom:0.625rem;padding-top:0.5rem;font-size:0.875rem;line-height:1.25rem;font-weight:700;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.btn:hover{opacity:0.8}.spinner-loader.reverse{border-right-color:#9f7171 !important;background-color:#f98181}.s-hidden{display:none}.s-scrollbar::-webkit-scrollbar{width:5px}.s-scrollbar::-webkit-scrollbar-track{background-color:#eee}.s-scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-primary);border-radius:10px;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;-o-border-radius:10px}.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{padding:0px}@media (min-width: 768px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{max-height:70dvh;overflow-y:auto}}@media (min-width: 640px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body:has(.s-searchable-dropdown--open){overflow:visible !important}}.s-bullet-delivery-inner{min-block-size:0}.s-bullet-delivery-header{margin-bottom:1.5rem;text-align:start}.s-bullet-delivery-title{display:block;font-size:1.25rem;line-height:1.75rem;font-weight:700;color:var(--color-primary-dark)}.s-bullet-delivery-subtitle{margin-top:0.25rem;display:block;font-size:0.875rem;line-height:1.25rem;color:var(--color-primary-dark)}.s-bullet-delivery-tabs{margin-bottom:1.5rem;display:flex;gap:0.5rem}.s-bullet-delivery-tab{display:flex;flex:1 1 0%;cursor:pointer;align-items:center;gap:1rem;border-radius:0.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-top:0.5rem;padding-bottom:0.5rem;padding-left:0.75rem;padding-right:0.75rem;font-size:0.875rem;line-height:1.25rem;font-weight:500;color:var(--color-primary-dark);transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:200ms}.s-bullet-delivery-tab:hover{background-color:color-mix(in srgb,var(--color-primary) 5%,transparent)}.s-bullet-delivery-tab--active{border-color:var(--color-primary-dark)}.s-bullet-delivery-tab svg{height:0.875rem;width:0.875rem;color:var(--color-primary-dark)}.s-bullet-delivery-tab-icon{display:flex;height:2rem;width:2rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-allocation-out-of-coverage{margin-bottom:1rem;display:flex;width:100%;align-items:center;gap:0.5rem;--tw-bg-opacity:1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1));padding-top:0.75rem;padding-bottom:0.75rem;padding-left:1rem;padding-right:1rem;text-align:end;--tw-text-opacity:1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.s-bullet-delivery-allocation-out-of-coverage:where([dir=\"ltr\"],[dir=\"ltr\"] *){border-left-width:4px;border-left-color:rgb(239 68 68 / 0.5)}.s-bullet-delivery-allocation-out-of-coverage:where([dir=\"rtl\"],[dir=\"rtl\"] *){border-right-width:4px;border-right-color:rgb(239 68 68 / 0.5)}.s-bullet-delivery-allocation-out-of-coverage-text{font-size:0.875rem;line-height:1.25rem;line-height:1.4}.s-bullet-delivery-allocation-out-of-coverage-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;--tw-text-opacity:1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.s-bullet-delivery-content{margin-bottom:1.5rem;display:grid;gap:1rem}.s-bullet-delivery-content--active{animation:s-bullet-delivery-fade-in 220ms ease-out}.s-bullet-delivery-label{margin-bottom:0.5rem;display:block;font-size:0.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity:1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.s-bullet-delivery-error{margin-top:0.25rem;display:block;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.s-bullet-delivery-footer{display:grid;gap:0.75rem;text-align:center}.s-bullet-delivery-placeholder{margin-top:1rem;margin-bottom:1rem}.s-bullet-delivery-placeholder.s-placeholder-wrapper{margin-top:1rem !important;margin-bottom:1rem !important}.s-bullet-delivery-label-content{display:inline-flex;align-items:center;gap:0.5rem}.s-bullet-delivery-select-loader{display:inline-flex;align-items:center;--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.s-bullet-delivery-search-row{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:0.5rem;padding-left:1px;padding-right:1px}.s-bullet-delivery-search-row .s-bullet-delivery-search{min-width:0px;flex:1 1 0%}.s-bullet-delivery-search-row .s-bullet-delivery-location-btn{width:auto;flex-shrink:0}.s-bullet-delivery-field-row{margin-bottom:1rem;display:flex;gap:1rem}.s-bullet-delivery-field-row .s-bullet-delivery-field{margin-bottom:0px;flex:1 1 0%}.s-bullet-delivery-saved-addresses-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.s-bullet-delivery-saved-addresses-empty-icon{margin-bottom:0.75rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-saved-addresses-empty-icon svg{height:2rem;width:2rem}.s-bullet-delivery-saved-addresses-empty-title{margin-bottom:0.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:700;--tw-text-opacity:1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.s-bullet-delivery-saved-addresses-empty-desc{margin-bottom:1.5rem;max-width:24rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-addresses-list{position:relative;display:flex;max-height:260px;flex-direction:column;overflow-y:auto;border-radius:0.75rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}@media (min-width: 768px){.s-bullet-delivery-addresses-list{max-height:220px}}.s-bullet-delivery-address-item{display:flex;cursor:pointer;flex-direction:row;align-items:center;gap:0.75rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.875rem;padding-bottom:0.875rem;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-address-item:not(.s-bullet-delivery-address-item--disabled):hover{background-color:rgb(249 250 251 / 0.5)}.s-bullet-delivery-address-item--selected{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-address-item--disabled{cursor:not-allowed;opacity:0.6}.s-bullet-delivery-address-item--skeleton{display:flex;cursor:default;align-items:center;gap:0.75rem;border-radius:0.75rem;border-width:1px;border-bottom-width:0px;--tw-border-opacity:1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:1rem;padding-bottom:1rem}.s-bullet-delivery-address-item--skeleton .s-bullet-delivery-address-lines{gap:0.5rem}.s-bullet-delivery-address-content{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;justify-content:center;text-align:start}.s-bullet-delivery-address-lines{display:flex;flex-direction:column;gap:0.125rem}.s-bullet-delivery-address-line1{display:block;font-size:1rem;line-height:1.5rem;font-weight:400;line-height:1.375;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-address-line2{display:block;font-size:0.875rem;line-height:1.25rem;line-height:1.375;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-address-map-icon{display:grid;height:2.5rem;width:2.5rem;place-content:center}.s-bullet-delivery-address-map-icon svg{height:100%;width:100%}.s-bullet-delivery-skel-radio{flex-shrink:0;border-radius:9999px}.s-bullet-delivery-skel-map{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-search{position:relative;flex:1 1 0%}.s-bullet-delivery-search-icon{pointer-events:none;position:absolute;top:0px;bottom:0px;left:0px;display:flex;align-items:center;padding-left:0.75rem}.s-bullet-delivery-search-icon:where([dir=\"rtl\"],[dir=\"rtl\"] *){left:auto;right:0px;padding-left:0px;padding-right:0.75rem}.s-bullet-delivery-search-icon svg{height:0.875rem;width:0.875rem;stroke:var(--color-primary)}.s-bullet-delivery-branch-search-wrap{display:flex;min-height:40px;min-width:0px;flex:1 1 0%;flex-direction:row;align-items:stretch;overflow:hidden;border-radius:0.375rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.s-bullet-delivery-branch-search-wrap:focus-within{border-color:var(--color-primary-dark);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);--tw-ring-color:var(--color-primary-dark)}.s-bullet-delivery-branch-search-icon{pointer-events:none;position:static;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding-inline-start:0.5rem;--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-search-icon svg{height:1.25rem;width:1.25rem}.s-bullet-delivery-branch-search-input{min-height:40px;min-width:0px;flex:1 1 0%;border-radius:0px;border-style:none;background-color:transparent;padding-top:0.5rem;padding-bottom:0.5rem;padding-inline-end:0.75rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.s-bullet-delivery-branch-search-input::placeholder{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-search-input:focus{outline:2px solid transparent;outline-offset:2px;border:none;box-shadow:none;--tw-ring-shadow:none}.s-bullet-delivery-location-btn{display:flex;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;gap:0.5rem;border-radius:0.5rem;border-width:1px;padding-left:1rem;padding-right:1rem;padding-top:0.5rem;padding-bottom:0.5rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(55 65 81 / var(--tw-text-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-location-btn:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-location-btn:disabled{cursor:not-allowed;opacity:0.5}.s-bullet-delivery-location-btn--full{min-height:40px}.s-bullet-delivery-location-btn--loading{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-location-icon{height:0.875rem;width:0.875rem;flex-shrink:0}.s-bullet-delivery-location-icon svg{height:100%;width:100%}.s-bullet-delivery-branches-wrap{overflow:hidden}.s-bullet-delivery-branches-list{position:relative;max-height:min(260px, 32svh);overflow-y:auto;border-radius:0.5rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (min-width: 768px){.s-bullet-delivery-branches-list{max-height:220px}}.s-bullet-delivery-branches-loading{overflow:hidden;border-radius:0.5rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-info{display:flex;max-width:6.25rem;flex-direction:column;gap:0.125rem}.s-bullet-delivery-branch-name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow-wrap:break-word;font-size:0.875rem;line-height:1.25rem;font-weight:500;line-height:1.375;--tw-text-opacity:1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-prep{text-align:start;font-size:0.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-time{font-size:0.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-time:where([dir=\"ltr\"],[dir=\"ltr\"] *){text-align:end}.s-bullet-delivery-branch-time:where([dir=\"rtl\"],[dir=\"rtl\"] *){text-align:start}.s-bullet-delivery-branch-map-link{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:0.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:0.5rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));text-decoration-line:none;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-branch-map-link:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-item>.s-bullet-delivery-branch-map-link{position:relative;z-index:10;pointer-events:auto}.s-bullet-delivery-branch-map-link-icon{display:flex;height:0.875rem;width:0.875rem;align-items:center;justify-content:center}.s-bullet-delivery-branch-map-link-icon svg{height:100%;width:100%}.s-bullet-delivery-branch-skeleton-title{max-width:100%}.s-bullet-delivery-branch-skeleton-time{justify-self:end}.s-bullet-delivery-branch-item{display:grid;min-width:0px;cursor:pointer;align-items:center;gap:0.5rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;text-align:end;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;grid-template-columns:auto auto auto 1fr auto}.s-bullet-delivery-branch-item:last-child{border-bottom-width:0px}.s-bullet-delivery-branch-item:hover:not(.s-bullet-delivery-branch-item--disabled){--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-item--selected{background-color:color-mix(in srgb,var(--color-primary) 5%,transparent)}.s-bullet-delivery-branch-item--disabled{cursor:not-allowed;opacity:0.5}.s-bullet-delivery-branch-icon{display:grid;place-content:center;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));stroke:var(--color-primary-dark);padding:0.625rem;color:var(--color-primary-dark)}.s-bullet-delivery-branch-icon span{display:block;height:0.875rem;width:0.875rem}.s-bullet-delivery-branch-icon span svg{height:100%;width:100%}.s-bullet-delivery-branch-skeleton{display:grid;min-width:0px;align-items:center;gap:0.5rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;grid-template-columns:auto auto auto 1fr auto}.s-bullet-delivery-branch-skeleton:last-child{border-bottom-width:0px}.s-bullet-delivery-branch-skeleton-radio{flex-shrink:0}.s-bullet-delivery-branch-skeleton-icon{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-branch-skeleton-icon salla-skeleton{display:block}.s-bullet-delivery-branch-skeleton-map{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-branch-skeleton-map salla-skeleton{display:block}.s-bullet-delivery-branch-skeleton-content{display:flex;min-width:0px;flex-direction:column;gap:0.5rem;overflow:hidden}.s-bullet-delivery-branch-skeleton-content salla-skeleton{min-width:0px;max-width:100%}.s-bullet-delivery-radio{margin-top:2px;height:1rem;width:1rem;flex-shrink:0;cursor:pointer;appearance:none;border-radius:9999px;border-width:2px;--tw-border-opacity:1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-radio:checked{border-color:var(--color-primary-dark);background:radial-gradient(circle,#fff 0,#fff 22%,var(--color-primary) 22%)}.s-bullet-delivery-radio:focus{outline:2px solid transparent;outline-offset:2px}.s-bullet-delivery-radio:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);--tw-ring-color:var(--color-primary-dark);--tw-ring-offset-width:2px}.s-bullet-delivery-skeleton{box-sizing:border-box;min-width:0px;max-width:100%;overflow:hidden;padding:1.25rem}.s-bullet-delivery-skeleton salla-skeleton{min-width:0px;max-width:100%}.s-bullet-delivery-skeleton-header{margin-bottom:1.5rem;display:flex;min-width:0px;max-width:100%;flex-direction:column;align-items:flex-start;gap:0.75rem}.s-bullet-delivery-skeleton-title{display:block;max-width:100%}.s-bullet-delivery-skeleton-subtitle{display:block;max-width:100%}.s-bullet-delivery-skeleton-tabs{margin-bottom:1.5rem;display:grid;min-width:0px;max-width:100%;grid-template-columns:repeat(2, minmax(0, 1fr));gap:0.5rem}.s-bullet-delivery-skeleton-tabs--single{grid-template-columns:repeat(1, minmax(0, 1fr))}.s-bullet-delivery-skeleton-tab{display:flex;align-items:center;gap:1rem;border-radius:0.75rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.s-bullet-delivery-skeleton-tab-icon{display:block;max-width:100%}.s-bullet-delivery-skeleton-tab-label{display:block;max-width:100%}.s-bullet-delivery-skeleton-field-label{display:block;max-width:100%}.s-bullet-delivery-skeleton-field-control{display:block;max-width:100%}.s-bullet-delivery-skeleton-content{margin-bottom:1.5rem;display:grid;min-width:0px;max-width:100%;gap:1rem}.s-bullet-delivery-skeleton-field{display:flex;min-width:0px;max-width:100%;flex-direction:column;align-items:flex-start;gap:0.5rem}.s-bullet-delivery-skeleton-footer{min-width:0px;max-width:100%}.s-bullet-delivery-add-address-header{margin-bottom:1.5rem;display:flex;align-items:center;justify-content:space-between;gap:0.75rem}.s-bullet-delivery-add-address-title{display:flex;width:100%;flex:1 1 0%;cursor:pointer;align-items:center;border-style:none;background-color:transparent;padding:0px;text-align:start;font-size:1.125rem;line-height:1.75rem;font-weight:700;color:var(--color-primary)}.s-bullet-delivery-add-address svg{height:2.5rem;width:2.5rem;fill:currentColor}.s-bullet-delivery-allocation-out-of-coverage-icon svg{height:1.25rem;width:1.25rem}.s-bullet-delivery-add-address-form{display:grid;gap:1rem}.s-bullet-delivery-add-address-submit{width:100%}.s-bullet-delivery-form-actions{display:flex;gap:0.75rem;border-top-width:1px;--tw-border-opacity:1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));padding-top:1rem}.s-bullet-delivery-form-actions salla-button{flex:1 1 0%}.s-bullet-delivery-form-actions--single{border-top-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-top:1.25rem}.s-bullet-delivery-form-actions--single salla-button{width:100%;flex:1 1 0%}.s-bullet-delivery-market-warning-overlay{position:fixed;inset:0px;z-index:60;display:flex;align-items:center;justify-content:center;background-color:rgb(0 0 0 / 0.5)}.s-bullet-delivery-market-warning{margin-left:1rem;margin-right:1rem;width:100%;max-width:24rem;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1.5rem;--tw-shadow:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.s-bullet-delivery-market-warning-title{margin-bottom:0.75rem;font-size:1.125rem;line-height:1.75rem;font-weight:700;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-market-warning-message{margin-bottom:1.5rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-market-warning-actions{display:flex;gap:0.75rem}.s-bullet-delivery-market-warning-actions salla-button{flex:1 1 0%}.s-bullet-delivery-cart-view{margin-bottom:1rem;display:flex;align-items:center;justify-content:space-between;gap:1rem;border-radius:0.75rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem}.s-bullet-delivery-cart-view-info{display:flex;min-width:0px;flex:1 1 0%;align-items:center;gap:0.75rem}.s-bullet-delivery-cart-view-text{display:flex;flex-direction:column;text-align:start}.s-bullet-delivery-cart-view-title{font-size:1rem;line-height:1.5rem;font-weight:600;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-cart-view-subtitle{font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));margin-block-start:0.125rem}.s-bullet-delivery-cart-view-icon{display:flex;height:3.5rem;width:3.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));color:var(--color-primary-dark)}.s-bullet-delivery-cart-view-icon svg{height:1.25rem;width:1.25rem;stroke:currentColor}.s-bullet-delivery-cart-view-button{flex-shrink:0;align-self:center}.s-bullet-delivery-location-permission-btn{display:flex;width:100%;cursor:pointer;align-items:center;gap:0.625rem;border-radius:0.5rem;border-width:0px;padding:0.75rem;text-align:start;background:#fdf2f2}.s-bullet-delivery-location-permission-icon{display:inline-flex;height:34px;width:34px;flex-shrink:0}.s-bullet-delivery-location-permission-icon svg{height:100%;width:100%}.s-bullet-delivery-location-permission-text{min-width:0px;flex:1 1 0%;font-size:0.75rem;line-height:1rem;line-height:18px;--tw-text-opacity:1;color:rgb(68 68 68 / var(--tw-text-opacity, 1))}.s-bullet-delivery-location-permission-arrow{flex-shrink:0;font-size:1rem;line-height:1.5rem;--tw-text-opacity:1;color:rgb(102 102 102 / var(--tw-text-opacity, 1))}.s-bullet-delivery-location-distance-warning{display:flex;width:100%;animation:s-bullet-delivery-fade-in 200ms ease;align-items:center;gap:0.625rem;border-radius:0.5rem;padding:0.75rem;background:#fff8e1}.s-bullet-delivery-location-distance-warning-icon{display:inline-flex;height:34px;width:34px;flex-shrink:0}.s-bullet-delivery-location-distance-warning-icon svg{height:100%;width:100%}.s-bullet-delivery-location-distance-warning-text{min-width:0px;flex:1 1 0%;font-size:0.75rem;line-height:1rem;line-height:18px;--tw-text-opacity:1;color:rgb(68 68 68 / var(--tw-text-opacity, 1))}";
|
|
301
|
+
const sallaBulletDeliveryCss = "/*!twlt*/@charset \"UTF-8\";@supports (interpolate-size: allow-keywords) and (block-size: calc-size(auto, size)){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body,.s-bullet-delivery-inner{interpolate-size:allow-keywords}.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{overflow:clip;transition:block-size 500ms ease}.s-bullet-delivery-inner{overflow:clip;transition:block-size 500ms ease;block-size:calc-size(auto, size)}}@media screen and (min-width: 640px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body:has(.s-searchable-dropdown--open){overflow:visible !important}}.s-bullet-delivery-form-actions.s-bullet-delivery-form-actions--single{padding-bottom:0;flex-direction:column;gap:0}.s-bullet-delivery-addresses-list.s-scrollbar::-webkit-scrollbar-track,.s-bullet-delivery-branches-list.s-scrollbar::-webkit-scrollbar-track{background-color:transparent}.s-bullet-delivery-back-to-list-link{display:inline-flex;align-items:center;justify-content:center;gap:2px;width:100%;margin-top:12px;background:none;border:none;color:var(--color-primary, #004956);font-size:14px;font-weight:500;cursor:pointer;padding:0}.s-bullet-delivery-back-to-list-link i{font-size:12px}.s-bullet-delivery-location-permission-btn{display:flex;align-items:center;gap:10px;width:100%;padding:12px;border:none;border-radius:8px;background:#fdf2f2;cursor:pointer;text-align:start}.s-bullet-delivery-location-permission-icon{display:inline-flex;flex-shrink:0;width:34px;height:34px}.s-bullet-delivery-location-permission-icon svg{width:100%;height:100%}.s-bullet-delivery-location-permission-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:#444}.s-bullet-delivery-location-permission-arrow{flex-shrink:0;font-size:16px;color:#666}.s-bullet-delivery-location-distance-warning{display:flex;align-items:center;gap:10px;width:100%;padding:12px;border-radius:8px;background:#fff8e1;animation:s-bullet-delivery-fade-in 200ms ease}.s-bullet-delivery-location-distance-warning-icon{display:inline-flex;flex-shrink:0;width:34px;height:34px}.s-bullet-delivery-location-distance-warning-icon svg{width:100%;height:100%}.s-bullet-delivery-location-distance-warning-text{flex:1;min-width:0;font-size:12px;line-height:18px;color:#444}.s-bullet-delivery-map-container{width:100%;height:320px;border-radius:8px;overflow:hidden;margin-bottom:12px}.s-bullet-delivery-map-container gmap-map{display:block;width:100%;height:100%}.s-bullet-delivery-address-confirm{display:flex;flex-direction:column;gap:20px;animation:s-bullet-delivery-fade-in 200ms ease}.s-bullet-delivery-address-confirm-card{display:flex;align-items:center;gap:12px;border:1px solid #eee;border-radius:6px;padding:12px}.s-bullet-delivery-address-map-icon{overflow:hidden;border-radius:9px}.s-bullet-delivery-address-confirm-details{display:flex;flex-direction:column;align-items:flex-start;flex:1;min-width:0}.s-bullet-delivery-address-confirm-label{font-size:12px;line-height:16px;color:#666}.s-bullet-delivery-address-confirm-text{font-size:14px;font-weight:700;color:#333;margin:0;word-break:break-word}.s-bullet-delivery-address-confirm-description{display:flex;flex-direction:column;gap:8px}.s-bullet-delivery-address-confirm-description-label{font-size:14px;font-weight:500;color:#444}.s-bullet-delivery-address-confirm-description-optional{font-weight:400;color:#999;margin-inline-start:4px}.s-bullet-delivery-address-confirm-description-input{width:100%;border:1px solid #eee;border-radius:8px;padding:10px 12px;font-size:14px;margin-bottom:16px}.s-bullet-delivery-login-prompt{display:block;width:100%;text-align:center;background:none;border:none;color:var(--color-primary, #004956);font-size:14px;font-weight:500;cursor:pointer;padding:12px 0}@keyframes s-bullet-delivery-fade-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@media (min-width: 640px){.s-bullet-delivery-modal .s-modal-sm{width:90vw !important;max-width:776px !important}}.s-bullet-delivery-modal .s-bullet-delivery-tabs{gap:4px;padding:4px;border-radius:12px;background:#f5f5f5}.s-bullet-delivery-modal .s-bullet-delivery-tab{justify-content:center;gap:8px;min-height:40px;border:0;border-radius:8px;background:transparent;color:#666;font-size:14px}.s-bullet-delivery-modal .s-bullet-delivery-tab:hover{background:transparent;color:var(--color-text, #333)}.s-bullet-delivery-modal .s-bullet-delivery-tab--active,.s-bullet-delivery-modal .s-bullet-delivery-tab--active:hover{background:#fff;color:#1a1a1a;font-weight:600;box-shadow:0 1px 2px rgba(0, 0, 0, 0.06)}.s-bullet-delivery-modal .s-bullet-delivery-tab-badge{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;padding:4px 8px;border-radius:8px;font-size:11px;font-weight:600;line-height:120%;white-space:nowrap;color:#fff;background:#5196f3}.s-bullet-delivery-modal .s-bullet-delivery-discount-badge{display:inline-flex;align-items:center;flex:0 0 auto;padding:4px 8px;border-radius:6px;font-size:12px;font-weight:600;line-height:120%;white-space:nowrap;color:#fff;background:#e5484d}.s-bullet-delivery-modal .s-bullet-delivery-tab-badge-icon{display:inline-flex}.s-bullet-delivery-modal .s-bullet-delivery-tab-badge-icon svg{width:7px;height:10px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters{display:flex;flex-direction:column;gap:12px;padding:16px;border-radius:12px;background:#fafafa}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-field{margin:0}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters-row{display:flex;gap:12px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters-row>.s-bullet-delivery-field{flex:1;min-width:0}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters{}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-branch-search-wrap{min-height:40px;border-color:#ddd;border-radius:8px;background:#fff}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-branch-search-input{font-size:14px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-btn{height:40px;min-height:40px;padding:0 14px;gap:4px;border:1px solid var(--color-primary);border-radius:8px;background:#fff;color:#1a1a1a;font-size:14px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-btn:hover{background:#fff}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-icon{display:inline-flex}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-icon svg{width:16px;height:16px}.s-bullet-delivery-modal .s-bullet-delivery-branches-list{display:flex;flex-direction:column;gap:16px;max-height:min(400px, 45svh);border:0;border-radius:0;background:transparent}.s-bullet-delivery-modal .s-bullet-delivery-branch-item{display:grid;grid-template-columns:auto minmax(0, 1fr) auto;align-items:start;column-gap:12px;row-gap:2px;padding:16px;border:1px solid #eee;border-radius:12px;background:#fff;text-align:start;transition:border-color 0.2s}.s-bullet-delivery-modal .s-bullet-delivery-branch-item:last-child{border-bottom:1px solid #eee}.s-bullet-delivery-modal .s-bullet-delivery-branch-item:hover:not(.s-bullet-delivery-branch-item--disabled){background:#fff}.s-bullet-delivery-modal .s-bullet-delivery-branch-item--selected,.s-bullet-delivery-modal .s-bullet-delivery-branch-item--selected:last-child{border-color:var(--color-primary);background:#fff}.s-bullet-delivery-modal .s-bullet-delivery-branch-item--disabled{opacity:0.5}.s-bullet-delivery-modal .s-bullet-delivery-branch-radio{grid-column:1;grid-row:1;align-self:center;width:20px;height:20px;margin-top:0;pointer-events:none}.s-bullet-delivery-modal .s-bullet-delivery-branch-body{display:contents}.s-bullet-delivery-modal .s-bullet-delivery-branch-body>*{grid-column:2/-1;min-width:0}.s-bullet-delivery-modal .s-bullet-delivery-branch-body>.s-bullet-delivery-branch-name{grid-column:2;grid-row:1;align-self:center}.s-bullet-delivery-modal .s-bullet-delivery-branch-body>.s-bullet-delivery-branch-location{grid-column:2}.s-bullet-delivery-modal .s-bullet-delivery-branch-name{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0;font-size:14px;font-weight:700;line-height:120%;color:#1a1a1a}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:#6c757d}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta i{font-size:12px}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-status--open{color:#43a047;font-weight:500}.s-bullet-delivery-modal .s-bullet-delivery-pickup-status--closed,.s-bullet-delivery-modal .s-bullet-delivery-pickup-status--busy{color:#e53935;font-weight:500}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-toggle{display:inline-flex;align-items:center;justify-content:center;min-width:24px;min-height:24px;margin:-6px;padding:0;border:0;background:none;color:inherit;line-height:1;cursor:pointer}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-toggle i{transition:transform 0.2s ease}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-toggle i.is-expanded{transform:rotate(180deg)}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule{display:flex;flex-direction:column;margin-top:4px;border-radius:8px;overflow:hidden}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-day{display:flex;align-items:center;justify-content:space-between;gap:4px;padding:2px 12px;background:#f8f9fa;font-size:12px;font-weight:500}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-days{color:#6c757d}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule-times{color:#1a1a1a}.s-bullet-delivery-modal .s-bullet-delivery-branch-instructions{align-items:flex-start;line-height:1.5;white-space:pre-line}.s-bullet-delivery-modal .s-bullet-delivery-branch-instructions .s-bullet-delivery-branch-meta-icon{margin-top:2px}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta-value{color:#1a1a1a;font-weight:500}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta-icon{display:inline-flex;flex-shrink:0}.s-bullet-delivery-modal .s-bullet-delivery-branch-meta-icon svg{width:16px;height:16px}.s-bullet-delivery-modal .s-bullet-delivery-branch-actions{grid-column:3;grid-row:1/span 2;display:flex;align-items:center;gap:8px}.s-bullet-delivery-modal .s-bullet-delivery-branch-action{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:1px solid var(--color-border, #eee);border-radius:8px;background:transparent;color:var(--color-text, #333);text-decoration:none;cursor:pointer;transition:all 0.2s}.s-bullet-delivery-modal .s-bullet-delivery-branch-action i{font-size:16px}.s-bullet-delivery-modal .s-bullet-delivery-branch-action:hover{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-tt, transparent)}.s-bullet-delivery-modal .s-bullet-delivery-branch-action .s-bullet-delivery-branch-map-link-icon,.s-bullet-delivery-modal .s-bullet-delivery-branch-action .s-bullet-delivery-branch-map-link-icon svg{width:16px;height:16px}.s-bullet-delivery-modal .s-bullet-delivery-branch-action .s-bullet-delivery-branch-map-link-icon path{stroke:currentColor}.s-bullet-delivery-modal .s-bullet-delivery-branch-item .s-bullet-delivery-branch-action,.s-bullet-delivery-modal .s-bullet-delivery-branch-item .s-bullet-delivery-branch-schedule-toggle{pointer-events:auto}.s-bullet-delivery-modal .s-bullet-delivery-branch-pills{display:contents}.s-bullet-delivery-modal .s-bullet-delivery-branch-divider{display:none}@media (max-width: 480px){.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters{flex-direction:row;flex-wrap:wrap;gap:12px 8px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-branch-search,.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-search-row,.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-pickup-filters-row{display:contents}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-field{flex:1 1 calc(50% - 4px);min-width:0;order:1}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-branch-search-wrap{flex:1 1 0;min-width:0;order:2}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-btn{flex:0 0 auto;order:3;padding:0 10px;white-space:nowrap}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-error{flex-basis:100%;order:4}}@media (max-width: 480px) and (max-width: 400px){.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-btn{padding:0 12px}.s-bullet-delivery-modal .s-bullet-delivery-pickup-filters .s-bullet-delivery-location-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}}@media (max-width: 480px){.s-bullet-delivery-modal .s-bullet-delivery-branch-meta-row{display:contents}.s-bullet-delivery-modal .s-bullet-delivery-branch-pills,.s-bullet-delivery-modal .s-bullet-delivery-branch-divider,.s-bullet-delivery-modal .s-bullet-delivery-branch-open-status{grid-column:2/-1;min-width:0}.s-bullet-delivery-modal .s-bullet-delivery-branch-pills{display:flex;flex-wrap:wrap;gap:8px;order:1;margin-top:6px}.s-bullet-delivery-modal .s-bullet-delivery-branch-divider{order:2}.s-bullet-delivery-modal .s-bullet-delivery-branch-instructions{order:3}.s-bullet-delivery-modal .s-bullet-delivery-branch-open-status{order:4}.s-bullet-delivery-modal .s-bullet-delivery-branch-schedule{order:5}.s-bullet-delivery-modal .s-bullet-delivery-branch-location .s-bullet-delivery-branch-meta-icon{display:none}.s-bullet-delivery-modal .s-bullet-delivery-branch-pill{padding:4px 10px;border:1px solid var(--color-border, #eee);border-radius:999px;font-size:12px;line-height:1.4}.s-bullet-delivery-modal .s-bullet-delivery-branch-pill .s-bullet-delivery-branch-meta-label{display:none}.s-bullet-delivery-modal .s-bullet-delivery-branch-pill .s-bullet-delivery-branch-meta-value{color:inherit;font-weight:400}.s-bullet-delivery-modal .s-bullet-delivery-branch-divider{display:block;width:100%;height:0;margin:10px 0;border:0;border-top:1px solid #e0e0e0;opacity:1}.s-bullet-delivery-modal .s-bullet-delivery-branch-action,.s-bullet-delivery-modal .s-bullet-delivery-branch-action:hover{border-color:transparent}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.inline{display:inline}.inline-flex{display:inline-flex}.shrink{flex-shrink:1}.resize{resize:both}.\\!text-blue-600{--tw-text-opacity:1 !important;color:rgb(37 99 235 / var(--tw-text-opacity, 1)) !important}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.shadow{--tw-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-hidden{display:none}.form-input{height:2.5rem;width:100%;border-radius:0.375rem;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.form-input:focus{border-color:var(--color-primary);--tw-ring-color:transparent}.form-input:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.form-input:focus:is(.dark *){border-color:var(--color-primary)}@media (min-width: 640px){.form-input{font-size:0.875rem;line-height:1.25rem}}.\\!btn{display:inline-flex;flex:1 1 0%;align-items:center;justify-content:center;white-space:nowrap;border-radius:0.375rem;padding-left:1.5rem;padding-right:1.5rem;padding-bottom:0.625rem;padding-top:0.5rem;font-size:0.875rem;line-height:1.25rem;font-weight:700;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.\\!btn:hover{opacity:0.8}.btn{display:inline-flex;flex:1 1 0%;align-items:center;justify-content:center;white-space:nowrap;border-radius:0.375rem;padding-left:1.5rem;padding-right:1.5rem;padding-bottom:0.625rem;padding-top:0.5rem;font-size:0.875rem;line-height:1.25rem;font-weight:700;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.btn:hover{opacity:0.8}.spinner-loader.reverse{border-right-color:#9f7171 !important;background-color:#f98181}.s-hidden{display:none}.s-scrollbar::-webkit-scrollbar{width:5px}.s-scrollbar::-webkit-scrollbar-track{background-color:#eee}.s-scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-primary);border-radius:10px;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;-o-border-radius:10px}.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{padding:0px}@media (min-width: 768px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body{max-height:70dvh;overflow-y:auto}}@media (min-width: 640px){.s-bullet-delivery .s-bullet-delivery-modal .s-modal-body:has(.s-searchable-dropdown--open){overflow:visible !important}}.s-bullet-delivery-inner{min-block-size:0}.s-bullet-delivery-header{margin-bottom:1.5rem;text-align:start}.s-bullet-delivery-title{display:block;font-size:1.25rem;line-height:1.75rem;font-weight:700;color:var(--color-primary-dark)}.s-bullet-delivery-subtitle{margin-top:0.25rem;display:block;font-size:0.875rem;line-height:1.25rem;color:var(--color-primary-dark)}.s-bullet-delivery-tabs{margin-bottom:1.5rem;display:flex;gap:0.5rem}.s-bullet-delivery-tab{display:flex;flex:1 1 0%;cursor:pointer;align-items:center;gap:1rem;border-radius:0.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-top:0.5rem;padding-bottom:0.5rem;padding-left:0.75rem;padding-right:0.75rem;font-size:0.875rem;line-height:1.25rem;font-weight:500;color:var(--color-primary-dark);transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:200ms}.s-bullet-delivery-tab:hover{background-color:color-mix(in srgb,var(--color-primary) 5%,transparent)}.s-bullet-delivery-tab--active{border-color:var(--color-primary-dark)}.s-bullet-delivery-tab svg{height:0.875rem;width:0.875rem;color:var(--color-primary-dark)}.s-bullet-delivery-tab-icon{display:flex;height:2rem;width:2rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-allocation-out-of-coverage{margin-bottom:1rem;display:flex;width:100%;align-items:center;gap:0.5rem;--tw-bg-opacity:1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1));padding-top:0.75rem;padding-bottom:0.75rem;padding-left:1rem;padding-right:1rem;text-align:end;--tw-text-opacity:1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.s-bullet-delivery-allocation-out-of-coverage:where([dir=\"ltr\"],[dir=\"ltr\"] *){border-left-width:4px;border-left-color:rgb(239 68 68 / 0.5)}.s-bullet-delivery-allocation-out-of-coverage:where([dir=\"rtl\"],[dir=\"rtl\"] *){border-right-width:4px;border-right-color:rgb(239 68 68 / 0.5)}.s-bullet-delivery-allocation-out-of-coverage-text{font-size:0.875rem;line-height:1.25rem;line-height:1.4}.s-bullet-delivery-allocation-out-of-coverage-icon{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;--tw-text-opacity:1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.s-bullet-delivery-content{margin-bottom:1.5rem;display:grid;gap:1rem}.s-bullet-delivery-content--active{animation:s-bullet-delivery-fade-in 220ms ease-out}.s-bullet-delivery-label{margin-bottom:0.5rem;display:block;font-size:0.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity:1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.s-bullet-delivery-error{margin-top:0.25rem;display:block;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.s-bullet-delivery-footer{display:grid;gap:0.75rem;text-align:center}.s-bullet-delivery-placeholder{margin-top:1rem;margin-bottom:1rem}.s-bullet-delivery-placeholder.s-placeholder-wrapper{margin-top:1rem !important;margin-bottom:1rem !important}.s-bullet-delivery-label-content{display:inline-flex;align-items:center;gap:0.5rem}.s-bullet-delivery-select-loader{display:inline-flex;align-items:center;--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.s-bullet-delivery-search-row{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:0.5rem;padding-left:1px;padding-right:1px}.s-bullet-delivery-search-row .s-bullet-delivery-search{min-width:0px;flex:1 1 0%}.s-bullet-delivery-search-row .s-bullet-delivery-location-btn{width:auto;flex-shrink:0}.s-bullet-delivery-field-row{margin-bottom:1rem;display:flex;gap:1rem}.s-bullet-delivery-field-row .s-bullet-delivery-field{margin-bottom:0px;flex:1 1 0%}.s-bullet-delivery-saved-addresses-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.s-bullet-delivery-saved-addresses-empty-icon{margin-bottom:0.75rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-saved-addresses-empty-icon svg{height:2rem;width:2rem}.s-bullet-delivery-saved-addresses-empty-title{margin-bottom:0.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:700;--tw-text-opacity:1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.s-bullet-delivery-saved-addresses-empty-desc{margin-bottom:1.5rem;max-width:24rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-addresses-list{position:relative;display:flex;max-height:260px;flex-direction:column;overflow-y:auto;border-radius:0.75rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}@media (min-width: 768px){.s-bullet-delivery-addresses-list{max-height:220px}}.s-bullet-delivery-address-item{display:flex;cursor:pointer;flex-direction:row;align-items:center;gap:0.75rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.875rem;padding-bottom:0.875rem;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-address-item:not(.s-bullet-delivery-address-item--disabled):hover{background-color:rgb(249 250 251 / 0.5)}.s-bullet-delivery-address-item--selected{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-address-item--disabled{cursor:not-allowed;opacity:0.6}.s-bullet-delivery-address-item--skeleton{display:flex;cursor:default;align-items:center;gap:0.75rem;border-radius:0.75rem;border-width:1px;border-bottom-width:0px;--tw-border-opacity:1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:1rem;padding-bottom:1rem}.s-bullet-delivery-address-item--skeleton .s-bullet-delivery-address-lines{gap:0.5rem}.s-bullet-delivery-address-content{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column;justify-content:center;text-align:start}.s-bullet-delivery-address-lines{display:flex;flex-direction:column;gap:0.125rem}.s-bullet-delivery-address-line1{display:block;font-size:1rem;line-height:1.5rem;font-weight:400;line-height:1.375;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-address-line2{display:block;font-size:0.875rem;line-height:1.25rem;line-height:1.375;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-address-map-icon{display:grid;height:2.5rem;width:2.5rem;place-content:center}.s-bullet-delivery-address-map-icon svg{height:100%;width:100%}.s-bullet-delivery-skel-radio{flex-shrink:0;border-radius:9999px}.s-bullet-delivery-skel-map{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-search{position:relative;flex:1 1 0%}.s-bullet-delivery-search-icon{pointer-events:none;position:absolute;top:0px;bottom:0px;left:0px;display:flex;align-items:center;padding-left:0.75rem}.s-bullet-delivery-search-icon:where([dir=\"rtl\"],[dir=\"rtl\"] *){left:auto;right:0px;padding-left:0px;padding-right:0.75rem}.s-bullet-delivery-search-icon svg{height:0.875rem;width:0.875rem;stroke:var(--color-primary)}.s-bullet-delivery-branch-search-wrap{display:flex;min-height:40px;min-width:0px;flex:1 1 0%;flex-direction:row;align-items:stretch;overflow:hidden;border-radius:0.375rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.s-bullet-delivery-branch-search-wrap:focus-within{border-color:var(--color-primary-dark);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);--tw-ring-color:var(--color-primary-dark)}.s-bullet-delivery-branch-search-icon{pointer-events:none;position:static;display:flex;flex-shrink:0;align-items:center;justify-content:center;padding-inline-start:0.5rem;--tw-text-opacity:1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-search-icon svg{height:1.25rem;width:1.25rem}.s-bullet-delivery-branch-search-input{min-height:40px;min-width:0px;flex:1 1 0%;border-radius:0px;border-style:none;background-color:transparent;padding-top:0.5rem;padding-bottom:0.5rem;padding-inline-end:0.75rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.s-bullet-delivery-branch-search-input::placeholder{--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-search-input:focus{outline:2px solid transparent;outline-offset:2px;border:none;box-shadow:none;--tw-ring-shadow:none}.s-bullet-delivery-location-btn{display:flex;flex-shrink:0;cursor:pointer;align-items:center;justify-content:center;gap:0.5rem;border-radius:0.5rem;border-width:1px;padding-left:1rem;padding-right:1rem;padding-top:0.5rem;padding-bottom:0.5rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(55 65 81 / var(--tw-text-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-location-btn:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-location-btn:disabled{cursor:not-allowed;opacity:0.5}.s-bullet-delivery-location-btn--full{min-height:40px}.s-bullet-delivery-location-btn--loading{--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-location-icon{height:0.875rem;width:0.875rem;flex-shrink:0}.s-bullet-delivery-location-icon svg{height:100%;width:100%}.s-bullet-delivery-branches-wrap{overflow:hidden}.s-bullet-delivery-branches-list{position:relative;max-height:min(260px, 32svh);overflow-y:auto;border-radius:0.5rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}@media (min-width: 768px){.s-bullet-delivery-branches-list{max-height:220px}}.s-bullet-delivery-branches-loading{overflow:hidden;border-radius:0.5rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-info{display:flex;max-width:6.25rem;flex-direction:column;gap:0.125rem}.s-bullet-delivery-branch-name{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow-wrap:break-word;font-size:0.875rem;line-height:1.25rem;font-weight:500;line-height:1.375;--tw-text-opacity:1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-prep{text-align:start;font-size:0.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-time{font-size:0.875rem;line-height:1.25rem;font-weight:400;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.s-bullet-delivery-branch-time:where([dir=\"ltr\"],[dir=\"ltr\"] *){text-align:end}.s-bullet-delivery-branch-time:where([dir=\"rtl\"],[dir=\"rtl\"] *){text-align:start}.s-bullet-delivery-branch-map-link{display:flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:0.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding:0.5rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));text-decoration-line:none;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-branch-map-link:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-item>.s-bullet-delivery-branch-map-link{position:relative;z-index:10;pointer-events:auto}.s-bullet-delivery-branch-map-link-icon{display:flex;height:0.875rem;width:0.875rem;align-items:center;justify-content:center}.s-bullet-delivery-branch-map-link-icon svg{height:100%;width:100%}.s-bullet-delivery-branch-skeleton-title{max-width:100%}.s-bullet-delivery-branch-skeleton-time{justify-self:end}.s-bullet-delivery-branch-item{display:grid;min-width:0px;cursor:pointer;align-items:center;gap:0.5rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;text-align:end;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;grid-template-columns:auto auto auto 1fr auto}.s-bullet-delivery-branch-item:last-child{border-bottom-width:0px}.s-bullet-delivery-branch-item:hover:not(.s-bullet-delivery-branch-item--disabled){--tw-bg-opacity:1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.s-bullet-delivery-branch-item--selected{background-color:color-mix(in srgb,var(--color-primary) 5%,transparent)}.s-bullet-delivery-branch-item--disabled{cursor:not-allowed;opacity:0.5}.s-bullet-delivery-branch-icon{display:grid;place-content:center;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));stroke:var(--color-primary-dark);padding:0.625rem;color:var(--color-primary-dark)}.s-bullet-delivery-branch-icon span{display:block;height:0.875rem;width:0.875rem}.s-bullet-delivery-branch-icon span svg{height:100%;width:100%}.s-bullet-delivery-branch-skeleton{display:grid;min-width:0px;align-items:center;gap:0.5rem;border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;grid-template-columns:auto auto auto 1fr auto}.s-bullet-delivery-branch-skeleton:last-child{border-bottom-width:0px}.s-bullet-delivery-branch-skeleton-radio{flex-shrink:0}.s-bullet-delivery-branch-skeleton-icon{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-branch-skeleton-icon salla-skeleton{display:block}.s-bullet-delivery-branch-skeleton-map{flex-shrink:0;border-radius:0.75rem}.s-bullet-delivery-branch-skeleton-map salla-skeleton{display:block}.s-bullet-delivery-branch-skeleton-content{display:flex;min-width:0px;flex-direction:column;gap:0.5rem;overflow:hidden}.s-bullet-delivery-branch-skeleton-content salla-skeleton{min-width:0px;max-width:100%}.s-bullet-delivery-radio{margin-top:2px;height:1rem;width:1rem;flex-shrink:0;cursor:pointer;appearance:none;border-radius:9999px;border-width:2px;--tw-border-opacity:1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms}.s-bullet-delivery-radio:checked{border-color:var(--color-primary-dark);background:radial-gradient(circle,#fff 0,#fff 22%,var(--color-primary) 22%)}.s-bullet-delivery-radio:focus{outline:2px solid transparent;outline-offset:2px}.s-bullet-delivery-radio:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);--tw-ring-color:var(--color-primary-dark);--tw-ring-offset-width:2px}.s-bullet-delivery-skeleton{box-sizing:border-box;min-width:0px;max-width:100%;overflow:hidden;padding:1.25rem}.s-bullet-delivery-skeleton salla-skeleton{min-width:0px;max-width:100%}.s-bullet-delivery-skeleton-header{margin-bottom:1.5rem;display:flex;min-width:0px;max-width:100%;flex-direction:column;align-items:flex-start;gap:0.75rem}.s-bullet-delivery-skeleton-title{display:block;max-width:100%}.s-bullet-delivery-skeleton-subtitle{display:block;max-width:100%}.s-bullet-delivery-skeleton-tabs{margin-bottom:1.5rem;display:grid;min-width:0px;max-width:100%;grid-template-columns:repeat(2, minmax(0, 1fr));gap:0.5rem}.s-bullet-delivery-skeleton-tabs--single{grid-template-columns:repeat(1, minmax(0, 1fr))}.s-bullet-delivery-skeleton-tab{display:flex;align-items:center;gap:1rem;border-radius:0.75rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-left:1rem;padding-right:1rem;padding-top:0.75rem;padding-bottom:0.75rem;transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:300ms}.s-bullet-delivery-skeleton-tab-icon{display:block;max-width:100%}.s-bullet-delivery-skeleton-tab-label{display:block;max-width:100%}.s-bullet-delivery-skeleton-field-label{display:block;max-width:100%}.s-bullet-delivery-skeleton-field-control{display:block;max-width:100%}.s-bullet-delivery-skeleton-content{margin-bottom:1.5rem;display:grid;min-width:0px;max-width:100%;gap:1rem}.s-bullet-delivery-skeleton-field{display:flex;min-width:0px;max-width:100%;flex-direction:column;align-items:flex-start;gap:0.5rem}.s-bullet-delivery-skeleton-footer{min-width:0px;max-width:100%}.s-bullet-delivery-add-address-header{margin-bottom:1.5rem;display:flex;align-items:center;justify-content:space-between;gap:0.75rem}.s-bullet-delivery-add-address-title{display:flex;width:100%;flex:1 1 0%;cursor:pointer;align-items:center;border-style:none;background-color:transparent;padding:0px;text-align:start;font-size:1.125rem;line-height:1.75rem;font-weight:700;color:var(--color-primary)}.s-bullet-delivery-add-address svg{height:2.5rem;width:2.5rem;fill:currentColor}.s-bullet-delivery-allocation-out-of-coverage-icon svg{height:1.25rem;width:1.25rem}.s-bullet-delivery-add-address-form{display:grid;gap:1rem}.s-bullet-delivery-add-address-submit{width:100%}.s-bullet-delivery-form-actions{display:flex;gap:0.75rem;border-top-width:1px;--tw-border-opacity:1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1));padding-top:1rem}.s-bullet-delivery-form-actions salla-button{flex:1 1 0%}.s-bullet-delivery-form-actions--single{border-top-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));padding-top:1.25rem}.s-bullet-delivery-form-actions--single salla-button{width:100%;flex:1 1 0%}.s-bullet-delivery-market-warning-overlay{position:fixed;inset:0px;z-index:60;display:flex;align-items:center;justify-content:center;background-color:rgb(0 0 0 / 0.5)}.s-bullet-delivery-market-warning{margin-left:1rem;margin-right:1rem;width:100%;max-width:24rem;border-radius:0.75rem;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1.5rem;--tw-shadow:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow)}.s-bullet-delivery-market-warning-title{margin-bottom:0.75rem;font-size:1.125rem;line-height:1.75rem;font-weight:700;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-market-warning-message{margin-bottom:1.5rem;font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.s-bullet-delivery-market-warning-actions{display:flex;gap:0.75rem}.s-bullet-delivery-market-warning-actions salla-button{flex:1 1 0%}.s-bullet-delivery-cart-view{margin-bottom:1rem;display:flex;align-items:center;justify-content:space-between;gap:1rem;border-radius:0.75rem;border-width:1px;--tw-bg-opacity:1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem}.s-bullet-delivery-cart-view-info{display:flex;min-width:0px;flex:1 1 0%;align-items:center;gap:0.75rem}.s-bullet-delivery-cart-view-text{display:flex;flex-direction:column;text-align:start}.s-bullet-delivery-cart-view-title{font-size:1rem;line-height:1.5rem;font-weight:600;--tw-text-opacity:1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.s-bullet-delivery-cart-view-subtitle{font-size:0.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(107 114 128 / var(--tw-text-opacity, 1));margin-block-start:0.125rem}.s-bullet-delivery-cart-view-icon{display:flex;height:3.5rem;width:3.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:1rem;--tw-bg-opacity:1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));color:var(--color-primary-dark)}.s-bullet-delivery-cart-view-icon svg{height:1.25rem;width:1.25rem;stroke:currentColor}.s-bullet-delivery-cart-view-button{flex-shrink:0;align-self:center}.s-bullet-delivery-location-permission-btn{display:flex;width:100%;cursor:pointer;align-items:center;gap:0.625rem;border-radius:0.5rem;border-width:0px;padding:0.75rem;text-align:start;background:#fdf2f2}.s-bullet-delivery-location-permission-icon{display:inline-flex;height:34px;width:34px;flex-shrink:0}.s-bullet-delivery-location-permission-icon svg{height:100%;width:100%}.s-bullet-delivery-location-permission-text{min-width:0px;flex:1 1 0%;font-size:0.75rem;line-height:1rem;line-height:18px;--tw-text-opacity:1;color:rgb(68 68 68 / var(--tw-text-opacity, 1))}.s-bullet-delivery-location-permission-arrow{flex-shrink:0;font-size:1rem;line-height:1.5rem;--tw-text-opacity:1;color:rgb(102 102 102 / var(--tw-text-opacity, 1))}.s-bullet-delivery-location-distance-warning{display:flex;width:100%;animation:s-bullet-delivery-fade-in 200ms ease;align-items:center;gap:0.625rem;border-radius:0.5rem;padding:0.75rem;background:#fff8e1}.s-bullet-delivery-location-distance-warning-icon{display:inline-flex;height:34px;width:34px;flex-shrink:0}.s-bullet-delivery-location-distance-warning-icon svg{height:100%;width:100%}.s-bullet-delivery-location-distance-warning-text{min-width:0px;flex:1 1 0%;font-size:0.75rem;line-height:1rem;line-height:18px;--tw-text-opacity:1;color:rgb(68 68 68 / var(--tw-text-opacity, 1))}";
|
|
214
302
|
|
|
215
303
|
const BRANCH_SEARCH_DEBOUNCE_MS = 1000;
|
|
304
|
+
/** Shorter queries are filtered locally; the branches API ignores them. */
|
|
305
|
+
const BRANCH_SEARCH_MIN_LENGTH = 2;
|
|
216
306
|
const GEOLOCATION_TIMEOUT = 10000;
|
|
307
|
+
/** GeolocationPositionError.PERMISSION_DENIED — inlined; the class is absent on the server. */
|
|
308
|
+
const GEO_PERMISSION_DENIED = 1;
|
|
309
|
+
/** Silent read for branch distances: a short wait, and a recent cached fix is good enough. */
|
|
310
|
+
const SILENT_GEOLOCATION_TIMEOUT = 5000;
|
|
311
|
+
const SILENT_GEOLOCATION_MAX_AGE = 10 * 60 * 1000;
|
|
312
|
+
/** Longest the branch list waits for that read; a later fix still serves the next list request. */
|
|
313
|
+
const BRANCH_LIST_LOCATION_WAIT = 1500;
|
|
314
|
+
/** Matches the `per_page` default of `bulletDeliveryAPI.getBranches`. */
|
|
315
|
+
const BRANCH_PAGE_SIZE = 20;
|
|
217
316
|
/** Final fallback center used only if `user.default_geo_location` is absent (Riyadh — matches checkout map-page). */
|
|
218
317
|
const DEFAULT_MAP_CENTER = { lat: 24.7756042, lng: 46.7360729 };
|
|
219
318
|
const DEBUG_KEY = 'salla-bullet-delivery-debug';
|
|
@@ -233,6 +332,8 @@ const SallaBulletDelivery = class {
|
|
|
233
332
|
this.pendingCartSubmitResolver = null;
|
|
234
333
|
this.pendingCartSubmitPromise = null;
|
|
235
334
|
this.cartSubmitConfirmationPending = false;
|
|
335
|
+
/** Query the current branch list was searched with server-side; its results are not re-filtered locally. */
|
|
336
|
+
this.branchesServerQuery = '';
|
|
236
337
|
this.branchSearchDebounceTimer = null;
|
|
237
338
|
this.countrySearchTimer = null;
|
|
238
339
|
this.regionSearchTimer = null;
|
|
@@ -264,6 +365,13 @@ const SallaBulletDelivery = class {
|
|
|
264
365
|
this.open();
|
|
265
366
|
};
|
|
266
367
|
this.closeHandler = null;
|
|
368
|
+
this.selectorTracker = new SelectorTracker();
|
|
369
|
+
this.openTrigger = "customer_requested";
|
|
370
|
+
this.pendingDismissReason = null;
|
|
371
|
+
this.modalCloseHandler = (detail) => {
|
|
372
|
+
this.pendingDismissReason = toCloseReason(detail?.reason);
|
|
373
|
+
queueMicrotask(() => (this.pendingDismissReason = null));
|
|
374
|
+
};
|
|
267
375
|
this.bulletDeliveryMobileSelectHandler = null;
|
|
268
376
|
/** True after saved addresses have been loaded (lazy: only when address tab is shown). */
|
|
269
377
|
this.savedAddressesLoaded = false;
|
|
@@ -273,6 +381,8 @@ const SallaBulletDelivery = class {
|
|
|
273
381
|
/** Identifies the latest reverse-geocode call so a resolved-but-superseded callback (same
|
|
274
382
|
* coordinates re-picked, or the map left) can be told apart from the current one. */
|
|
275
383
|
this.geocodeRequestId = 0;
|
|
384
|
+
/** Identifies the latest pickup-offer fetch so one from an earlier modal open is dropped. */
|
|
385
|
+
this.pickupDiscountRequestId = 0;
|
|
276
386
|
// Core state
|
|
277
387
|
this.activeTab = "address";
|
|
278
388
|
this.isLoggedIn = false;
|
|
@@ -295,9 +405,27 @@ const SallaBulletDelivery = class {
|
|
|
295
405
|
this.selectedSessionAddress = false;
|
|
296
406
|
// Pickup state
|
|
297
407
|
this.branches = [];
|
|
408
|
+
/** Pickup offer range across the store's branches (INV-1416); null shows the default tab badge. */
|
|
409
|
+
this.pickupDiscountRange = null;
|
|
410
|
+
/** False until the offer lookup settles, so the tab never flashes the default badge before an offer. */
|
|
411
|
+
this.pickupDiscountResolved = false;
|
|
298
412
|
this.filteredBranches = [];
|
|
299
413
|
this.selectedBranch = null;
|
|
300
414
|
this.branchSearchQuery = "";
|
|
415
|
+
/** Cities that have branches in the selected country (from the unfiltered branch list). */
|
|
416
|
+
this.branchCities = [];
|
|
417
|
+
this.selectedBranchCity = null;
|
|
418
|
+
this.branchCitySearchQuery = '';
|
|
419
|
+
/** Branch whose weekly hours are expanded behind the chevron (one at a time). */
|
|
420
|
+
this.expandedScheduleBranchId = null;
|
|
421
|
+
/** Shopper's device location for branch distances (see getGrantedDeviceLocation). */
|
|
422
|
+
this.shopperLocation = null;
|
|
423
|
+
this.shopperLocationRequestId = 0;
|
|
424
|
+
this.nearestBranchRequestId = 0;
|
|
425
|
+
/** Bumped per branch-list request; overlapping city/search loads only apply the latest one. */
|
|
426
|
+
this.branchesRequestId = 0;
|
|
427
|
+
/** Shared country rows and city options expire with the API cache. */
|
|
428
|
+
this.allBranchCities = null;
|
|
301
429
|
// Loading states
|
|
302
430
|
this.loadingCountries = false;
|
|
303
431
|
this.loadingCities = false;
|
|
@@ -416,6 +544,13 @@ const SallaBulletDelivery = class {
|
|
|
416
544
|
this.displayedDistricts = this.districts;
|
|
417
545
|
this.searchingDistricts = false;
|
|
418
546
|
};
|
|
547
|
+
this.handleBranchCitySelected = (item) => {
|
|
548
|
+
this.selectedBranchCity = item && item.id !== -1
|
|
549
|
+
? (this.branchCities.find((c) => String(c.id) === String(item.id)) ?? item)
|
|
550
|
+
: null;
|
|
551
|
+
this.selectedBranch = null;
|
|
552
|
+
void this.loadBranches();
|
|
553
|
+
};
|
|
419
554
|
this.handleMapLocationChanged = (event) => {
|
|
420
555
|
const detail = event.detail;
|
|
421
556
|
if (!detail?.position?.lat || !detail?.position?.lng)
|
|
@@ -530,6 +665,7 @@ const SallaBulletDelivery = class {
|
|
|
530
665
|
const details = this.buildIntentAddress();
|
|
531
666
|
if (!details)
|
|
532
667
|
return;
|
|
668
|
+
const previousIntent = this.getStoredIntent();
|
|
533
669
|
this.setStoredIntent({
|
|
534
670
|
type: "address",
|
|
535
671
|
country_id: Number(this.selectedCountry?.id) || 0,
|
|
@@ -538,7 +674,7 @@ const SallaBulletDelivery = class {
|
|
|
538
674
|
});
|
|
539
675
|
this.selectedSavedAddress = null;
|
|
540
676
|
this.selectedSessionAddress = true;
|
|
541
|
-
await this.handleConfirm();
|
|
677
|
+
await this.handleConfirm(previousIntent);
|
|
542
678
|
};
|
|
543
679
|
this.handleCountrySelected = (item) => {
|
|
544
680
|
const country = this.countries.find(c => String(c.id) === String(item.id)) || item;
|
|
@@ -623,9 +759,10 @@ const SallaBulletDelivery = class {
|
|
|
623
759
|
* successful auto-confirm never flashes the saved-addresses list; the caller is
|
|
624
760
|
* responsible for revealing the modal itself if it still needs the customer's input.
|
|
625
761
|
*/
|
|
626
|
-
async open(silent = false) {
|
|
762
|
+
async open(silent = false, trigger = "customer_requested") {
|
|
627
763
|
if (!this.isEnabled)
|
|
628
764
|
return; // feature disabled — never open
|
|
765
|
+
this.openTrigger = trigger;
|
|
629
766
|
// If mobile app, open the sheet
|
|
630
767
|
if (this.isMobileApp) {
|
|
631
768
|
Salla.event.dispatch('salla::bullet-delivery.open-sheet');
|
|
@@ -638,6 +775,7 @@ const SallaBulletDelivery = class {
|
|
|
638
775
|
}
|
|
639
776
|
// Reset state before opening
|
|
640
777
|
this.resetState();
|
|
778
|
+
void this.loadPickupDiscountRange();
|
|
641
779
|
if (!silent) {
|
|
642
780
|
// Open modal immediately — fields render right away with inline loading
|
|
643
781
|
this.modal.open();
|
|
@@ -689,20 +827,18 @@ const SallaBulletDelivery = class {
|
|
|
689
827
|
}
|
|
690
828
|
}
|
|
691
829
|
// Load branches only when branch tab is active (lazy tab data)
|
|
692
|
-
// Use lat/lng from session storage if available for more accurate results
|
|
693
830
|
if (this.activeTab === "branch") {
|
|
694
|
-
const
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
else {
|
|
700
|
-
await this.loadBranches();
|
|
701
|
-
}
|
|
831
|
+
const loading = this.loadBranches();
|
|
832
|
+
const request = this.branchesRequestId;
|
|
833
|
+
await loading;
|
|
834
|
+
if (request !== this.branchesRequestId || this.activeTab !== 'branch' || this.branchSearchQuery.trim())
|
|
835
|
+
return;
|
|
702
836
|
// Auto-select preselected branch if provided
|
|
703
837
|
if (this.preselectedBranchId) {
|
|
704
|
-
this.preselectBranch(this.preselectedBranchId);
|
|
838
|
+
await this.preselectBranch(this.preselectedBranchId);
|
|
705
839
|
}
|
|
840
|
+
if (request !== this.branchesRequestId || this.activeTab !== 'branch' || this.branchSearchQuery.trim())
|
|
841
|
+
return;
|
|
706
842
|
}
|
|
707
843
|
// Prefill form data from session storage
|
|
708
844
|
await this.prefillFromSessionStorage();
|
|
@@ -727,7 +863,45 @@ const SallaBulletDelivery = class {
|
|
|
727
863
|
this.bulletDeliveryClosed.emit();
|
|
728
864
|
return this.modal?.close();
|
|
729
865
|
}
|
|
866
|
+
selectorContext() {
|
|
867
|
+
return {
|
|
868
|
+
configured_required: this.isRequired,
|
|
869
|
+
effective_nonclosable: this.isRequired || this.shouldForceNonClosable(),
|
|
870
|
+
trigger_configured: this.openingType ?? null,
|
|
871
|
+
trigger_actual: this.openTrigger,
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
handleModalVisibility(visible) {
|
|
875
|
+
if (visible) {
|
|
876
|
+
this.selectorTracker.viewed(this.selectorContext());
|
|
877
|
+
return;
|
|
878
|
+
}
|
|
879
|
+
if (!this.pendingDismissReason)
|
|
880
|
+
return;
|
|
881
|
+
this.selectorTracker.dismissed(this.selectorContext(), this.pendingDismissReason, !!this.getStoredIntent()?.scope_allocated);
|
|
882
|
+
this.pendingDismissReason = null;
|
|
883
|
+
}
|
|
884
|
+
trackSelectorResult(outcome, previousIntent, newBranchIds, scopeId) {
|
|
885
|
+
this.selectorTracker.result(this.selectorContext(), {
|
|
886
|
+
outcome,
|
|
887
|
+
fulfilment_method: this.activeTab === "branch" ? "pickup" : "delivery",
|
|
888
|
+
previous_branch_ids: previousIntent?.scope_allocated ? allocatedBranchIds(previousIntent) : [],
|
|
889
|
+
new_branch_ids: newBranchIds,
|
|
890
|
+
scope_id: scopeId ?? null,
|
|
891
|
+
});
|
|
892
|
+
}
|
|
730
893
|
resetState() {
|
|
894
|
+
clearBranchCache();
|
|
895
|
+
this.allBranchCities = null;
|
|
896
|
+
this.pickupDiscountRequestId++;
|
|
897
|
+
if (this.branchSearchDebounceTimer)
|
|
898
|
+
clearTimeout(this.branchSearchDebounceTimer);
|
|
899
|
+
++this.branchesRequestId;
|
|
900
|
+
this.loadingBranches = false;
|
|
901
|
+
++this.shopperLocationRequestId;
|
|
902
|
+
++this.nearestBranchRequestId;
|
|
903
|
+
this.loadingNearestBranch = false;
|
|
904
|
+
this.shopperLocation = null;
|
|
731
905
|
this.viewMode = "main";
|
|
732
906
|
this.mapLocationData = null;
|
|
733
907
|
this.mapCountryCode = null;
|
|
@@ -744,11 +918,16 @@ const SallaBulletDelivery = class {
|
|
|
744
918
|
this.selectedSessionAddress = false;
|
|
745
919
|
this.selectedBranch = null;
|
|
746
920
|
this.branchSearchQuery = "";
|
|
921
|
+
this.branchCities = [];
|
|
922
|
+
this.selectedBranchCity = null;
|
|
923
|
+
this.expandedScheduleBranchId = null;
|
|
747
924
|
this.regions = [];
|
|
748
925
|
this.cities = [];
|
|
749
926
|
this.districts = [];
|
|
750
927
|
this.branches = [];
|
|
751
928
|
this.filteredBranches = [];
|
|
929
|
+
this.pickupDiscountRange = null;
|
|
930
|
+
this.pickupDiscountResolved = false;
|
|
752
931
|
this.newAddressForm = { ...SallaBulletDelivery.INITIAL_ADDRESS_FORM };
|
|
753
932
|
this.showCartWillBeClearedBanner = false;
|
|
754
933
|
this.allocationOutOfCoverageMessage = null;
|
|
@@ -866,7 +1045,7 @@ const SallaBulletDelivery = class {
|
|
|
866
1045
|
if (!wasVisible) {
|
|
867
1046
|
// Load silently — a successful auto-confirm should never flash the
|
|
868
1047
|
// saved-addresses list; only reveal the modal below if it can't finish on its own.
|
|
869
|
-
await this.open(true);
|
|
1048
|
+
await this.open(true, "after_login");
|
|
870
1049
|
}
|
|
871
1050
|
// open() -> loadSavedAddresses() already sets selectedSessionAddress when a
|
|
872
1051
|
// session intent exists; bail if that didn't happen (e.g. address_id already set).
|
|
@@ -1152,16 +1331,63 @@ const SallaBulletDelivery = class {
|
|
|
1152
1331
|
});
|
|
1153
1332
|
}
|
|
1154
1333
|
async loadBranches() {
|
|
1334
|
+
const request = ++this.branchesRequestId;
|
|
1335
|
+
// A city change keeps the active search, so the server filters before picking the first page.
|
|
1336
|
+
const query = this.branchSearchQuery.trim();
|
|
1155
1337
|
this.loadingBranches = true;
|
|
1156
1338
|
try {
|
|
1157
|
-
|
|
1339
|
+
const branches = await bulletDeliveryAPI.getBranches({
|
|
1158
1340
|
country_id: this.selectedCountry?.id,
|
|
1159
|
-
|
|
1341
|
+
city_id: this.selectedBranchCity?.id,
|
|
1342
|
+
query,
|
|
1343
|
+
...(await this.getListLocation()),
|
|
1344
|
+
});
|
|
1345
|
+
if (request !== this.branchesRequestId)
|
|
1346
|
+
return;
|
|
1347
|
+
this.branchesServerQuery = query.length >= BRANCH_SEARCH_MIN_LENGTH ? query : '';
|
|
1348
|
+
this.applyLoadedBranches(branches);
|
|
1349
|
+
// Search results hold only the matching branches, which would shrink the city options.
|
|
1350
|
+
if (query.length < BRANCH_SEARCH_MIN_LENGTH)
|
|
1351
|
+
void this.refreshBranchCities();
|
|
1160
1352
|
}
|
|
1161
1353
|
finally {
|
|
1162
|
-
this.
|
|
1354
|
+
if (request === this.branchesRequestId)
|
|
1355
|
+
this.loadingBranches = false;
|
|
1163
1356
|
}
|
|
1164
1357
|
}
|
|
1358
|
+
/** Reuse the country's city collection while keeping visible choices usable during loading. */
|
|
1359
|
+
refreshBranchCities() {
|
|
1360
|
+
if (!this.selectedBranchCity)
|
|
1361
|
+
this.branchCities = getBranchCities(this.branches);
|
|
1362
|
+
const countryId = this.selectedCountry?.id;
|
|
1363
|
+
if (!this.allBranchCities || this.allBranchCities.countryId !== countryId || Date.now() - this.allBranchCities.timestamp > CACHE_TTL) {
|
|
1364
|
+
const branches = bulletDeliveryAPI.getAllBranches(countryId, BRANCH_PAGE_SIZE);
|
|
1365
|
+
this.allBranchCities = {
|
|
1366
|
+
countryId,
|
|
1367
|
+
timestamp: Date.now(),
|
|
1368
|
+
branches,
|
|
1369
|
+
cities: branches.then((all) => getBranchCities(all)),
|
|
1370
|
+
};
|
|
1371
|
+
}
|
|
1372
|
+
const pending = this.allBranchCities;
|
|
1373
|
+
return pending.cities.then((cities) => {
|
|
1374
|
+
if (this.allBranchCities !== pending || this.selectedCountry?.id !== countryId)
|
|
1375
|
+
return;
|
|
1376
|
+
if (!cities.length) {
|
|
1377
|
+
this.allBranchCities = null;
|
|
1378
|
+
return;
|
|
1379
|
+
}
|
|
1380
|
+
this.branchCities = cities;
|
|
1381
|
+
}).catch((error) => {
|
|
1382
|
+
if (this.allBranchCities === pending) {
|
|
1383
|
+
this.allBranchCities = null;
|
|
1384
|
+
if (this.selectedCountry?.id === countryId && Array.isArray(error?.branches)) {
|
|
1385
|
+
this.branchCities = getBranchCities([...this.branches, ...error.branches]);
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
console.error('[BulletDelivery] Error fetching branch cities', error);
|
|
1389
|
+
});
|
|
1390
|
+
}
|
|
1165
1391
|
/**
|
|
1166
1392
|
* Store a freshly fetched branch list and reconcile the current selection with it.
|
|
1167
1393
|
* `selectedBranch` is a snapshot from selection time: when the refreshed list carries the
|
|
@@ -1178,8 +1404,33 @@ const SallaBulletDelivery = class {
|
|
|
1178
1404
|
}
|
|
1179
1405
|
this.filterBranches();
|
|
1180
1406
|
}
|
|
1407
|
+
/** Shares a fresh branch collection with the picker on each modal open. */
|
|
1408
|
+
async loadPickupDiscountRange() {
|
|
1409
|
+
if (!this.supportsPickup)
|
|
1410
|
+
return;
|
|
1411
|
+
const requestId = ++this.pickupDiscountRequestId;
|
|
1412
|
+
const { branches, complete } = await bulletDeliveryAPI.getBranchCollection(undefined, 60, { requireComplete: true });
|
|
1413
|
+
if (requestId !== this.pickupDiscountRequestId)
|
|
1414
|
+
return;
|
|
1415
|
+
this.pickupDiscountRange = complete ? getBranchDiscountRange(branches) : null;
|
|
1416
|
+
this.pickupDiscountResolved = true;
|
|
1417
|
+
}
|
|
1418
|
+
/**
|
|
1419
|
+
* ar: "خصم 25%" / "خصم 5 – 25%" / "خصم 10 ر.س"; en: "25% discount" / "5 – 25% discount" / "10 SAR discount".
|
|
1420
|
+
* Money may carry the riyal-symbol SVG, so it renders as HTML.
|
|
1421
|
+
*/
|
|
1422
|
+
getPickupDiscountLabel(type, min, max = min) {
|
|
1423
|
+
const format = (amount) => type === 'percentage' ? String(Math.round(amount * 100) / 100) : salla.money(amount);
|
|
1424
|
+
const value = min === max ? format(min) : `${format(min)} – ${format(max)}`;
|
|
1425
|
+
const amount = type === 'percentage' ? `${value}%` : `${value} `;
|
|
1426
|
+
const fallback = this.isArabic ? `خصم ${amount}` : ` ${amount} discount`;
|
|
1427
|
+
return Salla.lang.getWithDefault('pages.checkout.pickup_discount', fallback, { amount });
|
|
1428
|
+
}
|
|
1181
1429
|
filterBranches() {
|
|
1182
|
-
|
|
1430
|
+
const query = this.branchSearchQuery.trim();
|
|
1431
|
+
this.filteredBranches = query && query === this.branchesServerQuery
|
|
1432
|
+
? this.branches
|
|
1433
|
+
: filterBranches(this.branches, query);
|
|
1183
1434
|
}
|
|
1184
1435
|
/**
|
|
1185
1436
|
* Prefill form fields from session storage
|
|
@@ -1204,7 +1455,7 @@ const SallaBulletDelivery = class {
|
|
|
1204
1455
|
if (country) {
|
|
1205
1456
|
this.selectedCountry = country;
|
|
1206
1457
|
this.updateNewAddressForm({ country_id: Number(country.id) });
|
|
1207
|
-
this.preselectBranch(getIntentBranchId(intent));
|
|
1458
|
+
await this.preselectBranch(getIntentBranchId(intent));
|
|
1208
1459
|
}
|
|
1209
1460
|
}
|
|
1210
1461
|
}
|
|
@@ -1243,7 +1494,16 @@ const SallaBulletDelivery = class {
|
|
|
1243
1494
|
}
|
|
1244
1495
|
}
|
|
1245
1496
|
applyCountryChange(newCountry) {
|
|
1497
|
+
++this.branchesRequestId;
|
|
1498
|
+
this.allBranchCities = null;
|
|
1499
|
+
this.loadingBranches = false;
|
|
1500
|
+
this.branches = [];
|
|
1501
|
+
this.filteredBranches = [];
|
|
1246
1502
|
this.selectedCountry = newCountry;
|
|
1503
|
+
this.selectedBranchCity = null;
|
|
1504
|
+
this.branchCities = [];
|
|
1505
|
+
this.branchCitySearchQuery = '';
|
|
1506
|
+
this.selectedBranch = null;
|
|
1247
1507
|
this.selectedRegion = null;
|
|
1248
1508
|
this.regions = [];
|
|
1249
1509
|
this.displayedRegions = [];
|
|
@@ -1363,19 +1623,11 @@ const SallaBulletDelivery = class {
|
|
|
1363
1623
|
void this.loadBranches();
|
|
1364
1624
|
return;
|
|
1365
1625
|
}
|
|
1366
|
-
this.branchSearchDebounceTimer = setTimeout(
|
|
1367
|
-
|
|
1626
|
+
this.branchSearchDebounceTimer = setTimeout(() => {
|
|
1627
|
+
// Below the minimum, only reload when the list still holds an earlier server search.
|
|
1628
|
+
if (query.trim().length < BRANCH_SEARCH_MIN_LENGTH && !this.branchesServerQuery)
|
|
1368
1629
|
return;
|
|
1369
|
-
this.
|
|
1370
|
-
try {
|
|
1371
|
-
this.applyLoadedBranches(await bulletDeliveryAPI.getBranches({
|
|
1372
|
-
country_id: this.selectedCountry?.id,
|
|
1373
|
-
query,
|
|
1374
|
-
}));
|
|
1375
|
-
}
|
|
1376
|
-
finally {
|
|
1377
|
-
this.loadingBranches = false;
|
|
1378
|
-
}
|
|
1630
|
+
void this.loadBranches();
|
|
1379
1631
|
}, BRANCH_SEARCH_DEBOUNCE_MS);
|
|
1380
1632
|
}
|
|
1381
1633
|
clearSearchTimers() {
|
|
@@ -1402,13 +1654,23 @@ const SallaBulletDelivery = class {
|
|
|
1402
1654
|
this.clearSearchTimers();
|
|
1403
1655
|
}
|
|
1404
1656
|
async loadBranchesWithLocation(lat, lng) {
|
|
1657
|
+
// Later list loads (city change, search) keep measuring from the device location.
|
|
1658
|
+
++this.shopperLocationRequestId;
|
|
1659
|
+
this.shopperLocation = { lat, lng };
|
|
1660
|
+
const request = ++this.branchesRequestId;
|
|
1405
1661
|
this.loadingBranches = true;
|
|
1406
1662
|
try {
|
|
1407
|
-
|
|
1663
|
+
const branches = await bulletDeliveryAPI.getBranches({
|
|
1408
1664
|
country_id: this.selectedCountry?.id,
|
|
1665
|
+
city_id: this.selectedBranchCity?.id,
|
|
1409
1666
|
lat,
|
|
1410
1667
|
lng,
|
|
1411
|
-
})
|
|
1668
|
+
});
|
|
1669
|
+
if (request !== this.branchesRequestId)
|
|
1670
|
+
return false;
|
|
1671
|
+
this.branchesServerQuery = '';
|
|
1672
|
+
this.applyLoadedBranches(branches);
|
|
1673
|
+
void this.refreshBranchCities();
|
|
1412
1674
|
// Auto-select country from first branch if no country is selected
|
|
1413
1675
|
if (!this.selectedCountry && this.branches.length > 0) {
|
|
1414
1676
|
const firstBranch = this.branches[0];
|
|
@@ -1422,9 +1684,11 @@ const SallaBulletDelivery = class {
|
|
|
1422
1684
|
}
|
|
1423
1685
|
}
|
|
1424
1686
|
}
|
|
1687
|
+
return true;
|
|
1425
1688
|
}
|
|
1426
1689
|
finally {
|
|
1427
|
-
this.
|
|
1690
|
+
if (request === this.branchesRequestId)
|
|
1691
|
+
this.loadingBranches = false;
|
|
1428
1692
|
}
|
|
1429
1693
|
}
|
|
1430
1694
|
/** Locate nearest branch using device geolocation (branches tab only). */
|
|
@@ -1433,6 +1697,7 @@ const SallaBulletDelivery = class {
|
|
|
1433
1697
|
this.locationError = Salla.lang.get("pages.checkout.current_location_not_supported");
|
|
1434
1698
|
return;
|
|
1435
1699
|
}
|
|
1700
|
+
const request = ++this.nearestBranchRequestId;
|
|
1436
1701
|
this.loadingNearestBranch = true;
|
|
1437
1702
|
this.locationError = "";
|
|
1438
1703
|
try {
|
|
@@ -1444,7 +1709,12 @@ const SallaBulletDelivery = class {
|
|
|
1444
1709
|
});
|
|
1445
1710
|
});
|
|
1446
1711
|
const { latitude, longitude } = position.coords;
|
|
1447
|
-
|
|
1712
|
+
if (request !== this.nearestBranchRequestId)
|
|
1713
|
+
return;
|
|
1714
|
+
if (!await this.loadBranchesWithLocation(latitude, longitude))
|
|
1715
|
+
return;
|
|
1716
|
+
if (request !== this.nearestBranchRequestId)
|
|
1717
|
+
return;
|
|
1448
1718
|
const nearestBranch = findNearestBranch(this.branches, latitude, longitude);
|
|
1449
1719
|
if (nearestBranch) {
|
|
1450
1720
|
this.selectedBranch = nearestBranch;
|
|
@@ -1453,26 +1723,56 @@ const SallaBulletDelivery = class {
|
|
|
1453
1723
|
}
|
|
1454
1724
|
}
|
|
1455
1725
|
catch (error) {
|
|
1726
|
+
if (request !== this.nearestBranchRequestId)
|
|
1727
|
+
return;
|
|
1456
1728
|
const geoError = error;
|
|
1457
1729
|
const code = typeof geoError?.code === "number" ? geoError.code : -1;
|
|
1458
|
-
this.locationError =
|
|
1730
|
+
this.locationError = this.geolocationErrorMessage(code);
|
|
1459
1731
|
}
|
|
1460
1732
|
finally {
|
|
1461
|
-
this.
|
|
1733
|
+
if (request === this.nearestBranchRequestId)
|
|
1734
|
+
this.loadingNearestBranch = false;
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
geolocationErrorMessage(code) {
|
|
1738
|
+
if (code === GEO_PERMISSION_DENIED) {
|
|
1739
|
+
return Salla.lang.getWithDefault("pages.checkout.allow_location_permission_blocked_hint", this.isArabic
|
|
1740
|
+
? "مشاركة الموقع محجوبة لهذا المتجر في متصفحك. افتح إعدادات الموقع في المتصفح، اسمح بالوصول إلى الموقع، ثم أعد المحاولة."
|
|
1741
|
+
: "Location sharing is blocked for this store in your browser. Open your browser's location settings, allow location access, then try again.");
|
|
1462
1742
|
}
|
|
1743
|
+
return Salla.lang.getWithDefault("pages.checkout.pickup_location_unavailable", this.isArabic ? "تعذَّر تحديد موقعك. حاول مرة أخرى." : "We couldn't detect your location. Try again.");
|
|
1463
1744
|
}
|
|
1464
1745
|
handleBranchSelect(branch) {
|
|
1465
1746
|
this.selectedBranch = branch;
|
|
1466
1747
|
this.allocationOutOfCoverageMessage = null;
|
|
1467
1748
|
}
|
|
1749
|
+
toggleBranchSchedule(branchId) {
|
|
1750
|
+
this.expandedScheduleBranchId = this.expandedScheduleBranchId === branchId ? null : branchId;
|
|
1751
|
+
}
|
|
1468
1752
|
/**
|
|
1469
1753
|
* Restore a remembered / event-provided branch — but only one the list renders as selectable,
|
|
1470
1754
|
* so a branch that has closed since it was remembered is never silently preselected (INV-1407).
|
|
1471
1755
|
*/
|
|
1472
|
-
preselectBranch(branchId) {
|
|
1473
|
-
if (branchId == null)
|
|
1756
|
+
async preselectBranch(branchId) {
|
|
1757
|
+
if (branchId == null || this.selectedBranch)
|
|
1474
1758
|
return;
|
|
1475
|
-
|
|
1759
|
+
let branch = this.branches.find((b) => b.id === branchId);
|
|
1760
|
+
if (!branch && this.allBranchCities) {
|
|
1761
|
+
const pending = this.allBranchCities;
|
|
1762
|
+
const request = this.branchesRequestId;
|
|
1763
|
+
try {
|
|
1764
|
+
branch = (await pending.branches).find((b) => b.id === branchId);
|
|
1765
|
+
}
|
|
1766
|
+
catch {
|
|
1767
|
+
return;
|
|
1768
|
+
}
|
|
1769
|
+
if (request !== this.branchesRequestId || this.activeTab !== 'branch' || this.allBranchCities !== pending || pending.countryId !== this.selectedCountry?.id || this.selectedBranch || this.branchSearchQuery.trim())
|
|
1770
|
+
return;
|
|
1771
|
+
if (this.selectedBranchCity && String(branch?.city?.id) !== String(this.selectedBranchCity.id))
|
|
1772
|
+
return;
|
|
1773
|
+
if (branch && isBranchSelectable(branch))
|
|
1774
|
+
this.applyLoadedBranches([...this.branches, branch]);
|
|
1775
|
+
}
|
|
1476
1776
|
if (branch && isBranchSelectable(branch)) {
|
|
1477
1777
|
this.selectedBranch = branch;
|
|
1478
1778
|
}
|
|
@@ -1733,6 +2033,48 @@ const SallaBulletDelivery = class {
|
|
|
1733
2033
|
}
|
|
1734
2034
|
/** Center shown before geolocation resolves — the customer's IP-based default (falls back to Riyadh). */
|
|
1735
2035
|
get mapInitialCenter() {
|
|
2036
|
+
return this.defaultGeoLocation ?? DEFAULT_MAP_CENTER;
|
|
2037
|
+
}
|
|
2038
|
+
/** Device location for a branch list request, waiting at most BRANCH_LIST_LOCATION_WAIT. */
|
|
2039
|
+
getListLocation() {
|
|
2040
|
+
const location = this.getGrantedDeviceLocation();
|
|
2041
|
+
if (this.shopperLocation || !navigator.geolocation || !navigator.permissions?.query)
|
|
2042
|
+
return location;
|
|
2043
|
+
return Promise.race([location, new Promise((resolve) => setTimeout(() => resolve({}), BRANCH_LIST_LOCATION_WAIT))]);
|
|
2044
|
+
}
|
|
2045
|
+
/**
|
|
2046
|
+
* Where branch distances (`distance_km`) are measured from: the shopper's real device location
|
|
2047
|
+
* only. It comes from "nearest to my location", or is read silently when location permission was
|
|
2048
|
+
* already granted (never prompting). Empty otherwise: `user.default_geo_location` and the Riyadh
|
|
2049
|
+
* map fallback are not where the shopper is, so they would show wrong distances.
|
|
2050
|
+
*/
|
|
2051
|
+
async getGrantedDeviceLocation() {
|
|
2052
|
+
if (this.shopperLocation)
|
|
2053
|
+
return this.shopperLocation;
|
|
2054
|
+
if (!navigator.geolocation || !navigator.permissions?.query)
|
|
2055
|
+
return {};
|
|
2056
|
+
const request = ++this.shopperLocationRequestId;
|
|
2057
|
+
try {
|
|
2058
|
+
const permission = await navigator.permissions.query({ name: 'geolocation' });
|
|
2059
|
+
if (request !== this.shopperLocationRequestId)
|
|
2060
|
+
return this.shopperLocation ?? {};
|
|
2061
|
+
if (permission.state !== 'granted')
|
|
2062
|
+
return {};
|
|
2063
|
+
const position = await new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition(resolve, reject, {
|
|
2064
|
+
timeout: SILENT_GEOLOCATION_TIMEOUT,
|
|
2065
|
+
maximumAge: SILENT_GEOLOCATION_MAX_AGE,
|
|
2066
|
+
}));
|
|
2067
|
+
if (request !== this.shopperLocationRequestId)
|
|
2068
|
+
return this.shopperLocation ?? {};
|
|
2069
|
+
this.shopperLocation = { lat: position.coords.latitude, lng: position.coords.longitude };
|
|
2070
|
+
return this.shopperLocation;
|
|
2071
|
+
}
|
|
2072
|
+
catch {
|
|
2073
|
+
return {};
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
/** The customer's IP-based `user.default_geo_location`, or null when it is missing or invalid. */
|
|
2077
|
+
get defaultGeoLocation() {
|
|
1736
2078
|
const geo = salla.config.get('user.default_geo_location');
|
|
1737
2079
|
// Coerce defensively: config may arrive as strings, blank/whitespace, NaN, or out-of-range
|
|
1738
2080
|
// values. Reject blanks before coercion (Number('') === 0) and validate lat/lng ranges so we
|
|
@@ -1741,7 +2083,7 @@ const SallaBulletDelivery = class {
|
|
|
1741
2083
|
const lng = this.toCoordinate(geo?.lng);
|
|
1742
2084
|
const isValid = lat != null && lng != null &&
|
|
1743
2085
|
lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;
|
|
1744
|
-
return isValid ? { lat, lng } :
|
|
2086
|
+
return isValid ? { lat, lng } : null;
|
|
1745
2087
|
}
|
|
1746
2088
|
/** Parse a config coordinate to a finite number, treating blank/whitespace strings as missing. */
|
|
1747
2089
|
toCoordinate(value) {
|
|
@@ -1755,6 +2097,8 @@ const SallaBulletDelivery = class {
|
|
|
1755
2097
|
async handleTabChange(tab) {
|
|
1756
2098
|
if (this.tabChanging)
|
|
1757
2099
|
return;
|
|
2100
|
+
++this.branchesRequestId;
|
|
2101
|
+
this.loadingBranches = false;
|
|
1758
2102
|
this.tabChanging = true;
|
|
1759
2103
|
try {
|
|
1760
2104
|
this.activeTab = tab;
|
|
@@ -1786,24 +2130,25 @@ const SallaBulletDelivery = class {
|
|
|
1786
2130
|
this.selectedCountry = this.countries[0];
|
|
1787
2131
|
}
|
|
1788
2132
|
}
|
|
2133
|
+
if (String(previousCountryId ?? '') !== String(this.selectedCountry?.id ?? '')) {
|
|
2134
|
+
this.allBranchCities = null;
|
|
2135
|
+
this.selectedBranchCity = null;
|
|
2136
|
+
this.branchCities = [];
|
|
2137
|
+
this.branchCitySearchQuery = '';
|
|
2138
|
+
this.selectedBranch = null;
|
|
2139
|
+
this.branches = [];
|
|
2140
|
+
this.filteredBranches = [];
|
|
2141
|
+
}
|
|
1789
2142
|
if (tab === "address" && this.needsMap)
|
|
1790
2143
|
this.fetchAddressToken();
|
|
1791
2144
|
// Load appropriate data when switching tabs if country is selected
|
|
1792
2145
|
if (this.selectedCountry) {
|
|
1793
2146
|
if (tab === "branch") {
|
|
1794
2147
|
// Load branches when switching to branch tab
|
|
1795
|
-
// Check session storage for lat/lng to get nearby branches
|
|
1796
2148
|
const savedIntent = this.getStoredIntent();
|
|
1797
|
-
|
|
1798
|
-
const intentLng = getIntentLongitude(savedIntent);
|
|
1799
|
-
if (intentLat != null && intentLng != null) {
|
|
1800
|
-
await this.loadBranchesWithLocation(intentLat, intentLng);
|
|
1801
|
-
}
|
|
1802
|
-
else {
|
|
1803
|
-
await this.loadBranches();
|
|
1804
|
-
}
|
|
2149
|
+
await this.loadBranches();
|
|
1805
2150
|
// Preselect branch from session storage if available
|
|
1806
|
-
this.preselectBranch(getIntentBranchId(savedIntent));
|
|
2151
|
+
void this.preselectBranch(getIntentBranchId(savedIntent));
|
|
1807
2152
|
}
|
|
1808
2153
|
else if (tab === "address") {
|
|
1809
2154
|
// Lazy-load saved addresses when switching to address tab (if not loaded yet).
|
|
@@ -1929,7 +2274,7 @@ const SallaBulletDelivery = class {
|
|
|
1929
2274
|
if (await this.tryAutoConfirmAfterLogin())
|
|
1930
2275
|
return;
|
|
1931
2276
|
if (!this.modal?.hasAttribute?.("visible") || !this.isLoggedIn) {
|
|
1932
|
-
this.open();
|
|
2277
|
+
this.open(false, "after_login");
|
|
1933
2278
|
}
|
|
1934
2279
|
}
|
|
1935
2280
|
buildIntentAddress() {
|
|
@@ -2208,13 +2553,14 @@ const SallaBulletDelivery = class {
|
|
|
2208
2553
|
}
|
|
2209
2554
|
return raw;
|
|
2210
2555
|
}
|
|
2211
|
-
async handleConfirm() {
|
|
2556
|
+
async handleConfirm(intentBeforeDraft) {
|
|
2212
2557
|
if (this.isConfirmDisabled() || this.confirming)
|
|
2213
2558
|
return;
|
|
2214
2559
|
this.allocationOutOfCoverageMessage = null;
|
|
2215
2560
|
this.confirming = true;
|
|
2216
2561
|
this.confirmBtn?.load();
|
|
2217
2562
|
let scheduledRedirect = false;
|
|
2563
|
+
const previousIntent = intentBeforeDraft === undefined ? this.getStoredIntent() : intentBeforeDraft;
|
|
2218
2564
|
try {
|
|
2219
2565
|
// A guest map pin uses the pin's own country; the IP/selected country may differ from it.
|
|
2220
2566
|
const country = this.activeTab === "address" && this.isGuestMapPick
|
|
@@ -2232,6 +2578,7 @@ const SallaBulletDelivery = class {
|
|
|
2232
2578
|
const savedAddress = await this.saveSessionAddressToProfile();
|
|
2233
2579
|
if (!savedAddress) {
|
|
2234
2580
|
Salla.notify?.error(Salla.lang.get("common.errors.error_occurred"));
|
|
2581
|
+
this.trackSelectorResult("failed", previousIntent, []);
|
|
2235
2582
|
this.confirmBtn?.stop();
|
|
2236
2583
|
return;
|
|
2237
2584
|
}
|
|
@@ -2305,9 +2652,17 @@ const SallaBulletDelivery = class {
|
|
|
2305
2652
|
(this.activeTab === "address"
|
|
2306
2653
|
? Salla.lang.get("pages.checkout.address_out_of_coverage")
|
|
2307
2654
|
: Salla.lang.get("pages.checkout.failed_to_set_pickup"));
|
|
2308
|
-
this.allocationOutOfCoverageMessage = `${errorMessage}.`;
|
|
2655
|
+
this.allocationOutOfCoverageMessage = /[.!؟?]$/.test(errorMessage.trim()) ? errorMessage : `${errorMessage}.`;
|
|
2656
|
+
this.trackSelectorResult("failed", previousIntent, []);
|
|
2309
2657
|
this.confirmBtn?.stop();
|
|
2310
2658
|
this.confirming = false;
|
|
2659
|
+
// A rejected branch may have turned busy or closed: drop it (the reload may hide it) and
|
|
2660
|
+
// reload so the list shows its current state.
|
|
2661
|
+
if (this.activeTab === "branch") {
|
|
2662
|
+
this.selectedBranch = null;
|
|
2663
|
+
clearApiCache();
|
|
2664
|
+
void this.loadBranches();
|
|
2665
|
+
}
|
|
2311
2666
|
return;
|
|
2312
2667
|
}
|
|
2313
2668
|
// Process successful allocation response
|
|
@@ -2342,6 +2697,7 @@ const SallaBulletDelivery = class {
|
|
|
2342
2697
|
const scopeApplied = await bulletDeliveryAPI.setDeliveryScope(allocatedScopeId);
|
|
2343
2698
|
if (!scopeApplied) {
|
|
2344
2699
|
this.allocationOutOfCoverageMessage = `${Salla.lang.get("common.errors.error_occurred")}.`;
|
|
2700
|
+
this.trackSelectorResult("failed", previousIntent, [], allocatedScopeId);
|
|
2345
2701
|
this.confirmBtn?.stop();
|
|
2346
2702
|
this.confirming = false;
|
|
2347
2703
|
return;
|
|
@@ -2361,6 +2717,7 @@ const SallaBulletDelivery = class {
|
|
|
2361
2717
|
// After allocation success: persist latest intent so switch UI can always reflect
|
|
2362
2718
|
// the selected address/branch once confirmed.
|
|
2363
2719
|
this.setStoredIntent({ ...result, scope_allocated: true });
|
|
2720
|
+
this.trackSelectorResult("accepted", previousIntent, allocatedBranchIds(result), allocatedScopeId);
|
|
2364
2721
|
const allocationConfirmedPayload = {
|
|
2365
2722
|
...result,
|
|
2366
2723
|
address: this.buildAllocationConfirmedAddressData(selectedAddress),
|
|
@@ -2471,6 +2828,19 @@ const SallaBulletDelivery = class {
|
|
|
2471
2828
|
wrapper.append(info, btn);
|
|
2472
2829
|
return wrapper;
|
|
2473
2830
|
}
|
|
2831
|
+
/**
|
|
2832
|
+
* A branch pickup offer (INV-1416) replaces the default "save delivery fees" badge; only one shows,
|
|
2833
|
+
* and neither until the offer lookup settles.
|
|
2834
|
+
*/
|
|
2835
|
+
renderPickupTabBadge() {
|
|
2836
|
+
if (!this.pickupDiscountResolved)
|
|
2837
|
+
return null;
|
|
2838
|
+
const range = this.pickupDiscountRange;
|
|
2839
|
+
if (range) {
|
|
2840
|
+
return (h("span", { class: "s-bullet-delivery-tab-badge s-bullet-delivery-discount-badge", dir: this.isArabic ? 'rtl' : 'ltr', innerHTML: this.getPickupDiscountLabel(range.type, range.min, range.max) }));
|
|
2841
|
+
}
|
|
2842
|
+
return (h("span", { class: "s-bullet-delivery-tab-badge" }, h("span", { class: "s-bullet-delivery-tab-badge-icon", innerHTML: LightningIcon, "aria-hidden": "true" }), Salla.lang.getWithDefault("pages.checkout.save_delivery_fees", "وفّر رسوم التوصيل")));
|
|
2843
|
+
}
|
|
2474
2844
|
renderTabs() {
|
|
2475
2845
|
// Show tabs only when pickup is supported; otherwise delivery-only view with no tabs.
|
|
2476
2846
|
// The pickup tab is gated by this same `supportsPickup` check, while the delivery
|
|
@@ -2480,10 +2850,10 @@ const SallaBulletDelivery = class {
|
|
|
2480
2850
|
return (h("div", { class: "s-bullet-delivery-tabs" }, this.isSupportsDelivery && (h("button", { type: "button", class: {
|
|
2481
2851
|
"s-bullet-delivery-tab": true,
|
|
2482
2852
|
"s-bullet-delivery-tab--active": this.activeTab === "address",
|
|
2483
|
-
}, onClick: () => this.handleTabChange("address") }, h("span",
|
|
2853
|
+
}, onClick: () => this.handleTabChange("address") }, h("span", null, Salla.lang.get("mobile_app.strings.delivery")))), h("button", { type: "button", class: {
|
|
2484
2854
|
"s-bullet-delivery-tab": true,
|
|
2485
2855
|
"s-bullet-delivery-tab--active": this.activeTab === "branch",
|
|
2486
|
-
}, onClick: () => this.handleTabChange("branch") }, h("span",
|
|
2856
|
+
}, onClick: () => this.handleTabChange("branch") }, h("span", null, Salla.lang.get("mobile_app.strings.pickup")), this.renderPickupTabBadge())));
|
|
2487
2857
|
}
|
|
2488
2858
|
renderAlert(message) {
|
|
2489
2859
|
return (h("div", { class: "s-bullet-delivery-allocation-out-of-coverage", role: "alert" }, h("span", { class: "s-bullet-delivery-allocation-out-of-coverage-icon", "aria-hidden": "true" }, h("svg", { width: "20", height: "20", viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", role: "img", "aria-hidden": "true" }, h("title", null, "Information"), h("circle", { cx: "10", cy: "10", r: "9", stroke: "currentColor", "stroke-width": "1.5", fill: "currentColor" }), h("text", { x: "10", y: "14", "text-anchor": "middle", fill: "white", "font-size": "12", "font-weight": "bold" }, "i"))), h("span", { class: "s-bullet-delivery-allocation-out-of-coverage-text", style: { textAlign: this.isRTL ? 'right' : 'left' } }, message)));
|
|
@@ -2507,8 +2877,9 @@ const SallaBulletDelivery = class {
|
|
|
2507
2877
|
}
|
|
2508
2878
|
return this.renderAlert(`${message} ${Salla.lang.getWithDefault('pages.cart.choose_another_address', 'Choose another address')}`);
|
|
2509
2879
|
}
|
|
2510
|
-
|
|
2511
|
-
|
|
2880
|
+
/** `showLabel` is off in the pickup filter panel, where the selects sit label-less side by side. */
|
|
2881
|
+
renderCountrySelect(showLabel = true) {
|
|
2882
|
+
return (h("div", { class: "s-bullet-delivery-field" }, h("salla-searchable-dropdown", { label: showLabel ? Salla.lang.get("blocks.buy_as_gift.receiver_country") : undefined, placeholder: Salla.lang.get("pages.checkout.select_country"), items: this.displayedCountries, selectedItem: this.selectedCountry, loading: this.loadingCountries, searching: this.searchingCountries, disabled: this.countries.length <= 1, required: true, inputId: "bullet-delivery-country", searchQuery: this.countrySearchQuery, clientSearch: true, onItemSelected: (e) => this.handleCountrySelected(e.detail), onSearchInput: (e) => this.handleCountrySearch(e.detail), onDropdownClosed: () => this.handleCountryDropdownClosed() })));
|
|
2512
2883
|
}
|
|
2513
2884
|
/** Region select (SA only): shown when SA is selected; city and district disabled until region selected. */
|
|
2514
2885
|
renderRegionSelect() {
|
|
@@ -2753,66 +3124,146 @@ const SallaBulletDelivery = class {
|
|
|
2753
3124
|
return (h("form", { onSubmit: handleSubmit }, this.renderGuestDeliveryForm(), h("div", { class: "s-bullet-delivery-form-actions s-bullet-delivery-form-actions--single", style: { padding: '24px' } }, h("salla-button", { type: "submit", loading: this.confirming, disabled: !canSubmit || this.confirming, width: "wide" }, submitLabel), !this.isLoggedIn && (h("button", { type: "button", class: "s-bullet-delivery-login-prompt", onClick: () => this.handleLogin() }, Salla.lang.get('pages.checkout.login_to_use_saved_addresses'))))));
|
|
2754
3125
|
}
|
|
2755
3126
|
renderBranchSearch() {
|
|
2756
|
-
return (h("div", { class: "s-bullet-delivery-branch-search" }, h("div", { class: "s-bullet-delivery-search-row" }, h("div", { class: "s-bullet-delivery-search s-bullet-delivery-branch-search-wrap" }, h("span", { class: "s-bullet-delivery-search-icon s-bullet-delivery-branch-search-icon", innerHTML: Search, "aria-hidden": "true" }), h("input", { type: "text", class: "s-bullet-delivery-branch-search-input form-input", placeholder: Salla.lang.
|
|
3127
|
+
return (h("div", { class: "s-bullet-delivery-branch-search" }, h("div", { class: "s-bullet-delivery-search-row" }, h("div", { class: "s-bullet-delivery-search s-bullet-delivery-branch-search-wrap" }, h("span", { class: "s-bullet-delivery-search-icon s-bullet-delivery-branch-search-icon", innerHTML: Search, "aria-hidden": "true" }), h("input", { type: "text", class: "s-bullet-delivery-branch-search-input form-input", placeholder: Salla.lang.getWithDefault("pages.checkout.search_for_country_city_or_branch", this.isArabic ? "ابحث عن دولة أو مدينة أو فرع" : "Search for a country, city or branch"), value: this.branchSearchQuery, onInput: (e) => this.handleBranchSearch(e), autocomplete: "off" })), h("button", { type: "button", class: {
|
|
2757
3128
|
"s-bullet-delivery-location-btn": true,
|
|
2758
3129
|
"s-bullet-delivery-location-btn--full": true,
|
|
2759
3130
|
"s-bullet-delivery-location-btn--loading": this.loadingNearestBranch,
|
|
2760
|
-
}, onClick: () => this.handleFindNearestBranch(), disabled: this.loadingNearestBranch }, this.loadingNearestBranch ? (h("span", { class: "s-bullet-delivery-location-icon", "aria-hidden": "true" }, h("salla-skeleton", { height: "
|
|
2761
|
-
}
|
|
2762
|
-
/** Renders a branch's `preparation_time_range` as a localized "from - to <unit>" label. */
|
|
2763
|
-
getPreparationTimeLabel(range) {
|
|
2764
|
-
if (!range)
|
|
2765
|
-
return null;
|
|
2766
|
-
const unitKeys = {
|
|
2767
|
-
hour: 'pages.checkout.preparation_time_hours',
|
|
2768
|
-
minute: 'pages.checkout.preparation_time_minutes',
|
|
2769
|
-
day: 'pages.checkout.preparation_time_days',
|
|
2770
|
-
};
|
|
2771
|
-
const key = unitKeys[range.from.unit];
|
|
2772
|
-
if (!key)
|
|
2773
|
-
return null;
|
|
2774
|
-
return Salla.lang
|
|
2775
|
-
.getWithDefault(key, 'من {from} إلى {to} دقائق')
|
|
2776
|
-
?.replace('{from}', String(range.from.value))
|
|
2777
|
-
?.replace('{to}', String(range.to.value));
|
|
3131
|
+
}, onClick: () => this.handleFindNearestBranch(), disabled: this.loadingNearestBranch, "aria-label": Salla.lang.get("pages.checkout.nearest_to_my_location") }, this.loadingNearestBranch ? (h("span", { class: "s-bullet-delivery-location-icon", "aria-hidden": "true" }, h("salla-skeleton", { height: "16px", width: "16px" }))) : (h("span", { class: "s-bullet-delivery-location-icon", innerHTML: Location, "aria-hidden": "true" })), h("span", { class: "s-bullet-delivery-location-label" }, Salla.lang.get("pages.checkout.nearest_to_my_location")))), this.locationError && this.activeTab === "branch" && (h("span", { class: "s-bullet-delivery-error" }, this.locationError))));
|
|
2778
3132
|
}
|
|
2779
3133
|
renderBranchList() {
|
|
2780
3134
|
if (this.loadingBranches) {
|
|
2781
3135
|
return (h("div", { class: "s-bullet-delivery-branches-wrap" }, h("div", { class: "s-bullet-delivery-branches-loading" }, [1, 2, 3, 4].map((v) => (h("div", { key: v, class: "s-bullet-delivery-branch-skeleton" }, h("salla-skeleton", { class: "s-bullet-delivery-branch-skeleton-radio", type: "circle", height: "16px", width: "16px" }), h("div", { class: "s-bullet-delivery-branch-skeleton-icon" }, h("salla-skeleton", { height: "34px", width: "34px" })), h("div", { class: "s-bullet-delivery-branch-skeleton-content" }, h("salla-skeleton", { class: "s-bullet-delivery-branch-skeleton-title", height: "12px", width: "124px" })), h("salla-skeleton", { class: "s-bullet-delivery-branch-skeleton-time", height: "12px", width: "88px" }), h("div", { class: "s-bullet-delivery-branch-skeleton-map" }, h("salla-skeleton", { height: "32px", width: "32px" }))))))));
|
|
2782
3136
|
}
|
|
2783
|
-
|
|
3137
|
+
const branches = this.filteredBranches.filter(isBranchVisible);
|
|
3138
|
+
if (branches.length === 0) {
|
|
2784
3139
|
return (h("salla-placeholder", { alignment: "center", class: "s-bullet-delivery-placeholder" }, h("span", { slot: "title" }, Salla.lang.get("pages.checkout.no_pickup_branches_found"))));
|
|
2785
3140
|
}
|
|
2786
|
-
return (h("div", { class: "s-bullet-delivery-branches-wrap" }, h("ul", { class: "s-bullet-delivery-branches-list s-scrollbar" },
|
|
3141
|
+
return (h("div", { class: "s-bullet-delivery-branches-wrap" }, h("ul", { class: "s-bullet-delivery-branches-list s-scrollbar", role: "listbox" }, branches.map(branch => {
|
|
2787
3142
|
const selectable = isBranchSelectable(branch);
|
|
2788
|
-
const
|
|
3143
|
+
const isSelected = this.selectedBranch?.id === branch.id;
|
|
2789
3144
|
const locationText = [branch.country?.name, branch.city?.name, branch.district?.name]
|
|
2790
3145
|
.filter(Boolean)
|
|
2791
|
-
.join('
|
|
2792
|
-
const
|
|
3146
|
+
.join('، ');
|
|
3147
|
+
const distance = formatBranchDistance(branch.distance_km);
|
|
3148
|
+
// Closed but taking orders: the opening-time readiness replaces the range.
|
|
3149
|
+
const readinessLabel = getBranchReadinessLabel(branch) ?? this.getReadyTodayLabel(branch);
|
|
3150
|
+
const preparationLabel = readinessLabel ? null : this.getPreparationShortLabel(branch.preparation_time_range);
|
|
3151
|
+
const scheduleGroups = groupBranchSchedule(getBranchWeekSchedule(branch));
|
|
3152
|
+
// An always-open branch has no hours worth listing, so it gets no working-hours dropdown.
|
|
3153
|
+
const hasSchedule = scheduleGroups.length > 0 && !isBranchAlwaysOpen(branch);
|
|
3154
|
+
const scheduleOpen = hasSchedule && this.expandedScheduleBranchId === branch.id;
|
|
3155
|
+
const phoneHref = getBranchPhoneHref(branch);
|
|
3156
|
+
const whatsappHref = getBranchWhatsappHref(branch);
|
|
3157
|
+
const directionsHref = getBranchDirectionsHref(branch);
|
|
3158
|
+
const discount = getBranchDiscount(branch);
|
|
2793
3159
|
return (h("li", { key: branch.id, class: {
|
|
2794
3160
|
's-bullet-delivery-branch-item': true,
|
|
2795
|
-
's-bullet-delivery-branch-item--selected':
|
|
3161
|
+
's-bullet-delivery-branch-item--selected': isSelected,
|
|
2796
3162
|
's-bullet-delivery-branch-item--disabled': !selectable,
|
|
2797
|
-
}, tabIndex: selectable ? 0 : -1, role: "option", "aria-disabled": !selectable, onClick: () => selectable && this.handleBranchSelect(branch), onKeyDown: e => {
|
|
3163
|
+
}, tabIndex: selectable ? 0 : -1, role: "option", "aria-selected": isSelected, "aria-disabled": !selectable, onClick: () => selectable && this.handleBranchSelect(branch), onKeyDown: e => {
|
|
3164
|
+
if (e.target !== e.currentTarget)
|
|
3165
|
+
return;
|
|
2798
3166
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
2799
3167
|
e.preventDefault();
|
|
2800
3168
|
if (selectable)
|
|
2801
3169
|
this.handleBranchSelect(branch);
|
|
2802
3170
|
}
|
|
2803
|
-
} }, h("input", { type: "radio", name: "branch", class: "s-bullet-delivery-radio", checked:
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
3171
|
+
} }, h("input", { type: "radio", name: "branch", class: "s-bullet-delivery-radio s-bullet-delivery-branch-radio", checked: isSelected, disabled: !selectable, tabIndex: -1 }), h("div", { class: "s-bullet-delivery-branch-body" }, h("p", { class: "s-bullet-delivery-branch-name" }, h("span", null, branch.name), discount ? (h("span", { class: "s-bullet-delivery-discount-badge", dir: this.isArabic ? 'rtl' : 'ltr', innerHTML: this.getPickupDiscountLabel(discount.type, discount.amount) })) : null), locationText ? (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-location" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: BranchLocationIcon, "aria-hidden": "true" }), h("span", null, locationText))) : null, isSelected && branch.pickup_instructions ? (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-instructions" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: NotesIcon, "aria-hidden": "true" }), h("span", null, branch.pickup_instructions))) : null, h("div", { class: "s-bullet-delivery-branch-meta-row" }, distance || readinessLabel || preparationLabel ? (h("div", { class: "s-bullet-delivery-branch-pills" }, distance ? (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-pill s-bullet-delivery-branch-distance" }, h("i", { class: "sicon-location" }), h("span", null, this.renderDistanceLabel(distance)))) : null, readinessLabel ? (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-pill s-bullet-delivery-branch-prep" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: PickupAvailabilityIcon, "aria-hidden": "true" }), h("span", { class: "s-bullet-delivery-branch-meta-value" }, readinessLabel))) : preparationLabel ? (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-pill s-bullet-delivery-branch-prep" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: PickupAvailabilityIcon, "aria-hidden": "true" }), h("span", null, h("span", { class: "s-bullet-delivery-branch-meta-label" }, Salla.lang.getWithDefault('pages.checkout.pickup_branch_ready_in', 'Pickup available after:'), ' '), h("span", { class: "s-bullet-delivery-branch-meta-value" }, preparationLabel)))) : null)) : null, h("hr", { class: "s-bullet-delivery-branch-divider" }), this.renderBranchOpenStatus(branch, hasSchedule, scheduleOpen)), scheduleOpen && (h("div", { class: "s-bullet-delivery-branch-schedule" }, scheduleGroups.map((group, index) => (h("div", { key: index, class: "s-bullet-delivery-branch-schedule-day" }, h("span", { class: "s-bullet-delivery-branch-schedule-days" }, group.days.length > 1
|
|
3172
|
+
? `${group.days[0]} - ${group.days[group.days.length - 1]}`
|
|
3173
|
+
: group.days[0]), h("span", { class: "s-bullet-delivery-branch-schedule-times" }, group.times
|
|
3174
|
+
.map(t => `${this.formatClock(t.start)} - ${this.formatClock(t.end)}`)
|
|
3175
|
+
.join(this.isArabic ? '، ' : ', ')))))))), h("div", { class: "s-bullet-delivery-branch-actions" }, phoneHref && (h("a", { href: phoneHref, class: "s-bullet-delivery-branch-action", title: Salla.lang.getWithDefault('pages.checkout.branch_call', 'اتصال'), onClick: e => e.stopPropagation() }, h("i", { class: "sicon-phone" }))), whatsappHref && (h("a", { href: whatsappHref, target: "_blank", rel: "noopener noreferrer", class: "s-bullet-delivery-branch-action", title: Salla.lang.getWithDefault('pages.checkout.branch_whatsapp', 'واتساب'), onClick: e => e.stopPropagation() }, h("i", { class: "sicon-whatsapp2" }))), directionsHref && (h("a", { href: directionsHref, target: "_blank", rel: "noopener noreferrer", class: "s-bullet-delivery-branch-action s-bullet-delivery-branch-map-link", title: Salla.lang.get('common.elements.open_in_google_maps'), onClick: e => e.stopPropagation() }, h("span", { class: "s-bullet-delivery-branch-map-link-icon", innerHTML: GetDirections.replace(/mask0_25437_34440/g, `mask0_branch_${branch.id}`), "aria-hidden": "true" }), h("span", { class: "sr-only" }, Salla.lang.get('common.elements.open_in_google_maps')))))));
|
|
2808
3176
|
}))));
|
|
2809
3177
|
}
|
|
3178
|
+
/** "يبعد عنك: ~" stays muted; the distance and its unit read as the value, as in checkout. */
|
|
3179
|
+
renderDistanceLabel(distance) {
|
|
3180
|
+
const template = Salla.lang.getWithDefault('pages.checkout.branch_distance_from_you', 'يبعد عنك: ~ {distance} كم');
|
|
3181
|
+
const index = template.indexOf('{distance}');
|
|
3182
|
+
if (index === -1)
|
|
3183
|
+
return template;
|
|
3184
|
+
return [
|
|
3185
|
+
h("span", { class: "s-bullet-delivery-branch-meta-label" }, template.slice(0, index)),
|
|
3186
|
+
h("span", { class: "s-bullet-delivery-branch-meta-value" }, template.slice(index).replace('{distance}', distance)),
|
|
3187
|
+
];
|
|
3188
|
+
}
|
|
3189
|
+
get isArabic() {
|
|
3190
|
+
return (Salla.lang.getLocale?.() ?? document.documentElement.lang) === 'ar';
|
|
3191
|
+
}
|
|
3192
|
+
formatClock(time) {
|
|
3193
|
+
return formatBranchClockTime(time, this.isArabic ? 'ar' : 'en');
|
|
3194
|
+
}
|
|
3195
|
+
/** "جاهز اليوم 10:00 ص" for a branch that is closed now and opens later today. */
|
|
3196
|
+
getReadyTodayLabel(branch) {
|
|
3197
|
+
const time = getBranchReadyTodayTime(branch);
|
|
3198
|
+
return time
|
|
3199
|
+
? `${Salla.lang.getWithDefault('pages.checkout.pickup_branch_ready_today_at', 'جاهز اليوم')} ${this.formatClock(time)}`
|
|
3200
|
+
: null;
|
|
3201
|
+
}
|
|
3202
|
+
/** "15-30 د" — compact preparation range for the card's meta row. */
|
|
3203
|
+
getPreparationShortLabel(range) {
|
|
3204
|
+
if (!range?.from || !range?.to)
|
|
3205
|
+
return null;
|
|
3206
|
+
const unitKeys = {
|
|
3207
|
+
minute: ['pages.checkout.preparation_time_minute_short', 'د'],
|
|
3208
|
+
hour: ['pages.checkout.preparation_time_hour_short', 'س'],
|
|
3209
|
+
day: ['pages.checkout.preparation_time_day_short', 'يوم'],
|
|
3210
|
+
};
|
|
3211
|
+
const unit = (u) => (unitKeys[u] ? Salla.lang.getWithDefault(unitKeys[u][0], unitKeys[u][1]) : null);
|
|
3212
|
+
const fromUnit = unit(range.from.unit);
|
|
3213
|
+
const toUnit = unit(range.to.unit);
|
|
3214
|
+
if (!fromUnit || !toUnit)
|
|
3215
|
+
return null;
|
|
3216
|
+
return range.from.unit === range.to.unit
|
|
3217
|
+
? `${range.from.value}-${range.to.value} ${toUnit}`
|
|
3218
|
+
: `${range.from.value} ${fromUnit} - ${range.to.value} ${toUnit}`;
|
|
3219
|
+
}
|
|
3220
|
+
/**
|
|
3221
|
+
* Busy, always-open, or the backend's `open_status_line` ("مفتوح - يغلق عند 11:00 م"), which reads
|
|
3222
|
+
* the hours on the branch's clock. Without that line, `is_open` gives a bare open/closed label.
|
|
3223
|
+
*/
|
|
3224
|
+
renderBranchOpenStatus(branch, hasSchedule, scheduleOpen) {
|
|
3225
|
+
const toggle = hasSchedule && (h("button", { type: "button", class: "s-bullet-delivery-branch-schedule-toggle", "aria-expanded": scheduleOpen ? 'true' : 'false', "aria-label": Salla.lang.getWithDefault('pages.checkout.pickup_show_weekly_hours', 'عرض ساعات العمل الأسبوعية'), onClick: e => {
|
|
3226
|
+
e.stopPropagation();
|
|
3227
|
+
this.toggleBranchSchedule(branch.id);
|
|
3228
|
+
} }, h("i", { class: { 'sicon-keyboard_arrow_down': true, 'is-expanded': scheduleOpen } })));
|
|
3229
|
+
if (isBranchBusy(branch)) {
|
|
3230
|
+
return (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-open-status" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: WorkingHoursIcon, "aria-hidden": "true" }), h("span", { class: "s-bullet-delivery-pickup-status--busy" }, Salla.lang.getWithDefault('pages.checkout.pickup_branch_busy', 'مشغول، لا يستقبل طلبات')), toggle));
|
|
3231
|
+
}
|
|
3232
|
+
const alwaysOpen = isBranchAlwaysOpen(branch);
|
|
3233
|
+
const line = branch.pickup_readiness?.open_status_line;
|
|
3234
|
+
if (!alwaysOpen && line) {
|
|
3235
|
+
return (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-open-status" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: WorkingHoursIcon, "aria-hidden": "true" }), h("span", null, line), toggle));
|
|
3236
|
+
}
|
|
3237
|
+
if (!alwaysOpen && !hasSchedule)
|
|
3238
|
+
return null;
|
|
3239
|
+
if (!alwaysOpen && typeof branch.is_open !== 'boolean') {
|
|
3240
|
+
return h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-open-status" }, toggle);
|
|
3241
|
+
}
|
|
3242
|
+
const isOpen = alwaysOpen || branch.is_open;
|
|
3243
|
+
const label = alwaysOpen
|
|
3244
|
+
? Salla.lang.getWithDefault('pages.checkout.pickup_branch_always_open', 'مفتوح دائمًا 24/7')
|
|
3245
|
+
: isOpen
|
|
3246
|
+
? Salla.lang.getWithDefault('pages.checkout.pickup_branch_open', 'مفتوح')
|
|
3247
|
+
: Salla.lang.getWithDefault('pages.checkout.pickup_branch_closed', 'مغلق');
|
|
3248
|
+
return (h("span", { class: "s-bullet-delivery-branch-meta s-bullet-delivery-branch-open-status" }, h("span", { class: "s-bullet-delivery-branch-meta-icon", innerHTML: WorkingHoursIcon, "aria-hidden": "true" }), h("span", { class: isOpen ? 's-bullet-delivery-pickup-status--open' : 's-bullet-delivery-pickup-status--closed' }, label), toggle));
|
|
3249
|
+
}
|
|
2810
3250
|
renderPickupTab() {
|
|
2811
3251
|
return (h("div", { class: {
|
|
2812
3252
|
"s-bullet-delivery-content": true,
|
|
2813
3253
|
"s-bullet-delivery-content--active": this.activeTab === "branch",
|
|
2814
3254
|
"s-hidden": this.activeTab !== "branch",
|
|
2815
|
-
} }, this.renderCountrySelect(), this.renderBranchSearch(), this.renderBranchList()));
|
|
3255
|
+
} }, h("div", { class: "s-bullet-delivery-pickup-filters" }, h("div", { class: "s-bullet-delivery-pickup-filters-row" }, this.renderCountrySelect(false), this.renderBranchCitySelect()), this.renderBranchSearch()), this.renderBranchList()));
|
|
3256
|
+
}
|
|
3257
|
+
/** City filter for the pickup list; options come from the branches themselves, so none is empty. */
|
|
3258
|
+
renderBranchCitySelect() {
|
|
3259
|
+
return (h("div", { class: "s-bullet-delivery-field" }, h("salla-searchable-dropdown", { placeholder: Salla.lang.get("pages.checkout.select_city"), items: [{ id: -1, name: Salla.lang.getWithDefault('pages.checkout.all_cities', this.isArabic ? 'كل المدن' : 'All cities') }, ...this.branchCities], selectedItem: this.selectedBranchCity, loading: this.loadingBranches && this.branchCities.length === 0, disabled: this.branchCities.length === 0 && !this.selectedBranchCity, inputId: "bullet-delivery-branch-city", searchQuery: this.branchCitySearchQuery, clientSearch: true, onItemSelected: (e) => {
|
|
3260
|
+
this.branchCitySearchQuery = '';
|
|
3261
|
+
this.handleBranchCitySelected(e.detail);
|
|
3262
|
+
}, onSearchInput: (e) => {
|
|
3263
|
+
this.branchCitySearchQuery = e.detail;
|
|
3264
|
+
}, onDropdownClosed: () => {
|
|
3265
|
+
this.branchCitySearchQuery = '';
|
|
3266
|
+
} })));
|
|
2816
3267
|
}
|
|
2817
3268
|
/** Add-address form: map + confirm card in one screen, or dropdown fallback. */
|
|
2818
3269
|
renderAddAddressForm() {
|
|
@@ -2854,7 +3305,7 @@ const SallaBulletDelivery = class {
|
|
|
2854
3305
|
return (h("div", { class: "s-bullet-delivery-footer" }, h("salla-button", { ref: (btn) => {
|
|
2855
3306
|
this.confirmBtn = btn;
|
|
2856
3307
|
}, disabled: this.isConfirmDisabled(), onClick: () => this.handleConfirm(), "loader-position": "center", width: "wide" }, this.activeTab === "branch"
|
|
2857
|
-
? Salla.lang.
|
|
3308
|
+
? Salla.lang.getWithDefault("pages.checkout.confirm_receipt_from_the_branch", "تأكيد الإستلام من الفرع")
|
|
2858
3309
|
: Salla.lang.get("pages.checkout.confirm_address")), showAddAddressInFooter && (h("salla-button", { onClick: () => this.handleAddNewAddress(), width: "wide", shape: "link" }, Salla.lang.get("pages.checkout.add_new_address"))), !this.isLoggedIn && (h("salla-button", { shape: "link", onClick: () => this.handleLogin() }, Salla.lang.get("pages.checkout.login_to_use_saved_addresses")))));
|
|
2859
3310
|
}
|
|
2860
3311
|
renderMainView() {
|
|
@@ -2880,7 +3331,7 @@ const SallaBulletDelivery = class {
|
|
|
2880
3331
|
if (canOpenForIncompleteIntent) {
|
|
2881
3332
|
this.markIncompleteIntentPrompted();
|
|
2882
3333
|
}
|
|
2883
|
-
this.open();
|
|
3334
|
+
this.open(false, canOpenForIncompleteIntent ? "incomplete_intent" : "after_add_to_cart");
|
|
2884
3335
|
}
|
|
2885
3336
|
overrideScopeSwitchUI() {
|
|
2886
3337
|
const intent = this.getStoredIntent();
|
|
@@ -2933,7 +3384,7 @@ const SallaBulletDelivery = class {
|
|
|
2933
3384
|
// silently awaiting with nothing visible.
|
|
2934
3385
|
if (!this.isGuestUser()) {
|
|
2935
3386
|
if (!this.modal?.hasAttribute?.("visible")) {
|
|
2936
|
-
this.open();
|
|
3387
|
+
this.open(false, "checkout_gate");
|
|
2937
3388
|
}
|
|
2938
3389
|
await this.pendingCartSubmitPromise;
|
|
2939
3390
|
return;
|
|
@@ -2962,7 +3413,7 @@ const SallaBulletDelivery = class {
|
|
|
2962
3413
|
this.openGuestLogin();
|
|
2963
3414
|
return;
|
|
2964
3415
|
}
|
|
2965
|
-
this.open();
|
|
3416
|
+
this.open(false, "checkout_gate");
|
|
2966
3417
|
});
|
|
2967
3418
|
await this.pendingCartSubmitPromise;
|
|
2968
3419
|
};
|
|
@@ -2978,6 +3429,7 @@ const SallaBulletDelivery = class {
|
|
|
2978
3429
|
Salla.event.on("salla::bullet-delivery.modal.open.requested", this.bulletDeliveryOpenHandler);
|
|
2979
3430
|
this.closeHandler = this.close.bind(this);
|
|
2980
3431
|
Salla.event.on("salla::bullet-delivery.modal.close.requested", this.closeHandler);
|
|
3432
|
+
Salla.event.on("modal::close", this.modalCloseHandler);
|
|
2981
3433
|
this.isRTL = Salla.config.get("theme.is_rtl");
|
|
2982
3434
|
// Reading the permission never prompts, so it's safe to watch from here — the map view then
|
|
2983
3435
|
// renders the notice (or not) on its first paint instead of a frame later.
|
|
@@ -3002,7 +3454,7 @@ const SallaBulletDelivery = class {
|
|
|
3002
3454
|
return;
|
|
3003
3455
|
if (this.modal?.hasAttribute?.("visible"))
|
|
3004
3456
|
return;
|
|
3005
|
-
this.open();
|
|
3457
|
+
this.open(false, "after_login");
|
|
3006
3458
|
};
|
|
3007
3459
|
Salla.event.on("auth::logged.in", this.authLoggedInHandler);
|
|
3008
3460
|
this.authLoggedOutHandler = () => {
|
|
@@ -3034,9 +3486,12 @@ const SallaBulletDelivery = class {
|
|
|
3034
3486
|
return null; // no-op when disabled
|
|
3035
3487
|
return (h(Host, { class: "s-bullet-delivery" }, h("salla-modal", { ref: modal => {
|
|
3036
3488
|
this.modal = modal;
|
|
3037
|
-
}, isClosable: !this.isRequired && !this.shouldForceNonClosable(),
|
|
3489
|
+
}, isClosable: !this.isRequired && !this.shouldForceNonClosable(), onModalVisibilityChanged: (event) => {
|
|
3490
|
+
if (event.target === this.modal)
|
|
3491
|
+
this.handleModalVisibility(Boolean(event.detail));
|
|
3492
|
+
}, class: "s-bullet-delivery-modal", width: "sm", "data-testid": "salla-bullet-delivery-modal" }, h("div", { class: "s-bullet-delivery-inner" }, h("div", { class: "s-bullet-delivery-header" }, h("h2", { class: "s-bullet-delivery-title" }, this.activeTab === 'address'
|
|
3038
3493
|
? Salla.lang.get('blocks.home.add_address_for_order_delivery')
|
|
3039
|
-
: Salla.lang.
|
|
3494
|
+
: Salla.lang.getWithDefault('blocks.home.choose_pickup_branch_title', this.isArabic ? 'اختر فرع استلام طلبك' : 'Choose your pickup branch')), h("p", { class: "s-bullet-delivery-subtitle" }, this.activeTab === 'address'
|
|
3040
3495
|
? Salla.lang.get('blocks.home.products_available_for_delivery_shown_while_shopping')
|
|
3041
3496
|
: Salla.lang.get('blocks.home.choose_branch_for_order_pickup_description'))), this.renderTabs(), this.viewMode === 'main' && this.renderMainView(), this.viewMode === 'add-address' && this.renderAddAddressForm()))));
|
|
3042
3497
|
}
|
|
@@ -3070,7 +3525,7 @@ const SallaBulletDelivery = class {
|
|
|
3070
3525
|
// Handle pending open request (if event was emitted before component was ready)
|
|
3071
3526
|
if (this.pendingOpen) {
|
|
3072
3527
|
this.pendingOpen = false;
|
|
3073
|
-
this.open();
|
|
3528
|
+
this.open(false, this.openTrigger);
|
|
3074
3529
|
return;
|
|
3075
3530
|
}
|
|
3076
3531
|
// Strategy-based auto-open logic
|
|
@@ -3078,11 +3533,11 @@ const SallaBulletDelivery = class {
|
|
|
3078
3533
|
case "first_visit":
|
|
3079
3534
|
// Open once per session when component mounts (per-session behaviour)
|
|
3080
3535
|
if (!this.hasBeenShownThisSession()) {
|
|
3081
|
-
this.open();
|
|
3536
|
+
this.open(false, "first_visit");
|
|
3082
3537
|
}
|
|
3083
3538
|
else if (this.shouldPromptIncompleteIntentThisSession()) {
|
|
3084
3539
|
this.markIncompleteIntentPrompted();
|
|
3085
|
-
this.open();
|
|
3540
|
+
this.open(false, "incomplete_intent");
|
|
3086
3541
|
}
|
|
3087
3542
|
break;
|
|
3088
3543
|
case "on_cart_click":
|
|
@@ -3090,11 +3545,11 @@ const SallaBulletDelivery = class {
|
|
|
3090
3545
|
if (Salla.url.is_page("cart")) {
|
|
3091
3546
|
const shown = this.getShownStorage().get(this.sessionShownKey) === true;
|
|
3092
3547
|
if (!shown) {
|
|
3093
|
-
this.open();
|
|
3548
|
+
this.open(false, "on_cart_click");
|
|
3094
3549
|
}
|
|
3095
3550
|
else if (this.shouldPromptIncompleteIntentThisSession()) {
|
|
3096
3551
|
this.markIncompleteIntentPrompted();
|
|
3097
|
-
this.open();
|
|
3552
|
+
this.open(false, "incomplete_intent");
|
|
3098
3553
|
}
|
|
3099
3554
|
}
|
|
3100
3555
|
break;
|
|
@@ -3114,6 +3569,7 @@ const SallaBulletDelivery = class {
|
|
|
3114
3569
|
this.stopWatchingLocationPermission = null;
|
|
3115
3570
|
}
|
|
3116
3571
|
Salla.event.off("salla::bullet-delivery.modal.open.requested", this.bulletDeliveryOpenHandler);
|
|
3572
|
+
Salla.event.off("modal::close", this.modalCloseHandler);
|
|
3117
3573
|
if (this.closeHandler) {
|
|
3118
3574
|
Salla.event.off("salla::bullet-delivery.modal.close.requested", this.closeHandler);
|
|
3119
3575
|
this.closeHandler = null;
|