refactor(ui): Kicker-Zeilen ueber Ueberschriften entfernt
Jede zweite Ueberschrift trug eine kleine Versalien-Zeile mit Wabenpunkt
("• STIMMEN", "• AKTUELL VERFUEGBAR", "• KUNDENKONTO" ...). Auf 29 Seiten
und Abschnitten wiederholt las sich das wie eine Vorlage. SectionHeading
rendert sie nicht mehr, die Prop ist entfernt; die Ueberschrift traegt den
Abschnitt allein.
Die eyebrow-Texte, die weiterhin als Seitentitel, Bildbeschriftung oder
Breadcrumb dienen, bleiben; 18 danach ungenutzte Eintraege sind aus Typ und
beiden Woerterbuechern entfernt.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
a4581d3467
commit
1fa8ca246a
33 files changed
+22
-107
No files matched your search
@@ -49,7 +49,7 @@ export default async function TrackOrderPage(props: PageProps<"/bestellung-verfo
|
||||
return (
|
||||
<div className="py-20">
|
||||
<Container className="max-w-xl">
|
||||
<SectionHeading eyebrow={t.trackOrderPage.eyebrow} title={t.trackOrderPage.title} />
|
||||
<SectionHeading title={t.trackOrderPage.title} />
|
||||
<p className="mt-4 text-ink/70 leading-relaxed">{t.trackOrderPage.intro}</p>
|
||||
|
||||
<FormPanel className="mt-8">
|
||||
|
||||
@@ -27,7 +27,6 @@ export default async function CheckoutCancelPage(props: PageProps<"/checkout/can
|
||||
<div className="py-24">
|
||||
<Container className="max-w-xl text-center">
|
||||
<SectionHeading
|
||||
eyebrow={t.checkoutCancelPage.eyebrow}
|
||||
title={t.checkoutCancelPage.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -295,7 +295,7 @@ export function CheckoutForm({
|
||||
return (
|
||||
<div className="py-20">
|
||||
<Container>
|
||||
<SectionHeading eyebrow={t.checkoutPage.eyebrow} title={t.checkoutPage.emptyCart} />
|
||||
<SectionHeading title={t.checkoutPage.emptyCart} />
|
||||
</Container>
|
||||
</div>
|
||||
);
|
||||
@@ -328,7 +328,7 @@ export function CheckoutForm({
|
||||
{/* Stripe zeigt im Zahlungsschritt selbst Positionen und Summe —
|
||||
Formular und eigene Zusammenfassung treten dann zurueck. */}
|
||||
<form onSubmit={handleSubmit} hidden={payment !== null} className="lg:col-span-2 space-y-8">
|
||||
<SectionHeading eyebrow={t.checkoutPage.eyebrow} title={t.checkoutPage.yourDetails} />
|
||||
<SectionHeading title={t.checkoutPage.yourDetails} />
|
||||
|
||||
<div className="grid sm:grid-cols-2 gap-4">
|
||||
<Field
|
||||
|
||||
@@ -41,7 +41,7 @@ export default async function CheckoutSuccessPage(props: PageProps<"/checkout/su
|
||||
return (
|
||||
<div className="py-16">
|
||||
<Container className="max-w-3xl">
|
||||
<SectionHeading eyebrow={t.checkoutSuccessPage.openEyebrow} title={t.checkoutSuccessPage.openTitle} />
|
||||
<SectionHeading title={t.checkoutSuccessPage.openTitle} />
|
||||
<p role="status" className="mt-4 mb-10 text-ink/70">
|
||||
{t.checkoutSuccessPage.openText}
|
||||
</p>
|
||||
@@ -64,7 +64,6 @@ export default async function CheckoutSuccessPage(props: PageProps<"/checkout/su
|
||||
<div className="py-24">
|
||||
<Container className="max-w-xl text-center">
|
||||
<SectionHeading
|
||||
eyebrow={t.checkoutSuccessPage.notCompletedEyebrow}
|
||||
title={t.checkoutSuccessPage.notCompletedTitle}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
@@ -88,7 +87,6 @@ export default async function CheckoutSuccessPage(props: PageProps<"/checkout/su
|
||||
<ClearCartOnMount />
|
||||
<Container className="max-w-xl text-center">
|
||||
<SectionHeading
|
||||
eyebrow={isPaid ? t.checkoutSuccessPage.successEyebrow : t.checkoutSuccessPage.pendingEyebrow}
|
||||
title={isPaid ? t.checkoutSuccessPage.successTitle : t.checkoutSuccessPage.pendingTitle}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -32,7 +32,7 @@ export default async function ErntenPage() {
|
||||
<div className="py-20">
|
||||
<Container>
|
||||
<ScrollReveal>
|
||||
<SectionHeading level="h1" eyebrow={t.erntenPage.eyebrow} title={t.erntenPage.title} />
|
||||
<SectionHeading level="h1" title={t.erntenPage.title} />
|
||||
</ScrollReveal>
|
||||
|
||||
<div className="mt-16 space-y-24">
|
||||
|
||||
@@ -43,7 +43,6 @@ export default function Error({ error, reset }: { error: Error & { digest?: stri
|
||||
/>
|
||||
</svg>
|
||||
<SectionHeading
|
||||
eyebrow={t.siteErrorPage.eyebrow}
|
||||
title={t.siteErrorPage.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -44,7 +44,6 @@ export default async function HerkunftPage() {
|
||||
<div className="max-w-3xl bg-background px-8 pt-10 pb-2 md:px-12 md:pt-12 shadow-[0_-20px_40px_-30px_rgba(36,53,43,0.35)]">
|
||||
<SectionHeading
|
||||
level="h1"
|
||||
eyebrow={t.herkunftPage.eyebrow}
|
||||
title={t.herkunftPage.title}
|
||||
subtitle={t.herkunftPage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -25,7 +25,6 @@ export default async function ImkereiPage() {
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
level="h1"
|
||||
eyebrow={t.imkereiPage.eyebrow}
|
||||
title={t.imkereiPage.title}
|
||||
/>
|
||||
<div className="mt-8 max-w-[62ch] space-y-5 text-ink/75 leading-relaxed">
|
||||
|
||||
@@ -22,7 +22,7 @@ export default async function KontaktPage() {
|
||||
<div className="py-20">
|
||||
<Container className="max-w-5xl">
|
||||
<ScrollReveal>
|
||||
<SectionHeading level="h1" eyebrow={t.kontaktPage.eyebrow} title={t.kontaktPage.title} />
|
||||
<SectionHeading level="h1" title={t.kontaktPage.title} />
|
||||
</ScrollReveal>
|
||||
|
||||
<div className="mt-12 grid gap-6 md:grid-cols-5">
|
||||
|
||||
@@ -25,7 +25,7 @@ export default async function KontoAdressenPage() {
|
||||
<div className="py-20">
|
||||
<Container className="max-w-3xl">
|
||||
<BackLink href="/konto" label={t.ordersPage.backToAccount} />
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.addressesPage.title} />
|
||||
<SectionHeading title={t.addressesPage.title} />
|
||||
|
||||
|
||||
<div className="mt-10 grid gap-4 sm:grid-cols-2">
|
||||
|
||||
@@ -45,7 +45,7 @@ export default async function RetourePage(props: PageProps<"/konto/bestellungen/
|
||||
<div className="py-20">
|
||||
<Container className="max-w-lg">
|
||||
<BackLink href="/konto/bestellungen" label={t.retourePage.backLabel} />
|
||||
<SectionHeading eyebrow={t.retourePage.orderEyebrow(order.orderNumber)} title={t.retourePage.title} />
|
||||
<SectionHeading title={t.retourePage.title} />
|
||||
|
||||
<FormPanel className="mt-8">
|
||||
<ul className="divide-y divide-ink/10 border-y border-ink/10 text-sm text-ink/75">
|
||||
|
||||
@@ -39,7 +39,7 @@ export default async function KontoBestellungenPage() {
|
||||
<div className="py-20">
|
||||
<Container className="max-w-3xl">
|
||||
<BackLink href="/konto" label={t.ordersPage.backToAccount} />
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.ordersPage.title} />
|
||||
<SectionHeading title={t.ordersPage.title} />
|
||||
|
||||
|
||||
{orders.length === 0 ? (
|
||||
|
||||
@@ -30,7 +30,7 @@ export default async function KontoPage() {
|
||||
return (
|
||||
<div className="py-20">
|
||||
<Container className="max-w-3xl">
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.account.loginRegisterTitle} />
|
||||
<SectionHeading title={t.account.loginRegisterTitle} />
|
||||
<div className="mt-10 grid md:grid-cols-2 md:divide-x md:divide-ink/10 gap-12 md:gap-0">
|
||||
<form action={loginAction} className="space-y-4 md:pr-12">
|
||||
<h2 className="text-3xl text-forest">{t.account.login}</h2>
|
||||
@@ -121,7 +121,7 @@ export default async function KontoPage() {
|
||||
return (
|
||||
<div className="py-20">
|
||||
<Container className="max-w-2xl">
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.account.greeting(customer.firstName)} />
|
||||
<SectionHeading title={t.account.greeting(customer.firstName)} />
|
||||
|
||||
|
||||
{!customer.emailVerifiedAt ? (
|
||||
|
||||
@@ -17,7 +17,7 @@ export default async function PasswortVergessenPage(props: PageProps<"/konto/pas
|
||||
<Container className="max-w-lg">
|
||||
<FormPanel>
|
||||
<BackLink href="/konto" label={t.passwortVergessenPage.backLabel} />
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.passwortVergessenPage.title} />
|
||||
<SectionHeading title={t.passwortVergessenPage.title} />
|
||||
|
||||
|
||||
{sent ? (
|
||||
|
||||
@@ -20,7 +20,7 @@ export default async function PasswortZuruecksetzenPage(
|
||||
<Container className="max-w-lg">
|
||||
<FormPanel>
|
||||
<BackLink href="/konto" label={t.passwortZuruecksetzenPage.backLabel} />
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.passwortZuruecksetzenPage.title} />
|
||||
<SectionHeading title={t.passwortZuruecksetzenPage.title} />
|
||||
|
||||
|
||||
{!token ? (
|
||||
|
||||
@@ -24,7 +24,7 @@ export default async function KontoWunschlistePage() {
|
||||
<div className="py-20">
|
||||
<Container>
|
||||
<BackLink href="/konto" label={t.ordersPage.backToAccount} />
|
||||
<SectionHeading eyebrow={t.account.eyebrow} title={t.wishlistPage.title} />
|
||||
<SectionHeading title={t.wishlistPage.title} />
|
||||
|
||||
{products.length === 0 ? (
|
||||
<AccountEmptyState
|
||||
|
||||
@@ -23,7 +23,6 @@ export default async function ZweiFaktorCodePage() {
|
||||
<FormPanel>
|
||||
<BackLink href="/konto" label={t.twoFactorCodePage.cancelLabel} />
|
||||
<SectionHeading
|
||||
eyebrow={t.twoFactorCodePage.eyebrow}
|
||||
title={t.twoFactorCodePage.title}
|
||||
subtitle={t.twoFactorCodePage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -22,7 +22,6 @@ export default async function ZweiFaktorBackupCodesPage() {
|
||||
<Container className="max-w-lg">
|
||||
<FormPanel>
|
||||
<SectionHeading
|
||||
eyebrow={t.twoFactorBackupCodesPage.eyebrow}
|
||||
title={t.twoFactorBackupCodesPage.title}
|
||||
subtitle={t.twoFactorBackupCodesPage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -28,7 +28,6 @@ export default async function ZweiFaktorEinrichtenPage() {
|
||||
<FormPanel>
|
||||
<BackLink href="/konto/zwei-faktor" label={t.twoFactorSetupPage.backLabel} />
|
||||
<SectionHeading
|
||||
eyebrow={t.twoFactorSetupPage.eyebrow}
|
||||
title={t.twoFactorSetupPage.title}
|
||||
subtitle={t.twoFactorSetupPage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -29,7 +29,6 @@ export default async function ZweiFaktorPage() {
|
||||
<FormPanel>
|
||||
<BackLink href="/konto" label={t.twoFactorPage.backLabel} />
|
||||
<SectionHeading
|
||||
eyebrow={t.twoFactorPage.eyebrow}
|
||||
title={t.twoFactorPage.title}
|
||||
subtitle={t.twoFactorPage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -31,7 +31,6 @@ export default async function NewsletterBestaetigtPage(props: PageProps<"/newsle
|
||||
<div className="py-24">
|
||||
<Container className="max-w-xl text-center">
|
||||
<SectionHeading
|
||||
eyebrow={t.newsletterBestaetigtPage.eyebrow}
|
||||
title={title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -50,7 +50,6 @@ export default async function NotFound() {
|
||||
})}
|
||||
</svg>
|
||||
<SectionHeading
|
||||
eyebrow={t.notFoundPage.eyebrow}
|
||||
title={t.notFoundPage.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -88,7 +88,6 @@ export default async function ShopPage(props: PageProps<"/shop">) {
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
level="h1"
|
||||
eyebrow={t.shop.eyebrow}
|
||||
title={t.shop.title}
|
||||
subtitle={t.shop.subtitle}
|
||||
/>
|
||||
|
||||
@@ -41,7 +41,6 @@ export default async function UnternehmenPage() {
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
level="h1"
|
||||
eyebrow={t.unternehmenPage.eyebrow}
|
||||
title={t.unternehmenPage.title}
|
||||
subtitle={t.unternehmenPage.subtitle}
|
||||
/>
|
||||
|
||||
@@ -66,7 +66,7 @@ export function WarenkorbContent({
|
||||
return (
|
||||
<div className="py-16">
|
||||
<Container>
|
||||
<SectionHeading eyebrow={t.cart.title} title={t.cartPage.title} />
|
||||
<SectionHeading title={t.cartPage.title} />
|
||||
|
||||
{items.length === 0 ? (
|
||||
<div className="mt-14">
|
||||
|
||||
@@ -21,7 +21,7 @@ export default async function WissenPage() {
|
||||
<div className="py-20">
|
||||
<Container className="max-w-3xl">
|
||||
<ScrollReveal>
|
||||
<SectionHeading level="h1" eyebrow={t.wissenListPage.eyebrow} title={t.wissenListPage.title} />
|
||||
<SectionHeading level="h1" title={t.wissenListPage.title} />
|
||||
</ScrollReveal>
|
||||
<div className="mt-14 divide-y divide-ink/10 border-y border-ink/10">
|
||||
{wissenSlugs.map((slug, i) => {
|
||||
|
||||
@@ -22,7 +22,6 @@ export async function CurrentHarvest({
|
||||
<Container>
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.currentHarvest.eyebrow}
|
||||
title={t.home.currentHarvest.title}
|
||||
subtitle={t.home.currentHarvest.subtitle}
|
||||
/>
|
||||
@@ -72,7 +71,6 @@ export async function OriginStory() {
|
||||
</ScrollReveal>
|
||||
<ScrollReveal delay={0.1}>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.originStory.eyebrow}
|
||||
title={t.home.originStory.title}
|
||||
/>
|
||||
<p className="mt-6 text-ink/75 leading-relaxed">{content["home.originStory.paragraph1"]}</p>
|
||||
@@ -104,7 +102,6 @@ export async function Philosophy() {
|
||||
<Container>
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.philosophy.eyebrow}
|
||||
title={t.home.philosophy.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -19,7 +19,6 @@ export async function ProcessTimeline() {
|
||||
<Container>
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.processTimeline.eyebrow}
|
||||
title={t.home.processTimeline.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
@@ -47,7 +46,6 @@ export async function RegionalSection() {
|
||||
<Container className="grid md:grid-cols-2 gap-16 lg:gap-24 items-center">
|
||||
<ScrollReveal className="order-2 md:order-1">
|
||||
<SectionHeading
|
||||
eyebrow={t.home.regionalSection.eyebrow}
|
||||
title={t.home.regionalSection.title}
|
||||
/>
|
||||
<p className="mt-6 text-ink/75 leading-relaxed">{content["home.regionalSection.paragraph1"]}</p>
|
||||
@@ -90,7 +88,7 @@ export async function Sustainability() {
|
||||
<Container className="grid gap-12 lg:grid-cols-12 lg:gap-16">
|
||||
<ScrollReveal className="lg:col-span-5">
|
||||
<div className="lg:sticky lg:top-32">
|
||||
<SectionHeading eyebrow={t.home.sustainability.eyebrow} title={t.home.sustainability.title} />
|
||||
<SectionHeading title={t.home.sustainability.title} />
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
<ul className="divide-y divide-ink/10 border-y border-ink/10 lg:col-span-7">
|
||||
@@ -137,7 +135,6 @@ export async function BusinessTeaser() {
|
||||
</ScrollReveal>
|
||||
<ScrollReveal delay={0.1}>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.businessTeaser.eyebrow}
|
||||
title={t.home.businessTeaser.title}
|
||||
/>
|
||||
<p className="mt-6 text-ink/75 leading-relaxed">{content["home.businessTeaser.paragraph"]}</p>
|
||||
@@ -174,7 +171,6 @@ export async function Reviews() {
|
||||
<Container className="relative">
|
||||
<ScrollReveal>
|
||||
<SectionHeading
|
||||
eyebrow={t.home.reviews.eyebrow}
|
||||
title={t.home.reviews.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
@@ -60,7 +60,6 @@ export function NewsletterSignup({ turnstileSiteKey }: { turnstileSiteKey?: stri
|
||||
<HoneycombPattern className="text-honey/25" size={24} />
|
||||
<div className="relative mx-auto max-w-2xl">
|
||||
<SectionHeading
|
||||
eyebrow={t.home.newsletter.eyebrow}
|
||||
title={t.home.newsletter.title}
|
||||
align="center"
|
||||
className="mx-auto"
|
||||
|
||||
+5
-14
@@ -1,6 +1,6 @@
|
||||
import Link from "next/link";
|
||||
import type { ComponentPropsWithoutRef, ReactNode } from "react";
|
||||
import { HexMark, HoneycombPattern } from "@/components/honeycomb";
|
||||
import { HoneycombPattern } from "@/components/honeycomb";
|
||||
|
||||
export function Container({
|
||||
id,
|
||||
@@ -82,7 +82,6 @@ export function Button({
|
||||
}
|
||||
|
||||
export function SectionHeading({
|
||||
eyebrow,
|
||||
title,
|
||||
subtitle,
|
||||
align = "left",
|
||||
@@ -90,14 +89,13 @@ export function SectionHeading({
|
||||
level = "h2",
|
||||
tone = "default",
|
||||
}: {
|
||||
eyebrow?: string;
|
||||
title: string;
|
||||
subtitle?: string;
|
||||
align?: "left" | "center";
|
||||
className?: string;
|
||||
/** "h1" fuer Seiten, auf denen diese Komponente die einzige/primaere Ueberschrift ist (SEO-Heading-Hierarchie). Default h2, da die meisten Verwendungen einzelne Abschnitte innerhalb einer Seite mit eigenem h1 sind. */
|
||||
level?: "h1" | "h2";
|
||||
/** "inverted" fuer Abschnitte auf dunklem Grund (z.B. bg-forest) — steuert die Eyebrow-Farbe fuer ausreichenden Kontrast. */
|
||||
/** "inverted" fuer Abschnitte auf dunklem Grund (z.B. bg-forest) — helle Ueberschrift und Untertitel. */
|
||||
tone?: "default" | "inverted";
|
||||
}) {
|
||||
const Heading = level;
|
||||
@@ -105,16 +103,9 @@ export function SectionHeading({
|
||||
<div
|
||||
className={`${align === "center" ? "text-center mx-auto" : "text-left"} max-w-2xl ${className}`}
|
||||
>
|
||||
{eyebrow ? (
|
||||
<p
|
||||
className={`flex items-center gap-2 tracking-wide-caps text-xs mb-4 ${
|
||||
align === "center" ? "justify-center" : ""
|
||||
} ${tone === "inverted" ? "text-honey-light" : "text-honey-dark"}`}
|
||||
>
|
||||
<HexMark className="h-2.5 w-2.5 flex-shrink-0" />
|
||||
{eyebrow}
|
||||
</p>
|
||||
) : null}
|
||||
{/* Bewusst ohne Kicker-Zeile ("• STIMMEN") ueber der Ueberschrift: auf
|
||||
jeder Ueberschrift wiederholt wirkte das wie eine Vorlage. Die
|
||||
Ueberschrift traegt den Abschnitt allein. */}
|
||||
<Heading
|
||||
className={`text-4xl md:text-5xl leading-[1.05] tracking-[-0.01em] ${
|
||||
tone === "inverted" ? "text-cream" : "text-forest"
|
||||
|
||||
@@ -156,14 +156,12 @@ export const de: Dictionary = {
|
||||
reviewNotice: "",
|
||||
},
|
||||
notFoundPage: {
|
||||
eyebrow: "404",
|
||||
title: "Diese Seite gibt es nicht, zumindest nicht mehr.",
|
||||
text: "Der Link ist vielleicht veraltet, oder die Seite wurde verschoben. Schau dich im Shop um oder geh zurück zur Startseite.",
|
||||
backToShop: "Zum Shop",
|
||||
backToHome: "Zur Startseite",
|
||||
},
|
||||
siteErrorPage: {
|
||||
eyebrow: "Fehler",
|
||||
title: "Da ist etwas schiefgelaufen.",
|
||||
text: "Das war ein technischer Fehler auf unserer Seite, nicht deine Schuld. Versuch es noch einmal, oder komm später wieder vorbei.",
|
||||
retry: "Erneut versuchen",
|
||||
@@ -585,7 +583,6 @@ export const de: Dictionary = {
|
||||
"Nach Absprache kannst du deine Bestellung direkt bei uns in Altenmünster abholen. Wähle dazu im Checkout einfach „Abholung“ aus. Wir melden uns anschließend mit einem Abholtermin.",
|
||||
},
|
||||
twoFactorPage: {
|
||||
eyebrow: "Sicherheit",
|
||||
title: "Zwei-Faktor-Authentifizierung",
|
||||
subtitle: "Schützt dein Konto zusätzlich zum Passwort mit einem Code aus einer Authenticator-App.",
|
||||
backLabel: "Zurück zur Übersicht",
|
||||
@@ -601,7 +598,6 @@ export const de: Dictionary = {
|
||||
emptyDescription: "Auf jeder Produktseite kannst du sie über „Zur Wunschliste hinzufügen“ speichern.",
|
||||
},
|
||||
twoFactorCodePage: {
|
||||
eyebrow: "Kundenkonto",
|
||||
title: "Anmeldung bestätigen",
|
||||
subtitle: "Gib den 6-stelligen Code aus deiner Authenticator-App ein, oder verwende einen deiner Backup-Codes.",
|
||||
cancelLabel: "Anmeldung abbrechen",
|
||||
@@ -609,7 +605,6 @@ export const de: Dictionary = {
|
||||
confirm: "Bestätigen",
|
||||
},
|
||||
twoFactorBackupCodesPage: {
|
||||
eyebrow: "Sicherheit",
|
||||
title: "Deine Backup-Codes",
|
||||
subtitle:
|
||||
"Jeder Code funktioniert einmalig, falls du keinen Zugriff auf deine Authenticator-App hast. Speichere sie an einem sicheren Ort. Sie werden dir nur jetzt angezeigt.",
|
||||
@@ -617,7 +612,6 @@ export const de: Dictionary = {
|
||||
done: "Fertig",
|
||||
},
|
||||
twoFactorSetupPage: {
|
||||
eyebrow: "Sicherheit",
|
||||
title: "Zwei-Faktor-Authentifizierung einrichten",
|
||||
subtitle:
|
||||
"Scanne den QR-Code mit einer Authenticator-App (z. B. Google Authenticator, Authy) und bestätige mit dem angezeigten Code.",
|
||||
@@ -636,7 +630,6 @@ export const de: Dictionary = {
|
||||
submit: "Anfrage senden",
|
||||
},
|
||||
erntenPage: {
|
||||
eyebrow: "Ernten",
|
||||
title: "Kein Jahr schmeckt gleich.",
|
||||
batchCount: (count) => `${count} Charge${count === 1 ? "" : "n"}`,
|
||||
emptyText: "Noch keine Ernten hinterlegt.",
|
||||
@@ -657,7 +650,6 @@ export const de: Dictionary = {
|
||||
fromThisBatch: "Aus dieser Charge",
|
||||
},
|
||||
newsletterBestaetigtPage: {
|
||||
eyebrow: "Erntepost",
|
||||
confirmedTitle: "Anmeldung bestätigt.",
|
||||
invalidTitle: "Link nicht mehr gültig.",
|
||||
unsubscribedTitle: "Abmeldung erfolgreich.",
|
||||
@@ -902,7 +894,6 @@ export const de: Dictionary = {
|
||||
save: "Speichern",
|
||||
},
|
||||
trackOrderPage: {
|
||||
eyebrow: "Bestellung verfolgen",
|
||||
title: "Wo ist meine Bestellung?",
|
||||
intro: "Gib deine Bestellnummer und die bei der Bestellung verwendete E-Mail-Adresse ein, um den aktuellen Status zu sehen, auch ohne Kundenkonto.",
|
||||
orderNumberLabel: "Bestellnummer",
|
||||
@@ -1402,7 +1393,6 @@ export const de: Dictionary = {
|
||||
save: "Adresse speichern",
|
||||
},
|
||||
account: {
|
||||
eyebrow: "Kundenkonto",
|
||||
loginRegisterTitle: "Anmelden oder Konto erstellen",
|
||||
login: "Anmelden",
|
||||
register: "Konto erstellen",
|
||||
@@ -1491,7 +1481,6 @@ export const de: Dictionary = {
|
||||
backToCart: "Zurück zum Warenkorb",
|
||||
},
|
||||
checkoutCancelPage: {
|
||||
eyebrow: "Abgebrochen",
|
||||
title: "Deine Bestellung wurde nicht abgeschlossen.",
|
||||
text: "Kein Problem, dein Warenkorb ist noch gefüllt. Du kannst den Bestellvorgang jederzeit erneut starten.",
|
||||
released: "Die für dich zurückgelegte Ware steht wieder im Shop zur Verfügung.",
|
||||
@@ -1644,7 +1633,6 @@ export const de: Dictionary = {
|
||||
starLabel: (value) => `${value} ${value === 1 ? "Stern" : "Sterne"}`,
|
||||
},
|
||||
shop: {
|
||||
eyebrow: "Shop",
|
||||
title: "Unser Sortiment",
|
||||
subtitle: "Honig, Bienenwachskerzen und Propolis aus eigener Imkerei, solange der jeweilige Bestand reicht.",
|
||||
allCategories: "Alle",
|
||||
@@ -1670,7 +1658,6 @@ export const de: Dictionary = {
|
||||
footnote: "Geerntet · abgefüllt · versendet aus eigener Imkerei",
|
||||
},
|
||||
currentHarvest: {
|
||||
eyebrow: "Aktuell verfügbar",
|
||||
title: "Die aktuelle Ernte",
|
||||
subtitle: "Kleine, dokumentierte Chargen, solange der Vorrat reicht.",
|
||||
},
|
||||
@@ -1685,7 +1672,6 @@ export const de: Dictionary = {
|
||||
cta: "Mehr über die Herkunft",
|
||||
},
|
||||
philosophy: {
|
||||
eyebrow: "Philosophie",
|
||||
title: "Die Wabenhain-Philosophie",
|
||||
items: [
|
||||
{ title: "Eigene Ernte", text: "Unser Honig stammt aus unseren eigenen Bienenvölkern." },
|
||||
@@ -1704,7 +1690,6 @@ export const de: Dictionary = {
|
||||
cta: "Ernte entdecken",
|
||||
},
|
||||
processTimeline: {
|
||||
eyebrow: "Vom Bienenvolk zum Glas",
|
||||
title: "Sechs Schritte bis zu deinem Honig",
|
||||
steps: [
|
||||
{ number: "01", title: "Blüte", text: "Die Bienen sammeln Nektar aus der Umgebung." },
|
||||
@@ -1725,7 +1710,6 @@ export const de: Dictionary = {
|
||||
ctaPickup: "Honig vor Ort abholen",
|
||||
},
|
||||
sustainability: {
|
||||
eyebrow: "Verantwortung",
|
||||
title: "Verantwortung beginnt im Kleinen.",
|
||||
items: [
|
||||
{ title: "Wiederverwendbare Gläser", text: "Saubere Wabenhain-Gläser können bei uns zurückgegeben werden." },
|
||||
@@ -1741,7 +1725,6 @@ export const de: Dictionary = {
|
||||
cta: "Firmengeschenke anfragen",
|
||||
},
|
||||
reviews: {
|
||||
eyebrow: "Stimmen",
|
||||
title: "Was unsere Kund:innen sagen",
|
||||
googleReviewsCount: (rating, count) => `${rating} ★ · ${count} Google-Rezensionen`,
|
||||
seeAllOnGoogle: "Alle Bewertungen auf Google ansehen →",
|
||||
@@ -1759,7 +1742,6 @@ export const de: Dictionary = {
|
||||
],
|
||||
},
|
||||
newsletter: {
|
||||
eyebrow: "Erntepost",
|
||||
title: "Erfahre als Erstes von der nächsten Ernte.",
|
||||
description:
|
||||
"Neue Ernten gibt es nur einige Male im Jahr. Mit unserer Erntepost erfährst du, sobald neuer Honig verfügbar ist.",
|
||||
|
||||
@@ -156,14 +156,12 @@ export const en: Dictionary = {
|
||||
reviewNotice: "",
|
||||
},
|
||||
notFoundPage: {
|
||||
eyebrow: "404",
|
||||
title: "This page doesn't exist, at least not anymore.",
|
||||
text: "The link might be outdated, or the page has moved. Take a look around the shop, or head back to the homepage.",
|
||||
backToShop: "Go to shop",
|
||||
backToHome: "Back to homepage",
|
||||
},
|
||||
siteErrorPage: {
|
||||
eyebrow: "Error",
|
||||
title: "Something went wrong.",
|
||||
text: "That was a technical error on our end, not something you did. Try again, or come back a bit later.",
|
||||
retry: "Try again",
|
||||
@@ -573,7 +571,6 @@ export const en: Dictionary = {
|
||||
"By arrangement, you can pick up your order directly from us in Altenmünster. Just select “Pickup” at checkout. We'll then get in touch with a pickup time.",
|
||||
},
|
||||
twoFactorPage: {
|
||||
eyebrow: "Security",
|
||||
title: "Two-Factor Authentication",
|
||||
subtitle: "Protects your account beyond just a password, with a code from an authenticator app.",
|
||||
backLabel: "Back to overview",
|
||||
@@ -589,7 +586,6 @@ export const en: Dictionary = {
|
||||
emptyDescription: "You can save products from any product page via “Add to wishlist.”",
|
||||
},
|
||||
twoFactorCodePage: {
|
||||
eyebrow: "Customer account",
|
||||
title: "Confirm sign-in",
|
||||
subtitle: "Enter the 6-digit code from your authenticator app, or use one of your backup codes.",
|
||||
cancelLabel: "Cancel sign-in",
|
||||
@@ -597,7 +593,6 @@ export const en: Dictionary = {
|
||||
confirm: "Confirm",
|
||||
},
|
||||
twoFactorBackupCodesPage: {
|
||||
eyebrow: "Security",
|
||||
title: "Your backup codes",
|
||||
subtitle:
|
||||
"Each code works once, in case you don't have access to your authenticator app. Store them somewhere safe. They're only shown now.",
|
||||
@@ -605,7 +600,6 @@ export const en: Dictionary = {
|
||||
done: "Done",
|
||||
},
|
||||
twoFactorSetupPage: {
|
||||
eyebrow: "Security",
|
||||
title: "Set up two-factor authentication",
|
||||
subtitle:
|
||||
"Scan the QR code with an authenticator app (e.g. Google Authenticator, Authy) and confirm with the code shown.",
|
||||
@@ -624,7 +618,6 @@ export const en: Dictionary = {
|
||||
submit: "Send request",
|
||||
},
|
||||
erntenPage: {
|
||||
eyebrow: "Harvests",
|
||||
title: "No two years taste alike.",
|
||||
batchCount: (count) => `${count} batch${count === 1 ? "" : "es"}`,
|
||||
emptyText: "No harvests recorded yet.",
|
||||
@@ -645,7 +638,6 @@ export const en: Dictionary = {
|
||||
fromThisBatch: "From this batch",
|
||||
},
|
||||
newsletterBestaetigtPage: {
|
||||
eyebrow: "Harvest post",
|
||||
confirmedTitle: "Subscription confirmed.",
|
||||
invalidTitle: "Link no longer valid.",
|
||||
unsubscribedTitle: "Unsubscribed successfully.",
|
||||
@@ -890,7 +882,6 @@ export const en: Dictionary = {
|
||||
save: "Save",
|
||||
},
|
||||
trackOrderPage: {
|
||||
eyebrow: "Track order",
|
||||
title: "Where's my order?",
|
||||
intro: "Enter your order number and the email address used at checkout to see the current status, no account needed.",
|
||||
orderNumberLabel: "Order number",
|
||||
@@ -1388,7 +1379,6 @@ export const en: Dictionary = {
|
||||
save: "Save address",
|
||||
},
|
||||
account: {
|
||||
eyebrow: "Account",
|
||||
loginRegisterTitle: "Sign in or create an account",
|
||||
login: "Sign in",
|
||||
register: "Create account",
|
||||
@@ -1477,7 +1467,6 @@ export const en: Dictionary = {
|
||||
backToCart: "Back to cart",
|
||||
},
|
||||
checkoutCancelPage: {
|
||||
eyebrow: "Cancelled",
|
||||
title: "Your order was not completed.",
|
||||
text: "No problem, your cart is still full. You can restart the checkout process at any time.",
|
||||
released: "The items reserved for you are available in the shop again.",
|
||||
@@ -1630,7 +1619,6 @@ export const en: Dictionary = {
|
||||
starLabel: (value) => `${value} star${value === 1 ? "" : "s"}`,
|
||||
},
|
||||
shop: {
|
||||
eyebrow: "Shop",
|
||||
title: "Our Range",
|
||||
subtitle: "Honey, beeswax candles, and propolis from our own apiary, while stocks last.",
|
||||
allCategories: "All",
|
||||
@@ -1656,7 +1644,6 @@ export const en: Dictionary = {
|
||||
footnote: "Harvested · bottled · shipped from our own apiary",
|
||||
},
|
||||
currentHarvest: {
|
||||
eyebrow: "Currently available",
|
||||
title: "The current harvest",
|
||||
subtitle: "Small, documented batches, while stocks last.",
|
||||
},
|
||||
@@ -1670,7 +1657,6 @@ export const en: Dictionary = {
|
||||
cta: "More about our origin",
|
||||
},
|
||||
philosophy: {
|
||||
eyebrow: "Philosophy",
|
||||
title: "The Wabenhain Philosophy",
|
||||
items: [
|
||||
{ title: "Our own harvest", text: "Our honey comes from our own bee colonies." },
|
||||
@@ -1689,7 +1675,6 @@ export const en: Dictionary = {
|
||||
cta: "Discover this harvest",
|
||||
},
|
||||
processTimeline: {
|
||||
eyebrow: "From bee colony to jar",
|
||||
title: "Six steps to your honey",
|
||||
steps: [
|
||||
{ number: "01", title: "Blossom", text: "The bees collect nectar from the surrounding area." },
|
||||
@@ -1710,7 +1695,6 @@ export const en: Dictionary = {
|
||||
ctaPickup: "Pick up honey locally",
|
||||
},
|
||||
sustainability: {
|
||||
eyebrow: "Responsibility",
|
||||
title: "Responsibility starts small.",
|
||||
items: [
|
||||
{ title: "Reusable jars", text: "Clean Wabenhain jars can be returned to us." },
|
||||
@@ -1726,7 +1710,6 @@ export const en: Dictionary = {
|
||||
cta: "Request corporate gifts",
|
||||
},
|
||||
reviews: {
|
||||
eyebrow: "Voices",
|
||||
title: "What our customers say",
|
||||
googleReviewsCount: (rating, count) => `${rating} ★ · ${count} Google reviews`,
|
||||
seeAllOnGoogle: "See all reviews on Google →",
|
||||
@@ -1744,7 +1727,6 @@ export const en: Dictionary = {
|
||||
],
|
||||
},
|
||||
newsletter: {
|
||||
eyebrow: "Harvest mail",
|
||||
title: "Be the first to know about the next harvest.",
|
||||
description:
|
||||
"New harvests only happen a few times a year. Our harvest mail lets you know as soon as new honey is available.",
|
||||
|
||||
@@ -178,14 +178,12 @@ export interface Dictionary {
|
||||
reviewNotice: string;
|
||||
};
|
||||
notFoundPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
text: string;
|
||||
backToShop: string;
|
||||
backToHome: string;
|
||||
};
|
||||
siteErrorPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
text: string;
|
||||
retry: string;
|
||||
@@ -266,7 +264,6 @@ export interface Dictionary {
|
||||
pickupText: string;
|
||||
};
|
||||
twoFactorPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
backLabel: string;
|
||||
@@ -282,7 +279,6 @@ export interface Dictionary {
|
||||
emptyDescription: string;
|
||||
};
|
||||
twoFactorCodePage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
cancelLabel: string;
|
||||
@@ -290,14 +286,12 @@ export interface Dictionary {
|
||||
confirm: string;
|
||||
};
|
||||
twoFactorBackupCodesPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
warning: string;
|
||||
done: string;
|
||||
};
|
||||
twoFactorSetupPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
backLabel: string;
|
||||
@@ -315,7 +309,6 @@ export interface Dictionary {
|
||||
submit: string;
|
||||
};
|
||||
erntenPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
batchCount: (count: number) => string;
|
||||
emptyText: string;
|
||||
@@ -336,7 +329,6 @@ export interface Dictionary {
|
||||
fromThisBatch: string;
|
||||
};
|
||||
newsletterBestaetigtPage: {
|
||||
eyebrow: string;
|
||||
confirmedTitle: string;
|
||||
invalidTitle: string;
|
||||
unsubscribedTitle: string;
|
||||
@@ -579,7 +571,6 @@ export interface Dictionary {
|
||||
save: string;
|
||||
};
|
||||
trackOrderPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
intro: string;
|
||||
orderNumberLabel: string;
|
||||
@@ -1056,7 +1047,6 @@ export interface Dictionary {
|
||||
save: string;
|
||||
};
|
||||
account: {
|
||||
eyebrow: string;
|
||||
loginRegisterTitle: string;
|
||||
login: string;
|
||||
register: string;
|
||||
@@ -1139,7 +1129,6 @@ export interface Dictionary {
|
||||
backToCart: string;
|
||||
};
|
||||
checkoutCancelPage: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
text: string;
|
||||
released: string;
|
||||
@@ -1269,7 +1258,6 @@ export interface Dictionary {
|
||||
starLabel: (value: number) => string;
|
||||
};
|
||||
shop: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
allCategories: string;
|
||||
@@ -1295,7 +1283,6 @@ export interface Dictionary {
|
||||
footnote: string;
|
||||
};
|
||||
currentHarvest: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
subtitle: string;
|
||||
};
|
||||
@@ -1308,7 +1295,6 @@ export interface Dictionary {
|
||||
cta: string;
|
||||
};
|
||||
philosophy: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
items: TitledText[];
|
||||
};
|
||||
@@ -1322,7 +1308,6 @@ export interface Dictionary {
|
||||
cta: string;
|
||||
};
|
||||
processTimeline: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
steps: { number: string; title: string; text: string }[];
|
||||
};
|
||||
@@ -1335,7 +1320,6 @@ export interface Dictionary {
|
||||
ctaPickup: string;
|
||||
};
|
||||
sustainability: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
items: TitledText[];
|
||||
};
|
||||
@@ -1346,7 +1330,6 @@ export interface Dictionary {
|
||||
cta: string;
|
||||
};
|
||||
reviews: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
googleReviewsCount: (rating: string, count: number) => string;
|
||||
seeAllOnGoogle: string;
|
||||
@@ -1354,7 +1337,6 @@ export interface Dictionary {
|
||||
testimonials: { quote: string; author: string }[];
|
||||
};
|
||||
newsletter: {
|
||||
eyebrow: string;
|
||||
title: string;
|
||||
description: string;
|
||||
successMessage: string;
|
||||
|
||||
Reference in new issue
Block a user