thetwistedpixie commited on
Commit
bfdeaba
ยท
verified ยท
1 Parent(s): e7c323f

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +730 -19
index.html CHANGED
@@ -1,19 +1,730 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>TaskFlow - Modern Task Manager</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ :root {
15
+ --primary: #667eea;
16
+ --primary-dark: #5a67d8;
17
+ --secondary: #48bb78;
18
+ --danger: #f56565;
19
+ --warning: #ed8936;
20
+ --dark: #2d3748;
21
+ --light: #f7fafc;
22
+ --gray: #718096;
23
+ --border: #e2e8f0;
24
+ --shadow: rgba(0, 0, 0, 0.1);
25
+ --gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
26
+ }
27
+
28
+ body {
29
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
30
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
31
+ min-height: 100vh;
32
+ display: flex;
33
+ flex-direction: column;
34
+ color: var(--dark);
35
+ }
36
+
37
+ header {
38
+ background: rgba(255, 255, 255, 0.95);
39
+ backdrop-filter: blur(10px);
40
+ padding: 1rem 2rem;
41
+ box-shadow: 0 2px 20px var(--shadow);
42
+ position: sticky;
43
+ top: 0;
44
+ z-index: 100;
45
+ }
46
+
47
+ .header-content {
48
+ max-width: 1200px;
49
+ margin: 0 auto;
50
+ display: flex;
51
+ justify-content: space-between;
52
+ align-items: center;
53
+ }
54
+
55
+ .logo {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: 0.5rem;
59
+ font-size: 1.5rem;
60
+ font-weight: bold;
61
+ color: var(--primary);
62
+ }
63
+
64
+ .logo-icon {
65
+ width: 35px;
66
+ height: 35px;
67
+ background: var(--gradient);
68
+ border-radius: 8px;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ color: white;
73
+ font-size: 20px;
74
+ }
75
+
76
+ .stats {
77
+ display: flex;
78
+ gap: 2rem;
79
+ align-items: center;
80
+ }
81
+
82
+ .stat-item {
83
+ text-align: center;
84
+ }
85
+
86
+ .stat-value {
87
+ font-size: 1.5rem;
88
+ font-weight: bold;
89
+ color: var(--primary);
90
+ }
91
+
92
+ .stat-label {
93
+ font-size: 0.875rem;
94
+ color: var(--gray);
95
+ }
96
+
97
+ main {
98
+ flex: 1;
99
+ padding: 2rem;
100
+ max-width: 1200px;
101
+ margin: 0 auto;
102
+ width: 100%;
103
+ }
104
+
105
+ .container {
106
+ display: grid;
107
+ grid-template-columns: 1fr 2fr;
108
+ gap: 2rem;
109
+ height: 100%;
110
+ }
111
+
112
+ .sidebar {
113
+ background: white;
114
+ border-radius: 20px;
115
+ padding: 1.5rem;
116
+ box-shadow: 0 10px 40px var(--shadow);
117
+ height: fit-content;
118
+ position: sticky;
119
+ top: 100px;
120
+ }
121
+
122
+ .add-task-form {
123
+ margin-bottom: 2rem;
124
+ }
125
+
126
+ .form-group {
127
+ margin-bottom: 1rem;
128
+ }
129
+
130
+ label {
131
+ display: block;
132
+ margin-bottom: 0.5rem;
133
+ font-weight: 500;
134
+ color: var(--dark);
135
+ }
136
+
137
+ input, textarea, select {
138
+ width: 100%;
139
+ padding: 0.75rem;
140
+ border: 2px solid var(--border);
141
+ border-radius: 10px;
142
+ font-size: 1rem;
143
+ transition: all 0.3s ease;
144
+ }
145
+
146
+ input:focus, textarea:focus, select:focus {
147
+ outline: none;
148
+ border-color: var(--primary);
149
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
150
+ }
151
+
152
+ textarea {
153
+ resize: vertical;
154
+ min-height: 80px;
155
+ }
156
+
157
+ .priority-select {
158
+ display: grid;
159
+ grid-template-columns: repeat(3, 1fr);
160
+ gap: 0.5rem;
161
+ }
162
+
163
+ .priority-btn {
164
+ padding: 0.5rem;
165
+ border: 2px solid var(--border);
166
+ background: white;
167
+ border-radius: 8px;
168
+ cursor: pointer;
169
+ transition: all 0.3s ease;
170
+ font-size: 0.875rem;
171
+ }
172
+
173
+ .priority-btn.active {
174
+ color: white;
175
+ }
176
+
177
+ .priority-btn[data-priority="low"].active {
178
+ background: var(--secondary);
179
+ border-color: var(--secondary);
180
+ }
181
+
182
+ .priority-btn[data-priority="medium"].active {
183
+ background: var(--warning);
184
+ border-color: var(--warning);
185
+ }
186
+
187
+ .priority-btn[data-priority="high"].active {
188
+ background: var(--danger);
189
+ border-color: var(--danger);
190
+ }
191
+
192
+ .btn-primary {
193
+ width: 100%;
194
+ padding: 1rem;
195
+ background: var(--gradient);
196
+ color: white;
197
+ border: none;
198
+ border-radius: 10px;
199
+ font-size: 1rem;
200
+ font-weight: 600;
201
+ cursor: pointer;
202
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
203
+ }
204
+
205
+ .btn-primary:hover {
206
+ transform: translateY(-2px);
207
+ box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4);
208
+ }
209
+
210
+ .tasks-section {
211
+ background: white;
212
+ border-radius: 20px;
213
+ padding: 1.5rem;
214
+ box-shadow: 0 10px 40px var(--shadow);
215
+ }
216
+
217
+ .section-header {
218
+ display: flex;
219
+ justify-content: space-between;
220
+ align-items: center;
221
+ margin-bottom: 1.5rem;
222
+ }
223
+
224
+ .section-title {
225
+ font-size: 1.5rem;
226
+ font-weight: bold;
227
+ color: var(--dark);
228
+ }
229
+
230
+ .filter-tabs {
231
+ display: flex;
232
+ gap: 0.5rem;
233
+ background: var(--light);
234
+ padding: 0.25rem;
235
+ border-radius: 10px;
236
+ }
237
+
238
+ .filter-tab {
239
+ padding: 0.5rem 1rem;
240
+ background: transparent;
241
+ border: none;
242
+ border-radius: 8px;
243
+ cursor: pointer;
244
+ transition: all 0.3s ease;
245
+ font-weight: 500;
246
+ color: var(--gray);
247
+ }
248
+
249
+ .filter-tab.active {
250
+ background: white;
251
+ color: var(--primary);
252
+ box-shadow: 0 2px 10px var(--shadow);
253
+ }
254
+
255
+ .tasks-list {
256
+ display: flex;
257
+ flex-direction: column;
258
+ gap: 1rem;
259
+ }
260
+
261
+ .task-item {
262
+ background: var(--light);
263
+ padding: 1rem;
264
+ border-radius: 12px;
265
+ display: flex;
266
+ align-items: center;
267
+ gap: 1rem;
268
+ transition: all 0.3s ease;
269
+ cursor: pointer;
270
+ position: relative;
271
+ overflow: hidden;
272
+ }
273
+
274
+ .task-item:hover {
275
+ transform: translateX(5px);
276
+ box-shadow: 0 5px 20px var(--shadow);
277
+ }
278
+
279
+ .task-item.completed {
280
+ opacity: 0.6;
281
+ }
282
+
283
+ .task-item.completed .task-title {
284
+ text-decoration: line-through;
285
+ }
286
+
287
+ .task-checkbox {
288
+ width: 24px;
289
+ height: 24px;
290
+ border: 2px solid var(--border);
291
+ border-radius: 50%;
292
+ display: flex;
293
+ align-items: center;
294
+ justify-content: center;
295
+ cursor: pointer;
296
+ transition: all 0.3s ease;
297
+ flex-shrink: 0;
298
+ }
299
+
300
+ .task-checkbox.checked {
301
+ background: var(--gradient);
302
+ border-color: var(--primary);
303
+ }
304
+
305
+ .task-checkbox.checked::after {
306
+ content: 'โœ“';
307
+ color: white;
308
+ font-weight: bold;
309
+ }
310
+
311
+ .task-content {
312
+ flex: 1;
313
+ }
314
+
315
+ .task-title {
316
+ font-weight: 600;
317
+ margin-bottom: 0.25rem;
318
+ color: var(--dark);
319
+ }
320
+
321
+ .task-description {
322
+ font-size: 0.875rem;
323
+ color: var(--gray);
324
+ }
325
+
326
+ .task-priority {
327
+ padding: 0.25rem 0.75rem;
328
+ border-radius: 20px;
329
+ font-size: 0.75rem;
330
+ font-weight: 600;
331
+ text-transform: uppercase;
332
+ }
333
+
334
+ .priority-low {
335
+ background: rgba(72, 187, 120, 0.1);
336
+ color: var(--secondary);
337
+ }
338
+
339
+ .priority-medium {
340
+ background: rgba(237, 137, 54, 0.1);
341
+ color: var(--warning);
342
+ }
343
+
344
+ .priority-high {
345
+ background: rgba(245, 101, 101, 0.1);
346
+ color: var(--danger);
347
+ }
348
+
349
+ .task-actions {
350
+ display: flex;
351
+ gap: 0.5rem;
352
+ }
353
+
354
+ .task-action-btn {
355
+ width: 32px;
356
+ height: 32px;
357
+ border: none;
358
+ background: white;
359
+ border-radius: 8px;
360
+ cursor: pointer;
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ transition: all 0.3s ease;
365
+ color: var(--gray);
366
+ }
367
+
368
+ .task-action-btn:hover {
369
+ background: var(--primary);
370
+ color: white;
371
+ transform: scale(1.1);
372
+ }
373
+
374
+ .empty-state {
375
+ text-align: center;
376
+ padding: 3rem;
377
+ color: var(--gray);
378
+ }
379
+
380
+ .empty-icon {
381
+ font-size: 4rem;
382
+ margin-bottom: 1rem;
383
+ opacity: 0.3;
384
+ }
385
+
386
+ .progress-bar {
387
+ width: 100%;
388
+ height: 8px;
389
+ background: var(--border);
390
+ border-radius: 10px;
391
+ overflow: hidden;
392
+ margin-bottom: 1rem;
393
+ }
394
+
395
+ .progress-fill {
396
+ height: 100%;
397
+ background: var(--gradient);
398
+ border-radius: 10px;
399
+ transition: width 0.5s ease;
400
+ }
401
+
402
+ .notification {
403
+ position: fixed;
404
+ bottom: 2rem;
405
+ right: 2rem;
406
+ background: white;
407
+ padding: 1rem 1.5rem;
408
+ border-radius: 12px;
409
+ box-shadow: 0 10px 40px var(--shadow);
410
+ display: flex;
411
+ align-items: center;
412
+ gap: 1rem;
413
+ transform: translateX(400px);
414
+ transition: transform 0.3s ease;
415
+ z-index: 1000;
416
+ }
417
+
418
+ .notification.show {
419
+ transform: translateX(0);
420
+ }
421
+
422
+ .notification-icon {
423
+ width: 40px;
424
+ height: 40px;
425
+ background: var(--gradient);
426
+ border-radius: 50%;
427
+ display: flex;
428
+ align-items: center;
429
+ justify-content: center;
430
+ color: white;
431
+ }
432
+
433
+ @media (max-width: 768px) {
434
+ .container {
435
+ grid-template-columns: 1fr;
436
+ }
437
+
438
+ .sidebar {
439
+ position: static;
440
+ }
441
+
442
+ .stats {
443
+ display: none;
444
+ }
445
+
446
+ .header-content {
447
+ padding: 0.5rem;
448
+ }
449
+
450
+ main {
451
+ padding: 1rem;
452
+ }
453
+ }
454
+
455
+ .fade-in {
456
+ animation: fadeIn 0.5s ease;
457
+ }
458
+
459
+ @keyframes fadeIn {
460
+ from {
461
+ opacity: 0;
462
+ transform: translateY(10px);
463
+ }
464
+ to {
465
+ opacity: 1;
466
+ transform: translateY(0);
467
+ }
468
+ }
469
+ </style>
470
+ </head>
471
+ <body>
472
+ <header>
473
+ <div class="header-content">
474
+ <div class="logo">
475
+ <div class="logo-icon">โœ“</div>
476
+ <span>TaskFlow</span>
477
+ </div>
478
+ <div class="stats">
479
+ <div class="stat-item">
480
+ <div class="stat-value" id="totalTasks">0</div>
481
+ <div class="stat-label">Total Tasks</div>
482
+ </div>
483
+ <div class="stat-item">
484
+ <div class="stat-value" id="completedTasks">0</div>
485
+ <div class="stat-label">Completed</div>
486
+ </div>
487
+ <div class="stat-item">
488
+ <div class="stat-value" id="productivityScore">0%</div>
489
+ <div class="stat-label">Productivity</div>
490
+ </div>
491
+ </div>
492
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" style="color: var(--primary); text-decoration: none; font-weight: 500;">Built with anycoder</a>
493
+ </div>
494
+ </header>
495
+
496
+ <main>
497
+ <div class="container">
498
+ <aside class="sidebar">
499
+ <div class="add-task-form">
500
+ <h3 style="margin-bottom: 1rem;">Add New Task</h3>
501
+ <form id="taskForm">
502
+ <div class="form-group">
503
+ <label for="taskTitle">Task Title</label>
504
+ <input type="text" id="taskTitle" placeholder="Enter task title..." required>
505
+ </div>
506
+ <div class="form-group">
507
+ <label for="taskDescription">Description</label>
508
+ <textarea id="taskDescription" placeholder="Add description..."></textarea>
509
+ </div>
510
+ <div class="form-group">
511
+ <label>Priority</label>
512
+ <div class="priority-select">
513
+ <button type="button" class="priority-btn" data-priority="low">Low</button>
514
+ <button type="button" class="priority-btn active" data-priority="medium">Medium</button>
515
+ <button type="button" class="priority-btn" data-priority="high">High</button>
516
+ </div>
517
+ </div>
518
+ <button type="submit" class="btn-primary">Add Task</button>
519
+ </form>
520
+ </div>
521
+
522
+ <div class="progress-section">
523
+ <h4 style="margin-bottom: 0.5rem;">Today's Progress</h4>
524
+ <div class="progress-bar">
525
+ <div class="progress-fill" id="progressBar" style="width: 0%"></div>
526
+ </div>
527
+ <p style="font-size: 0.875rem; color: var(--gray);">Keep going! You're doing great!</p>
528
+ </div>
529
+ </aside>
530
+
531
+ <section class="tasks-section">
532
+ <div class="section-header">
533
+ <h2 class="section-title">My Tasks</h2>
534
+ <div class="filter-tabs">
535
+ <button class="filter-tab active" data-filter="all">All</button>
536
+ <button class="filter-tab" data-filter="active">Active</button>
537
+ <button class="filter-tab" data-filter="completed">Completed</button>
538
+ </div>
539
+ </div>
540
+ <div class="tasks-list" id="tasksList">
541
+ <div class="empty-state">
542
+ <div class="empty-icon">๐Ÿ“</div>
543
+ <h3>No tasks yet</h3>
544
+ <p>Start by adding your first task!</p>
545
+ </div>
546
+ </div>
547
+ </section>
548
+ </div>
549
+ </main>
550
+
551
+ <div class="notification" id="notification">
552
+ <div class="notification-icon">โœ“</div>
553
+ <div>
554
+ <div style="font-weight: 600;" id="notificationTitle">Success!</div>
555
+ <div style="font-size: 0.875rem; color: var(--gray);" id="notificationMessage">Task added successfully</div>
556
+ </div>
557
+ </div>
558
+
559
+ <script>
560
+ class TaskManager {
561
+ constructor() {
562
+ this.tasks = JSON.parse(localStorage.getItem('tasks')) || [];
563
+ this.currentFilter = 'all';
564
+ this.selectedPriority = 'medium';
565
+ this.init();
566
+ }
567
+
568
+ init() {
569
+ this.setupEventListeners();
570
+ this.renderTasks();
571
+ this.updateStats();
572
+ }
573
+
574
+ setupEventListeners() {
575
+ // Form submission
576
+ document.getElementById('taskForm').addEventListener('submit', (e) => {
577
+ e.preventDefault();
578
+ this.addTask();
579
+ });
580
+
581
+ // Priority buttons
582
+ document.querySelectorAll('.priority-btn').forEach(btn => {
583
+ btn.addEventListener('click', () => {
584
+ document.querySelectorAll('.priority-btn').forEach(b => b.classList.remove('active'));
585
+ btn.classList.add('active');
586
+ this.selectedPriority = btn.dataset.priority;
587
+ });
588
+ });
589
+
590
+ // Filter tabs
591
+ document.querySelectorAll('.filter-tab').forEach(tab => {
592
+ tab.addEventListener('click', () => {
593
+ document.querySelectorAll('.filter-tab').forEach(t => t.classList.remove('active'));
594
+ tab.classList.add('active');
595
+ this.currentFilter = tab.dataset.filter;
596
+ this.renderTasks();
597
+ });
598
+ });
599
+ }
600
+
601
+ addTask() {
602
+ const title = document.getElementById('taskTitle').value.trim();
603
+ const description = document.getElementById('taskDescription').value.trim();
604
+
605
+ if (!title) return;
606
+
607
+ const task = {
608
+ id: Date.now(),
609
+ title,
610
+ description,
611
+ priority: this.selectedPriority,
612
+ completed: false,
613
+ createdAt: new Date().toISOString()
614
+ };
615
+
616
+ this.tasks.unshift(task);
617
+ this.saveTasks();
618
+ this.renderTasks();
619
+ this.updateStats();
620
+ this.showNotification('Task Added!', `"${title}" has been added to your tasks`);
621
+
622
+ // Reset form
623
+ document.getElementById('taskForm').reset();
624
+ document.querySelectorAll('.priority-btn').forEach(btn => {
625
+ btn.classList.remove('active');
626
+ if (btn.dataset.priority === 'medium') {
627
+ btn.classList.add('active');
628
+ }
629
+ });
630
+ this.selectedPriority = 'medium';
631
+ }
632
+
633
+ toggleTask(id) {
634
+ const task = this.tasks.find(t => t.id === id);
635
+ if (task) {
636
+ task.completed = !task.completed;
637
+ this.saveTasks();
638
+ this.renderTasks();
639
+ this.updateStats();
640
+
641
+ if (task.completed) {
642
+ this.showNotification('Task Completed!', `Great job finishing "${task.title}"`);
643
+ }
644
+ }
645
+ }
646
+
647
+ deleteTask(id) {
648
+ const task = this.tasks.find(t => t.id === id);
649
+ if (task) {
650
+ this.tasks = this.tasks.filter(t => t.id !== id);
651
+ this.saveTasks();
652
+ this.renderTasks();
653
+ this.updateStats();
654
+ this.showNotification('Task Deleted', `"${task.title}" has been removed`);
655
+ }
656
+ }
657
+
658
+ getFilteredTasks() {
659
+ switch (this.currentFilter) {
660
+ case 'active':
661
+ return this.tasks.filter(t => !t.completed);
662
+ case 'completed':
663
+ return this.tasks.filter(t => t.completed);
664
+ default:
665
+ return this.tasks;
666
+ }
667
+ }
668
+
669
+ renderTasks() {
670
+ const tasksList = document.getElementById('tasksList');
671
+ const filteredTasks = this.getFilteredTasks();
672
+
673
+ if (filteredTasks.length === 0) {
674
+ tasksList.innerHTML = `
675
+ <div class="empty-state">
676
+ <div class="empty-icon">๐Ÿ“</div>
677
+ <h3>No tasks found</h3>
678
+ <p>${this.currentFilter === 'all' ? 'Start by adding your first task!' : 'No tasks in this category'}</p>
679
+ </div>
680
+ `;
681
+ return;
682
+ }
683
+
684
+ tasksList.innerHTML = filteredTasks.map(task => `
685
+ <div class="task-item fade-in ${task.completed ? 'completed' : ''}" data-id="${task.id}">
686
+ <div class="task-checkbox ${task.completed ? 'checked' : ''}" onclick="taskManager.toggleTask(${task.id})"></div>
687
+ <div class="task-content">
688
+ <div class="task-title">${task.title}</div>
689
+ ${task.description ? `<div class="task-description">${task.description}</div>` : ''}
690
+ </div>
691
+ <div class="task-priority priority-${task.priority}">${task.priority}</div>
692
+ <div class="task-actions">
693
+ <button class="task-action-btn" onclick="taskManager.deleteTask(${task.id})">๐Ÿ—‘๏ธ</button>
694
+ </div>
695
+ </div>
696
+ `).join('');
697
+ }
698
+
699
+ updateStats() {
700
+ const total = this.tasks.length;
701
+ const completed = this.tasks.filter(t => t.completed).length;
702
+ const productivity = total > 0 ? Math.round((completed / total) * 100) : 0;
703
+
704
+ document.getElementById('totalTasks').textContent = total;
705
+ document.getElementById('completedTasks').textContent = completed;
706
+ document.getElementById('productivityScore').textContent = productivity + '%';
707
+ document.getElementById('progressBar').style.width = productivity + '%';
708
+ }
709
+
710
+ saveTasks() {
711
+ localStorage.setItem('tasks', JSON.stringify(this.tasks));
712
+ }
713
+
714
+ showNotification(title, message) {
715
+ const notification = document.getElementById('notification');
716
+ document.getElementById('notificationTitle').textContent = title;
717
+ document.getElementById('notificationMessage').textContent = message;
718
+
719
+ notification.classList.add('show');
720
+ setTimeout(() => {
721
+ notification.classList.remove('show');
722
+ }, 3000);
723
+ }
724
+ }
725
+
726
+ // Initialize the app
727
+ const taskManager = new TaskManager();
728
+ </script>
729
+ </body>
730
+ </html>