akhaliq HF Staff commited on
Commit
1471090
·
verified ·
1 Parent(s): 2a8aed0

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +300 -687
index.html CHANGED
@@ -7,41 +7,41 @@
7
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
  <style>
9
  :root {
10
- --primary: #f59e0b;
11
- --primary-dark: #d97706;
12
- --secondary: #fbbf24;
13
- --accent: #f472b6;
14
- --text: #1f2937;
15
- --text-light: #6b7280;
16
- --bg: #fef7ed;
17
  --bg-card: #ffffff;
18
- --border: #e5e7eb;
19
- --success: #10b981;
20
- --warning: #f59e0b;
21
- --error: #ef4444;
22
- --radius: 12px;
23
- --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
24
- --transition: all 0.3s ease;
25
  }
26
 
27
  .dark-mode {
28
- --primary: #f59e0b;
29
- --primary-dark: #d97706;
30
- --secondary: #fbbf24;
31
- --accent: #f472b6;
32
- --text: #f9fafb;
33
- --text-light: #d1d5db;
34
- --bg: #1f2937;
35
- --bg-card: #374151;
36
- --border: #4b5563;
37
- --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2);
38
  }
39
 
40
  * {
41
  margin: 0;
42
  padding: 0;
43
  box-sizing: border-box;
44
- font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
45
  }
46
 
47
  body {
@@ -49,23 +49,26 @@
49
  color: var(--text);
50
  transition: var(--transition);
51
  line-height: 1.6;
 
52
  }
53
 
54
  .container {
55
  max-width: 1200px;
56
  margin: 0 auto;
57
- padding: 0 1rem;
58
  }
59
 
 
60
  header {
61
  background-color: var(--bg-card);
62
- box-shadow: var(--shadow);
63
  position: sticky;
64
  top: 0;
65
- z-index: 100;
 
66
  }
67
 
68
- .header-content {
69
  display: flex;
70
  justify-content: space-between;
71
  align-items: center;
@@ -75,48 +78,18 @@
75
  .logo {
76
  display: flex;
77
  align-items: center;
78
- gap: 0.5rem;
79
  font-weight: 700;
80
  font-size: 1.5rem;
81
  color: var(--primary);
82
- }
83
-
84
- .logo i {
85
- font-size: 1.75rem;
86
- }
87
-
88
- .nav-links {
89
- display: flex;
90
- gap: 2rem;
91
- }
92
-
93
- .nav-links a {
94
  text-decoration: none;
95
- color: var(--text);
96
- font-weight: 500;
97
- transition: var(--transition);
98
- position: relative;
99
- }
100
-
101
- .nav-links a:hover {
102
- color: var(--primary);
103
- }
104
-
105
- .nav-links a.active {
106
- color: var(--primary);
107
  }
108
 
109
- .nav-links a.active::after {
110
- content: '';
111
- position: absolute;
112
- bottom: -0.5rem;
113
- left: 0;
114
- width: 100%;
115
- height: 2px;
116
- background-color: var(--primary);
117
  }
118
 
119
- .header-actions {
120
  display: flex;
121
  align-items: center;
122
  gap: 1rem;
@@ -129,28 +102,33 @@
129
  cursor: pointer;
130
  font-size: 1.25rem;
131
  transition: var(--transition);
 
 
132
  }
133
 
134
  .theme-toggle:hover {
 
135
  color: var(--primary);
136
  }
137
 
138
- .add-review-btn {
139
- background-color: var(--primary);
140
  color: white;
141
  border: none;
142
- padding: 0.5rem 1rem;
143
  border-radius: var(--radius);
144
- font-weight: 500;
145
  cursor: pointer;
146
  transition: var(--transition);
147
  display: flex;
148
  align-items: center;
149
  gap: 0.5rem;
 
150
  }
151
 
152
- .add-review-btn:hover {
153
- background-color: var(--primary-dark);
 
154
  }
155
 
156
  .mobile-menu-btn {
@@ -160,44 +138,51 @@
160
  color: var(--text);
161
  font-size: 1.5rem;
162
  cursor: pointer;
 
 
163
  }
164
 
 
165
  .hero {
166
- padding: 3rem 0;
167
  text-align: center;
168
  background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
169
  color: white;
170
- border-radius: 0 0 var(--radius) var(--radius);
171
- margin-bottom: 2rem;
172
  }
173
 
174
  .hero h1 {
175
- font-size: 2.5rem;
176
- margin-bottom: 1rem;
 
 
177
  }
178
 
179
  .hero p {
180
  font-size: 1.25rem;
181
  max-width: 600px;
182
- margin: 0 auto 1.5rem;
 
183
  }
184
 
185
  .hero-actions {
186
  display: flex;
187
  gap: 1rem;
188
  justify-content: center;
 
189
  }
190
 
191
  .btn {
192
- padding: 0.75rem 1.5rem;
193
  border-radius: var(--radius);
194
- font-weight: 500;
195
  cursor: pointer;
196
  transition: var(--transition);
197
  border: none;
198
  display: inline-flex;
199
  align-items: center;
200
  gap: 0.5rem;
 
201
  }
202
 
203
  .btn-primary {
@@ -206,7 +191,8 @@
206
  }
207
 
208
  .btn-primary:hover {
209
- background-color: rgba(255, 255, 255, 0.9);
 
210
  }
211
 
212
  .btn-secondary {
@@ -220,356 +206,222 @@
220
  color: var(--primary);
221
  }
222
 
 
 
 
 
 
223
  .section-title {
224
- font-size: 1.75rem;
225
- margin-bottom: 1.5rem;
 
226
  display: flex;
227
  align-items: center;
228
- gap: 0.5rem;
229
  }
230
 
231
  .section-title i {
232
  color: var(--primary);
233
  }
234
 
235
- .reviews-grid {
236
- display: grid;
237
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
238
- gap: 1.5rem;
239
- margin-bottom: 3rem;
240
  }
241
 
242
- .review-card {
 
243
  background-color: var(--bg-card);
244
  border-radius: var(--radius);
245
  overflow: hidden;
246
  box-shadow: var(--shadow);
247
- transition: var(--transition);
248
- }
249
-
250
- .review-card:hover {
251
- transform: translateY(-5px);
252
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
253
  }
254
 
255
- .review-image {
256
- width: 100%;
257
- height: 200px;
258
- object-fit: cover;
259
- }
260
-
261
- .review-content {
262
- padding: 1.25rem;
263
- }
264
-
265
- .review-header {
266
- display: flex;
267
- justify-content: space-between;
268
- align-items: flex-start;
269
- margin-bottom: 0.75rem;
270
  }
271
 
272
- .review-title {
273
- font-size: 1.25rem;
274
- font-weight: 600;
275
- margin-bottom: 0.25rem;
276
  }
277
 
278
- .review-badge {
279
  background-color: var(--primary);
280
  color: white;
281
- padding: 0.25rem 0.5rem;
282
- border-radius: 20px;
283
- font-size: 0.75rem;
284
- font-weight: 500;
285
- }
286
-
287
- .review-badge.exception {
288
- background-color: var(--accent);
289
- }
290
-
291
- .review-meta {
292
- color: var(--text-light);
293
- font-size: 0.875rem;
294
- margin-bottom: 0.75rem;
295
- }
296
-
297
- .rating {
298
- display: flex;
299
- align-items: center;
300
- gap: 0.5rem;
301
- margin-bottom: 0.75rem;
302
- }
303
-
304
- .rating-stars {
305
- color: var(--primary);
306
- display: flex;
307
- }
308
-
309
- .rating-value {
310
- font-weight: 600;
311
- }
312
-
313
- .review-tags {
314
- display: flex;
315
- flex-wrap: wrap;
316
- gap: 0.5rem;
317
- margin-bottom: 1rem;
318
- }
319
-
320
- .tag {
321
- background-color: var(--bg);
322
- color: var(--text);
323
- padding: 0.25rem 0.5rem;
324
- border-radius: 20px;
325
- font-size: 0.75rem;
326
  }
327
 
328
- .review-preview {
329
- color: var(--text-light);
330
- font-size: 0.875rem;
331
- display: -webkit-box;
332
- -webkit-line-clamp: 3;
333
- -webkit-box-orient: vertical;
334
- overflow: hidden;
335
  }
336
 
337
- .filters {
338
  display: flex;
339
- flex-wrap: wrap;
340
  gap: 1rem;
 
341
  margin-bottom: 2rem;
342
- background-color: var(--bg-card);
343
- padding: 1.25rem;
344
- border-radius: var(--radius);
345
- box-shadow: var(--shadow);
346
- }
347
-
348
- .filter-group {
349
- display: flex;
350
- flex-direction: column;
351
- gap: 0.5rem;
352
  }
353
 
354
- .filter-label {
355
- font-size: 0.875rem;
356
- font-weight: 500;
357
- }
358
-
359
- .filter-select, .filter-input {
360
- padding: 0.5rem;
361
- border-radius: var(--radius);
362
- border: 1px solid var(--border);
363
- background-color: var(--bg);
364
  color: var(--text);
365
- }
366
-
367
- .search-bar {
368
- display: flex;
369
- gap: 0.5rem;
370
- margin-bottom: 2rem;
371
- }
372
-
373
- .search-input {
374
- flex: 1;
375
- padding: 0.75rem 1rem;
376
- border-radius: var(--radius);
377
  border: 1px solid var(--border);
378
- background-color: var(--bg);
379
- color: var(--text);
 
380
  }
381
 
382
- .search-btn {
383
  background-color: var(--primary);
384
  color: white;
385
- border: none;
386
- padding: 0 1.25rem;
387
- border-radius: var(--radius);
388
- cursor: pointer;
389
- }
390
-
391
- .form-container {
392
- max-width: 800px;
393
- margin: 0 auto;
394
- background-color: var(--bg-card);
395
- padding: 2rem;
396
- border-radius: var(--radius);
397
- box-shadow: var(--shadow);
398
  }
399
 
400
- .form-group {
401
- margin-bottom: 1.5rem;
402
  }
403
 
404
- .form-label {
405
- display: block;
406
- margin-bottom: 0.5rem;
407
- font-weight: 500;
 
 
408
  }
409
 
410
- .form-input, .form-textarea, .form-select {
411
- width: 100%;
412
- padding: 0.75rem;
413
  border-radius: var(--radius);
414
- border: 1px solid var(--border);
415
- background-color: var(--bg);
416
- color: var(--text);
417
  transition: var(--transition);
418
  }
419
 
420
- .form-input:focus, .form-textarea:focus, .form-select:focus {
421
- outline: none;
422
- border-color: var(--primary);
423
- box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.2);
424
- }
425
-
426
- .form-textarea {
427
- min-height: 150px;
428
- resize: vertical;
429
- }
430
-
431
- .form-row {
432
- display: grid;
433
- grid-template-columns: 1fr 1fr;
434
- gap: 1rem;
435
  }
436
 
437
- .rating-slider {
438
  width: 100%;
439
- margin: 0.5rem 0;
440
- }
441
-
442
- .rating-display {
443
- display: flex;
444
- justify-content: space-between;
445
- margin-top: 0.5rem;
446
- font-size: 0.875rem;
447
- color: var(--text-light);
448
  }
449
 
450
- .sub-ratings {
451
- display: grid;
452
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
453
- gap: 1rem;
454
- margin-top: 1rem;
455
  }
456
 
457
- .checkbox-group {
458
  display: flex;
459
- align-items: center;
460
- gap: 0.5rem;
461
- }
462
-
463
- .checkbox {
464
- width: 1.25rem;
465
- height: 1.25rem;
466
- accent-color: var(--primary);
467
- }
468
-
469
- .photo-upload {
470
- border: 2px dashed var(--border);
471
- border-radius: var(--radius);
472
- padding: 2rem;
473
- text-align: center;
474
- cursor: pointer;
475
- transition: var(--transition);
476
- }
477
-
478
- .photo-upload:hover {
479
- border-color: var(--primary);
480
  }
481
 
482
- .photo-preview {
483
- display: flex;
484
- flex-wrap: wrap;
485
- gap: 1rem;
486
- margin-top: 1rem;
487
  }
488
 
489
- .preview-image {
490
- width: 100px;
491
- height: 100px;
492
- object-fit: cover;
493
- border-radius: var(--radius);
494
  }
495
 
496
- .submit-btn {
497
  background-color: var(--primary);
498
  color: white;
499
- border: none;
500
- padding: 0.75rem 2rem;
501
- border-radius: var(--radius);
502
- font-weight: 500;
503
- cursor: pointer;
504
- transition: var(--transition);
505
- width: 100%;
506
- font-size: 1rem;
507
- }
508
-
509
- .submit-btn:hover {
510
- background-color: var(--primary-dark);
511
- }
512
-
513
- .toast {
514
- position: fixed;
515
- bottom: 1rem;
516
- right: 1rem;
517
- background-color: var(--bg-card);
518
- color: var(--text);
519
- padding: 1rem 1.5rem;
520
- border-radius: var(--radius);
521
- box-shadow: var(--shadow);
522
  display: flex;
523
  align-items: center;
524
  gap: 0.75rem;
525
- z-index: 1000;
526
- transform: translateX(150%);
527
- transition: transform 0.3s ease;
528
- }
529
-
530
- .toast.show {
531
- transform: translateX(0);
532
  }
533
 
534
- .toast.success {
535
- border-left: 4px solid var(--success);
 
 
536
  }
537
 
538
- .toast.error {
539
- border-left: 4px solid var(--error);
 
540
  }
541
 
542
- .toast-icon {
543
- font-size: 1.25rem;
 
 
 
544
  }
545
 
546
- .toast.success .toast-icon {
547
- color: var(--success);
 
 
 
 
 
548
  }
549
 
550
- .toast.error .toast-icon {
551
- color: var(--error);
 
 
 
 
 
552
  }
553
 
 
554
  .top-lists {
555
  display: grid;
556
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
557
- gap: 1.5rem;
558
- margin-bottom: 3rem;
559
  }
560
 
561
  .top-list {
562
  background-color: var(--bg-card);
563
  border-radius: var(--radius);
564
- padding: 1.5rem;
565
  box-shadow: var(--shadow);
566
  }
567
 
 
 
 
 
 
 
568
  .top-list-item {
569
  display: flex;
570
  justify-content: space-between;
571
  align-items: center;
572
- padding: 0.75rem 0;
573
  border-bottom: 1px solid var(--border);
574
  }
575
 
@@ -577,20 +429,10 @@
577
  border-bottom: none;
578
  }
579
 
580
- .premium-badge {
581
- background: linear-gradient(135deg, #f59e0b, #f472b6);
582
- color: white;
583
- padding: 0.25rem 0.5rem;
584
- border-radius: 20px;
585
- font-size: 0.75rem;
586
- font-weight: 500;
587
- margin-left: 0.5rem;
588
- }
589
-
590
  footer {
591
  background-color: var(--bg-card);
592
- padding: 2rem 0;
593
- margin-top: 3rem;
594
  border-top: 1px solid var(--border);
595
  }
596
 
@@ -602,7 +444,7 @@
602
 
603
  .footer-links {
604
  display: flex;
605
- gap: 1.5rem;
606
  }
607
 
608
  .footer-links a {
@@ -623,167 +465,42 @@
623
  .built-with a {
624
  color: var(--primary);
625
  text-decoration: none;
 
626
  }
627
 
628
  .built-with a:hover {
629
  text-decoration: underline;
630
  }
631
 
632
- .detail-container {
633
- max-width: 900px;
634
- margin: 0 auto;
 
 
635
  background-color: var(--bg-card);
 
 
636
  border-radius: var(--radius);
637
- overflow: hidden;
638
  box-shadow: var(--shadow);
639
- }
640
-
641
- .detail-gallery {
642
- display: grid;
643
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
644
- gap: 1rem;
645
- padding: 1.5rem;
646
- }
647
-
648
- .detail-image {
649
- width: 100%;
650
- height: 150px;
651
- object-fit: cover;
652
- border-radius: var(--radius);
653
- cursor: pointer;
654
- transition: var(--transition);
655
- }
656
-
657
- .detail-image:hover {
658
- transform: scale(1.05);
659
- }
660
-
661
- .detail-content {
662
- padding: 1.5rem;
663
- }
664
-
665
- .detail-header {
666
- display: flex;
667
- justify-content: space-between;
668
- align-items: flex-start;
669
- margin-bottom: 1rem;
670
- }
671
-
672
- .detail-meta {
673
- color: var(--text-light);
674
- margin-bottom: 1.5rem;
675
- }
676
-
677
- .detail-ratings {
678
- display: grid;
679
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
680
- gap: 1rem;
681
- margin-bottom: 1.5rem;
682
- }
683
-
684
- .rating-bar {
685
- height: 8px;
686
- background-color: var(--border);
687
- border-radius: 4px;
688
- overflow: hidden;
689
- margin-top: 0.25rem;
690
- }
691
-
692
- .rating-fill {
693
- height: 100%;
694
- background-color: var(--primary);
695
- border-radius: 4px;
696
- }
697
-
698
- .detail-text {
699
- line-height: 1.7;
700
- margin-bottom: 1.5rem;
701
- }
702
-
703
- .modal {
704
- position: fixed;
705
- top: 0;
706
- left: 0;
707
- width: 100%;
708
- height: 100%;
709
- background-color: rgba(0, 0, 0, 0.7);
710
  display: flex;
711
- justify-content: center;
712
  align-items: center;
 
713
  z-index: 1000;
714
- opacity: 0;
715
- visibility: hidden;
716
- transition: var(--transition);
717
- }
718
-
719
- .modal.show {
720
- opacity: 1;
721
- visibility: visible;
722
- }
723
-
724
- .modal-content {
725
- max-width: 90%;
726
- max-height: 90%;
727
- position: relative;
728
- }
729
-
730
- .modal-image {
731
- max-width: 100%;
732
- max-height: 90vh;
733
- border-radius: var(--radius);
734
- }
735
-
736
- .modal-close {
737
- position: absolute;
738
- top: 1rem;
739
- right: 1rem;
740
- background-color: rgba(0, 0, 0, 0.5);
741
- color: white;
742
- border: none;
743
- width: 2.5rem;
744
- height: 2.5rem;
745
- border-radius: 50%;
746
- display: flex;
747
- justify-content: center;
748
- align-items: center;
749
- cursor: pointer;
750
- transition: var(--transition);
751
- }
752
-
753
- .modal-close:hover {
754
- background-color: rgba(0, 0, 0, 0.7);
755
- }
756
-
757
- .skeleton {
758
- background: linear-gradient(90deg, var(--border) 25%, var(--bg) 50%, var(--border) 75%);
759
- background-size: 200% 100%;
760
- animation: loading 1.5s infinite;
761
- border-radius: var(--radius);
762
- }
763
-
764
- @keyframes loading {
765
- 0% {
766
- background-position: 200% 0;
767
- }
768
- 100% {
769
- background-position: -200% 0;
770
- }
771
- }
772
-
773
- .skeleton-image {
774
- height: 200px;
775
- width: 100%;
776
  }
777
 
778
- .skeleton-text {
779
- height: 1rem;
780
- margin-bottom: 0.5rem;
781
  }
782
 
783
- .skeleton-text.short {
784
- width: 60%;
 
785
  }
786
 
 
787
  .mobile-nav {
788
  position: fixed;
789
  top: 0;
@@ -791,12 +508,10 @@
791
  width: 100%;
792
  height: 100%;
793
  background-color: var(--bg);
794
- z-index: 200;
795
- display: flex;
796
- flex-direction: column;
797
- padding: 2rem;
798
  transform: translateX(-100%);
799
  transition: var(--transition);
 
800
  }
801
 
802
  .mobile-nav.show {
@@ -807,7 +522,7 @@
807
  display: flex;
808
  justify-content: space-between;
809
  align-items: center;
810
- margin-bottom: 2rem;
811
  }
812
 
813
  .mobile-nav-close {
@@ -821,35 +536,40 @@
821
  .mobile-nav-links {
822
  display: flex;
823
  flex-direction: column;
824
- gap: 1.5rem;
825
  }
826
 
827
  .mobile-nav-links a {
828
  text-decoration: none;
829
  color: var(--text);
830
- font-size: 1.25rem;
831
- font-weight: 500;
832
  }
833
 
834
  .mobile-nav-links a.active {
835
  color: var(--primary);
836
  }
837
 
 
838
  @media (max-width: 768px) {
839
- .nav-links, .header-actions .add-review-btn {
840
- display: none;
841
- }
842
-
843
- .mobile-menu-btn {
844
- display: block;
845
  }
846
 
847
  .hero h1 {
848
- font-size: 2rem;
849
  }
850
 
851
  .hero p {
852
- font-size: 1rem;
 
 
 
 
 
 
 
 
853
  }
854
 
855
  .hero-actions {
@@ -857,18 +577,39 @@
857
  align-items: center;
858
  }
859
 
860
- .form-row {
 
 
 
 
 
 
 
 
 
861
  grid-template-columns: 1fr;
 
862
  }
863
 
864
  .footer-content {
865
  flex-direction: column;
866
- gap: 1.5rem;
867
  text-align: center;
868
  }
869
 
870
- .reviews-grid {
871
- grid-template-columns: 1fr;
 
 
 
 
 
 
 
 
 
 
 
872
  }
873
  }
874
  </style>
@@ -876,25 +617,19 @@
876
  <body>
877
  <header>
878
  <div class="container">
879
- <div class="header-content">
880
- <div class="logo">
881
- <i class="fas fa-cheese"></i>
882
  <span>The Cheesecake Club</span>
883
- </div>
884
- <nav class="nav-links">
885
- <a href="#" class="active">Home</a>
886
- <a href="#">Explore</a>
887
- <a href="#">Top Lists</a>
888
- <a href="#">Premium</a>
889
- </nav>
890
- <div class="header-actions">
891
  <button class="theme-toggle" id="themeToggle">
892
  <i class="fas fa-moon"></i>
893
  </button>
894
- <button class="add-review-btn">
895
  <i class="fas fa-plus"></i>
896
  Add Review
897
- </button>
898
  <button class="mobile-menu-btn" id="mobileMenuBtn">
899
  <i class="fas fa-bars"></i>
900
  </button>
@@ -905,26 +640,26 @@
905
 
906
  <div class="mobile-nav" id="mobileNav">
907
  <div class="mobile-nav-header">
908
- <div class="logo">
909
- <i class="fas fa-cheese"></i>
910
  <span>The Cheesecake Club</span>
 
 
 
 
911
  </div>
912
- <button class="mobile-nav-close" id="mobileNavClose">
913
- <i class="fas fa-times"></i>
914
- </button>
915
  <div class="mobile-nav-links">
916
  <a href="#" class="active">Home</a>
917
  <a href="#">Explore</a>
918
  <a href="#">Top Lists</a>
919
  <a href="#">Add Review</a>
920
- <a href="#">Premium</a>
921
  </div>
922
  </div>
923
 
924
- <div class="hero">
925
  <div class="container">
926
  <h1>Discover the World's Best Cheesecakes</h1>
927
- <p>A community of dessert lovers sharing honest reviews, ratings, and photos of cheesecakes and other sweet treats from around the globe.</p>
928
  <div class="hero-actions">
929
  <button class="btn btn-primary" id="addReviewBtn">
930
  <i class="fas fa-plus"></i>
@@ -936,53 +671,23 @@
936
  </button>
937
  </div>
938
  </div>
939
- </div>
940
-
941
- <main class="container">
942
- <div class="search-bar">
943
- <input type="text" class="search-input" placeholder="Search by dessert, restaurant, city, or review text...">
944
- <button class="search-btn">
945
- <i class="fas fa-search"></i>
946
- </button>
 
 
947
  </div>
948
 
949
- <div class="filters">
950
- <div class="filter-group">
951
- <label class="filter-label">Dessert Type</label>
952
- <select class="filter-select">
953
- <option>All Desserts</option>
954
- <option>Cheesecake Only</option>
955
- <option>Exceptions Only</option>
956
- </select>
957
- </div>
958
- <div class="filter-group">
959
- <label class="filter-label">City</label>
960
- <select class="filter-select">
961
- <option>All Cities</option>
962
- <option>New York</option>
963
- <option>Lisbon</option>
964
- <option>Paris</option>
965
- <option>Tokyo</option>
966
- </select>
967
- </div>
968
- <div class="filter-group">
969
- <label class="filter-label">Min Rating</label>
970
- <select class="filter-select">
971
- <option>Any Rating</option>
972
- <option>9+</option>
973
- <option>8+</option>
974
- <option>7+</option>
975
- <option>6+</option>
976
- </select>
977
- </div>
978
- <div class="filter-group">
979
- <label class="filter-label">Sort By</label>
980
- <select class="filter-select">
981
- <option>Newest First</option>
982
- <option>Highest Rated</option>
983
- <option>Oldest First</option>
984
- </select>
985
- </div>
986
  </div>
987
 
988
  <h2 class="section-title">
@@ -1001,7 +706,7 @@
1001
 
1002
  <div class="top-lists">
1003
  <div class="top-list">
1004
- <h3>Top Rated Cheesecakes</h3>
1005
  <div class="top-list-item">
1006
  <span>New York Cheesecake</span>
1007
  <span class="rating-value">9.8</span>
@@ -1018,38 +723,10 @@
1018
  <span>Basque Burnt Cheesecake</span>
1019
  <span class="rating-value">9.2</span>
1020
  </div>
1021
- <div class="top-list-item">
1022
- <span>Strawberry Swirl Cheesecake</span>
1023
- <span class="rating-value">9.0</span>
1024
- </div>
1025
- </div>
1026
-
1027
- <div class="top-list">
1028
- <h3>Top Rated Exceptions</h3>
1029
- <div class="top-list-item">
1030
- <span>Tiramisu</span>
1031
- <span class="rating-value">9.7</span>
1032
- </div>
1033
- <div class="top-list-item">
1034
- <span>Chocolate Lava Cake</span>
1035
- <span class="rating-value">9.4</span>
1036
- </div>
1037
- <div class="top-list-item">
1038
- <span>Crème Brûlée</span>
1039
- <span class="rating-value">9.2</span>
1040
- </div>
1041
- <div class="top-list-item">
1042
- <span>Apple Pie</span>
1043
- <span class="rating-value">9.0</span>
1044
- </div>
1045
- <div class="top-list-item">
1046
- <span>Panna Cotta</span>
1047
- <span class="rating-value">8.8</span>
1048
- </div>
1049
  </div>
1050
 
1051
  <div class="top-list">
1052
- <h3>By City</h3>
1053
  <div class="top-list-item">
1054
  <span>New York</span>
1055
  <span class="rating-value">9.4</span>
@@ -1066,10 +743,6 @@
1066
  <span>Tokyo</span>
1067
  <span class="rating-value">8.7</span>
1068
  </div>
1069
- <div class="top-list-item">
1070
- <span>London</span>
1071
- <span class="rating-value">8.5</span>
1072
- </div>
1073
  </div>
1074
  </div>
1075
  </main>
@@ -1095,15 +768,6 @@
1095
  <div class="toast-message">Review added successfully!</div>
1096
  </div>
1097
 
1098
- <div class="modal" id="imageModal">
1099
- <div class="modal-content">
1100
- <img class="modal-image" id="modalImage" src="" alt="">
1101
- <button class="modal-close" id="modalClose">
1102
- <i class="fas fa-times"></i>
1103
- </button>
1104
- </div>
1105
- </div>
1106
-
1107
  <script>
1108
  // Sample review data
1109
  const reviews = [
@@ -1145,7 +809,7 @@
1145
  },
1146
  wouldReturn: true,
1147
  tags: ['Caramel', 'Creamy', 'Rich'],
1148
- textReview: 'Incrível! A textura é perfeita, nem muito densa nem muito leve. O caramelo é divino - nem doce demais nem amargo. A combinação com a base de biscoito é perfeita. Definitivamente voltaria só por esta sobremesa.',
1149
  imageUrl: 'https://images.unsplash.com/photo-1524351199678-941a58a3df50?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
1150
  price: 7.80
1151
  },
@@ -1166,7 +830,7 @@
1166
  },
1167
  wouldReturn: true,
1168
  tags: ['Coffee', 'Mascarpone', 'Italian'],
1169
- textReview: 'Um dos melhores tiramisù que já provei. O equilíbrio entre o café e o mascarpone é perfeito. Não é excessivamente doce e tem uma textura incrivelmente leve. Perfeito para terminar uma refeição.',
1170
  imageUrl: 'https://images.unsplash.com/photo-1571877227200-a0d98ea1ae6?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
1171
  price: 9.20
1172
  },
@@ -1187,30 +851,9 @@
1187
  },
1188
  wouldReturn: true,
1189
  tags: ['Oreo', 'Chocolate', 'Creamy'],
1190
- textReview: 'This cheesecake is a chocolate lover\'s dream. The Oreo crust is thick and crunchy, and the filling is perfectly balanced between cream cheese and cookie flavors. The chocolate ganache topping is rich but not overwhelming.',
1191
  imageUrl: 'https://images.unsplash.com/photo-1623334044303-2410217754f3?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
1192
  price: 6.50
1193
- },
1194
- {
1195
- id: 5,
1196
- dessertType: 'cheesecake',
1197
- dessertName: 'Basque Burnt Cheesecake',
1198
- restaurantName: 'La Fromagerie',
1199
- city: 'Paris',
1200
- country: 'France',
1201
- dateEaten: '2023-09-12',
1202
- overallRating: 9.2,
1203
- subRatings: {
1204
- base: 8.5,
1205
- texture: 9.5,
1206
- sweetness: 9.0,
1207
- topping: 8.0
1208
- },
1209
- wouldReturn: true,
1210
- tags: ['Burnt', 'Creamy', 'Rustic'],
1211
- textReview: 'A textura é incrível - cremosa por dentro com aquela crosta caramelizada por fora. Menos doce que um cheesecake tradicional, o que permite que o sabor do queijo realmente brilhe. A apresentação rústica é encantadora.',
1212
- imageUrl: 'https://images.unsplash.com/photo-1569670751316-4d5c5d5b5b5b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
1213
- price: 7.00
1214
  }
1215
  ];
1216
 
@@ -1223,9 +866,7 @@
1223
  const exploreBtn = document.getElementById('exploreBtn');
1224
  const reviewsGrid = document.getElementById('reviewsGrid');
1225
  const toast = document.getElementById('toast');
1226
- const imageModal = document.getElementById('imageModal');
1227
- const modalImage = document.getElementById('modalImage');
1228
- const modalClose = document.getElementById('modalClose');
1229
 
1230
  // Theme toggle functionality
1231
  themeToggle.addEventListener('click', () => {
@@ -1234,7 +875,7 @@
1234
  if (document.body.classList.contains('dark-mode')) {
1235
  icon.classList.remove('fa-moon');
1236
  icon.classList.add('fa-sun');
1237
- localStorage.setItem('theme', 'dark');
1238
  } else {
1239
  icon.classList.remove('fa-sun');
1240
  icon.classList.add('fa-moon');
@@ -1263,17 +904,23 @@
1263
  // Add review button functionality
1264
  addReviewBtn.addEventListener('click', () => {
1265
  showToast('Redirecting to add review form...', 'success');
1266
- // In a real app, this would navigate to the add review page
1267
  });
1268
 
1269
  exploreBtn.addEventListener('click', () => {
1270
  showToast('Loading explore page...', 'success');
1271
- // In a real app, this would navigate to the explore page
 
 
 
 
 
 
 
 
1272
  });
1273
 
1274
  // Show toast notification
1275
  function showToast(message, type) {
1276
- toast.className = `toast ${type}`;
1277
  toast.querySelector('.toast-message').textContent = message;
1278
  toast.classList.add('show');
1279
 
@@ -1337,20 +984,9 @@
1337
 
1338
  // Add click event to review cards
1339
  document.querySelectorAll('.review-card').forEach(card => {
1340
- card.addEventListener('click', (e) => {
1341
- if (!e.target.classList.contains('review-image')) {
1342
- const reviewId = card.getAttribute('data-id');
1343
- showReviewDetail(reviewId);
1344
- }
1345
- });
1346
- });
1347
-
1348
- // Add click event to review images
1349
- document.querySelectorAll('.review-image').forEach(img => {
1350
- img.addEventListener('click', (e) => {
1351
- e.stopPropagation();
1352
- const reviewId = img.closest('.review-card').getAttribute('data-id');
1353
- openImageModal(reviewId);
1354
  });
1355
  });
1356
  }
@@ -1360,32 +996,9 @@
1360
  const review = reviews.find(r => r.id == reviewId);
1361
  if (!review) return;
1362
 
1363
- // In a real app, this would navigate to the review detail page
1364
  showToast(`Loading review: ${review.dessertName}`, 'success');
1365
  }
1366
 
1367
- // Open image modal
1368
- function openImageModal(reviewId) {
1369
- const review = reviews.find(r => r.id == reviewId);
1370
- if (!review) return;
1371
-
1372
- modalImage.src = review.imageUrl;
1373
- modalImage.alt = review.dessertName;
1374
- imageModal.classList.add('show');
1375
- }
1376
-
1377
- // Close image modal
1378
- modalClose.addEventListener('click', () => {
1379
- imageModal.classList.remove('show');
1380
- });
1381
-
1382
- // Close modal when clicking outside the image
1383
- imageModal.addEventListener('click', (e) => {
1384
- if (e.target === imageModal) {
1385
- imageModal.classList.remove('show');
1386
- }
1387
- });
1388
-
1389
  // Initialize the app
1390
  document.addEventListener('DOMContentLoaded', () => {
1391
  renderReviews();
 
7
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
  <style>
9
  :root {
10
+ --primary: #ff6b6b;
11
+ --primary-dark: #ee5a52;
12
+ --secondary: #4ecdc4;
13
+ --accent: #ffd166;
14
+ --text: #2d3748;
15
+ --text-light: #718096;
16
+ --bg: #f8f9fa;
17
  --bg-card: #ffffff;
18
+ --border: #e2e8f0;
19
+ --success: #48bb78;
20
+ --warning: #ed8936;
21
+ --error: #f56565;
22
+ --radius: 16px;
23
+ --shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
24
+ --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
25
  }
26
 
27
  .dark-mode {
28
+ --primary: #ff6b6b;
29
+ --primary-dark: #ee5a52;
30
+ --secondary: #4ecdc4;
31
+ --accent: #ffd166;
32
+ --text: #f7fafc;
33
+ --text-light: #cbd5e0;
34
+ --bg: #1a202c;
35
+ --bg-card: #2d3748;
36
+ --border: #4a5568;
37
+ --shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4);
38
  }
39
 
40
  * {
41
  margin: 0;
42
  padding: 0;
43
  box-sizing: border-box;
44
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
45
  }
46
 
47
  body {
 
49
  color: var(--text);
50
  transition: var(--transition);
51
  line-height: 1.6;
52
+ min-height: 100vh;
53
  }
54
 
55
  .container {
56
  max-width: 1200px;
57
  margin: 0 auto;
58
+ padding: 0 1.5rem;
59
  }
60
 
61
+ /* Header */
62
  header {
63
  background-color: var(--bg-card);
64
+ backdrop-filter: blur(10px);
65
  position: sticky;
66
  top: 0;
67
+ z-index: 1000;
68
+ border-bottom: 1px solid var(--border);
69
  }
70
 
71
+ .nav-container {
72
  display: flex;
73
  justify-content: space-between;
74
  align-items: center;
 
78
  .logo {
79
  display: flex;
80
  align-items: center;
81
+ gap: 0.75rem;
82
  font-weight: 700;
83
  font-size: 1.5rem;
84
  color: var(--primary);
 
 
 
 
 
 
 
 
 
 
 
 
85
  text-decoration: none;
 
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
88
+ .logo-icon {
89
+ font-size: 1.75rem;
 
 
 
 
 
 
90
  }
91
 
92
+ .nav-actions {
93
  display: flex;
94
  align-items: center;
95
  gap: 1rem;
 
102
  cursor: pointer;
103
  font-size: 1.25rem;
104
  transition: var(--transition);
105
+ padding: 0.5rem;
106
+ border-radius: var(--radius);
107
  }
108
 
109
  .theme-toggle:hover {
110
+ background-color: var(--bg);
111
  color: var(--primary);
112
  }
113
 
114
+ .primary-btn {
115
+ background: linear-gradient(135deg, var(--primary), var(--primary-dark));
116
  color: white;
117
  border: none;
118
+ padding: 0.75rem 1.5rem;
119
  border-radius: var(--radius);
120
+ font-weight: 600;
121
  cursor: pointer;
122
  transition: var(--transition);
123
  display: flex;
124
  align-items: center;
125
  gap: 0.5rem;
126
+ text-decoration: none;
127
  }
128
 
129
+ .primary-btn:hover {
130
+ transform: translateY(-2px);
131
+ box-shadow: 0 8px 25px -8px var(--primary);
132
  }
133
 
134
  .mobile-menu-btn {
 
138
  color: var(--text);
139
  font-size: 1.5rem;
140
  cursor: pointer;
141
+ padding: 0.5rem;
142
+ border-radius: var(--radius);
143
  }
144
 
145
+ /* Hero Section */
146
  .hero {
147
+ padding: 4rem 0;
148
  text-align: center;
149
  background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
150
  color: white;
151
+ margin-bottom: 3rem;
 
152
  }
153
 
154
  .hero h1 {
155
+ font-size: 3rem;
156
+ font-weight: 800;
157
+ margin-bottom: 1.5rem;
158
+ line-height: 1.2;
159
  }
160
 
161
  .hero p {
162
  font-size: 1.25rem;
163
  max-width: 600px;
164
+ margin: 0 auto 2rem;
165
+ opacity: 0.95;
166
  }
167
 
168
  .hero-actions {
169
  display: flex;
170
  gap: 1rem;
171
  justify-content: center;
172
+ flex-wrap: wrap;
173
  }
174
 
175
  .btn {
176
+ padding: 0.875rem 2rem;
177
  border-radius: var(--radius);
178
+ font-weight: 600;
179
  cursor: pointer;
180
  transition: var(--transition);
181
  border: none;
182
  display: inline-flex;
183
  align-items: center;
184
  gap: 0.5rem;
185
+ text-decoration: none;
186
  }
187
 
188
  .btn-primary {
 
191
  }
192
 
193
  .btn-primary:hover {
194
+ transform: translateY(-2px);
195
+ box-shadow: 0 8px 25px -8px rgba(255, 255, 255, 0.3);
196
  }
197
 
198
  .btn-secondary {
 
206
  color: var(--primary);
207
  }
208
 
209
+ /* Main Content */
210
+ .main-content {
211
+ padding-bottom: 3rem;
212
+ }
213
+
214
  .section-title {
215
+ font-size: 2rem;
216
+ font-weight: 700;
217
+ margin-bottom: 2rem;
218
  display: flex;
219
  align-items: center;
220
+ gap: 0.75rem;
221
  }
222
 
223
  .section-title i {
224
  color: var(--primary);
225
  }
226
 
227
+ /* Search & Filters */
228
+ .search-container {
229
+ margin-bottom: 2rem;
 
 
230
  }
231
 
232
+ .search-bar {
233
+ display: flex;
234
  background-color: var(--bg-card);
235
  border-radius: var(--radius);
236
  overflow: hidden;
237
  box-shadow: var(--shadow);
 
 
 
 
 
 
238
  }
239
 
240
+ .search-input {
241
+ flex: 1;
242
+ padding: 1rem 1.5rem;
243
+ border: none;
244
+ background-color: var(--bg-card);
245
+ color: var(--text);
246
+ font-size: 1rem;
 
 
 
 
 
 
 
 
247
  }
248
 
249
+ .search-input:focus {
250
+ outline: none;
 
 
251
  }
252
 
253
+ .search-btn {
254
  background-color: var(--primary);
255
  color: white;
256
+ border: none;
257
+ padding: 0 1.5rem;
258
+ cursor: pointer;
259
+ transition: var(--transition);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  }
261
 
262
+ .search-btn:hover {
263
+ background-color: var(--primary-dark);
 
 
 
 
 
264
  }
265
 
266
+ .filters-container {
267
  display: flex;
 
268
  gap: 1rem;
269
+ flex-wrap: wrap;
270
  margin-bottom: 2rem;
 
 
 
 
 
 
 
 
 
 
271
  }
272
 
273
+ .filter-chip {
274
+ background-color: var(--bg-card);
 
 
 
 
 
 
 
 
275
  color: var(--text);
276
+ padding: 0.75rem 1.5rem;
277
+ border-radius: 50px;
 
 
 
 
 
 
 
 
 
 
278
  border: 1px solid var(--border);
279
+ cursor: pointer;
280
+ transition: var(--transition);
281
+ font-weight: 500;
282
  }
283
 
284
+ .filter-chip.active {
285
  background-color: var(--primary);
286
  color: white;
287
+ border-color: var(--primary);
 
 
 
 
 
 
 
 
 
 
 
 
288
  }
289
 
290
+ .filter-chip:hover {
291
+ background-color: var(--bg);
292
  }
293
 
294
+ /* Reviews Grid */
295
+ .reviews-grid {
296
+ display: grid;
297
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
298
+ gap: 2rem;
299
+ margin-bottom: 4rem;
300
  }
301
 
302
+ .review-card {
303
+ background-color: var(--bg-card);
 
304
  border-radius: var(--radius);
305
+ overflow: hidden;
306
+ box-shadow: var(--shadow);
 
307
  transition: var(--transition);
308
  }
309
 
310
+ .review-card:hover {
311
+ transform: translateY(-8px);
312
+ box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.25);
 
 
 
 
 
 
 
 
 
 
 
 
313
  }
314
 
315
+ .review-image {
316
  width: 100%;
317
+ height: 220px;
318
+ object-fit: cover;
 
 
 
 
 
 
 
319
  }
320
 
321
+ .review-content {
322
+ padding: 1.5rem;
 
 
 
323
  }
324
 
325
+ .review-header {
326
  display: flex;
327
+ justify-content: space-between;
328
+ align-items: flex-start;
329
+ margin-bottom: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330
  }
331
 
332
+ .review-title {
333
+ font-size: 1.375rem;
334
+ font-weight: 700;
335
+ margin-bottom: 0.5rem;
 
336
  }
337
 
338
+ .review-meta {
339
+ color: var(--text-light);
340
+ font-size: 0.875rem;
341
+ margin-bottom: 1rem;
 
342
  }
343
 
344
+ .review-badge {
345
  background-color: var(--primary);
346
  color: white;
347
+ padding: 0.375rem 0.75rem;
348
+ border-radius: 20px;
349
+ font-size: 0.75rem;
350
+ font-weight: 600;
351
+ }
352
+
353
+ .review-badge.exception {
354
+ background-color: var(--secondary);
355
+ }
356
+
357
+ .rating {
 
 
 
 
 
 
 
 
 
 
 
 
358
  display: flex;
359
  align-items: center;
360
  gap: 0.75rem;
361
+ margin-bottom: 1rem;
 
 
 
 
 
 
362
  }
363
 
364
+ .rating-stars {
365
+ color: var(--accent);
366
+ display: flex;
367
+ gap: 0.125rem;
368
  }
369
 
370
+ .rating-value {
371
+ font-weight: 700;
372
+ font-size: 1.125rem;
373
  }
374
 
375
+ .review-tags {
376
+ display: flex;
377
+ flex-wrap: wrap;
378
+ gap: 0.5rem;
379
+ margin-bottom: 1rem;
380
  }
381
 
382
+ .tag {
383
+ background-color: var(--bg);
384
+ color: var(--text);
385
+ padding: 0.375rem 0.75rem;
386
+ border-radius: 20px;
387
+ font-size: 0.75rem;
388
+ font-weight: 500;
389
  }
390
 
391
+ .review-preview {
392
+ color: var(--text-light);
393
+ font-size: 0.875rem;
394
+ display: -webkit-box;
395
+ -webkit-line-clamp: 3;
396
+ -webkit-box-orient: vertical;
397
+ overflow: hidden;
398
  }
399
 
400
+ /* Top Lists */
401
  .top-lists {
402
  display: grid;
403
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
404
+ gap: 2rem;
 
405
  }
406
 
407
  .top-list {
408
  background-color: var(--bg-card);
409
  border-radius: var(--radius);
410
+ padding: 2rem;
411
  box-shadow: var(--shadow);
412
  }
413
 
414
+ .top-list h3 {
415
+ font-size: 1.25rem;
416
+ font-weight: 700;
417
+ margin-bottom: 1.5rem;
418
+ }
419
+
420
  .top-list-item {
421
  display: flex;
422
  justify-content: space-between;
423
  align-items: center;
424
+ padding: 1rem 0;
425
  border-bottom: 1px solid var(--border);
426
  }
427
 
 
429
  border-bottom: none;
430
  }
431
 
432
+ /* Footer */
 
 
 
 
 
 
 
 
 
433
  footer {
434
  background-color: var(--bg-card);
435
+ padding: 3rem 0;
 
436
  border-top: 1px solid var(--border);
437
  }
438
 
 
444
 
445
  .footer-links {
446
  display: flex;
447
+ gap: 2rem;
448
  }
449
 
450
  .footer-links a {
 
465
  .built-with a {
466
  color: var(--primary);
467
  text-decoration: none;
468
+ font-weight: 600;
469
  }
470
 
471
  .built-with a:hover {
472
  text-decoration: underline;
473
  }
474
 
475
+ /* Toast */
476
+ .toast {
477
+ position: fixed;
478
+ bottom: 2rem;
479
+ right: 2rem;
480
  background-color: var(--bg-card);
481
+ color: var(--text);
482
+ padding: 1rem 1.5rem;
483
  border-radius: var(--radius);
 
484
  box-shadow: var(--shadow);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
  display: flex;
 
486
  align-items: center;
487
+ gap: 0.75rem;
488
  z-index: 1000;
489
+ transform: translateX(150%);
490
+ transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
491
+ border-left: 4px solid var(--success);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492
  }
493
 
494
+ .toast.show {
495
+ transform: translateX(0);
 
496
  }
497
 
498
+ .toast-icon {
499
+ font-size: 1.25rem;
500
+ color: var(--success);
501
  }
502
 
503
+ /* Mobile Navigation */
504
  .mobile-nav {
505
  position: fixed;
506
  top: 0;
 
508
  width: 100%;
509
  height: 100%;
510
  background-color: var(--bg);
511
+ z-index: 2000;
 
 
 
512
  transform: translateX(-100%);
513
  transition: var(--transition);
514
+ padding: 2rem;
515
  }
516
 
517
  .mobile-nav.show {
 
522
  display: flex;
523
  justify-content: space-between;
524
  align-items: center;
525
+ margin-bottom: 3rem;
526
  }
527
 
528
  .mobile-nav-close {
 
536
  .mobile-nav-links {
537
  display: flex;
538
  flex-direction: column;
539
+ gap: 2rem;
540
  }
541
 
542
  .mobile-nav-links a {
543
  text-decoration: none;
544
  color: var(--text);
545
+ font-size: 1.5rem;
546
+ font-weight: 600;
547
  }
548
 
549
  .mobile-nav-links a.active {
550
  color: var(--primary);
551
  }
552
 
553
+ /* Responsive Design */
554
  @media (max-width: 768px) {
555
+ .container {
556
+ padding: 0 1rem;
 
 
 
 
557
  }
558
 
559
  .hero h1 {
560
+ font-size: 2.25rem;
561
  }
562
 
563
  .hero p {
564
+ font-size: 1.125rem;
565
+ }
566
+
567
+ .nav-actions .primary-btn {
568
+ display: none;
569
+ }
570
+
571
+ .mobile-menu-btn {
572
+ display: block;
573
  }
574
 
575
  .hero-actions {
 
577
  align-items: center;
578
  }
579
 
580
+ .btn {
581
+ width: 100%;
582
+ justify-content: center;
583
+ }
584
+
585
+ .filters-container {
586
+ justify-content: center;
587
+ }
588
+
589
+ .reviews-grid {
590
  grid-template-columns: 1fr;
591
+ gap: 1.5rem;
592
  }
593
 
594
  .footer-content {
595
  flex-direction: column;
596
+ gap: 2rem;
597
  text-align: center;
598
  }
599
 
600
+ .footer-links {
601
+ flex-direction: column;
602
+ gap: 1rem;
603
+ }
604
+ }
605
+
606
+ @media (max-width: 480px) {
607
+ .hero {
608
+ padding: 3rem 0;
609
+ }
610
+
611
+ .hero h1 {
612
+ font-size: 2rem;
613
  }
614
  }
615
  </style>
 
617
  <body>
618
  <header>
619
  <div class="container">
620
+ <div class="nav-container">
621
+ <a href="#" class="logo">
622
+ <i class="fas fa-cheese logo-icon"></i>
623
  <span>The Cheesecake Club</span>
624
+ </a>
625
+ <div class="nav-actions">
 
 
 
 
 
 
626
  <button class="theme-toggle" id="themeToggle">
627
  <i class="fas fa-moon"></i>
628
  </button>
629
+ <a href="#" class="primary-btn">
630
  <i class="fas fa-plus"></i>
631
  Add Review
632
+ </a>
633
  <button class="mobile-menu-btn" id="mobileMenuBtn">
634
  <i class="fas fa-bars"></i>
635
  </button>
 
640
 
641
  <div class="mobile-nav" id="mobileNav">
642
  <div class="mobile-nav-header">
643
+ <a href="#" class="logo">
644
+ <i class="fas fa-cheese logo-icon"></i>
645
  <span>The Cheesecake Club</span>
646
+ </a>
647
+ <button class="mobile-nav-close" id="mobileNavClose">
648
+ <i class="fas fa-times"></i>
649
+ </button>
650
  </div>
 
 
 
651
  <div class="mobile-nav-links">
652
  <a href="#" class="active">Home</a>
653
  <a href="#">Explore</a>
654
  <a href="#">Top Lists</a>
655
  <a href="#">Add Review</a>
 
656
  </div>
657
  </div>
658
 
659
+ <section class="hero">
660
  <div class="container">
661
  <h1>Discover the World's Best Cheesecakes</h1>
662
+ <p>A community of dessert lovers sharing honest reviews, ratings, and photos of cheesecakes from around the globe.</p>
663
  <div class="hero-actions">
664
  <button class="btn btn-primary" id="addReviewBtn">
665
  <i class="fas fa-plus"></i>
 
671
  </button>
672
  </div>
673
  </div>
674
+ </section>
675
+
676
+ <main class="container main-content">
677
+ <div class="search-container">
678
+ <div class="search-bar">
679
+ <input type="text" class="search-input" placeholder="Search by dessert, restaurant, or city...">
680
+ <button class="search-btn">
681
+ <i class="fas fa-search"></i>
682
+ </button>
683
+ </div>
684
  </div>
685
 
686
+ <div class="filters-container">
687
+ <div class="filter-chip active">All Desserts</div>
688
+ <div class="filter-chip">Cheesecake</div>
689
+ <div class="filter-chip">Exceptions</div>
690
+ <div class="filter-chip">Top Rated</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
691
  </div>
692
 
693
  <h2 class="section-title">
 
706
 
707
  <div class="top-lists">
708
  <div class="top-list">
709
+ <h3>Top Cheesecakes</h3>
710
  <div class="top-list-item">
711
  <span>New York Cheesecake</span>
712
  <span class="rating-value">9.8</span>
 
723
  <span>Basque Burnt Cheesecake</span>
724
  <span class="rating-value">9.2</span>
725
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
726
  </div>
727
 
728
  <div class="top-list">
729
+ <h3>Top Cities</h3>
730
  <div class="top-list-item">
731
  <span>New York</span>
732
  <span class="rating-value">9.4</span>
 
743
  <span>Tokyo</span>
744
  <span class="rating-value">8.7</span>
745
  </div>
 
 
 
 
746
  </div>
747
  </div>
748
  </main>
 
768
  <div class="toast-message">Review added successfully!</div>
769
  </div>
770
 
 
 
 
 
 
 
 
 
 
771
  <script>
772
  // Sample review data
773
  const reviews = [
 
809
  },
810
  wouldReturn: true,
811
  tags: ['Caramel', 'Creamy', 'Rich'],
812
+ textReview: 'Incrível! A textura é perfeita, nem muito densa nem muito leve. O caramelo é divino - nem doce demais nem amargo. A combinação com a base de biscoito é perfeita.',
813
  imageUrl: 'https://images.unsplash.com/photo-1524351199678-941a58a3df50?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
814
  price: 7.80
815
  },
 
830
  },
831
  wouldReturn: true,
832
  tags: ['Coffee', 'Mascarpone', 'Italian'],
833
+ textReview: 'Um dos melhores tiramisù que já provei. O equilíbrio entre o café e o mascarpone é perfeito. Não é excessivamente doce e tem uma textura incrivelmente leve.',
834
  imageUrl: 'https://images.unsplash.com/photo-1571877227200-a0d98ea1ae6?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
835
  price: 9.20
836
  },
 
851
  },
852
  wouldReturn: true,
853
  tags: ['Oreo', 'Chocolate', 'Creamy'],
854
+ textReview: 'This cheesecake is a chocolate lover\'s dream. The Oreo crust is thick and crunchy, and the filling is perfectly balanced.',
855
  imageUrl: 'https://images.unsplash.com/photo-1623334044303-2410217754f3?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80',
856
  price: 6.50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
857
  }
858
  ];
859
 
 
866
  const exploreBtn = document.getElementById('exploreBtn');
867
  const reviewsGrid = document.getElementById('reviewsGrid');
868
  const toast = document.getElementById('toast');
869
+ const filterChips = document.querySelectorAll('.filter-chip');
 
 
870
 
871
  // Theme toggle functionality
872
  themeToggle.addEventListener('click', () => {
 
875
  if (document.body.classList.contains('dark-mode')) {
876
  icon.classList.remove('fa-moon');
877
  icon.classList.add('fa-sun');
878
+ localStorage.setItem('theme', 'dark');
879
  } else {
880
  icon.classList.remove('fa-sun');
881
  icon.classList.add('fa-moon');
 
904
  // Add review button functionality
905
  addReviewBtn.addEventListener('click', () => {
906
  showToast('Redirecting to add review form...', 'success');
 
907
  });
908
 
909
  exploreBtn.addEventListener('click', () => {
910
  showToast('Loading explore page...', 'success');
911
+ });
912
+
913
+ // Filter chip functionality
914
+ filterChips.forEach(chip => {
915
+ chip.addEventListener('click', () => {
916
+ filterChips.forEach(c => c.classList.remove('active'));
917
+ chip.classList.add('active');
918
+ showToast(`Filtered by: ${chip.textContent}`, 'success');
919
+ });
920
  });
921
 
922
  // Show toast notification
923
  function showToast(message, type) {
 
924
  toast.querySelector('.toast-message').textContent = message;
925
  toast.classList.add('show');
926
 
 
984
 
985
  // Add click event to review cards
986
  document.querySelectorAll('.review-card').forEach(card => {
987
+ card.addEventListener('click', () => {
988
+ const reviewId = card.getAttribute('data-id');
989
+ showReviewDetail(reviewId);
 
 
 
 
 
 
 
 
 
 
 
990
  });
991
  });
992
  }
 
996
  const review = reviews.find(r => r.id == reviewId);
997
  if (!review) return;
998
 
 
999
  showToast(`Loading review: ${review.dessertName}`, 'success');
1000
  }
1001
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1002
  // Initialize the app
1003
  document.addEventListener('DOMContentLoaded', () => {
1004
  renderReviews();