From d4bb6ec1cf127efec25dc5f0de9d58cb35ff89bd Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Fri, 25 Sep 2026 13:24:07 +0200 Subject: [PATCH] feat(ui): Adressen, Retoure, Suche und Cookie-Hinweis - Adressen im Zweierraster, Standardadresse mit Honigrahmen und Wabenmarke, neues Adressformular in der Formular-Karte - Retoure: Positionen als Liste mit Waben, Formular in der Karte - Suche: Vorschlaege gleiten gestaffelt herein, Suchbegriff hervorgehoben, Lupe wird zum Schliessen-Symbol; das Feld legt sich ueber die Navigation statt sie zu verschieben (vorher: waagerechter Scrollbalken) - Cookie-Hinweis als schwebende Karte; "Nur notwendige" und "Alle akzeptieren" gleich gewichtet (vorher war Akzeptieren Waldgruen auf Waldgruen und kaum als Knopf erkennbar) Co-Authored-By: Claude Opus 5.5 (1M context) --- src/app/konto/adressen/page.tsx | 32 ++++--- .../konto/bestellungen/[id]/retoure/page.tsx | 14 ++- src/components/cookie-consent.tsx | 31 +++--- src/components/site-chrome.tsx | 96 +++++++++++++++---- 4 files changed, 125 insertions(+), 48 deletions(-) diff --git a/src/app/konto/adressen/page.tsx b/src/app/konto/adressen/page.tsx index 5c4d09b..fb0c44e 100644 --- a/src/app/konto/adressen/page.tsx +++ b/src/app/konto/adressen/page.tsx @@ -1,7 +1,8 @@ import type { Metadata } from "next"; import type { HTMLAttributes } from "react"; import { redirect } from "next/navigation"; -import { Container, SectionHeading, Button } from "@/components/ui"; +import { Container, SectionHeading, Button, FormPanel } from "@/components/ui"; +import { HexMark } from "@/components/honeycomb"; import { BackLink } from "@/components/back-link"; import { AccountEmptyState, AddressIcon } from "@/components/account-ui"; import { getCurrentCustomer } from "@/lib/auth"; @@ -27,21 +28,28 @@ export default async function KontoAdressenPage() { -
+
{addresses.map((address) => (
+ {address.isDefault ? ( + + + {t.addressesPage.standard} + + ) : null}
-

- {address.label}{" "} - {address.isDefault ? · {t.addressesPage.standard} : null} -

+

{address.label}

{address.firstName} {address.lastName}
@@ -51,7 +59,7 @@ export default async function KontoAdressenPage() {

-
+
{!address.isDefault ? (
@@ -78,9 +86,9 @@ export default async function KontoAdressenPage() { ) : null}
-
-

{t.addressesPage.addNewHeading}

- + +

{t.addressesPage.addNewHeading}

+ -
+
); diff --git a/src/app/konto/bestellungen/[id]/retoure/page.tsx b/src/app/konto/bestellungen/[id]/retoure/page.tsx index 77a292e..007df2b 100644 --- a/src/app/konto/bestellungen/[id]/retoure/page.tsx +++ b/src/app/konto/bestellungen/[id]/retoure/page.tsx @@ -1,5 +1,6 @@ import { redirect, notFound } from "next/navigation"; -import { Container, SectionHeading, Button } from "@/components/ui"; +import { Container, SectionHeading, Button, FormPanel } from "@/components/ui"; +import { HexMark } from "@/components/honeycomb"; import { BackLink } from "@/components/back-link"; import { getCurrentCustomer } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; @@ -46,15 +47,17 @@ export default async function RetourePage(props: PageProps<"/konto/bestellungen/ -
    + +
      {order.items.map((item) => ( -
    • - {item.quantity} × {item.productName} +
    • + + {item.quantity} × + {item.productName}
    • ))}
    -
    @@ -73,6 +76,7 @@ export default async function RetourePage(props: PageProps<"/konto/bestellungen/
    +
); diff --git a/src/components/cookie-consent.tsx b/src/components/cookie-consent.tsx index 0044fbd..27ac389 100644 --- a/src/components/cookie-consent.tsx +++ b/src/components/cookie-consent.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import Link from "next/link"; +import { HoneycombPattern } from "@/components/honeycomb"; import { AnimatePresence, motion } from "motion/react"; import { Button } from "@/components/ui"; import { useI18n } from "@/i18n/i18n-provider"; @@ -31,31 +32,33 @@ export function CookieConsentBanner() { {visible ? ( -
-

+ +

+

{t.cookieConsent.bannerTextBeforeLink} {t.cookieConsent.policyLinkLabel} {t.cookieConsent.bannerTextAfterLink}

-
- -
diff --git a/src/components/site-chrome.tsx b/src/components/site-chrome.tsx index cab0465..ff372de 100644 --- a/src/components/site-chrome.tsx +++ b/src/components/site-chrome.tsx @@ -143,13 +143,19 @@ function SearchButton() {
{open ? ( + // Legt sich UEBER die Navigation (absolut, von rechts aufklappend) + // statt sie beiseitezuschieben — vorher drueckte das Feld die + // Kopfzeile auseinander und erzeugte einen waagerechten Scrollbalken. {visibleSuggestions.length > 0 ? ( -
    - {visibleSuggestions.map((s) => ( -
  • + + {visibleSuggestions.map((s, i) => ( + - {s.name} - {s.price} + + + + + {s.price} + + -
  • + ))} -
+ ) : null}
) : null} @@ -187,15 +215,49 @@ function SearchButton() { aria-label={t.nav.openSearch} className="flex items-center justify-center w-10 h-10 text-forest flex-shrink-0" > - - - - + + + {open ? ( + + ) : ( + <> + + + + )} + +
); } +/** Hebt den gesuchten Begriff im Vorschlag hervor — der Blick findet sofort, warum er passt. */ +function HighlightMatch({ text, query }: { text: string; query: string }) { + const needle = query.trim(); + const index = needle ? text.toLowerCase().indexOf(needle.toLowerCase()) : -1; + if (index < 0) return <>{text}; + return ( + <> + {text.slice(0, index)} + {text.slice(index, index + needle.length)} + {text.slice(index + needle.length)} + + ); +} + function AccountIconButton() { const { t } = useI18n(); return (