From 9e05fbb2ba358b5ad21bba668234f99c2f6d6fd9 Mon Sep 17 00:00:00 2001 From: Peter Meier Date: Thu, 21 May 2026 11:01:47 +0200 Subject: [PATCH] feat: add internal_component block type with contact form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit InternalComponentBlock dispatches on `component` field value. ContactFormComponent submits via /api/contact (SvelteKit proxy → CMS /api/forms/kontakt/submit) with honeypot + client_age_ms. BlockRenderer and block-types.ts updated accordingly. Co-Authored-By: Claude Sonnet 4.6 --- src/lib/block-types.ts | 11 +++ src/lib/components/BlockRenderer.svelte | 4 + .../blocks/InternalComponentBlock.svelte | 18 ++++ .../internal/ContactFormComponent.svelte | 92 +++++++++++++++++++ src/routes/api/contact/+server.ts | 32 +++++++ 5 files changed, 157 insertions(+) create mode 100644 src/lib/components/blocks/InternalComponentBlock.svelte create mode 100644 src/lib/components/internal/ContactFormComponent.svelte create mode 100644 src/routes/api/contact/+server.ts diff --git a/src/lib/block-types.ts b/src/lib/block-types.ts index 2560e0f..505ea59 100644 --- a/src/lib/block-types.ts +++ b/src/lib/block-types.ts @@ -422,6 +422,17 @@ export type CalendarBlockData = Omit< layout?: BlockLayout; }; +/** Internal component block (_type: "internal_component"). */ +export type InternalComponentId = "form-contact"; + +export interface InternalComponentBlockData { + _type?: "internal_component"; + _slug?: string; + id?: string; + component?: InternalComponentId; + layout?: BlockLayout; +} + export interface WindMapBlockData { _type?: "wind_map"; _slug?: string; diff --git a/src/lib/components/BlockRenderer.svelte b/src/lib/components/BlockRenderer.svelte index eab6f93..6dafb3a 100644 --- a/src/lib/components/BlockRenderer.svelte +++ b/src/lib/components/BlockRenderer.svelte @@ -16,6 +16,7 @@ import CalendarBlock from "./blocks/CalendarBlock.svelte"; import OrganisationsBlock from "./blocks/OrganisationsBlock.svelte"; import OpnFormBlock from "./blocks/OpnFormBlock.svelte"; + import InternalComponentBlock from "./blocks/InternalComponentBlock.svelte"; import DeadlineBannerBlock from "./blocks/DeadlineBannerBlock.svelte"; import StrommixBlock from "./blocks/StrommixBlock.svelte"; import WindkarteBlock from "./blocks/WindkarteBlock.svelte"; @@ -39,6 +40,7 @@ CalendarBlockData, OrganisationsBlockData, OpnFormBlockData, + InternalComponentBlockData, DeadlineBannerBlockData, LiveStrommixBlockData, WindMapBlockData, @@ -86,6 +88,8 @@ {:else if type === "opnform"} +{:else if type === "internal_component"} + {:else if type === "deadline_banner"} {:else if type === "live_strommix"} diff --git a/src/lib/components/blocks/InternalComponentBlock.svelte b/src/lib/components/blocks/InternalComponentBlock.svelte new file mode 100644 index 0000000..c9fe302 --- /dev/null +++ b/src/lib/components/blocks/InternalComponentBlock.svelte @@ -0,0 +1,18 @@ + + +
+ {#if component === "form-contact"} + + {:else} +

Unbekannte interne Komponente: {component}

+ {/if} +
diff --git a/src/lib/components/internal/ContactFormComponent.svelte b/src/lib/components/internal/ContactFormComponent.svelte new file mode 100644 index 0000000..b2b3fac --- /dev/null +++ b/src/lib/components/internal/ContactFormComponent.svelte @@ -0,0 +1,92 @@ + + +{#if formState === "success"} +
+

Nachricht gesendet!

+

Wir melden uns so schnell wie möglich.

+
+{:else} +
+ + + + + +