File size: 7,405 Bytes
b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d 974696d b1fb35d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
<!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>
<!-- ScrollReveal CDN -->
<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 in a slight spiral motion */
.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;
}
/* Animation spiral */
@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;
}
}
/* Active class for scan effect */
.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 Aligné en Haut à Gauche -->
<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">
<!-- Camera Section -->
<div class="max-w-md w-full flex justify-center items-center video-reveal">
<div class="relative">
<!-- Vidéo circulaire centrée -->
<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>
<!-- Scan Effect -->
<div id="scan-effect" class="scan-effect"></div>
</div>
</div>
<!-- Form Section -->
<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">
<!-- Taille réduite du bouton -->
<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>
<!-- <footer class="bg-gray-800 p-4 text-center">
<p>© 2023 TechMart. Tous droits réservés.</p>
</footer> -->
<script>
document.addEventListener('DOMContentLoaded', function() {
// Initialisation de ScrollReveal avec les animations pour différents éléments
// Animation pour le header "Zauth."
ScrollReveal().reveal('header h1', {
duration: 1000,
origin: 'left',
distance: '50px',
opacity: 0,
easing: 'ease-in-out',
delay: 100
});
// Animation pour la section vidéo avec un zoom-in et glissement vers le bas
ScrollReveal().reveal('.video-reveal', {
duration: 1200, // Durée de l'animation
scale: 0.9, // Zoom initial (90%)
distance: '30px', // Glissement vers le haut
origin: 'bottom', // Animation qui part du bas
opacity: 0, // Apparition progressive
easing: 'ease-in-out', // Transition fluide
delay: 200 // Délai avant le début
});
// Animation pour la section formulaire avec un glissement depuis la droite
ScrollReveal().reveal('.form-reveal', {
duration: 1200, // Durée de l'animation
distance: '60px', // Distance de glissement depuis la droite
origin: 'right', // Animation qui part de la droite
opacity: 0, // Apparition progressive
easing: 'ease-in-out', // Transition fluide
delay: 400 // Délai un peu plus long pour que l'effet soit coordonné
});
// Appelle les fonctions de remplissage de l'email et de démarrage de la caméra après le chargement de la page
fillEmailFromUrl();
startCamera();
});
// Fonction pour remplir l'email à partir des paramètres de l'URL
function fillEmailFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
const email = urlParams.get('email');
if (email) {
document.getElementById('email').value = decodeURIComponent(email);
}
}
// Fonction pour démarrer la caméra
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.';
}
}
// Gestionnaire d'événements pour le bouton "Scan"
document.getElementById('begin-scan-btn').addEventListener('click', function () {
const scanEffect = document.getElementById('scan-effect');
// Ajouter la classe d'animation
scanEffect.classList.add('scan-active');
// Supprimer la classe après 3 secondes
setTimeout(function () {
scanEffect.classList.remove('scan-active');
}, 3000); // L'effet dure 3 secondes
// Ajoutez ici la logique de scan (par exemple, utiliser une bibliothèque de reconnaissance d'image)
// Exemple :
// startScan();
});
</script>
</body>
</html>
|