Files
ketopath/apps/web/scripts/generate-icons.mjs
T
lucianoandClaude Opus 4.7 cf7361f735 feat(web): PWA — manifest, icone, meta iOS
- src/app/manifest.ts (Next 14 file convention) → /manifest.webmanifest
- public/icons/icon.svg + icon-maskable.svg (vettoriali, palette editoriale)
- scripts/generate-icons.mjs (sharp): genera icon-192/512.png,
  apple-touch-icon-180.png, icon-maskable-512.png, badge-72.png
- layout.tsx: viewport con themeColor light/dark, manifest link,
  appleWebApp meta (capable + title), icons (svg + png + apple touch)
- .eslintrc: ignora scripts Node out-of-project; lint-staged: .mjs format-only

Display standalone, lang it, theme #221d18 (ink) / bg #f6f0df (carta).
Sblocca "Installa app" su Chrome/Edge/Android e "Aggiungi alla Home" su
iOS Safari — quest'ultimo è pre-requisito per ricevere le push su iOS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 22:03:19 +02:00

29 lines
1.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Genera i PNG dell'icona PWA a partire dalle SVG sorgente.
// Eseguilo dopo aver modificato icon.svg / icon-maskable.svg.
//
// pnpm --filter @ketopath/web exec node scripts/generate-icons.mjs
import { readFile, writeFile } from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import path from 'node:path';
import sharp from 'sharp';
const here = path.dirname(fileURLToPath(import.meta.url));
const PUBLIC_ICONS = path.join(here, '..', 'public', 'icons');
const targets = [
{ src: 'icon.svg', out: 'icon-192.png', size: 192 },
{ src: 'icon.svg', out: 'icon-512.png', size: 512 },
{ src: 'icon.svg', out: 'apple-touch-icon.png', size: 180 },
{ src: 'icon-maskable.svg', out: 'icon-maskable-512.png', size: 512 },
{ src: 'icon-maskable.svg', out: 'badge-72.png', size: 72 },
];
for (const t of targets) {
const svg = await readFile(path.join(PUBLIC_ICONS, t.src));
const png = await sharp(svg, { density: 384 }).resize(t.size, t.size).png().toBuffer();
await writeFile(path.join(PUBLIC_ICONS, t.out), png);
// eslint-disable-next-line no-console
console.info(`✓ ${t.out} (${t.size}×${t.size})`);
}