akhaliq HF Staff commited on
Commit
b95e150
·
verified ·
1 Parent(s): a8dfb5a

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +1314 -19
index.html CHANGED
@@ -1,19 +1,1314 @@
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
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>TaskFlow - Modern Todo App</title>
8
+
9
+ <!-- Font Awesome for icons -->
10
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
11
+
12
+ <style>
13
+ :root {
14
+ --primary: #6366f1;
15
+ --primary-dark: #4f46e5;
16
+ --secondary: #8b5cf6;
17
+ --success: #10b981;
18
+ --warning: #f59e0b;
19
+ --danger: #ef4444;
20
+ --dark: #1f2937;
21
+ --light: #f3f4f6;
22
+ --white: #ffffff;
23
+ --gray: #6b7280;
24
+ --gray-light: #e5e7eb;
25
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
26
+ --shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
27
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
28
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1);
29
+ --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
30
+ }
31
+
32
+ [data-theme="dark"] {
33
+ --bg-primary: #0f172a;
34
+ --bg-secondary: #1e293b;
35
+ --bg-tertiary: #334155;
36
+ --text-primary: #f1f5f9;
37
+ --text-secondary: #cbd5e1;
38
+ --text-tertiary: #94a3b8;
39
+ --border: #334155;
40
+ --card-bg: #1e293b;
41
+ --hover-bg: #334155;
42
+ }
43
+
44
+ [data-theme="light"] {
45
+ --bg-primary: #ffffff;
46
+ --bg-secondary: #f9fafb;
47
+ --bg-tertiary: #f3f4f6;
48
+ --text-primary: #111827;
49
+ --text-secondary: #374151;
50
+ --text-tertiary: #6b7280;
51
+ --border: #e5e7eb;
52
+ --card-bg: #ffffff;
53
+ --hover-bg: #f9fafb;
54
+ }
55
+
56
+ * {
57
+ margin: 0;
58
+ padding: 0;
59
+ box-sizing: border-box;
60
+ }
61
+
62
+ body {
63
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
64
+ background: var(--bg-primary);
65
+ color: var(--text-primary);
66
+ min-height: 100vh;
67
+ transition: var(--transition);
68
+ position: relative;
69
+ overflow-x: hidden;
70
+ }
71
+
72
+ body::before {
73
+ content: '';
74
+ position: fixed;
75
+ top: 0;
76
+ left: 0;
77
+ right: 0;
78
+ height: 300px;
79
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
80
+ opacity: 0.1;
81
+ z-index: -1;
82
+ }
83
+
84
+ .container {
85
+ max-width: 1200px;
86
+ margin: 0 auto;
87
+ padding: 2rem 1rem;
88
+ }
89
+
90
+ header {
91
+ display: flex;
92
+ justify-content: space-between;
93
+ align-items: center;
94
+ margin-bottom: 2rem;
95
+ padding: 1.5rem;
96
+ background: var(--card-bg);
97
+ border-radius: 16px;
98
+ box-shadow: var(--shadow);
99
+ backdrop-filter: blur(10px);
100
+ animation: slideDown 0.5s ease;
101
+ }
102
+
103
+ .logo {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 1rem;
107
+ font-size: 1.5rem;
108
+ font-weight: 700;
109
+ color: var(--primary);
110
+ }
111
+
112
+ .logo i {
113
+ font-size: 2rem;
114
+ animation: pulse 2s infinite;
115
+ }
116
+
117
+ .header-actions {
118
+ display: flex;
119
+ gap: 1rem;
120
+ align-items: center;
121
+ }
122
+
123
+ .theme-toggle {
124
+ background: var(--bg-tertiary);
125
+ border: none;
126
+ border-radius: 50%;
127
+ width: 40px;
128
+ height: 40px;
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ cursor: pointer;
133
+ transition: var(--transition);
134
+ color: var(--text-primary);
135
+ }
136
+
137
+ .theme-toggle:hover {
138
+ transform: scale(1.1);
139
+ background: var(--hover-bg);
140
+ }
141
+
142
+ .stats-container {
143
+ display: grid;
144
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
145
+ gap: 1rem;
146
+ margin-bottom: 2rem;
147
+ }
148
+
149
+ .stat-card {
150
+ background: var(--card-bg);
151
+ padding: 1.5rem;
152
+ border-radius: 12px;
153
+ box-shadow: var(--shadow);
154
+ display: flex;
155
+ align-items: center;
156
+ gap: 1rem;
157
+ transition: var(--transition);
158
+ animation: fadeIn 0.5s ease;
159
+ }
160
+
161
+ .stat-card:hover {
162
+ transform: translateY(-2px);
163
+ box-shadow: var(--shadow-lg);
164
+ }
165
+
166
+ .stat-icon {
167
+ width: 48px;
168
+ height: 48px;
169
+ border-radius: 12px;
170
+ display: flex;
171
+ align-items: center;
172
+ justify-content: center;
173
+ font-size: 1.5rem;
174
+ }
175
+
176
+ .stat-icon.total {
177
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
178
+ color: white;
179
+ }
180
+
181
+ .stat-icon.completed {
182
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
183
+ color: white;
184
+ }
185
+
186
+ .stat-icon.pending {
187
+ background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
188
+ color: white;
189
+ }
190
+
191
+ .stat-icon.overdue {
192
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
193
+ color: white;
194
+ }
195
+
196
+ .stat-info h3 {
197
+ font-size: 1.5rem;
198
+ font-weight: 700;
199
+ }
200
+
201
+ .stat-info p {
202
+ color: var(--text-tertiary);
203
+ font-size: 0.875rem;
204
+ }
205
+
206
+ .main-content {
207
+ display: grid;
208
+ grid-template-columns: 1fr 2fr;
209
+ gap: 2rem;
210
+ animation: slideUp 0.5s ease;
211
+ }
212
+
213
+ .sidebar {
214
+ background: var(--card-bg);
215
+ padding: 1.5rem;
216
+ border-radius: 16px;
217
+ box-shadow: var(--shadow);
218
+ height: fit-content;
219
+ position: sticky;
220
+ top: 2rem;
221
+ }
222
+
223
+ .add-todo-form {
224
+ margin-bottom: 2rem;
225
+ }
226
+
227
+ .form-group {
228
+ margin-bottom: 1rem;
229
+ }
230
+
231
+ .form-group label {
232
+ display: block;
233
+ margin-bottom: 0.5rem;
234
+ color: var(--text-secondary);
235
+ font-size: 0.875rem;
236
+ font-weight: 500;
237
+ }
238
+
239
+ .form-control {
240
+ width: 100%;
241
+ padding: 0.75rem;
242
+ border: 1px solid var(--border);
243
+ border-radius: 8px;
244
+ background: var(--bg-secondary);
245
+ color: var(--text-primary);
246
+ transition: var(--transition);
247
+ font-size: 0.875rem;
248
+ }
249
+
250
+ .form-control:focus {
251
+ outline: none;
252
+ border-color: var(--primary);
253
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);
254
+ }
255
+
256
+ .priority-select,
257
+ .category-select {
258
+ display: grid;
259
+ grid-template-columns: repeat(3, 1fr);
260
+ gap: 0.5rem;
261
+ }
262
+
263
+ .priority-btn,
264
+ .category-btn {
265
+ padding: 0.5rem;
266
+ border: 1px solid var(--border);
267
+ background: var(--bg-secondary);
268
+ color: var(--text-secondary);
269
+ border-radius: 6px;
270
+ cursor: pointer;
271
+ transition: var(--transition);
272
+ font-size: 0.75rem;
273
+ text-align: center;
274
+ }
275
+
276
+ .priority-btn.active,
277
+ .category-btn.active {
278
+ background: var(--primary);
279
+ color: white;
280
+ border-color: var(--primary);
281
+ }
282
+
283
+ .priority-btn:hover,
284
+ .category-btn:hover {
285
+ transform: translateY(-1px);
286
+ box-shadow: var(--shadow-sm);
287
+ }
288
+
289
+ .btn {
290
+ padding: 0.75rem 1.5rem;
291
+ border: none;
292
+ border-radius: 8px;
293
+ font-weight: 500;
294
+ cursor: pointer;
295
+ transition: var(--transition);
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: 0.5rem;
299
+ font-size: 0.875rem;
300
+ }
301
+
302
+ .btn-primary {
303
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
304
+ color: white;
305
+ width: 100%;
306
+ justify-content: center;
307
+ }
308
+
309
+ .btn-primary:hover {
310
+ transform: translateY(-2px);
311
+ box-shadow: var(--shadow-lg);
312
+ }
313
+
314
+ .filter-section {
315
+ margin-top: 2rem;
316
+ padding-top: 2rem;
317
+ border-top: 1px solid var(--border);
318
+ }
319
+
320
+ .filter-title {
321
+ font-size: 0.875rem;
322
+ font-weight: 600;
323
+ color: var(--text-secondary);
324
+ margin-bottom: 1rem;
325
+ text-transform: uppercase;
326
+ letter-spacing: 0.05em;
327
+ }
328
+
329
+ .filter-tabs {
330
+ display: flex;
331
+ flex-direction: column;
332
+ gap: 0.5rem;
333
+ }
334
+
335
+ .filter-tab {
336
+ padding: 0.75rem;
337
+ background: var(--bg-secondary);
338
+ border: 1px solid transparent;
339
+ border-radius: 8px;
340
+ cursor: pointer;
341
+ transition: var(--transition);
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 0.75rem;
345
+ color: var(--text-secondary);
346
+ }
347
+
348
+ .filter-tab:hover {
349
+ background: var(--hover-bg);
350
+ transform: translateX(4px);
351
+ }
352
+
353
+ .filter-tab.active {
354
+ background: var(--primary);
355
+ color: white;
356
+ border-color: var(--primary);
357
+ }
358
+
359
+ .filter-tab i {
360
+ width: 20px;
361
+ text-align: center;
362
+ }
363
+
364
+ .filter-tab .badge {
365
+ margin-left: auto;
366
+ background: rgba(255, 255, 255, 0.2);
367
+ padding: 0.125rem 0.5rem;
368
+ border-radius: 12px;
369
+ font-size: 0.75rem;
370
+ font-weight: 600;
371
+ }
372
+
373
+ .todo-container {
374
+ background: var(--card-bg);
375
+ padding: 1.5rem;
376
+ border-radius: 16px;
377
+ box-shadow: var(--shadow);
378
+ }
379
+
380
+ .todo-header {
381
+ display: flex;
382
+ justify-content: space-between;
383
+ align-items: center;
384
+ margin-bottom: 1.5rem;
385
+ }
386
+
387
+ .search-box {
388
+ position: relative;
389
+ flex: 1;
390
+ max-width: 400px;
391
+ }
392
+
393
+ .search-box input {
394
+ width: 100%;
395
+ padding: 0.75rem 1rem 0.75rem 2.5rem;
396
+ border: 1px solid var(--border);
397
+ border-radius: 8px;
398
+ background: var(--bg-secondary);
399
+ color: var(--text-primary);
400
+ transition: var(--transition);
401
+ }
402
+
403
+ .search-box i {
404
+ position: absolute;
405
+ left: 0.75rem;
406
+ top: 50%;
407
+ transform: translateY(-50%);
408
+ color: var(--text-tertiary);
409
+ }
410
+
411
+ .sort-dropdown {
412
+ position: relative;
413
+ }
414
+
415
+ .sort-btn {
416
+ padding: 0.75rem 1rem;
417
+ background: var(--bg-secondary);
418
+ border: 1px solid var(--border);
419
+ border-radius: 8px;
420
+ color: var(--text-primary);
421
+ cursor: pointer;
422
+ transition: var(--transition);
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 0.5rem;
426
+ }
427
+
428
+ .sort-btn:hover {
429
+ background: var(--hover-bg);
430
+ }
431
+
432
+ .todo-list {
433
+ min-height: 400px;
434
+ }
435
+
436
+ .todo-item {
437
+ background: var(--bg-secondary);
438
+ border: 1px solid var(--border);
439
+ border-radius: 12px;
440
+ padding: 1rem;
441
+ margin-bottom: 0.75rem;
442
+ transition: var(--transition);
443
+ cursor: move;
444
+ animation: slideIn 0.3s ease;
445
+ }
446
+
447
+ .todo-item:hover {
448
+ transform: translateX(4px);
449
+ box-shadow: var(--shadow);
450
+ }
451
+
452
+ .todo-item.dragging {
453
+ opacity: 0.5;
454
+ transform: scale(0.95);
455
+ }
456
+
457
+ .todo-item.completed {
458
+ opacity: 0.7;
459
+ }
460
+
461
+ .todo-item.completed .todo-text {
462
+ text-decoration: line-through;
463
+ color: var(--text-tertiary);
464
+ }
465
+
466
+ .todo-content {
467
+ display: flex;
468
+ align-items: flex-start;
469
+ gap: 1rem;
470
+ }
471
+
472
+ .todo-checkbox {
473
+ width: 20px;
474
+ height: 20px;
475
+ border-radius: 50%;
476
+ border: 2px solid var(--border);
477
+ background: var(--bg-tertiary);
478
+ cursor: pointer;
479
+ transition: var(--transition);
480
+ display: flex;
481
+ align-items: center;
482
+ justify-content: center;
483
+ flex-shrink: 0;
484
+ margin-top: 2px;
485
+ }
486
+
487
+ .todo-checkbox:hover {
488
+ border-color: var(--primary);
489
+ }
490
+
491
+ .todo-checkbox.checked {
492
+ background: var(--success);
493
+ border-color: var(--success);
494
+ }
495
+
496
+ .todo-checkbox.checked i {
497
+ color: white;
498
+ font-size: 0.75rem;
499
+ }
500
+
501
+ .todo-details {
502
+ flex: 1;
503
+ }
504
+
505
+ .todo-header-row {
506
+ display: flex;
507
+ align-items: center;
508
+ gap: 0.5rem;
509
+ margin-bottom: 0.5rem;
510
+ }
511
+
512
+ .todo-text {
513
+ font-size: 1rem;
514
+ color: var(--text-primary);
515
+ flex: 1;
516
+ }
517
+
518
+ .todo-priority {
519
+ padding: 0.125rem 0.5rem;
520
+ border-radius: 4px;
521
+ font-size: 0.75rem;
522
+ font-weight: 600;
523
+ text-transform: uppercase;
524
+ }
525
+
526
+ .priority-high {
527
+ background: rgba(239, 68, 68, 0.1);
528
+ color: var(--danger);
529
+ }
530
+
531
+ .priority-medium {
532
+ background: rgba(245, 158, 11, 0.1);
533
+ color: var(--warning);
534
+ }
535
+
536
+ .priority-low {
537
+ background: rgba(16, 185, 129, 0.1);
538
+ color: var(--success);
539
+ }
540
+
541
+ .todo-meta {
542
+ display: flex;
543
+ align-items: center;
544
+ gap: 1rem;
545
+ font-size: 0.875rem;
546
+ color: var(--text-tertiary);
547
+ }
548
+
549
+ .todo-category {
550
+ display: inline-flex;
551
+ align-items: center;
552
+ gap: 0.25rem;
553
+ }
554
+
555
+ .todo-date {
556
+ display: inline-flex;
557
+ align-items: center;
558
+ gap: 0.25rem;
559
+ }
560
+
561
+ .todo-actions {
562
+ display: flex;
563
+ gap: 0.5rem;
564
+ }
565
+
566
+ .action-btn {
567
+ width: 32px;
568
+ height: 32px;
569
+ border-radius: 6px;
570
+ background: transparent;
571
+ border: none;
572
+ color: var(--text-tertiary);
573
+ cursor: pointer;
574
+ transition: var(--transition);
575
+ display: flex;
576
+ align-items: center;
577
+ justify-content: center;
578
+ }
579
+
580
+ .action-btn:hover {
581
+ background: var(--hover-bg);
582
+ color: var(--text-primary);
583
+ }
584
+
585
+ .action-btn.delete:hover {
586
+ background: rgba(239, 68, 68, 0.1);
587
+ color: var(--danger);
588
+ }
589
+
590
+ .empty-state {
591
+ text-align: center;
592
+ padding: 3rem;
593
+ color: var(--text-tertiary);
594
+ }
595
+
596
+ .empty-state i {
597
+ font-size: 4rem;
598
+ margin-bottom: 1rem;
599
+ opacity: 0.5;
600
+ }
601
+
602
+ .toast {
603
+ position: fixed;
604
+ bottom: 2rem;
605
+ right: 2rem;
606
+ background: var(--card-bg);
607
+ padding: 1rem 1.5rem;
608
+ border-radius: 8px;
609
+ box-shadow: var(--shadow-xl);
610
+ display: flex;
611
+ align-items: center;
612
+ gap: 1rem;
613
+ transform: translateX(400px);
614
+ transition: transform 0.3s ease;
615
+ z-index: 1000;
616
+ }
617
+
618
+ .toast.show {
619
+ transform: translateX(0);
620
+ }
621
+
622
+ .toast.success {
623
+ border-left: 4px solid var(--success);
624
+ }
625
+
626
+ .toast.error {
627
+ border-left: 4px solid var(--danger);
628
+ }
629
+
630
+ .toast.info {
631
+ border-left: 4px solid var(--primary);
632
+ }
633
+
634
+ @keyframes slideDown {
635
+ from {
636
+ opacity: 0;
637
+ transform: translateY(-20px);
638
+ }
639
+
640
+ to {
641
+ opacity: 1;
642
+ transform: translateY(0);
643
+ }
644
+ }
645
+
646
+ @keyframes slideUp {
647
+ from {
648
+ opacity: 0;
649
+ transform: translateY(20px);
650
+ }
651
+
652
+ to {
653
+ opacity: 1;
654
+ transform: translateY(0);
655
+ }
656
+ }
657
+
658
+ @keyframes slideIn {
659
+ from {
660
+ opacity: 0;
661
+ transform: translateX(-20px);
662
+ }
663
+
664
+ to {
665
+ opacity: 1;
666
+ transform: translateX(0);
667
+ }
668
+ }
669
+
670
+ @keyframes fadeIn {
671
+ from {
672
+ opacity: 0;
673
+ }
674
+
675
+ to {
676
+ opacity: 1;
677
+ }
678
+ }
679
+
680
+ @keyframes pulse {
681
+
682
+ 0%,
683
+ 100% {
684
+ transform: scale(1);
685
+ }
686
+
687
+ 50% {
688
+ transform: scale(1.05);
689
+ }
690
+ }
691
+
692
+ @media (max-width: 768px) {
693
+ .main-content {
694
+ grid-template-columns: 1fr;
695
+ }
696
+
697
+ .sidebar {
698
+ position: static;
699
+ }
700
+
701
+ .stats-container {
702
+ grid-template-columns: repeat(2, 1fr);
703
+ }
704
+
705
+ header {
706
+ flex-direction: column;
707
+ gap: 1rem;
708
+ }
709
+
710
+ .todo-header {
711
+ flex-direction: column;
712
+ gap: 1rem;
713
+ }
714
+
715
+ .search-box {
716
+ max-width: 100%;
717
+ }
718
+ }
719
+
720
+ @media (max-width: 480px) {
721
+ .stats-container {
722
+ grid-template-columns: 1fr;
723
+ }
724
+
725
+ .container {
726
+ padding: 1rem;
727
+ }
728
+
729
+ .todo-item {
730
+ padding: 0.75rem;
731
+ }
732
+
733
+ .todo-meta {
734
+ flex-direction: column;
735
+ align-items: flex-start;
736
+ gap: 0.5rem;
737
+ }
738
+ }
739
+
740
+ .built-with {
741
+ position: fixed;
742
+ bottom: 1rem;
743
+ left: 1rem;
744
+ font-size: 0.75rem;
745
+ color: var(--text-tertiary);
746
+ opacity: 0.7;
747
+ transition: opacity 0.3s;
748
+ }
749
+
750
+ .built-with:hover {
751
+ opacity: 1;
752
+ }
753
+
754
+ .built-with a {
755
+ color: var(--primary);
756
+ text-decoration: none;
757
+ font-weight: 500;
758
+ }
759
+ </style>
760
+ </head>
761
+
762
+ <body data-theme="light">
763
+ <div class="container">
764
+ <header>
765
+ <div class="logo">
766
+ <i class="fas fa-tasks"></i>
767
+ <span>TaskFlow</span>
768
+ </div>
769
+ <div class="header-actions">
770
+ <button class="theme-toggle" onclick="toggleTheme()">
771
+ <i class="fas fa-moon" id="themeIcon"></i>
772
+ </button>
773
+ </div>
774
+ </header>
775
+
776
+ <div class="stats-container">
777
+ <div class="stat-card">
778
+ <div class="stat-icon total">
779
+ <i class="fas fa-list"></i>
780
+ </div>
781
+ <div class="stat-info">
782
+ <h3 id="totalTasks">0</h3>
783
+ <p>Total Tasks</p>
784
+ </div>
785
+ </div>
786
+ <div class="stat-card">
787
+ <div class="stat-icon completed">
788
+ <i class="fas fa-check-circle"></i>
789
+ </div>
790
+ <div class="stat-info">
791
+ <h3 id="completedTasks">0</h3>
792
+ <p>Completed</p>
793
+ </div>
794
+ </div>
795
+ <div class="stat-card">
796
+ <div class="stat-icon pending">
797
+ <i class="fas fa-clock"></i>
798
+ </div>
799
+ <div class="stat-info">
800
+ <h3 id="pendingTasks">0</h3>
801
+ <p>Pending</p>
802
+ </div>
803
+ </div>
804
+ <div class="stat-card">
805
+ <div class="stat-icon overdue">
806
+ <i class="fas fa-exclamation-triangle"></i>
807
+ </div>
808
+ <div class="stat-info">
809
+ <h3 id="overdueTasks">0</h3>
810
+ <p>Overdue</p>
811
+ </div>
812
+ </div>
813
+ </div>
814
+
815
+ <div class="main-content">
816
+ <aside class="sidebar">
817
+ <form class="add-todo-form" id="todoForm">
818
+ <div class="form-group">
819
+ <label for="todoInput">Task Description</label>
820
+ <input type="text" id="todoInput" class="form-control" placeholder="What needs to be done?" required>
821
+ </div>
822
+
823
+ <div class="form-group">
824
+ <label>Priority</label>
825
+ <div class="priority-select">
826
+ <button type="button" class="priority-btn" data-priority="low" onclick="selectPriority('low')">
827
+ <i class="fas fa-flag"></i> Low
828
+ </button>
829
+ <button type="button" class="priority-btn active" data-priority="medium" onclick="selectPriority('medium')">
830
+ <i class="fas fa-flag"></i> Medium
831
+ </button>
832
+ <button type="button" class="priority-btn" data-priority="high" onclick="selectPriority('high')">
833
+ <i class="fas fa-flag"></i> High
834
+ </button>
835
+ </div>
836
+ </div>
837
+
838
+ <div class="form-group">
839
+ <label>Category</label>
840
+ <div class="category-select">
841
+ <button type="button" class="category-btn active" data-category="personal" onclick="selectCategory('personal')">
842
+ <i class="fas fa-user"></i> Personal
843
+ </button>
844
+ <button type="button" class="category-btn" data-category="work" onclick="selectCategory('work')">
845
+ <i class="fas fa-briefcase"></i> Work
846
+ </button>
847
+ <button type="button" class="category-btn" data-category="shopping" onclick="selectCategory('shopping')">
848
+ <i class="fas fa-shopping-cart"></i> Shopping
849
+ </button>
850
+ <button type="button" class="category-btn" data-category="health" onclick="selectCategory('health')">
851
+ <i class="fas fa-heartbeat"></i> Health
852
+ </button>
853
+ <button type="button" class="category-btn" data-category="education" onclick="selectCategory('education')">
854
+ <i class="fas fa-graduation-cap"></i> Education
855
+ </button>
856
+ <button type="button" class="category-btn" data-category="other" onclick="selectCategory('other')">
857
+ <i class="fas fa-ellipsis-h"></i> Other
858
+ </button>
859
+ </div>
860
+ </div>
861
+
862
+ <div class="form-group">
863
+ <label for="dueDate">Due Date</label>
864
+ <input type="date" id="dueDate" class="form-control">
865
+ </div>
866
+
867
+ <button type="submit" class="btn btn-primary">
868
+ <i class="fas fa-plus"></i> Add Task
869
+ </button>
870
+ </form>
871
+
872
+ <div class="filter-section">
873
+ <div class="filter-title">Filter Tasks</div>
874
+ <div class="filter-tabs">
875
+ <div class="filter-tab active" onclick="filterTodos('all')" data-filter="all">
876
+ <i class="fas fa-list"></i>
877
+ <span>All Tasks</span>
878
+ <span class="badge" id="allCount">0</span>
879
+ </div>
880
+ <div class="filter-tab" onclick="filterTodos('pending')" data-filter="pending">
881
+ <i class="fas fa-clock"></i>
882
+ <span>Pending</span>
883
+ <span class="badge" id="pendingCount">0</span>
884
+ </div>
885
+ <div class="filter-tab" onclick="filterTodos('completed')" data-filter="completed">
886
+ <i class="fas fa-check"></i>
887
+ <span>Completed</span>
888
+ <span class="badge" id="completedCount">0</span>
889
+ </div>
890
+ <div class="filter-tab" onclick="filterTodos('today')" data-filter="today">
891
+ <i class="fas fa-calendar-day"></i>
892
+ <span>Today</span>
893
+ <span class="badge" id="todayCount">0</span>
894
+ </div>
895
+ <div class="filter-tab" onclick="filterTodos('overdue')" data-filter="overdue">
896
+ <i class="fas fa-exclamation"></i>
897
+ <span>Overdue</span>
898
+ <span class="badge" id="overdueCount">0</span>
899
+ </div>
900
+ </div>
901
+ </div>
902
+ </aside>
903
+
904
+ <main class="todo-container">
905
+ <div class="todo-header">
906
+ <div class="search-box">
907
+ <i class="fas fa-search"></i>
908
+ <input type="text" placeholder="Search tasks..." id="searchInput" onkeyup="searchTodos()">
909
+ </div>
910
+ <div class="sort-dropdown">
911
+ <button class="sort-btn" onclick="toggleSortMenu()">
912
+ <i class="fas fa-sort"></i>
913
+ <span id="sortText">Sort by Date</span>
914
+ </button>
915
+ </div>
916
+ </div>
917
+
918
+ <div class="todo-list" id="todoList">
919
+ <div class="empty-state">
920
+ <i class="fas fa-clipboard-list"></i>
921
+ <h3>No tasks yet</h3>
922
+ <p>Add your first task to get started!</p>
923
+ </div>
924
+ </div>
925
+ </main>
926
+ </div>
927
+ </div>
928
+
929
+ <div class="toast" id="toast">
930
+ <i class="fas fa-check-circle" id="toastIcon"></i>
931
+ <span id="toastMessage">Task added successfully!</span>
932
+ </div>
933
+
934
+ <div class="built-with">
935
+ Built with <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">anycoder</a>
936
+ </div>
937
+
938
+ <script>
939
+ let todos = [];
940
+ let currentFilter = 'all';
941
+ let currentSort = 'date';
942
+ let selectedPriority = 'medium';
943
+ let selectedCategory = 'personal';
944
+ let draggedItem = null;
945
+
946
+ // Initialize app
947
+ document.addEventListener('DOMContentLoaded', function() {
948
+ loadTodos();
949
+ updateStats();
950
+ renderTodos();
951
+
952
+ // Set today's date as default
953
+ const today = new Date().toISOString().split('T')[0];
954
+ document.getElementById('dueDate').value = today;
955
+ });
956
+
957
+ // Form submission
958
+ document.getElementById('todoForm').addEventListener('submit', function(e) {
959
+ e.preventDefault();
960
+ addTodo();
961
+ });
962
+
963
+ function addTodo() {
964
+ const text = document.getElementById('todoInput').value.trim();
965
+ const dueDate = document.getElementById('dueDate').value;
966
+
967
+ if (!text) return;
968
+
969
+ const todo = {
970
+ id: Date.now(),
971
+ text: text,
972
+ priority: selectedPriority,
973
+ category: selectedCategory,
974
+ dueDate: dueDate,
975
+ completed: false,
976
+ createdAt: new Date().toISOString()
977
+ };
978
+
979
+ todos.unshift(todo);
980
+ saveTodos();
981
+ renderTodos();
982
+ updateStats();
983
+
984
+ // Reset form
985
+ document.getElementById('todoInput').value = '';
986
+ document.getElementById('todoForm').reset();
987
+ const today = new Date().toISOString().split('T')[0];
988
+ document.getElementById('dueDate').value = today;
989
+
990
+ showToast('Task added successfully!', 'success');
991
+ }
992
+
993
+ function toggleTodo(id) {
994
+ const todo = todos.find(t => t.id === id);
995
+ if (todo) {
996
+ todo.completed = !todo.completed;
997
+ saveTodos();
998
+ renderTodos();
999
+ updateStats();
1000
+ showToast(todo.completed ? 'Task completed!' : 'Task marked as pending', 'info');
1001
+ }
1002
+ }
1003
+
1004
+ function deleteTodo(id) {
1005
+ todos = todos.filter(t => t.id !== id);
1006
+ saveTodos();
1007
+ renderTodos();
1008
+ updateStats();
1009
+ showToast('Task deleted', 'error');
1010
+ }
1011
+
1012
+ function renderTodos() {
1013
+ const todoList = document.getElementById('todoList');
1014
+ let filteredTodos = filterTodosArray();
1015
+
1016
+ if (filteredTodos.length === 0) {
1017
+ todoList.innerHTML = `
1018
+ <div class="empty-state">
1019
+ <i class="fas fa-clipboard-list"></i>
1020
+ <h3>No tasks found</h3>
1021
+ <p>${currentFilter === 'all' ? 'Add your first task to get started!' : 'No tasks match this filter'}</p>
1022
+ </div>
1023
+ `;
1024
+ return;
1025
+ }
1026
+
1027
+ // Sort todos
1028
+ filteredTodos = sortTodosArray(filteredTodos);
1029
+
1030
+ todoList.innerHTML = filteredTodos.map(todo => `
1031
+ <div class="todo-item ${todo.completed ? 'completed' : ''}"
1032
+ draggable="true"
1033
+ ondragstart="dragStart(event, ${todo.id})"
1034
+ ondragover="dragOver(event)"
1035
+ ondrop="drop(event, ${todo.id})">
1036
+ <div class="todo-content">
1037
+ <div class="todo-checkbox ${todo.completed ? 'checked' : ''}"
1038
+ onclick="toggleTodo(${todo.id})">
1039
+ ${todo.completed ? '<i class="fas fa-check"></i>' : ''}
1040
+ </div>
1041
+ <div class="todo-details">
1042
+ <div class="todo-header-row">
1043
+ <div class="todo-text">${escapeHtml(todo.text)}</div>
1044
+ <span class="todo-priority priority-${todo.priority}">${todo.priority}</span>
1045
+ </div>
1046
+ <div class="todo-meta">
1047
+ <span class="todo-category">
1048
+ <i class="fas ${getCategoryIcon(todo.category)}"></i>
1049
+ ${todo.category}
1050
+ </span>
1051
+ ${todo.dueDate ? `
1052
+ <span class="todo-date">
1053
+ <i class="fas fa-calendar"></i>
1054
+ ${formatDate(todo.dueDate)}
1055
+ ${isOverdue(todo.dueDate) && !todo.completed ? '<span style="color: var(--danger);"> (Overdue)</span>' : ''}
1056
+ </span>
1057
+ ` : ''}
1058
+ </div>
1059
+ </div>
1060
+ <div class="todo-actions">
1061
+ <button class="action-btn delete" onclick="deleteTodo(${todo.id})">
1062
+ <i class="fas fa-trash"></i>
1063
+ </button>
1064
+ </div>
1065
+ </div>
1066
+ </div>
1067
+ `).join('');
1068
+ }
1069
+
1070
+ function filterTodosArray() {
1071
+ const searchTerm = document.getElementById('searchInput').value.toLowerCase();
1072
+ let filtered = todos.filter(todo =>
1073
+ todo.text.toLowerCase().includes(searchTerm)
1074
+ );
1075
+
1076
+ switch(currentFilter) {
1077
+ case 'completed':
1078
+ filtered = filtered.filter(t => t.completed);
1079
+ break;
1080
+ case 'pending':
1081
+ filtered = filtered.filter(t => !t.completed);
1082
+ break;
1083
+ case 'today':
1084
+ const today = new Date().toISOString().split('T')[0];
1085
+ filtered = filtered.filter(t => t.dueDate === today);
1086
+ break;
1087
+ case 'overdue':
1088
+ filtered = filtered.filter(t => isOverdue(t.dueDate) && !t.completed);
1089
+ break;
1090
+ }
1091
+
1092
+ return filtered;
1093
+ }
1094
+
1095
+ function sortTodosArray(todosArray) {
1096
+ return [...todosArray].sort((a, b) => {
1097
+ switch(currentSort) {
1098
+ case 'priority':
1099
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
1100
+ return priorityOrder[a.priority] - priorityOrder[b.priority];
1101
+ case 'date':
1102
+ return new Date(b.dueDate || '9999-12-31') - new Date(a.dueDate || '9999-12-31');
1103
+ case 'name':
1104
+ return a.text.localeCompare(b.text);
1105
+ default:
1106
+ return 0;
1107
+ }
1108
+ });
1109
+ }
1110
+
1111
+ function filterTodos(filter) {
1112
+ currentFilter = filter;
1113
+
1114
+ // Update active tab
1115
+ document.querySelectorAll('.filter-tab').forEach(tab => {
1116
+ tab.classList.remove('active');
1117
+ });
1118
+ document.querySelector(`[data-filter="${filter}"]`).classList.add('active');
1119
+
1120
+ renderTodos();
1121
+ }
1122
+
1123
+ function searchTodos() {
1124
+ renderTodos();
1125
+ }
1126
+
1127
+ function toggleSortMenu() {
1128
+ const sorts = ['date', 'priority', 'name'];
1129
+ const currentIndex = sorts.indexOf(currentSort);
1130
+ currentSort = sorts[(currentIndex + 1) % sorts.length];
1131
+
1132
+ const sortText = {
1133
+ 'date': 'Sort by Date',
1134
+ 'priority': 'Sort by Priority',
1135
+ 'name': 'Sort by Name'
1136
+ };
1137
+
1138
+ document.getElementById('sortText').textContent = sortText[currentSort];
1139
+ renderTodos();
1140
+ }
1141
+
1142
+ function selectPriority(priority) {
1143
+ selectedPriority = priority;
1144
+ document.querySelectorAll('.priority-btn').forEach(btn => {
1145
+ btn.classList.remove('active');
1146
+ });
1147
+ document.querySelector(`[data-priority="${priority}"]`).classList.add('active');
1148
+ }
1149
+
1150
+ function selectCategory(category) {
1151
+ selectedCategory = category;
1152
+ document.querySelectorAll('.category-btn').forEach(btn => {
1153
+ btn.classList.remove('active');
1154
+ });
1155
+ document.querySelector(`[data-category="${category}"]`).classList.add('active');
1156
+ }
1157
+
1158
+ function updateStats() {
1159
+ const total = todos.length;
1160
+ const completed = todos.filter(t => t.completed).length;
1161
+ const pending = todos.filter(t => !t.completed).length;
1162
+ const overdue = todos.filter(t => isOverdue(t.dueDate) && !t.completed).length;
1163
+
1164
+ document.getElementById('totalTasks').textContent = total;
1165
+ document.getElementById('completedTasks').textContent = completed;
1166
+ document.getElementById('pendingTasks').textContent = pending;
1167
+ document.getElementById('overdueTasks').textContent = overdue;
1168
+
1169
+ // Update filter badges
1170
+ document.getElementById('allCount').textContent = total;
1171
+ document.getElementById('pendingCount').textContent = pending;
1172
+ document.getElementById('completedCount').textContent = completed;
1173
+ document.getElementById('todayCount').textContent = todos.filter(t => {
1174
+ const today = new Date().toISOString().split('T')[0];
1175
+ return t.dueDate === today;
1176
+ }).length;
1177
+ document.getElementById('overdueCount').textContent = overdue;
1178
+ }
1179
+
1180
+ function isOverdue(dueDate) {
1181
+ if (!dueDate) return false;
1182
+ const today = new Date().toISOString().split('T')[0];
1183
+ return dueDate < today;
1184
+ }
1185
+
1186
+ function formatDate(dateString) {
1187
+ if (!dateString) return '';
1188
+ const date = new Date(dateString);
1189
+ const today = new Date();
1190
+ const tomorrow = new Date(today);
1191
+ tomorrow.setDate(tomorrow.getDate() + 1);
1192
+
1193
+ if (dateString === today.toISOString().split('T')[0]) {
1194
+ return 'Today';
1195
+ } else if (dateString === tomorrow.toISOString().split('T')[0]) {
1196
+ return 'Tomorrow';
1197
+ } else {
1198
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' });
1199
+ }
1200
+ }
1201
+
1202
+ function getCategoryIcon(category) {
1203
+ const icons = {
1204
+ 'personal': 'fa-user',
1205
+ 'work': 'fa-briefcase',
1206
+ 'shopping': 'fa-shopping-cart',
1207
+ 'health': 'fa-heartbeat',
1208
+ 'education': 'fa-graduation-cap',
1209
+ 'other': 'fa-ellipsis-h'
1210
+ };
1211
+ return icons[category] || 'fa-circle';
1212
+ }
1213
+
1214
+ function escapeHtml(text) {
1215
+ const map = {
1216
+ '&': '&amp;',
1217
+ '<': '&lt;',
1218
+ '>': '&gt;',
1219
+ '"': '&quot;',
1220
+ "'": '&#039;'
1221
+ };
1222
+ return text.replace(/[&<>"']/g, m => map[m]);
1223
+ }
1224
+
1225
+ function toggleTheme() {
1226
+ const body = document.body;
1227
+ const currentTheme = body.getAttribute('data-theme');
1228
+ const newTheme = currentTheme === 'light' ? 'dark' : 'light';
1229
+
1230
+ body.setAttribute('data-theme', newTheme);
1231
+ localStorage.setItem('theme', newTheme);
1232
+
1233
+ const icon = document.getElementById('themeIcon');
1234
+ icon.className = newTheme === 'light' ? 'fas fa-moon' : 'fas fa-sun';
1235
+ }
1236
+
1237
+ function showToast(message, type = 'success') {
1238
+ const toast = document.getElementById('toast');
1239
+ const toastMessage = document.getElementById('toastMessage');
1240
+ const toastIcon = document.getElementById('toastIcon');
1241
+
1242
+ toastMessage.textContent = message;
1243
+ toast.className = `toast ${type}`;
1244
+
1245
+ const icons = {
1246
+ 'success': 'fa-check-circle',
1247
+ 'error': 'fa-times-circle',
1248
+ 'info': 'fa-info-circle'
1249
+ };
1250
+
1251
+ toastIcon.className = `fas ${icons[type]}`;
1252
+
1253
+ toast.classList.add('show');
1254
+
1255
+ setTimeout(() => {
1256
+ toast.classList.remove('show');
1257
+ }, 3000);
1258
+ }
1259
+
1260
+ // Drag and drop functions
1261
+ function dragStart(e, id) {
1262
+ draggedItem = id;
1263
+ e.target.classList.add('dragging');
1264
+ }
1265
+
1266
+ function dragOver(e) {
1267
+ e.preventDefault();
1268
+ }
1269
+
1270
+ function drop(e, targetId) {
1271
+ e.preventDefault();
1272
+
1273
+ if (draggedItem === null || draggedItem === targetId) return;
1274
+
1275
+ const draggedIndex = todos.findIndex(t => t.id === draggedItem);
1276
+ const targetIndex = todos.findIndex(t => t.id === targetId);
1277
+
1278
+ if (draggedIndex !== -1 && targetIndex !== -1) {
1279
+ const [removed] = todos.splice(draggedIndex, 1);
1280
+ todos.splice(targetIndex, 0, removed);
1281
+ saveTodos();
1282
+ renderTodos();
1283
+ }
1284
+
1285
+ document.querySelectorAll('.dragging').forEach(item => {
1286
+ item.classList.remove('dragging');
1287
+ });
1288
+
1289
+ draggedItem = null;
1290
+ }
1291
+
1292
+ // Local storage functions
1293
+ function saveTodos() {
1294
+ localStorage.setItem('todos', JSON.stringify(todos));
1295
+ }
1296
+
1297
+ function loadTodos() {
1298
+ const saved = localStorage.getItem('todos');
1299
+ if (saved) {
1300
+ todos = JSON.parse(saved);
1301
+ }
1302
+
1303
+ // Load theme
1304
+ const savedTheme = localStorage.getItem('theme');
1305
+ if (savedTheme) {
1306
+ document.body.setAttribute('data-theme', savedTheme);
1307
+ const icon = document.getElementById('themeIcon');
1308
+ icon.className = savedTheme === 'light' ? 'fas fa-moon' : 'fas fa-sun';
1309
+ }
1310
+ }
1311
+ </script>
1312
+ </body>
1313
+
1314
+ </html>