fontdue-js 2.22.0 → 2.22.1

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 (370) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/components/ConfigContext.d.ts +3 -0
  3. package/dist/components/ConfigContext.js +2 -1
  4. package/dist/components/FontdueProvider/FontdueProviderClientComponent.js +2 -0
  5. package/dist/corsError.d.ts +1 -0
  6. package/dist/corsError.js +16 -9
  7. package/dist/global-shim.d.ts +1 -0
  8. package/dist/global-shim.js +8 -0
  9. package/dist/relay/environment.js +51 -42
  10. package/dist-cjs/__generated__/AddToCartBannerQuery.graphql.js +194 -0
  11. package/dist-cjs/__generated__/AddToCartBanner_item.graphql.js +107 -0
  12. package/dist-cjs/__generated__/AddToCartBanner_order.graphql.js +131 -0
  13. package/dist-cjs/__generated__/AddressFieldsRefetchQuery.graphql.js +170 -0
  14. package/dist-cjs/__generated__/AddressFields_viewer.graphql.js +125 -0
  15. package/dist-cjs/__generated__/BuyButtonIDQuery.graphql.js +121 -0
  16. package/dist-cjs/__generated__/BuyButtonSlugQuery.graphql.js +146 -0
  17. package/dist-cjs/__generated__/BuyButton_collection.graphql.js +56 -0
  18. package/dist-cjs/__generated__/CartButtonQuery.graphql.js +139 -0
  19. package/dist-cjs/__generated__/CartButton_order.graphql.js +71 -0
  20. package/dist-cjs/__generated__/CartItemAdditionalLicenses_licenses.graphql.js +42 -0
  21. package/dist-cjs/__generated__/CartItemAdditionalLicenses_orderItem.graphql.js +52 -0
  22. package/dist-cjs/__generated__/CartItemLicense_selection.graphql.js +80 -0
  23. package/dist-cjs/__generated__/CartItemProduct_product.graphql.js +113 -0
  24. package/dist-cjs/__generated__/CartItemVariable_selection.graphql.js +107 -0
  25. package/dist-cjs/__generated__/CartItemVariable_variable.graphql.js +58 -0
  26. package/dist-cjs/__generated__/CartItem_node.graphql.js +166 -0
  27. package/dist-cjs/__generated__/CartOrderCompleteOrderMutation.graphql.js +783 -0
  28. package/dist-cjs/__generated__/CartOrderRemoveDiscountMutation.graphql.js +760 -0
  29. package/dist-cjs/__generated__/CartOrderUpdateMutation.graphql.js +795 -0
  30. package/dist-cjs/__generated__/CartOrder_UpdateErrors.graphql.js +43 -0
  31. package/dist-cjs/__generated__/CartOrder_order.graphql.js +264 -0
  32. package/dist-cjs/__generated__/CartOrder_viewer.graphql.js +51 -0
  33. package/dist-cjs/__generated__/CartQuery.graphql.js +887 -0
  34. package/dist-cjs/__generated__/CartStateRemoveDiscountMutation.graphql.js +422 -0
  35. package/dist-cjs/__generated__/CartStateUpdateMutation.graphql.js +790 -0
  36. package/dist-cjs/__generated__/CartState_order.graphql.js +122 -0
  37. package/dist-cjs/__generated__/CartTotals_order.graphql.js +140 -0
  38. package/dist-cjs/__generated__/CharacterViewerIDQuery.graphql.js +332 -0
  39. package/dist-cjs/__generated__/CharacterViewerSlugQuery.graphql.js +362 -0
  40. package/dist-cjs/__generated__/CharacterViewerStyleRefetchQuery.graphql.js +226 -0
  41. package/dist-cjs/__generated__/CharacterViewer_collection.graphql.js +197 -0
  42. package/dist-cjs/__generated__/CharacterViewer_family.graphql.js +101 -0
  43. package/dist-cjs/__generated__/CharacterViewer_style.graphql.js +161 -0
  44. package/dist-cjs/__generated__/CheckoutUpdateCustomerMutation.graphql.js +770 -0
  45. package/dist-cjs/__generated__/CheckoutUpdateOrderMutation.graphql.js +811 -0
  46. package/dist-cjs/__generated__/Checkout_UpdateOrderErrors.graphql.js +97 -0
  47. package/dist-cjs/__generated__/Checkout_identity.graphql.js +94 -0
  48. package/dist-cjs/__generated__/Checkout_order.graphql.js +144 -0
  49. package/dist-cjs/__generated__/Checkout_viewer.graphql.js +74 -0
  50. package/dist-cjs/__generated__/CollectionAa_Query.graphql.js +192 -0
  51. package/dist-cjs/__generated__/CollectionAa_product.graphql.js +69 -0
  52. package/dist-cjs/__generated__/CouponCodeInputApplyCouponMutation.graphql.js +432 -0
  53. package/dist-cjs/__generated__/CouponText_coupon.graphql.js +73 -0
  54. package/dist-cjs/__generated__/CustomerLoginFormLoginMutation.graphql.js +72 -0
  55. package/dist-cjs/__generated__/CustomerLoginFormQuery.graphql.js +91 -0
  56. package/dist-cjs/__generated__/DownloadRefetchQuery.graphql.js +124 -0
  57. package/dist-cjs/__generated__/Download_order.graphql.js +61 -0
  58. package/dist-cjs/__generated__/FamilyList_node.graphql.js +96 -0
  59. package/dist-cjs/__generated__/Family_node.graphql.js +160 -0
  60. package/dist-cjs/__generated__/FontFamiliesQuery.graphql.js +368 -0
  61. package/dist-cjs/__generated__/FontStyle_fontStyle.graphql.js +32 -0
  62. package/dist-cjs/__generated__/IdentityBox_identity.graphql.js +52 -0
  63. package/dist-cjs/__generated__/License_node.graphql.js +97 -0
  64. package/dist-cjs/__generated__/NewsletterSignupQuery.graphql.js +110 -0
  65. package/dist-cjs/__generated__/NewsletterSignupUpdateCustomerMutation.graphql.js +81 -0
  66. package/dist-cjs/__generated__/NodePasswordFormAccessNodeMutation.graphql.js +72 -0
  67. package/dist-cjs/__generated__/NodePasswordFormIDQuery.graphql.js +93 -0
  68. package/dist-cjs/__generated__/NodePasswordFormSlugQuery.graphql.js +115 -0
  69. package/dist-cjs/__generated__/OrderVariableSelectionReduxRefetchQuery.graphql.js +154 -0
  70. package/dist-cjs/__generated__/OrderVariableSelectionRedux_viewer.graphql.js +75 -0
  71. package/dist-cjs/__generated__/OrderVariableSelection_variables.graphql.js +107 -0
  72. package/dist-cjs/__generated__/PrecartAddToCartMutation.graphql.js +793 -0
  73. package/dist-cjs/__generated__/PrecartClearCartMutation.graphql.js +81 -0
  74. package/dist-cjs/__generated__/PrecartQuery.graphql.js +308 -0
  75. package/dist-cjs/__generated__/Precart_collection.graphql.js +81 -0
  76. package/dist-cjs/__generated__/Precart_license.graphql.js +67 -0
  77. package/dist-cjs/__generated__/Precart_viewer.graphql.js +161 -0
  78. package/dist-cjs/__generated__/PriceBarSectionRefetchQuery.graphql.js +184 -0
  79. package/dist-cjs/__generated__/PriceBarSection_node.graphql.js +121 -0
  80. package/dist-cjs/__generated__/PriceBar_node.graphql.js +60 -0
  81. package/dist-cjs/__generated__/Price_price.graphql.js +40 -0
  82. package/dist-cjs/__generated__/SKUPrice_sku.graphql.js +69 -0
  83. package/dist-cjs/__generated__/SelectButton_sku.graphql.js +54 -0
  84. package/{dist-bundle/chunks/index-o29NNufd.js → dist-cjs/__generated__/ServerConfigProviderQuery.graphql.js} +7 -30
  85. package/dist-cjs/__generated__/ShareCartCreateSnapshotMutation.graphql.js +84 -0
  86. package/dist-cjs/__generated__/SpecimenLinkQuery.graphql.js +120 -0
  87. package/dist-cjs/__generated__/StoreModalBundleButton_bundle.graphql.js +85 -0
  88. package/dist-cjs/__generated__/StoreModalCartQuery.graphql.js +1017 -0
  89. package/dist-cjs/__generated__/StoreModalCheckoutQuery.graphql.js +194 -0
  90. package/dist-cjs/__generated__/StoreModalContainerQuery.graphql.js +228 -0
  91. package/dist-cjs/__generated__/StoreModalDownloadRefetchQuery.graphql.js +102 -0
  92. package/dist-cjs/__generated__/StoreModalDownload_order.graphql.js +40 -0
  93. package/dist-cjs/__generated__/StoreModalFamilyButton_collection.graphql.js +135 -0
  94. package/dist-cjs/__generated__/StoreModalFamily_collection.graphql.js +130 -0
  95. package/dist-cjs/__generated__/StoreModalIndexItem_fontCollection.graphql.js +98 -0
  96. package/dist-cjs/__generated__/StoreModalIndexQuery.graphql.js +263 -0
  97. package/dist-cjs/__generated__/StoreModalOrderVariableSelection_order.graphql.js +98 -0
  98. package/dist-cjs/__generated__/StoreModalOrderVariableSelection_viewer.graphql.js +66 -0
  99. package/dist-cjs/__generated__/StoreModalProductContent_collection.graphql.js +92 -0
  100. package/dist-cjs/__generated__/StoreModalProductLicenseSelection_collection.graphql.js +47 -0
  101. package/dist-cjs/__generated__/StoreModalProductLicense_license.graphql.js +104 -0
  102. package/dist-cjs/__generated__/StoreModalProductQuery.graphql.js +702 -0
  103. package/dist-cjs/__generated__/StoreModalProductRefetchQuery.graphql.js +433 -0
  104. package/dist-cjs/__generated__/StoreModalProductSummaryAddToCartMutation.graphql.js +149 -0
  105. package/dist-cjs/__generated__/StoreModalProductSummaryClearCartMutation.graphql.js +81 -0
  106. package/dist-cjs/__generated__/StoreModalProductSummaryRefetchQuery.graphql.js +281 -0
  107. package/dist-cjs/__generated__/StoreModalProductSummary_viewer.graphql.js +243 -0
  108. package/dist-cjs/__generated__/StoreModalReviewIdentity_identity.graphql.js +52 -0
  109. package/dist-cjs/__generated__/StoreModalStyleButton_fontStyle.graphql.js +113 -0
  110. package/dist-cjs/__generated__/StoreModalUnifiedCheckoutCompleteOrderMutation.graphql.js +302 -0
  111. package/dist-cjs/__generated__/StoreModalUnifiedCheckoutUpdateCustomerMutation.graphql.js +323 -0
  112. package/dist-cjs/__generated__/StoreModalUnifiedCheckoutUpdateOrderMutation.graphql.js +473 -0
  113. package/dist-cjs/__generated__/StoreModalUnifiedCheckout_order.graphql.js +237 -0
  114. package/dist-cjs/__generated__/StoreModalUnifiedCheckout_viewer.graphql.js +117 -0
  115. package/dist-cjs/__generated__/StripeProviderCreateCheckoutSessionMutation.graphql.js +105 -0
  116. package/dist-cjs/__generated__/StripeProvider_viewer.graphql.js +139 -0
  117. package/dist-cjs/__generated__/TestFontsFormUpdateCustomerMutation.graphql.js +770 -0
  118. package/dist-cjs/__generated__/TestFontsForm_Query.graphql.js +126 -0
  119. package/dist-cjs/__generated__/TestModeBannerQuery.graphql.js +87 -0
  120. package/dist-cjs/__generated__/ThemeConfigQuery.graphql.js +87 -0
  121. package/dist-cjs/__generated__/TypeTesterFeaturesButton_fontStyle.graphql.js +32 -0
  122. package/dist-cjs/__generated__/TypeTesterFeatures_fontStyle.graphql.js +36 -0
  123. package/dist-cjs/__generated__/TypeTesterFloatingToolbar_testers.graphql.js +53 -0
  124. package/dist-cjs/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.js +347 -0
  125. package/dist-cjs/__generated__/TypeTesterStandaloneQuery.graphql.js +450 -0
  126. package/dist-cjs/__generated__/TypeTesterStyleSelectData_fontStyle.graphql.js +106 -0
  127. package/dist-cjs/__generated__/TypeTesterStyleSelectData_fontStyleData.graphql.js +88 -0
  128. package/dist-cjs/__generated__/TypeTesterStyleSelectData_viewer.graphql.js +166 -0
  129. package/dist-cjs/__generated__/TypeTesterToolbar_fontStyle.graphql.js +36 -0
  130. package/dist-cjs/__generated__/TypeTesterVariableAxes_fontStyle.graphql.js +61 -0
  131. package/dist-cjs/__generated__/TypeTester_fontStyle.graphql.js +106 -0
  132. package/dist-cjs/__generated__/TypeTester_viewer.graphql.js +40 -0
  133. package/dist-cjs/__generated__/TypeTestersChangedStylesQuery.graphql.js +347 -0
  134. package/dist-cjs/__generated__/TypeTestersIDQuery.graphql.js +637 -0
  135. package/dist-cjs/__generated__/TypeTestersRefetchQuery.graphql.js +554 -0
  136. package/dist-cjs/__generated__/TypeTestersSlugQuery.graphql.js +644 -0
  137. package/dist-cjs/__generated__/TypeTesters_collection.graphql.js +258 -0
  138. package/dist-cjs/__generated__/TypeTesters_viewer.graphql.js +40 -0
  139. package/dist-cjs/__generated__/VariableTableAmounts_option.graphql.js +34 -0
  140. package/dist-cjs/__generated__/VariableTableAmounts_variable.graphql.js +34 -0
  141. package/dist-cjs/__generated__/productState_Query.graphql.js +184 -0
  142. package/dist-cjs/__generated__/productState_bundle.graphql.js +79 -0
  143. package/dist-cjs/__generated__/productState_collection.graphql.js +90 -0
  144. package/dist-cjs/__generated__/productState_collectionBundle.graphql.js +88 -0
  145. package/dist-cjs/__generated__/productState_node.graphql.js +122 -0
  146. package/dist-cjs/__generated__/productState_sku.graphql.js +51 -0
  147. package/dist-cjs/__generated__/useFeaturesData_fontStyle.graphql.js +64 -0
  148. package/dist-cjs/__generated__/useFontStyle_fontStyle.graphql.js +94 -0
  149. package/dist-cjs/__generated__/useTotalStyles_fontCollection.graphql.js +57 -0
  150. package/dist-cjs/__tests__/collectionBundleSelection.test.js +1630 -0
  151. package/dist-cjs/components/AddToCartBanner/index.js +75 -0
  152. package/dist-cjs/components/BuyButton/index.js +124 -0
  153. package/dist-cjs/components/BuyButton/index.server.js +36 -0
  154. package/dist-cjs/components/BuyingOptions/index.js +23 -0
  155. package/dist-cjs/components/Cart/AddressFields.js +162 -0
  156. package/dist-cjs/components/Cart/CartItem/CartItemAdditionalLicenses.js +33 -0
  157. package/dist-cjs/components/Cart/CartItem/CartItemLicense.js +66 -0
  158. package/dist-cjs/components/Cart/CartItem/CartItemProduct.js +36 -0
  159. package/dist-cjs/components/Cart/CartItem/CartItemVariable.js +66 -0
  160. package/dist-cjs/components/Cart/CartItem/VariableTextInput.js +79 -0
  161. package/dist-cjs/components/Cart/CartItem/index.js +95 -0
  162. package/dist-cjs/components/Cart/CartOrder.js +314 -0
  163. package/dist-cjs/components/Cart/CartState.js +93 -0
  164. package/dist-cjs/components/Cart/CartTotals.js +97 -0
  165. package/dist-cjs/components/Cart/Checkout.js +473 -0
  166. package/dist-cjs/components/Cart/CheckoutSteps.js +15 -0
  167. package/dist-cjs/components/Cart/CouponCodeInput.js +90 -0
  168. package/dist-cjs/components/Cart/CustomerFields.js +80 -0
  169. package/dist-cjs/components/Cart/Download.js +62 -0
  170. package/dist-cjs/components/Cart/EmptyCart.js +42 -0
  171. package/dist-cjs/components/Cart/IdentityBox.js +37 -0
  172. package/dist-cjs/components/Cart/ShareCart.js +87 -0
  173. package/dist-cjs/components/Cart/index.js +36 -0
  174. package/dist-cjs/components/Cart/injectRelayEnvironment.js +21 -0
  175. package/dist-cjs/components/Cart/types.js +5 -0
  176. package/dist-cjs/components/Cart/utils.js +8 -0
  177. package/dist-cjs/components/CartButton/index.js +127 -0
  178. package/dist-cjs/components/CartButton/index.server.js +18 -0
  179. package/dist-cjs/components/CharacterViewer/StyleSelect.js +60 -0
  180. package/dist-cjs/components/CharacterViewer/index.js +441 -0
  181. package/dist-cjs/components/CharacterViewer/index.server.js +36 -0
  182. package/dist-cjs/components/Checkbox/index.js +27 -0
  183. package/dist-cjs/components/CollectionAa/index.js +38 -0
  184. package/dist-cjs/components/ComponentsContext.js +12 -0
  185. package/dist-cjs/components/ConfigContext.js +86 -0
  186. package/{dist-bundle/chunks/consent-DMvR5rEh.js → dist-cjs/components/ConsentBanner/consent.js} +12 -4
  187. package/dist-cjs/components/ConsentBanner/index.js +84 -0
  188. package/dist-cjs/components/CookieNotification/index.js +83 -0
  189. package/{dist-bundle/chunks/CorsErrorModal-C1g_-3Re.js → dist-cjs/components/CorsErrorModal.js} +19 -16
  190. package/dist-cjs/components/CouponText/index.js +38 -0
  191. package/dist-cjs/components/CustomerLoginForm/index.js +88 -0
  192. package/dist-cjs/components/Family/FamilyList.js +43 -0
  193. package/dist-cjs/components/Family/index.js +77 -0
  194. package/dist-cjs/components/FontFamilies/index.js +53 -0
  195. package/dist-cjs/components/FontStyle/index.js +37 -0
  196. package/dist-cjs/components/FontdueProvider/FontdueProviderClientComponent.js +74 -0
  197. package/dist-cjs/components/FontdueProvider/index.js +43 -0
  198. package/dist-cjs/components/FontdueProvider/index.server.js +35 -0
  199. package/dist-cjs/components/FontdueProvider/useAuxUIOwner.js +32 -0
  200. package/dist-cjs/components/Icons/Align.js +58 -0
  201. package/dist-cjs/components/Icons/ArrowDownRight.js +19 -0
  202. package/dist-cjs/components/Icons/ArrowLeft.js +22 -0
  203. package/dist-cjs/components/Icons/ArrowRight.js +19 -0
  204. package/dist-cjs/components/Icons/CarrotDown.js +19 -0
  205. package/dist-cjs/components/Icons/CarrotUp.js +19 -0
  206. package/dist-cjs/components/Icons/Cart.js +23 -0
  207. package/dist-cjs/components/Icons/CartNew.js +33 -0
  208. package/dist-cjs/components/Icons/Check.js +19 -0
  209. package/dist-cjs/components/Icons/Checkbox.js +24 -0
  210. package/dist-cjs/components/Icons/CheckboxChecked.js +24 -0
  211. package/dist-cjs/components/Icons/CheckboxCrossed.js +26 -0
  212. package/dist-cjs/components/Icons/CircledCheck.js +21 -0
  213. package/dist-cjs/components/Icons/CircledInfo.js +21 -0
  214. package/dist-cjs/components/Icons/CircledMinus.js +21 -0
  215. package/dist-cjs/components/Icons/ColorPicker.js +19 -0
  216. package/dist-cjs/components/Icons/CreditCard.js +21 -0
  217. package/dist-cjs/components/Icons/DownArrow.js +24 -0
  218. package/dist-cjs/components/Icons/DownloadFonts.js +25 -0
  219. package/dist-cjs/components/Icons/FrowningFace.js +25 -0
  220. package/dist-cjs/components/Icons/License.js +19 -0
  221. package/dist-cjs/components/Icons/Receipt.js +34 -0
  222. package/dist-cjs/components/Icons/User.js +19 -0
  223. package/dist-cjs/components/Icons/X.js +19 -0
  224. package/dist-cjs/components/Icons/index.js +167 -0
  225. package/dist-cjs/components/NewsletterSignup/NewsletterSignupElement.js +15 -0
  226. package/dist-cjs/components/NewsletterSignup/index.js +192 -0
  227. package/dist-cjs/components/NewsletterSignup/index.server.js +18 -0
  228. package/dist-cjs/components/NodePasswordForm/index.js +114 -0
  229. package/dist-cjs/components/OrderVariableSelection/OrderVariableSelectionRedux.js +66 -0
  230. package/dist-cjs/components/OrderVariableSelection/index.js +199 -0
  231. package/dist-cjs/components/Precart/License.js +70 -0
  232. package/dist-cjs/components/Precart/index.js +331 -0
  233. package/dist-cjs/components/Price/index.js +111 -0
  234. package/dist-cjs/components/PriceBar/PriceBarSection.js +61 -0
  235. package/dist-cjs/components/PriceBar/index.js +49 -0
  236. package/dist-cjs/components/Root/index.js +208 -0
  237. package/dist-cjs/components/Root/productState.js +143 -0
  238. package/dist-cjs/components/SKUPrice/index.js +46 -0
  239. package/dist-cjs/components/Select/index.js +36 -0
  240. package/dist-cjs/components/SelectButton/index.js +79 -0
  241. package/dist-cjs/components/ServerConfigProvider/index.js +39 -0
  242. package/dist-cjs/components/SpecimenLink/index.js +37 -0
  243. package/dist-cjs/components/StickyNav/index.js +80 -0
  244. package/dist-cjs/components/StoreModal/StoreModalBundleButton.js +47 -0
  245. package/dist-cjs/components/StoreModal/StoreModalCart.js +79 -0
  246. package/dist-cjs/components/StoreModal/StoreModalCheckout.js +24 -0
  247. package/dist-cjs/components/StoreModal/StoreModalCheckoutContext.js +14 -0
  248. package/dist-cjs/components/StoreModal/StoreModalContainer.js +117 -0
  249. package/dist-cjs/components/StoreModal/StoreModalDownload.js +38 -0
  250. package/dist-cjs/components/StoreModal/StoreModalFamily.js +58 -0
  251. package/dist-cjs/components/StoreModal/StoreModalFamilyButton.js +69 -0
  252. package/dist-cjs/components/StoreModal/StoreModalIndex.js +27 -0
  253. package/dist-cjs/components/StoreModal/StoreModalIndexItem.js +63 -0
  254. package/dist-cjs/components/StoreModal/StoreModalLicenseeIsBillingSelection.js +30 -0
  255. package/dist-cjs/components/StoreModal/StoreModalLoader.js +22 -0
  256. package/dist-cjs/components/StoreModal/StoreModalOrderVariableSelection.js +89 -0
  257. package/dist-cjs/components/StoreModal/StoreModalProduct.js +154 -0
  258. package/dist-cjs/components/StoreModal/StoreModalReviewIdentity.js +18 -0
  259. package/dist-cjs/components/StoreModal/StoreModalRouter.js +28 -0
  260. package/dist-cjs/components/StoreModal/StoreModalStyleButton.js +52 -0
  261. package/dist-cjs/components/StoreModal/index.js +39 -0
  262. package/dist-cjs/components/StoreModal/routes.js +51 -0
  263. package/dist-cjs/components/StoreModal/types.js +5 -0
  264. package/dist-cjs/components/StoreModalProductLicenseSelection/LicenseElement.js +46 -0
  265. package/dist-cjs/components/StoreModalProductLicenseSelection/LicenseVariableElement.js +35 -0
  266. package/dist-cjs/components/StoreModalProductLicenseSelection/LicenseVariableRadioElement.js +47 -0
  267. package/dist-cjs/components/StoreModalProductLicenseSelection/StoreModalProductLicense.js +133 -0
  268. package/dist-cjs/components/StoreModalProductLicenseSelection/index.js +31 -0
  269. package/dist-cjs/components/StoreModalProductSummary/index.js +219 -0
  270. package/dist-cjs/components/StripeLogo.js +17 -0
  271. package/dist-cjs/components/StripeProvider/index.js +172 -0
  272. package/dist-cjs/components/Switch/index.js +7 -0
  273. package/dist-cjs/components/TestFontsForm/TestFontsFormElement.js +15 -0
  274. package/dist-cjs/components/TestFontsForm/index.js +208 -0
  275. package/dist-cjs/components/TestFontsForm/index.server.js +18 -0
  276. package/dist-cjs/components/TestModeBanner/index.js +34 -0
  277. package/dist-cjs/components/TextField/index.js +42 -0
  278. package/dist-cjs/components/ThemeConfig/index.js +41 -0
  279. package/dist-cjs/components/ThemeConfig/index.server.js +17 -0
  280. package/{dist-bundle/chunks/index-DsvF5W13.js → dist-cjs/components/Tracking/index.js} +19 -14
  281. package/dist-cjs/components/TypeTester/TypeTesterAlignButtons.js +34 -0
  282. package/dist-cjs/components/TypeTester/TypeTesterBullet.js +23 -0
  283. package/dist-cjs/components/TypeTester/TypeTesterContent.js +58 -0
  284. package/dist-cjs/components/TypeTester/TypeTesterContext.js +166 -0
  285. package/dist-cjs/components/TypeTester/TypeTesterEditAll.js +36 -0
  286. package/dist-cjs/components/TypeTester/TypeTesterFeatures.js +133 -0
  287. package/dist-cjs/components/TypeTester/TypeTesterFeaturesButton.js +82 -0
  288. package/dist-cjs/components/TypeTester/TypeTesterFitter.js +21 -0
  289. package/dist-cjs/components/TypeTester/TypeTesterFloatingToolbar.js +79 -0
  290. package/dist-cjs/components/TypeTester/TypeTesterInput.js +72 -0
  291. package/dist-cjs/components/TypeTester/TypeTesterSlider.js +76 -0
  292. package/dist-cjs/components/TypeTester/TypeTesterStandalone.js +137 -0
  293. package/dist-cjs/components/TypeTester/TypeTesterStandalone.preload.js +27 -0
  294. package/dist-cjs/components/TypeTester/TypeTesterStandalone.server.js +26 -0
  295. package/dist-cjs/components/TypeTester/TypeTesterStandaloneElement.js +65 -0
  296. package/dist-cjs/components/TypeTester/TypeTesterState.js +133 -0
  297. package/dist-cjs/components/TypeTester/TypeTesterStyleSelect.js +101 -0
  298. package/dist-cjs/components/TypeTester/TypeTesterStyleSelectData.js +102 -0
  299. package/dist-cjs/components/TypeTester/TypeTesterToolbar.js +94 -0
  300. package/dist-cjs/components/TypeTester/TypeTesterVariableAxes.js +65 -0
  301. package/dist-cjs/components/TypeTester/features.js +150 -0
  302. package/dist-cjs/components/TypeTester/index.js +169 -0
  303. package/dist-cjs/components/TypeTester/types.js +14 -0
  304. package/dist-cjs/components/TypeTester/useFeaturesData.js +36 -0
  305. package/dist-cjs/components/TypeTester/useTypeTesterStyler.js +83 -0
  306. package/dist-cjs/components/TypeTesters/TypeTestersElement.js +33 -0
  307. package/dist-cjs/components/TypeTesters/index.js +271 -0
  308. package/dist-cjs/components/TypeTesters/index.server.js +44 -0
  309. package/dist-cjs/components/UrlContext.js +16 -0
  310. package/dist-cjs/components/VariableTableAmounts/index.js +28 -0
  311. package/dist-cjs/components/elements/Button/index.js +21 -0
  312. package/dist-cjs/components/elements/EmptyCart/index.js +30 -0
  313. package/dist-cjs/components/elements/StoreModalCartLayout/index.js +38 -0
  314. package/dist-cjs/components/elements/StoreModalContainer/StoreModalContainerContext.js +11 -0
  315. package/dist-cjs/components/elements/StoreModalContainer/index.js +77 -0
  316. package/dist-cjs/components/elements/StoreModalDownloadLayout/index.js +25 -0
  317. package/dist-cjs/components/elements/StoreModalFamily/index.js +31 -0
  318. package/dist-cjs/components/elements/StoreModalFamilyButton/index.js +45 -0
  319. package/dist-cjs/components/elements/StoreModalIndexItem/index.js +35 -0
  320. package/dist-cjs/components/elements/StoreModalLicenseeIsBillingIdentityElement.js +59 -0
  321. package/dist-cjs/components/elements/StoreModalLoadingScreen/index.js +14 -0
  322. package/dist-cjs/components/elements/StoreModalPageContainer/index.js +22 -0
  323. package/dist-cjs/components/elements/StoreModalStyleButton/index.js +37 -0
  324. package/dist-cjs/components/elements/StoreModalUnifiedCheckout.js +753 -0
  325. package/dist-cjs/components/useConsent.js +26 -0
  326. package/dist-cjs/components/useFont.js +76 -0
  327. package/dist-cjs/components/useFontStyle.js +58 -0
  328. package/dist-cjs/components/useInterval.js +28 -0
  329. package/dist-cjs/components/useTotalStyles.js +26 -0
  330. package/{dist-bundle/index.js → dist-cjs/config.js} +8 -4
  331. package/dist-cjs/corsError.js +89 -0
  332. package/dist-cjs/data/unicodeData.js +1 -0
  333. package/dist-cjs/fontLoader.js +55 -0
  334. package/dist-cjs/global-shim.js +12 -0
  335. package/dist-cjs/hooks/useAutofit.js +114 -0
  336. package/dist-cjs/hooks/useLicenseAndOrderVariables.js +25 -0
  337. package/dist-cjs/hooks/useRefetchOnLicenseChanges.js +60 -0
  338. package/dist-cjs/hooks.js +18 -0
  339. package/dist-cjs/index.js +18 -0
  340. package/dist-cjs/package.json +1 -0
  341. package/dist-cjs/react-ranger.d.js +1 -0
  342. package/dist-cjs/react-ranger.js +301 -0
  343. package/dist-cjs/reducer.js +291 -0
  344. package/dist-cjs/relay/environment.js +148 -0
  345. package/{dist-bundle/TypeTester.preload.js → dist-cjs/relay/loadSerializableQuery.js} +8 -26
  346. package/dist-cjs/relay/useSerializablePreloadedQuery.js +52 -0
  347. package/dist-cjs/retryImport.js +24 -0
  348. package/dist-cjs/scripts/updateUnicodeData.js +49 -0
  349. package/dist-cjs/utils.js +107 -0
  350. package/dist-cjs/vanilla/FontStyle.js +58 -0
  351. package/dist-cjs/vanilla/TruncatedMarkdown.js +28 -0
  352. package/package.json +1 -1
  353. package/dist-bundle/FontdueProvider.js +0 -6
  354. package/dist-bundle/FontdueProvider.js.map +0 -1
  355. package/dist-bundle/TypeTester.js +0 -7
  356. package/dist-bundle/TypeTester.js.map +0 -1
  357. package/dist-bundle/TypeTester.preload.js.map +0 -1
  358. package/dist-bundle/chunks/ComponentsContext-CmkN9J4X.js +0 -20843
  359. package/dist-bundle/chunks/ComponentsContext-CmkN9J4X.js.map +0 -1
  360. package/dist-bundle/chunks/CorsErrorModal-C1g_-3Re.js.map +0 -1
  361. package/dist-bundle/chunks/TypeTesterStandalone-BMWuv8Ca.js +0 -27486
  362. package/dist-bundle/chunks/TypeTesterStandalone-BMWuv8Ca.js.map +0 -1
  363. package/dist-bundle/chunks/consent-DMvR5rEh.js.map +0 -1
  364. package/dist-bundle/chunks/index-BNSbxp7B.js +0 -78
  365. package/dist-bundle/chunks/index-BNSbxp7B.js.map +0 -1
  366. package/dist-bundle/chunks/index-C4ak9qTL.js +0 -423
  367. package/dist-bundle/chunks/index-C4ak9qTL.js.map +0 -1
  368. package/dist-bundle/chunks/index-DsvF5W13.js.map +0 -1
  369. package/dist-bundle/chunks/index-o29NNufd.js.map +0 -1
  370. package/dist-bundle/index.js.map +0 -1
@@ -0,0 +1,753 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = StoreModalUnifiedCheckout;
7
+ var _StoreModalUnifiedCheckoutCompleteOrderMutation2 = _interopRequireDefault(require("../../__generated__/StoreModalUnifiedCheckoutCompleteOrderMutation.graphql"));
8
+ var _StoreModalUnifiedCheckoutUpdateOrderMutation2 = _interopRequireDefault(require("../../__generated__/StoreModalUnifiedCheckoutUpdateOrderMutation.graphql"));
9
+ var _StoreModalUnifiedCheckoutUpdateCustomerMutation2 = _interopRequireDefault(require("../../__generated__/StoreModalUnifiedCheckoutUpdateCustomerMutation.graphql"));
10
+ var _StoreModalUnifiedCheckout_order2 = _interopRequireDefault(require("../../__generated__/StoreModalUnifiedCheckout_order.graphql"));
11
+ var _StoreModalUnifiedCheckout_viewer2 = _interopRequireDefault(require("../../__generated__/StoreModalUnifiedCheckout_viewer.graphql"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactGoogleRecaptcha = _interopRequireDefault(require("react-google-recaptcha"));
14
+ var Sentry = _interopRequireWildcard(require("@sentry/react"));
15
+ var _reactRelay = require("react-relay");
16
+ var _AddressFields = _interopRequireDefault(require("../Cart/AddressFields"));
17
+ var _CustomerFields = _interopRequireDefault(require("../Cart/CustomerFields"));
18
+ var _reactStripeJs = require("@stripe/react-stripe-js");
19
+ var _StoreModalLicenseeIsBillingIdentityElement = _interopRequireDefault(require("./StoreModalLicenseeIsBillingIdentityElement"));
20
+ var _reactRedux = require("react-redux");
21
+ var _StripeLogo = _interopRequireDefault(require("../StripeLogo"));
22
+ var _Icons = require("../Icons");
23
+ var _ConfigContext = _interopRequireDefault(require("../ConfigContext"));
24
+ var _Price = require("../Price");
25
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
26
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
27
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
28
+ /**
29
+ * StoreModalUnifiedCheckout
30
+ *
31
+ * This component handles the checkout flow for orders, collecting customer information,
32
+ * billing/licensee details, and processing payment through Stripe.
33
+ *
34
+ * Key implementation details:
35
+ *
36
+ * 1. Auto-save billing identity (fontdue tax system only):
37
+ * - When using fontdue's tax system (not Stripe Tax), we need the billing address
38
+ * to calculate taxes before showing the final amount
39
+ * - The billing identity is auto-saved (with 500ms debounce) once the Stripe Address
40
+ * Element reports complete (name + address fields)
41
+ * - Email is a separate field (not part of Address Element), so auto-save may trigger
42
+ * before email is filled, which will cause backend validation errors to display
43
+ * - This ensures taxes are calculated and displayed before the user clicks Pay
44
+ * - On page reload, if billing identity already exists, billingAddressComplete starts
45
+ * as true to prevent re-triggering auto-save
46
+ *
47
+ * 2. Billing identity diff tracking:
48
+ * - We track differences between local state and saved backend data (billingIdentityDiff)
49
+ * - This determines isBillingIdentitySaved, which controls when payment can proceed
50
+ * - If the user edits any field after auto-save, it triggers another save cycle
51
+ * - All fields are normalized (null/undefined/empty string treated as equivalent)
52
+ *
53
+ * 3. Pay button validation:
54
+ * - The Pay button is always enabled (as long as EULA is checked) even if billing
55
+ * info isn't fully saved yet
56
+ * - This is intentional: we need to allow the user to click Pay so we can call
57
+ * elements.submit(), which triggers Stripe's validation and shows any validation
58
+ * errors inline in the Stripe UI elements
59
+ * - After Stripe validation passes, we check if billing identity is saved
60
+ * - If not saved, we show an error message above the Pay button asking them to
61
+ * complete billing information (validation errors should now be visible above)
62
+ *
63
+ * 4. Customer info pre-fill:
64
+ * - When customer submits their contact info, if billing name/email are empty,
65
+ * we pre-fill them from customer data as a convenience
66
+ *
67
+ * 5. Country mismatch handling (order snapshots):
68
+ * - When loading a hydrated order (e.g., from quote/snapshot), the order may have
69
+ * a country variable that differs from the user's detected country
70
+ * - In this case, we force licenseeIsBillingIdentity to false and always collect
71
+ * separate licensee information to ensure the licensee country matches the quote
72
+ * - This preserves pricing/availability from the original quote
73
+ *
74
+ * 6. Licensee country syncing:
75
+ * - When licensee country changes, it automatically updates any country-type order
76
+ * variables to maintain consistent pricing based on the selected country
77
+ *
78
+ * 7. Zero-order/coupon flow:
79
+ * - Orders with $0 total (due to coupons) bypass Stripe payment entirely
80
+ * - These use the completeOrder mutation instead of confirmPayment
81
+ *
82
+ * 8. Tax system variations:
83
+ * - Stripe Tax system: Uses embedded checkout, billing handled by Stripe
84
+ * - Fontdue tax system: Collects billing info directly, auto-saves for tax calculation
85
+ */
86
+
87
+ /* const LICENSEE_REQUIRED_FIELDS = ['organization', 'country'] as (keyof Identity)[]; */
88
+
89
+ const IDENTITY_REQUIRED_FIELDS = ['name', 'email', 'country'];
90
+ const defaultIdentity = {
91
+ name: '',
92
+ organization: '',
93
+ email: '',
94
+ phone: '',
95
+ country: '',
96
+ administrativeArea: null,
97
+ street: '',
98
+ locality: '',
99
+ sublocality: '',
100
+ zip: '',
101
+ vatNumber: ''
102
+ };
103
+ function getIdentityFields(object) {
104
+ if (!object) return;
105
+ return {
106
+ name: object.name ?? '',
107
+ organization: object.organization ?? null,
108
+ email: object.email ?? '',
109
+ phone: object.phoneNullable ?? '',
110
+ country: object.country ?? '',
111
+ administrativeArea: object.administrativeArea ?? null,
112
+ street: object.street ?? null,
113
+ locality: object.locality ?? null,
114
+ sublocality: object.sublocality ?? null,
115
+ zip: object.zip ?? null,
116
+ vatNumber: object.vatNumber ?? null
117
+ };
118
+ }
119
+ function EditableSection({
120
+ onSubmit,
121
+ onCancel,
122
+ onEdit,
123
+ disabled,
124
+ disableSubmit,
125
+ cancelable,
126
+ editing,
127
+ children: {
128
+ show,
129
+ edit,
130
+ save
131
+ }
132
+ }) {
133
+ const [submitting, setSubmitting] = (0, _react.useState)(false);
134
+ const handleSubmit = (0, _react.useCallback)(e => {
135
+ e.preventDefault();
136
+ setSubmitting(true);
137
+ onSubmit({
138
+ onSuccess: () => {
139
+ setSubmitting(false);
140
+ },
141
+ onError: () => setSubmitting(false)
142
+ });
143
+ }, [setSubmitting, onSubmit]);
144
+ const handleCancel = (0, _react.useCallback)(() => {
145
+ setSubmitting(false);
146
+ onCancel?.();
147
+ }, [setSubmitting, onCancel]);
148
+ return /*#__PURE__*/_react.default.createElement("div", {
149
+ className: "store-modal__cart__checkout-section",
150
+ "data-editing": editing,
151
+ "data-disabled": disabled
152
+ }, editing ? /*#__PURE__*/_react.default.createElement("form", {
153
+ onSubmit: handleSubmit
154
+ }, edit, /*#__PURE__*/_react.default.createElement("div", {
155
+ className: "store-modal__cart__buttons"
156
+ }, cancelable ? /*#__PURE__*/_react.default.createElement("button", {
157
+ className: "store-modal__cart__button",
158
+ type: "button",
159
+ onClick: handleCancel
160
+ }, "Cancel") : null, /*#__PURE__*/_react.default.createElement("button", {
161
+ className: "store-modal__cart__button",
162
+ type: "submit",
163
+ disabled: submitting || disableSubmit
164
+ }, submitting ? 'Submitting...' : save))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, show, /*#__PURE__*/_react.default.createElement("button", {
165
+ type: "button",
166
+ className: "store-modal__cart__edit-button",
167
+ onClick: onEdit
168
+ }, "Change")));
169
+ }
170
+ function StoreModalUnifiedCheckout({
171
+ order: orderKey,
172
+ viewer: viewerKey,
173
+ onScrollToTop,
174
+ onUpdateOrderVariableSelections
175
+ }) {
176
+ const viewer = (0, _reactRelay.useFragment)((_StoreModalUnifiedCheckout_viewer2.default.hash && _StoreModalUnifiedCheckout_viewer2.default.hash !== "048ce405742611f6684cb5306d28478b" && console.error("The definition of 'StoreModalUnifiedCheckout_viewer' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _StoreModalUnifiedCheckout_viewer2.default), viewerKey);
177
+ const order = (0, _reactRelay.useFragment)((_StoreModalUnifiedCheckout_order2.default.hash && _StoreModalUnifiedCheckout_order2.default.hash !== "7c5503876a562732ebaead9b2ae97180" && console.error("The definition of 'StoreModalUnifiedCheckout_order' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _StoreModalUnifiedCheckout_order2.default), orderKey);
178
+
179
+ // Check if order has a country-type order variable with a different country than detected
180
+ // This is important for order snapshot/quote functionality where a quote was created for
181
+ // a different country than the user's detected country. In this case, we must collect
182
+ // licensee information to ensure the country variable matches the licensee's country.
183
+ // If the countries match (or no country variable exists), allow the normal checkout flow.
184
+ const countryVariableSelection = order.orderVariableSelections?.find(selection => selection.orderVariable.variableType === 'country');
185
+ const hasCountryMismatch = countryVariableSelection && countryVariableSelection.countryCode && countryVariableSelection.countryCode !== viewer.detectedCountry;
186
+
187
+ // When loading a hydrated order (e.g., from order snapshot/quote), initialize the
188
+ // licensee country from the order variable country if no licensee country exists yet.
189
+ // This is useful for the "order snapshot" functionality where we want to preserve
190
+ // the original country selection from the quote.
191
+ const getInitialCountry = () => {
192
+ // If order already has a licensee identity with country, use that
193
+ if (order?.licenseeIdentity?.country) {
194
+ return order.licenseeIdentity.country;
195
+ }
196
+
197
+ // Otherwise, check if there's a country-type order variable selection
198
+ const countryVariableSelection = order?.orderVariableSelections?.find(selection => selection.orderVariable.variableType === 'country');
199
+ if (countryVariableSelection?.countryCode) {
200
+ return countryVariableSelection.countryCode;
201
+ }
202
+
203
+ // Fall back to detected country or viewer country
204
+ return viewer.detectedCountry ?? viewer.country;
205
+ };
206
+ const initialIdentity = {
207
+ ...defaultIdentity,
208
+ country: getInitialCountry()
209
+ };
210
+ const [customer, setCustomer] = (0, _react.useState)(order?.customer ?? {
211
+ name: null,
212
+ email: null,
213
+ newsletterOptIn: false
214
+ });
215
+ const [licenseeIdentity, setLicenseeIdentity] = (0, _react.useState)(getIdentityFields(order?.licenseeIdentity) ?? initialIdentity);
216
+ const [billingIdentity, setBillingIdentity] = (0, _react.useState)(getIdentityFields(order?.billingIdentity) ?? initialIdentity);
217
+
218
+ // Track if the Stripe Address Element reports as complete
219
+ // Start as true if order already has billing identity (page reload case)
220
+ const [billingAddressComplete, setBillingAddressComplete] = (0, _react.useState)(!!order?.billingIdentity);
221
+
222
+ // Track differences between local state and saved backend data
223
+ const billingIdentityDiff = (0, _react.useMemo)(() => {
224
+ const savedIdentity = order?.billingIdentity;
225
+ if (!savedIdentity) return null;
226
+
227
+ // Helper to normalize values (treat null, undefined, and empty string as equivalent)
228
+ const normalize = val => val || '';
229
+ const differences = {};
230
+ const checkField = (field, localValue, savedValue) => {
231
+ const normalizedLocal = normalize(localValue);
232
+ const normalizedSaved = normalize(savedValue);
233
+ if (normalizedLocal !== normalizedSaved) {
234
+ differences[field] = {
235
+ local: normalizedLocal,
236
+ saved: normalizedSaved
237
+ };
238
+ }
239
+ };
240
+ checkField('name', billingIdentity.name, savedIdentity.name);
241
+ checkField('email', billingIdentity.email, savedIdentity.email);
242
+ checkField('phone', billingIdentity.phone, savedIdentity.phoneNullable);
243
+ checkField('country', billingIdentity.country, savedIdentity.country);
244
+ checkField('street', billingIdentity.street, savedIdentity.street);
245
+ checkField('locality', billingIdentity.locality, savedIdentity.locality);
246
+ checkField('sublocality', billingIdentity.sublocality, savedIdentity.sublocality);
247
+ checkField('administrativeArea', billingIdentity.administrativeArea, savedIdentity.administrativeArea);
248
+ checkField('zip', billingIdentity.zip, savedIdentity.zip);
249
+ checkField('organization', billingIdentity.organization, savedIdentity.organization);
250
+ checkField('vatNumber', billingIdentity.vatNumber, savedIdentity.vatNumber);
251
+ return Object.keys(differences).length > 0 ? differences : null;
252
+ }, [billingIdentity, order?.billingIdentity]);
253
+ const isBillingIdentitySaved = billingIdentityDiff === null && !!order?.billingIdentity;
254
+ const handleCustomerChange = (0, _react.useCallback)(value => setCustomer(currentValue => ({
255
+ ...currentValue,
256
+ ...value
257
+ })), [setCustomer]);
258
+ const handleLicenseeChange = (0, _react.useCallback)(value => {
259
+ setErrorsObject(currentValue => {
260
+ if (currentValue?.licenseeIdentity) {
261
+ const keys = Object.keys(value);
262
+ return {
263
+ ...currentValue,
264
+ licenseeIdentity: {
265
+ ...currentValue.licenseeIdentity,
266
+ ...keys.reduce((acc, field) => {
267
+ acc[field] = null;
268
+ return acc;
269
+ }, {})
270
+ }
271
+ };
272
+ }
273
+ return currentValue;
274
+ });
275
+ setLicenseeIdentity(currentValue => ({
276
+ ...currentValue,
277
+ ...value
278
+ }));
279
+ }, [setLicenseeIdentity]);
280
+ const environment = (0, _reactRelay.useRelayEnvironment)();
281
+ const [error, setError] = (0, _react.useState)(null);
282
+ const [errorsObject, setErrorsObject] = (0, _react.useState)(null);
283
+ const [customerErrorsObject, setCustomerErrorsObject] = (0, _react.useState)(null);
284
+ const [_submitting, setSubmitting] = (0, _react.useState)(false);
285
+ /* const [licenseeRequiredFields, setLicenseeRequiredFields] = useState<
286
+ * (keyof Identity)[]
287
+ * >(LICENSEE_REQUIRED_FIELDS); */
288
+ const [acceptedEULA, setAcceptedEULA] = (0, _react.useState)(false);
289
+ const {
290
+ form: config
291
+ } = (0, _react.useContext)(_ConfigContext.default);
292
+
293
+ // reCAPTCHA state
294
+ const [recaptchaToken, setRecaptchaToken] = (0, _react.useState)(null);
295
+ const [pendingCustomerSubmit, setPendingCustomerSubmit] = (0, _react.useState)(null);
296
+ const recaptchaRef = (0, _react.useRef)(null);
297
+ const recaptchaEnabled = viewer.settings?.recaptchaEnabled ?? false;
298
+ const recaptchaSiteKey = viewer.settings?.recaptchaSiteKey;
299
+ const onCompleted = (res, errors, onSuccess, onError) => {
300
+ if (errors && errors.length > 0) {
301
+ setError(errors[0].message);
302
+ setSubmitting(false);
303
+ onError?.();
304
+ } else if ('updateCustomer' in res && res.updateCustomer?.errors && (res.updateCustomer.errors.name || res.updateCustomer.errors.email || res.updateCustomer.errors.newsletterOptIn)) {
305
+ setSubmitting(false);
306
+ setCustomerErrorsObject(res.updateCustomer.errors);
307
+ onError?.();
308
+ } else if ('updateOrder' in res && res.updateOrder?.errors) {
309
+ setSubmitting(false);
310
+ setErrorsObject(res.updateOrder.errors);
311
+ onError?.();
312
+ } else {
313
+ onSuccess?.();
314
+ setSubmitting(false);
315
+ setError(null);
316
+ setCustomerErrorsObject(null);
317
+ setErrorsObject(null);
318
+ }
319
+ };
320
+ const onError = error => {
321
+ setError(error.message);
322
+ setSubmitting(false);
323
+ };
324
+ const updateCustomer = (0, _react.useCallback)((variables, onSuccess, onErrorCallback) => {
325
+ (0, _reactRelay.commitMutation)(environment, {
326
+ mutation: (_StoreModalUnifiedCheckoutUpdateCustomerMutation2.default.hash && _StoreModalUnifiedCheckoutUpdateCustomerMutation2.default.hash !== "a41e423a93ba20f15ebbe826dd802514" && console.error("The definition of 'StoreModalUnifiedCheckoutUpdateCustomerMutation' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _StoreModalUnifiedCheckoutUpdateCustomerMutation2.default),
327
+ variables,
328
+ onCompleted: (res, errors) => onCompleted(res, errors, onSuccess, onErrorCallback),
329
+ onError
330
+ });
331
+ }, [environment]);
332
+ const updateOrder = (0, _react.useCallback)((variables, onSuccess, onError) => {
333
+ (0, _reactRelay.commitMutation)(environment, {
334
+ mutation: (_StoreModalUnifiedCheckoutUpdateOrderMutation2.default.hash && _StoreModalUnifiedCheckoutUpdateOrderMutation2.default.hash !== "189cd7ac579c6898dca2f4b6e07861d1" && console.error("The definition of 'StoreModalUnifiedCheckoutUpdateOrderMutation' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _StoreModalUnifiedCheckoutUpdateOrderMutation2.default),
335
+ variables,
336
+ onCompleted: (res, errors) => onCompleted(res, errors, onSuccess, onError),
337
+ onError
338
+ });
339
+ }, [environment]);
340
+
341
+ // Update country order variable when licensee address country changes
342
+ (0, _react.useEffect)(() => {
343
+ if (!licenseeIdentity.country || !order.orderVariableSelections) return;
344
+
345
+ // Find country-type order variable
346
+ const countryVariableSelection = order.orderVariableSelections.find(selection => selection.orderVariable.variableType === 'country');
347
+ if (!countryVariableSelection) return;
348
+
349
+ // Only update if the country has actually changed
350
+ if (countryVariableSelection.countryCode === licenseeIdentity.country) return;
351
+
352
+ // Build updated selections array
353
+ const updatedSelections = order.orderVariableSelections.map(selection => ({
354
+ orderVariableId: selection.orderVariable.id,
355
+ orderVariableOptionId: selection.orderVariableOption?.id ?? null,
356
+ countryCode: selection.orderVariable.variableType === 'country' ? licenseeIdentity.country : selection.countryCode ?? null
357
+ }));
358
+
359
+ // Update the order with new country via callback
360
+ onUpdateOrderVariableSelections(updatedSelections);
361
+ }, [licenseeIdentity.country, order.orderVariableSelections, onUpdateOrderVariableSelections]);
362
+
363
+ // When a country mismatch exists, force licenseeIsBillingIdentity to false
364
+ // This ensures we always collect licensee information for orders with mismatched country
365
+ (0, _react.useEffect)(() => {
366
+ if (hasCountryMismatch && (order.licenseeIsBillingIdentity ?? true)) {
367
+ // Update order to force separate licensee collection
368
+ updateOrder({
369
+ input: {
370
+ licenseeIsBillingIdentity: false
371
+ }
372
+ });
373
+ }
374
+ }, [hasCountryMismatch, order.licenseeIsBillingIdentity, updateOrder]);
375
+
376
+ // Auto-save billing identity when complete (for fontdue tax system only)
377
+ // This ensures taxes are calculated before showing the payment element
378
+ (0, _react.useEffect)(() => {
379
+ const taxSystem = viewer.settings.taxSystem;
380
+ const canUseEmbeddedCheckout = taxSystem === 'stripe';
381
+
382
+ // Only for fontdue tax system (not Stripe Tax/embedded checkout)
383
+ if (!canUseEmbeddedCheckout && order.customer && !isBillingIdentitySaved) {
384
+ // Check if the Stripe Address Element reports as complete AND email is filled
385
+ const isComplete = billingAddressComplete;
386
+ if (isComplete) {
387
+ // Debounce the update to avoid sending on every character change
388
+ const timeoutId = setTimeout(() => {
389
+ // Save billing identity to backend for tax calculation
390
+ updateOrder({
391
+ input: {
392
+ billingIdentity
393
+ }
394
+ });
395
+ }, 500); // 500ms debounce
396
+
397
+ return () => clearTimeout(timeoutId);
398
+ }
399
+ }
400
+ }, [billingIdentity, isBillingIdentitySaved, billingAddressComplete, order.customer, updateOrder, viewer.settings]);
401
+ let initialEditingState = null;
402
+ // set initial state depending on if checkout is already in progress
403
+ if (!order.customer) initialEditingState = 'customer';
404
+ const [editing, setEditing] = (0, _react.useState)(initialEditingState);
405
+
406
+ // Submit customer data with optional reCAPTCHA token
407
+ const submitCustomer = (0, _react.useCallback)((token, callbacks) => {
408
+ setPendingCustomerSubmit(null);
409
+ if (!billingIdentity.name && !billingIdentity.email) {
410
+ setBillingIdentity({
411
+ ...billingIdentity,
412
+ name: customer.name ?? '',
413
+ email: customer.email ?? ''
414
+ });
415
+ }
416
+ updateCustomer({
417
+ input: {
418
+ ...customer,
419
+ recaptchaToken: token ?? undefined
420
+ }
421
+ }, () => {
422
+ callbacks.onSuccess();
423
+ setEditing(null);
424
+ // Reset reCAPTCHA after successful submission
425
+ recaptchaRef.current?.reset();
426
+ setRecaptchaToken(null);
427
+ }, () => {
428
+ callbacks.onError();
429
+ // Reset reCAPTCHA on error so user can retry
430
+ recaptchaRef.current?.reset();
431
+ setRecaptchaToken(null);
432
+ });
433
+ }, [customer, billingIdentity, updateCustomer]);
434
+ const handleRecaptchaChange = (0, _react.useCallback)(token => {
435
+ setRecaptchaToken(token);
436
+ // If we were waiting for a token to submit, do it now
437
+ if (token && pendingCustomerSubmit) {
438
+ submitCustomer(token, pendingCustomerSubmit.callbacks);
439
+ }
440
+ }, [pendingCustomerSubmit, submitCustomer]);
441
+ const handleRecaptchaExpired = (0, _react.useCallback)(() => {
442
+ setRecaptchaToken(null);
443
+ }, []);
444
+ const handleCustomerSubmit = callbacks => {
445
+ // If reCAPTCHA is enabled but no token, execute it and wait for callback
446
+ if (recaptchaEnabled && recaptchaSiteKey && !recaptchaToken) {
447
+ setPendingCustomerSubmit({
448
+ callbacks
449
+ });
450
+ recaptchaRef.current?.execute();
451
+ return;
452
+ }
453
+ submitCustomer(recaptchaToken, callbacks);
454
+ };
455
+ const handleLicenseeIsBillingIdentityChange = (0, _react.useCallback)(value => {
456
+ updateOrder({
457
+ input: {
458
+ licenseeIsBillingIdentity: value
459
+ }
460
+ });
461
+ }, [updateOrder]);
462
+ const handleBillingChange = (0, _react.useCallback)((value, complete) => {
463
+ setError(null);
464
+ setErrorsObject(currentValue => {
465
+ if (currentValue?.billingIdentity) {
466
+ const keys = Object.keys(value);
467
+ return {
468
+ ...currentValue,
469
+ billingIdentity: {
470
+ ...currentValue.billingIdentity,
471
+ ...keys.reduce((acc, field) => {
472
+ acc[field] = null;
473
+ return acc;
474
+ }, {})
475
+ }
476
+ };
477
+ }
478
+ return currentValue;
479
+ });
480
+ setBillingIdentity(currentValue => {
481
+ const newValue = {
482
+ ...currentValue,
483
+ ...value
484
+ };
485
+ if (typeof complete === 'boolean') {
486
+ setBillingAddressComplete(complete);
487
+ }
488
+ return newValue;
489
+ });
490
+ }, [order?.billingIdentity]);
491
+ const stripe = (0, _reactStripeJs.useStripe)();
492
+ const elements = (0, _reactStripeJs.useElements)();
493
+ const [completing, setCompleting] = (0, _react.useState)(false);
494
+ const [checkingOut, setCheckingOut] = (0, _react.useState)(false);
495
+ const dispatch = (0, _reactRedux.useDispatch)();
496
+
497
+ // When a country mismatch exists, always show licensee section (force collection)
498
+ // Otherwise, only show when user has selected "Your client" option
499
+ const showLicenseeSection = order.customer && (hasCountryMismatch || !(order.licenseeIsBillingIdentity ?? false));
500
+ const handleCheckout = (0, _react.useCallback)(async () => {
501
+ // Validate Stripe elements first
502
+ if (elements) {
503
+ const result = await elements.submit();
504
+ if (result.error) {
505
+ // Stripe will show validation errors in the UI
506
+ return;
507
+ }
508
+ }
509
+
510
+ // If licensee section is shown, save licensee data before navigating to checkout
511
+ if (showLicenseeSection) {
512
+ setCheckingOut(true);
513
+ updateOrder({
514
+ input: {
515
+ licenseeIdentity
516
+ }
517
+ }, () => {
518
+ setCheckingOut(false);
519
+ dispatch({
520
+ type: 'STORE_MODAL_NAVIGATE',
521
+ route: 'checkout'
522
+ });
523
+ }, () => {
524
+ setCheckingOut(false);
525
+ });
526
+ } else {
527
+ dispatch({
528
+ type: 'STORE_MODAL_NAVIGATE',
529
+ route: 'checkout'
530
+ });
531
+ }
532
+ }, [showLicenseeSection, licenseeIdentity, updateOrder, dispatch, elements]);
533
+ const handleComplete = async e => {
534
+ e.preventDefault();
535
+ if (!order) return;
536
+ if (!billingIdentity) {
537
+ console.error('No billing identity, required for payment');
538
+ return;
539
+ }
540
+
541
+ // Validate Stripe elements first
542
+ if (elements) {
543
+ const result = await elements.submit();
544
+ if (result.error) {
545
+ // Stripe will show validation errors in the UI
546
+ return;
547
+ }
548
+ }
549
+
550
+ // If billing identity is not saved yet, don't proceed with payment
551
+ // The validation above will show errors for incomplete fields
552
+ if (!isBillingIdentitySaved) {
553
+ setError('Please complete all billing information above');
554
+ return;
555
+ }
556
+ setCompleting(true);
557
+ setError(null);
558
+ const processPayment = () => {
559
+ if (order.canCompleteWithCoupon) {
560
+ (0, _reactRelay.commitMutation)(environment, {
561
+ mutation: (_StoreModalUnifiedCheckoutCompleteOrderMutation2.default.hash && _StoreModalUnifiedCheckoutCompleteOrderMutation2.default.hash !== "ea880419670573334e55529f454f8026" && console.error("The definition of 'StoreModalUnifiedCheckoutCompleteOrderMutation' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _StoreModalUnifiedCheckoutCompleteOrderMutation2.default),
562
+ variables: {},
563
+ onCompleted: (_response, errors) => {
564
+ if (errors && errors.length > 0) {
565
+ setCompleting(false);
566
+ setError(errors[0].message);
567
+ return;
568
+ }
569
+ window.location.href = order.completeUrl;
570
+ }
571
+ });
572
+ return;
573
+ }
574
+ if (!stripe || !elements) return;
575
+ stripe?.confirmPayment({
576
+ elements,
577
+ confirmParams: {
578
+ return_url: order.completeUrl,
579
+ payment_method_data: {
580
+ billing_details: {
581
+ email: billingIdentity.email,
582
+ name: billingIdentity.name,
583
+ phone: billingIdentity.phone,
584
+ address: {
585
+ line1: billingIdentity.street?.split(/\n/)[0],
586
+ line2: billingIdentity.street?.split(/\n/)[1] ?? '',
587
+ city: billingIdentity.locality ?? '',
588
+ state: billingIdentity.administrativeArea ?? '',
589
+ country: billingIdentity.country,
590
+ postal_code: billingIdentity.zip ?? ''
591
+ }
592
+ }
593
+ }
594
+ }
595
+ }).then(result => {
596
+ if ('error' in result) {
597
+ setCompleting(false);
598
+ setError(result.error.message ?? 'Payment failed. Please try another payment method.');
599
+ }
600
+ }).catch(error => {
601
+ console.log(error);
602
+ setCompleting(false);
603
+ });
604
+ };
605
+
606
+ // Save both licensee (if shown) and billing info before processing payment
607
+ const orderInput = {
608
+ billingIdentity
609
+ };
610
+ if (showLicenseeSection) {
611
+ orderInput.licenseeIdentity = licenseeIdentity;
612
+ }
613
+ updateOrder({
614
+ input: orderInput
615
+ }, () => {
616
+ processPayment();
617
+ }, () => {
618
+ setCompleting(false);
619
+ });
620
+ };
621
+ const taxSystem = viewer.settings.taxSystem;
622
+ const canUseEmbeddedCheckout = taxSystem === 'stripe';
623
+ const showBillingSection = !canUseEmbeddedCheckout && order.customer;
624
+
625
+ // billing info will be handled by embedded checkout
626
+ const showCheckoutButton = canUseEmbeddedCheckout && order.customer;
627
+ const zeroOrder = order.canCompleteWithCoupon;
628
+ const showPaymentSection = !canUseEmbeddedCheckout && order.customer;
629
+ const billingComplete = IDENTITY_REQUIRED_FIELDS.every(key => Boolean(billingIdentity[key]));
630
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(EditableSection, {
631
+ editing: editing === 'customer',
632
+ disabled: false,
633
+ onEdit: () => setEditing('customer'),
634
+ onSubmit: handleCustomerSubmit,
635
+ disableSubmit: false
636
+ }, {
637
+ save: canUseEmbeddedCheckout ? order.customer ? 'Save' : 'Continue' : 'Checkout',
638
+ show: /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h3", {
639
+ className: "store-modal__cart__checkout-section-title"
640
+ }, "Contact information"), order.customer ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, order.customer.name, /*#__PURE__*/_react.default.createElement("br", null), order.customer.email) : 'Loading...'),
641
+ edit: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("h3", {
642
+ className: "store-modal__cart__checkout-section-title"
643
+ }, "Contact information"), /*#__PURE__*/_react.default.createElement(_CustomerFields.default, {
644
+ value: customer,
645
+ onChange: handleCustomerChange,
646
+ optInLabel: viewer.settings?.newsletterOptInLabel,
647
+ errors: customerErrorsObject
648
+ }), recaptchaEnabled && recaptchaSiteKey && /*#__PURE__*/_react.default.createElement(_reactGoogleRecaptcha.default, {
649
+ ref: recaptchaRef,
650
+ sitekey: recaptchaSiteKey,
651
+ size: "invisible",
652
+ onChange: handleRecaptchaChange,
653
+ onExpired: handleRecaptchaExpired
654
+ }))
655
+ }), order.customer && !hasCountryMismatch ? /*#__PURE__*/_react.default.createElement(_StoreModalLicenseeIsBillingIdentityElement.default, {
656
+ disabled: false,
657
+ value: order.licenseeIsBillingIdentity ?? false,
658
+ onChange: handleLicenseeIsBillingIdentityChange
659
+ }, {
660
+ label: /*#__PURE__*/_react.default.createElement("div", {
661
+ dangerouslySetInnerHTML: {
662
+ __html: viewer.settings?.storeModalSelectLicenseeLabel ?? ''
663
+ }
664
+ })
665
+ }) : null, showLicenseeSection ? /*#__PURE__*/_react.default.createElement("div", {
666
+ className: "store-modal__cart__checkout-section"
667
+ }, /*#__PURE__*/_react.default.createElement("h3", {
668
+ className: "store-modal__cart__checkout-section-title"
669
+ }, hasCountryMismatch ? 'Licensee information' : 'Licensee information (your client)'), /*#__PURE__*/_react.default.createElement("div", {
670
+ className: "store-modal__cart__identity-fields"
671
+ }, /*#__PURE__*/_react.default.createElement(_AddressFields.default, {
672
+ viewer: viewer,
673
+ value: licenseeIdentity,
674
+ onChange: handleLicenseeChange,
675
+ errorsObject: errorsObject?.licenseeIdentity,
676
+ identityType: "licensee"
677
+ }))) : null, showBillingSection ? /*#__PURE__*/_react.default.createElement("div", {
678
+ className: "store-modal__cart__checkout-section",
679
+ "data-disabled": !order.customer
680
+ }, /*#__PURE__*/_react.default.createElement("h3", {
681
+ className: "store-modal__cart__checkout-section-title"
682
+ }, "Billing information"), /*#__PURE__*/_react.default.createElement("div", {
683
+ className: "store-modal__cart__identity-fields"
684
+ }, /*#__PURE__*/_react.default.createElement(_AddressFields.default, {
685
+ viewer: viewer,
686
+ value: billingIdentity,
687
+ onChange: handleBillingChange,
688
+ errorsObject: errorsObject?.billingIdentity,
689
+ identityType: "billing"
690
+ }))) : null, showCheckoutButton ? /*#__PURE__*/_react.default.createElement("div", {
691
+ className: "store-modal__cart__checkout-section",
692
+ "data-disabled": false
693
+ }, /*#__PURE__*/_react.default.createElement("button", {
694
+ type: "button",
695
+ className: "store-modal__cart__button",
696
+ onClick: handleCheckout,
697
+ disabled: checkingOut
698
+ }, checkingOut ? 'Submitting...' : 'Checkout')) : null, showPaymentSection ? /*#__PURE__*/_react.default.createElement("div", {
699
+ className: "store-modal__cart__checkout-section",
700
+ "data-disabled": false
701
+ }, /*#__PURE__*/_react.default.createElement("form", {
702
+ onSubmit: handleComplete
703
+ }, !zeroOrder && order.stripePaymentIntent?.clientSecret && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("h3", {
704
+ className: "store-modal__cart__checkout-section-title"
705
+ }, "Payment information", /*#__PURE__*/_react.default.createElement("span", {
706
+ className: "store-modal__cart__checkout-section-subtitle"
707
+ }, /*#__PURE__*/_react.default.createElement("a", {
708
+ href: "https://stripe.com",
709
+ target: "_blank",
710
+ rel: "noopener"
711
+ }, "Powered by ", /*#__PURE__*/_react.default.createElement(_StripeLogo.default, null)))), /*#__PURE__*/_react.default.createElement("div", {
712
+ className: "store-modal__cart__payment"
713
+ }, /*#__PURE__*/_react.default.createElement(Sentry.ErrorBoundary, {
714
+ fallback: /*#__PURE__*/_react.default.createElement("div", null, "Something went wrong")
715
+ }, /*#__PURE__*/_react.default.createElement(_reactStripeJs.PaymentElement, {
716
+ options: {
717
+ layout: {
718
+ type: 'tabs',
719
+ defaultCollapsed: false,
720
+ radios: true,
721
+ spacedAccordionItems: true
722
+ }
723
+ }
724
+ })))), error && /*#__PURE__*/_react.default.createElement("div", {
725
+ className: "store-modal__cart__error"
726
+ }, error), /*#__PURE__*/_react.default.createElement("div", {
727
+ className: "store-modal__cart__agreement"
728
+ }, /*#__PURE__*/_react.default.createElement("div", {
729
+ className: "checkbox"
730
+ }, /*#__PURE__*/_react.default.createElement("input", {
731
+ type: "checkbox",
732
+ id: "eula-agreement",
733
+ checked: acceptedEULA,
734
+ onChange: event => setAcceptedEULA(event.target.checked)
735
+ }), /*#__PURE__*/_react.default.createElement("div", {
736
+ className: "checkbox__icon"
737
+ }, config.checkboxStyle === 'check' ? /*#__PURE__*/_react.default.createElement(_Icons.Check, null) : /*#__PURE__*/_react.default.createElement(_Icons.X, null))), /*#__PURE__*/_react.default.createElement("label", {
738
+ htmlFor: "eula-agreement"
739
+ }, /*#__PURE__*/_react.default.createElement("div", {
740
+ dangerouslySetInnerHTML: {
741
+ __html: viewer.settings?.eulaAgreementLabel ?? ''
742
+ }
743
+ }))), /*#__PURE__*/_react.default.createElement("button", {
744
+ type: "submit",
745
+ className: "store-modal__cart__button",
746
+ disabled: completing || !acceptedEULA
747
+ }, completing ? 'Submitting...' : zeroOrder ? 'Complete order' : /*#__PURE__*/_react.default.createElement("span", null, "Pay", ' ', order.stripePaymentIntent?.amount && order.stripePaymentIntent?.currency ? /*#__PURE__*/_react.default.createElement(_Price.Price, {
748
+ price: {
749
+ amount: order.stripePaymentIntent.amount,
750
+ currency: order.stripePaymentIntent.currency
751
+ }
752
+ }) : null)))) : null);
753
+ }