@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.
- package/dist/components/LiveVideoPlayer/ControlPanel.d.ts +3 -0
- package/dist/components/LiveVideoPlayer/ControlPanel.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/ControlPanel.js +15 -0
- package/dist/components/LiveVideoPlayer/ControlPanel.js.map +1 -0
- package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts +3 -0
- package/dist/components/LiveVideoPlayer/LiveIndicator.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/LiveIndicator.js +10 -0
- package/dist/components/LiveVideoPlayer/LiveIndicator.js.map +1 -0
- package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts +3 -0
- package/dist/components/LiveVideoPlayer/PlayPauseButton.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/PlayPauseButton.js +9 -0
- package/dist/components/LiveVideoPlayer/PlayPauseButton.js.map +1 -0
- package/dist/components/LiveVideoPlayer/VolumeControl.d.ts +3 -0
- package/dist/components/LiveVideoPlayer/VolumeControl.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/VolumeControl.js +26 -0
- package/dist/components/LiveVideoPlayer/VolumeControl.js.map +1 -0
- package/dist/components/LiveVideoPlayer/index.d.ts +4 -0
- package/dist/components/LiveVideoPlayer/index.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/index.js +92 -0
- package/dist/components/LiveVideoPlayer/index.js.map +1 -0
- package/dist/components/LiveVideoPlayer/types.d.ts +53 -0
- package/dist/components/LiveVideoPlayer/types.d.ts.map +1 -0
- package/dist/components/LiveVideoPlayer/types.js +2 -0
- package/dist/components/LiveVideoPlayer/types.js.map +1 -0
- package/dist/components/TextInput/index.d.ts +23 -0
- package/dist/components/TextInput/index.d.ts.map +1 -0
- package/dist/components/TextInput/index.js +76 -0
- package/dist/components/TextInput/index.js.map +1 -0
- package/dist/components/TextInput/types.d.ts +20 -0
- package/dist/components/TextInput/types.d.ts.map +1 -0
- package/dist/components/TextInput/types.js +2 -0
- package/dist/components/TextInput/types.js.map +1 -0
- package/dist/contexts/TextInputContext.d.ts +65 -0
- package/dist/contexts/TextInputContext.d.ts.map +1 -0
- package/dist/contexts/TextInputContext.js +51 -0
- package/dist/contexts/TextInputContext.js.map +1 -0
- package/dist/contexts/XRiftContext.d.ts +7 -1
- package/dist/contexts/XRiftContext.d.ts.map +1 -1
- package/dist/contexts/XRiftContext.js +5 -2
- package/dist/contexts/XRiftContext.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/scenes/TestScene.d.ts.map +1 -1
- package/dist/scenes/TestScene.js +8 -1
- package/dist/scenes/TestScene.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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;
|
|
1
|
+
{"version":3,"file":"XRiftContext.js","sourceRoot":"","sources":["../../src/contexts/XRiftContext.tsx"],"names":[],"mappings":"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"}
|
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';
|
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;
|
|
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":"
|
|
1
|
+
{"version":3,"file":"TestScene.d.ts","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAgB,SAAS,4CA4GxB"}
|
package/dist/scenes/TestScene.js
CHANGED
|
@@ -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
|
-
|
|
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":";
|
|
1
|
+
{"version":3,"file":"TestScene.js","sourceRoot":"","sources":["../../src/scenes/TestScene.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xrift/world-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.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",
|