diff --git a/api/collections/content.yml b/api/collections/content.yml
index c1a1c30..a23d5a4 100644
--- a/api/collections/content.yml
+++ b/api/collections/content.yml
@@ -138,82 +138,6 @@ meta:
filter:
type: block
- - name: helpcenterQuestion
- label:
- de: HC Fragen
- en: HC Questions
- muiIcon: book-open-page-variant
- defaultSort:
- field: insertTime
- order: DESC
- setDefault:
- field: type
- value: page
- views:
- - type: table
- columns:
- - source: active
- name: Aktiv
- filter: true
- - source: name
- name: Name
- filter: true
- - source: path
- name: Pfad
- filter: true
- filter:
- type: helpcenterQuestion
- - name: Blog
- label:
- de: Blog
- en: Blog
- muiIcon: book-open-page-variant
- defaultSort:
- field: insertTime
- order: DESC
- setDefault:
- field: type
- value: page
- views:
- - type: table
- columns:
- - source: active
- name: Aktiv
- filter: true
- - source: name
- name: Name
- filter: true
- - source: path
- name: Pfad
- filter: true
- filter:
- type: blog
-
- - name: product
- label:
- de: Produkte
- en: Products
- muiIcon: book-open-page-variant
- defaultSort:
- field: insertTime
- order: DESC
- setDefault:
- field: type
- value: product
- views:
- - type: table
- columns:
- - source: active
- name: Aktiv
- filter: true
- - source: name
- name: Name
- filter: true
- - source: path
- name: Pfad
- filter: true
- filter:
- type: product
permissions:
public:
methods:
@@ -279,21 +203,7 @@ fields:
default: "col-6"
small: "col-12"
large: "col-6"
- - type: string
- name: question
- index: [single]
- meta:
- label:
- de: Frage
- en: Question
- dependsOn:
- eval: $.type == "helpcenterQuestion"
- containerProps:
- layout:
- size:
- default: "col-6"
- small: "col-12"
- large: "col-6"
+
- type: string
name: path
index: [single]
@@ -305,7 +215,7 @@ fields:
de: "Ein Pfad sollte mit einem / starten und ohne enden."
en: "A path should start with a / and end without one."
dependsOn:
- eval: $.type == "page" || $.type == "helpcenterQuestion"
+ eval: $.type == "page"
containerProps:
layout:
size:
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index 7f2986b..f4f6bb7 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -2,11 +2,11 @@
import { onMount } from "svelte"
import Header from "./lib/components/header/Header.svelte"
import Footer from "./lib/components/Footer.svelte"
- import Content from "./routes/Content.svelte"
import Notifications from "./lib/components/widgets/Notifications.svelte"
import SSRSkip from "./lib/components/SSRSkip.svelte"
import { baseURL } from "./config"
import { isMobile, location, openModal } from "./lib/store"
+ import StaticHomepage from "./routes/StaticHomepage.svelte"
export let url = ""
@@ -99,7 +99,7 @@
-
+
diff --git a/frontend/src/config.ts b/frontend/src/config.ts
index 3dc69cb..4e47029 100644
--- a/frontend/src/config.ts
+++ b/frontend/src/config.ts
@@ -4,7 +4,7 @@ export const baseURL = `${protocol}//${baseDomain}`
export const apiBaseURL = "/api/"
export const websiteName = "Kontextwerk"
-export const companyName = "Kontextwerk GmbH"
+export const companyName = "Kontextwerk"
export const email = "hello@kontextwerk.de"
export const streetAddress = "Gertrudenstraße 3"
export const localityAddress = "Hamburg"
diff --git a/frontend/src/lib/components/pagebuilder/Breadcrumbs.svelte b/frontend/src/lib/components/pagebuilder/Breadcrumbs.svelte
new file mode 100644
index 0000000..3f61ce8
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/Breadcrumbs.svelte
@@ -0,0 +1,36 @@
+
+
+
+{#if paths.length}
+
+
+
+{/if}
diff --git a/frontend/src/lib/components/pagebuilder/ContentBlock.svelte b/frontend/src/lib/components/pagebuilder/ContentBlock.svelte
new file mode 100644
index 0000000..c90efb7
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/ContentBlock.svelte
@@ -0,0 +1,301 @@
+
+
+
+ {#if block.anchorId}
+
+
+ {/if}
+
+ {#if block.background?.image}
+
+
+
+ {#if block?.background?.overlay}
+
+ {/if}
+
+
+ {/if}
+
+
+ {#if block.headline || block.subline}
+
+
+
+ {#if block.headline}
+ {#if block.headlineH1}
+
{block.headline}
+ {:else}
+ {block.headline}
+ {/if}
+ {/if}
+ {#if block.subline}
+ {block.subline}
+ {/if}
+
+ {#if block?.headlineLink}
+
+
+ {block.headlineLinkText}
+
+
+ {/if}
+
+ {/if}
+
+
+
+ {#each block.callToActionButtons || [] as button}
+
+ {/each}
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/DefaultImage.svelte b/frontend/src/lib/components/pagebuilder/DefaultImage.svelte
new file mode 100644
index 0000000..c67a993
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/DefaultImage.svelte
@@ -0,0 +1,126 @@
+
+
+{#if images.length > 1}
+
+
+ {#each images as image (image)}
+
+
+
+
+
+ {/each}
+
+
+{:else if images[0]}
+
+
+
+{/if}
+
+
diff --git a/frontend/src/lib/components/pagebuilder/Loader.svelte b/frontend/src/lib/components/pagebuilder/Loader.svelte
new file mode 100644
index 0000000..81cd48c
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/Loader.svelte
@@ -0,0 +1,36 @@
+
+
+
+ {#if type == "bar"}
+
+ {:else}
+
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/SEO/Index.svelte b/frontend/src/lib/components/pagebuilder/SEO/Index.svelte
new file mode 100644
index 0000000..756747f
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/SEO/Index.svelte
@@ -0,0 +1,84 @@
+
+
+
+ {pageTitle}
+
+
+
+
+
+
+
+ {#if noIndex || active === false}
+
+ {:else}
+
+ {/if}
+
+
+{#if product}
+
+{/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/SEO/OpenGraph.svelte b/frontend/src/lib/components/pagebuilder/SEO/OpenGraph.svelte
new file mode 100644
index 0000000..c97c165
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/SEO/OpenGraph.svelte
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+ {#if product}
+
+
+
+
+
+
+
+
+
+
+ {:else}
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+ {#if article}
+
+
+
+
+ {/if}
+
diff --git a/frontend/src/lib/components/pagebuilder/SEO/Product.svelte b/frontend/src/lib/components/pagebuilder/SEO/Product.svelte
new file mode 100644
index 0000000..40d259b
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/SEO/Product.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/SEO/SchemaORG.svelte b/frontend/src/lib/components/pagebuilder/SEO/SchemaORG.svelte
new file mode 100644
index 0000000..de26676
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/SEO/SchemaORG.svelte
@@ -0,0 +1,224 @@
+
+
+
+ {@html jsonLdScript}
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/ChapterPreview.svelte b/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/ChapterPreview.svelte
new file mode 100644
index 0000000..ea31896
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/ChapterPreview.svelte
@@ -0,0 +1,105 @@
+
+
+
+
+ {#each $selfImprovementChapters as chapter, i}
+
+
+
+ {/each}
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/Item.svelte b/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/Item.svelte
new file mode 100644
index 0000000..bdcd610
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/ChapterPreview/Item.svelte
@@ -0,0 +1,350 @@
+
+
+
+ {#if chapter.locked}
+
+ {/if}
+
+
+
+
+ {chapter.alias}
+
+
+ {chapter.title}
+
+
+ {chapter.shortDescription}
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/Columns.svelte b/frontend/src/lib/components/pagebuilder/blocks/Columns.svelte
new file mode 100644
index 0000000..1bd88a1
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/Columns.svelte
@@ -0,0 +1,30 @@
+
+
+
+ {#each block.columns || [] as column}
+
+ {/each}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/ColumnsColumn.svelte b/frontend/src/lib/components/pagebuilder/blocks/ColumnsColumn.svelte
new file mode 100644
index 0000000..4800fa8
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/ColumnsColumn.svelte
@@ -0,0 +1,72 @@
+
+
+
+ {#if column.type == "text"}
+
+ {:else if column.type == "image"}
+
+ {:else if column.type == "cta"}
+
+ {:else if column.type == "chapterDescription"}
+
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/GoogleMaps.svelte b/frontend/src/lib/components/pagebuilder/blocks/GoogleMaps.svelte
new file mode 100644
index 0000000..4146be8
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/GoogleMaps.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/HomepageRow.svelte b/frontend/src/lib/components/pagebuilder/blocks/HomepageRow.svelte
new file mode 100644
index 0000000..39ae879
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/HomepageRow.svelte
@@ -0,0 +1,92 @@
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/ImproveYourselfDescription.svelte b/frontend/src/lib/components/pagebuilder/blocks/ImproveYourselfDescription.svelte
new file mode 100644
index 0000000..b331764
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/ImproveYourselfDescription.svelte
@@ -0,0 +1,184 @@
+
+
+
+
+
+
Improve Yourself
+
{@html des.upperDescription}
+
+
+
+
+
+
+ Fitness
+
+
+
+
+
+
+ Entspannung
+
+
+
+
+
+
+ Ernährung
+
+
+
+
+
+
+ Weiterbildung
+
+
+
{@html des.lowerDescription}
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/NewsletterRow.svelte b/frontend/src/lib/components/pagebuilder/blocks/NewsletterRow.svelte
new file mode 100644
index 0000000..e946999
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/NewsletterRow.svelte
@@ -0,0 +1,277 @@
+
+
+
+
+
+ {#if mobile}
+
+ {:else}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/if}
+
+
+
+
+
Newsletter
+
Bleib Krass
+
+ {#if emailIsSubscribed}
+
Du wirst jetzt über die neuesten Styles informiert!
+ {:else}
+
Wir informieren Dich über die neuesten Styles, wenn Du es willst!
+
+ {/if}
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/PredefinedBlock.svelte b/frontend/src/lib/components/pagebuilder/blocks/PredefinedBlock.svelte
new file mode 100644
index 0000000..27602ea
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/PredefinedBlock.svelte
@@ -0,0 +1,12 @@
+
+
+{#if block.predefinedBlock?.id}
+
+{/if}
diff --git a/frontend/src/lib/components/pagebuilder/blocks/RatingPreview/PreviewCard.svelte b/frontend/src/lib/components/pagebuilder/blocks/RatingPreview/PreviewCard.svelte
new file mode 100644
index 0000000..0b57eca
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/RatingPreview/PreviewCard.svelte
@@ -0,0 +1,261 @@
+
+
+
+
+{#if ratings.length}
+
+{/if}
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/SplittedHomepage.svelte b/frontend/src/lib/components/pagebuilder/blocks/SplittedHomepage.svelte
new file mode 100644
index 0000000..185e741
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/SplittedHomepage.svelte
@@ -0,0 +1,203 @@
+
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/Step.svelte b/frontend/src/lib/components/pagebuilder/blocks/Step.svelte
new file mode 100644
index 0000000..09a91bc
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/Step.svelte
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+ {i + 1}
+
+
+
+
+
+ {item.title}
+
+
+
+
+
+
+
+
+ {#each item.descriptions as description}
+
+ {description}
+
+ {/each}
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/Steps.svelte b/frontend/src/lib/components/pagebuilder/blocks/Steps.svelte
new file mode 100644
index 0000000..591c327
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/Steps.svelte
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+{#if block.steps?.horizontal}
+
+{:else}
+
+ {#each block.steps.items as item, i}
+
+ {/each}
+
+{/if}
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/columns/CTA.svelte b/frontend/src/lib/components/pagebuilder/blocks/columns/CTA.svelte
new file mode 100644
index 0000000..fa610a7
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/columns/CTA.svelte
@@ -0,0 +1,52 @@
+
+
+
+ {#if cta.upperHeadline}
+
+ {cta.upperHeadline}
+
+ {/if}
+
+
+ {cta.whiteHeadline}
+ {#if cta.headlineArrangement !== "row"} {/if} {cta.redHeadline}
+
+
+
{cta.description}
+
+ {#each cta.callToActionButtons as button}
+
+ {/each}
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/columns/ChapterDescription.svelte b/frontend/src/lib/components/pagebuilder/blocks/columns/ChapterDescription.svelte
new file mode 100644
index 0000000..2a8f56c
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/columns/ChapterDescription.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+ {title}
+
+
+ {@html description}
+
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/columns/Text.svelte b/frontend/src/lib/components/pagebuilder/blocks/columns/Text.svelte
new file mode 100644
index 0000000..719ba0b
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/columns/Text.svelte
@@ -0,0 +1,13 @@
+
+
+{@html column.text}
+{#if column.links?.length}
+
+
+
+
+{/if}
diff --git a/frontend/src/lib/components/pagebuilder/blocks/form/Calendar.svelte b/frontend/src/lib/components/pagebuilder/blocks/form/Calendar.svelte
new file mode 100644
index 0000000..43cc2b3
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/form/Calendar.svelte
@@ -0,0 +1,193 @@
+
+
+
+ {placeholder}
+ {#if editMode}
+
+ {#if dateValue}
+
+ {new Date(dateValue).toLocaleDateString("de-DE")}
+
+ {:else}
+
{placeholder}
+ {/if}
+
+
{
+ hideAllModals()
+ if (dateValue) dateValue = null
+ else showDatepicker()
+ }}"
+ >
+ {#if !dateValue}
+
+ {:else}
+
+ {/if}
+
+
{:else if !editMode}
+ {#if dateValue}
+
+ {new Date(dateValue).toLocaleDateString("de-DE")}
+
+ {:else}
+ -
+ {/if}
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/form/FileInput.svelte b/frontend/src/lib/components/pagebuilder/blocks/form/FileInput.svelte
new file mode 100644
index 0000000..0d66a7a
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/form/FileInput.svelte
@@ -0,0 +1,342 @@
+
+
+
+
+
+ {placeholder}
+
+ {#if helperText}
+
+
+
+ {/if}
+
+
+
+
+
+
+{#if showApproveModal}
+
+ Dateiformat Warnung
+
+ Deine Datei wird von einigen Browsern, insbesondere von Google Chrome, nur eingeschränkt unterstützt. Wenn
+ du die Datei dennoch hochladen möchtest, klicke auf "Fortfahren". Andernfalls empfehlen wir, das Video
+ zunächst in eine MP4-Datei zu konvertieren. Dafür stehen zahlreiche kostenlose Online-Dienste zur Verfügung.
+
+
+
+{/if}
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/form/Input.svelte b/frontend/src/lib/components/pagebuilder/blocks/form/Input.svelte
new file mode 100644
index 0000000..0869632
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/form/Input.svelte
@@ -0,0 +1,143 @@
+
+
+
+ {#if type !== "checkbox"}
+ {placeholder}
+ {/if}
+ {#if type == "checkbox"}
+
+
+ {/if}
+ {#if type == "password"}
+
+ {/if}
+ {#if type == "text"}
+
+ {/if}
+ {#if type == "textarea"}
+
+ {/if}
+ {#if type == "number"}
+
+ {/if}
+ {#if type == "noInput"}
+
+ {#if id.includes("pass")}
+ ************
+ {:else}
+ {Boolean(value) ? value : "-"}
+ {/if}
+
+ {/if}
+ {#if type == "select"}
+
+ {#each options as option, index}
+
+ {option.name}
+
+ {/each}
+
+ {/if}
+ {#if type !== "checkbox"}
+
+ {/if}
+ {#if helperText}
+
+
+
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/form/Select.svelte b/frontend/src/lib/components/pagebuilder/blocks/form/Select.svelte
new file mode 100644
index 0000000..05d8381
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/form/Select.svelte
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+ {
+ focused = true
+ }}"
+>
+ {placeholder}
+ {#if editMode}
+
+ {:else if !editMode}
+ {selectedOption?.label || "-"}
+ {/if}
+
+
+
diff --git a/frontend/src/lib/components/pagebuilder/blocks/index.ts b/frontend/src/lib/components/pagebuilder/blocks/index.ts
new file mode 100644
index 0000000..f4ed6ee
--- /dev/null
+++ b/frontend/src/lib/components/pagebuilder/blocks/index.ts
@@ -0,0 +1,66 @@
+import type { SvelteComponent } from "svelte"
+import PredefinedBlock from "./PredefinedBlock.svelte"
+import Columns from "./Columns.svelte"
+import ProductListPreviewWidget from "../product/ProductListPreviewWidget.svelte"
+import NewsletterRow from "./NewsletterRow.svelte"
+import SplittedHomepage from "./SplittedHomepage.svelte"
+import ImproveYourselfDescription from "./ImproveYourselfDescription.svelte"
+import HomepageRow from "./HomepageRow.svelte"
+import ChapterPreview from "./ChapterPreview/ChapterPreview.svelte"
+import PreviewCard from "./RatingPreview/PreviewCard.svelte"
+import Steps from "./Steps.svelte"
+
+const blocks: {
+ [key: string]: {
+ sectionClass: string
+ component: typeof SvelteComponent<{ block?: ContentBlock }>
+ }
+} = {
+ default: {
+ sectionClass: "",
+ component: Columns,
+ },
+ columns: {
+ sectionClass: "",
+ component: Columns,
+ },
+
+ predefinedBlock: {
+ sectionClass: "predefined-block",
+ component: PredefinedBlock,
+ },
+ productSlider: {
+ sectionClass: "",
+ component: ProductListPreviewWidget,
+ },
+ NewsletterRow: {
+ sectionClass: "newsletter-row",
+ component: NewsletterRow,
+ },
+ splittedHomepage: {
+ sectionClass: "",
+ component: SplittedHomepage,
+ },
+ improveYourselfDescription: {
+ sectionClass: "ImproveYourselfDescription",
+ component: ImproveYourselfDescription,
+ },
+ homepage: {
+ sectionClass: "homepageRow",
+ component: HomepageRow,
+ },
+ selfImprovementChapterPreview: {
+ sectionClass: "chapterPreview",
+ component: ChapterPreview,
+ },
+ ratingPreview: {
+ sectionClass: "ratingPreview",
+ component: PreviewCard,
+ },
+ stepNr: {
+ sectionClass: "stepNr",
+ component: Steps,
+ },
+}
+
+export default blocks
diff --git a/frontend/src/routes/Content.svelte b/frontend/src/routes/Content.svelte
index 546f7ed..8acbc8e 100644
--- a/frontend/src/routes/Content.svelte
+++ b/frontend/src/routes/Content.svelte
@@ -36,31 +36,7 @@
{#if loading}
-
- Inhalt wird geladen …
-
-{:else if errorMessage}
-
-{:else if contentEntry}
-
-
- {#if contentEntry.blocks?.length}
-
- Struktur
- {JSON.stringify(contentEntry.blocks, null, 2)}
-
- {:else}
- Für diesen Inhalt sind noch keine Bausteine definiert.
- {/if}
-
{:else}
{/if}
diff --git a/frontend/src/routes/StaticHomepage.svelte b/frontend/src/routes/StaticHomepage.svelte
new file mode 100644
index 0000000..e69de29