Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m28s
- 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]>
72 lines
2.4 KiB
TypeScript
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} />
|
|
</>
|
|
);
|
|
}
|