fontdue-js 2.26.1 → 2.28.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 (85) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/__generated__/TypeTesterFamiliesQuery.graphql.d.ts +29 -0
  3. package/dist/__generated__/TypeTesterFamiliesQuery.graphql.js +174 -0
  4. package/dist/__generated__/TypeTesterFamiliesStylesQuery.graphql.d.ts +35 -0
  5. package/dist/__generated__/TypeTesterFamiliesStylesQuery.graphql.js +170 -0
  6. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.d.ts +1 -1
  7. package/dist/__generated__/TypeTesterStandaloneChangedStylesQuery.graphql.js +4 -4
  8. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.d.ts +1 -3
  9. package/dist/__generated__/TypeTesterStandaloneQuery.graphql.js +78 -161
  10. package/dist/__generated__/TypeTesterStyleSelectData_fontStyle.graphql.d.ts +2 -1
  11. package/dist/__generated__/TypeTesterStyleSelectData_fontStyle.graphql.js +18 -17
  12. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.d.ts +1 -1
  13. package/dist/__generated__/TypeTestersChangedStylesQuery.graphql.js +4 -4
  14. package/dist/__generated__/TypeTestersIDQuery.graphql.d.ts +1 -5
  15. package/dist/__generated__/TypeTestersIDQuery.graphql.js +101 -195
  16. package/dist/__generated__/TypeTestersRefetchQuery.graphql.d.ts +1 -1
  17. package/dist/__generated__/TypeTestersRefetchQuery.graphql.js +4 -4
  18. package/dist/__generated__/TypeTestersSlugQuery.graphql.d.ts +1 -3
  19. package/dist/__generated__/TypeTestersSlugQuery.graphql.js +102 -178
  20. package/dist/__generated__/orderTrackingUpdateOrderTrackingMutation.graphql.d.ts +27 -0
  21. package/dist/__generated__/orderTrackingUpdateOrderTrackingMutation.graphql.js +72 -0
  22. package/dist/components/Cart/CartOrder.js +8 -0
  23. package/dist/components/Cart/orderTracking.d.ts +10 -0
  24. package/dist/components/Cart/orderTracking.js +43 -0
  25. package/dist/components/ConfigContext.d.ts +2 -2
  26. package/dist/components/FontStyle/index.d.ts +2 -0
  27. package/dist/components/FontStyle/index.js +4 -2
  28. package/dist/components/FontdueProvider/FontdueProviderClientComponent.js +2 -1
  29. package/dist/components/TypeTester/TypeTesterFamilies.d.ts +37 -0
  30. package/dist/components/TypeTester/TypeTesterFamilies.js +128 -0
  31. package/dist/components/TypeTester/TypeTesterStandalone.js +2 -7
  32. package/dist/components/TypeTester/TypeTesterStandalone.server.js +1 -2
  33. package/dist/components/TypeTester/TypeTesterStyleSelect.d.ts +15 -5
  34. package/dist/components/TypeTester/TypeTesterStyleSelect.js +57 -47
  35. package/dist/components/TypeTester/TypeTesterStyleSelectData.d.ts +1 -3
  36. package/dist/components/TypeTester/TypeTesterStyleSelectData.js +210 -52
  37. package/dist/components/TypeTester/index.d.ts +1 -3
  38. package/dist/components/TypeTester/index.js +6 -6
  39. package/dist/components/TypeTester/useTypeTesterStyler.d.ts +4 -2
  40. package/dist/components/TypeTester/useTypeTesterStyler.js +78 -11
  41. package/dist/components/TypeTesters/index.js +6 -20
  42. package/dist/components/TypeTesters/index.server.js +2 -4
  43. package/dist/components/elements/StoreModalUnifiedCheckout.js +8 -0
  44. package/dist/components/useFontStyle.d.ts +7 -0
  45. package/dist/components/useFontStyle.js +2 -1
  46. package/dist/fontdue.css +8 -16
  47. package/dist/hooks.d.ts +1 -1
  48. package/dist/hooks.js +14 -1
  49. package/package.json +1 -1
  50. package/dist/__generated__/FontdueProviderQuery.graphql.d.ts +0 -19
  51. package/dist/__generated__/FontdueProviderQuery.graphql.js +0 -140
  52. package/dist/__generated__/ServerConfigProvider_viewer.graphql.d.ts +0 -23
  53. package/dist/__generated__/ServerConfigProvider_viewer.graphql.js +0 -57
  54. package/dist/__generated__/TestModeBanner_viewer.graphql.d.ts +0 -19
  55. package/dist/__generated__/TestModeBanner_viewer.graphql.js +0 -36
  56. package/dist/__generated__/ThemeConfig_viewer.graphql.d.ts +0 -19
  57. package/dist/__generated__/ThemeConfig_viewer.graphql.js +0 -36
  58. package/dist/__generated__/TypeTesterStyleSelectData_viewer.graphql.d.ts +0 -42
  59. package/dist/__generated__/TypeTesterStyleSelectData_viewer.graphql.js +0 -166
  60. package/dist/__generated__/TypeTester_viewer.graphql.d.ts +0 -17
  61. package/dist/__generated__/TypeTester_viewer.graphql.js +0 -40
  62. package/dist/__generated__/TypeTesters_viewer.graphql.d.ts +0 -17
  63. package/dist/__generated__/TypeTesters_viewer.graphql.js +0 -40
  64. package/dist/components/BuyingOptions/index.d.ts +0 -9
  65. package/dist/components/CookieNotification/index.d.ts +0 -13
  66. package/dist/components/FontdueContextProvider/index.d.ts +0 -17
  67. package/dist/components/FontdueContextProvider/index.js +0 -108
  68. package/dist/components/FontdueContextProvider/index.server.d.ts +0 -4
  69. package/dist/components/FontdueContextProvider/index.server.js +0 -7
  70. package/dist/components/FontdueProvider/useAuxUIOwner.d.ts +0 -1
  71. package/dist/components/FontdueProvider/useAuxUIOwner.js +0 -28
  72. package/dist/components/TypeTester/TypeTesterStandalone.preload.d.ts +0 -14
  73. package/dist/components/TypeTester/TypeTesterStandalone.preload.js +0 -20
  74. package/dist/config.d.ts +0 -7
  75. package/dist/config.js +0 -31
  76. package/dist/global-shim.d.ts +0 -1
  77. package/dist/global-shim.js +0 -8
  78. package/dist/hooks/useResizeObserver.d.ts +0 -11
  79. package/dist/hooks/useResizeObserver.js +0 -23
  80. package/dist/index.d.ts +0 -2
  81. package/dist/index.js +0 -1
  82. package/dist/loadFontdueProviderQuery.d.ts +0 -3
  83. package/dist/loadFontdueProviderQuery.js +0 -10
  84. package/dist/vite.d.ts +0 -2
  85. package/dist/vite.js +0 -139
@@ -0,0 +1,10 @@
1
+ import { Environment } from 'relay-runtime';
2
+ /**
3
+ * Stores the buyer's analytics context (cookie consent, Meta browser IDs,
4
+ * checkout page URL) on the current order. The server emits the purchase
5
+ * event from a Stripe webhook — outside the browser — so this is how that
6
+ * event respects the consent banner and carries attribution.
7
+ *
8
+ * Fire-and-forget: tracking must never break checkout.
9
+ */
10
+ export declare function sendOrderTracking(environment: Environment): void;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.sendOrderTracking = sendOrderTracking;
7
+ var _orderTrackingUpdateOrderTrackingMutation2 = _interopRequireDefault(require("../../__generated__/orderTrackingUpdateOrderTrackingMutation.graphql"));
8
+ var _reactRelay = require("react-relay");
9
+ var _consent = require("../ConsentBanner/consent");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ function readCookie(name) {
12
+ const match = document.cookie.match(new RegExp('(?:^|;\\s*)' + name + '=([^;]*)'));
13
+ return match ? decodeURIComponent(match[1]) : undefined;
14
+ }
15
+
16
+ /**
17
+ * Stores the buyer's analytics context (cookie consent, Meta browser IDs,
18
+ * checkout page URL) on the current order. The server emits the purchase
19
+ * event from a Stripe webhook — outside the browser — so this is how that
20
+ * event respects the consent banner and carries attribution.
21
+ *
22
+ * Fire-and-forget: tracking must never break checkout.
23
+ */
24
+ function sendOrderTracking(environment) {
25
+ try {
26
+ (0, _reactRelay.commitMutation)(environment, {
27
+ mutation: (_orderTrackingUpdateOrderTrackingMutation2.default.hash && _orderTrackingUpdateOrderTrackingMutation2.default.hash !== "d59a127a7f140424f507ae549731bac7" && console.error("The definition of 'orderTrackingUpdateOrderTrackingMutation' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _orderTrackingUpdateOrderTrackingMutation2.default),
28
+ variables: {
29
+ input: {
30
+ analyticsConsent: (0, _consent.hasConsent)('analytics'),
31
+ anonymousId: (0, _consent.getClientAnonymousId)(),
32
+ fbp: readCookie('_fbp'),
33
+ fbc: readCookie('_fbc'),
34
+ url: window.location.href
35
+ }
36
+ },
37
+ onCompleted: () => undefined,
38
+ onError: () => undefined
39
+ });
40
+ } catch {
41
+ // Ignore — see above.
42
+ }
43
+ }
@@ -34,7 +34,7 @@ export interface Config {
34
34
  export declare const makeConfig: (config?: Config) => {
35
35
  typeTester: {
36
36
  autofitOnChange: boolean;
37
- truncate: boolean;
37
+ truncate: number | boolean;
38
38
  priceText: boolean;
39
39
  selectButtonStyle: "inline" | "outlined";
40
40
  selectButtonLabel: string;
@@ -106,7 +106,7 @@ export declare const makeConfig: (config?: Config) => {
106
106
  declare const _default: React.Context<{
107
107
  typeTester: {
108
108
  autofitOnChange: boolean;
109
- truncate: boolean;
109
+ truncate: number | boolean;
110
110
  priceText: boolean;
111
111
  selectButtonStyle: "inline" | "outlined";
112
112
  selectButtonLabel: string;
@@ -1,4 +1,5 @@
1
1
  import React, { type JSX } from 'react';
2
+ import { VerticalMetrics } from '../useFontStyle';
2
3
  import { FontStyle_fontStyle$key } from '../../__generated__/FontStyle_fontStyle.graphql';
3
4
  interface FontStyleProps {
4
5
  fontStyle: FontStyle_fontStyle$key;
@@ -7,6 +8,7 @@ interface FontStyleProps {
7
8
  children: ((props: {
8
9
  loaded: boolean;
9
10
  style: React.CSSProperties;
11
+ verticalMetrics: VerticalMetrics | null;
10
12
  }) => React.ReactNode) | React.ReactNode;
11
13
  }
12
14
  export default function FontStyle({ Component, fontStyle: fontStyleKey, style, children, ...rest }: Omit<React.HTMLAttributes<HTMLDivElement | HTMLSpanElement>, 'children'> & FontStyleProps): JSX.Element;
@@ -20,7 +20,8 @@ function FontStyle(_ref) {
20
20
  const fontStyle = (0, _reactRelay.useFragment)((_FontStyle_fontStyle2.default.hash && _FontStyle_fontStyle2.default.hash !== "7891603bea1a3e40f40297bf1697eb3c" && console.error("The definition of 'FontStyle_fontStyle' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _FontStyle_fontStyle2.default), fontStyleKey);
21
21
  const {
22
22
  style: fontStyleStyle,
23
- loaded
23
+ loaded,
24
+ verticalMetrics
24
25
  } = (0, _useFontStyle.default)({
25
26
  fontStyle
26
27
  });
@@ -33,6 +34,7 @@ function FontStyle(_ref) {
33
34
  };
34
35
  return /*#__PURE__*/_react.default.createElement(Component, renderProps, typeof children === 'function' ? children({
35
36
  loaded,
36
- style: fontStyleStyle
37
+ style: fontStyleStyle,
38
+ verticalMetrics
37
39
  }) : children);
38
40
  }
@@ -16,6 +16,7 @@ var _ComponentsContext = _interopRequireDefault(require("../ComponentsContext"))
16
16
  var _UrlContext = _interopRequireDefault(require("../UrlContext"));
17
17
  var _retryImport = _interopRequireDefault(require("../../retryImport"));
18
18
  var _corsError = require("../../corsError");
19
+ var _TypeTesterFamilies = _interopRequireDefault(require("../TypeTester/TypeTesterFamilies"));
19
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
21
  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); }
21
22
  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; }
@@ -50,7 +51,7 @@ function FontdueProviderClientComponent(_ref) {
50
51
  value: url ?? (typeof process !== 'undefined' ? process.env.NEXT_PUBLIC_FONTDUE_URL : undefined) ?? ''
51
52
  }, /*#__PURE__*/_react.default.createElement(_ComponentsContext.default.Provider, {
52
53
  value: components ?? {}
53
- }, children, /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
54
+ }, /*#__PURE__*/_react.default.createElement(_TypeTesterFamilies.default, null, children), /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
54
55
  fallback: null
55
56
  }, /*#__PURE__*/_react.default.createElement(_react.Suspense, {
56
57
  fallback: null
@@ -0,0 +1,37 @@
1
+ import React from 'react';
2
+ import { VariableInstance } from '../../utils';
3
+ export interface TypeTesterFamilyListItem {
4
+ id: string;
5
+ name: string;
6
+ isVariableFont: boolean;
7
+ featureStyle: {
8
+ supportedLanguages: readonly string[] | null;
9
+ } | null;
10
+ }
11
+ export interface TypeTesterFamilyStyle {
12
+ id: string;
13
+ name: string;
14
+ cssWeight: string | null;
15
+ cssStyle: string | null;
16
+ cssStretch: string | null;
17
+ variableInstances: ReadonlyArray<VariableInstance> | null;
18
+ }
19
+ export interface TypeTesterFamilyStylesEntry {
20
+ loading: boolean;
21
+ isVariableFont: boolean;
22
+ styles: TypeTesterFamilyStyle[] | null;
23
+ }
24
+ interface FamiliesContextValue {
25
+ families: TypeTesterFamilyListItem[] | null;
26
+ loadingFamilies: boolean;
27
+ loadFamilies: () => void;
28
+ getFamilyStyles: (familyId: string) => TypeTesterFamilyStylesEntry | undefined;
29
+ loadFamilyStyles: (familyId: string) => void;
30
+ }
31
+ export declare function useTypeTesterFamilies(): FamiliesContextValue;
32
+ export declare const typeTesterFamiliesQuery: import("react-relay").GraphQLTaggedNode;
33
+ export declare const typeTesterFamiliesStylesQuery: import("react-relay").GraphQLTaggedNode;
34
+ export default function TypeTesterFamiliesProvider({ children, }: {
35
+ children: React.ReactNode;
36
+ }): React.JSX.Element;
37
+ export {};
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = TypeTesterFamiliesProvider;
8
+ exports.typeTesterFamiliesStylesQuery = exports.typeTesterFamiliesQuery = void 0;
9
+ exports.useTypeTesterFamilies = useTypeTesterFamilies;
10
+ var _TypeTesterFamiliesStylesQuery2 = _interopRequireDefault(require("../../__generated__/TypeTesterFamiliesStylesQuery.graphql"));
11
+ var _TypeTesterFamiliesQuery2 = _interopRequireDefault(require("../../__generated__/TypeTesterFamiliesQuery.graphql"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactRelay = require("react-relay");
14
+ var _utils = require("../../utils");
15
+ 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); }
16
+ 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; }
17
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ // A single, lightweight family-list entry for the type tester family switcher.
19
+ // These are all cheap stored columns (plus the once-per-page language filter),
20
+ // so this query never triggers per-style font-binary parsing.
21
+
22
+ const noop = () => {};
23
+ const TypeTesterFamiliesContext = /*#__PURE__*/(0, _react.createContext)({
24
+ families: null,
25
+ loadingFamilies: false,
26
+ loadFamilies: noop,
27
+ getFamilyStyles: () => undefined,
28
+ loadFamilyStyles: noop
29
+ });
30
+ function useTypeTesterFamilies() {
31
+ return (0, _react.useContext)(TypeTesterFamiliesContext);
32
+ }
33
+
34
+ // The family-switcher dropdown list. Cheap fields only; `featureStyle
35
+ // { supportedLanguages }` resolves the language filter once per page (instead
36
+ // of once per type tester) — see FD-685.
37
+ const typeTesterFamiliesQuery = (_TypeTesterFamiliesQuery2.default.hash && _TypeTesterFamiliesQuery2.default.hash !== "cda53ca94a4951ee5ba29cc57281a002" && console.error("The definition of 'TypeTesterFamiliesQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesterFamiliesQuery2.default);
38
+
39
+ // The styles/instances for a single family, fetched lazily when that family is
40
+ // opened or switched to. `variableInstances` font-binary parsing is therefore
41
+ // scoped to one family rather than the whole library.
42
+ exports.typeTesterFamiliesQuery = typeTesterFamiliesQuery;
43
+ const typeTesterFamiliesStylesQuery = (_TypeTesterFamiliesStylesQuery2.default.hash && _TypeTesterFamiliesStylesQuery2.default.hash !== "feee079c690b83b56cfb01cb81f36dce" && console.error("The definition of 'TypeTesterFamiliesStylesQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesterFamiliesStylesQuery2.default);
44
+ exports.typeTesterFamiliesStylesQuery = typeTesterFamiliesStylesQuery;
45
+ function TypeTesterFamiliesProvider(_ref) {
46
+ let {
47
+ children
48
+ } = _ref;
49
+ const environment = (0, _reactRelay.useRelayEnvironment)();
50
+ const [families, setFamilies] = (0, _react.useState)(null);
51
+ const [loadingFamilies, setLoadingFamilies] = (0, _react.useState)(false);
52
+ const familiesRequested = (0, _react.useRef)(false);
53
+ const [familyStyles, setFamilyStyles] = (0, _react.useState)(() => new Map());
54
+ const familyStylesRequested = (0, _react.useRef)(new Set());
55
+ const loadFamilies = (0, _react.useCallback)(() => {
56
+ if (familiesRequested.current) return;
57
+ familiesRequested.current = true;
58
+ setLoadingFamilies(true);
59
+ (0, _reactRelay.fetchQuery)(environment, typeTesterFamiliesQuery, {}).toPromise().then(data => {
60
+ var _data$viewer, _data$viewer$families;
61
+ const list = ((data === null || data === void 0 ? void 0 : (_data$viewer = data.viewer) === null || _data$viewer === void 0 ? void 0 : (_data$viewer$families = _data$viewer.families) === null || _data$viewer$families === void 0 ? void 0 : _data$viewer$families.edges) ?? []).map(edge => edge === null || edge === void 0 ? void 0 : edge.node).filter(_utils.notEmpty).map(node => ({
62
+ id: node.id,
63
+ name: node.name,
64
+ isVariableFont: node.isVariableFont,
65
+ featureStyle: node.featureStyle ? {
66
+ supportedLanguages: node.featureStyle.supportedLanguages ?? null
67
+ } : null
68
+ }));
69
+ setFamilies(list);
70
+ }).catch(() => {
71
+ // allow a retry on the next open if the request failed
72
+ familiesRequested.current = false;
73
+ }).finally(() => setLoadingFamilies(false));
74
+ }, [environment]);
75
+ const setEntry = (0, _react.useCallback)((familyId, entry) => {
76
+ setFamilyStyles(prev => {
77
+ const next = new Map(prev);
78
+ next.set(familyId, entry);
79
+ return next;
80
+ });
81
+ }, []);
82
+ const loadFamilyStyles = (0, _react.useCallback)(familyId => {
83
+ if (!familyId || familyStylesRequested.current.has(familyId)) return;
84
+ familyStylesRequested.current.add(familyId);
85
+ setEntry(familyId, {
86
+ loading: true,
87
+ isVariableFont: false,
88
+ styles: null
89
+ });
90
+ (0, _reactRelay.fetchQuery)(environment, typeTesterFamiliesStylesQuery, {
91
+ familyId
92
+ }).toPromise().then(data => {
93
+ const node = data === null || data === void 0 ? void 0 : data.node;
94
+ const fontStyles = node && 'fontStyles' in node ? node.fontStyles : null;
95
+ const isVariableFont = node && 'isVariableFont' in node ? node.isVariableFont : false;
96
+ setEntry(familyId, {
97
+ loading: false,
98
+ isVariableFont: isVariableFont ?? false,
99
+ styles: (fontStyles ?? []).map(style => ({
100
+ id: style.id,
101
+ name: style.name,
102
+ cssWeight: style.cssWeight ?? null,
103
+ cssStyle: style.cssStyle ?? null,
104
+ cssStretch: style.cssStretch ?? null,
105
+ variableInstances: style.variableInstances ?? null
106
+ }))
107
+ });
108
+ }).catch(() => {
109
+ // allow a retry on the next open if the request failed
110
+ familyStylesRequested.current.delete(familyId);
111
+ setEntry(familyId, {
112
+ loading: false,
113
+ isVariableFont: false,
114
+ styles: null
115
+ });
116
+ });
117
+ }, [environment, setEntry]);
118
+ const getFamilyStyles = (0, _react.useCallback)(familyId => familyStyles.get(familyId), [familyStyles]);
119
+ return /*#__PURE__*/_react.default.createElement(TypeTesterFamiliesContext.Provider, {
120
+ value: {
121
+ families,
122
+ loadingFamilies,
123
+ loadFamilies,
124
+ getFamilyStyles,
125
+ loadFamilyStyles
126
+ }
127
+ }, children);
128
+ }
@@ -95,7 +95,6 @@ function TypeTesterStandaloneComponent(_ref) {
95
95
  }
96
96
  }, /*#__PURE__*/_react.default.createElement(_index.default, {
97
97
  id: "standalone",
98
- viewer: data.viewer,
99
98
  fontStyle: changedStyle ? changedStylesData.node : (_data$viewer = data.viewer) === null || _data$viewer === void 0 ? void 0 : _data$viewer.fontStyle,
100
99
  onStyleSelect: handleStyleSelect,
101
100
  axes: axes,
@@ -106,7 +105,7 @@ function TypeTesterStandaloneComponent(_ref) {
106
105
  onBlur: onBlur
107
106
  }));
108
107
  }
109
- const query = (_TypeTesterStandaloneQuery2.default.hash && _TypeTesterStandaloneQuery2.default.hash !== "57916b8e26a166271a80c5df1b3f68ec" && console.error("The definition of 'TypeTesterStandaloneQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesterStandaloneQuery2.default);
108
+ const query = (_TypeTesterStandaloneQuery2.default.hash && _TypeTesterStandaloneQuery2.default.hash !== "951214eacb2370ea3ca0b19bebe7fbe7" && console.error("The definition of 'TypeTesterStandaloneQuery' appears to have changed. Run `relay-compiler` to update the generated files to receive the expected data."), _TypeTesterStandaloneQuery2.default);
110
109
  function TypeTesterStandalonePreloadedQueryRenderer(_ref3) {
111
110
  let {
112
111
  preloadedQuery,
@@ -125,13 +124,9 @@ function TypeTesterStandalone(_ref4) {
125
124
  styleName,
126
125
  ...rest
127
126
  } = _ref4;
128
- const {
129
- typeTester: config
130
- } = (0, _react.useContext)(_ConfigContext.default);
131
127
  const data = (0, _reactRelay.useLazyLoadQuery)(query, {
132
128
  familyName,
133
- styleName,
134
- selectable: config.selectable
129
+ styleName
135
130
  });
136
131
  const fontStyle = (_data$viewer4 = data.viewer) === null || _data$viewer4 === void 0 ? void 0 : _data$viewer4.fontStyle;
137
132
  if (!fontStyle) {
@@ -18,8 +18,7 @@ async function TypeTesterStandalone(_ref) {
18
18
  } = _ref;
19
19
  const preloadedQuery = await (0, _loadSerializableQuery.default)(_TypeTesterStandaloneQuery.default, {
20
20
  familyName,
21
- styleName,
22
- selectable: true
21
+ styleName
23
22
  });
24
23
  return /*#__PURE__*/_react.default.createElement(_TypeTesterStandalone.TypeTesterStandalonePreloadedQueryRenderer, _extends({
25
24
  preloadedQuery: preloadedQuery
@@ -1,17 +1,27 @@
1
1
  import React from 'react';
2
2
  import { VariableInstance, VariableSettings } from '../../utils';
3
+ export interface SelectedFamily {
4
+ id: string;
5
+ name: string;
6
+ isVariableFont: boolean;
7
+ fontStyles: ReadonlyArray<{
8
+ id: string;
9
+ name: string;
10
+ variableInstances: ReadonlyArray<VariableInstance> | null;
11
+ }> | null;
12
+ }
3
13
  interface TypeTesterStyleSelectProps {
4
14
  families: {
5
15
  id: string;
6
16
  name: string;
7
- readonly fontStyles: ReadonlyArray<{
8
- id: string;
9
- name: string;
10
- variableInstances: ReadonlyArray<VariableInstance> | null;
11
- }> | null;
12
17
  }[];
18
+ selectedFamily: SelectedFamily | null;
19
+ familyValue: string | null;
13
20
  selectedFontStyleId: string;
14
21
  selectedVariableSettings: VariableSettings | null;
22
+ loadingFamilies?: boolean;
23
+ loading?: boolean;
24
+ onOpen?: () => void;
15
25
  onSelectFontStyleValue: (value: {
16
26
  fontStyleId: string;
17
27
  variableSettings?: VariableSettings;
@@ -9,36 +9,30 @@ var _utils = require("../../utils");
9
9
  var _Select = _interopRequireDefault(require("../Select"));
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
11
  const VARIABLE_AXES = 'VARIABLE_AXES';
12
+ const LOADING = '__loading__';
12
13
  const TypeTesterStyleSelect = _ref => {
13
- var _selectedFamily$fontS7;
14
+ var _selectedFamily$fontS4;
14
15
  let {
15
16
  families,
17
+ selectedFamily,
18
+ familyValue,
16
19
  selectedFontStyleId,
17
20
  selectedVariableSettings,
21
+ loadingFamilies,
22
+ loading,
23
+ onOpen,
18
24
  onSelectFontStyleValue,
19
25
  onSelectVariableAxes,
20
26
  onSelectFamilyId,
21
27
  includeVariableAxesOption
22
28
  } = _ref;
23
- const selectedFamily = families.find(family => family.fontStyles && family.fontStyles.some(_ref2 => {
24
- let {
25
- id
26
- } = _ref2;
27
- return id === selectedFontStyleId;
28
- }));
29
- const selectedFontStyle = selectedFamily && selectedFamily.fontStyles && selectedFamily.fontStyles.find(_ref3 => {
30
- let {
31
- id
32
- } = _ref3;
33
- return id === selectedFontStyleId;
34
- });
35
29
  const handleSelectFontStyle = selection => {
36
30
  if (selection === VARIABLE_AXES) {
37
31
  onSelectVariableAxes();
38
32
  } else if (selection.includes(':::')) {
39
33
  var _selectedFamily$fontS, _selectedFamily$fontS2, _selectedFamily$fontS3;
40
34
  const [fontStyleId, instanceName] = selection.split(':::');
41
- const instance = selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS = selectedFamily.fontStyles) === null || _selectedFamily$fontS === void 0 ? void 0 : (_selectedFamily$fontS2 = _selectedFamily$fontS.find(style => style.id === fontStyleId)) === null || _selectedFamily$fontS2 === void 0 ? void 0 : (_selectedFamily$fontS3 = _selectedFamily$fontS2.variableInstances) === null || _selectedFamily$fontS3 === void 0 ? void 0 : _selectedFamily$fontS3.find(instance => instance.name === instanceName);
35
+ const instance = selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS = selectedFamily.fontStyles) === null || _selectedFamily$fontS === void 0 ? void 0 : (_selectedFamily$fontS2 = _selectedFamily$fontS.find(style => style.id === fontStyleId)) === null || _selectedFamily$fontS2 === void 0 ? void 0 : (_selectedFamily$fontS3 = _selectedFamily$fontS2.variableInstances) === null || _selectedFamily$fontS3 === void 0 ? void 0 : _selectedFamily$fontS3.find(inst => inst.name === instanceName);
42
36
  let variableSettings;
43
37
  if (instance) variableSettings = (0, _utils.variableInstanceSettings)(instance);
44
38
  onSelectFontStyleValue({
@@ -51,25 +45,28 @@ const TypeTesterStyleSelect = _ref => {
51
45
  });
52
46
  }
53
47
  };
54
- if (!selectedFamily || !selectedFontStyle) return null;
55
- let value = selectedFontStyleId;
56
- if (selectedVariableSettings) {
57
- var _selectedFamily$fontS4, _selectedFamily$fontS5, _selectedFamily$fontS6;
58
- const instance = selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS4 = selectedFamily.fontStyles) === null || _selectedFamily$fontS4 === void 0 ? void 0 : (_selectedFamily$fontS5 = _selectedFamily$fontS4.find(style => style.id === value)) === null || _selectedFamily$fontS5 === void 0 ? void 0 : (_selectedFamily$fontS6 = _selectedFamily$fontS5.variableInstances) === null || _selectedFamily$fontS6 === void 0 ? void 0 : _selectedFamily$fontS6.find(instance => (0, _utils.compareVariableSettings)(instance, selectedVariableSettings));
59
- if (instance) {
60
- value = `${value}:::${instance.name}`;
61
- } else {
62
- value = null;
63
- }
64
- }
48
+ const familyOptions = families.map(_ref2 => {
49
+ let {
50
+ id,
51
+ name
52
+ } = _ref2;
53
+ return {
54
+ value: id,
55
+ text: name
56
+ };
57
+ });
58
+ if (loadingFamilies) familyOptions.push({
59
+ value: LOADING,
60
+ text: 'Loading…'
61
+ });
65
62
  let isVariable = false;
66
- let options = selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS7 = selectedFamily.fontStyles) === null || _selectedFamily$fontS7 === void 0 ? void 0 : _selectedFamily$fontS7.flatMap(_ref4 => {
63
+ const styleOptions = (selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS4 = selectedFamily.fontStyles) === null || _selectedFamily$fontS4 === void 0 ? void 0 : _selectedFamily$fontS4.flatMap(_ref3 => {
67
64
  let {
68
65
  id,
69
66
  name,
70
67
  variableInstances
71
- } = _ref4;
72
- if (variableInstances && (variableInstances === null || variableInstances === void 0 ? void 0 : variableInstances.length) > 0) {
68
+ } = _ref3;
69
+ if (variableInstances && variableInstances.length > 0) {
73
70
  isVariable = true;
74
71
  return variableInstances.map(instance => ({
75
72
  value: `${id}:::${instance.name}`,
@@ -80,34 +77,47 @@ const TypeTesterStyleSelect = _ref => {
80
77
  value: id,
81
78
  text: name
82
79
  }];
83
- });
80
+ })) ?? [];
84
81
  if (isVariable && includeVariableAxesOption) {
85
- options === null || options === void 0 ? void 0 : options.push({
82
+ styleOptions.push({
86
83
  value: VARIABLE_AXES,
87
84
  text: 'Variable axes...'
88
85
  });
89
86
  }
87
+ let styleValue = selectedFontStyleId;
88
+ if (selectedVariableSettings) {
89
+ var _selectedFamily$fontS5, _selectedFamily$fontS6, _selectedFamily$fontS7;
90
+ const instance = selectedFamily === null || selectedFamily === void 0 ? void 0 : (_selectedFamily$fontS5 = selectedFamily.fontStyles) === null || _selectedFamily$fontS5 === void 0 ? void 0 : (_selectedFamily$fontS6 = _selectedFamily$fontS5.find(style => style.id === selectedFontStyleId)) === null || _selectedFamily$fontS6 === void 0 ? void 0 : (_selectedFamily$fontS7 = _selectedFamily$fontS6.variableInstances) === null || _selectedFamily$fontS7 === void 0 ? void 0 : _selectedFamily$fontS7.find(inst => (0, _utils.compareVariableSettings)(inst, selectedVariableSettings));
91
+ styleValue = instance ? `${selectedFontStyleId}:::${instance.name}` : null;
92
+ }
93
+
94
+ // Ignore the synthetic "Loading…" placeholder if it is somehow selected.
95
+ const ignoreLoading = cb => e => {
96
+ if (e.target.value === LOADING) return;
97
+ cb(e.target.value);
98
+ };
90
99
  return /*#__PURE__*/_react.default.createElement("div", {
91
- className: "type-tester-select"
100
+ className: "type-tester-select",
101
+ "data-loading": loading || undefined,
102
+ "aria-busy": loading || undefined,
103
+ style: {
104
+ opacity: loading ? 0.6 : 1,
105
+ transition: 'opacity 120ms ease'
106
+ }
92
107
  }, /*#__PURE__*/_react.default.createElement(_Select.default, {
93
- options: families.map(_ref5 => {
94
- let {
95
- id,
96
- name
97
- } = _ref5;
98
- return {
99
- value: id,
100
- text: name
101
- };
102
- }),
103
- value: selectedFamily.id,
104
- onChange: e => onSelectFamilyId(e.target.value),
108
+ options: familyOptions,
109
+ value: familyValue,
110
+ onChange: ignoreLoading(onSelectFamilyId),
111
+ onMouseDown: () => onOpen === null || onOpen === void 0 ? void 0 : onOpen(),
112
+ onFocus: () => onOpen === null || onOpen === void 0 ? void 0 : onOpen(),
105
113
  onClick: e => e.stopPropagation()
106
- }), options && /*#__PURE__*/_react.default.createElement(_Select.default, {
107
- options: options,
108
- value: value,
114
+ }), styleOptions.length > 0 && /*#__PURE__*/_react.default.createElement(_Select.default, {
115
+ options: styleOptions,
116
+ value: styleValue,
109
117
  nullText: "Custom",
110
- onChange: e => handleSelectFontStyle(e.target.value),
118
+ onChange: ignoreLoading(handleSelectFontStyle),
119
+ onMouseDown: () => onOpen === null || onOpen === void 0 ? void 0 : onOpen(),
120
+ onFocus: () => onOpen === null || onOpen === void 0 ? void 0 : onOpen(),
111
121
  onClick: e => e.stopPropagation()
112
122
  }));
113
123
  };
@@ -1,11 +1,9 @@
1
1
  import React from 'react';
2
2
  import { VariableSettings } from '../../utils';
3
3
  import { TypeTesterStyleSelectData_fontStyle$key } from '../../__generated__/TypeTesterStyleSelectData_fontStyle.graphql';
4
- import { TypeTesterStyleSelectData_viewer$key } from '../../__generated__/TypeTesterStyleSelectData_viewer.graphql';
5
4
  import { TypeTesterConfig } from '.';
6
5
  interface TypeTesterStyleSelectDataProps {
7
6
  fontStyle: TypeTesterStyleSelectData_fontStyle$key;
8
- viewer: TypeTesterStyleSelectData_viewer$key | null;
9
7
  variableSettings: VariableSettings | null;
10
8
  onSelectFontStyleValue: (value: {
11
9
  fontStyleId: string;
@@ -15,5 +13,5 @@ interface TypeTesterStyleSelectDataProps {
15
13
  config: TypeTesterConfig;
16
14
  includeVariableAxesOption: boolean;
17
15
  }
18
- export default function TypeTesterStyleSelectData({ fontStyle: fontStyleKey, viewer: viewerKey, onSelectFontStyleValue, onSelectVariableAxes, config, variableSettings, includeVariableAxesOption, }: TypeTesterStyleSelectDataProps): React.JSX.Element | null;
16
+ export default function TypeTesterStyleSelectData({ fontStyle: fontStyleKey, onSelectFontStyleValue, onSelectVariableAxes, config, variableSettings, includeVariableAxesOption, }: TypeTesterStyleSelectDataProps): React.JSX.Element;
19
17
  export {};