SolarumAsteridion commited on
Commit
f9e7215
·
verified ·
1 Parent(s): 7c6653c

Update index.html

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