<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Animated Million Gradio Developers with Fireworks</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a2a6c; font-family: 'Arial', sans-serif; overflow: hidden; position: relative; } .container { text-align: center; position: relative; z-index: 10; } svg { max-width: 100%; height: auto; } .text-stroke { stroke: #fff; stroke-width: 2; stroke-dasharray: 1500; stroke-dashoffset: 1500; animation: dash 3s linear forwards; fill: transparent; font-weight: bold; font-size: 60px; } .counter { font-size: 80px; color: white; font-weight: bold; margin-bottom: 20px; } .firework { position: absolute; width: 5px; height: 5px; border-radius: 50%; pointer-events: none; } @keyframes dash { to { stroke-dashoffset: 0; fill: white; } } @keyframes firework { 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; } 70% { opacity: 0.8; } 100% { transform: translate(var(--tx), var(--ty)) scale(1); opacity: 0; } } </style> </head> <body> <div class="container"> <div class="counter" id="counter">0</div> <svg width="800" height="200" viewBox="0 0 800 200"> <text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" class="text-stroke">Gradio Developers</text> </svg> </div> <script> // Counter animation const counter = document.getElementById('counter'); let count = 0; const target = 1000000; const duration = 3000; const increment = target / (duration / 16); function animateCounter() { if (count < target) { count += increment; if (count > target) count = target; counter.textContent = Math.floor(count).toLocaleString(); requestAnimationFrame(animateCounter); if (Math.random() < 0.3) createFirework(); } else { // Create more fireworks when counter reaches target setInterval(createFirework, 300); } } // Firework animation function createFirework() { const firework = document.createElement('div'); firework.className = 'firework'; const x = Math.random() * window.innerWidth; const y = Math.random() * window.innerHeight; const color = `hsl(${Math.random() * 60 + 190}, 100%, 50%)`; firework.style.left = x + 'px'; firework.style.top = y + 'px'; firework.style.backgroundColor = color; document.body.appendChild(firework); // Create particles const particleCount = 30 + Math.floor(Math.random() * 20); for (let i = 0; i < particleCount; i++) { createParticle(x, y, color); } setTimeout(() => { firework.remove(); }, 1000); } function createParticle(x, y, color) { const particle = document.createElement('div'); particle.className = 'firework'; const angle = Math.random() * Math.PI * 2; const radius = 50 + Math.random() * 100; const size = 2 + Math.random() * 3; particle.style.width = size + 'px'; particle.style.height = size + 'px'; particle.style.backgroundColor = color; particle.style.setProperty('--tx', (Math.cos(angle) * radius) + 'px'); particle.style.setProperty('--ty', (Math.sin(angle) * radius) + 'px'); particle.style.left = x + 'px'; particle.style.top = y + 'px'; particle.style.animation = 'firework 0.8s linear forwards'; document.body.appendChild(particle); setTimeout(() => { particle.remove(); }, 800); } // Start animations after a short delay setTimeout(() => { animateCounter(); // Initial fireworks for (let i = 0; i < 5; i++) { setTimeout(createFirework, i * 200); } }, 500); // Resize SVG text on window resize function resizeText() { const svg = document.querySelector('svg'); const newWidth = Math.min(window.innerWidth - 40, 800); svg.setAttribute('width', newWidth); } window.addEventListener('resize', resizeText); resizeText(); </script> </body> </html>