From 522cdfd36879860d9d57e4da20d1e5c2f850b77e Mon Sep 17 00:00:00 2001 From: Schalli Date: Fri, 25 Sep 2026 14:49:01 +0200 Subject: [PATCH] style(web): Anmeldeseite geteilt mit dunklem Markenpanel und Farbmosaik Ab lg links 45 % dunkles Panel (Ton der App-Leiste) mit Bildmarke, Claim und stillem Mosaik aus den Modulfarben; rechts die Anmeldekarte auf der Arbeitsflaeche. Darunter nur die Karte. Co-Authored-By: Claude Opus 5.5 (1M context) --- apps/web/src/app/(auth)/login/page.tsx | 145 ++++++++++++++++--------- 1 file changed, 94 insertions(+), 51 deletions(-) diff --git a/apps/web/src/app/(auth)/login/page.tsx b/apps/web/src/app/(auth)/login/page.tsx index 58377e6..639eefb 100644 --- a/apps/web/src/app/(auth)/login/page.tsx +++ b/apps/web/src/app/(auth)/login/page.tsx @@ -5,14 +5,13 @@ import { useTranslations } from 'next-intl'; import Link from 'next/link'; import { login } from '@/lib/auth-actions'; import { sanitizeNextPath } from '@/lib/safe-next'; -import { BRAND_YELLOW } from '@/components/brand/brand'; import { TesseraLogo } from '@/components/brand/tessera-logo'; import { DesktopDownloadLinks } from '@/components/desktop/desktop-download-links'; /** - * Split-screen login page (D-01). - * Left: Tessera branding on the brand yellow background (BRAND_YELLOW). - * Right: Login form on neutral background. + * Split-screen login page (D-01), Design „Mosaik“. + * Left (ab lg): dunkles Markenpanel mit Bildmarke, Claim und Farbmosaik. + * Right: Anmeldekarte auf der Arbeitsflaeche; unter lg nur die Karte. * No sidebar or header (D-04, handled by (auth) layout). */ export default function LoginPage() { @@ -42,41 +41,52 @@ export default function LoginPage() { } return ( -
- {/* Left: Branding panel (hidden on mobile, visible on md+) */} -
-
- +
+ {/* Links (ab lg): dunkles Markenpanel im Ton der App-Leiste mit + grosser Bildmarke, Produktname, einem ruhigen Satz und einem + stillen Mosaik aus den Modulfarben — kein Verlauf, keine Animation. */} +
+ + +
+ +

+ {t('branding.claim')} +

+

+ {t('branding.tagline')} +

- {/* Right: Login form */} -
-
- {/* Mobile-only branding */} -
- -

- {t('branding.tagline')} -

+ {/* Rechts: Anmeldekarte zentriert auf der Arbeitsflaeche */} +
+
+ {/* Unter lg: Bildmarke ueber der Karte */} +
+
+
{/* Login heading */} -
-

+
+

{t('login')} -

+

+

+ {t('loginSubtitle')} +

{/* Error message */} @@ -87,12 +97,12 @@ export default function LoginPage() { )} {/* Login form */} -
+ {/* Username */} -
+
@@ -102,16 +112,15 @@ export default function LoginPage() { type="text" required autoComplete="username" - className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2" - placeholder={t('username')} + className="flex h-8 w-full rounded-md border border-input bg-card px-2.5 text-sm placeholder:text-muted-foreground" />
{/* Password */} -
+
@@ -121,33 +130,30 @@ export default function LoginPage() { type="password" required autoComplete="current-password" - className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2" - placeholder={t('password')} + className="flex h-8 w-full rounded-md border border-input bg-card px-2.5 text-sm placeholder:text-muted-foreground" />
- {/* Remember me (D-02) */} -
+ {/* Angemeldet bleiben (D-02) und Passwort vergessen (D-03) in einer Zeile */} +
+
- - {/* Forgot password link (D-03) */} -
{t('forgotPassword')} @@ -157,7 +163,7 @@ export default function LoginPage() {
{/* Desktop-App-Link (D-12), blendet sich aus ohne API-Antwort */} - +
+ +
); } + +/** + * Stilles Mosaik aus den Modulfarben (Design „Mosaik“): acht Kacheln in einem + * lockeren 4 x 3-Raster, eine davon in der Akzentfarbe und — wie die + * Signalkachel der Bildmarke — leicht gedreht. Rein dekorativ. + */ +function LoginMosaic() { + const tiles: { col: number; row: number; color: string; rotate?: boolean }[] = [ + { col: 1, row: 1, color: 'oklch(0.56 0.09 195)' }, + { col: 2, row: 1, color: 'oklch(0.55 0.14 292)' }, + { col: 4, row: 1, color: 'oklch(0.58 0.14 250)' }, + { col: 2, row: 2, color: 'oklch(0.62 0.135 68)' }, + { col: 3, row: 2, color: 'var(--primary)', rotate: true }, + { col: 4, row: 2, color: 'oklch(0.58 0.16 35)' }, + { col: 1, row: 3, color: 'oklch(0.58 0.12 150)' }, + { col: 3, row: 3, color: 'oklch(1 0 0 / 0.1)' }, + ]; + return ( + + ); +}