From 53fc63b48608c76e151e541f13d2683dbf65092a Mon Sep 17 00:00:00 2001 From: syntaxbullet Date: Mon, 22 Jun 2026 12:30:34 +0200 Subject: [PATCH] feat: manage participation fallback labels via payload --- src/collections/Pages/participationFields.ts | 9 ++++++++- src/payload-types.ts | 12 ++++++++++++ src/spa/components/WegZurAuszeichnungSection.tsx | 5 +++-- src/spa/pages/Participation.tsx | 13 +++++++------ src/spa/participationContent.ts | 2 ++ 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/collections/Pages/participationFields.ts b/src/collections/Pages/participationFields.ts index ec91d55..1c71241 100644 --- a/src/collections/Pages/participationFields.ts +++ b/src/collections/Pages/participationFields.ts @@ -109,6 +109,7 @@ export const participationFields: Field[] = [ text('eyebrow', 'Eyebrow', participationContent.process.eyebrow), textarea('heading', 'Heading', participationContent.process.heading), textarea('description', 'Intro paragraph', participationContent.process.description), + text('stepPrefix', 'Step label prefix', participationContent.process.stepPrefix), text('scrollHint', 'Desktop scroll hint', participationContent.process.scrollHint), text('progressLabel', 'Desktop progress label', participationContent.process.progressLabel), { @@ -184,6 +185,12 @@ export const participationFields: Field[] = [ textarea('heading', 'Heading', participationContent.applicationWays.heading), textarea('description', 'Intro paragraph', participationContent.applicationWays.description), text('recommendedLabel', 'Featured card label', participationContent.applicationWays.recommendedLabel), + ctaGroup( + 'fallbackCta', + 'Fallback CTA for path cards', + participationContent.applicationWays.fallbackCta.label, + participationContent.applicationWays.fallbackCta.url, + ), { name: 'institutions', label: 'Proposal institutions', @@ -222,7 +229,7 @@ export const participationFields: Field[] = [ dbName: 'way_facts', fields: factFields, }, - ctaGroup('cta', 'CTA', 'Zum Formular', '#bewerben'), + ctaGroup('cta', 'CTA', participationContent.applicationWays.fallbackCta.label, participationContent.applicationWays.fallbackCta.url), ], }, ], diff --git a/src/payload-types.ts b/src/payload-types.ts index 3407a4f..2ff87b6 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -732,6 +732,7 @@ export interface Page { eyebrow?: string | null; heading?: string | null; description?: string | null; + stepPrefix?: string | null; scrollHint?: string | null; progressLabel?: string | null; steps?: @@ -872,6 +873,10 @@ export interface Page { heading?: string | null; description?: string | null; recommendedLabel?: string | null; + fallbackCta?: { + label?: string | null; + url?: string | null; + }; institutions?: | { text?: string | null; @@ -3711,6 +3716,7 @@ export interface PagesSelect { eyebrow?: T; heading?: T; description?: T; + stepPrefix?: T; scrollHint?: T; progressLabel?: T; steps?: @@ -3796,6 +3802,12 @@ export interface PagesSelect { heading?: T; description?: T; recommendedLabel?: T; + fallbackCta?: + | T + | { + label?: T; + url?: T; + }; institutions?: | T | { diff --git a/src/spa/components/WegZurAuszeichnungSection.tsx b/src/spa/components/WegZurAuszeichnungSection.tsx index 0582b2c..fd7acf1 100644 --- a/src/spa/components/WegZurAuszeichnungSection.tsx +++ b/src/spa/components/WegZurAuszeichnungSection.tsx @@ -38,6 +38,7 @@ export default function WegZurAuszeichnungSection({ content }: { content?: Proce const isMobile = useIsMobile(); const section = { ...participationContent.process, ...(content || {}) }; const steps = fallbackArray(section.steps, participationContent.process.steps); + const stepPrefix = fallbackText(section.stepPrefix, participationContent.process.stepPrefix); // ── MOBILE: stacked vertical list (no scroll-jack, no horizontal overflow) ── if (isMobile) { @@ -66,7 +67,7 @@ export default function WegZurAuszeichnungSection({ content }: { content?: Proce
- Schritt {fallbackText(item.step, '')} + {stepPrefix} {fallbackText(item.step, '')} {fallbackText(item.date, '')}
@@ -160,7 +161,7 @@ export default function WegZurAuszeichnungSection({ content }: { content?: Proce
- Schritt {fallbackText(item.step, '')} + {stepPrefix} {fallbackText(item.step, '')} {fallbackText(item.date, '')} diff --git a/src/spa/pages/Participation.tsx b/src/spa/pages/Participation.tsx index 0eba77a..5472c91 100644 --- a/src/spa/pages/Participation.tsx +++ b/src/spa/pages/Participation.tsx @@ -67,7 +67,7 @@ const Participation: React.FC = () => { {/* ── HERO ─────────────────────────────────────────────────────────────── */}
{mediaAlt(hero.backgroundImage, @@ -183,7 +183,7 @@ const Participation: React.FC = () => { {/* Left – full-bleed image with gradient blend into navy on the right (+ heading on mobile) */}
{mediaAlt(evaluation.image, @@ -329,7 +329,7 @@ const Participation: React.FC = () => { {!isMobile && (
- {mediaAlt(applicationForm.image, + {mediaAlt(applicationForm.image,
@@ -430,6 +430,7 @@ function BewerbungswegeSection({ content }: { content?: ApplicationWaysContent } const section = { ...participationContent.applicationWays, ...(content || {}) }; const institutions = fallbackArray(section.institutions, participationContent.applicationWays.institutions); const ways = fallbackArray(section.ways, participationContent.applicationWays.ways); + const fallbackCta = { ...participationContent.applicationWays.fallbackCta, ...(section.fallbackCta || {}) }; return (
@@ -488,7 +489,7 @@ function BewerbungswegeSection({ content }: { content?: ApplicationWaysContent }
{/* CTA */}
); @@ -532,12 +533,12 @@ function BewerbungswegeSection({ content }: { content?: ApplicationWaysContent }
((e.currentTarget as HTMLElement).style.opacity = '0.85')} onMouseLeave={e => ((e.currentTarget as HTMLElement).style.opacity = '1')} > - {fallbackText(w.cta?.label, 'Zum Formular')} + {fallbackText(w.cta?.label, fallbackCta.label)}
); diff --git a/src/spa/participationContent.ts b/src/spa/participationContent.ts index 563d3a7..113ca73 100644 --- a/src/spa/participationContent.ts +++ b/src/spa/participationContent.ts @@ -11,6 +11,7 @@ export const participationContent = { heading: 'IHR WEG ZUM\nPREIS.', description: 'Von der Einreichung bis zur Gala – vier klar definierte Schritte auf dem Weg zur höchsten Auszeichnung des bayerischen Mittelstands.', + stepPrefix: 'Schritt', scrollHint: 'Scrollen zum Erkunden', progressLabel: '01 / 04', steps: [ @@ -105,6 +106,7 @@ export const participationContent = { 'Mitglieder des Wirtschaftsbeirates Bayern', 'Ehemalige Preisträger des Bayerischen Mittelstandspreises', ].map((text) => ({ text })), + fallbackCta: { label: 'Zum Formular', url: '#bewerben' }, ways: [ { label: 'Weg 01',