Files
Wabenhain/src/lib/site-config.ts
T
Nick SzaunigandClaude Sonnet 5 04cc3061cf perf: DB-Indizes, Footer als Server Component, Site-weite Fehlerseiten
Datenbank (prisma/migrations/20260904120000_add_performance_indexes):
7 fehlende Indizes auf Fremdschluessel-/Filter-Spalten ergaenzt
(Order.customerId+createdAt, Order.status, Order.createdAt,
Order.discountCodeId, OrderItem.orderId, Address.customerId,
AuditLog.createdAt) — bislang volle Tabellenscans bei Bestelluebersicht,
Admin-Dashboard, Checkout-Gutscheinpruefung und Audit-Log.

Bundle-Groesse: Footer (TikTok/YouTube/Instagram-Icons, Copyright-Zeile)
aus dem client-seitigen site-chrome.tsx in eine eigene Server Component
(site-footer.tsx) ausgelagert — brauchte "use client" nur wegen
useI18n(), jetzt getDictionary()-Server-Aufruf wie auf jeder Admin-Seite.
Entfernt ungenutztes clientseitiges JS/Hydration aus jedem Seitenaufruf
(Footer steht im Root-Layout).

UX: app/not-found.tsx und app/error.tsx ergaenzt (Next.js-Konventionen
fuer 404 bzw. Laufzeitfehler) — beide fehlten komplett, unbekannte Routen
und Rendering-Fehler zeigten bisher Next.js' generische, unbrandete
Standardseiten statt einer zur Seite passenden Nutzerfuehrung.
Dictionary-Kollision dabei aufgefallen und aufgeloest: eine bereits
bestehende, admin-interne errorPage-Uebersetzung (src/app/admin/error.tsx,
seit dem urspruenglichen App-Grundgeruest vorhanden) blieb unangetastet,
die neue site-weite Fehlerseite nutzt einen eigenen Schluessel
(siteErrorPage).

Verifiziert: tsc --noEmit clean, 118/118 Tests gruen, pnpm build clean.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-04 09:07:37 +02:00

96 lines
3.6 KiB
TypeScript

// Zentrale, austauschbare Inhalte fuer Navigation, Footer und Firmendaten.
// email/phone sind noch keine echten Kontaktdaten (auf dem Etikett nicht
// abgebildet) und muessen vor dem Live-Gang ersetzt werden — bewusst ohne
// sichtbaren "[PLATZHALTER]"-Text im String, da dieser sonst 1:1 im Footer
// und auf der Kontaktseite mitgerendert wuerde.
export const categoryLabels = {
HONIG: "Honig",
KERZEN: "Bienenwachskerzen",
PROPOLIS: "Propolis",
} as const;
export const siteConfig = {
name: "WABENHAIN",
claim: "Honig aus den Westlichen Wäldern.",
claimAlt: "Eine Landschaft. Eine Ernte. Ein ehrliches Glas.",
domain: "wabenhain.com",
description:
"Entdecke hochwertigen Honig aus eigener Imkerei in Altenmünster. Kleine Ernten, klare Herkunft und echtes Imkerhandwerk.",
location: "Altenmünster, Bayern",
email: "[email protected]",
phone: "+49 (0) 000 000000",
address: {
street: "Buhlweg 10",
zip: "86450",
city: "Altenmünster",
country: "Deutschland",
},
} as const;
// "key" verweist auf i18n/dictionary-type.ts (nav.* bzw. footer.*/legalTitles.*)
// statt eines fest verdrahteten Labels — site-chrome.tsx (Header/CartDrawer)
// bzw. site-footer.tsx (Footer) loesen den Text zur Laufzeit aus der aktiven
// Dictionary auf, damit Navigation und Footer mit der Sprachumschaltung
// mitziehen.
export const mainNav = [
{ href: "/shop", key: "shop" },
{ href: "/ernten", key: "harvests" },
{ href: "/herkunft", key: "origin" },
{ href: "/imkerei", key: "apiary" },
{ href: "/unternehmen", key: "business" },
{ href: "/wissen", key: "knowledge" },
{ href: "/kontakt", key: "contact" },
] as const;
export const footerNav = {
wabenhain: [
{ href: "/imkerei", key: "aboutUs" },
{ href: "/herkunft", key: "origin" },
{ href: "/ernten", key: "harvests" },
{ href: "/kontakt", key: "contact" },
],
// "Versand"/"Abholung" bewusst entfernt: beide verlinkten auf dieselbe
// Seite wie "Rechtliches" -> "Versand und Zahlung" (unten,
// /versand-zahlung) — die eine Verlinkung dort reicht.
einkaufen: [
{ href: "/shop", key: "shop" },
{ href: "/unternehmen", key: "businessCustomers" },
{ href: "/bestellung-verfolgen", key: "trackOrder" },
],
informationen: [
{ href: "/wissen", label: "Honigwissen" },
{ href: "/kontakt", label: "Kontakt" },
],
rechtliches: [
{ href: "/impressum", key: "impressum" },
{ href: "/datenschutz", key: "datenschutz" },
{ href: "/agb", key: "agb" },
{ href: "/widerrufsbelehrung", key: "widerruf" },
{ href: "/versand-zahlung", key: "versandZahlung" },
{ href: "/cookie-richtlinie", key: "cookieRichtlinie" },
],
} as const;
// philosophyItems, processSteps, sustainabilityItems, die Fallback-Reviews
// und businessPackages leben jetzt uebersetzt in i18n/dictionaries/{de,en}.ts
// (home.philosophy, home.processTimeline, home.sustainability,
// home.reviews.testimonials, unternehmenPage.packages).
// Nur noch die Slugs (locale-unabhaengig, fuer generateStaticParams/Sitemap) —
// Titel/Anrisstext/Fliesstext jedes Artikels leben jetzt uebersetzt unter
// i18n/dictionaries/{de,en}.ts (wissenArticles), siehe i18n/dictionary-type.ts
// fuer die WissenSlug-Union, die exakt diese Liste widerspiegelt.
export const wissenSlugs = [
"warum-kristallisiert-honig",
"fluessiger-oder-cremiger-honig",
"was-bedeutet-fruehtracht",
"was-bedeutet-sommertracht",
"wie-entsteht-honig",
"warum-schmeckt-jede-honigernte-anders",
"wie-lange-ist-honig-haltbar",
"was-macht-regionalen-honig-aus",
"wie-honig-richtig-lagern",
"warum-nie-ueber-28-grad-erwaermt",
] as const;