@xrift/world-components 0.17.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/components/LiveVideoPlayer/ControlPanel.d.ts +3 -0
  2. package/dist/components/LiveVideoPlayer/ControlPanel.d.ts.map +1 -0
  3. package/dist/components/LiveVideoPlayer/ControlPanel.js +15 -0
  4. package/dist/components/LiveVideoPlayer/ControlPanel.js.map +1 -0
  5. package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts +3 -0
  6. package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts.map +1 -0
  7. package/dist/components/LiveVideoPlayer/LiveIndicator.js +10 -0
  8. package/dist/components/LiveVideoPlayer/LiveIndicator.js.map +1 -0
  9. package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts +3 -0
  10. package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts.map +1 -0
  11. package/dist/components/LiveVideoPlayer/PlayPauseButton.js +9 -0
  12. package/dist/components/LiveVideoPlayer/PlayPauseButton.js.map +1 -0
  13. package/dist/components/LiveVideoPlayer/VolumeControl.d.ts +3 -0
  14. package/dist/components/LiveVideoPlayer/VolumeControl.d.ts.map +1 -0
  15. package/dist/components/LiveVideoPlayer/VolumeControl.js +26 -0
  16. package/dist/components/LiveVideoPlayer/VolumeControl.js.map +1 -0
  17. package/dist/components/LiveVideoPlayer/index.d.ts +4 -0
  18. package/dist/components/LiveVideoPlayer/index.d.ts.map +1 -0
  19. package/dist/components/LiveVideoPlayer/index.js +92 -0
  20. package/dist/components/LiveVideoPlayer/index.js.map +1 -0
  21. package/dist/components/LiveVideoPlayer/types.d.ts +53 -0
  22. package/dist/components/LiveVideoPlayer/types.d.ts.map +1 -0
  23. package/dist/components/LiveVideoPlayer/types.js +2 -0
  24. package/dist/components/LiveVideoPlayer/types.js.map +1 -0
  25. package/dist/components/TextInput/index.d.ts +23 -0
  26. package/dist/components/TextInput/index.d.ts.map +1 -0
  27. package/dist/components/TextInput/index.js +76 -0
  28. package/dist/components/TextInput/index.js.map +1 -0
  29. package/dist/components/TextInput/types.d.ts +20 -0
  30. package/dist/components/TextInput/types.d.ts.map +1 -0
  31. package/dist/components/TextInput/types.js +2 -0
  32. package/dist/components/TextInput/types.js.map +1 -0
  33. package/dist/contexts/TextInputContext.d.ts +65 -0
  34. package/dist/contexts/TextInputContext.d.ts.map +1 -0
  35. package/dist/contexts/TextInputContext.js +51 -0
  36. package/dist/contexts/TextInputContext.js.map +1 -0
  37. package/dist/contexts/XRiftContext.d.ts +7 -1
  38. package/dist/contexts/XRiftContext.d.ts.map +1 -1
  39. package/dist/contexts/XRiftContext.js +5 -2
  40. package/dist/contexts/XRiftContext.js.map +1 -1
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +3 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/scenes/TestScene.d.ts.map +1 -1
  46. package/dist/scenes/TestScene.js +8 -1
  47. package/dist/scenes/TestScene.js.map +1 -1
  48. package/package.json +7 -1
@@ -0,0 +1,3 @@
1
+ import type { LiveControlPanelProps } from './types';
2
+ export declare const ControlPanel: import("react").MemoExoticComponent<({ id, width, screenHeight, playing, volume, isBuffering, onPlayPause, onVolumeChange, }: LiveControlPanelProps) => import("react/jsx-runtime").JSX.Element>;
3
+ //# sourceMappingURL=ControlPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlPanel.d.ts","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/ControlPanel.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAKpD,eAAO,MAAM,YAAY,gIAUpB,qBAAqB,6CAgDzB,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import { Text } from '@react-three/drei';
4
+ import { PlayPauseButton } from './PlayPauseButton';
5
+ import { VolumeControl } from './VolumeControl';
6
+ import { LiveIndicator } from './LiveIndicator';
7
+ const PANEL_HEIGHT = 0.15;
8
+ const BUTTON_SIZE_RATIO = 0.6;
9
+ export const ControlPanel = memo(({ id, width, screenHeight, playing, volume, isBuffering, onPlayPause, onVolumeChange, }) => {
10
+ const panelY = -screenHeight / 2 - PANEL_HEIGHT / 2;
11
+ const buttonSize = PANEL_HEIGHT * BUTTON_SIZE_RATIO;
12
+ return (_jsxs("group", { position: [0, panelY, 0], children: [_jsxs("mesh", { position: [0, 0, 0], children: [_jsx("planeGeometry", { args: [width, PANEL_HEIGHT] }), _jsx("meshBasicMaterial", { color: "#1a1a2a", transparent: true, opacity: 0.9 })] }), _jsx(PlayPauseButton, { id: `${id}-play-pause`, position: [-width * 0.4, 0, 0.01], size: buttonSize, playing: playing, onInteract: onPlayPause }), _jsx(LiveIndicator, { position: [0, 0, 0.01], size: buttonSize }), isBuffering && (_jsx(Text, { position: [0, -0.04, 0.01], fontSize: 0.02, color: "#aaaaaa", anchorX: "center", anchorY: "middle", children: "\u8AAD\u307F\u8FBC\u307F\u4E2D..." })), _jsx(VolumeControl, { id: `${id}-volume`, position: [width * 0.4, 0, 0.01], size: buttonSize, volume: volume, onVolumeChange: onVolumeChange })] }));
13
+ });
14
+ ControlPanel.displayName = 'ControlPanel';
15
+ //# sourceMappingURL=ControlPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlPanel.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/ControlPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C,MAAM,YAAY,GAAG,IAAI,CAAA;AACzB,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAC9B,CAAC,EACC,EAAE,EACF,KAAK,EACL,YAAY,EACZ,OAAO,EACP,MAAM,EACN,WAAW,EACX,WAAW,EACX,cAAc,GACQ,EAAE,EAAE;IAC1B,MAAM,MAAM,GAAG,CAAC,YAAY,GAAG,CAAC,GAAG,YAAY,GAAG,CAAC,CAAA;IACnD,MAAM,UAAU,GAAG,YAAY,GAAG,iBAAiB,CAAA;IAEnD,OAAO,CACL,iBAAO,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,aAE7B,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aACvB,wBAAe,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,GAAI,EAC9C,4BAAmB,KAAK,EAAC,SAAS,EAAC,WAAW,QAAC,OAAO,EAAE,GAAG,GAAI,IAC1D,EAGP,KAAC,eAAe,IACd,EAAE,EAAE,GAAG,EAAE,aAAa,EACtB,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EACjC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,WAAW,GACvB,EAGF,KAAC,aAAa,IAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,GAAI,EAG1D,WAAW,IAAI,CACd,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAC1B,QAAQ,EAAE,IAAI,EACd,KAAK,EAAC,SAAS,EACf,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAC,QAAQ,kDAGX,CACR,EAGD,KAAC,aAAa,IACZ,EAAE,EAAE,GAAG,EAAE,SAAS,EAClB,QAAQ,EAAE,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAChC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,GAC9B,IACI,CACT,CAAA;AACH,CAAC,CACF,CAAA;AAED,YAAY,CAAC,WAAW,GAAG,cAAc,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { LiveIndicatorProps } from './types';
2
+ export declare const LiveIndicator: import("react").MemoExoticComponent<({ position, size }: LiveIndicatorProps) => import("react/jsx-runtime").JSX.Element>;
3
+ //# sourceMappingURL=LiveIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveIndicator.d.ts","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/LiveIndicator.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,aAAa,2DAA6B,kBAAkB,6CAyBvE,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import { Text } from '@react-three/drei';
4
+ export const LiveIndicator = memo(({ position, size }) => {
5
+ const dotSize = size * 0.15;
6
+ const fontSize = size * 0.4;
7
+ return (_jsxs("group", { position: position, children: [_jsxs("mesh", { position: [-size * 0.4, 0, 0], children: [_jsx("circleGeometry", { args: [dotSize, 16] }), _jsx("meshBasicMaterial", { color: "#ff0000" })] }), _jsx(Text, { position: [size * 0.1, 0, 0], fontSize: fontSize, color: "#ffffff", anchorX: "center", anchorY: "middle", fontWeight: "bold", children: "LIVE" })] }));
8
+ });
9
+ LiveIndicator.displayName = 'LiveIndicator';
10
+ //# sourceMappingURL=LiveIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveIndicator.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/LiveIndicator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAGxC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAsB,EAAE,EAAE;IAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAA;IAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAA;IAE3B,OAAO,CACL,iBAAO,QAAQ,EAAE,QAAQ,aAEvB,gBAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,aACjC,yBAAgB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAI,EACvC,4BAAmB,KAAK,EAAC,SAAS,GAAG,IAChC,EAGP,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAC,SAAS,EACf,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAC,QAAQ,EAChB,UAAU,EAAC,MAAM,qBAGZ,IACD,CACT,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,aAAa,CAAC,WAAW,GAAG,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PlayPauseButtonProps } from './types';
2
+ export declare const PlayPauseButton: import("react").MemoExoticComponent<({ id, position, size, playing, onInteract }: PlayPauseButtonProps) => import("react/jsx-runtime").JSX.Element>;
3
+ //# sourceMappingURL=PlayPauseButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayPauseButton.d.ts","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/PlayPauseButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,eAAO,MAAM,eAAe,oFACoB,oBAAoB,6CAyBnE,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import { Text } from '@react-three/drei';
4
+ import { Interactable } from '../Interactable';
5
+ export const PlayPauseButton = memo(({ id, position, size, playing, onInteract }) => {
6
+ return (_jsxs("group", { position: position, children: [_jsx(Interactable, { id: id, onInteract: onInteract, interactionText: playing ? '一時停止' : '再生', children: _jsxs("mesh", { children: [_jsx("circleGeometry", { args: [size / 2, 32] }), _jsx("meshBasicMaterial", { color: "#444444" })] }) }), _jsx(Text, { position: [0, 0, 0.01], fontSize: size * 0.4, color: "#ffffff", anchorX: "center", anchorY: "middle", children: playing ? '||' : '▶' })] }));
7
+ });
8
+ PlayPauseButton.displayName = 'PlayPauseButton';
9
+ //# sourceMappingURL=PlayPauseButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlayPauseButton.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/PlayPauseButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CACjC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAwB,EAAE,EAAE;IACpE,OAAO,CACL,iBAAO,QAAQ,EAAE,QAAQ,aACvB,KAAC,YAAY,IACX,EAAE,EAAE,EAAE,EACN,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAExC,2BACE,yBAAgB,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,GAAI,EACxC,4BAAmB,KAAK,EAAC,SAAS,GAAG,IAChC,GACM,EACf,KAAC,IAAI,IACH,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EACtB,QAAQ,EAAE,IAAI,GAAG,GAAG,EACpB,KAAK,EAAC,SAAS,EACf,OAAO,EAAC,QAAQ,EAChB,OAAO,EAAC,QAAQ,YAEf,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAChB,IACD,CACT,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,CAAC,WAAW,GAAG,iBAAiB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { VolumeControlProps } from './types';
2
+ export declare const VolumeControl: import("react").MemoExoticComponent<({ id, position, size, volume, onVolumeChange }: VolumeControlProps) => import("react/jsx-runtime").JSX.Element>;
3
+ //# sourceMappingURL=VolumeControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeControl.d.ts","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/VolumeControl.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAIjD,eAAO,MAAM,aAAa,uFACyB,kBAAkB,6CAiEpE,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useMemo } from 'react';
3
+ import { Text } from '@react-three/drei';
4
+ import { Interactable } from '../Interactable';
5
+ import { calculateSegments, calculateProgressBar, getVolumeIcon, } from '../RichVideoPlayer/utils';
6
+ const SEGMENTS = 11;
7
+ export const VolumeControl = memo(({ id, position, size, volume, onVolumeChange }) => {
8
+ const barWidth = size * 3;
9
+ const barHeight = size * 0.2;
10
+ const segmentWidth = barWidth / SEGMENTS;
11
+ const { width: volumeWidth, offset: volumeOffset } = calculateProgressBar(volume, barWidth);
12
+ const segments = useMemo(() => {
13
+ return calculateSegments({
14
+ segments: SEGMENTS,
15
+ width: barWidth,
16
+ maxValue: 1,
17
+ formatLabel: (value) => {
18
+ const percent = Math.round(value * 100);
19
+ return percent === 0 ? 'ミュート' : `音量: ${percent}%`;
20
+ },
21
+ });
22
+ }, [barWidth]);
23
+ 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
+ });
25
+ VolumeControl.displayName = 'VolumeControl';
26
+ //# sourceMappingURL=VolumeControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeControl.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/VolumeControl.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { LiveVideoPlayerProps } from './types';
2
+ export type { LiveVideoPlayerProps } from './types';
3
+ export declare const LiveVideoPlayer: import("react").MemoExoticComponent<({ id, position, rotation, width, url, ...props }: LiveVideoPlayerProps) => 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/LiveVideoPlayer/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AA+HnD,eAAO,MAAM,eAAe,yFAQvB,oBAAoB,6CAoCxB,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, Suspense, useState, useCallback, useEffect, useRef } from 'react';
3
+ import { useVideoTexture } from '@react-three/drei';
4
+ import { ControlPanel } from './ControlPanel';
5
+ const DEFAULT_POSITION = [0, 2, -5];
6
+ const DEFAULT_ROTATION = [0, 0, 0];
7
+ const DEFAULT_WIDTH = 4;
8
+ const LiveVideoPlayerInner = memo(({ id, position = DEFAULT_POSITION, rotation = DEFAULT_ROTATION, width = DEFAULT_WIDTH, url = '', playing: initialPlaying = true, volume: initialVolume = 1, onError, }) => {
9
+ const [playing, setPlaying] = useState(initialPlaying);
10
+ const [volume, setVolume] = useState(initialVolume);
11
+ const [isBuffering, setIsBuffering] = useState(false);
12
+ const screenHeight = width * (9 / 16);
13
+ const texture = useVideoTexture(url, {
14
+ muted: false,
15
+ loop: false,
16
+ start: playing,
17
+ });
18
+ const videoRef = useRef(texture.image);
19
+ useEffect(() => {
20
+ videoRef.current = texture.image;
21
+ }, [texture]);
22
+ useEffect(() => {
23
+ const video = videoRef.current;
24
+ if (!video)
25
+ return;
26
+ if (playing) {
27
+ video.play().catch((err) => {
28
+ console.error('Live video play error:', err);
29
+ onError?.(err);
30
+ });
31
+ }
32
+ else {
33
+ video.pause();
34
+ }
35
+ }, [playing, onError]);
36
+ useEffect(() => {
37
+ const video = videoRef.current;
38
+ if (!video)
39
+ return;
40
+ video.volume = Math.max(0, Math.min(1, volume));
41
+ }, [volume]);
42
+ useEffect(() => {
43
+ const video = videoRef.current;
44
+ if (!video)
45
+ return;
46
+ const handleWaiting = () => setIsBuffering(true);
47
+ const handlePlaying = () => setIsBuffering(false);
48
+ const handleCanPlay = () => setIsBuffering(false);
49
+ const handleError = (e) => {
50
+ const error = e.target.error;
51
+ if (error) {
52
+ console.error('Live video error:', error.message);
53
+ onError?.(new Error(error.message));
54
+ }
55
+ };
56
+ video.addEventListener('waiting', handleWaiting);
57
+ video.addEventListener('playing', handlePlaying);
58
+ video.addEventListener('canplay', handleCanPlay);
59
+ video.addEventListener('error', handleError);
60
+ return () => {
61
+ video.removeEventListener('waiting', handleWaiting);
62
+ video.removeEventListener('playing', handlePlaying);
63
+ video.removeEventListener('canplay', handleCanPlay);
64
+ video.removeEventListener('error', handleError);
65
+ };
66
+ }, [texture, onError]);
67
+ useEffect(() => {
68
+ const video = texture.image;
69
+ return () => {
70
+ video.pause();
71
+ video.src = '';
72
+ video.load();
73
+ };
74
+ }, [texture]);
75
+ const handlePlayPause = useCallback(() => {
76
+ setPlaying((prev) => !prev);
77
+ }, []);
78
+ const handleVolumeChange = useCallback((newVolume) => {
79
+ setVolume(newVolume);
80
+ }, []);
81
+ return (_jsxs("group", { position: position, rotation: rotation, children: [_jsxs("mesh", { children: [_jsx("planeGeometry", { args: [width, screenHeight] }), _jsx("meshBasicMaterial", { map: texture, toneMapped: false })] }), _jsx(ControlPanel, { id: id, width: width, screenHeight: screenHeight, playing: playing, volume: volume, isBuffering: isBuffering, onPlayPause: handlePlayPause, onVolumeChange: handleVolumeChange })] }));
82
+ });
83
+ LiveVideoPlayerInner.displayName = 'LiveVideoPlayerInner';
84
+ export const LiveVideoPlayer = memo(({ id, position = DEFAULT_POSITION, rotation = DEFAULT_ROTATION, width = DEFAULT_WIDTH, url, ...props }) => {
85
+ const screenHeight = width * (9 / 16);
86
+ if (!url) {
87
+ return (_jsx("group", { position: position, rotation: rotation, children: _jsxs("mesh", { children: [_jsx("planeGeometry", { args: [width, screenHeight] }), _jsx("meshBasicMaterial", { color: "#000000" })] }) }));
88
+ }
89
+ return (_jsx(Suspense, { fallback: _jsx("group", { position: position, rotation: rotation, children: _jsxs("mesh", { children: [_jsx("planeGeometry", { args: [width, screenHeight] }), _jsx("meshBasicMaterial", { color: "#333333" })] }) }), children: _jsx(LiveVideoPlayerInner, { id: id, position: position, rotation: rotation, width: width, url: url, ...props }) }));
90
+ });
91
+ LiveVideoPlayer.displayName = 'LiveVideoPlayer';
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface LiveVideoPlayerProps {
2
+ /** スクリーンの一意なID(必須) */
3
+ id: string;
4
+ /** スクリーンの位置 */
5
+ position?: [number, number, number];
6
+ /** スクリーンの回転 */
7
+ rotation?: [number, number, number];
8
+ /** スクリーンの幅(高さは16:9で自動計算、デフォルト: 4) */
9
+ width?: number;
10
+ /** ライブストリームのURL(HLS .m3u8 形式) */
11
+ url?: string;
12
+ /** 初期再生状態(デフォルト: true) */
13
+ playing?: boolean;
14
+ /** 初期音量 0〜1(デフォルト: 1) */
15
+ volume?: number;
16
+ /** 同期モード(デフォルト: 'global') */
17
+ sync?: 'global' | 'local';
18
+ /** エラー発生時のコールバック */
19
+ onError?: (error: Error) => void;
20
+ }
21
+ export interface LiveControlPanelProps {
22
+ id: string;
23
+ width: number;
24
+ screenHeight: number;
25
+ playing: boolean;
26
+ volume: number;
27
+ isBuffering: boolean;
28
+ onPlayPause: () => void;
29
+ onVolumeChange: (volume: number) => void;
30
+ }
31
+ export interface PlayPauseButtonProps {
32
+ id: string;
33
+ position: [number, number, number];
34
+ size: number;
35
+ playing: boolean;
36
+ onInteract: () => void;
37
+ }
38
+ export interface VolumeControlProps {
39
+ id: string;
40
+ position: [number, number, number];
41
+ size: number;
42
+ volume: number;
43
+ onVolumeChange: (volume: number) => void;
44
+ }
45
+ export interface LiveIndicatorProps {
46
+ position: [number, number, number];
47
+ size: number;
48
+ }
49
+ export interface LoadingSpinnerProps {
50
+ position: [number, number, number];
51
+ size: number;
52
+ }
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,eAAe;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,6BAA6B;IAC7B,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,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;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,EAAE,MAAM,CAAA;CACb"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/LiveVideoPlayer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { type FC } from 'react';
2
+ import type { Props } from './types';
3
+ /**
4
+ * 3D空間内でテキスト入力を可能にするコンポーネント
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * <TextInput
9
+ * id="my-input"
10
+ * value={inputValue}
11
+ * onSubmit={handleSubmit}
12
+ * placeholder="テキストを入力..."
13
+ * >
14
+ * <mesh>
15
+ * <boxGeometry args={[1, 0.5, 0.1]} />
16
+ * <meshStandardMaterial color="#333" />
17
+ * </mesh>
18
+ * </TextInput>
19
+ * ```
20
+ */
21
+ export declare const TextInput: FC<Props>;
22
+ export type { Props as TextInputProps } from './types';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TextInput/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAK/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,KAAK,CAmE/B,CAAA;AAED,YAAY,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef } from 'react';
3
+ import { LAYERS } from '../../constants/layers';
4
+ import { useTextInputContext } from '../../contexts/TextInputContext';
5
+ import { useXRift } from '../../contexts/XRiftContext';
6
+ /**
7
+ * 3D空間内でテキスト入力を可能にするコンポーネント
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * <TextInput
12
+ * id="my-input"
13
+ * value={inputValue}
14
+ * onSubmit={handleSubmit}
15
+ * placeholder="テキストを入力..."
16
+ * >
17
+ * <mesh>
18
+ * <boxGeometry args={[1, 0.5, 0.1]} />
19
+ * <meshStandardMaterial color="#333" />
20
+ * </mesh>
21
+ * </TextInput>
22
+ * ```
23
+ */
24
+ export const TextInput = ({ id, children, placeholder, maxLength, value, onSubmit, interactionText = 'クリックして入力', disabled = false, }) => {
25
+ const { registerInteractable, unregisterInteractable } = useXRift();
26
+ const { requestTextInput } = useTextInputContext();
27
+ const groupRef = useRef(null);
28
+ // インタラクション時のハンドラー
29
+ const handleInteract = useCallback(() => {
30
+ if (disabled)
31
+ return;
32
+ requestTextInput({
33
+ id,
34
+ placeholder,
35
+ maxLength,
36
+ initialValue: value,
37
+ onSubmit: (inputValue) => {
38
+ onSubmit?.(inputValue);
39
+ },
40
+ });
41
+ }, [id, placeholder, maxLength, value, onSubmit, disabled, requestTextInput]);
42
+ // レイヤー設定 & オブジェクト登録(マウント時のみ)
43
+ useEffect(() => {
44
+ const object = groupRef.current;
45
+ if (!object)
46
+ return;
47
+ // レイヤーを設定(レイキャスト最適化のため)
48
+ object.traverse((child) => {
49
+ child.layers.enable(LAYERS.INTERACTABLE);
50
+ });
51
+ // インタラクト可能オブジェクトとして登録
52
+ registerInteractable(object);
53
+ // クリーンアップ
54
+ return () => {
55
+ unregisterInteractable(object);
56
+ object.traverse((child) => {
57
+ child.layers.disable(LAYERS.INTERACTABLE);
58
+ });
59
+ };
60
+ }, [registerInteractable, unregisterInteractable]);
61
+ // userData の更新(props が変わった時)
62
+ useEffect(() => {
63
+ const object = groupRef.current;
64
+ if (!object)
65
+ return;
66
+ Object.assign(object.userData, {
67
+ id,
68
+ type: 'textInput',
69
+ onInteract: handleInteract,
70
+ interactionText: disabled ? undefined : interactionText,
71
+ enabled: !disabled,
72
+ });
73
+ }, [id, handleInteract, interactionText, disabled]);
74
+ return _jsx("group", { ref: groupRef, children: children });
75
+ };
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/TextInput/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAW,MAAM,OAAO,CAAA;AAE/D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGtD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAc,CAAC,EACnC,EAAE,EACF,QAAQ,EACR,WAAW,EACX,SAAS,EACT,KAAK,EACL,QAAQ,EACR,eAAe,GAAG,UAAU,EAC5B,QAAQ,GAAG,KAAK,GACjB,EAAE,EAAE;IACH,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,GAAG,QAAQ,EAAE,CAAA;IACnE,MAAM,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAQ,IAAI,CAAC,CAAA;IAEpC,kBAAkB;IAClB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,QAAQ;YAAE,OAAM;QAEpB,gBAAgB,CAAC;YACf,EAAE;YACF,WAAW;YACX,SAAS;YACT,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE;gBACvB,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAA;YACxB,CAAC;SACF,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAE7E,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,wBAAwB;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,sBAAsB;QACtB,oBAAoB,CAAC,MAAM,CAAC,CAAA;QAE5B,UAAU;QACV,OAAO,GAAG,EAAE;YACV,sBAAsB,CAAC,MAAM,CAAC,CAAA;YAE9B,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YAC3C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,CAAA;IAElD,6BAA6B;IAC7B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAM;QAEnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC7B,EAAE;YACF,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,cAAc;YAC1B,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;YACvD,OAAO,EAAE,CAAC,QAAQ;SACnB,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEnD,OAAO,gBAAO,GAAG,EAAE,QAAQ,YAAG,QAAQ,GAAS,CAAA;AACjD,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface Props {
3
+ /** 入力フィールドの一意なID */
4
+ id: string;
5
+ /** 子要素(3Dオブジェクト) */
6
+ children: ReactNode;
7
+ /** プレースホルダーテキスト */
8
+ placeholder?: string;
9
+ /** 最大文字数 */
10
+ maxLength?: number;
11
+ /** 現在の値(制御コンポーネントとして使う場合) */
12
+ value?: string;
13
+ /** 入力完了時のコールバック */
14
+ onSubmit?: (value: string) => void;
15
+ /** インタラクション時に表示するテキスト */
16
+ interactionText?: string;
17
+ /** 入力を無効にするか */
18
+ disabled?: boolean;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/TextInput/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,MAAM,WAAW,KAAK;IACpB,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,oBAAoB;IACpB,QAAQ,EAAE,SAAS,CAAA;IACnB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mBAAmB;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,yBAAyB;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/TextInput/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * テキスト入力のリクエスト情報
4
+ */
5
+ export interface TextInputRequest {
6
+ /** 入力フィールドの一意なID */
7
+ id: string;
8
+ /** プレースホルダーテキスト */
9
+ placeholder?: string;
10
+ /** 最大文字数 */
11
+ maxLength?: number;
12
+ /** 初期値 */
13
+ initialValue?: string;
14
+ /** 入力完了時のコールバック */
15
+ onSubmit: (value: string) => void;
16
+ /** キャンセル時のコールバック */
17
+ onCancel?: () => void;
18
+ }
19
+ /**
20
+ * テキスト入力のContext値
21
+ */
22
+ export interface TextInputContextValue {
23
+ /**
24
+ * テキスト入力オーバーレイを表示する
25
+ * xrift-frontend側でオーバーレイUIを表示し、入力完了後にonSubmitが呼ばれる
26
+ */
27
+ requestTextInput: (request: TextInputRequest) => void;
28
+ /**
29
+ * 現在アクティブなテキスト入力があるか
30
+ */
31
+ isActive: boolean;
32
+ }
33
+ /**
34
+ * デフォルトの実装(開発環境用)
35
+ * コンソールにログを出力し、1秒後にダミー値でsubmitを呼ぶ
36
+ */
37
+ export declare const createDefaultTextInputImplementation: () => TextInputContextValue;
38
+ /**
39
+ * テキスト入力のContext
40
+ */
41
+ export declare const TextInputContext: import("react").Context<TextInputContextValue | null>;
42
+ interface Props {
43
+ value: TextInputContextValue;
44
+ children: ReactNode;
45
+ }
46
+ /**
47
+ * テキスト入力のContextProvider
48
+ */
49
+ export declare const TextInputProvider: ({ value, children }: Props) => import("react/jsx-runtime").JSX.Element;
50
+ /**
51
+ * テキスト入力の機能を取得するhook
52
+ *
53
+ * @example
54
+ * const { requestTextInput } = useTextInputContext()
55
+ * requestTextInput({
56
+ * id: 'my-input',
57
+ * placeholder: '名前を入力',
58
+ * onSubmit: (value) => console.log('入力値:', value),
59
+ * })
60
+ *
61
+ * @throws {Error} TextInputProvider の外で呼び出された場合
62
+ */
63
+ export declare const useTextInputContext: () => TextInputContextValue;
64
+ export {};
65
+ //# sourceMappingURL=TextInputContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInputContext.d.ts","sourceRoot":"","sources":["../../src/contexts/TextInputContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU;IACV,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,gBAAgB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,oCAAoC,QAAO,qBAYtD,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,uDAAoD,CAAA;AAEjF,UAAU,KAAK;IACb,KAAK,EAAE,qBAAqB,CAAA;IAC5B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,qBAAqB,KAAK,4CAE3D,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,QAAO,qBAQtC,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from 'react';
3
+ /**
4
+ * デフォルトの実装(開発環境用)
5
+ * コンソールにログを出力し、1秒後にダミー値でsubmitを呼ぶ
6
+ */
7
+ export const createDefaultTextInputImplementation = () => ({
8
+ requestTextInput: (request) => {
9
+ console.log('[TextInput] requestTextInput called:', request);
10
+ // 開発環境ではブラウザのpromptを使用
11
+ const value = window.prompt(request.placeholder ?? 'テキストを入力', request.initialValue ?? '');
12
+ if (value !== null) {
13
+ request.onSubmit(value);
14
+ }
15
+ else {
16
+ request.onCancel?.();
17
+ }
18
+ },
19
+ isActive: false,
20
+ });
21
+ /**
22
+ * テキスト入力のContext
23
+ */
24
+ export const TextInputContext = createContext(null);
25
+ /**
26
+ * テキスト入力のContextProvider
27
+ */
28
+ export const TextInputProvider = ({ value, children }) => {
29
+ return _jsx(TextInputContext.Provider, { value: value, children: children });
30
+ };
31
+ /**
32
+ * テキスト入力の機能を取得するhook
33
+ *
34
+ * @example
35
+ * const { requestTextInput } = useTextInputContext()
36
+ * requestTextInput({
37
+ * id: 'my-input',
38
+ * placeholder: '名前を入力',
39
+ * onSubmit: (value) => console.log('入力値:', value),
40
+ * })
41
+ *
42
+ * @throws {Error} TextInputProvider の外で呼び出された場合
43
+ */
44
+ export const useTextInputContext = () => {
45
+ const context = useContext(TextInputContext);
46
+ if (!context) {
47
+ throw new Error('useTextInputContext must be used within TextInputProvider');
48
+ }
49
+ return context;
50
+ };
51
+ //# sourceMappingURL=TextInputContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInputContext.js","sourceRoot":"","sources":["../../src/contexts/TextInputContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAA;AAmCjE;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAA0B,EAAE,CAAC,CAAC;IAChF,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAA;QAC5D,uBAAuB;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA;QACzF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IACD,QAAQ,EAAE,KAAK;CAChB,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAA+B,IAAI,CAAC,CAAA;AAOjF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAS,EAAE,EAAE;IAC9D,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA6B,CAAA;AACxF,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAA0B,EAAE;IAC7D,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAA;IAE5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -3,6 +3,7 @@ import type { Object3D } from 'three';
3
3
  import { type InstanceStateContextValue } from './InstanceStateContext';
4
4
  import { type ScreenShareContextValue } from './ScreenShareContext';
5
5
  import { type SpawnPointContextValue } from './SpawnPointContext';
6
+ import { type TextInputContextValue } from './TextInputContext';
6
7
  import { type UsersContextValue } from './UsersContext';
7
8
  export interface XRiftContextValue {
8
9
  /**
@@ -46,6 +47,11 @@ interface Props {
46
47
  * 指定しない場合はデフォルト実装(ローカルstate)が使用される
47
48
  */
48
49
  spawnPointImplementation?: SpawnPointContextValue;
50
+ /**
51
+ * テキスト入力の実装(オプション)
52
+ * 指定しない場合はデフォルト実装(ブラウザのprompt)が使用される
53
+ */
54
+ textInputImplementation?: TextInputContextValue;
49
55
  /**
50
56
  * ユーザー情報の実装(オプション)
51
57
  * 指定しない場合はデフォルト実装(空の状態)が使用される
@@ -58,7 +64,7 @@ interface Props {
58
64
  * Module Federationで動的にロードされたワールドコンポーネントに
59
65
  * 必要な情報を注入するために使用
60
66
  */
61
- export declare const XRiftProvider: ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, usersImplementation, children, }: Props) => import("react/jsx-runtime").JSX.Element;
67
+ export declare const XRiftProvider: ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, children, }: Props) => import("react/jsx-runtime").JSX.Element;
62
68
  /**
63
69
  * XRift ワールドの情報を取得するhook
64
70
  * ワールドプロジェクト側でアセットの相対パスを絶対パスに変換する際に使用
@@ -1 +1 @@
1
- {"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAWtE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChD;;OAEG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAAgD,CAAA;AAEzE,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,+HAO3B,KAAK,4CAwCP,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
1
+ {"version":3,"file":"XRiftContext.d.ts","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAA8C,MAAM,OAAO,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAWtE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC;;OAEG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;IAChD;;OAEG;IACH,sBAAsB,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAA;CAKnD;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAAgD,CAAA;AAEzE,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAA;IACvD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,uBAAuB,CAAA;IACnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,sBAAsB,CAAA;IACjD;;;OAGG;IACH,uBAAuB,CAAC,EAAE,qBAAqB,CAAA;IAC/C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;IACvC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,wJAQ3B,KAAK,4CAgDP,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
@@ -3,6 +3,7 @@ import { createContext, useCallback, useContext, useMemo, useState } from 'react
3
3
  import { InstanceStateProvider } from './InstanceStateContext';
4
4
  import { ScreenShareProvider } from './ScreenShareContext';
5
5
  import { SpawnPointProvider } from './SpawnPointContext';
6
+ import { TextInputProvider, createDefaultTextInputImplementation, } from './TextInputContext';
6
7
  import { UsersProvider } from './UsersContext';
7
8
  // デフォルトの画面共有実装(開発環境用)
8
9
  const createDefaultScreenShareImplementation = () => ({
@@ -22,11 +23,13 @@ export const XRiftContext = createContext(null);
22
23
  * Module Federationで動的にロードされたワールドコンポーネントに
23
24
  * 必要な情報を注入するために使用
24
25
  */
25
- export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, usersImplementation, children, }) => {
26
+ export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShareImplementation, spawnPointImplementation, textInputImplementation, usersImplementation, children, }) => {
26
27
  // インタラクト可能なオブジェクトの管理
27
28
  const [interactableObjects] = useState(() => new Set());
28
29
  // 画面共有の実装(指定がない場合はデフォルト実装を使用)
29
30
  const screenShareImpl = useMemo(() => screenShareImplementation ?? createDefaultScreenShareImplementation(), [screenShareImplementation]);
31
+ // テキスト入力の実装(指定がない場合はデフォルト実装を使用)
32
+ const textInputImpl = useMemo(() => textInputImplementation ?? createDefaultTextInputImplementation(), [textInputImplementation]);
30
33
  // オブジェクトの登録
31
34
  const registerInteractable = useCallback((object) => {
32
35
  interactableObjects.add(object);
@@ -40,7 +43,7 @@ export const XRiftProvider = ({ baseUrl, instanceStateImplementation, screenShar
40
43
  interactableObjects,
41
44
  registerInteractable,
42
45
  unregisterInteractable,
43
- }, children: _jsx(ScreenShareProvider, { value: screenShareImpl, children: _jsx(InstanceStateProvider, { implementation: instanceStateImplementation, children: _jsx(SpawnPointProvider, { implementation: spawnPointImplementation, children: _jsx(UsersProvider, { implementation: usersImplementation, children: children }) }) }) }) }));
46
+ }, children: _jsx(ScreenShareProvider, { value: screenShareImpl, children: _jsx(TextInputProvider, { value: textInputImpl, children: _jsx(InstanceStateProvider, { implementation: instanceStateImplementation, children: _jsx(SpawnPointProvider, { implementation: spawnPointImplementation, children: _jsx(UsersProvider, { implementation: usersImplementation, children: children }) }) }) }) }) }));
44
47
  };
45
48
  /**
46
49
  * XRift ワールドの情報を取得するhook
@@ -1 +1 @@
1
- {"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEjG,OAAO,EAAE,qBAAqB,EAAkC,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAgC,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAA;AAEtE,sBAAsB;AACtB,MAAM,sCAAsC,GAAG,GAA4B,EAAE,CAAC,CAAC;IAC7E,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAC5E,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;IAC1E,eAAe,EAAE,KAAK;CACvB,CAAC,CAAA;AA2BF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAA;AA2BzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,OAAO,EACP,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,QAAQ,GACF,EAAE,EAAE;IACV,qBAAqB;IACrB,MAAM,CAAC,mBAAmB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAY,CAAC,CAAA;IAEjE,8BAA8B;IAC9B,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,yBAAyB,IAAI,sCAAsC,EAAE,EAC3E,CAAC,yBAAyB,CAAC,CAC5B,CAAA;IAED,YAAY;IACZ,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC5D,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,cAAc;IACd,MAAM,sBAAsB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC9D,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,OAAO;YACP,mBAAmB;YACnB,oBAAoB;YACpB,sBAAsB;SACvB,YAED,KAAC,mBAAmB,IAAC,KAAK,EAAE,eAAe,YACzC,KAAC,qBAAqB,IAAC,cAAc,EAAE,2BAA2B,YAChE,KAAC,kBAAkB,IAAC,cAAc,EAAE,wBAAwB,YAC1D,KAAC,aAAa,IAAC,cAAc,EAAE,mBAAmB,YAC/C,QAAQ,GACK,GACG,GACC,GACJ,GACA,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAsB,EAAE;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAkB,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEjG,OAAO,EAAE,qBAAqB,EAAkC,MAAM,wBAAwB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAgC,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,kBAAkB,EAA+B,MAAM,qBAAqB,CAAA;AACrF,OAAO,EACL,iBAAiB,EACjB,oCAAoC,GAErC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAA;AAEtE,sBAAsB;AACtB,MAAM,sCAAsC,GAAG,GAA4B,EAAE,CAAC,CAAC;IAC7E,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,KAAK;IAChB,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAC5E,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;IAC1E,eAAe,EAAE,KAAK;CACvB,CAAC,CAAA;AA2BF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAA;AAgCzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAC5B,OAAO,EACP,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,QAAQ,GACF,EAAE,EAAE;IACV,qBAAqB;IACrB,MAAM,CAAC,mBAAmB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAY,CAAC,CAAA;IAEjE,8BAA8B;IAC9B,MAAM,eAAe,GAAG,OAAO,CAC7B,GAAG,EAAE,CAAC,yBAAyB,IAAI,sCAAsC,EAAE,EAC3E,CAAC,yBAAyB,CAAC,CAC5B,CAAA;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,uBAAuB,IAAI,oCAAoC,EAAE,EACvE,CAAC,uBAAuB,CAAC,CAC1B,CAAA;IAED,YAAY;IACZ,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC5D,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,cAAc;IACd,MAAM,sBAAsB,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QAC9D,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAEzB,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,OAAO;YACP,mBAAmB;YACnB,oBAAoB;YACpB,sBAAsB;SACvB,YAED,KAAC,mBAAmB,IAAC,KAAK,EAAE,eAAe,YACzC,KAAC,iBAAiB,IAAC,KAAK,EAAE,aAAa,YACrC,KAAC,qBAAqB,IAAC,cAAc,EAAE,2BAA2B,YAChE,KAAC,kBAAkB,IAAC,cAAc,EAAE,wBAAwB,YAC1D,KAAC,aAAa,IAAC,cAAc,EAAE,mBAAmB,YAC/C,QAAQ,GACK,GACG,GACC,GACN,GACA,GACA,CACzB,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAsB,EAAE;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAExC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -3,13 +3,16 @@ export { InstanceStateContext, useInstanceStateContext, type InstanceStateContex
3
3
  export { ScreenShareContext, ScreenShareProvider, useScreenShareContext, type ScreenShareContextValue, } from './contexts/ScreenShareContext';
4
4
  export { SpawnPointContext, SpawnPointProvider, useSpawnPointContext, type SpawnPoint as SpawnPointData, type SpawnPointContextValue, } from './contexts/SpawnPointContext';
5
5
  export { UsersContext, UsersProvider, useUsers, type User, type UsersContextValue, } from './contexts/UsersContext';
6
+ export { TextInputContext, TextInputProvider, useTextInputContext, createDefaultTextInputImplementation, type TextInputContextValue, type TextInputRequest, } from './contexts/TextInputContext';
6
7
  export { Interactable, type InteractableProps, } from './components/Interactable';
7
8
  export { Mirror, type MirrorProps } from './components/Mirror';
8
9
  export { Skybox, type SkyboxProps } from './components/Skybox';
9
10
  export { VideoScreen, type VideoScreenProps, type VideoState, } from './components/VideoScreen';
10
11
  export { RichVideoPlayer, type RichVideoPlayerProps, } from './components/RichVideoPlayer';
12
+ export { LiveVideoPlayer, type LiveVideoPlayerProps, } from './components/LiveVideoPlayer';
11
13
  export { ScreenShareDisplay, type ScreenShareDisplayProps, } from './components/ScreenShareDisplay';
12
14
  export { SpawnPoint, type SpawnPointProps, } from './components/SpawnPoint';
15
+ export { TextInput, type TextInputProps, } from './components/TextInput';
13
16
  export { useInstanceState } from './hooks/useInstanceState';
14
17
  export { useSpawnPoint } from './hooks/useSpawnPoint';
15
18
  export { type PlayerMovement, type Position3D, type Rotation3D, type VRTrackingData, type VRMovementDirection, } from './types/movement';
@@ -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;AAGhC,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,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,GAC7B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAA"}
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,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAA;AAErC,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;AAG/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,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
@@ -4,14 +4,17 @@ export { InstanceStateContext, useInstanceStateContext, } from './contexts/Insta
4
4
  export { ScreenShareContext, ScreenShareProvider, useScreenShareContext, } from './contexts/ScreenShareContext';
5
5
  export { SpawnPointContext, SpawnPointProvider, useSpawnPointContext, } from './contexts/SpawnPointContext';
6
6
  export { UsersContext, UsersProvider, useUsers, } from './contexts/UsersContext';
7
+ export { TextInputContext, TextInputProvider, useTextInputContext, createDefaultTextInputImplementation, } from './contexts/TextInputContext';
7
8
  // Components
8
9
  export { Interactable, } from './components/Interactable';
9
10
  export { Mirror } from './components/Mirror';
10
11
  export { Skybox } from './components/Skybox';
11
12
  export { VideoScreen, } from './components/VideoScreen';
12
13
  export { RichVideoPlayer, } from './components/RichVideoPlayer';
14
+ export { LiveVideoPlayer, } from './components/LiveVideoPlayer';
13
15
  export { ScreenShareDisplay, } from './components/ScreenShareDisplay';
14
16
  export { SpawnPoint, } from './components/SpawnPoint';
17
+ export { TextInput, } from './components/TextInput';
15
18
  // Hooks
16
19
  export { useInstanceState } from './hooks/useInstanceState';
17
20
  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,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,EACL,eAAe,GAEhB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAA;AAExC,OAAO,EACL,UAAU,GAEX,MAAM,yBAAyB,CAAA;AAEhC,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"}
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,EACL,eAAe,GAEhB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,eAAe,GAEhB,MAAM,8BAA8B,CAAA;AAErC,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,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TestScene.d.ts","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,SAAS,4CA8ExB"}
1
+ {"version":3,"file":"TestScene.d.ts","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,SAAS,4CA4GxB"}
@@ -1,12 +1,19 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
2
3
  import { RichVideoPlayer } from '../components/RichVideoPlayer';
4
+ import { LiveVideoPlayer } from '../components/LiveVideoPlayer';
3
5
  import { Mirror } from '../components/Mirror';
4
6
  import { Skybox } from '../components/Skybox';
7
+ import { TextInput } from '../components/TextInput';
5
8
  /**
6
9
  * VideoScreenとMirrorのテストシーン
7
10
  * Triplexでコンポーネントを確認するためのシーン
8
11
  */
9
12
  export function TestScene() {
10
- return (_jsxs(_Fragment, { children: [_jsx(Skybox, {}), _jsx("ambientLight", { intensity: 0.5 }), _jsx("directionalLight", { position: [5, 10, 5], intensity: 1 }), _jsxs("mesh", { rotation: [-Math.PI / 2, 0, 0], position: [0, 0, 0], receiveShadow: true, children: [_jsx("planeGeometry", { args: [20, 20] }), _jsx("meshStandardMaterial", { color: "#cccccc" })] }), _jsx(RichVideoPlayer, { id: "rich-player", position: [-4, 2, -2], rotation: [0, Math.PI / 6, 0], width: 3, volume: 0, playing: true, url: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" }), _jsx(Mirror, { position: [-5, 2.5, -3], size: [3, 4], textureResolution: 512 }), _jsx(Mirror, { position: [-3, 1.5, -7], size: [2, 2], color: 0xffd700 }), _jsxs("mesh", { position: [0, 0.5, 0], children: [_jsx("boxGeometry", { args: [1, 1, 1] }), _jsx("meshStandardMaterial", { color: "orange" })] }), _jsxs("mesh", { position: [2, 1, -1], children: [_jsx("sphereGeometry", { args: [0.5, 32, 32] }), _jsx("meshStandardMaterial", { color: "blue", metalness: 0.8, roughness: 0.2 })] }), _jsxs("mesh", { position: [-2, 0.75, -1], children: [_jsx("cylinderGeometry", { args: [0.5, 0.5, 1.5, 32] }), _jsx("meshStandardMaterial", { color: "green" })] })] }));
13
+ const [textInputValue, setTextInputValue] = useState('');
14
+ return (_jsxs(_Fragment, { children: [_jsx(Skybox, {}), _jsx("ambientLight", { intensity: 0.5 }), _jsx("directionalLight", { position: [5, 10, 5], intensity: 1 }), _jsxs("mesh", { rotation: [-Math.PI / 2, 0, 0], position: [0, 0, 0], receiveShadow: true, children: [_jsx("planeGeometry", { args: [20, 20] }), _jsx("meshStandardMaterial", { color: "#cccccc" })] }), _jsx(RichVideoPlayer, { id: "rich-player", position: [-4, 2, -2], rotation: [0, Math.PI / 6, 0], width: 3, volume: 0, playing: true, url: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" }), _jsx(LiveVideoPlayer, { id: "live-player", position: [4, 2, -2], rotation: [0, -Math.PI / 6, 0], width: 3, volume: 0, playing: true, url: "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8" }), _jsx(Mirror, { position: [-5, 2.5, -3], size: [3, 4], textureResolution: 512 }), _jsx(Mirror, { position: [-3, 1.5, -7], size: [2, 2], color: 0xffd700 }), _jsxs("mesh", { position: [0, 0.5, 0], children: [_jsx("boxGeometry", { args: [1, 1, 1] }), _jsx("meshStandardMaterial", { color: "orange" })] }), _jsxs("mesh", { position: [2, 1, -1], children: [_jsx("sphereGeometry", { args: [0.5, 32, 32] }), _jsx("meshStandardMaterial", { color: "blue", metalness: 0.8, roughness: 0.2 })] }), _jsxs("mesh", { position: [-2, 0.75, -1], children: [_jsx("cylinderGeometry", { args: [0.5, 0.5, 1.5, 32] }), _jsx("meshStandardMaterial", { color: "green" })] }), _jsx(TextInput, { id: "test-input", placeholder: "\u540D\u524D\u3092\u5165\u529B...", maxLength: 20, value: textInputValue, onSubmit: (value) => {
15
+ console.log('TextInput submitted:', value);
16
+ setTextInputValue(value);
17
+ }, children: _jsxs("mesh", { position: [0, 1.5, -2], children: [_jsx("boxGeometry", { args: [2, 0.5, 0.1] }), _jsx("meshStandardMaterial", { color: "#333" })] }) })] }));
11
18
  }
12
19
  //# sourceMappingURL=TestScene.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestScene.js","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAG7C;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,CACL,8BAEE,KAAC,MAAM,KAAG,EAGV,uBAAc,SAAS,EAAE,GAAG,GAAI,EAChC,2BAAkB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAI,EAGxD,gBAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,mBACtE,wBAAe,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAI,EACjC,+BAAsB,KAAK,EAAC,SAAS,GAAG,IACnC,EAqBP,KAAC,eAAe,IACd,EAAE,EAAC,aAAa,EAChB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,OAAO,QACP,GAAG,EAAC,mFAAmF,GACvF,EAGF,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACZ,iBAAiB,EAAE,GAAG,GACtB,EAGF,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACZ,KAAK,EAAE,QAAQ,GACf,EAGF,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,aACzB,sBAAa,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAI,EAChC,+BAAsB,KAAK,EAAC,QAAQ,GAAG,IAClC,EAGP,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aACxB,yBAAgB,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAI,EACvC,+BAAsB,KAAK,EAAC,MAAM,EAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAI,IAChE,EAGP,gBAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,aAC5B,2BAAkB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAI,EAC/C,+BAAsB,KAAK,EAAC,OAAO,GAAG,IACjC,IACN,CACJ,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"TestScene.js","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEnD;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAExD,OAAO,CACL,8BAEE,KAAC,MAAM,KAAG,EAGV,uBAAc,SAAS,EAAE,GAAG,GAAI,EAChC,2BAAkB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,GAAI,EAGxD,gBAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,mBACtE,wBAAe,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAI,EACjC,+BAAsB,KAAK,EAAC,SAAS,GAAG,IACnC,EAqBP,KAAC,eAAe,IACd,EAAE,EAAC,aAAa,EAChB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,OAAO,QACP,GAAG,EAAC,mFAAmF,GACvF,EAGF,KAAC,eAAe,IACd,EAAE,EAAC,aAAa,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAC9B,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,OAAO,QACP,GAAG,EAAC,mGAAmG,GACvG,EAGF,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACZ,iBAAiB,EAAE,GAAG,GACtB,EAGF,KAAC,MAAM,IACL,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EACvB,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACZ,KAAK,EAAE,QAAQ,GACf,EAGF,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,aACzB,sBAAa,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAI,EAChC,+BAAsB,KAAK,EAAC,QAAQ,GAAG,IAClC,EAGP,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aACxB,yBAAgB,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAI,EACvC,+BAAsB,KAAK,EAAC,MAAM,EAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAI,IAChE,EAGP,gBAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,aAC5B,2BAAkB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAI,EAC/C,+BAAsB,KAAK,EAAC,OAAO,GAAG,IACjC,EAGP,KAAC,SAAS,IACR,EAAE,EAAC,YAAY,EACf,WAAW,EAAC,mCAAU,EACtB,SAAS,EAAE,EAAE,EACb,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;oBAC1C,iBAAiB,CAAC,KAAK,CAAC,CAAA;gBAC1B,CAAC,YAED,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,aAC1B,sBAAa,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAI,EACpC,+BAAsB,KAAK,EAAC,MAAM,GAAG,IAChC,GACG,IACX,CACJ,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xrift/world-components",
3
- "version": "0.17.1",
3
+ "version": "0.19.0",
4
4
  "description": "Shared components and utilities for Xrift worlds",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,9 +33,15 @@
33
33
  "peerDependencies": {
34
34
  "@react-three/drei": "^10.0.0",
35
35
  "@react-three/fiber": "^9.0.0",
36
+ "hls.js": "^1.5.0",
36
37
  "react": "^18.0.0 || ^19.0.0",
37
38
  "three": ">=0.176.0"
38
39
  },
40
+ "peerDependenciesMeta": {
41
+ "hls.js": {
42
+ "optional": true
43
+ }
44
+ },
39
45
  "devDependencies": {
40
46
  "@react-three/drei": "^10.7.6",
41
47
  "@react-three/fiber": "^9.4.0",