From 52f538c4325b8c24becabd59285d1a936f61655c Mon Sep 17 00:00:00 2001 From: Schalli Date: Wed, 30 Sep 2026 16:29:16 +0200 Subject: [PATCH] =?UTF-8?q?fix(mail):=20Willkommensmail-Kopf=20ohne=20Bild?= =?UTF-8?q?zwang=20=E2=80=93=20Logo=20als=20HTML,=20Welle=20als=20Streifen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rueckmeldung des Nutzers: in Outlook nur ein grosser schwarzer Kasten, kein Logo (das eingebettete Kopfbild wurde nicht angezeigt; Logo und Schriftzug steckten nur darin). Jetzt Bildmarke aus Tabellenzellen und Schriftzug als Text in einer niedrigen dunklen Leiste, darunter die Duenen-Welle als 600x56-Streifen, der ins Weiss auslaeuft; fehlt das Bild, bleibt nur Abstand. Co-Authored-By: Claude Opus 5.5 (1M context) --- apps/api/assets/mail/welcome-header.png | Bin 19763 -> 10755 bytes apps/api/assets/mail/welcome-header.svg | 44 +++++++------- apps/api/scripts/render-mail-header.mjs | 6 +- apps/api/src/mail/welcome-mail.template.ts | 63 ++++++++++++++++++--- 4 files changed, 77 insertions(+), 36 deletions(-) diff --git a/apps/api/assets/mail/welcome-header.png b/apps/api/assets/mail/welcome-header.png index 8ee5bf0c4926ae51473fc6d1687140aa1a27c1ac..653892e6b9f4469bb43aefb3b286bdef6dfeba1b 100644 GIT binary patch literal 10755 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 literal 19763 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 NJYD@<);T3K0RUPKb$0*& diff --git a/apps/api/assets/mail/welcome-header.svg b/apps/api/assets/mail/welcome-header.svg index 7747fbb..c741cc7 100644 --- a/apps/api/assets/mail/welcome-header.svg +++ b/apps/api/assets/mail/welcome-header.svg @@ -1,28 +1,24 @@ - + - - - - - - - - - - - - - - Tessera + + + + + + diff --git a/apps/api/scripts/render-mail-header.mjs b/apps/api/scripts/render-mail-header.mjs index 5e00a8e..dc74e89 100644 --- a/apps/api/scripts/render-mail-header.mjs +++ b/apps/api/scripts/render-mail-header.mjs @@ -1,8 +1,8 @@ #!/usr/bin/env node /** * render-mail-header.mjs — erzeugt das Kopfbild der Willkommensmail - * (apps/api/assets/mail/welcome-header.png, 1200x300 fuer hochaufloesende - * Bildschirme, in der Mail 600x150 angezeigt) aus der daneben liegenden + * (apps/api/assets/mail/welcome-header.png, 1200x112 fuer hochaufloesende + * Bildschirme, in der Mail 600x56 angezeigt) aus der daneben liegenden * Quelle welcome-header.svg. * * Warum ein PNG statt Inline-SVG oder CSS-Hintergrund: Outlook (Word- @@ -33,7 +33,7 @@ const sharp = createRequire(nextPkg)('sharp'); const svg = readFileSync(join(assetDir, 'welcome-header.svg')); const png = await sharp(svg, { density: 72 }) - .resize(1200, 300) + .resize(1200, 112) .png({ compressionLevel: 9, palette: false }) .toBuffer(); writeFileSync(join(assetDir, 'welcome-header.png'), png); diff --git a/apps/api/src/mail/welcome-mail.template.ts b/apps/api/src/mail/welcome-mail.template.ts index 801acbf..077a553 100644 --- a/apps/api/src/mail/welcome-mail.template.ts +++ b/apps/api/src/mail/welcome-mail.template.ts @@ -11,10 +11,10 @@ * Mail sehr unterschiedlich darstellen: * - Tabellenlayout, alle Stile inline, hoechstens 600 px breit; * - keine externen Ressourcen, keine Web-Fonts (Systemschriften); - * - der Kopf im Stil des Dashboard-Hintergrunds "Duenen" ist ein PNG - * (`headerImageSrc`, im Versand `cid:`), weil SVG und CSS-Hintergruende in - * Outlook nicht erscheinen; fehlt das Bild, steht dort ein dunkler - * Textkopf; + * - Kopf: Bildmarke und Schriftzug als HTML (erscheinen immer), darunter + * die Duenen-Welle als schmaler PNG-Streifen (`headerImageSrc`, im + * Versand `cid:`), weil SVG und CSS-Hintergruende in Outlook nicht + * erscheinen; fehlt das Bild, bleibt nur ein schmaler Abschluss; * - Knoepfe als Tabelle mit Hintergrundfarbe in der Zelle ("bulletproof"), * Outlook ignoriert Innenabstaende und Rundungen am Link selbst. * @@ -118,13 +118,58 @@ function button(href: string, label: string, bg: string, fg: string): string { `; } +/** Eine Kachel der Bildmarke: feste Zelle, Hoehe auch in Outlook exakt. */ +function tile(color: string | null): string { + const bg = color ? `bgcolor="${color}" style="background-color:${color};` : 'style="'; + return ` `; +} + +/** Luecke zwischen Kacheln. */ +const GAP = ' '; + +/** + * Bildmarke als HTML (quick-260930): das Kachel-"T" aus Tabellenzellen — + * oben drei Kacheln (die dritte gelb, im Original gedreht), darunter zwei in + * der Mitte —, auf dunkler Grundplatte mit heller Kontur wie in der App. + * Braucht kein Bild und erscheint deshalb in jedem Mailprogramm. + */ +function logoMark(): string { + const row = (cells: Array) => + `
${cells.map((c, i) => (i > 0 ? GAP : '') + tile(c)).join('')}
`; + const spacer = `
 
`; + const olive = '#9c9440'; + return `
+
+ +${row([olive, olive, C.yellow])}${spacer}${row([null, olive, null])}${spacer}${row([null, olive, null])} +
+
`; +} + +/** + * Kopf der Mail (quick-260930, Rueckmeldung des Nutzers: in Outlook "ein + * riesiger schwarzer Fleck, kein Logo"). Vorher steckten Logo und + * Schriftzug in EINEM 150 px hohen Bild; zeigt ein Mailprogramm das + * eingebettete Bild nicht an, blieb nur die dunkle Flaeche. Jetzt: + * - Bildmarke (HTML-Kacheln) und Schriftzug "Tessera" (echter Text) in einer + * niedrigen dunklen Leiste — erscheinen immer; + * - darunter die Duenen-Welle als schmaler Bildstreifen (`src`, im Versand + * `cid:`), der ins Weiss der Karte auslaeuft. Fehlt er, bleibt nur weisser + * Abstand, kein dunkler Block. + */ function headerRow(src: string | null): string { - if (src) { - return ` -Tessera + const bar = ` + + + +
${logoMark()}Tessera
`; - } - return `Tessera`; + const wave = src + ? ` + +` + : ` `; + return bar + wave; } export function renderWelcomeMail(input: WelcomeMailInput): RenderedWelcomeMail {