@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.
- package/dist/components/MsdfText/index.d.ts +24 -0
- package/dist/components/MsdfText/index.d.ts.map +1 -0
- package/dist/components/MsdfText/index.js +24 -0
- package/dist/components/MsdfText/index.js.map +1 -0
- package/dist/components/TroikaText/index.d.ts +4 -0
- package/dist/components/TroikaText/index.d.ts.map +1 -0
- package/dist/components/TroikaText/index.js +50 -0
- package/dist/components/TroikaText/index.js.map +1 -0
- package/dist/components/TroikaText/types.d.ts +19 -0
- package/dist/components/TroikaText/types.d.ts.map +1 -0
- package/dist/components/TroikaText/types.js +2 -0
- package/dist/components/TroikaText/types.js.map +1 -0
- package/dist/contexts/AudioVolumeContext.d.ts +16 -6
- package/dist/contexts/AudioVolumeContext.d.ts.map +1 -1
- package/dist/contexts/AudioVolumeContext.js +16 -8
- package/dist/contexts/AudioVolumeContext.js.map +1 -1
- package/dist/fonts/FontContext.d.ts +9 -0
- package/dist/fonts/FontContext.d.ts.map +1 -0
- package/dist/fonts/FontContext.js +5 -0
- package/dist/fonts/FontContext.js.map +1 -0
- package/dist/fonts/FontProvider.d.ts +31 -0
- package/dist/fonts/FontProvider.d.ts.map +1 -0
- package/dist/fonts/FontProvider.js +40 -0
- package/dist/fonts/FontProvider.js.map +1 -0
- package/dist/fonts/FontReadyContainer.d.ts +35 -0
- package/dist/fonts/FontReadyContainer.d.ts.map +1 -0
- package/dist/fonts/FontReadyContainer.js +40 -0
- package/dist/fonts/FontReadyContainer.js.map +1 -0
- package/dist/fonts/constants.d.ts +0 -2
- package/dist/fonts/constants.d.ts.map +1 -1
- package/dist/fonts/constants.js +0 -20
- package/dist/fonts/constants.js.map +1 -1
- package/dist/fonts/loadTTF.d.ts +18 -0
- package/dist/fonts/loadTTF.d.ts.map +1 -0
- package/dist/fonts/loadTTF.js +36 -0
- package/dist/fonts/loadTTF.js.map +1 -0
- package/dist/fonts/useTTF.d.ts +7 -0
- package/dist/fonts/useTTF.d.ts.map +1 -0
- package/dist/fonts/useTTF.js +9 -0
- package/dist/fonts/useTTF.js.map +1 -0
- package/dist/hooks/useAudioVolume.d.ts +6 -4
- package/dist/hooks/useAudioVolume.d.ts.map +1 -1
- package/dist/hooks/useAudioVolume.js +7 -5
- package/dist/hooks/useAudioVolume.js.map +1 -1
- package/dist/hooks/useDefaultFont.d.ts +21 -0
- package/dist/hooks/useDefaultFont.d.ts.map +1 -0
- package/dist/hooks/useDefaultFont.js +52 -0
- package/dist/hooks/useDefaultFont.js.map +1 -0
- package/dist/hooks/useJapaneseFont.d.ts +6 -3
- package/dist/hooks/useJapaneseFont.d.ts.map +1 -1
- package/dist/hooks/useJapaneseFont.js +17 -5
- package/dist/hooks/useJapaneseFont.js.map +1 -1
- package/dist/hooks/useMsdfFont.d.ts +11 -0
- package/dist/hooks/useMsdfFont.d.ts.map +1 -0
- package/dist/hooks/useMsdfFont.js +19 -0
- package/dist/hooks/useMsdfFont.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- 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 @@
|
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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}
|
|
36
|
+
* @throws {Error} VoiceVolumeOverrideProvider の外で呼び出された場合
|
|
29
37
|
*/
|
|
30
|
-
export declare const
|
|
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
|
|
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
|
|
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
|
|
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
|
|
22
|
-
return _jsx(
|
|
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}
|
|
32
|
+
* @throws {Error} VoiceVolumeOverrideProvider の外で呼び出された場合
|
|
27
33
|
*/
|
|
28
|
-
export const
|
|
29
|
-
const context = useContext(
|
|
34
|
+
export const useVoiceVolumeOverrideContext = () => {
|
|
35
|
+
const context = useContext(VoiceVolumeOverrideContext);
|
|
30
36
|
if (!context) {
|
|
31
|
-
throw new Error('
|
|
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;
|
|
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 @@
|
|
|
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,
|
|
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"}
|
package/dist/fonts/constants.js
CHANGED
|
@@ -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,
|
|
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
|
|
1
|
+
import { type VoiceVolumeOverrideContextValue } from '../contexts/AudioVolumeContext';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* 特定ユーザーのボイスチャット音量をオーバーライドするhook
|
|
4
4
|
* ワールド制作者が演壇やステージなどで特定ユーザーの音量を制御するために使用
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
|
-
* const { setOverride, clearOverride } =
|
|
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
|
|
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,
|
|
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 {
|
|
1
|
+
import { useVoiceVolumeOverrideContext } from '../contexts/AudioVolumeContext';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* 特定ユーザーのボイスチャット音量をオーバーライドするhook
|
|
4
4
|
* ワールド制作者が演壇やステージなどで特定ユーザーの音量を制御するために使用
|
|
5
5
|
*
|
|
6
6
|
* @example
|
|
7
|
-
* const { setOverride, clearOverride } =
|
|
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
|
|
16
|
-
return
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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":"
|
|
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,
|
|
3
|
-
|
|
4
|
-
const
|
|
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:
|
|
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,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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 {
|
|
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":"AAAA,WAAW;AACX,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAET,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,GAGrB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,GAGT,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,GAGrC,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kCAAkC,GAGnC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gCAAgC,GAGjC,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,mCAAmC,GAGpC,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,wCAAwC,GAEzC,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,GAGlB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,sCAAsC,GAEvC,MAAM,+BAA+B,CAAA;AAEtC,aAAa;AACb,OAAO,EACL,YAAY,GAEb,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,GAGZ,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAyB,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,GAEV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,cAAc,GAEf,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,aAAa,GAEd,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,UAAU,EACV,aAAa,EACb,qBAAqB,GACtB,MAAM,yBAAyB,CAAA;AAOhC,QAAQ;AACR,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,
|
|
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.
|
|
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": "
|
|
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",
|