@fringeworks/react-defer-rendering 0.8.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 (189) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja.md +319 -0
  3. package/README.md +319 -0
  4. package/_usePromiseState.cjs +42 -0
  5. package/_usePromiseState.d.cts +11 -0
  6. package/_usePromiseState.d.mts +12 -0
  7. package/_usePromiseState.mjs +40 -0
  8. package/_virtual/_rolldown/runtime.cjs +29 -0
  9. package/constants.cjs +14 -0
  10. package/constants.d.cts +15 -0
  11. package/constants.d.mts +15 -0
  12. package/constants.mjs +12 -0
  13. package/index.cjs +46 -0
  14. package/index.d.cts +31 -0
  15. package/index.d.mts +31 -0
  16. package/index.mjs +32 -0
  17. package/package.json +91 -0
  18. package/types.cjs +0 -0
  19. package/types.d.cts +82 -0
  20. package/types.d.mts +82 -0
  21. package/types.mjs +1 -0
  22. package/useDeferUntilAsyncComplete/index.cjs +5 -0
  23. package/useDeferUntilAsyncComplete/index.d.cts +3 -0
  24. package/useDeferUntilAsyncComplete/index.d.mts +3 -0
  25. package/useDeferUntilAsyncComplete/index.mjs +5 -0
  26. package/useDeferUntilAsyncComplete/types.cjs +0 -0
  27. package/useDeferUntilAsyncComplete/types.d.cts +7 -0
  28. package/useDeferUntilAsyncComplete/types.d.mts +7 -0
  29. package/useDeferUntilAsyncComplete/types.mjs +1 -0
  30. package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.cjs +20 -0
  31. package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.d.cts +14 -0
  32. package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.d.mts +15 -0
  33. package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.mjs +20 -0
  34. package/useDeferUntilBreakpoint/index.cjs +5 -0
  35. package/useDeferUntilBreakpoint/index.d.cts +3 -0
  36. package/useDeferUntilBreakpoint/index.d.mts +3 -0
  37. package/useDeferUntilBreakpoint/index.mjs +5 -0
  38. package/useDeferUntilBreakpoint/types.cjs +0 -0
  39. package/useDeferUntilBreakpoint/types.d.cts +20 -0
  40. package/useDeferUntilBreakpoint/types.d.mts +20 -0
  41. package/useDeferUntilBreakpoint/types.mjs +1 -0
  42. package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.cjs +44 -0
  43. package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.d.cts +14 -0
  44. package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.d.mts +15 -0
  45. package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.mjs +42 -0
  46. package/useDeferUntilCallThreshold/index.cjs +5 -0
  47. package/useDeferUntilCallThreshold/index.d.cts +3 -0
  48. package/useDeferUntilCallThreshold/index.d.mts +3 -0
  49. package/useDeferUntilCallThreshold/index.mjs +5 -0
  50. package/useDeferUntilCallThreshold/types.cjs +0 -0
  51. package/useDeferUntilCallThreshold/types.d.cts +23 -0
  52. package/useDeferUntilCallThreshold/types.d.mts +23 -0
  53. package/useDeferUntilCallThreshold/types.mjs +1 -0
  54. package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.cjs +55 -0
  55. package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.d.cts +13 -0
  56. package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.d.mts +14 -0
  57. package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.mjs +55 -0
  58. package/useDeferUntilChange/index.cjs +5 -0
  59. package/useDeferUntilChange/index.d.cts +3 -0
  60. package/useDeferUntilChange/index.d.mts +3 -0
  61. package/useDeferUntilChange/index.mjs +5 -0
  62. package/useDeferUntilChange/types.cjs +0 -0
  63. package/useDeferUntilChange/types.d.cts +7 -0
  64. package/useDeferUntilChange/types.d.mts +7 -0
  65. package/useDeferUntilChange/types.mjs +1 -0
  66. package/useDeferUntilChange/useDeferUntilChange.cjs +30 -0
  67. package/useDeferUntilChange/useDeferUntilChange.d.cts +14 -0
  68. package/useDeferUntilChange/useDeferUntilChange.d.mts +15 -0
  69. package/useDeferUntilChange/useDeferUntilChange.mjs +28 -0
  70. package/useDeferUntilDate/index.cjs +5 -0
  71. package/useDeferUntilDate/index.d.cts +3 -0
  72. package/useDeferUntilDate/index.d.mts +3 -0
  73. package/useDeferUntilDate/index.mjs +5 -0
  74. package/useDeferUntilDate/types.cjs +0 -0
  75. package/useDeferUntilDate/types.d.cts +7 -0
  76. package/useDeferUntilDate/types.d.mts +7 -0
  77. package/useDeferUntilDate/types.mjs +1 -0
  78. package/useDeferUntilDate/useDeferUntilDate.cjs +21 -0
  79. package/useDeferUntilDate/useDeferUntilDate.d.cts +14 -0
  80. package/useDeferUntilDate/useDeferUntilDate.d.mts +15 -0
  81. package/useDeferUntilDate/useDeferUntilDate.mjs +21 -0
  82. package/useDeferUntilIntersected/index.cjs +5 -0
  83. package/useDeferUntilIntersected/index.d.cts +3 -0
  84. package/useDeferUntilIntersected/index.d.mts +3 -0
  85. package/useDeferUntilIntersected/index.mjs +5 -0
  86. package/useDeferUntilIntersected/types.cjs +0 -0
  87. package/useDeferUntilIntersected/types.d.cts +31 -0
  88. package/useDeferUntilIntersected/types.d.mts +31 -0
  89. package/useDeferUntilIntersected/types.mjs +1 -0
  90. package/useDeferUntilIntersected/useDeferUntilIntersected.cjs +60 -0
  91. package/useDeferUntilIntersected/useDeferUntilIntersected.d.cts +14 -0
  92. package/useDeferUntilIntersected/useDeferUntilIntersected.d.mts +15 -0
  93. package/useDeferUntilIntersected/useDeferUntilIntersected.mjs +58 -0
  94. package/useDeferUntilOnReady/index.cjs +5 -0
  95. package/useDeferUntilOnReady/index.d.cts +3 -0
  96. package/useDeferUntilOnReady/index.d.mts +3 -0
  97. package/useDeferUntilOnReady/index.mjs +5 -0
  98. package/useDeferUntilOnReady/types.cjs +0 -0
  99. package/useDeferUntilOnReady/types.d.cts +23 -0
  100. package/useDeferUntilOnReady/types.d.mts +23 -0
  101. package/useDeferUntilOnReady/types.mjs +1 -0
  102. package/useDeferUntilOnReady/useDeferUntilOnReady.cjs +42 -0
  103. package/useDeferUntilOnReady/useDeferUntilOnReady.d.cts +13 -0
  104. package/useDeferUntilOnReady/useDeferUntilOnReady.d.mts +14 -0
  105. package/useDeferUntilOnReady/useDeferUntilOnReady.mjs +40 -0
  106. package/useDeferUntilReady/index.cjs +5 -0
  107. package/useDeferUntilReady/index.d.cts +3 -0
  108. package/useDeferUntilReady/index.d.mts +3 -0
  109. package/useDeferUntilReady/index.mjs +5 -0
  110. package/useDeferUntilReady/types.cjs +0 -0
  111. package/useDeferUntilReady/types.d.cts +7 -0
  112. package/useDeferUntilReady/types.d.mts +7 -0
  113. package/useDeferUntilReady/types.mjs +1 -0
  114. package/useDeferUntilReady/useDeferUntilReady.cjs +60 -0
  115. package/useDeferUntilReady/useDeferUntilReady.d.cts +15 -0
  116. package/useDeferUntilReady/useDeferUntilReady.d.mts +16 -0
  117. package/useDeferUntilReady/useDeferUntilReady.mjs +58 -0
  118. package/useDeferUntilRender/index.cjs +5 -0
  119. package/useDeferUntilRender/index.d.cts +3 -0
  120. package/useDeferUntilRender/index.d.mts +3 -0
  121. package/useDeferUntilRender/index.mjs +5 -0
  122. package/useDeferUntilRender/types.cjs +0 -0
  123. package/useDeferUntilRender/types.d.cts +25 -0
  124. package/useDeferUntilRender/types.d.mts +25 -0
  125. package/useDeferUntilRender/types.mjs +1 -0
  126. package/useDeferUntilRender/useDeferUntilRender.cjs +53 -0
  127. package/useDeferUntilRender/useDeferUntilRender.d.cts +14 -0
  128. package/useDeferUntilRender/useDeferUntilRender.d.mts +15 -0
  129. package/useDeferUntilRender/useDeferUntilRender.mjs +51 -0
  130. package/useDeferUntilResolved/index.cjs +5 -0
  131. package/useDeferUntilResolved/index.d.cts +3 -0
  132. package/useDeferUntilResolved/index.d.mts +3 -0
  133. package/useDeferUntilResolved/index.mjs +5 -0
  134. package/useDeferUntilResolved/types.cjs +0 -0
  135. package/useDeferUntilResolved/types.d.cts +7 -0
  136. package/useDeferUntilResolved/types.d.mts +7 -0
  137. package/useDeferUntilResolved/types.mjs +1 -0
  138. package/useDeferUntilResolved/useDeferUntilResolved.cjs +21 -0
  139. package/useDeferUntilResolved/useDeferUntilResolved.d.cts +14 -0
  140. package/useDeferUntilResolved/useDeferUntilResolved.d.mts +15 -0
  141. package/useDeferUntilResolved/useDeferUntilResolved.mjs +21 -0
  142. package/useDeferUntilScrolled/index.cjs +5 -0
  143. package/useDeferUntilScrolled/index.d.cts +3 -0
  144. package/useDeferUntilScrolled/index.d.mts +3 -0
  145. package/useDeferUntilScrolled/index.mjs +5 -0
  146. package/useDeferUntilScrolled/types.cjs +0 -0
  147. package/useDeferUntilScrolled/types.d.cts +29 -0
  148. package/useDeferUntilScrolled/types.d.mts +29 -0
  149. package/useDeferUntilScrolled/types.mjs +1 -0
  150. package/useDeferUntilScrolled/useDeferUntilScrolled.cjs +94 -0
  151. package/useDeferUntilScrolled/useDeferUntilScrolled.d.cts +14 -0
  152. package/useDeferUntilScrolled/useDeferUntilScrolled.d.mts +15 -0
  153. package/useDeferUntilScrolled/useDeferUntilScrolled.mjs +91 -0
  154. package/useDeferUntilTimeout/index.cjs +5 -0
  155. package/useDeferUntilTimeout/index.d.cts +3 -0
  156. package/useDeferUntilTimeout/index.d.mts +3 -0
  157. package/useDeferUntilTimeout/index.mjs +5 -0
  158. package/useDeferUntilTimeout/types.cjs +0 -0
  159. package/useDeferUntilTimeout/types.d.cts +7 -0
  160. package/useDeferUntilTimeout/types.d.mts +7 -0
  161. package/useDeferUntilTimeout/types.mjs +1 -0
  162. package/useDeferUntilTimeout/useDeferUntilTimeout.cjs +40 -0
  163. package/useDeferUntilTimeout/useDeferUntilTimeout.d.cts +14 -0
  164. package/useDeferUntilTimeout/useDeferUntilTimeout.d.mts +15 -0
  165. package/useDeferUntilTimeout/useDeferUntilTimeout.mjs +37 -0
  166. package/useDeferUntilTrue/index.cjs +5 -0
  167. package/useDeferUntilTrue/index.d.cts +3 -0
  168. package/useDeferUntilTrue/index.d.mts +3 -0
  169. package/useDeferUntilTrue/index.mjs +5 -0
  170. package/useDeferUntilTrue/types.cjs +0 -0
  171. package/useDeferUntilTrue/types.d.cts +7 -0
  172. package/useDeferUntilTrue/types.d.mts +7 -0
  173. package/useDeferUntilTrue/types.mjs +1 -0
  174. package/useDeferUntilTrue/useDeferUntilTrue.cjs +20 -0
  175. package/useDeferUntilTrue/useDeferUntilTrue.d.cts +14 -0
  176. package/useDeferUntilTrue/useDeferUntilTrue.d.mts +15 -0
  177. package/useDeferUntilTrue/useDeferUntilTrue.mjs +20 -0
  178. package/useDeferUntilWebFontReady/index.cjs +5 -0
  179. package/useDeferUntilWebFontReady/index.d.cts +3 -0
  180. package/useDeferUntilWebFontReady/index.d.mts +3 -0
  181. package/useDeferUntilWebFontReady/index.mjs +5 -0
  182. package/useDeferUntilWebFontReady/types.cjs +0 -0
  183. package/useDeferUntilWebFontReady/types.d.cts +49 -0
  184. package/useDeferUntilWebFontReady/types.d.mts +49 -0
  185. package/useDeferUntilWebFontReady/types.mjs +1 -0
  186. package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.cjs +93 -0
  187. package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.cts +16 -0
  188. package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.mts +17 -0
  189. package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.mjs +90 -0
@@ -0,0 +1,93 @@
1
+ 'use client';
2
+
3
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
4
+ const require_constants = require('../constants.cjs');
5
+ const require_useDeferUntilReady_useDeferUntilReady = require('../useDeferUntilReady/useDeferUntilReady.cjs');
6
+ require('../useDeferUntilReady/index.cjs');
7
+ let react = require("react");
8
+ let _fringeworks_web_font_observer_isWebFontLoaded = require("@fringeworks/web-font-observer/isWebFontLoaded");
9
+ _fringeworks_web_font_observer_isWebFontLoaded = require_runtime.__toESM(_fringeworks_web_font_observer_isWebFontLoaded, 1);
10
+ let _fringeworks_web_font_observer_waitForWebFont = require("@fringeworks/web-font-observer/waitForWebFont");
11
+ _fringeworks_web_font_observer_waitForWebFont = require_runtime.__toESM(_fringeworks_web_font_observer_waitForWebFont, 1);
12
+
13
+ //#region src/useDeferUntilWebFontReady/useDeferUntilWebFontReady.tsx
14
+ /**
15
+ * 指定のWebフォントがすべて利用可能になるまで描画を遅延させるhook\
16
+ * 対象は`@font-face`で定義されたWebフォントで、システムフォントを指定した場合はタイムアウト後に'fallback'になる\
17
+ * `@font-face`の定義は遅延対象のノードの外に置くこと(遅延対象の中にあると定義が登録されず、タイムアウトまで待つことになる)
18
+ * @param target 描画対象のノード
19
+ * @param fonts 待つWebフォント。複数の場合は配列(null/undefined/空文字/空配列の場合は待たずに描画する)
20
+ * @param options オプション
21
+ * @returns state('pending', 'ready', 'fallback')と状態に応じたノード
22
+ */
23
+ function useDeferUntilWebFontReady(target, fonts, options = {}) {
24
+ const { timeout, loader, initialState = require_constants.RenderingState.pending, ...opts } = options;
25
+ const normalizedFonts = normalizeFonts(fonts);
26
+ const fontsKey = JSON.stringify(normalizedFonts);
27
+ const webFonts = (0, react.useMemo)(() => normalizedFonts, [fontsKey]);
28
+ const loaderRef = (0, react.useRef)(loader);
29
+ loaderRef.current = loader;
30
+ const [result, setResult] = (0, react.useState)(() => ({
31
+ key: fontsKey,
32
+ state: initialState
33
+ }));
34
+ const isLoaded = (0, react.useSyncExternalStore)((0, react.useCallback)((onStoreChange) => {
35
+ const fontFaceSet = typeof document === "undefined" ? void 0 : document.fonts;
36
+ if (webFonts.length === 0 || !fontFaceSet) return () => {};
37
+ fontFaceSet.addEventListener("loadingdone", onStoreChange);
38
+ return () => {
39
+ fontFaceSet.removeEventListener("loadingdone", onStoreChange);
40
+ };
41
+ }, [webFonts]), (0, react.useCallback)(() => webFonts.every(({ family, ...rest }) => (0, _fringeworks_web_font_observer_isWebFontLoaded.default)(family, rest)), [webFonts]), (0, react.useCallback)(() => webFonts.length === 0, [webFonts]));
42
+ (0, react.useEffect)(() => {
43
+ if (webFonts.length === 0) return;
44
+ const controller = new AbortController();
45
+ const { signal } = controller;
46
+ const update = (state) => {
47
+ if (!signal.aborted) setResult({
48
+ key: fontsKey,
49
+ state
50
+ });
51
+ };
52
+ const waitForWebFonts = () => Promise.all(webFonts.map(({ family, ...rest }) => (0, _fringeworks_web_font_observer_waitForWebFont.default)(family, {
53
+ ...rest,
54
+ timeout,
55
+ signal
56
+ })));
57
+ const loader = loaderRef.current;
58
+ (loader ? loader(signal).then(() => signal.aborted ? [] : waitForWebFonts()) : waitForWebFonts()).then(() => update(require_constants.RenderingState.ready), () => {
59
+ update(require_constants.RenderingState.fallback);
60
+ controller.abort();
61
+ });
62
+ return () => {
63
+ controller.abort();
64
+ };
65
+ }, [webFonts, timeout]);
66
+ let state;
67
+ if (isLoaded) state = require_constants.RenderingState.ready;
68
+ else if (result.key === fontsKey) state = result.state;
69
+ else state = require_constants.RenderingState.pending;
70
+ return require_useDeferUntilReady_useDeferUntilReady(target, state, opts);
71
+ }
72
+ /**
73
+ * 待つWebフォントの指定を、比較可能な形の配列に正規化する
74
+ * @param fonts 待つWebフォントの指定
75
+ * @returns 正規化されたWebフォントの配列
76
+ */
77
+ function normalizeFonts(fonts) {
78
+ return (Array.isArray(fonts) ? fonts : [fonts]).flatMap((font) => {
79
+ if (!font) return [];
80
+ if (typeof font === "string") return [{ family: font }];
81
+ const { family, weight, style, width, text } = font;
82
+ return family ? [{
83
+ family,
84
+ weight,
85
+ style,
86
+ width,
87
+ text
88
+ }] : [];
89
+ });
90
+ }
91
+
92
+ //#endregion
93
+ module.exports = useDeferUntilWebFontReady;
@@ -0,0 +1,16 @@
1
+ import { DeferRenderingResult } from "../types.cjs";
2
+ import { UseDeferUntilWebFontReadyOptions, WebFontTargets } from "./types.cjs";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.ts
6
+ /**
7
+ * 指定のWebフォントがすべて利用可能になるまで描画を遅延させるhook\
8
+ * 対象は`@font-face`で定義されたWebフォントで、システムフォントを指定した場合はタイムアウト後に'fallback'になる\
9
+ * `@font-face`の定義は遅延対象のノードの外に置くこと(遅延対象の中にあると定義が登録されず、タイムアウトまで待つことになる)
10
+ * @param target 描画対象のノード
11
+ * @param fonts 待つWebフォント。複数の場合は配列(null/undefined/空文字/空配列の場合は待たずに描画する)
12
+ * @param options オプション
13
+ * @returns state('pending', 'ready', 'fallback')と状態に応じたノード
14
+ */
15
+ declare function useDeferUntilWebFontReady<T extends ReactNode, P extends ReactNode = ReactNode, E extends ReactNode = ReactNode>(target: T, fonts: WebFontTargets | null | undefined, options?: UseDeferUntilWebFontReadyOptions<P, E>): DeferRenderingResult<T | P | E>;
16
+ export = useDeferUntilWebFontReady;
@@ -0,0 +1,17 @@
1
+ import { DeferRenderingResult } from "../types.mjs";
2
+ import { UseDeferUntilWebFontReadyOptions, WebFontTargets } from "./types.mjs";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.ts
6
+ /**
7
+ * 指定のWebフォントがすべて利用可能になるまで描画を遅延させるhook\
8
+ * 対象は`@font-face`で定義されたWebフォントで、システムフォントを指定した場合はタイムアウト後に'fallback'になる\
9
+ * `@font-face`の定義は遅延対象のノードの外に置くこと(遅延対象の中にあると定義が登録されず、タイムアウトまで待つことになる)
10
+ * @param target 描画対象のノード
11
+ * @param fonts 待つWebフォント。複数の場合は配列(null/undefined/空文字/空配列の場合は待たずに描画する)
12
+ * @param options オプション
13
+ * @returns state('pending', 'ready', 'fallback')と状態に応じたノード
14
+ */
15
+ declare function useDeferUntilWebFontReady<T extends ReactNode, P extends ReactNode = ReactNode, E extends ReactNode = ReactNode>(target: T, fonts: WebFontTargets | null | undefined, options?: UseDeferUntilWebFontReadyOptions<P, E>): DeferRenderingResult<T | P | E>;
16
+ //#endregion
17
+ export { useDeferUntilWebFontReady as default };
@@ -0,0 +1,90 @@
1
+ 'use client';
2
+
3
+ import { RenderingState } from "../constants.mjs";
4
+ import useDeferUntilReady from "../useDeferUntilReady/useDeferUntilReady.mjs";
5
+ import "../useDeferUntilReady/index.mjs";
6
+ import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
7
+ import isWebFontLoaded from "@fringeworks/web-font-observer/isWebFontLoaded";
8
+ import waitForWebFont from "@fringeworks/web-font-observer/waitForWebFont";
9
+
10
+ //#region src/useDeferUntilWebFontReady/useDeferUntilWebFontReady.tsx
11
+ /**
12
+ * 指定のWebフォントがすべて利用可能になるまで描画を遅延させるhook\
13
+ * 対象は`@font-face`で定義されたWebフォントで、システムフォントを指定した場合はタイムアウト後に'fallback'になる\
14
+ * `@font-face`の定義は遅延対象のノードの外に置くこと(遅延対象の中にあると定義が登録されず、タイムアウトまで待つことになる)
15
+ * @param target 描画対象のノード
16
+ * @param fonts 待つWebフォント。複数の場合は配列(null/undefined/空文字/空配列の場合は待たずに描画する)
17
+ * @param options オプション
18
+ * @returns state('pending', 'ready', 'fallback')と状態に応じたノード
19
+ */
20
+ function useDeferUntilWebFontReady(target, fonts, options = {}) {
21
+ const { timeout, loader, initialState = RenderingState.pending, ...opts } = options;
22
+ const normalizedFonts = normalizeFonts(fonts);
23
+ const fontsKey = JSON.stringify(normalizedFonts);
24
+ const webFonts = useMemo(() => normalizedFonts, [fontsKey]);
25
+ const loaderRef = useRef(loader);
26
+ loaderRef.current = loader;
27
+ const [result, setResult] = useState(() => ({
28
+ key: fontsKey,
29
+ state: initialState
30
+ }));
31
+ const isLoaded = useSyncExternalStore(useCallback((onStoreChange) => {
32
+ const fontFaceSet = typeof document === "undefined" ? void 0 : document.fonts;
33
+ if (webFonts.length === 0 || !fontFaceSet) return () => {};
34
+ fontFaceSet.addEventListener("loadingdone", onStoreChange);
35
+ return () => {
36
+ fontFaceSet.removeEventListener("loadingdone", onStoreChange);
37
+ };
38
+ }, [webFonts]), useCallback(() => webFonts.every(({ family, ...rest }) => isWebFontLoaded(family, rest)), [webFonts]), useCallback(() => webFonts.length === 0, [webFonts]));
39
+ useEffect(() => {
40
+ if (webFonts.length === 0) return;
41
+ const controller = new AbortController();
42
+ const { signal } = controller;
43
+ const update = (state) => {
44
+ if (!signal.aborted) setResult({
45
+ key: fontsKey,
46
+ state
47
+ });
48
+ };
49
+ const waitForWebFonts = () => Promise.all(webFonts.map(({ family, ...rest }) => waitForWebFont(family, {
50
+ ...rest,
51
+ timeout,
52
+ signal
53
+ })));
54
+ const loader = loaderRef.current;
55
+ (loader ? loader(signal).then(() => signal.aborted ? [] : waitForWebFonts()) : waitForWebFonts()).then(() => update(RenderingState.ready), () => {
56
+ update(RenderingState.fallback);
57
+ controller.abort();
58
+ });
59
+ return () => {
60
+ controller.abort();
61
+ };
62
+ }, [webFonts, timeout]);
63
+ let state;
64
+ if (isLoaded) state = RenderingState.ready;
65
+ else if (result.key === fontsKey) state = result.state;
66
+ else state = RenderingState.pending;
67
+ return useDeferUntilReady(target, state, opts);
68
+ }
69
+ /**
70
+ * 待つWebフォントの指定を、比較可能な形の配列に正規化する
71
+ * @param fonts 待つWebフォントの指定
72
+ * @returns 正規化されたWebフォントの配列
73
+ */
74
+ function normalizeFonts(fonts) {
75
+ return (Array.isArray(fonts) ? fonts : [fonts]).flatMap((font) => {
76
+ if (!font) return [];
77
+ if (typeof font === "string") return [{ family: font }];
78
+ const { family, weight, style, width, text } = font;
79
+ return family ? [{
80
+ family,
81
+ weight,
82
+ style,
83
+ width,
84
+ text
85
+ }] : [];
86
+ });
87
+ }
88
+
89
+ //#endregion
90
+ export { useDeferUntilWebFontReady as default };