philipp-zettl commited on
Commit
82a58cc
·
verified ·
1 Parent(s): baf8368

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +368 -19
  3. prompts.txt +3 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Static Countdown
3
- emoji: 🚀
4
- colorFrom: green
5
- colorTo: yellow
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: static-countdown
3
+ emoji: 🐳
4
+ colorFrom: blue
5
+ colorTo: pink
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,368 @@
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>Modern Countdown Timer</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ body {
11
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
12
+ }
13
+ .glass-card {
14
+ background: rgba(255, 255, 255, 0.85);
15
+ backdrop-filter: blur(10px);
16
+ -webkit-backdrop-filter: blur(10px);
17
+ border-radius: 16px;
18
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.1);
19
+ }
20
+ .countdown-digit {
21
+ transition: all 0.3s ease;
22
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
23
+ }
24
+ .countdown-digit:hover {
25
+ transform: translateY(-3px);
26
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
27
+ }
28
+ .firework {
29
+ position: absolute;
30
+ width: 5px;
31
+ height: 5px;
32
+ border-radius: 50%;
33
+ box-shadow: 0 0 10px 5px;
34
+ animation: firework-animation 1s ease-out;
35
+ opacity: 0;
36
+ }
37
+ @keyframes firework-animation {
38
+ 0% { transform: translate(0, 0); opacity: 1; }
39
+ 100% { transform: translate(var(--tx), var(--ty)); opacity: 0; }
40
+ }
41
+ .confetti {
42
+ position: absolute;
43
+ width: 10px;
44
+ height: 10px;
45
+ opacity: 0;
46
+ animation: confetti-fall 3s ease-in forwards;
47
+ }
48
+ @keyframes confetti-fall {
49
+ 0% { transform: translateY(-100vh) rotate(0deg); opacity: 1; }
50
+ 100% { transform: translateY(100vh) rotate(360deg); opacity: 1; }
51
+ }
52
+ .pulse {
53
+ animation: pulse 1s infinite;
54
+ }
55
+ @keyframes pulse {
56
+ 0% { transform: scale(1); }
57
+ 50% { transform: scale(1.05); }
58
+ 100% { transform: scale(1); }
59
+ }
60
+ .flip-in {
61
+ animation: flipIn 0.5s ease-out;
62
+ }
63
+ @keyframes flipIn {
64
+ 0% { transform: rotateX(90deg); opacity: 0; }
65
+ 100% { transform: rotateX(0deg); opacity: 1; }
66
+ }
67
+ .btn-primary {
68
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
69
+ color: white;
70
+ transition: all 0.3s ease;
71
+ }
72
+ .btn-primary:hover {
73
+ transform: translateY(-2px);
74
+ box-shadow: 0 6px 12px rgba(102, 126, 234, 0.25);
75
+ }
76
+ .input-field {
77
+ transition: all 0.3s ease;
78
+ border: 1px solid #e2e8f0;
79
+ }
80
+ .input-field:focus {
81
+ border-color: #667eea;
82
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.2);
83
+ }
84
+ </style>
85
+ </head>
86
+ <body class="min-h-screen text-gray-800 font-sans">
87
+ <div id="app" class="container mx-auto px-4 py-12">
88
+ <!-- Main Page -->
89
+ <div id="main-page" class="text-center max-w-3xl mx-auto">
90
+ <div class="glass-card p-8 mb-8">
91
+ <h1 class="text-4xl font-bold mb-4 text-gray-800">Countdown Timer</h1>
92
+ <p class="text-lg text-gray-600 mb-8">Create and share beautiful countdowns with custom durations and animations</p>
93
+
94
+ <form id="countdown-form" class="space-y-6">
95
+ <div class="text-left">
96
+ <label for="title" class="block mb-2 text-gray-700">Countdown Title</label>
97
+ <input type="text" id="title" placeholder="New Year's Eve"
98
+ class="input-field w-full px-4 py-3 rounded-lg bg-white">
99
+ </div>
100
+
101
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
102
+ <div class="text-left">
103
+ <label for="days" class="block mb-2 text-gray-700">Days</label>
104
+ <input type="number" id="days" min="0" value="0"
105
+ class="input-field w-full px-4 py-3 rounded-lg bg-white">
106
+ </div>
107
+ <div class="text-left">
108
+ <label for="hours" class="block mb-2 text-gray-700">Hours</label>
109
+ <input type="number" id="hours" min="0" max="23" value="0"
110
+ class="input-field w-full px-4 py-3 rounded-lg bg-white">
111
+ </div>
112
+ <div class="text-left">
113
+ <label for="minutes" class="block mb-2 text-gray-700">Minutes</label>
114
+ <input type="number" id="minutes" min="0" max="59" value="10"
115
+ class="input-field w-full px-4 py-3 rounded-lg bg-white">
116
+ </div>
117
+ <div class="text-left">
118
+ <label for="seconds" class="block mb-2 text-gray-700">Seconds</label>
119
+ <input type="number" id="seconds" min="0" max="59" value="0"
120
+ class="input-field w-full px-4 py-3 rounded-lg bg-white">
121
+ </div>
122
+ </div>
123
+
124
+ <div class="text-left">
125
+ <label class="block mb-2 text-gray-700">Finish Animation</label>
126
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-3">
127
+ <label class="flex items-center space-x-2 cursor-pointer p-3 rounded-lg hover:bg-gray-100">
128
+ <input type="radio" name="animation" value="fireworks" checked class="form-radio h-5 w-5 text-indigo-600">
129
+ <span class="text-gray-700">Fireworks</span>
130
+ </label>
131
+ <label class="flex items-center space-x-2 cursor-pointer p-3 rounded-lg hover:bg-gray-100">
132
+ <input type="radio" name="animation" value="confetti" class="form-radio h-5 w-5 text-indigo-600">
133
+ <span class="text-gray-700">Confetti</span>
134
+ </label>
135
+ <label class="flex items-center space-x-2 cursor-pointer p-3 rounded-lg hover:bg-gray-100">
136
+ <input type="radio" name="animation" value="pulse" class="form-radio h-5 w-5 text-indigo-600">
137
+ <span class="text-gray-700">Pulse</span>
138
+ </label>
139
+ <label class="flex items-center space-x-2 cursor-pointer p-3 rounded-lg hover:bg-gray-100">
140
+ <input type="radio" name="animation" value="none" class="form-radio h-5 w-5 text-indigo-600">
141
+ <span class="text-gray-700">None</span>
142
+ </label>
143
+ </div>
144
+ </div>
145
+
146
+ <button type="submit" class="btn-primary mt-6 px-8 py-3 rounded-full font-semibold">
147
+ Start Countdown <i class="fas fa-play ml-2"></i>
148
+ </button>
149
+ </form>
150
+ </div>
151
+
152
+ <div class="glass-card p-6">
153
+ <h2 class="text-2xl font-semibold mb-4 text-gray-800">How to Use</h2>
154
+ <div class="text-left space-y-2 text-gray-600">
155
+ <p>1. Set your countdown duration using days, hours, minutes and seconds</p>
156
+ <p>2. Add a title and choose a finish animation</p>
157
+ <p>3. Share the URL with others - all settings are included</p>
158
+ <p class="mt-4 font-medium">Example URL: <code class="bg-gray-100 px-2 py-1 rounded">?title=New+Year&days=30&hours=12&animation=fireworks</code></p>
159
+ </div>
160
+ </div>
161
+ </div>
162
+
163
+ <!-- Countdown Page -->
164
+ <div id="countdown-page" class="hidden text-center">
165
+ <div class="glass-card p-8 max-w-2xl mx-auto">
166
+ <h1 id="countdown-title" class="text-3xl font-bold mb-8 text-gray-800">Countdown</h1>
167
+
168
+ <div class="flex justify-center space-x-4 mb-8">
169
+ <div class="countdown-digit bg-white rounded-lg p-4 w-20 text-center">
170
+ <div id="days-display" class="text-3xl font-bold text-indigo-600">00</div>
171
+ <div class="text-sm text-gray-500">Days</div>
172
+ </div>
173
+ <div class="countdown-digit bg-white rounded-lg p-4 w-20 text-center">
174
+ <div id="hours-display" class="text-3xl font-bold text-indigo-600">00</div>
175
+ <div class="text-sm text-gray-500">Hours</div>
176
+ </div>
177
+ <div class="countdown-digit bg-white rounded-lg p-4 w-20 text-center">
178
+ <div id="minutes-display" class="text-3xl font-bold text-indigo-600">00</div>
179
+ <div class="text-sm text-gray-500">Minutes</div>
180
+ </div>
181
+ <div class="countdown-digit bg-white rounded-lg p-4 w-20 text-center">
182
+ <div id="seconds-display" class="text-3xl font-bold text-indigo-600">00</div>
183
+ <div class="text-sm text-gray-500">Seconds</div>
184
+ </div>
185
+ </div>
186
+
187
+ <div id="finished-message" class="hidden text-2xl font-bold mb-6">
188
+ <div class="inline-block px-6 py-3 bg-indigo-600 text-white rounded-full">
189
+ Time's Up!
190
+ </div>
191
+ </div>
192
+
193
+ <button id="new-countdown" class="btn-primary mt-4 px-6 py-2 rounded-full font-medium">
194
+ <i class="fas fa-redo mr-2"></i> New Countdown
195
+ </button>
196
+ </div>
197
+ </div>
198
+ </div>
199
+
200
+ <script>
201
+ document.addEventListener('DOMContentLoaded', function() {
202
+ // Check URL parameters
203
+ const urlParams = new URLSearchParams(window.location.search);
204
+ const hasParams = urlParams.has('days') || urlParams.has('hours') || urlParams.has('minutes') || urlParams.has('seconds');
205
+
206
+ if (hasParams) {
207
+ // Start countdown from URL params
208
+ const title = urlParams.get('title') || 'Countdown';
209
+ const days = parseInt(urlParams.get('days')) || 0;
210
+ const hours = parseInt(urlParams.get('hours')) || 0;
211
+ const minutes = parseInt(urlParams.get('minutes')) || 0;
212
+ const seconds = parseInt(urlParams.get('seconds')) || 0;
213
+ const animation = urlParams.get('animation') || 'fireworks';
214
+
215
+ startCountdown(title, days, hours, minutes, seconds, animation);
216
+ }
217
+
218
+ // Form submission
219
+ const form = document.getElementById('countdown-form');
220
+ form.addEventListener('submit', function(e) {
221
+ e.preventDefault();
222
+
223
+ const title = document.getElementById('title').value || 'Countdown';
224
+ const days = parseInt(document.getElementById('days').value) || 0;
225
+ const hours = parseInt(document.getElementById('hours').value) || 0;
226
+ const minutes = parseInt(document.getElementById('minutes').value) || 0;
227
+ const seconds = parseInt(document.getElementById('seconds').value) || 0;
228
+ const animation = document.querySelector('input[name="animation"]:checked').value;
229
+
230
+ // Update URL with parameters
231
+ const params = new URLSearchParams();
232
+ if (title !== 'Countdown') params.set('title', title);
233
+ if (days > 0) params.set('days', days);
234
+ if (hours > 0) params.set('hours', hours);
235
+ if (minutes > 0) params.set('minutes', minutes);
236
+ if (seconds > 0) params.set('seconds', seconds);
237
+ params.set('animation', animation);
238
+
239
+ window.history.pushState({}, '', `?${params.toString()}`);
240
+
241
+ startCountdown(title, days, hours, minutes, seconds, animation);
242
+ });
243
+
244
+ // New countdown button
245
+ document.getElementById('new-countdown').addEventListener('click', function() {
246
+ window.history.pushState({}, '', window.location.pathname);
247
+ document.getElementById('main-page').classList.remove('hidden');
248
+ document.getElementById('countdown-page').classList.add('hidden');
249
+ clearInterval(window.countdownInterval);
250
+ document.getElementById('finished-message').classList.add('hidden');
251
+ });
252
+ });
253
+
254
+ function startCountdown(title, days, hours, minutes, seconds, animationType) {
255
+ // Switch to countdown page
256
+ document.getElementById('main-page').classList.add('hidden');
257
+ document.getElementById('countdown-page').classList.remove('hidden');
258
+ document.getElementById('countdown-title').textContent = title;
259
+ document.getElementById('finished-message').classList.add('hidden');
260
+
261
+ // Calculate total seconds
262
+ let totalSeconds = days * 86400 + hours * 3600 + minutes * 60 + seconds;
263
+
264
+ // Start the countdown
265
+ updateCountdownDisplay(totalSeconds);
266
+
267
+ window.countdownInterval = setInterval(function() {
268
+ totalSeconds--;
269
+ updateCountdownDisplay(totalSeconds);
270
+
271
+ if (totalSeconds <= 0) {
272
+ clearInterval(window.countdownInterval);
273
+ countdownFinished(animationType);
274
+ }
275
+ }, 1000);
276
+ }
277
+
278
+ function updateCountdownDisplay(totalSeconds) {
279
+ const days = Math.floor(totalSeconds / 86400);
280
+ const hours = Math.floor((totalSeconds % 86400) / 3600);
281
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
282
+ const seconds = totalSeconds % 60;
283
+
284
+ document.getElementById('days-display').textContent = days.toString().padStart(2, '0');
285
+ document.getElementById('hours-display').textContent = hours.toString().padStart(2, '0');
286
+ document.getElementById('minutes-display').textContent = minutes.toString().padStart(2, '0');
287
+ document.getElementById('seconds-display').textContent = seconds.toString().padStart(2, '0');
288
+ }
289
+
290
+ function countdownFinished(animationType) {
291
+ document.getElementById('finished-message').classList.remove('hidden');
292
+
293
+ switch(animationType) {
294
+ case 'fireworks':
295
+ createFireworks();
296
+ break;
297
+ case 'confetti':
298
+ createConfetti();
299
+ break;
300
+ case 'pulse':
301
+ document.getElementById('finished-message').classList.add('pulse');
302
+ break;
303
+ // 'none' case does nothing
304
+ }
305
+ }
306
+
307
+ function createFireworks() {
308
+ const colors = ['#ff0000', '#ffff00', '#00ff00', '#00ffff', '#0000ff', '#ff00ff'];
309
+ const container = document.getElementById('app');
310
+
311
+ for (let i = 0; i < 30; i++) {
312
+ setTimeout(() => {
313
+ const firework = document.createElement('div');
314
+ firework.className = 'firework';
315
+ firework.style.left = `${Math.random() * 100}%`;
316
+ firework.style.top = `${Math.random() * 100}%`;
317
+ firework.style.color = colors[Math.floor(Math.random() * colors.length)];
318
+
319
+ // Random direction for particles
320
+ const angle = Math.random() * Math.PI * 2;
321
+ const distance = 30 + Math.random() * 70;
322
+ const tx = Math.cos(angle) * distance;
323
+ const ty = Math.sin(angle) * distance;
324
+
325
+ firework.style.setProperty('--tx', `${tx}px`);
326
+ firework.style.setProperty('--ty', `${ty}px`);
327
+
328
+ container.appendChild(firework);
329
+
330
+ // Remove after animation
331
+ setTimeout(() => {
332
+ firework.remove();
333
+ }, 1000);
334
+ }, i * 200);
335
+ }
336
+ }
337
+
338
+ function createConfetti() {
339
+ const colors = ['#ff0000', '#ffff00', '#00ff00', '#00ffff', '#0000ff', '#ff00ff'];
340
+ const container = document.getElementById('app');
341
+
342
+ for (let i = 0; i < 80; i++) {
343
+ setTimeout(() => {
344
+ const confetti = document.createElement('div');
345
+ confetti.className = 'confetti';
346
+ confetti.style.left = `${Math.random() * 100}%`;
347
+ confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
348
+ confetti.style.animationDelay = `${Math.random() * 2}s`;
349
+
350
+ // Random shape
351
+ if (Math.random() > 0.5) {
352
+ confetti.style.borderRadius = '50%';
353
+ } else {
354
+ confetti.style.transform = 'rotate(45deg)';
355
+ }
356
+
357
+ container.appendChild(confetti);
358
+
359
+ // Remove after animation
360
+ setTimeout(() => {
361
+ confetti.remove();
362
+ }, 3000);
363
+ }, i * 100);
364
+ }
365
+ }
366
+ </script>
367
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=philipp-zettl/static-countdown" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
368
+ </html>
prompts.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ A cool modern countdown application that is customisable through query parameters. The main page should describe the functionality and provide a simple form, then change to a simple countdown page with a title. Offer different animations for when the countdown finishes.
2
+ A cool modern countdown application that is customisable through query parameters. The main page should describe the functionality and provide a simple form, then change to a simple countdown page with a title. Offer different animations for when the countdown finishes.
3
+ Make it look more polished and simplistic. Also add an option for seconds