<!doctype html>
<html lang=»es»>
<head>
<meta charset=»utf-8″ />
<meta name=»viewport» content=»width=device-width,initial-scale=1″ />
<title>Acceso a Plataforma</title>
<style>
:root{
–bg:#0b0f16; –card:#111827; –muted:#9ca3af; –text:#e5e7eb;
–line:#243244; –accent:#4f46e5; –accent2:#22c55e; –danger:#ef4444;
}
*{box-sizing:border-box}
body{
margin:0; min-height:100vh; display:grid; place-items:center;
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial;
background:
radial-gradient(900px 500px at 15% 10%, rgba(79,70,229,.28), transparent 60%),
radial-gradient(800px 600px at 85% 20%, rgba(34,197,94,.20), transparent 55%),
radial-gradient(700px 600px at 40% 95%, rgba(239,68,68,.12), transparent 55%),
var(–bg);
color:var(–text);
}
.wrap{width:min(980px, 92vw); display:grid; gap:18px; grid-template-columns: 1.1fr .9fr; align-items:stretch;}
@media (max-width: 900px){ .wrap{grid-template-columns:1fr; } }
.panel{
border:1px solid rgba(255,255,255,.08);
background: linear-gradient(180deg, rgba(17,24,39,.90), rgba(17,24,39,.72));
border-radius:18px; padding:26px; box-shadow: 0 22px 70px rgba(0,0,0,.45);
backdrop-filter: blur(10px);
}
.brand{
display:flex; gap:12px; align-items:center; margin-bottom:14px;
}
.logo{
width:42px; height:42px; border-radius:12px;
background: linear-gradient(135deg, rgba(79,70,229,.95), rgba(34,197,94,.85));
box-shadow: 0 10px 25px rgba(79,70,229,.25);
}
h1{margin:0; font-size:20px; letter-spacing:.3px;}
.sub{margin:8px 0 0; color:var(–muted); line-height:1.5; font-size:14px;}
.badges{display:flex; flex-wrap:wrap; gap:8px; margin-top:14px;}
.badge{
font-size:12px; color:var(–muted); border:1px solid rgba(255,255,255,.09);
padding:7px 10px; border-radius:999px; background: rgba(255,255,255,.03);
}
/* Form */
.form h2{margin:0 0 10px; font-size:18px;}
.note{
margin:0 0 16px; font-size:12px; color:var(–muted);
border-left:3px solid rgba(79,70,229,.9); padding-left:10px;
}
label{display:block; font-size:12px; color:var(–muted); margin:12px 0 6px;}
.field{
position:relative;
}
input{
width:100%; padding:12px 12px; border-radius:12px;
border:1px solid rgba(255,255,255,.10);
background: rgba(0,0,0,.18); color:var(–text);
outline:none; transition: .15s border, .15s box-shadow;
}
input:focus{
border-color: rgba(79,70,229,.85);
box-shadow: 0 0 0 4px rgba(79,70,229,.18);
}
.row{display:flex; justify-content:space-between; align-items:center; margin-top:10px; gap:10px;}
.chk{display:flex; align-items:center; gap:8px; color:var(–muted); font-size:12px;}
.chk input{width:auto; accent-color: var(–accent);}
a{color:#c7d2fe; text-decoration:none}
a:hover{text-decoration:underline}
.btn{
margin-top:16px; width:100%; padding:12px 14px; border-radius:12px;
border:1px solid rgba(255,255,255,.12);
background: linear-gradient(135deg, rgba(79,70,229,.95), rgba(79,70,229,.75));
color:white; font-weight:700; letter-spacing:.2px; cursor:pointer;
transition: transform .06s ease, filter .15s ease;
}
.btn:active{transform: translateY(1px)}
.btn:hover{filter: brightness(1.06)}
.msg{
margin-top:12px; font-size:13px; padding:10px 12px; border-radius:12px;
border:1px solid rgba(255,255,255,.10);
background: rgba(255,255,255,.04);
display:none;
}
.msg.ok{border-color: rgba(34,197,94,.35); background: rgba(34,197,94,.10)}
.msg.err{border-color: rgba(239,68,68,.35); background: rgba(239,68,68,.10)}
.foot{
margin-top:16px; color:var(–muted); font-size:12px; line-height:1.5;
}
.kpi{
display:grid; grid-template-columns:repeat(3,1fr); gap:10px; margin-top:18px;
}
.kpi .box{
padding:12px; border-radius:14px; background: rgba(255,255,255,.03);
border:1px solid rgba(255,255,255,.08);
}
.kpi .n{font-size:16px; font-weight:800;}
.kpi .t{font-size:12px; color:var(–muted); margin-top:4px;}
</style>
</head>
<body>
<div class=»wrap»>
<!– Left: marketing/info –>
<section class=»panel»>
<div class=»brand»>
<div class=»logo» aria-hidden=»true»></div>
<div>
<h1>Portal Seguro</h1>
<p class=»sub»>Accede con tu usuario y contraseña para continuar. Interfaz de ejemplo (demo) sin envío de datos.</p>
</div>
</div>
<div class=»badges»>
<span class=»badge»>Acceso cifrado</span>
<span class=»badge»>Gestión de sesiones</span>
<span class=»badge»>Auditoría de actividad</span>
<span class=»badge»>Protección anti-fuerza bruta</span>
</div>
<div class=»kpi»>
<div class=»box»>
<div class=»n»>99.9%</div>
<div class=»t»>Disponibilidad</div>
</div>
<div class=»box»>
<div class=»n»>2FA</div>
<div class=»t»>Opcional</div>
</div>
<div class=»box»>
<div class=»n»>ISO</div>
<div class=»t»>Buenas prácticas</div>
</div>
</div>
<p class=»foot»>
Nota: esta página es una maqueta. No uses credenciales reales.
Si necesitas conectarla a un backend legítimo, se hace con HTTPS + autenticación en servidor.
</p>
</section>
<!– Right: login –>
<section class=»panel form» aria-label=»Formulario de acceso»>
<h2>Iniciar sesión</h2>
<p class=»note»><strong>Demo:</strong> no se envía nada. Usuario: <b>demo</b> — Contraseña: <b>demo123</b></p>
<form id=»loginForm» autocomplete=»off»>
<label for=»user»>Usuario o correo</label>
<div class=»field»>
<input id=»user» name=»user» type=»text» placeholder=»[email protected]» required />
</div>
<label for=»pass»>Contraseña</label>
<div class=»field»>
<input id=»pass» name=»pass» type=»password» placeholder=»••••••••» required />
</div>
<div class=»row»>
<label class=»chk»>
<input type=»checkbox» id=»remember» />
Mantener sesión (demo)
</label>
<a href=»#» onclick=»return false;»>¿Olvidaste tu contraseña?</a>
</div>
<button class=»btn» type=»submit»>Acceder</button>
<div id=»msgOk» class=»msg ok»> Acceso concedido (demo). Redirigiendo…</div>
<div id=»msgErr» class=»msg err»> Usuario o contraseña incorrectos.</div>
<p class=»foot»>
Si esto es para una web real: nunca autentiques solo con JavaScript.
La validación real debe vivir en el servidor.
</p>
</form>
</section>
</div>
<script>
// Login simulado: NO envía datos, NO guarda credenciales.
const form = document.getElementById(«loginForm»);
const msgOk = document.getElementById(«msgOk»);
const msgErr = document.getElementById(«msgErr»);
form.addEventListener(«submit», (e) => {
e.preventDefault();
msgOk.style.display = «none»;
msgErr.style.display = «none»;
const user = document.getElementById(«user»).value.trim();
const pass = document.getElementById(«pass»).value;
// Credenciales DEMO
const ok = (user.toLowerCase() === «demo» || user.toLowerCase() === «[email protected]») && pass === «demo123»;
if (ok) {
msgOk.style.display = «block»;
setTimeout(() => {
// Simula redirección a un «dashboard» ficticio
alert(«Bienvenido (demo). Aquí iría tu panel.»);
}, 700);
} else {
msgErr.style.display = «block»;
}
});
</script>
</body>
</html>
Acceso Rápido