@zonos/elements 1.3.267 → 1.3.268
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/{cart-ed2de167.js → cart-af7c024e.js} +129 -4
- package/dist/cjs/{debounce-606d1801.js → debounce-7990f5ea.js} +1 -1
- package/dist/cjs/{getBorderRadius-a91911e7.js → getBorderRadius-fc683d94.js} +1 -1
- package/dist/cjs/{getContrastColor-ce80dbe7.js → getContrastColor-d5134ef3.js} +2 -2
- package/dist/cjs/{hasInclusivePrice-bf31fbdb.js → hasInclusivePrice-0fa6e022.js} +1 -1
- package/dist/cjs/index.cjs.js +7 -7
- package/dist/cjs/{invoice-542c23e7.js → invoice-c2e3f232.js} +3 -3
- package/dist/cjs/{isCollectMobileTablet-fe8149a5.js → isCollectMobileTablet-6014787b.js} +3 -3
- package/dist/cjs/{isContrastColor-a02c4889.js → isContrastColor-76592c92.js} +1 -1
- package/dist/cjs/{isDarkColor-e317bb06.js → isDarkColor-5d6ca405.js} +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{localization-66d378ab.js → localization-f897bc45.js} +421 -1
- package/dist/cjs/{paypal-d8282578.js → paypal-6756a0da.js} +60 -18
- package/dist/cjs/{placeTestOrder-0a4b9dd7.js → placeTestOrder-a4874e51.js} +2 -2
- package/dist/cjs/{renderCheckoutCurrency-ac9083d9.js → renderCheckoutCurrency-584d50fe.js} +2 -2
- package/dist/cjs/{submitGtag-07a3b09e.js → submitGtag-4906b161.js} +1 -1
- package/dist/cjs/{throttle-8aebac7d.js → throttle-02c2e917.js} +2 -2
- package/dist/cjs/{updateCheckoutSessionAttributes-a9a97194.js → updateCheckoutSessionAttributes-47d73942.js} +1 -1
- package/dist/cjs/zonos-address-display_8.cjs.entry.js +7 -7
- package/dist/cjs/zonos-address_4.cjs.entry.js +7 -7
- package/dist/cjs/zonos-badge.cjs.entry.js +1 -1
- package/dist/cjs/zonos-banner.cjs.entry.js +1 -1
- package/dist/cjs/zonos-button_3.cjs.entry.js +3 -3
- package/dist/cjs/zonos-card_5.cjs.entry.js +8 -8
- package/dist/cjs/zonos-cart-items_12.cjs.entry.js +94 -27
- package/dist/cjs/zonos-checkbox_2.cjs.entry.js +3 -3
- package/dist/cjs/zonos-checkout.cjs.entry.js +112 -85
- package/dist/cjs/zonos-collapse.cjs.entry.js +1 -1
- package/dist/cjs/zonos-collect-cart-items_3.cjs.entry.js +5 -5
- package/dist/cjs/zonos-collect-finish_6.cjs.entry.js +11 -11
- package/dist/cjs/zonos-collect.cjs.entry.js +9 -9
- package/dist/cjs/zonos-controller.cjs.entry.js +6 -6
- package/dist/cjs/zonos-country-flag.cjs.entry.js +2 -2
- package/dist/cjs/zonos-country-select_4.cjs.entry.js +3 -3
- package/dist/cjs/zonos-elements.cjs.js +1 -1
- package/dist/cjs/zonos-hello-dialog.cjs.entry.js +3 -3
- package/dist/cjs/zonos-hello.cjs.entry.js +3 -3
- package/dist/cjs/zonos-input.cjs.entry.js +2 -2
- package/dist/cjs/zonos-invoice-cart-items_2.cjs.entry.js +7 -7
- package/dist/cjs/zonos-invoice-finish_5.cjs.entry.js +11 -11
- package/dist/cjs/zonos-invoice.cjs.entry.js +9 -9
- package/dist/cjs/zonos-language-select_2.cjs.entry.js +2 -2
- package/dist/cjs/zonos-logo.cjs.entry.js +1 -1
- package/dist/cjs/{zonos-store-credit.cjs.entry.js → zonos-policy-consent_2.cjs.entry.js} +91 -6
- package/dist/cjs/zonos-shipping-rich-radio.cjs.entry.js +5 -5
- package/dist/cjs/zonos-stripe-input.cjs.entry.js +3 -3
- package/dist/cjs/zonos-text.cjs.entry.js +1 -1
- package/dist/cjs/zonos-v-stack.cjs.entry.js +1 -1
- package/dist/cjs/{zonosStore-0662b95f.js → zonosStore-45a87908.js} +1 -0
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/checkout/zonos-checkout/zonos-checkout-footer/zonos-checkout-footer.js +7 -2
- package/dist/collection/components/checkout/zonos-checkout/zonos-checkout-payment/zonos-checkout-payment.js +66 -12
- package/dist/collection/components/checkout/zonos-checkout/zonos-checkout.js +103 -75
- package/dist/collection/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.css +93 -0
- package/dist/collection/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.js +93 -0
- package/dist/collection/components/store/checkout/paypal.js +57 -14
- package/dist/collection/components/store/checkout/policyConsent.js +58 -0
- package/dist/collection/components/store/checkout/stripe.js +66 -0
- package/dist/collection/components/store/translationStore/strings.arabic.js +21 -0
- package/dist/collection/components/store/translationStore/strings.base.js +21 -0
- package/dist/collection/components/store/translationStore/strings.chinese.js +21 -0
- package/dist/collection/components/store/translationStore/strings.danish.js +21 -0
- package/dist/collection/components/store/translationStore/strings.dutch.js +21 -0
- package/dist/collection/components/store/translationStore/strings.french.js +21 -0
- package/dist/collection/components/store/translationStore/strings.german.js +21 -0
- package/dist/collection/components/store/translationStore/strings.hebrew.js +21 -0
- package/dist/collection/components/store/translationStore/strings.indonesian.js +21 -0
- package/dist/collection/components/store/translationStore/strings.italian.js +21 -0
- package/dist/collection/components/store/translationStore/strings.japanese.js +21 -0
- package/dist/collection/components/store/translationStore/strings.korean.js +21 -0
- package/dist/collection/components/store/translationStore/strings.norwegian.js +21 -0
- package/dist/collection/components/store/translationStore/strings.polish.js +21 -0
- package/dist/collection/components/store/translationStore/strings.portuguese.js +21 -0
- package/dist/collection/components/store/translationStore/strings.russian.js +21 -0
- package/dist/collection/components/store/translationStore/strings.spanish.js +21 -0
- package/dist/collection/components/store/translationStore/strings.swedish.js +21 -0
- package/dist/collection/components/store/translationStore/strings.turkish.js +21 -0
- package/dist/collection/components/store/translationStore/strings.vietnamese.js +21 -0
- package/dist/collection/components/store/zonosStore.js +1 -0
- package/dist/collection/types/generated/graphql.internal.types.js +64 -0
- package/dist/esm/{cart-49082718.js → cart-68c16805.js} +125 -5
- package/dist/esm/{debounce-ab526ca0.js → debounce-58e4ff3e.js} +1 -1
- package/dist/esm/{getBorderRadius-98c64be8.js → getBorderRadius-d23f47a6.js} +1 -1
- package/dist/esm/{getContrastColor-0aa643c1.js → getContrastColor-f0bd5b65.js} +2 -2
- package/dist/esm/{hasInclusivePrice-2323d514.js → hasInclusivePrice-f1ca1610.js} +1 -1
- package/dist/esm/index.js +7 -7
- package/dist/esm/{invoice-16c688e7.js → invoice-d0eadc6a.js} +3 -3
- package/dist/esm/{isCollectMobileTablet-910aea2e.js → isCollectMobileTablet-11ade63f.js} +3 -3
- package/dist/esm/{isContrastColor-6bad285e.js → isContrastColor-fbddacb6.js} +1 -1
- package/dist/esm/{isDarkColor-0a8453e7.js → isDarkColor-566f04c5.js} +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{localization-33a9f7ff.js → localization-8e81b696.js} +421 -1
- package/dist/esm/{paypal-2e9aa4ba.js → paypal-e32877e9.js} +60 -18
- package/dist/esm/{placeTestOrder-35c9b460.js → placeTestOrder-4cf429d7.js} +2 -2
- package/dist/esm/{renderCheckoutCurrency-b84a6da7.js → renderCheckoutCurrency-9459b8a3.js} +2 -2
- package/dist/esm/{submitGtag-ae9d5d91.js → submitGtag-c7ea1f2a.js} +1 -1
- package/dist/esm/{throttle-882b1f47.js → throttle-f09d0659.js} +2 -2
- package/dist/esm/{updateCheckoutSessionAttributes-da7fdd37.js → updateCheckoutSessionAttributes-40e301a4.js} +1 -1
- package/dist/esm/zonos-address-display_8.entry.js +7 -7
- package/dist/esm/zonos-address_4.entry.js +7 -7
- package/dist/esm/zonos-badge.entry.js +1 -1
- package/dist/esm/zonos-banner.entry.js +1 -1
- package/dist/esm/zonos-button_3.entry.js +3 -3
- package/dist/esm/zonos-card_5.entry.js +8 -8
- package/dist/esm/zonos-cart-items_12.entry.js +94 -27
- package/dist/esm/zonos-checkbox_2.entry.js +3 -3
- package/dist/esm/zonos-checkout.entry.js +112 -85
- package/dist/esm/zonos-collapse.entry.js +1 -1
- package/dist/esm/zonos-collect-cart-items_3.entry.js +5 -5
- package/dist/esm/zonos-collect-finish_6.entry.js +11 -11
- package/dist/esm/zonos-collect.entry.js +9 -9
- package/dist/esm/zonos-controller.entry.js +6 -6
- package/dist/esm/zonos-country-flag.entry.js +2 -2
- package/dist/esm/zonos-country-select_4.entry.js +3 -3
- package/dist/esm/zonos-elements.js +1 -1
- package/dist/esm/zonos-hello-dialog.entry.js +3 -3
- package/dist/esm/zonos-hello.entry.js +3 -3
- package/dist/esm/zonos-input.entry.js +2 -2
- package/dist/esm/zonos-invoice-cart-items_2.entry.js +7 -7
- package/dist/esm/zonos-invoice-finish_5.entry.js +11 -11
- package/dist/esm/zonos-invoice.entry.js +9 -9
- package/dist/esm/zonos-language-select_2.entry.js +2 -2
- package/dist/esm/zonos-logo.entry.js +1 -1
- package/dist/esm/{zonos-store-credit.entry.js → zonos-policy-consent_2.entry.js} +91 -7
- package/dist/esm/zonos-shipping-rich-radio.entry.js +5 -5
- package/dist/esm/zonos-stripe-input.entry.js +3 -3
- package/dist/esm/zonos-text.entry.js +1 -1
- package/dist/esm/zonos-v-stack.entry.js +1 -1
- package/dist/esm/{zonosStore-9662b071.js → zonosStore-8e19daff.js} +1 -0
- package/dist/esm-es5/cart-68c16805.js +1 -0
- package/dist/esm-es5/{debounce-ab526ca0.js → debounce-58e4ff3e.js} +1 -1
- package/dist/esm-es5/{getBorderRadius-98c64be8.js → getBorderRadius-d23f47a6.js} +1 -1
- package/dist/esm-es5/{getContrastColor-0aa643c1.js → getContrastColor-f0bd5b65.js} +1 -1
- package/dist/esm-es5/{hasInclusivePrice-2323d514.js → hasInclusivePrice-f1ca1610.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/{invoice-16c688e7.js → invoice-d0eadc6a.js} +1 -1
- package/dist/esm-es5/{isCollectMobileTablet-910aea2e.js → isCollectMobileTablet-11ade63f.js} +1 -1
- package/dist/esm-es5/{isContrastColor-6bad285e.js → isContrastColor-fbddacb6.js} +1 -1
- package/dist/esm-es5/{isDarkColor-0a8453e7.js → isDarkColor-566f04c5.js} +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/localization-8e81b696.js +1 -0
- package/dist/esm-es5/{paypal-2e9aa4ba.js → paypal-e32877e9.js} +2 -2
- package/dist/esm-es5/{placeTestOrder-35c9b460.js → placeTestOrder-4cf429d7.js} +1 -1
- package/dist/esm-es5/{renderCheckoutCurrency-b84a6da7.js → renderCheckoutCurrency-9459b8a3.js} +1 -1
- package/dist/esm-es5/{submitGtag-ae9d5d91.js → submitGtag-c7ea1f2a.js} +1 -1
- package/dist/esm-es5/throttle-f09d0659.js +1 -0
- package/dist/esm-es5/{updateCheckoutSessionAttributes-da7fdd37.js → updateCheckoutSessionAttributes-40e301a4.js} +1 -1
- package/dist/esm-es5/zonos-address-display_8.entry.js +1 -1
- package/dist/esm-es5/zonos-address_4.entry.js +1 -1
- package/dist/esm-es5/zonos-badge.entry.js +1 -1
- package/dist/esm-es5/zonos-banner.entry.js +1 -1
- package/dist/esm-es5/zonos-button_3.entry.js +1 -1
- package/dist/esm-es5/zonos-card_5.entry.js +1 -1
- package/dist/esm-es5/zonos-cart-items_12.entry.js +1 -1
- package/dist/esm-es5/zonos-checkbox_2.entry.js +1 -1
- package/dist/esm-es5/zonos-checkout.entry.js +1 -1
- package/dist/esm-es5/zonos-collapse.entry.js +1 -1
- package/dist/esm-es5/zonos-collect-cart-items_3.entry.js +1 -1
- package/dist/esm-es5/zonos-collect-finish_6.entry.js +1 -1
- package/dist/esm-es5/zonos-collect.entry.js +1 -1
- package/dist/esm-es5/zonos-controller.entry.js +1 -1
- package/dist/esm-es5/zonos-country-flag.entry.js +1 -1
- package/dist/esm-es5/zonos-country-select_4.entry.js +1 -1
- package/dist/esm-es5/zonos-elements.js +1 -1
- package/dist/esm-es5/zonos-hello-dialog.entry.js +1 -1
- package/dist/esm-es5/zonos-hello.entry.js +1 -1
- package/dist/esm-es5/zonos-input.entry.js +1 -1
- package/dist/esm-es5/zonos-invoice-cart-items_2.entry.js +1 -1
- package/dist/esm-es5/zonos-invoice-finish_5.entry.js +1 -1
- package/dist/esm-es5/zonos-invoice.entry.js +1 -1
- package/dist/esm-es5/zonos-language-select_2.entry.js +1 -1
- package/dist/esm-es5/zonos-logo.entry.js +1 -1
- package/dist/esm-es5/zonos-policy-consent_2.entry.js +1 -0
- package/dist/esm-es5/zonos-shipping-rich-radio.entry.js +1 -1
- package/dist/esm-es5/zonos-stripe-input.entry.js +1 -1
- package/dist/esm-es5/zonos-text.entry.js +1 -1
- package/dist/esm-es5/zonos-v-stack.entry.js +1 -1
- package/dist/esm-es5/{zonosStore-9662b071.js → zonosStore-8e19daff.js} +1 -1
- package/dist/scripts/index.d.ts +80 -6
- package/dist/scripts/index.js +1 -1
- package/dist/scripts/loadZonos.js +1 -1
- package/dist/scripts/zonos.js +1 -1
- package/dist/types/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.d.ts +3 -0
- package/dist/types/components/store/checkout/policyConsent.d.ts +41 -0
- package/dist/types/components/store/checkout/stripe.d.ts +13 -0
- package/dist/types/components/store/translationStore/strings.arabic.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.base.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.chinese.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.danish.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.dutch.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.french.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.german.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.hebrew.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.indonesian.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.italian.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.japanese.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.korean.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.norwegian.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.polish.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.portuguese.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.russian.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.spanish.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.swedish.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.turkish.d.ts +21 -0
- package/dist/types/components/store/translationStore/strings.vietnamese.d.ts +21 -0
- package/dist/types/components/utils/api/getLocaleMessages.d.ts +1 -1
- package/dist/types/components.d.ts +13 -0
- package/dist/types/scripts/cart/_setupCartDataWithSettings.d.ts +23 -6
- package/dist/types/types/checkout/CheckoutConfig.d.ts +23 -0
- package/dist/types/types/generated/graphql.frontend.types.d.ts +1 -1
- package/dist/types/types/generated/graphql.frontend.types.ts +1 -1
- package/dist/types/types/generated/graphql.internal.types.d.ts +170 -23
- package/dist/types/types/generated/graphql.internal.types.ts +152 -23
- package/dist/zonos-elements/index.esm.js +1 -1
- package/dist/zonos-elements/{p-703fc360.entry.js → p-000b895a.entry.js} +1 -1
- package/dist/zonos-elements/p-01913da8.js +1 -0
- package/dist/zonos-elements/{p-b5a26334.system.entry.js → p-06e7fe2a.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-becac995.js → p-0803ad10.js} +1 -1
- package/dist/zonos-elements/{p-79e5a629.system.entry.js → p-0e36a7cf.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-baf0b24c.system.entry.js → p-108b5307.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-029be4a8.entry.js → p-11439d12.entry.js} +1 -1
- package/dist/zonos-elements/{p-b6df4cc2.system.entry.js → p-134c5010.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-8d5f413c.system.entry.js → p-1376e67f.system.entry.js} +1 -1
- package/dist/zonos-elements/p-14d6542f.system.js +1 -0
- package/dist/zonos-elements/p-17be8409.entry.js +1 -0
- package/dist/zonos-elements/{p-843ced6c.js → p-17e3cd62.js} +1 -1
- package/dist/zonos-elements/{p-0207c91e.system.js → p-18af6aaa.system.js} +1 -1
- package/dist/zonos-elements/{p-5d823ea7.system.js → p-1eef8c23.system.js} +1 -1
- package/dist/zonos-elements/{p-2c854197.system.entry.js → p-24091606.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-6b6cfc59.system.entry.js → p-26ae4ee7.system.entry.js} +1 -1
- package/dist/zonos-elements/p-29b60bf3.system.js +1 -1
- package/dist/zonos-elements/{p-71fb6126.entry.js → p-2afecda7.entry.js} +1 -1
- package/dist/zonos-elements/p-2ccd20c0.system.js +1 -0
- package/dist/zonos-elements/{p-d28be518.js → p-33d4be28.js} +1 -1
- package/dist/zonos-elements/{p-26c85188.entry.js → p-344a1fee.entry.js} +1 -1
- package/dist/zonos-elements/{p-a78bc004.entry.js → p-38311c16.entry.js} +1 -1
- package/dist/zonos-elements/p-3b28fc76.js +1 -0
- package/dist/zonos-elements/{p-db3b101a.js → p-3dc3596b.js} +1 -1
- package/dist/zonos-elements/{p-3689821f.system.js → p-3e7ee89d.system.js} +1 -1
- package/dist/zonos-elements/{p-8570e88a.system.js → p-44b279cc.system.js} +1 -1
- package/dist/zonos-elements/{p-b7e4a020.system.entry.js → p-48805ed6.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-ab0b23f2.js → p-4df08fc4.js} +1 -1
- package/dist/zonos-elements/p-4fe3d5e0.system.js +18 -0
- package/dist/zonos-elements/{p-90c932fd.entry.js → p-50362897.entry.js} +1 -1
- package/dist/zonos-elements/p-52bd7be3.system.js +1 -0
- package/dist/zonos-elements/{p-deaf0e38.system.entry.js → p-536cbab5.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-175c04a4.system.js → p-53a59935.system.js} +1 -1
- package/dist/zonos-elements/{p-cb966d16.system.entry.js → p-593764cf.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-311ba000.system.js → p-5b05b461.system.js} +1 -1
- package/dist/zonos-elements/{p-a49ba3ae.system.entry.js → p-5b4e5608.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-1bf9a1b9.system.js → p-5d65be06.system.js} +1 -1
- package/dist/zonos-elements/{p-e850e6e7.system.entry.js → p-5e18d92b.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-1957af5a.system.entry.js → p-5f92db80.system.entry.js} +1 -1
- package/dist/zonos-elements/p-5fa2395d.system.js +1 -0
- package/dist/zonos-elements/{p-5e1799bc.entry.js → p-620a9013.entry.js} +1 -1
- package/dist/zonos-elements/p-623fc89a.system.entry.js +1 -0
- package/dist/zonos-elements/p-64e8f05d.system.entry.js +1 -0
- package/dist/zonos-elements/{p-2a6be4a5.entry.js → p-658ab5e2.entry.js} +1 -1
- package/dist/zonos-elements/{p-180d3e3d.entry.js → p-673407b8.entry.js} +1 -1
- package/dist/zonos-elements/{p-a1bad0c3.system.entry.js → p-69089a6f.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-1ec9b3b0.entry.js → p-6f41c193.entry.js} +1 -1
- package/dist/zonos-elements/{p-f3cfd8fa.js → p-701d9a7c.js} +1 -1
- package/dist/zonos-elements/{p-d950b0b4.entry.js → p-7166df08.entry.js} +1 -1
- package/dist/zonos-elements/p-72960738.js +1 -0
- package/dist/zonos-elements/p-72c3756a.js +1 -0
- package/dist/zonos-elements/{p-db5f6b8c.entry.js → p-7628569a.entry.js} +1 -1
- package/dist/zonos-elements/p-774de1ec.system.js +1 -0
- package/dist/zonos-elements/{p-27061873.entry.js → p-777d396e.entry.js} +1 -1
- package/dist/zonos-elements/{p-4f718ef9.system.js → p-7a220941.system.js} +1 -1
- package/dist/zonos-elements/{p-46071125.entry.js → p-7aca66cd.entry.js} +1 -1
- package/dist/zonos-elements/p-7cf8e1f0.js +1 -0
- package/dist/zonos-elements/{p-eb99a625.system.js → p-7d9d2407.system.js} +1 -1
- package/dist/zonos-elements/{p-0ed70279.entry.js → p-7fef8558.entry.js} +1 -1
- package/dist/zonos-elements/{p-7003d093.system.entry.js → p-80df7e0b.system.entry.js} +1 -1
- package/dist/zonos-elements/p-8116d3ba.entry.js +1 -0
- package/dist/zonos-elements/{p-648f3ada.entry.js → p-889a44fc.entry.js} +1 -1
- package/dist/zonos-elements/{p-4c89d04a.js → p-896fb969.js} +1 -1
- package/dist/zonos-elements/{p-1325bbd6.system.entry.js → p-8ddc21f1.system.entry.js} +1 -1
- package/dist/zonos-elements/p-90d22087.system.js +1 -0
- package/dist/zonos-elements/{p-3516340a.system.entry.js → p-95b460e9.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-087520f2.system.entry.js → p-95f3bbad.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-71c7a1ff.entry.js → p-97da66f2.entry.js} +1 -1
- package/dist/zonos-elements/{p-55fb4ea3.system.entry.js → p-98bea13e.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-ba9e2612.system.entry.js → p-990d1495.system.entry.js} +1 -1
- package/dist/zonos-elements/p-9f5fb332.js +1 -0
- package/dist/zonos-elements/{p-ce103c66.system.entry.js → p-a0ee01dd.system.entry.js} +1 -1
- package/dist/zonos-elements/p-ac8cfdc0.js +1 -0
- package/dist/zonos-elements/{p-22ba60f6.system.entry.js → p-af12a1b7.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-b4b23475.entry.js → p-b35a0b1e.entry.js} +1 -1
- package/dist/zonos-elements/{p-bf5c3dd7.system.entry.js → p-b59fc3fa.system.entry.js} +1 -1
- package/dist/zonos-elements/p-b71ef46e.js +17 -0
- package/dist/zonos-elements/{p-a6db8883.entry.js → p-b93b66c2.entry.js} +1 -1
- package/dist/zonos-elements/p-b9a615bc.system.entry.js +1 -0
- package/dist/zonos-elements/{p-6a195559.system.js → p-bc919de1.system.js} +1 -1
- package/dist/zonos-elements/{p-9e0cb5b3.system.entry.js → p-bc9a30a1.system.entry.js} +1 -1
- package/dist/zonos-elements/{p-665bfd4f.entry.js → p-c1463da7.entry.js} +1 -1
- package/dist/zonos-elements/{p-8f9e95c2.entry.js → p-c3459f4a.entry.js} +1 -1
- package/dist/zonos-elements/{p-2a8fcb71.system.entry.js → p-c7ca3e98.system.entry.js} +1 -1
- package/dist/zonos-elements/p-c91fade3.entry.js +1 -0
- package/dist/zonos-elements/{p-79f3c227.system.entry.js → p-c92a5ae5.system.entry.js} +1 -1
- package/dist/zonos-elements/p-cd34ecf2.js +1 -0
- package/dist/zonos-elements/{p-28e2ac3b.entry.js → p-dae881f2.entry.js} +1 -1
- package/dist/zonos-elements/{p-9a5a2043.js → p-dcafbd4e.js} +1 -1
- package/dist/zonos-elements/{p-8571f3ce.entry.js → p-df55536b.entry.js} +1 -1
- package/dist/zonos-elements/{p-01497a20.entry.js → p-e3d6f9b4.entry.js} +1 -1
- package/dist/zonos-elements/{p-928291e5.entry.js → p-e548b8ec.entry.js} +1 -1
- package/dist/zonos-elements/{p-5e6f85f0.system.js → p-f053975e.system.js} +1 -1
- package/dist/zonos-elements/{p-601bb27e.entry.js → p-fc5007e0.entry.js} +1 -1
- package/dist/zonos-elements/zonos-elements.esm.js +1 -1
- package/package.json +1 -1
- package/dist/esm-es5/cart-49082718.js +0 -1
- package/dist/esm-es5/localization-33a9f7ff.js +0 -1
- package/dist/esm-es5/throttle-882b1f47.js +0 -1
- package/dist/esm-es5/zonos-store-credit.entry.js +0 -1
- package/dist/zonos-elements/p-034ab928.system.entry.js +0 -1
- package/dist/zonos-elements/p-07a76716.system.js +0 -1
- package/dist/zonos-elements/p-1f256673.entry.js +0 -1
- package/dist/zonos-elements/p-367a72bc.js +0 -1
- package/dist/zonos-elements/p-3b1b3598.system.js +0 -18
- package/dist/zonos-elements/p-40284821.system.js +0 -1
- package/dist/zonos-elements/p-458df669.js +0 -1
- package/dist/zonos-elements/p-4980facb.js +0 -1
- package/dist/zonos-elements/p-6987f9c9.js +0 -1
- package/dist/zonos-elements/p-6d81901a.js +0 -1
- package/dist/zonos-elements/p-77c2e465.system.js +0 -1
- package/dist/zonos-elements/p-84dbf474.js +0 -17
- package/dist/zonos-elements/p-9b0a6fe5.system.entry.js +0 -1
- package/dist/zonos-elements/p-adb9827c.js +0 -1
- package/dist/zonos-elements/p-b2d276e1.js +0 -1
- package/dist/zonos-elements/p-b6a36c25.system.js +0 -1
- package/dist/zonos-elements/p-c9c17d08.system.entry.js +0 -1
- package/dist/zonos-elements/p-cfb0059f.js +0 -1
- package/dist/zonos-elements/p-e056ae6b.entry.js +0 -1
- package/dist/zonos-elements/p-e3292be8.system.js +0 -1
- package/dist/zonos-elements/p-e5dfccd8.system.js +0 -1
- package/dist/zonos-elements/p-fb712719.entry.js +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Fragment, h, Host, } from "@stencil/core";
|
|
2
2
|
import { cartStore, cartStoreClearCheckoutInterval, cartStoreNextStep, cartStoreOnChange, cartStoreReset, cartStoreResetTabItems, cartStoreSetCheckoutSession, cartStoreStartCheckoutInterval, cartStoreUpdateItems, cartStoreUpdateToErrorState, } from "../../store/checkout/cart";
|
|
3
3
|
import { paypalInitScript, paypalStore, paypalStoreHasPaypalEnabled, } from "../../store/checkout/paypal";
|
|
4
|
+
import { isPolicyConsentRequired, policyConsentStore, policyConsentStoreReset, } from "../../store/checkout/policyConsent";
|
|
4
5
|
import { storeCreditStoreApplyCredit, storeCreditStoreCoversFullAmount, storeCreditStoreCreateOrder, storeCreditStoreGetEffectiveAmount, } from "../../store/checkout/storeCredit";
|
|
5
6
|
import { getCheckoutSessionBody, initStripeElements, stripeStore, stripeStoreCleanupDomesticShippingSession, stripeStoreConfirmPayment, stripeStoreGetPaymentIntent, stripeStoreHandleInventoryCheck, stripeStoreHandleInventoryRefund, stripeStoreInitCheckoutSession, stripeStoreOnChange, stripeStorePrefetchLandedCost, stripeStoreReset, stripeStoreRetrievePayment, stripeStoreUpdateCheckoutSessionBaseCurrency, } from "../../store/checkout/stripe";
|
|
6
7
|
import { localizationStore, localizationStoreOnChange, } from "../../store/hello/localization";
|
|
@@ -562,6 +563,12 @@ export class ZonosCheckout {
|
|
|
562
563
|
// reset cart store if it's not preview mode and only when checkout is in the finish step.
|
|
563
564
|
cartStoreReset();
|
|
564
565
|
}
|
|
566
|
+
// Clear policy consent on every close (not just finish) so a buyer who
|
|
567
|
+
// checked the box mid-flow and then closed can't carry the prior
|
|
568
|
+
// acceptance into a new attempt without a fresh checkbox click.
|
|
569
|
+
if (!this.preview) {
|
|
570
|
+
policyConsentStoreReset();
|
|
571
|
+
}
|
|
565
572
|
// reset step to customer info
|
|
566
573
|
cartStore.step = 'customer-info';
|
|
567
574
|
// reset the tab item, so that user needs to click on Continue button to re-quote the landed cost if needed.
|
|
@@ -1390,77 +1397,104 @@ export class ZonosCheckout {
|
|
|
1390
1397
|
stripeStore.shouldRenderPayInUsdButton &&
|
|
1391
1398
|
!this.payInUsdConfirmDialogOpen) {
|
|
1392
1399
|
this.payInUsdConfirmDialogOpen = true;
|
|
1400
|
+
// Don't unlock consent here — the USD-confirm dialog is mid-flow; the
|
|
1401
|
+
// lock should hold until the user resolves the dialog and we re-enter.
|
|
1393
1402
|
return;
|
|
1394
1403
|
}
|
|
1395
1404
|
// Close the dialog after the user confirms to proceed with the payment in USD
|
|
1396
1405
|
this.payInUsdConfirmDialogOpen = false;
|
|
1397
|
-
//
|
|
1398
|
-
|
|
1399
|
-
//
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
// reset inventory check message
|
|
1403
|
-
cartStore.inventoryCheckErrorMessage = null;
|
|
1404
|
-
// Attempt to change settlement currency to USD
|
|
1405
|
-
const baseCurrencyUpdateSuccess = await stripeStoreUpdateCheckoutSessionBaseCurrency();
|
|
1406
|
-
// Should not proceed to confirm payment if base currency update failed
|
|
1407
|
-
if (!baseCurrencyUpdateSuccess) {
|
|
1408
|
-
stripeStore.hasPaymentError = true;
|
|
1409
|
-
stripeStore.customErrorMessage = translate('Unable to complete payment in [currency]. Please try again or select a different currency. If the issue persists, contact our support team for assistance.', {
|
|
1410
|
-
currency: stripeStore.checkoutSettlementCurrency,
|
|
1411
|
-
});
|
|
1412
|
-
this.submitLoading = false;
|
|
1413
|
-
return;
|
|
1414
|
-
}
|
|
1406
|
+
// Track whether consent was required at the start of this flow so we know
|
|
1407
|
+
// whether to release the lock in `finally`. The store reset on checkout
|
|
1408
|
+
// close will catch any stragglers, but releasing here lets the buyer
|
|
1409
|
+
// recover (uncheck / retry) when an async step aborts.
|
|
1410
|
+
const consentWasRequired = isPolicyConsentRequired();
|
|
1415
1411
|
try {
|
|
1416
|
-
//
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
//
|
|
1422
|
-
cartStore.inventoryCheckErrorMessage =
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
this.submitLoading = false;
|
|
1428
|
-
return;
|
|
1429
|
-
}
|
|
1430
|
-
// Apply store credit if customer has selected an amount
|
|
1431
|
-
const storeCreditAmount = storeCreditStoreGetEffectiveAmount();
|
|
1432
|
-
if (storeCreditAmount > 0) {
|
|
1433
|
-
const storeCreditResult = await storeCreditStoreApplyCredit();
|
|
1434
|
-
if (!storeCreditResult.success) {
|
|
1412
|
+
// reset paypal error message
|
|
1413
|
+
paypalStore.paypalErrorMessage = null;
|
|
1414
|
+
// reset error state
|
|
1415
|
+
stripeStore.hasPaymentError = false;
|
|
1416
|
+
this.submitLoading = true;
|
|
1417
|
+
// reset inventory check message
|
|
1418
|
+
cartStore.inventoryCheckErrorMessage = null;
|
|
1419
|
+
// Attempt to change settlement currency to USD
|
|
1420
|
+
const baseCurrencyUpdateSuccess = await stripeStoreUpdateCheckoutSessionBaseCurrency();
|
|
1421
|
+
// Should not proceed to confirm payment if base currency update failed
|
|
1422
|
+
if (!baseCurrencyUpdateSuccess) {
|
|
1435
1423
|
stripeStore.hasPaymentError = true;
|
|
1436
|
-
stripeStore.customErrorMessage =
|
|
1437
|
-
|
|
1438
|
-
|
|
1424
|
+
stripeStore.customErrorMessage = translate('Unable to complete payment in [currency]. Please try again or select a different currency. If the issue persists, contact our support team for assistance.', {
|
|
1425
|
+
currency: stripeStore.checkoutSettlementCurrency,
|
|
1426
|
+
});
|
|
1439
1427
|
this.submitLoading = false;
|
|
1440
1428
|
return;
|
|
1441
1429
|
}
|
|
1442
|
-
}
|
|
1443
|
-
// If store credit covers the full order, create order directly without payment
|
|
1444
|
-
if (storeCreditStoreCoversFullAmount()) {
|
|
1445
1430
|
try {
|
|
1446
|
-
//
|
|
1447
|
-
|
|
1448
|
-
|
|
1431
|
+
// check inventory before proceeding to payment
|
|
1432
|
+
cartStore.inventoryCheckErrorMessage =
|
|
1433
|
+
await stripeStoreHandleInventoryCheck();
|
|
1434
|
+
}
|
|
1435
|
+
catch (_a) {
|
|
1436
|
+
// If user provide callback and it throw an exception, default to this message and stop the payment.
|
|
1437
|
+
cartStore.inventoryCheckErrorMessage = translate('Unable to check inventory. Please try again.');
|
|
1438
|
+
}
|
|
1439
|
+
// Don't proceed to payment if there's an error message
|
|
1440
|
+
if (cartStore.inventoryCheckErrorMessage) {
|
|
1441
|
+
// stop the submit loading state
|
|
1442
|
+
this.submitLoading = false;
|
|
1443
|
+
return;
|
|
1444
|
+
}
|
|
1445
|
+
// Apply store credit if customer has selected an amount
|
|
1446
|
+
const storeCreditAmount = storeCreditStoreGetEffectiveAmount();
|
|
1447
|
+
if (storeCreditAmount > 0) {
|
|
1448
|
+
const storeCreditResult = await storeCreditStoreApplyCredit();
|
|
1449
|
+
if (!storeCreditResult.success) {
|
|
1449
1450
|
stripeStore.hasPaymentError = true;
|
|
1450
|
-
stripeStore.customErrorMessage =
|
|
1451
|
+
stripeStore.customErrorMessage =
|
|
1452
|
+
storeCreditResult.error ||
|
|
1453
|
+
translate('Unable to apply store credit. Please try again.');
|
|
1451
1454
|
this.submitLoading = false;
|
|
1452
1455
|
return;
|
|
1453
1456
|
}
|
|
1454
|
-
|
|
1455
|
-
|
|
1457
|
+
}
|
|
1458
|
+
// If store credit covers the full order, create order directly without payment
|
|
1459
|
+
if (storeCreditStoreCoversFullAmount()) {
|
|
1460
|
+
try {
|
|
1461
|
+
// Validate checkout session (landed cost ID, etc.) before creating order
|
|
1462
|
+
const checkoutSessionStatus = await validateCheckoutSession();
|
|
1463
|
+
if (!checkoutSessionStatus.valid) {
|
|
1464
|
+
stripeStore.hasPaymentError = true;
|
|
1465
|
+
stripeStore.customErrorMessage = checkoutSessionStatus.errorMessage;
|
|
1466
|
+
this.submitLoading = false;
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
const orderResult = await storeCreditStoreCreateOrder();
|
|
1470
|
+
if (!orderResult.success) {
|
|
1471
|
+
stripeStore.hasPaymentError = true;
|
|
1472
|
+
stripeStore.customErrorMessage =
|
|
1473
|
+
orderResult.error ||
|
|
1474
|
+
translate('Unable to place order with store credit. Please try again.');
|
|
1475
|
+
this.submitLoading = false;
|
|
1476
|
+
return;
|
|
1477
|
+
}
|
|
1478
|
+
cartStoreNextStep();
|
|
1479
|
+
cartStoreClearCheckoutInterval();
|
|
1480
|
+
}
|
|
1481
|
+
catch (err) {
|
|
1482
|
+
logError(err);
|
|
1483
|
+
submitAnalytics({
|
|
1484
|
+
event: 'zonos-checkout-payment-fail',
|
|
1485
|
+
metadata: {
|
|
1486
|
+
checkoutSessionId: storageStore.checkoutSessionId,
|
|
1487
|
+
},
|
|
1488
|
+
});
|
|
1456
1489
|
stripeStore.hasPaymentError = true;
|
|
1457
|
-
stripeStore.customErrorMessage =
|
|
1458
|
-
orderResult.error ||
|
|
1459
|
-
translate('Unable to place order with store credit. Please try again.');
|
|
1460
|
-
this.submitLoading = false;
|
|
1461
|
-
return;
|
|
1462
1490
|
}
|
|
1491
|
+
this.submitLoading = false;
|
|
1492
|
+
return;
|
|
1493
|
+
}
|
|
1494
|
+
try {
|
|
1495
|
+
await stripeStoreConfirmPayment();
|
|
1463
1496
|
cartStoreNextStep();
|
|
1497
|
+
// clear the checkout session timeout timer when purchase is complete
|
|
1464
1498
|
cartStoreClearCheckoutInterval();
|
|
1465
1499
|
}
|
|
1466
1500
|
catch (err) {
|
|
@@ -1472,32 +1506,22 @@ export class ZonosCheckout {
|
|
|
1472
1506
|
},
|
|
1473
1507
|
});
|
|
1474
1508
|
stripeStore.hasPaymentError = true;
|
|
1509
|
+
// should request inventory refund if there's an error during payment
|
|
1510
|
+
if (stripeStore.shouldInventoryRefund) {
|
|
1511
|
+
void stripeStoreHandleInventoryRefund();
|
|
1512
|
+
stripeStore.shouldInventoryRefund = false;
|
|
1513
|
+
}
|
|
1475
1514
|
}
|
|
1476
1515
|
this.submitLoading = false;
|
|
1477
|
-
return;
|
|
1478
1516
|
}
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
//
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
catch (err) {
|
|
1486
|
-
logError(err);
|
|
1487
|
-
submitAnalytics({
|
|
1488
|
-
event: 'zonos-checkout-payment-fail',
|
|
1489
|
-
metadata: {
|
|
1490
|
-
checkoutSessionId: storageStore.checkoutSessionId,
|
|
1491
|
-
},
|
|
1492
|
-
});
|
|
1493
|
-
stripeStore.hasPaymentError = true;
|
|
1494
|
-
// should request inventory refund if there's an error during payment
|
|
1495
|
-
if (stripeStore.shouldInventoryRefund) {
|
|
1496
|
-
void stripeStoreHandleInventoryRefund();
|
|
1497
|
-
stripeStore.shouldInventoryRefund = false;
|
|
1517
|
+
finally {
|
|
1518
|
+
// Release the consent lock on every terminal exit (success or failure)
|
|
1519
|
+
// so the buyer can re-toggle / retry. On success the cart advances and
|
|
1520
|
+
// the close-handler reset would clean this up anyway.
|
|
1521
|
+
if (consentWasRequired) {
|
|
1522
|
+
policyConsentStore.locked = false;
|
|
1498
1523
|
}
|
|
1499
1524
|
}
|
|
1500
|
-
this.submitLoading = false;
|
|
1501
1525
|
}
|
|
1502
1526
|
async handleFinishClick() {
|
|
1503
1527
|
// reset stripe store
|
|
@@ -1509,6 +1533,8 @@ export class ZonosCheckout {
|
|
|
1509
1533
|
}
|
|
1510
1534
|
// reset cart store
|
|
1511
1535
|
cartStoreReset();
|
|
1536
|
+
// reset policy consent so the next checkout starts un-accepted
|
|
1537
|
+
policyConsentStoreReset();
|
|
1512
1538
|
// redirect to vendor store url if this is legacy checkout.
|
|
1513
1539
|
if (window.Zonos.isLegacyCheckout && window.Zonos.cartData) {
|
|
1514
1540
|
const storeBaseUrl = window.Zonos.cartData.storeBaseUrl ||
|
|
@@ -1710,6 +1736,8 @@ export class ZonosCheckout {
|
|
|
1710
1736
|
stripeStoreReset();
|
|
1711
1737
|
// reset cart store
|
|
1712
1738
|
cartStoreReset();
|
|
1739
|
+
// reset policy consent
|
|
1740
|
+
policyConsentStoreReset();
|
|
1713
1741
|
// cleanup onChange listener
|
|
1714
1742
|
this.storeUnsubscribeList.forEach(unsubscribe => unsubscribe());
|
|
1715
1743
|
window.removeEventListener('message', this.handleHostedOpenWindowCallback);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
font-family: var(--zonos--font-family, Inter), Inter;
|
|
3
|
+
display: block;
|
|
4
|
+
white-space: normal;
|
|
5
|
+
}
|
|
6
|
+
:host * {
|
|
7
|
+
font-family: var(--zonos--font-family, Inter), Inter;
|
|
8
|
+
}
|
|
9
|
+
:host img {
|
|
10
|
+
max-width: 100%;
|
|
11
|
+
}
|
|
12
|
+
:host dl,
|
|
13
|
+
:host dd,
|
|
14
|
+
:host h1,
|
|
15
|
+
:host h2,
|
|
16
|
+
:host h3,
|
|
17
|
+
:host h4,
|
|
18
|
+
:host h5,
|
|
19
|
+
:host h6,
|
|
20
|
+
:host hr,
|
|
21
|
+
:host figure,
|
|
22
|
+
:host p,
|
|
23
|
+
:host pre {
|
|
24
|
+
margin: 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* All sets of variable are here */
|
|
28
|
+
/* smooth font rendering */
|
|
29
|
+
:host {
|
|
30
|
+
-moz-osx-font-smoothing: grayscale;
|
|
31
|
+
-webkit-font-smoothing: antialiased;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:host {
|
|
35
|
+
display: block;
|
|
36
|
+
margin-top: 20px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.zonos--policy-consent {
|
|
40
|
+
background-color: var(--zonos-elements-gray-50);
|
|
41
|
+
border: 1px solid var(--zonos-elements-gray-200);
|
|
42
|
+
border-radius: 8px;
|
|
43
|
+
padding: 12px 14px;
|
|
44
|
+
transition: border-color 0.15s ease, background-color 0.15s ease;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.zonos--policy-consent:hover {
|
|
48
|
+
border-color: var(--zonos-elements-gray-300);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.zonos--policy-consent--error {
|
|
52
|
+
background-color: var(--zonos-elements-red-50);
|
|
53
|
+
border-color: var(--zonos-elements-red-400);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.zonos--policy-consent-label {
|
|
57
|
+
align-items: center;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
display: flex;
|
|
60
|
+
gap: 10px;
|
|
61
|
+
user-select: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.zonos--policy-consent-checkbox {
|
|
65
|
+
accent-color: var(--zonos-elements-blue-600);
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
flex-shrink: 0;
|
|
68
|
+
height: 18px;
|
|
69
|
+
margin: 0;
|
|
70
|
+
width: 18px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.zonos--policy-consent-text {
|
|
74
|
+
color: var(--zonos-elements-gray-800);
|
|
75
|
+
font-size: 14px;
|
|
76
|
+
line-height: 1.45;
|
|
77
|
+
}
|
|
78
|
+
.zonos--policy-consent-text a {
|
|
79
|
+
color: var(--zonos-elements-blue-600);
|
|
80
|
+
text-decoration: underline;
|
|
81
|
+
text-underline-offset: 2px;
|
|
82
|
+
}
|
|
83
|
+
.zonos--policy-consent-text a:hover {
|
|
84
|
+
color: var(--zonos-elements-blue-700);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.zonos--policy-consent-error {
|
|
88
|
+
color: var(--zonos-elements-red-600);
|
|
89
|
+
font-size: 13px;
|
|
90
|
+
line-height: 1.4;
|
|
91
|
+
margin-top: 8px;
|
|
92
|
+
padding: 0 4px;
|
|
93
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Fragment, h, Host } from "@stencil/core";
|
|
2
|
+
import { getEnabledPolicies, policyConsentStore, } from "../../../store/checkout/policyConsent";
|
|
3
|
+
import { localizationStore } from "../../../store/hello/localization";
|
|
4
|
+
import { translate } from "../../../store/translationStore";
|
|
5
|
+
import { zonosStore } from "../../../store/zonosStore";
|
|
6
|
+
const POLICIES_SENTINEL = 'POLICIES';
|
|
7
|
+
export class ZonosPolicyConsent {
|
|
8
|
+
render() {
|
|
9
|
+
const policies = getEnabledPolicies();
|
|
10
|
+
if (!policies.length) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
// Build the locale-aware joined list ("X, Y, and Z" in English, equivalent in other locales).
|
|
14
|
+
const ListFormatCtor = Intl
|
|
15
|
+
.ListFormat;
|
|
16
|
+
const parts = ListFormatCtor
|
|
17
|
+
? new ListFormatCtor(localizationStore.selectedLocale, {
|
|
18
|
+
style: 'long',
|
|
19
|
+
type: 'conjunction',
|
|
20
|
+
}).formatToParts(policies.map(p => p.name))
|
|
21
|
+
: // Fallback for environments without Intl.ListFormat: simple ", "-joined list.
|
|
22
|
+
policies.flatMap((p, idx) => idx === 0
|
|
23
|
+
? [{ type: 'element', value: p.name }]
|
|
24
|
+
: [
|
|
25
|
+
{ type: 'literal', value: ', ' },
|
|
26
|
+
{ type: 'element', value: p.name },
|
|
27
|
+
]);
|
|
28
|
+
const listNodes = parts.map(part => {
|
|
29
|
+
if (part.type === 'literal') {
|
|
30
|
+
return part.value;
|
|
31
|
+
}
|
|
32
|
+
// 'element' part — match back to the policy by name to recover its URL.
|
|
33
|
+
const policy = policies.find(p => p.name === part.value);
|
|
34
|
+
if (!policy) {
|
|
35
|
+
return part.value;
|
|
36
|
+
}
|
|
37
|
+
return (h("a", { href: policy.url,
|
|
38
|
+
// Prevent the surrounding <label> from also activating the checkbox
|
|
39
|
+
// when the link is clicked — `stopPropagation` alone doesn't suppress
|
|
40
|
+
// the label's default behavior in every browser. We explicitly open
|
|
41
|
+
// the URL ourselves and call `preventDefault` to swallow the click.
|
|
42
|
+
onClick: (event) => {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
event.stopPropagation();
|
|
45
|
+
window.open(policy.url, '_blank', 'noopener,noreferrer');
|
|
46
|
+
}, rel: "noopener noreferrer", target: "_blank" }, part.value));
|
|
47
|
+
});
|
|
48
|
+
// Use the merchant-name template when an org name is available, falling back to the generic
|
|
49
|
+
// phrasing otherwise so we never render a stray apostrophe (e.g. " 's Terms...").
|
|
50
|
+
// Reads from `zonosStore` so this works when consumed via the npm package
|
|
51
|
+
// (where `window.Zonos.cartSettings` may not be populated).
|
|
52
|
+
const merchantName = zonosStore.organizationName;
|
|
53
|
+
const template = merchantName
|
|
54
|
+
? translate("I agree to [merchantName]'s [policies]", {
|
|
55
|
+
merchantName,
|
|
56
|
+
policies: POLICIES_SENTINEL,
|
|
57
|
+
})
|
|
58
|
+
: translate('I agree to the [policies]', {
|
|
59
|
+
policies: POLICIES_SENTINEL,
|
|
60
|
+
});
|
|
61
|
+
const [before = '', after = ''] = template.split(POLICIES_SENTINEL);
|
|
62
|
+
const showError = policyConsentStore.showError;
|
|
63
|
+
const errorId = 'zonos--policy-consent-error';
|
|
64
|
+
return (h(Host, { class: "zonos--policy-consent-host" }, h("div", { class: `zonos--policy-consent${showError ? ' zonos--policy-consent--error' : ''}` }, h("label", { class: "zonos--policy-consent-label" }, h("input", { "aria-describedby": showError ? errorId : undefined, "aria-invalid": showError ? 'true' : 'false', checked: policyConsentStore.accepted, class: "zonos--policy-consent-checkbox", disabled: policyConsentStore.locked, onChange: (event) => {
|
|
65
|
+
const isChecked = event.target.checked;
|
|
66
|
+
policyConsentStore.accepted = isChecked;
|
|
67
|
+
if (isChecked) {
|
|
68
|
+
// Snapshot the timestamp at the moment of acceptance so later
|
|
69
|
+
// session-metadata updates don't drift it forward.
|
|
70
|
+
if (!policyConsentStore.acceptedAt) {
|
|
71
|
+
policyConsentStore.acceptedAt = new Date().toISOString();
|
|
72
|
+
}
|
|
73
|
+
policyConsentStore.showError = false;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// If the buyer un-checks, the prior acceptance is no longer valid.
|
|
77
|
+
policyConsentStore.acceptedAt = null;
|
|
78
|
+
}
|
|
79
|
+
}, type: "checkbox" }), h("span", { class: "zonos--policy-consent-text" }, before, h(Fragment, null, listNodes), after))), showError && (h("div", { class: "zonos--policy-consent-error", id: errorId, role: "alert" }, translate('You must accept the policies to place this order')))));
|
|
80
|
+
}
|
|
81
|
+
static get is() { return "zonos-policy-consent"; }
|
|
82
|
+
static get encapsulation() { return "shadow"; }
|
|
83
|
+
static get originalStyleUrls() {
|
|
84
|
+
return {
|
|
85
|
+
"$": ["zonos-policy-consent.scss"]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
static get styleUrls() {
|
|
89
|
+
return {
|
|
90
|
+
"$": ["zonos-policy-consent.css"]
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { loadScript, } from "@paypal/paypal-js";
|
|
2
2
|
import { createStore } from "@stencil/store";
|
|
3
3
|
import { cartStore, cartStoreClearCheckoutInterval, cartStoreNextStep, } from "./cart";
|
|
4
|
+
import { isPolicyConsentRequired, policyConsentStore, } from "./policyConsent";
|
|
4
5
|
import { storeCreditStoreApplyCredit, storeCreditStoreCoversFullAmount, storeCreditStoreCreateOrder, storeCreditStoreGetEffectiveAmount, } from "./storeCredit";
|
|
5
|
-
import { stripeStore, stripeStoreHandleInventoryCheck, } from "./stripe";
|
|
6
|
+
import { stripeStore, stripeStoreHandleInventoryCheck, stripeStoreRecordPolicyConsent, } from "./stripe";
|
|
6
7
|
import { storageStore } from "../storageStore";
|
|
7
8
|
import { translate } from "../translationStore";
|
|
8
9
|
import { zonosStore } from "../zonosStore";
|
|
@@ -81,6 +82,7 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
81
82
|
});
|
|
82
83
|
return {
|
|
83
84
|
createOrder: async () => {
|
|
85
|
+
var _a;
|
|
84
86
|
// Clicking on the paypal button should trigger the paymentInfoCompleted event
|
|
85
87
|
void trackConversionEvent({
|
|
86
88
|
checkoutSessionId,
|
|
@@ -89,22 +91,42 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
89
91
|
paymentMethod: 'paypal',
|
|
90
92
|
},
|
|
91
93
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
event: 'zonos-checkout-payment-fail',
|
|
100
|
-
metadata: {
|
|
101
|
-
checkoutSessionId,
|
|
102
|
-
},
|
|
103
|
-
});
|
|
94
|
+
// Block PayPal submit when the merchant requires policy consent and the
|
|
95
|
+
// buyer hasn't accepted. Mirrors the Pay-button gate so both flows enforce
|
|
96
|
+
// the same legal contract.
|
|
97
|
+
if (isPolicyConsentRequired() && !policyConsentStore.accepted) {
|
|
98
|
+
policyConsentStore.showError = true;
|
|
99
|
+
(_a = document
|
|
100
|
+
.querySelector('zonos-policy-consent')) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: 'smooth' });
|
|
104
101
|
onPaypalFail === null || onPaypalFail === void 0 ? void 0 : onPaypalFail();
|
|
105
102
|
return '';
|
|
106
103
|
}
|
|
104
|
+
// Lock consent for the rest of the flow so the buyer can't uncheck during
|
|
105
|
+
// the async PayPal handshake and create a race against the metadata writer.
|
|
106
|
+
// The `try/finally` below clears the lock on any non-success exit so the
|
|
107
|
+
// checkbox doesn't stay disabled when validation / inventory / store
|
|
108
|
+
// credit aborts before an order is actually created.
|
|
109
|
+
const consentRequired = isPolicyConsentRequired();
|
|
110
|
+
if (consentRequired) {
|
|
111
|
+
policyConsentStore.locked = true;
|
|
112
|
+
}
|
|
113
|
+
let handedOffToPayPal = false;
|
|
107
114
|
try {
|
|
115
|
+
const checkoutSessionStatus = await validateCheckoutSession();
|
|
116
|
+
if (!checkoutSessionStatus.valid) {
|
|
117
|
+
paypalStore.paypalErrorMessage = checkoutSessionStatus.errorMessage;
|
|
118
|
+
// reset stripe error message
|
|
119
|
+
stripeStore.hasPaymentError = false;
|
|
120
|
+
stripeStore.customErrorMessage = null;
|
|
121
|
+
submitAnalytics({
|
|
122
|
+
event: 'zonos-checkout-payment-fail',
|
|
123
|
+
metadata: {
|
|
124
|
+
checkoutSessionId,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
onPaypalFail === null || onPaypalFail === void 0 ? void 0 : onPaypalFail();
|
|
128
|
+
return '';
|
|
129
|
+
}
|
|
108
130
|
// reset paypal error banner
|
|
109
131
|
paypalStore.paypalErrorMessage = null;
|
|
110
132
|
// reset inventory check error message
|
|
@@ -114,7 +136,7 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
114
136
|
cartStore.inventoryCheckErrorMessage =
|
|
115
137
|
await stripeStoreHandleInventoryCheck();
|
|
116
138
|
}
|
|
117
|
-
catch (
|
|
139
|
+
catch (_b) {
|
|
118
140
|
// If user provide callback and it throw an exception, default to this message and stop the payment.
|
|
119
141
|
cartStore.inventoryCheckErrorMessage = translate('Unable to check inventory. Please try again.');
|
|
120
142
|
}
|
|
@@ -134,6 +156,13 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
134
156
|
return '';
|
|
135
157
|
}
|
|
136
158
|
}
|
|
159
|
+
// Persist consent into the checkout session metadata BEFORE either
|
|
160
|
+
// branch creates the order — both the store-credit-only path and the
|
|
161
|
+
// real PayPal path need the consent recorded. A transient failure here
|
|
162
|
+
// is logged (via `logError` inside the helper) but does NOT block the
|
|
163
|
+
// order: blocking on a flaky network would gate buyers from paying,
|
|
164
|
+
// and the buyer's consent intent is already captured client-side.
|
|
165
|
+
await stripeStoreRecordPolicyConsent();
|
|
137
166
|
// If store credit covers the full order, create order directly
|
|
138
167
|
if (storeCreditStoreCoversFullAmount()) {
|
|
139
168
|
const orderResult = await storeCreditStoreCreateOrder();
|
|
@@ -147,11 +176,18 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
147
176
|
onPaypalSessionDone === null || onPaypalSessionDone === void 0 ? void 0 : onPaypalSessionDone({ orderId: orderResult.orderId || '' });
|
|
148
177
|
cartStoreNextStep();
|
|
149
178
|
cartStoreClearCheckoutInterval();
|
|
179
|
+
// Store-credit-only success: the cart advances to the next step
|
|
180
|
+
// and the store reset on close will handle the lock cleanup.
|
|
181
|
+
handedOffToPayPal = true;
|
|
150
182
|
return '';
|
|
151
183
|
}
|
|
152
184
|
const paypalOrderId = await paypalStoreCreaterOrder({
|
|
153
185
|
checkoutSessionId,
|
|
154
186
|
});
|
|
187
|
+
// Successful hand-off to PayPal — the popup opens next and onApprove
|
|
188
|
+
// will fire on completion. Keep the lock set so closes/resets later
|
|
189
|
+
// clean up; an empty ID falls through to the unlock in `finally`.
|
|
190
|
+
handedOffToPayPal = !!paypalOrderId;
|
|
155
191
|
return paypalOrderId;
|
|
156
192
|
}
|
|
157
193
|
catch (err) {
|
|
@@ -170,6 +206,13 @@ const paypalButtonOptions = ({ checkoutSessionId, onPaypalFail, onPaypalSessionD
|
|
|
170
206
|
onPaypalFail === null || onPaypalFail === void 0 ? void 0 : onPaypalFail();
|
|
171
207
|
return '';
|
|
172
208
|
}
|
|
209
|
+
finally {
|
|
210
|
+
// Clear the lock unless we successfully handed off the order — on
|
|
211
|
+
// failures the buyer needs to be able to uncheck and retry.
|
|
212
|
+
if (consentRequired && !handedOffToPayPal) {
|
|
213
|
+
policyConsentStore.locked = false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
173
216
|
},
|
|
174
217
|
onApprove: async (_, _actions) => {
|
|
175
218
|
try {
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createStore } from "@stencil/store";
|
|
2
|
+
import { translate } from "../translationStore";
|
|
3
|
+
import { zonosStore } from "../zonosStore";
|
|
4
|
+
const POLICY_ORDER = [
|
|
5
|
+
'termsAndConditions',
|
|
6
|
+
'privacyPolicy',
|
|
7
|
+
'refundPolicy',
|
|
8
|
+
'shippingPolicy',
|
|
9
|
+
'warrantyPolicy',
|
|
10
|
+
];
|
|
11
|
+
// Reuses the lowercase `'Privacy policy'` key already translated in 19 locales
|
|
12
|
+
// (also used by the checkout footer) — the other four are new keys that follow
|
|
13
|
+
// the same lowercase convention for visual consistency in the joined consent line.
|
|
14
|
+
const POLICY_NAME_KEY = {
|
|
15
|
+
privacyPolicy: 'Privacy policy',
|
|
16
|
+
refundPolicy: 'Refund policy',
|
|
17
|
+
shippingPolicy: 'Shipping policy',
|
|
18
|
+
termsAndConditions: 'Terms and conditions',
|
|
19
|
+
warrantyPolicy: 'Warranty policy',
|
|
20
|
+
};
|
|
21
|
+
const { reset: policyConsentStoreReset, state: policyConsentStore } = createStore({
|
|
22
|
+
accepted: false,
|
|
23
|
+
acceptedAt: null,
|
|
24
|
+
locked: false,
|
|
25
|
+
showError: false,
|
|
26
|
+
});
|
|
27
|
+
export { policyConsentStore, policyConsentStoreReset };
|
|
28
|
+
/**
|
|
29
|
+
* Returns the list of policies the merchant has configured (non-empty link).
|
|
30
|
+
* Policies are returned in a fixed display order so the rendered list is
|
|
31
|
+
* deterministic across renders and across locales. URLs that aren't absolute
|
|
32
|
+
* http(s) URLs are filtered out as defense-in-depth against `javascript:` or
|
|
33
|
+
* other unexpected schemes slipping through the backend validation.
|
|
34
|
+
*
|
|
35
|
+
* Reads from `zonosStore.checkoutSettings` (not `window.Zonos.cartSettings`)
|
|
36
|
+
* so the consent UI works when zonos-elements is consumed via the npm package,
|
|
37
|
+
* where `cartSettings` is not populated.
|
|
38
|
+
*/
|
|
39
|
+
export const getEnabledPolicies = () => {
|
|
40
|
+
const links = zonosStore.checkoutSettings.merchantPolicyLinks;
|
|
41
|
+
if (!links) {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return POLICY_ORDER.reduce((acc, key) => {
|
|
45
|
+
var _a, _b;
|
|
46
|
+
const rawUrl = (_b = (_a = links[key]) === null || _a === void 0 ? void 0 : _a.link) === null || _b === void 0 ? void 0 : _b.trim();
|
|
47
|
+
if (!rawUrl || !/^https?:\/\//i.test(rawUrl)) {
|
|
48
|
+
return acc;
|
|
49
|
+
}
|
|
50
|
+
acc.push({
|
|
51
|
+
key,
|
|
52
|
+
name: translate(POLICY_NAME_KEY[key]),
|
|
53
|
+
url: rawUrl,
|
|
54
|
+
});
|
|
55
|
+
return acc;
|
|
56
|
+
}, []);
|
|
57
|
+
};
|
|
58
|
+
export const isPolicyConsentRequired = () => getEnabledPolicies().length > 0;
|