feat: manage participation page via payload

This commit is contained in:
syntaxbullet
2026-06-22 10:40:10 +02:00
parent ae98269b03
commit 2e9ad5cdf8
9 changed files with 1886 additions and 360 deletions

View File

@@ -488,6 +488,431 @@ export interface Page {
| null;
};
};
/**
* Edit the participation page in the same order it appears on the frontend. The generic Hero and Content tabs are hidden for this SPA-managed route.
*/
participation?: {
/**
* Top image, eyebrow, headline, and intro copy.
*/
hero?: {
/**
* Current frontend image: /images/preisuebergabe.jpg
*/
backgroundImage?: (number | null) | Media;
imageAlt?: string | null;
eyebrow?: string | null;
heading?: string | null;
description?: string | null;
};
/**
* Timeline section rendered directly after the hero.
*/
process?: {
eyebrow?: string | null;
heading?: string | null;
description?: string | null;
scrollHint?: string | null;
progressLabel?: string | null;
steps?:
| {
step?: string | null;
title?: string | null;
desc?: string | null;
date?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
id?: string | null;
}[]
| null;
};
/**
* Cream eligibility section with criteria rows, notes, and CTAs.
*/
eligibility?: {
eyebrow?: string | null;
heading?: string | null;
description?: string | null;
primaryCta?: {
label?: string | null;
url?: string | null;
};
secondaryCta?: {
label?: string | null;
url?: string | null;
};
criteria?:
| {
num?: string | null;
title?: string | null;
body?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
id?: string | null;
}[]
| null;
notes?:
| {
title?: string | null;
body?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
id?: string | null;
}[]
| null;
nudgeText?: string | null;
nudgeCta?: {
label?: string | null;
url?: string | null;
};
};
/**
* Navy evaluation section with image, link, and criteria grid.
*/
evaluation?: {
/**
* Current frontend image: /images/buehne-gewinner.jpg
*/
image?: (number | null) | Media;
imageAlt?: string | null;
eyebrow?: string | null;
heading?: string | null;
body?: string | null;
link?: {
label?: string | null;
url?: string | null;
};
criteria?:
| {
label?: string | null;
desc?: string | null;
id?: string | null;
}[]
| null;
};
/**
* Cream section explaining proposal, self-application, and special award paths.
*/
applicationWays?: {
eyebrow?: string | null;
heading?: string | null;
description?: string | null;
recommendedLabel?: string | null;
institutions?:
| {
text?: string | null;
id?: string | null;
}[]
| null;
ways?:
| {
label?: string | null;
title?: string | null;
desc?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
featured?: boolean | null;
listType?: ('institutions' | 'facts') | null;
facts?:
| {
label?: string | null;
desc?: string | null;
id?: string | null;
}[]
| null;
cta?: {
label?: string | null;
url?: string | null;
};
id?: string | null;
}[]
| null;
};
/**
* Gold important-dates banner. Mobile and desktop labels differ slightly in the current design.
*/
datesBanner?: {
heading?: string | null;
description?: string | null;
mobileItems?:
| {
date?: string | null;
label?: string | null;
id?: string | null;
}[]
| null;
desktopItems?:
| {
date?: string | null;
label?: string | null;
id?: string | null;
}[]
| null;
};
/**
* Navy/gold section containing the application form and PDF upload links.
*/
applicationForm?: {
/**
* Current frontend image: /images/preistraeger-jubel.jpg
*/
image?: (number | null) | Media;
imageAlt?: string | null;
imageCaption?: string | null;
eyebrow?: string | null;
heading?: string | null;
description?: string | null;
facts?:
| {
num?: string | null;
label?: string | null;
desc?: string | null;
id?: string | null;
}[]
| null;
formEyebrow?: string | null;
uploadCta?: {
label?: string | null;
url?: string | null;
};
uploadPrompt?: string | null;
uploadFooterCta?: {
label?: string | null;
url?: string | null;
};
};
/**
* Text, options, and eligibility thresholds used inside the multi-step application form.
*/
form?: {
stepCompleteLabel?: string | null;
backLabel?: string | null;
nextLabel?: string | null;
submitLabel?: string | null;
yesLabel?: string | null;
noLabel?: string | null;
requiredSuffix?: string | null;
validation?: {
choose?: string | null;
required?: string | null;
invalidEmail?: string | null;
};
typeStep?: {
eyebrow?: string | null;
heading?: string | null;
selfTitle?: string | null;
selfDesc?: string | null;
nominationTitle?: string | null;
nominationDesc?: string | null;
};
selfSteps?:
| {
label?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
id?: string | null;
}[]
| null;
nominationSteps?:
| {
label?: string | null;
icon?:
| (
| 'alertCircle'
| 'arrowRight'
| 'building2'
| 'check'
| 'checkCircle2'
| 'fileText'
| 'mapPin'
| 'search'
| 'send'
| 'star'
| 'trendingUp'
| 'trophy'
| 'user'
| 'userCheck'
| 'userPlus'
| 'users'
)
| null;
id?: string | null;
}[]
| null;
employeeOptions?:
| {
value?: string | null;
label?: string | null;
id?: string | null;
}[]
| null;
eligibility?: {
allowedEmployeeValues?: string | null;
requiredBayernValue?: string | null;
eyebrow?: string | null;
heading?: string | null;
employeesLabel?: string | null;
bayernLabel?: string | null;
ownerLabel?: string | null;
ineligibleHeading?: string | null;
ineligibleBody?: string | null;
ineligibleContactPrefix?: string | null;
ineligibleContactEmail?: string | null;
};
selfContact?: {
eyebrow?: string | null;
heading?: string | null;
companyLabel?: string | null;
companyPlaceholder?: string | null;
nameLabel?: string | null;
namePlaceholder?: string | null;
emailLabel?: string | null;
emailPlaceholder?: string | null;
phoneLabel?: string | null;
phonePlaceholder?: string | null;
footnote?: string | null;
};
selfSummary?: {
eyebrow?: string | null;
heading?: string | null;
companyLabel?: string | null;
employeesLabel?: string | null;
locationLabel?: string | null;
locationPrefix?: string | null;
contactLabel?: string | null;
};
nominationCompany?: {
eyebrow?: string | null;
heading?: string | null;
companyLabel?: string | null;
companyPlaceholder?: string | null;
industryLabel?: string | null;
industryPlaceholder?: string | null;
locationLabel?: string | null;
locationPlaceholder?: string | null;
};
nominationContact?: {
eyebrow?: string | null;
heading?: string | null;
nameLabel?: string | null;
namePlaceholder?: string | null;
emailLabel?: string | null;
emailPlaceholder?: string | null;
relationshipLabel?: string | null;
relationshipPlaceholder?: string | null;
footnote?: string | null;
};
nominationSummary?: {
eyebrow?: string | null;
heading?: string | null;
companyLabel?: string | null;
industryLabel?: string | null;
locationLabel?: string | null;
nominatedByLabel?: string | null;
emptyValue?: string | null;
};
success?: {
selfHeading?: string | null;
nominationHeading?: string | null;
selfPrefix?: string | null;
selfMiddle?: string | null;
selfSuffix?: string | null;
nominationPrefix?: string | null;
nominationMiddle?: string | null;
nominationSuffix?: string | null;
};
};
};
meta?: {
title?: string | null;
/**
@@ -1764,6 +2189,331 @@ export interface PagesSelect<T extends boolean = true> {
};
};
};
participation?:
| T
| {
hero?:
| T
| {
backgroundImage?: T;
imageAlt?: T;
eyebrow?: T;
heading?: T;
description?: T;
};
process?:
| T
| {
eyebrow?: T;
heading?: T;
description?: T;
scrollHint?: T;
progressLabel?: T;
steps?:
| T
| {
step?: T;
title?: T;
desc?: T;
date?: T;
icon?: T;
id?: T;
};
};
eligibility?:
| T
| {
eyebrow?: T;
heading?: T;
description?: T;
primaryCta?:
| T
| {
label?: T;
url?: T;
};
secondaryCta?:
| T
| {
label?: T;
url?: T;
};
criteria?:
| T
| {
num?: T;
title?: T;
body?: T;
icon?: T;
id?: T;
};
notes?:
| T
| {
title?: T;
body?: T;
icon?: T;
id?: T;
};
nudgeText?: T;
nudgeCta?:
| T
| {
label?: T;
url?: T;
};
};
evaluation?:
| T
| {
image?: T;
imageAlt?: T;
eyebrow?: T;
heading?: T;
body?: T;
link?:
| T
| {
label?: T;
url?: T;
};
criteria?:
| T
| {
label?: T;
desc?: T;
id?: T;
};
};
applicationWays?:
| T
| {
eyebrow?: T;
heading?: T;
description?: T;
recommendedLabel?: T;
institutions?:
| T
| {
text?: T;
id?: T;
};
ways?:
| T
| {
label?: T;
title?: T;
desc?: T;
icon?: T;
featured?: T;
listType?: T;
facts?:
| T
| {
label?: T;
desc?: T;
id?: T;
};
cta?:
| T
| {
label?: T;
url?: T;
};
id?: T;
};
};
datesBanner?:
| T
| {
heading?: T;
description?: T;
mobileItems?:
| T
| {
date?: T;
label?: T;
id?: T;
};
desktopItems?:
| T
| {
date?: T;
label?: T;
id?: T;
};
};
applicationForm?:
| T
| {
image?: T;
imageAlt?: T;
imageCaption?: T;
eyebrow?: T;
heading?: T;
description?: T;
facts?:
| T
| {
num?: T;
label?: T;
desc?: T;
id?: T;
};
formEyebrow?: T;
uploadCta?:
| T
| {
label?: T;
url?: T;
};
uploadPrompt?: T;
uploadFooterCta?:
| T
| {
label?: T;
url?: T;
};
};
form?:
| T
| {
stepCompleteLabel?: T;
backLabel?: T;
nextLabel?: T;
submitLabel?: T;
yesLabel?: T;
noLabel?: T;
requiredSuffix?: T;
validation?:
| T
| {
choose?: T;
required?: T;
invalidEmail?: T;
};
typeStep?:
| T
| {
eyebrow?: T;
heading?: T;
selfTitle?: T;
selfDesc?: T;
nominationTitle?: T;
nominationDesc?: T;
};
selfSteps?:
| T
| {
label?: T;
icon?: T;
id?: T;
};
nominationSteps?:
| T
| {
label?: T;
icon?: T;
id?: T;
};
employeeOptions?:
| T
| {
value?: T;
label?: T;
id?: T;
};
eligibility?:
| T
| {
allowedEmployeeValues?: T;
requiredBayernValue?: T;
eyebrow?: T;
heading?: T;
employeesLabel?: T;
bayernLabel?: T;
ownerLabel?: T;
ineligibleHeading?: T;
ineligibleBody?: T;
ineligibleContactPrefix?: T;
ineligibleContactEmail?: T;
};
selfContact?:
| T
| {
eyebrow?: T;
heading?: T;
companyLabel?: T;
companyPlaceholder?: T;
nameLabel?: T;
namePlaceholder?: T;
emailLabel?: T;
emailPlaceholder?: T;
phoneLabel?: T;
phonePlaceholder?: T;
footnote?: T;
};
selfSummary?:
| T
| {
eyebrow?: T;
heading?: T;
companyLabel?: T;
employeesLabel?: T;
locationLabel?: T;
locationPrefix?: T;
contactLabel?: T;
};
nominationCompany?:
| T
| {
eyebrow?: T;
heading?: T;
companyLabel?: T;
companyPlaceholder?: T;
industryLabel?: T;
industryPlaceholder?: T;
locationLabel?: T;
locationPlaceholder?: T;
};
nominationContact?:
| T
| {
eyebrow?: T;
heading?: T;
nameLabel?: T;
namePlaceholder?: T;
emailLabel?: T;
emailPlaceholder?: T;
relationshipLabel?: T;
relationshipPlaceholder?: T;
footnote?: T;
};
nominationSummary?:
| T
| {
eyebrow?: T;
heading?: T;
companyLabel?: T;
industryLabel?: T;
locationLabel?: T;
nominatedByLabel?: T;
emptyValue?: T;
};
success?:
| T
| {
selfHeading?: T;
nominationHeading?: T;
selfPrefix?: T;
selfMiddle?: T;
selfSuffix?: T;
nominationPrefix?: T;
nominationMiddle?: T;
nominationSuffix?: T;
};
};
};
meta?:
| T
| {