From 5a7d2931f9dbf64aeabea27c3eeee4d73ac7560b Mon Sep 17 00:00:00 2001 From: DEls Date: Sun, 30 Aug 2026 22:15:15 +0200 Subject: [PATCH] feat(pwa): render chat icon set + per-route apple-touch-icons --- public/icons/chat-icon-192.png | Bin 0 -> 2702 bytes public/icons/chat-icon-512.png | Bin 0 -> 10253 bytes public/icons/chat-maskable-512.png | Bin 0 -> 5478 bytes scripts/build-icons.mjs | 218 ++++++++++++++++++++++++++ src/app/apple-icon.png | Bin 12719 -> 11706 bytes src/app/dashboard/chat/apple-icon.png | Bin 0 -> 6798 bytes 6 files changed, 218 insertions(+) create mode 100644 public/icons/chat-icon-192.png create mode 100644 public/icons/chat-icon-512.png create mode 100644 public/icons/chat-maskable-512.png create mode 100644 scripts/build-icons.mjs create mode 100644 src/app/dashboard/chat/apple-icon.png diff --git a/public/icons/chat-icon-192.png b/public/icons/chat-icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..52765f82357ed17aff5a5cd1f3383e174b17d4c1 GIT binary patch literal 2702 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 aDI814|9LPoi$chr&LIuW4L<5QMg9lMC(ft< literal 0 HcmV?d00001 diff --git a/public/icons/chat-icon-512.png b/public/icons/chat-icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..92619865e124b55cf0d38f33058a1a5ba4de58b9 GIT binary patch literal 10253 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 literal 0 HcmV?d00001 diff --git a/scripts/build-icons.mjs b/scripts/build-icons.mjs new file mode 100644 index 0000000..0db1989 --- /dev/null +++ b/scripts/build-icons.mjs @@ -0,0 +1,218 @@ +"use strict"; +/** + * Generates /public/icons/chat-icon-192.png, chat-icon-512.png, + * chat-maskable-512.png from inline SVG sources. Also derives the + * 180x180 apple-touch-icon variants for the chat route + * (src/app/dashboard/chat/apple-icon.png) and the dashboard root + * (src/app/apple-icon.png, derived from the existing dashboard icon). + * + * Run with `node scripts/build-icons.mjs`. Requires `sharp` + * (a transitive Next.js dependency, already pulled in by next-pwa). + * + * The SVG embeds the Inter font via base64 so the wordmark is identical + * on every machine regardless of which fonts are installed. Falls back + * to system sans-serif if the font fetch fails. + */ +import { promises as fs } from "node:fs"; +import path from "node:path"; +import sharp from "sharp"; + +const ROOT = path.resolve(process.cwd()); + +const palette = { + orange: "#fdb13c", + black: "#0f172a", + white: "#ffffff", +}; + +async function loadFontBase64() { + // Check for a local font file first (committed to the repo so Docker + // builds work offline). Same fallback pattern as build-og-image.mjs. + const localPath = path.join(ROOT, "public/fonts/inter-800.woff"); + let buffer; + try { + buffer = await fs.readFile(localPath); + } catch { + const url = + "https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuDyYMZtrib2Ai-4.woff"; + const res = await fetch(url); + if (!res.ok) throw new Error(`Failed to fetch Inter: ${res.status}`); + buffer = Buffer.from(await res.arrayBuffer()); + } + return buffer.toString("base64"); +} + +const fontB64 = await loadFontBase64(); + +// Non-maskable chat icon (192 and 512). Transparent background. +// Layout: orange chat bubble + tail nub bottom-left, black cube mark +// inside the bubble, "ASK" wordmark underneath. +function chatSvg(size, fontPx) { + // Bubble geometry, expressed in a 512-coord canvas then scaled to `size`. + const bubbleX = 76; // bubble left + const bubbleY = 70; // bubble top + const bubbleW = 360; // bubble width + const bubbleH = 300; // bubble height + const bubbleR = 48; // bubble corner radius + const tailW = 56; // tail width at top + const tailH = 64; // tail length downward + const tailOffsetX = bubbleX + 70; // tail start x (toward left side) + + // Cube mark geometry — same brand DNA as dashboard icon. + const cubeX = 256 - 60; // centred horizontally (cube is 120 wide) + const cubeY = 200; // inside the bubble + const cubeSize = 120; + + // Wordmark geometry. + const wordY = 420; + + return ` + + + + + + + + + + + + + + + + + + + + ASK + `; +} + +// Maskable variant — orange fills the whole canvas (so OS cropping still +// shows orange). All meaningful content lives inside the centre ~40% +// safe-zone, which means a 205x205 region centred on a 512 canvas. +function chatMaskableSvg(size, fontPx) { + // Scale everything to fit inside ~205x205 centred region. + const scale = 205 / 512; + const offset = (512 - 205) / 2; // centre the safe-zone + + // Bubble (scaled to ~120x100) + const bubbleX = offset + 30; + const bubbleY = offset + 24; + const bubbleW = 145; + const bubbleH = 120; + const bubbleR = 19; + const tailW = 22; + const tailH = 26; + const tailOffsetX = bubbleX + 28; + + // Cube mark inside the bubble (scaled to ~48) + const cubeX = bubbleX + (bubbleW - 48) / 2; + const cubeY = bubbleY + (bubbleH - 48) / 2; + const cubeSize = 48; + + // Wordmark below the bubble. + const wordY = offset + 175; + + return ` + + + + + + + + + + + + + + + + + + + + + ASK + `; +} + +async function renderSvg(svg, outPath, size) { + const buf = Buffer.from(svg); + await sharp(buf, { density: 144 }) + .resize({ width: size, height: size }) + .png({ compressionLevel: 9 }) + .toFile(outPath); + const stat = await fs.stat(outPath); + console.log(`Wrote ${outPath} (${(stat.size / 1024).toFixed(1)} KB, ${size}x${size})`); +} + +async function renderDashboardAppleIcon() { + // Read the existing dashboard 512 PNG and downscale to 180x180 with + // ~22% corner radius for iOS. Use sharp's composite+mask to apply the + // rounded corner. + const src = path.join(ROOT, "public/icons/icon-512.png"); + const dst = path.join(ROOT, "src/app/apple-icon.png"); + + // 22% radius on a 180px square = ~40px corner radius + const radius = 40; + + // Generate a rounded-corner mask (white rounded rect on transparent) + const maskSvg = ` + + `; + const maskBuf = Buffer.from(maskSvg); + const maskPng = await sharp(maskBuf).png().toBuffer(); + + await sharp(src) + .resize({ width: 180, height: 180 }) + .composite([{ input: maskPng, blend: "dest-in" }]) + .png() + .toFile(dst); + + const stat = await fs.stat(dst); + console.log(`Wrote ${dst} (${(stat.size / 1024).toFixed(1)} KB, 180x180)`); +} + +// Main +await renderSvg(chatSvg(512, 80), path.join(ROOT, "public/icons/chat-icon-512.png"), 512); +await renderSvg(chatSvg(192, 30), path.join(ROOT, "public/icons/chat-icon-192.png"), 192); +await renderSvg(chatMaskableSvg(512, 38), path.join(ROOT, "public/icons/chat-maskable-512.png"), 512); + +// Apple-touch-icon for chat route — derived from the non-maskable 512 +const chatAppleSrc = path.join(ROOT, "public/icons/chat-icon-512.png"); +const chatAppleDst = path.join(ROOT, "src/app/dashboard/chat/apple-icon.png"); +const appleRadius = 40; // ~22% on 180px +const appleMaskSvg = ` + +`; +const appleMaskPng = await sharp(Buffer.from(appleMaskSvg)).png().toBuffer(); +await sharp(chatAppleSrc) + .resize({ width: 180, height: 180 }) + .composite([{ input: appleMaskPng, blend: "dest-in" }]) + .png() + .toFile(chatAppleDst); +console.log(`Wrote ${chatAppleDst}`); + +// Dashboard apple-icon — derived from the existing dashboard icon +await renderDashboardAppleIcon(); + +console.log("All icons rendered."); \ No newline at end of file diff --git a/src/app/apple-icon.png b/src/app/apple-icon.png index e720d130d7347be1d6db7f7994fa076465eaa3d7..9c72f4686cd7a14336b5496ddc7030fa1dcd8863 100644 GIT binary patch literal 11706 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 diff --git a/src/app/dashboard/chat/apple-icon.png b/src/app/dashboard/chat/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..33a36b44f8aafd4496464d3ab384b9d980f1fa32 GIT binary patch literal 6798 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 C5GeHk literal 0 HcmV?d00001