feat(ui): Kundenkonto im Wabenstil

- Konto-Kacheln: Icon in einer Wabe, die sich beim Hover mit Honig fuellt,
  einlaufender Pfeil, Serifen-Titel
- Bestell-Statusleiste: Waben statt Punkte, erledigte Abschnitte fliessen
  nacheinander voll, aktueller Schritt pulsiert sanft
- Status-Badge mit pulsierendem Punkt bei laufenden Bestellungen
- Leere Zustaende mit gestrichelter Wabe und Serifen-Titel
- Formularfelder: einheitlicher Honig-Schein beim Fokus
- Groessere Abschnittstitel im Konto, Bestellsummen in Serifen-Preisschrift
- Nur CSS-Animationen (Komponenten rendern auch auf Admin-Serverseiten);
  reduzierte Bewegung schaltet Puls und Fuellen ab

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
Nick SzaunigandClaude Opus 5.5 committed 2026-09-25 07:53:02 +02:00
1 parent 3de17ca070
commit 6ac7cc5d1f
5 files changed
+141 -35

No files matched your search

+7 -7
View File
@@ -33,7 +33,7 @@ export default async function KontoPage() {
<SectionHeading eyebrow={t.account.eyebrow} 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-lg text-forest">{t.account.login}</h2>
<h2 className="text-3xl text-forest">{t.account.login}</h2>
<Field name="email" label={t.account.emailLabel} type="email" required autoComplete="email" />
<PasswordField name="password" label={t.account.passwordLabel} required autoComplete="current-password" />
{/* Das Turnstile-Widget ist ein iframe mit FESTER Breite (rund
@@ -55,7 +55,7 @@ export default async function KontoPage() {
</form>
<form action={registerAction} className="space-y-4 md:pl-12">
<h2 className="text-lg text-forest">{t.account.register}</h2>
<h2 className="text-3xl text-forest">{t.account.register}</h2>
<div className="grid grid-cols-2 gap-4">
<Field name="firstName" label={t.account.firstNameLabel} required autoComplete="given-name" />
<Field name="lastName" label={t.account.lastNameLabel} required autoComplete="family-name" />
@@ -176,7 +176,7 @@ export default async function KontoPage() {
<div className="mt-10 border border-ink/10 p-6 flex items-center justify-between gap-4">
<div>
<h2 className="text-lg text-forest">{t.account.newsletterHeading}</h2>
<h2 className="text-2xl text-forest">{t.account.newsletterHeading}</h2>
<p className="mt-1 text-sm text-ink/70">
{isSubscribed ? t.account.newsletterSubscribed : t.account.newsletterNotSubscribed}
</p>
@@ -190,7 +190,7 @@ export default async function KontoPage() {
<div className="mt-6 border border-ink/10 p-6 flex items-center justify-between gap-4">
<div>
<h2 className="text-lg text-forest">{t.account.logoutAllDevicesHeading}</h2>
<h2 className="text-2xl text-forest">{t.account.logoutAllDevicesHeading}</h2>
<p className="mt-1 text-sm text-ink/70">
{t.account.logoutAllDevicesDescription}
</p>
@@ -208,10 +208,10 @@ export default async function KontoPage() {
</Button>
</form>
<h2 className="text-lg text-forest mb-4">{t.account.privacy.heading}</h2>
<h2 className="text-2xl text-forest mb-4">{t.account.privacy.heading}</h2>
<div className="border border-ink/10 p-6 flex items-center justify-between gap-4">
<div>
<h3 className="text-sm text-forest">{t.account.privacy.downloadDataHeading}</h3>
<h3 className="text-lg text-forest">{t.account.privacy.downloadDataHeading}</h3>
<p className="mt-1 text-sm text-ink/70">{t.account.privacy.downloadDataDescription}</p>
</div>
<LinkButton href="/api/konto/datenexport" variant="secondary" className="flex-shrink-0">
@@ -220,7 +220,7 @@ export default async function KontoPage() {
</div>
<div className="mt-6 border border-red-200 bg-red-50/40 p-6">
<h3 className="text-sm text-red-700">{t.account.privacy.deleteAccountHeading}</h3>
<h3 className="text-lg text-red-700">{t.account.privacy.deleteAccountHeading}</h3>
<p className="mt-1 text-sm text-ink/70">{t.account.privacy.deleteAccountDescription}</p>
<ConfirmForm
action={deleteOwnAccountAction}