alvinwatner commited on
Commit
703eb0f
·
verified ·
1 Parent(s): e57cd64

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +6 -4
  2. index.html +805 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Expense Ranger
3
- emoji: 💻
4
  colorFrom: blue
5
- colorTo: indigo
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: expense-ranger
3
+ emoji: 🐳
4
  colorFrom: blue
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,805 @@
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>Expense Ranger - Fun Expense Tracking</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
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: #4CAF50;
12
+ --primary-light: #81C784;
13
+ --primary-dark: #388E3C;
14
+ --secondary: #FFC107;
15
+ --accent: #FF5722;
16
+ --dark: #263238;
17
+ --light: #ECEFF1;
18
+ --gray: #90A4AE;
19
+ --danger: #E53935;
20
+ --success: #43A047;
21
+ }
22
+
23
+ * {
24
+ margin: 0;
25
+ padding: 0;
26
+ box-sizing: border-box;
27
+ font-family: 'Poppins', sans-serif;
28
+ }
29
+
30
+ body {
31
+ background-color: #f5f5f5;
32
+ color: var(--dark);
33
+ line-height: 1.6;
34
+ }
35
+
36
+ .container {
37
+ max-width: 800px;
38
+ margin: 0 auto;
39
+ padding: 20px;
40
+ }
41
+
42
+ header {
43
+ display: flex;
44
+ justify-content: space-between;
45
+ align-items: center;
46
+ padding: 15px 0;
47
+ border-bottom: 2px solid var(--primary-light);
48
+ margin-bottom: 20px;
49
+ }
50
+
51
+ .logo {
52
+ display: flex;
53
+ align-items: center;
54
+ font-size: 24px;
55
+ font-weight: 700;
56
+ color: var(--primary-dark);
57
+ }
58
+
59
+ .logo i {
60
+ margin-right: 10px;
61
+ color: var(--primary);
62
+ }
63
+
64
+ .user-info {
65
+ display: flex;
66
+ align-items: center;
67
+ }
68
+
69
+ .avatar {
70
+ width: 40px;
71
+ height: 40px;
72
+ border-radius: 50%;
73
+ background-color: var(--primary-light);
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ color: white;
78
+ font-weight: bold;
79
+ margin-left: 15px;
80
+ }
81
+
82
+ .streak {
83
+ display: flex;
84
+ align-items: center;
85
+ background-color: white;
86
+ padding: 8px 15px;
87
+ border-radius: 20px;
88
+ box-shadow: 0 2px 5px rgba(0,0,0,0.1);
89
+ }
90
+
91
+ .streak i {
92
+ color: var(--secondary);
93
+ margin-right: 5px;
94
+ }
95
+
96
+ main {
97
+ display: grid;
98
+ grid-template-columns: 1fr;
99
+ gap: 20px;
100
+ }
101
+
102
+ .card {
103
+ background-color: white;
104
+ border-radius: 15px;
105
+ padding: 20px;
106
+ box-shadow: 0 4px 10px rgba(0,0,0,0.05);
107
+ transition: transform 0.2s;
108
+ }
109
+
110
+ .card:hover {
111
+ transform: translateY(-5px);
112
+ }
113
+
114
+ .card-header {
115
+ display: flex;
116
+ justify-content: space-between;
117
+ align-items: center;
118
+ margin-bottom: 15px;
119
+ }
120
+
121
+ .card-title {
122
+ font-size: 18px;
123
+ font-weight: 600;
124
+ color: var(--primary-dark);
125
+ }
126
+
127
+ .card-icon {
128
+ width: 40px;
129
+ height: 40px;
130
+ border-radius: 50%;
131
+ background-color: var(--primary-light);
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ color: white;
136
+ }
137
+
138
+ .quick-actions {
139
+ display: grid;
140
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
141
+ gap: 15px;
142
+ }
143
+
144
+ .action-btn {
145
+ display: flex;
146
+ flex-direction: column;
147
+ align-items: center;
148
+ justify-content: center;
149
+ padding: 15px 0;
150
+ background-color: var(--light);
151
+ border-radius: 10px;
152
+ cursor: pointer;
153
+ transition: all 0.3s;
154
+ }
155
+
156
+ .action-btn:hover {
157
+ background-color: var(--primary-light);
158
+ color: white;
159
+ }
160
+
161
+ .action-btn i {
162
+ font-size: 24px;
163
+ margin-bottom: 5px;
164
+ color: var(--primary);
165
+ }
166
+
167
+ .action-btn:hover i {
168
+ color: white;
169
+ }
170
+
171
+ .expense-form {
172
+ display: grid;
173
+ gap: 15px;
174
+ }
175
+
176
+ .input-group {
177
+ display: flex;
178
+ flex-direction: column;
179
+ }
180
+
181
+ .input-group label {
182
+ margin-bottom: 5px;
183
+ font-weight: 500;
184
+ color: var(--dark);
185
+ }
186
+
187
+ .input-group input, .input-group select {
188
+ padding: 12px 15px;
189
+ border: 1px solid var(--gray);
190
+ border-radius: 8px;
191
+ font-size: 16px;
192
+ }
193
+
194
+ .submit-btn {
195
+ background-color: var(--primary);
196
+ color: white;
197
+ border: none;
198
+ padding: 12px;
199
+ border-radius: 8px;
200
+ font-size: 16px;
201
+ font-weight: 600;
202
+ cursor: pointer;
203
+ transition: background-color 0.3s;
204
+ }
205
+
206
+ .submit-btn:hover {
207
+ background-color: var(--primary-dark);
208
+ }
209
+
210
+ .expense-list {
211
+ display: grid;
212
+ gap: 10px;
213
+ }
214
+
215
+ .expense-item {
216
+ display: flex;
217
+ justify-content: space-between;
218
+ align-items: center;
219
+ padding: 15px;
220
+ background-color: var(--light);
221
+ border-radius: 10px;
222
+ }
223
+
224
+ .expense-category {
225
+ display: flex;
226
+ align-items: center;
227
+ }
228
+
229
+ .category-icon {
230
+ width: 35px;
231
+ height: 35px;
232
+ border-radius: 50%;
233
+ background-color: var(--primary);
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ color: white;
238
+ margin-right: 10px;
239
+ }
240
+
241
+ .expense-info h4 {
242
+ font-size: 15px;
243
+ margin-bottom: 2px;
244
+ }
245
+
246
+ .expense-info p {
247
+ font-size: 12px;
248
+ color: var(--gray);
249
+ }
250
+
251
+ .expense-amount {
252
+ font-weight: 600;
253
+ color: var(--danger);
254
+ }
255
+
256
+ .badges-container {
257
+ display: grid;
258
+ grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
259
+ gap: 15px;
260
+ }
261
+
262
+ .badge {
263
+ display: flex;
264
+ flex-direction: column;
265
+ align-items: center;
266
+ padding: 15px;
267
+ background-color: var(--light);
268
+ border-radius: 10px;
269
+ text-align: center;
270
+ }
271
+
272
+ .badge i {
273
+ font-size: 30px;
274
+ margin-bottom: 10px;
275
+ color: var(--secondary);
276
+ }
277
+
278
+ .badge-earned i {
279
+ color: var(--primary);
280
+ }
281
+
282
+ .badge h4 {
283
+ font-size: 14px;
284
+ margin-bottom: 5px;
285
+ }
286
+
287
+ .badge p {
288
+ font-size: 12px;
289
+ color: var(--gray);
290
+ }
291
+
292
+ .leaderboard {
293
+ display: grid;
294
+ gap: 10px;
295
+ }
296
+
297
+ .leader-item {
298
+ display: flex;
299
+ align-items: center;
300
+ padding: 12px 15px;
301
+ background-color: var(--light);
302
+ border-radius: 10px;
303
+ }
304
+
305
+ .leader-position {
306
+ width: 30px;
307
+ height: 30px;
308
+ border-radius: 50%;
309
+ background-color: var(--secondary);
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ color: white;
314
+ font-weight: bold;
315
+ margin-right: 15px;
316
+ }
317
+
318
+ .leader-you {
319
+ background-color: var(--primary);
320
+ }
321
+
322
+ .leader-name {
323
+ flex: 1;
324
+ font-weight: 500;
325
+ }
326
+
327
+ .leader-score {
328
+ font-weight: 600;
329
+ color: var(--primary-dark);
330
+ }
331
+
332
+ .stats-container {
333
+ display: grid;
334
+ grid-template-columns: 1fr 1fr;
335
+ gap: 15px;
336
+ margin-bottom: 15px;
337
+ }
338
+
339
+ .stat-card {
340
+ background-color: var(--light);
341
+ border-radius: 10px;
342
+ padding: 15px;
343
+ text-align: center;
344
+ }
345
+
346
+ .stat-value {
347
+ font-size: 24px;
348
+ font-weight: 700;
349
+ color: var(--primary-dark);
350
+ margin: 5px 0;
351
+ }
352
+
353
+ .stat-label {
354
+ font-size: 12px;
355
+ color: var(--gray);
356
+ }
357
+
358
+ .progress-container {
359
+ height: 10px;
360
+ background-color: #e0e0e0;
361
+ border-radius: 5px;
362
+ margin-top: 15px;
363
+ overflow: hidden;
364
+ }
365
+
366
+ .progress-bar {
367
+ height: 100%;
368
+ background-color: var(--primary);
369
+ border-radius: 5px;
370
+ transition: width 0.5s ease;
371
+ }
372
+
373
+ .daily-challenge {
374
+ position: relative;
375
+ background: linear-gradient(135deg, var(--primary-light), var(--primary));
376
+ color: white;
377
+ padding: 20px;
378
+ border-radius: 15px;
379
+ overflow: hidden;
380
+ }
381
+
382
+ .daily-challenge::before {
383
+ content: "";
384
+ position: absolute;
385
+ top: -50px;
386
+ right: -50px;
387
+ width: 150px;
388
+ height: 150px;
389
+ background-color: rgba(255,255,255,0.1);
390
+ border-radius: 50%;
391
+ }
392
+
393
+ .daily-challenge h3 {
394
+ position: relative;
395
+ font-size: 20px;
396
+ margin-bottom: 15px;
397
+ }
398
+
399
+ .daily-challenge p {
400
+ position: relative;
401
+ margin-bottom: 20px;
402
+ font-size: 14px;
403
+ }
404
+
405
+ .challenge-btn {
406
+ position: relative;
407
+ background-color: white;
408
+ color: var(--primary-dark);
409
+ border: none;
410
+ padding: 10px 20px;
411
+ border-radius: 20px;
412
+ font-weight: 600;
413
+ cursor: pointer;
414
+ transition: all 0.3s;
415
+ }
416
+
417
+ .challenge-btn:hover {
418
+ background-color: var(--secondary);
419
+ color: white;
420
+ }
421
+
422
+ .tabs {
423
+ display: flex;
424
+ margin-bottom: 20px;
425
+ border-bottom: 1px solid #ddd;
426
+ }
427
+
428
+ .tab {
429
+ padding: 10px 20px;
430
+ cursor: pointer;
431
+ border-bottom: 3px solid transparent;
432
+ transition: all 0.3s;
433
+ }
434
+
435
+ .tab.active {
436
+ border-bottom-color: var(--primary);
437
+ color: var(--primary);
438
+ font-weight: 600;
439
+ }
440
+
441
+ .tab-content {
442
+ display: none;
443
+ }
444
+
445
+ .tab-content.active {
446
+ display: block;
447
+ }
448
+
449
+ .notification-btn {
450
+ position: relative;
451
+ margin-left: 15px;
452
+ }
453
+
454
+ .notification-btn::after {
455
+ content: "3";
456
+ position: absolute;
457
+ top: -5px;
458
+ right: -5px;
459
+ width: 18px;
460
+ height: 18px;
461
+ background-color: var(--accent);
462
+ color: white;
463
+ border-radius: 50%;
464
+ font-size: 10px;
465
+ display: flex;
466
+ align-items: center;
467
+ justify-content: center;
468
+ }
469
+
470
+ @media (max-width: 600px) {
471
+ .quick-actions {
472
+ grid-template-columns: repeat(2, 1fr);
473
+ }
474
+
475
+ .streak {
476
+ display: none;
477
+ }
478
+
479
+ .stats-container {
480
+ grid-template-columns: 1fr;
481
+ }
482
+ }
483
+
484
+ /* Animation for streak */
485
+ @keyframes streakPulse {
486
+ 0% { transform: scale(1); }
487
+ 50% { transform: scale(1.1); }
488
+ 100% { transform: scale(1); }
489
+ }
490
+
491
+ .streak-pulse {
492
+ animation: streakPulse 0.5s ease;
493
+ }
494
+ </style>
495
+ </head>
496
+ <body>
497
+ <div class="container">
498
+ <header>
499
+ <div class="logo">
500
+ <i class="fas fa-coins"></i>
501
+ Expense Ranger
502
+ </div>
503
+ <div class="user-info">
504
+ <div class="streak">
505
+ <i class="fas fa-fire"></i>
506
+ <span id="streak-count">5</span>
507
+ </div>
508
+ <div class="notification-btn">
509
+ <i class="fas fa-bell"></i>
510
+ </div>
511
+ <div class="avatar">JD</div>
512
+ </div>
513
+ </header>
514
+
515
+ <main>
516
+ <section class="card daily-challenge">
517
+ <h3>🗓️ Daily Challenge</h3>
518
+ <p>Spend less than $20 on dining out today and earn 50 XP!</p>
519
+ <button class="challenge-btn">Accept Challenge</button>
520
+ </section>
521
+
522
+ <section class="card">
523
+ <div class="stats-container">
524
+ <div class="stat-card">
525
+ <div class="stat-label">This Week</div>
526
+ <div class="stat-value">$287</div>
527
+ <div class="progress-container">
528
+ <div class="progress-bar" style="width: 65%"></div>
529
+ </div>
530
+ </div>
531
+ <div class="stat-card">
532
+ <div class="stat-label">Remaining</div>
533
+ <div class="stat-value">$113</div>
534
+ <div class="progress-container">
535
+ <div class="progress-bar" style="width: 35%"></div>
536
+ </div>
537
+ </div>
538
+ </div>
539
+ <div class="quick-actions">
540
+ <div class="action-btn" onclick="openExpenseModal()">
541
+ <i class="fas fa-plus-circle"></i>
542
+ <span>Add Expense</span>
543
+ </div>
544
+ <div class="action-btn">
545
+ <i class="fas fa-chart-pie"></i>
546
+ <span>Analytics</span>
547
+ </div>
548
+ <div class="action-btn">
549
+ <i class="fas fa-bullseye"></i>
550
+ <span>Goals</span>
551
+ </div>
552
+ <div class="action-btn">
553
+ <i class="fas fa-users"></i>
554
+ <span>Groups</span>
555
+ </div>
556
+ </div>
557
+ </section>
558
+
559
+ <section class="card">
560
+ <div class="card-header">
561
+ <div class="card-title">Recent Expenses</div>
562
+ <div class="card-icon">
563
+ <i class="fas fa-receipt"></i>
564
+ </div>
565
+ </div>
566
+ <div class="expense-list">
567
+ <div class="expense-item">
568
+ <div class="expense-category">
569
+ <div class="category-icon">
570
+ <i class="fas fa-utensils"></i>
571
+ </div>
572
+ <div class="expense-info">
573
+ <h4>Lunch with Team</h4>
574
+ <p>Today, 12:30 PM</p>
575
+ </div>
576
+ </div>
577
+ <div class="expense-amount">-$24.50</div>
578
+ </div>
579
+ <div class="expense-item">
580
+ <div class="expense-category">
581
+ <div class="category-icon">
582
+ <i class="fas fa-gas-pump"></i>
583
+ </div>
584
+ <div class="expense-info">
585
+ <h4>Gas Station</h4>
586
+ <p>Yesterday, 5:15 PM</p>
587
+ </div>
588
+ </div>
589
+ <div class="expense-amount">-$35.20</div>
590
+ </div>
591
+ <div class="expense-item">
592
+ <div class="expense-category">
593
+ <div class="category-icon">
594
+ <i class="fas fa-shopping-bag"></i>
595
+ </div>
596
+ <div class="expense-info">
597
+ <h4>Office Supplies</h4>
598
+ <p>Yesterday, 10:00 AM</p>
599
+ </div>
600
+ </div>
601
+ <div class="expense-amount">-$18.75</div>
602
+ </div>
603
+ </div>
604
+ </section>
605
+
606
+ <div class="tabs">
607
+ <div class="tab active" onclick="switchTab('badges')">Badges</div>
608
+ <div class="tab" onclick="switchTab('leaderboard')">Leaderboard</div>
609
+ </div>
610
+
611
+ <section id="badges-tab" class="tab-content active">
612
+ <div class="card">
613
+ <div class="card-header">
614
+ <div class="card-title">Your Badges</div>
615
+ <div class="card-icon">
616
+ <i class="fas fa-medal"></i>
617
+ </div>
618
+ </div>
619
+ <div class="badges-container">
620
+ <div class="badge badge-earned">
621
+ <i class="fas fa-medal"></i>
622
+ <h4>First Step</h4>
623
+ <p>Logged first expense</p>
624
+ </div>
625
+ <div class="badge badge-earned">
626
+ <i class="fas fa-calendar-check"></i>
627
+ <h4>1-Week Streak</h4>
628
+ <p>7 consecutive days</p>
629
+ </div>
630
+ <div class="badge">
631
+ <i class="fas fa-calendar-star"></i>
632
+ <h4>1-Month Streak</h4>
633
+ <p>30 consecutive days</p>
634
+ </div>
635
+ <div class="badge">
636
+ <i class="fas fa-piggy-bank"></i>
637
+ <h4>Savings Pro</h4>
638
+ <p>Saved $500+</p>
639
+ </div>
640
+ <div class="badge">
641
+ <i class="fas fa-coffee"></i>
642
+ <h4>Coffee Master</h4>
643
+ <p>Saved on 10 coffees</p>
644
+ </div>
645
+ <div class="badge">
646
+ <i class="fas fa-trophy"></i>
647
+ <h4>Champion</h4>
648
+ <p>Top of leaderboard</p>
649
+ </div>
650
+ </div>
651
+ </div>
652
+ </section>
653
+
654
+ <section id="leaderboard-tab" class="tab-content">
655
+ <div class="card">
656
+ <div class="card-header">
657
+ <div class="card-title">Weekly Challenge</div>
658
+ <div class="card-icon">
659
+ <i class="fas fa-list-ol"></i>
660
+ </div>
661
+ </div>
662
+ <div class="leaderboard">
663
+ <div class="leader-item">
664
+ <div class="leader-position">1</div>
665
+ <div class="leader-name">Sarah K.</div>
666
+ <div class="leader-score">580 XP</div>
667
+ </div>
668
+ <div class="leader-item">
669
+ <div class="leader-position">2</div>
670
+ <div class="leader-name">Mike T.</div>
671
+ <div class="leader-score">420 XP</div>
672
+ </div>
673
+ <div class="leader-item">
674
+ <div class="leader-position leader-you">3</div>
675
+ <div class="leader-name">John D. (You)</div>
676
+ <div class="leader-score">350 XP</div>
677
+ </div>
678
+ <div class="leader-item">
679
+ <div class="leader-position">4</div>
680
+ <div class="leader-name">Alex P.</div>
681
+ <div class="leader-score">310 XP</div>
682
+ </div>
683
+ <div class="leader-item">
684
+ <div class="leader-position">5</div>
685
+ <div class="leader-name">Emma L.</div>
686
+ <div class="leader-score">295 XP</div>
687
+ </div>
688
+ </div>
689
+ </div>
690
+ </section>
691
+ </main>
692
+ </div>
693
+
694
+ <!-- Expense Modal -->
695
+ <div id="expenseModal" class="modal" style="display:none; position:fixed; top:0; left:0; width:100%; height:100%; background-color:rgba(0,0,0,0.5); z-index:1000; display:flex; justify-content:center; align-items:center;">
696
+ <div class="modal-content" style="background-color:white; padding:30px; border-radius:15px; width:90%; max-width:500px; position:relative;">
697
+ <span onclick="closeExpenseModal()" style="position:absolute; top:15px; right:20px; font-size:25px; cursor:pointer;">&times;</span>
698
+ <h2 style="margin-bottom:20px; color:var(--primary-dark);">Add New Expense</h2>
699
+ <form class="expense-form">
700
+ <div class="input-group">
701
+ <label for="expense-amount">Amount ($)</label>
702
+ <input type="number" id="expense-amount" placeholder="0.00" step="0.01" required>
703
+ </div>
704
+ <div class="input-group">
705
+ <label for="expense-category">Category</label>
706
+ <select id="expense-category" required>
707
+ <option value="">Select a category</option>
708
+ <option value="food">Food & Dining</option>
709
+ <option value="transportation">Transportation</option>
710
+ <option value="shopping">Shopping</option>
711
+ <option value="entertainment">Entertainment</option>
712
+ <option value="utilities">Utilities</option>
713
+ <option value="other">Other</option>
714
+ </select>
715
+ </div>
716
+ <div class="input-group">
717
+ <label for="expense-description">Description (Optional)</label>
718
+ <input type="text" id="expense-description" placeholder="e.g. Team lunch">
719
+ </div>
720
+ <div class="input-group">
721
+ <label for="expense-date">Date</label>
722
+ <input type="date" id="expense-date" required>
723
+ </div>
724
+ <button type="submit" class="submit-btn">Add Expense</button>
725
+ </form>
726
+ </div>
727
+ </div>
728
+
729
+ <script>
730
+ // Switch between tabs
731
+ function switchTab(tabId) {
732
+ // Hide all tab contents
733
+ document.querySelectorAll('.tab-content').forEach(content => {
734
+ content.classList.remove('active');
735
+ });
736
+
737
+ // Show selected tab content
738
+ document.getElementById(tabId + '-tab').classList.add('active');
739
+
740
+ // Update active tab styling
741
+ document.querySelectorAll('.tab').forEach(tab => {
742
+ tab.classList.remove('active');
743
+ });
744
+ event.currentTarget.classList.add('active');
745
+ }
746
+
747
+ // Open expense modal
748
+ function openExpenseModal() {
749
+ document.getElementById('expenseModal').style.display = 'flex';
750
+ }
751
+
752
+ // Close expense modal
753
+ function closeExpenseModal() {
754
+ document.getElementById('expenseModal').style.display = 'none';
755
+ }
756
+
757
+ // Close modal when clicking outside
758
+ window.onclick = function(event) {
759
+ if (event.target == document.getElementById('expenseModal')) {
760
+ closeExpenseModal();
761
+ }
762
+ }
763
+
764
+ // Streak animation
765
+ const streakElement = document.querySelector('.streak');
766
+
767
+ function animateStreak() {
768
+ streakElement.classList.add('streak-pulse');
769
+ setTimeout(() => {
770
+ streakElement.classList.remove('streak-pulse');
771
+ }, 500);
772
+ }
773
+
774
+ // Animate streak on page load
775
+ setTimeout(animateStreak, 1000);
776
+
777
+ // Animate streak every 12 hours to remind users
778
+ setInterval(() => {
779
+ animateStreak();
780
+ }, 12 * 60 * 60 * 1000);
781
+
782
+ // Form submission
783
+ document.querySelector('.expense-form').addEventListener('submit', function(e) {
784
+ e.preventDefault();
785
+
786
+ // In a real app, you would handle the form submission here
787
+ alert('Expense added successfully! +10 XP');
788
+ closeExpenseModal();
789
+
790
+ // Update streak count
791
+ const streakCount = document.getElementById('streak-count');
792
+ streakCount.textContent = parseInt(streakCount.textContent) + 1;
793
+ animateStreak();
794
+ });
795
+
796
+ // Daily challenge button
797
+ document.querySelector('.challenge-btn').addEventListener('click', function() {
798
+ alert('Challenge accepted! Track your dining out expenses today.');
799
+ this.textContent = 'Challenge in Progress';
800
+ this.style.backgroundColor = '#FFD700';
801
+ this.style.color = 'black';
802
+ });
803
+ </script>
804
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <a href="https://enzostvs-deepsite.hf.space" style="color: #fff;" target="_blank" >DeepSite</a> <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;"></p></body>
805
+ </html>