@smoregg/sdk 1.2.0 → 2.0.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/cjs/config.cjs.map +1 -1
- package/dist/cjs/controller.cjs +215 -145
- package/dist/cjs/controller.cjs.map +1 -1
- package/dist/cjs/screen.cjs +220 -178
- package/dist/cjs/screen.cjs.map +1 -1
- package/dist/cjs/testing.cjs +160 -151
- package/dist/cjs/testing.cjs.map +1 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/controller.js +216 -146
- package/dist/esm/controller.js.map +1 -1
- package/dist/esm/screen.js +221 -179
- package/dist/esm/screen.js.map +1 -1
- package/dist/esm/testing.js +160 -151
- package/dist/esm/testing.js.map +1 -1
- package/dist/types/config.d.ts +1 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/controller.d.ts +22 -43
- package/dist/types/controller.d.ts.map +1 -1
- package/dist/types/index.d.ts +14 -14
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/screen.d.ts +26 -37
- package/dist/types/screen.d.ts.map +1 -1
- package/dist/types/testing.d.ts +16 -0
- package/dist/types/testing.d.ts.map +1 -1
- package/dist/types/types.d.ts +244 -338
- package/dist/types/types.d.ts.map +1 -1
- package/dist/umd/smore-sdk.umd.js +595 -474
- package/dist/umd/smore-sdk.umd.js.map +1 -1
- package/dist/umd/smore-sdk.umd.min.js +1 -1
- package/dist/umd/smore-sdk.umd.min.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/SmoreHost.cjs +0 -306
- package/dist/cjs/SmoreHost.cjs.map +0 -1
- package/dist/cjs/SmorePlayer.cjs +0 -229
- package/dist/cjs/SmorePlayer.cjs.map +0 -1
- package/dist/cjs/components/DirectionPad.cjs +0 -68
- package/dist/cjs/components/DirectionPad.cjs.map +0 -1
- package/dist/cjs/components/DirectionPad.module.css.cjs +0 -12
- package/dist/cjs/components/DirectionPad.module.css.cjs.map +0 -1
- package/dist/cjs/components/HoldButton.cjs +0 -57
- package/dist/cjs/components/HoldButton.cjs.map +0 -1
- package/dist/cjs/components/HoldButton.module.css.cjs +0 -12
- package/dist/cjs/components/HoldButton.module.css.cjs.map +0 -1
- package/dist/cjs/components/IframeGameBridge.cjs +0 -115
- package/dist/cjs/components/IframeGameBridge.cjs.map +0 -1
- package/dist/cjs/components/SwipeArea.cjs +0 -58
- package/dist/cjs/components/SwipeArea.cjs.map +0 -1
- package/dist/cjs/components/SwipeArea.module.css.cjs +0 -12
- package/dist/cjs/components/SwipeArea.module.css.cjs.map +0 -1
- package/dist/cjs/components/TapButton.cjs +0 -58
- package/dist/cjs/components/TapButton.cjs.map +0 -1
- package/dist/cjs/components/TapButton.module.css.cjs +0 -12
- package/dist/cjs/components/TapButton.module.css.cjs.map +0 -1
- package/dist/cjs/context/RoomProvider.cjs +0 -118
- package/dist/cjs/context/RoomProvider.cjs.map +0 -1
- package/dist/cjs/hooks/useExternalGames.cjs +0 -49
- package/dist/cjs/hooks/useExternalGames.cjs.map +0 -1
- package/dist/cjs/hooks/useGameHost.cjs +0 -206
- package/dist/cjs/hooks/useGameHost.cjs.map +0 -1
- package/dist/cjs/hooks/useGamePlayer.cjs +0 -134
- package/dist/cjs/hooks/useGamePlayer.cjs.map +0 -1
- package/dist/cjs/iframe/index.cjs +0 -260
- package/dist/cjs/iframe/index.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs +0 -33
- package/dist/cjs/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs.map +0 -1
- package/dist/cjs/server/index.cjs +0 -45
- package/dist/cjs/server/index.cjs.map +0 -1
- package/dist/cjs/transport/DirectTransport.cjs +0 -23
- package/dist/cjs/transport/DirectTransport.cjs.map +0 -1
- package/dist/cjs/utils/connectionMonitor.cjs +0 -77
- package/dist/cjs/utils/connectionMonitor.cjs.map +0 -1
- package/dist/cjs/utils/preloadAssets.cjs +0 -66
- package/dist/cjs/utils/preloadAssets.cjs.map +0 -1
- package/dist/cjs/utils/serverTime.cjs +0 -43
- package/dist/cjs/utils/serverTime.cjs.map +0 -1
- package/dist/esm/SmoreHost.js +0 -304
- package/dist/esm/SmoreHost.js.map +0 -1
- package/dist/esm/SmorePlayer.js +0 -227
- package/dist/esm/SmorePlayer.js.map +0 -1
- package/dist/esm/components/DirectionPad.js +0 -66
- package/dist/esm/components/DirectionPad.js.map +0 -1
- package/dist/esm/components/DirectionPad.module.css.js +0 -8
- package/dist/esm/components/DirectionPad.module.css.js.map +0 -1
- package/dist/esm/components/HoldButton.js +0 -55
- package/dist/esm/components/HoldButton.js.map +0 -1
- package/dist/esm/components/HoldButton.module.css.js +0 -8
- package/dist/esm/components/HoldButton.module.css.js.map +0 -1
- package/dist/esm/components/IframeGameBridge.js +0 -113
- package/dist/esm/components/IframeGameBridge.js.map +0 -1
- package/dist/esm/components/SwipeArea.js +0 -56
- package/dist/esm/components/SwipeArea.js.map +0 -1
- package/dist/esm/components/SwipeArea.module.css.js +0 -8
- package/dist/esm/components/SwipeArea.module.css.js.map +0 -1
- package/dist/esm/components/TapButton.js +0 -56
- package/dist/esm/components/TapButton.js.map +0 -1
- package/dist/esm/components/TapButton.module.css.js +0 -8
- package/dist/esm/components/TapButton.module.css.js.map +0 -1
- package/dist/esm/context/RoomProvider.js +0 -109
- package/dist/esm/context/RoomProvider.js.map +0 -1
- package/dist/esm/hooks/useExternalGames.js +0 -47
- package/dist/esm/hooks/useExternalGames.js.map +0 -1
- package/dist/esm/hooks/useGameHost.js +0 -204
- package/dist/esm/hooks/useGameHost.js.map +0 -1
- package/dist/esm/hooks/useGamePlayer.js +0 -132
- package/dist/esm/hooks/useGamePlayer.js.map +0 -1
- package/dist/esm/iframe/index.js +0 -257
- package/dist/esm/iframe/index.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +0 -29
- package/dist/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +0 -1
- package/dist/esm/server/index.js +0 -43
- package/dist/esm/server/index.js.map +0 -1
- package/dist/esm/transport/DirectTransport.js +0 -21
- package/dist/esm/transport/DirectTransport.js.map +0 -1
- package/dist/esm/utils/connectionMonitor.js +0 -75
- package/dist/esm/utils/connectionMonitor.js.map +0 -1
- package/dist/esm/utils/preloadAssets.js +0 -63
- package/dist/esm/utils/preloadAssets.js.map +0 -1
- package/dist/esm/utils/serverTime.js +0 -41
- package/dist/esm/utils/serverTime.js.map +0 -1
- package/dist/types/SmoreHost.d.ts +0 -187
- package/dist/types/SmoreHost.d.ts.map +0 -1
- package/dist/types/SmorePlayer.d.ts +0 -146
- package/dist/types/SmorePlayer.d.ts.map +0 -1
- package/dist/types/components/DirectionPad.d.ts +0 -21
- package/dist/types/components/DirectionPad.d.ts.map +0 -1
- package/dist/types/components/HoldButton.d.ts +0 -22
- package/dist/types/components/HoldButton.d.ts.map +0 -1
- package/dist/types/components/IframeGameBridge.d.ts +0 -38
- package/dist/types/components/IframeGameBridge.d.ts.map +0 -1
- package/dist/types/components/SwipeArea.d.ts +0 -19
- package/dist/types/components/SwipeArea.d.ts.map +0 -1
- package/dist/types/components/TapButton.d.ts +0 -19
- package/dist/types/components/TapButton.d.ts.map +0 -1
- package/dist/types/components/index.d.ts +0 -6
- package/dist/types/components/index.d.ts.map +0 -1
- package/dist/types/context/RoomProvider.d.ts +0 -69
- package/dist/types/context/RoomProvider.d.ts.map +0 -1
- package/dist/types/context/index.d.ts +0 -3
- package/dist/types/context/index.d.ts.map +0 -1
- package/dist/types/dev/DevSimulator.d.ts +0 -31
- package/dist/types/dev/DevSimulator.d.ts.map +0 -1
- package/dist/types/dev/index.d.ts +0 -2
- package/dist/types/dev/index.d.ts.map +0 -1
- package/dist/types/hooks/index.d.ts +0 -7
- package/dist/types/hooks/index.d.ts.map +0 -1
- package/dist/types/hooks/useExternalGames.d.ts +0 -32
- package/dist/types/hooks/useExternalGames.d.ts.map +0 -1
- package/dist/types/hooks/useGameHost.d.ts +0 -67
- package/dist/types/hooks/useGameHost.d.ts.map +0 -1
- package/dist/types/hooks/useGamePlayer.d.ts +0 -55
- package/dist/types/hooks/useGamePlayer.d.ts.map +0 -1
- package/dist/types/iframe/IframeRoomProvider.d.ts +0 -31
- package/dist/types/iframe/IframeRoomProvider.d.ts.map +0 -1
- package/dist/types/iframe/index.d.ts +0 -18
- package/dist/types/iframe/index.d.ts.map +0 -1
- package/dist/types/iframe/vanilla-entry.d.ts +0 -7
- package/dist/types/iframe/vanilla-entry.d.ts.map +0 -1
- package/dist/types/iframe/vanilla.d.ts +0 -49
- package/dist/types/iframe/vanilla.d.ts.map +0 -1
- package/dist/types/server/createGameRelay.d.ts +0 -26
- package/dist/types/server/createGameRelay.d.ts.map +0 -1
- package/dist/types/server/index.d.ts +0 -3
- package/dist/types/server/index.d.ts.map +0 -1
- package/dist/types/utils/connectionMonitor.d.ts +0 -57
- package/dist/types/utils/connectionMonitor.d.ts.map +0 -1
- package/dist/types/utils/index.d.ts +0 -7
- package/dist/types/utils/index.d.ts.map +0 -1
- package/dist/types/utils/preloadAssets.d.ts +0 -29
- package/dist/types/utils/preloadAssets.d.ts.map +0 -1
- package/dist/types/utils/serverTime.d.ts +0 -28
- package/dist/types/utils/serverTime.d.ts.map +0 -1
- package/dist/umd/smore-sdk-iframe.umd.js +0 -266
- package/dist/umd/smore-sdk-iframe.umd.js.map +0 -1
- package/dist/umd/smore-sdk-iframe.umd.min.js +0 -2
- package/dist/umd/smore-sdk-iframe.umd.min.js.map +0 -1
- package/dist/umd/smore-sdk-vanilla.umd.js +0 -1275
- package/dist/umd/smore-sdk-vanilla.umd.js.map +0 -1
- package/dist/umd/smore-sdk-vanilla.umd.min.js +0 -2
- package/dist/umd/smore-sdk-vanilla.umd.min.js.map +0 -1
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var DirectionPad_module = require('./DirectionPad.module.css.cjs');
|
|
6
|
-
|
|
7
|
-
function DirectionPad({
|
|
8
|
-
onDirection,
|
|
9
|
-
leftRightOnly = false,
|
|
10
|
-
upDownOnly = false,
|
|
11
|
-
className
|
|
12
|
-
}) {
|
|
13
|
-
const pressedRef = react.useRef(/* @__PURE__ */ new Set());
|
|
14
|
-
const handlePress = react.useCallback((direction) => {
|
|
15
|
-
if (pressedRef.current.has(direction)) return;
|
|
16
|
-
pressedRef.current.add(direction);
|
|
17
|
-
if (navigator.vibrate) {
|
|
18
|
-
navigator.vibrate(10);
|
|
19
|
-
}
|
|
20
|
-
onDirection(direction);
|
|
21
|
-
}, [onDirection]);
|
|
22
|
-
const handleRelease = react.useCallback((direction) => {
|
|
23
|
-
pressedRef.current.delete(direction);
|
|
24
|
-
}, []);
|
|
25
|
-
const createButton = (direction, label) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
26
|
-
"button",
|
|
27
|
-
{
|
|
28
|
-
className: `${DirectionPad_module.default.dirButton} ${DirectionPad_module.default[direction]}`,
|
|
29
|
-
onTouchStart: (e) => {
|
|
30
|
-
e.preventDefault();
|
|
31
|
-
handlePress(direction);
|
|
32
|
-
},
|
|
33
|
-
onTouchEnd: (e) => {
|
|
34
|
-
e.preventDefault();
|
|
35
|
-
handleRelease(direction);
|
|
36
|
-
},
|
|
37
|
-
onTouchCancel: () => handleRelease(direction),
|
|
38
|
-
onMouseDown: () => handlePress(direction),
|
|
39
|
-
onMouseUp: () => handleRelease(direction),
|
|
40
|
-
onMouseLeave: () => handleRelease(direction),
|
|
41
|
-
children: label
|
|
42
|
-
},
|
|
43
|
-
direction
|
|
44
|
-
);
|
|
45
|
-
if (leftRightOnly) {
|
|
46
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${DirectionPad_module.default.padContainer} ${DirectionPad_module.default.horizontal} ${className || ""}`, children: [
|
|
47
|
-
createButton("left", "\u25C0"),
|
|
48
|
-
createButton("right", "\u25B6")
|
|
49
|
-
] });
|
|
50
|
-
}
|
|
51
|
-
if (upDownOnly) {
|
|
52
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${DirectionPad_module.default.padContainer} ${DirectionPad_module.default.vertical} ${className || ""}`, children: [
|
|
53
|
-
createButton("up", "\u25B2"),
|
|
54
|
-
createButton("down", "\u25BC")
|
|
55
|
-
] });
|
|
56
|
-
}
|
|
57
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${DirectionPad_module.default.padContainer} ${DirectionPad_module.default.full} ${className || ""}`, children: [
|
|
58
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: DirectionPad_module.default.row, children: createButton("up", "\u25B2") }),
|
|
59
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: DirectionPad_module.default.row, children: [
|
|
60
|
-
createButton("left", "\u25C0"),
|
|
61
|
-
createButton("right", "\u25B6")
|
|
62
|
-
] }),
|
|
63
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: DirectionPad_module.default.row, children: createButton("down", "\u25BC") })
|
|
64
|
-
] });
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
exports.DirectionPad = DirectionPad;
|
|
68
|
-
//# sourceMappingURL=DirectionPad.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DirectionPad.cjs","sources":["../../../src/components/DirectionPad.tsx"],"sourcesContent":["/**\n * S'MORE Game SDK - DirectionPad Component\n *\n * 4-direction or 2-direction control pad\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { DirectionPadProps } from '../types';\nimport styles from './DirectionPad.module.css';\n\n/**\n * DirectionPad - For directional input\n *\n * @example\n * ```tsx\n * // 4 directions\n * <DirectionPad onDirection={(dir) => send('move', { direction: dir })} />\n *\n * // Left/Right only\n * <DirectionPad leftRightOnly onDirection={(dir) => send('move', { direction: dir })} />\n * ```\n */\nexport function DirectionPad({\n onDirection,\n leftRightOnly = false,\n upDownOnly = false,\n className,\n}: DirectionPadProps) {\n const pressedRef = useRef<Set<string>>(new Set());\n\n const handlePress = useCallback((direction: 'up' | 'down' | 'left' | 'right') => {\n if (pressedRef.current.has(direction)) return;\n pressedRef.current.add(direction);\n\n // Haptic feedback\n if (navigator.vibrate) {\n navigator.vibrate(10);\n }\n\n onDirection(direction);\n }, [onDirection]);\n\n const handleRelease = useCallback((direction: string) => {\n pressedRef.current.delete(direction);\n }, []);\n\n const createButton = (direction: 'up' | 'down' | 'left' | 'right', label: string) => (\n <button\n key={direction}\n className={`${styles.dirButton} ${styles[direction]}`}\n onTouchStart={(e) => {\n e.preventDefault();\n handlePress(direction);\n }}\n onTouchEnd={(e) => {\n e.preventDefault();\n handleRelease(direction);\n }}\n onTouchCancel={() => handleRelease(direction)}\n onMouseDown={() => handlePress(direction)}\n onMouseUp={() => handleRelease(direction)}\n onMouseLeave={() => handleRelease(direction)}\n >\n {label}\n </button>\n );\n\n if (leftRightOnly) {\n return (\n <div className={`${styles.padContainer} ${styles.horizontal} ${className || ''}`}>\n {createButton('left', '◀')}\n {createButton('right', '▶')}\n </div>\n );\n }\n\n if (upDownOnly) {\n return (\n <div className={`${styles.padContainer} ${styles.vertical} ${className || ''}`}>\n {createButton('up', '▲')}\n {createButton('down', '▼')}\n </div>\n );\n }\n\n return (\n <div className={`${styles.padContainer} ${styles.full} ${className || ''}`}>\n <div className={styles.row}>\n {createButton('up', '▲')}\n </div>\n <div className={styles.row}>\n {createButton('left', '◀')}\n {createButton('right', '▶')}\n </div>\n <div className={styles.row}>\n {createButton('down', '▼')}\n </div>\n </div>\n );\n}\n\nexport default DirectionPad;\n"],"names":["useRef","useCallback","jsx","styles","jsxs"],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var styleInject_es = require('../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs');
|
|
6
|
-
|
|
7
|
-
var css_248z = ".DirectionPad-module_padContainer__iL-rh{align-items:center;display:flex;flex-direction:column;gap:8px;user-select:none;-webkit-user-select:none}.DirectionPad-module_horizontal__kI4j7{flex-direction:row;gap:16px}.DirectionPad-module_vertical__b8Xec{flex-direction:column;gap:16px}.DirectionPad-module_row__mzuUr{display:flex;gap:8px}.DirectionPad-module_dirButton__QCCHz{-webkit-tap-highlight-color:transparent;align-items:center;background:var(--color-surface,#374151);border:none;border-radius:12px;color:#fff;cursor:pointer;display:flex;font-size:24px;height:70px;justify-content:center;touch-action:manipulation;transition:transform .1s ease,background .1s ease;width:70px}.DirectionPad-module_dirButton__QCCHz:active{background:var(--color-primary,#6366f1);transform:scale(.9)}.DirectionPad-module_horizontal__kI4j7 .DirectionPad-module_dirButton__QCCHz,.DirectionPad-module_vertical__b8Xec .DirectionPad-module_dirButton__QCCHz{font-size:32px;height:100px;width:100px}";
|
|
8
|
-
var styles = {"padContainer":"DirectionPad-module_padContainer__iL-rh","horizontal":"DirectionPad-module_horizontal__kI4j7","vertical":"DirectionPad-module_vertical__b8Xec","row":"DirectionPad-module_row__mzuUr","dirButton":"DirectionPad-module_dirButton__QCCHz"};
|
|
9
|
-
styleInject_es.default(css_248z);
|
|
10
|
-
|
|
11
|
-
exports.default = styles;
|
|
12
|
-
//# sourceMappingURL=DirectionPad.module.css.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DirectionPad.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var HoldButton_module = require('./HoldButton.module.css.cjs');
|
|
6
|
-
|
|
7
|
-
function HoldButton({
|
|
8
|
-
onHoldStart,
|
|
9
|
-
onHoldEnd,
|
|
10
|
-
children,
|
|
11
|
-
className,
|
|
12
|
-
disabled = false
|
|
13
|
-
}) {
|
|
14
|
-
const isHolding = react.useRef(false);
|
|
15
|
-
const buttonRef = react.useRef(null);
|
|
16
|
-
const startHold = react.useCallback(() => {
|
|
17
|
-
if (disabled || isHolding.current) return;
|
|
18
|
-
isHolding.current = true;
|
|
19
|
-
buttonRef.current?.classList.add(HoldButton_module.default.pressed);
|
|
20
|
-
if (navigator.vibrate) {
|
|
21
|
-
navigator.vibrate(10);
|
|
22
|
-
}
|
|
23
|
-
onHoldStart();
|
|
24
|
-
}, [onHoldStart, disabled]);
|
|
25
|
-
const endHold = react.useCallback(() => {
|
|
26
|
-
if (!isHolding.current) return;
|
|
27
|
-
isHolding.current = false;
|
|
28
|
-
buttonRef.current?.classList.remove(HoldButton_module.default.pressed);
|
|
29
|
-
onHoldEnd();
|
|
30
|
-
}, [onHoldEnd]);
|
|
31
|
-
const handleTouchStart = react.useCallback((e) => {
|
|
32
|
-
e.preventDefault();
|
|
33
|
-
startHold();
|
|
34
|
-
}, [startHold]);
|
|
35
|
-
const handleTouchEnd = react.useCallback((e) => {
|
|
36
|
-
e.preventDefault();
|
|
37
|
-
endHold();
|
|
38
|
-
}, [endHold]);
|
|
39
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
-
"button",
|
|
41
|
-
{
|
|
42
|
-
ref: buttonRef,
|
|
43
|
-
className: `${HoldButton_module.default.holdButton} ${className || ""} ${disabled ? HoldButton_module.default.disabled : ""}`,
|
|
44
|
-
onTouchStart: handleTouchStart,
|
|
45
|
-
onTouchEnd: handleTouchEnd,
|
|
46
|
-
onTouchCancel: handleTouchEnd,
|
|
47
|
-
onMouseDown: startHold,
|
|
48
|
-
onMouseUp: endHold,
|
|
49
|
-
onMouseLeave: endHold,
|
|
50
|
-
disabled,
|
|
51
|
-
children
|
|
52
|
-
}
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
exports.HoldButton = HoldButton;
|
|
57
|
-
//# sourceMappingURL=HoldButton.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HoldButton.cjs","sources":["../../../src/components/HoldButton.tsx"],"sourcesContent":["/**\n * S'MORE Game SDK - HoldButton Component\n *\n * Button that detects hold start/end events\n */\n\nimport { useRef, useCallback } from 'react';\nimport type React from 'react';\nimport type { HoldButtonProps } from '../types';\nimport styles from './HoldButton.module.css';\n\n/**\n * HoldButton - For hold/release input patterns\n *\n * @example\n * ```tsx\n * <HoldButton\n * onHoldStart={() => send('charge', { type: 'start' })}\n * onHoldEnd={() => send('charge', { type: 'end' })}\n * >\n * HOLD\n * </HoldButton>\n * ```\n */\nexport function HoldButton({\n onHoldStart,\n onHoldEnd,\n children,\n className,\n disabled = false,\n}: HoldButtonProps) {\n const isHolding = useRef(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const startHold = useCallback(() => {\n if (disabled || isHolding.current) return;\n isHolding.current = true;\n buttonRef.current?.classList.add(styles.pressed || '');\n\n // Haptic feedback\n if (navigator.vibrate) {\n navigator.vibrate(10);\n }\n\n onHoldStart();\n }, [onHoldStart, disabled]);\n\n const endHold = useCallback(() => {\n if (!isHolding.current) return;\n isHolding.current = false;\n buttonRef.current?.classList.remove(styles.pressed || '');\n onHoldEnd();\n }, [onHoldEnd]);\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n startHold();\n }, [startHold]);\n\n const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n endHold();\n }, [endHold]);\n\n return (\n <button\n ref={buttonRef}\n className={`${styles.holdButton} ${className || ''} ${disabled ? styles.disabled : ''}`}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={handleTouchEnd}\n onMouseDown={startHold}\n onMouseUp={endHold}\n onMouseLeave={endHold}\n disabled={disabled}\n >\n {children}\n </button>\n );\n}\n\nexport default HoldButton;\n"],"names":["useRef","useCallback","styles","jsx"],"mappings":";;;;;;AAwBO,SAAS,UAAA,CAAW;AAAA,EACzB,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAoB;AAClB,EAAA,MAAM,SAAA,GAAYA,aAAO,KAAK,CAAA;AAC9B,EAAA,MAAM,SAAA,GAAYA,aAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,SAAA,GAAYC,kBAAY,MAAM;AAClC,IAAA,IAAI,QAAA,IAAY,UAAU,OAAA,EAAS;AACnC,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,GAAA,CAAIC,yBAAA,CAAO,OAAa,CAAA;AAGrD,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE1B,EAAA,MAAM,OAAA,GAAUD,kBAAY,MAAM;AAChC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACxB,IAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,MAAA,CAAOC,yBAAA,CAAO,OAAa,CAAA;AACxD,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,gBAAA,GAAmBD,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC5D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC1D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,uBACEE,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,CAAA,EAAGD,yBAAA,CAAO,UAAU,CAAA,CAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CAAA,EAAI,QAAA,GAAWA,yBAAA,CAAO,QAAA,GAAW,EAAE,CAAA,CAAA;AAAA,MACrF,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,aAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc,OAAA;AAAA,MACd,QAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;;;;"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var styleInject_es = require('../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs');
|
|
6
|
-
|
|
7
|
-
var css_248z = ".HoldButton-module_holdButton__tu4mi{-webkit-tap-highlight-color:transparent;align-items:center;background:var(--color-secondary,#f59e0b);border:none;border-radius:16px;color:#fff;cursor:pointer;display:flex;font-size:18px;font-weight:700;justify-content:center;min-height:80px;min-width:80px;padding:16px 24px;touch-action:manipulation;transition:transform .1s ease,background .1s ease;user-select:none;-webkit-user-select:none}.HoldButton-module_holdButton__tu4mi:active,.HoldButton-module_pressed__JWIRG{background:var(--color-secondary-dark,#d97706);transform:scale(.95)}.HoldButton-module_disabled__4QwwT{cursor:not-allowed;opacity:.5}.HoldButton-module_disabled__4QwwT.HoldButton-module_pressed__JWIRG,.HoldButton-module_disabled__4QwwT:active{background:var(--color-secondary,#f59e0b);transform:none}";
|
|
8
|
-
var styles = {"holdButton":"HoldButton-module_holdButton__tu4mi","pressed":"HoldButton-module_pressed__JWIRG","disabled":"HoldButton-module_disabled__4QwwT"};
|
|
9
|
-
styleInject_es.default(css_248z);
|
|
10
|
-
|
|
11
|
-
exports.default = styles;
|
|
12
|
-
//# sourceMappingURL=HoldButton.module.css.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"HoldButton.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var protocol = require('../transport/protocol.cjs');
|
|
6
|
-
|
|
7
|
-
const IframeGameBridge = ({
|
|
8
|
-
gameId,
|
|
9
|
-
url,
|
|
10
|
-
socket,
|
|
11
|
-
side,
|
|
12
|
-
roomCode,
|
|
13
|
-
players,
|
|
14
|
-
leaderId,
|
|
15
|
-
myIndex,
|
|
16
|
-
isLeader,
|
|
17
|
-
onReady,
|
|
18
|
-
onLoaded,
|
|
19
|
-
onGameOver,
|
|
20
|
-
style,
|
|
21
|
-
className
|
|
22
|
-
}) => {
|
|
23
|
-
const iframeRef = react.useRef(null);
|
|
24
|
-
const readyRef = react.useRef(false);
|
|
25
|
-
const loadedRef = react.useRef(false);
|
|
26
|
-
const postToIframe = react.useCallback((msg) => {
|
|
27
|
-
iframeRef.current?.contentWindow?.postMessage(msg, "*");
|
|
28
|
-
}, []);
|
|
29
|
-
react.useEffect(() => {
|
|
30
|
-
const handler = (e) => {
|
|
31
|
-
if (e.source !== iframeRef.current?.contentWindow) return;
|
|
32
|
-
const msg = e.data;
|
|
33
|
-
if (!protocol.isSmoreMessage(msg)) return;
|
|
34
|
-
if (msg.type === "smore:ready" && !readyRef.current) {
|
|
35
|
-
readyRef.current = true;
|
|
36
|
-
postToIframe({
|
|
37
|
-
type: "smore:init",
|
|
38
|
-
payload: {
|
|
39
|
-
side,
|
|
40
|
-
roomCode,
|
|
41
|
-
players,
|
|
42
|
-
leaderId,
|
|
43
|
-
myIndex,
|
|
44
|
-
isLeader
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
onReady?.();
|
|
48
|
-
setTimeout(() => {
|
|
49
|
-
if (!loadedRef.current) {
|
|
50
|
-
console.warn("[IframeGameBridge] Game did not send smore:loaded, auto-triggering");
|
|
51
|
-
loadedRef.current = true;
|
|
52
|
-
onLoaded?.();
|
|
53
|
-
}
|
|
54
|
-
}, 2e3);
|
|
55
|
-
}
|
|
56
|
-
if (msg.type === "smore:loaded" && !loadedRef.current) {
|
|
57
|
-
loadedRef.current = true;
|
|
58
|
-
onLoaded?.();
|
|
59
|
-
}
|
|
60
|
-
if (msg.type === "smore:emit") {
|
|
61
|
-
const { event, data, ackId } = msg.payload;
|
|
62
|
-
if (event === "room:game-over") {
|
|
63
|
-
onGameOver?.(data?.results);
|
|
64
|
-
}
|
|
65
|
-
if (ackId) {
|
|
66
|
-
socket.emit(event, data, (response) => {
|
|
67
|
-
postToIframe({ type: "smore:ack", payload: { ackId, data: response } });
|
|
68
|
-
});
|
|
69
|
-
} else {
|
|
70
|
-
socket.emit(event, data);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
window.addEventListener("message", handler);
|
|
75
|
-
return () => window.removeEventListener("message", handler);
|
|
76
|
-
}, [socket, side, roomCode, players, leaderId, myIndex, isLeader, onReady, onLoaded, onGameOver, postToIframe]);
|
|
77
|
-
react.useEffect(() => {
|
|
78
|
-
if (!readyRef.current) return;
|
|
79
|
-
postToIframe({
|
|
80
|
-
type: "smore:update",
|
|
81
|
-
payload: { players, leaderId }
|
|
82
|
-
});
|
|
83
|
-
}, [players, leaderId, postToIframe]);
|
|
84
|
-
react.useEffect(() => {
|
|
85
|
-
if (!socket) return;
|
|
86
|
-
const handler = (event, ...args) => {
|
|
87
|
-
postToIframe({
|
|
88
|
-
type: "smore:event",
|
|
89
|
-
payload: { event, data: args[0] }
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
socket.onAny(handler);
|
|
93
|
-
return () => {
|
|
94
|
-
socket.offAny(handler);
|
|
95
|
-
};
|
|
96
|
-
}, [socket, postToIframe]);
|
|
97
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
98
|
-
"iframe",
|
|
99
|
-
{
|
|
100
|
-
ref: iframeRef,
|
|
101
|
-
src: url,
|
|
102
|
-
sandbox: "allow-scripts allow-same-origin",
|
|
103
|
-
style: {
|
|
104
|
-
border: "none",
|
|
105
|
-
width: "100%",
|
|
106
|
-
height: "100%",
|
|
107
|
-
...style
|
|
108
|
-
},
|
|
109
|
-
className
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
exports.IframeGameBridge = IframeGameBridge;
|
|
115
|
-
//# sourceMappingURL=IframeGameBridge.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IframeGameBridge.cjs","sources":["../../../src/components/IframeGameBridge.tsx"],"sourcesContent":["/**\n * IframeGameBridge - Parent-side bridge between iframe and Socket.IO.\n *\n * Renders an iframe loading the external game URL.\n * Bridges postMessage ↔ Socket.IO:\n * - iframe sends `smore:emit` → bridge relays to `socket.emit()` as-is\n * - socket receives events → bridge relays to iframe via `smore:event` as-is\n *\n * No event translation is performed; events are passed through unchanged.\n *\n * Used by GameOverlay (host) and GameView (player) when the game type is 'external'.\n */\n\nimport React, { useEffect, useRef, useCallback } from 'react';\nimport type { Socket } from 'socket.io-client';\nimport { isSmoreMessage } from '../transport/protocol';\nimport type { SmoreEmitMessage } from '../transport/protocol';\n\ninterface Player {\n playerIndex: number;\n name: string;\n connected?: boolean;\n}\n\nexport interface IframeGameBridgeProps {\n gameId: string;\n url: string;\n socket: Socket;\n side: 'host' | 'player';\n roomCode: string;\n players: Player[];\n leaderId: string | null;\n myIndex?: number;\n isLeader?: boolean;\n onReady?: () => void;\n onLoaded?: () => void;\n onGameOver?: (results: any) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport const IframeGameBridge: React.FC<IframeGameBridgeProps> = ({\n gameId,\n url,\n socket,\n side,\n roomCode,\n players,\n leaderId,\n myIndex,\n isLeader,\n onReady,\n onLoaded,\n onGameOver,\n style,\n className,\n}) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const readyRef = useRef(false);\n const loadedRef = useRef(false);\n\n // Send message to iframe\n const postToIframe = useCallback((msg: object) => {\n iframeRef.current?.contentWindow?.postMessage(msg, '*');\n }, []);\n\n // Handle messages from iframe (smore:ready, smore:emit)\n useEffect(() => {\n const handler = (e: MessageEvent) => {\n if (e.source !== iframeRef.current?.contentWindow) return;\n\n const msg = e.data;\n if (!isSmoreMessage(msg)) return;\n\n if (msg.type === 'smore:ready' && !readyRef.current) {\n readyRef.current = true;\n\n postToIframe({\n type: 'smore:init',\n payload: {\n side,\n roomCode,\n players,\n leaderId,\n myIndex,\n isLeader,\n },\n });\n\n onReady?.();\n\n // Fallback: if game doesn't send smore:loaded within 2s, auto-trigger\n setTimeout(() => {\n if (!loadedRef.current) {\n console.warn('[IframeGameBridge] Game did not send smore:loaded, auto-triggering');\n loadedRef.current = true;\n onLoaded?.();\n }\n }, 2000);\n }\n\n if (msg.type === 'smore:loaded' && !loadedRef.current) {\n loadedRef.current = true;\n onLoaded?.();\n }\n\n if (msg.type === 'smore:emit') {\n const { event, data, ackId } = (msg as SmoreEmitMessage).payload;\n\n // Intercept game-over\n if (event === 'room:game-over') {\n onGameOver?.(data?.results);\n }\n\n if (ackId) {\n socket.emit(event, data, (response: any) => {\n postToIframe({ type: 'smore:ack', payload: { ackId, data: response } });\n });\n } else {\n socket.emit(event, data);\n }\n }\n };\n\n window.addEventListener('message', handler);\n return () => window.removeEventListener('message', handler);\n }, [socket, side, roomCode, players, leaderId, myIndex, isLeader, onReady, onLoaded, onGameOver, postToIframe]);\n\n // Push player/leader updates to iframe after init\n useEffect(() => {\n if (!readyRef.current) return;\n postToIframe({\n type: 'smore:update',\n payload: { players, leaderId },\n });\n }, [players, leaderId, postToIframe]);\n\n // Bridge socket events to iframe\n useEffect(() => {\n if (!socket) return;\n\n const handler = (event: string, ...args: any[]) => {\n postToIframe({\n type: 'smore:event',\n payload: { event, data: args[0] },\n });\n };\n\n socket.onAny(handler);\n return () => {\n socket.offAny(handler);\n };\n }, [socket, postToIframe]);\n\n return (\n <iframe\n ref={iframeRef}\n src={url}\n sandbox=\"allow-scripts allow-same-origin\"\n style={{\n border: 'none',\n width: '100%',\n height: '100%',\n ...style,\n }}\n className={className}\n />\n );\n};\n"],"names":["useRef","useCallback","useEffect","isSmoreMessage","jsx"],"mappings":"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"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var SwipeArea_module = require('./SwipeArea.module.css.cjs');
|
|
6
|
-
|
|
7
|
-
function SwipeArea({
|
|
8
|
-
onSwipe,
|
|
9
|
-
threshold = 50,
|
|
10
|
-
children,
|
|
11
|
-
className
|
|
12
|
-
}) {
|
|
13
|
-
const touchStart = react.useRef(null);
|
|
14
|
-
const handleTouchStart = react.useCallback((e) => {
|
|
15
|
-
const touch = e.touches[0];
|
|
16
|
-
if (!touch) return;
|
|
17
|
-
touchStart.current = { x: touch.clientX, y: touch.clientY };
|
|
18
|
-
}, []);
|
|
19
|
-
const handleTouchEnd = react.useCallback((e) => {
|
|
20
|
-
if (!touchStart.current) return;
|
|
21
|
-
const touch = e.changedTouches[0];
|
|
22
|
-
if (!touch) return;
|
|
23
|
-
const deltaX = touch.clientX - touchStart.current.x;
|
|
24
|
-
const deltaY = touch.clientY - touchStart.current.y;
|
|
25
|
-
const absX = Math.abs(deltaX);
|
|
26
|
-
const absY = Math.abs(deltaY);
|
|
27
|
-
if (absX < threshold && absY < threshold) {
|
|
28
|
-
touchStart.current = null;
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
let direction;
|
|
32
|
-
if (absX > absY) {
|
|
33
|
-
direction = deltaX > 0 ? "right" : "left";
|
|
34
|
-
} else {
|
|
35
|
-
direction = deltaY > 0 ? "down" : "up";
|
|
36
|
-
}
|
|
37
|
-
if (navigator.vibrate) {
|
|
38
|
-
navigator.vibrate(15);
|
|
39
|
-
}
|
|
40
|
-
onSwipe(direction);
|
|
41
|
-
touchStart.current = null;
|
|
42
|
-
}, [onSwipe, threshold]);
|
|
43
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
44
|
-
"div",
|
|
45
|
-
{
|
|
46
|
-
className: `${SwipeArea_module.default.swipeArea} ${className || ""}`,
|
|
47
|
-
onTouchStart: handleTouchStart,
|
|
48
|
-
onTouchEnd: handleTouchEnd,
|
|
49
|
-
onTouchCancel: () => {
|
|
50
|
-
touchStart.current = null;
|
|
51
|
-
},
|
|
52
|
-
children
|
|
53
|
-
}
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
exports.SwipeArea = SwipeArea;
|
|
58
|
-
//# sourceMappingURL=SwipeArea.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SwipeArea.cjs","sources":["../../../src/components/SwipeArea.tsx"],"sourcesContent":["/**\n * S'MORE Game SDK - SwipeArea Component\n *\n * Detects swipe gestures\n */\n\nimport { useRef, useCallback } from 'react';\nimport type React from 'react';\nimport type { SwipeAreaProps } from '../types';\nimport styles from './SwipeArea.module.css';\n\n/**\n * SwipeArea - For swipe gesture input\n *\n * @example\n * ```tsx\n * <SwipeArea onSwipe={(dir) => send('swipe', { direction: dir })}>\n * <div>Swipe here!</div>\n * </SwipeArea>\n * ```\n */\nexport function SwipeArea({\n onSwipe,\n threshold = 50,\n children,\n className,\n}: SwipeAreaProps) {\n const touchStart = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n const touch = e.touches[0];\n if (!touch) return;\n touchStart.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n if (!touchStart.current) return;\n\n const touch = e.changedTouches[0];\n if (!touch) return;\n const deltaX = touch.clientX - touchStart.current.x;\n const deltaY = touch.clientY - touchStart.current.y;\n\n const absX = Math.abs(deltaX);\n const absY = Math.abs(deltaY);\n\n // Check if swipe exceeds threshold\n if (absX < threshold && absY < threshold) {\n touchStart.current = null;\n return;\n }\n\n // Determine direction\n let direction: 'up' | 'down' | 'left' | 'right';\n if (absX > absY) {\n direction = deltaX > 0 ? 'right' : 'left';\n } else {\n direction = deltaY > 0 ? 'down' : 'up';\n }\n\n // Haptic feedback\n if (navigator.vibrate) {\n navigator.vibrate(15);\n }\n\n onSwipe(direction);\n touchStart.current = null;\n }, [onSwipe, threshold]);\n\n return (\n <div\n className={`${styles.swipeArea} ${className || ''}`}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={() => { touchStart.current = null; }}\n >\n {children}\n </div>\n );\n}\n\nexport default SwipeArea;\n"],"names":["useRef","useCallback","jsx","styles"],"mappings":";;;;;;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,UAAA,GAAaA,aAAwC,IAAI,CAAA;AAE/D,EAAA,MAAM,gBAAA,GAAmBC,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC5D,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,UAAA,CAAW,UAAU,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA,EAAQ;AAAA,EAC5D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC1D,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAG5B,IAAA,IAAI,IAAA,GAAO,SAAA,IAAa,IAAA,GAAO,SAAA,EAAW;AACxC,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,SAAA,GAAY,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,SAAA,GAAY,MAAA,GAAS,IAAI,MAAA,GAAS,IAAA;AAAA,IACpC;AAGA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,EACvB,CAAA,EAAG,CAAC,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvB,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,EAAGC,wBAAA,CAAO,SAAS,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,MACjD,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,eAAe,MAAM;AAAE,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MAAM,CAAA;AAAA,MAEjD;AAAA;AAAA,GACH;AAEJ;;;;"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var styleInject_es = require('../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs');
|
|
6
|
-
|
|
7
|
-
var css_248z = ".SwipeArea-module_swipeArea__yob7L{height:100%;touch-action:none;user-select:none;-webkit-user-select:none;width:100%}";
|
|
8
|
-
var styles = {"swipeArea":"SwipeArea-module_swipeArea__yob7L"};
|
|
9
|
-
styleInject_es.default(css_248z);
|
|
10
|
-
|
|
11
|
-
exports.default = styles;
|
|
12
|
-
//# sourceMappingURL=SwipeArea.module.css.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SwipeArea.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var TapButton_module = require('./TapButton.module.css.cjs');
|
|
6
|
-
|
|
7
|
-
function TapButton({
|
|
8
|
-
onTap,
|
|
9
|
-
children,
|
|
10
|
-
className,
|
|
11
|
-
disabled = false
|
|
12
|
-
}) {
|
|
13
|
-
const isPressed = react.useRef(false);
|
|
14
|
-
const buttonRef = react.useRef(null);
|
|
15
|
-
const handleTouchStart = react.useCallback((e) => {
|
|
16
|
-
if (disabled) return;
|
|
17
|
-
e.preventDefault();
|
|
18
|
-
isPressed.current = true;
|
|
19
|
-
buttonRef.current?.classList.add(TapButton_module.default.pressed);
|
|
20
|
-
if (navigator.vibrate) {
|
|
21
|
-
navigator.vibrate(10);
|
|
22
|
-
}
|
|
23
|
-
onTap();
|
|
24
|
-
}, [onTap, disabled]);
|
|
25
|
-
const handleTouchEnd = react.useCallback((e) => {
|
|
26
|
-
e.preventDefault();
|
|
27
|
-
isPressed.current = false;
|
|
28
|
-
buttonRef.current?.classList.remove(TapButton_module.default.pressed);
|
|
29
|
-
}, []);
|
|
30
|
-
const handleMouseDown = react.useCallback(() => {
|
|
31
|
-
if (disabled) return;
|
|
32
|
-
isPressed.current = true;
|
|
33
|
-
buttonRef.current?.classList.add(TapButton_module.default.pressed);
|
|
34
|
-
onTap();
|
|
35
|
-
}, [onTap, disabled]);
|
|
36
|
-
const handleMouseUp = react.useCallback(() => {
|
|
37
|
-
isPressed.current = false;
|
|
38
|
-
buttonRef.current?.classList.remove(TapButton_module.default.pressed);
|
|
39
|
-
}, []);
|
|
40
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
41
|
-
"button",
|
|
42
|
-
{
|
|
43
|
-
ref: buttonRef,
|
|
44
|
-
className: `${TapButton_module.default.tapButton} ${className || ""} ${disabled ? TapButton_module.default.disabled : ""}`,
|
|
45
|
-
onTouchStart: handleTouchStart,
|
|
46
|
-
onTouchEnd: handleTouchEnd,
|
|
47
|
-
onTouchCancel: handleTouchEnd,
|
|
48
|
-
onMouseDown: handleMouseDown,
|
|
49
|
-
onMouseUp: handleMouseUp,
|
|
50
|
-
onMouseLeave: handleMouseUp,
|
|
51
|
-
disabled,
|
|
52
|
-
children
|
|
53
|
-
}
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
exports.TapButton = TapButton;
|
|
58
|
-
//# sourceMappingURL=TapButton.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TapButton.cjs","sources":["../../../src/components/TapButton.tsx"],"sourcesContent":["/**\n * S'MORE Game SDK - TapButton Component\n *\n * Optimized touch button with haptic feedback\n */\n\nimport { useRef, useCallback } from 'react';\nimport type React from 'react';\nimport type { TapButtonProps } from '../types';\nimport styles from './TapButton.module.css';\n\n/**\n * TapButton - Optimized for mobile touch input\n *\n * @example\n * ```tsx\n * <TapButton onTap={() => send('tap')}>\n * TAP!\n * </TapButton>\n * ```\n */\nexport function TapButton({\n onTap,\n children,\n className,\n disabled = false,\n}: TapButtonProps) {\n const isPressed = useRef(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n const handleTouchStart = useCallback((e: React.TouchEvent) => {\n if (disabled) return;\n e.preventDefault();\n isPressed.current = true;\n buttonRef.current?.classList.add(styles.pressed || '');\n\n // Haptic feedback\n if (navigator.vibrate) {\n navigator.vibrate(10);\n }\n\n onTap();\n }, [onTap, disabled]);\n\n const handleTouchEnd = useCallback((e: React.TouchEvent) => {\n e.preventDefault();\n isPressed.current = false;\n buttonRef.current?.classList.remove(styles.pressed || '');\n }, []);\n\n const handleMouseDown = useCallback(() => {\n if (disabled) return;\n isPressed.current = true;\n buttonRef.current?.classList.add(styles.pressed || '');\n onTap();\n }, [onTap, disabled]);\n\n const handleMouseUp = useCallback(() => {\n isPressed.current = false;\n buttonRef.current?.classList.remove(styles.pressed || '');\n }, []);\n\n return (\n <button\n ref={buttonRef}\n className={`${styles.tapButton} ${className || ''} ${disabled ? styles.disabled : ''}`}\n onTouchStart={handleTouchStart}\n onTouchEnd={handleTouchEnd}\n onTouchCancel={handleTouchEnd}\n onMouseDown={handleMouseDown}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n disabled={disabled}\n >\n {children}\n </button>\n );\n}\n\nexport default TapButton;\n"],"names":["useRef","useCallback","styles","jsx"],"mappings":";;;;;;AAqBO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAmB;AACjB,EAAA,MAAM,SAAA,GAAYA,aAAO,KAAK,CAAA;AAC9B,EAAA,MAAM,SAAA,GAAYA,aAA0B,IAAI,CAAA;AAEhD,EAAA,MAAM,gBAAA,GAAmBC,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC5D,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,GAAA,CAAIC,wBAAA,CAAO,OAAa,CAAA;AAGrD,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,SAAA,CAAU,QAAQ,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,KAAA,EAAM;AAAA,EACR,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,cAAA,GAAiBD,iBAAA,CAAY,CAAC,CAAA,KAAwB;AAC1D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,MAAA,CAAOC,wBAAA,CAAO,OAAa,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBD,kBAAY,MAAM;AACxC,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,GAAA,CAAIC,wBAAA,CAAO,OAAa,CAAA;AACrD,IAAA,KAAA,EAAM;AAAA,EACR,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,MAAM,aAAA,GAAgBD,kBAAY,MAAM;AACtC,IAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AACpB,IAAA,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,MAAA,CAAOC,wBAAA,CAAO,OAAa,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEC,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAA;AAAA,MACL,SAAA,EAAW,CAAA,EAAGD,wBAAA,CAAO,SAAS,CAAA,CAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CAAA,EAAI,QAAA,GAAWA,wBAAA,CAAO,QAAA,GAAW,EAAE,CAAA,CAAA;AAAA,MACpF,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,aAAA,EAAe,cAAA;AAAA,MACf,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,aAAA;AAAA,MACX,YAAA,EAAc,aAAA;AAAA,MACd,QAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;;;;"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var styleInject_es = require('../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs');
|
|
6
|
-
|
|
7
|
-
var css_248z = ".TapButton-module_tapButton__dqJr9{-webkit-tap-highlight-color:transparent;align-items:center;background:var(--color-primary,#6366f1);border:none;border-radius:16px;color:#fff;cursor:pointer;display:flex;font-size:18px;font-weight:700;justify-content:center;min-height:80px;min-width:80px;padding:16px 24px;touch-action:manipulation;transition:transform .1s ease,background .1s ease;user-select:none;-webkit-user-select:none}.TapButton-module_pressed__Z2nfR,.TapButton-module_tapButton__dqJr9:active{background:var(--color-primary-dark,#4f46e5);transform:scale(.95)}.TapButton-module_disabled__3bR6q{cursor:not-allowed;opacity:.5}.TapButton-module_disabled__3bR6q.TapButton-module_pressed__Z2nfR,.TapButton-module_disabled__3bR6q:active{background:var(--color-primary,#6366f1);transform:none}";
|
|
8
|
-
var styles = {"tapButton":"TapButton-module_tapButton__dqJr9","pressed":"TapButton-module_pressed__Z2nfR","disabled":"TapButton-module_disabled__3bR6q"};
|
|
9
|
-
styleInject_es.default(css_248z);
|
|
10
|
-
|
|
11
|
-
exports.default = styles;
|
|
12
|
-
//# sourceMappingURL=TapButton.module.css.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TapButton.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var DirectTransport = require('../transport/DirectTransport.cjs');
|
|
6
|
-
|
|
7
|
-
const TransportContext = react.createContext(null);
|
|
8
|
-
function useTransport() {
|
|
9
|
-
const transport = react.useContext(TransportContext);
|
|
10
|
-
if (!transport) {
|
|
11
|
-
throw new Error("useTransport must be used within a RoomProvider that supplies a Transport");
|
|
12
|
-
}
|
|
13
|
-
return transport;
|
|
14
|
-
}
|
|
15
|
-
const RoomContext = react.createContext(null);
|
|
16
|
-
const HostRoomProvider = ({
|
|
17
|
-
roomCode,
|
|
18
|
-
players,
|
|
19
|
-
leaderId,
|
|
20
|
-
socket,
|
|
21
|
-
children
|
|
22
|
-
}) => {
|
|
23
|
-
const connectedPlayers = react.useMemo(
|
|
24
|
-
() => players.filter((p) => p.connected !== false),
|
|
25
|
-
[players]
|
|
26
|
-
);
|
|
27
|
-
const hostState = react.useMemo(
|
|
28
|
-
() => ({ roomCode, players, connectedPlayers, leaderId, socket }),
|
|
29
|
-
[roomCode, players, connectedPlayers, leaderId, socket]
|
|
30
|
-
);
|
|
31
|
-
const value = react.useMemo(
|
|
32
|
-
() => ({
|
|
33
|
-
roomCode,
|
|
34
|
-
players,
|
|
35
|
-
connectedPlayers,
|
|
36
|
-
leaderId,
|
|
37
|
-
side: "host",
|
|
38
|
-
host: hostState,
|
|
39
|
-
player: null
|
|
40
|
-
}),
|
|
41
|
-
[roomCode, players, connectedPlayers, leaderId, hostState]
|
|
42
|
-
);
|
|
43
|
-
const transport = react.useMemo(() => new DirectTransport.DirectTransport(socket), [socket]);
|
|
44
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TransportContext.Provider, { value: transport, children: /* @__PURE__ */ jsxRuntime.jsx(RoomContext.Provider, { value, children }) });
|
|
45
|
-
};
|
|
46
|
-
const PlayerRoomProvider = ({
|
|
47
|
-
roomCode,
|
|
48
|
-
players,
|
|
49
|
-
leaderId,
|
|
50
|
-
myIndex,
|
|
51
|
-
isLeader,
|
|
52
|
-
socket,
|
|
53
|
-
isConnected,
|
|
54
|
-
children
|
|
55
|
-
}) => {
|
|
56
|
-
const connectedPlayers = react.useMemo(
|
|
57
|
-
() => players.filter((p) => p.connected !== false),
|
|
58
|
-
[players]
|
|
59
|
-
);
|
|
60
|
-
const playerState = react.useMemo(
|
|
61
|
-
() => ({
|
|
62
|
-
roomCode,
|
|
63
|
-
players,
|
|
64
|
-
connectedPlayers,
|
|
65
|
-
leaderId,
|
|
66
|
-
myIndex,
|
|
67
|
-
isLeader,
|
|
68
|
-
socket,
|
|
69
|
-
isConnected
|
|
70
|
-
}),
|
|
71
|
-
[roomCode, players, connectedPlayers, leaderId, myIndex, isLeader, socket, isConnected]
|
|
72
|
-
);
|
|
73
|
-
const value = react.useMemo(
|
|
74
|
-
() => ({
|
|
75
|
-
roomCode,
|
|
76
|
-
players,
|
|
77
|
-
connectedPlayers,
|
|
78
|
-
leaderId,
|
|
79
|
-
side: "player",
|
|
80
|
-
host: null,
|
|
81
|
-
player: playerState
|
|
82
|
-
}),
|
|
83
|
-
[roomCode, players, connectedPlayers, leaderId, playerState]
|
|
84
|
-
);
|
|
85
|
-
const transport = react.useMemo(() => new DirectTransport.DirectTransport(socket), [socket]);
|
|
86
|
-
return /* @__PURE__ */ jsxRuntime.jsx(TransportContext.Provider, { value: transport, children: /* @__PURE__ */ jsxRuntime.jsx(RoomContext.Provider, { value, children }) });
|
|
87
|
-
};
|
|
88
|
-
function useRoom() {
|
|
89
|
-
const context = react.useContext(RoomContext);
|
|
90
|
-
if (!context) {
|
|
91
|
-
throw new Error("useRoom must be used within HostRoomProvider or PlayerRoomProvider");
|
|
92
|
-
}
|
|
93
|
-
return context;
|
|
94
|
-
}
|
|
95
|
-
function useHostRoom() {
|
|
96
|
-
const context = useRoom();
|
|
97
|
-
if (context.side !== "host" || !context.host) {
|
|
98
|
-
throw new Error("useHostRoom must be used within HostRoomProvider");
|
|
99
|
-
}
|
|
100
|
-
return context.host;
|
|
101
|
-
}
|
|
102
|
-
function usePlayerRoom() {
|
|
103
|
-
const context = useRoom();
|
|
104
|
-
if (context.side !== "player" || !context.player) {
|
|
105
|
-
throw new Error("usePlayerRoom must be used within PlayerRoomProvider");
|
|
106
|
-
}
|
|
107
|
-
return context.player;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
exports.HostRoomProvider = HostRoomProvider;
|
|
111
|
-
exports.PlayerRoomProvider = PlayerRoomProvider;
|
|
112
|
-
exports.RoomContext = RoomContext;
|
|
113
|
-
exports.TransportContext = TransportContext;
|
|
114
|
-
exports.useHostRoom = useHostRoom;
|
|
115
|
-
exports.usePlayerRoom = usePlayerRoom;
|
|
116
|
-
exports.useRoom = useRoom;
|
|
117
|
-
exports.useTransport = useTransport;
|
|
118
|
-
//# sourceMappingURL=RoomProvider.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoomProvider.cjs","sources":["../../../src/context/RoomProvider.tsx"],"sourcesContent":["/**\n * RoomProvider - SDK Room Context\n *\n * Foundation context that all other SDK hooks depend on.\n * Provides room state (players, roomCode, leaderId) for both host and player sides.\n *\n * Also provides a Transport abstraction via TransportContext.\n * - HostRoomProvider / PlayerRoomProvider create a DirectTransport from the socket.\n * - IframeRoomProvider (external) provides a PostMessageTransport.\n *\n * Usage:\n * - Host: <HostRoomProvider roomCode={...} players={...} leaderId={...} socket={...}>\n * - Player: <PlayerRoomProvider roomCode={...} players={...} leaderId={...} myIndex={...} isLeader={...} socket={...} isConnected={...}>\n */\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { Player } from '@smoregg/shared';\nimport type { Socket } from 'socket.io-client';\nimport type { Transport } from '../transport/types';\nimport { DirectTransport } from '../transport/DirectTransport';\n\n// ===== Transport Context =====\n\nconst TransportContext = createContext<Transport | null>(null);\n\nexport function useTransport(): Transport {\n const transport = useContext(TransportContext);\n if (!transport) {\n throw new Error('useTransport must be used within a RoomProvider that supplies a Transport');\n }\n return transport;\n}\n\nexport { TransportContext };\n\n// ===== State Types =====\n\nexport interface RoomState {\n roomCode: string;\n players: Player[];\n connectedPlayers: Player[];\n leaderId: string | null;\n}\n\nexport interface HostRoomState extends RoomState {\n socket: Socket;\n}\n\nexport interface PlayerRoomState extends RoomState {\n myIndex: number;\n isLeader: boolean;\n socket: Socket;\n isConnected: boolean;\n}\n\nexport interface RoomContextValue {\n roomCode: string;\n players: Player[];\n connectedPlayers: Player[];\n leaderId: string | null;\n side: 'host' | 'player';\n host: HostRoomState | null;\n player: PlayerRoomState | null;\n}\n\n// ===== Context =====\n\nexport const RoomContext = createContext<RoomContextValue | null>(null);\n\n// ===== Host Provider =====\n\ninterface HostRoomProviderProps {\n roomCode: string;\n players: Player[];\n leaderId: string | null;\n socket: Socket;\n children: React.ReactNode;\n}\n\nexport const HostRoomProvider: React.FC<HostRoomProviderProps> = ({\n roomCode,\n players,\n leaderId,\n socket,\n children,\n}) => {\n const connectedPlayers = useMemo(\n () => players.filter((p) => p.connected !== false),\n [players]\n );\n\n const hostState: HostRoomState = useMemo(\n () => ({ roomCode, players, connectedPlayers, leaderId, socket }),\n [roomCode, players, connectedPlayers, leaderId, socket]\n );\n\n const value: RoomContextValue = useMemo(\n () => ({\n roomCode,\n players,\n connectedPlayers,\n leaderId,\n side: 'host' as const,\n host: hostState,\n player: null,\n }),\n [roomCode, players, connectedPlayers, leaderId, hostState]\n );\n\n const transport = useMemo(() => new DirectTransport(socket), [socket]);\n\n return (\n <TransportContext.Provider value={transport}>\n <RoomContext.Provider value={value}>{children}</RoomContext.Provider>\n </TransportContext.Provider>\n );\n};\n\n// ===== Player Provider =====\n\ninterface PlayerRoomProviderProps {\n roomCode: string;\n players: Player[];\n leaderId: string | null;\n myIndex: number;\n isLeader: boolean;\n socket: Socket;\n isConnected: boolean;\n children: React.ReactNode;\n}\n\nexport const PlayerRoomProvider: React.FC<PlayerRoomProviderProps> = ({\n roomCode,\n players,\n leaderId,\n myIndex,\n isLeader,\n socket,\n isConnected,\n children,\n}) => {\n const connectedPlayers = useMemo(\n () => players.filter((p) => p.connected !== false),\n [players]\n );\n\n const playerState: PlayerRoomState = useMemo(\n () => ({\n roomCode,\n players,\n connectedPlayers,\n leaderId,\n myIndex,\n isLeader,\n socket,\n isConnected,\n }),\n [roomCode, players, connectedPlayers, leaderId, myIndex, isLeader, socket, isConnected]\n );\n\n const value: RoomContextValue = useMemo(\n () => ({\n roomCode,\n players,\n connectedPlayers,\n leaderId,\n side: 'player' as const,\n host: null,\n player: playerState,\n }),\n [roomCode, players, connectedPlayers, leaderId, playerState]\n );\n\n const transport = useMemo(() => new DirectTransport(socket), [socket]);\n\n return (\n <TransportContext.Provider value={transport}>\n <RoomContext.Provider value={value}>{children}</RoomContext.Provider>\n </TransportContext.Provider>\n );\n};\n\n// ===== Hooks =====\n\nexport function useRoom(): RoomContextValue {\n const context = useContext(RoomContext);\n if (!context) {\n throw new Error('useRoom must be used within HostRoomProvider or PlayerRoomProvider');\n }\n return context;\n}\n\nexport function useHostRoom(): HostRoomState {\n const context = useRoom();\n if (context.side !== 'host' || !context.host) {\n throw new Error('useHostRoom must be used within HostRoomProvider');\n }\n return context.host;\n}\n\nexport function usePlayerRoom(): PlayerRoomState {\n const context = useRoom();\n if (context.side !== 'player' || !context.player) {\n throw new Error('usePlayerRoom must be used within PlayerRoomProvider');\n }\n return context.player;\n}\n"],"names":["createContext","useContext","useMemo","DirectTransport","jsx"],"mappings":"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"}
|