Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 `<link rel="apple-touch-icon" href="/pwa-192x192.png">` 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
Expand Down
23 changes: 19 additions & 4 deletions apps/web/api/_lib/reportHtml.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,25 @@ export function buildReportHtml(
<body>

<!-- ── Header ────────────────────────────────────────────────────────────── -->
<div style="background:#D97706;padding:28px 40px 24px;display:flex;justify-content:space-between;align-items:flex-end;">
<div>
<div style="color:rgba(255,255,255,.75);font-size:10px;text-transform:uppercase;letter-spacing:.14em;font-weight:600;margin-bottom:6px;">ITC1 Deggendorf · B4Y3RW4LD</div>
<div style="color:#fff;font-size:26px;font-weight:800;letter-spacing:-.02em;">Kaffeelisten</div>
<div style="background:#D97706;padding:22px 40px 20px;display:flex;justify-content:space-between;align-items:center;">
<!-- Logo + wordmark -->
<div style="display:flex;align-items:center;gap:16px;">
<!-- Coffee-cup icon — white on amber -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="52" height="52" style="flex-shrink:0;">
<rect width="200" height="200" rx="36" ry="36" fill="rgba(255,255,255,0.18)"/>
<g transform="translate(100,100)" fill="none" stroke="#ffffff" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
<ellipse cx="0" cy="-22" rx="38" ry="7"/>
<path d="M-38,-22 Q-42,30 -18,46 Q0,52 18,46 Q42,30 38,-22"/>
<path d="M38,-10 Q62,-10 62,10 Q62,30 38,30"/>
<path d="M-14,-42 Q-10,-54 -14,-66" stroke-width="6"/>
<path d="M0,-38 Q4,-52 0,-64" stroke-width="6"/>
<path d="M14,-42 Q18,-54 14,-66" stroke-width="6"/>
</g>
</svg>
<div>
<div style="color:rgba(255,255,255,.75);font-size:10px;text-transform:uppercase;letter-spacing:.14em;font-weight:600;margin-bottom:4px;">ITC1 Deggendorf · B4Y3RW4LD</div>
<div style="color:#fff;font-size:26px;font-weight:800;letter-spacing:-.02em;">Kaffeelisten</div>
</div>
</div>
<div style="text-align:right;">
<div style="color:rgba(255,255,255,.75);font-size:10px;text-transform:uppercase;letter-spacing:.1em;font-weight:600;margin-bottom:4px;">Monatsbericht</div>
Expand Down
1 change: 1 addition & 0 deletions apps/web/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/pwa-192x192.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#D97706" />
<meta name="description" content="Kaffee- und Snack-Verbrauch am ITC1 Campus digital erfassen" />
Expand Down
12 changes: 10 additions & 2 deletions apps/web/public/favicon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions apps/web/public/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/web/public/pwa-192x192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified apps/web/public/pwa-512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 3 additions & 4 deletions apps/web/src/pages/MemberFlow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -293,10 +293,9 @@ export default function MemberFlow() {
return (
<div className="min-h-screen bg-stone-50 flex flex-col items-center justify-center gap-7 p-6 sm:p-10 font-sans relative">
<img
src="/assets/illustrations/cappuccino-with-steam.svg"
alt=""
className="w-28 sm:w-40"
style={{ color: '#44403C' }}
src="/logo.svg"
alt="Kaffeelisten"
className="w-28 sm:w-40 drop-shadow-sm"
/>
<div className="text-center max-w-xl">
<h1 className="text-3xl sm:text-5xl font-bold text-stone-900 tracking-tight">Kaffeelisten</h1>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
50 changes: 50 additions & 0 deletions tools/generate-icons.mjs
Original file line number Diff line number Diff line change
@@ -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(`<!DOCTYPE html>
<html><head><style>*{margin:0;padding:0;overflow:hidden;}body{background:transparent;}svg{width:${size}px;height:${size}px;display:block;}</style></head>
<body>${svgContent}</body></html>`, { 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.')
Loading