Replaces em dashes with en dashes across all hardcoded copy, emails, and seed content, then reworks the site's visual language so it reads as deliberately designed rather than assembled from generic components: - New ArrowLink component replaces ad hoc "Mehr erfahren ->" links and ghost buttons; one shared FormField (TextField/TextAreaField) replaces 7 near-duplicate field styles across every form - Navbar loses its glassmorphism blur for a solid warm background, gets a subtle active-link underline and a softer, warmer mega-menu - PageHeader supports per-page blob tone/position and a compact mode instead of an identical band on every interior page - Homepage: the core offer is featured large instead of four equal cards, the philosophy section gets a single calmer accent blob, blog teasers now show their cover image like the real /aktuelles page does - Booking calendar and widget: 44px touch targets throughout (month nav, day cells, time slots, cancel action), a visible "today" ring, and responsive padding so the calendar isn't cramped on small screens - Quieter, warmer empty states on /termine and /aktuelles No functional changes: all interaction logic (nav menus, forms, booking, CMS data fetching) is untouched, only markup and styling.
60 lines
2.7 KiB
TypeScript
60 lines
2.7 KiB
TypeScript
import type { Metadata } from "next";
|
|
import type { ReactNode } from "react";
|
|
import Link from "next/link";
|
|
import { redirect } from "next/navigation";
|
|
import { Container } from "@/components/Section";
|
|
import { LogoutButton } from "@/components/auth/LogoutButton";
|
|
import { ResendVerificationButton } from "@/components/auth/ResendVerificationButton";
|
|
import { getCurrentCustomer } from "@/lib/auth/customer";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
// Applies to every /konto/* page at once — private account area, never indexable.
|
|
export const metadata: Metadata = { robots: { index: false, follow: false } };
|
|
|
|
const navItems = [
|
|
{ title: "Übersicht", href: "/konto" },
|
|
{ title: "Kalender", href: "/konto/kalender" },
|
|
{ title: "Meine Termine", href: "/konto/termine" },
|
|
{ title: "Profil", href: "/konto/profil" },
|
|
];
|
|
|
|
export default async function KontoLayout({ children }: { children: ReactNode }) {
|
|
const customer = await getCurrentCustomer();
|
|
if (!customer) redirect("/login?next=/konto");
|
|
|
|
return (
|
|
<section className="bg-anouma-cream-light py-16">
|
|
<Container>
|
|
<div className="mb-10">
|
|
<p className="text-xs font-medium uppercase tracking-[0.18em] text-anouma-plum/70">Mein Konto</p>
|
|
<h1 className="mt-2 font-serif text-3xl font-medium text-anouma-plum">Hallo, {customer.name}</h1>
|
|
</div>
|
|
{!customer.emailVerified && (
|
|
<div className="mb-8 rounded-2xl bg-anouma-cream-beige p-5">
|
|
<p className="text-sm font-medium text-anouma-plum">Bitte bestätige zuerst deine E-Mail-Adresse.</p>
|
|
<p className="mt-1 text-sm text-anouma-plum/80">
|
|
Erst danach kannst du Termine anfragen. Prüfe dein Postfach oder fordere unten eine neue E-Mail an.
|
|
</p>
|
|
<ResendVerificationButton variant="session" className="mt-3" />
|
|
</div>
|
|
)}
|
|
<div className="grid gap-10 lg:grid-cols-[220px_1fr]">
|
|
<nav aria-label="Konto-Navigation" className="flex gap-2 overflow-x-auto lg:flex-col lg:gap-1">
|
|
{navItems.map((item) => (
|
|
<Link
|
|
key={item.href}
|
|
href={item.href}
|
|
className="flex min-h-11 items-center whitespace-nowrap rounded-full px-4 text-sm font-medium text-anouma-plum transition-colors hover:bg-white lg:rounded-2xl"
|
|
>
|
|
{item.title}
|
|
</Link>
|
|
))}
|
|
<LogoutButton className="flex min-h-11 items-center whitespace-nowrap rounded-full px-4 text-left text-sm font-medium text-anouma-plum/70 transition-colors hover:bg-white lg:rounded-2xl" />
|
|
</nav>
|
|
<div className="min-w-0">{children}</div>
|
|
</div>
|
|
</Container>
|
|
</section>
|
|
);
|
|
}
|