diff --git a/src/app/bestellung-verfolgen/page.tsx b/src/app/bestellung-verfolgen/page.tsx index 9db1d1c..2c9b4c5 100644 --- a/src/app/bestellung-verfolgen/page.tsx +++ b/src/app/bestellung-verfolgen/page.tsx @@ -179,7 +179,7 @@ export default async function TrackOrderPage(props: PageProps<"/bestellung-verfo />
-

{formatPrice(order.totalCents, order.currency, locale)}

+

{formatPrice(order.totalCents, order.currency, locale)}

{order.invoice ? ( {t.trackOrderPage.viewInvoice} diff --git a/src/app/globals.css b/src/app/globals.css index 310056d..f6cbe83 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -203,3 +203,57 @@ p { animation: none !important; } } + +/* Konto: erledigte Abschnitte der Statusleiste "fliessen" nacheinander voll. */ +@keyframes wh-grow { + from { + transform: scaleX(0); + } + to { + transform: scaleX(1); + } +} + +/* Aktueller Schritt / laufender Status: sanfter Puls um die Wabe. */ +@keyframes wh-pulse { + 0% { + box-shadow: 0 0 0 0 color-mix(in oklab, var(--color-honey) 55%, transparent); + } + 70%, + 100% { + box-shadow: 0 0 0 7px transparent; + } +} + +/* Sechseck als Form fuer Icon-Flaechen (gleiche Geometrie wie Logomark). */ +.clip-hex { + clip-path: polygon(50% 0, 93.3% 25%, 93.3% 75%, 50% 100%, 6.7% 75%, 6.7% 25%); +} + +@media (prefers-reduced-motion: reduce) { + .motion-grow, + .motion-pulse { + animation: none !important; + } +} + +/* Formularfelder: weicher Honig-Schein beim Fokus statt nur einer + Randfarbe — auf allen Formularen einheitlich, ohne jedes einzeln + anzufassen. Viele Felder setzen focus:outline-none; der Schein + (box-shadow) bleibt davon unberuehrt. */ +input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]), +select, +textarea { + transition: + border-color 200ms var(--ease-arrive), + box-shadow 250ms var(--ease-arrive); +} +input:not([type="checkbox"]):not([type="radio"]):focus, +select:focus, +textarea:focus { + box-shadow: 0 0 0 3px color-mix(in oklab, var(--color-honey) 22%, transparent); +} +input::placeholder, +textarea::placeholder { + color: color-mix(in oklab, var(--color-ink) 45%, transparent); +} diff --git a/src/app/konto/bestellungen/page.tsx b/src/app/konto/bestellungen/page.tsx index 30bf88b..43ed78e 100644 --- a/src/app/konto/bestellungen/page.tsx +++ b/src/app/konto/bestellungen/page.tsx @@ -132,7 +132,7 @@ export default async function KontoBestellungenPage() { ) : null}
-

{formatPrice(order.totalCents, order.currency, locale)}

+

{formatPrice(order.totalCents, order.currency, locale)}

{order.invoice ? (
-

{t.account.login}

+

{t.account.login}

{/* Das Turnstile-Widget ist ein iframe mit FESTER Breite (rund @@ -55,7 +55,7 @@ export default async function KontoPage() {
-

{t.account.register}

+

{t.account.register}

@@ -176,7 +176,7 @@ export default async function KontoPage() {
-

{t.account.newsletterHeading}

+

{t.account.newsletterHeading}

{isSubscribed ? t.account.newsletterSubscribed : t.account.newsletterNotSubscribed}

@@ -190,7 +190,7 @@ export default async function KontoPage() {
-

{t.account.logoutAllDevicesHeading}

+

{t.account.logoutAllDevicesHeading}

{t.account.logoutAllDevicesDescription}

@@ -208,10 +208,10 @@ export default async function KontoPage() { -

{t.account.privacy.heading}

+

{t.account.privacy.heading}

-

{t.account.privacy.downloadDataHeading}

+

{t.account.privacy.downloadDataHeading}

{t.account.privacy.downloadDataDescription}

@@ -220,7 +220,7 @@ export default async function KontoPage() {
-

{t.account.privacy.deleteAccountHeading}

+

{t.account.privacy.deleteAccountHeading}

{t.account.privacy.deleteAccountDescription}

- + - - {title} - {description} - + + ); } @@ -57,10 +75,19 @@ const ORDER_STATUS_STYLES: Record = { }; /** Farbcodiertes Status-Label statt reinem Fließtext, damit der Bestellstatus auf einen Blick erkennbar ist. */ +/** Status, bei denen gerade etwas passiert — ihr Punkt pulsiert sanft. */ +const ORDER_STATUS_IN_PROGRESS = new Set(["BEZAHLT", "IN_VORBEREITUNG", "VERSANDBEREIT", "ABHOLBEREIT"]); + export function OrderStatusBadge({ status, label }: { status: string; label: string }) { const style = ORDER_STATUS_STYLES[status] ?? "border-ink/20 text-ink/70"; return ( - + + ); @@ -128,18 +155,34 @@ export function OrderStatusTimeline({ return (
-
-

+

{step.label}

@@ -162,11 +205,20 @@ export function AccountEmptyState({ action?: ReactNode; }) { return ( -
- - {icon} +
+ + + {icon} -

{title}

+

{title}

{description ? (

{description}

) : null}