From e984cd09ed07bd39b99d01172b500f2af86be068 Mon Sep 17 00:00:00 2001 From: Talha Ahmed Date: Wed, 19 Aug 2026 19:12:01 +0500 Subject: [PATCH] Redesign login screen with the app's ledgr theme Navy brand panel (ledger-grid texture, purple glow, product pitch) + sign-in form on the canvas: input icons, show/hide password, inline error, entrance animation (motion-safe). Mobile collapses to the form with a compact brand header. Co-Authored-By: Claude Fable 5 --- ar-aging-app/frontend/src/pages/Login.tsx | 170 ++++++++++++++++++---- 1 file changed, 141 insertions(+), 29 deletions(-) diff --git a/ar-aging-app/frontend/src/pages/Login.tsx b/ar-aging-app/frontend/src/pages/Login.tsx index f9da737..184266d 100644 --- a/ar-aging-app/frontend/src/pages/Login.tsx +++ b/ar-aging-app/frontend/src/pages/Login.tsx @@ -1,12 +1,18 @@ import { FormEvent, useState } from "react"; -import { Landmark, LogIn } from "lucide-react"; +import { BadgeCheck, Eye, EyeOff, Landmark, Lock, LogIn, ShieldCheck, User } from "lucide-react"; import { Spinner } from "../components/ui"; import { useAuth } from "../auth"; +/** + * Sign-in screen: navy brand panel (desktop) + form on the app canvas. + * Uses the app's "ledgr" tokens — periwinkle primary, navy, lavender canvas — so the + * login feels like the first screen of the dashboard, not a bolt-on. + */ export default function Login() { const { login } = useAuth(); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); + const [showPw, setShowPw] = useState(false); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); @@ -24,41 +30,147 @@ export default function Login() { }; return ( -
-
-
- - +
+ {/* ---------------- brand panel (desktop) ---------------- */} +
+ + + {/* ---------------- sign-in form ---------------- */} +
+
+ {/* compact brand header for mobile, where the panel is hidden */} +
+ + + +
+
Amazon A/R Aging
+
Month-End Closing
+
+
+ +

Welcome back

+

Sign in to continue to this month's closing.

+ +
+
+ +
+ + setUsername(e.target.value)} + /> +
+
+ +
+ +
+ + setPassword(e.target.value)} + /> + +
+
+ + {error && ( +
+ {error} +
+ )} + + +
+ +

+ No account or forgot your password? Ask the administrator — accounts are + created and reset on the server, never self-service. +

+
+
+ + {/* one-time entrance; browsers honouring reduced motion skip it via motion-safe */} +
); }