// Screenshot helper for tuning: opens the pond in headless Chrome at a phone-ish
// viewport and writes a PNG. Usage:
// node scripts/shot.mjs [url] [out] [width] [height] [waitMs]
import puppeteer from 'puppeteer';
import { mkdirSync } from 'node:fs';
import { dirname } from 'node:path';
const url = process.argv[2] || 'http://localhost:5173/';
const out = process.argv[3] || 'shot.png';
const width = Number(process.argv[4]) || 430;
const height = Number(process.argv[5]) || 932;
const waitMs = Number(process.argv[6]) || 5000;
const browser = await puppeteer.launch({
headless: true,
args: ['--enable-unsafe-swiftshader', '--hide-scrollbars'],
});
try {
const page = await browser.newPage();
await page.setViewport({ width, height, deviceScaleFactor: 2, isMobile: true, hasTouch: true });
page.on('console', (msg) => console.log(`[console.${msg.type()}] ${msg.text()}`));
page.on('pageerror', (err) => console.log(`[pageerror] ${err.message}`));
page.on('requestfailed', (req) => console.log(`[requestfailed] ${req.url()} ${req.failure()?.errorText || ''}`));
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
await new Promise((r) => setTimeout(r, waitMs));
// optional JS to run before the shot, e.g. to pose the camera or season
const js = process.argv[7];
if (js) {
await page.evaluate(js);
await new Promise((r) => setTimeout(r, 1200));
}
mkdirSync(dirname(out), { recursive: true });
await page.screenshot({ path: out });
console.log(`saved ${out}`);
} finally {
await browser.close();
}