SolarumAsteridion commited on
Commit
402c211
ยท
verified ยท
1 Parent(s): 70c6ca9

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +879 -37
index.html CHANGED
@@ -4,60 +4,902 @@
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Neon Exam Countdown</title>
7
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700&display=swap" rel="stylesheet">
8
  <style>
9
  * { margin: 0; padding: 0; box-sizing: border-box; }
10
- body { font-family: 'Inter', sans-serif; background: linear-gradient(135deg, #0A0A0B 0%, #141419 100%); min-height: 100vh; color: #fff; overflow-x: hidden; position: relative; }
11
- .particles { position: fixed; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; z-index: 1; }
12
- .particle { position: absolute; width: 4px; height: 4px; background: radial-gradient(circle, rgba(0, 212, 255, 0.5) 0%, transparent 70%); border-radius: 50%; animation: float 20s infinite linear; }
13
- @keyframes float { from { transform: translateY(100vh) translateX(0); opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } to { transform: translateY(-100vh) translateX(100px); opacity: 0; } }
14
- .container { max-width: 1200px; margin: 0 auto; padding: 2rem; position: relative; z-index: 2; }
15
- .header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 3rem; }
16
- h1 { font-size: 2.5rem; font-weight: 700; background: linear-gradient(135deg, #00D4FF 0%, #FF0080 50%, #00FF88 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-shadow: 0 0 30px rgba(0, 212, 255, 0.5); }
17
- .settings-btn { width: 50px; height: 50px; background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 12px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.3s ease; }
18
- .settings-btn:hover { background: rgba(255, 255, 255, 0.1); border-color: #00D4FF; box-shadow: 0 0 20px rgba(0, 212, 255, 0.5); transform: scale(1.05); }
19
- .settings-btn svg { width: 24px; height: 24px; fill: #00D4FF; }
20
- .exams-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 2rem; }
21
- .exam-card { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 2rem; text-align: center; transition: all 0.3s ease; position: relative; overflow: hidden; }
22
- .exam-card:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3); }
23
- .exam-name { font-size: 1.5rem; font-weight: 600; margin-bottom: 1rem; color: #fff; }
24
- .countdown { font-size: 3rem; font-weight: 700; text-shadow: 0 0 20px rgba(0, 212, 255, 0.8); margin-bottom: 0.5rem; }
25
- .countdown-label { font-size: 1rem; color: rgba(255, 255, 255, 0.7); }
26
- .exam-date { font-size: 0.9rem; color: rgba(255, 255, 255, 0.5); margin-top: 1rem; }
27
- .delete-btn { position: absolute; top: 1rem; right: 1rem; width: 30px; height: 30px; background: rgba(255, 0, 128, 0.2); border: 1px solid rgba(255, 0, 128, 0.5); border-radius: 8px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.3s ease; opacity: 0; }
28
- .exam-card:hover .delete-btn { opacity: 1; }
29
- .delete-btn:hover { background: rgba(255, 0, 128, 0.4); transform: scale(1.1); }
30
- .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); z-index: 1000; align-items: center; justify-content: center; padding: 2rem; }
31
- .modal.active { display: flex; }
32
- .modal-content { background: rgba(20, 20, 25, 0.95); backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 2rem; width: 100%; max-width: 400px; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5); }
33
- .modal-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; }
34
- .modal-title { font-size: 1.5rem; font-weight: 600; }
35
- .close-btn { width: 30px; height: 30px; background: transparent; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: transform 0.3s ease; }
36
- .close-btn:hover { transform: rotate(90deg); }
37
- .add-btn { width: 100%; padding: 1rem; background: linear-gradient(135deg, #00D4FF 0%, #FF0080 100%); border: none; border-radius: 10px; color: #fff; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; }
38
- .add-btn:hover { transform: translateY(-2px); box-shadow: 0 5px 20px rgba(0, 212, 255, 0.5); }
39
- .empty-state { text-align: center; padding: 4rem 2rem; }
40
- .empty-state p { font-size: 1.2rem; color: rgba(255, 255, 255, 0.5); margin-bottom: 2rem; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  </style>
42
  </head>
43
  <body>
 
44
  <div class="particles" id="particles"></div>
 
45
  <div class="container">
46
- <div class="header"><h1>Exam Countdown</h1><div class="settings-btn" id="openModalBtn"><svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></svg></div></div>
 
 
 
 
 
 
 
 
47
  <div class="exams-grid" id="examsGrid"></div>
48
- <div class="empty-state" id="emptyState" style="display: none;"><p>No exams scheduled yet. Click the + button to add your first exam!</p></div>
 
 
 
 
49
  </div>
 
50
  <div class="modal" id="modal">
51
  <div class="modal-content">
52
- <div class="modal-header"><h2 class="modal-title">Add New Exam</h2><button class="close-btn" id="closeModalBtn"><svg width="24" height="24" viewBox="0 0 24 24" fill="#fff"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg></button></div>
 
 
 
 
 
 
 
53
  <form id="addExamForm">
54
- <div class="form-group"><label for="examName">Exam Name</label><input type="text" id="examName" required placeholder="e.g., Physics Final"></div>
55
- <div class="form-group"><label for="examDate">Exam Date</label><input type="date" id="examDate" required></div>
 
 
 
 
 
 
56
  <button type="submit" class="add-btn">Add Exam</button>
57
  </form>
58
  </div>
59
  </div>
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  <script type="module">
62
  // Firebase SDK modules
63
  import { initializeApp } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js";
 
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>Neon Exam Countdown</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;800&family=Orbitron:wght@400;600;700;900&display=swap" rel="stylesheet">
8
  <style>
9
  * { margin: 0; padding: 0; box-sizing: border-box; }
10
+
11
+ body {
12
+ font-family: 'Inter', sans-serif;
13
+ background: #000000;
14
+ min-height: 100vh;
15
+ color: #fff;
16
+ overflow-x: hidden;
17
+ position: relative;
18
+ }
19
+
20
+ /* Animated Background */
21
+ .animated-bg {
22
+ position: fixed;
23
+ top: 0;
24
+ left: 0;
25
+ width: 100%;
26
+ height: 100%;
27
+ z-index: 0;
28
+ background: radial-gradient(ellipse at top, #1a0a2e 0%, #0a0a0f 50%, #000000 100%);
29
+ }
30
+
31
+ .animated-bg::before {
32
+ content: '';
33
+ position: absolute;
34
+ width: 200%;
35
+ height: 200%;
36
+ top: -50%;
37
+ left: -50%;
38
+ background:
39
+ radial-gradient(circle at 20% 50%, rgba(0, 212, 255, 0.15) 0%, transparent 50%),
40
+ radial-gradient(circle at 80% 80%, rgba(255, 0, 128, 0.15) 0%, transparent 50%),
41
+ radial-gradient(circle at 40% 20%, rgba(0, 255, 136, 0.1) 0%, transparent 50%);
42
+ animation: bgRotate 20s linear infinite;
43
+ }
44
+
45
+ @keyframes bgRotate {
46
+ 0% { transform: rotate(0deg); }
47
+ 100% { transform: rotate(360deg); }
48
+ }
49
+
50
+ /* Enhanced Particles */
51
+ .particles {
52
+ position: fixed;
53
+ top: 0;
54
+ left: 0;
55
+ width: 100%;
56
+ height: 100%;
57
+ overflow: hidden;
58
+ z-index: 1;
59
+ pointer-events: none;
60
+ }
61
+
62
+ .particle {
63
+ position: absolute;
64
+ border-radius: 50%;
65
+ animation: float linear infinite;
66
+ filter: blur(1px);
67
+ }
68
+
69
+ .particle:nth-child(3n) {
70
+ background: radial-gradient(circle, rgba(0, 212, 255, 0.8) 0%, transparent 70%);
71
+ box-shadow: 0 0 10px rgba(0, 212, 255, 0.5);
72
+ }
73
+
74
+ .particle:nth-child(3n+1) {
75
+ background: radial-gradient(circle, rgba(255, 0, 128, 0.8) 0%, transparent 70%);
76
+ box-shadow: 0 0 10px rgba(255, 0, 128, 0.5);
77
+ }
78
+
79
+ .particle:nth-child(3n+2) {
80
+ background: radial-gradient(circle, rgba(0, 255, 136, 0.8) 0%, transparent 70%);
81
+ box-shadow: 0 0 10px rgba(0, 255, 136, 0.5);
82
+ }
83
+
84
+ @keyframes float {
85
+ from {
86
+ transform: translateY(100vh) translateX(0) scale(0);
87
+ opacity: 0;
88
+ }
89
+ 10% {
90
+ opacity: 1;
91
+ transform: translateY(90vh) translateX(20px) scale(1);
92
+ }
93
+ 90% {
94
+ opacity: 1;
95
+ }
96
+ to {
97
+ transform: translateY(-10vh) translateX(100px) scale(0);
98
+ opacity: 0;
99
+ }
100
+ }
101
+
102
+ .container {
103
+ max-width: 1400px;
104
+ margin: 0 auto;
105
+ padding: 3rem 2rem;
106
+ position: relative;
107
+ z-index: 2;
108
+ }
109
+
110
+ /* Enhanced Header */
111
+ .header {
112
+ display: flex;
113
+ justify-content: space-between;
114
+ align-items: center;
115
+ margin-bottom: 4rem;
116
+ padding: 2rem;
117
+ background: rgba(255, 255, 255, 0.03);
118
+ backdrop-filter: blur(20px);
119
+ border-radius: 25px;
120
+ border: 1px solid rgba(255, 255, 255, 0.1);
121
+ position: relative;
122
+ overflow: hidden;
123
+ }
124
+
125
+ .header::before {
126
+ content: '';
127
+ position: absolute;
128
+ top: 0;
129
+ left: -100%;
130
+ width: 100%;
131
+ height: 100%;
132
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
133
+ animation: shimmer 3s infinite;
134
+ }
135
+
136
+ @keyframes shimmer {
137
+ 0% { left: -100%; }
138
+ 100% { left: 100%; }
139
+ }
140
+
141
+ h1 {
142
+ font-family: 'Orbitron', sans-serif;
143
+ font-size: 3.5rem;
144
+ font-weight: 900;
145
+ background: linear-gradient(135deg, #00D4FF 0%, #FF0080 25%, #7928FF 50%, #00FF88 75%, #00D4FF 100%);
146
+ background-size: 300% 100%;
147
+ -webkit-background-clip: text;
148
+ -webkit-text-fill-color: transparent;
149
+ background-clip: text;
150
+ animation: gradientShift 5s ease infinite;
151
+ filter: drop-shadow(0 0 30px rgba(0, 212, 255, 0.5));
152
+ position: relative;
153
+ }
154
+
155
+ @keyframes gradientShift {
156
+ 0%, 100% { background-position: 0% 50%; }
157
+ 50% { background-position: 100% 50%; }
158
+ }
159
+
160
+ .settings-btn {
161
+ width: 60px;
162
+ height: 60px;
163
+ background: linear-gradient(135deg, rgba(0, 212, 255, 0.2) 0%, rgba(255, 0, 128, 0.2) 100%);
164
+ backdrop-filter: blur(10px);
165
+ border: 2px solid rgba(0, 212, 255, 0.5);
166
+ border-radius: 18px;
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ cursor: pointer;
171
+ transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
172
+ position: relative;
173
+ overflow: hidden;
174
+ }
175
+
176
+ .settings-btn::before {
177
+ content: '';
178
+ position: absolute;
179
+ top: 50%;
180
+ left: 50%;
181
+ width: 0;
182
+ height: 0;
183
+ background: radial-gradient(circle, rgba(0, 212, 255, 0.4) 0%, transparent 70%);
184
+ border-radius: 50%;
185
+ transform: translate(-50%, -50%);
186
+ transition: width 0.6s, height 0.6s;
187
+ }
188
+
189
+ .settings-btn:hover::before {
190
+ width: 200px;
191
+ height: 200px;
192
+ }
193
+
194
+ .settings-btn:hover {
195
+ background: linear-gradient(135deg, rgba(0, 212, 255, 0.4) 0%, rgba(255, 0, 128, 0.4) 100%);
196
+ border-color: #00D4FF;
197
+ box-shadow: 0 0 40px rgba(0, 212, 255, 0.8), 0 0 80px rgba(255, 0, 128, 0.4);
198
+ transform: scale(1.15) rotate(90deg);
199
+ }
200
+
201
+ .settings-btn svg {
202
+ width: 28px;
203
+ height: 28px;
204
+ fill: #00D4FF;
205
+ filter: drop-shadow(0 0 5px rgba(0, 212, 255, 0.8));
206
+ position: relative;
207
+ z-index: 1;
208
+ }
209
+
210
+ /* Enhanced Grid */
211
+ .exams-grid {
212
+ display: grid;
213
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
214
+ gap: 2.5rem;
215
+ }
216
+
217
+ /* Enhanced Exam Card */
218
+ .exam-card {
219
+ background: rgba(255, 255, 255, 0.03);
220
+ backdrop-filter: blur(30px);
221
+ border: 1px solid rgba(255, 255, 255, 0.1);
222
+ border-radius: 30px;
223
+ padding: 2.5rem;
224
+ text-align: center;
225
+ transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
226
+ position: relative;
227
+ overflow: hidden;
228
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
229
+ }
230
+
231
+ .exam-card::before {
232
+ content: '';
233
+ position: absolute;
234
+ top: 0;
235
+ left: 0;
236
+ width: 100%;
237
+ height: 100%;
238
+ background: linear-gradient(135deg, rgba(0, 212, 255, 0.1) 0%, rgba(255, 0, 128, 0.1) 100%);
239
+ opacity: 0;
240
+ transition: opacity 0.5s;
241
+ }
242
+
243
+ .exam-card:hover::before {
244
+ opacity: 1;
245
+ }
246
+
247
+ .exam-card::after {
248
+ content: '';
249
+ position: absolute;
250
+ top: -50%;
251
+ left: -50%;
252
+ width: 200%;
253
+ height: 200%;
254
+ background: conic-gradient(
255
+ transparent,
256
+ rgba(0, 212, 255, 0.3),
257
+ transparent 30%
258
+ );
259
+ animation: rotate 4s linear infinite;
260
+ opacity: 0;
261
+ }
262
+
263
+ .exam-card:hover::after {
264
+ opacity: 1;
265
+ }
266
+
267
+ @keyframes rotate {
268
+ 100% { transform: rotate(360deg); }
269
+ }
270
+
271
+ .exam-card-inner {
272
+ position: relative;
273
+ z-index: 1;
274
+ background: rgba(10, 10, 15, 0.8);
275
+ border-radius: 25px;
276
+ padding: 2rem;
277
+ }
278
+
279
+ .exam-card:hover {
280
+ transform: translateY(-10px) scale(1.02);
281
+ border-color: rgba(0, 212, 255, 0.5);
282
+ box-shadow:
283
+ 0 20px 60px rgba(0, 212, 255, 0.4),
284
+ 0 0 100px rgba(255, 0, 128, 0.2),
285
+ inset 0 0 50px rgba(0, 212, 255, 0.1);
286
+ }
287
+
288
+ .exam-card.urgent {
289
+ border-color: rgba(255, 0, 128, 0.5);
290
+ }
291
+
292
+ .exam-card.urgent:hover {
293
+ box-shadow:
294
+ 0 20px 60px rgba(255, 0, 128, 0.4),
295
+ 0 0 100px rgba(255, 0, 128, 0.3);
296
+ }
297
+
298
+ .exam-icon {
299
+ width: 80px;
300
+ height: 80px;
301
+ margin: 0 auto 1.5rem;
302
+ background: linear-gradient(135deg, #00D4FF 0%, #FF0080 100%);
303
+ border-radius: 20px;
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ font-size: 2.5rem;
308
+ animation: pulse 2s ease-in-out infinite;
309
+ box-shadow: 0 10px 30px rgba(0, 212, 255, 0.4);
310
+ }
311
+
312
+ @keyframes pulse {
313
+ 0%, 100% { transform: scale(1); }
314
+ 50% { transform: scale(1.05); }
315
+ }
316
+
317
+ .exam-name {
318
+ font-family: 'Orbitron', sans-serif;
319
+ font-size: 1.8rem;
320
+ font-weight: 700;
321
+ margin-bottom: 1.5rem;
322
+ color: #fff;
323
+ text-shadow: 0 0 20px rgba(0, 212, 255, 0.5);
324
+ letter-spacing: 1px;
325
+ }
326
+
327
+ /* Detailed Countdown */
328
+ .countdown-wrapper {
329
+ display: grid;
330
+ grid-template-columns: repeat(4, 1fr);
331
+ gap: 1rem;
332
+ margin: 2rem 0;
333
+ }
334
+
335
+ .countdown-item {
336
+ background: rgba(255, 255, 255, 0.05);
337
+ border-radius: 15px;
338
+ padding: 1rem 0.5rem;
339
+ border: 1px solid rgba(255, 255, 255, 0.1);
340
+ transition: all 0.3s;
341
+ }
342
+
343
+ .countdown-item:hover {
344
+ background: rgba(255, 255, 255, 0.08);
345
+ transform: translateY(-3px);
346
+ }
347
+
348
+ .countdown-number {
349
+ font-family: 'Orbitron', sans-serif;
350
+ font-size: 2.5rem;
351
+ font-weight: 900;
352
+ background: linear-gradient(135deg, #00D4FF 0%, #00FF88 100%);
353
+ -webkit-background-clip: text;
354
+ -webkit-text-fill-color: transparent;
355
+ background-clip: text;
356
+ text-shadow: 0 0 30px rgba(0, 212, 255, 0.8);
357
+ line-height: 1;
358
+ margin-bottom: 0.5rem;
359
+ }
360
+
361
+ .exam-card.urgent .countdown-number {
362
+ background: linear-gradient(135deg, #FF0080 0%, #FF6B35 100%);
363
+ -webkit-background-clip: text;
364
+ -webkit-text-fill-color: transparent;
365
+ background-clip: text;
366
+ }
367
+
368
+ .countdown-label {
369
+ font-size: 0.75rem;
370
+ color: rgba(255, 255, 255, 0.6);
371
+ text-transform: uppercase;
372
+ letter-spacing: 1px;
373
+ font-weight: 600;
374
+ }
375
+
376
+ /* Progress Bar */
377
+ .progress-container {
378
+ width: 100%;
379
+ height: 8px;
380
+ background: rgba(255, 255, 255, 0.1);
381
+ border-radius: 10px;
382
+ overflow: hidden;
383
+ margin: 1.5rem 0;
384
+ position: relative;
385
+ }
386
+
387
+ .progress-bar {
388
+ height: 100%;
389
+ background: linear-gradient(90deg, #00D4FF 0%, #FF0080 50%, #00FF88 100%);
390
+ background-size: 200% 100%;
391
+ border-radius: 10px;
392
+ transition: width 1s ease;
393
+ animation: progressShimmer 2s linear infinite;
394
+ box-shadow: 0 0 20px rgba(0, 212, 255, 0.6);
395
+ }
396
+
397
+ @keyframes progressShimmer {
398
+ 0% { background-position: 0% 50%; }
399
+ 100% { background-position: 200% 50%; }
400
+ }
401
+
402
+ .exam-date {
403
+ font-size: 1rem;
404
+ color: rgba(255, 255, 255, 0.6);
405
+ margin-top: 1.5rem;
406
+ padding: 0.8rem;
407
+ background: rgba(255, 255, 255, 0.05);
408
+ border-radius: 10px;
409
+ border: 1px solid rgba(255, 255, 255, 0.1);
410
+ font-weight: 600;
411
+ }
412
+
413
+ .delete-btn {
414
+ position: absolute;
415
+ top: 1.5rem;
416
+ right: 1.5rem;
417
+ width: 40px;
418
+ height: 40px;
419
+ background: rgba(255, 0, 80, 0.2);
420
+ backdrop-filter: blur(10px);
421
+ border: 1px solid rgba(255, 0, 80, 0.5);
422
+ border-radius: 12px;
423
+ display: flex;
424
+ align-items: center;
425
+ justify-content: center;
426
+ cursor: pointer;
427
+ transition: all 0.3s ease;
428
+ opacity: 0;
429
+ z-index: 10;
430
+ }
431
+
432
+ .exam-card:hover .delete-btn {
433
+ opacity: 1;
434
+ }
435
+
436
+ .delete-btn:hover {
437
+ background: rgba(255, 0, 80, 0.6);
438
+ transform: scale(1.2) rotate(90deg);
439
+ box-shadow: 0 0 20px rgba(255, 0, 80, 0.8);
440
+ }
441
+
442
+ .delete-btn svg {
443
+ width: 20px;
444
+ height: 20px;
445
+ fill: #fff;
446
+ }
447
+
448
+ /* Enhanced Modal */
449
+ .modal {
450
+ display: none;
451
+ position: fixed;
452
+ top: 0;
453
+ left: 0;
454
+ width: 100%;
455
+ height: 100%;
456
+ background: rgba(0, 0, 0, 0.9);
457
+ backdrop-filter: blur(10px);
458
+ z-index: 1000;
459
+ align-items: center;
460
+ justify-content: center;
461
+ padding: 2rem;
462
+ animation: fadeIn 0.3s ease;
463
+ }
464
+
465
+ @keyframes fadeIn {
466
+ from { opacity: 0; }
467
+ to { opacity: 1; }
468
+ }
469
+
470
+ .modal.active {
471
+ display: flex;
472
+ }
473
+
474
+ .modal-content {
475
+ background: linear-gradient(135deg, rgba(20, 20, 30, 0.95) 0%, rgba(10, 10, 20, 0.95) 100%);
476
+ backdrop-filter: blur(30px);
477
+ border: 2px solid rgba(0, 212, 255, 0.3);
478
+ border-radius: 30px;
479
+ padding: 3rem;
480
+ width: 100%;
481
+ max-width: 500px;
482
+ box-shadow:
483
+ 0 30px 60px rgba(0, 0, 0, 0.8),
484
+ 0 0 100px rgba(0, 212, 255, 0.3),
485
+ inset 0 0 50px rgba(0, 212, 255, 0.05);
486
+ animation: modalSlideIn 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
487
+ position: relative;
488
+ overflow: hidden;
489
+ }
490
+
491
+ .modal-content::before {
492
+ content: '';
493
+ position: absolute;
494
+ top: -50%;
495
+ left: -50%;
496
+ width: 200%;
497
+ height: 200%;
498
+ background: conic-gradient(
499
+ transparent,
500
+ rgba(0, 212, 255, 0.1),
501
+ transparent 30%
502
+ );
503
+ animation: rotate 4s linear infinite;
504
+ }
505
+
506
+ @keyframes modalSlideIn {
507
+ from {
508
+ transform: translateY(-100px);
509
+ opacity: 0;
510
+ }
511
+ to {
512
+ transform: translateY(0);
513
+ opacity: 1;
514
+ }
515
+ }
516
+
517
+ .modal-header {
518
+ display: flex;
519
+ justify-content: space-between;
520
+ align-items: center;
521
+ margin-bottom: 2.5rem;
522
+ position: relative;
523
+ z-index: 1;
524
+ }
525
+
526
+ .modal-title {
527
+ font-family: 'Orbitron', sans-serif;
528
+ font-size: 2rem;
529
+ font-weight: 700;
530
+ background: linear-gradient(135deg, #00D4FF 0%, #FF0080 100%);
531
+ -webkit-background-clip: text;
532
+ -webkit-text-fill-color: transparent;
533
+ background-clip: text;
534
+ }
535
+
536
+ .close-btn {
537
+ width: 40px;
538
+ height: 40px;
539
+ background: rgba(255, 0, 80, 0.2);
540
+ border: 1px solid rgba(255, 0, 80, 0.5);
541
+ border-radius: 12px;
542
+ cursor: pointer;
543
+ display: flex;
544
+ align-items: center;
545
+ justify-content: center;
546
+ transition: all 0.3s ease;
547
+ }
548
+
549
+ .close-btn:hover {
550
+ transform: rotate(90deg) scale(1.1);
551
+ background: rgba(255, 0, 80, 0.4);
552
+ box-shadow: 0 0 20px rgba(255, 0, 80, 0.6);
553
+ }
554
+
555
+ /* Enhanced Form */
556
+ #addExamForm {
557
+ position: relative;
558
+ z-index: 1;
559
+ }
560
+
561
+ .form-group {
562
+ margin-bottom: 2rem;
563
+ position: relative;
564
+ }
565
+
566
+ .form-group label {
567
+ display: block;
568
+ margin-bottom: 0.8rem;
569
+ font-weight: 600;
570
+ color: rgba(255, 255, 255, 0.8);
571
+ font-size: 0.95rem;
572
+ text-transform: uppercase;
573
+ letter-spacing: 1px;
574
+ }
575
+
576
+ .form-group input {
577
+ width: 100%;
578
+ padding: 1.2rem 1.5rem;
579
+ background: rgba(255, 255, 255, 0.05);
580
+ border: 2px solid rgba(255, 255, 255, 0.1);
581
+ border-radius: 15px;
582
+ color: #fff;
583
+ font-size: 1.1rem;
584
+ font-family: 'Inter', sans-serif;
585
+ transition: all 0.3s ease;
586
+ backdrop-filter: blur(10px);
587
+ }
588
+
589
+ .form-group input:focus {
590
+ outline: none;
591
+ border-color: #00D4FF;
592
+ background: rgba(255, 255, 255, 0.08);
593
+ box-shadow:
594
+ 0 0 0 4px rgba(0, 212, 255, 0.1),
595
+ 0 0 30px rgba(0, 212, 255, 0.3);
596
+ transform: translateY(-2px);
597
+ }
598
+
599
+ .form-group input::placeholder {
600
+ color: rgba(255, 255, 255, 0.3);
601
+ }
602
+
603
+ .add-btn {
604
+ width: 100%;
605
+ padding: 1.3rem;
606
+ background: linear-gradient(135deg, #00D4FF 0%, #FF0080 50%, #00FF88 100%);
607
+ background-size: 200% 100%;
608
+ border: none;
609
+ border-radius: 15px;
610
+ color: #fff;
611
+ font-size: 1.1rem;
612
+ font-weight: 700;
613
+ cursor: pointer;
614
+ transition: all 0.4s ease;
615
+ text-transform: uppercase;
616
+ letter-spacing: 2px;
617
+ font-family: 'Orbitron', sans-serif;
618
+ position: relative;
619
+ overflow: hidden;
620
+ box-shadow: 0 10px 30px rgba(0, 212, 255, 0.4);
621
+ }
622
+
623
+ .add-btn::before {
624
+ content: '';
625
+ position: absolute;
626
+ top: 0;
627
+ left: -100%;
628
+ width: 100%;
629
+ height: 100%;
630
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
631
+ transition: left 0.5s;
632
+ }
633
+
634
+ .add-btn:hover::before {
635
+ left: 100%;
636
+ }
637
+
638
+ .add-btn:hover {
639
+ transform: translateY(-3px);
640
+ box-shadow:
641
+ 0 15px 40px rgba(0, 212, 255, 0.6),
642
+ 0 0 60px rgba(255, 0, 128, 0.4);
643
+ background-position: 100% 0;
644
+ }
645
+
646
+ .add-btn:active {
647
+ transform: translateY(-1px);
648
+ }
649
+
650
+ /* Empty State */
651
+ .empty-state {
652
+ text-align: center;
653
+ padding: 6rem 2rem;
654
+ background: rgba(255, 255, 255, 0.03);
655
+ backdrop-filter: blur(20px);
656
+ border-radius: 30px;
657
+ border: 2px dashed rgba(255, 255, 255, 0.2);
658
+ }
659
+
660
+ .empty-state-icon {
661
+ font-size: 5rem;
662
+ margin-bottom: 2rem;
663
+ animation: float-icon 3s ease-in-out infinite;
664
+ }
665
+
666
+ @keyframes float-icon {
667
+ 0%, 100% { transform: translateY(0px); }
668
+ 50% { transform: translateY(-20px); }
669
+ }
670
+
671
+ .empty-state p {
672
+ font-size: 1.3rem;
673
+ color: rgba(255, 255, 255, 0.5);
674
+ line-height: 1.8;
675
+ }
676
+
677
+ /* Responsive */
678
+ @media (max-width: 768px) {
679
+ h1 { font-size: 2.5rem; }
680
+ .exams-grid { grid-template-columns: 1fr; }
681
+ .countdown-wrapper { grid-template-columns: repeat(2, 1fr); }
682
+ .countdown-number { font-size: 2rem; }
683
+ .header { padding: 1.5rem; }
684
+ }
685
+
686
+ /* Color Input */
687
+ input[type="color"] {
688
+ width: 100%;
689
+ height: 60px;
690
+ border: none;
691
+ border-radius: 15px;
692
+ cursor: pointer;
693
+ }
694
  </style>
695
  </head>
696
  <body>
697
+ <div class="animated-bg"></div>
698
  <div class="particles" id="particles"></div>
699
+
700
  <div class="container">
701
+ <div class="header">
702
+ <h1>โœจ Exam Countdown</h1>
703
+ <div class="settings-btn" id="openModalBtn">
704
+ <svg viewBox="0 0 24 24">
705
+ <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
706
+ </svg>
707
+ </div>
708
+ </div>
709
+
710
  <div class="exams-grid" id="examsGrid"></div>
711
+
712
+ <div class="empty-state" id="emptyState" style="display: none;">
713
+ <div class="empty-state-icon">๐Ÿ“š</div>
714
+ <p>No exams scheduled yet.<br>Click the โœจ button to add your first exam!</p>
715
+ </div>
716
  </div>
717
+
718
  <div class="modal" id="modal">
719
  <div class="modal-content">
720
+ <div class="modal-header">
721
+ <h2 class="modal-title">Add New Exam</h2>
722
+ <button class="close-btn" id="closeModalBtn">
723
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="#fff">
724
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
725
+ </svg>
726
+ </button>
727
+ </div>
728
  <form id="addExamForm">
729
+ <div class="form-group">
730
+ <label for="examName">๐Ÿ“ Exam Name</label>
731
+ <input type="text" id="examName" required placeholder="e.g., Physics Final">
732
+ </div>
733
+ <div class="form-group">
734
+ <label for="examDate">๐Ÿ“… Exam Date</label>
735
+ <input type="datetime-local" id="examDate" required>
736
+ </div>
737
  <button type="submit" class="add-btn">Add Exam</button>
738
  </form>
739
  </div>
740
  </div>
741
 
742
+ <script>
743
+ // Create particles
744
+ const particlesContainer = document.getElementById('particles');
745
+ for (let i = 0; i < 50; i++) {
746
+ const particle = document.createElement('div');
747
+ particle.className = 'particle';
748
+ particle.style.width = Math.random() * 6 + 2 + 'px';
749
+ particle.style.height = particle.style.width;
750
+ particle.style.left = Math.random() * 100 + '%';
751
+ particle.style.animationDuration = Math.random() * 15 + 10 + 's';
752
+ particle.style.animationDelay = Math.random() * 5 + 's';
753
+ particlesContainer.appendChild(particle);
754
+ }
755
+
756
+ // Exam icons
757
+ const examIcons = ['๐Ÿ“š', '๐Ÿ“–', 'โœ๏ธ', '๐Ÿ“', '๐ŸŽ“', '๐Ÿ“Š', '๐Ÿงฎ', '๐Ÿ”ฌ', '๐Ÿ’ป', '๐ŸŽจ'];
758
+
759
+ // Modal functionality
760
+ const modal = document.getElementById('modal');
761
+ const openModalBtn = document.getElementById('openModalBtn');
762
+ const closeModalBtn = document.getElementById('closeModalBtn');
763
+ const addExamForm = document.getElementById('addExamForm');
764
+ const examsGrid = document.getElementById('examsGrid');
765
+ const emptyState = document.getElementById('emptyState');
766
+
767
+ openModalBtn.addEventListener('click', () => modal.classList.add('active'));
768
+ closeModalBtn.addEventListener('click', () => modal.classList.remove('active'));
769
+ modal.addEventListener('click', (e) => {
770
+ if (e.target === modal) modal.classList.remove('active');
771
+ });
772
+
773
+ // Load exams from localStorage
774
+ let exams = JSON.parse(localStorage.getItem('exams')) || [];
775
+
776
+ // Add exam
777
+ addExamForm.addEventListener('submit', (e) => {
778
+ e.preventDefault();
779
+ const name = document.getElementById('examName').value;
780
+ const date = document.getElementById('examDate').value;
781
+ const icon = examIcons[Math.floor(Math.random() * examIcons.length)];
782
+
783
+ const exam = {
784
+ id: Date.now(),
785
+ name,
786
+ date: new Date(date).getTime(),
787
+ icon,
788
+ createdAt: Date.now()
789
+ };
790
+
791
+ exams.push(exam);
792
+ localStorage.setItem('exams', JSON.stringify(exams));
793
+
794
+ addExamForm.reset();
795
+ modal.classList.remove('active');
796
+ renderExams();
797
+ });
798
+
799
+ // Delete exam
800
+ function deleteExam(id) {
801
+ exams = exams.filter(exam => exam.id !== id);
802
+ localStorage.setItem('exams', JSON.stringify(exams));
803
+ renderExams();
804
+ }
805
+
806
+ // Calculate countdown
807
+ function getCountdown(targetDate) {
808
+ const now = new Date().getTime();
809
+ const distance = targetDate - now;
810
+
811
+ if (distance < 0) {
812
+ return { days: 0, hours: 0, minutes: 0, seconds: 0, isPast: true };
813
+ }
814
+
815
+ return {
816
+ days: Math.floor(distance / (1000 * 60 * 60 * 24)),
817
+ hours: Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),
818
+ minutes: Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)),
819
+ seconds: Math.floor((distance % (1000 * 60)) / 1000),
820
+ isPast: false
821
+ };
822
+ }
823
+
824
+ // Calculate progress
825
+ function getProgress(createdAt, targetDate) {
826
+ const now = new Date().getTime();
827
+ const total = targetDate - createdAt;
828
+ const elapsed = now - createdAt;
829
+ return Math.min(100, Math.max(0, (elapsed / total) * 100));
830
+ }
831
+
832
+ // Render exams
833
+ function renderExams() {
834
+ if (exams.length === 0) {
835
+ examsGrid.innerHTML = '';
836
+ emptyState.style.display = 'block';
837
+ return;
838
+ }
839
+
840
+ emptyState.style.display = 'none';
841
+ examsGrid.innerHTML = exams.map(exam => {
842
+ const countdown = getCountdown(exam.date);
843
+ const progress = getProgress(exam.createdAt, exam.date);
844
+ const isUrgent = countdown.days < 7 && !countdown.isPast;
845
+ const examDate = new Date(exam.date);
846
+
847
+ return `
848
+ <div class="exam-card ${isUrgent ? 'urgent' : ''}" data-id="${exam.id}">
849
+ <div class="exam-card-inner">
850
+ <div class="delete-btn" onclick="deleteExam(${exam.id})">
851
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="#fff">
852
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
853
+ </svg>
854
+ </div>
855
+ <div class="exam-icon">${exam.icon}</div>
856
+ <div class="exam-name">${exam.name}</div>
857
+ <div class="countdown-wrapper">
858
+ <div class="countdown-item">
859
+ <div class="countdown-number">${countdown.days}</div>
860
+ <div class="countdown-label">Days</div>
861
+ </div>
862
+ <div class="countdown-item">
863
+ <div class="countdown-number">${countdown.hours}</div>
864
+ <div class="countdown-label">Hours</div>
865
+ </div>
866
+ <div class="countdown-item">
867
+ <div class="countdown-number">${countdown.minutes}</div>
868
+ <div class="countdown-label">Minutes</div>
869
+ </div>
870
+ <div class="countdown-item">
871
+ <div class="countdown-number">${countdown.seconds}</div>
872
+ <div class="countdown-label">Seconds</div>
873
+ </div>
874
+ </div>
875
+ <div class="progress-container">
876
+ <div class="progress-bar" style="width: ${progress}%"></div>
877
+ </div>
878
+ <div class="exam-date">
879
+ ๐Ÿ“… ${examDate.toLocaleDateString('en-US', {
880
+ weekday: 'long',
881
+ year: 'numeric',
882
+ month: 'long',
883
+ day: 'numeric',
884
+ hour: '2-digit',
885
+ minute: '2-digit'
886
+ })}
887
+ </div>
888
+ </div>
889
+ </div>
890
+ `;
891
+ }).join('');
892
+ }
893
+
894
+ // Update countdowns every second
895
+ setInterval(renderExams, 1000);
896
+
897
+ // Initial render
898
+ renderExams();
899
+ </script>
900
+ </body>
901
+ </html>
902
+
903
  <script type="module">
904
  // Firebase SDK modules
905
  import { initializeApp } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js";