import { Container, SectionHeading, LinkButton } from "@/components/ui"; import { ProcessPath } from "@/components/process-path"; import { HoneycombPattern, HexMark } from "@/components/honeycomb"; import { ScrollReveal } from "@/components/scroll-reveal"; import { ContentImage } from "@/components/content-image"; import { StarRating } from "@/components/star-rating"; import { fetchGoogleReviews } from "@/lib/google-reviews"; import { getLocale } from "@/i18n/locale"; import { getDictionary } from "@/i18n/get-dictionary"; import { getContentValues, parseListTitled, parseListNumbered } from "@/lib/content"; export async function ProcessTimeline() { const locale = await getLocale(); const t = getDictionary(locale); const content = await getContentValues(["home.processTimeline.steps"], locale); const steps = parseListNumbered(content["home.processTimeline.steps"]); return (
); } export async function RegionalSection() { const locale = await getLocale(); const t = getDictionary(locale); const content = await getContentValues( [ "home.regionalSection.paragraph1", "home.regionalSection.paragraph2", "home.regionalSection.image", ], locale ); return (
{/* Breites Bild, der Text legt sich als Tafel darueber — Tiefe statt eines weiteren Bild-neben-Text-Wechsels. */}

{content["home.regionalSection.paragraph1"]}

{content["home.regionalSection.paragraph2"]}

{t.home.regionalSection.ctaAbout} {t.home.regionalSection.ctaPickup}
); } export async function Sustainability() { const locale = await getLocale(); const t = getDictionary(locale); const content = await getContentValues(["home.sustainability.items"], locale); const items = parseListTitled(content["home.sustainability.items"]); return (
{/* Geteilt statt Viererreihe: die Ueberschrift laeuft mit, die Punkte werden als ruhige Liste gelesen. */}
); } export async function BusinessTeaser() { const locale = await getLocale(); const t = getDictionary(locale); const content = await getContentValues( ["home.businessTeaser.paragraph", "home.businessTeaser.image"], locale ); return (
{/* Kompakte Tafel statt eines dritten grossen Bild/Text-Blocks: ein Angebot fuer eine kleinere Zielgruppe, entsprechend zurueckhaltend. */}

{content["home.businessTeaser.paragraph"]}

{t.home.businessTeaser.cta}
); } export async function Reviews() { const t = getDictionary(await getLocale()); const google = await fetchGoogleReviews(); const placeId = process.env.GOOGLE_PLACE_ID; const mapsUrl = placeId ? `https://www.google.com/maps/place/?q=place_id:${placeId}` : null; // Echte Google-Rezensionen sind Zitate realer Kund:innen und werden nie // uebersetzt oder umformuliert — nur die eigenen Fallback-Testimonials // (ohne konfigurierte Google-Anbindung) existieren in beiden Sprachen. const items = google && google.reviews.length > 0 ? google.reviews.map((r) => ({ quote: r.text, author: r.author, rating: r.rating, authorUrl: r.authorUrl, })) : t.home.reviews.testimonials.map((r) => ({ ...r, rating: 5, authorUrl: null })); return (
{google?.rating ? (

{t.home.reviews.googleReviewsCount(google.rating.toFixed(1), google.totalCount ?? 0)}

) : null}
{items.slice(0, 6).map((review, i) => ( {/* Gezeichnet statt als Schriftzeichen: ein grosses "„" sitzt auf der Grundlinie und ragte mit enger Zeilenhoehe in die Sterne. */} {t.home.reviews.starsOutOf5(review.rating)}

{review.quote}

{/* Zuordnung zur Quelle: die Nutzungsbedingungen der Places API verlangen, dass eine angezeigte Rezension zu Google zurueckfuehrt. Bei den eigenen Beispiel-Stimmen gibt es nichts zu verlinken — dort bleibt es beim reinen Namen. */} {review.authorUrl ? ( {review.author} ) : (

{review.author}

)}
))}
{mapsUrl ? (

{t.home.reviews.seeAllOnGoogle}

) : null}
); }