@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.
Files changed (336) hide show
  1. package/dist/cjs/{cart-ed2de167.js → cart-af7c024e.js} +129 -4
  2. package/dist/cjs/{debounce-606d1801.js → debounce-7990f5ea.js} +1 -1
  3. package/dist/cjs/{getBorderRadius-a91911e7.js → getBorderRadius-fc683d94.js} +1 -1
  4. package/dist/cjs/{getContrastColor-ce80dbe7.js → getContrastColor-d5134ef3.js} +2 -2
  5. package/dist/cjs/{hasInclusivePrice-bf31fbdb.js → hasInclusivePrice-0fa6e022.js} +1 -1
  6. package/dist/cjs/index.cjs.js +7 -7
  7. package/dist/cjs/{invoice-542c23e7.js → invoice-c2e3f232.js} +3 -3
  8. package/dist/cjs/{isCollectMobileTablet-fe8149a5.js → isCollectMobileTablet-6014787b.js} +3 -3
  9. package/dist/cjs/{isContrastColor-a02c4889.js → isContrastColor-76592c92.js} +1 -1
  10. package/dist/cjs/{isDarkColor-e317bb06.js → isDarkColor-5d6ca405.js} +1 -1
  11. package/dist/cjs/loader.cjs.js +1 -1
  12. package/dist/cjs/{localization-66d378ab.js → localization-f897bc45.js} +421 -1
  13. package/dist/cjs/{paypal-d8282578.js → paypal-6756a0da.js} +60 -18
  14. package/dist/cjs/{placeTestOrder-0a4b9dd7.js → placeTestOrder-a4874e51.js} +2 -2
  15. package/dist/cjs/{renderCheckoutCurrency-ac9083d9.js → renderCheckoutCurrency-584d50fe.js} +2 -2
  16. package/dist/cjs/{submitGtag-07a3b09e.js → submitGtag-4906b161.js} +1 -1
  17. package/dist/cjs/{throttle-8aebac7d.js → throttle-02c2e917.js} +2 -2
  18. package/dist/cjs/{updateCheckoutSessionAttributes-a9a97194.js → updateCheckoutSessionAttributes-47d73942.js} +1 -1
  19. package/dist/cjs/zonos-address-display_8.cjs.entry.js +7 -7
  20. package/dist/cjs/zonos-address_4.cjs.entry.js +7 -7
  21. package/dist/cjs/zonos-badge.cjs.entry.js +1 -1
  22. package/dist/cjs/zonos-banner.cjs.entry.js +1 -1
  23. package/dist/cjs/zonos-button_3.cjs.entry.js +3 -3
  24. package/dist/cjs/zonos-card_5.cjs.entry.js +8 -8
  25. package/dist/cjs/zonos-cart-items_12.cjs.entry.js +94 -27
  26. package/dist/cjs/zonos-checkbox_2.cjs.entry.js +3 -3
  27. package/dist/cjs/zonos-checkout.cjs.entry.js +112 -85
  28. package/dist/cjs/zonos-collapse.cjs.entry.js +1 -1
  29. package/dist/cjs/zonos-collect-cart-items_3.cjs.entry.js +5 -5
  30. package/dist/cjs/zonos-collect-finish_6.cjs.entry.js +11 -11
  31. package/dist/cjs/zonos-collect.cjs.entry.js +9 -9
  32. package/dist/cjs/zonos-controller.cjs.entry.js +6 -6
  33. package/dist/cjs/zonos-country-flag.cjs.entry.js +2 -2
  34. package/dist/cjs/zonos-country-select_4.cjs.entry.js +3 -3
  35. package/dist/cjs/zonos-elements.cjs.js +1 -1
  36. package/dist/cjs/zonos-hello-dialog.cjs.entry.js +3 -3
  37. package/dist/cjs/zonos-hello.cjs.entry.js +3 -3
  38. package/dist/cjs/zonos-input.cjs.entry.js +2 -2
  39. package/dist/cjs/zonos-invoice-cart-items_2.cjs.entry.js +7 -7
  40. package/dist/cjs/zonos-invoice-finish_5.cjs.entry.js +11 -11
  41. package/dist/cjs/zonos-invoice.cjs.entry.js +9 -9
  42. package/dist/cjs/zonos-language-select_2.cjs.entry.js +2 -2
  43. package/dist/cjs/zonos-logo.cjs.entry.js +1 -1
  44. package/dist/cjs/{zonos-store-credit.cjs.entry.js → zonos-policy-consent_2.cjs.entry.js} +91 -6
  45. package/dist/cjs/zonos-shipping-rich-radio.cjs.entry.js +5 -5
  46. package/dist/cjs/zonos-stripe-input.cjs.entry.js +3 -3
  47. package/dist/cjs/zonos-text.cjs.entry.js +1 -1
  48. package/dist/cjs/zonos-v-stack.cjs.entry.js +1 -1
  49. package/dist/cjs/{zonosStore-0662b95f.js → zonosStore-45a87908.js} +1 -0
  50. package/dist/collection/collection-manifest.json +1 -0
  51. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout-footer/zonos-checkout-footer.js +7 -2
  52. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout-payment/zonos-checkout-payment.js +66 -12
  53. package/dist/collection/components/checkout/zonos-checkout/zonos-checkout.js +103 -75
  54. package/dist/collection/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.css +93 -0
  55. package/dist/collection/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.js +93 -0
  56. package/dist/collection/components/store/checkout/paypal.js +57 -14
  57. package/dist/collection/components/store/checkout/policyConsent.js +58 -0
  58. package/dist/collection/components/store/checkout/stripe.js +66 -0
  59. package/dist/collection/components/store/translationStore/strings.arabic.js +21 -0
  60. package/dist/collection/components/store/translationStore/strings.base.js +21 -0
  61. package/dist/collection/components/store/translationStore/strings.chinese.js +21 -0
  62. package/dist/collection/components/store/translationStore/strings.danish.js +21 -0
  63. package/dist/collection/components/store/translationStore/strings.dutch.js +21 -0
  64. package/dist/collection/components/store/translationStore/strings.french.js +21 -0
  65. package/dist/collection/components/store/translationStore/strings.german.js +21 -0
  66. package/dist/collection/components/store/translationStore/strings.hebrew.js +21 -0
  67. package/dist/collection/components/store/translationStore/strings.indonesian.js +21 -0
  68. package/dist/collection/components/store/translationStore/strings.italian.js +21 -0
  69. package/dist/collection/components/store/translationStore/strings.japanese.js +21 -0
  70. package/dist/collection/components/store/translationStore/strings.korean.js +21 -0
  71. package/dist/collection/components/store/translationStore/strings.norwegian.js +21 -0
  72. package/dist/collection/components/store/translationStore/strings.polish.js +21 -0
  73. package/dist/collection/components/store/translationStore/strings.portuguese.js +21 -0
  74. package/dist/collection/components/store/translationStore/strings.russian.js +21 -0
  75. package/dist/collection/components/store/translationStore/strings.spanish.js +21 -0
  76. package/dist/collection/components/store/translationStore/strings.swedish.js +21 -0
  77. package/dist/collection/components/store/translationStore/strings.turkish.js +21 -0
  78. package/dist/collection/components/store/translationStore/strings.vietnamese.js +21 -0
  79. package/dist/collection/components/store/zonosStore.js +1 -0
  80. package/dist/collection/types/generated/graphql.internal.types.js +64 -0
  81. package/dist/esm/{cart-49082718.js → cart-68c16805.js} +125 -5
  82. package/dist/esm/{debounce-ab526ca0.js → debounce-58e4ff3e.js} +1 -1
  83. package/dist/esm/{getBorderRadius-98c64be8.js → getBorderRadius-d23f47a6.js} +1 -1
  84. package/dist/esm/{getContrastColor-0aa643c1.js → getContrastColor-f0bd5b65.js} +2 -2
  85. package/dist/esm/{hasInclusivePrice-2323d514.js → hasInclusivePrice-f1ca1610.js} +1 -1
  86. package/dist/esm/index.js +7 -7
  87. package/dist/esm/{invoice-16c688e7.js → invoice-d0eadc6a.js} +3 -3
  88. package/dist/esm/{isCollectMobileTablet-910aea2e.js → isCollectMobileTablet-11ade63f.js} +3 -3
  89. package/dist/esm/{isContrastColor-6bad285e.js → isContrastColor-fbddacb6.js} +1 -1
  90. package/dist/esm/{isDarkColor-0a8453e7.js → isDarkColor-566f04c5.js} +1 -1
  91. package/dist/esm/loader.js +1 -1
  92. package/dist/esm/{localization-33a9f7ff.js → localization-8e81b696.js} +421 -1
  93. package/dist/esm/{paypal-2e9aa4ba.js → paypal-e32877e9.js} +60 -18
  94. package/dist/esm/{placeTestOrder-35c9b460.js → placeTestOrder-4cf429d7.js} +2 -2
  95. package/dist/esm/{renderCheckoutCurrency-b84a6da7.js → renderCheckoutCurrency-9459b8a3.js} +2 -2
  96. package/dist/esm/{submitGtag-ae9d5d91.js → submitGtag-c7ea1f2a.js} +1 -1
  97. package/dist/esm/{throttle-882b1f47.js → throttle-f09d0659.js} +2 -2
  98. package/dist/esm/{updateCheckoutSessionAttributes-da7fdd37.js → updateCheckoutSessionAttributes-40e301a4.js} +1 -1
  99. package/dist/esm/zonos-address-display_8.entry.js +7 -7
  100. package/dist/esm/zonos-address_4.entry.js +7 -7
  101. package/dist/esm/zonos-badge.entry.js +1 -1
  102. package/dist/esm/zonos-banner.entry.js +1 -1
  103. package/dist/esm/zonos-button_3.entry.js +3 -3
  104. package/dist/esm/zonos-card_5.entry.js +8 -8
  105. package/dist/esm/zonos-cart-items_12.entry.js +94 -27
  106. package/dist/esm/zonos-checkbox_2.entry.js +3 -3
  107. package/dist/esm/zonos-checkout.entry.js +112 -85
  108. package/dist/esm/zonos-collapse.entry.js +1 -1
  109. package/dist/esm/zonos-collect-cart-items_3.entry.js +5 -5
  110. package/dist/esm/zonos-collect-finish_6.entry.js +11 -11
  111. package/dist/esm/zonos-collect.entry.js +9 -9
  112. package/dist/esm/zonos-controller.entry.js +6 -6
  113. package/dist/esm/zonos-country-flag.entry.js +2 -2
  114. package/dist/esm/zonos-country-select_4.entry.js +3 -3
  115. package/dist/esm/zonos-elements.js +1 -1
  116. package/dist/esm/zonos-hello-dialog.entry.js +3 -3
  117. package/dist/esm/zonos-hello.entry.js +3 -3
  118. package/dist/esm/zonos-input.entry.js +2 -2
  119. package/dist/esm/zonos-invoice-cart-items_2.entry.js +7 -7
  120. package/dist/esm/zonos-invoice-finish_5.entry.js +11 -11
  121. package/dist/esm/zonos-invoice.entry.js +9 -9
  122. package/dist/esm/zonos-language-select_2.entry.js +2 -2
  123. package/dist/esm/zonos-logo.entry.js +1 -1
  124. package/dist/esm/{zonos-store-credit.entry.js → zonos-policy-consent_2.entry.js} +91 -7
  125. package/dist/esm/zonos-shipping-rich-radio.entry.js +5 -5
  126. package/dist/esm/zonos-stripe-input.entry.js +3 -3
  127. package/dist/esm/zonos-text.entry.js +1 -1
  128. package/dist/esm/zonos-v-stack.entry.js +1 -1
  129. package/dist/esm/{zonosStore-9662b071.js → zonosStore-8e19daff.js} +1 -0
  130. package/dist/esm-es5/cart-68c16805.js +1 -0
  131. package/dist/esm-es5/{debounce-ab526ca0.js → debounce-58e4ff3e.js} +1 -1
  132. package/dist/esm-es5/{getBorderRadius-98c64be8.js → getBorderRadius-d23f47a6.js} +1 -1
  133. package/dist/esm-es5/{getContrastColor-0aa643c1.js → getContrastColor-f0bd5b65.js} +1 -1
  134. package/dist/esm-es5/{hasInclusivePrice-2323d514.js → hasInclusivePrice-f1ca1610.js} +1 -1
  135. package/dist/esm-es5/index.js +1 -1
  136. package/dist/esm-es5/{invoice-16c688e7.js → invoice-d0eadc6a.js} +1 -1
  137. package/dist/esm-es5/{isCollectMobileTablet-910aea2e.js → isCollectMobileTablet-11ade63f.js} +1 -1
  138. package/dist/esm-es5/{isContrastColor-6bad285e.js → isContrastColor-fbddacb6.js} +1 -1
  139. package/dist/esm-es5/{isDarkColor-0a8453e7.js → isDarkColor-566f04c5.js} +1 -1
  140. package/dist/esm-es5/loader.js +1 -1
  141. package/dist/esm-es5/localization-8e81b696.js +1 -0
  142. package/dist/esm-es5/{paypal-2e9aa4ba.js → paypal-e32877e9.js} +2 -2
  143. package/dist/esm-es5/{placeTestOrder-35c9b460.js → placeTestOrder-4cf429d7.js} +1 -1
  144. package/dist/esm-es5/{renderCheckoutCurrency-b84a6da7.js → renderCheckoutCurrency-9459b8a3.js} +1 -1
  145. package/dist/esm-es5/{submitGtag-ae9d5d91.js → submitGtag-c7ea1f2a.js} +1 -1
  146. package/dist/esm-es5/throttle-f09d0659.js +1 -0
  147. package/dist/esm-es5/{updateCheckoutSessionAttributes-da7fdd37.js → updateCheckoutSessionAttributes-40e301a4.js} +1 -1
  148. package/dist/esm-es5/zonos-address-display_8.entry.js +1 -1
  149. package/dist/esm-es5/zonos-address_4.entry.js +1 -1
  150. package/dist/esm-es5/zonos-badge.entry.js +1 -1
  151. package/dist/esm-es5/zonos-banner.entry.js +1 -1
  152. package/dist/esm-es5/zonos-button_3.entry.js +1 -1
  153. package/dist/esm-es5/zonos-card_5.entry.js +1 -1
  154. package/dist/esm-es5/zonos-cart-items_12.entry.js +1 -1
  155. package/dist/esm-es5/zonos-checkbox_2.entry.js +1 -1
  156. package/dist/esm-es5/zonos-checkout.entry.js +1 -1
  157. package/dist/esm-es5/zonos-collapse.entry.js +1 -1
  158. package/dist/esm-es5/zonos-collect-cart-items_3.entry.js +1 -1
  159. package/dist/esm-es5/zonos-collect-finish_6.entry.js +1 -1
  160. package/dist/esm-es5/zonos-collect.entry.js +1 -1
  161. package/dist/esm-es5/zonos-controller.entry.js +1 -1
  162. package/dist/esm-es5/zonos-country-flag.entry.js +1 -1
  163. package/dist/esm-es5/zonos-country-select_4.entry.js +1 -1
  164. package/dist/esm-es5/zonos-elements.js +1 -1
  165. package/dist/esm-es5/zonos-hello-dialog.entry.js +1 -1
  166. package/dist/esm-es5/zonos-hello.entry.js +1 -1
  167. package/dist/esm-es5/zonos-input.entry.js +1 -1
  168. package/dist/esm-es5/zonos-invoice-cart-items_2.entry.js +1 -1
  169. package/dist/esm-es5/zonos-invoice-finish_5.entry.js +1 -1
  170. package/dist/esm-es5/zonos-invoice.entry.js +1 -1
  171. package/dist/esm-es5/zonos-language-select_2.entry.js +1 -1
  172. package/dist/esm-es5/zonos-logo.entry.js +1 -1
  173. package/dist/esm-es5/zonos-policy-consent_2.entry.js +1 -0
  174. package/dist/esm-es5/zonos-shipping-rich-radio.entry.js +1 -1
  175. package/dist/esm-es5/zonos-stripe-input.entry.js +1 -1
  176. package/dist/esm-es5/zonos-text.entry.js +1 -1
  177. package/dist/esm-es5/zonos-v-stack.entry.js +1 -1
  178. package/dist/esm-es5/{zonosStore-9662b071.js → zonosStore-8e19daff.js} +1 -1
  179. package/dist/scripts/index.d.ts +80 -6
  180. package/dist/scripts/index.js +1 -1
  181. package/dist/scripts/loadZonos.js +1 -1
  182. package/dist/scripts/zonos.js +1 -1
  183. package/dist/types/components/checkout/zonos-checkout/zonos-policy-consent/zonos-policy-consent.d.ts +3 -0
  184. package/dist/types/components/store/checkout/policyConsent.d.ts +41 -0
  185. package/dist/types/components/store/checkout/stripe.d.ts +13 -0
  186. package/dist/types/components/store/translationStore/strings.arabic.d.ts +21 -0
  187. package/dist/types/components/store/translationStore/strings.base.d.ts +21 -0
  188. package/dist/types/components/store/translationStore/strings.chinese.d.ts +21 -0
  189. package/dist/types/components/store/translationStore/strings.danish.d.ts +21 -0
  190. package/dist/types/components/store/translationStore/strings.dutch.d.ts +21 -0
  191. package/dist/types/components/store/translationStore/strings.french.d.ts +21 -0
  192. package/dist/types/components/store/translationStore/strings.german.d.ts +21 -0
  193. package/dist/types/components/store/translationStore/strings.hebrew.d.ts +21 -0
  194. package/dist/types/components/store/translationStore/strings.indonesian.d.ts +21 -0
  195. package/dist/types/components/store/translationStore/strings.italian.d.ts +21 -0
  196. package/dist/types/components/store/translationStore/strings.japanese.d.ts +21 -0
  197. package/dist/types/components/store/translationStore/strings.korean.d.ts +21 -0
  198. package/dist/types/components/store/translationStore/strings.norwegian.d.ts +21 -0
  199. package/dist/types/components/store/translationStore/strings.polish.d.ts +21 -0
  200. package/dist/types/components/store/translationStore/strings.portuguese.d.ts +21 -0
  201. package/dist/types/components/store/translationStore/strings.russian.d.ts +21 -0
  202. package/dist/types/components/store/translationStore/strings.spanish.d.ts +21 -0
  203. package/dist/types/components/store/translationStore/strings.swedish.d.ts +21 -0
  204. package/dist/types/components/store/translationStore/strings.turkish.d.ts +21 -0
  205. package/dist/types/components/store/translationStore/strings.vietnamese.d.ts +21 -0
  206. package/dist/types/components/utils/api/getLocaleMessages.d.ts +1 -1
  207. package/dist/types/components.d.ts +13 -0
  208. package/dist/types/scripts/cart/_setupCartDataWithSettings.d.ts +23 -6
  209. package/dist/types/types/checkout/CheckoutConfig.d.ts +23 -0
  210. package/dist/types/types/generated/graphql.frontend.types.d.ts +1 -1
  211. package/dist/types/types/generated/graphql.frontend.types.ts +1 -1
  212. package/dist/types/types/generated/graphql.internal.types.d.ts +170 -23
  213. package/dist/types/types/generated/graphql.internal.types.ts +152 -23
  214. package/dist/zonos-elements/index.esm.js +1 -1
  215. package/dist/zonos-elements/{p-703fc360.entry.js → p-000b895a.entry.js} +1 -1
  216. package/dist/zonos-elements/p-01913da8.js +1 -0
  217. package/dist/zonos-elements/{p-b5a26334.system.entry.js → p-06e7fe2a.system.entry.js} +1 -1
  218. package/dist/zonos-elements/{p-becac995.js → p-0803ad10.js} +1 -1
  219. package/dist/zonos-elements/{p-79e5a629.system.entry.js → p-0e36a7cf.system.entry.js} +1 -1
  220. package/dist/zonos-elements/{p-baf0b24c.system.entry.js → p-108b5307.system.entry.js} +1 -1
  221. package/dist/zonos-elements/{p-029be4a8.entry.js → p-11439d12.entry.js} +1 -1
  222. package/dist/zonos-elements/{p-b6df4cc2.system.entry.js → p-134c5010.system.entry.js} +1 -1
  223. package/dist/zonos-elements/{p-8d5f413c.system.entry.js → p-1376e67f.system.entry.js} +1 -1
  224. package/dist/zonos-elements/p-14d6542f.system.js +1 -0
  225. package/dist/zonos-elements/p-17be8409.entry.js +1 -0
  226. package/dist/zonos-elements/{p-843ced6c.js → p-17e3cd62.js} +1 -1
  227. package/dist/zonos-elements/{p-0207c91e.system.js → p-18af6aaa.system.js} +1 -1
  228. package/dist/zonos-elements/{p-5d823ea7.system.js → p-1eef8c23.system.js} +1 -1
  229. package/dist/zonos-elements/{p-2c854197.system.entry.js → p-24091606.system.entry.js} +1 -1
  230. package/dist/zonos-elements/{p-6b6cfc59.system.entry.js → p-26ae4ee7.system.entry.js} +1 -1
  231. package/dist/zonos-elements/p-29b60bf3.system.js +1 -1
  232. package/dist/zonos-elements/{p-71fb6126.entry.js → p-2afecda7.entry.js} +1 -1
  233. package/dist/zonos-elements/p-2ccd20c0.system.js +1 -0
  234. package/dist/zonos-elements/{p-d28be518.js → p-33d4be28.js} +1 -1
  235. package/dist/zonos-elements/{p-26c85188.entry.js → p-344a1fee.entry.js} +1 -1
  236. package/dist/zonos-elements/{p-a78bc004.entry.js → p-38311c16.entry.js} +1 -1
  237. package/dist/zonos-elements/p-3b28fc76.js +1 -0
  238. package/dist/zonos-elements/{p-db3b101a.js → p-3dc3596b.js} +1 -1
  239. package/dist/zonos-elements/{p-3689821f.system.js → p-3e7ee89d.system.js} +1 -1
  240. package/dist/zonos-elements/{p-8570e88a.system.js → p-44b279cc.system.js} +1 -1
  241. package/dist/zonos-elements/{p-b7e4a020.system.entry.js → p-48805ed6.system.entry.js} +1 -1
  242. package/dist/zonos-elements/{p-ab0b23f2.js → p-4df08fc4.js} +1 -1
  243. package/dist/zonos-elements/p-4fe3d5e0.system.js +18 -0
  244. package/dist/zonos-elements/{p-90c932fd.entry.js → p-50362897.entry.js} +1 -1
  245. package/dist/zonos-elements/p-52bd7be3.system.js +1 -0
  246. package/dist/zonos-elements/{p-deaf0e38.system.entry.js → p-536cbab5.system.entry.js} +1 -1
  247. package/dist/zonos-elements/{p-175c04a4.system.js → p-53a59935.system.js} +1 -1
  248. package/dist/zonos-elements/{p-cb966d16.system.entry.js → p-593764cf.system.entry.js} +1 -1
  249. package/dist/zonos-elements/{p-311ba000.system.js → p-5b05b461.system.js} +1 -1
  250. package/dist/zonos-elements/{p-a49ba3ae.system.entry.js → p-5b4e5608.system.entry.js} +1 -1
  251. package/dist/zonos-elements/{p-1bf9a1b9.system.js → p-5d65be06.system.js} +1 -1
  252. package/dist/zonos-elements/{p-e850e6e7.system.entry.js → p-5e18d92b.system.entry.js} +1 -1
  253. package/dist/zonos-elements/{p-1957af5a.system.entry.js → p-5f92db80.system.entry.js} +1 -1
  254. package/dist/zonos-elements/p-5fa2395d.system.js +1 -0
  255. package/dist/zonos-elements/{p-5e1799bc.entry.js → p-620a9013.entry.js} +1 -1
  256. package/dist/zonos-elements/p-623fc89a.system.entry.js +1 -0
  257. package/dist/zonos-elements/p-64e8f05d.system.entry.js +1 -0
  258. package/dist/zonos-elements/{p-2a6be4a5.entry.js → p-658ab5e2.entry.js} +1 -1
  259. package/dist/zonos-elements/{p-180d3e3d.entry.js → p-673407b8.entry.js} +1 -1
  260. package/dist/zonos-elements/{p-a1bad0c3.system.entry.js → p-69089a6f.system.entry.js} +1 -1
  261. package/dist/zonos-elements/{p-1ec9b3b0.entry.js → p-6f41c193.entry.js} +1 -1
  262. package/dist/zonos-elements/{p-f3cfd8fa.js → p-701d9a7c.js} +1 -1
  263. package/dist/zonos-elements/{p-d950b0b4.entry.js → p-7166df08.entry.js} +1 -1
  264. package/dist/zonos-elements/p-72960738.js +1 -0
  265. package/dist/zonos-elements/p-72c3756a.js +1 -0
  266. package/dist/zonos-elements/{p-db5f6b8c.entry.js → p-7628569a.entry.js} +1 -1
  267. package/dist/zonos-elements/p-774de1ec.system.js +1 -0
  268. package/dist/zonos-elements/{p-27061873.entry.js → p-777d396e.entry.js} +1 -1
  269. package/dist/zonos-elements/{p-4f718ef9.system.js → p-7a220941.system.js} +1 -1
  270. package/dist/zonos-elements/{p-46071125.entry.js → p-7aca66cd.entry.js} +1 -1
  271. package/dist/zonos-elements/p-7cf8e1f0.js +1 -0
  272. package/dist/zonos-elements/{p-eb99a625.system.js → p-7d9d2407.system.js} +1 -1
  273. package/dist/zonos-elements/{p-0ed70279.entry.js → p-7fef8558.entry.js} +1 -1
  274. package/dist/zonos-elements/{p-7003d093.system.entry.js → p-80df7e0b.system.entry.js} +1 -1
  275. package/dist/zonos-elements/p-8116d3ba.entry.js +1 -0
  276. package/dist/zonos-elements/{p-648f3ada.entry.js → p-889a44fc.entry.js} +1 -1
  277. package/dist/zonos-elements/{p-4c89d04a.js → p-896fb969.js} +1 -1
  278. package/dist/zonos-elements/{p-1325bbd6.system.entry.js → p-8ddc21f1.system.entry.js} +1 -1
  279. package/dist/zonos-elements/p-90d22087.system.js +1 -0
  280. package/dist/zonos-elements/{p-3516340a.system.entry.js → p-95b460e9.system.entry.js} +1 -1
  281. package/dist/zonos-elements/{p-087520f2.system.entry.js → p-95f3bbad.system.entry.js} +1 -1
  282. package/dist/zonos-elements/{p-71c7a1ff.entry.js → p-97da66f2.entry.js} +1 -1
  283. package/dist/zonos-elements/{p-55fb4ea3.system.entry.js → p-98bea13e.system.entry.js} +1 -1
  284. package/dist/zonos-elements/{p-ba9e2612.system.entry.js → p-990d1495.system.entry.js} +1 -1
  285. package/dist/zonos-elements/p-9f5fb332.js +1 -0
  286. package/dist/zonos-elements/{p-ce103c66.system.entry.js → p-a0ee01dd.system.entry.js} +1 -1
  287. package/dist/zonos-elements/p-ac8cfdc0.js +1 -0
  288. package/dist/zonos-elements/{p-22ba60f6.system.entry.js → p-af12a1b7.system.entry.js} +1 -1
  289. package/dist/zonos-elements/{p-b4b23475.entry.js → p-b35a0b1e.entry.js} +1 -1
  290. package/dist/zonos-elements/{p-bf5c3dd7.system.entry.js → p-b59fc3fa.system.entry.js} +1 -1
  291. package/dist/zonos-elements/p-b71ef46e.js +17 -0
  292. package/dist/zonos-elements/{p-a6db8883.entry.js → p-b93b66c2.entry.js} +1 -1
  293. package/dist/zonos-elements/p-b9a615bc.system.entry.js +1 -0
  294. package/dist/zonos-elements/{p-6a195559.system.js → p-bc919de1.system.js} +1 -1
  295. package/dist/zonos-elements/{p-9e0cb5b3.system.entry.js → p-bc9a30a1.system.entry.js} +1 -1
  296. package/dist/zonos-elements/{p-665bfd4f.entry.js → p-c1463da7.entry.js} +1 -1
  297. package/dist/zonos-elements/{p-8f9e95c2.entry.js → p-c3459f4a.entry.js} +1 -1
  298. package/dist/zonos-elements/{p-2a8fcb71.system.entry.js → p-c7ca3e98.system.entry.js} +1 -1
  299. package/dist/zonos-elements/p-c91fade3.entry.js +1 -0
  300. package/dist/zonos-elements/{p-79f3c227.system.entry.js → p-c92a5ae5.system.entry.js} +1 -1
  301. package/dist/zonos-elements/p-cd34ecf2.js +1 -0
  302. package/dist/zonos-elements/{p-28e2ac3b.entry.js → p-dae881f2.entry.js} +1 -1
  303. package/dist/zonos-elements/{p-9a5a2043.js → p-dcafbd4e.js} +1 -1
  304. package/dist/zonos-elements/{p-8571f3ce.entry.js → p-df55536b.entry.js} +1 -1
  305. package/dist/zonos-elements/{p-01497a20.entry.js → p-e3d6f9b4.entry.js} +1 -1
  306. package/dist/zonos-elements/{p-928291e5.entry.js → p-e548b8ec.entry.js} +1 -1
  307. package/dist/zonos-elements/{p-5e6f85f0.system.js → p-f053975e.system.js} +1 -1
  308. package/dist/zonos-elements/{p-601bb27e.entry.js → p-fc5007e0.entry.js} +1 -1
  309. package/dist/zonos-elements/zonos-elements.esm.js +1 -1
  310. package/package.json +1 -1
  311. package/dist/esm-es5/cart-49082718.js +0 -1
  312. package/dist/esm-es5/localization-33a9f7ff.js +0 -1
  313. package/dist/esm-es5/throttle-882b1f47.js +0 -1
  314. package/dist/esm-es5/zonos-store-credit.entry.js +0 -1
  315. package/dist/zonos-elements/p-034ab928.system.entry.js +0 -1
  316. package/dist/zonos-elements/p-07a76716.system.js +0 -1
  317. package/dist/zonos-elements/p-1f256673.entry.js +0 -1
  318. package/dist/zonos-elements/p-367a72bc.js +0 -1
  319. package/dist/zonos-elements/p-3b1b3598.system.js +0 -18
  320. package/dist/zonos-elements/p-40284821.system.js +0 -1
  321. package/dist/zonos-elements/p-458df669.js +0 -1
  322. package/dist/zonos-elements/p-4980facb.js +0 -1
  323. package/dist/zonos-elements/p-6987f9c9.js +0 -1
  324. package/dist/zonos-elements/p-6d81901a.js +0 -1
  325. package/dist/zonos-elements/p-77c2e465.system.js +0 -1
  326. package/dist/zonos-elements/p-84dbf474.js +0 -17
  327. package/dist/zonos-elements/p-9b0a6fe5.system.entry.js +0 -1
  328. package/dist/zonos-elements/p-adb9827c.js +0 -1
  329. package/dist/zonos-elements/p-b2d276e1.js +0 -1
  330. package/dist/zonos-elements/p-b6a36c25.system.js +0 -1
  331. package/dist/zonos-elements/p-c9c17d08.system.entry.js +0 -1
  332. package/dist/zonos-elements/p-cfb0059f.js +0 -1
  333. package/dist/zonos-elements/p-e056ae6b.entry.js +0 -1
  334. package/dist/zonos-elements/p-e3292be8.system.js +0 -1
  335. package/dist/zonos-elements/p-e5dfccd8.system.js +0 -1
  336. 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
- // reset paypal error message
1398
- paypalStore.paypalErrorMessage = null;
1399
- // reset error state
1400
- stripeStore.hasPaymentError = false;
1401
- this.submitLoading = true;
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
- // check inventory before proceeding to payment
1417
- cartStore.inventoryCheckErrorMessage =
1418
- await stripeStoreHandleInventoryCheck();
1419
- }
1420
- catch (_a) {
1421
- // If user provide callback and it throw an exception, default to this message and stop the payment.
1422
- cartStore.inventoryCheckErrorMessage = translate('Unable to check inventory. Please try again.');
1423
- }
1424
- // Don't proceed to payment if there's an error message
1425
- if (cartStore.inventoryCheckErrorMessage) {
1426
- // stop the submit loading state
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
- storeCreditResult.error ||
1438
- translate('Unable to apply store credit. Please try again.');
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
- // Validate checkout session (landed cost ID, etc.) before creating order
1447
- const checkoutSessionStatus = await validateCheckoutSession();
1448
- if (!checkoutSessionStatus.valid) {
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 = checkoutSessionStatus.errorMessage;
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
- const orderResult = await storeCreditStoreCreateOrder();
1455
- if (!orderResult.success) {
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
- try {
1480
- await stripeStoreConfirmPayment();
1481
- cartStoreNextStep();
1482
- // clear the checkout session timeout timer when purchase is complete
1483
- cartStoreClearCheckoutInterval();
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
- const checkoutSessionStatus = await validateCheckoutSession();
93
- if (!checkoutSessionStatus.valid) {
94
- paypalStore.paypalErrorMessage = checkoutSessionStatus.errorMessage;
95
- // reset stripe error message
96
- stripeStore.hasPaymentError = false;
97
- stripeStore.customErrorMessage = null;
98
- submitAnalytics({
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 (_a) {
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;