feat(design): designauswahl mit klemmbaustein-look als standard

Sechs Designs (Klemmbaustein, Warm, Nachtblau, Bonbon, Bauklotz,
Schlicht) als Tokens je data-design, gewaehlt unter Konto und pro Geraet
im Cookie gespeichert. Dazu Noppen, Steinkontur, Platzhalter fuer Sets
ohne Bild, neues Logo, lokal gebuendelte Schriften und eine Startseite
mit Steinreihe und naechstem Termin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
unknown
2026-10-25 15:01:33 +01:00
co-authored by Claude Opus 5.5
parent e9093d0fad
commit 1b825b44c4
26 changed files with 1343 additions and 259 deletions
+6 -3
View File
@@ -1,5 +1,5 @@
import Link from 'next/link';
import { Blocks } from 'lucide-react';
import { BrickLogo } from '@/components/brick/logo';
import { DesktopNav } from './bottom-nav';
import { UserMenu } from './user-menu';
import type { SessionUser } from '@/lib/session';
@@ -8,8 +8,11 @@ export function AppHeader({ user }: { user: SessionUser }) {
return (
<header className="sticky top-0 z-40 border-b border-border bg-background/95 backdrop-blur">
<div className="mx-auto flex h-14 max-w-5xl items-center gap-3 px-4">
<Link href="/" className="flex items-center gap-2 font-semibold tracking-tight">
<Blocks className="size-5 text-primary" aria-hidden />
<Link
href="/"
className="flex items-center gap-2 text-lg font-bold tracking-tight [font-family:var(--font-display)]"
>
<BrickLogo className="h-6 w-7" />
<span>Bricktrack</span>
</Link>
<div className="flex-1" />
+16 -4
View File
@@ -18,7 +18,7 @@ export function BottomNav() {
return (
<nav
aria-label="Hauptnavigation"
className="fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 pb-[env(safe-area-inset-bottom)] backdrop-blur md:hidden"
className="fixed inset-x-0 bottom-0 z-40 border-t-[length:max(1px,var(--edge-w))] border-border bg-card/95 pb-[env(safe-area-inset-bottom)] backdrop-blur md:hidden"
>
<ul className="mx-auto flex max-w-lg">
{items.map((item) => {
@@ -30,10 +30,22 @@ export function BottomNav() {
aria-current={active ? 'page' : undefined}
className={cn(
'flex h-16 flex-col items-center justify-center gap-1 text-xs transition-colors',
active ? 'text-primary' : 'text-muted-foreground hover:text-foreground',
active
? 'font-bold text-foreground'
: 'font-medium text-muted-foreground hover:text-foreground',
)}
>
<item.icon className="size-5" aria-hidden />
{/* The active tab sits on a small plate, like a tile on a baseplate. */}
<span
className={cn(
'flex h-7 w-12 items-center justify-center rounded-[calc(var(--radius)*0.6)] border-[length:var(--edge-w)]',
active
? 'border-edge bg-secondary text-secondary-foreground'
: 'border-transparent',
)}
>
<item.icon className="size-5" aria-hidden />
</span>
{item.label}
</Link>
</li>
@@ -59,7 +71,7 @@ export function DesktopNav() {
className={cn(
'flex h-10 items-center gap-2 rounded-lg px-3 text-sm font-medium transition-colors',
active
? 'bg-muted text-foreground'
? 'border-[length:var(--edge-w)] border-edge bg-secondary text-secondary-foreground'
: 'text-muted-foreground hover:bg-muted/60 hover:text-foreground',
)}
>