feat(blocks): SectionGrid/InfoCard/ContactForm + Konsolidierung (Tier 1)
Deploy / verify (push) Successful in 1m31s
Deploy / deploy (push) Successful in 1m33s

Neue Komponenten: SectionGrid, InfoCard (tone/compact), ArrowLink, ContactFormBlock,
SectionGridBlock. CMS-Blöcke section_grid + contact_form (info_card-Collection).
OrganisationsBlock: presentation "grid" (SectionGrid + InfoCard-Tiles).
Kontaktformular-Submit: size md + Send-Icon.

Konsolidierung Tier 1:
- .card-surface + Card-Atom → rounded-lg, .chip → rounded-full, Input-Atome → rounded-md
- tote .btn-*-Klassen aus app.css entfernt (Atom nutzt --color-btn-*-Tokens)
- hardcoded Hex → stein-Tokens (InfoCard, ContactFormBlock)
- redundante rounded-sm auf card-surface-Nutzern entfernt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Peter Meier
2026-07-12 10:49:54 +02:00
parent 8fd0112dcb
commit f77314dc49
18 changed files with 274 additions and 105 deletions
@@ -10,6 +10,8 @@
import RustyImage from "$lib/components/RustyImage.svelte";
import Button from "$lib/ui/Button.svelte";
import SectionHeader from "$lib/components/SectionHeader.svelte";
import SectionGrid from "$lib/components/SectionGrid.svelte";
import InfoCard from "$lib/components/InfoCard.svelte";
function organisationLogoField(o: OrganisationEntry) {
return extractCmsImageField(o.logo);
@@ -32,6 +34,8 @@
);
const compact = $derived(block.presentation === "compact");
const carousel = $derived(block.presentation === "carousel");
// "grid" = SectionGrid + InfoCard-Tiles (Logo im Kreis, Name, Beschreibung).
const grid = $derived(block.presentation === "grid");
const orgs = $derived(block.organisations ?? []);
const ctaHtml = $derived(
block.addOrganisationMarkdown
@@ -166,7 +170,7 @@
{/snippet}
<div class={layoutClasses} data-block="Organisations" data-block-type="organisations" data-block-slug={block._slug}>
{#if block.headline}
{#if block.headline && !grid}
{#if compact}
<h3 class="mb-2 text-lg font-semibold text-stein-900">{block.headline}</h3>
{:else}
@@ -183,7 +187,29 @@
{/if}
{/if}
{#if carousel}
{#if grid}
<SectionGrid
number={block.number}
kicker={block.kicker}
title={block.headline}
subtitle={block.description}
actionLabel={actionRef?.linkName}
actionHref={actionRef?.url}
columns={3}
>
{#each orgs as org}
{#if typeof org === "object" && org !== null}
{@const o = org as OrganisationEntry}
{@const logoField = organisationLogoField(o)}
<InfoCard
icon={logoField?.url ?? "mdi:account-group"}
title={o.name ?? ""}
description={o.description}
/>
{/if}
{/each}
</SectionGrid>
{:else if carousel}
<div class="relative">
<div
bind:this={scroller}