fontdue-js 2.28.0 → 3.0.0-alpha10

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 (499) hide show
  1. package/.babelrc.cjs +72 -0
  2. package/README.md +639 -93
  3. package/dist/__generated__/AddToCartBannerQuery.graphql.js +1 -8
  4. package/dist/__generated__/AddToCartBanner_item.graphql.js +1 -8
  5. package/dist/__generated__/AddToCartBanner_order.graphql.js +1 -8
  6. package/dist/__generated__/AddressFieldsRefetchQuery.graphql.js +1 -8
  7. package/dist/__generated__/AddressFields_viewer.graphql.js +3 -11
  8. package/dist/__generated__/BuyButtonIDQuery.graphql.js +1 -8
  9. package/dist/__generated__/BuyButtonSlugQuery.graphql.js +1 -8
  10. package/dist/__generated__/BuyButton_collection.graphql.js +1 -8
  11. package/dist/__generated__/CartButtonQuery.graphql.js +1 -8
  12. package/dist/__generated__/CartButton_order.graphql.js +1 -8
  13. package/dist/__generated__/CartItemAdditionalLicenses_licenses.graphql.js +1 -8
  14. package/dist/__generated__/CartItemAdditionalLicenses_orderItem.graphql.js +1 -8
  15. package/dist/__generated__/CartItemLicense_selection.graphql.js +1 -8
  16. package/dist/__generated__/CartItemProduct_product.graphql.js +1 -8
  17. package/dist/__generated__/CartItemVariable_selection.graphql.js +1 -8
  18. package/dist/__generated__/CartItemVariable_variable.graphql.js +1 -8
  19. package/dist/__generated__/CartItem_node.graphql.js +1 -8
  20. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.js +1 -8
  21. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.js +1 -8
  22. package/dist/__generated__/CartOrderUpdateMutation.graphql.js +1 -8
  23. package/dist/__generated__/CartOrder_UpdateErrors.graphql.js +1 -8
  24. package/dist/__generated__/CartOrder_order.graphql.js +1 -8
  25. package/dist/__generated__/CartOrder_viewer.graphql.js +1 -8
  26. package/dist/__generated__/CartQuery.graphql.js +1 -8
  27. package/dist/__generated__/CartStateRemoveDiscountMutation.graphql.js +1 -8
  28. package/dist/__generated__/CartStateUpdateMutation.graphql.js +1 -8
  29. package/dist/__generated__/CartState_order.graphql.js +1 -8
  30. package/dist/__generated__/CartTotals_order.graphql.js +1 -8
  31. package/dist/__generated__/CharacterViewerIDQuery.graphql.js +1 -8
  32. package/dist/__generated__/CharacterViewerSlugQuery.graphql.js +1 -8
  33. package/dist/__generated__/CharacterViewerStyleRefetchQuery.graphql.js +1 -8
  34. package/dist/__generated__/CharacterViewer_collection.graphql.js +1 -8
  35. package/dist/__generated__/CharacterViewer_family.graphql.js +1 -8
  36. package/dist/__generated__/CharacterViewer_style.graphql.js +3 -11
  37. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.js +1 -8
  38. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.js +1 -8
  39. package/dist/__generated__/Checkout_UpdateOrderErrors.graphql.js +1 -8
  40. package/dist/__generated__/Checkout_identity.graphql.js +1 -8
  41. package/dist/__generated__/Checkout_order.graphql.js +1 -8
  42. package/dist/__generated__/Checkout_viewer.graphql.js +1 -8
  43. package/dist/__generated__/CollectionAa_Query.graphql.js +1 -8
  44. package/dist/__generated__/CollectionAa_product.graphql.js +1 -8
  45. package/dist/__generated__/CouponCodeInputApplyCouponMutation.graphql.js +1 -8
  46. package/dist/__generated__/CouponText_coupon.graphql.js +1 -8
  47. package/dist/__generated__/CustomerLoginFormLoginMutation.graphql.js +1 -8
  48. package/dist/__generated__/CustomerLoginFormQuery.graphql.js +1 -8
  49. package/dist/__generated__/DownloadRefetchQuery.graphql.js +1 -8
  50. package/dist/__generated__/Download_order.graphql.js +1 -8
  51. package/dist/__generated__/FamilyList_node.graphql.js +1 -8
  52. package/dist/__generated__/Family_node.graphql.js +1 -8
  53. package/dist/__generated__/FontFamiliesQuery.graphql.js +1 -8
  54. package/dist/__generated__/FontStyle_fontStyle.graphql.js +1 -8
  55. package/dist/__generated__/FontdueAdminToolbarStaffQuery.graphql.d.ts +20 -0
  56. package/dist/__generated__/{TestModeBannerQuery.graphql.js → FontdueAdminToolbarStaffQuery.graphql.js} +11 -18
  57. package/dist/__generated__/FontdueAdminToolbarTokenMutation.graphql.d.ts +18 -0
  58. package/dist/__generated__/FontdueAdminToolbarTokenMutation.graphql.js +56 -0
  59. package/dist/__generated__/FontdueProviderQuery.graphql.d.ts +19 -0
  60. package/dist/__generated__/FontdueProviderQuery.graphql.js +140 -0
  61. package/dist/__generated__/IdentityBox_identity.graphql.js +1 -8
  62. package/dist/__generated__/License_node.graphql.js +1 -8
  63. package/dist/__generated__/NewsletterSignupQuery.graphql.js +1 -8
  64. package/dist/__generated__/NewsletterSignupUpdateCustomerMutation.graphql.js +1 -8
  65. package/dist/__generated__/NodePasswordFormAccessNodeMutation.graphql.js +1 -8
  66. package/dist/__generated__/NodePasswordFormIDQuery.graphql.js +1 -8
  67. package/dist/__generated__/NodePasswordFormSlugQuery.graphql.js +1 -8
  68. package/dist/__generated__/OrderVariableSelectionReduxRefetchQuery.graphql.js +1 -8
  69. package/dist/__generated__/OrderVariableSelectionRedux_viewer.graphql.js +3 -11
  70. package/dist/__generated__/OrderVariableSelection_variables.graphql.js +1 -8
  71. package/dist/__generated__/PrecartAddToCartMutation.graphql.js +1 -8
  72. package/dist/__generated__/PrecartClearCartMutation.graphql.js +1 -8
  73. package/dist/__generated__/PrecartQuery.graphql.js +1 -8
  74. package/dist/__generated__/Precart_collection.graphql.js +1 -8
  75. package/dist/__generated__/Precart_license.graphql.js +1 -8
  76. package/dist/__generated__/Precart_viewer.graphql.js +1 -8
  77. package/dist/__generated__/PriceBarSectionRefetchQuery.graphql.js +1 -8
  78. package/dist/__generated__/PriceBarSection_node.graphql.js +3 -11
  79. package/dist/__generated__/PriceBar_node.graphql.js +1 -8
  80. package/dist/__generated__/Price_price.graphql.js +1 -8
  81. package/dist/__generated__/SKUPrice_sku.graphql.js +1 -8
  82. package/dist/__generated__/SelectButton_sku.graphql.js +1 -8
  83. package/dist/__generated__/ServerConfigProvider_viewer.graphql.d.ts +23 -0
  84. package/dist/__generated__/ServerConfigProvider_viewer.graphql.js +57 -0
  85. package/dist/__generated__/ShareCartCreateSnapshotMutation.graphql.js +1 -8
  86. package/dist/__generated__/SpecimenLinkQuery.graphql.js +1 -8
  87. package/dist/__generated__/StoreModalBundleButton_bundle.graphql.js +1 -8
  88. package/dist/__generated__/StoreModalCartQuery.graphql.js +1 -8
  89. package/dist/__generated__/StoreModalCheckoutQuery.graphql.js +1 -8
  90. package/dist/__generated__/StoreModalContainerQuery.graphql.js +1 -8
  91. package/dist/__generated__/StoreModalDownloadRefetchQuery.graphql.js +1 -8
  92. package/dist/__generated__/StoreModalDownload_order.graphql.js +1 -8
  93. package/dist/__generated__/StoreModalFamilyButton_collection.graphql.js +1 -8
  94. package/dist/__generated__/StoreModalFamily_collection.graphql.js +1 -8
  95. package/dist/__generated__/StoreModalIndexItem_fontCollection.graphql.js +1 -8
  96. package/dist/__generated__/StoreModalIndexQuery.graphql.js +1 -8
  97. package/dist/__generated__/StoreModalOrderVariableSelection_order.graphql.js +1 -8
  98. package/dist/__generated__/StoreModalOrderVariableSelection_viewer.graphql.js +1 -8
  99. package/dist/__generated__/StoreModalProductContent_collection.graphql.js +3 -11
  100. package/dist/__generated__/StoreModalProductLicenseSelection_collection.graphql.js +1 -8
  101. package/dist/__generated__/StoreModalProductLicense_license.graphql.js +1 -8
  102. package/dist/__generated__/StoreModalProductQuery.graphql.js +1 -8
  103. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.js +1 -8
  104. package/dist/__generated__/StoreModalProductSummaryAddToCartMutation.graphql.js +1 -8
  105. package/dist/__generated__/StoreModalProductSummaryClearCartMutation.graphql.js +1 -8
  106. package/dist/__generated__/StoreModalProductSummaryRefetchQuery.graphql.js +1 -8
  107. package/dist/__generated__/StoreModalProductSummary_viewer.graphql.js +3 -11
  108. package/dist/__generated__/StoreModalReviewIdentity_identity.graphql.js +1 -8
  109. package/dist/__generated__/StoreModalStyleButton_fontStyle.graphql.js +1 -8
  110. package/dist/__generated__/StoreModalUnifiedCheckoutCompleteOrderMutation.graphql.js +1 -8
  111. package/dist/__generated__/StoreModalUnifiedCheckoutUpdateCustomerMutation.graphql.js +1 -8
  112. package/dist/__generated__/StoreModalUnifiedCheckoutUpdateOrderMutation.graphql.js +1 -8
  113. package/dist/__generated__/StoreModalUnifiedCheckout_order.graphql.js +1 -8
  114. package/dist/__generated__/StoreModalUnifiedCheckout_viewer.graphql.js +1 -8
  115. package/dist/__generated__/StripeProviderCreateCheckoutSessionMutation.graphql.js +1 -8
  116. package/dist/__generated__/StripeProvider_viewer.graphql.js +1 -8
  117. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.js +1 -8
  118. package/dist/__generated__/TestFontsForm_Query.graphql.js +1 -8
  119. package/dist/__generated__/TestModeBanner_viewer.graphql.d.ts +19 -0
  120. package/dist/__generated__/TestModeBanner_viewer.graphql.js +36 -0
  121. package/dist/__generated__/ThemeConfig_viewer.graphql.d.ts +19 -0
  122. package/dist/__generated__/ThemeConfig_viewer.graphql.js +36 -0
  123. package/dist/__generated__/TypeTesterFamiliesQuery.graphql.js +1 -8
  124. package/dist/__generated__/TypeTesterFamiliesStylesQuery.graphql.js +1 -8
  125. package/dist/__generated__/TypeTesterFeaturesButton_fontStyle.graphql.js +1 -8
  126. package/dist/__generated__/TypeTesterFeatures_fontStyle.graphql.js +1 -8
  127. package/dist/__generated__/TypeTesterFloatingToolbar_testers.graphql.js +1 -8
  128. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.js +1 -8
  129. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.js +1 -8
  130. package/dist/__generated__/TypeTesterStyleSelectData_fontStyle.graphql.js +1 -8
  131. package/dist/__generated__/TypeTesterStyleSelectData_fontStyleData.graphql.js +1 -8
  132. package/dist/__generated__/TypeTesterToolbar_fontStyle.graphql.js +1 -8
  133. package/dist/__generated__/TypeTesterVariableAxes_fontStyle.graphql.js +1 -8
  134. package/dist/__generated__/TypeTester_fontStyle.graphql.js +1 -8
  135. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.js +1 -8
  136. package/dist/__generated__/TypeTestersIDQuery.graphql.js +1 -8
  137. package/dist/__generated__/TypeTestersRefetchQuery.graphql.js +1 -8
  138. package/dist/__generated__/TypeTestersSlugQuery.graphql.js +1 -8
  139. package/dist/__generated__/TypeTesters_collection.graphql.js +3 -11
  140. package/dist/__generated__/VariableTableAmounts_option.graphql.js +1 -8
  141. package/dist/__generated__/VariableTableAmounts_variable.graphql.js +1 -8
  142. package/dist/__generated__/orderTrackingUpdateOrderTrackingMutation.graphql.js +1 -8
  143. package/dist/__generated__/productState_Query.graphql.js +1 -8
  144. package/dist/__generated__/productState_bundle.graphql.js +1 -8
  145. package/dist/__generated__/productState_collection.graphql.js +1 -8
  146. package/dist/__generated__/productState_collectionBundle.graphql.js +1 -8
  147. package/dist/__generated__/productState_node.graphql.js +1 -8
  148. package/dist/__generated__/productState_sku.graphql.js +1 -8
  149. package/dist/__generated__/useFeaturesData_fontStyle.graphql.js +1 -8
  150. package/dist/__generated__/useFontStyle_fontStyle.graphql.js +1 -8
  151. package/dist/__generated__/useTotalStyles_fontCollection.graphql.js +1 -8
  152. package/dist/__tests__/collectionBundleSelection.test.js +221 -222
  153. package/dist/__tests__/fontLoader.test.js +24 -26
  154. package/dist/__tests__/licenseExclusions.test.js +27 -30
  155. package/dist/__tests__/networkFetch.test.js +66 -0
  156. package/dist/__tests__/nextAdapter.test.js +447 -0
  157. package/dist/components/AddToCartBanner/index.js +19 -29
  158. package/dist/components/BuyButton/index.d.ts +29 -6
  159. package/dist/components/BuyButton/index.js +98 -57
  160. package/dist/components/BuyButton/index.server.d.ts +9 -2
  161. package/dist/components/BuyButton/index.server.js +20 -17
  162. package/dist/components/BuyingOptions/index.d.ts +9 -0
  163. package/dist/components/BuyingOptions/index.js +4 -12
  164. package/dist/components/Cart/AddressFields.d.ts +2 -2
  165. package/dist/components/Cart/AddressFields.js +25 -35
  166. package/dist/components/Cart/CartItem/CartItemAdditionalLicenses.d.ts +2 -2
  167. package/dist/components/Cart/CartItem/CartItemAdditionalLicenses.js +9 -16
  168. package/dist/components/Cart/CartItem/CartItemLicense.d.ts +2 -2
  169. package/dist/components/Cart/CartItem/CartItemLicense.js +15 -24
  170. package/dist/components/Cart/CartItem/CartItemProduct.d.ts +1 -1
  171. package/dist/components/Cart/CartItem/CartItemProduct.js +16 -23
  172. package/dist/components/Cart/CartItem/CartItemVariable.d.ts +3 -3
  173. package/dist/components/Cart/CartItem/CartItemVariable.js +16 -23
  174. package/dist/components/Cart/CartItem/VariableTextInput.js +13 -21
  175. package/dist/components/Cart/CartItem/index.d.ts +2 -2
  176. package/dist/components/Cart/CartItem/index.js +18 -27
  177. package/dist/components/Cart/CartOrder.d.ts +2 -2
  178. package/dist/components/Cart/CartOrder.js +102 -113
  179. package/dist/components/Cart/CartState.d.ts +3 -3
  180. package/dist/components/Cart/CartState.js +18 -25
  181. package/dist/components/Cart/CartTotals.d.ts +1 -1
  182. package/dist/components/Cart/CartTotals.js +31 -38
  183. package/dist/components/Cart/Checkout.d.ts +3 -3
  184. package/dist/components/Cart/Checkout.js +109 -118
  185. package/dist/components/Cart/CheckoutSteps.js +1 -8
  186. package/dist/components/Cart/CouponCodeInput.js +22 -32
  187. package/dist/components/Cart/CustomerFields.d.ts +1 -1
  188. package/dist/components/Cart/CustomerFields.js +21 -31
  189. package/dist/components/Cart/Download.d.ts +1 -1
  190. package/dist/components/Cart/Download.js +17 -27
  191. package/dist/components/Cart/EmptyCart.js +15 -23
  192. package/dist/components/Cart/IdentityBox.d.ts +1 -1
  193. package/dist/components/Cart/IdentityBox.js +12 -19
  194. package/dist/components/Cart/ShareCart.js +24 -32
  195. package/dist/components/Cart/index.js +13 -21
  196. package/dist/components/Cart/injectRelayEnvironment.js +5 -13
  197. package/dist/components/Cart/orderTracking.js +8 -15
  198. package/dist/components/Cart/types.d.ts +1 -1
  199. package/dist/components/Cart/types.js +1 -5
  200. package/dist/components/Cart/utils.js +2 -9
  201. package/dist/components/CartButton/index.d.ts +5 -8
  202. package/dist/components/CartButton/index.js +53 -62
  203. package/dist/components/CharacterViewer/StyleSelect.d.ts +1 -1
  204. package/dist/components/CharacterViewer/StyleSelect.js +10 -17
  205. package/dist/components/CharacterViewer/index.d.ts +29 -6
  206. package/dist/components/CharacterViewer/index.js +150 -102
  207. package/dist/components/CharacterViewer/index.server.d.ts +9 -2
  208. package/dist/components/CharacterViewer/index.server.js +21 -17
  209. package/dist/components/Checkbox/index.js +9 -19
  210. package/dist/components/CollectionAa/index.d.ts +1 -1
  211. package/dist/components/CollectionAa/index.js +12 -21
  212. package/dist/components/ComponentsContext.d.ts +1 -1
  213. package/dist/components/ComponentsContext.js +4 -10
  214. package/dist/components/ConfigContext.d.ts +13 -12
  215. package/dist/components/ConfigContext.js +29 -11
  216. package/dist/components/ConsentBanner/consent.js +6 -17
  217. package/dist/components/ConsentBanner/index.js +19 -29
  218. package/dist/components/CookieNotification/index.d.ts +13 -0
  219. package/dist/components/CookieNotification/index.js +23 -31
  220. package/dist/components/CorsErrorModal.js +13 -20
  221. package/dist/components/CouponText/index.d.ts +1 -1
  222. package/dist/components/CouponText/index.js +9 -18
  223. package/dist/components/CustomerLoginForm/index.js +37 -38
  224. package/dist/components/Family/FamilyList.d.ts +1 -1
  225. package/dist/components/Family/FamilyList.js +10 -17
  226. package/dist/components/Family/index.d.ts +1 -1
  227. package/dist/components/Family/index.js +37 -46
  228. package/dist/components/FontFamilies/index.js +18 -28
  229. package/dist/components/FontStyle/index.d.ts +2 -2
  230. package/dist/components/FontStyle/index.js +8 -15
  231. package/dist/components/FontdueAdminToolbar/index.d.ts +2 -0
  232. package/dist/components/FontdueAdminToolbar/index.js +146 -0
  233. package/dist/components/FontdueContextProvider/index.d.ts +18 -0
  234. package/dist/components/FontdueContextProvider/index.js +148 -0
  235. package/dist/components/FontdueProvider/index.d.ts +19 -3
  236. package/dist/components/FontdueProvider/index.js +75 -13
  237. package/dist/components/FontdueProvider/index.server.d.ts +6 -3
  238. package/dist/components/FontdueProvider/index.server.js +37 -21
  239. package/dist/components/Icons/Align.js +13 -22
  240. package/dist/components/Icons/ArrowDownRight.js +5 -13
  241. package/dist/components/Icons/ArrowLeft.js +5 -13
  242. package/dist/components/Icons/ArrowRight.js +5 -13
  243. package/dist/components/Icons/CarrotDown.js +5 -13
  244. package/dist/components/Icons/CarrotUp.js +5 -13
  245. package/dist/components/Icons/Cart.js +7 -15
  246. package/dist/components/Icons/CartNew.js +7 -15
  247. package/dist/components/Icons/Check.js +5 -13
  248. package/dist/components/Icons/Checkbox.js +5 -13
  249. package/dist/components/Icons/CheckboxChecked.js +5 -13
  250. package/dist/components/Icons/CheckboxCrossed.js +6 -14
  251. package/dist/components/Icons/CircledCheck.js +6 -14
  252. package/dist/components/Icons/CircledInfo.js +6 -14
  253. package/dist/components/Icons/CircledMinus.js +6 -14
  254. package/dist/components/Icons/ColorPicker.js +5 -13
  255. package/dist/components/Icons/CreditCard.js +6 -14
  256. package/dist/components/Icons/DownArrow.js +5 -13
  257. package/dist/components/Icons/DownloadFonts.js +8 -16
  258. package/dist/components/Icons/FrowningFace.js +8 -16
  259. package/dist/components/Icons/License.js +5 -13
  260. package/dist/components/Icons/Receipt.js +8 -16
  261. package/dist/components/Icons/User.js +5 -13
  262. package/dist/components/Icons/X.js +5 -13
  263. package/dist/components/Icons/index.d.ts +23 -23
  264. package/dist/components/Icons/index.js +23 -167
  265. package/dist/components/NewsletterSignup/NewsletterSignupElement.d.ts +1 -1
  266. package/dist/components/NewsletterSignup/NewsletterSignupElement.js +4 -11
  267. package/dist/components/NewsletterSignup/index.d.ts +11 -6
  268. package/dist/components/NewsletterSignup/index.js +75 -60
  269. package/dist/components/NewsletterSignup/index.server.d.ts +7 -2
  270. package/dist/components/NewsletterSignup/index.server.js +17 -14
  271. package/dist/components/NodePasswordForm/index.js +25 -33
  272. package/dist/components/OrderVariableSelection/OrderVariableSelectionRedux.d.ts +1 -1
  273. package/dist/components/OrderVariableSelection/OrderVariableSelectionRedux.js +18 -27
  274. package/dist/components/OrderVariableSelection/index.d.ts +1 -1
  275. package/dist/components/OrderVariableSelection/index.js +28 -36
  276. package/dist/components/Precart/License.d.ts +1 -1
  277. package/dist/components/Precart/License.js +22 -30
  278. package/dist/components/Precart/index.js +64 -74
  279. package/dist/components/Price/index.d.ts +1 -1
  280. package/dist/components/Price/index.js +10 -20
  281. package/dist/components/PriceBar/PriceBarSection.d.ts +1 -1
  282. package/dist/components/PriceBar/PriceBarSection.js +23 -33
  283. package/dist/components/PriceBar/index.d.ts +1 -1
  284. package/dist/components/PriceBar/index.js +13 -23
  285. package/dist/components/Root/index.d.ts +1 -1
  286. package/dist/components/Root/index.js +41 -51
  287. package/dist/components/Root/productState.d.ts +1 -1
  288. package/dist/components/Root/productState.js +20 -29
  289. package/dist/components/SKUPrice/index.d.ts +2 -2
  290. package/dist/components/SKUPrice/index.js +12 -20
  291. package/dist/components/Select/index.js +9 -17
  292. package/dist/components/SelectButton/index.d.ts +2 -2
  293. package/dist/components/SelectButton/index.js +20 -29
  294. package/dist/components/ServerConfigProvider/index.d.ts +4 -2
  295. package/dist/components/ServerConfigProvider/index.js +12 -20
  296. package/dist/components/SpecimenLink/index.js +12 -20
  297. package/dist/components/StickyNav/index.js +16 -26
  298. package/dist/components/StoreModal/StoreModalBundleButton.d.ts +1 -1
  299. package/dist/components/StoreModal/StoreModalBundleButton.js +16 -23
  300. package/dist/components/StoreModal/StoreModalCart.d.ts +1 -1
  301. package/dist/components/StoreModal/StoreModalCart.js +29 -38
  302. package/dist/components/StoreModal/StoreModalCheckout.js +9 -17
  303. package/dist/components/StoreModal/StoreModalCheckoutContext.d.ts +1 -1
  304. package/dist/components/StoreModal/StoreModalCheckoutContext.js +6 -12
  305. package/dist/components/StoreModal/StoreModalContainer.js +25 -35
  306. package/dist/components/StoreModal/StoreModalDownload.d.ts +1 -1
  307. package/dist/components/StoreModal/StoreModalDownload.js +14 -24
  308. package/dist/components/StoreModal/StoreModalFamily.d.ts +1 -1
  309. package/dist/components/StoreModal/StoreModalFamily.js +14 -23
  310. package/dist/components/StoreModal/StoreModalFamilyButton.d.ts +1 -1
  311. package/dist/components/StoreModal/StoreModalFamilyButton.js +23 -30
  312. package/dist/components/StoreModal/StoreModalIndex.d.ts +1 -1
  313. package/dist/components/StoreModal/StoreModalIndex.js +9 -17
  314. package/dist/components/StoreModal/StoreModalIndexItem.d.ts +1 -1
  315. package/dist/components/StoreModal/StoreModalIndexItem.js +20 -30
  316. package/dist/components/StoreModal/StoreModalLicenseeIsBillingSelection.js +8 -17
  317. package/dist/components/StoreModal/StoreModalLoader.js +6 -15
  318. package/dist/components/StoreModal/StoreModalOrderVariableSelection.d.ts +3 -3
  319. package/dist/components/StoreModal/StoreModalOrderVariableSelection.js +12 -21
  320. package/dist/components/StoreModal/StoreModalProduct.d.ts +1 -1
  321. package/dist/components/StoreModal/StoreModalProduct.js +55 -65
  322. package/dist/components/StoreModal/StoreModalReviewIdentity.d.ts +1 -1
  323. package/dist/components/StoreModal/StoreModalReviewIdentity.js +6 -15
  324. package/dist/components/StoreModal/StoreModalRouter.js +12 -22
  325. package/dist/components/StoreModal/StoreModalStyleButton.d.ts +1 -1
  326. package/dist/components/StoreModal/StoreModalStyleButton.js +20 -27
  327. package/dist/components/StoreModal/index.d.ts +5 -1
  328. package/dist/components/StoreModal/index.js +24 -20
  329. package/dist/components/StoreModal/routes.d.ts +4 -4
  330. package/dist/components/StoreModal/routes.js +18 -26
  331. package/dist/components/StoreModal/types.js +1 -5
  332. package/dist/components/StoreModalProductLicenseSelection/LicenseElement.js +12 -22
  333. package/dist/components/StoreModalProductLicenseSelection/LicenseVariableElement.js +7 -15
  334. package/dist/components/StoreModalProductLicenseSelection/LicenseVariableRadioElement.js +9 -19
  335. package/dist/components/StoreModalProductLicenseSelection/StoreModalProductLicense.d.ts +1 -1
  336. package/dist/components/StoreModalProductLicenseSelection/StoreModalProductLicense.js +19 -28
  337. package/dist/components/StoreModalProductLicenseSelection/index.d.ts +1 -1
  338. package/dist/components/StoreModalProductLicenseSelection/index.js +10 -17
  339. package/dist/components/StoreModalProductSummary/index.d.ts +1 -1
  340. package/dist/components/StoreModalProductSummary/index.js +45 -55
  341. package/dist/components/StripeLogo.js +4 -11
  342. package/dist/components/StripeProvider/index.d.ts +1 -1
  343. package/dist/components/StripeProvider/index.js +19 -29
  344. package/dist/components/Switch/index.js +1 -7
  345. package/dist/components/TestFontsForm/TestFontsFormElement.js +4 -12
  346. package/dist/components/TestFontsForm/index.d.ts +11 -4
  347. package/dist/components/TestFontsForm/index.js +80 -65
  348. package/dist/components/TestFontsForm/index.server.d.ts +7 -2
  349. package/dist/components/TestFontsForm/index.server.js +17 -14
  350. package/dist/components/TestModeBanner/index.d.ts +4 -1
  351. package/dist/components/TestModeBanner/index.js +13 -27
  352. package/dist/components/TextField/index.js +9 -17
  353. package/dist/components/ThemeConfig/index.d.ts +3 -5
  354. package/dist/components/ThemeConfig/index.js +12 -36
  355. package/dist/components/Tracking/index.js +11 -18
  356. package/dist/components/TypeTester/TypeTesterAlignButtons.d.ts +1 -1
  357. package/dist/components/TypeTester/TypeTesterAlignButtons.js +8 -16
  358. package/dist/components/TypeTester/TypeTesterBullet.d.ts +1 -1
  359. package/dist/components/TypeTester/TypeTesterBullet.js +4 -12
  360. package/dist/components/TypeTester/TypeTesterContent.d.ts +2 -2
  361. package/dist/components/TypeTester/TypeTesterContent.js +22 -21
  362. package/dist/components/TypeTester/TypeTesterContext.d.ts +2 -2
  363. package/dist/components/TypeTester/TypeTesterContext.js +10 -17
  364. package/dist/components/TypeTester/TypeTesterEditAll.js +10 -20
  365. package/dist/components/TypeTester/TypeTesterFamilies.d.ts +1 -1
  366. package/dist/components/TypeTester/TypeTesterFamilies.js +26 -37
  367. package/dist/components/TypeTester/TypeTesterFeatures.d.ts +1 -1
  368. package/dist/components/TypeTester/TypeTesterFeatures.js +28 -37
  369. package/dist/components/TypeTester/TypeTesterFeaturesButton.d.ts +1 -1
  370. package/dist/components/TypeTester/TypeTesterFeaturesButton.js +20 -30
  371. package/dist/components/TypeTester/TypeTesterFitter.d.ts +1 -1
  372. package/dist/components/TypeTester/TypeTesterFitter.js +5 -13
  373. package/dist/components/TypeTester/TypeTesterFloatingToolbar.d.ts +1 -1
  374. package/dist/components/TypeTester/TypeTesterFloatingToolbar.js +19 -28
  375. package/dist/components/TypeTester/TypeTesterInput.js +12 -22
  376. package/dist/components/TypeTester/TypeTesterSlider.js +7 -16
  377. package/dist/components/TypeTester/TypeTesterStandalone.d.ts +20 -6
  378. package/dist/components/TypeTester/TypeTesterStandalone.js +49 -39
  379. package/dist/components/TypeTester/TypeTesterStandalone.server.d.ts +6 -2
  380. package/dist/components/TypeTester/TypeTesterStandalone.server.js +20 -16
  381. package/dist/components/TypeTester/TypeTesterStandaloneElement.js +7 -16
  382. package/dist/components/TypeTester/TypeTesterState.d.ts +2 -2
  383. package/dist/components/TypeTester/TypeTesterState.js +6 -14
  384. package/dist/components/TypeTester/TypeTesterStyleSelect.d.ts +1 -1
  385. package/dist/components/TypeTester/TypeTesterStyleSelect.js +9 -17
  386. package/dist/components/TypeTester/TypeTesterStyleSelectData.d.ts +3 -3
  387. package/dist/components/TypeTester/TypeTesterStyleSelectData.js +31 -40
  388. package/dist/components/TypeTester/TypeTesterToolbar.d.ts +2 -2
  389. package/dist/components/TypeTester/TypeTesterToolbar.js +29 -39
  390. package/dist/components/TypeTester/TypeTesterVariableAxes.d.ts +1 -1
  391. package/dist/components/TypeTester/TypeTesterVariableAxes.js +16 -24
  392. package/dist/components/TypeTester/features.js +1 -8
  393. package/dist/components/TypeTester/index.d.ts +2 -2
  394. package/dist/components/TypeTester/index.js +45 -55
  395. package/dist/components/TypeTester/types.js +3 -11
  396. package/dist/components/TypeTester/useFeaturesData.d.ts +1 -1
  397. package/dist/components/TypeTester/useFeaturesData.js +7 -15
  398. package/dist/components/TypeTester/useTypeTesterStyler.d.ts +3 -3
  399. package/dist/components/TypeTester/useTypeTesterStyler.js +6 -13
  400. package/dist/components/TypeTesters/TypeTestersElement.js +4 -12
  401. package/dist/components/TypeTesters/index.d.ts +22 -5
  402. package/dist/components/TypeTesters/index.js +118 -71
  403. package/dist/components/TypeTesters/index.server.d.ts +7 -2
  404. package/dist/components/TypeTesters/index.server.js +20 -17
  405. package/dist/components/UrlContext.js +6 -12
  406. package/dist/components/VariableTableAmounts/index.d.ts +2 -2
  407. package/dist/components/VariableTableAmounts/index.js +9 -16
  408. package/dist/components/elements/Button/index.js +3 -11
  409. package/dist/components/elements/EmptyCart/index.js +10 -20
  410. package/dist/components/elements/StoreModalCartLayout/index.js +10 -18
  411. package/dist/components/elements/StoreModalContainer/StoreModalContainerContext.js +3 -9
  412. package/dist/components/elements/StoreModalContainer/index.js +17 -27
  413. package/dist/components/elements/StoreModalDownloadLayout/index.js +7 -15
  414. package/dist/components/elements/StoreModalFamily/index.js +8 -16
  415. package/dist/components/elements/StoreModalFamilyButton/index.d.ts +1 -1
  416. package/dist/components/elements/StoreModalFamilyButton/index.js +11 -20
  417. package/dist/components/elements/StoreModalIndexItem/index.js +9 -17
  418. package/dist/components/elements/StoreModalLicenseeIsBillingIdentityElement.js +20 -29
  419. package/dist/components/elements/StoreModalLoadingScreen/index.js +4 -12
  420. package/dist/components/elements/StoreModalPageContainer/index.js +5 -13
  421. package/dist/components/elements/StoreModalStyleButton/index.d.ts +1 -1
  422. package/dist/components/elements/StoreModalStyleButton/index.js +10 -18
  423. package/dist/components/elements/StoreModalUnifiedCheckout.d.ts +2 -2
  424. package/dist/components/elements/StoreModalUnifiedCheckout.js +114 -122
  425. package/dist/components/useConsent.js +4 -9
  426. package/dist/components/useFont.d.ts +1 -1
  427. package/dist/components/useFont.js +8 -15
  428. package/dist/components/useFontStyle.d.ts +1 -1
  429. package/dist/components/useFontStyle.js +12 -20
  430. package/dist/components/useInterval.js +5 -12
  431. package/dist/components/useTotalStyles.d.ts +1 -1
  432. package/dist/components/useTotalStyles.js +4 -12
  433. package/dist/corsError.js +4 -14
  434. package/dist/data/unicodeData.js +1 -1
  435. package/dist/fontLoader.js +3 -11
  436. package/dist/fontdue.css +127 -12
  437. package/dist/global-shim.d.ts +1 -0
  438. package/dist/global-shim.js +8 -0
  439. package/dist/hooks/useAutofit.js +11 -19
  440. package/dist/hooks/useLicenseAndOrderVariables.d.ts +2 -2
  441. package/dist/hooks/useLicenseAndOrderVariables.js +7 -12
  442. package/dist/hooks/useRefetchOnLicenseChanges.d.ts +1 -1
  443. package/dist/hooks/useRefetchOnLicenseChanges.js +7 -13
  444. package/dist/hooks/useResizeObserver.d.ts +11 -0
  445. package/dist/hooks/useResizeObserver.js +23 -0
  446. package/dist/hooks.js +9 -16
  447. package/dist/index.d.ts +1 -0
  448. package/dist/index.js +1 -0
  449. package/dist/loadFontdueProviderQuery.d.ts +3 -0
  450. package/dist/loadFontdueProviderQuery.js +10 -0
  451. package/dist/next/config.d.ts +41 -0
  452. package/dist/next/config.js +193 -0
  453. package/dist/next/image-loader.d.ts +7 -0
  454. package/dist/next/image-loader.js +39 -0
  455. package/dist/next/index.d.ts +2 -0
  456. package/dist/next/index.js +10 -0
  457. package/dist/next/revalidate.d.ts +1 -0
  458. package/dist/next/revalidate.js +37 -0
  459. package/dist/next/tenant.d.ts +26 -0
  460. package/dist/next/tenant.js +169 -0
  461. package/dist/react-ranger.d.js +0 -1
  462. package/dist/react-ranger.js +17 -24
  463. package/dist/reducer.d.ts +5 -5
  464. package/dist/reducer.js +15 -36
  465. package/dist/relay/environment.d.ts +1 -0
  466. package/dist/relay/environment.js +74 -34
  467. package/dist/relay/loadSerializableQuery.d.ts +3 -1
  468. package/dist/relay/loadSerializableQuery.js +4 -8
  469. package/dist/relay/serverConfig.d.ts +16 -0
  470. package/dist/relay/serverConfig.js +38 -0
  471. package/dist/relay/useSerializablePreloadedQuery.d.ts +3 -3
  472. package/dist/relay/useSerializablePreloadedQuery.js +26 -22
  473. package/dist/retryImport.js +1 -7
  474. package/dist/scripts/updateUnicodeData.js +0 -2
  475. package/dist/utils.d.ts +2 -2
  476. package/dist/utils.js +14 -36
  477. package/dist/vanilla/FontStyle.js +3 -11
  478. package/dist/vanilla/TruncatedMarkdown.js +2 -9
  479. package/dist/vite.d.ts +2 -0
  480. package/dist/vite.js +141 -0
  481. package/package.json +13 -9
  482. package/scripts/addJsExtensionsBabelPlugin.cjs +62 -0
  483. package/types/globals.d.ts +3 -0
  484. package/types/next-cache.d.ts +6 -0
  485. package/types/next-navigation.d.ts +6 -0
  486. package/vitest.config.ts +4 -0
  487. package/dist/__generated__/ServerConfigProviderQuery.graphql.d.ts +0 -24
  488. package/dist/__generated__/ServerConfigProviderQuery.graphql.js +0 -108
  489. package/dist/__generated__/TestModeBannerQuery.graphql.d.ts +0 -20
  490. package/dist/__generated__/ThemeConfigQuery.graphql.d.ts +0 -20
  491. package/dist/__generated__/ThemeConfigQuery.graphql.js +0 -87
  492. package/dist/components/CartButton/index.server.d.ts +0 -3
  493. package/dist/components/CartButton/index.server.js +0 -18
  494. package/dist/components/FontdueProvider/FontdueProviderClientComponent.d.ts +0 -14
  495. package/dist/components/FontdueProvider/FontdueProviderClientComponent.js +0 -61
  496. package/dist/components/ThemeConfig/index.server.d.ts +0 -2
  497. package/dist/components/ThemeConfig/index.server.js +0 -17
  498. package/fontdue.css +0 -2733
  499. package/fontdue.css.map +0 -1
@@ -0,0 +1,193 @@
1
+ // withFontdue(nextConfig): next.config wrapper that installs everything a
2
+ // Fontdue storefront needs — host→path tenant rewrites, image settings, and
3
+ // workarounds for Next behaviors that would otherwise break Fontdue pages.
4
+ // Import it from next.config.mjs (this package is ESM):
5
+ //
6
+ // import { withFontdue } from 'fontdue-js/next/config';
7
+ // export default withFontdue({ /* your config */ });
8
+ //
9
+ // This module is evaluated at config-load time, so it must not import React,
10
+ // Relay, or anything else from the component tree.
11
+
12
+ import { existsSync } from 'node:fs';
13
+ import { join, relative } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+
16
+ // The tenant rewrites only make sense when the app routes live under the
17
+ // /[domain]/... tree. A single-tenant app with a flat tree (the ejected
18
+ // fontdue/example-next shape) routes normally and needs none of them.
19
+ function hasDomainTree() {
20
+ return ['src/app/[domain]', 'app/[domain]'].some(dir => existsSync(join(process.cwd(), dir)));
21
+ }
22
+
23
+ // Minimal structural types so this module doesn't need `next` installed to
24
+ // type-check; the shapes match next/dist/lib/load-custom-routes.
25
+
26
+ // Every page lives under the /[domain]/... route tree so Next renders and
27
+ // caches each tenant's pages independently. These rewrites turn the request's
28
+ // host into that leading path segment:
29
+ //
30
+ // acme.fontdue.com/fonts/foo → /acme.fontdue.com/fonts/foo (internal)
31
+ //
32
+ // In single-tenant mode the domain is constant (from NEXT_PUBLIC_FONTDUE_URL)
33
+ // so the app behaves exactly like a plain single-site Next app.
34
+ //
35
+ // This is done with config rewrites rather than middleware on purpose:
36
+ // middleware rewrites bypass the ISR page cache on self-hosted next start,
37
+ // turning every request into a full render. beforeFiles rewrites go through
38
+ // the normal routing layer and keep per-tenant ISR working. (beforeFiles also
39
+ // runs before app routes are matched, so the internal /[domain] paths can't
40
+ // be reached directly with a mismatching Host — /evil.com on acme's domain
41
+ // becomes /acme.fontdue.com/evil.com, which 404s.)
42
+ //
43
+ // X-Forwarded-Host (set by the Fontdue proxy in front of this service) wins
44
+ // over Host. The hostname charset is constrained in the patterns; anything
45
+ // else falls through to a 404.
46
+ //
47
+ // beforeFiles rules CHAIN: each rule is evaluated in order against the
48
+ // already-rewritten path, so a rewrite must produce a path no later rule can
49
+ // match. Tenant domains always contain a dot, so the catch-all path rule
50
+ // refuses any path whose first segment contains a dot — that makes the
51
+ // rewritten /acme.fontdue.com/... inert. robots.txt and sitemap.xml (dotted
52
+ // first segments we DO want to serve) get their own explicit rules, which run
53
+ // first. Side effect: a page slug containing a dot can't be routed at the
54
+ // top level.
55
+ const TENANT_HOST = '(?<tenant>[a-zA-Z0-9][a-zA-Z0-9.-]*)';
56
+ const DOTLESS_PATH = '/:path((?!api/|_next/|favicon\\.ico)(?![^/]*\\.[^/]*(?:/|$)).*)';
57
+
58
+ // One rule set rewriting onto `dest` (either a fixed /domain or the /:tenant
59
+ // capture from `has`). `conditions` is {has?, missing?}.
60
+ function rewriteRules(dest) {
61
+ let conditions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
62
+ return [{
63
+ source: '/',
64
+ destination: dest,
65
+ ...conditions
66
+ }, {
67
+ source: '/robots.txt',
68
+ destination: `${dest}/robots.txt`,
69
+ ...conditions
70
+ }, {
71
+ source: '/sitemap.xml',
72
+ destination: `${dest}/sitemap.xml`,
73
+ ...conditions
74
+ }, {
75
+ source: DOTLESS_PATH,
76
+ destination: `${dest}/:path`,
77
+ ...conditions
78
+ }];
79
+ }
80
+ export function tenantRewrites() {
81
+ const fontdueUrl = process.env.NEXT_PUBLIC_FONTDUE_URL;
82
+ const isMultiTenant = process.env.FONTDUE_MULTI_TENANT === '1';
83
+ if (!isMultiTenant) {
84
+ return rewriteRules(`/${new URL(fontdueUrl).host}`);
85
+ }
86
+ const forwardedHost = {
87
+ type: 'header',
88
+ key: 'x-forwarded-host',
89
+ value: `${TENANT_HOST}(:.*)?`
90
+ };
91
+ const noForwardedHost = {
92
+ type: 'header',
93
+ key: 'x-forwarded-host'
94
+ };
95
+ const host = {
96
+ type: 'host',
97
+ value: TENANT_HOST
98
+ };
99
+ return [...rewriteRules('/:tenant', {
100
+ has: [forwardedHost]
101
+ }),
102
+ // Host-based rules only apply when X-Forwarded-Host is absent, so the
103
+ // two sets can't both rewrite one request.
104
+ ...rewriteRules('/:tenant', {
105
+ has: [host],
106
+ missing: [noForwardedHost]
107
+ })];
108
+ }
109
+ async function resolveRewrites(rewrites) {
110
+ const result = (await (rewrites === null || rewrites === void 0 ? void 0 : rewrites())) ?? [];
111
+ // A plain array from rewrites() is afterFiles, per Next's contract.
112
+ if (Array.isArray(result)) {
113
+ return {
114
+ beforeFiles: [],
115
+ afterFiles: result,
116
+ fallback: []
117
+ };
118
+ }
119
+ return {
120
+ beforeFiles: result.beforeFiles ?? [],
121
+ afterFiles: result.afterFiles ?? [],
122
+ fallback: result.fallback ?? []
123
+ };
124
+ }
125
+ export function withFontdue() {
126
+ let nextConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
127
+ const fontdueUrl = process.env.NEXT_PUBLIC_FONTDUE_URL;
128
+ const isMultiTenant = process.env.FONTDUE_MULTI_TENANT === '1';
129
+ if (!isMultiTenant && !fontdueUrl) {
130
+ throw new Error('Set NEXT_PUBLIC_FONTDUE_URL (single-tenant) or FONTDUE_MULTI_TENANT=1 (multi-tenant).');
131
+ }
132
+ const domainTree = hasDomainTree();
133
+ if (isMultiTenant && !domainTree) {
134
+ throw new Error('FONTDUE_MULTI_TENANT=1 requires the app routes to live under src/app/[domain]/ (one cache entry per domain).');
135
+ }
136
+ const userImages = nextConfig.images ?? {};
137
+ return {
138
+ ...nextConfig,
139
+ async rewrites() {
140
+ const user = await resolveRewrites(nextConfig.rewrites);
141
+ if (!domainTree) return user;
142
+ return {
143
+ // App rules run first, against the public (pre-tenant) path; because
144
+ // beforeFiles rules chain, a dotless path they produce is then
145
+ // prefixed by the tenant rules like any direct request. afterFiles
146
+ // and fallback rules run after the tenant prefix is applied, so
147
+ // their sources must match the internal /[domain]/... form.
148
+ beforeFiles: [...user.beforeFiles, ...tenantRewrites()],
149
+ afterFiles: user.afterFiles,
150
+ fallback: user.fallback
151
+ };
152
+ },
153
+ images: {
154
+ // With a Cloudflare image transformation host configured, optimization
155
+ // moves to its edge (image-loader.ts) and the in-process optimizer —
156
+ // and sharp — stay out of the deployment entirely. The host must be in
157
+ // the env at build time (the loader is inlined into the client bundle)
158
+ // as well as at serve time (this config runs again under next start).
159
+ //
160
+ // Without one, in multi-tenant dev the GraphQL origin is typically a
161
+ // container or tunnel from which tenant hostnames don't resolve
162
+ // publicly, so the optimizer can't fetch the originals — serve them
163
+ // unoptimized there.
164
+ ...(process.env.NEXT_PUBLIC_FONTDUE_IMAGE_HOST ? {
165
+ loader: 'custom',
166
+ // Next resolves loaderFile against the project root and rejects
167
+ // absolute paths, so point into this package relative to cwd.
168
+ loaderFile: relative(process.cwd(), fileURLToPath(new URL('./image-loader.js', import.meta.url)))
169
+ } : {
170
+ unoptimized: isMultiTenant && process.env.NODE_ENV !== 'production'
171
+ }),
172
+ dangerouslyAllowSVG: true,
173
+ ...userImages,
174
+ remotePatterns: [...(fontdueUrl ? [{
175
+ protocol: 'https',
176
+ hostname: new URL(fontdueUrl).hostname
177
+ }] : []), {
178
+ protocol: 'https',
179
+ hostname: '*.fontdue.com'
180
+ },
181
+ // Multi-tenant: logos and images can live on any tenant custom
182
+ // domain. The URLs all come from the Fontdue CMS, not user input.
183
+ ...(isMultiTenant ? [{
184
+ protocol: 'https',
185
+ hostname: '**'
186
+ }] : []), ...(userImages.remotePatterns ?? [])]
187
+ },
188
+ // Treat every user agent as HTML-limited so metadata rendering blocks
189
+ // the response. Streamed metadata locks in a 200 status before
190
+ // generateMetadata's notFound() can produce a real 404.
191
+ htmlLimitedBots: nextConfig.htmlLimitedBots ?? /.*/
192
+ };
193
+ }
@@ -0,0 +1,7 @@
1
+ interface ImageLoaderProps {
2
+ src: string;
3
+ width: number;
4
+ quality?: number;
5
+ }
6
+ export default function fontdueImageLoader({ src, width, quality, }: ImageLoaderProps): string;
7
+ export {};
@@ -0,0 +1,39 @@
1
+ // Custom next/image loader that serves images through a Cloudflare image
2
+ // transformation host (developers.cloudflare.com/images/transform-images)
3
+ // instead of the in-process Next optimizer, so the deployment needs neither
4
+ // the /_next/image endpoint nor sharp. withFontdue activates it when
5
+ // NEXT_PUBLIC_FONTDUE_IMAGE_HOST is set; see config.ts.
6
+ //
7
+ // NEXT_PUBLIC_FONTDUE_IMAGE_ORIGINS (comma-separated hostnames) should
8
+ // mirror the transformation host's allowed-origins list. Sources on other
9
+ // hosts — e.g. the /logo endpoint a site serves from its own (possibly
10
+ // customer-owned) domain, which can't be allowlisted — are served as-is
11
+ // rather than as transform URLs Cloudflare would refuse (ERROR 9401).
12
+ //
13
+ // Next bundles this file into the client build and inlines the NEXT_PUBLIC_
14
+ // reads at build time, so it must stay dependency-free, and the variables
15
+ // have to be present when `next build` runs (not just at serve time).
16
+
17
+ function transformable(src) {
18
+ const origins = process.env.NEXT_PUBLIC_FONTDUE_IMAGE_ORIGINS;
19
+ if (!origins) return true;
20
+ let hostname;
21
+ try {
22
+ hostname = new URL(src).hostname;
23
+ } catch {
24
+ return false;
25
+ }
26
+ return origins.split(',').some(origin => origin.trim() === hostname);
27
+ }
28
+ export default function fontdueImageLoader(_ref) {
29
+ let {
30
+ src,
31
+ width,
32
+ quality
33
+ } = _ref;
34
+ const host = process.env.NEXT_PUBLIC_FONTDUE_IMAGE_HOST;
35
+ // No transform host, a local asset it couldn't fetch, or a source outside
36
+ // its allowed origins: serve the original, like `unoptimized`.
37
+ if (!host || src.startsWith('/') || !transformable(src)) return src;
38
+ return `https://${host}/cdn-cgi/image/width=${width},quality=${quality ?? 75},format=auto/${src}`;
39
+ }
@@ -0,0 +1,2 @@
1
+ export { isMultiTenant, isValidDomain, fontdueEndpoint, fontdueServerConfig, configureFontdueRender, prepareFontdueRender, currentFontdueEndpoint, generateStaticParams, type FontdueEndpoint, } from './tenant.js';
2
+ export { setFontdueServerConfig, getFontdueServerConfig, type FontdueServerConfig, } from '../relay/serverConfig.js';
@@ -0,0 +1,10 @@
1
+ // Server-side entrypoint for Next.js apps (the App Router / RSC adapter).
2
+ // The config-time wrapper lives in 'fontdue-js/next/config' and the deploy
3
+ // hook route handler in 'fontdue-js/next/revalidate'.
4
+
5
+ export { isMultiTenant, isValidDomain, fontdueEndpoint, fontdueServerConfig, configureFontdueRender, prepareFontdueRender, currentFontdueEndpoint, generateStaticParams } from './tenant.js';
6
+
7
+ // The per-render config store consumed by fontdue-js's own server-side
8
+ // fetches. configureFontdueRender covers the common case; these are exported
9
+ // for apps that need to set or inspect the config directly.
10
+ export { setFontdueServerConfig, getFontdueServerConfig } from '../relay/serverConfig.js';
@@ -0,0 +1 @@
1
+ export declare function POST(request: Request): Promise<Response>;
@@ -0,0 +1,37 @@
1
+ // Route handler for Fontdue's deploy hook: re-export it from
2
+ // app/api/revalidate/route.ts:
3
+ //
4
+ // export { POST } from 'fontdue-js/next/revalidate';
5
+ //
6
+ // Fontdue calls it when a site's content changes. Multi-tenant deployments
7
+ // receive the tenant in the URL, e.g.
8
+ // POST /api/revalidate?domain=acme.fontdue.com
9
+ // and only that tenant's cache is purged (pages and embed data share the
10
+ // per-domain tag — see fontdueEndpoint/fontdueServerConfig in ./tenant).
11
+ // Single-tenant deployments use the parameterless form and purge everything
12
+ // carrying the 'graphql' tag.
13
+
14
+ import { revalidateTag } from 'next/cache';
15
+ import { isMultiTenant, isValidDomain } from './tenant.js';
16
+ export async function POST(request) {
17
+ var _URL$searchParams$get;
18
+ const domain = (_URL$searchParams$get = new URL(request.url).searchParams.get('domain')) === null || _URL$searchParams$get === void 0 ? void 0 : _URL$searchParams$get.toLowerCase();
19
+ if (isMultiTenant) {
20
+ if (!domain || !isValidDomain(domain)) {
21
+ return Response.json({
22
+ revalidated: false,
23
+ error: 'Missing or invalid ?domain='
24
+ }, {
25
+ status: 400
26
+ });
27
+ }
28
+ revalidateTag(`graphql:${domain}`);
29
+ } else {
30
+ revalidateTag('graphql');
31
+ }
32
+ return Response.json({
33
+ revalidated: true,
34
+ domain,
35
+ now: Date.now()
36
+ });
37
+ }
@@ -0,0 +1,26 @@
1
+ import { type FontdueServerConfig } from '../relay/serverConfig.js';
2
+ export declare const isMultiTenant: boolean;
3
+ export declare function isValidDomain(domain: string): boolean;
4
+ export interface FontdueEndpoint {
5
+ /** The site domain this endpoint resolves. */
6
+ domain: string;
7
+ /** Base URL the app's own GraphQL fetches should target. */
8
+ origin: string;
9
+ /** Headers the Fontdue server needs to resolve the tenant. */
10
+ headers: Record<string, string>;
11
+ /**
12
+ * Cache tags for the app's own fetch calls (pass as `next: { tags }`), so
13
+ * the revalidate handler (see ./revalidate) can purge one site at a time.
14
+ */
15
+ tags: string[];
16
+ }
17
+ export declare function fontdueEndpoint(domain: string): FontdueEndpoint;
18
+ export declare function fontdueServerConfig(domain: string): FontdueServerConfig;
19
+ export declare function configureFontdueRender(domain: string): FontdueEndpoint | null;
20
+ interface RenderProps {
21
+ params: Promise<Record<string, string | string[] | undefined>>;
22
+ }
23
+ export declare function prepareFontdueRender(props: RenderProps): Promise<FontdueEndpoint>;
24
+ export declare function currentFontdueEndpoint(): FontdueEndpoint;
25
+ export declare function generateStaticParams(): Promise<never[]>;
26
+ export {};
@@ -0,0 +1,169 @@
1
+ // Tenant/mode resolution for Next.js apps. An app using this adapter runs in
2
+ // one of two modes:
3
+ //
4
+ // - Single-tenant (default): NEXT_PUBLIC_FONTDUE_URL points at one Fontdue
5
+ // site and every request renders that site.
6
+ //
7
+ // - Multi-tenant (FONTDUE_MULTI_TENANT=1): the tenant is derived per request
8
+ // from the (forwarded) Host header, and one deployment serves every
9
+ // tenant. The rewrites installed by withFontdue (see ./config) turn each
10
+ // request into the /[domain]/... route tree so pages are rendered and
11
+ // cached per domain.
12
+ //
13
+ // In multi-tenant mode, GraphQL is fetched from FONTDUE_ORIGIN (the internal
14
+ // Fontdue server, e.g. http://localhost:4000 when running next to it) with
15
+ // the tenant's domain forwarded via X-Forwarded-Host, authenticated by the
16
+ // FONTDUE_PROXY_SECRET shared secret (the Fontdue server refuses to trust
17
+ // X-Forwarded-Host without it). Without FONTDUE_ORIGIN it falls back to
18
+ // fetching the tenant's public URL directly, which is useful for local
19
+ // development against live sites.
20
+ //
21
+ // The fontdue-js components embedded in pages fetch the same way: their
22
+ // server-side preloads read the per-render config set by
23
+ // configureFontdueRender, and in the browser they fetch the relative
24
+ // /graphql on the page's own origin — so multi-tenant mode needs no
25
+ // NEXT_PUBLIC_FONTDUE_URL at all.
26
+
27
+ import { notFound } from 'next/navigation';
28
+ import { setFontdueServerConfig, getFontdueServerConfig } from '../relay/serverConfig.js';
29
+ export const isMultiTenant = process.env.FONTDUE_MULTI_TENANT === '1';
30
+ const singleTenantUrl = process.env.NEXT_PUBLIC_FONTDUE_URL;
31
+ const internalOrigin = process.env.FONTDUE_ORIGIN;
32
+ const proxySecret = process.env.FONTDUE_PROXY_SECRET;
33
+
34
+ // Hostnames only: letters/digits/hyphens/dots, no path or port. Anything else
35
+ // is rejected before it can reach the GraphQL fetch or the filesystem cache.
36
+ const DOMAIN_RE = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/;
37
+ export function isValidDomain(domain) {
38
+ return domain.length <= 253 && DOMAIN_RE.test(domain);
39
+ }
40
+ // Where to fetch GraphQL for a given tenant domain, plus any headers needed
41
+ // for the Fontdue server to resolve that tenant.
42
+ export function fontdueEndpoint(domain) {
43
+ const tags = ['graphql', `graphql:${domain}`];
44
+ if (!isMultiTenant) {
45
+ return {
46
+ domain,
47
+ origin: requireSingleTenantUrl(),
48
+ headers: {},
49
+ tags
50
+ };
51
+ }
52
+ if (internalOrigin) {
53
+ return {
54
+ domain,
55
+ origin: internalOrigin,
56
+ headers: {
57
+ 'x-forwarded-host': domain,
58
+ ...(proxySecret ? {
59
+ 'x-fontdue-proxy-secret': proxySecret
60
+ } : {})
61
+ },
62
+ tags
63
+ };
64
+ }
65
+ return {
66
+ domain,
67
+ origin: `https://${domain}`,
68
+ headers: {},
69
+ tags
70
+ };
71
+ }
72
+ function requireSingleTenantUrl() {
73
+ if (!singleTenantUrl) {
74
+ throw new Error('fontdue-js/next: set NEXT_PUBLIC_FONTDUE_URL (single-tenant) or FONTDUE_MULTI_TENANT=1 (multi-tenant).');
75
+ }
76
+ return singleTenantUrl;
77
+ }
78
+
79
+ // Per-render config for fontdue-js's own server-side fetches: same endpoint
80
+ // and headers as the app's fetches, plus the per-domain cache tag so the
81
+ // revalidate handler purges embed data (theme config, type testers, store)
82
+ // along with the pages. ('graphql' itself is added by the network layer.)
83
+ export function fontdueServerConfig(domain) {
84
+ const {
85
+ origin,
86
+ headers
87
+ } = fontdueEndpoint(domain);
88
+ return {
89
+ url: origin,
90
+ headers,
91
+ cacheTags: [`graphql:${domain}`],
92
+ domain
93
+ };
94
+ }
95
+
96
+ // The one call a data helper needs at the top of every page render:
97
+ // validates the request-derived domain (null means "treat as 404"), then
98
+ // points fontdue-js's server-side fetches at the tenant's endpoint for the
99
+ // rest of this render pass.
100
+ //
101
+ // Call it in a data helper every page goes through, not only in the root
102
+ // layout: an App Router soft navigation re-renders just the page segment,
103
+ // and the per-render config store starts empty on every pass.
104
+ export function configureFontdueRender(domain) {
105
+ if (!isValidDomain(domain)) return null;
106
+ setFontdueServerConfig(fontdueServerConfig(domain));
107
+ return fontdueEndpoint(domain);
108
+ }
109
+
110
+ // The props every page, layout and generateMetadata receives. Any params
111
+ // object is structurally compatible; only `domain` is read.
112
+
113
+ // The one line at the top of every page, layout and generateMetadata body
114
+ // in the [domain] route tree:
115
+ //
116
+ // await prepareFontdueRender(props);
117
+ //
118
+ // Reads the request's site from the [domain] route param, 404s anything
119
+ // that isn't a plain hostname (stray paths can reach the catch-all route
120
+ // with their first segment as the "domain"), and points every Fontdue fetch
121
+ // in the rest of this render pass — the app's fetches via
122
+ // currentFontdueEndpoint and fontdue-js's embedded-component preloads — at
123
+ // that site.
124
+ //
125
+ // It must run per entry point, not only in the layout: a soft navigation
126
+ // re-renders just the page segment, and the per-render store starts empty
127
+ // on every pass. Forgetting it is loud, not subtle: currentFontdueEndpoint
128
+ // throws in multi-tenant mode when no render config was set.
129
+ //
130
+ // Route handlers are not React renders — the render-scoped store doesn't
131
+ // exist there, so use the returned endpoint explicitly instead of relying
132
+ // on currentFontdueEndpoint.
133
+ export async function prepareFontdueRender(props) {
134
+ const {
135
+ domain
136
+ } = await props.params;
137
+ const endpoint = typeof domain === 'string' ? configureFontdueRender(domain) : null;
138
+ if (!endpoint) notFound();
139
+ return endpoint;
140
+ }
141
+
142
+ // Endpoint for the app's own GraphQL fetches in this render pass: whatever
143
+ // prepareFontdueRender configured, or — in a single-tenant app without the
144
+ // [domain] tree, where prepareFontdueRender is never called — the
145
+ // NEXT_PUBLIC_FONTDUE_URL site. Throwing rather than guessing in
146
+ // multi-tenant mode turns a forgotten prepareFontdueRender into an
147
+ // unmissable error instead of a silent wrong-site fetch on soft
148
+ // navigations.
149
+ export function currentFontdueEndpoint() {
150
+ var _getFontdueServerConf;
151
+ const domain = (_getFontdueServerConf = getFontdueServerConfig()) === null || _getFontdueServerConf === void 0 ? void 0 : _getFontdueServerConf.domain;
152
+ if (domain) return fontdueEndpoint(domain);
153
+ if (isMultiTenant) {
154
+ throw new Error('fontdue-js/next: no render config set — call prepareFontdueRender(props) at the top of every page, layout and generateMetadata that fetches.');
155
+ }
156
+ return fontdueEndpoint(new URL(requireSingleTenantUrl()).host);
157
+ }
158
+
159
+ // Re-export from routes in the [domain] tree:
160
+ //
161
+ // export { generateStaticParams } from 'fontdue-js/next';
162
+ //
163
+ // Domains aren't known at build time, so nothing is prerendered — but
164
+ // providing generateStaticParams is what opts a dynamic route into
165
+ // static-on-demand rendering (generated on first request, then cached until
166
+ // revalidated) instead of fully dynamic rendering.
167
+ export async function generateStaticParams() {
168
+ return [];
169
+ }
@@ -1 +0,0 @@
1
- "use strict";
@@ -1,11 +1,4 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.useRanger = useRanger;
7
- var _react = _interopRequireDefault(require("react"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
1
+ import React from 'react';
9
2
  const getBoundingClientRect = element => {
10
3
  const rect = element.getBoundingClientRect();
11
4
  return {
@@ -15,9 +8,9 @@ const getBoundingClientRect = element => {
15
8
  };
16
9
  const sortNumList = arr => [...arr].sort((a, b) => Number(a) - Number(b));
17
10
  const useGetLatest = val => {
18
- const ref = _react.default.useRef(val);
11
+ const ref = React.useRef(val);
19
12
  ref.current = val;
20
- return _react.default.useCallback(() => ref.current, []);
13
+ return React.useCallback(() => ref.current, []);
21
14
  };
22
15
  const linearInterpolator = {
23
16
  getPercentageForValue: (val, min, max) => {
@@ -33,7 +26,7 @@ const linearInterpolator = {
33
26
  return value + min;
34
27
  }
35
28
  };
36
- function useRanger(_ref) {
29
+ export function useRanger(_ref) {
37
30
  let {
38
31
  interpolator = linearInterpolator,
39
32
  tickSize = 10,
@@ -46,8 +39,8 @@ function useRanger(_ref) {
46
39
  onDrag,
47
40
  stepSize
48
41
  } = _ref;
49
- const [activeHandleIndex, setActiveHandleIndex] = _react.default.useState(null);
50
- const [tempValues, setTempValues] = _react.default.useState();
42
+ const [activeHandleIndex, setActiveHandleIndex] = React.useState(null);
43
+ const [tempValues, setTempValues] = React.useState();
51
44
  const getLatest = useGetLatest({
52
45
  activeHandleIndex,
53
46
  onChange,
@@ -55,12 +48,12 @@ function useRanger(_ref) {
55
48
  values,
56
49
  tempValues
57
50
  });
58
- const trackElRef = _react.default.useRef();
59
- const getValueForClientX = _react.default.useCallback(clientX => {
51
+ const trackElRef = React.useRef();
52
+ const getValueForClientX = React.useCallback(clientX => {
60
53
  const trackDims = getBoundingClientRect(trackElRef.current);
61
54
  return interpolator.getValueForClientX(clientX, trackDims, min, max);
62
55
  }, [interpolator, max, min]);
63
- const getNextStep = _react.default.useCallback((val, direction) => {
56
+ const getNextStep = React.useCallback((val, direction) => {
64
57
  if (steps) {
65
58
  let currIndex = steps.indexOf(val);
66
59
  let nextIndex = currIndex + direction;
@@ -83,7 +76,7 @@ function useRanger(_ref) {
83
76
  }
84
77
  }
85
78
  }, [max, min, stepSize, steps]);
86
- const roundToStep = _react.default.useCallback(val => {
79
+ const roundToStep = React.useCallback(val => {
87
80
  let left = min;
88
81
  let right = max;
89
82
  if (steps) {
@@ -111,7 +104,7 @@ function useRanger(_ref) {
111
104
  }
112
105
  return right;
113
106
  }, [max, min, stepSize, steps]);
114
- const handleDrag = _react.default.useCallback(e => {
107
+ const handleDrag = React.useCallback(e => {
115
108
  const {
116
109
  activeHandleIndex,
117
110
  onDrag
@@ -126,7 +119,7 @@ function useRanger(_ref) {
126
119
  setTempValues(newValues);
127
120
  }
128
121
  }, [getLatest, getValueForClientX, roundToStep, values]);
129
- const handleKeyDown = _react.default.useCallback((e, i) => {
122
+ const handleKeyDown = React.useCallback((e, i) => {
130
123
  const {
131
124
  values,
132
125
  onChange = () => {}
@@ -141,7 +134,7 @@ function useRanger(_ref) {
141
134
  onChange(sortedValues);
142
135
  }
143
136
  }, [getLatest, getNextStep]);
144
- const handlePress = _react.default.useCallback((e, i) => {
137
+ const handlePress = React.useCallback((e, i) => {
145
138
  setActiveHandleIndex(i);
146
139
  const handleRelease = e => {
147
140
  const {
@@ -165,14 +158,14 @@ function useRanger(_ref) {
165
158
  document.addEventListener('mouseup', handleRelease);
166
159
  document.addEventListener('touchend', handleRelease);
167
160
  }, [getLatest, handleDrag]);
168
- const getPercentageForValue = _react.default.useCallback(val => {
161
+ const getPercentageForValue = React.useCallback(val => {
169
162
  const pct = interpolator.getPercentageForValue(val, min, max);
170
163
  // Round to 4 decimal places for consistent SSR/client hydration
171
164
  return Math.round(pct * 10000) / 10000;
172
165
  }, [interpolator, max, min]);
173
166
 
174
167
  // Build the ticks
175
- const ticks = _react.default.useMemo(() => {
168
+ const ticks = React.useMemo(() => {
176
169
  let ticks = controlledTicks || steps;
177
170
  if (!ticks) {
178
171
  ticks = [min];
@@ -203,7 +196,7 @@ function useRanger(_ref) {
203
196
  }
204
197
  }));
205
198
  }, [controlledTicks, getPercentageForValue, max, min, steps, tickSize]);
206
- const segments = _react.default.useMemo(() => {
199
+ const segments = React.useMemo(() => {
207
200
  const sortedValues = sortNumList(tempValues || values);
208
201
  return [...sortedValues, max].map((value, i) => ({
209
202
  value,
@@ -228,7 +221,7 @@ function useRanger(_ref) {
228
221
  }
229
222
  }));
230
223
  }, [getPercentageForValue, max, min, tempValues, values]);
231
- const handles = _react.default.useMemo(() => (tempValues || values).map((value, i) => ({
224
+ const handles = React.useMemo(() => (tempValues || values).map((value, i) => ({
232
225
  value,
233
226
  active: i === activeHandleIndex,
234
227
  getHandleProps: function () {
package/dist/reducer.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { CollectionStyleSkusMap } from './components/Root/productState';
1
+ import { CollectionStyleSkusMap } from './components/Root/productState.js';
2
2
  import { Reducer } from 'redux';
3
- import { productState_Query$data } from './__generated__/productState_Query.graphql';
4
- import type { RouteConfig } from './components/StoreModal/routes';
5
- import { collectionSkuIdsDifferences, isSelected } from './utils';
6
- import { Config } from './components/ConfigContext';
3
+ import { productState_Query$data } from './__generated__/productState_Query.graphql.js';
4
+ import type { RouteConfig } from './components/StoreModal/routes.js';
5
+ import { collectionSkuIdsDifferences, isSelected } from './utils.js';
6
+ import { Config } from './components/ConfigContext.js';
7
7
  export { collectionSkuIdsDifferences, isSelected };
8
8
  interface LicenseOptionSpec {
9
9
  licenseId: string;