From 23faef550ed769bf9f0f0fe4af302f0b01383bde Mon Sep 17 00:00:00 2001 From: Peter Meier Date: Tue, 12 May 2026 20:02:30 +0200 Subject: [PATCH] feat(calendar): image/attachment per event, direct links, copy link, ImageModal component MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - calendar_item schema: flyer → image (type: image), attachment (assetUrl) - CalendarItemData: image + attachment fields - event anchor IDs (#event-{slug}) with onMount hash scroll + auto-open - share button uses direct calendar anchor URL - copy link button (mdi:link-variant) copies anchor URL to clipboard - ImageModal extracted as reusable component - action buttons always show text (no expand-on-hover) - onDestroy window guard (SSR fix) Co-Authored-By: Claude Sonnet 4.6 --- src/lib/block-types.ts | 23 ++- src/lib/components/ImageModal.svelte | 44 ++++++ .../components/blocks/CalendarBlock.svelte | 136 +++++++++++++++--- src/lib/iconify-mdi-subset.generated.json | 6 + 4 files changed, 183 insertions(+), 26 deletions(-) create mode 100644 src/lib/components/ImageModal.svelte diff --git a/src/lib/block-types.ts b/src/lib/block-types.ts index e1b2b73..9da5a52 100644 --- a/src/lib/block-types.ts +++ b/src/lib/block-types.ts @@ -383,15 +383,30 @@ export interface LiveStrommixBlockData { } /** Kalender-Item (calendar_item) – aus OpenAPI; terminZeit = ISO date-time. - * Lokale Erweiterungen (terminEnde, location, tags) sind im RustyCMS-Schema - * ergänzt und werden bis zur OpenAPI-Regen hier inline mitgeführt. */ + * Lokale Erweiterungen sind im RustyCMS-Schema ergänzt und werden bis zur + * OpenAPI-Regen hier inline mitgeführt. */ export type CalendarItemData = components["schemas"]["calendar_item"] & { /** Optionales Endedatum für Mehrtagesveranstaltungen (ISO date-time). */ terminEnde?: string; - /** Optionale Veranstaltungsort-Beschreibung (Adresse oder Name). */ - location?: string; + /** Optionaler Veranstaltungsort (string oder {text, lat, lng}). */ + location?: string | { text?: string; lat?: number; lng?: number }; /** Optionale Tags zur Filterung. */ tags?: string[]; + /** Optionales Veranstaltungsbild (aufgelöstes image-Feld oder Slug). */ + image?: + | string + | { + _type?: "img"; + _slug?: string; + src?: string; + description?: string; + file?: { url?: string }; + }; + /** Optionaler Dateianhang (z.B. PDF-Flyer). */ + attachment?: { + src?: string; + label?: string; + }; }; /** Kalender-Block (_type: "calendar"). items nach Resolve: CalendarItemData[]. Basis aus OpenAPI (calendar). */ diff --git a/src/lib/components/ImageModal.svelte b/src/lib/components/ImageModal.svelte new file mode 100644 index 0000000..038cf99 --- /dev/null +++ b/src/lib/components/ImageModal.svelte @@ -0,0 +1,44 @@ + + + diff --git a/src/lib/components/blocks/CalendarBlock.svelte b/src/lib/components/blocks/CalendarBlock.svelte index fe79b37..db712fd 100644 --- a/src/lib/components/blocks/CalendarBlock.svelte +++ b/src/lib/components/blocks/CalendarBlock.svelte @@ -1,5 +1,5 @@