@xrift/world-components 0.33.3 → 0.35.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 (61) hide show
  1. package/dist/components/MsdfText/index.d.ts +24 -0
  2. package/dist/components/MsdfText/index.d.ts.map +1 -0
  3. package/dist/components/MsdfText/index.js +24 -0
  4. package/dist/components/MsdfText/index.js.map +1 -0
  5. package/dist/components/TroikaText/index.d.ts +4 -0
  6. package/dist/components/TroikaText/index.d.ts.map +1 -0
  7. package/dist/components/TroikaText/index.js +50 -0
  8. package/dist/components/TroikaText/index.js.map +1 -0
  9. package/dist/components/TroikaText/types.d.ts +19 -0
  10. package/dist/components/TroikaText/types.d.ts.map +1 -0
  11. package/dist/components/TroikaText/types.js +2 -0
  12. package/dist/components/TroikaText/types.js.map +1 -0
  13. package/dist/contexts/AudioVolumeContext.d.ts +16 -6
  14. package/dist/contexts/AudioVolumeContext.d.ts.map +1 -1
  15. package/dist/contexts/AudioVolumeContext.js +16 -8
  16. package/dist/contexts/AudioVolumeContext.js.map +1 -1
  17. package/dist/fonts/FontContext.d.ts +9 -0
  18. package/dist/fonts/FontContext.d.ts.map +1 -0
  19. package/dist/fonts/FontContext.js +5 -0
  20. package/dist/fonts/FontContext.js.map +1 -0
  21. package/dist/fonts/FontProvider.d.ts +31 -0
  22. package/dist/fonts/FontProvider.d.ts.map +1 -0
  23. package/dist/fonts/FontProvider.js +40 -0
  24. package/dist/fonts/FontProvider.js.map +1 -0
  25. package/dist/fonts/FontReadyContainer.d.ts +35 -0
  26. package/dist/fonts/FontReadyContainer.d.ts.map +1 -0
  27. package/dist/fonts/FontReadyContainer.js +40 -0
  28. package/dist/fonts/FontReadyContainer.js.map +1 -0
  29. package/dist/fonts/constants.d.ts +0 -2
  30. package/dist/fonts/constants.d.ts.map +1 -1
  31. package/dist/fonts/constants.js +0 -20
  32. package/dist/fonts/constants.js.map +1 -1
  33. package/dist/fonts/loadTTF.d.ts +18 -0
  34. package/dist/fonts/loadTTF.d.ts.map +1 -0
  35. package/dist/fonts/loadTTF.js +36 -0
  36. package/dist/fonts/loadTTF.js.map +1 -0
  37. package/dist/fonts/useTTF.d.ts +7 -0
  38. package/dist/fonts/useTTF.d.ts.map +1 -0
  39. package/dist/fonts/useTTF.js +9 -0
  40. package/dist/fonts/useTTF.js.map +1 -0
  41. package/dist/hooks/useAudioVolume.d.ts +6 -4
  42. package/dist/hooks/useAudioVolume.d.ts.map +1 -1
  43. package/dist/hooks/useAudioVolume.js +7 -5
  44. package/dist/hooks/useAudioVolume.js.map +1 -1
  45. package/dist/hooks/useDefaultFont.d.ts +21 -0
  46. package/dist/hooks/useDefaultFont.d.ts.map +1 -0
  47. package/dist/hooks/useDefaultFont.js +52 -0
  48. package/dist/hooks/useDefaultFont.js.map +1 -0
  49. package/dist/hooks/useJapaneseFont.d.ts +6 -3
  50. package/dist/hooks/useJapaneseFont.d.ts.map +1 -1
  51. package/dist/hooks/useJapaneseFont.js +17 -5
  52. package/dist/hooks/useJapaneseFont.js.map +1 -1
  53. package/dist/hooks/useMsdfFont.d.ts +11 -0
  54. package/dist/hooks/useMsdfFont.d.ts.map +1 -0
  55. package/dist/hooks/useMsdfFont.js +19 -0
  56. package/dist/hooks/useMsdfFont.js.map +1 -0
  57. package/dist/index.d.ts +3 -3
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +5 -3
  60. package/dist/index.js.map +1 -1
  61. package/package.json +4 -2
@@ -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":""}
@@ -1,32 +1,42 @@
1
1
  import { type ReactNode } from 'react';
2
- export interface AudioVolumeContextValue {
2
+ export interface VoiceVolumeOverrideContextValue {
3
3
  setOverride: (userId: string, volume: number) => void;
4
4
  clearOverride: (userId: string) => void;
5
5
  clearAll: () => void;
6
6
  getOverrides: () => ReadonlyMap<string, number>;
7
7
  }
8
+ /** @deprecated Use VoiceVolumeOverrideContextValue instead */
9
+ export type AudioVolumeContextValue = VoiceVolumeOverrideContextValue;
8
10
  /**
9
11
  * 開発環境用のデフォルト実装(no-op)
10
12
  * プラットフォーム側が実装を注入しない場合に使用される
11
13
  */
12
- export declare const createDefaultAudioVolumeImplementation: () => AudioVolumeContextValue;
14
+ export declare const createDefaultVoiceVolumeOverrideImplementation: () => VoiceVolumeOverrideContextValue;
15
+ /** @deprecated Use createDefaultVoiceVolumeOverrideImplementation instead */
16
+ export declare const createDefaultAudioVolumeImplementation: () => VoiceVolumeOverrideContextValue;
13
17
  /**
14
18
  * 音量オーバーライド機能を提供する Context
15
19
  * xrift-frontend 側で実装を注入し、ワールド側で利用できる
16
20
  */
17
- export declare const AudioVolumeContext: import("react").Context<AudioVolumeContextValue | null>;
21
+ export declare const VoiceVolumeOverrideContext: import("react").Context<VoiceVolumeOverrideContextValue | null>;
22
+ /** @deprecated Use VoiceVolumeOverrideContext instead */
23
+ export declare const AudioVolumeContext: import("react").Context<VoiceVolumeOverrideContextValue | null>;
18
24
  interface Props {
19
- value: AudioVolumeContextValue;
25
+ value: VoiceVolumeOverrideContextValue;
20
26
  children: ReactNode;
21
27
  }
22
28
  /**
23
29
  * 音量オーバーライド機能を提供する ContextProvider
24
30
  */
31
+ export declare const VoiceVolumeOverrideProvider: ({ value, children }: Props) => import("react/jsx-runtime").JSX.Element;
32
+ /** @deprecated Use VoiceVolumeOverrideProvider instead */
25
33
  export declare const AudioVolumeProvider: ({ value, children }: Props) => import("react/jsx-runtime").JSX.Element;
26
34
  /**
27
35
  * 音量オーバーライドの Context を取得する hook
28
- * @throws {Error} AudioVolumeProvider の外で呼び出された場合
36
+ * @throws {Error} VoiceVolumeOverrideProvider の外で呼び出された場合
29
37
  */
30
- export declare const useAudioVolumeContext: () => AudioVolumeContextValue;
38
+ export declare const useVoiceVolumeOverrideContext: () => VoiceVolumeOverrideContextValue;
39
+ /** @deprecated Use useVoiceVolumeOverrideContext instead */
40
+ export declare const useAudioVolumeContext: () => VoiceVolumeOverrideContextValue;
31
41
  export {};
32
42
  //# sourceMappingURL=AudioVolumeContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioVolumeContext.d.ts","sourceRoot":"","sources":["../../src/contexts/AudioVolumeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAA;AAEjE,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,YAAY,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChD;AAED;;;GAGG;AACH,eAAO,MAAM,sCAAsC,QAAO,uBAKxD,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,yDAAsD,CAAA;AAErF,UAAU,KAAK;IACb,KAAK,EAAE,uBAAuB,CAAA;IAC9B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,qBAAqB,KAAK,4CAE7D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,uBAMxC,CAAA"}
1
+ {"version":3,"file":"AudioVolumeContext.d.ts","sourceRoot":"","sources":["../../src/contexts/AudioVolumeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAc,MAAM,OAAO,CAAA;AAEjE,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,YAAY,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChD;AAED,8DAA8D;AAC9D,MAAM,MAAM,uBAAuB,GAAG,+BAA+B,CAAA;AAErE;;;GAGG;AACH,eAAO,MAAM,8CAA8C,QAAO,+BAKhE,CAAA;AAEF,6EAA6E;AAC7E,eAAO,MAAM,sCAAsC,QARe,+BAQkC,CAAA;AAEpG;;;GAGG;AACH,eAAO,MAAM,0BAA0B,iEAA8D,CAAA;AAErG,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,iEAA6B,CAAA;AAE5D,UAAU,KAAK;IACb,KAAK,EAAE,+BAA+B,CAAA;IACtC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,qBAAqB,KAAK,4CAErE,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,wBALiC,KAAK,4CAKR,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,6BAA6B,QAAO,+BAMhD,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,QATe,+BASiB,CAAA"}
@@ -4,32 +4,40 @@ import { createContext, useContext } from 'react';
4
4
  * 開発環境用のデフォルト実装(no-op)
5
5
  * プラットフォーム側が実装を注入しない場合に使用される
6
6
  */
7
- export const createDefaultAudioVolumeImplementation = () => ({
7
+ export const createDefaultVoiceVolumeOverrideImplementation = () => ({
8
8
  setOverride: () => { },
9
9
  clearOverride: () => { },
10
10
  clearAll: () => { },
11
11
  getOverrides: () => new Map(),
12
12
  });
13
+ /** @deprecated Use createDefaultVoiceVolumeOverrideImplementation instead */
14
+ export const createDefaultAudioVolumeImplementation = createDefaultVoiceVolumeOverrideImplementation;
13
15
  /**
14
16
  * 音量オーバーライド機能を提供する Context
15
17
  * xrift-frontend 側で実装を注入し、ワールド側で利用できる
16
18
  */
17
- export const AudioVolumeContext = createContext(null);
19
+ export const VoiceVolumeOverrideContext = createContext(null);
20
+ /** @deprecated Use VoiceVolumeOverrideContext instead */
21
+ export const AudioVolumeContext = VoiceVolumeOverrideContext;
18
22
  /**
19
23
  * 音量オーバーライド機能を提供する ContextProvider
20
24
  */
21
- export const AudioVolumeProvider = ({ value, children }) => {
22
- return _jsx(AudioVolumeContext.Provider, { value: value, children: children });
25
+ export const VoiceVolumeOverrideProvider = ({ value, children }) => {
26
+ return _jsx(VoiceVolumeOverrideContext.Provider, { value: value, children: children });
23
27
  };
28
+ /** @deprecated Use VoiceVolumeOverrideProvider instead */
29
+ export const AudioVolumeProvider = VoiceVolumeOverrideProvider;
24
30
  /**
25
31
  * 音量オーバーライドの Context を取得する hook
26
- * @throws {Error} AudioVolumeProvider の外で呼び出された場合
32
+ * @throws {Error} VoiceVolumeOverrideProvider の外で呼び出された場合
27
33
  */
28
- export const useAudioVolumeContext = () => {
29
- const context = useContext(AudioVolumeContext);
34
+ export const useVoiceVolumeOverrideContext = () => {
35
+ const context = useContext(VoiceVolumeOverrideContext);
30
36
  if (!context) {
31
- throw new Error('useAudioVolumeContext must be used within AudioVolumeProvider');
37
+ throw new Error('useVoiceVolumeOverrideContext must be used within VoiceVolumeOverrideProvider');
32
38
  }
33
39
  return context;
34
40
  };
41
+ /** @deprecated Use useVoiceVolumeOverrideContext instead */
42
+ export const useAudioVolumeContext = useVoiceVolumeOverrideContext;
35
43
  //# sourceMappingURL=AudioVolumeContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AudioVolumeContext.js","sourceRoot":"","sources":["../../src/contexts/AudioVolumeContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,MAAM,OAAO,CAAA;AASjE;;;GAGG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,GAA4B,EAAE,CAAC,CAAC;IACpF,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;IACrB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE;CAC9B,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAiC,IAAI,CAAC,CAAA;AAOrF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAS,EAAE,EAAE;IAChE,OAAO,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA+B,CAAA;AAC5F,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAA4B,EAAE;IACjE,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAA;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"AudioVolumeContext.js","sourceRoot":"","sources":["../../src/contexts/AudioVolumeContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,UAAU,EAAE,MAAM,OAAO,CAAA;AAYjE;;;GAGG;AACH,MAAM,CAAC,MAAM,8CAA8C,GAAG,GAAoC,EAAE,CAAC,CAAC;IACpG,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;IACrB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE;CAC9B,CAAC,CAAA;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,sCAAsC,GAAG,8CAA8C,CAAA;AAEpG;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAyC,IAAI,CAAC,CAAA;AAErG,yDAAyD;AACzD,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAA;AAO5D;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAS,EAAE,EAAE;IACxE,OAAO,KAAC,0BAA0B,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAuC,CAAA;AAC5G,CAAC,CAAA;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,2BAA2B,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAoC,EAAE;IACjF,MAAM,OAAO,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAA;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAA;IAClG,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,CAAA"}
@@ -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"}
@@ -1,10 +1,10 @@
1
- import { type AudioVolumeContextValue } from '../contexts/AudioVolumeContext';
1
+ import { type VoiceVolumeOverrideContextValue } from '../contexts/AudioVolumeContext';
2
2
  /**
3
- * 特定ユーザーの音声ボリュームをオーバーライドするhook
3
+ * 特定ユーザーのボイスチャット音量をオーバーライドするhook
4
4
  * ワールド制作者が演壇やステージなどで特定ユーザーの音量を制御するために使用
5
5
  *
6
6
  * @example
7
- * const { setOverride, clearOverride } = useAudioVolume()
7
+ * const { setOverride, clearOverride } = useVoiceVolumeOverride()
8
8
  *
9
9
  * // 演壇に立った人の声を全体に届ける
10
10
  * setOverride(speakerUserId, 1.0)
@@ -12,5 +12,7 @@ import { type AudioVolumeContextValue } from '../contexts/AudioVolumeContext';
12
12
  * // オーバーライドを解除
13
13
  * clearOverride(speakerUserId)
14
14
  */
15
- export declare const useAudioVolume: () => AudioVolumeContextValue;
15
+ export declare const useVoiceVolumeOverride: () => VoiceVolumeOverrideContextValue;
16
+ /** @deprecated Use useVoiceVolumeOverride instead */
17
+ export declare const useAudioVolume: () => VoiceVolumeOverrideContextValue;
16
18
  //# sourceMappingURL=useAudioVolume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioVolume.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,uBAAuB,EAAyB,MAAM,gCAAgC,CAAA;AAEpG;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,QAAO,uBAEjC,CAAA"}
1
+ {"version":3,"file":"useAudioVolume.d.ts","sourceRoot":"","sources":["../../src/hooks/useAudioVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,+BAA+B,EAAiC,MAAM,gCAAgC,CAAA;AAEpH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,QAAO,+BAEzC,CAAA;AAED,qDAAqD;AACrD,eAAO,MAAM,cAAc,QALe,+BAKU,CAAA"}
@@ -1,10 +1,10 @@
1
- import { useAudioVolumeContext } from '../contexts/AudioVolumeContext';
1
+ import { useVoiceVolumeOverrideContext } from '../contexts/AudioVolumeContext';
2
2
  /**
3
- * 特定ユーザーの音声ボリュームをオーバーライドするhook
3
+ * 特定ユーザーのボイスチャット音量をオーバーライドするhook
4
4
  * ワールド制作者が演壇やステージなどで特定ユーザーの音量を制御するために使用
5
5
  *
6
6
  * @example
7
- * const { setOverride, clearOverride } = useAudioVolume()
7
+ * const { setOverride, clearOverride } = useVoiceVolumeOverride()
8
8
  *
9
9
  * // 演壇に立った人の声を全体に届ける
10
10
  * setOverride(speakerUserId, 1.0)
@@ -12,7 +12,9 @@ import { useAudioVolumeContext } from '../contexts/AudioVolumeContext';
12
12
  * // オーバーライドを解除
13
13
  * clearOverride(speakerUserId)
14
14
  */
15
- export const useAudioVolume = () => {
16
- return useAudioVolumeContext();
15
+ export const useVoiceVolumeOverride = () => {
16
+ return useVoiceVolumeOverrideContext();
17
17
  };
18
+ /** @deprecated Use useVoiceVolumeOverride instead */
19
+ export const useAudioVolume = useVoiceVolumeOverride;
18
20
  //# sourceMappingURL=useAudioVolume.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAudioVolume.js","sourceRoot":"","sources":["../../src/hooks/useAudioVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEpG;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAA4B,EAAE;IAC1D,OAAO,qBAAqB,EAAE,CAAA;AAChC,CAAC,CAAA"}
1
+ {"version":3,"file":"useAudioVolume.js","sourceRoot":"","sources":["../../src/hooks/useAudioVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAEpH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAoC,EAAE;IAC1E,OAAO,6BAA6B,EAAE,CAAA;AACxC,CAAC,CAAA;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,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
@@ -10,7 +10,7 @@ export { WorldContext, WorldProvider, useWorldContext, createDefaultWorldImpleme
10
10
  export { TeleportContext, TeleportProvider, useTeleportContext, createDefaultTeleportImplementation, type TeleportContextValue, type TeleportDestination, } from './contexts/TeleportContext';
11
11
  export { InstanceEventContext, InstanceEventProvider, useInstanceEventContext, createDefaultInstanceEventImplementation, type InstanceEventContextValue, } from './contexts/InstanceEventContext';
12
12
  export { PlacementStateProvider, usePlacementState, type PlacementMode, type PlacementStateContextValue, } from './contexts/PlacementStateContext';
13
- export { AudioVolumeContext, AudioVolumeProvider, useAudioVolumeContext, createDefaultAudioVolumeImplementation, type AudioVolumeContextValue, } from './contexts/AudioVolumeContext';
13
+ export { VoiceVolumeOverrideContext, VoiceVolumeOverrideProvider, useVoiceVolumeOverrideContext, createDefaultVoiceVolumeOverrideImplementation, type VoiceVolumeOverrideContextValue, AudioVolumeContext, AudioVolumeProvider, useAudioVolumeContext, createDefaultAudioVolumeImplementation, type AudioVolumeContextValue, } from './contexts/AudioVolumeContext';
14
14
  export { Interactable, type InteractableProps, } from './components/Interactable';
15
15
  export { Mirror, type MirrorProps } from './components/Mirror';
16
16
  export { Skybox, type SkyboxProps } from './components/Skybox';
@@ -33,9 +33,9 @@ export { useConfirm } from './hooks/useConfirm';
33
33
  export { useTeleport } from './hooks/useTeleport';
34
34
  export { useInstance } from './hooks/useInstance';
35
35
  export { useWorld } from './hooks/useWorld';
36
- export { useWebAudioVolume } from './hooks/useWebAudioVolume';
37
36
  export { useInstanceEvent } from './hooks/useInstanceEvent';
38
- export { useAudioVolume } from './hooks/useAudioVolume';
37
+ export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
38
+ export { useDefaultFont, type FontLocale } from './hooks/useDefaultFont';
39
39
  export { LAYERS, type LayerName, type LayerNumber } from './constants/layers';
40
40
  export { type PlayerMovement, type Position3D, type Rotation3D, type VRTrackingData, type VRMovementDirection, } from './types/movement';
41
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":"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"}
package/dist/index.js CHANGED
@@ -11,7 +11,9 @@ export { WorldContext, WorldProvider, useWorldContext, createDefaultWorldImpleme
11
11
  export { TeleportContext, TeleportProvider, useTeleportContext, createDefaultTeleportImplementation, } from './contexts/TeleportContext';
12
12
  export { InstanceEventContext, InstanceEventProvider, useInstanceEventContext, createDefaultInstanceEventImplementation, } from './contexts/InstanceEventContext';
13
13
  export { PlacementStateProvider, usePlacementState, } from './contexts/PlacementStateContext';
14
- export { AudioVolumeContext, AudioVolumeProvider, useAudioVolumeContext, createDefaultAudioVolumeImplementation, } from './contexts/AudioVolumeContext';
14
+ export { VoiceVolumeOverrideContext, VoiceVolumeOverrideProvider, useVoiceVolumeOverrideContext, createDefaultVoiceVolumeOverrideImplementation,
15
+ // Deprecated aliases
16
+ AudioVolumeContext, AudioVolumeProvider, useAudioVolumeContext, createDefaultAudioVolumeImplementation, } from './contexts/AudioVolumeContext';
15
17
  // Components
16
18
  export { Interactable, } from './components/Interactable';
17
19
  export { Mirror } from './components/Mirror';
@@ -35,9 +37,9 @@ export { useConfirm } from './hooks/useConfirm';
35
37
  export { useTeleport } from './hooks/useTeleport';
36
38
  export { useInstance } from './hooks/useInstance';
37
39
  export { useWorld } from './hooks/useWorld';
38
- export { useWebAudioVolume } from './hooks/useWebAudioVolume';
39
40
  export { useInstanceEvent } from './hooks/useInstanceEvent';
40
- export { useAudioVolume } from './hooks/useAudioVolume';
41
+ export { useVoiceVolumeOverride, useAudioVolume } from './hooks/useAudioVolume';
42
+ export { useDefaultFont } from './hooks/useDefaultFont';
41
43
  // Constants
42
44
  export { LAYERS } from './constants/layers';
43
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.33.3",
3
+ "version": "0.35.0",
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",