diff --git a/app/components/PageBlocks.tsx b/app/components/PageBlocks.tsx
index 3e8611d..0df01c2 100644
--- a/app/components/PageBlocks.tsx
+++ b/app/components/PageBlocks.tsx
@@ -5,7 +5,7 @@ import { getTestimonials } from "../lib/payload";
import { RichText } from "./RichText";
import { Quote } from "./Quote";
import { StepArrow } from "./StepArrow";
-import { STEP_ICONS } from "./icons/StepIcons";
+import { STEP_ICONS, SYMBOLIC_ICONS } from "./icons/StepIcons";
import { TestimonialsGrid } from "./TestimonialsGrid";
// Renders a Payload Pages document's `layout` blocks field — structurally
@@ -42,6 +42,11 @@ export function renderPageBlockSync(block: PageBlock): React.ReactNode {
case "quote":
return {block.text}
;
+ case "icon": {
+ const SymbolIcon = SYMBOLIC_ICONS[block.icon];
+ return SymbolIcon ?
{SymbolIcon()}
: null;
+ }
+
case "image":
if (!block.image) return null;
return (
@@ -114,6 +119,7 @@ export function renderPageBlockSync(block: PageBlock): React.ReactNode {
{item.title}
+ {item.subtitle &&
{item.subtitle}
}
{item.description}
,
diff --git a/app/components/icons/StepIcons.tsx b/app/components/icons/StepIcons.tsx
index 3ff81b4..7a5fd24 100644
--- a/app/components/icons/StepIcons.tsx
+++ b/app/components/icons/StepIcons.tsx
@@ -131,3 +131,29 @@ export const STEP_ICONS: Record React.ReactNode> = {
trendingUp: IconTrendingUp,
shield: IconShield,
};
+
+// Same symbolic clock icon /lebensuhr uses above its "24 Stunden" heading
+// — purely decorative (no numbers/data), unlike the STEP_ICONS above which
+// always sit inside an icon-above-text row. Keys MUST match the Payload
+// IconBlock's `icon` select field options (docker/payload/src/blocks/
+// IconBlock.ts) exactly.
+function IconClockSymbol() {
+ return (
+
+ );
+}
+
+export const SYMBOLIC_ICONS: Record React.ReactNode> = {
+ clockSymbol: IconClockSymbol,
+};
diff --git a/app/lib/payload.ts b/app/lib/payload.ts
index b5258e4..ff6f1e8 100644
--- a/app/lib/payload.ts
+++ b/app/lib/payload.ts
@@ -1294,9 +1294,10 @@ export async function getTrackingCodes(): Promise {
export type PageBlock =
| { blockType: "richTextSection"; id: string; content: unknown }
- | { blockType: "stepRow"; id: string; items: { id: string; icon: string; title: string; description: string }[] }
+ | { blockType: "stepRow"; id: string; items: { id: string; icon: string; title: string; subtitle: string | null; description: string }[] }
| { blockType: "quote"; id: string; text: string; label: string | null }
| { blockType: "image"; id: string; image: string | null; caption: string | null }
+ | { blockType: "icon"; id: string; icon: string }
| { blockType: "pillList"; id: string; items: { id: string; label: string }[] }
| { blockType: "checklistImage"; id: string; image: string | null; items: { id: string; text: string }[] }
| { blockType: "table"; id: string; labelHeader: string; valueHeader: string; rows: { id: string; label: string; value: string }[] }
@@ -1317,9 +1318,10 @@ type PayloadPageImageField = { url?: string | null } | number | null;
type PayloadPageBlock =
| { blockType: "richTextSection"; id: string; content: unknown }
- | { blockType: "stepRow"; id: string; items: { id: string; icon: string; title: string; description: string }[] }
+ | { blockType: "stepRow"; id: string; items: { id: string; icon: string; title: string; subtitle?: string | null; description: string }[] }
| { blockType: "quote"; id: string; text: string; label?: string | null }
| { blockType: "image"; id: string; image: PayloadPageImageField; caption?: string | null }
+ | { blockType: "icon"; id: string; icon: string }
| { blockType: "pillList"; id: string; items: { id: string; label: string }[] }
| { blockType: "checklistImage"; id: string; image: PayloadPageImageField; items: { id: string; text: string }[] }
| { blockType: "table"; id: string; labelHeader: string; valueHeader: string; rows: { id: string; label: string; value: string }[] }
@@ -1350,6 +1352,12 @@ function mapPayloadPageBlock(block: PayloadPageBlock): PageBlock {
return { blockType: "quote", id: block.id, text: block.text, label: block.label ?? null };
case "ctaCard":
return { blockType: "ctaCard", id: block.id, eyebrow: block.eyebrow, title: block.title, description: block.description ?? null, href: block.href };
+ case "stepRow":
+ return {
+ blockType: "stepRow",
+ id: block.id,
+ items: block.items.map((item) => ({ ...item, subtitle: item.subtitle ?? null })),
+ };
default:
return block;
}