feat: Social-Media-Bild-Generator für Kalender-Termine

Neuer Endpoint /api/social/calendar/[slug] rendert Termin via satori +
resvg zu PNG. Formate: og (1200x630) und square (1080x1080).
Gebrandetes Layout mit Datum, Titel, Ort. Inter-Font lazy von gstatic,
10min In-Memory-Cache pro Slug+Format.

CalendarBlock: zwei Download-Buttons pro Termin (Bild quer / quadr.).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Peter Meier
2026-06-06 09:28:00 +02:00
parent d921b2758b
commit f0d9fecfb8
6 changed files with 619 additions and 0 deletions
@@ -886,6 +886,36 @@
>
</button>
{/if}
{#if item._slug}
<a
href={`/api/social/calendar/${item._slug}?format=og`}
download={`termin-${item._slug}-og.png`}
class="btn-outline btn-sm group"
aria-label="Social-Bild (Quer 1200×630)"
title="Social-Bild Quer (1200×630)"
>
<Icon
icon="mdi:image-outline"
class="size-3.5 shrink-0"
aria-hidden="true"
/>
<span class="whitespace-nowrap">Bild quer</span>
</a>
<a
href={`/api/social/calendar/${item._slug}?format=square`}
download={`termin-${item._slug}-square.png`}
class="btn-outline btn-sm group"
aria-label="Social-Bild (Quadrat 1080×1080)"
title="Social-Bild Quadrat (1080×1080)"
>
<Icon
icon="mdi:crop-square"
class="size-3.5 shrink-0"
aria-hidden="true"
/>
<span class="whitespace-nowrap">Bild quadr.</span>
</a>
{/if}
<button
type="button"
onclick={() => jumpToEventInGrid(item)}