Fix account-nav feedback, blog filter position, and small icon polish

- Remove Merkliste from AccountNav — the Navbar's own wishlist icon already covers it, a second nav entry was redundant.
- Fix duplicate "Mein Profil" heading (ProfileForm already renders its own; KontoShell no longer adds a second one).
- "Eingeloggt als ..." now renders once in KontoShell, consistently on every /konto/* page, instead of only on the orders page.
- Blog category filter chips moved into the hero's own text column (was a separate bar below the entire hero including the photo) — visible immediately on every width instead of requiring a scroll past the hero image first.
- ArrowRightIcon's arrowhead wings shortened (looked like a generic oversized chevron at full length).
- Search overlay's "Esc" text button replaced with an X icon; the actual Escape keyboard shortcut is unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Marco
2026-07-31 22:13:08 +00:00
parent f54ff267a7
commit d018d87e25
8 changed files with 85 additions and 78 deletions
+1 -4
View File
@@ -59,14 +59,11 @@ export default async function KontoBestellungenPage({
]);
return (
<KontoShell>
<KontoShell customer={session.customer}>
<Reveal className="flex flex-col gap-6 items-start w-full">
<p className="font-semibold text-h-feature text-text-primary" style={{ fontFamily: "var(--font-lora)" }}>
Meine Bestellungen
</p>
<p className="text-body text-text-muted">
Eingeloggt als {session.customer.email} (Kundennummer {session.customer.customerNumber})
</p>
{orderFilterEnabled && availableYears.length > 0 && (
<Suspense fallback={null}>
+10 -8
View File
@@ -12,16 +12,18 @@ import { dispatchAuthChanged } from "../../lib/auth";
// unreachable without scrolling past an arbitrarily long order list. Being
// part of the shell now (not page content), reachability no longer depends
// on how much is above it.
//
// No Merkliste entry — the Navbar's own wishlist heart icon already covers
// that (visible at every width, on every page, not just inside /konto/*),
// so a second entry here would just be a redundant path to the same page.
const NAV_ITEMS = [
{ href: "/konto/bestellungen", label: "Bestellungen", wishlistOnly: false },
{ href: "/konto/merkliste", label: "Merkliste", wishlistOnly: true },
{ href: "/konto/profil", label: "Profil", wishlistOnly: false },
{ href: "/konto/bestellungen", label: "Bestellungen" },
{ href: "/konto/profil", label: "Profil" },
] as const;
export function AccountNav({ wishlistEnabled }: { wishlistEnabled: boolean }) {
export function AccountNav() {
const pathname = usePathname();
const router = useRouter();
const items = NAV_ITEMS.filter((item) => !item.wishlistOnly || wishlistEnabled);
// Same sequence as the old LogoutButton (now folded in here, its one
// call site): clear the local cart (already mirrored server-side by
@@ -43,7 +45,7 @@ export function AccountNav({ wishlistEnabled }: { wishlistEnabled: boolean }) {
page content inside KontoShell's flex row. */}
<nav className="hidden sm:flex sm:flex-col sm:w-48 shrink-0 gap-1">
<p className="text-label font-bold text-text-muted uppercase tracking-wide px-3 pb-2">Mein Konto</p>
{items.map((item) => (
{NAV_ITEMS.map((item) => (
<Link
key={item.href}
href={item.href}
@@ -64,12 +66,12 @@ export function AccountNav({ wishlistEnabled }: { wishlistEnabled: boolean }) {
</nav>
{/* Mobile — horizontal tab bar, below sm. overflow-x-auto rather
than wrapping: 4 items at once already fits most phones, and a
than wrapping: 3 items at once already fits most phones, and a
scrollable single row reads clearly as "more tabs this way"
rather than a wrapped second line competing for attention with
the page content right below it. */}
<nav className="sm:hidden flex items-center gap-2 overflow-x-auto pb-1 -mx-[var(--layout-padding-x)] px-[var(--layout-padding-x)]">
{items.map((item) => (
{NAV_ITEMS.map((item) => (
<Link
key={item.href}
href={item.href}
+19 -6
View File
@@ -1,6 +1,5 @@
import type { ReactNode } from "react";
import { Footer } from "../../components/Footer";
import { getWishlistEnabled } from "../../lib/payload";
import { AccountNav } from "./AccountNav";
// Shared shell for every logged-in /konto/* page (bestellungen, merkliste,
@@ -12,15 +11,29 @@ import { AccountNav } from "./AccountNav";
// exactly as before — this only replaces the outer chrome, not the
// page-specific logic each page still needs (e.g. merkliste's return-URL
// login redirect, profil's second profile-fetch redirect).
export async function KontoShell({ children }: { children: ReactNode }) {
const wishlistEnabled = await getWishlistEnabled();
//
// `customer` is rendered here, once, so "Eingeloggt als …" looks and
// appears identically on every /konto/* page — it used to be hand-copied
// onto individual pages (bestellungen had it, merkliste/profil didn't),
// which read as inconsistent rather than a deliberate per-page choice.
export async function KontoShell({
children,
customer,
}: {
children: ReactNode;
customer: { email: string; customerNumber: string };
}) {
return (
<>
<main className="flex flex-col flex-1 bg-bg-base">
<div className="flex flex-col sm:flex-row gap-6 sm:gap-10 w-full max-w-[75rem] mx-auto px-[var(--layout-padding-x)] pt-8 sm:pt-10 pb-16">
<AccountNav wishlistEnabled={wishlistEnabled} />
<div className="flex-1 min-w-0 flex flex-col">{children}</div>
<AccountNav />
<div className="flex-1 min-w-0 flex flex-col gap-6">
<p className="text-body-sm text-text-muted">
Eingeloggt als {customer.email} (Kundennummer {customer.customerNumber})
</p>
{children}
</div>
</div>
</main>
<Footer />
+1 -1
View File
@@ -40,7 +40,7 @@ export default async function KontoMerklistePage() {
const initialProducts = await getProductsByIds(wishlistItems.map((i) => i.productId));
return (
<KontoShell>
<KontoShell customer={session.customer}>
<Reveal className="flex flex-col gap-6 items-start w-full">
<p className="font-semibold text-h-feature text-text-primary" style={{ fontFamily: "var(--font-lora)" }}>
Meine Merkliste
+1 -4
View File
@@ -28,11 +28,8 @@ export default async function KontoProfilPage({
const { verified } = await searchParams;
return (
<KontoShell>
<KontoShell customer={{ email: profile.email, customerNumber: session.customer.customerNumber }}>
<div className="flex flex-col gap-10 items-start w-full max-w-[40rem]">
<p className="font-semibold text-h-feature text-text-primary" style={{ fontFamily: "var(--font-lora)" }}>
Mein Profil
</p>
<VerificationBanner emailVerified={profile.emailVerified} justVerified={verified === "1" || verified === "0" ? verified : undefined} />
<ProfileForm profile={profile} shippingCountries={shippingCountries} />
<PasswordForm email={profile.email} />