/* global React */ // Pantalla de inicio de sesión (multiusuario) — diseño split estilo CGR. // Izquierda: marca + accesos de demostración (autocompletan credenciales). // Derecha: formulario con validación, ver/ocultar contraseña y ruteo por rol. const { useState: useStateLog } = React; // Iconos no incluidos en window.Icons (candado / ojo tachado) como SVG inline. function LockGlyph({ size = 15 }) { return ( ); } function EyeOffGlyph({ size = 15 }) { return ( ); } function LoginScreen({ onLogin }) { const I = window.Icons; const accounts = window.DEMO_ACCOUNTS || []; const ROLES = window.ROLES || {}; const [email, setEmail] = useStateLog(''); const [password, setPassword] = useStateLog(''); const [showPwd, setShowPwd] = useStateLog(false); const [remember, setRemember] = useStateLog(true); const [error, setError] = useStateLog(''); const [selected, setSelected] = useStateLog(null); const [touched, setTouched] = useStateLog(false); const emailOk = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email.trim()); const canSubmit = emailOk && password.length > 0; const fill = (acc) => { setEmail(acc.email); setPassword(acc.password); setSelected(acc.role); setError(''); setTouched(false); }; const submit = (e) => { if (e) e.preventDefault(); setTouched(true); if (!canSubmit) return; const acc = accounts.find( a => a.email.toLowerCase() === email.trim().toLowerCase() && a.password === password ); if (!acc) { setError('Correo o contraseña incorrectos. Usa una de las cuentas de demostración de la izquierda.'); return; } onLogin && onLogin(acc); }; return (
{/* ---------- Panel izquierdo: marca + accesos demo ---------- */} {/* ---------- Panel derecho: formulario ---------- */}

Iniciar sesión

Ingresa con tu cuenta institucional.

{error && (
{error}
)}

¿Problemas para entrar? Contacta a la Dirección de Análisis de Datos de la CGR.

); } Object.assign(window, { LoginScreen });