fontdue-js 2.20.1 → 2.22.0

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 (175) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/components/CharacterViewer/index.js +5 -4
  3. package/dist/components/FontdueProvider/FontdueProviderClientComponent.js +4 -3
  4. package/dist/components/FontdueProvider/useAuxUIOwner.d.ts +1 -0
  5. package/dist/components/FontdueProvider/useAuxUIOwner.js +28 -0
  6. package/dist/components/Root/index.js +20 -19
  7. package/dist/components/TypeTester/TypeTesterFeatures.js +2 -1
  8. package/dist/components/TypeTester/TypeTesterFeaturesButton.js +5 -3
  9. package/dist/components/TypeTester/TypeTesterStandalone.d.ts +2 -2
  10. package/dist/components/TypeTester/TypeTesterStandalone.js +2 -1
  11. package/dist/components/TypeTester/TypeTesterStandalone.preload.d.ts +14 -0
  12. package/dist/components/TypeTester/TypeTesterStandalone.preload.js +19 -0
  13. package/dist/components/TypeTester/types.d.ts +2 -0
  14. package/dist/components/TypeTester/types.js +10 -1
  15. package/dist/components/TypeTesters/TypeTestersElement.d.ts +2 -1
  16. package/dist/components/TypeTesters/TypeTestersElement.js +3 -1
  17. package/dist/components/TypeTesters/index.d.ts +2 -0
  18. package/dist/components/TypeTesters/index.js +5 -2
  19. package/dist/config.d.ts +6 -0
  20. package/dist/config.js +20 -0
  21. package/dist/corsError.js +42 -7
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +1 -0
  24. package/dist/retryImport.d.ts +13 -0
  25. package/dist/retryImport.js +26 -0
  26. package/dist-bundle/FontdueProvider.js +6 -0
  27. package/dist-bundle/FontdueProvider.js.map +1 -0
  28. package/dist-bundle/TypeTester.js +7 -0
  29. package/dist-bundle/TypeTester.js.map +1 -0
  30. package/dist-bundle/TypeTester.preload.js +75 -0
  31. package/dist-bundle/TypeTester.preload.js.map +1 -0
  32. package/dist-bundle/chunks/ComponentsContext-CmkN9J4X.js +20843 -0
  33. package/dist-bundle/chunks/ComponentsContext-CmkN9J4X.js.map +1 -0
  34. package/dist-bundle/chunks/CorsErrorModal-C1g_-3Re.js +95 -0
  35. package/dist-bundle/chunks/CorsErrorModal-C1g_-3Re.js.map +1 -0
  36. package/dist-bundle/chunks/TypeTesterStandalone-BMWuv8Ca.js +27486 -0
  37. package/dist-bundle/chunks/TypeTesterStandalone-BMWuv8Ca.js.map +1 -0
  38. package/dist-bundle/chunks/consent-DMvR5rEh.js +84 -0
  39. package/dist-bundle/chunks/consent-DMvR5rEh.js.map +1 -0
  40. package/dist-bundle/chunks/index-BNSbxp7B.js +78 -0
  41. package/dist-bundle/chunks/index-BNSbxp7B.js.map +1 -0
  42. package/dist-bundle/chunks/index-C4ak9qTL.js +423 -0
  43. package/dist-bundle/chunks/index-C4ak9qTL.js.map +1 -0
  44. package/dist-bundle/chunks/index-DsvF5W13.js +159 -0
  45. package/dist-bundle/chunks/index-DsvF5W13.js.map +1 -0
  46. package/dist-bundle/chunks/index-o29NNufd.js +131 -0
  47. package/dist-bundle/chunks/index-o29NNufd.js.map +1 -0
  48. package/dist-bundle/index.js +23 -0
  49. package/dist-bundle/index.js.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/__generated__/CartItem_license.graphql.d.ts +0 -27
  52. package/dist/__generated__/CartItem_license.graphql.js +0 -76
  53. package/dist/__generated__/CartItem_licenseSelection.graphql.d.ts +0 -34
  54. package/dist/__generated__/CartItem_licenseSelection.graphql.js +0 -106
  55. package/dist/__generated__/CartItem_product.graphql.d.ts +0 -32
  56. package/dist/__generated__/CartItem_product.graphql.js +0 -124
  57. package/dist/__generated__/CartItem_variable.graphql.d.ts +0 -23
  58. package/dist/__generated__/CartItem_variable.graphql.js +0 -67
  59. package/dist/__generated__/CartItem_viewer.graphql.d.ts +0 -30
  60. package/dist/__generated__/CartItem_viewer.graphql.js +0 -87
  61. package/dist/__generated__/CartOrderApplyCouponMutation.graphql.d.ts +0 -21
  62. package/dist/__generated__/CartOrderApplyCouponMutation.graphql.js +0 -919
  63. package/dist/__generated__/CartStateApplyCouponMutation.graphql.d.ts +0 -21
  64. package/dist/__generated__/CartStateApplyCouponMutation.graphql.js +0 -274
  65. package/dist/__generated__/CartTotalsCreateSnapshotMutation.graphql.d.ts +0 -22
  66. package/dist/__generated__/CartTotalsCreateSnapshotMutation.graphql.js +0 -84
  67. package/dist/__generated__/Cart_viewer.graphql.d.ts +0 -20
  68. package/dist/__generated__/Cart_viewer.graphql.js +0 -49
  69. package/dist/__generated__/CharacterViewer_Query.graphql.d.ts +0 -21
  70. package/dist/__generated__/CharacterViewer_Query.graphql.js +0 -230
  71. package/dist/__generated__/CharacterViewer_SlugQuery.graphql.d.ts +0 -25
  72. package/dist/__generated__/CharacterViewer_SlugQuery.graphql.js +0 -257
  73. package/dist/__generated__/CouponCodeInput_Refetch_Query.graphql.d.ts +0 -17
  74. package/dist/__generated__/CouponCodeInput_Refetch_Query.graphql.js +0 -201
  75. package/dist/__generated__/CouponCodeInput_order.graphql.d.ts +0 -13
  76. package/dist/__generated__/CouponCodeInput_order.graphql.js +0 -28
  77. package/dist/__generated__/CouponCodeInput_viewer.graphql.d.ts +0 -25
  78. package/dist/__generated__/CouponCodeInput_viewer.graphql.js +0 -88
  79. package/dist/__generated__/CouponCodeRefetchQuery.graphql.d.ts +0 -22
  80. package/dist/__generated__/CouponCodeRefetchQuery.graphql.js +0 -178
  81. package/dist/__generated__/Family_viewer.graphql.d.ts +0 -17
  82. package/dist/__generated__/FontFamilies_node.graphql.d.ts +0 -20
  83. package/dist/__generated__/FontFamilies_node.graphql.js +0 -49
  84. package/dist/__generated__/NewsletterSignup_Query.graphql.d.ts +0 -21
  85. package/dist/__generated__/NewsletterSignup_Query.graphql.js +0 -99
  86. package/dist/__generated__/NewsletterSignup_viewer.graphql.d.ts +0 -20
  87. package/dist/__generated__/NewsletterSignup_viewer.graphql.js +0 -56
  88. package/dist/__generated__/OrderVariableSelectionMutation.graphql.d.ts +0 -69
  89. package/dist/__generated__/OrderVariableSelectionMutation_viewer.graphql.d.ts +0 -30
  90. package/dist/__generated__/PriceBarSection_RefetchQuery.graphql.d.ts +0 -26
  91. package/dist/__generated__/PriceBarSection_RefetchQuery.graphql.js +0 -168
  92. package/dist/__generated__/PriceBarSection_viewer.graphql.d.ts +0 -17
  93. package/dist/__generated__/PriceBar_viewer.graphql.d.ts +0 -17
  94. package/dist/__generated__/SKUPriceRefetchQuery.graphql.d.ts +0 -31
  95. package/dist/__generated__/SKUPriceRefetchQuery.graphql.js +0 -130
  96. package/dist/__generated__/SKUPriceUpdateQuery.graphql.d.ts +0 -29
  97. package/dist/__generated__/SKUPrice_RefetchQuery.graphql.d.ts +0 -26
  98. package/dist/__generated__/SKUPrice_RefetchQuery.graphql.js +0 -129
  99. package/dist/__generated__/SKUPrice_viewer.graphql.d.ts +0 -19
  100. package/dist/__generated__/SelectButton_viewer.graphql.d.ts +0 -17
  101. package/dist/__generated__/SpecimenLink_node.graphql.d.ts +0 -21
  102. package/dist/__generated__/SpecimenLink_node.graphql.js +0 -55
  103. package/dist/__generated__/StoreModalBundleButton_viewer.graphql.d.ts +0 -17
  104. package/dist/__generated__/StoreModalFamilyButton_viewer.graphql.d.ts +0 -17
  105. package/dist/__generated__/StoreModalFamily_viewer.graphql.d.ts +0 -17
  106. package/dist/__generated__/StoreModalOrderVariableSelectionHookQuery.graphql.d.ts +0 -26
  107. package/dist/__generated__/StoreModalOrderVariableSelectionOrderUpdateMutation.graphql.d.ts +0 -60
  108. package/dist/__generated__/StoreModalOrderVariableSelectionRefetchQuery.graphql.d.ts +0 -26
  109. package/dist/__generated__/StoreModalOrderVariableSelectionVariable_order.graphql.d.ts +0 -27
  110. package/dist/__generated__/StoreModalOrderVariableSelectionVariable_variable.graphql.d.ts +0 -24
  111. package/dist/__generated__/StoreModalProductContent_viewer.graphql.d.ts +0 -30
  112. package/dist/__generated__/StoreModalProductLicenseSelection_viewer.graphql.d.ts +0 -20
  113. package/dist/__generated__/StoreModalProductLicenseSelection_viewer.graphql.js +0 -51
  114. package/dist/__generated__/StoreModalProductViewerRefetchQuery.graphql.d.ts +0 -31
  115. package/dist/__generated__/StoreModalReviewCompleteOrderMutation.graphql.d.ts +0 -25
  116. package/dist/__generated__/StoreModalReviewCompleteOrderMutation.graphql.js +0 -442
  117. package/dist/__generated__/StoreModalReviewQuery.graphql.d.ts +0 -22
  118. package/dist/__generated__/StoreModalReviewQuery.graphql.js +0 -491
  119. package/dist/__generated__/StoreModalReviewUpdateOrderMutation.graphql.d.ts +0 -63
  120. package/dist/__generated__/StoreModalReviewUpdateOrderMutation.graphql.js +0 -445
  121. package/dist/__generated__/StoreModalReview_order.graphql.d.ts +0 -59
  122. package/dist/__generated__/StoreModalReview_order.graphql.js +0 -244
  123. package/dist/__generated__/StoreModalReview_viewer.graphql.d.ts +0 -19
  124. package/dist/__generated__/StoreModalReview_viewer.graphql.js +0 -47
  125. package/dist/__generated__/StoreModalStyleButton_viewer.graphql.d.ts +0 -17
  126. package/dist/__generated__/TestFontsForm_viewer.graphql.d.ts +0 -29
  127. package/dist/__generated__/TestFontsForm_viewer.graphql.js +0 -101
  128. package/dist/__generated__/TestModeBanner_viewer.graphql.d.ts +0 -23
  129. package/dist/__generated__/TestModeBanner_viewer.graphql.js +0 -64
  130. package/dist/__generated__/ThemeConfig_viewer.graphql.d.ts +0 -19
  131. package/dist/__generated__/ThemeConfig_viewer.graphql.js +0 -43
  132. package/dist/__generated__/TypeTesterStandalone_StyleQuery.graphql.d.ts +0 -32
  133. package/dist/__generated__/TypeTesterStandalone_StyleQuery.graphql.js +0 -385
  134. package/dist/__generated__/TypeTesterStyleSelect_family.graphql.d.ts +0 -33
  135. package/dist/__generated__/TypeTesterStyleSelect_fontStyle.graphql.d.ts +0 -27
  136. package/dist/__generated__/TypeTester_NewStyleQuery.graphql.d.ts +0 -41
  137. package/dist/__generated__/TypeTester_NewStyleQuery.graphql.js +0 -344
  138. package/dist/__generated__/TypeTester_sku.graphql.d.ts +0 -21
  139. package/dist/__generated__/TypeTester_sku.graphql.js +0 -57
  140. package/dist/__generated__/useOrderVariables_order.graphql.d.ts +0 -24
  141. package/dist/__tests__/collectionBundleSelection.test.d.ts +0 -1
  142. package/dist/components/BuyButton/BuyButton.server.d.ts +0 -3
  143. package/dist/components/BuyButton/BuyButton.server.js +0 -39
  144. package/dist/components/CartButton/index-server.d.ts +0 -3
  145. package/dist/components/CartButton/index-server.js +0 -18
  146. package/dist/components/OrderVariableSelection/OrderVariableSelectionMutation.d.ts +0 -7
  147. package/dist/components/SelectField/index.d.ts +0 -13
  148. package/dist/components/SelectField/index.js +0 -49
  149. package/dist/components/StoreModal/StoreModalReview.d.ts +0 -6
  150. package/dist/components/StoreModal/StoreModalReview.js +0 -221
  151. package/dist/components/StoreModal/StoreModalRouterContext.d.ts +0 -7
  152. package/dist/components/StoreModal/StoreModalRouterContext.js +0 -11
  153. package/dist/components/StoreModal/createRouter.d.ts +0 -41
  154. package/dist/components/StoreModal/createRouter.js +0 -48
  155. package/dist/components/StoreModalProductLicenseSelection/ContainerElement.d.ts +0 -9
  156. package/dist/components/StoreModalProductLicenseSelection/ContainerElement.js +0 -25
  157. package/dist/components/Stylesheet/index.d.ts +0 -7
  158. package/dist/components/Stylesheet/index.js +0 -43
  159. package/dist/components/TestModeBanner/index.server.d.ts +0 -2
  160. package/dist/components/TestModeBanner/index.server.js +0 -17
  161. package/dist/components/elements/StoreModalReviewConfirm/index.d.ts +0 -12
  162. package/dist/components/elements/StoreModalReviewConfirm/index.js +0 -50
  163. package/dist/components/elements/StoreModalReviewItem/index.d.ts +0 -9
  164. package/dist/components/elements/StoreModalReviewItem/index.js +0 -21
  165. package/dist/components/elements/StoreModalReviewLayout/index.d.ts +0 -17
  166. package/dist/components/elements/StoreModalReviewLayout/index.js +0 -59
  167. package/dist/components/useFontLoaded.d.ts +0 -24
  168. package/dist/components/useFontLoaded.js +0 -60
  169. package/dist/deepMerge.d.ts +0 -4
  170. package/dist/deepMerge.js +0 -24
  171. package/dist/hooks/useOrderVariables.d.ts +0 -5
  172. package/dist/relay-environment.d.ts +0 -7
  173. package/dist/relay-environment.js +0 -34
  174. package/dist/utils/interpolateOrderVariableDescription.d.ts +0 -36
  175. package/dist/utils/interpolateOrderVariableDescription.test.d.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 2.22.0
2
+
3
+ - **`features="*"` wildcard on `<TypeTester>` and `<TypeTesters>`** to expose every OpenType feature each font supports without curating a list. Custom *stylistic set* names defined by the foundry are picked up automatically. Works on both the standalone `<fontdue-type-tester>` HTML element and the React `<TypeTester>` / `<TypeTesters>` components.
4
+ - **`features` prop on `<TypeTesters>`** — the plural now accepts a `features` prop (or `features` HTML attribute on `<fontdue-type-testers>`) that overrides `collection.typeTesterFeatures`, matching the singular API. Useful for setting `features="*"` per-embed without changing the collection's saved settings.
5
+ - The `features` prop on both singular and plural now accepts the literal string `"*"` as a scalar in addition to `["*"]`, so React consumers can write `features="*"` instead of `features={['*']}`.
6
+
7
+ ## 2.21.0
8
+
9
+ - Fixed `CharacterViewer` silently dropping characters from supplementary-plane Unicode blocks (e.g. Latin Extended-F, Enclosed Alphanumeric Supplement). Range expansion now uses `codePointAt` / `String.fromCodePoint` so characters above U+FFFF render correctly instead of getting filtered out as unpaired surrogates
10
+ - Fixed false-positive CORS error modal appearing on network failures unrelated to CORS (DNS, timeout, server unreachable). The modal now only shows for genuine CORS misconfigurations; other fetch failures log a warning instead
11
+
1
12
  ## 2.20.1
2
13
 
3
14
  - Fixed `useAutofit` measuring multi-line text as a single line, causing the font size to be too small when type tester content contains line breaks
@@ -15,6 +15,7 @@ var _CharacterViewer_family2 = _interopRequireDefault(require("../../__generated
15
15
  var _react = _interopRequireWildcard(require("react"));
16
16
  var _reactRelay = require("react-relay");
17
17
  var _resizeObserver = _interopRequireDefault(require("@react-hook/resize-observer"));
18
+ var _retryImport = _interopRequireDefault(require("../../retryImport"));
18
19
  var _utils = require("../../utils");
19
20
  var _useFontStyle = _interopRequireDefault(require("../useFontStyle"));
20
21
  var _useSerializablePreloadedQuery = _interopRequireDefault(require("../../relay/useSerializablePreloadedQuery"));
@@ -83,9 +84,9 @@ function useUnicodeData() {
83
84
  const [data, setData] = (0, _react.useState)();
84
85
  (0, _react.useEffect)(() => {
85
86
  function fetchData() {
86
- Promise.resolve().then(() => _interopRequireWildcard(require('../../data/unicodeData'))).then(data => {
87
+ (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../../data/unicodeData')))).then(data => {
87
88
  if (!ignore) setData(data.default);
88
- });
89
+ }).catch(() => {});
89
90
  }
90
91
  let ignore = false;
91
92
  fetchData();
@@ -109,10 +110,10 @@ function compareGlyphs(a, b) {
109
110
  return true;
110
111
  }
111
112
  function charCode(c) {
112
- return c.charCodeAt(0);
113
+ return c.codePointAt(0) ?? 0;
113
114
  }
114
115
  function fromCharCode(code) {
115
- return String.fromCharCode(code);
116
+ return String.fromCodePoint(code);
116
117
  }
117
118
  function flattenCharacterList(charSet, glyphNames) {
118
119
  if (!glyphNames || !charSet || !charSet.characters) return null;
@@ -14,12 +14,13 @@ var _ConfigContext = _interopRequireWildcard(require("../ConfigContext"));
14
14
  var _reducer = require("../../reducer");
15
15
  var _ComponentsContext = _interopRequireDefault(require("../ComponentsContext"));
16
16
  var _UrlContext = _interopRequireDefault(require("../UrlContext"));
17
+ var _retryImport = _interopRequireDefault(require("../../retryImport"));
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
19
  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); }
19
20
  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; }
20
- const ConsentBanner = /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../ConsentBanner'))));
21
- const Tracking = /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Tracking'))));
22
- const ServerConfigProvider = /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../ServerConfigProvider'))));
21
+ const ConsentBanner = /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../ConsentBanner')))));
22
+ const Tracking = /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Tracking')))));
23
+ const ServerConfigProvider = /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../ServerConfigProvider')))));
23
24
  function FontdueProviderClientComponent(_ref) {
24
25
  let {
25
26
  children,
@@ -0,0 +1 @@
1
+ export default function useAuxUIOwner(): boolean;
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useState } from 'react';
4
+
5
+ // Module-level claim: only one FontdueProvider on a page renders
6
+ // auxiliary UI (TestModeBanner, ThemeConfig, Tracking, ConsentBanner,
7
+ // ServerConfigProvider). Starts false on both server and client to avoid
8
+ // hydration mismatch; the first provider to run `useEffect` wins and flips
9
+ // its own state to true. Relinquishes the claim on unmount so HMR and
10
+ // route changes don't leak.
11
+
12
+ let ownerId = null;
13
+ export default function useAuxUIOwner() {
14
+ const [isOwner, setIsOwner] = useState(false);
15
+ useEffect(() => {
16
+ const myId = {};
17
+ if (ownerId == null) {
18
+ ownerId = myId;
19
+ setIsOwner(true);
20
+ }
21
+ return () => {
22
+ if (ownerId === myId) {
23
+ ownerId = null;
24
+ }
25
+ };
26
+ }, []);
27
+ return isOwner;
28
+ }
@@ -9,6 +9,7 @@ var _reactErrorBoundary = require("react-error-boundary");
9
9
  var _reactDom = _interopRequireDefault(require("react-dom"));
10
10
  var _uuid = require("uuid");
11
11
  var _reducer = require("../../reducer");
12
+ var _retryImport = _interopRequireDefault(require("../../retryImport"));
12
13
  var _utils = require("../../utils");
13
14
  var _FontdueProvider = _interopRequireDefault(require("../FontdueProvider"));
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -17,31 +18,31 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
17
18
  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; }
18
19
  const customElementMap = {
19
20
  // @ts-ignore
20
- 'fontdue-add-to-cart-banner': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../AddToCartBanner')))),
21
+ 'fontdue-add-to-cart-banner': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../AddToCartBanner'))))),
21
22
  // @ts-ignore
22
- 'fontdue-buying-options': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../BuyingOptions')))),
23
- 'fontdue-buy-button': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../BuyButton')))),
24
- 'fontdue-cart': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Cart')))),
25
- 'fontdue-cart-button': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CartButton')))),
26
- 'fontdue-character-viewer': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CharacterViewer')))),
23
+ 'fontdue-buying-options': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../BuyingOptions'))))),
24
+ 'fontdue-buy-button': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../BuyButton'))))),
25
+ 'fontdue-cart': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Cart'))))),
26
+ 'fontdue-cart-button': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CartButton'))))),
27
+ 'fontdue-character-viewer': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CharacterViewer'))))),
27
28
  // @ts-ignore
28
- 'fontdue-collection-aa': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CollectionAa')))),
29
+ 'fontdue-collection-aa': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CollectionAa'))))),
29
30
  // @ts-ignore
30
- 'fontdue-cookie-notification': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CookieNotification')))),
31
- 'fontdue-font-families': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../FontFamilies')))),
32
- 'fontdue-customer-login-form': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CustomerLoginForm')))),
33
- 'fontdue-newsletter-signup': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../NewsletterSignup/NewsletterSignupElement')))),
34
- 'fontdue-node-password-form': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../NodePasswordForm')))),
31
+ 'fontdue-cookie-notification': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CookieNotification'))))),
32
+ 'fontdue-font-families': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../FontFamilies'))))),
33
+ 'fontdue-customer-login-form': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../CustomerLoginForm'))))),
34
+ 'fontdue-newsletter-signup': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../NewsletterSignup/NewsletterSignupElement'))))),
35
+ 'fontdue-node-password-form': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../NodePasswordForm'))))),
35
36
  // @ts-ignore
36
- 'fontdue-precart': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Precart')))),
37
+ 'fontdue-precart': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../Precart'))))),
37
38
  // @ts-ignore
38
- 'fontdue-specimen-link': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../SpecimenLink')))),
39
+ 'fontdue-specimen-link': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../SpecimenLink'))))),
39
40
  // @ts-ignore
40
- 'fontdue-sticky-nav': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../StickyNav')))),
41
- 'fontdue-store-modal': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../StoreModal')))),
42
- 'fontdue-test-fonts-form': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TestFontsForm/TestFontsFormElement')))),
43
- 'fontdue-type-tester': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TypeTester/TypeTesterStandaloneElement')))),
44
- 'fontdue-type-testers': /*#__PURE__*/(0, _react.lazy)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TypeTesters/TypeTestersElement'))))
41
+ 'fontdue-sticky-nav': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../StickyNav'))))),
42
+ 'fontdue-store-modal': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../StoreModal'))))),
43
+ 'fontdue-test-fonts-form': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TestFontsForm/TestFontsFormElement'))))),
44
+ 'fontdue-type-tester': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TypeTester/TypeTesterStandaloneElement'))))),
45
+ 'fontdue-type-testers': /*#__PURE__*/(0, _react.lazy)(() => (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('../TypeTesters/TypeTestersElement')))))
45
46
  };
46
47
  Object.keys(customElementMap).forEach(elementName => {
47
48
  // this might be more sophisticated in the future with a shadow DOM, etc,
@@ -108,7 +108,8 @@ function TypeTesterFeatures(_ref) {
108
108
  }
109
109
  }, columnConfig.features.filter(feature => shouldIncludeFeature(fontFeatures === null || fontFeatures === void 0 ? void 0 : fontFeatures.supportedFeatures, typeof feature === 'string' ? feature : feature.code)).map(renderFeature))));
110
110
  } else {
111
- featuresColumns = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, showFeatures === null || showFeatures === void 0 ? void 0 : showFeatures.filter(feature => shouldIncludeFeature(fontFeatures === null || fontFeatures === void 0 ? void 0 : fontFeatures.supportedFeatures, feature)).map(renderFeature));
111
+ const expanded = showFeatures !== null && showFeatures !== void 0 && showFeatures.includes('*') ? (fontFeatures === null || fontFeatures === void 0 ? void 0 : fontFeatures.supportedFeatures) ?? [] : (showFeatures ?? []).filter(feature => shouldIncludeFeature(fontFeatures === null || fontFeatures === void 0 ? void 0 : fontFeatures.supportedFeatures, feature));
112
+ featuresColumns = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, expanded.map(renderFeature));
112
113
  }
113
114
  const {
114
115
  height: featuresHeight,
@@ -37,10 +37,12 @@ const TypeTesterFeaturesButton = _ref => {
37
37
  const selectedFeature = features[0];
38
38
  const fontStyle = (0, _reactRelay.useFragment)((_TypeTesterFeaturesButton_fontStyle2.default.hash && _TypeTesterFeaturesButton_fontStyle2.default.hash !== "bfda99c867db0b614314fc774911c4b0" && console.error("The definition of 'TypeTesterFeaturesButton_fontStyle' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesterFeaturesButton_fontStyle2.default), fontStyleKey);
39
39
  const {
40
- featureNames
40
+ featureNames,
41
+ fontFeatures
41
42
  } = (0, _useFeaturesData.default)({
42
43
  fontStyle
43
44
  });
45
+ const effectiveFeatures = showFeatures !== null && showFeatures !== void 0 && showFeatures.includes('*') ? (fontFeatures === null || fontFeatures === void 0 ? void 0 : fontFeatures.supportedFeatures) ?? [] : showFeatures;
44
46
  if (config.openTypeFeatures.interactionStyle === 'panel') {
45
47
  return /*#__PURE__*/_react.default.createElement("div", {
46
48
  className: "type-tester__features-button",
@@ -55,7 +57,7 @@ const TypeTesterFeaturesButton = _ref => {
55
57
  }, config.openTypeFeatures.buttonLabel), ' ', featuresOpen ? /*#__PURE__*/_react.default.createElement(_CarrotUp.default, null) : /*#__PURE__*/_react.default.createElement(_CarrotDown.default, null)));
56
58
  }
57
59
  if (config.openTypeFeatures.interactionStyle === 'select') {
58
- if (!showFeatures || showFeatures.length === 0) return null;
60
+ if (!effectiveFeatures || effectiveFeatures.length === 0) return null;
59
61
  return /*#__PURE__*/_react.default.createElement("div", {
60
62
  className: "type-tester__features-select"
61
63
  }, /*#__PURE__*/_react.default.createElement(_Select.default, {
@@ -63,7 +65,7 @@ const TypeTesterFeaturesButton = _ref => {
63
65
  options: [{
64
66
  value: '',
65
67
  text: 'OT Features'
66
- }].concat(showFeatures.map(feature => ({
68
+ }].concat(effectiveFeatures.map(feature => ({
67
69
  value: feature,
68
70
  text: featureNames[feature]
69
71
  }))),
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { Alignment, Direction } from './types';
2
+ import { Alignment, Direction, FeaturesProp } from './types';
3
3
  import { SerializablePreloadedQuery } from '../../relay/loadSerializableQuery';
4
4
  import { TypeTesterStandaloneQuery } from '__generated__/TypeTesterStandaloneQuery.graphql';
5
5
  interface TypeTesterStandaloneComponent_props {
@@ -7,7 +7,7 @@ interface TypeTesterStandaloneComponent_props {
7
7
  letterSpacing?: number | null;
8
8
  fontSize?: number | null;
9
9
  axes?: string[] | null;
10
- features?: string[] | null;
10
+ features?: FeaturesProp;
11
11
  featuresSelected?: string[] | null;
12
12
  featureSettings?: {
13
13
  feature: string;
@@ -12,6 +12,7 @@ var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactRelay = require("react-relay");
13
13
  var _index = _interopRequireDefault(require("./index"));
14
14
  var _TypeTesterContext = _interopRequireDefault(require("./TypeTesterContext"));
15
+ var _types = require("./types");
15
16
  var _useSerializablePreloadedQuery = _interopRequireDefault(require("../../relay/useSerializablePreloadedQuery"));
16
17
  var _ConfigContext = _interopRequireDefault(require("../ConfigContext"));
17
18
  var _useLicenseAndOrderVariables = require("../../hooks/useLicenseAndOrderVariables");
@@ -98,7 +99,7 @@ function TypeTesterStandaloneComponent(_ref) {
98
99
  fontStyle: changedStyle ? changedStylesData.node : (_data$viewer = data.viewer) === null || _data$viewer === void 0 ? void 0 : _data$viewer.fontStyle,
99
100
  onStyleSelect: handleStyleSelect,
100
101
  axes: axes,
101
- features: features,
102
+ features: (0, _types.normalizeFeaturesProp)(features),
102
103
  productId: ((_data$viewer2 = data.viewer) === null || _data$viewer2 === void 0 ? void 0 : (_data$viewer2$fontSty = _data$viewer2.fontStyle) === null || _data$viewer2$fontSty === void 0 ? void 0 : (_data$viewer2$fontSty2 = _data$viewer2$fontSty.family) === null || _data$viewer2$fontSty2 === void 0 ? void 0 : (_data$viewer2$fontSty3 = _data$viewer2$fontSty2.parent) === null || _data$viewer2$fontSty3 === void 0 ? void 0 : _data$viewer2$fontSty3.id) ?? ((_data$viewer3 = data.viewer) === null || _data$viewer3 === void 0 ? void 0 : (_data$viewer3$fontSty = _data$viewer3.fontStyle) === null || _data$viewer3$fontSty === void 0 ? void 0 : (_data$viewer3$fontSty2 = _data$viewer3$fontSty.family) === null || _data$viewer3$fontSty2 === void 0 ? void 0 : _data$viewer3$fontSty2.id),
103
104
  groupEdit: false,
104
105
  onFocus: onFocus,
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { LoadSerializableQueryOptions, SerializablePreloadedQuery } from '../../relay/loadSerializableQuery';
3
+ import { TypeTesterStandaloneQuery } from '../../__generated__/TypeTesterStandaloneQuery.graphql';
4
+ import { TypeTesterStandalonePreloadedQueryRenderer } from './TypeTesterStandalone';
5
+ export type TypeTesterPreloadedQuery = SerializablePreloadedQuery<TypeTesterStandaloneQuery>;
6
+ export interface LoadTypeTesterQueryVariables {
7
+ familyName: string;
8
+ styleName: string;
9
+ selectable?: boolean;
10
+ }
11
+ export declare function loadTypeTesterQuery(variables: LoadTypeTesterQueryVariables, options?: LoadSerializableQueryOptions): Promise<TypeTesterPreloadedQuery>;
12
+ type RendererProps = React.ComponentProps<typeof TypeTesterStandalonePreloadedQueryRenderer>;
13
+ export declare function TypeTesterPreloaded(props: RendererProps): React.JSX.Element;
14
+ export {};
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import loadSerializableQuery from '../../relay/loadSerializableQuery';
3
+ import TypeTesterStandaloneQueryNode from '../../__generated__/TypeTesterStandaloneQuery.graphql';
4
+ import FontdueProvider from '../FontdueProvider';
5
+ import { TypeTesterStandalonePreloadedQueryRenderer } from './TypeTesterStandalone';
6
+ export async function loadTypeTesterQuery(variables, options) {
7
+ return loadSerializableQuery(TypeTesterStandaloneQueryNode, {
8
+ familyName: variables.familyName,
9
+ styleName: variables.styleName,
10
+ selectable: variables.selectable ?? true
11
+ }, options);
12
+ }
13
+ // Self-wraps with FontdueProvider so consumers don't need to. The provider
14
+ // state is a module-level singleton under the hood, so multiple
15
+ // TypeTesterPreloaded (or other *Preloaded) components on a page all share
16
+ // one Relay env + Redux store + auxiliary UI.
17
+ export function TypeTesterPreloaded(props) {
18
+ return /*#__PURE__*/React.createElement(FontdueProvider, null, /*#__PURE__*/React.createElement(TypeTesterStandalonePreloadedQueryRenderer, props));
19
+ }
@@ -3,6 +3,8 @@ export type Content = EditorState;
3
3
  export type Size = number;
4
4
  export type LineHeight = number;
5
5
  export type Features = string[];
6
+ export type FeaturesProp = ReadonlyArray<string> | '*' | null | undefined;
7
+ export declare const normalizeFeaturesProp: (features: FeaturesProp) => ReadonlyArray<string> | null;
6
8
  export type Alignment = 'left' | 'center' | 'right';
7
9
  export type Direction = 'ltr' | 'rtl';
8
10
  export type TypeTesterAxesPosition = 'auto' | 'features-panel' | 'inline' | 'above';
@@ -2,4 +2,13 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
- });
5
+ });
6
+ exports.normalizeFeaturesProp = void 0;
7
+ // Public-API feature prop. Accepts an array of feature codes, or the literal
8
+ // string '*' to expose every feature the font supports.
9
+
10
+ const normalizeFeaturesProp = features => features === '*' ? ['*'] : features ?? null;
11
+
12
+ // controls whether the type tester editing should apply to all of the
13
+ // testers within a group
14
+ exports.normalizeFeaturesProp = normalizeFeaturesProp;
@@ -4,8 +4,9 @@ interface TypeTestersElementProps {
4
4
  collectionSlug?: string;
5
5
  defaultMode?: string;
6
6
  autofit?: string;
7
+ features?: string;
7
8
  tags?: string;
8
9
  excludeTags?: string;
9
10
  }
10
- declare function TypeTestersElement({ autofit, tags, excludeTags, defaultMode, ...rest }: TypeTestersElementProps): React.JSX.Element;
11
+ declare function TypeTestersElement({ autofit, tags, excludeTags, defaultMode, features, ...rest }: TypeTestersElementProps): React.JSX.Element;
11
12
  export default TypeTestersElement;
@@ -19,13 +19,15 @@ function TypeTestersElement(_ref) {
19
19
  tags,
20
20
  excludeTags,
21
21
  defaultMode,
22
+ features,
22
23
  ...rest
23
24
  } = _ref;
24
25
  return /*#__PURE__*/_react.default.createElement(_index.default, _extends({
25
26
  tags: tags === null || tags === void 0 ? void 0 : tags.split(','),
26
27
  excludeTags: excludeTags === null || excludeTags === void 0 ? void 0 : excludeTags.split(','),
27
28
  autofit: autofit ? autofit === 'true' : undefined,
28
- defaultMode: getDefaultMode(defaultMode, autofit === 'true')
29
+ defaultMode: getDefaultMode(defaultMode, autofit === 'true'),
30
+ features: features === null || features === void 0 ? void 0 : features.split(',')
29
31
  }, rest));
30
32
  }
31
33
  var _default = TypeTestersElement;
@@ -1,12 +1,14 @@
1
1
  import React from 'react';
2
2
  import { TypeTestersIDQuery } from '../../__generated__/TypeTestersIDQuery.graphql';
3
3
  import { TypeTestersSlugQuery } from '../../__generated__/TypeTestersSlugQuery.graphql';
4
+ import { FeaturesProp } from '../TypeTester/types';
4
5
  import { SerializablePreloadedQuery } from '../../relay/loadSerializableQuery';
5
6
  export interface TypeTesters_props {
6
7
  collectionId?: string;
7
8
  collectionSlug?: string;
8
9
  defaultMode?: 'group' | 'local';
9
10
  autofit?: boolean;
11
+ features?: FeaturesProp;
10
12
  tags?: string[] | null;
11
13
  excludeTags?: string[] | null;
12
14
  onFocus?: () => void;
@@ -23,6 +23,7 @@ var _useRefetchOnLicenseChanges = require("../../hooks/useRefetchOnLicenseChange
23
23
  var _TypeTestersRefetchQuery = _interopRequireDefault(require("../../__generated__/TypeTestersRefetchQuery.graphql"));
24
24
  var _TypeTester = _interopRequireDefault(require("../TypeTester"));
25
25
  var _TypeTesterFloatingToolbar = _interopRequireDefault(require("../TypeTester/TypeTesterFloatingToolbar"));
26
+ var _types = require("../TypeTester/types");
26
27
  var _useSerializablePreloadedQuery = _interopRequireDefault(require("../../relay/useSerializablePreloadedQuery"));
27
28
  var _useLicenseAndOrderVariables = require("../../hooks/useLicenseAndOrderVariables");
28
29
  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); }
@@ -63,6 +64,7 @@ function TypeTestersComponent(_ref) {
63
64
  viewer: viewerKey,
64
65
  defaultMode,
65
66
  autofit,
67
+ features: featuresOverride,
66
68
  onFocus,
67
69
  onBlur,
68
70
  onToolbarOpenClose,
@@ -146,13 +148,14 @@ function TypeTestersComponent(_ref) {
146
148
  return acc;
147
149
  }, {});
148
150
  if (!testers) return null;
151
+ const features = (0, _types.normalizeFeaturesProp)(featuresOverride) ?? collection.typeTesterFeatures;
149
152
  return /*#__PURE__*/_react.default.createElement(_TypeTesterContext.default, {
150
153
  key: collection.id,
151
154
  defaultMode: defaultMode ?? (autofit ? 'local' : 'group'),
152
155
  testers: testers
153
156
  }, config.toolsPosition === 'floating' && /*#__PURE__*/_react.default.createElement(_TypeTesterFloatingToolbar.default, {
154
157
  testers: ((_collection$typeTeste4 = collection.typeTesters) === null || _collection$typeTeste4 === void 0 ? void 0 : (_collection$typeTeste5 = _collection$typeTeste4.edges) === null || _collection$typeTeste5 === void 0 ? void 0 : _collection$typeTeste5.map(edge => edge.node)) ?? [],
155
- features: collection.typeTesterFeatures,
158
+ features: features,
156
159
  axes: collection.typeTesterAxes,
157
160
  onToolbarOpenClose: onToolbarOpenClose
158
161
  }), getTypeTesterGroups(collection).map((typeTesterGroup, i) => {
@@ -179,7 +182,7 @@ function TypeTestersComponent(_ref) {
179
182
  onStyleSelect: fontStyleId => handleStyleSelect(node.id, fontStyleId),
180
183
  key: j,
181
184
  productId: productId,
182
- features: collection.typeTesterFeatures,
185
+ features: features,
183
186
  axes: collection.typeTesterAxes,
184
187
  viewer: viewer,
185
188
  tags: node.tags
@@ -0,0 +1,6 @@
1
+ export interface FontdueConfig {
2
+ url?: string;
3
+ stripeIntegration?: 'card-element' | 'dynamic';
4
+ }
5
+ export declare function configure(opts: Partial<FontdueConfig>): void;
6
+ export declare function getConfig(): Readonly<FontdueConfig>;
package/dist/config.js ADDED
@@ -0,0 +1,20 @@
1
+ // Module-level global configuration. Consumers call `configure()` once at
2
+ // app startup (e.g. Astro middleware, Next layout, Vite entry) and every
3
+ // fontdue-js entry point reads defaults from here. Explicit options passed
4
+ // to loadSerializableQuery / FontdueProvider still override.
5
+ //
6
+ // Per-request isolation note: `configure` sets module-level state. That's
7
+ // fine for single-tenant apps (one URL for the whole site). Multi-tenant
8
+ // servers that switch URL per request should pass `url` explicitly to
9
+ // loadSerializableQuery rather than rely on configure().
10
+
11
+ let current = {};
12
+ export function configure(opts) {
13
+ current = {
14
+ ...current,
15
+ ...opts
16
+ };
17
+ }
18
+ export function getConfig() {
19
+ return current;
20
+ }
package/dist/corsError.js CHANGED
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.handlePossibleCorsError = handlePossibleCorsError;
7
+ var _retryImport = _interopRequireDefault(require("./retryImport"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
9
  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); }
8
10
  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; }
9
11
  let detected = false;
@@ -35,6 +37,32 @@ function startPolling(fetchUrl) {
35
37
  }
36
38
  }, 3000);
37
39
  }
40
+ async function isCorsBlocked(fetchUrl) {
41
+ // A no-cors fetch bypasses CORS entirely — if it also fails,
42
+ // the server is unreachable (network error), not CORS-blocked.
43
+ try {
44
+ await fetch(fetchUrl, {
45
+ method: 'HEAD',
46
+ mode: 'no-cors'
47
+ });
48
+ return true; // server reachable, so the original error was CORS
49
+ } catch {
50
+ return false; // server unreachable, network error
51
+ }
52
+ }
53
+ function showCorsError(origin, fetchUrl) {
54
+ console.error(`[Fontdue] Cross-origin request to ${fetchUrl} was blocked.\n\n` + `Your website (${origin}) is not listed as an allowed origin ` + `in your Fontdue CORS settings.\n\n` + `To fix this:\n` + `1. Log in to your Fontdue dashboard\n` + `2. Go to Settings \u2192 Security\n` + `3. Add "${origin}" to the "Cross-origin API access" field\n` + `4. Save \u2014 this page will reload automatically`);
55
+ (0, _retryImport.default)(() => Promise.resolve().then(() => _interopRequireWildcard(require('./components/CorsErrorModal')))).then(_ref => {
56
+ let {
57
+ renderCorsErrorModal
58
+ } = _ref;
59
+ renderCorsErrorModal(origin, fetchUrl);
60
+ }).catch(() => {
61
+ // Chunk failed to load — the console.error above already
62
+ // told the developer what's wrong.
63
+ });
64
+ startPolling(fetchUrl);
65
+ }
38
66
  function handlePossibleCorsError(error, fetchUrl) {
39
67
  if (typeof window === 'undefined') return false;
40
68
  if (!(error instanceof TypeError)) return false;
@@ -43,13 +71,20 @@ function handlePossibleCorsError(error, fetchUrl) {
43
71
  if (detected) return true;
44
72
  detected = true;
45
73
  const origin = window.location.origin;
46
- console.error(`[Fontdue] Cross-origin request to ${fetchUrl} was blocked.\n\n` + `Your website (${origin}) is not listed as an allowed origin ` + `in your Fontdue CORS settings.\n\n` + `To fix this:\n` + `1. Log in to your Fontdue dashboard\n` + `2. Go to Settings \u2192 Security\n` + `3. Add "${origin}" to the "Cross-origin API access" field\n` + `4. Save \u2014 this page will reload automatically`);
47
- Promise.resolve().then(() => _interopRequireWildcard(require('./components/CorsErrorModal'))).then(_ref => {
48
- let {
49
- renderCorsErrorModal
50
- } = _ref;
51
- renderCorsErrorModal(origin, fetchUrl);
74
+
75
+ // Verify this is actually a CORS error and not a network failure.
76
+ // We do this async — handlePossibleCorsError still returns true
77
+ // synchronously so the caller can return a stub response instead
78
+ // of throwing, but we only show the modal if CORS is confirmed.
79
+ isCorsBlocked(fetchUrl).then(blocked => {
80
+ if (blocked) {
81
+ showCorsError(origin, fetchUrl);
82
+ } else {
83
+ // Network error, not CORS — reset so a real CORS error
84
+ // can still be detected if connectivity recovers.
85
+ detected = false;
86
+ console.warn(`[Fontdue] Request to ${fetchUrl} failed — this looks like a network issue, not a CORS configuration problem.`);
87
+ }
52
88
  });
53
- startPolling(fetchUrl);
54
89
  return true;
55
90
  }
@@ -0,0 +1,2 @@
1
+ export { configure, getConfig } from './config';
2
+ export type { FontdueConfig } from './config';
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export { configure, getConfig } from './config';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Wraps a dynamic import in retry logic.
3
+ *
4
+ * Retries the factory up to `retries` times with a delay between attempts.
5
+ * Re-invoking the factory works on Safari (which doesn't cache module-map
6
+ * failures) and handles transient network blips on all browsers. Chrome and
7
+ * Firefox cache failed module fetches in the module map, so retries of the
8
+ * same specifier may return the cached rejection without a network request;
9
+ * the delay helps partially mitigate that, but is not a guaranteed fix.
10
+ *
11
+ * See: https://github.com/whatwg/html/issues/6768
12
+ */
13
+ export default function retryImport<T>(load: () => Promise<T>, retries?: number, delay?: number): Promise<T>;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = retryImport;
7
+ /**
8
+ * Wraps a dynamic import in retry logic.
9
+ *
10
+ * Retries the factory up to `retries` times with a delay between attempts.
11
+ * Re-invoking the factory works on Safari (which doesn't cache module-map
12
+ * failures) and handles transient network blips on all browsers. Chrome and
13
+ * Firefox cache failed module fetches in the module map, so retries of the
14
+ * same specifier may return the cached rejection without a network request;
15
+ * the delay helps partially mitigate that, but is not a guaranteed fix.
16
+ *
17
+ * See: https://github.com/whatwg/html/issues/6768
18
+ */
19
+ function retryImport(load) {
20
+ let retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
21
+ let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
22
+ return load().catch(error => {
23
+ if (retries === 0) throw error;
24
+ return new Promise(resolve => setTimeout(resolve, delay)).then(() => retryImport(load, retries - 1, delay));
25
+ });
26
+ }
@@ -0,0 +1,6 @@
1
+ 'use client';
2
+ import './chunks/ComponentsContext-CmkN9J4X.js';
3
+ import 'react';
4
+ export { F as default } from './chunks/index-C4ak9qTL.js';
5
+ import './index.js';
6
+ //# sourceMappingURL=FontdueProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontdueProvider.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import './chunks/ComponentsContext-CmkN9J4X.js';
3
+ export { T as TypeTesterStandalonePreloadedQueryRenderer, a as default } from './chunks/TypeTesterStandalone-BMWuv8Ca.js';
4
+ import 'react';
5
+ import './index.js';
6
+ import 'react-dom';
7
+ //# sourceMappingURL=TypeTester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeTester.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}