885389b300
Pages/getPageBySlug/mapPayloadPage in payload.ts follow the exact getPostBySlug/mapPayloadPost pattern. PageBlocks.tsx renders a Pages doc's `layout` field, reusing existing components (RichText, StepArrow, STEP_ICONS, TestimonialsGrid) rather than reinventing per- block styling — matches what /lebensuhr, /3x3-system, and /7-tage-klarheits-check already hand-built. LivePageContent.tsx mirrors LivePostContent.tsx's live-preview pattern, using a synchronous subset of the block renderer (testimonialsRef needs an async fetch a client component can't perform inline, so it's skipped in preview only — same "editable subset" scope-cut LivePostContent.tsx already makes). buildWebPageSchema in structuredData.ts is the generic JSON-LD fallback for content types with no bespoke schema (Article/ Product don't fit a page-builder page). Verified end-to-end: inserted a real Pages test document (SQL, since no admin auth available here) covering richTextSection/quote/ctaCard, confirmed /[slug] renders it correctly, confirmed notFound() after deleting it, then cleaned up the test row.
16 lines
694 B
TypeScript
16 lines
694 B
TypeScript
// Same visual language as RichText.tsx's Quote converter (Caveat script +
|
|
// brand divider) — extracted here so PageBlocks.tsx (and any future hand-
|
|
// written page) can reuse it instead of each page defining its own copy,
|
|
// which is what /lebensuhr, /3x3-system, and /ueber-mich each did before
|
|
// this existed.
|
|
export function Quote({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<div className="relative flex items-start gap-6 w-full my-2">
|
|
<div className="w-px self-stretch bg-brand shrink-0" />
|
|
<p className="text-text-primary text-[1.75rem] leading-[1.1] flex-1" style={{ fontFamily: "var(--font-caveat)" }}>
|
|
{children}
|
|
</p>
|
|
</div>
|
|
);
|
|
}
|