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