fontdue-js 2.25.1 → 2.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.d.ts +1 -1
  3. package/dist/__generated__/CartOrderCompleteOrderMutation.graphql.js +9 -3
  4. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.d.ts +1 -1
  5. package/dist/__generated__/CartOrderRemoveDiscountMutation.graphql.js +9 -3
  6. package/dist/__generated__/CartOrderUpdateMutation.graphql.d.ts +1 -1
  7. package/dist/__generated__/CartOrderUpdateMutation.graphql.js +9 -3
  8. package/dist/__generated__/CartQuery.graphql.d.ts +1 -1
  9. package/dist/__generated__/CartQuery.graphql.js +10 -4
  10. package/dist/__generated__/CartStateUpdateMutation.graphql.d.ts +1 -1
  11. package/dist/__generated__/CartStateUpdateMutation.graphql.js +9 -3
  12. package/dist/__generated__/CharacterViewerIDQuery.graphql.d.ts +1 -1
  13. package/dist/__generated__/CharacterViewerIDQuery.graphql.js +9 -3
  14. package/dist/__generated__/CharacterViewerSlugQuery.graphql.d.ts +1 -1
  15. package/dist/__generated__/CharacterViewerSlugQuery.graphql.js +9 -3
  16. package/dist/__generated__/CharacterViewerStyleRefetchQuery.graphql.d.ts +1 -1
  17. package/dist/__generated__/CharacterViewerStyleRefetchQuery.graphql.js +9 -3
  18. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.d.ts +1 -1
  19. package/dist/__generated__/CheckoutUpdateCustomerMutation.graphql.js +9 -3
  20. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.d.ts +1 -1
  21. package/dist/__generated__/CheckoutUpdateOrderMutation.graphql.js +9 -3
  22. package/dist/__generated__/CollectionAa_Query.graphql.d.ts +1 -1
  23. package/dist/__generated__/CollectionAa_Query.graphql.js +9 -3
  24. package/dist/__generated__/FontFamiliesQuery.graphql.d.ts +1 -1
  25. package/dist/__generated__/FontFamiliesQuery.graphql.js +9 -3
  26. package/dist/__generated__/PrecartAddToCartMutation.graphql.d.ts +1 -1
  27. package/dist/__generated__/PrecartAddToCartMutation.graphql.js +9 -3
  28. package/dist/__generated__/StoreModalCartQuery.graphql.d.ts +1 -1
  29. package/dist/__generated__/StoreModalCartQuery.graphql.js +10 -4
  30. package/dist/__generated__/StoreModalContainerQuery.graphql.d.ts +1 -1
  31. package/dist/__generated__/StoreModalContainerQuery.graphql.js +9 -3
  32. package/dist/__generated__/StoreModalIndexQuery.graphql.d.ts +1 -1
  33. package/dist/__generated__/StoreModalIndexQuery.graphql.js +9 -3
  34. package/dist/__generated__/StoreModalProductQuery.graphql.d.ts +1 -1
  35. package/dist/__generated__/StoreModalProductQuery.graphql.js +9 -3
  36. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.d.ts +1 -1
  37. package/dist/__generated__/StoreModalProductRefetchQuery.graphql.js +9 -3
  38. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.d.ts +1 -1
  39. package/dist/__generated__/TestFontsFormUpdateCustomerMutation.graphql.js +9 -3
  40. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.d.ts +1 -1
  41. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.js +9 -3
  42. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.d.ts +1 -1
  43. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.js +9 -3
  44. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.d.ts +1 -1
  45. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.js +9 -3
  46. package/dist/__generated__/TypeTestersIDQuery.graphql.d.ts +1 -1
  47. package/dist/__generated__/TypeTestersIDQuery.graphql.js +9 -3
  48. package/dist/__generated__/TypeTestersRefetchQuery.graphql.d.ts +1 -1
  49. package/dist/__generated__/TypeTestersRefetchQuery.graphql.js +9 -3
  50. package/dist/__generated__/TypeTestersSlugQuery.graphql.d.ts +1 -1
  51. package/dist/__generated__/TypeTestersSlugQuery.graphql.js +9 -3
  52. package/dist/__generated__/useFontStyle_fontStyle.graphql.d.ts +2 -1
  53. package/dist/__generated__/useFontStyle_fontStyle.graphql.js +8 -2
  54. package/dist/__tests__/fontLoader.test.js +108 -0
  55. package/dist/components/TypeTester/TypeTesterVariableAxes.js +17 -4
  56. package/dist/components/TypeTester/index.js +8 -1
  57. package/dist/components/useFont.d.ts +1 -4
  58. package/dist/components/useFontStyle.js +1 -1
  59. package/dist/fontLoader.d.ts +21 -1
  60. package/dist/fontLoader.js +37 -2
  61. package/dist/fontdue.css +1 -0
  62. package/dist/hooks.d.ts +1 -0
  63. package/dist/hooks.js +14 -0
  64. package/fontdue.css +2 -1
  65. package/package.json +1 -1
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.isFontLoaded = isFontLoaded;
7
7
  exports.loadFont = loadFont;
8
+ exports.selectFontSource = selectFontSource;
8
9
  const cache = new Map();
9
10
  const loaded = new Set();
10
11
  function isFontLoaded(fontFamily) {
@@ -22,9 +23,43 @@ async function loadFont(fontFamily, sources, verticalMetrics) {
22
23
  });
23
24
  return promise;
24
25
  }
26
+
27
+ /**
28
+ * Pick the best `FontSource` for the current browser from a list emitted by
29
+ * the backend's `webfontSources` field.
30
+ *
31
+ * The backend already returns sources in CSS `src:` priority order
32
+ * (dedicated COLRv1 → COLRv0 → SVG → sbix → bundled → outline-fallback,
33
+ * within format). The job here is to drop entries whose color tech the
34
+ * browser can't render — without this, fetching e.g. an SVG-in-OpenType
35
+ * file in Chrome pins a face Chrome can only render as outline.
36
+ *
37
+ * Sources with no `tech` tag are kept unconditionally (outline / universal).
38
+ * If every tech-tagged source is filtered out, falls back to the unfiltered
39
+ * list — the browser will at least try to render something rather than the
40
+ * fallback font.
41
+ *
42
+ * `techSupportCheck` is injectable for tests; defaults to
43
+ * `CSS.supports("font-tech(color-<tech>)")`.
44
+ */
45
+ function selectFontSource(sources) {
46
+ let techSupportCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultTechSupport;
47
+ const valid = sources.filter(s => s != null && s.url != null);
48
+ const supported = valid.filter(s => !s.tech || techSupportCheck(s.tech));
49
+ const candidates = supported.length > 0 ? supported : valid;
50
+ return candidates.find(s => s.format === 'woff2') ?? candidates[0] ?? null;
51
+ }
52
+ function defaultTechSupport(tech) {
53
+ // SSR or very old browsers without CSS.supports: be optimistic, don't drop
54
+ // tech-tagged sources. Filtering exists to *prevent* loading a file the
55
+ // browser can't render, not to forbid sources we're unsure about.
56
+ if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function') {
57
+ return true;
58
+ }
59
+ return CSS.supports(`font-tech(color-${tech})`);
60
+ }
25
61
  async function doLoadFont(fontFamily, sources, verticalMetrics) {
26
- const validSources = sources.filter(s => s != null && s.url != null);
27
- const source = validSources.find(s => s.format === 'woff2') ?? validSources[0];
62
+ const source = selectFontSource(sources);
28
63
  if (!source || !source.url) throw new Error(`No font sources for ${fontFamily}`);
29
64
  const response = await fetch(source.url);
30
65
  if (!response.ok) throw new Error(`Failed to fetch font: ${response.status}`);
package/dist/fontdue.css CHANGED
@@ -708,6 +708,7 @@ div[data-component=TypeTesters] {
708
708
  margin-left: 10px;
709
709
  margin-right: 16px;
710
710
  text-align: right;
711
+ font-feature-settings: "tnum" 1;
711
712
  }
712
713
  .type-tester__variable-axes__name {
713
714
  white-space: nowrap;
package/dist/hooks.d.ts CHANGED
@@ -1 +1,2 @@
1
+ export declare function useDebouncedValue<T>(value: T, delay: number): T;
1
2
  export declare const useNewPortalElement: () => import("react").RefObject<HTMLDivElement>;
package/dist/hooks.js CHANGED
@@ -3,8 +3,22 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.useDebouncedValue = useDebouncedValue;
6
7
  exports.useNewPortalElement = void 0;
7
8
  var _react = require("react");
9
+ // Returns a copy of `value` that only updates `delay` ms after `value` stops
10
+ // changing. Useful for trailing UI that shouldn't react to rapid changes mid
11
+ // interaction (e.g. the variable-font instance name while a slider is dragged).
12
+ // NOTE: detects changes by reference, so callers must update `value`
13
+ // immutably — an object mutated in place won't trigger an update.
14
+ function useDebouncedValue(value, delay) {
15
+ const [debounced, setDebounced] = (0, _react.useState)(value);
16
+ (0, _react.useEffect)(() => {
17
+ const timer = setTimeout(() => setDebounced(value), delay);
18
+ return () => clearTimeout(timer);
19
+ }, [value, delay]);
20
+ return debounced;
21
+ }
8
22
  const useNewPortalElement = () => {
9
23
  const elementRef = (0, _react.useRef)(document.createElement('div'));
10
24
  (0, _react.useEffect)(() => {
package/fontdue.css CHANGED
@@ -674,7 +674,8 @@ div[data-component='TypeTesters'] {
674
674
  .type-tester__variable-axes__value {
675
675
  margin-left: 10px;
676
676
  margin-right: 16px;
677
- width: 3em;
677
+ /* width is reserved per-axis inline (in ch) for the widest value in range,
678
+ so the number changing never reflows the slider. */
678
679
  text-align: right;
679
680
  font-feature-settings: 'tnum' 1;
680
681
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fontdue-js",
3
- "version": "2.25.1",
3
+ "version": "2.26.1",
4
4
  "scripts": {
5
5
  "build": "npm run relay && run-p build-js build-css build-ts",
6
6
  "build-js": "babel src --out-dir dist --extensions .ts,.tsx,.js,.jsx",