From 701835e9f32e86543d710a517b2fad4f7c5b7268 Mon Sep 17 00:00:00 2001 From: nessi Date: Thu, 9 Jul 2026 13:16:50 +0200 Subject: [PATCH] feat: redesign login page with split layout, feature highlights, and improved UX Add two-column layout with left panel showcasing product features including inventory sync, policy audit mode, and preview capabilities with animated decorative elements, redesign right panel with larger form inputs and focus states, remove hardcoded demo credentials to require manual entry, add autocomplete attributes for username and password fields, implement disabled state for submit button when fields are empty, add animations --- frontend/src/pages/Login.tsx | 105 +++++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 24 deletions(-) diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index d2ba941..09e07cc 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -1,14 +1,14 @@ import { FormEvent, useState } from "react"; import { useNavigate } from "react-router-dom"; -import { Moon, ShieldCheck, Sun } from "lucide-react"; +import { Activity, LockKeyhole, Moon, Network, ShieldCheck, Sun } from "lucide-react"; import { login } from "../api/client"; import { useTheme } from "../stores/theme"; export function Login() { const navigate = useNavigate(); - const [email, setEmail] = useState("admin@nexafabric.local"); - const [password, setPassword] = useState("ChangeMe_UseEnvInstead"); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); const [error, setError] = useState(""); const { dark, toggle } = useTheme(); @@ -24,36 +24,93 @@ export function Login() { } return ( -
+
-
-
-
- +
+
+
+
+
+
-
-

NexaFabric

-

Sign in to the control plane

+
+
+
+ +
+
+
NexaFabric
+
Network and security control plane
+
+
+
+

+ Operate Proxmox networks with intent. +

+

+ Centralize inventory, IPAM, segmentation policy, firewall preview, and audit history without patching Proxmox. +

+
+ {[ + ["Inventory sync", Network], + ["Policy audit mode", Activity], + ["Preview before apply", LockKeyhole], + ].map(([label, Icon]) => { + const LucideIcon = Icon as typeof Network; + return ( +
+ + {String(label)} +
+ ); + })} +
+
+
Read first. Simulate second. Apply only after confirmation.
-
- - - {error ?
{error}
: null} - - +
+
+
+
+
+ +
+

Sign in

+

Use the administrator account created during setup.

+
+ + + {error ?
{error}
: null} + +
+
+
); }