| | <!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> |
| |
|