SPB Git

spb/phi-conseil

Public
2.5 KB · 59 lines typescript
1/**2 * Génère le favicon et les icônes à partir du logo (spirale dorée), jamais3 * d'icône générique. Usage : pnpm icons4 */5import { writeFileSync, mkdirSync } from "node:fs";6import sharp from "sharp";7import { buildSpiral } from "../src/lib/spiral.ts";89const { squares, path, bbox } = buildSpiral(8);10const pad = 1.2;11const vb = `${bbox.x - pad} ${bbox.y - pad} ${bbox.w + pad * 2} ${bbox.h + pad * 2}`;12const gold = "#c7a075";13const ivory = "#f5eee4";1415function svg({ background, size }: { background: boolean; size?: number }) {16  const rects = squares17    .map(18      (s) =>19        `<rect x="${s.x}" y="${s.y}" width="${s.s}" height="${s.s}" stroke-width="${background ? 0.32 : 0.14}" opacity="0.8"/>`,20    )21    .join("");22  const dim = size ? ` width="${size}" height="${size}"` : "";23  // Le rectangle d'or est 34×21 : on le centre dans un carré pour l'icône.24  const side = Math.max(bbox.w, bbox.h) + pad * 2;25  const sq = `${bbox.x + bbox.w / 2 - side / 2} ${bbox.y + bbox.h / 2 - side / 2} ${side} ${side}`;26  return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${background ? sq : vb}"${dim}>27${background ? `<rect x="${bbox.x + bbox.w / 2 - side / 2}" y="${bbox.y + bbox.h / 2 - side / 2}" width="${side}" height="${side}" rx="${side * 0.2}" fill="${ivory}"/>` : ""}28<g fill="none" stroke="${gold}" stroke-width="${background ? 0.55 : 0.22}" stroke-linecap="round">${rects}<path d="${path}" stroke="${background ? "#b48a5a" : gold}"/></g>29</svg>`;30}3132mkdirSync("src/app", { recursive: true });33mkdirSync("public", { recursive: true });34writeFileSync("src/app/icon.svg", svg({ background: true }));35writeFileSync("public/logo-mark.svg", svg({ background: false }));3637const png = (s: number) => sharp(Buffer.from(svg({ background: true, size: s }))).png();38await png(180).toFile("src/app/apple-icon.png");39await png(512).toFile("public/icon-512.png");40await png(192).toFile("public/icon-192.png");41// favicon.ico : PNG 48 px encapsulé (format accepté par les navigateurs modernes)42const p48 = await png(48).toBuffer();43const ico = Buffer.alloc(6 + 16);44ico.writeUInt16LE(0, 0);45ico.writeUInt16LE(1, 2);46ico.writeUInt16LE(1, 4);47ico.writeUInt8(48, 6);48ico.writeUInt8(48, 7);49ico.writeUInt8(0, 8);50ico.writeUInt8(0, 9);51ico.writeUInt16LE(1, 10);52ico.writeUInt16LE(32, 12);53ico.writeUInt32LE(p48.length, 14);54ico.writeUInt32LE(22, 18);55writeFileSync("src/app/favicon.ico", Buffer.concat([ico, p48]));56console.log(57  "Icônes générées : src/app/icon.svg, favicon.ico, apple-icon.png, public/icon-*.png, public/logo-mark.svg",58);59
Files · 2493ca54aca3eb39cc3f101be8763a9b240d00cd
Menu

Theme