@xrift/world-components 0.34.0 → 0.35.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 (56) hide show
  1. package/dist/components/Mirror/index.d.ts.map +1 -1
  2. package/dist/components/Mirror/index.js +6 -2
  3. package/dist/components/Mirror/index.js.map +1 -1
  4. package/dist/components/MsdfText/index.d.ts +24 -0
  5. package/dist/components/MsdfText/index.d.ts.map +1 -0
  6. package/dist/components/MsdfText/index.js +24 -0
  7. package/dist/components/MsdfText/index.js.map +1 -0
  8. package/dist/components/TroikaText/index.d.ts +4 -0
  9. package/dist/components/TroikaText/index.d.ts.map +1 -0
  10. package/dist/components/TroikaText/index.js +50 -0
  11. package/dist/components/TroikaText/index.js.map +1 -0
  12. package/dist/components/TroikaText/types.d.ts +19 -0
  13. package/dist/components/TroikaText/types.d.ts.map +1 -0
  14. package/dist/components/TroikaText/types.js +2 -0
  15. package/dist/components/TroikaText/types.js.map +1 -0
  16. package/dist/fonts/FontContext.d.ts +9 -0
  17. package/dist/fonts/FontContext.d.ts.map +1 -0
  18. package/dist/fonts/FontContext.js +5 -0
  19. package/dist/fonts/FontContext.js.map +1 -0
  20. package/dist/fonts/FontProvider.d.ts +31 -0
  21. package/dist/fonts/FontProvider.d.ts.map +1 -0
  22. package/dist/fonts/FontProvider.js +40 -0
  23. package/dist/fonts/FontProvider.js.map +1 -0
  24. package/dist/fonts/FontReadyContainer.d.ts +35 -0
  25. package/dist/fonts/FontReadyContainer.d.ts.map +1 -0
  26. package/dist/fonts/FontReadyContainer.js +40 -0
  27. package/dist/fonts/FontReadyContainer.js.map +1 -0
  28. package/dist/fonts/constants.d.ts +0 -2
  29. package/dist/fonts/constants.d.ts.map +1 -1
  30. package/dist/fonts/constants.js +0 -20
  31. package/dist/fonts/constants.js.map +1 -1
  32. package/dist/fonts/loadTTF.d.ts +18 -0
  33. package/dist/fonts/loadTTF.d.ts.map +1 -0
  34. package/dist/fonts/loadTTF.js +36 -0
  35. package/dist/fonts/loadTTF.js.map +1 -0
  36. package/dist/fonts/useTTF.d.ts +7 -0
  37. package/dist/fonts/useTTF.d.ts.map +1 -0
  38. package/dist/fonts/useTTF.js +9 -0
  39. package/dist/fonts/useTTF.js.map +1 -0
  40. package/dist/hooks/useDefaultFont.d.ts +21 -0
  41. package/dist/hooks/useDefaultFont.d.ts.map +1 -0
  42. package/dist/hooks/useDefaultFont.js +52 -0
  43. package/dist/hooks/useDefaultFont.js.map +1 -0
  44. package/dist/hooks/useJapaneseFont.d.ts +6 -3
  45. package/dist/hooks/useJapaneseFont.d.ts.map +1 -1
  46. package/dist/hooks/useJapaneseFont.js +17 -5
  47. package/dist/hooks/useJapaneseFont.js.map +1 -1
  48. package/dist/hooks/useMsdfFont.d.ts +11 -0
  49. package/dist/hooks/useMsdfFont.d.ts.map +1 -0
  50. package/dist/hooks/useMsdfFont.js +19 -0
  51. package/dist/hooks/useMsdfFont.js.map +1 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -0
  55. package/dist/index.js.map +1 -1
  56. package/package.json +4 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Mirror/index.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA6B1C,wBAAgB,MAAM,CAAC,EACrB,QAAuB,EACvB,QAAoB,EACpB,IAAa,EACb,KAAgB,EAChB,iBAAuB,EACvB,WAAkC,GACnC,EAAE,WAAW,2CAkGb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Mirror/index.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA8B1C,wBAAgB,MAAM,CAAC,EACrB,QAAuB,EACvB,QAAoB,EACpB,IAAa,EACb,KAAgB,EAChB,iBAAuB,EACvB,WAAkC,GACnC,EAAE,WAAW,2CAuGb"}
@@ -6,6 +6,7 @@ import { Reflector } from 'three/addons/objects/Reflector.js';
6
6
  import { DEFAULT_LOD_DISTANCE, LOD_HYSTERESIS_RATIO } from './constants';
7
7
  import { shouldUseReflector } from './utils';
8
8
  const _worldPos = new Vector3();
9
+ const _cameraWorldPos = new Vector3();
9
10
  const fallbackVertexShader = `
10
11
  varying vec3 vWorldNormal;
11
12
  varying vec3 vWorldPosition;
@@ -87,14 +88,17 @@ export function Mirror({ position = [0, 2.5, -9], rotation = [0, 0, 0], size = [
87
88
  // VRMFirstPersonのレイヤー設定により、メインカメラではThirdPersonOnlyレイヤー(頭部)が
88
89
  // 非表示になっているが、鏡には全身を映す必要があるため
89
90
  // onBeforeRenderでメインカメラの設定がコピーされるため、毎フレーム設定が必要
90
- useFrame(({ camera }) => {
91
+ useFrame(({ camera, gl }) => {
91
92
  const reflector = reflectorRef.current;
92
93
  if (!reflector)
93
94
  return;
94
95
  // LOD: カメラと鏡の距離に応じて Reflector ↔ envMap を切り替え
95
96
  const fallback = fallbackRef.current;
96
97
  if (fallback && groupRef.current) {
97
- const distance = camera.position.distanceTo(groupRef.current.getWorldPosition(_worldPos));
98
+ // VR モードでは XR カメラのワールド座標を使用
99
+ const activeCamera = gl.xr.isPresenting ? gl.xr.getCamera() : camera;
100
+ _cameraWorldPos.setFromMatrixPosition(activeCamera.matrixWorld);
101
+ const distance = _cameraWorldPos.distanceTo(groupRef.current.getWorldPosition(_worldPos));
98
102
  const useReflector = shouldUseReflector(distance, lodDistance, usingReflectorRef.current, LOD_HYSTERESIS_RATIO);
99
103
  if (useReflector !== usingReflectorRef.current) {
100
104
  usingReflectorRef.current = useReflector;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Mirror/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,KAAK,EAAS,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAI5C,MAAM,SAAS,GAAG,IAAI,OAAO,EAAE,CAAA;AAE/B,MAAM,oBAAoB,GAAG;;;;;;;;;CAS5B,CAAA;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;;;CAY9B,CAAA;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EACvB,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACb,KAAK,GAAG,QAAQ,EAChB,iBAAiB,GAAG,GAAG,EACvB,WAAW,GAAG,oBAAoB,GACtB;IACZ,MAAM,QAAQ,GAAG,MAAM,CAAQ,IAAI,CAAC,CAAA;IACpC,MAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IACnD,MAAM,WAAW,GAAG,MAAM,CAAc,IAAI,CAAC,CAAA;IAC7C,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAEhC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAA;QACrC,IAAI,CAAC,YAAY;YAAE,OAAM;QAEzB,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAEpD,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAA;QAEzE,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE;YACxC,QAAQ,EAAE,KAAK;YACf,YAAY;YACZ,aAAa;YACb,KAAK;YACL,WAAW,EAAE,CAAC,EAAE,kDAAkD;SACnE,CAAC,CAAA;QAEF,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC3B,YAAY,CAAC,OAAO,GAAG,SAAS,CAAA;QAEhC,uCAAuC;QACvC,MAAM,gBAAgB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5D,MAAM,gBAAgB,GAAG,IAAI,cAAc,CAAC;YAC1C,YAAY,EAAE,oBAAoB;YAClC,cAAc,EAAE,sBAAsB;YACtC,QAAQ,EAAE;gBACR,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;gBACtC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE;gBACzC,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;aAC7B;SACF,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;QACjE,YAAY,CAAC,OAAO,GAAG,KAAK,CAAA;QAC5B,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAC9B,WAAW,CAAC,OAAO,GAAG,YAAY,CAAA;QAElC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAA;QAEhC,OAAO,GAAG,EAAE;YACV,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBAC9B,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBACjC,QAAQ,CAAC,OAAO,EAAE,CAAA;gBAClB,SAAS,CAAC,OAAO,EAAE,EAAE,CAAA;gBACrB,gBAAgB,CAAC,OAAO,EAAE,CAAA;gBAC1B,gBAAgB,CAAC,OAAO,EAAE,CAAA;YAC5B,CAAC;YACD,YAAY,CAAC,OAAO,GAAG,IAAI,CAAA;YAC3B,WAAW,CAAC,OAAO,GAAG,IAAI,CAAA;QAC5B,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAA;IAEpD,2CAA2C;IAC3C,4DAA4D;IAC5D,6BAA6B;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAA;QACtC,IAAI,CAAC,SAAS;YAAE,OAAM;QAEtB,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAA;QACpC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAA;YACzF,MAAM,YAAY,GAAG,kBAAkB,CACrC,QAAQ,EACR,WAAW,EACX,iBAAiB,CAAC,OAAO,EACzB,oBAAoB,CACrB,CAAA;YAED,IAAI,YAAY,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/C,iBAAiB,CAAC,OAAO,GAAG,YAAY,CAAA;gBACxC,SAAS,CAAC,OAAO,GAAG,YAAY,CAAA;gBAChC,QAAQ,CAAC,OAAO,GAAG,CAAC,YAAY,CAAA;YAClC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAM;QAE9B,yCAAyC;QACzC,MAAM,aAAa,GAAI,SAAsD,CAAC,MAAM,CAAA;QACpF,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,gBAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAA;AACzE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/Mirror/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type TextProperties } from '@react-three/uikit';
2
+ type TextProps = TextProperties;
3
+ interface Props extends Omit<TextProps, 'children'> {
4
+ children: string;
5
+ /** フォント URL(デフォルト: Noto Sans JP Regular) */
6
+ fontUrl?: string;
7
+ /** MSDF テクスチャサイズ(デフォルト: [2048, 2048]) */
8
+ textureSize?: [number, number];
9
+ }
10
+ /**
11
+ * MSDF フォントで日本語テキストを表示するコンポーネント。
12
+ * children の文字列から必要な文字セットを自動導出し、
13
+ * フォント読み込み・Suspense を内部で処理する。
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <MsdfText fontSize={48} color={0x666666}>
18
+ * URLを入力してください
19
+ * </MsdfText>
20
+ * ```
21
+ */
22
+ export declare const MsdfText: import("react").MemoExoticComponent<(props: Props) => import("react/jsx-runtime").JSX.Element>;
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/MsdfText/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAG9D,KAAK,SAAS,GAAG,cAAc,CAAA;AAE/B,UAAU,KAAM,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAqBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,QAAQ,8CAAgB,KAAK,6CAIxC,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo, Suspense, useMemo } from 'react';
3
+ import { Text } from '@react-three/uikit';
4
+ import { FontReadyContainer } from '../../fonts/FontReadyContainer';
5
+ const InnerText = memo(({ children, fontUrl, textureSize, ...textProps }) => {
6
+ const texts = useMemo(() => [children], [children]);
7
+ return (_jsx(FontReadyContainer, { texts: texts, fontUrl: fontUrl, textureSize: textureSize, children: _jsx(Text, { ...textProps, children: children }) }));
8
+ });
9
+ InnerText.displayName = 'MsdfText.Inner';
10
+ /**
11
+ * MSDF フォントで日本語テキストを表示するコンポーネント。
12
+ * children の文字列から必要な文字セットを自動導出し、
13
+ * フォント読み込み・Suspense を内部で処理する。
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <MsdfText fontSize={48} color={0x666666}>
18
+ * URLを入力してください
19
+ * </MsdfText>
20
+ * ```
21
+ */
22
+ export const MsdfText = memo((props) => (_jsx(Suspense, { fallback: null, children: _jsx(InnerText, { ...props }) })));
23
+ MsdfText.displayName = 'MsdfText';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/MsdfText/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAuB,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAYnE,MAAM,SAAS,GAAG,IAAI,CACpB,CAAC,EACC,QAAQ,EACR,OAAO,EACP,WAAW,EACX,GAAG,SAAS,EACN,EAAE,EAAE;IACV,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEnD,OAAO,CACL,KAAC,kBAAkB,IAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,YAC1E,KAAC,IAAI,OAAK,SAAS,YAAG,QAAQ,GAAQ,GACnB,CACtB,CAAA;AACH,CAAC,CACF,CAAA;AAED,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAC7C,KAAC,QAAQ,IAAC,QAAQ,EAAE,IAAI,YACtB,KAAC,SAAS,OAAK,KAAK,GAAI,GACf,CACZ,CAAC,CAAA;AAEF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Props } from './types';
2
+ export type { Props as TroikaTextProps };
3
+ export declare const TroikaText: import("react").MemoExoticComponent<({ children, fontSize, color, font, maxWidth, textAlign, lineHeight, letterSpacing, anchorX, anchorY, ...contentProps }: Props) => import("react/jsx-runtime").JSX.Element>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TroikaText/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpC,YAAY,EAAE,KAAK,IAAI,eAAe,EAAE,CAAA;AAExC,eAAO,MAAM,UAAU,+JAalB,KAAK,6CAoDT,CAAA"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Children, memo, useRef, useState, useEffect, useLayoutEffect, useMemo } from 'react';
3
+ import { Content } from '@react-three/uikit';
4
+ import { Text as TroikaTextMesh, preloadFont } from 'troika-three-text';
5
+ import { suspend } from 'suspend-react';
6
+ import { useThree } from '@react-three/fiber';
7
+ const DEFAULT_FONT_URL = 'https://cdn.jsdelivr.net/fontsource/fonts/noto-sans-jp@latest/japanese-400-normal.ttf';
8
+ export const TroikaText = memo(({ children, fontSize = 16, color, font, maxWidth, textAlign, lineHeight, letterSpacing, anchorX = 'left', anchorY = 'top', ...contentProps }) => {
9
+ const resolvedFont = font ?? DEFAULT_FONT_URL;
10
+ const contentRef = useRef(null);
11
+ const invalidate = useThree(({ invalidate }) => invalidate);
12
+ const [troikaMesh] = useState(() => new TroikaTextMesh());
13
+ // フォントプリロード(Suspense 対応 — drei と同じパターン)
14
+ suspend(() => new Promise((res) => preloadFont({ font: resolvedFont }, () => res())), ['troika-font', resolvedFont]);
15
+ // children からテキスト文字列を抽出(drei と同じパターン)
16
+ const text = useMemo(() => {
17
+ let t = '';
18
+ Children.forEach(children, (child) => {
19
+ if (typeof child === 'string' || typeof child === 'number')
20
+ t += child;
21
+ });
22
+ return t;
23
+ }, [children]);
24
+ // troika プロパティを設定して sync(毎レンダリング)
25
+ useLayoutEffect(() => {
26
+ troikaMesh.text = text;
27
+ troikaMesh.font = resolvedFont;
28
+ troikaMesh.fontSize = fontSize;
29
+ if (color != null)
30
+ troikaMesh.color = color;
31
+ if (maxWidth != null)
32
+ troikaMesh.maxWidth = maxWidth;
33
+ if (textAlign != null)
34
+ troikaMesh.textAlign = textAlign;
35
+ if (lineHeight != null)
36
+ troikaMesh.lineHeight = lineHeight;
37
+ if (letterSpacing != null)
38
+ troikaMesh.letterSpacing = letterSpacing;
39
+ troikaMesh.anchorX = anchorX;
40
+ troikaMesh.anchorY = anchorY;
41
+ troikaMesh.sync(() => {
42
+ invalidate();
43
+ contentRef.current?.notifyAncestorsChanged();
44
+ });
45
+ });
46
+ useEffect(() => () => troikaMesh.dispose(), [troikaMesh]);
47
+ return (_jsx(Content, { ref: contentRef, keepAspectRatio: false, ...contentProps, children: _jsx("primitive", { object: troikaMesh }) }));
48
+ });
49
+ TroikaText.displayName = 'TroikaText';
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/TroikaText/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ContentProperties } from '@react-three/uikit';
3
+ import type { ReactThreeFiber } from '@react-three/fiber';
4
+ /** ContentProperties と衝突するプロパティを除外(troika 用に再定義する) */
5
+ type ContentBaseProps = Omit<ContentProperties, 'children' | 'color' | 'fontSize' | 'letterSpacing' | 'lineHeight' | 'textAlign' | 'anchorX' | 'anchorY'>;
6
+ export interface Props extends ContentBaseProps {
7
+ children: ReactNode;
8
+ fontSize?: number;
9
+ color?: ReactThreeFiber.Color;
10
+ font?: string;
11
+ maxWidth?: number;
12
+ textAlign?: 'left' | 'right' | 'center' | 'justify';
13
+ lineHeight?: number | 'normal';
14
+ letterSpacing?: number;
15
+ anchorX?: number | 'left' | 'center' | 'right';
16
+ anchorY?: number | 'top' | 'top-baseline' | 'middle' | 'bottom-baseline' | 'bottom';
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/TroikaText/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,sDAAsD;AACtD,KAAK,gBAAgB,GAAG,IAAI,CAC1B,iBAAiB,EACf,UAAU,GACV,OAAO,GACP,UAAU,GACV,eAAe,GACf,YAAY,GACZ,WAAW,GACX,SAAS,GACT,SAAS,CACZ,CAAA;AAED,MAAM,WAAW,KAAM,SAAQ,gBAAgB;IAC7C,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC,KAAK,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAA;IACnD,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC9C,OAAO,CAAC,EACJ,MAAM,GACN,KAAK,GACL,cAAc,GACd,QAAQ,GACR,iBAAiB,GACjB,QAAQ,CAAA;CACb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/TroikaText/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { GenerateFontResult } from '@zappar/msdf-generator';
2
+ interface FontContextValue {
3
+ fontFamilies: GenerateFontResult;
4
+ }
5
+ export declare const FontContext: import("react").Context<FontContextValue | null>;
6
+ /** FontProvider 内では fontFamilies を返し、Provider 外では null を返す */
7
+ export declare const useFontContext: () => FontContextValue | null;
8
+ export {};
9
+ //# sourceMappingURL=FontContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontContext.d.ts","sourceRoot":"","sources":["../../src/fonts/FontContext.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAEhE,UAAU,gBAAgB;IACxB,YAAY,EAAE,kBAAkB,CAAA;CACjC;AAED,eAAO,MAAM,WAAW,kDAA+C,CAAA;AAEvE,8DAA8D;AAC9D,eAAO,MAAM,cAAc,QAAO,gBAAgB,GAAG,IAC5B,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { createContext, useContext } from 'react';
2
+ export const FontContext = createContext(null);
3
+ /** FontProvider 内では fontFamilies を返し、Provider 外では null を返す */
4
+ export const useFontContext = () => useContext(FontContext);
5
+ //# sourceMappingURL=FontContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontContext.js","sourceRoot":"","sources":["../../src/fonts/FontContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAOjD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAA;AAEvE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,GAA4B,EAAE,CAC1D,UAAU,CAAC,WAAW,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { type ReactNode } from 'react';
2
+ interface Props {
3
+ /** MSDF 生成に含めるテキスト配列。安定した参照の配列を渡すことを推奨。 */
4
+ texts: string[];
5
+ children: ReactNode;
6
+ /** フォント URL(デフォルト: Noto Sans JP Regular) */
7
+ fontUrl?: string;
8
+ /** MSDF テクスチャサイズ(デフォルト: [2048, 2048]) */
9
+ textureSize?: [number, number];
10
+ }
11
+ /**
12
+ * ツリー全体で MSDF アトラスを共有し、配下で日本語テキストを直接使えるようにする Provider。
13
+ *
14
+ * `texts` に含まれる文字から MSDF フォントを1回だけ生成し、
15
+ * `fontFamilies` を Container 経由で配下に適用する。
16
+ * Suspense 対応のため、親に `<Suspense>` が必要。
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * const ALL_TEXTS = ['URLを入力してください', '再接続中...']
21
+ *
22
+ * <Suspense fallback={null}>
23
+ * <FontProvider texts={ALL_TEXTS}>
24
+ * <Text fontSize={48}>URLを入力してください</Text>
25
+ * </FontProvider>
26
+ * </Suspense>
27
+ * ```
28
+ */
29
+ export declare const FontProvider: import("react").MemoExoticComponent<({ texts, fontUrl, textureSize, children }: Props) => import("react/jsx-runtime").JSX.Element>;
30
+ export {};
31
+ //# sourceMappingURL=FontProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontProvider.d.ts","sourceRoot":"","sources":["../../src/fonts/FontProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAK1E,UAAU,KAAK;IACb,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,YAAY,kFACqB,KAAK,6CAuBlD,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo, useMemo, useState, useEffect } from 'react';
3
+ import { Container, Text } from '@react-three/uikit';
4
+ import { FontContext } from './FontContext';
5
+ import { useMsdfFont } from '../hooks/useMsdfFont';
6
+ /**
7
+ * ツリー全体で MSDF アトラスを共有し、配下で日本語テキストを直接使えるようにする Provider。
8
+ *
9
+ * `texts` に含まれる文字から MSDF フォントを1回だけ生成し、
10
+ * `fontFamilies` を Container 経由で配下に適用する。
11
+ * Suspense 対応のため、親に `<Suspense>` が必要。
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const ALL_TEXTS = ['URLを入力してください', '再接続中...']
16
+ *
17
+ * <Suspense fallback={null}>
18
+ * <FontProvider texts={ALL_TEXTS}>
19
+ * <Text fontSize={48}>URLを入力してください</Text>
20
+ * </FontProvider>
21
+ * </Suspense>
22
+ * ```
23
+ */
24
+ export const FontProvider = memo(({ texts, fontUrl, textureSize, children }) => {
25
+ const fontFamilies = useMsdfFont(texts, fontUrl, textureSize);
26
+ const value = useMemo(() => ({ fontFamilies }), [fontFamilies]);
27
+ // uikit はフォントテクスチャを非同期でロードするため、
28
+ // 初回レンダリングでデフォルトの inter フォントへフォールバックし
29
+ // "Missing glyph info" 警告が出る。スペースのみの Text で
30
+ // フォントロードをトリガーし、次フレームで children を表示する。
31
+ const [fontReady, setFontReady] = useState(false);
32
+ useEffect(() => {
33
+ setFontReady(false);
34
+ const id = requestAnimationFrame(() => setFontReady(true));
35
+ return () => cancelAnimationFrame(id);
36
+ }, [fontFamilies]);
37
+ return (_jsx(FontContext.Provider, { value: value, children: _jsx(Container, { fontFamilies: fontFamilies, children: fontReady ? children : _jsx(Text, { fontSize: 1, children: ' ' }) }) }));
38
+ });
39
+ FontProvider.displayName = 'FontProvider';
40
+ //# sourceMappingURL=FontProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontProvider.js","sourceRoot":"","sources":["../../src/fonts/FontProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAYlD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAC9B,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAS,EAAE,EAAE;IACnD,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAE/D,gCAAgC;IAChC,sCAAsC;IACtC,4CAA4C;IAC5C,uCAAuC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1D,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,OAAO,CACL,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAChC,KAAC,SAAS,IAAC,YAAY,EAAE,YAAY,YAClC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,QAAQ,EAAE,CAAC,YAAG,GAAG,GAAQ,GAC7C,GACS,CACxB,CAAA;AACH,CAAC,CACF,CAAA;AAED,YAAY,CAAC,WAAW,GAAG,cAAc,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { type ComponentProps, type ReactNode } from 'react';
2
+ import { Container } from '@react-three/uikit';
3
+ type ContainerProps = ComponentProps<typeof Container>;
4
+ interface Props extends Omit<ContainerProps, 'children'> {
5
+ /** MSDF 生成に含めるテキスト配列。安定した参照の配列を渡すことを推奨。 */
6
+ texts: string[];
7
+ children: ReactNode;
8
+ /** フォント URL(デフォルト: Noto Sans JP Regular) */
9
+ fontUrl?: string;
10
+ /** MSDF テクスチャサイズ(デフォルト: [2048, 2048]) */
11
+ textureSize?: [number, number];
12
+ }
13
+ /**
14
+ * 日本語 MSDF フォントの読み込み・ロード待ちを内包した Container。
15
+ *
16
+ * `texts` に含まれる文字からフォントを生成し、
17
+ * テクスチャのロードが完了してから children を表示する。
18
+ * Suspense 対応のため、親に `<Suspense>` が必要。
19
+ *
20
+ * 複数コンポーネントでアトラスを共有したい場合は `FontProvider` を使用。
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const TEXTS = ['URLを入力してください']
25
+ *
26
+ * <Suspense fallback={null}>
27
+ * <FontReadyContainer texts={TEXTS} sizeX={4} backgroundColor={0x000000}>
28
+ * <Text fontSize={48}>URLを入力してください</Text>
29
+ * </FontReadyContainer>
30
+ * </Suspense>
31
+ * ```
32
+ */
33
+ export declare const FontReadyContainer: import("react").MemoExoticComponent<({ texts, children, fontUrl, textureSize, ...containerProps }: Props) => import("react/jsx-runtime").JSX.Element>;
34
+ export {};
35
+ //# sourceMappingURL=FontReadyContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontReadyContainer.d.ts","sourceRoot":"","sources":["../../src/fonts/FontReadyContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACtF,OAAO,EAAE,SAAS,EAAQ,MAAM,oBAAoB,CAAA;AAGpD,KAAK,cAAc,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,CAAA;AAEtD,UAAU,KAAM,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IACtD,2CAA2C;IAC3C,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,kBAAkB,qGACkC,KAAK,6CAoBrE,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo, useState, useEffect } from 'react';
3
+ import { Container, Text } from '@react-three/uikit';
4
+ import { useMsdfFont } from '../hooks/useMsdfFont';
5
+ /**
6
+ * 日本語 MSDF フォントの読み込み・ロード待ちを内包した Container。
7
+ *
8
+ * `texts` に含まれる文字からフォントを生成し、
9
+ * テクスチャのロードが完了してから children を表示する。
10
+ * Suspense 対応のため、親に `<Suspense>` が必要。
11
+ *
12
+ * 複数コンポーネントでアトラスを共有したい場合は `FontProvider` を使用。
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * const TEXTS = ['URLを入力してください']
17
+ *
18
+ * <Suspense fallback={null}>
19
+ * <FontReadyContainer texts={TEXTS} sizeX={4} backgroundColor={0x000000}>
20
+ * <Text fontSize={48}>URLを入力してください</Text>
21
+ * </FontReadyContainer>
22
+ * </Suspense>
23
+ * ```
24
+ */
25
+ export const FontReadyContainer = memo(({ texts, children, fontUrl, textureSize, ...containerProps }) => {
26
+ const fontFamilies = useMsdfFont(texts, fontUrl, textureSize);
27
+ // uikit はフォントテクスチャを非同期でロードするため、
28
+ // 初回レンダリングでデフォルトの inter フォントへフォールバックし
29
+ // "Missing glyph info" 警告が出る。スペースのみの Text で
30
+ // フォントロードをトリガーし、次フレームで children を表示する。
31
+ const [fontReady, setFontReady] = useState(false);
32
+ useEffect(() => {
33
+ setFontReady(false);
34
+ const id = requestAnimationFrame(() => setFontReady(true));
35
+ return () => cancelAnimationFrame(id);
36
+ }, [fontFamilies]);
37
+ return (_jsx(Container, { fontFamilies: fontFamilies, ...containerProps, children: fontReady ? children : _jsx(Text, { fontSize: 1, children: ' ' }) }));
38
+ });
39
+ FontReadyContainer.displayName = 'FontReadyContainer';
40
+ //# sourceMappingURL=FontReadyContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FontReadyContainer.js","sourceRoot":"","sources":["../../src/fonts/FontReadyContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAuC,MAAM,OAAO,CAAA;AACtF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAclD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CACpC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,cAAc,EAAS,EAAE,EAAE;IACtE,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;IAE7D,gCAAgC;IAChC,sCAAsC;IACtC,4CAA4C;IAC5C,uCAAuC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,KAAK,CAAC,CAAA;QACnB,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAC1D,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,OAAO,CACL,KAAC,SAAS,IAAC,YAAY,EAAE,YAAY,KAAM,cAAc,YACtD,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,QAAQ,EAAE,CAAC,YAAG,GAAG,GAAQ,GAC7C,CACb,CAAA;AACH,CAAC,CACF,CAAA;AAED,kBAAkB,CAAC,WAAW,GAAG,oBAAoB,CAAA"}
@@ -1,7 +1,5 @@
1
1
  /** Noto Sans JP Regular (CDN) */
2
2
  export declare const JAPANESE_FONT_URL = "https://cdn.jsdelivr.net/fontsource/fonts/noto-sans-jp@latest/japanese-400-normal.ttf";
3
- /** MSDF 生成に含める文字セット(ひらがな・カタカナ・常用句読点・ASCII) */
4
- export declare const JAPANESE_CHARSET: string;
5
3
  /** MSDF テクスチャサイズ(日本語文字数に対応するため大きめ) */
6
4
  export declare const JAPANESE_TEXTURE_SIZE: [number, number];
7
5
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/fonts/constants.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,eAAO,MAAM,iBAAiB,0FAC2D,CAAA;AAEzF,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,QAkBnB,CAAA;AAEV,sCAAsC;AACtC,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAgB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/fonts/constants.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,eAAO,MAAM,iBAAiB,0FAC2D,CAAA;AAEzF,sCAAsC;AACtC,eAAO,MAAM,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAgB,CAAA"}
@@ -1,25 +1,5 @@
1
1
  /** Noto Sans JP Regular (CDN) */
2
2
  export const JAPANESE_FONT_URL = 'https://cdn.jsdelivr.net/fontsource/fonts/noto-sans-jp@latest/japanese-400-normal.ttf';
3
- /** MSDF 生成に含める文字セット(ひらがな・カタカナ・常用句読点・ASCII) */
4
- export const JAPANESE_CHARSET = [
5
- // ASCII
6
- ' !"#$%&\'()*+,-./0123456789:;<=>?@',
7
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`',
8
- 'abcdefghijklmnopqrstuvwxyz{|}~',
9
- // ひらがな
10
- 'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞ',
11
- 'ただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽ',
12
- 'まみむめもゃやゅゆょよらりるれろゎわゐゑをん',
13
- // カタカナ
14
- 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ',
15
- 'タダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポ',
16
- 'マミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ',
17
- // 日本語句読点・記号
18
- '。、・「」『』()〔〕【】〜ー―…‥々〇〈〉《》!?',
19
- ' .,:;/¥$#&*+−=|<>_',
20
- // 長音・半濁点
21
- 'ーー゛゜',
22
- ].join('');
23
3
  /** MSDF テクスチャサイズ(日本語文字数に対応するため大きめ) */
24
4
  export const JAPANESE_TEXTURE_SIZE = [2048, 2048];
25
5
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/fonts/constants.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAC5B,uFAAuF,CAAA;AAEzF,8CAA8C;AAC9C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ;IACR,oCAAoC;IACpC,mCAAmC;IACnC,gCAAgC;IAChC,OAAO;IACP,gCAAgC;IAChC,iCAAiC;IACjC,wBAAwB;IACxB,OAAO;IACP,gCAAgC;IAChC,iCAAiC;IACjC,2BAA2B;IAC3B,YAAY;IACZ,4BAA4B;IAC5B,oBAAoB;IACpB,SAAS;IACT,MAAM;CACP,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEV,sCAAsC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/fonts/constants.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAC5B,uFAAuF,CAAA;AAEzF,sCAAsC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { type GenerateFontResult } from '@zappar/msdf-generator';
2
+ interface FontInput {
3
+ url: string;
4
+ charset: string;
5
+ fontSize?: number;
6
+ textureSize?: [number, number];
7
+ fieldRange?: number;
8
+ padding?: number;
9
+ fixOverlaps?: boolean;
10
+ }
11
+ /**
12
+ * TTF フォントを読み込み MSDF アトラスを生成する。
13
+ * `@zappar/msdf-generator` を static import することで、
14
+ * dynamic import がハングする Triplex 環境でも動作する。
15
+ */
16
+ export declare const loadTTF: (input: FontInput) => Promise<GenerateFontResult>;
17
+ export {};
18
+ //# sourceMappingURL=loadTTF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTTF.d.ts","sourceRoot":"","sources":["../../src/fonts/loadTTF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAGtE,UAAU,SAAS;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAUD;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAAU,OAAO,SAAS,KAAG,OAAO,CAAC,kBAAkB,CAoB1E,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { MSDF } from '@zappar/msdf-generator';
2
+ import { FileLoader } from 'three';
3
+ const DEFAULTS = {
4
+ fontSize: 48,
5
+ textureSize: [512, 512],
6
+ fieldRange: 4,
7
+ padding: 4,
8
+ fixOverlaps: true,
9
+ };
10
+ /**
11
+ * TTF フォントを読み込み MSDF アトラスを生成する。
12
+ * `@zappar/msdf-generator` を static import することで、
13
+ * dynamic import がハングする Triplex 環境でも動作する。
14
+ */
15
+ export const loadTTF = async (input) => {
16
+ const loader = new FileLoader();
17
+ loader.setResponseType('arraybuffer');
18
+ const arrayBuffer = (await loader.loadAsync(input.url));
19
+ const generator = new MSDF();
20
+ try {
21
+ await generator.initialize();
22
+ return await generator.generate({
23
+ font: new Uint8Array(arrayBuffer),
24
+ charset: input.charset,
25
+ fontSize: input.fontSize ?? DEFAULTS.fontSize,
26
+ textureSize: input.textureSize ?? DEFAULTS.textureSize,
27
+ fieldRange: input.fieldRange ?? DEFAULTS.fieldRange,
28
+ padding: input.padding ?? DEFAULTS.padding,
29
+ fixOverlaps: input.fixOverlaps ?? DEFAULTS.fixOverlaps,
30
+ });
31
+ }
32
+ finally {
33
+ generator.dispose();
34
+ }
35
+ };
36
+ //# sourceMappingURL=loadTTF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadTTF.js","sourceRoot":"","sources":["../../src/fonts/loadTTF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAA2B,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAYlC,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAqB;IAC3C,UAAU,EAAE,CAAC;IACb,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,IAAI;CACT,CAAA;AAEV;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAgB,EAA+B,EAAE;IAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;IAC/B,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;IACrC,MAAM,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAgB,CAAA;IAEtE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,CAAA;QAC5B,OAAO,MAAM,SAAS,CAAC,QAAQ,CAAC;YAC9B,IAAI,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;YACjC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;YAC7C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;YACtD,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU;YACnD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC1C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;SACvD,CAAC,CAAA;IACJ,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,OAAO,EAAE,CAAA;IACrB,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { GenerateFontResult } from '@zappar/msdf-generator';
2
+ /**
3
+ * TTF フォントを MSDF 形式で読み込む Suspense 対応 hook。
4
+ * static import 版の loadTTF を使用するため Triplex でも動作する。
5
+ */
6
+ export declare const useTTF: (url: string, charset: string, textureSize?: [number, number]) => GenerateFontResult;
7
+ //# sourceMappingURL=useTTF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTTF.d.ts","sourceRoot":"","sources":["../../src/fonts/useTTF.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAKhE;;;GAGG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,MAAM,EACX,SAAS,MAAM,EACf,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,kBASA,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { suspend } from 'suspend-react';
2
+ import { loadTTF } from './loadTTF';
3
+ const cacheSymbol = Symbol('xrift-ttf');
4
+ /**
5
+ * TTF フォントを MSDF 形式で読み込む Suspense 対応 hook。
6
+ * static import 版の loadTTF を使用するため Triplex でも動作する。
7
+ */
8
+ export const useTTF = (url, charset, textureSize) => suspend(async (_key, url, charset, textureSize) => loadTTF({ url, charset, textureSize }), [cacheSymbol, url, charset, textureSize]);
9
+ //# sourceMappingURL=useTTF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTTF.js","sourceRoot":"","sources":["../../src/fonts/useTTF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,GAAW,EACX,OAAe,EACf,WAA8B,EACV,EAAE,CACtB,OAAO,CACL,KAAK,EACH,IAAY,EACZ,GAAW,EACX,OAAe,EACf,WAA8B,EAC9B,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAC3C,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CACzC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import type { FontFamilies } from '@pmndrs/uikit';
2
+ export type FontLocale = 'ja';
3
+ /**
4
+ * UIKit 用の多言語 MSDF フォントをロードする hook
5
+ *
6
+ * @param locales - ロードするフォントのロケール配列
7
+ * @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
+ */
20
+ export declare function useDefaultFont(locales: FontLocale[]): FontFamilies | undefined;
21
+ //# sourceMappingURL=useDefaultFont.d.ts.map
@@ -0,0 +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;AAyB7B;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EAAE,GACpB,YAAY,GAAG,SAAS,CAsB1B"}
@@ -0,0 +1,52 @@
1
+ import { useEffect, useState } from 'react';
2
+ const FONT_REGISTRY = {
3
+ ja: {
4
+ baseUrl: 'https://public.xrift.net/fonts/msdf/NotoSansJP',
5
+ version: 2,
6
+ },
7
+ };
8
+ async function loadFont(locale) {
9
+ const config = FONT_REGISTRY[locale];
10
+ const url = `${config.baseUrl}/metrics.json?v=${config.version}`;
11
+ const res = await fetch(url);
12
+ const metrics = await res.json();
13
+ metrics.pages = [`${config.baseUrl}/atlas.png?v=${config.version}`];
14
+ return [locale, { normal: metrics }];
15
+ }
16
+ /**
17
+ * UIKit 用の多言語 MSDF フォントをロードする hook
18
+ *
19
+ * @param locales - ロードするフォントのロケール配列
20
+ * @returns ロード完了後に FontFamilies を返す。ロード中は undefined
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * const fontFamilies = useDefaultFont(['ja'])
25
+ *
26
+ * return (
27
+ * <Container fontFamilies={fontFamilies}>
28
+ * <Text fontFamily="ja">こんにちは</Text>
29
+ * </Container>
30
+ * )
31
+ * ```
32
+ */
33
+ export function useDefaultFont(locales) {
34
+ const [fontFamilies, setFontFamilies] = useState();
35
+ const key = locales.slice().sort().join(',');
36
+ useEffect(() => {
37
+ if (key === '')
38
+ return;
39
+ let cancelled = false;
40
+ const targetLocales = key.split(',');
41
+ Promise.all(targetLocales.map(loadFont)).then((entries) => {
42
+ if (!cancelled) {
43
+ setFontFamilies(Object.fromEntries(entries));
44
+ }
45
+ });
46
+ return () => {
47
+ cancelled = true;
48
+ };
49
+ }, [key]);
50
+ return fontFamilies;
51
+ }
52
+ //# sourceMappingURL=useDefaultFont.js.map
@@ -0,0 +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,KAAK,UAAU,QAAQ,CACrB,MAAkB;IAElB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAA;IAChE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAChC,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,gBAAgB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACnE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAqB;IAErB,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,EAA4B,CAAA;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,GAAG,KAAK,EAAE;YAAE,OAAM;QAEtB,IAAI,SAAS,GAAG,KAAK,CAAA;QACrB,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAA;QAEpD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACxD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;YAC9C,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAET,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -1,4 +1,7 @@
1
- export declare const useJapaneseFont: (options?: {
2
- charset?: string;
3
- }) => import("@zappar/msdf-generator").FontFamily;
1
+ /**
2
+ * 日本語フォントを MSDF 形式で読み込む hook。
3
+ * @param texts - 表示予定のテキスト配列。ここに含まれる漢字のみ MSDF 生成されるため、
4
+ * 表示する全テキストを渡すこと。安定した参照の配列を渡すことを推奨。
5
+ */
6
+ export declare const useJapaneseFont: (texts: string[]) => import("@zappar/msdf-generator").FontFamily;
4
7
  //# sourceMappingURL=useJapaneseFont.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useJapaneseFont.d.ts","sourceRoot":"","sources":["../../src/hooks/useJapaneseFont.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,gDAS7D,CAAA"}
1
+ {"version":3,"file":"useJapaneseFont.d.ts","sourceRoot":"","sources":["../../src/hooks/useJapaneseFont.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,gDAa9C,CAAA"}
@@ -1,13 +1,25 @@
1
+ import { useMemo } from 'react';
2
+ // useTTF は @react-three/uikit のメインエントリに含まれないため dist/use-ttf から直接インポート
1
3
  import { useTTF } from '@react-three/uikit/dist/use-ttf';
2
- import { JAPANESE_FONT_URL, JAPANESE_CHARSET, JAPANESE_TEXTURE_SIZE, } from '../fonts/constants';
3
- export const useJapaneseFont = (options) => {
4
- const input = [
4
+ import { JAPANESE_FONT_URL, JAPANESE_BASE_CHARSET, JAPANESE_TEXTURE_SIZE, } from '../fonts/constants';
5
+ const deriveCharset = (texts) => {
6
+ const extra = [...new Set(texts.join(''))].join('');
7
+ return JAPANESE_BASE_CHARSET + extra;
8
+ };
9
+ /**
10
+ * 日本語フォントを MSDF 形式で読み込む hook。
11
+ * @param texts - 表示予定のテキスト配列。ここに含まれる漢字のみ MSDF 生成されるため、
12
+ * 表示する全テキストを渡すこと。安定した参照の配列を渡すことを推奨。
13
+ */
14
+ export const useJapaneseFont = (texts) => {
15
+ const key = texts.join('\0');
16
+ const input = useMemo(() => [
5
17
  {
6
18
  url: JAPANESE_FONT_URL,
7
- charset: options?.charset ?? JAPANESE_CHARSET,
19
+ charset: deriveCharset(texts),
8
20
  textureSize: JAPANESE_TEXTURE_SIZE,
9
21
  },
10
- ];
22
+ ], [key]);
11
23
  return useTTF(input);
12
24
  };
13
25
  //# sourceMappingURL=useJapaneseFont.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useJapaneseFont.js","sourceRoot":"","sources":["../../src/hooks/useJapaneseFont.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,iCAAiC,CAAA;AAC3E,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAA8B,EAAE,EAAE;IAChE,MAAM,KAAK,GAAmB;QAC5B;YACE,GAAG,EAAE,iBAAiB;YACtB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,gBAAgB;YAC7C,WAAW,EAAE,qBAAqB;SACnC;KACF,CAAA;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC,CAAA"}
1
+ {"version":3,"file":"useJapaneseFont.js","sourceRoot":"","sources":["../../src/hooks/useJapaneseFont.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,sEAAsE;AACtE,OAAO,EAAE,MAAM,EAAqB,MAAM,iCAAiC,CAAA;AAC3E,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,aAAa,GAAG,CAAC,KAAe,EAAU,EAAE;IAChD,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnD,OAAO,qBAAqB,GAAG,KAAK,CAAA;AACtC,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAe,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC;QACJ;YACE,GAAG,EAAE,iBAAiB;YACtB,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;YAC7B,WAAW,EAAE,qBAAqB;SACnC;KACF,EACD,CAAC,GAAG,CAAC,CACN,CAAA;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;AACtB,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MSDF フォントを読み込む hook。
3
+ * MsdfText を使わず uikit のレイアウトを自分で組みたい場合に使用する。
4
+ *
5
+ * @param texts - 表示予定のテキスト配列。ここに含まれる文字が MSDF 生成される。
6
+ * 安定した参照の配列を渡すことを推奨。
7
+ * @param fontUrl - フォント URL(デフォルト: Noto Sans JP Regular)
8
+ * @param textureSize - MSDF テクスチャサイズ(デフォルト: [2048, 2048])
9
+ */
10
+ export declare const useMsdfFont: (texts: string[], fontUrl?: string, textureSize?: [number, number]) => import("@zappar/msdf-generator").FontFamily;
11
+ //# sourceMappingURL=useMsdfFont.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsdfFont.d.ts","sourceRoot":"","sources":["../../src/hooks/useMsdfFont.ts"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EAAE,EACf,UAAS,MAA0B,EACnC,cAAa,CAAC,MAAM,EAAE,MAAM,CAAyB,gDAMtD,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { useMemo } from 'react';
2
+ import { useTTF } from '../fonts/useTTF';
3
+ import { JAPANESE_FONT_URL, JAPANESE_TEXTURE_SIZE, } from '../fonts/constants';
4
+ const deriveCharset = (texts) => [...new Set(texts.join(''))].join('');
5
+ /**
6
+ * MSDF フォントを読み込む hook。
7
+ * MsdfText を使わず uikit のレイアウトを自分で組みたい場合に使用する。
8
+ *
9
+ * @param texts - 表示予定のテキスト配列。ここに含まれる文字が MSDF 生成される。
10
+ * 安定した参照の配列を渡すことを推奨。
11
+ * @param fontUrl - フォント URL(デフォルト: Noto Sans JP Regular)
12
+ * @param textureSize - MSDF テクスチャサイズ(デフォルト: [2048, 2048])
13
+ */
14
+ export const useMsdfFont = (texts, fontUrl = JAPANESE_FONT_URL, textureSize = JAPANESE_TEXTURE_SIZE) => {
15
+ const key = texts.join('\0');
16
+ const charset = useMemo(() => deriveCharset(texts), [key]);
17
+ return useTTF(fontUrl, charset, textureSize);
18
+ };
19
+ //# sourceMappingURL=useMsdfFont.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsdfFont.js","sourceRoot":"","sources":["../../src/hooks/useMsdfFont.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,aAAa,GAAG,CAAC,KAAe,EAAU,EAAE,CAChD,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEvC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAe,EACf,UAAkB,iBAAiB,EACnC,cAAgC,qBAAqB,EACrD,EAAE;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAE1D,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;AAC9C,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export { useInstance } from './hooks/useInstance';
35
35
  export { useWorld } from './hooks/useWorld';
36
36
  export { useInstanceEvent } from './hooks/useInstanceEvent';
37
37
  export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
38
+ export { useDefaultFont, type FontLocale } from './hooks/useDefaultFont';
38
39
  export { LAYERS, type LayerName, type LayerNumber } from './constants/layers';
39
40
  export { type PlayerMovement, type Position3D, type Rotation3D, type VRTrackingData, type VRMovementDirection, } from './types/movement';
40
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kCAAkC,EAClC,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gCAAgC,EAChC,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,EACnC,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wCAAwC,EACxC,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,0BAA0B,GAChC,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,6BAA6B,EAC7B,8CAA8C,EAC9C,KAAK,+BAA+B,EAEpC,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,sCAAsC,EACtC,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,GACxB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,UAAU,EACV,aAAa,EACb,qBAAqB,GACtB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,mCAAmC,CAAA;AAG1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAG7E,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ export { useInstance } from './hooks/useInstance';
39
39
  export { useWorld } from './hooks/useWorld';
40
40
  export { useInstanceEvent } from './hooks/useInstanceEvent';
41
41
  export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
42
+ export { useDefaultFont } from './hooks/useDefaultFont';
42
43
  // Constants
43
44
  export { LAYERS } from './constants/layers';
44
45
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xrift/world-components",
3
- "version": "0.34.0",
3
+ "version": "0.35.1",
4
4
  "description": "Shared components and utilities for Xrift worlds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -9,7 +9,8 @@
9
9
  ],
10
10
  "scripts": {
11
11
  "build": "tsc",
12
- "dev": "tsc --watch",
12
+ "dev": "vite",
13
+ "dev:build": "tsc --watch",
13
14
  "test": "vitest run",
14
15
  "test:watch": "vitest",
15
16
  "prepublishOnly": "npm run build"
@@ -58,6 +59,7 @@
58
59
  "@triplex/api": "^0.1.4",
59
60
  "@types/react": "^18.3.12",
60
61
  "@types/three": "^0.181.0",
62
+ "@vitejs/plugin-react": "^6.0.1",
61
63
  "jsdom": "^28.0.0",
62
64
  "react-dom": "^19.2.0",
63
65
  "three": "^0.181.0",