From baebf78ee43eec8a37c3e8c8c5543aac1c3f5d09 Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Fri, 25 Sep 2026 13:19:42 +0200 Subject: [PATCH] feat(ui): Sendungsverfolgung im Wabenstil - DHL-Verlauf: neuestes Ereignis als Wabe in Statusfarbe (pulsiert, solange unterwegs), aeltere als leere Waben, Eintraege erscheinen gestaffelt - Bestellung verfolgen: Suchformular in der Formular-Karte, Ergebnis als abgehobene Karte Co-Authored-By: Claude Opus 5.5 (1M context) --- src/app/bestellung-verfolgen/page.tsx | 8 ++-- src/app/globals.css | 18 +++++++++ src/components/shipment-tracking-history.tsx | 41 ++++++++++++++------ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/src/app/bestellung-verfolgen/page.tsx b/src/app/bestellung-verfolgen/page.tsx index 2c9b4c5..a5428aa 100644 --- a/src/app/bestellung-verfolgen/page.tsx +++ b/src/app/bestellung-verfolgen/page.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; import Link from "next/link"; -import { Container, SectionHeading, Button } from "@/components/ui"; +import { Container, SectionHeading, Button, FormPanel } from "@/components/ui"; import { OrderStatusBadge, OrderStatusTimeline } from "@/components/account-ui"; import { getOrderForTracking } from "@/lib/account-data"; import { formatPrice, formatDate } from "@/lib/format"; @@ -52,7 +52,8 @@ export default async function TrackOrderPage(props: PageProps<"/bestellung-verfo

{t.trackOrderPage.intro}

-
+ +
{rateLimited ? (

@@ -91,7 +93,7 @@ export default async function TrackOrderPage(props: PageProps<"/bestellung-verfo ) : null} {order ? ( -

+

{order.orderNumber}

diff --git a/src/app/globals.css b/src/app/globals.css index 25eec3a..7ded2aa 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -283,3 +283,21 @@ textarea::placeholder { animation: none !important; } } + +/* Listeneintraege erscheinen gestaffelt (Delay per style am Element). */ +@keyframes wh-rise { + from { + opacity: 0; + transform: translateY(6px); + } + to { + opacity: 1; + transform: none; + } +} + +@media (prefers-reduced-motion: reduce) { + .motion-rise { + animation: none !important; + } +} diff --git a/src/components/shipment-tracking-history.tsx b/src/components/shipment-tracking-history.tsx index cf9df6c..03b8c20 100644 --- a/src/components/shipment-tracking-history.tsx +++ b/src/components/shipment-tracking-history.tsx @@ -12,12 +12,13 @@ export interface ShipmentTrackingHistoryLabels { statuses: Record; } -const STATUS_DOT: Record = { - "pre-transit": "bg-ink/30", - transit: "bg-honey-dark", - delivered: "bg-forest", - failure: "bg-red-500", - unknown: "bg-ink/30", +// Ausgeschrieben: Tailwind erzeugt nur Klassen, die woertlich im Quelltext stehen. +const STATUS_FILL: Record = { + "pre-transit": "fill-ink/30", + transit: "fill-honey-dark", + delivered: "fill-forest", + failure: "fill-red-500", + unknown: "fill-ink/30", }; const STATUS_TEXT: Record = { @@ -74,15 +75,31 @@ export function ShipmentTrackingHistory({ {info.events.length > 0 ? (
    {info.events.map((event, i) => ( -
  1. +
  2. {i < info.events.length - 1 ? ( -