Create animated numbers (1–10) in the style of Netflix’s "Top 10" design.
Browse files🎨 Visual Style:
Bold, oversized, cinematic numbers
3D bevel or extruded look
Black or deep gradient background
Dramatic red lighting or glowing edge accents (like Netflix’s brand style)
Metallic or glassy surfaces with depth and shadows
🎥 Animation Variations (generate a few options):
Slow Zoom In with light shimmer
Pop-in Bounce (dynamic entry with scale bounce)
Smoke or Particle Reveal (number emerges through cinematic particles)
Glitch Flicker for a digital/glassy feel
Energy Pulse where the number briefly surges with light
📐 Framing & Layout:
Centered, full-screen number focus
No extra UI, no labels — just the animated number
🧱 Output Needed:
Separate animation clips for each number (1–10)
Transparent or dark background
Looping and non-looping options
- README.md +8 -5
- components/number-display.js +62 -0
- index.html +55 -19
- script.js +133 -0
- style.css +213 -18
README.md
CHANGED
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title: Cinematic Countdown Elite
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Cinematic Countdown Elite 🎬
|
| 3 |
+
colorFrom: blue
|
| 4 |
+
colorTo: purple
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://huggingface.co/deepsite).
|
components/number-display.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class NumberDisplay extends HTMLElement {
|
| 2 |
+
constructor() {
|
| 3 |
+
super();
|
| 4 |
+
}
|
| 5 |
+
|
| 6 |
+
connectedCallback() {
|
| 7 |
+
this.attachShadow({ mode: 'open' });
|
| 8 |
+
this.render();
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
render() {
|
| 12 |
+
const number = this.getAttribute('number') || '1';
|
| 13 |
+
const animation = this.getAttribute('animation') || 'zoom';
|
| 14 |
+
|
| 15 |
+
this.shadowRoot.innerHTML = `
|
| 16 |
+
<style>
|
| 17 |
+
:host {
|
| 18 |
+
display: block;
|
| 19 |
+
width: 100%;
|
| 20 |
+
height: 100%;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
.cinematic-number {
|
| 24 |
+
position: relative;
|
| 25 |
+
font-size: 30vw;
|
| 26 |
+
font-weight: 900;
|
| 27 |
+
color: transparent;
|
| 28 |
+
background: linear-gradient(145deg, #8B0000, #B22222, #DC143C);
|
| 29 |
+
-webkit-background-clip: text;
|
| 30 |
+
background-clip: text;
|
| 31 |
+
text-shadow:
|
| 32 |
+
0 0 30px rgba(220, 20, 60, 0.8),
|
| 33 |
+
0 0 60px rgba(220, 20, 60, 0.6),
|
| 34 |
+
0 0 90px rgba(220, 20, 60, 0.4),
|
| 35 |
+
4px 4px 0px #000,
|
| 36 |
+
8px 8px 15px rgba(0, 0, 0, 0.8);
|
| 37 |
+
transform-style: preserve-3d;
|
| 38 |
+
perspective: 1000px;
|
| 39 |
+
display: flex;
|
| 40 |
+
align-items: center;
|
| 41 |
+
justify-content: center;
|
| 42 |
+
height: 100%;
|
| 43 |
+
}
|
| 44 |
+
</style>
|
| 45 |
+
<div class="cinematic-number" data-number="${number}">
|
| 46 |
+
${number}
|
| 47 |
+
</div>
|
| 48 |
+
`;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
static get observedAttributes() {
|
| 52 |
+
return ['number', 'animation'];
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
attributeChangedCallback(name, oldValue, newValue) {
|
| 56 |
+
if (oldValue !== newValue) {
|
| 57 |
+
this.render();
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
customElements.define('number-display', NumberDisplay);
|
index.html
CHANGED
|
@@ -1,19 +1,55 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Cinematic Countdown Elite</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<link rel="stylesheet" href="style.css">
|
| 9 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
</head>
|
| 13 |
+
<body class="bg-black min-h-screen overflow-hidden">
|
| 14 |
+
<div id="animation-container" class="w-full h-screen flex items-center justify-center">
|
| 15 |
+
<!-- Numbers will be dynamically inserted here -->
|
| 16 |
+
</div>
|
| 17 |
+
|
| 18 |
+
<div class="fixed bottom-4 right-4 z-50">
|
| 19 |
+
<div class="bg-gray-900 bg-opacity-80 rounded-lg p-4 text-white">
|
| 20 |
+
<h3 class="font-bold mb-2">Animation Controls</h3>
|
| 21 |
+
<div class="space-y-2">
|
| 22 |
+
<select id="animation-select" class="bg-gray-800 text-white rounded px-2 py-1 w-full">
|
| 23 |
+
<option value="zoom">Slow Zoom In</option>
|
| 24 |
+
<option value="bounce">Pop-in Bounce</option>
|
| 25 |
+
<option value="smoke">Smoke Reveal</option>
|
| 26 |
+
<option value="glitch">Glitch Flicker</option>
|
| 27 |
+
<option value="pulse">Energy Pulse</option>
|
| 28 |
+
</select>
|
| 29 |
+
<select id="number-select" class="bg-gray-800 text-white rounded px-2 py-1 w-full">
|
| 30 |
+
<option value="1">Number 1</option>
|
| 31 |
+
<option value="2">Number 2</option>
|
| 32 |
+
<option value="3">Number 3</option>
|
| 33 |
+
<option value="4">Number 4</option>
|
| 34 |
+
<option value="5">Number 5</option>
|
| 35 |
+
<option value="6">Number 6</option>
|
| 36 |
+
<option value="7">Number 7</option>
|
| 37 |
+
<option value="8">Number 8</option>
|
| 38 |
+
<option value="9">Number 9</option>
|
| 39 |
+
<option value="10">Number 10</option>
|
| 40 |
+
</select>
|
| 41 |
+
<div class="flex space-x-2">
|
| 42 |
+
<button id="play-btn" class="bg-red-600 hover:bg-red-700 px-3 py-1 rounded flex-1">Play</button>
|
| 43 |
+
<button id="loop-toggle" class="bg-gray-700 hover:bg-gray-600 px-3 py-1 rounded flex-1">Loop: Off</button>
|
| 44 |
+
</div>
|
| 45 |
+
</div>
|
| 46 |
+
</div>
|
| 47 |
+
</div>
|
| 48 |
+
|
| 49 |
+
<script src="script.js"></script>
|
| 50 |
+
<script>
|
| 51 |
+
feather.replace();
|
| 52 |
+
</script>
|
| 53 |
+
<script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
|
| 54 |
+
</body>
|
| 55 |
+
</html>
|
script.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
class NumberAnimationManager {
|
| 2 |
+
constructor() {
|
| 3 |
+
this.container = document.getElementById('animation-container');
|
| 4 |
+
this.currentAnimation = null;
|
| 5 |
+
this.isLooping = false;
|
| 6 |
+
this.initializeControls();
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
initializeControls() {
|
| 10 |
+
const playBtn = document.getElementById('play-btn');
|
| 11 |
+
const loopToggle = document.getElementById('loop-toggle');
|
| 12 |
+
const animationSelect = document.getElementById('animation-select');
|
| 13 |
+
const numberSelect = document.getElementById('number-select');
|
| 14 |
+
|
| 15 |
+
playBtn.addEventListener('click', () => {
|
| 16 |
+
this.playAnimation(
|
| 17 |
+
numberSelect.value,
|
| 18 |
+
animationSelect.value
|
| 19 |
+
);
|
| 20 |
+
});
|
| 21 |
+
|
| 22 |
+
loopToggle.addEventListener('click', () => {
|
| 23 |
+
this.isLooping = !this.isLooping;
|
| 24 |
+
loopToggle.textContent = `Loop: ${this.isLooping ? 'On' : 'Off'}`;
|
| 25 |
+
if (this.isLooping && this.currentAnimation) {
|
| 26 |
+
this.startLoop();
|
| 27 |
+
}
|
| 28 |
+
});
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
playAnimation(number, animationType) {
|
| 32 |
+
this.clearContainer();
|
| 33 |
+
|
| 34 |
+
const numberElement = this.createNumberElement(number);
|
| 35 |
+
this.container.appendChild(numberElement);
|
| 36 |
+
|
| 37 |
+
if (animationType === 'smoke') {
|
| 38 |
+
this.createParticles();
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
// Add animation class
|
| 42 |
+
setTimeout(() => {
|
| 43 |
+
numberElement.classList.add(this.getAnimationClass(animationType));
|
| 44 |
+
}, 100);
|
| 45 |
+
|
| 46 |
+
this.currentAnimation = { number, animationType };
|
| 47 |
+
|
| 48 |
+
if (this.isLooping) {
|
| 49 |
+
this.startLoop();
|
| 50 |
+
}
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
createNumberElement(number) {
|
| 54 |
+
const div = document.createElement('div');
|
| 55 |
+
div.className = 'cinematic-number';
|
| 56 |
+
div.textContent = number;
|
| 57 |
+
div.setAttribute('data-number', number);
|
| 58 |
+
return div;
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
createParticles() {
|
| 62 |
+
const particlesContainer = document.createElement('div');
|
| 63 |
+
particlesContainer.className = 'particles';
|
| 64 |
+
|
| 65 |
+
for (let i = 0; i < 50; i++) {
|
| 66 |
+
const particle = document.createElement('div');
|
| 67 |
+
particle.className = 'particle';
|
| 68 |
+
|
| 69 |
+
const angle = Math.random() * Math.PI * 2;
|
| 70 |
+
const distance = 100 + Math.random() * 200;
|
| 71 |
+
const tx = Math.cos(angle) * distance;
|
| 72 |
+
const ty = Math.sin(angle) * distance;
|
| 73 |
+
|
| 74 |
+
particle.style.setProperty('--tx', `${tx}px`);
|
| 75 |
+
particle.style.setProperty('--ty', `${ty}px`);
|
| 76 |
+
particle.style.left = '50%';
|
| 77 |
+
particle.style.top = '50%';
|
| 78 |
+
particle.style.animationDelay = `${Math.random() * 1}s`;
|
| 79 |
+
|
| 80 |
+
particlesContainer.appendChild(particle);
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
this.container.appendChild(particlesContainer);
|
| 84 |
+
|
| 85 |
+
// Remove particles after animation
|
| 86 |
+
setTimeout(() => {
|
| 87 |
+
particlesContainer.remove();
|
| 88 |
+
}, 2000);
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
getAnimationClass(animationType) {
|
| 92 |
+
const animationClasses = {
|
| 93 |
+
'zoom': 'zoom-in',
|
| 94 |
+
'bounce': 'bounce-in',
|
| 95 |
+
'smoke': 'smoke-reveal',
|
| 96 |
+
'glitch': 'glitch-flicker',
|
| 97 |
+
'pulse': 'energy-pulse'
|
| 98 |
+
};
|
| 99 |
+
|
| 100 |
+
return animationClasses[animationType] || 'zoom-in';
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
clearContainer() {
|
| 104 |
+
this.container.innerHTML = '';
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
startLoop() {
|
| 108 |
+
if (!this.isLooping || !this.currentAnimation) return;
|
| 109 |
+
|
| 110 |
+
const { number, animationType } = this.currentAnimation;
|
| 111 |
+
const durations = {
|
| 112 |
+
'zoom': 3000,
|
| 113 |
+
'bounce': 1500,
|
| 114 |
+
'smoke': 4000,
|
| 115 |
+
'glitch': 2500,
|
| 116 |
+
'pulse': 3000
|
| 117 |
+
};
|
| 118 |
+
|
| 119 |
+
setInterval(() => {
|
| 120 |
+
this.playAnimation(number, animationType);
|
| 121 |
+
}, durations[animationType] || 3000);
|
| 122 |
+
}
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
// Initialize when DOM is loaded
|
| 126 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 127 |
+
new NumberAnimationManager();
|
| 128 |
+
|
| 129 |
+
// Auto-play first animation
|
| 130 |
+
setTimeout(() => {
|
| 131 |
+
document.getElementById('play-btn').click();
|
| 132 |
+
}, 500);
|
| 133 |
+
});
|
style.css
CHANGED
|
@@ -1,28 +1,223 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
body {
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
}
|
| 5 |
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
font-size: 15px;
|
| 14 |
-
margin-bottom: 10px;
|
| 15 |
-
margin-top: 5px;
|
| 16 |
}
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
| 25 |
|
| 26 |
-
.
|
| 27 |
-
|
| 28 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&display=swap');
|
| 2 |
+
|
| 3 |
+
* {
|
| 4 |
+
margin: 0;
|
| 5 |
+
padding: 0;
|
| 6 |
+
box-sizing: border-box;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
body {
|
| 10 |
+
font-family: 'Bebas Neue', cursive;
|
| 11 |
+
background: #000;
|
| 12 |
+
overflow: hidden;
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
.cinematic-number {
|
| 16 |
+
position: relative;
|
| 17 |
+
font-size: 30vw;
|
| 18 |
+
font-weight: 900;
|
| 19 |
+
color: transparent;
|
| 20 |
+
background: linear-gradient(145deg, #8B0000, #B22222, #DC143C);
|
| 21 |
+
-webkit-background-clip: text;
|
| 22 |
+
background-clip: text;
|
| 23 |
+
text-shadow:
|
| 24 |
+
0 0 30px rgba(220, 20, 60, 0.8),
|
| 25 |
+
0 0 60px rgba(220, 20, 60, 0.6),
|
| 26 |
+
0 0 90px rgba(220, 20, 60, 0.4),
|
| 27 |
+
4px 4px 0px #000,
|
| 28 |
+
8px 8px 15px rgba(0, 0, 0, 0.8);
|
| 29 |
+
transform-style: preserve-3d;
|
| 30 |
+
perspective: 1000px;
|
| 31 |
+
}
|
| 32 |
+
|
| 33 |
+
.cinematic-number::before {
|
| 34 |
+
content: attr(data-number);
|
| 35 |
+
position: absolute;
|
| 36 |
+
top: 0;
|
| 37 |
+
left: 0;
|
| 38 |
+
color: rgba(139, 0, 0, 0.3);
|
| 39 |
+
z-index: -1;
|
| 40 |
+
transform: translateZ(-30px) scale(1.1);
|
| 41 |
+
filter: blur(15px);
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
.cinematic-number::after {
|
| 45 |
+
content: '';
|
| 46 |
+
position: absolute;
|
| 47 |
+
top: -10%;
|
| 48 |
+
left: -10%;
|
| 49 |
+
right: -10%;
|
| 50 |
+
bottom: -10%;
|
| 51 |
+
background: radial-gradient(circle at center, rgba(220, 20, 60, 0.1) 0%, transparent 70%);
|
| 52 |
+
z-index: -2;
|
| 53 |
+
border-radius: 20%;
|
| 54 |
+
animation: ambientGlow 3s ease-in-out infinite alternate;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
@keyframes ambientGlow {
|
| 58 |
+
0% { opacity: 0.3; transform: scale(0.95); }
|
| 59 |
+
100% { opacity: 0.7; transform: scale(1.05); }
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
/* Animation Classes */
|
| 63 |
+
.zoom-in {
|
| 64 |
+
animation: zoomIn 3s ease-out forwards;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
@keyframes zoomIn {
|
| 68 |
+
0% {
|
| 69 |
+
transform: scale(0.1) rotateX(90deg);
|
| 70 |
+
opacity: 0;
|
| 71 |
+
}
|
| 72 |
+
50% {
|
| 73 |
+
transform: scale(1.1) rotateX(0deg);
|
| 74 |
+
opacity: 1;
|
| 75 |
+
}
|
| 76 |
+
100% {
|
| 77 |
+
transform: scale(1) rotateX(0deg);
|
| 78 |
+
opacity: 1;
|
| 79 |
+
}
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
.bounce-in {
|
| 83 |
+
animation: bounceIn 1.5s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
@keyframes bounceIn {
|
| 87 |
+
0% {
|
| 88 |
+
transform: scale(0) translateY(100vh);
|
| 89 |
+
opacity: 0;
|
| 90 |
+
}
|
| 91 |
+
60% {
|
| 92 |
+
transform: scale(1.2) translateY(-20px);
|
| 93 |
+
opacity: 1;
|
| 94 |
+
}
|
| 95 |
+
80% {
|
| 96 |
+
transform: scale(0.95) translateY(10px);
|
| 97 |
+
}
|
| 98 |
+
100% {
|
| 99 |
+
transform: scale(1) translateY(0);
|
| 100 |
+
opacity: 1;
|
| 101 |
+
}
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
.smoke-reveal {
|
| 105 |
+
animation: smokeReveal 4s ease-out forwards;
|
| 106 |
}
|
| 107 |
|
| 108 |
+
@keyframes smokeReveal {
|
| 109 |
+
0% {
|
| 110 |
+
transform: scale(0.5) translateY(50px);
|
| 111 |
+
opacity: 0;
|
| 112 |
+
filter: blur(20px);
|
| 113 |
+
}
|
| 114 |
+
30% {
|
| 115 |
+
transform: scale(1.1) translateY(-10px);
|
| 116 |
+
opacity: 0.5;
|
| 117 |
+
filter: blur(10px);
|
| 118 |
+
}
|
| 119 |
+
60% {
|
| 120 |
+
transform: scale(0.95) translateY(5px);
|
| 121 |
+
opacity: 0.8;
|
| 122 |
+
filter: blur(5px);
|
| 123 |
+
}
|
| 124 |
+
100% {
|
| 125 |
+
transform: scale(1) translateY(0);
|
| 126 |
+
opacity: 1;
|
| 127 |
+
filter: blur(0);
|
| 128 |
+
}
|
| 129 |
}
|
| 130 |
|
| 131 |
+
.glitch-flicker {
|
| 132 |
+
animation: glitchFlicker 2.5s ease-out forwards;
|
|
|
|
|
|
|
|
|
|
| 133 |
}
|
| 134 |
|
| 135 |
+
@keyframes glitchFlicker {
|
| 136 |
+
0% {
|
| 137 |
+
transform: scale(0.8);
|
| 138 |
+
opacity: 0;
|
| 139 |
+
filter: hue-rotate(0deg);
|
| 140 |
+
}
|
| 141 |
+
20% {
|
| 142 |
+
transform: scale(1.1);
|
| 143 |
+
opacity: 1;
|
| 144 |
+
filter: hue-rotate(90deg);
|
| 145 |
+
}
|
| 146 |
+
40% {
|
| 147 |
+
transform: scale(0.9) translateX(-10px);
|
| 148 |
+
filter: hue-rotate(180deg);
|
| 149 |
+
}
|
| 150 |
+
60% {
|
| 151 |
+
transform: scale(1.05) translateX(10px);
|
| 152 |
+
filter: hue-rotate(270deg);
|
| 153 |
+
}
|
| 154 |
+
80% {
|
| 155 |
+
transform: scale(0.95);
|
| 156 |
+
filter: hue-rotate(360deg);
|
| 157 |
+
}
|
| 158 |
+
100% {
|
| 159 |
+
transform: scale(1);
|
| 160 |
+
opacity: 1;
|
| 161 |
+
filter: hue-rotate(0deg);
|
| 162 |
+
}
|
| 163 |
}
|
| 164 |
|
| 165 |
+
.energy-pulse {
|
| 166 |
+
animation: energyPulse 3s ease-out forwards;
|
| 167 |
}
|
| 168 |
+
|
| 169 |
+
@keyframes energyPulse {
|
| 170 |
+
0% {
|
| 171 |
+
transform: scale(0.5);
|
| 172 |
+
opacity: 0;
|
| 173 |
+
}
|
| 174 |
+
30% {
|
| 175 |
+
transform: scale(1.3);
|
| 176 |
+
opacity: 1;
|
| 177 |
+
text-shadow:
|
| 178 |
+
0 0 50px rgba(220, 20, 60, 1),
|
| 179 |
+
0 0 100px rgba(220, 20, 60, 0.8),
|
| 180 |
+
0 0 150px rgba(220, 20, 60, 0.6);
|
| 181 |
+
}
|
| 182 |
+
50% {
|
| 183 |
+
transform: scale(1.1);
|
| 184 |
+
text-shadow:
|
| 185 |
+
0 0 30px rgba(220, 20, 60, 0.8),
|
| 186 |
+
0 0 60px rgba(220, 20, 60, 0.6),
|
| 187 |
+
0 0 90px rgba(220, 20, 60, 0.4);
|
| 188 |
+
}
|
| 189 |
+
100% {
|
| 190 |
+
transform: scale(1);
|
| 191 |
+
opacity: 1;
|
| 192 |
+
}
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
/* Particle Effects */
|
| 196 |
+
.particles {
|
| 197 |
+
position: absolute;
|
| 198 |
+
top: 0;
|
| 199 |
+
left: 0;
|
| 200 |
+
width: 100%;
|
| 201 |
+
height: 100%;
|
| 202 |
+
pointer-events: none;
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
.particle {
|
| 206 |
+
position: absolute;
|
| 207 |
+
width: 4px;
|
| 208 |
+
height: 4px;
|
| 209 |
+
background: #DC143C;
|
| 210 |
+
border-radius: 50%;
|
| 211 |
+
animation: floatParticle 2s ease-out forwards;
|
| 212 |
+
}
|
| 213 |
+
|
| 214 |
+
@keyframes floatParticle {
|
| 215 |
+
0% {
|
| 216 |
+
transform: translate(0, 0) scale(0);
|
| 217 |
+
opacity: 1;
|
| 218 |
+
}
|
| 219 |
+
100% {
|
| 220 |
+
transform: translate(var(--tx), var(--ty)) scale(1);
|
| 221 |
+
opacity: 0;
|
| 222 |
+
}
|
| 223 |
+
}
|