|
<!DOCTYPE html> |
|
<html lang="fr"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Zauth - Smart Check-In</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
|
|
<script src="https://unpkg.com/scrollreveal"></script> |
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet"> |
|
<link rel="stylesheet" href="/static/css/styles.css"> |
|
<style> |
|
|
|
.scan-effect { |
|
position: absolute; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
border-radius: 50%; |
|
background: rgba(255, 255, 255, 0.1); |
|
opacity: 0; |
|
z-index: 1; |
|
} |
|
|
|
|
|
@keyframes spiral-scan { |
|
0% { |
|
transform: scale(0.8) rotate(0deg); |
|
opacity: 0; |
|
} |
|
50% { |
|
transform: scale(1.2) rotate(180deg); |
|
opacity: 1; |
|
} |
|
100% { |
|
transform: scale(1.5) rotate(360deg); |
|
opacity: 0; |
|
} |
|
} |
|
|
|
|
|
.scan-active { |
|
animation: spiral-scan 3s ease-in-out; |
|
} |
|
</style> |
|
</head> |
|
|
|
<body class="bg-gray-900 text-white min-h-screen flex flex-col" style="background-image: url('/static/images/background.jpg');"> |
|
|
|
|
|
<header class="container mx-auto p-6"> |
|
<h1 class="text-4xl font-bold text-left text-white icon-geistmono">Zauth.</h1> |
|
</header> |
|
|
|
<main class="flex-grow container mx-auto p-6 flex flex-col lg:flex-row items-center justify-center space-y-16 lg:space-y-0 lg:space-x-28"> |
|
|
|
|
|
<div class="max-w-md w-full flex justify-center items-center video-reveal"> |
|
<div class="relative"> |
|
|
|
<video id="camera-feed" autoplay muted class="w-full max-w-md max-h-md aspect-square bg-black rounded-full object-cover shadow-2xl ring-4 ring-gray-300 ring-opacity-50 hover:ring-blue-500 hover:ring-opacity-75 transition-all duration-300 ease-in-out transform hover:scale-105"></video> |
|
|
|
|
|
<div id="scan-effect" class="scan-effect"></div> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="max-w-sm w-full bg-gray-800/40 backdrop-blur-md rounded-xl shadow-lg p-6 lg:w-1/3 transform transition-all duration-300 hover:scale-102 hover:shadow-md form-reveal"> |
|
<h2 class="text-xl font-semibold mb-4 text-center icon-geistmono">Smart Check-In</h2> |
|
|
|
<div class="text-center"> |
|
|
|
<button id="begin-scan-btn" class="w-3/4 bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-3 rounded-lg transition-all duration-300 ease-in-out transform hover:scale-102 text-sm icon-geistmono"> |
|
Scan 🔍 |
|
</button> |
|
</div> |
|
|
|
<div id="error-message" class="mt-4 text-center text-red-500"></div> |
|
</div> |
|
|
|
</main> |
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
|
|
ScrollReveal().reveal('header h1', { |
|
duration: 1000, |
|
origin: 'left', |
|
distance: '50px', |
|
opacity: 0, |
|
easing: 'ease-in-out', |
|
delay: 100 |
|
}); |
|
|
|
|
|
ScrollReveal().reveal('.video-reveal', { |
|
duration: 1200, |
|
scale: 0.9, |
|
distance: '30px', |
|
origin: 'bottom', |
|
opacity: 0, |
|
easing: 'ease-in-out', |
|
delay: 200 |
|
}); |
|
|
|
|
|
ScrollReveal().reveal('.form-reveal', { |
|
duration: 1200, |
|
distance: '60px', |
|
origin: 'right', |
|
opacity: 0, |
|
easing: 'ease-in-out', |
|
delay: 400 |
|
}); |
|
|
|
|
|
fillEmailFromUrl(); |
|
startCamera(); |
|
}); |
|
|
|
|
|
function fillEmailFromUrl() { |
|
const urlParams = new URLSearchParams(window.location.search); |
|
const email = urlParams.get('email'); |
|
if (email) { |
|
document.getElementById('email').value = decodeURIComponent(email); |
|
} |
|
} |
|
|
|
|
|
async function startCamera() { |
|
const cameraFeed = document.getElementById('camera-feed'); |
|
|
|
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { |
|
try { |
|
const stream = await navigator.mediaDevices.getUserMedia({ video: true }); |
|
cameraFeed.srcObject = stream; |
|
} catch (error) { |
|
console.error('Erreur lors de l\'accès à la caméra:', error); |
|
document.getElementById('error-message').innerText = 'Erreur lors de l\'accès à la caméra. Veuillez vérifier vos permissions.'; |
|
} |
|
} else { |
|
document.getElementById('error-message').innerText = 'Votre navigateur ne supporte pas l\'accès à la caméra.'; |
|
} |
|
} |
|
|
|
|
|
document.getElementById('begin-scan-btn').addEventListener('click', function () { |
|
const scanEffect = document.getElementById('scan-effect'); |
|
|
|
scanEffect.classList.add('scan-active'); |
|
|
|
|
|
setTimeout(function () { |
|
scanEffect.classList.remove('scan-active'); |
|
}, 3000); |
|
|
|
|
|
|
|
|
|
}); |
|
</script> |
|
</body> |
|
</html> |
|
|