From 1e164d7624ebcdf6ce81b977e3efc172ed1bd0af Mon Sep 17 00:00:00 2001 From: syntaxbullet Date: Mon, 22 Jun 2026 12:18:17 +0200 Subject: [PATCH] feat: centralize contact cms defaults --- src/collections/Pages/contactFields.ts | 112 +++++++++--------------- src/scripts/preload-contact-page-cms.ts | 64 +++----------- src/spa/contactContent.ts | 61 +++++++++++++ src/spa/pages/Contact.tsx | 73 +++++---------- 4 files changed, 135 insertions(+), 175 deletions(-) create mode 100644 src/spa/contactContent.ts diff --git a/src/collections/Pages/contactFields.ts b/src/collections/Pages/contactFields.ts index 3529c7b..d769d66 100644 --- a/src/collections/Pages/contactFields.ts +++ b/src/collections/Pages/contactFields.ts @@ -1,6 +1,6 @@ import type { Field } from 'payload' -import { contactFormContent } from '@/spa/contactFormContent' +import { contactContent } from '@/spa/contactContent' const uploadField = (name: string, label: string, description?: string): Field => ({ name, @@ -45,14 +45,14 @@ export const contactFields: Field[] = [ type: 'group', admin: sectionAdmin('Top image, eyebrow, headline, and intro copy.'), fields: [ - uploadField('backgroundImage', 'Background image', 'Current frontend image: /images/gala-dinner.jpg'), - text('imageAlt', 'Image alt text', 'BMP Gala'), - text('eyebrow', 'Eyebrow', 'Dialog & Service'), - textarea('heading', 'Headline', 'Wir sind\nfür Sie da.'), + uploadField('backgroundImage', 'Background image', `Current frontend image: /images/${contactContent.hero.backgroundImageFilename}`), + text('imageAlt', 'Image alt text', contactContent.hero.imageAlt), + text('eyebrow', 'Eyebrow', contactContent.hero.eyebrow), + textarea('heading', 'Headline', contactContent.hero.heading), textarea( 'description', 'Intro paragraph', - 'Fragen zur Bewerbung, zur Gala oder zu Partnermöglichkeiten – unser Team begleitet Sie persönlich.', + contactContent.hero.description, ), ], }, @@ -62,18 +62,13 @@ export const contactFields: Field[] = [ type: 'group', admin: sectionAdmin('Left direct-contact list plus the gold contact form panel.'), fields: [ - text('eyebrow', 'Direct contact eyebrow', 'Direktkontakt'), - textarea('heading', 'Direct contact heading', 'Kontakt­möglichkeiten'), + text('eyebrow', 'Direct contact eyebrow', contactContent.info.eyebrow), + textarea('heading', 'Direct contact heading', contactContent.info.heading), { name: 'items', label: 'Contact methods', type: 'array', - defaultValue: [ - { icon: 'mapPin', title: 'Geschäftsstelle', lines: 'Maximilianstraße 42\n80538 München' }, - { icon: 'mail', title: 'E-Mail', lines: 'info@bmp-bayern.de' }, - { icon: 'phone', title: 'Telefon', lines: '+49 89 123 456 78' }, - { icon: 'clock', title: 'Bürozeiten', lines: 'Mo – Fr: 09:00 – 17:00 Uhr' }, - ], + defaultValue: contactContent.info.items, fields: [ { name: 'icon', @@ -91,13 +86,13 @@ export const contactFields: Field[] = [ textarea('lines', 'Lines'), ], }, - text('nextAwardLabel', 'Next award label', 'Nächste Preisverleihung:'), - text('nextAwardDate', 'Next award date', '22. Oktober 2026'), - uploadField('formImage', 'Desktop form image', 'Current frontend image: /images/preistraeger-gruppe.jpg'), - text('formImageAlt', 'Form image alt text', 'BMP Gala 2025'), - text('formImageLabel', 'Form image label', 'Gala 2025 München'), - text('formEyebrow', 'Form eyebrow', 'Kontaktformular'), - text('formTitle', 'Form title', 'Schreiben Sie uns'), + text('nextAwardLabel', 'Next award label', contactContent.info.nextAwardLabel), + text('nextAwardDate', 'Next award date', contactContent.info.nextAwardDate), + uploadField('formImage', 'Desktop form image', `Current frontend image: /images/${contactContent.info.formImageFilename}`), + text('formImageAlt', 'Form image alt text', contactContent.info.formImageAlt), + text('formImageLabel', 'Form image label', contactContent.info.formImageLabel), + text('formEyebrow', 'Form eyebrow', contactContent.info.formEyebrow), + text('formTitle', 'Form title', contactContent.info.formTitle), { name: 'formCopy', label: 'Contact form copy', @@ -108,14 +103,14 @@ export const contactFields: Field[] = [ name: 'steps', label: 'Step labels', type: 'array', - defaultValue: contactFormContent.steps, + defaultValue: contactContent.info.formCopy.steps, fields: [text('label', 'Label')], }, { name: 'subjects', label: 'Subject choices', type: 'array', - defaultValue: contactFormContent.subjects, + defaultValue: contactContent.info.formCopy.subjects, fields: [text('value', 'Value'), text('label', 'Label'), textarea('desc', 'Description')], }, { @@ -123,9 +118,9 @@ export const contactFields: Field[] = [ label: 'Prompts', type: 'group', fields: [ - text('subject', 'Subject step prompt', contactFormContent.prompts.subject), - text('contact', 'Contact step prompt', contactFormContent.prompts.contact), - text('message', 'Message step prompt', contactFormContent.prompts.message), + text('subject', 'Subject step prompt', contactContent.info.formCopy.prompts.subject), + text('contact', 'Contact step prompt', contactContent.info.formCopy.prompts.contact), + text('message', 'Message step prompt', contactContent.info.formCopy.prompts.message), ], }, { @@ -133,12 +128,12 @@ export const contactFields: Field[] = [ label: 'Fields', type: 'group', fields: [ - text('nameLabel', 'Name label', contactFormContent.fields.nameLabel), - text('namePlaceholder', 'Name placeholder', contactFormContent.fields.namePlaceholder), - text('emailLabel', 'Email label', contactFormContent.fields.emailLabel), - text('emailPlaceholder', 'Email placeholder', contactFormContent.fields.emailPlaceholder), - text('messageLabel', 'Message label', contactFormContent.fields.messageLabel), - text('messagePlaceholder', 'Message placeholder', contactFormContent.fields.messagePlaceholder), + text('nameLabel', 'Name label', contactContent.info.formCopy.fields.nameLabel), + text('namePlaceholder', 'Name placeholder', contactContent.info.formCopy.fields.namePlaceholder), + text('emailLabel', 'Email label', contactContent.info.formCopy.fields.emailLabel), + text('emailPlaceholder', 'Email placeholder', contactContent.info.formCopy.fields.emailPlaceholder), + text('messageLabel', 'Message label', contactContent.info.formCopy.fields.messageLabel), + text('messagePlaceholder', 'Message placeholder', contactContent.info.formCopy.fields.messagePlaceholder), ], }, { @@ -146,10 +141,10 @@ export const contactFields: Field[] = [ label: 'Validation messages', type: 'group', fields: [ - text('nameRequired', 'Name required', contactFormContent.validation.nameRequired), - text('emailRequired', 'Email required', contactFormContent.validation.emailRequired), - text('emailInvalid', 'Email invalid', contactFormContent.validation.emailInvalid), - text('messageRequired', 'Message required', contactFormContent.validation.messageRequired), + text('nameRequired', 'Name required', contactContent.info.formCopy.validation.nameRequired), + text('emailRequired', 'Email required', contactContent.info.formCopy.validation.emailRequired), + text('emailInvalid', 'Email invalid', contactContent.info.formCopy.validation.emailInvalid), + text('messageRequired', 'Message required', contactContent.info.formCopy.validation.messageRequired), ], }, { @@ -157,9 +152,9 @@ export const contactFields: Field[] = [ label: 'Navigation labels', type: 'group', fields: [ - text('back', 'Back', contactFormContent.navigation.back), - text('next', 'Next', contactFormContent.navigation.next), - text('submit', 'Submit', contactFormContent.navigation.submit), + text('back', 'Back', contactContent.info.formCopy.navigation.back), + text('next', 'Next', contactContent.info.formCopy.navigation.next), + text('submit', 'Submit', contactContent.info.formCopy.navigation.submit), ], }, { @@ -167,9 +162,9 @@ export const contactFields: Field[] = [ label: 'Success copy', type: 'group', fields: [ - text('heading', 'Heading', contactFormContent.success.heading), - text('prefix', 'Prefix', contactFormContent.success.prefix), - text('suffixBeforeEmail', 'Suffix before email', contactFormContent.success.suffixBeforeEmail), + text('heading', 'Heading', contactContent.info.formCopy.success.heading), + text('prefix', 'Prefix', contactContent.info.formCopy.success.prefix), + text('suffixBeforeEmail', 'Suffix before email', contactContent.info.formCopy.success.suffixBeforeEmail), ], }, ], @@ -182,17 +177,13 @@ export const contactFields: Field[] = [ type: 'group', admin: sectionAdmin('Dark 2026 timeline with three deadline columns.'), fields: [ - text('watermark', 'Large background year', '2026'), - text('eyebrow', 'Eyebrow', 'Fahrplan 2026'), + text('watermark', 'Large background year', contactContent.deadlines.watermark), + text('eyebrow', 'Eyebrow', contactContent.deadlines.eyebrow), { name: 'items', label: 'Deadline items', type: 'array', - defaultValue: [ - { step: '01', label: 'Bewerbungsschluss', date: '30. Juni 2026', desc: 'Letzte Möglichkeit zur Einreichung Ihrer Unterlagen.' }, - { step: '02', label: 'Nominierung', date: '15. August 2026', desc: 'Bekanntgabe der Nominierten nach Jury-Sichtung.' }, - { step: '03', label: 'Preisverleihung', date: '22. Oktober 2026', desc: 'Festliche Gala in München.' }, - ], + defaultValue: contactContent.deadlines.items, fields: [text('step', 'Step'), text('label', 'Label'), text('date', 'Date'), textarea('desc', 'Description')], }, ], @@ -203,30 +194,13 @@ export const contactFields: Field[] = [ type: 'group', admin: sectionAdmin('FAQ heading and accordion entries.'), fields: [ - text('eyebrow', 'Eyebrow', 'Antworten'), - textarea('heading', 'Heading', 'Häufige\nFragen'), + text('eyebrow', 'Eyebrow', contactContent.faq.eyebrow), + textarea('heading', 'Heading', contactContent.faq.heading), { name: 'items', label: 'FAQ items', type: 'array', - defaultValue: [ - { - q: 'Was kostet die Teilnahme am BMP?', - a: 'Die Teilnahme am Bayerischen Mittelstandspreis ist für alle Unternehmen vollständig kostenfrei. Wir finanzieren uns durch Partner und Sponsoren, um exzellenten Mittelstand ohne finanzielle Hürden zu fördern.', - }, - { - q: 'Nach welchen Kriterien wird bewertet?', - a: 'Die Bewertung basiert auf vier Säulen: Zukunftsfähigkeit & Innovation, Nachhaltigkeit & Verantwortung, Unternehmenskultur sowie Regionale Verwurzelung. Jede Säule fließt mit 25 % in das Gesamtergebnis ein.', - }, - { - q: 'Wie läuft der Bewerbungsprozess ab?', - a: 'Der Prozess ist mehrstufig: 1. Online-Bewerbung oder Vorschlag, 2. Formale Prüfung & erste Jury-Sichtung, 3. Fach-Audits bei den Finalisten vor Ort, 4. Finale Jury-Sitzung und abschließende Preisverleihung.', - }, - { - q: 'Wie lange dauert die Bewerbung?', - a: 'Dank unseres optimierten Bewerbungsformulars benötigen Sie für die erste Einreichung ca. 30–45 Minuten. Tiefergehende Unterlagen werden erst in der Audit-Phase angefordert.', - }, - ], + defaultValue: contactContent.faq.items, fields: [textarea('q', 'Question'), textarea('a', 'Answer')], }, ], diff --git a/src/scripts/preload-contact-page-cms.ts b/src/scripts/preload-contact-page-cms.ts index 3eab57c..f447dbd 100644 --- a/src/scripts/preload-contact-page-cms.ts +++ b/src/scripts/preload-contact-page-cms.ts @@ -3,7 +3,7 @@ import 'dotenv/config' import config from '@payload-config' import { getPayload, type Payload } from 'payload' -import { contactFormContent } from '@/spa/contactFormContent' +import { contactContent } from '@/spa/contactContent' const mediaByFilename = async (payload: Payload, filename: string) => { const result = await payload.find({ @@ -33,9 +33,11 @@ async function main() { if (!page) throw new Error('Contact page not found. Expected spaPath=/kontakt or slug=kontakt/contact.') const [heroImage, formImage] = await Promise.all([ - mediaByFilename(payload, 'gala-dinner.jpg'), - mediaByFilename(payload, 'preistraeger-gruppe.jpg'), + mediaByFilename(payload, contactContent.hero.backgroundImageFilename), + mediaByFilename(payload, contactContent.info.formImageFilename), ]) + const { backgroundImageFilename: _heroFilename, ...heroContent } = contactContent.hero + const { formImageFilename: _formImageFilename, ...infoContent } = contactContent.info await payload.update({ collection: 'pages', @@ -45,63 +47,17 @@ async function main() { data: { contact: { hero: { + ...heroContent, backgroundImage: heroImage, - imageAlt: 'BMP Gala', - eyebrow: 'Dialog & Service', - heading: 'Wir sind\nfür Sie da.', - description: 'Fragen zur Bewerbung, zur Gala oder zu Partnermöglichkeiten – unser Team begleitet Sie persönlich.', }, info: { - eyebrow: 'Direktkontakt', - heading: 'Kontakt­möglichkeiten', - items: [ - { icon: 'mapPin', title: 'Geschäftsstelle', lines: 'Maximilianstraße 42\n80538 München' }, - { icon: 'mail', title: 'E-Mail', lines: 'info@bmp-bayern.de' }, - { icon: 'phone', title: 'Telefon', lines: '+49 89 123 456 78' }, - { icon: 'clock', title: 'Bürozeiten', lines: 'Mo – Fr: 09:00 – 17:00 Uhr' }, - ], - nextAwardLabel: 'Nächste Preisverleihung:', - nextAwardDate: '22. Oktober 2026', + ...infoContent, formImage, - formImageAlt: 'BMP Gala 2025', - formImageLabel: 'Gala 2025 München', - formEyebrow: 'Kontaktformular', - formTitle: 'Schreiben Sie uns', - formCopy: contactFormContent, - }, - deadlines: { - watermark: '2026', - eyebrow: 'Fahrplan 2026', - items: [ - { step: '01', label: 'Bewerbungsschluss', date: '30. Juni 2026', desc: 'Letzte Möglichkeit zur Einreichung Ihrer Unterlagen.' }, - { step: '02', label: 'Nominierung', date: '15. August 2026', desc: 'Bekanntgabe der Nominierten nach Jury-Sichtung.' }, - { step: '03', label: 'Preisverleihung', date: '22. Oktober 2026', desc: 'Festliche Gala in München.' }, - ], - }, - faq: { - eyebrow: 'Antworten', - heading: 'Häufige\nFragen', - items: [ - { - q: 'Was kostet die Teilnahme am BMP?', - a: 'Die Teilnahme am Bayerischen Mittelstandspreis ist für alle Unternehmen vollständig kostenfrei. Wir finanzieren uns durch Partner und Sponsoren, um exzellenten Mittelstand ohne finanzielle Hürden zu fördern.', - }, - { - q: 'Nach welchen Kriterien wird bewertet?', - a: 'Die Bewertung basiert auf vier Säulen: Zukunftsfähigkeit & Innovation, Nachhaltigkeit & Verantwortung, Unternehmenskultur sowie Regionale Verwurzelung. Jede Säule fließt mit 25 % in das Gesamtergebnis ein.', - }, - { - q: 'Wie läuft der Bewerbungsprozess ab?', - a: 'Der Prozess ist mehrstufig: 1. Online-Bewerbung oder Vorschlag, 2. Formale Prüfung & erste Jury-Sichtung, 3. Fach-Audits bei den Finalisten vor Ort, 4. Finale Jury-Sitzung und abschließende Preisverleihung.', - }, - { - q: 'Wie lange dauert die Bewerbung?', - a: 'Dank unseres optimierten Bewerbungsformulars benötigen Sie für die erste Einreichung ca. 30–45 Minuten. Tiefergehende Unterlagen werden erst in der Audit-Phase angefordert.', - }, - ], }, + deadlines: contactContent.deadlines, + faq: contactContent.faq, }, - }, + } as never, }) payload.logger.info(`Preloaded contact CMS fields for page ${page.id}`) diff --git a/src/spa/contactContent.ts b/src/spa/contactContent.ts new file mode 100644 index 0000000..f1f48f0 --- /dev/null +++ b/src/spa/contactContent.ts @@ -0,0 +1,61 @@ +import { contactFormContent } from '@/spa/contactFormContent' + +export const contactContent = { + hero: { + backgroundImageFilename: 'gala-dinner.jpg', + imageAlt: 'BMP Gala', + eyebrow: 'Dialog & Service', + heading: 'Wir sind\nfür Sie da.', + description: 'Fragen zur Bewerbung, zur Gala oder zu Partnermöglichkeiten – unser Team begleitet Sie persönlich.', + }, + info: { + eyebrow: 'Direktkontakt', + heading: 'Kontakt­möglichkeiten', + items: [ + { icon: 'mapPin', title: 'Geschäftsstelle', lines: 'Maximilianstraße 42\n80538 München' }, + { icon: 'mail', title: 'E-Mail', lines: 'info@bmp-bayern.de' }, + { icon: 'phone', title: 'Telefon', lines: '+49 89 123 456 78' }, + { icon: 'clock', title: 'Bürozeiten', lines: 'Mo – Fr: 09:00 – 17:00 Uhr' }, + ], + nextAwardLabel: 'Nächste Preisverleihung:', + nextAwardDate: '22. Oktober 2026', + formImageFilename: 'preistraeger-gruppe.jpg', + formImageAlt: 'BMP Gala 2025', + formImageLabel: 'Gala 2025 München', + formEyebrow: 'Kontaktformular', + formTitle: 'Schreiben Sie uns', + formCopy: contactFormContent, + }, + deadlines: { + watermark: '2026', + eyebrow: 'Fahrplan 2026', + items: [ + { step: '01', label: 'Bewerbungsschluss', date: '30. Juni 2026', desc: 'Letzte Möglichkeit zur Einreichung Ihrer Unterlagen.' }, + { step: '02', label: 'Nominierung', date: '15. August 2026', desc: 'Bekanntgabe der Nominierten nach Jury-Sichtung.' }, + { step: '03', label: 'Preisverleihung', date: '22. Oktober 2026', desc: 'Festliche Gala in München.' }, + ], + }, + faq: { + eyebrow: 'Antworten', + heading: 'Häufige\nFragen', + items: [ + { + q: 'Was kostet die Teilnahme am BMP?', + a: 'Die Teilnahme am Bayerischen Mittelstandspreis ist für alle Unternehmen vollständig kostenfrei. Wir finanzieren uns durch Partner und Sponsoren, um exzellenten Mittelstand ohne finanzielle Hürden zu fördern.', + }, + { + q: 'Nach welchen Kriterien wird bewertet?', + a: 'Die Bewertung basiert auf vier Säulen: Zukunftsfähigkeit & Innovation, Nachhaltigkeit & Verantwortung, Unternehmenskultur sowie Regionale Verwurzelung. Jede Säule fließt mit 25 % in das Gesamtergebnis ein.', + }, + { + q: 'Wie läuft der Bewerbungsprozess ab?', + a: 'Der Prozess ist mehrstufig: 1. Online-Bewerbung oder Vorschlag, 2. Formale Prüfung & erste Jury-Sichtung, 3. Fach-Audits bei den Finalisten vor Ort, 4. Finale Jury-Sitzung und abschließende Preisverleihung.', + }, + { + q: 'Wie lange dauert die Bewerbung?', + a: 'Dank unseres optimierten Bewerbungsformulars benötigen Sie für die erste Einreichung ca. 30–45 Minuten. Tiefergehende Unterlagen werden erst in der Audit-Phase angefordert.', + }, + ], + }, +} + diff --git a/src/spa/pages/Contact.tsx b/src/spa/pages/Contact.tsx index 7bcec24..11bae42 100644 --- a/src/spa/pages/Contact.tsx +++ b/src/spa/pages/Contact.tsx @@ -7,6 +7,7 @@ import { mediaAlt, mediaUrl } from '@/spa/cmsMediaField'; import { useCmsRoute } from '@/spa/cmsRoute'; import Image from '@/spa/components/ui/UnoptimizedImage' import type { Page } from '@/payload-types'; +import { contactContent } from '@/spa/contactContent'; const NAVY = '#111D55'; const GOLD = '#EFBF04'; @@ -17,7 +18,7 @@ type ContactCms = NonNullable; type ContactItem = NonNullable['items']>[number] | { icon: string; title: string; - lines: string[]; + lines: string | string[]; }; type DeadlineItem = NonNullable['items']>[number]; type FaqItem = NonNullable['items']>[number]; @@ -39,38 +40,6 @@ const ICONS = { clock: Clock, }; -const DEFAULT_FAQS = [ - { - q: 'Was kostet die Teilnahme am BMP?', - a: 'Die Teilnahme am Bayerischen Mittelstandspreis ist für alle Unternehmen vollständig kostenfrei. Wir finanzieren uns durch Partner und Sponsoren, um exzellenten Mittelstand ohne finanzielle Hürden zu fördern.', - }, - { - q: 'Nach welchen Kriterien wird bewertet?', - a: 'Die Bewertung basiert auf vier Säulen: Zukunftsfähigkeit & Innovation, Nachhaltigkeit & Verantwortung, Unternehmenskultur sowie Regionale Verwurzelung. Jede Säule fließt mit 25 % in das Gesamtergebnis ein.', - }, - { - q: 'Wie läuft der Bewerbungsprozess ab?', - a: 'Der Prozess ist mehrstufig: 1. Online-Bewerbung oder Vorschlag, 2. Formale Prüfung & erste Jury-Sichtung, 3. Fach-Audits bei den Finalisten vor Ort, 4. Finale Jury-Sitzung und abschließende Preisverleihung.', - }, - { - q: 'Wie lange dauert die Bewerbung?', - a: 'Dank unseres optimierten Bewerbungsformulars benötigen Sie für die erste Einreichung ca. 30–45 Minuten. Tiefergehende Unterlagen werden erst in der Audit-Phase angefordert.', - }, -]; - -const DEFAULT_DEADLINES = [ - { step: '01', label: 'Bewerbungsschluss', date: '30. Juni 2026', desc: 'Letzte Möglichkeit zur Einreichung Ihrer Unterlagen.' }, - { step: '02', label: 'Nominierung', date: '15. August 2026', desc: 'Bekanntgabe der Nominierten nach Jury-Sichtung.' }, - { step: '03', label: 'Preisverleihung', date: '22. Oktober 2026', desc: 'Festliche Gala in München.' }, -]; - -const DEFAULT_CONTACT_ITEMS = [ - { icon: 'mapPin', title: 'Geschäftsstelle', lines: ['Maximilianstraße 42', '80538 München'] }, - { icon: 'mail', title: 'E-Mail', lines: ['info@bmp-bayern.de'] }, - { icon: 'phone', title: 'Telefon', lines: ['+49 89 123 456 78'] }, - { icon: 'clock', title: 'Bürozeiten', lines: ['Mo – Fr: 09:00 – 17:00 Uhr'] }, -]; - const Contact: React.FC = () => { const [openFaq, setOpenFaq] = useState(0); const isMobile = useIsMobile(); @@ -79,9 +48,9 @@ const Contact: React.FC = () => { const info = contact.info || {}; const deadlines = contact.deadlines || {}; const faq = contact.faq || {}; - const contactItems = fallbackArray(info.items, DEFAULT_CONTACT_ITEMS); - const deadlineItems = fallbackArray(deadlines.items, DEFAULT_DEADLINES); - const faqItems = fallbackArray(faq.items, DEFAULT_FAQS); + const contactItems = fallbackArray(info.items, contactContent.info.items); + const deadlineItems = fallbackArray(deadlines.items, contactContent.deadlines.items); + const faqItems = fallbackArray(faq.items, contactContent.faq.items); return (
@@ -89,8 +58,8 @@ const Contact: React.FC = () => { {/* ── Hero ───────────────────────────────────────────────────────── */}
{mediaAlt(hero.backgroundImage, {/* Diagonal overlay */} @@ -100,13 +69,13 @@ const Contact: React.FC = () => {

- {fallbackText(hero.eyebrow, 'Dialog & Service')} + {fallbackText(hero.eyebrow, contactContent.hero.eyebrow)}

- +

- {fallbackText(hero.description, 'Fragen zur Bewerbung, zur Gala oder zu Partnermöglichkeiten – unser Team begleitet Sie persönlich.')} + {fallbackText(hero.description, contactContent.hero.description)}

@@ -121,11 +90,11 @@ const Contact: React.FC = () => { {/* Left – info panel */}

- {fallbackText(info.eyebrow, 'Direktkontakt')} + {fallbackText(info.eyebrow, contactContent.info.eyebrow)}

- +

@@ -152,7 +121,7 @@ const Contact: React.FC = () => {

- {fallbackText(info.nextAwardLabel, 'Nächste Preisverleihung:')} {fallbackText(info.nextAwardDate, '22. Oktober 2026')} + {fallbackText(info.nextAwardLabel, contactContent.info.nextAwardLabel)} {fallbackText(info.nextAwardDate, contactContent.info.nextAwardDate)}

@@ -178,19 +147,19 @@ const Contact: React.FC = () => { {!isMobile && (
- {mediaAlt(info.formImage, + {mediaAlt(info.formImage,
- {fallbackText(info.formImageLabel, 'Gala 2025 München')} + {fallbackText(info.formImageLabel, contactContent.info.formImageLabel)}
)}
- {fallbackText(info.formEyebrow, 'Kontaktformular')} + {fallbackText(info.formEyebrow, contactContent.info.formEyebrow)}

- {fallbackText(info.formTitle, 'Schreiben Sie uns')} + {fallbackText(info.formTitle, contactContent.info.formTitle)}

@@ -201,12 +170,12 @@ const Contact: React.FC = () => { {/* ── Deadlines ──────────────────────────────────────────────────── */}
- {fallbackText(deadlines.watermark, '2026')} + {fallbackText(deadlines.watermark, contactContent.deadlines.watermark)}
- {fallbackText(deadlines.eyebrow, 'Fahrplan 2026')} + {fallbackText(deadlines.eyebrow, contactContent.deadlines.eyebrow)}
@@ -248,11 +217,11 @@ const Contact: React.FC = () => { {/* Left – sticky label */}

- {fallbackText(faq.eyebrow, 'Antworten')} + {fallbackText(faq.eyebrow, contactContent.faq.eyebrow)}

- +