// Reset-password page — rendered when pathname = /reset-password function ResetPasswordOverlay({ token }) { const [password, setPassword] = React.useState(''); const [confirm, setConfirm] = React.useState(''); const [status, setStatus] = React.useState(null); // null | 'loading' | 'error' | 'success' const [errMsg, setErrMsg] = React.useState(''); async function submit(e) { e?.preventDefault?.(); if (!password || !confirm) { setStatus('error'); setErrMsg('Complete todos los campos.'); return; } if (password !== confirm) { setStatus('error'); setErrMsg('Las contraseñas no coinciden.'); return; } if (password.length < 8) { setStatus('error'); setErrMsg('La contraseña debe tener al menos 8 caracteres.'); return; } setStatus('loading'); setErrMsg(''); try { const res = await fetch('/auth/reset-password', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token, password }), }); if (!res.ok) { const data = await res.json().catch(() => ({})); setStatus('error'); setErrMsg(data.detail || 'Error al restablecer la contraseña.'); return; } setStatus('success'); setTimeout(() => { window.location.href = '/'; }, 2200); } catch (_) { setStatus('error'); setErrMsg('Error de conexión.'); } } const wrapStyle = { position:'fixed', inset:0, display:'flex', alignItems:'center', justifyContent:'center', background:'linear-gradient(135deg,#0F1524 0%, #142036 50%, #0A0E1A 100%)', zIndex:9999 }; const cardStyle = { width:420, background:BC.surface, borderRadius:12, boxShadow:'0 30px 80px rgba(0,0,0,.5)', overflow:'hidden', position:'relative', zIndex:1 }; const bgGlow = { position:'absolute', inset:0, backgroundImage:'radial-gradient(circle at 20% 30%, rgba(34,144,206,.18) 0%, transparent 40%)', pointerEvents:'none' }; const brandStrip = (