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>
This commit is contained in:
1 parent
bb48357179
commit
cf7361f735
14 files changed
+133
-5
No files matched your search
@@ -0,0 +1,28 @@
|
||||
// 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})`);
|
||||
}
|
||||
Reference in new issue
Block a user