import React, { useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { AlertCircle, ArrowRight, Loader2, Eye, EyeOff, Sparkles, CheckCircle2 } from 'lucide-react'; import { cn } from '@/lib/utils'; import { KROW_LOGO_URL } from '@/assets/brand'; import { Checkbox } from '@/components/ds'; import { base44 } from '@/api/base44Client'; import { startAdminSession } from '@/pages/admin/session'; const DEMO_EMAIL = 'demo@krow.app'; export default function AdminLogin() { const navigate = useNavigate(); const location = useLocation(); const from = location.state?.from; const returnTo = typeof from === 'string' && from.startsWith('/admin') && from !== '/admin/login' ? from : '/admin'; const [form, setForm] = useState({ email: DEMO_EMAIL, password: '', remember: true }); const [showPassword, setShowPassword] = useState(false); const [errors, setErrors] = useState({}); const [authError, setAuthError] = useState(''); const [status, setStatus] = useState('idle'); const validate = () => { const next = {}; if (!form.email.trim()) next.email = 'Enter your work email'; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email.trim())) next.email = 'Enter a valid email address'; if (!form.password) next.password = 'Enter your password'; else if (form.password.length < 8) next.password = 'Passwords are at least 8 characters'; setErrors(next); return Object.keys(next).length === 0; }; const submit = async (event) => { event.preventDefault(); setAuthError(''); if (!validate()) return; setStatus('loading'); await new Promise((r) => setTimeout(r, 900)); if (form.password.toLowerCase() === 'wrong') { setStatus('idle'); setAuthError('That email and password do not match an administrator account.'); return; } await base44.auth.updateMe({ account_type: 'admin' }); localStorage.setItem('activeRole', 'admin'); startAdminSession(); setStatus('success'); setTimeout(() => navigate(returnTo, { replace: true }), 320); }; const busy = status !== 'idle'; return (
{/* Left Visual Section — White & Yellow Theme */}
{/* Subtle Decorative Yellow Orb / Accents */}
{/* Top Brand & Badge */}
KROW Enterprise
{/* Central KROW Visual Image */}
KROW Logo Visual
{/* Bottom Hero Tagline */}
Recruiting Intelligence Platform

Workforce decisions powered by intelligence

AI-driven candidate screening, verified score dimensions, and talent matching.

{/* Right Login Form Section */}
{/* Header */}
KROW Admin

Welcome back

Sign in to manage hiring, candidates, talent intelligence, and workforce decisions.

{/* Error Alert */} {authError && (
)} {/* Form */}
{/* Email */}
setForm({ ...form, email: e.target.value })} className={cn( "w-full h-11 px-3.5 rounded-xl bg-[#FAF9F5] border text-sm text-[#0F172A] placeholder-slate-400 focus:outline-none transition-all", errors.email ? "border-red-500 focus:border-red-500" : "border-[#E2E8F0] focus:border-[#F59E0B] focus:ring-2 focus:ring-[#FEF3C7]" )} placeholder="name@company.com" /> {errors.email &&

{errors.email}

}
{/* Password */}
setForm({ ...form, password: e.target.value })} className={cn( "w-full h-11 pl-3.5 pr-10 rounded-xl bg-[#FAF9F5] border text-sm text-[#0F172A] placeholder-slate-400 focus:outline-none transition-all", errors.password ? "border-red-500 focus:border-red-500" : "border-[#E2E8F0] focus:border-[#F59E0B] focus:ring-2 focus:ring-[#FEF3C7]" )} placeholder="••••••••" />
{errors.password &&

{errors.password}

}
{/* Remember & Forgot */}
{/* Primary CTA Button — KROW Yellow Theme */}

Demo environment — enter any 8+ character password to sign in. Use wrong to test error validation.

); }