0
2
// Render six App Store screenshots from template.html + the source iPhone shots.
// Output: marketing/screens-ios/01.png … 06.png at 1242×2688.
//
// Usage: node marketing/screens-ios/render.mjs
import { chromium } from "playwright";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const SCREENS = [
{ file: "01.png", image: "01.png", title: "Pin the feeds you care about" },
{ file: "02.png", image: "02.png", title: "See the camera behind every shot" },
{ file: "03.png", image: "03.png", title: "Group your photos into galleries" },
{ file: "04.png", image: "04.png", title: "Share moments for the day" },
{ file: "05.png", image: "05.png", title: "Find your photo people" },
{ file: "06.png", image: "06.png", title: "Keep up with the activity" },
];
const browser = await chromium.launch();
const context = await browser.newContext({
viewport: { width: 1242, height: 2688 },
deviceScaleFactor: 1,
});
const page = await context.newPage();
const baseDir = path.resolve(__dirname);
const templateUrl = `file://${path.join(baseDir, "template.html")}`;
await page.goto(templateUrl, { waitUntil: "domcontentloaded" });
for (const s of SCREENS) {
const sourceUrl = `file://${path.join(baseDir, "source", s.image)}`;
console.log(`→ ${s.file}: ${s.title}`);
await page.evaluate(
({ title, image }) =>
new Promise((resolve) => {
document.getElementById("title").textContent = title;
const img = document.getElementById("device");
if (img.src === image && img.complete) return resolve();
img.onload = () => resolve();
img.onerror = () => resolve();
img.src = image;
}),
{ title: s.title, image: sourceUrl },
);
await page.waitForTimeout(200);
await page.screenshot({
path: path.join(baseDir, s.file),
fullPage: false,
});
}
await browser.close();
console.log(`Done — ${SCREENS.length} screens rendered to ${baseDir}`);