Kein fertiger Stand, sondern ein Zwischenstand: Hier wurde im September 2026 angefangen, die App auf „Kurbeler" umzubenennen — Wortmarke, Icons, brand.ts, Benachrichtigungen, das Benutzerverzeichnis. Weitergegangen ist es dann im eigenen Repo `~/Dokumente/Projekte/kurbeler`, das die vollständige Historie dieses Repos mitgenommen hat. Committet wird das hier nicht, weil es gebraucht würde, sondern damit es nicht als Haufen unversionierter Dateien im Arbeitsverzeichnis verrottet. Wer in zwei Jahren nachsieht, findet so eine Geschichte statt eines Rätsels — und das Stammtisch-Wappen, das nur hier je existiert hat. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTw6xVYgjMy9AQtfs1Gdyu
116 lines
5.6 KiB
HTML
116 lines
5.6 KiB
HTML
<!doctype html>
|
|
<!--
|
|
Einladungsmail für ein neues Konto.
|
|
|
|
Gerendert wird sie mit $template.loadFiles(...).render(data) — Go's
|
|
html/template. Die Platzhalter stehen deshalb in {{ }} und werden dabei
|
|
escaped; {{.Team}} kommt aus einer Datenbank und darf hier kein Markup
|
|
einschleusen.
|
|
|
|
Warum Tabellen und Inline-Styles? Weil Mailprogramme kein CSS aus dem
|
|
<head> lesen, kein Flexbox können und Outlook bis heute mit Word rendert.
|
|
Was hier steht, ist die Form, die überall ankommt — nicht die, die man
|
|
schreiben würde.
|
|
|
|
Erwartete Daten:
|
|
.App Name der Anwendung
|
|
.Team Team, das einlädt
|
|
.Name Name des Eingeladenen, wie er im Kader steht
|
|
.Link Vollständige URL auf /invite/{token}
|
|
.Expires Klartext wie "30. September 2026" — leer heißt: läuft nicht ab
|
|
-->
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Einladung zu {{.Team}}</title>
|
|
</head>
|
|
<body style="margin:0; padding:0; background:#f4f4f5; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;">
|
|
<!-- Vorschautext: steht in der Liste neben dem Betreff und sonst nirgends. -->
|
|
<div style="display:none; max-height:0; overflow:hidden; opacity:0;">
|
|
{{.Team}} lädt dich zu {{.App}} ein. Passwort setzt du selbst.
|
|
</div>
|
|
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f4f4f5; padding:32px 16px;">
|
|
<tr>
|
|
<td align="center">
|
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0"
|
|
style="max-width:520px; background:#ffffff; border-radius:12px; overflow:hidden;">
|
|
<tr>
|
|
<td style="padding:32px 32px 8px 32px;">
|
|
<p style="margin:0 0 4px 0; font-size:13px; letter-spacing:0.08em; text-transform:uppercase; color:#a1a1aa;">
|
|
{{.App}}
|
|
</p>
|
|
<h1 style="margin:0; font-size:24px; line-height:1.3; color:#18181b;">
|
|
{{.Team}} lädt dich ein
|
|
</h1>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding:16px 32px 0 32px; font-size:16px; line-height:1.6; color:#3f3f46;">
|
|
<p style="margin:0 0 16px 0;">Hallo {{.Name}},</p>
|
|
<p style="margin:0 0 16px 0;">
|
|
du stehst im Kader von <strong>{{.Team}}</strong>. Mit einem eigenen
|
|
Konto siehst du Termine, trägst dich zu Events ein und findest deine
|
|
Zeiten wieder.
|
|
</p>
|
|
<p style="margin:0 0 24px 0;">
|
|
Über den Knopf legst du das Konto selbst an — <strong>dein Passwort
|
|
wählst du dabei selbst</strong>, niemand sonst kennt es.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding:0 32px;">
|
|
<!-- Der Knopf als Tabelle: Ein <a> mit Padding bricht in Outlook. -->
|
|
<table role="presentation" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<td style="border-radius:8px; background:#eab308;">
|
|
<a href="{{.Link}}"
|
|
style="display:inline-block; padding:14px 28px; font-size:16px; font-weight:600; color:#18181b; text-decoration:none;">
|
|
Konto anlegen
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td style="padding:24px 32px 0 32px; font-size:14px; line-height:1.6; color:#71717a;">
|
|
<p style="margin:0 0 8px 0;">
|
|
Falls der Knopf nicht geht, diese Adresse in den Browser kopieren:
|
|
</p>
|
|
<p style="margin:0; word-break:break-all;">
|
|
<a href="{{.Link}}" style="color:#3f3f46;">{{.Link}}</a>
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
|
|
{{if .Expires}}
|
|
<tr>
|
|
<td style="padding:16px 32px 0 32px; font-size:14px; line-height:1.6; color:#71717a;">
|
|
Die Einladung gilt bis zum {{.Expires}}.
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
|
|
<tr>
|
|
<td style="padding:24px 32px 32px 32px;">
|
|
<hr style="border:0; border-top:1px solid #e4e4e7; margin:0 0 16px 0;">
|
|
<p style="margin:0; font-size:13px; line-height:1.6; color:#a1a1aa;">
|
|
Du erwartest keine Einladung? Dann ignorier diese Mail einfach —
|
|
ohne den Link entsteht kein Konto.
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p style="margin:16px 0 0 0; font-size:12px; color:#a1a1aa;">{{.App}}</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|