<div class="login-container">
<div class="login-form">
<div class="form-header">
<h2 class="form-title">Bienvenido de Nuevo</h2>
<p class="form-subtitle">Inicia sesión en tu cuenta</p>
</div>
<form class="auth-form" id="loginForm">
<div class="input-group">
<div class="input-wrapper">
<input type="email" id="email" class="form-input" placeholder=" " required>
<label for="email" class="form-label">Correo Electrónico</label>
<div class="input-icon">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 4l-8 5-8-5V6l8 5 8-5v2z"/>
</svg>
</div>
</div>
</div>
<div class="input-group">
<div class="input-wrapper">
<input type="password" id="password" class="form-input" placeholder=" " required>
<label for="password" class="form-label">Contraseña</label>
<div class="input-icon">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z"/>
</svg>
</div>
<button type="button" class="password-toggle" id="passwordToggle">
<svg class="eye-open" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/>
</svg>
<svg class="eye-closed" viewBox="0 0 24 24" fill="currentColor" style="display: none;">
<path d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"/>
</svg>
</button>
</div>
</div>
<div class="form-options">
<label class="checkbox-wrapper">
<input type="checkbox" id="remember" class="checkbox-input">
<span class="checkbox-custom"></span>
<span class="checkbox-label">Recordarme</span>
</label>
<a href="#" class="forgot-link">¿Olvidaste tu contraseña?</a>
</div>
<button type="submit" class="login-btn">
<span class="btn-text">Iniciar Sesión</span>
<div class="btn-loader" style="display: none;">
<div class="spinner"></div>
</div>
</button>
</form>
<div class="divider">
<span class="divider-text">O continúa con</span>
</div>
<div class="social-login">
<button class="social-btn google-btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" fill="#4285F4"/>
<path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/>
<path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/>
<path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/>
</svg>
Google
</button>
<button class="social-btn github-btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
GitHub
</button>
</div>
<div class="form-footer">
<p class="signup-text">
¿No tienes una cuenta?
<a href="#" class="signup-link">Regístrate</a>
</p>
</div>
</div>
</div>
.login-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 20px;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
}
.login-form {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(20px);
border-radius: 20px;
padding: 40px;
width: 100%;
max-width: 400px;
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.1),
0 0 0 1px rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.form-header {
text-align: center;
margin-bottom: 32px;
}
.form-title {
font-size: 28px;
font-weight: 700;
color: #1a1a1a;
margin: 0 0 8px 0;
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.form-subtitle {
font-size: 16px;
color: #666;
margin: 0;
}
.input-group {
margin-bottom: 24px;
}
.input-wrapper {
position: relative;
}
.form-input {
width: 100%;
height: 56px;
padding: 16px 48px 16px 16px;
border: 2px solid #e1e5e9;
border-radius: 12px;
font-size: 16px;
background: #fff;
transition: all 0.3s ease;
outline: none;
box-sizing: border-box;
}
.form-input:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
.form-input:focus + .form-label,
.form-input:not(:placeholder-shown) + .form-label {
transform: translateY(-28px) scale(0.85);
color: #667eea;
background: #fff;
padding: 0 8px;
}
.form-label {
position: absolute;
left: 16px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: #999;
pointer-events: none;
transition: all 0.3s ease;
background: transparent;
}
.input-icon {
position: absolute;
right: 16px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
color: #999;
transition: color 0.3s ease;
}
.form-input:focus ~ .input-icon {
color: #667eea;
}
.password-toggle {
position: absolute;
right: 48px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
width: 20px;
height: 20px;
color: #999;
cursor: pointer;
transition: color 0.3s ease;
}
.password-toggle:hover {
color: #667eea;
}
.password-toggle svg {
width: 100%;
height: 100%;
}
.form-options {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 32px;
}
.checkbox-wrapper {
display: flex;
align-items: center;
cursor: pointer;
}
.checkbox-input {
display: none;
}
.checkbox-custom {
width: 18px;
height: 18px;
border: 2px solid #e1e5e9;
border-radius: 4px;
margin-right: 8px;
position: relative;
transition: all 0.3s ease;
}
.checkbox-input:checked + .checkbox-custom {
background: #667eea;
border-color: #667eea;
}
.checkbox-input:checked + .checkbox-custom::after {
content: '';
position: absolute;
left: 5px;
top: 2px;
width: 4px;
height: 8px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.checkbox-label {
font-size: 14px;
color: #666;
}
.forgot-link {
font-size: 14px;
color: #667eea;
text-decoration: none;
transition: color 0.3s ease;
}
.forgot-link:hover {
color: #5a6fd8;
}
.login-btn {
width: 100%;
height: 56px;
background: linear-gradient(135deg, #667eea, #764ba2);
border: none;
border-radius: 12px;
color: white;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
margin-bottom: 24px;
}
.login-btn:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
}
.login-btn:active {
transform: translateY(0);
}
.login-btn.loading .btn-text {
opacity: 0;
}
.login-btn.loading .btn-loader {
display: flex !important;
}
.btn-loader {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
align-items: center;
justify-content: center;
}
.spinner {
width: 20px;
height: 20px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top: 2px solid white;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.divider {
position: relative;
text-align: center;
margin: 24px 0;
}
.divider::before {
content: '';
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 1px;
background: #e1e5e9;
}
.divider-text {
background: rgba(255, 255, 255, 0.95);
padding: 0 16px;
font-size: 14px;
color: #999;
}
.social-login {
display: flex;
gap: 12px;
margin-bottom: 24px;
}
.social-btn {
flex: 1;
height: 48px;
border: 2px solid #e1e5e9;
border-radius: 12px;
background: white;
color: #666;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.social-btn:hover {
border-color: #667eea;
background: #f8f9ff;
}
.social-btn svg {
width: 20px;
height: 20px;
}
.google-btn:hover {
border-color: #4285f4;
background: #f8f9ff;
}
.github-btn:hover {
border-color: #333;
background: #f8f9ff;
}
.form-footer {
text-align: center;
}
.signup-text {
font-size: 14px;
color: #666;
margin: 0;
}
.signup-link {
color: #667eea;
text-decoration: none;
font-weight: 500;
transition: color 0.3s ease;
}
.signup-link:hover {
color: #5a6fd8;
}
/* Responsive design */
@media (max-width: 480px) {
.login-container {
padding: 16px;
}
.login-form {
padding: 32px 24px;
}
.form-title {
font-size: 24px;
}
.social-login {
flex-direction: column;
}
}
document.addEventListener('DOMContentLoaded', () => {
const loginForm = document.getElementById('loginForm');
const passwordToggle = document.getElementById('passwordToggle');
const passwordInput = document.getElementById('password');
const loginBtn = loginForm.querySelector('.login-btn');
const emailInput = document.getElementById('email');
const rememberCheckbox = document.getElementById('remember');
// Password visibility toggle
passwordToggle.addEventListener('click', () => {
const eyeOpen = passwordToggle.querySelector('.eye-open');
const eyeClosed = passwordToggle.querySelector('.eye-closed');
if (passwordInput.type === 'password') {
passwordInput.type = 'text';
eyeOpen.style.display = 'none';
eyeClosed.style.display = 'block';
} else {
passwordInput.type = 'password';
eyeOpen.style.display = 'block';
eyeClosed.style.display = 'none';
}
});
// Form validation
function validateEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
function validatePassword(password) {
return password.length >= 6;
}
function showError(input, message) {
// Remove existing error
const existingError = input.parentNode.querySelector('.error-message');
if (existingError) {
existingError.remove();
}
// Add error styling
input.style.borderColor = '#e74c3c';
// Add error message
const errorDiv = document.createElement('div');
errorDiv.className = 'error-message';
errorDiv.textContent = message;
errorDiv.style.cssText = `
color: #e74c3c;
font-size: 12px;
margin-top: 4px;
margin-left: 4px;
`;
input.parentNode.appendChild(errorDiv);
}
function clearError(input) {
const errorMessage = input.parentNode.querySelector('.error-message');
if (errorMessage) {
errorMessage.remove();
}
input.style.borderColor = '#e1e5e9';
}
// Real-time validation
emailInput.addEventListener('blur', () => {
if (emailInput.value && !validateEmail(emailInput.value)) {
showError(emailInput, 'Por favor ingresa un correo electrónico válido');
} else {
clearError(emailInput);
}
});
passwordInput.addEventListener('blur', () => {
if (passwordInput.value && !validatePassword(passwordInput.value)) {
showError(passwordInput, 'La contraseña debe tener al menos 6 caracteres');
} else {
clearError(passwordInput);
}
});
// Form submission
loginForm.addEventListener('submit', async (e) => {
e.preventDefault();
const email = emailInput.value.trim();
const password = passwordInput.value;
const remember = rememberCheckbox.checked;
// Clear previous errors
clearError(emailInput);
clearError(passwordInput);
let hasErrors = false;
// Validate email
if (!email) {
showError(emailInput, 'El correo electrónico es requerido');
hasErrors = true;
} else if (!validateEmail(email)) {
showError(emailInput, 'Por favor ingresa un correo electrónico válido');
hasErrors = true;
}
// Validate password
if (!password) {
showError(passwordInput, 'La contraseña es requerida');
hasErrors = true;
} else if (!validatePassword(password)) {
showError(passwordInput, 'La contraseña debe tener al menos 6 caracteres');
hasErrors = true;
}
if (hasErrors) {
return;
}
// Show loading state
loginBtn.classList.add('loading');
loginBtn.disabled = true;
try {
// Simulate API call
await new Promise(resolve => setTimeout(resolve, 2000));
// Simulate successful login
console.log('Inicio de sesión exitoso:', { email, remember });
// Show success message
const successDiv = document.createElement('div');
successDiv.textContent = '¡Inicio de sesión exitoso! Redirigiendo...';
successDiv.style.cssText = `
background: #d4edda;
color: #155724;
padding: 12px;
border-radius: 8px;
margin-bottom: 16px;
text-align: center;
border: 1px solid #c3e6cb;
`;
loginForm.insertBefore(successDiv, loginForm.firstChild);
// Simulate redirect after delay
setTimeout(() => {
console.log('Redirigiendo al panel de control...');
}, 1500);
} catch (error) {
console.error('Error en el inicio de sesión:', error);
// Show error message
const errorDiv = document.createElement('div');
errorDiv.textContent = 'Error en el inicio de sesión. Por favor verifica tus credenciales.';
errorDiv.style.cssText = `
background: #f8d7da;
color: #721c24;
padding: 12px;
border-radius: 8px;
margin-bottom: 16px;
text-align: center;
border: 1px solid #f5c6cb;
`;
loginForm.insertBefore(errorDiv, loginForm.firstChild);
} finally {
// Hide loading state
loginBtn.classList.remove('loading');
loginBtn.disabled = false;
}
});
// Social login handlers
const socialBtns = document.querySelectorAll('.social-btn');
socialBtns.forEach(btn => {
btn.addEventListener('click', (e) => {
const provider = btn.classList.contains('google-btn') ? 'Google' : 'GitHub';
console.log(`Inicio de sesión con ${provider} clickeado`);
// Add loading state to social button
btn.style.opacity = '0.7';
btn.disabled = true;
// Simulate social login
setTimeout(() => {
btn.style.opacity = '1';
btn.disabled = false;
console.log(`Inicio de sesión con ${provider} completado`);
}, 1500);
});
});
// Input focus effects
const inputs = document.querySelectorAll('.form-input');
inputs.forEach(input => {
input.addEventListener('focus', () => {
input.parentNode.classList.add('focused');
});
input.addEventListener('blur', () => {
input.parentNode.classList.remove('focused');
});
});
// Keyboard shortcuts
document.addEventListener('keydown', (e) => {
// Enter key to submit form
if (e.key === 'Enter' && (emailInput === document.activeElement || passwordInput === document.activeElement)) {
loginForm.dispatchEvent(new Event('submit'));
}
});
});