|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>VerifyNow Pro - Email Verification Service</title> |
|
|
<script src="https://cdn.tailwindcss.com"></script> |
|
|
<script src="https://unpkg.com/feather-icons"></script> |
|
|
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> |
|
|
<script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.min.js"></script> |
|
|
<style> |
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); |
|
|
body { font-family: 'Inter', sans-serif; } |
|
|
|
|
|
.gradient-bg { |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
} |
|
|
|
|
|
.glass-morphism { |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
backdrop-filter: blur(10px); |
|
|
border: 1px solid rgba(255, 255, 255, 0.2); |
|
|
} |
|
|
|
|
|
.input-digit { |
|
|
transition: none; |
|
|
} |
|
|
|
|
|
.input-digit:focus { |
|
|
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); |
|
|
} |
|
|
|
|
|
.pulse-dot { |
|
|
position: relative; |
|
|
} |
|
|
|
|
|
.pulse-dot::before { |
|
|
content: ''; |
|
|
position: absolute; |
|
|
inset: -4px; |
|
|
border-radius: 50%; |
|
|
background: inherit; |
|
|
opacity: 0.3; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body class="gradient-bg min-h-screen"> |
|
|
|
|
|
<nav class="glass-morphism px-6 py-4"> |
|
|
<div class="max-w-7xl mx-auto flex justify-between items-center"> |
|
|
<div class="flex items-center space-x-3"> |
|
|
<div class="w-10 h-10 bg-white rounded-lg flex items-center justify-center"> |
|
|
<i data-feather="shield" class="w-6 h-6 text-purple-600"></i> |
|
|
</div> |
|
|
<span class="text-white font-bold text-xl">VerifyNow Pro</span> |
|
|
</div> |
|
|
<div class="hidden md:flex items-center space-x-6"> |
|
|
<a href="index.html" class="text-white/80 hover:text-white transition">Home</a> |
|
|
<a href="#" class="text-white/80 hover:text-white transition">Features</a> |
|
|
<a href="#" class="text-white/80 hover:text-white transition">Pricing</a> |
|
|
<a href="#" class="text-white/80 hover:text-white transition">Docs</a> |
|
|
<button class="bg-white text-purple-600 px-4 py-2 rounded-lg font-semibold hover:bg-purple-50 transition"> |
|
|
Sign In |
|
|
</button> |
|
|
</div> |
|
|
<button class="md:hidden text-white" onclick="toggleMobileMenu()"> |
|
|
<i data-feather="menu" class="w-6 h-6"></i> |
|
|
</button> |
|
|
</div> |
|
|
</nav> |
|
|
|
|
|
<div class="max-w-4xl mx-auto px-6 pt-8"> |
|
|
<div class="flex items-center justify-center space-x-4 mb-12"> |
|
|
<div class="flex items-center"> |
|
|
<div class="w-10 h-10 bg-white/20 rounded-full flex items-center justify-center"> |
|
|
<span class="text-white font-semibold">1</span> |
|
|
</div> |
|
|
<span class="text-white ml-2">Email</span> |
|
|
</div> |
|
|
<div class="w-16 h-0.5 bg-white/30"></div> |
|
|
<div class="flex items-center"> |
|
|
<div class="w-10 h-10 bg-white rounded-full flex items-center justify-center"> |
|
|
<span class="text-purple-600 font-semibold">2</span> |
|
|
</div> |
|
|
<span class="text-white ml-2 font-semibold">Verify</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="max-w-4xl mx-auto px-6 pb-16"> |
|
|
<div class="text-center mb-12"> |
|
|
<h1 class="text-5xl md:text-6xl font-bold text-white mb-6"> |
|
|
Verify Your Email |
|
|
</h1> |
|
|
<p class="text-xl text-white/80"> |
|
|
Enter the 6-digit verification code sent to your email |
|
|
</p> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="glass-morphism rounded-2xl p-8 md:p-12 shadow-2xl"> |
|
|
|
|
|
<div class="flex items-center justify-center mb-8"> |
|
|
<div class="bg-white/10 rounded-full px-4 py-2 flex items-center space-x-2"> |
|
|
<i data-feather="mail" class="w-5 h-5 text-white"></i> |
|
|
<span class="text-white font-medium" id="userEmail">user@example.com</span> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div class="mb-8"> |
|
|
<div class="flex justify-center space-x-3" id="otpContainer"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 0)"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 1)"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 2)"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 3)"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 4)"> |
|
|
<input type="text" maxlength="1" class="input-digit w-14 h-14 text-center text-2xl font-bold bg-white/20 border-2 border-white/30 rounded-lg text-white focus:outline-none focus:border-white" onkeyup="handleOTPInput(event, 5)"> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="text-center mb-6"> |
|
|
<p class="text-white/70 text-sm"> |
|
|
Code expires in <span id="timer" class="font-bold text-white">05:00</span> |
|
|
</p> |
|
|
</div> |
|
|
|
|
|
<div class="space-y-4"> |
|
|
<button onclick="verifyCode()" class="w-full bg-white text-purple-600 font-semibold py-3 rounded-lg hover:bg-purple-50 transition"> |
|
|
Verify Code |
|
|
</button> |
|
|
<button onclick="resendCode()" class="w-full bg-white/10 text-white font-semibold py-3 rounded-lg hover:bg-white/20 transition"> |
|
|
Resend Code |
|
|
</button> |
|
|
</div> |
|
|
|
|
|
<div class="mt-8 pt-8 border-t border-white/20"> |
|
|
<p class="text-center text-white/70 text-sm mb-4">Or verify using:</p> |
|
|
<div class="flex justify-center space-x-4"> |
|
|
<button class="bg-white/10 p-3 rounded-lg hover:bg-white/20 transition"> |
|
|
<i data-feather="smartphone" class="w-6 h-6 text-white"></i> |
|
|
</button> |
|
|
<button class="bg-white/10 p-3 rounded-lg hover:bg-white/20 transition"> |
|
|
<i data-feather="message-circle" class="w-6 h-6 text-white"></i> |
|
|
</button> |
|
|
<button class="bg-white/10 p-3 rounded-lg hover:bg-white/20 transition"> |
|
|
<i data-feather="key" class="w-6 h-6 text-white"></i> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mt-12"> |
|
|
<div class="glass-morphism rounded-lg p-6 text-center"> |
|
|
<div class="w-12 h-12 bg-green-500 rounded-full flex items-center justify-center mx-auto mb-3 pulse-dot"> |
|
|
<i data-feather="check" class="w-6 h-6 text-white"></i> |
|
|
</div> |
|
|
<h3 class="text-white font-semibold mb-2">Bank-Level Security</h3> |
|
|
<p class="text-white/70 text-sm">256-bit encryption protects your data</p> |
|
|
</div> |
|
|
<div class="glass-morphism rounded-lg p-6 text-center"> |
|
|
<div class="w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center mx-auto mb-3 pulse-dot"> |
|
|
<i data-feather="zap" class="w-6 h-6 text-white"></i> |
|
|
</div> |
|
|
<h3 class="text-white font-semibold mb-2">Instant Delivery</h3> |
|
|
<p class="text-white/70 text-sm">Receive codes in seconds</p> |
|
|
</div> |
|
|
<div class="glass-morphism rounded-lg p-6 text-center"> |
|
|
<div class="w-12 h-12 bg-purple-500 rounded-full flex items-center justify-center mx-auto mb-3 pulse-dot"> |
|
|
<i data-feather="shield" class="w-6 h-6 text-white"></i> |
|
|
</div> |
|
|
<h3 class="text-white font-semibold mb-2">Multi-Factor Auth</h3> |
|
|
<p class="text-white/70 text-sm">Multiple verification methods</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div id="successModal" class="fixed inset-0 bg-black/50 backdrop-blur-sm hidden items-center justify-center z-50"> |
|
|
<div class="bg-white rounded-2xl p-8 max-w-md mx-4" id="modalContent"> |
|
|
<div class="text-center"> |
|
|
<div class="w-20 h-20 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4"> |
|
|
<i data-feather="check-circle" class="w-12 h-12 text-green-500"></i> |
|
|
</div> |
|
|
<h2 class="text-2xl font-bold text-gray-800 mb-2">Verification Successful!</h2> |
|
|
<p class="text-gray-600 mb-6">Your account has been successfully verified.</p> |
|
|
<button onclick="closeModal()" class="bg-purple-600 text-white px-6 py-3 rounded-lg font-semibold hover:bg-purple-700 transition"> |
|
|
Continue to Dashboard |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<script> |
|
|
feather.replace(); |
|
|
|
|
|
function handleOTPInput(event, index) { |
|
|
const input = event.target; |
|
|
const value = input.value; |
|
|
|
|
|
if (value.length === 1) { |
|
|
if (index < 5) { |
|
|
const nextInput = input.parentElement.children[index + 1]; |
|
|
nextInput.focus(); |
|
|
} |
|
|
} else if (event.key === 'Backspace' && value.length === 0 && index > 0) { |
|
|
const prevInput = input.parentElement.children[index - 1]; |
|
|
prevInput.focus(); |
|
|
} |
|
|
} |
|
|
|
|
|
let timeLeft = 300; |
|
|
const timerElement = document.getElementById('timer'); |
|
|
|
|
|
const timer = setInterval(() => { |
|
|
const minutes = Math.floor(timeLeft / 60); |
|
|
const seconds = timeLeft % 60; |
|
|
timerElement.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; |
|
|
|
|
|
if (timeLeft <= 60) { |
|
|
timerElement.classList.add('text-red-300'); |
|
|
} |
|
|
|
|
|
if (timeLeft === 0) { |
|
|
clearInterval(timer); |
|
|
timerElement.textContent = 'Expired'; |
|
|
timerElement.classList.add('text-red-400'); |
|
|
} |
|
|
|
|
|
timeLeft--; |
|
|
}, 1000); |
|
|
|
|
|
|
|
|
function verifyCode() { |
|
|
const inputs = document.querySelectorAll('#otpContainer input'); |
|
|
let code = ''; |
|
|
inputs.forEach(input => code += input.value); |
|
|
|
|
|
if (code.length !== 6) { |
|
|
showError('Please enter all 6 digits'); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const button = event.target; |
|
|
button.innerHTML = '<i data-feather="loader" class="w-5 h-5 animate-spin inline mr-2"></i>Verifying...'; |
|
|
button.disabled = true; |
|
|
feather.replace(); |
|
|
|
|
|
setTimeout(() => { |
|
|
button.innerHTML = 'Verify Code'; |
|
|
button.disabled = false; |
|
|
showSuccessModal(); |
|
|
}, 1500); |
|
|
} |
|
|
|
|
|
|
|
|
function resendCode() { |
|
|
const button = event.target; |
|
|
button.innerHTML = '<i data-feather="loader" class="w-5 h-5 animate-spin inline mr-2"></i>Sending...'; |
|
|
button.disabled = true; |
|
|
feather.replace(); |
|
|
|
|
|
setTimeout(() => { |
|
|
button.innerHTML = 'Resend Code'; |
|
|
button.disabled = false; |
|
|
|
|
|
|
|
|
clearInterval(timer); |
|
|
timeLeft = 300; |
|
|
timerElement.textContent = '05:00'; |
|
|
timerElement.classList.remove('text-red-300', 'text-red-400'); |
|
|
|
|
|
|
|
|
document.querySelectorAll('#otpContainer input').forEach(input => { |
|
|
input.value = ''; |
|
|
}); |
|
|
document.querySelector('#otpContainer input').focus(); |
|
|
|
|
|
|
|
|
showNotification('New code sent to your email'); |
|
|
}, 1500); |
|
|
} |
|
|
|
|
|
function showSuccessModal() { |
|
|
const modal = document.getElementById('successModal'); |
|
|
modal.classList.remove('hidden'); |
|
|
modal.classList.add('flex'); |
|
|
feather.replace(); |
|
|
} |
|
|
|
|
|
|
|
|
function closeModal() { |
|
|
const modal = document.getElementById('successModal'); |
|
|
modal.classList.add('hidden'); |
|
|
modal.classList.remove('flex'); |
|
|
} |
|
|
|
|
|
function showError(message) { |
|
|
const errorDiv = document.createElement('div'); |
|
|
errorDiv.className = 'fixed top-4 right-4 bg-red-500 text-white px-6 py-3 rounded-lg shadow-lg z-50 flex items-center space-x-2'; |
|
|
errorDiv.innerHTML = `<i data-feather="alert-circle" class="w-5 h-5"></i><span>${message}</span>`; |
|
|
document.body.appendChild(errorDiv); |
|
|
feather.replace(); |
|
|
|
|
|
setTimeout(() => { |
|
|
errorDiv.remove(); |
|
|
}, 3000); |
|
|
} |
|
|
|
|
|
|
|
|
function showNotification(message) { |
|
|
const notifDiv = document.createElement('div'); |
|
|
notifDiv.className = 'fixed top-4 right-4 bg-green-500 text-white px-6 py-3 rounded-lg shadow-lg z-50 flex items-center space-x-2'; |
|
|
notifDiv.innerHTML = `<i data-feather="check" class="w-5 h-5"></i><span>${message}</span>`; |
|
|
document.body.appendChild(notifDiv); |
|
|
feather.replace(); |
|
|
|
|
|
setTimeout(() => { |
|
|
notifDiv.remove(); |
|
|
}, 3000); |
|
|
} |
|
|
|
|
|
function toggleMobileMenu() { |
|
|
|
|
|
console.log('Mobile menu toggled'); |
|
|
} |
|
|
|
|
|
|
|
|
window.addEventListener('load', () => { |
|
|
const urlParams = new URLSearchParams(window.location.search); |
|
|
const email = urlParams.get('email') || localStorage.getItem('userEmail') || 'user@example.com'; |
|
|
document.getElementById('userEmail').textContent = email; |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|