import type { ReactNode } from "react"; import { Breadcrumbs, type Crumb } from "@/components/Breadcrumbs"; import { OrganicBlob } from "@/components/OrganicBlob"; import { JsonLd, breadcrumbJsonLd } from "@/lib/seo/jsonld"; import { getSiteUrl } from "@/lib/seo/config"; type PageHeaderProps = { eyebrow?: string; title: string; lead?: ReactNode; crumbs?: Crumb[]; /** Varies the header's decorative blob so every interior page doesn't open with the exact same rose-top-right treatment. */ blobTone?: "rose" | "sage" | "cream" | "mauve"; blobPosition?: "top-right" | "top-left"; /** Shorter vertical padding for pages that don't need much ceremony (e.g. Kontakt). */ compact?: boolean; }; /** Renders the visual breadcrumb trail AND its matching BreadcrumbList JSON-LD from the same `crumbs` - every page that already passes `crumbs` gets structured breadcrumb data for free. */ export async function PageHeader({ eyebrow, title, lead, crumbs, blobTone = "rose", blobPosition = "top-right", compact = false, }: PageHeaderProps) { const breadcrumbData = crumbs?.length ? await (async () => { const siteUrl = await getSiteUrl(); const items = [ { name: "Startseite", url: siteUrl }, ...crumbs.map((crumb) => ({ name: crumb.title, url: crumb.href ? `${siteUrl}${crumb.href}` : undefined })), ]; return breadcrumbJsonLd(items); })() : null; const blobPositionClass = blobPosition === "top-left" ? "-left-20 -top-20" : "-right-20 -top-20"; return (
{breadcrumbData && } {crumbs && } {eyebrow && (

{eyebrow}

)}

{title}

{lead && (
{lead}
)}
); }