Files
Wabenhain/src/app/page.tsx
T
Nick SzaunigandClaude Opus 5.5 b77516b9f5
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m28s
feat(ui): Startseite lebt - fliegende Biene, Imker-Portraet, bewegte Fotos
- Eine gezeichnete Biene fliegt beim Scrollen eine geschwungene Bahn ueber
  "Aktuelle Ernte" und zieht eine gepunktete Honigspur hinter sich her;
  Fluegelschlag und leichtes Schweben per CSS (components/bee.tsx).
- Neuer Abschnitt nach der Philosophie: Portraet des Imkers in Wabenform,
  die Punkte des Wabenrings wandern an der Kante entlang, eine Biene
  umkreist das Bild. Daneben der eigene Satz von der Imkerei-Seite als
  Zitat - kein neuer Text.
- Herkunft-, Region- und Firmenkunden-Foto bewegen sich beim Scrollen
  leicht mit (Zoom und Parallax, nur transform; components/parallax-media).

Alles rein dekorativ (aria-hidden) und mit Pfad fuer reduzierte Bewegung:
die Biene sitzt dann still, Ring und Fotos stehen.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-26 05:57:45 +02:00

72 lines
2.4 KiB
TypeScript

import type { Metadata } from "next";
import { Hero } from "@/components/hero";
import {
BeekeeperNote,
CurrentHarvest,
OriginStory,
Philosophy,
ProductSpotlight,
} from "@/components/home-sections-a";
import {
ProcessTimeline,
RegionalSection,
Sustainability,
BusinessTeaser,
Reviews,
} from "@/components/home-sections-b";
import { NewsletterSignup } from "@/components/newsletter-signup";
import { getActiveProducts } from "@/lib/data";
import { getReviewSummariesByProductIds } from "@/lib/reviews";
import { getContentValues } from "@/lib/content";
import { getCompanyInfo } from "@/lib/company-info";
import { getLocale } from "@/i18n/locale";
export const metadata: Metadata = { alternates: { canonical: "/" } };
// Zeigt immer die aktuelle Ernte/den aktuellen Lagerbestand und entkoppelt
// den Docker-Build-Schritt von einer zur Build-Zeit erreichbaren Datenbank.
export const dynamic = "force-dynamic";
export default async function HomePage() {
const locale = await getLocale();
const [heroContent, company] = await Promise.all([
getContentValues(
["home.hero.intro", "home.hero.footnote", "home.hero.image", "home.hero.video"],
locale
),
getCompanyInfo(),
]);
const products = await getActiveProducts();
const honeyProducts = products.filter((p) => p.category === "HONIG");
const reviewSummaries = await getReviewSummariesByProductIds(honeyProducts.map((p) => p.id));
const spotlightProduct = products.find(
(p) => p.category === "HONIG" && p.harvest && p.batch
) as (typeof products)[number] & {
harvest: NonNullable<(typeof products)[number]["harvest"]>;
batch: NonNullable<(typeof products)[number]["batch"]>;
} | undefined;
return (
<>
<Hero
intro={heroContent["home.hero.intro"]}
footnote={heroContent["home.hero.footnote"]}
location={company.location}
image={heroContent["home.hero.image"] || null}
video={heroContent["home.hero.video"] || null}
/>
<CurrentHarvest products={honeyProducts} reviewSummaries={reviewSummaries} />
<OriginStory />
<Philosophy />
<BeekeeperNote />
{spotlightProduct ? <ProductSpotlight product={spotlightProduct} /> : null}
<ProcessTimeline />
<RegionalSection />
<Sustainability />
<BusinessTeaser />
<Reviews />
<NewsletterSignup turnstileSiteKey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY} />
</>
);
}