feat(users): Willkommensmail mit Wellen-Kopf und Logo, Spalte Letzte Anmeldung
Tessera CI/CD / Lint & Type Check (push) Successful in 48s
Tessera CI/CD / Tests (push) Successful in 1m18s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 18s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m11s

POST /users/:id/welcome-mail (gleiche Rechte wie Bearbeiten, jederzeit sendbar),
GET /users/welcome-mail/status; HTML-Mail (Tabellenlayout, Inline-Stile,
Kopfbild als CID-PNG aus assets/mail/welcome-header.svg, erzeugt mit
scripts/render-mail-header.mjs) plus Textfassung. Verzeichniskonten: Hinweis
auf Windows-Passwort; lokale Konten: Link Passwort festlegen (7 Tage, einmalig).
Neue Spalte User.welcomeMailSentAt (Migration 20260930120000). Benutzerliste:
Spalte Letzte Anmeldung, Zeilenaktionen als Symbole. Dockerfile kopiert
apps/api/assets. Lokal per MailHog nachgewiesen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-30 15:28:52 +02:00
parent 0b34e82b21
commit 32441d77c7
24 changed files with 1540 additions and 115 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+28
View File
@@ -0,0 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="300" viewBox="0 0 1200 300">
<!--
Kopfbild der Tessera-Systemmails (Willkommensmail). Quelle des PNG
daneben (welcome-header.png, 1200x300, angezeigt 600x150); erzeugt mit
`node apps/api/scripts/render-mail-header.mjs`.
Motiv: der Dashboard-Hintergrund "Duenen" in seiner dunklen Fassung
(apps/web/src/lib/dashboard-background.ts, dunes('#1a1c20', '#23262b',
'#2c3036', '#363a41')), auf das flache Mail-Format 4:1 umgelegt, mit
einer feinen gelben Wellenlinie als Akzent; links die Bildmarke
(apps/web/src/app/icon.svg, Grundplatte mit heller Kontur wie auf der
dunklen App-Leiste) und der Schriftzug.
-->
<rect width="1200" height="300" fill="#1a1c20"/>
<path d="M0 176 C230 136 470 222 700 190 S1060 118 1200 160 L1200 300 L0 300Z" fill="#23262b"/>
<path d="M0 176 C230 136 470 222 700 190 S1060 118 1200 160" fill="none" stroke="#ffed00" stroke-opacity="0.55" stroke-width="3"/>
<path d="M0 230 C270 196 500 266 780 232 S1090 190 1200 214 L1200 300 L0 300Z" fill="#2c3036"/>
<path d="M0 272 C300 250 600 296 900 268 S1130 252 1200 260 L1200 300 L0 300Z" fill="#363a41"/>
<g transform="translate(60 40) scale(1.5)">
<rect x="4" y="4" width="64" height="64" rx="14" fill="#1a1a1a" stroke="#ffffff" stroke-opacity="0.22" stroke-width="2"/>
<rect x="16" y="16" width="12" height="12" rx="2.5" fill="#9c9440"/>
<rect x="30" y="16" width="12" height="12" rx="2.5" fill="#9c9440"/>
<rect x="45" y="15" width="12" height="12" rx="2.5" transform="rotate(12 51 21)" fill="#ffed00"/>
<rect x="30" y="30" width="12" height="12" rx="2.5" fill="#9c9440"/>
<rect x="30" y="44" width="12" height="12" rx="2.5" fill="#9c9440"/>
</g>
<text x="192" y="118" fill="#ffffff" font-family="'Segoe UI', Inter, 'Noto Sans', 'DejaVu Sans', sans-serif" font-size="60" font-weight="700" letter-spacing="-1">Tessera</text>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB