+ import Icon from "@iconify/svelte";
+ import "$lib/iconify-offline";
+
+ let {
+ open,
+ title,
+ slug,
+ endpointBase,
+ downloadPrefix = "social",
+ onclose,
+ }: {
+ open: boolean;
+ title: string;
+ slug: string;
+ /** "/api/social/calendar" oder "/api/social/post" */
+ endpointBase: string;
+ /** Prefix für Download-Dateinamen, z.B. "termin" oder "beitrag" */
+ downloadPrefix?: string;
+ onclose: () => void;
+ } = $props();
+
+ let theme = $state<"wald" | "transparent-onlight" | "transparent-ondark">("wald");
+
+ const themeQ = $derived(theme === "wald" ? "" : `&theme=${theme}`);
+ const ogUrl = $derived(`${endpointBase}/${slug}?format=og${themeQ}`);
+ const sqUrl = $derived(`${endpointBase}/${slug}?format=square${themeQ}`);
+ const storyUrl = $derived(`${endpointBase}/${slug}?format=story${themeQ}`);
+ const previewBg = $derived(
+ theme === "wald"
+ ? "bg-stein-50"
+ : theme === "transparent-onlight"
+ ? "bg-[repeating-linear-gradient(45deg,#f5f5f4,#f5f5f4_10px,#e7e5e4_10px,#e7e5e4_20px)]"
+ : "bg-[repeating-linear-gradient(45deg,#292524,#292524_10px,#1c1917_10px,#1c1917_20px)]",
+ );
+
+
+{#if open}
+ { if (e.key === 'Escape') onclose(); }}
+ tabindex="-1"
+ >
+
e.stopPropagation()}
+ role="presentation"
+ >
+
+
+
Social-Bild
+
{title}
+
+
+
+
+
+
+
+
Hintergrund
+
+ (theme = "wald")}
+ class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
+ {theme === 'wald' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
+ >
+
+ Wald (Standard)
+
+ (theme = "transparent-onlight")}
+ class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
+ {theme === 'transparent-onlight' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
+ title="Transparenter Hintergrund mit dunklem Text"
+ >
+
+ Transparent · helle Hintergründe
+
+ (theme = "transparent-ondark")}
+ class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
+ {theme === 'transparent-ondark' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
+ title="Transparenter Hintergrund mit hellem Text"
+ >
+
+ Transparent · dunkle Hintergründe
+
+
+ {#if theme !== "wald"}
+
+ Vorschau-Hintergrund zeigt nur, wie der Text aussieht — heruntergeladene PNG hat echten Alpha-Kanal.
+
+ {/if}
+
+
+
+
+
+ Quer: Facebook/Twitter/Link-Preview. Quadrat: Instagram-Feed. Story: Instagram/WhatsApp Story.
+
+
+
+{/if}
diff --git a/src/lib/components/blocks/CalendarBlock.svelte b/src/lib/components/blocks/CalendarBlock.svelte
index ba81535..3a21952 100644
--- a/src/lib/components/blocks/CalendarBlock.svelte
+++ b/src/lib/components/blocks/CalendarBlock.svelte
@@ -16,6 +16,7 @@
import "$lib/iconify-offline";
import Icon from "@iconify/svelte";
import ImageModal from "$lib/components/ImageModal.svelte";
+ import SocialImageModal from "$lib/components/SocialImageModal.svelte";
type EventCardItem = CalendarItemData & {
start: Date;
@@ -447,7 +448,6 @@
let modalImage = $state<{ src: string; alt: string } | null>(null);
let linkedSlug = $state(null);
let socialModal = $state<{ slug: string; title: string } | null>(null);
- let socialTheme = $state<"wald" | "transparent-onlight" | "transparent-ondark">("wald");
function openSocial(item: EventCardItem) {
if (!item._slug) return;
@@ -1294,146 +1294,14 @@
{/if}
{#if socialModal}
- {@const themeQ = socialTheme === "wald" ? "" : `&theme=${socialTheme}`}
- {@const ogUrl = `/api/social/calendar/${socialModal.slug}?format=og${themeQ}`}
- {@const sqUrl = `/api/social/calendar/${socialModal.slug}?format=square${themeQ}`}
- {@const storyUrl = `/api/social/calendar/${socialModal.slug}?format=story${themeQ}`}
- {@const previewBg =
- socialTheme === "wald"
- ? "bg-stein-50"
- : socialTheme === "transparent-onlight"
- ? "bg-[repeating-linear-gradient(45deg,#f5f5f4,#f5f5f4_10px,#e7e5e4_10px,#e7e5e4_20px)]"
- : "bg-[repeating-linear-gradient(45deg,#292524,#292524_10px,#1c1917_10px,#1c1917_20px)]"}
- { if (e.key === 'Escape') closeSocial(); }}
- tabindex="-1"
- >
-
e.stopPropagation()}
- role="presentation"
- >
-
-
-
Social-Bild
-
{socialModal.title}
-
-
-
-
-
-
-
-
-
Hintergrund
-
- (socialTheme = "wald")}
- class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
- {socialTheme === 'wald' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
- >
-
- Wald (Standard)
-
- (socialTheme = "transparent-onlight")}
- class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
- {socialTheme === 'transparent-onlight' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
- title="Transparenter Hintergrund mit dunklem Text — für eigene helle Bild-Hintergründe"
- >
-
- Transparent · für helle Hintergründe
-
- (socialTheme = "transparent-ondark")}
- class="flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium transition
- {socialTheme === 'transparent-ondark' ? 'border-wald-500 bg-wald-100 text-wald-800' : 'border-stein-300 bg-white text-stein-700 hover:bg-stein-50'}"
- title="Transparenter Hintergrund mit hellem Text — für eigene dunkle Bild-Hintergründe"
- >
-
- Transparent · für dunkle Hintergründe
-
-
- {#if socialTheme !== "wald"}
-
- Vorschau-Hintergrund zeigt nur, wie der Text aussieht — die heruntergeladene PNG hat echten Alpha-Kanal.
-
- {/if}
-
-
-
-
-
- Quer: Facebook/Twitter/Link-Preview. Quadrat: Instagram-Feed. Story: Instagram/WhatsApp Story.
- Transparent-Varianten lassen sich als Overlay auf eigene Hintergründe in Stories einsetzen.
-
-
-
+
{/if}