ProjectGenesis commited on
Commit
1838d8f
·
verified ·
1 Parent(s): 6c428b6

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

Files changed (5) hide show
  1. README.md +8 -5
  2. components/number-display.js +62 -0
  3. index.html +55 -19
  4. script.js +133 -0
  5. style.css +213 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Cinematic Countdown Elite
3
- emoji: 🏃
4
- colorFrom: green
5
- colorTo: blue
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
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
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
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
+ }