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