AdityaAdaki commited on
Commit
e8298b2
·
1 Parent(s): a8fd63c

design rework

Browse files
Files changed (3) hide show
  1. static/player.js +77 -1
  2. static/style.css +128 -672
  3. templates/index.html +27 -0
static/player.js CHANGED
@@ -971,4 +971,80 @@ function escapeHtml(unsafe) {
971
  .replace(/>/g, ">")
972
  .replace(/"/g, """)
973
  .replace(/'/g, "'");
974
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
971
  .replace(/>/g, ">")
972
  .replace(/"/g, """)
973
  .replace(/'/g, "'");
974
+ }
975
+
976
+ // Mobile navigation handling
977
+ function initializeMobileNav() {
978
+ const menuToggle = document.getElementById('menu-toggle');
979
+ const sidebar = document.querySelector('.sidebar');
980
+ const overlay = document.getElementById('sidebar-overlay');
981
+ const mobileNavLinks = document.querySelectorAll('.mobile-nav a');
982
+
983
+ menuToggle.addEventListener('click', toggleSidebar);
984
+ overlay.addEventListener('click', closeSidebar);
985
+
986
+ mobileNavLinks.forEach(link => {
987
+ link.addEventListener('click', (e) => {
988
+ e.preventDefault();
989
+ const view = e.currentTarget.dataset.view;
990
+ switchView(view);
991
+ closeSidebar();
992
+ });
993
+ });
994
+
995
+ // Handle swipe gestures
996
+ let touchStartX = 0;
997
+ let touchEndX = 0;
998
+
999
+ document.addEventListener('touchstart', e => {
1000
+ touchStartX = e.changedTouches[0].screenX;
1001
+ }, false);
1002
+
1003
+ document.addEventListener('touchend', e => {
1004
+ touchEndX = e.changedTouches[0].screenX;
1005
+ handleSwipe();
1006
+ }, false);
1007
+
1008
+ function handleSwipe() {
1009
+ const swipeThreshold = 50;
1010
+ const diff = touchEndX - touchStartX;
1011
+
1012
+ if (Math.abs(diff) < swipeThreshold) return;
1013
+
1014
+ if (diff > 0) { // Swipe right
1015
+ if (touchStartX < 30) { // Only if swipe starts near the left edge
1016
+ openSidebar();
1017
+ }
1018
+ } else { // Swipe left
1019
+ closeSidebar();
1020
+ }
1021
+ }
1022
+ }
1023
+
1024
+ function toggleSidebar() {
1025
+ const sidebar = document.querySelector('.sidebar');
1026
+ const overlay = document.getElementById('sidebar-overlay');
1027
+ sidebar.classList.toggle('active');
1028
+ overlay.classList.toggle('active');
1029
+ }
1030
+
1031
+ function openSidebar() {
1032
+ const sidebar = document.querySelector('.sidebar');
1033
+ const overlay = document.getElementById('sidebar-overlay');
1034
+ sidebar.classList.add('active');
1035
+ overlay.classList.add('active');
1036
+ }
1037
+
1038
+ function closeSidebar() {
1039
+ const sidebar = document.querySelector('.sidebar');
1040
+ const overlay = document.getElementById('sidebar-overlay');
1041
+ sidebar.classList.remove('active');
1042
+ overlay.classList.remove('active');
1043
+ }
1044
+
1045
+ // Update the initialization code
1046
+ document.addEventListener('DOMContentLoaded', function() {
1047
+ initializeAudioPlayer();
1048
+ initializeMobileNav();
1049
+ // ... rest of your initialization code
1050
+ });
static/style.css CHANGED
@@ -1,3 +1,11 @@
 
 
 
 
 
 
 
 
1
  * {
2
  margin: 0;
3
  padding: 0;
@@ -6,745 +14,193 @@
6
 
7
  body {
8
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
9
- background: #f0f2f5;
10
  color: #333;
 
11
  }
12
 
13
  .container {
14
  display: grid;
15
- grid-template-columns: 250px 1fr;
16
- grid-template-rows: 1fr auto;
17
- gap: 1rem;
18
  height: 100vh;
19
- padding: 1rem;
20
- }
21
-
22
- .music-player {
23
- grid-column: 1 / -1;
24
- background: white;
25
- border-radius: 12px;
26
- padding: 2rem;
27
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
28
- }
29
-
30
- .player-header h1 {
31
- margin-bottom: 2rem;
32
- color: #1a73e8;
33
- }
34
-
35
- .now-playing {
36
- display: flex;
37
- align-items: center;
38
- gap: 2rem;
39
- margin-bottom: 2rem;
40
  }
41
 
42
- #album-art {
43
- width: 200px;
44
- height: 200px;
45
- border-radius: 8px;
46
- object-fit: cover;
 
 
 
 
 
47
  }
48
 
49
- .track-info {
50
- flex: 1;
51
- cursor: pointer;
52
  display: flex;
53
- flex-direction: column;
54
- gap: 0.25rem;
55
- }
56
-
57
- #track-title {
58
- font-size: 1.5rem;
59
- font-weight: bold;
60
- margin-bottom: 0.5rem;
61
  }
62
 
63
- #track-artist, #track-album {
64
  color: #666;
65
- margin-bottom: 0.5rem;
66
- }
67
-
68
- .player-controls {
69
- width: 100%;
70
- }
71
-
72
- .time-control {
73
- display: flex;
74
- align-items: center;
75
- gap: 1rem;
76
- margin-bottom: 1rem;
77
- }
78
-
79
- #seek-slider {
80
- flex: 1;
81
- }
82
-
83
- .control-buttons {
84
- display: flex;
85
- align-items: center;
86
- justify-content: center;
87
- gap: 1rem;
88
- }
89
-
90
- button {
91
- background: none;
92
- border: none;
93
- cursor: pointer;
94
- font-size: 1.5rem;
95
- color: #1a73e8;
96
- padding: 0.5rem;
97
- border-radius: 50%;
98
- transition: background-color 0.3s;
99
- }
100
-
101
- button:hover {
102
- background-color: #f0f2f5;
103
- }
104
-
105
- .volume-control {
106
  display: flex;
 
107
  align-items: center;
108
- gap: 0.5rem;
109
- margin-left: 2rem;
110
  }
111
 
112
- #volume-slider {
113
- width: 100px;
 
114
  }
115
 
116
  .sidebar {
117
- background: white;
118
- border-radius: 12px;
119
  padding: 1rem;
120
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
121
- }
122
-
123
- .nav-menu, .playlist-menu {
124
- list-style: none;
125
- padding: 0;
126
- margin: 1rem 0;
127
- }
128
-
129
- .nav-menu li a, .playlist-menu li a {
130
- display: block;
131
- padding: 0.75rem 1rem;
132
- color: #333;
133
- text-decoration: none;
134
- border-radius: 6px;
135
- transition: background-color 0.3s;
136
- }
137
-
138
- .nav-menu li a:hover, .playlist-menu li a:hover {
139
- background-color: #f0f2f5;
140
- }
141
-
142
- .nav-menu li a.active {
143
- background-color: #e8f0fe;
144
- color: #1a73e8;
145
- }
146
-
147
- .btn-new-playlist {
148
- width: 100%;
149
- padding: 0.75rem;
150
- background: none;
151
- border: 1px dashed #1a73e8;
152
- color: #1a73e8;
153
- border-radius: 6px;
154
- cursor: pointer;
155
- transition: all 0.3s;
156
- }
157
-
158
- .btn-new-playlist:hover {
159
- background: #e8f0fe;
160
  }
161
 
162
  .main-content {
163
- background: white;
164
- border-radius: 12px;
165
  padding: 1rem;
166
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
167
  overflow-y: auto;
 
168
  }
169
 
170
- .view-header {
171
- display: flex;
172
- justify-content: space-between;
173
- align-items: center;
174
- margin-bottom: 2rem;
175
- }
176
-
177
- .search-box {
178
- position: relative;
179
- }
180
-
181
- .search-box input {
182
- padding: 0.5rem 2rem 0.5rem 1rem;
183
- border: 1px solid #ddd;
184
- border-radius: 20px;
185
- width: 200px;
186
- }
187
-
188
- .search-box i {
189
- position: absolute;
190
- right: 0.75rem;
191
- top: 50%;
192
- transform: translateY(-50%);
193
- color: #666;
194
- }
195
-
196
- .album-grid, .artist-grid {
197
- display: grid;
198
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
199
- gap: 1.5rem;
200
  padding: 1rem;
201
- }
202
-
203
- .album-card, .artist-card {
204
- text-align: center;
205
- cursor: pointer;
206
- transition: transform 0.3s;
207
- }
208
-
209
- .album-card:hover, .artist-card:hover {
210
- transform: translateY(-5px);
211
- }
212
-
213
- .album-art, .artist-image {
214
- width: 180px;
215
- height: 180px;
216
- border-radius: 8px;
217
- margin-bottom: 0.5rem;
218
- object-fit: cover;
219
- }
220
-
221
- .track-list {
222
  display: flex;
223
- flex-direction: column;
224
- gap: 0.5rem;
225
- }
226
-
227
- .music-item {
228
- display: flex;
229
- justify-content: space-between;
230
  align-items: center;
231
- padding: 0.75rem;
232
- border-radius: 6px;
233
- transition: background-color 0.3s;
234
- }
235
-
236
- .music-item:hover {
237
- background-color: #f0f2f5;
238
- }
239
-
240
- .music-item.playing {
241
- background-color: #e8f0fe;
242
- color: #1a73e8;
243
- }
244
-
245
- input[type="range"] {
246
- -webkit-appearance: none;
247
- appearance: none;
248
- height: 5px;
249
- background: #ddd;
250
- border-radius: 5px;
251
- cursor: pointer;
252
- }
253
-
254
- input[type="range"]::-webkit-slider-thumb {
255
- -webkit-appearance: none;
256
- width: 15px;
257
- height: 15px;
258
- background: #1a73e8;
259
- border-radius: 50%;
260
- }
261
-
262
- .modal {
263
- display: none;
264
- position: fixed;
265
- top: 0;
266
- left: 0;
267
- width: 100%;
268
- height: 100%;
269
- background: rgba(0, 0, 0, 0.5);
270
- align-items: center;
271
- justify-content: center;
272
- }
273
-
274
- .modal-content {
275
- background: white;
276
- padding: 2rem;
277
- border-radius: 12px;
278
- width: 400px;
279
- }
280
-
281
- .modal-content input {
282
- width: 100%;
283
- padding: 0.75rem;
284
- margin: 1rem 0;
285
- border: 1px solid #ddd;
286
- border-radius: 6px;
287
- }
288
-
289
- .modal-buttons {
290
- display: flex;
291
- justify-content: flex-end;
292
  gap: 1rem;
 
293
  }
294
 
295
- .modal-buttons button {
296
- padding: 0.5rem 1rem;
297
- border-radius: 6px;
298
- cursor: pointer;
299
- }
300
-
301
- #save-playlist {
302
- background: #1a73e8;
303
- color: white;
304
- border: none;
305
- }
306
-
307
- #cancel-playlist {
308
- background: none;
309
- border: 1px solid #ddd;
310
- }
311
-
312
- .track-actions {
313
- display: flex;
314
- align-items: center;
315
- }
316
-
317
- .track-name {
318
- font-weight: 500;
319
- }
320
-
321
- .track-artist {
322
- color: #666;
323
- font-size: 0.9em;
324
- }
325
-
326
- .playlist-menu-popup {
327
- background: white;
328
- border-radius: 8px;
329
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
330
- z-index: 1000;
331
- min-width: 200px;
332
- }
333
-
334
- .menu-items {
335
- padding: 0.5rem;
336
- }
337
-
338
- .menu-item {
339
- padding: 0.75rem 1rem;
340
- cursor: pointer;
341
- border-radius: 4px;
342
  display: flex;
343
  align-items: center;
344
- gap: 0.5rem;
345
- }
346
-
347
- .menu-item:hover {
348
- background-color: #f0f2f5;
349
- }
350
-
351
- .notification {
352
- position: fixed;
353
- bottom: 20px;
354
- right: 20px;
355
- background: #1a73e8;
356
- color: white;
357
- padding: 0.75rem 1.5rem;
358
- border-radius: 4px;
359
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
360
- animation: slide-in 0.3s ease-out;
361
- z-index: 1000;
362
- }
363
-
364
- .notification.fade-out {
365
- animation: fade-out 0.3s ease-out;
366
- }
367
-
368
- .playlist-grid {
369
- display: grid;
370
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
371
- gap: 1.5rem;
372
- padding: 1rem;
373
- }
374
-
375
- .playlist-card {
376
- background: white;
377
- border-radius: 8px;
378
- padding: 1rem;
379
- text-align: center;
380
- cursor: pointer;
381
- position: relative;
382
- transition: transform 0.3s;
383
- }
384
-
385
- .playlist-card:hover {
386
- transform: translateY(-5px);
387
  }
388
 
389
- .playlist-art {
390
- width: 150px;
391
- height: 150px;
392
- background: #f0f2f5;
393
  border-radius: 8px;
394
- margin: 0 auto 1rem;
395
- display: flex;
396
- align-items: center;
397
- justify-content: center;
398
- }
399
-
400
- .playlist-art i {
401
- font-size: 3rem;
402
- color: #1a73e8;
403
- }
404
-
405
- .delete-playlist {
406
- position: absolute;
407
- top: 0.5rem;
408
- right: 0.5rem;
409
- background: none;
410
- border: none;
411
- color: #666;
412
- padding: 0.5rem;
413
- cursor: pointer;
414
- opacity: 0;
415
- transition: opacity 0.3s;
416
  }
417
 
418
- .playlist-card:hover .delete-playlist {
419
- opacity: 1;
420
- }
 
 
421
 
422
- @keyframes slide-in {
423
- from {
424
- transform: translateX(100%);
425
- opacity: 0;
426
  }
427
- to {
428
- transform: translateX(0);
429
- opacity: 1;
 
 
 
 
 
 
430
  }
431
- }
432
 
433
- @keyframes fade-out {
434
- from {
435
  transform: translateX(0);
436
- opacity: 1;
437
- }
438
- to {
439
- transform: translateX(100%);
440
- opacity: 0;
441
  }
442
- }
443
-
444
- .menu-trigger {
445
- padding: 0.5rem;
446
- opacity: 0;
447
- transition: opacity 0.3s;
448
- color: #666;
449
- }
450
-
451
- .music-item:hover .menu-trigger {
452
- opacity: 1;
453
- }
454
-
455
- .context-menu {
456
- background: white;
457
- border-radius: 8px;
458
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
459
- z-index: 1000;
460
- min-width: 200px;
461
- overflow: hidden;
462
- }
463
-
464
- .menu-items {
465
- padding: 0.5rem 0;
466
- }
467
-
468
- .menu-item {
469
- padding: 0.75rem 1rem;
470
- cursor: pointer;
471
- display: flex;
472
- align-items: center;
473
- gap: 0.75rem;
474
- transition: background-color 0.2s;
475
- }
476
-
477
- .menu-item:hover {
478
- background-color: #f0f2f5;
479
- }
480
-
481
- .menu-item i {
482
- width: 20px;
483
- text-align: center;
484
- color: #666;
485
- }
486
-
487
- .menu-separator {
488
- height: 1px;
489
- background-color: #eee;
490
- margin: 0.5rem 0;
491
- }
492
-
493
- .lyrics-container {
494
- flex: 1;
495
- max-width: 400px;
496
- margin-left: 2rem;
497
- display: flex;
498
- flex-direction: column;
499
- max-height: 200px;
500
- }
501
-
502
- .lyrics-header {
503
- display: flex;
504
- justify-content: space-between;
505
- align-items: center;
506
- margin-bottom: 1rem;
507
- }
508
-
509
- .lyrics-toggle {
510
- background: none;
511
- border: 1px solid #ddd;
512
- padding: 0.5rem 1rem;
513
- border-radius: 4px;
514
- font-size: 0.9rem;
515
- }
516
-
517
- .lyrics-content {
518
- flex: 1;
519
- overflow-y: auto;
520
- padding-right: 1rem;
521
- line-height: 1.6;
522
- scroll-behavior: smooth;
523
- padding: 1rem;
524
- }
525
-
526
- .lyrics-line {
527
- margin-bottom: 0.5rem;
528
- transition: all 0.3s ease;
529
- cursor: pointer;
530
- padding: 0.5rem 1rem;
531
- border-radius: 4px;
532
- opacity: 0.7;
533
- }
534
-
535
- .lyrics-line:hover {
536
- background-color: #f0f2f5;
537
- opacity: 1;
538
- }
539
-
540
- .lyrics-line.active {
541
- color: #1a73e8;
542
- font-weight: bold;
543
- opacity: 1;
544
- background-color: #e8f0fe;
545
- }
546
-
547
- .playlist-header {
548
- display: flex;
549
- justify-content: space-between;
550
- align-items: center;
551
- padding: 1rem;
552
- background: #f8f9fa;
553
- border-radius: 8px;
554
- margin-bottom: 1rem;
555
- }
556
-
557
- .playlist-info {
558
- display: flex;
559
- align-items: center;
560
- gap: 1rem;
561
- }
562
 
563
- .playlist-icon {
564
- font-size: 2.5rem;
565
- color: #1a73e8;
566
- background: #e8f0fe;
567
- padding: 1rem;
568
- border-radius: 8px;
569
- }
570
-
571
- .play-playlist {
572
- background: #1a73e8;
573
- color: white;
574
- padding: 0.75rem 1.5rem;
575
- border-radius: 20px;
576
- font-size: 1rem;
577
- }
578
-
579
- .play-playlist:hover {
580
- background: #1557b0;
581
- }
582
-
583
- .playlist-count {
584
- color: #666;
585
- font-size: 0.9em;
586
- margin-left: 0.5rem;
587
- }
588
-
589
- #playlist-list a {
590
- display: flex;
591
- align-items: center;
592
- justify-content: space-between;
593
- }
594
-
595
- #playlist-list i {
596
- margin-right: 0.5rem;
597
- }
598
-
599
- .album-art-container, .artist-art-container {
600
- position: relative;
601
- width: 180px;
602
- height: 180px;
603
- margin-bottom: 0.5rem;
604
- }
605
 
606
- .album-art, .artist-image {
607
- width: 100%;
608
- height: 100%;
609
- border-radius: 8px;
610
- object-fit: cover;
611
- }
612
 
613
- .play-overlay {
614
- position: absolute;
615
- top: 50%;
616
- left: 50%;
617
- transform: translate(-50%, -50%);
618
- background: rgba(26, 115, 232, 0.9);
619
- color: white;
620
- width: 50px;
621
- height: 50px;
622
- border-radius: 50%;
623
- display: flex;
624
- align-items: center;
625
- justify-content: center;
626
- opacity: 0;
627
- transition: opacity 0.3s;
628
- cursor: pointer;
629
- border: none;
630
- font-size: 1.2rem;
631
- }
632
 
633
- .album-art-container:hover .play-overlay,
634
- .artist-art-container:hover .play-overlay {
635
- opacity: 1;
636
- }
637
 
638
- .album-info, .artist-info {
639
- cursor: pointer;
640
- }
641
 
642
- .album-card, .artist-card {
643
- display: flex;
644
- flex-direction: column;
645
- align-items: center;
646
- text-align: center;
647
- }
648
 
649
- .artist-image {
650
- background-color: #e8f0fe;
651
- }
 
 
 
 
 
 
 
 
 
 
 
 
652
 
653
- .artist-image[src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgMjAwIDIwMCI+PHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIGZpbGw9IiNlOWVjZWYiLz48dGV4dCB4PSI1MCUiIHk9IjUwJSIgc3R5bGU9ImZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAyMHB4OyBmaWxsOiAjNmM3NTdkOyBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlOyB0ZXh0LWFuY2hvcjogbWlkZGxlOyI+Tm8gQWxidW0gQXJ0PC90ZXh0Pjwvc3ZnPg=="] {
654
- background: #e8f0fe;
655
- padding: 2rem;
656
- }
 
 
 
 
 
 
 
657
 
658
- .existing-playlists {
659
- max-height: 200px;
660
- overflow-y: auto;
661
- margin-bottom: 1rem;
662
- border-bottom: 1px solid #eee;
663
  }
664
 
665
- .existing-playlist-item {
666
  padding: 0.75rem;
667
- cursor: pointer;
668
- display: flex;
669
- align-items: center;
670
- gap: 0.5rem;
671
- border-radius: 4px;
672
- transition: background-color 0.2s;
673
- }
674
-
675
- .existing-playlist-item:hover {
676
- background-color: #f0f2f5;
677
- }
678
-
679
- .existing-playlist-item i {
680
- color: #1a73e8;
681
- }
682
-
683
- .new-playlist-section {
684
- padding-top: 1rem;
685
- }
686
-
687
- .new-playlist-section h3 {
688
- margin-bottom: 0.75rem;
689
- font-size: 1rem;
690
- color: #666;
691
- }
692
-
693
- .album-header {
694
- padding: 2rem;
695
- margin-bottom: 2rem;
696
- background: #f8f9fa;
697
- border-radius: 12px;
698
- }
699
-
700
- .album-info-large {
701
- display: flex;
702
- gap: 2rem;
703
- align-items: flex-start;
704
- }
705
-
706
- .album-art-large {
707
- width: 200px;
708
- height: 200px;
709
  border-radius: 8px;
710
- object-fit: cover;
711
- }
712
-
713
- .album-details {
714
- flex: 1;
715
- }
716
-
717
- .album-details h2 {
718
- margin-bottom: 0.5rem;
719
- font-size: 2rem;
720
- }
721
-
722
- .album-details p {
723
- color: #666;
724
- margin-bottom: 0.5rem;
725
  }
726
 
727
- .play-album-btn {
728
- margin-top: 1rem;
729
- background: #1a73e8;
730
- color: white;
731
- padding: 0.75rem 1.5rem;
732
- border-radius: 20px;
733
- font-size: 1rem;
734
  }
735
 
736
- .play-album-btn:hover {
737
- background: #1557b0;
 
738
  }
739
 
740
- .track-number {
741
- color: #666;
742
- margin-right: 1rem;
743
- min-width: 2rem;
744
- }
745
 
746
- .music-item .track-info {
747
- display: flex;
748
- align-items: center;
 
749
  }
750
 
 
1
+ :root {
2
+ --sidebar-width: 250px;
3
+ --player-height: 100px;
4
+ --primary-color: #1a73e8;
5
+ --background-color: #f0f2f5;
6
+ --card-background: white;
7
+ }
8
+
9
  * {
10
  margin: 0;
11
  padding: 0;
 
14
 
15
  body {
16
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
17
+ background: var(--background-color);
18
  color: #333;
19
+ overflow: hidden;
20
  }
21
 
22
  .container {
23
  display: grid;
24
+ grid-template-columns: var(--sidebar-width) 1fr;
25
+ grid-template-rows: 1fr var(--player-height);
 
26
  height: 100vh;
27
+ transition: all 0.3s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
 
30
+ .mobile-nav {
31
+ display: none;
32
+ position: fixed;
33
+ bottom: 0;
34
+ left: 0;
35
+ right: 0;
36
+ background: var(--card-background);
37
+ padding: 0.5rem;
38
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
39
+ z-index: 1000;
40
  }
41
 
42
+ .mobile-nav ul {
 
 
43
  display: flex;
44
+ justify-content: space-around;
45
+ list-style: none;
 
 
 
 
 
 
46
  }
47
 
48
+ .mobile-nav a {
49
  color: #666;
50
+ text-decoration: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  display: flex;
52
+ flex-direction: column;
53
  align-items: center;
54
+ font-size: 0.8rem;
 
55
  }
56
 
57
+ .mobile-nav i {
58
+ font-size: 1.2rem;
59
+ margin-bottom: 0.2rem;
60
  }
61
 
62
  .sidebar {
63
+ background: var(--card-background);
 
64
  padding: 1rem;
65
+ overflow-y: auto;
66
+ transition: transform 0.3s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
 
69
  .main-content {
 
 
70
  padding: 1rem;
 
71
  overflow-y: auto;
72
+ background: var(--background-color);
73
  }
74
 
75
+ .music-player {
76
+ grid-column: 1 / -1;
77
+ background: var(--card-background);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  padding: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  display: flex;
 
 
 
 
 
 
 
80
  align-items: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  gap: 1rem;
82
+ height: var(--player-height);
83
  }
84
 
85
+ .now-playing {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  display: flex;
87
  align-items: center;
88
+ gap: 1rem;
89
+ flex: 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  }
91
 
92
+ #album-art {
93
+ width: 60px;
94
+ height: 60px;
 
95
  border-radius: 8px;
96
+ object-fit: cover;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  }
98
 
99
+ @media (max-width: 768px) {
100
+ :root {
101
+ --sidebar-width: 0px;
102
+ --player-height: 80px;
103
+ }
104
 
105
+ .container {
106
+ grid-template-columns: 1fr;
 
 
107
  }
108
+
109
+ .sidebar {
110
+ position: fixed;
111
+ left: 0;
112
+ top: 0;
113
+ bottom: 0;
114
+ width: 280px;
115
+ z-index: 1001;
116
+ transform: translateX(-100%);
117
  }
 
118
 
119
+ .sidebar.active {
 
120
  transform: translateX(0);
 
 
 
 
 
121
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
+ .mobile-nav {
124
+ display: block;
125
+ height: 60px;
126
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
+ .main-content {
129
+ padding-bottom: 60px; /* Space for mobile nav */
130
+ }
 
 
 
131
 
132
+ .music-player {
133
+ padding: 0.5rem;
134
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
+ .player-controls {
137
+ flex-direction: column;
138
+ gap: 0.5rem;
139
+ }
140
 
141
+ .volume-control {
142
+ display: none;
143
+ }
144
 
145
+ .lyrics-container {
146
+ display: none;
147
+ }
 
 
 
148
 
149
+ /* Add hamburger menu button */
150
+ .menu-toggle {
151
+ display: block;
152
+ position: fixed;
153
+ top: 1rem;
154
+ left: 1rem;
155
+ z-index: 1002;
156
+ background: var(--primary-color);
157
+ color: white;
158
+ border: none;
159
+ border-radius: 50%;
160
+ width: 40px;
161
+ height: 40px;
162
+ cursor: pointer;
163
+ }
164
 
165
+ /* Add overlay for sidebar */
166
+ .sidebar-overlay {
167
+ display: none;
168
+ position: fixed;
169
+ top: 0;
170
+ left: 0;
171
+ right: 0;
172
+ bottom: 0;
173
+ background: rgba(0, 0, 0, 0.5);
174
+ z-index: 1000;
175
+ }
176
 
177
+ .sidebar-overlay.active {
178
+ display: block;
179
+ }
 
 
180
  }
181
 
182
+ .track-list .music-item {
183
  padding: 0.75rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  border-radius: 8px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  }
186
 
187
+ .album-grid, .artist-grid {
188
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
 
 
 
 
 
189
  }
190
 
191
+ .album-art-container, .artist-art-container {
192
+ width: 150px;
193
+ height: 150px;
194
  }
195
 
196
+ @media (max-width: 480px) {
197
+ .album-grid, .artist-grid {
198
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
199
+ }
 
200
 
201
+ .album-art-container, .artist-art-container {
202
+ width: 120px;
203
+ height: 120px;
204
+ }
205
  }
206
 
templates/index.html CHANGED
@@ -8,6 +8,33 @@
8
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
9
  </head>
10
  <body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  <div class="container">
12
  <div class="sidebar">
13
  <nav>
 
8
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
9
  </head>
10
  <body>
11
+ <button class="menu-toggle" id="menu-toggle">
12
+ <i class="fas fa-bars"></i>
13
+ </button>
14
+
15
+ <div class="sidebar-overlay" id="sidebar-overlay"></div>
16
+
17
+ <nav class="mobile-nav">
18
+ <ul>
19
+ <li><a href="#" data-view="all">
20
+ <i class="fas fa-music"></i>
21
+ <span>Songs</span>
22
+ </a></li>
23
+ <li><a href="#" data-view="albums">
24
+ <i class="fas fa-compact-disc"></i>
25
+ <span>Albums</span>
26
+ </a></li>
27
+ <li><a href="#" data-view="artists">
28
+ <i class="fas fa-user"></i>
29
+ <span>Artists</span>
30
+ </a></li>
31
+ <li><a href="#" data-view="playlists">
32
+ <i class="fas fa-list"></i>
33
+ <span>Playlists</span>
34
+ </a></li>
35
+ </ul>
36
+ </nav>
37
+
38
  <div class="container">
39
  <div class="sidebar">
40
  <nav>