diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b3aa06..3566b95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,22 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [Unreleased] — hotfix/unified-logo + +### Added +- `apps/web/public/logo.svg`: unified Kaffeelisten logo mark — amber rounded-square background with white coffee-cup line-art and steam wisps; replaces the three inconsistent visuals previously used across the app +- `tools/generate-icons.mjs`: one-off script that renders `logo.svg` via Puppeteer + local Chrome to produce `pwa-192x192.png` and `pwa-512x512.png` + +### Changed +- Start screen hero: switched from `cappuccino-with-steam.svg` (stroke illustration) to `logo.svg` so the brand mark is the same on every surface +- `favicon.svg`: replaced `☕` emoji with the proper amber-background logo mark +- `pwa-192x192.png` / `pwa-512x512.png`: regenerated from `logo.svg` — consistent with favicon and start screen +- `index.html`: added `` for iOS home-screen installs +- `vite.config.ts`: updated `includeAssets` to reference the correct asset filenames +- PDF report header: inline SVG logo mark (coffee cup on frosted amber tile) now appears beside the "Kaffeelisten" wordmark on every report page + +--- + ## [Unreleased] — feat/gdpr-notice ### Added diff --git a/apps/web/api/_lib/reportHtml.ts b/apps/web/api/_lib/reportHtml.ts index c63cf6d..1e666e7 100644 --- a/apps/web/api/_lib/reportHtml.ts +++ b/apps/web/api/_lib/reportHtml.ts @@ -120,10 +120,25 @@ export function buildReportHtml( -
-
-
ITC1 Deggendorf · B4Y3RW4LD
-
Kaffeelisten
+
+ +
+ + + + + + + + + + + + +
+
ITC1 Deggendorf · B4Y3RW4LD
+
Kaffeelisten
+
Monatsbericht
diff --git a/apps/web/index.html b/apps/web/index.html index b491e25..3ba5210 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -3,6 +3,7 @@ + diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg index 5614f70..bea3217 100644 --- a/apps/web/public/favicon.svg +++ b/apps/web/public/favicon.svg @@ -1,3 +1,11 @@ - - + + + + + + + + + + diff --git a/apps/web/public/logo.svg b/apps/web/public/logo.svg new file mode 100644 index 0000000..be73358 --- /dev/null +++ b/apps/web/public/logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/web/public/pwa-192x192.png b/apps/web/public/pwa-192x192.png index 900bbe1..23d1770 100644 Binary files a/apps/web/public/pwa-192x192.png and b/apps/web/public/pwa-192x192.png differ diff --git a/apps/web/public/pwa-512x512.png b/apps/web/public/pwa-512x512.png index 371d246..93309d9 100644 Binary files a/apps/web/public/pwa-512x512.png and b/apps/web/public/pwa-512x512.png differ diff --git a/apps/web/src/pages/MemberFlow.tsx b/apps/web/src/pages/MemberFlow.tsx index 9c0d2da..319d697 100644 --- a/apps/web/src/pages/MemberFlow.tsx +++ b/apps/web/src/pages/MemberFlow.tsx @@ -293,10 +293,9 @@ export default function MemberFlow() { return (

Kaffeelisten

diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index c12908a..d2840c9 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ react(), VitePWA({ registerType: 'autoUpdate', - includeAssets: ['favicon.ico', 'apple-touch-icon.png'], + includeAssets: ['favicon.svg', 'logo.svg', 'pwa-192x192.png', 'pwa-512x512.png'], manifest: { name: 'Kaffeelisten', short_name: 'Kaffeelisten', diff --git a/tools/generate-icons.mjs b/tools/generate-icons.mjs new file mode 100644 index 0000000..8ac861a --- /dev/null +++ b/tools/generate-icons.mjs @@ -0,0 +1,50 @@ +// One-off script: generates pwa-192x192.png and pwa-512x512.png from logo.svg +// Run from repo root: node tools/generate-icons.mjs + +import puppeteer from 'puppeteer-core' +import { writeFileSync, readFileSync, existsSync } from 'fs' +import { fileURLToPath } from 'url' +import { resolve, dirname } from 'path' + +const __dir = dirname(fileURLToPath(import.meta.url)) +const logoPath = resolve(__dir, '../apps/web/public/logo.svg') +const outDir = resolve(__dir, '../apps/web/public') + +const CHROME_CANDIDATES = [ + 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', + 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe', + '/usr/bin/google-chrome', + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', +] + +const chromePath = CHROME_CANDIDATES.find(p => existsSync(p)) +if (!chromePath) { + console.error('Chrome not found.') + process.exit(1) +} +console.log('Using Chrome at:', chromePath) + +const svgContent = readFileSync(logoPath, 'utf8') + +for (const size of [192, 512]) { + const browser = await puppeteer.launch({ + executablePath: chromePath, + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'], + }) + const page = await browser.newPage() + await page.setViewport({ width: size, height: size, deviceScaleFactor: 1 }) + await page.setContent(` + +${svgContent}`, { waitUntil: 'networkidle0' }) + const buf = await page.screenshot({ + type: 'png', + clip: { x: 0, y: 0, width: size, height: size }, + omitBackground: false, + }) + const outPath = `${outDir}/pwa-${size}x${size}.png` + writeFileSync(outPath, buf) + console.log(`✓ wrote ${outPath} (${buf.length} bytes)`) + await browser.close() +} +console.log('Done.')