Ibikubiye k'urubuga
Modern (Signup and Login) Form
Modern  (Signup and Login) Form on  Single Page
⭐ Exclusive Frontend Technology

Modern (Signup and Login) Form on Single Page

Modern (Signup and Login) Form

Software · · Jan 27, 2026
📁
Frontend Technology
Category
📚
Software
Subject
🕒
Jan 2026
Updated

Source Code Examples

HTML
HTML Code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modern Auth Form</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&family=Syne:wght@600;700;800&display=swap" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="form-container">
<div class="header">
<div class="logo">NEXUS</div>
<div class="subtitle">Welcome back, please enter your details</div>
</div>
<div class="tabs">
<button class="tab active" data-tab="login">Sign In</button>
<button class="tab" data-tab="register">Sign Up</button>
</div>
<!-- Login Form -->
<form id="loginForm" class="auth-form">
<div class="form-group">
<label for="loginEmail">Email Address</label>
<div class="input-wrapper">
<input
type="email"
id="loginEmail"
name="email"
placeholder="you@example.com"
autocomplete="email"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
</div>
<div class="form-group">
<label for="loginPassword">Password</label>
<div class="input-wrapper">
<input
type="password"
id="loginPassword"
name="password"
placeholder="Enter your password"
autocomplete="current-password"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
</div>
<button type="submit" class="submit-btn">Sign In</button>
</form>
<!-- Register Form -->
<form id="registerForm" class="auth-form hidden">
<div class="form-group">
<label for="registerName">Full Name</label>
<div class="input-wrapper">
<input
type="text"
id="registerName"
name="name"
placeholder="John Doe"
autocomplete="name"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
</div>
<div class="form-group">
<label for="registerEmail">Email Address</label>
<div class="input-wrapper">
<input
type="email"
id="registerEmail"
name="email"
placeholder="you@example.com"
autocomplete="email"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
</div>
<div class="form-group">
<label for="registerPassword">Password</label>
<div class="input-wrapper">
<input
type="password"
id="registerPassword"
name="password"
placeholder="Create a strong password"
autocomplete="new-password"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
<div class="password-strength">
<div class="strength-label">
<span>Password Strength</span>
<span class="strength-text"></span>
</div>
<div class="strength-bar">
<div class="strength-progress"></div>
</div>
</div>
<div class="requirements">
<div class="requirement" data-requirement="length">
<span class="requirement-icon">○</span>
<span>At least 8 characters</span>
</div>
<div class="requirement" data-requirement="uppercase">
<span class="requirement-icon">○</span>
<span>One uppercase letter</span>
</div>
<div class="requirement" data-requirement="lowercase">
<span class="requirement-icon">○</span>
<span>One lowercase letter</span>
</div>
<div class="requirement" data-requirement="number">
<span class="requirement-icon">○</span>
<span>One number</span>
</div>
<div class="requirement" data-requirement="special">
<span class="requirement-icon">○</span>
<span>One special character</span>
</div>
</div>
</div>
<div class="form-group">
<label for="registerConfirmPassword">Confirm Password</label>
<div class="input-wrapper">
<input
type="password"
id="registerConfirmPassword"
name="confirmPassword"
placeholder="Re-enter your password"
autocomplete="new-password"
>
<span class="validation-icon"></span>
</div>
<div class="error-message"></div>
<div class="success-message"></div>
</div>
<button type="submit" class="submit-btn">Create Account</button>
</form>
<div class="divider">
<span>Or continue with</span>
</div>
<div class="social-login">
<button class="social-btn" type="button">
<svg width="20" height="20" 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" type="button">
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0112 6.836c.85.004 1.705.114 2.504.336 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z"/>
</svg>
GitHub
</button>
</div>
<div class="footer-text">
Don't have an account? <a href="#" id="toggleLink">Sign up</a>
</div>
</div>
</div>
</body>
</html>
CSS
CSS Styles
:root {
    --primary: #0A0E27;
    --secondary: #1A1F3A;
    --accent: #00D9FF;
    --accent-dark: #00B8D4;
    --error: #FF4757;
    --success: #00D084;
    --warning: #FFA801;
    --text-primary: #FFFFFF;
    --text-secondary: #A0AEC0;
    --input-bg: rgba(255, 255, 255, 0.03);
    --input-border: rgba(255, 255, 255, 0.1);
    --input-focus: rgba(0, 217, 255, 0.3);
}
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body {
    font-family: 'DM Sans', sans-serif;
    background: linear-gradient(135deg, #0A0E27 0%, #1A1F3A 50%, #0F1629 100%);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    position: relative;
    overflow-x: hidden;
}
.container {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 480px;
    background: rgba(26, 31, 58, 0.6);
    backdrop-filter: blur(20px);
    border-radius: 24px;
    border: 1px solid rgba(255, 255, 255, 0.1);
    box-shadow: 0 24px 48px rgba(0, 0, 0, 0.4),
    0 0 80px rgba(0, 217, 255, 0.1);
    overflow: hidden;
    animation: slideUp 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes slideUp {
    from {
        opacity: 0;
        transform: translateY(40px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}
.form-container {
    padding: 48px 40px;
}
.header {
    text-align: center;
    margin-bottom: 40px;
}
.logo {
    font-family: 'Syne', sans-serif;
    font-size: 32px;
    font-weight: 800;
    background: linear-gradient(135deg, var(--accent) 0%, #8A2BE2 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
    margin-bottom: 12px;
    letter-spacing: -0.5px;
}
.subtitle {
    color: var(--text-secondary);
    font-size: 14px;
    font-weight: 400;
}
.tabs {
    display: flex;
    gap: 12px;
    margin-bottom: 32px;
    background: var(--input-bg);
    padding: 6px;
    border-radius: 12px;
    border: 1px solid var(--input-border);
}
.tab {
    flex: 1;
    padding: 12px;
    background: transparent;
    border: none;
    color: var(--text-secondary);
    font-family: 'DM Sans', sans-serif;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    border-radius: 8px;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    position: relative;
}
.tab.active {
    background: linear-gradient(135deg, var(--accent) 0%, #00B8D4 100%);
    color: var(--primary);
    box-shadow: 0 4px 16px rgba(0, 217, 255, 0.3);
}
.tab:hover:not(.active) {
    background: rgba(255, 255, 255, 0.05);
    color: var(--text-primary);
}
.form-group {
    margin-bottom: 24px;
    animation: fadeIn 0.5s ease-out;
    animation-fill-mode: both;
}
.form-group:nth-child(1) { animation-delay: 0.1s; }
.form-group:nth-child(2) { animation-delay: 0.2s; }
.form-group:nth-child(3) { animation-delay: 0.3s; }
.form-group:nth-child(4) { animation-delay: 0.4s; }
@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateY(10px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}
label {
    display: block;
    margin-bottom: 8px;
    color: var(--text-primary);
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 0.3px;
}
.input-wrapper {
    position: relative;
}
input {
    width: 100%;
    padding: 14px 16px;
    background: var(--input-bg);
    border: 2px solid var(--input-border);
    border-radius: 12px;
    color: var(--text-primary);
    font-family: 'DM Sans', sans-serif;
    font-size: 15px;
    transition: all 0.3s ease;
    outline: none;
}
input::placeholder {
    color: rgba(160, 174, 192, 0.5);
}
input:focus {
    border-color: var(--accent);
    background: rgba(255, 255, 255, 0.05);
    box-shadow: 0 0 0 4px var(--input-focus);
}
input.error {
    border-color: var(--error);
}
input.success {
    border-color: var(--success);
}
.validation-icon {
    position: absolute;
    right: 16px;
    top: 50%;
    transform: translateY(-50%);
    font-size: 18px;
    opacity: 0;
    transition: all 0.3s ease;
}
.validation-icon.show {
    opacity: 1;
    animation: bounceIn 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
@keyframes bounceIn {
    0% { transform: translateY(-50%) scale(0); }
    50% { transform: translateY(-50%) scale(1.2); }
    100% { transform: translateY(-50%) scale(1); }
}
.error-message,
.success-message {
    margin-top: 8px;
    font-size: 12px;
    font-weight: 500;
    display: flex;
    align-items: center;
    gap: 6px;
    opacity: 0;
    transform: translateY(-4px);
    transition: all 0.3s ease;
    max-height: 0;
    overflow: hidden;
}
.error-message.show,
.success-message.show {
    opacity: 1;
    transform: translateY(0);
    max-height: 50px;
}
.error-message {
    color: var(--error);
}
.success-message {
    color: var(--success);
}
.password-strength {
    margin-top: 12px;
    opacity: 0;
    transition: opacity 0.3s ease;
}
.password-strength.show {
    opacity: 1;
}
.strength-label {
    font-size: 12px;
    color: var(--text-secondary);
    margin-bottom: 6px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.strength-text {
    font-weight: 600;
}
.strength-text.weak { color: var(--error); }
.strength-text.medium { color: var(--warning); }
.strength-text.strong { color: var(--success); }
.strength-bar {
    height: 4px;
    background: rgba(255, 255, 255, 0.1);
    border-radius: 4px;
    overflow: hidden;
}
.strength-progress {
    height: 100%;
    width: 0;
    transition: all 0.4s ease;
    border-radius: 4px;
}
.strength-progress.weak {
    width: 33%;
    background: linear-gradient(90deg, var(--error), #FF6B81);
}
.strength-progress.medium {
    width: 66%;
    background: linear-gradient(90deg, var(--warning), #FFB84D);
}
.strength-progress.strong {
    width: 100%;
    background: linear-gradient(90deg, var(--success), #00E396);
}
.requirements {
    margin-top: 12px;
    padding: 12px;
    background: rgba(0, 0, 0, 0.2);
    border-radius: 8px;
    border: 1px solid rgba(255, 255, 255, 0.05);
    opacity: 0;
    max-height: 0;
    overflow: hidden;
    transition: all 0.3s ease;
}
.requirements.show {
    opacity: 1;
    max-height: 200px;
}
.requirement {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 12px;
    color: var(--text-secondary);
    margin-bottom: 6px;
    transition: color 0.3s ease;
}
.requirement:last-child {
    margin-bottom: 0;
}
.requirement.met {
    color: var(--success);
}
.requirement-icon {
    font-size: 14px;
    transition: transform 0.3s ease;
}
.requirement.met .requirement-icon {
    transform: scale(1.2);
}
.submit-btn {
    width: 100%;
    padding: 16px;
    background: linear-gradient(135deg, var(--accent) 0%, #00B8D4 100%);
    border: none;
    border-radius: 12px;
    color: var(--primary);
    font-family: 'DM Sans', sans-serif;
    font-size: 15px;
    font-weight: 700;
    cursor: pointer;
    transition: all 0.3s ease;
    box-shadow: 0 8px 24px rgba(0, 217, 255, 0.3);
    position: relative;
    overflow: hidden;
}
.submit-btn::before {
    content: '';
    position: absolute;
    top: 0;
    left: -100%;
    width: 100%;
    height: 100%;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
    transition: left 0.5s ease;
}
.submit-btn:hover::before {
    left: 100%;
}
.submit-btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 32px rgba(0, 217, 255, 0.4);
}
.submit-btn:active {
    transform: translateY(0);
}
.submit-btn:disabled {
    background: rgba(255, 255, 255, 0.1);
    color: var(--text-secondary);
    cursor: not-allowed;
    box-shadow: none;
}
.submit-btn:disabled:hover {
    transform: none;
}
.divider {
    display: flex;
    align-items: center;
    gap: 16px;
    margin: 32px 0;
    opacity: 0;
    animation: fadeIn 0.5s ease-out 0.5s forwards;
}
.divider::before,
.divider::after {
    content: '';
    flex: 1;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
}
.divider span {
    color: var(--text-secondary);
    font-size: 13px;
    font-weight: 500;
}
.social-login {
    display: flex;
    gap: 12px;
    opacity: 0;
    animation: fadeIn 0.5s ease-out 0.6s forwards;
}
.social-btn {
    flex: 1;
    padding: 14px;
    background: var(--input-bg);
    border: 2px solid var(--input-border);
    border-radius: 12px;
    color: var(--text-primary);
    font-family: 'DM Sans', sans-serif;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s ease;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
}
.social-btn:hover {
    background: rgba(255, 255, 255, 0.08);
    border-color: rgba(255, 255, 255, 0.2);
    transform: translateY(-2px);
}
.footer-text {
    text-align: center;
    margin-top: 24px;
    color: var(--text-secondary);
    font-size: 13px;
    opacity: 0;
    animation: fadeIn 0.5s ease-out 0.7s forwards;
}
.footer-text a {
    color: var(--accent);
    text-decoration: none;
    font-weight: 600;
    transition: color 0.3s ease;
}
.footer-text a:hover {
    color: var(--text-primary);
}
.hidden {
    display: none !important;
}
@media (max-width: 640px) {
    .form-container {
        padding: 32px 24px;
    }
    .logo {
        font-size: 28px;
    }
    body::before,
    body::after {
        width: 400px;
        height: 400px;
    }
}
JavaScript
JavaScript Code
// Tab Switching
const tabs = document.querySelectorAll('.tab');
const loginForm = document.getElementById('loginForm');
const registerForm = document.getElementById('registerForm');
const toggleLink = document.getElementById('toggleLink');
const subtitle = document.querySelector('.subtitle');
tabs.forEach(tab => {
    tab.addEventListener('click', () => {
        const tabType = tab.dataset.tab;
        switchTab(tabType);
    });
});
toggleLink.addEventListener('click', (e) => {
    e.preventDefault();
    const isLoginActive = loginForm.classList.contains('hidden');
    switchTab(isLoginActive ? 'login' : 'register');
});
function switchTab(tabType) {
    tabs.forEach(t => t.classList.remove('active'));
    document.querySelector(`[data-tab="${tabType}"]`).classList.add('active');
    if (tabType === 'login') {
        loginForm.classList.remove('hidden');
        registerForm.classList.add('hidden');
        subtitle.textContent = 'Welcome back, please enter your details';
        toggleLink.textContent = 'Sign up';
        toggleLink.parentElement.innerHTML = "Don't have an account? <a href='#' id='toggleLink'>Sign up</a>";
    } else {
        loginForm.classList.add('hidden');
        registerForm.classList.remove('hidden');
        subtitle.textContent = 'Create your account to get started';
        toggleLink.textContent = 'Sign in';
        toggleLink.parentElement.innerHTML = "Already have an account? <a href='#' id='toggleLink'>Sign in</a>";
    }
    // Re-attach event listener to new link
    document.getElementById('toggleLink').addEventListener('click', (e) => {
        e.preventDefault();
        const isLoginActive = loginForm.classList.contains('hidden');
        switchTab(isLoginActive ? 'login' : 'register');
    });
}
// Validation Functions
const validators = {
    email: (value) => {
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        if (!value) return { valid: false, message: 'Email is required' };
        if (!emailRegex.test(value)) return { valid: false, message: 'Please enter a valid email address' };
        return { valid: true, message: 'Email looks good!' };
    },
    password: (value, isLogin = false) => {
        if (!value) return { valid: false, message: 'Password is required' };
        if (isLogin) return { valid: true };
        const requirements = {
            length: value.length >= 8,
            uppercase: /[A-Z]/.test(value),
            lowercase: /[a-z]/.test(value),
            number: /\d/.test(value),
            special: /[!@#$%^&*(),.?":{}|<>]/.test(value)
        };
        const metRequirements = Object.values(requirements).filter(Boolean).length;
        if (metRequirements < 5) {
            return {
                valid: false,
                message: 'Password does not meet all requirements',
                requirements,
                strength: metRequirements <= 2 ? 'weak' : metRequirements <= 3 ? 'medium' : 'strong'
            };
        }
        return {
            valid: true,
            message: 'Strong password!',
            requirements,
            strength: 'strong'
        };
    },
    name: (value) => {
        if (!value) return { valid: false, message: 'Name is required' };
        if (value.length < 2) return { valid: false, message: 'Name must be at least 2 characters' };
        if (!/^[a-zA-Z\s]+$/.test(value)) return { valid: false, message: 'Name can only contain letters and spaces' };
        return { valid: true, message: 'Name looks good!' };
    },
    confirmPassword: (value, password) => {
        if (!value) return { valid: false, message: 'Please confirm your password' };
        if (value !== password) return { valid: false, message: 'Passwords do not match' };
        return { valid: true, message: 'Passwords match!' };
    }
};
// Live Validation
function validateField(input, validatorName, ...args) {
    const wrapper = input.closest('.form-group');
    const icon = wrapper.querySelector('.validation-icon');
    const errorMsg = wrapper.querySelector('.error-message');
    const successMsg = wrapper.querySelector('.success-message');
    const result = validators[validatorName](input.value, ...args);
    // Clear previous states
    input.classList.remove('error', 'success');
    icon.classList.remove('show');
    errorMsg.classList.remove('show');
    successMsg.classList.remove('show');
    if (!input.value) {
        return result;
    }
    if (result.valid) {
        input.classList.add('success');
        icon.textContent = '✓';
        icon.style.color = 'var(--success)';
        icon.classList.add('show');
        successMsg.textContent = result.message;
        successMsg.classList.add('show');
    } else {
        input.classList.add('error');
        icon.textContent = '✕';
        icon.style.color = 'var(--error)';
        icon.classList.add('show');
        errorMsg.textContent = result.message;
        errorMsg.classList.add('show');
    }
    return result;
}
// Password Strength Indicator
function updatePasswordStrength(input, result) {
    const wrapper = input.closest('.form-group');
    const strengthContainer = wrapper.querySelector('.password-strength');
    const strengthText = wrapper.querySelector('.strength-text');
    const strengthProgress = wrapper.querySelector('.strength-progress');
    const requirementsContainer = wrapper.querySelector('.requirements');
    if (!input.value) {
        strengthContainer.classList.remove('show');
        requirementsContainer.classList.remove('show');
        return;
    }
    strengthContainer.classList.add('show');
    requirementsContainer.classList.add('show');
    if (result.strength) {
        strengthProgress.className = 'strength-progress ' + result.strength;
        strengthText.className = 'strength-text ' + result.strength;
        strengthText.textContent = result.strength.charAt(0).toUpperCase() + result.strength.slice(1);
    }
    if (result.requirements) {
        Object.keys(result.requirements).forEach(req => {
            const reqElement = wrapper.querySelector(`[data-requirement="${req}"]`);
            if (result.requirements[req]) {
                reqElement.classList.add('met');
                reqElement.querySelector('.requirement-icon').textContent = '✓';
            } else {
                reqElement.classList.remove('met');
                reqElement.querySelector('.requirement-icon').textContent = '○';
            }
        });
    }
}
// Login Form Validation
const loginEmail = document.getElementById('loginEmail');
const loginPassword = document.getElementById('loginPassword');
loginEmail.addEventListener('input', () => {
    validateField(loginEmail, 'email');
});
loginEmail.addEventListener('blur', () => {
    validateField(loginEmail, 'email');
});
loginPassword.addEventListener('input', () => {
    validateField(loginPassword, 'password', true);
});
loginPassword.addEventListener('blur', () => {
    validateField(loginPassword, 'password', true);
});
// Register Form Validation
const registerName = document.getElementById('registerName');
const registerEmail = document.getElementById('registerEmail');
const registerPassword = document.getElementById('registerPassword');
const registerConfirmPassword = document.getElementById('registerConfirmPassword');
registerName.addEventListener('input', () => {
    validateField(registerName, 'name');
});
registerName.addEventListener('blur', () => {
    validateField(registerName, 'name');
});
registerEmail.addEventListener('input', () => {
    validateField(registerEmail, 'email');
});
registerEmail.addEventListener('blur', () => {
    validateField(registerEmail, 'email');
});
registerPassword.addEventListener('input', () => {
    const result = validateField(registerPassword, 'password', false);
    updatePasswordStrength(registerPassword, result);
    // Also revalidate confirm password if it has a value
    if (registerConfirmPassword.value) {
        validateField(registerConfirmPassword, 'confirmPassword', registerPassword.value);
    }
});
registerPassword.addEventListener('blur', () => {
    const result = validateField(registerPassword, 'password', false);
    updatePasswordStrength(registerPassword, result);
});
registerConfirmPassword.addEventListener('input', () => {
    validateField(registerConfirmPassword, 'confirmPassword', registerPassword.value);
});
registerConfirmPassword.addEventListener('blur', () => {
    validateField(registerConfirmPassword, 'confirmPassword', registerPassword.value);
});
// Form Submission
loginForm.addEventListener('submit', (e) => {
    e.preventDefault();
    const emailResult = validateField(loginEmail, 'email');
    const passwordResult = validateField(loginPassword, 'password', true);
    if (emailResult.valid && passwordResult.valid) {
        console.log('Login form submitted successfully!', {
            email: loginEmail.value,
            password: loginPassword.value
        });
        alert('Login successful! (This is a demo)');
    }
});
registerForm.addEventListener('submit', (e) => {
    e.preventDefault();
    const nameResult = validateField(registerName, 'name');
    const emailResult = validateField(registerEmail, 'email');
    const passwordResult = validateField(registerPassword, 'password', false);
    const confirmPasswordResult = validateField(registerConfirmPassword, 'confirmPassword', registerPassword.value);
    if (nameResult.valid && emailResult.valid && passwordResult.valid && confirmPasswordResult.valid) {
        console.log('Registration form submitted successfully!', {
            name: registerName.value,
            email: registerEmail.value,
            password: registerPassword.value
        });
        alert('Registration successful! (This is a demo)');
    }
});
// Social Login Buttons
document.querySelectorAll('.social-btn').forEach(btn => {
    btn.addEventListener('click', () => {
        const provider = btn.textContent.trim();
        console.log(`${provider} login clicked`);
        alert(`${provider} login would happen here (This is a demo)`);
    });
});

Project Description

Aya ni amakode akoze paje ya signup form na login form muburyo bugezweho, Ikozwe muri HTML , CSS na JavaScript. Uhobora kudawunulodinga amakode ya paje yose, ukoresheje ibuto yanditseho download ahagana hasi, cyangwa ukagenda ukopiya Amakode bisanzwe. Ushobora gukopiya HTML ukwayo, CSS ukwayo na JavaScript ukwayo ubundi ukabihuza uko ubishatse muburyo bwawe.

Ni amafomo ushobora gukoresha muri project iyo ariyo yose ikeneye login na signup. Paje na elements zayo zose biri responsive kuri screen zose, kandi ikindi cyiza nuko wakongeramo andi makode yawe bigakunda. Ushobora guhindura, ugakoresha amabara yawe ahura na website uri gukora muburyo bworoshye.

Signup form ifite input ya fullname, email, na password, gusa birashoboka ko wakongera nizindi inputs mugihe ufite nyinshi. wowe icyo ukora nugukopiya iyo isanzwe kuri form ubundi ukayeditinga. Ukeditinga label, name, na type yayo. Login form yo ni email na password, ariko hari gukora login na google cyangwa github. Waba ukoresha PHP cyangwa python, nuguhita uhuza backend yawe na form, muburyo bworoshye urarinze kurema, form ya signup na login from scratch.


Project Resources

Download source code, images, and documentation

📦 6.51 KB 🗜 ZIP Format

Project Information

Jan 27, 2026 Created
Jan 27, 2026 Updated

Share This Project

If you found this helpful, share it with others who might benefit.

Link yakopiwe!

Cookie Settings

Theme Customization