feat: add new contact form, hero, features, and richtext blocks; implement scroll-reveal action and update styles

- Introduced ContactFormBlock, FeaturesBlock, HeroBlock, and RichtextBlock components.
- Implemented a scroll-reveal action for animations on element visibility.
- Enhanced CSS styles for better theming and prose formatting.
- Added localization support for new components and updated existing translations.
- Created e2e tests for demo pages including contact form validation and navigation.
- Added a video tour showcasing the demo pages and interactions.
This commit is contained in:
2026-02-26 03:54:07 +00:00
parent e8fd38e98a
commit 40ffa8207e
27 changed files with 2009 additions and 98 deletions

171
api/collections/content.yml Normal file
View File

@@ -0,0 +1,171 @@
########################################################################
# Content collection — CMS-managed pages with pagebuilder blocks
########################################################################
name: content
meta:
label: { de: "Inhalte", en: "Content" }
muiIcon: article
rowIdentTpl: { twig: "{{ name }}" }
views:
- type: simpleList
mediaQuery: "(max-width: 600px)"
primaryText: name
secondaryText: lang
tertiaryText: path
- type: table
columns:
- name
- source: lang
filter: true
- source: type
filter: true
- source: path
- source: active
filter: true
permissions:
public:
methods:
get: true
user:
methods:
get: true
post: true
put: true
delete: true
fields:
- name: active
type: boolean
meta:
label: { de: "Aktiv", en: "Active" }
- name: type
type: string
meta:
label: { de: "Typ", en: "Type" }
- name: lang
type: string
meta:
label: { de: "Sprache", en: "Language" }
- name: translationKey
type: string
meta:
label: { de: "Übersetzungsschlüssel", en: "Translation Key" }
- name: name
type: string
meta:
label: { de: "Name", en: "Name" }
- name: path
type: string
meta:
label: { de: "Pfad", en: "Path" }
- name: alternativePaths
type: object[]
meta:
label: { de: "Alternative Pfade", en: "Alternative Paths" }
subFields:
- name: path
type: string
- name: thumbnail
type: string
meta:
label: { de: "Vorschaubild", en: "Thumbnail" }
- name: teaserText
type: string
meta:
label: { de: "Teasertext", en: "Teaser Text" }
- name: blocks
type: object[]
meta:
label: { de: "Inhaltsblöcke", en: "Content Blocks" }
subFields:
- name: hide
type: boolean
- name: type
type: string
- name: headline
type: string
- name: headlineH1
type: boolean
- name: subline
type: string
- name: tagline
type: string
- name: anchorId
type: string
- name: containerWidth
type: string
- name: background
type: object
subFields:
- name: color
type: string
- name: image
type: string
- name: padding
type: object
subFields:
- name: top
type: string
- name: bottom
type: string
- name: callToAction
type: object
subFields:
- name: buttonText
type: string
- name: buttonLink
type: string
- name: buttonTarget
type: string
- name: heroImage
type: object
subFields:
- name: image
type: string
- name: text
type: string
- name: imagePosition
type: string
- name: imageRounded
type: string
- name: image
type: string
- name: accordionItems
type: object[]
subFields:
- name: question
type: string
- name: answer
type: string
- name: open
type: boolean
- name: imageGallery
type: object
subFields:
- name: images
type: object[]
subFields:
- name: image
type: string
- name: caption
type: string
- name: showCaption
type: boolean
- name: showImageCaption
type: boolean
- name: imageCaption
type: string
- name: meta
type: object
meta:
label: { de: "SEO", en: "SEO" }
subFields:
- name: title
type: string
- name: description
type: string
- name: keywords
type: string

View File

@@ -0,0 +1,68 @@
########################################################################
# Navigation collection — header and footer navigation entries
########################################################################
name: navigation
meta:
label: { de: "Navigation", en: "Navigation" }
muiIcon: menu
rowIdentTpl: { twig: "{{ type }} ({{ language }})" }
views:
- type: simpleList
mediaQuery: "(max-width: 600px)"
primaryText: type
secondaryText: language
- type: table
columns:
- source: type
filter: true
- source: language
filter: true
permissions:
public:
methods:
get: true
user:
methods:
get: true
post: true
put: true
delete: true
fields:
- name: language
type: string
meta:
label: { de: "Sprache", en: "Language" }
- name: type
type: string
meta:
label: { de: "Typ", en: "Type" }
helperText: { de: "header oder footer", en: "header or footer" }
- name: elements
type: object[]
meta:
label: { de: "Elemente", en: "Elements" }
subFields:
- name: name
type: string
meta:
label: { de: "Bezeichnung", en: "Label" }
- name: page
type: string
meta:
label: { de: "Seite (Content-ID)", en: "Page (Content ID)" }
- name: external
type: boolean
meta:
label: { de: "Externer Link", en: "External Link" }
- name: externalUrl
type: string
meta:
label: { de: "Externe URL", en: "External URL" }
- name: hash
type: string
meta:
label: { de: "Anker", en: "Anchor" }

View File

@@ -9,6 +9,8 @@ meta:
"<link rel='stylesheet' href='" + $projectBase + "_/assets/fonts/fonts.css?t=" + $project?.updateTime + "'>"
collections:
- !include collections/content.yml
- !include collections/navigation.yml
- !include collections/ssr.yml
assets: