@xrift/world-components 0.21.12 → 0.22.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/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts +8 -0
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/{LiveIndicator.js → components/ControlPanel/LiveIndicator.js} +5 -5
- package/dist/components/LiveVideoPlayer/components/ControlPanel/LiveIndicator.js.map +1 -0
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts +16 -0
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.js +28 -0
- package/dist/components/LiveVideoPlayer/components/ControlPanel/index.js.map +1 -0
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts +14 -0
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.js +18 -0
- package/dist/components/LiveVideoPlayer/components/LiveVideoTexture.js.map +1 -0
- package/dist/components/LiveVideoPlayer/components/index.d.ts +3 -0
- package/dist/components/LiveVideoPlayer/components/index.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/components/index.js +3 -0
- package/dist/components/LiveVideoPlayer/components/index.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts +2 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js +196 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/__tests__/utils.test.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/HlsJsPlayer.d.ts +17 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/HlsJsPlayer.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/HlsJsPlayer.js +73 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/HlsJsPlayer.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/NativeHlsPlayer.d.ts +14 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/NativeHlsPlayer.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/NativeHlsPlayer.js +46 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/NativeHlsPlayer.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/RecoveryTracker.d.ts +21 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/RecoveryTracker.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/RecoveryTracker.js +54 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/RecoveryTracker.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts +2 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js +146 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/HlsJsPlayer.test.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts +2 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js +94 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/NativeHlsPlayer.test.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts +2 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js +74 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/classes/__tests__/RecoveryTracker.test.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/index.d.ts +31 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/index.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/index.js +108 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/index.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/types.d.ts +34 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/types.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/types.js +2 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/types.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/utils.d.ts +15 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/utils.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/utils.js +62 -0
- package/dist/components/LiveVideoPlayer/hooks/useHlsVideo/utils.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts +25 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js +97 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer/index.js.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer.d.ts +25 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer.js +97 -0
- package/dist/components/LiveVideoPlayer/hooks/useLiveVideoPlayer.js.map +1 -0
- package/dist/components/LiveVideoPlayer/index.d.ts +20 -3
- package/dist/components/LiveVideoPlayer/index.d.ts.map +1 -1
- package/dist/components/LiveVideoPlayer/index.js +16 -133
- package/dist/components/LiveVideoPlayer/index.js.map +1 -1
- package/dist/components/LiveVideoPlayer/types.d.ts +6 -66
- package/dist/components/LiveVideoPlayer/types.d.ts.map +1 -1
- package/dist/components/Video180Sphere/EyeView.d.ts +14 -0
- package/dist/components/Video180Sphere/EyeView.d.ts.map +1 -0
- package/dist/components/Video180Sphere/EyeView.js +77 -0
- package/dist/components/Video180Sphere/EyeView.js.map +1 -0
- package/dist/components/Video180Sphere/index.d.ts +19 -0
- package/dist/components/Video180Sphere/index.d.ts.map +1 -0
- package/dist/components/Video180Sphere/index.js +90 -0
- package/dist/components/Video180Sphere/index.js.map +1 -0
- package/dist/components/Video180Sphere/types.d.ts +35 -0
- package/dist/components/Video180Sphere/types.d.ts.map +1 -0
- package/dist/components/Video180Sphere/types.js +2 -0
- package/dist/components/Video180Sphere/types.js.map +1 -0
- package/dist/components/VideoPlayer/ControlPanel.d.ts +1 -1
- package/dist/components/VideoPlayer/ControlPanel.d.ts.map +1 -1
- package/dist/components/VideoPlayer/ControlPanel.js +20 -9
- package/dist/components/VideoPlayer/ControlPanel.js.map +1 -1
- package/dist/components/VideoPlayer/ProgressBar.d.ts.map +1 -1
- package/dist/components/VideoPlayer/ProgressBar.js +2 -1
- package/dist/components/VideoPlayer/ProgressBar.js.map +1 -1
- package/dist/components/VideoPlayer/__tests__/utils.test.d.ts +2 -0
- package/dist/components/VideoPlayer/__tests__/utils.test.d.ts.map +1 -0
- package/dist/components/VideoPlayer/__tests__/utils.test.js +23 -0
- package/dist/components/VideoPlayer/__tests__/utils.test.js.map +1 -0
- package/dist/components/VideoPlayer/components/ControlPanel.d.ts +18 -0
- package/dist/components/VideoPlayer/components/ControlPanel.d.ts.map +1 -0
- package/dist/components/VideoPlayer/components/ControlPanel.js +34 -0
- package/dist/components/VideoPlayer/components/ControlPanel.js.map +1 -0
- package/dist/components/VideoPlayer/components/ProgressBar.d.ts +12 -0
- package/dist/components/VideoPlayer/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/VideoPlayer/components/ProgressBar.js +21 -0
- package/dist/components/VideoPlayer/components/ProgressBar.js.map +1 -0
- package/dist/components/VideoPlayer/components/index.d.ts +3 -0
- package/dist/components/VideoPlayer/components/index.d.ts.map +1 -0
- package/dist/components/VideoPlayer/components/index.js +3 -0
- package/dist/components/VideoPlayer/components/index.js.map +1 -0
- package/dist/components/VideoPlayer/index.d.ts +20 -3
- package/dist/components/VideoPlayer/index.d.ts.map +1 -1
- package/dist/components/VideoPlayer/index.js +29 -89
- package/dist/components/VideoPlayer/index.js.map +1 -1
- package/dist/components/VideoPlayer/types.d.ts +1 -28
- package/dist/components/VideoPlayer/types.d.ts.map +1 -1
- package/dist/components/VideoPlayer/utils.d.ts +0 -27
- package/dist/components/VideoPlayer/utils.d.ts.map +1 -1
- package/dist/components/VideoPlayer/utils.js +0 -28
- package/dist/components/VideoPlayer/utils.js.map +1 -1
- package/dist/components/VideoPlayer/utils.test.js +1 -87
- package/dist/components/VideoPlayer/utils.test.js.map +1 -1
- package/dist/components/commons/ErrorBoundary/index.d.ts +18 -0
- package/dist/components/commons/ErrorBoundary/index.d.ts.map +1 -0
- package/dist/components/commons/ErrorBoundary/index.js +22 -0
- package/dist/components/commons/ErrorBoundary/index.js.map +1 -0
- package/dist/components/commons/IconButton/index.d.ts +23 -0
- package/dist/components/commons/IconButton/index.d.ts.map +1 -0
- package/dist/components/commons/IconButton/index.js +12 -0
- package/dist/components/commons/IconButton/index.js.map +1 -0
- package/dist/components/commons/PlaceholderScreen/index.d.ts +9 -0
- package/dist/components/commons/PlaceholderScreen/index.d.ts.map +1 -0
- package/dist/components/commons/PlaceholderScreen/index.js +6 -0
- package/dist/components/commons/PlaceholderScreen/index.js.map +1 -0
- package/dist/components/commons/VideoMesh/index.d.ts +14 -0
- package/dist/components/commons/VideoMesh/index.d.ts.map +1 -0
- package/dist/components/commons/VideoMesh/index.js +91 -0
- package/dist/components/commons/VideoMesh/index.js.map +1 -0
- package/dist/components/commons/VolumeControl/index.d.ts +9 -0
- package/dist/components/commons/VolumeControl/index.d.ts.map +1 -0
- package/dist/components/{LiveVideoPlayer/VolumeControl.js → commons/VolumeControl/index.js} +6 -3
- package/dist/components/commons/VolumeControl/index.js.map +1 -0
- package/dist/components/commons/utils.d.ts +24 -0
- package/dist/components/commons/utils.d.ts.map +1 -0
- package/dist/components/commons/utils.js +23 -0
- package/dist/components/commons/utils.js.map +1 -0
- package/dist/components/commons/utils.test.d.ts +2 -0
- package/dist/components/commons/utils.test.d.ts.map +1 -0
- package/dist/components/commons/utils.test.js +79 -0
- package/dist/components/commons/utils.test.js.map +1 -0
- package/dist/hooks/useSyncState.d.ts +8 -0
- package/dist/hooks/useSyncState.d.ts.map +1 -0
- package/dist/hooks/useSyncState.js +16 -0
- package/dist/hooks/useSyncState.js.map +1 -0
- package/dist/hooks/useVideoElement.d.ts +30 -0
- package/dist/hooks/useVideoElement.d.ts.map +1 -0
- package/dist/hooks/useVideoElement.js +182 -0
- package/dist/hooks/useVideoElement.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/components/LiveVideoPlayer/ControlPanel.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/ControlPanel.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/ControlPanel.js +0 -17
- package/dist/components/LiveVideoPlayer/ControlPanel.js.map +0 -1
- package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/LiveIndicator.js.map +0 -1
- package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/PlayPauseButton.js +0 -9
- package/dist/components/LiveVideoPlayer/PlayPauseButton.js.map +0 -1
- package/dist/components/LiveVideoPlayer/ReloadButton.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/ReloadButton.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/ReloadButton.js +0 -9
- package/dist/components/LiveVideoPlayer/ReloadButton.js.map +0 -1
- package/dist/components/LiveVideoPlayer/UrlInputButton.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/UrlInputButton.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/UrlInputButton.js +0 -23
- package/dist/components/LiveVideoPlayer/UrlInputButton.js.map +0 -1
- package/dist/components/LiveVideoPlayer/VolumeControl.d.ts +0 -3
- package/dist/components/LiveVideoPlayer/VolumeControl.d.ts.map +0 -1
- package/dist/components/LiveVideoPlayer/VolumeControl.js.map +0 -1
- package/dist/components/VideoPlayer/PlayPauseButton.d.ts +0 -3
- package/dist/components/VideoPlayer/PlayPauseButton.d.ts.map +0 -1
- package/dist/components/VideoPlayer/PlayPauseButton.js +0 -9
- package/dist/components/VideoPlayer/PlayPauseButton.js.map +0 -1
- package/dist/components/VideoPlayer/StopButton.d.ts +0 -3
- package/dist/components/VideoPlayer/StopButton.d.ts.map +0 -1
- package/dist/components/VideoPlayer/StopButton.js +0 -9
- package/dist/components/VideoPlayer/StopButton.js.map +0 -1
- package/dist/components/VideoPlayer/UrlInputButton.d.ts +0 -3
- package/dist/components/VideoPlayer/UrlInputButton.d.ts.map +0 -1
- package/dist/components/VideoPlayer/UrlInputButton.js +0 -23
- package/dist/components/VideoPlayer/UrlInputButton.js.map +0 -1
- package/dist/components/VideoPlayer/VolumeControl.d.ts +0 -3
- package/dist/components/VideoPlayer/VolumeControl.d.ts.map +0 -1
- package/dist/components/VideoPlayer/VolumeControl.js +0 -26
- package/dist/components/VideoPlayer/VolumeControl.js.map +0 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo, useEffect, useState } from "react";
|
|
3
|
+
import * as THREE from "three";
|
|
4
|
+
/** レターボックス/ピラーボックス対応のシェーダー */
|
|
5
|
+
const letterboxVertexShader = `
|
|
6
|
+
varying vec2 vUv;
|
|
7
|
+
void main() {
|
|
8
|
+
vUv = uv;
|
|
9
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
const letterboxFragmentShader = `
|
|
13
|
+
uniform sampler2D map;
|
|
14
|
+
uniform float videoAspectRatio;
|
|
15
|
+
uniform float screenAspectRatio;
|
|
16
|
+
varying vec2 vUv;
|
|
17
|
+
|
|
18
|
+
void main() {
|
|
19
|
+
vec2 uv = vUv;
|
|
20
|
+
|
|
21
|
+
if (videoAspectRatio > screenAspectRatio) {
|
|
22
|
+
// 動画が横長:上下に黒帯(レターボックス)
|
|
23
|
+
float scale = screenAspectRatio / videoAspectRatio;
|
|
24
|
+
uv.y = (uv.y - 0.5) / scale + 0.5;
|
|
25
|
+
} else {
|
|
26
|
+
// 動画が縦長:左右に黒帯(ピラーボックス)
|
|
27
|
+
float scale = videoAspectRatio / screenAspectRatio;
|
|
28
|
+
uv.x = (uv.x - 0.5) / scale + 0.5;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {
|
|
32
|
+
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
|
|
33
|
+
} else {
|
|
34
|
+
gl_FragColor = texture2D(map, uv);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
/**
|
|
39
|
+
* 動画テクスチャをレターボックス/ピラーボックス対応で表示するメッシュ
|
|
40
|
+
*/
|
|
41
|
+
export const VideoMesh = memo(({ texture, width, height }) => {
|
|
42
|
+
const video = texture.image;
|
|
43
|
+
// 動画のアスペクト比を管理
|
|
44
|
+
const [videoAspectRatio, setVideoAspectRatio] = useState(null);
|
|
45
|
+
// スクリーンのアスペクト比
|
|
46
|
+
const screenAspectRatio = width / height;
|
|
47
|
+
// 動画のアスペクト比を取得
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const updateVideoAspectRatio = () => {
|
|
50
|
+
if (video.videoWidth && video.videoHeight) {
|
|
51
|
+
setVideoAspectRatio(video.videoWidth / video.videoHeight);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const handleLoadedMetadata = updateVideoAspectRatio;
|
|
55
|
+
// 既にメタデータが読み込まれている場合
|
|
56
|
+
updateVideoAspectRatio();
|
|
57
|
+
video.addEventListener("loadedmetadata", handleLoadedMetadata);
|
|
58
|
+
return () => {
|
|
59
|
+
video.removeEventListener("loadedmetadata", handleLoadedMetadata);
|
|
60
|
+
};
|
|
61
|
+
}, [video]);
|
|
62
|
+
// シェーダーマテリアル
|
|
63
|
+
// videoAspectRatioは依存配列から除外し、useEffectで更新することでマテリアル再作成を防ぐ
|
|
64
|
+
const shaderMaterial = useMemo(() => {
|
|
65
|
+
return new THREE.ShaderMaterial({
|
|
66
|
+
uniforms: {
|
|
67
|
+
map: { value: texture },
|
|
68
|
+
videoAspectRatio: { value: screenAspectRatio },
|
|
69
|
+
screenAspectRatio: { value: screenAspectRatio },
|
|
70
|
+
},
|
|
71
|
+
vertexShader: letterboxVertexShader,
|
|
72
|
+
fragmentShader: letterboxFragmentShader,
|
|
73
|
+
toneMapped: false,
|
|
74
|
+
});
|
|
75
|
+
}, [texture, screenAspectRatio]);
|
|
76
|
+
// アスペクト比が変わったらuniformを更新(マテリアル再作成なしで効率的に更新)
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
shaderMaterial.uniforms.videoAspectRatio.value =
|
|
79
|
+
videoAspectRatio ?? screenAspectRatio;
|
|
80
|
+
shaderMaterial.uniforms.screenAspectRatio.value = screenAspectRatio;
|
|
81
|
+
}, [shaderMaterial, videoAspectRatio, screenAspectRatio]);
|
|
82
|
+
// クリーンアップ時にマテリアルを破棄
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
return () => {
|
|
85
|
+
shaderMaterial.dispose();
|
|
86
|
+
};
|
|
87
|
+
}, [shaderMaterial]);
|
|
88
|
+
return (_jsxs("mesh", { children: [_jsx("planeGeometry", { args: [width, height] }), _jsx("primitive", { object: shaderMaterial, attach: "material" })] }));
|
|
89
|
+
});
|
|
90
|
+
VideoMesh.displayName = "VideoMesh";
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/commons/VideoMesh/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,8BAA8B;AAC9B,MAAM,qBAAqB,GAAG;;;;;;CAM7B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyB/B,CAAC;AAWF;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAkB,EAAE,EAAE;IAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAyB,CAAC;IAEhD,eAAe;IACf,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE9E,eAAe;IACf,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;IAEzC,eAAe;IACf,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,sBAAsB,GAAG,GAAG,EAAE;YAClC,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBAC1C,mBAAmB,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;QAEpD,qBAAqB;QACrB,sBAAsB,EAAE,CAAC;QAEzB,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAC/D,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QACpE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,aAAa;IACb,0DAA0D;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,EAAE;QAClC,OAAO,IAAI,KAAK,CAAC,cAAc,CAAC;YAC9B,QAAQ,EAAE;gBACR,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gBACvB,gBAAgB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;gBAC9C,iBAAiB,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;aAChD;YACD,YAAY,EAAE,qBAAqB;YACnC,cAAc,EAAE,uBAAuB;YACvC,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEjC,4CAA4C;IAC5C,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK;YAC5C,gBAAgB,IAAI,iBAAiB,CAAC;QACxC,cAAc,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,GAAG,iBAAiB,CAAC;IACtE,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE1D,oBAAoB;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,OAAO,CACL,2BACE,wBAAe,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,GAAI,EACxC,oBAAW,MAAM,EAAE,cAAc,EAAE,MAAM,EAAC,UAAU,GAAG,IAClD,CACR,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface VolumeControlProps {
|
|
2
|
+
id: string;
|
|
3
|
+
position: [number, number, number];
|
|
4
|
+
size: number;
|
|
5
|
+
volume: number;
|
|
6
|
+
onVolumeChange: (volume: number) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const VolumeControl: import("react").MemoExoticComponent<({ id, position, size, volume, onVolumeChange }: VolumeControlProps) => import("react/jsx-runtime").JSX.Element>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/commons/VolumeControl/index.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAID,eAAO,MAAM,aAAa,uFACyB,kBAAkB,6CAiEpE,CAAA"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { memo, useMemo } from 'react';
|
|
3
3
|
import { Text } from '@react-three/drei';
|
|
4
|
-
import { Interactable } from '
|
|
5
|
-
import { calculateSegments, calculateProgressBar
|
|
4
|
+
import { Interactable } from '../../Interactable';
|
|
5
|
+
import { calculateSegments, calculateProgressBar } from '../utils';
|
|
6
|
+
const getVolumeIcon = (volume) => {
|
|
7
|
+
return volume === 0 ? '🔇' : '🔈';
|
|
8
|
+
};
|
|
6
9
|
const SEGMENTS = 11;
|
|
7
10
|
export const VolumeControl = memo(({ id, position, size, volume, onVolumeChange }) => {
|
|
8
11
|
const barWidth = size * 3;
|
|
@@ -23,4 +26,4 @@ export const VolumeControl = memo(({ id, position, size, volume, onVolumeChange
|
|
|
23
26
|
return (_jsxs("group", { position: position, children: [_jsx(Text, { position: [-barWidth / 2 - size * 0.4, 0, 0.01], fontSize: size * 0.4, color: "#ffffff", anchorX: "center", anchorY: "middle", children: getVolumeIcon(volume) }), _jsxs("mesh", { position: [0, 0, 0], children: [_jsx("planeGeometry", { args: [barWidth, barHeight] }), _jsx("meshBasicMaterial", { color: "#333333" })] }), volumeWidth > 0 && (_jsxs("mesh", { position: [volumeOffset, 0, 0.001], children: [_jsx("planeGeometry", { args: [volumeWidth, barHeight] }), _jsx("meshBasicMaterial", { color: "#4aff4a" })] })), segments.map((segment) => (_jsx(Interactable, { id: `${id}-seg-${segment.index}`, onInteract: () => onVolumeChange(segment.value), interactionText: segment.label, children: _jsxs("mesh", { position: [segment.xPos, 0, 0.002], children: [_jsx("planeGeometry", { args: [segmentWidth * 0.98, barHeight * 2] }), _jsx("meshBasicMaterial", { transparent: true, opacity: 0, depthWrite: false })] }) }, segment.index)))] }));
|
|
24
27
|
});
|
|
25
28
|
VolumeControl.displayName = 'VolumeControl';
|
|
26
|
-
//# sourceMappingURL=
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/commons/VolumeControl/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* セグメント情報を生成
|
|
3
|
+
*/
|
|
4
|
+
export interface Segment {
|
|
5
|
+
index: number;
|
|
6
|
+
xPos: number;
|
|
7
|
+
value: number;
|
|
8
|
+
label: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CalculateSegmentsOptions {
|
|
11
|
+
segments: number;
|
|
12
|
+
width: number;
|
|
13
|
+
maxValue: number;
|
|
14
|
+
formatLabel: (value: number, index: number) => string;
|
|
15
|
+
}
|
|
16
|
+
export declare const calculateSegments: ({ segments, width, maxValue, formatLabel, }: CalculateSegmentsOptions) => Segment[];
|
|
17
|
+
/**
|
|
18
|
+
* 進捗バーの幅とオフセットを計算
|
|
19
|
+
*/
|
|
20
|
+
export declare const calculateProgressBar: (progress: number, totalWidth: number) => {
|
|
21
|
+
width: number;
|
|
22
|
+
offset: number;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/commons/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACtD;AAED,eAAO,MAAM,iBAAiB,GAAI,6CAK/B,wBAAwB,KAAG,OAAO,EAYpC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,MAAM,EAChB,YAAY,MAAM,KACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAKjC,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const calculateSegments = ({ segments, width, maxValue, formatLabel, }) => {
|
|
2
|
+
const segmentWidth = width / segments;
|
|
3
|
+
return Array.from({ length: segments }).map((_, i) => {
|
|
4
|
+
const value = (i / (segments - 1)) * maxValue;
|
|
5
|
+
const xPos = -width / 2 + segmentWidth * (i + 0.5);
|
|
6
|
+
return {
|
|
7
|
+
index: i,
|
|
8
|
+
xPos,
|
|
9
|
+
value,
|
|
10
|
+
label: formatLabel(value, i),
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* 進捗バーの幅とオフセットを計算
|
|
16
|
+
*/
|
|
17
|
+
export const calculateProgressBar = (progress, totalWidth) => {
|
|
18
|
+
const clampedProgress = Math.min(1, Math.max(0, progress));
|
|
19
|
+
const width = totalWidth * clampedProgress;
|
|
20
|
+
const offset = -totalWidth / 2 + width / 2;
|
|
21
|
+
return { width, offset };
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/components/commons/utils.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,GACc,EAAa,EAAE;IACxC,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,CAAA;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC7C,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;QAClD,OAAO;YACL,KAAK,EAAE,CAAC;YACR,IAAI;YACJ,KAAK;YACL,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,QAAgB,EAChB,UAAkB,EACiB,EAAE;IACrC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,UAAU,GAAG,eAAe,CAAA;IAC1C,MAAM,MAAM,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAA;IAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAC1B,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../src/components/commons/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { calculateSegments, calculateProgressBar } from './utils';
|
|
3
|
+
describe('calculateSegments', () => {
|
|
4
|
+
it('5セグメントで0-100の値を生成', () => {
|
|
5
|
+
const segments = calculateSegments({
|
|
6
|
+
segments: 5,
|
|
7
|
+
width: 10,
|
|
8
|
+
maxValue: 100,
|
|
9
|
+
formatLabel: (value) => `${value}%`,
|
|
10
|
+
});
|
|
11
|
+
expect(segments).toHaveLength(5);
|
|
12
|
+
expect(segments[0].value).toBe(0);
|
|
13
|
+
expect(segments[4].value).toBe(100);
|
|
14
|
+
expect(segments[2].value).toBe(50);
|
|
15
|
+
});
|
|
16
|
+
it('11セグメントで0-1の値を生成(音量バー)', () => {
|
|
17
|
+
const segments = calculateSegments({
|
|
18
|
+
segments: 11,
|
|
19
|
+
width: 3,
|
|
20
|
+
maxValue: 1,
|
|
21
|
+
formatLabel: (value) => `${Math.round(value * 100)}%`,
|
|
22
|
+
});
|
|
23
|
+
expect(segments).toHaveLength(11);
|
|
24
|
+
expect(segments[0].value).toBe(0);
|
|
25
|
+
expect(segments[10].value).toBe(1);
|
|
26
|
+
expect(segments[5].value).toBeCloseTo(0.5);
|
|
27
|
+
});
|
|
28
|
+
it('xPosがセグメントの中央に配置される', () => {
|
|
29
|
+
const segments = calculateSegments({
|
|
30
|
+
segments: 4,
|
|
31
|
+
width: 8,
|
|
32
|
+
maxValue: 1,
|
|
33
|
+
formatLabel: () => '',
|
|
34
|
+
});
|
|
35
|
+
// width=8, segments=4 => segmentWidth=2
|
|
36
|
+
// 中央位置: -4 + 2*(0.5) = -3, -4 + 2*(1.5) = -1, -4 + 2*(2.5) = 1, -4 + 2*(3.5) = 3
|
|
37
|
+
expect(segments[0].xPos).toBe(-3);
|
|
38
|
+
expect(segments[1].xPos).toBe(-1);
|
|
39
|
+
expect(segments[2].xPos).toBe(1);
|
|
40
|
+
expect(segments[3].xPos).toBe(3);
|
|
41
|
+
});
|
|
42
|
+
it('formatLabelが正しく呼ばれる', () => {
|
|
43
|
+
const segments = calculateSegments({
|
|
44
|
+
segments: 3,
|
|
45
|
+
width: 6,
|
|
46
|
+
maxValue: 60,
|
|
47
|
+
formatLabel: (value, index) => index === 0 ? '最初' : `${value}秒`,
|
|
48
|
+
});
|
|
49
|
+
expect(segments[0].label).toBe('最初');
|
|
50
|
+
expect(segments[1].label).toBe('30秒');
|
|
51
|
+
expect(segments[2].label).toBe('60秒');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('calculateProgressBar', () => {
|
|
55
|
+
it('進捗0のとき幅は0', () => {
|
|
56
|
+
const result = calculateProgressBar(0, 10);
|
|
57
|
+
expect(result.width).toBe(0);
|
|
58
|
+
expect(result.offset).toBe(-5);
|
|
59
|
+
});
|
|
60
|
+
it('進捗1のとき幅は全体', () => {
|
|
61
|
+
const result = calculateProgressBar(1, 10);
|
|
62
|
+
expect(result.width).toBe(10);
|
|
63
|
+
expect(result.offset).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
it('進捗0.5のとき幅は半分', () => {
|
|
66
|
+
const result = calculateProgressBar(0.5, 10);
|
|
67
|
+
expect(result.width).toBe(5);
|
|
68
|
+
expect(result.offset).toBe(-2.5);
|
|
69
|
+
});
|
|
70
|
+
it('進捗が1を超えても1にクランプ', () => {
|
|
71
|
+
const result = calculateProgressBar(1.5, 10);
|
|
72
|
+
expect(result.width).toBe(10);
|
|
73
|
+
});
|
|
74
|
+
it('進捗が0未満でも0にクランプ', () => {
|
|
75
|
+
const result = calculateProgressBar(-0.5, 10);
|
|
76
|
+
expect(result.width).toBe(0);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../src/components/commons/utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type SyncMode = "global" | "local";
|
|
2
|
+
/**
|
|
3
|
+
* syncモードに応じて適切な状態管理を選択するフック
|
|
4
|
+
* - global: useInstanceState(マルチユーザー間で共有)
|
|
5
|
+
* - local: useState(端末内のみ)
|
|
6
|
+
*/
|
|
7
|
+
export declare function useSyncState<T>(key: string, initialValue: T, sync: SyncMode): readonly [T, (state: T | ((prevState: T) => T)) => void];
|
|
8
|
+
//# sourceMappingURL=useSyncState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSyncState.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncState.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,IAAI,EAAE,QAAQ,4DASf"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { useInstanceState } from "./useInstanceState";
|
|
3
|
+
/**
|
|
4
|
+
* syncモードに応じて適切な状態管理を選択するフック
|
|
5
|
+
* - global: useInstanceState(マルチユーザー間で共有)
|
|
6
|
+
* - local: useState(端末内のみ)
|
|
7
|
+
*/
|
|
8
|
+
export function useSyncState(key, initialValue, sync) {
|
|
9
|
+
const [globalState, setGlobalState] = useInstanceState(key, initialValue);
|
|
10
|
+
const [localState, setLocalState] = useState(initialValue);
|
|
11
|
+
if (sync === "global") {
|
|
12
|
+
return [globalState, setGlobalState];
|
|
13
|
+
}
|
|
14
|
+
return [localState, setLocalState];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=useSyncState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSyncState.js","sourceRoot":"","sources":["../../src/hooks/useSyncState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,YAAe,EACf,IAAc;IAEd,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,gBAAgB,CAAI,GAAG,EAAE,YAAY,CAAC,CAAC;IAC7E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAI,YAAY,CAAC,CAAC;IAE9D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CAAC,WAAW,EAAE,cAAc,CAAU,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,UAAU,EAAE,aAAa,CAAU,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type * as THREE from "three";
|
|
2
|
+
export interface UseVideoElementOptions {
|
|
3
|
+
/** 動画URL */
|
|
4
|
+
url: string;
|
|
5
|
+
/** キャッシュバスター用キー */
|
|
6
|
+
cacheKey?: number;
|
|
7
|
+
/** 再生中かどうか */
|
|
8
|
+
playing: boolean;
|
|
9
|
+
/** 音量 0〜1 */
|
|
10
|
+
volume: number;
|
|
11
|
+
/** ループ再生するか */
|
|
12
|
+
loop?: boolean;
|
|
13
|
+
/** エラー発生時のコールバック */
|
|
14
|
+
onError?: (error: Error) => void;
|
|
15
|
+
/** バッファリング状態変更時のコールバック */
|
|
16
|
+
onBufferingChange?: (buffering: boolean) => void;
|
|
17
|
+
/** 動画の長さ取得時のコールバック */
|
|
18
|
+
onDurationChange?: (duration: number) => void;
|
|
19
|
+
}
|
|
20
|
+
export interface UseVideoElementReturn {
|
|
21
|
+
/** 動画テクスチャ */
|
|
22
|
+
texture: THREE.VideoTexture;
|
|
23
|
+
/** 動画要素への参照 */
|
|
24
|
+
videoRef: React.MutableRefObject<HTMLVideoElement>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 動画要素の再生制御・音量・イベント管理を行うフック
|
|
28
|
+
*/
|
|
29
|
+
export declare function useVideoElement({ url, cacheKey, playing, volume, loop, onError, onBufferingChange, onDurationChange, }: UseVideoElementOptions): UseVideoElementReturn;
|
|
30
|
+
//# sourceMappingURL=useVideoElement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVideoElement.d.ts","sourceRoot":"","sources":["../../src/hooks/useVideoElement.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAQpC,MAAM,WAAW,sBAAsB;IACrC,YAAY;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,0BAA0B;IAC1B,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,sBAAsB;IACtB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc;IACd,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC;IAC5B,eAAe;IACf,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,GAAG,EACH,QAAY,EACZ,OAAO,EACP,MAAM,EACN,IAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,gBAAgB,GACjB,EAAE,sBAAsB,GAAG,qBAAqB,CAgMhD"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { useEffect, useRef, useCallback } from "react";
|
|
2
|
+
import { useVideoTexture } from "@react-three/drei";
|
|
3
|
+
import { useWebAudioVolume } from "./useWebAudioVolume";
|
|
4
|
+
// 動画が停止したと判断するまでの時間(ms)
|
|
5
|
+
const STALL_DETECTION_DELAY = 3000;
|
|
6
|
+
// 停止判定のチェック間隔(ms)
|
|
7
|
+
const STALL_CHECK_INTERVAL = 500;
|
|
8
|
+
/**
|
|
9
|
+
* 動画要素の再生制御・音量・イベント管理を行うフック
|
|
10
|
+
*/
|
|
11
|
+
export function useVideoElement({ url, cacheKey = 0, playing, volume, loop = false, onError, onBufferingChange, onDurationChange, }) {
|
|
12
|
+
// エラー報告済みフラグ(同じマウント中に複数回エラーを報告しない)
|
|
13
|
+
const errorReportedRef = useRef(false);
|
|
14
|
+
// 停止検出用
|
|
15
|
+
const lastTimeRef = useRef(0);
|
|
16
|
+
const stallCheckIntervalRef = useRef(null);
|
|
17
|
+
const stallStartTimeRef = useRef(null);
|
|
18
|
+
// suspend-reactのキャッシュを無効化するためにURLにcacheKeyを付与
|
|
19
|
+
const urlWithCacheKey = `${url}${url.includes("?") ? "&" : "?"}_ck=${cacheKey}`;
|
|
20
|
+
const texture = useVideoTexture(urlWithCacheKey, {
|
|
21
|
+
muted: false,
|
|
22
|
+
loop,
|
|
23
|
+
start: playing,
|
|
24
|
+
});
|
|
25
|
+
const videoRef = useRef(texture.image);
|
|
26
|
+
// テクスチャが変わったらvideoRefを更新
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
videoRef.current = texture.image;
|
|
29
|
+
errorReportedRef.current = false; // 新しいテクスチャではエラーフラグをリセット
|
|
30
|
+
}, [texture]);
|
|
31
|
+
// 再生/停止制御
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
const video = videoRef.current;
|
|
34
|
+
if (!video)
|
|
35
|
+
return;
|
|
36
|
+
if (playing) {
|
|
37
|
+
video.play().catch((err) => {
|
|
38
|
+
if (!errorReportedRef.current) {
|
|
39
|
+
errorReportedRef.current = true;
|
|
40
|
+
console.error("Video play error:", err);
|
|
41
|
+
onError?.(err);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
video.pause();
|
|
47
|
+
}
|
|
48
|
+
}, [playing, onError, texture]);
|
|
49
|
+
// Web Audio API を使用した音量制御(iOS対応)
|
|
50
|
+
useWebAudioVolume(videoRef.current, volume);
|
|
51
|
+
// 停止検出を開始
|
|
52
|
+
const startStallDetection = useCallback((errorMessage) => {
|
|
53
|
+
if (stallCheckIntervalRef.current)
|
|
54
|
+
return; // 既に監視中
|
|
55
|
+
const video = videoRef.current;
|
|
56
|
+
if (!video)
|
|
57
|
+
return;
|
|
58
|
+
lastTimeRef.current = video.currentTime;
|
|
59
|
+
stallStartTimeRef.current = Date.now();
|
|
60
|
+
stallCheckIntervalRef.current = setInterval(() => {
|
|
61
|
+
const currentVideo = videoRef.current;
|
|
62
|
+
if (!currentVideo)
|
|
63
|
+
return;
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const currentTime = currentVideo.currentTime;
|
|
66
|
+
// 再生が進んでいる場合は停止検出をリセット
|
|
67
|
+
if (currentTime > lastTimeRef.current) {
|
|
68
|
+
lastTimeRef.current = currentTime;
|
|
69
|
+
stallStartTimeRef.current = now;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// 一定時間再生が進まない場合はエラーを報告
|
|
73
|
+
if (stallStartTimeRef.current &&
|
|
74
|
+
now - stallStartTimeRef.current > STALL_DETECTION_DELAY) {
|
|
75
|
+
if (!errorReportedRef.current) {
|
|
76
|
+
errorReportedRef.current = true;
|
|
77
|
+
console.error("Video stalled:", errorMessage);
|
|
78
|
+
onError?.(new Error(errorMessage));
|
|
79
|
+
}
|
|
80
|
+
// 停止検出を終了
|
|
81
|
+
if (stallCheckIntervalRef.current) {
|
|
82
|
+
clearInterval(stallCheckIntervalRef.current);
|
|
83
|
+
stallCheckIntervalRef.current = null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}, STALL_CHECK_INTERVAL);
|
|
87
|
+
}, [onError]);
|
|
88
|
+
// 停止検出をクリア
|
|
89
|
+
const clearStallDetection = useCallback(() => {
|
|
90
|
+
if (stallCheckIntervalRef.current) {
|
|
91
|
+
clearInterval(stallCheckIntervalRef.current);
|
|
92
|
+
stallCheckIntervalRef.current = null;
|
|
93
|
+
}
|
|
94
|
+
stallStartTimeRef.current = null;
|
|
95
|
+
}, []);
|
|
96
|
+
// イベントリスナーの設定
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
const video = videoRef.current;
|
|
99
|
+
if (!video)
|
|
100
|
+
return;
|
|
101
|
+
const handleWaiting = () => onBufferingChange?.(true);
|
|
102
|
+
const handlePlaying = () => {
|
|
103
|
+
onBufferingChange?.(false);
|
|
104
|
+
clearStallDetection(); // 再生が再開したら停止検出をクリア
|
|
105
|
+
};
|
|
106
|
+
const handleCanPlay = () => {
|
|
107
|
+
onBufferingChange?.(false);
|
|
108
|
+
clearStallDetection();
|
|
109
|
+
};
|
|
110
|
+
const handleTimeUpdate = () => {
|
|
111
|
+
// 再生が進んでいれば停止検出をリセット
|
|
112
|
+
lastTimeRef.current = video.currentTime;
|
|
113
|
+
if (stallStartTimeRef.current) {
|
|
114
|
+
stallStartTimeRef.current = Date.now();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const handleError = (e) => {
|
|
118
|
+
if (errorReportedRef.current)
|
|
119
|
+
return;
|
|
120
|
+
const error = e.target.error;
|
|
121
|
+
if (error) {
|
|
122
|
+
// MEDIA_ERR_DECODE (code 3) は一時的なエラーの可能性があるため、
|
|
123
|
+
// 即座にエラーを報告せず、動画が本当に停止しているか監視する
|
|
124
|
+
if (error.code === MediaError.MEDIA_ERR_DECODE) {
|
|
125
|
+
console.warn("Video decode error (monitoring for stall):", error.message);
|
|
126
|
+
startStallDetection(error.message);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// その他のエラーは即座に報告
|
|
130
|
+
errorReportedRef.current = true;
|
|
131
|
+
console.error("Video error:", error.message);
|
|
132
|
+
onError?.(new Error(error.message));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const handleLoadedMetadata = () => {
|
|
137
|
+
onDurationChange?.(video.duration || 0);
|
|
138
|
+
};
|
|
139
|
+
// 既にメタデータが読み込まれている場合
|
|
140
|
+
if (video.duration) {
|
|
141
|
+
onDurationChange?.(video.duration);
|
|
142
|
+
}
|
|
143
|
+
video.addEventListener("waiting", handleWaiting);
|
|
144
|
+
video.addEventListener("playing", handlePlaying);
|
|
145
|
+
video.addEventListener("canplay", handleCanPlay);
|
|
146
|
+
video.addEventListener("timeupdate", handleTimeUpdate);
|
|
147
|
+
video.addEventListener("error", handleError);
|
|
148
|
+
video.addEventListener("loadedmetadata", handleLoadedMetadata);
|
|
149
|
+
return () => {
|
|
150
|
+
video.removeEventListener("waiting", handleWaiting);
|
|
151
|
+
video.removeEventListener("playing", handlePlaying);
|
|
152
|
+
video.removeEventListener("canplay", handleCanPlay);
|
|
153
|
+
video.removeEventListener("timeupdate", handleTimeUpdate);
|
|
154
|
+
video.removeEventListener("error", handleError);
|
|
155
|
+
video.removeEventListener("loadedmetadata", handleLoadedMetadata);
|
|
156
|
+
clearStallDetection();
|
|
157
|
+
};
|
|
158
|
+
}, [texture, onError, onBufferingChange, onDurationChange, startStallDetection, clearStallDetection]);
|
|
159
|
+
// クリーンアップ
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
const video = texture.image;
|
|
162
|
+
return () => {
|
|
163
|
+
// 停止検出をクリア
|
|
164
|
+
if (stallCheckIntervalRef.current) {
|
|
165
|
+
clearInterval(stallCheckIntervalRef.current);
|
|
166
|
+
stallCheckIntervalRef.current = null;
|
|
167
|
+
}
|
|
168
|
+
// 再生を停止
|
|
169
|
+
video.pause();
|
|
170
|
+
// ソースを完全にクリア
|
|
171
|
+
video.src = "";
|
|
172
|
+
video.removeAttribute("src");
|
|
173
|
+
video.srcObject = null;
|
|
174
|
+
// MediaSourceをリリースするためにloadを呼び出し
|
|
175
|
+
video.load();
|
|
176
|
+
// テクスチャを破棄
|
|
177
|
+
texture.dispose();
|
|
178
|
+
};
|
|
179
|
+
}, [texture]);
|
|
180
|
+
return { texture, videoRef };
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=useVideoElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVideoElement.js","sourceRoot":"","sources":["../../src/hooks/useVideoElement.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,12 +8,13 @@ export { Interactable, type InteractableProps, } from './components/Interactable
|
|
|
8
8
|
export { Mirror, type MirrorProps } from './components/Mirror';
|
|
9
9
|
export { Skybox, type SkyboxProps } from './components/Skybox';
|
|
10
10
|
export { VideoScreen, type VideoScreenProps, type VideoState, } from './components/VideoScreen';
|
|
11
|
-
export { VideoPlayer, type VideoPlayerProps
|
|
12
|
-
export { LiveVideoPlayer
|
|
11
|
+
export { VideoPlayer, type VideoPlayerProps } from './components/VideoPlayer';
|
|
12
|
+
export { LiveVideoPlayer } from './components/LiveVideoPlayer';
|
|
13
13
|
export { ScreenShareDisplay, type ScreenShareDisplayProps, } from './components/ScreenShareDisplay';
|
|
14
14
|
export { SpawnPoint, type SpawnPointProps, } from './components/SpawnPoint';
|
|
15
15
|
export { TextInput, type TextInputProps, } from './components/TextInput';
|
|
16
16
|
export { TagBoard, type TagBoardProps, type Tag, } from './components/TagBoard';
|
|
17
|
+
export { Video180Sphere, type Video180SphereProps, } from './components/Video180Sphere';
|
|
17
18
|
export { useInstanceState } from './hooks/useInstanceState';
|
|
18
19
|
export { useSpawnPoint } from './hooks/useSpawnPoint';
|
|
19
20
|
export { useWebAudioVolume } from './hooks/useWebAudioVolume';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,KAAK,IAAI,EACT,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oCAAoC,EACpC,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EACL,SAAS,EACT,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,GAAG,GACT,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,GACzB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -10,12 +10,13 @@ export { Interactable, } from './components/Interactable';
|
|
|
10
10
|
export { Mirror } from './components/Mirror';
|
|
11
11
|
export { Skybox } from './components/Skybox';
|
|
12
12
|
export { VideoScreen, } from './components/VideoScreen';
|
|
13
|
-
export { VideoPlayer
|
|
14
|
-
export { LiveVideoPlayer
|
|
13
|
+
export { VideoPlayer } from './components/VideoPlayer';
|
|
14
|
+
export { LiveVideoPlayer } from './components/LiveVideoPlayer';
|
|
15
15
|
export { ScreenShareDisplay, } from './components/ScreenShareDisplay';
|
|
16
16
|
export { SpawnPoint, } from './components/SpawnPoint';
|
|
17
17
|
export { TextInput, } from './components/TextInput';
|
|
18
18
|
export { TagBoard, } from './components/TagBoard';
|
|
19
|
+
export { Video180Sphere, } from './components/Video180Sphere';
|
|
19
20
|
// Hooks
|
|
20
21
|
export { useInstanceState } from './hooks/useInstanceState';
|
|
21
22
|
export { useSpawnPoint } from './hooks/useSpawnPoint';
|
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,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,
|
|
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,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,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xrift/world-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Shared components and utilities for Xrift worlds",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"@react-three/fiber": "^9.4.0",
|
|
48
48
|
"@types/react": "^18.3.12",
|
|
49
49
|
"@types/three": "^0.181.0",
|
|
50
|
+
"jsdom": "^28.0.0",
|
|
50
51
|
"react-dom": "^19.2.0",
|
|
51
52
|
"three": "^0.181.0",
|
|
52
53
|
"typescript": "^5.6.3",
|