@littlepartytime/dev-kit 1.16.0 → 1.18.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/__tests__/validate-assets.test.js +9 -2
- package/dist/__tests__/validate-assets.test.js.map +1 -1
- package/dist/utils/validate-assets.js +5 -5
- package/dist/utils/validate-assets.js.map +1 -1
- package/dist/webapp/App.tsx +9 -1
- package/dist/webapp/components/PhoneFrame.tsx +2 -0
- package/dist/webapp/pages/Preview.tsx +46 -1
- package/dist/webapp/utils/captureScreen.ts +38 -0
- package/package.json +10 -3
|
@@ -61,7 +61,7 @@ function setupAssets(dir, overrides) {
|
|
|
61
61
|
icon: { width: 512, height: 512 },
|
|
62
62
|
banner: { width: 1600, height: 900 },
|
|
63
63
|
cover: { width: 2100, height: 900 },
|
|
64
|
-
splash: { width:
|
|
64
|
+
splash: { width: 1080, height: 2520 },
|
|
65
65
|
};
|
|
66
66
|
const assetsDir = path_1.default.join(dir, 'assets');
|
|
67
67
|
fs_1.default.mkdirSync(assetsDir, { recursive: true });
|
|
@@ -132,7 +132,14 @@ function setupAssets(dir, overrides) {
|
|
|
132
132
|
const assets = setupAssets(dir, { icon: { width: 100, height: 100 } });
|
|
133
133
|
const result = (0, validate_assets_1.validateAssets)(dir, assets);
|
|
134
134
|
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
135
|
-
(0, vitest_1.expect)(result.errors.some(e => e.includes('100x100') && e.includes('
|
|
135
|
+
(0, vitest_1.expect)(result.errors.some(e => e.includes('100x100') && e.includes('512x512'))).toBe(true);
|
|
136
|
+
});
|
|
137
|
+
(0, vitest_1.it)('should fail when images are at old minimum dimensions', () => {
|
|
138
|
+
const dir = makeTempDir();
|
|
139
|
+
const assets = setupAssets(dir, { splash: { width: 360, height: 840 } });
|
|
140
|
+
const result = (0, validate_assets_1.validateAssets)(dir, assets);
|
|
141
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
142
|
+
(0, vitest_1.expect)(result.errors.some(e => e.includes('splash') && e.includes('recommended minimum'))).toBe(true);
|
|
136
143
|
});
|
|
137
144
|
(0, vitest_1.it)('should fail when aspect ratio is wrong', () => {
|
|
138
145
|
const dir = makeTempDir();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-assets.test.js","sourceRoot":"","sources":["../../src/__tests__/validate-assets.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validate-assets.test.js","sourceRoot":"","sources":["../../src/__tests__/validate-assets.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,10 @@ exports.validateAssets = validateAssets;
|
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
exports.ASSET_SPECS = [
|
|
11
|
-
{ key: 'icon', ratioWidth: 1, ratioHeight: 1, minWidth:
|
|
12
|
-
{ key: 'banner', ratioWidth: 16, ratioHeight: 9, minWidth:
|
|
13
|
-
{ key: 'cover', ratioWidth: 21, ratioHeight: 9, minWidth:
|
|
14
|
-
{ key: 'splash', ratioWidth: 9, ratioHeight: 21, minWidth:
|
|
11
|
+
{ key: 'icon', ratioWidth: 1, ratioHeight: 1, minWidth: 512, minHeight: 512 },
|
|
12
|
+
{ key: 'banner', ratioWidth: 16, ratioHeight: 9, minWidth: 1280, minHeight: 720 },
|
|
13
|
+
{ key: 'cover', ratioWidth: 21, ratioHeight: 9, minWidth: 1260, minHeight: 540 },
|
|
14
|
+
{ key: 'splash', ratioWidth: 9, ratioHeight: 21, minWidth: 1080, minHeight: 2520 },
|
|
15
15
|
];
|
|
16
16
|
function validateAssets(projectDir, assets) {
|
|
17
17
|
const errors = [];
|
|
@@ -45,7 +45,7 @@ function validateAssets(projectDir, assets) {
|
|
|
45
45
|
if (dimensions) {
|
|
46
46
|
const { width, height } = dimensions;
|
|
47
47
|
if (width < spec.minWidth || height < spec.minHeight) {
|
|
48
|
-
errors.push(`${spec.key}: image is ${width}x${height}, minimum
|
|
48
|
+
errors.push(`${spec.key}: image is ${width}x${height}, recommended minimum is ${spec.minWidth}x${spec.minHeight}`);
|
|
49
49
|
}
|
|
50
50
|
const expectedRatio = spec.ratioWidth / spec.ratioHeight;
|
|
51
51
|
const actualRatio = width / height;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-assets.js","sourceRoot":"","sources":["../../src/utils/validate-assets.ts"],"names":[],"mappings":";;;;;;AAyBA,wCA6DC;AAtFD,4CAAoB;AACpB,gDAAwB;AAUX,QAAA,WAAW,GAAgB;IACtC,EAAE,GAAG,EAAE,MAAM,EAAI,UAAU,EAAE,CAAC,EAAG,WAAW,EAAE,CAAC,EAAG,QAAQ,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"validate-assets.js","sourceRoot":"","sources":["../../src/utils/validate-assets.ts"],"names":[],"mappings":"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"}
|
package/dist/webapp/App.tsx
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
2
|
import Preview from './pages/Preview';
|
|
3
3
|
import Play from './pages/Play';
|
|
4
4
|
import Debug from './pages/Debug';
|
|
5
|
+
import { captureScreen } from './utils/captureScreen';
|
|
5
6
|
|
|
6
7
|
type Page = 'preview' | 'play' | 'debug';
|
|
7
8
|
|
|
@@ -13,6 +14,13 @@ export default function App() {
|
|
|
13
14
|
return 'preview';
|
|
14
15
|
});
|
|
15
16
|
|
|
17
|
+
// Expose capture API for LLM/Playwright callers:
|
|
18
|
+
// await page.evaluate(() => window.__devkit__.captureScreen())
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
(window as any).__devkit__ = { captureScreen };
|
|
21
|
+
return () => { delete (window as any).__devkit__; };
|
|
22
|
+
}, []);
|
|
23
|
+
|
|
16
24
|
return (
|
|
17
25
|
<div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
18
26
|
{/* Nav */}
|
|
@@ -84,6 +84,8 @@ export default function PhoneFrame({ children }: { children: React.ReactNode })
|
|
|
84
84
|
contain:paint makes this the containing block for
|
|
85
85
|
position:fixed elements inside the game. */}
|
|
86
86
|
<div
|
|
87
|
+
id="devkit-game-screen"
|
|
88
|
+
data-testid="game-screen"
|
|
87
89
|
style={{
|
|
88
90
|
position: 'absolute',
|
|
89
91
|
overflow: 'hidden',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react';
|
|
2
2
|
import PhoneFrame from '../components/PhoneFrame';
|
|
3
3
|
import PlatformTakeover from '../components/PlatformTakeover';
|
|
4
|
+
import { captureScreen, downloadScreenshot } from '../utils/captureScreen';
|
|
4
5
|
|
|
5
6
|
const PLAYER_NAMES = ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank', 'Grace', 'Heidi'];
|
|
6
7
|
|
|
@@ -23,6 +24,7 @@ export default function Preview() {
|
|
|
23
24
|
const [gameOver, setGameOver] = useState(false);
|
|
24
25
|
const [gameResult, setGameResult] = useState<any>(null);
|
|
25
26
|
const [stateJson, setStateJson] = useState('');
|
|
27
|
+
const [capturing, setCapturing] = useState(false);
|
|
26
28
|
|
|
27
29
|
// Refs to avoid recreating platform on every state change
|
|
28
30
|
const fullStateRef = useRef(fullState);
|
|
@@ -202,10 +204,23 @@ export default function Preview() {
|
|
|
202
204
|
return () => { window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp); };
|
|
203
205
|
}, []);
|
|
204
206
|
|
|
207
|
+
const handleScreenshot = useCallback(async () => {
|
|
208
|
+
if (capturing) return;
|
|
209
|
+
setCapturing(true);
|
|
210
|
+
try {
|
|
211
|
+
const dataUrl = await captureScreen();
|
|
212
|
+
downloadScreenshot(dataUrl);
|
|
213
|
+
} catch (err) {
|
|
214
|
+
console.error('[DevKit] Screenshot failed:', err);
|
|
215
|
+
} finally {
|
|
216
|
+
setCapturing(false);
|
|
217
|
+
}
|
|
218
|
+
}, [capturing]);
|
|
219
|
+
|
|
205
220
|
return (
|
|
206
221
|
<div style={{ display: 'flex', gap: 16, height: 'calc(100vh - 80px)' }}>
|
|
207
222
|
{/* Renderer — half the screen width */}
|
|
208
|
-
<div style={{ width: '50%', height: '100%' }}>
|
|
223
|
+
<div style={{ width: '50%', height: '100%', position: 'relative' }}>
|
|
209
224
|
<PhoneFrame>
|
|
210
225
|
{gameOver && gameResult ? (
|
|
211
226
|
<PlatformTakeover result={gameResult} players={mockPlayers} onReturn={resetGame} />
|
|
@@ -217,6 +232,36 @@ export default function Preview() {
|
|
|
217
232
|
</div>
|
|
218
233
|
)}
|
|
219
234
|
</PhoneFrame>
|
|
235
|
+
{/* Screenshot button — floats below the centered phone */}
|
|
236
|
+
<button
|
|
237
|
+
onClick={handleScreenshot}
|
|
238
|
+
disabled={capturing}
|
|
239
|
+
title="Capture game screen (without phone frame)"
|
|
240
|
+
style={{
|
|
241
|
+
position: 'absolute',
|
|
242
|
+
bottom: 12,
|
|
243
|
+
left: '50%',
|
|
244
|
+
transform: 'translateX(-50%)',
|
|
245
|
+
display: 'flex',
|
|
246
|
+
alignItems: 'center',
|
|
247
|
+
gap: 6,
|
|
248
|
+
padding: '5px 14px',
|
|
249
|
+
borderRadius: 6,
|
|
250
|
+
border: '1px solid #3f3f46',
|
|
251
|
+
background: capturing ? '#27272a' : '#18181b',
|
|
252
|
+
color: capturing ? '#71717a' : '#a1a1aa',
|
|
253
|
+
fontSize: 13,
|
|
254
|
+
cursor: capturing ? 'default' : 'pointer',
|
|
255
|
+
transition: 'background 0.15s, color 0.15s',
|
|
256
|
+
zIndex: 10,
|
|
257
|
+
}}
|
|
258
|
+
>
|
|
259
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
260
|
+
<path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/>
|
|
261
|
+
<circle cx="12" cy="13" r="4"/>
|
|
262
|
+
</svg>
|
|
263
|
+
{capturing ? 'Capturing...' : 'Screenshot'}
|
|
264
|
+
</button>
|
|
220
265
|
</div>
|
|
221
266
|
|
|
222
267
|
{/* Control Panel — fills remaining width, resizable two-column */}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import html2canvas from 'html2canvas';
|
|
2
|
+
|
|
3
|
+
// Must match PhoneFrame constants: SCREEN_W=390, SAFE_AREA_TOP=59, SAFE_AREA_BOTTOM=34, SCREEN_H=844
|
|
4
|
+
const CAPTURE_W = 390;
|
|
5
|
+
const CAPTURE_H = 751; // 844 - 59 - 34
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Captures the game content area (safe area only, no phone bezel).
|
|
9
|
+
* Returns a base64-encoded PNG data URL.
|
|
10
|
+
*
|
|
11
|
+
* Also exposed on window.__devkit__.captureScreen() for LLM/Playwright callers:
|
|
12
|
+
* await page.evaluate(() => window.__devkit__.captureScreen())
|
|
13
|
+
*/
|
|
14
|
+
export async function captureScreen(): Promise<string> {
|
|
15
|
+
const el = document.getElementById('devkit-game-screen');
|
|
16
|
+
if (!el) throw new Error('[devkit] #devkit-game-screen not found — is the Preview page active?');
|
|
17
|
+
|
|
18
|
+
const canvas = await html2canvas(el, {
|
|
19
|
+
width: CAPTURE_W,
|
|
20
|
+
height: CAPTURE_H,
|
|
21
|
+
scale: 2,
|
|
22
|
+
logging: false,
|
|
23
|
+
backgroundColor: null,
|
|
24
|
+
useCORS: true,
|
|
25
|
+
allowTaint: true,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return canvas.toDataURL('image/png');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function downloadScreenshot(dataUrl: string): void {
|
|
32
|
+
const a = document.createElement('a');
|
|
33
|
+
a.href = dataUrl;
|
|
34
|
+
a.download = `game-screenshot-${Date.now()}.png`;
|
|
35
|
+
document.body.appendChild(a);
|
|
36
|
+
a.click();
|
|
37
|
+
document.body.removeChild(a);
|
|
38
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@littlepartytime/dev-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.18.0",
|
|
4
4
|
"description": "Development toolkit CLI for Little Party Time game developers",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,8 +23,14 @@
|
|
|
23
23
|
"test": "vitest run",
|
|
24
24
|
"test:watch": "vitest"
|
|
25
25
|
},
|
|
26
|
-
"files": [
|
|
27
|
-
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"boardgame",
|
|
31
|
+
"dev-tools",
|
|
32
|
+
"littlepartytime"
|
|
33
|
+
],
|
|
28
34
|
"license": "MIT",
|
|
29
35
|
"repository": {
|
|
30
36
|
"type": "git",
|
|
@@ -44,6 +50,7 @@
|
|
|
44
50
|
"archiver": "^7",
|
|
45
51
|
"chokidar": "^4",
|
|
46
52
|
"express": "^5",
|
|
53
|
+
"html2canvas": "^1.4.1",
|
|
47
54
|
"react": "^19",
|
|
48
55
|
"react-dom": "^19",
|
|
49
56
|
"socket.io": "^4",
|