feat: enhance accessibility with skip to main content button and improve navigation handling

🔧 fix: update navigation href resolution to include localized paths

🆕 feat: add new FeatureIcon component for feature boxes

🎨 style: improve styling for prose elements in richtext blocks

🛠️ refactor: streamline medialib image loading and caching logic

📦 chore: update mock data handling to support new medialib entries

🔄 chore: synchronize i18n initialization and locale management

📝 docs: update video tour descriptions to reflect recent changes
This commit is contained in:
2026-05-12 13:55:32 +00:00
parent 8fb26fdeba
commit e84b87ed16
41 changed files with 1523 additions and 338 deletions
+30 -27
View File
@@ -50,18 +50,39 @@ interface FileField {
size: number
}
type LocalizedText = {
[lang: string]: string | undefined
}
interface MedialibEntry {
id?: string
_id?: string
file?: {
src?: string
type?: string
}
alt?: string
title?: string
alt?: string | LocalizedText
description?: string
[key: string]: unknown
}
interface LookupContainer<T> {
_lookup?: Record<string, T | null>
}
interface ContentHeroImage extends LookupContainer<MedialibEntry> {
image?: string
}
interface ContentFeatureBoxEntry {
icon?: "lightning" | "palette" | "database" | "globe" | "monitor" | "flask"
title?: string
text?: string
}
/** Pagebuilder: Content Block Entry */
interface ContentBlockEntry {
interface ContentBlockEntry extends LookupContainer<MedialibEntry> {
hide?: boolean
headline?: string
headlineH1?: boolean
@@ -69,10 +90,6 @@ interface ContentBlockEntry {
tagline?: string
anchorId?: string
containerWidth?: "" | "wide" | "full"
background?: {
color?: string
image?: string
}
padding?: {
top?: string
bottom?: string
@@ -83,41 +100,25 @@ interface ContentBlockEntry {
buttonLink?: string
buttonTarget?: string
}
heroImage?: {
image?: string
/** External image URL (e.g. Unsplash) — used when no medialib ID is available */
externalUrl?: string
}
heroImage?: ContentHeroImage
featureBoxes?: ContentFeatureBoxEntry[]
// richtext fields
text?: string
imagePosition?: "none" | "left" | "right"
imageRounded?: string
image?: string
/** External image URL for richtext/generic blocks (e.g. Unsplash) */
externalImageUrl?: string
// accordion fields
accordionItems?: {
question?: string
answer?: string
open?: boolean
}[]
// imageGallery fields
imageGallery?: {
images?: {
image?: string
caption?: string
showCaption?: boolean
}[]
}
// richtext caption fields
showImageCaption?: boolean
imageCaption?: string
}
/** Content Entry from the CMS */
interface ContentEntry {
id?: string
_id?: string
_lookup?: Record<string, MedialibEntry | MedialibEntry[] | null>
active?: boolean
publication?: {
from?: string | Date
@@ -129,13 +130,12 @@ interface ContentEntry {
name?: string
path?: string
alternativePaths?: { path?: string }[]
thumbnail?: string
teaserText?: string
blocks?: ContentBlockEntry[]
meta?: {
title?: string
description?: string
keywords?: string
keywords?: string[]
}
}
@@ -146,6 +146,9 @@ interface NavigationElement {
page?: string
hash?: string
externalUrl?: string
_lookup?: {
page?: ContentEntry | null
}
}
/** Navigation entry from the CMS */