akhaliq HF Staff commited on
Commit
fc09957
·
verified ·
1 Parent(s): 46bbb3f

Upload folder using huggingface_hub

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