/* global React */ const { useState, useEffect } = React; // ─────────── Landing ─────────── const ApplicantLanding = ({ onStart }) => { const { tweaks } = useApp(); const T = tweaks.lang === 'ES'; return (
{T ? 'Orquestación digital para expedientes de discapacidad' : 'Digital case orchestration for disability claims'}
SSDI SSI VA Disability VA Healthcare

{T ? <>Un portal claro para casos complejos. : <>A clearer future for complex claims.}

{T ? 'GovEase combina orientación conversacional, revisión humana y un flujo seguro de documentos para que cada solicitud avance con menos fricción y más confianza.' : 'GovEase combines conversational guidance, human review, and secure document flow so every application moves with less friction and more confidence.'}

onStart('signup')}> {T ? 'Crear expediente' : 'Create your case'} onStart('signin')}> {T ? 'Ingresar a un caso existente' : 'Resume an existing case'}
{[ [T ? 'Flujo bilingüe' : 'Bilingual flow', 'EN / ES'], [T ? 'Revisión humana' : 'Human review', '100%'], [T ? 'Guardado continuo' : 'Continuous save', '< 2s'], ].map(([label, value]) => (
{label}
{value}
))}
{T ? 'Centro de misión' : 'Mission control'}
{T ? 'Un mismo sistema para solicitantes, reviewers y admins.' : 'One system for applicants, reviewers, and admins.'}
{[ [T ? 'Ingreso guiado por conversación' : 'Conversation-led intake', T ? 'Preguntas adaptativas con guardado continuo.' : 'Adaptive questions with save-and-resume built in.'], [T ? 'Documentos con validación' : 'Document intelligence', T ? 'Checklist dinámico, carga segura y reenvío guiado.' : 'Dynamic checklist, secure uploads, and guided re-uploads.'], [T ? 'Supervisión verificable' : 'Verifiable oversight', T ? 'Timeline de auditoría, decisiones humanas y trazabilidad.' : 'Audit timeline, human approvals, and full traceability.'], ].map(([title, body]) => (
{title}
{body}
))}
{[ [T ? 'Applicant' : 'Applicant', T ? 'Inicio, autenticación, intake, dashboard, firma final.' : 'Welcome, auth, intake, dashboard, final acknowledgment.'], [T ? 'Reviewer' : 'Reviewer', T ? 'Queue, workspace, diff, revisión documental, escalación.' : 'Queue, workspace, diff view, document review, escalation.'], [T ? 'Admin' : 'Admin', T ? 'Monitoreo, roles, auditoría, IA, retención.' : 'Monitoring, roles, audit, AI activity, retention.'], ].map(([title, body]) => (
{title}
{body}
))}
); }; // ─────────── Sign In / Sign Up ─────────── const ApplicantAuth = ({ mode = 'signin', onDone, onSwitch, onForgot }) => { const { tweaks } = useApp(); const T = tweaks.lang === 'ES'; const [show, setShow] = useState(false); const isSignup = mode === 'signup'; return (
{isSignup ? (T?'Nueva cuenta':'Create account') : (T?'Ingresar':'Sign in')}

{isSignup ? (T?'Empiece su expediente.':'Start your case.') : (T?'Bienvenido de nuevo.':'Welcome back.')}

{isSignup ? (T?'Todo lo que ingrese se guarda de forma segura. Puede pausar cuando quiera.' : 'Everything you enter is saved securely. You can pause anytime.') : (T?'Ingrese a su expediente en curso.' : 'Pick up where you left off.')}

{isSignup && (
)}
{isSignup && ( )} {!isSignup && (
{ if (e.target.tagName === 'A') onForgot?.(); }}> {T?'¿Olvidó su contraseña?':'Forgot password?'}
)} {isSignup ? (T?'Crear cuenta':'Create account') : (T?'Ingresar':'Sign in')}
{T?'O':'Or'}
{T?'Continuar con ID.me':'Continue with ID.me'} {T?'Continuar con Login.gov':'Continue with Login.gov'}

{isSignup ? <>{T?'¿Ya tiene cuenta? ':'Already have an account? '}onSwitch('signin')}>{T?'Ingresar':'Sign in'} : <>{T?'¿Nuevo aquí? ':'New here? '}onSwitch('signup')}>{T?'Cree una cuenta':'Create an account'} }

); }; // ─────────── MFA ─────────── const ApplicantMFA = ({ onDone }) => { const { tweaks } = useApp(); const T = tweaks.lang === 'ES'; const [code, setCode] = useState(['','','','','','']); const [method, setMethod] = useState('app'); const onKey = (i, v) => { if (!/^[0-9]?$/.test(v)) return; const next = [...code]; next[i] = v; setCode(next); if (v && i < 5) document.getElementById('mfa-'+(i+1))?.focus(); }; const filled = code.every(c=>c); return (

{T?'Verifique que es usted':'Verify it\'s you'}

{T?'Ingrese el código de 6 dígitos desde ':'Enter the 6-digit code from '} {method==='app' ? (T?'su app de autenticación':'your authenticator app') : T?'tu SMS a •••• 3129':'your SMS to •••• 3129'}.

{code.map((c, i) => ( onKey(i, e.target.value)} className="input" style={{textAlign:'center', fontFamily:'var(--mono)', fontSize:22, padding:'14px 0', letterSpacing:'.02em'}} maxLength={1} inputMode="numeric" /> ))}
{T?'Verificar':'Verify'}

{T?'¿Problemas? ':'Having trouble? '}{T?'Usar código de respaldo':'Use a backup code'}

); }; // ─────────── Consent ─────────── const ApplicantConsent = ({ onDone }) => { const { tweaks } = useApp(); const T = tweaks.lang === 'ES'; const [checks, setChecks] = useState({a:false,b:false,c:false}); const ready = checks.a && checks.b && checks.c; return (
{T?'Consentimiento informado':'Informed consent'}
v 2026.04 · REV 12

{T ? 'Antes de comenzar, lea y acepte.' : 'Before we begin, please read and agree.'}

{T ? 'Queremos que entienda qué hacemos con su información. Puede retirar su consentimiento en cualquier momento.' : 'We want you to understand how we use your information. You can withdraw consent anytime.'}

{[ { k:'a', title:T?'Uso de su información':'How we use your information', body:T?'Su información se usa únicamente para preparar esta solicitud. No se vende, no se comparte con terceros para marketing, y no se envía a ninguna agencia sin su aprobación.':'Your information is used only to prepare this application. It is never sold, shared for marketing, or submitted to any agency without your approval.'}, { k:'b', title:T?'Asistencia con IA + revisión humana':'AI assistance + human review', body:T?'Usamos IA para ayudarle a redactar su solicitud. Cada paso es registrado. Un revisor humano verifica todo antes del envío.':'We use AI to help draft your application. Every step is logged. A human reviewer checks everything before anything is submitted.'}, { k:'c', title:T?'Retención y eliminación':'Retention & deletion', body:T?'Su expediente se retiene por 24 meses después del envío. Puede solicitar eliminación en cualquier momento desde su panel.':'Your case is retained for 24 months after submission. You can request deletion anytime from your dashboard.'}, ].map(item => ( ))}
{T?'Versión con fecha':'Timestamped'}: {T?'Su consentimiento se registra con fecha y versión. Copia disponible en su panel.':'Your consent is recorded with a timestamp and version number. A copy is always available in your dashboard.'}
{T?'Imprimir / Descargar PDF':'Print / Save as PDF'}
{T?'Cancelar':'Not now'} {T?'Acepto y continuar':'I agree — continue'}
); }; // ─────────── Forgot Password ─────────── const ApplicantForgot = ({ onDone, onBack }) => { const [sent, setSent] = useState(false); return (
{!sent ? <>

Reset your password

We'll email you a link to reset. Links expire after 30 minutes.

setSent(true)}> Send reset link : <>

Check your email

We sent a reset link to maria.r@outlook.com. It expires in 30 minutes.

Back to sign in

Didn't get it? Resend

}
); }; // ─────────── Language Selection ─────────── const LanguageGate = ({ onDone }) => { const { setTweaks } = useApp(); const pick = (lang) => { setTweaks({lang}); onDone(); }; return (
Ge GovEase

Choose your language

Elija su idioma preferido. Puede cambiarlo en cualquier momento.

More languages coming · Más idiomas en camino

); }; Object.assign(window, { ApplicantLanding, ApplicantAuth, ApplicantMFA, ApplicantConsent, ApplicantForgot, LanguageGate });