@xrift/world-components 0.35.3 → 0.35.4
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/dist/contexts/FontContext.d.ts +17 -0
- package/dist/contexts/FontContext.d.ts.map +1 -0
- package/dist/contexts/FontContext.js +25 -0
- package/dist/contexts/FontContext.js.map +1 -0
- package/dist/hooks/useDefaultFont.d.ts +3 -12
- package/dist/hooks/useDefaultFont.d.ts.map +1 -1
- package/dist/hooks/useDefaultFont.js +39 -17
- package/dist/hooks/useDefaultFont.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { FontFamilies } from '@pmndrs/uikit';
|
|
3
|
+
interface Props {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* フォントをプリロードし、ロード完了まで children をブロックする Provider。
|
|
8
|
+
* XRiftProvider 内で使用される。
|
|
9
|
+
*/
|
|
10
|
+
export declare function FontProvider({ children }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
11
|
+
/**
|
|
12
|
+
* ロード済みの FontFamilies を取得する hook。
|
|
13
|
+
* FontProvider 内では即座に返し、外では useDefaultFont にフォールバックする。
|
|
14
|
+
*/
|
|
15
|
+
export declare function useFont(): FontFamilies | undefined;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=FontContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FontContext.d.ts","sourceRoot":"","sources":["../../src/contexts/FontContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAOjD,UAAU,KAAK;IACb,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,kDAK/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,IAAI,YAAY,GAAG,SAAS,CAIlD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
import { useDefaultFont } from '../hooks/useDefaultFont';
|
|
4
|
+
const FontContext = createContext(null);
|
|
5
|
+
const DEFAULT_LOCALES = ['ja'];
|
|
6
|
+
/**
|
|
7
|
+
* フォントをプリロードし、ロード完了まで children をブロックする Provider。
|
|
8
|
+
* XRiftProvider 内で使用される。
|
|
9
|
+
*/
|
|
10
|
+
export function FontProvider({ children }) {
|
|
11
|
+
const fontFamilies = useDefaultFont(DEFAULT_LOCALES);
|
|
12
|
+
if (!fontFamilies)
|
|
13
|
+
return null;
|
|
14
|
+
return _jsx(FontContext.Provider, { value: fontFamilies, children: children });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* ロード済みの FontFamilies を取得する hook。
|
|
18
|
+
* FontProvider 内では即座に返し、外では useDefaultFont にフォールバックする。
|
|
19
|
+
*/
|
|
20
|
+
export function useFont() {
|
|
21
|
+
const ctx = useContext(FontContext);
|
|
22
|
+
const fallback = useDefaultFont(DEFAULT_LOCALES);
|
|
23
|
+
return ctx ?? fallback;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=FontContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FontContext.js","sourceRoot":"","sources":["../../src/contexts/FontContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAmB,MAAM,yBAAyB,CAAA;AAEzE,MAAM,WAAW,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAA;AAE5D,MAAM,eAAe,GAAiB,CAAC,IAAI,CAAC,CAAA;AAM5C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAS;IAC9C,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;IACpD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAA;IAE9B,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YAAG,QAAQ,GAAwB,CAAA;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CAAA;IAChD,OAAO,GAAG,IAAI,QAAQ,CAAA;AACxB,CAAC"}
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
import type { FontFamilies } from '@pmndrs/uikit';
|
|
2
2
|
export type FontLocale = 'ja';
|
|
3
3
|
/**
|
|
4
|
-
* UIKit 用の多言語 MSDF フォントをロードする hook
|
|
4
|
+
* UIKit 用の多言語 MSDF フォントをロードする hook。
|
|
5
|
+
* ロード完了時に uikit のグローバルプロパティとしても登録されるため、
|
|
6
|
+
* Container に fontFamilies を明示的に渡さなくても fontFamily="ja" が使える。
|
|
5
7
|
*
|
|
6
8
|
* @param locales - ロードするフォントのロケール配列
|
|
7
9
|
* @returns ロード完了後に FontFamilies を返す。ロード中は undefined
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```tsx
|
|
11
|
-
* const fontFamilies = useDefaultFont(['ja'])
|
|
12
|
-
*
|
|
13
|
-
* return (
|
|
14
|
-
* <Container fontFamilies={fontFamilies}>
|
|
15
|
-
* <Text fontFamily="ja">こんにちは</Text>
|
|
16
|
-
* </Container>
|
|
17
|
-
* )
|
|
18
|
-
* ```
|
|
19
10
|
*/
|
|
20
11
|
export declare function useDefaultFont(locales: FontLocale[]): FontFamilies | undefined;
|
|
21
12
|
//# sourceMappingURL=useDefaultFont.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDefaultFont.d.ts","sourceRoot":"","sources":["../../src/hooks/useDefaultFont.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"useDefaultFont.d.ts","sourceRoot":"","sources":["../../src/hooks/useDefaultFont.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAA;AAwD7B;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EAAE,GACpB,YAAY,GAAG,SAAS,CAuC1B"}
|
|
@@ -2,11 +2,13 @@ import { useEffect, useState } from 'react';
|
|
|
2
2
|
const FONT_REGISTRY = {
|
|
3
3
|
ja: {
|
|
4
4
|
baseUrl: 'https://public.xrift.net/fonts/msdf/NotoSansJP',
|
|
5
|
-
version:
|
|
5
|
+
version: 3,
|
|
6
6
|
},
|
|
7
7
|
};
|
|
8
8
|
/** ロケールごとのキャッシュ(同じフォントの重複フェッチを防止) */
|
|
9
9
|
const fontCache = new Map();
|
|
10
|
+
/** 解決済みフォントデータのキャッシュ(同期アクセス用) */
|
|
11
|
+
const resolvedCache = new Map();
|
|
10
12
|
function loadFont(locale) {
|
|
11
13
|
const cached = fontCache.get(locale);
|
|
12
14
|
if (cached)
|
|
@@ -22,35 +24,55 @@ function loadFont(locale) {
|
|
|
22
24
|
fontCache.set(locale, promise);
|
|
23
25
|
return promise;
|
|
24
26
|
}
|
|
27
|
+
// モジュール読み込み時に全ロケールのフォントを事前フェッチし、
|
|
28
|
+
// ロード完了後に uikit のグローバルプロパティとして登録する。
|
|
29
|
+
// これにより、uikit コンポーネントのコンストラクタ実行時に star-inheritance 経由で
|
|
30
|
+
// fontFamilies が即座に利用可能になり、"unknown font family" 警告を防ぐ。
|
|
31
|
+
const fontReadyPromise = Promise.all(Object.keys(FONT_REGISTRY).map(loadFont)).then(async (entries) => {
|
|
32
|
+
const fontFamilies = Object.fromEntries(entries);
|
|
33
|
+
try {
|
|
34
|
+
const { setGlobalProperties } = await import('@pmndrs/uikit');
|
|
35
|
+
setGlobalProperties({ fontFamilies });
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// @pmndrs/uikit が利用できない環境ではスキップ
|
|
39
|
+
}
|
|
40
|
+
return fontFamilies;
|
|
41
|
+
});
|
|
25
42
|
/**
|
|
26
|
-
* UIKit 用の多言語 MSDF フォントをロードする hook
|
|
43
|
+
* UIKit 用の多言語 MSDF フォントをロードする hook。
|
|
44
|
+
* ロード完了時に uikit のグローバルプロパティとしても登録されるため、
|
|
45
|
+
* Container に fontFamilies を明示的に渡さなくても fontFamily="ja" が使える。
|
|
27
46
|
*
|
|
28
47
|
* @param locales - ロードするフォントのロケール配列
|
|
29
48
|
* @returns ロード完了後に FontFamilies を返す。ロード中は undefined
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```tsx
|
|
33
|
-
* const fontFamilies = useDefaultFont(['ja'])
|
|
34
|
-
*
|
|
35
|
-
* return (
|
|
36
|
-
* <Container fontFamilies={fontFamilies}>
|
|
37
|
-
* <Text fontFamily="ja">こんにちは</Text>
|
|
38
|
-
* </Container>
|
|
39
|
-
* )
|
|
40
|
-
* ```
|
|
41
49
|
*/
|
|
42
50
|
export function useDefaultFont(locales) {
|
|
43
|
-
const [fontFamilies, setFontFamilies] = useState();
|
|
44
51
|
const key = locales.slice().sort().join(',');
|
|
52
|
+
// 解決済みなら初期値として同期的に返す
|
|
53
|
+
const [fontFamilies, setFontFamilies] = useState(() => resolvedCache.get(key));
|
|
45
54
|
useEffect(() => {
|
|
46
55
|
if (key === '')
|
|
47
56
|
return;
|
|
57
|
+
// すでに解決済みなら何もしない
|
|
58
|
+
if (resolvedCache.has(key)) {
|
|
59
|
+
setFontFamilies(resolvedCache.get(key));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
48
62
|
let cancelled = false;
|
|
49
63
|
const targetLocales = key.split(',');
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
64
|
+
// fontReadyPromise を使用し、setGlobalProperties 完了後に解決する
|
|
65
|
+
fontReadyPromise.then((allFonts) => {
|
|
66
|
+
if (cancelled)
|
|
67
|
+
return;
|
|
68
|
+
const result = {};
|
|
69
|
+
for (const locale of targetLocales) {
|
|
70
|
+
if (locale in allFonts) {
|
|
71
|
+
result[locale] = allFonts[locale];
|
|
72
|
+
}
|
|
53
73
|
}
|
|
74
|
+
resolvedCache.set(key, result);
|
|
75
|
+
setFontFamilies(result);
|
|
54
76
|
});
|
|
55
77
|
return () => {
|
|
56
78
|
cancelled = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDefaultFont.js","sourceRoot":"","sources":["../../src/hooks/useDefaultFont.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAS3C,MAAM,aAAa,GAAmC;IACpD,EAAE,EAAE;QACF,OAAO,EAAE,gDAAgD;QACzD,OAAO,EAAE,CAAC;KACX;CACF,CAAA;AAED,qCAAqC;AACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuD,CAAA;AAEhF,SAAS,QAAQ,CACf,MAAkB;IAElB,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC;SACvB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAChB,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACnE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAmC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEJ,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"useDefaultFont.js","sourceRoot":"","sources":["../../src/hooks/useDefaultFont.ts"],"names":[],"mappings":"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"}
|