feat(design-system): Storybook + Button-Atom-Vereinheitlichung + SectionHeader
Storybook (SvelteKit-Framework, Tailwind v4, MSW, Translation-Decorator): Stories für Atoms/Molecules/Organisms + alle CMS-Blocks. Button-Atom: 5 .btn-*-Varianten (primary/secondary/tertiary/outline/warning), class-Merge-Prop, href→<a>, Loading-Spinner neben Label, rounded-md/font-medium. Alle rohen .btn-*- und Hand-Style-Buttons app-weit aufs Atom migriert. SectionHeader-Molecule (kicker/number/title/subtitle/action) + Integration in 7 CMS-Blocks (post_overview, organisations, organisations_map, searchable_text, image_gallery, youtube_video_gallery, files) via neuem section_header-Schema. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -121,6 +121,12 @@ export interface ImageGalleryBlockData {
|
||||
description?: string;
|
||||
/** Optional: oberhalb des Galerie-Modals als Header. */
|
||||
title?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
/** "standard" = Carousel (Default), "grid" = Thumbnail-Grid mit Modal. */
|
||||
variant?: "standard" | "grid";
|
||||
images?: ImageGalleryImage[];
|
||||
@@ -144,6 +150,12 @@ export interface FilesBlockData {
|
||||
_type?: "files";
|
||||
_slug?: string;
|
||||
headline?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
description?: string;
|
||||
items?: Array<string | FilesBlockItem>;
|
||||
forceDownload?: boolean;
|
||||
@@ -174,6 +186,12 @@ export interface YoutubeVideoGalleryBlockData {
|
||||
_slug?: string;
|
||||
title?: string;
|
||||
subtitle?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
description?: string;
|
||||
variant?: "carousel" | "grid";
|
||||
videos?: YoutubeVideoBlockData[];
|
||||
@@ -226,6 +244,12 @@ export interface PostOverviewBlockData {
|
||||
_type?: "post_overview";
|
||||
_slug?: string;
|
||||
headline?: string;
|
||||
/** SectionHeader: kleines Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: optionaler Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst aus link-Collection: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
/** Einleitungstext (Markdown). */
|
||||
text?: string;
|
||||
/** true = alle Posts laden; false = posts (Slugs/Objekte) aus dem Block nutzen. */
|
||||
@@ -286,6 +310,12 @@ export interface SearchableTextBlockData {
|
||||
_slug?: string;
|
||||
/** Titel der Suchkomponente. */
|
||||
title?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
/** Einleitung (Markdown). */
|
||||
description?: string;
|
||||
/** Slugs oder aufgelöste text_fragment-Einträge. */
|
||||
@@ -326,6 +356,12 @@ export interface OrganisationsBlockData {
|
||||
_type?: "organisations";
|
||||
_slug?: string;
|
||||
headline?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
description?: string;
|
||||
/** default = Karten-Grid; compact = engere Karten, Logo links; carousel = horizontaler Slider (3 Desktop / 2 Mobile) */
|
||||
presentation?: "default" | "compact" | "carousel";
|
||||
@@ -341,6 +377,12 @@ export interface OrganisationsMapBlockData {
|
||||
_type?: "organisations_map";
|
||||
_slug?: string;
|
||||
headline?: string;
|
||||
/** SectionHeader: Label über dem Titel (uppercase). */
|
||||
kicker?: string;
|
||||
/** SectionHeader: Index vor dem Kicker, z.B. "03". */
|
||||
number?: string;
|
||||
/** SectionHeader: CTA-Link (aufgelöst: url, linkName). */
|
||||
action?: string | { url?: string; linkName?: string; newTab?: boolean };
|
||||
organisations?: (string | OrganisationEntry)[];
|
||||
layout?: BlockLayout;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user