import { notFound } from "next/navigation"; import { leistungen } from "../data"; import Image from "next/image"; import Link from "next/link"; import { ArrowRightIcon } from "@phosphor-icons/react/dist/ssr"; import { Slider } from "@/components/slider/Slider"; import styles from "./page.module.css"; import MaintenanceCleaningSection from "@/components/MaintenanceCleaningSection"; import QualityClaimSection from "@/components/QualityClaimSection"; import ConceptSection from "@/components/ConceptSection"; import ProcessSection from "@/components/ProcessSection"; import FaqSection from "@/components/faq/FaqSection"; import { leistungenFaq } from "@/components/faq/faqData"; import ContactCtaSection from "@/components/contact/ContactCtaSection"; import type { Metadata } from "next"; const siteUrl = "https://basiclean.de"; export async function generateMetadata({ params, }: { params: Promise<{ slug: string }>; }): Promise { const { slug } = await params; const leistung = leistungen.find((item) => item.slug === slug); if (!leistung) { return { title: "Nicht gefunden", robots: { index: false, follow: false }, }; } const hasCustomSeo = Boolean(leistung.metaTitle); // Eigener metaTitle vorhanden -> Suffix "| Basiclean" unterdrücken (title.absolute). // Kein metaTitle gesetzt -> Fallback auf titleMain, Template aus dem Layout greift normal. const title = hasCustomSeo ? { absolute: leistung.metaTitle as string } : leistung.titleMain; const description = leistung.metaDescription ?? leistung.text; const url = `${siteUrl}/leistungen/${leistung.slug}`; const ogImageUrl = leistung.ogImage ?? leistung.image; // Für OpenGraph/Twitter braucht es einen reinen String-Titel (kein title.absolute-Objekt). const flatTitle = hasCustomSeo ? (leistung.metaTitle as string) : leistung.titleMain; return { title, description, alternates: { canonical: url, }, openGraph: { type: "website", siteName: "Basiclean", locale: "de_DE", title: flatTitle, description, url, images: [ { url: ogImageUrl, alt: leistung.imageAlt, width: 1200, height: 628, }, ], }, twitter: { card: "summary_large_image", site: "@basiclean", title: flatTitle, description, images: [{ url: ogImageUrl, alt: leistung.imageAlt }], }, }; } export function generateStaticParams() { return leistungen.map((item) => ({ slug: item.slug, })); } export default async function LeistungDetail({ params, }: { params: Promise<{ slug: string }>; }) { const { slug } = await params; const leistung = leistungen.find((item) => item.slug === slug); const faqEntry = leistungenFaq.find((item) => item.slug === slug); if (!leistung) { notFound(); } return (

{leistung.titleMain} {leistung.titleSub}

{leistung.imageAlt}

{leistung.text}

Jetzt Angebot anfragen
{leistung.slides.length > 0 && (

{leistung.titleSlides}

)}
); }