@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.
- package/LICENSE +21 -0
- package/README.ja.md +319 -0
- package/README.md +319 -0
- package/_usePromiseState.cjs +42 -0
- package/_usePromiseState.d.cts +11 -0
- package/_usePromiseState.d.mts +12 -0
- package/_usePromiseState.mjs +40 -0
- package/_virtual/_rolldown/runtime.cjs +29 -0
- package/constants.cjs +14 -0
- package/constants.d.cts +15 -0
- package/constants.d.mts +15 -0
- package/constants.mjs +12 -0
- package/index.cjs +46 -0
- package/index.d.cts +31 -0
- package/index.d.mts +31 -0
- package/index.mjs +32 -0
- package/package.json +91 -0
- package/types.cjs +0 -0
- package/types.d.cts +82 -0
- package/types.d.mts +82 -0
- package/types.mjs +1 -0
- package/useDeferUntilAsyncComplete/index.cjs +5 -0
- package/useDeferUntilAsyncComplete/index.d.cts +3 -0
- package/useDeferUntilAsyncComplete/index.d.mts +3 -0
- package/useDeferUntilAsyncComplete/index.mjs +5 -0
- package/useDeferUntilAsyncComplete/types.cjs +0 -0
- package/useDeferUntilAsyncComplete/types.d.cts +7 -0
- package/useDeferUntilAsyncComplete/types.d.mts +7 -0
- package/useDeferUntilAsyncComplete/types.mjs +1 -0
- package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.cjs +20 -0
- package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.d.cts +14 -0
- package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.d.mts +15 -0
- package/useDeferUntilAsyncComplete/useDeferUntilAsyncComplete.mjs +20 -0
- package/useDeferUntilBreakpoint/index.cjs +5 -0
- package/useDeferUntilBreakpoint/index.d.cts +3 -0
- package/useDeferUntilBreakpoint/index.d.mts +3 -0
- package/useDeferUntilBreakpoint/index.mjs +5 -0
- package/useDeferUntilBreakpoint/types.cjs +0 -0
- package/useDeferUntilBreakpoint/types.d.cts +20 -0
- package/useDeferUntilBreakpoint/types.d.mts +20 -0
- package/useDeferUntilBreakpoint/types.mjs +1 -0
- package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.cjs +44 -0
- package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.d.cts +14 -0
- package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.d.mts +15 -0
- package/useDeferUntilBreakpoint/useDeferUntilBreakpoint.mjs +42 -0
- package/useDeferUntilCallThreshold/index.cjs +5 -0
- package/useDeferUntilCallThreshold/index.d.cts +3 -0
- package/useDeferUntilCallThreshold/index.d.mts +3 -0
- package/useDeferUntilCallThreshold/index.mjs +5 -0
- package/useDeferUntilCallThreshold/types.cjs +0 -0
- package/useDeferUntilCallThreshold/types.d.cts +23 -0
- package/useDeferUntilCallThreshold/types.d.mts +23 -0
- package/useDeferUntilCallThreshold/types.mjs +1 -0
- package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.cjs +55 -0
- package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.d.cts +13 -0
- package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.d.mts +14 -0
- package/useDeferUntilCallThreshold/useDeferUntilCallThreshold.mjs +55 -0
- package/useDeferUntilChange/index.cjs +5 -0
- package/useDeferUntilChange/index.d.cts +3 -0
- package/useDeferUntilChange/index.d.mts +3 -0
- package/useDeferUntilChange/index.mjs +5 -0
- package/useDeferUntilChange/types.cjs +0 -0
- package/useDeferUntilChange/types.d.cts +7 -0
- package/useDeferUntilChange/types.d.mts +7 -0
- package/useDeferUntilChange/types.mjs +1 -0
- package/useDeferUntilChange/useDeferUntilChange.cjs +30 -0
- package/useDeferUntilChange/useDeferUntilChange.d.cts +14 -0
- package/useDeferUntilChange/useDeferUntilChange.d.mts +15 -0
- package/useDeferUntilChange/useDeferUntilChange.mjs +28 -0
- package/useDeferUntilDate/index.cjs +5 -0
- package/useDeferUntilDate/index.d.cts +3 -0
- package/useDeferUntilDate/index.d.mts +3 -0
- package/useDeferUntilDate/index.mjs +5 -0
- package/useDeferUntilDate/types.cjs +0 -0
- package/useDeferUntilDate/types.d.cts +7 -0
- package/useDeferUntilDate/types.d.mts +7 -0
- package/useDeferUntilDate/types.mjs +1 -0
- package/useDeferUntilDate/useDeferUntilDate.cjs +21 -0
- package/useDeferUntilDate/useDeferUntilDate.d.cts +14 -0
- package/useDeferUntilDate/useDeferUntilDate.d.mts +15 -0
- package/useDeferUntilDate/useDeferUntilDate.mjs +21 -0
- package/useDeferUntilIntersected/index.cjs +5 -0
- package/useDeferUntilIntersected/index.d.cts +3 -0
- package/useDeferUntilIntersected/index.d.mts +3 -0
- package/useDeferUntilIntersected/index.mjs +5 -0
- package/useDeferUntilIntersected/types.cjs +0 -0
- package/useDeferUntilIntersected/types.d.cts +31 -0
- package/useDeferUntilIntersected/types.d.mts +31 -0
- package/useDeferUntilIntersected/types.mjs +1 -0
- package/useDeferUntilIntersected/useDeferUntilIntersected.cjs +60 -0
- package/useDeferUntilIntersected/useDeferUntilIntersected.d.cts +14 -0
- package/useDeferUntilIntersected/useDeferUntilIntersected.d.mts +15 -0
- package/useDeferUntilIntersected/useDeferUntilIntersected.mjs +58 -0
- package/useDeferUntilOnReady/index.cjs +5 -0
- package/useDeferUntilOnReady/index.d.cts +3 -0
- package/useDeferUntilOnReady/index.d.mts +3 -0
- package/useDeferUntilOnReady/index.mjs +5 -0
- package/useDeferUntilOnReady/types.cjs +0 -0
- package/useDeferUntilOnReady/types.d.cts +23 -0
- package/useDeferUntilOnReady/types.d.mts +23 -0
- package/useDeferUntilOnReady/types.mjs +1 -0
- package/useDeferUntilOnReady/useDeferUntilOnReady.cjs +42 -0
- package/useDeferUntilOnReady/useDeferUntilOnReady.d.cts +13 -0
- package/useDeferUntilOnReady/useDeferUntilOnReady.d.mts +14 -0
- package/useDeferUntilOnReady/useDeferUntilOnReady.mjs +40 -0
- package/useDeferUntilReady/index.cjs +5 -0
- package/useDeferUntilReady/index.d.cts +3 -0
- package/useDeferUntilReady/index.d.mts +3 -0
- package/useDeferUntilReady/index.mjs +5 -0
- package/useDeferUntilReady/types.cjs +0 -0
- package/useDeferUntilReady/types.d.cts +7 -0
- package/useDeferUntilReady/types.d.mts +7 -0
- package/useDeferUntilReady/types.mjs +1 -0
- package/useDeferUntilReady/useDeferUntilReady.cjs +60 -0
- package/useDeferUntilReady/useDeferUntilReady.d.cts +15 -0
- package/useDeferUntilReady/useDeferUntilReady.d.mts +16 -0
- package/useDeferUntilReady/useDeferUntilReady.mjs +58 -0
- package/useDeferUntilRender/index.cjs +5 -0
- package/useDeferUntilRender/index.d.cts +3 -0
- package/useDeferUntilRender/index.d.mts +3 -0
- package/useDeferUntilRender/index.mjs +5 -0
- package/useDeferUntilRender/types.cjs +0 -0
- package/useDeferUntilRender/types.d.cts +25 -0
- package/useDeferUntilRender/types.d.mts +25 -0
- package/useDeferUntilRender/types.mjs +1 -0
- package/useDeferUntilRender/useDeferUntilRender.cjs +53 -0
- package/useDeferUntilRender/useDeferUntilRender.d.cts +14 -0
- package/useDeferUntilRender/useDeferUntilRender.d.mts +15 -0
- package/useDeferUntilRender/useDeferUntilRender.mjs +51 -0
- package/useDeferUntilResolved/index.cjs +5 -0
- package/useDeferUntilResolved/index.d.cts +3 -0
- package/useDeferUntilResolved/index.d.mts +3 -0
- package/useDeferUntilResolved/index.mjs +5 -0
- package/useDeferUntilResolved/types.cjs +0 -0
- package/useDeferUntilResolved/types.d.cts +7 -0
- package/useDeferUntilResolved/types.d.mts +7 -0
- package/useDeferUntilResolved/types.mjs +1 -0
- package/useDeferUntilResolved/useDeferUntilResolved.cjs +21 -0
- package/useDeferUntilResolved/useDeferUntilResolved.d.cts +14 -0
- package/useDeferUntilResolved/useDeferUntilResolved.d.mts +15 -0
- package/useDeferUntilResolved/useDeferUntilResolved.mjs +21 -0
- package/useDeferUntilScrolled/index.cjs +5 -0
- package/useDeferUntilScrolled/index.d.cts +3 -0
- package/useDeferUntilScrolled/index.d.mts +3 -0
- package/useDeferUntilScrolled/index.mjs +5 -0
- package/useDeferUntilScrolled/types.cjs +0 -0
- package/useDeferUntilScrolled/types.d.cts +29 -0
- package/useDeferUntilScrolled/types.d.mts +29 -0
- package/useDeferUntilScrolled/types.mjs +1 -0
- package/useDeferUntilScrolled/useDeferUntilScrolled.cjs +94 -0
- package/useDeferUntilScrolled/useDeferUntilScrolled.d.cts +14 -0
- package/useDeferUntilScrolled/useDeferUntilScrolled.d.mts +15 -0
- package/useDeferUntilScrolled/useDeferUntilScrolled.mjs +91 -0
- package/useDeferUntilTimeout/index.cjs +5 -0
- package/useDeferUntilTimeout/index.d.cts +3 -0
- package/useDeferUntilTimeout/index.d.mts +3 -0
- package/useDeferUntilTimeout/index.mjs +5 -0
- package/useDeferUntilTimeout/types.cjs +0 -0
- package/useDeferUntilTimeout/types.d.cts +7 -0
- package/useDeferUntilTimeout/types.d.mts +7 -0
- package/useDeferUntilTimeout/types.mjs +1 -0
- package/useDeferUntilTimeout/useDeferUntilTimeout.cjs +40 -0
- package/useDeferUntilTimeout/useDeferUntilTimeout.d.cts +14 -0
- package/useDeferUntilTimeout/useDeferUntilTimeout.d.mts +15 -0
- package/useDeferUntilTimeout/useDeferUntilTimeout.mjs +37 -0
- package/useDeferUntilTrue/index.cjs +5 -0
- package/useDeferUntilTrue/index.d.cts +3 -0
- package/useDeferUntilTrue/index.d.mts +3 -0
- package/useDeferUntilTrue/index.mjs +5 -0
- package/useDeferUntilTrue/types.cjs +0 -0
- package/useDeferUntilTrue/types.d.cts +7 -0
- package/useDeferUntilTrue/types.d.mts +7 -0
- package/useDeferUntilTrue/types.mjs +1 -0
- package/useDeferUntilTrue/useDeferUntilTrue.cjs +20 -0
- package/useDeferUntilTrue/useDeferUntilTrue.d.cts +14 -0
- package/useDeferUntilTrue/useDeferUntilTrue.d.mts +15 -0
- package/useDeferUntilTrue/useDeferUntilTrue.mjs +20 -0
- package/useDeferUntilWebFontReady/index.cjs +5 -0
- package/useDeferUntilWebFontReady/index.d.cts +3 -0
- package/useDeferUntilWebFontReady/index.d.mts +3 -0
- package/useDeferUntilWebFontReady/index.mjs +5 -0
- package/useDeferUntilWebFontReady/types.cjs +0 -0
- package/useDeferUntilWebFontReady/types.d.cts +49 -0
- package/useDeferUntilWebFontReady/types.d.mts +49 -0
- package/useDeferUntilWebFontReady/types.mjs +1 -0
- package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.cjs +93 -0
- package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.cts +16 -0
- package/useDeferUntilWebFontReady/useDeferUntilWebFontReady.d.mts +17 -0
- 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 };
|