+
${marca(COR.tealEscuro, COR.cobreEscuro).replace('
`);
+ await page.setContent(tile);
+ for (const size of [180, 192, 512]) {
+ await page.setViewport({ width: size, height: size, deviceScaleFactor: 1 });
+ rendered[size] = await page.screenshot({ type: 'png', clip: { x: 0, y: 0, width: size, height: size } });
+ }
+
+ // 3. Open Graph / Twitter: 1200x630.
+ const og = pagina(`
+
+ ${marca(COR.tealEscuro, COR.cobreEscuro).replace('
+ Documentação do ESP32
em português
+ Especificações, pinagem, comparação e seleção das 12 séries do ESP32.
+ SériesSeletorComparadorDiagnósticoLivro
+
+
`, `
+ body{background:${COR.obsidiana};font-family:'Manrope',system-ui,sans-serif;color:${COR.texto};position:relative}
+ body::before{content:"";position:absolute;inset:0;background:radial-gradient(52rem 30rem at 50% -14%,rgba(45,212,191,.16),transparent 70%),radial-gradient(40rem 26rem at 100% 30%,rgba(56,140,248,.09),transparent 70%)}
+ main{position:relative;height:100%;padding:76px 88px 0}
+ .topo{display:flex;align-items:center;gap:20px}
+ .logo{width:68px;height:68px}
+ .nome{font:600 44px 'Space Grotesk',sans-serif;letter-spacing:-0.045em}
+ h1{margin-top:64px;font:600 86px/1.03 'Space Grotesk',sans-serif;letter-spacing:-0.04em}
+ p{margin-top:30px;max-width:900px;font-size:30px;line-height:1.45;color:${COR.suave}}
+ .chips{position:absolute;left:88px;bottom:62px;display:flex;gap:12px}
+ .chips span{border:1.5px solid #2e3846;border-radius:999px;padding:9px 22px;font-size:22px;font-weight:500;color:${COR.texto}}
+ .barra{position:absolute;left:0;right:0;bottom:0;height:10px;background:${COR.tealEscuro}}`);
+ await page.setViewport({ width: 1200, height: 630, deviceScaleFactor: 1 });
+ await page.setContent(og, { waitUntil: 'networkidle0' });
+ await page.evaluate(() => document.fonts.ready);
+ const ogPng = await page.screenshot({ type: 'png', clip: { x: 0, y: 0, width: 1200, height: 630 } });
+
await browser.close();
- // Create ICO from 16, 32, 48
const icoBuffer = createIco([
{ width: 16, height: 16, buffer: rendered[16] },
{ width: 32, height: 32, buffer: rendered[32] },
{ width: 48, height: 48, buffer: rendered[48] }
]);
-
- // Write favicon.ico to public
fs.writeFileSync('public/favicon.ico', icoBuffer);
- console.log('Saved favicon.ico to public/');
-
- // Write PNG favicons to public
fs.writeFileSync('public/favicon-48x48.png', rendered[48]);
fs.writeFileSync('public/favicon-32x32.png', rendered[32]);
fs.writeFileSync('public/favicon-16x16.png', rendered[16]);
fs.writeFileSync('public/apple-touch-icon.png', rendered[180]);
fs.writeFileSync('public/icon-192.png', rendered[192]);
fs.writeFileSync('public/icon-512.png', rendered[512]);
- console.log('Saved PNG icons to public/');
+ fs.writeFileSync('app/opengraph-image.png', ogPng);
+ console.log('Favicons, ícones de app e imagem Open Graph gerados.');
- // Create site.webmanifest
const manifest = {
name: "ESPDocs",
short_name: "ESPDocs",
description: "Documentação do ecossistema ESP32 em português brasileiro",
+ lang: "pt-BR",
start_url: "/",
display: "standalone",
- background_color: "#020617",
- theme_color: "#8b5cf6",
+ background_color: COR.obsidiana,
+ theme_color: COR.obsidiana,
icons: [
- {
- src: "/favicon-48x48.png",
- sizes: "48x48",
- type: "image/png"
- },
- {
- src: "/icon-192.png",
- sizes: "192x192",
- type: "image/png"
- },
- {
- src: "/icon-512.png",
- sizes: "512x512",
- type: "image/png"
- }
+ { src: "/favicon-48x48.png", sizes: "48x48", type: "image/png" },
+ { src: "/icon-192.png", sizes: "192x192", type: "image/png", purpose: "any maskable" },
+ { src: "/icon-512.png", sizes: "512x512", type: "image/png", purpose: "any maskable" }
]
};
-
- fs.writeFileSync('public/site.webmanifest', JSON.stringify(manifest, null, 2));
- console.log('Saved site.webmanifest to public/');
+ fs.writeFileSync('public/site.webmanifest', JSON.stringify(manifest, null, 2) + '\n');
+ console.log('site.webmanifest gerado.');
}
run().catch(err => {