coursewatcher 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,935 @@
1
+ /**
2
+ * CourseWatcher Styles
3
+ *
4
+ * Modern dark theme with vibrant accents.
5
+ */
6
+
7
+ /* ==========================================
8
+ CSS Variables
9
+ ========================================== */
10
+
11
+ :root {
12
+ /* Colors */
13
+ --color-bg: #0f0f1a;
14
+ --color-bg-secondary: #1a1a2e;
15
+ --color-bg-tertiary: #252540;
16
+ --color-surface: #2a2a45;
17
+ --color-surface-hover: #35355a;
18
+
19
+ --color-text: #e8e8f0;
20
+ --color-text-secondary: #a0a0b8;
21
+ --color-text-muted: #6b6b85;
22
+
23
+ --color-primary: #7c3aed;
24
+ --color-primary-hover: #8b5cf6;
25
+ --color-primary-glow: rgba(124, 58, 237, 0.3);
26
+
27
+ --color-success: #10b981;
28
+ --color-success-bg: rgba(16, 185, 129, 0.15);
29
+
30
+ --color-warning: #f59e0b;
31
+ --color-warning-bg: rgba(245, 158, 11, 0.15);
32
+
33
+ --color-error: #ef4444;
34
+
35
+ --color-border: #3a3a55;
36
+
37
+ /* Typography */
38
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
39
+ --font-mono: 'Fira Code', 'Consolas', monospace;
40
+
41
+ /* Spacing */
42
+ --space-xs: 0.25rem;
43
+ --space-sm: 0.5rem;
44
+ --space-md: 1rem;
45
+ --space-lg: 1.5rem;
46
+ --space-xl: 2rem;
47
+ --space-2xl: 3rem;
48
+
49
+ /* Border Radius */
50
+ --radius-sm: 4px;
51
+ --radius-md: 8px;
52
+ --radius-lg: 12px;
53
+ --radius-xl: 16px;
54
+
55
+ /* Transitions */
56
+ --transition-fast: 150ms ease;
57
+ --transition-normal: 250ms ease;
58
+ }
59
+
60
+ /* ==========================================
61
+ Base Styles
62
+ ========================================== */
63
+
64
+ *,
65
+ *::before,
66
+ *::after {
67
+ box-sizing: border-box;
68
+ margin: 0;
69
+ padding: 0;
70
+ }
71
+
72
+ html {
73
+ font-size: 16px;
74
+ scroll-behavior: smooth;
75
+ }
76
+
77
+ body {
78
+ font-family: var(--font-sans);
79
+ background: var(--color-bg);
80
+ color: var(--color-text);
81
+ line-height: 1.6;
82
+ min-height: 100vh;
83
+ display: flex;
84
+ flex-direction: column;
85
+ }
86
+
87
+ a {
88
+ color: var(--color-primary);
89
+ text-decoration: none;
90
+ transition: color var(--transition-fast);
91
+ }
92
+
93
+ a:hover {
94
+ color: var(--color-primary-hover);
95
+ }
96
+
97
+ /* ==========================================
98
+ Container
99
+ ========================================== */
100
+
101
+ .container {
102
+ width: 100%;
103
+ max-width: 1200px;
104
+ margin: 0 auto;
105
+ padding: var(--space-lg);
106
+ flex: 1;
107
+ }
108
+
109
+ /* ==========================================
110
+ Header
111
+ ========================================== */
112
+
113
+ .header {
114
+ background: var(--color-bg-secondary);
115
+ border-bottom: 1px solid var(--color-border);
116
+ padding: var(--space-md) var(--space-lg);
117
+ position: sticky;
118
+ top: 0;
119
+ z-index: 100;
120
+ backdrop-filter: blur(10px);
121
+ }
122
+
123
+ .header-content {
124
+ max-width: 1200px;
125
+ margin: 0 auto;
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ gap: var(--space-lg);
130
+ }
131
+
132
+ .logo {
133
+ display: flex;
134
+ align-items: center;
135
+ gap: var(--space-sm);
136
+ color: var(--color-text);
137
+ font-weight: 700;
138
+ font-size: 1.25rem;
139
+ }
140
+
141
+ .logo:hover {
142
+ color: var(--color-text);
143
+ }
144
+
145
+ .logo-icon {
146
+ font-size: 1.5rem;
147
+ }
148
+
149
+ .nav {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: var(--space-md);
153
+ }
154
+
155
+ .search-form {
156
+ display: flex;
157
+ align-items: center;
158
+ background: var(--color-bg-tertiary);
159
+ border-radius: var(--radius-lg);
160
+ overflow: hidden;
161
+ border: 1px solid var(--color-border);
162
+ transition: border-color var(--transition-fast);
163
+ }
164
+
165
+ .search-form:focus-within {
166
+ border-color: var(--color-primary);
167
+ box-shadow: 0 0 0 3px var(--color-primary-glow);
168
+ }
169
+
170
+ .search-input {
171
+ background: transparent;
172
+ border: none;
173
+ padding: var(--space-sm) var(--space-md);
174
+ color: var(--color-text);
175
+ font-size: 0.9rem;
176
+ width: 200px;
177
+ outline: none;
178
+ }
179
+
180
+ .search-input::placeholder {
181
+ color: var(--color-text-muted);
182
+ }
183
+
184
+ .search-button {
185
+ background: transparent;
186
+ border: none;
187
+ padding: var(--space-sm) var(--space-md);
188
+ cursor: pointer;
189
+ font-size: 1rem;
190
+ opacity: 0.7;
191
+ transition: opacity var(--transition-fast);
192
+ }
193
+
194
+ .search-button:hover {
195
+ opacity: 1;
196
+ }
197
+
198
+ /* ==========================================
199
+ Footer
200
+ ========================================== */
201
+
202
+ .footer {
203
+ background: var(--color-bg-secondary);
204
+ border-top: 1px solid var(--color-border);
205
+ padding: var(--space-lg);
206
+ text-align: center;
207
+ color: var(--color-text-muted);
208
+ font-size: 0.85rem;
209
+ }
210
+
211
+ /* ==========================================
212
+ Stats Section
213
+ ========================================== */
214
+
215
+ .stats-section {
216
+ margin-bottom: var(--space-2xl);
217
+ }
218
+
219
+ .stats-grid {
220
+ display: grid;
221
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
222
+ gap: var(--space-md);
223
+ }
224
+
225
+ .stat-card {
226
+ background: var(--color-surface);
227
+ border-radius: var(--radius-lg);
228
+ padding: var(--space-lg);
229
+ text-align: center;
230
+ border: 1px solid var(--color-border);
231
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
232
+ }
233
+
234
+ .stat-card:hover {
235
+ transform: translateY(-2px);
236
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
237
+ }
238
+
239
+ .stat-card-highlight {
240
+ background: linear-gradient(135deg, var(--color-primary) 0%, #9333ea 100%);
241
+ border-color: transparent;
242
+ }
243
+
244
+ .stat-value {
245
+ display: block;
246
+ font-size: 2rem;
247
+ font-weight: 700;
248
+ margin-bottom: var(--space-xs);
249
+ }
250
+
251
+ .stat-label {
252
+ font-size: 0.85rem;
253
+ color: var(--color-text-secondary);
254
+ }
255
+
256
+ .stat-card-highlight .stat-label {
257
+ color: rgba(255, 255, 255, 0.8);
258
+ }
259
+
260
+ /* ==========================================
261
+ Modules Section
262
+ ========================================== */
263
+
264
+ .section-title {
265
+ font-size: 1.5rem;
266
+ margin-bottom: var(--space-lg);
267
+ color: var(--color-text);
268
+ }
269
+
270
+ .section-header {
271
+ display: flex;
272
+ justify-content: space-between;
273
+ align-items: center;
274
+ flex-wrap: wrap;
275
+ gap: var(--space-md);
276
+ margin-bottom: var(--space-lg);
277
+ }
278
+
279
+ .section-header .section-title {
280
+ margin-bottom: 0;
281
+ }
282
+
283
+ .sort-controls {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: var(--space-sm);
287
+ }
288
+
289
+ .sort-label {
290
+ color: var(--color-text-muted);
291
+ font-size: 0.85rem;
292
+ }
293
+
294
+ .sort-buttons {
295
+ display: flex;
296
+ gap: var(--space-xs);
297
+ }
298
+
299
+ .sort-btn {
300
+ padding: var(--space-xs) var(--space-sm);
301
+ background: var(--color-bg-secondary);
302
+ border: 1px solid var(--color-border);
303
+ border-radius: var(--radius-sm);
304
+ color: var(--color-text-secondary);
305
+ font-size: 0.8rem;
306
+ transition: all var(--transition-fast);
307
+ }
308
+
309
+ .sort-btn:hover {
310
+ background: var(--color-bg-tertiary);
311
+ color: var(--color-text);
312
+ }
313
+
314
+ .sort-btn.active {
315
+ background: var(--color-primary);
316
+ border-color: var(--color-primary);
317
+ color: white;
318
+ }
319
+
320
+ .modules-list {
321
+ display: flex;
322
+ flex-direction: column;
323
+ gap: var(--space-md);
324
+ }
325
+
326
+ .module-item {
327
+ background: var(--color-surface);
328
+ border-radius: var(--radius-lg);
329
+ border: 1px solid var(--color-border);
330
+ overflow: hidden;
331
+ }
332
+
333
+ .module-header {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: var(--space-md);
337
+ padding: var(--space-lg);
338
+ cursor: pointer;
339
+ user-select: none;
340
+ transition: background var(--transition-fast);
341
+ }
342
+
343
+ .module-header:hover {
344
+ background: var(--color-surface-hover);
345
+ }
346
+
347
+ .module-icon {
348
+ font-size: 1.25rem;
349
+ }
350
+
351
+ .module-name {
352
+ flex: 1;
353
+ font-weight: 600;
354
+ }
355
+
356
+ .module-count {
357
+ color: var(--color-text-muted);
358
+ font-size: 0.85rem;
359
+ }
360
+
361
+ .module-toggle {
362
+ transition: transform var(--transition-normal);
363
+ }
364
+
365
+ .module-item[open] .module-toggle {
366
+ transform: rotate(180deg);
367
+ }
368
+
369
+ .module-content {
370
+ padding: 0 var(--space-lg) var(--space-lg);
371
+ display: flex;
372
+ flex-direction: column;
373
+ gap: var(--space-sm);
374
+ }
375
+
376
+ /* ==========================================
377
+ Video Card
378
+ ========================================== */
379
+
380
+ .video-card {
381
+ display: flex;
382
+ align-items: center;
383
+ gap: var(--space-md);
384
+ padding: var(--space-md);
385
+ background: var(--color-bg-secondary);
386
+ border-radius: var(--radius-md);
387
+ color: var(--color-text);
388
+ transition: all var(--transition-fast);
389
+ border: 1px solid transparent;
390
+ }
391
+
392
+ .video-card:hover {
393
+ background: var(--color-bg-tertiary);
394
+ border-color: var(--color-primary);
395
+ color: var(--color-text);
396
+ transform: translateX(4px);
397
+ }
398
+
399
+ .video-card-icon {
400
+ flex-shrink: 0;
401
+ }
402
+
403
+ .status-icon {
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ width: 28px;
408
+ height: 28px;
409
+ border-radius: 50%;
410
+ font-size: 0.85rem;
411
+ }
412
+
413
+ .status-icon.completed {
414
+ background: var(--color-success-bg);
415
+ color: var(--color-success);
416
+ }
417
+
418
+ .status-icon.in-progress {
419
+ background: var(--color-warning-bg);
420
+ color: var(--color-warning);
421
+ }
422
+
423
+ .status-icon.unwatched {
424
+ background: var(--color-bg-tertiary);
425
+ color: var(--color-text-muted);
426
+ }
427
+
428
+ .video-card-content {
429
+ flex: 1;
430
+ min-width: 0;
431
+ }
432
+
433
+ .video-card-title {
434
+ font-size: 0.95rem;
435
+ font-weight: 500;
436
+ white-space: nowrap;
437
+ overflow: hidden;
438
+ text-overflow: ellipsis;
439
+ }
440
+
441
+ .video-card-progress {
442
+ display: flex;
443
+ align-items: center;
444
+ gap: var(--space-sm);
445
+ margin-top: var(--space-xs);
446
+ }
447
+
448
+ .progress-bar {
449
+ flex: 1;
450
+ height: 4px;
451
+ background: var(--color-bg-tertiary);
452
+ border-radius: 2px;
453
+ overflow: hidden;
454
+ }
455
+
456
+ .progress-fill {
457
+ height: 100%;
458
+ background: var(--color-primary);
459
+ border-radius: 2px;
460
+ transition: width var(--transition-normal);
461
+ }
462
+
463
+ .progress-text {
464
+ font-size: 0.75rem;
465
+ color: var(--color-text-muted);
466
+ min-width: 35px;
467
+ }
468
+
469
+ .video-card-badge {
470
+ flex-shrink: 0;
471
+ }
472
+
473
+ /* ==========================================
474
+ Badges
475
+ ========================================== */
476
+
477
+ .badge {
478
+ display: inline-block;
479
+ padding: var(--space-xs) var(--space-sm);
480
+ border-radius: var(--radius-sm);
481
+ font-size: 0.75rem;
482
+ font-weight: 500;
483
+ text-transform: uppercase;
484
+ letter-spacing: 0.5px;
485
+ }
486
+
487
+ .badge-success {
488
+ background: var(--color-success-bg);
489
+ color: var(--color-success);
490
+ }
491
+
492
+ .badge-warning {
493
+ background: var(--color-warning-bg);
494
+ color: var(--color-warning);
495
+ }
496
+
497
+ .badge-default {
498
+ background: var(--color-bg-tertiary);
499
+ color: var(--color-text-muted);
500
+ }
501
+
502
+ /* ==========================================
503
+ Video Player Page
504
+ ========================================== */
505
+
506
+ .player-container {
507
+ max-width: 1400px;
508
+ }
509
+
510
+ .player-section {
511
+ margin-bottom: var(--space-xl);
512
+ }
513
+
514
+ .video-wrapper {
515
+ position: relative;
516
+ background: #000;
517
+ border-radius: var(--radius-lg);
518
+ overflow: hidden;
519
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
520
+ }
521
+
522
+ .video-player {
523
+ width: 100%;
524
+ display: block;
525
+ max-height: 70vh;
526
+ }
527
+
528
+ .player-nav {
529
+ display: flex;
530
+ justify-content: center;
531
+ gap: var(--space-md);
532
+ margin-top: var(--space-lg);
533
+ }
534
+
535
+ .nav-button {
536
+ display: inline-flex;
537
+ align-items: center;
538
+ gap: var(--space-sm);
539
+ padding: var(--space-sm) var(--space-lg);
540
+ background: var(--color-surface);
541
+ border-radius: var(--radius-md);
542
+ color: var(--color-text);
543
+ font-weight: 500;
544
+ transition: all var(--transition-fast);
545
+ border: 1px solid var(--color-border);
546
+ }
547
+
548
+ .nav-button:hover:not(.disabled) {
549
+ background: var(--color-primary);
550
+ border-color: var(--color-primary);
551
+ color: white;
552
+ }
553
+
554
+ .nav-button.disabled {
555
+ opacity: 0.4;
556
+ cursor: not-allowed;
557
+ }
558
+
559
+ /* ==========================================
560
+ Video Info Section
561
+ ========================================== */
562
+
563
+ .video-info-section {
564
+ background: var(--color-surface);
565
+ border-radius: var(--radius-lg);
566
+ padding: var(--space-xl);
567
+ margin-bottom: var(--space-xl);
568
+ border: 1px solid var(--color-border);
569
+ }
570
+
571
+ .video-title {
572
+ font-size: 1.75rem;
573
+ margin-bottom: var(--space-lg);
574
+ }
575
+
576
+ .status-controls {
577
+ display: flex;
578
+ align-items: center;
579
+ gap: var(--space-md);
580
+ margin-bottom: var(--space-lg);
581
+ flex-wrap: wrap;
582
+ }
583
+
584
+ .status-label {
585
+ color: var(--color-text-secondary);
586
+ font-weight: 500;
587
+ }
588
+
589
+ .status-buttons {
590
+ display: flex;
591
+ gap: var(--space-sm);
592
+ flex-wrap: wrap;
593
+ }
594
+
595
+ .status-btn {
596
+ padding: var(--space-sm) var(--space-md);
597
+ background: var(--color-bg-secondary);
598
+ border: 1px solid var(--color-border);
599
+ border-radius: var(--radius-md);
600
+ color: var(--color-text-secondary);
601
+ cursor: pointer;
602
+ font-size: 0.85rem;
603
+ transition: all var(--transition-fast);
604
+ }
605
+
606
+ .status-btn:hover {
607
+ background: var(--color-bg-tertiary);
608
+ color: var(--color-text);
609
+ }
610
+
611
+ .status-btn.active {
612
+ background: var(--color-primary);
613
+ border-color: var(--color-primary);
614
+ color: white;
615
+ }
616
+
617
+ .playback-controls {
618
+ display: flex;
619
+ gap: var(--space-xl);
620
+ flex-wrap: wrap;
621
+ }
622
+
623
+ .control-group {
624
+ display: flex;
625
+ align-items: center;
626
+ gap: var(--space-sm);
627
+ }
628
+
629
+ .control-label {
630
+ color: var(--color-text-muted);
631
+ font-size: 0.85rem;
632
+ margin-right: var(--space-sm);
633
+ }
634
+
635
+ .control-btn {
636
+ padding: var(--space-xs) var(--space-md);
637
+ background: var(--color-bg-secondary);
638
+ border: 1px solid var(--color-border);
639
+ border-radius: var(--radius-md);
640
+ color: var(--color-text);
641
+ cursor: pointer;
642
+ font-size: 0.8rem;
643
+ transition: all var(--transition-fast);
644
+ }
645
+
646
+ .control-btn:hover {
647
+ background: var(--color-primary);
648
+ border-color: var(--color-primary);
649
+ }
650
+
651
+ .control-value {
652
+ min-width: 50px;
653
+ text-align: center;
654
+ font-weight: 600;
655
+ color: var(--color-primary);
656
+ }
657
+
658
+ /* ==========================================
659
+ Keyboard Shortcuts
660
+ ========================================== */
661
+
662
+ .shortcuts-help {
663
+ margin-top: var(--space-lg);
664
+ padding-top: var(--space-lg);
665
+ border-top: 1px solid var(--color-border);
666
+ }
667
+
668
+ .shortcuts-help summary {
669
+ cursor: pointer;
670
+ color: var(--color-text-secondary);
671
+ font-size: 0.9rem;
672
+ user-select: none;
673
+ }
674
+
675
+ .shortcuts-grid {
676
+ display: grid;
677
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
678
+ gap: var(--space-sm);
679
+ margin-top: var(--space-md);
680
+ }
681
+
682
+ .shortcut {
683
+ display: flex;
684
+ align-items: center;
685
+ gap: var(--space-sm);
686
+ font-size: 0.85rem;
687
+ color: var(--color-text-secondary);
688
+ }
689
+
690
+ kbd {
691
+ display: inline-flex;
692
+ align-items: center;
693
+ justify-content: center;
694
+ min-width: 28px;
695
+ padding: var(--space-xs) var(--space-sm);
696
+ background: var(--color-bg-secondary);
697
+ border: 1px solid var(--color-border);
698
+ border-radius: var(--radius-sm);
699
+ font-family: var(--font-mono);
700
+ font-size: 0.75rem;
701
+ color: var(--color-text);
702
+ }
703
+
704
+ /* ==========================================
705
+ Notes Section
706
+ ========================================== */
707
+
708
+ .notes-section {
709
+ background: var(--color-surface);
710
+ border-radius: var(--radius-lg);
711
+ padding: var(--space-xl);
712
+ border: 1px solid var(--color-border);
713
+ }
714
+
715
+ .notes-editor {
716
+ width: 100%;
717
+ min-height: 200px;
718
+ padding: var(--space-md);
719
+ background: var(--color-bg-secondary);
720
+ border: 1px solid var(--color-border);
721
+ border-radius: var(--radius-md);
722
+ color: var(--color-text);
723
+ font-family: var(--font-mono);
724
+ font-size: 0.9rem;
725
+ line-height: 1.6;
726
+ resize: vertical;
727
+ outline: none;
728
+ transition: border-color var(--transition-fast);
729
+ }
730
+
731
+ .notes-editor:focus {
732
+ border-color: var(--color-primary);
733
+ box-shadow: 0 0 0 3px var(--color-primary-glow);
734
+ }
735
+
736
+ .notes-editor::placeholder {
737
+ color: var(--color-text-muted);
738
+ }
739
+
740
+ .notes-actions {
741
+ display: flex;
742
+ align-items: center;
743
+ gap: var(--space-md);
744
+ margin-top: var(--space-md);
745
+ }
746
+
747
+ .save-status {
748
+ font-size: 0.85rem;
749
+ color: var(--color-success);
750
+ }
751
+
752
+ /* ==========================================
753
+ Buttons
754
+ ========================================== */
755
+
756
+ .btn {
757
+ display: inline-flex;
758
+ align-items: center;
759
+ justify-content: center;
760
+ gap: var(--space-sm);
761
+ padding: var(--space-sm) var(--space-lg);
762
+ border: none;
763
+ border-radius: var(--radius-md);
764
+ font-size: 0.9rem;
765
+ font-weight: 500;
766
+ cursor: pointer;
767
+ transition: all var(--transition-fast);
768
+ }
769
+
770
+ .btn-primary {
771
+ background: var(--color-primary);
772
+ color: white;
773
+ }
774
+
775
+ .btn-primary:hover {
776
+ background: var(--color-primary-hover);
777
+ transform: translateY(-1px);
778
+ box-shadow: 0 4px 15px var(--color-primary-glow);
779
+ }
780
+
781
+ /* ==========================================
782
+ Search Page
783
+ ========================================== */
784
+
785
+ .page-title {
786
+ font-size: 1.75rem;
787
+ margin-bottom: var(--space-xl);
788
+ }
789
+
790
+ .search-form-large {
791
+ display: flex;
792
+ gap: var(--space-md);
793
+ margin-bottom: var(--space-lg);
794
+ }
795
+
796
+ .search-input-large {
797
+ flex: 1;
798
+ padding: var(--space-md) var(--space-lg);
799
+ background: var(--color-surface);
800
+ border: 1px solid var(--color-border);
801
+ border-radius: var(--radius-md);
802
+ color: var(--color-text);
803
+ font-size: 1rem;
804
+ outline: none;
805
+ transition: border-color var(--transition-fast);
806
+ }
807
+
808
+ .search-input-large:focus {
809
+ border-color: var(--color-primary);
810
+ box-shadow: 0 0 0 3px var(--color-primary-glow);
811
+ }
812
+
813
+ .search-meta {
814
+ color: var(--color-text-secondary);
815
+ margin-bottom: var(--space-lg);
816
+ }
817
+
818
+ .search-results {
819
+ display: flex;
820
+ flex-direction: column;
821
+ gap: var(--space-sm);
822
+ }
823
+
824
+ .search-result-card {
825
+ display: flex;
826
+ align-items: center;
827
+ gap: var(--space-md);
828
+ padding: var(--space-lg);
829
+ background: var(--color-surface);
830
+ border-radius: var(--radius-md);
831
+ color: var(--color-text);
832
+ border: 1px solid var(--color-border);
833
+ transition: all var(--transition-fast);
834
+ }
835
+
836
+ .search-result-card:hover {
837
+ background: var(--color-surface-hover);
838
+ border-color: var(--color-primary);
839
+ transform: translateX(4px);
840
+ }
841
+
842
+ .result-content {
843
+ flex: 1;
844
+ }
845
+
846
+ .result-title {
847
+ font-size: 1rem;
848
+ font-weight: 500;
849
+ margin-bottom: var(--space-xs);
850
+ }
851
+
852
+ .result-module {
853
+ font-size: 0.85rem;
854
+ color: var(--color-text-muted);
855
+ }
856
+
857
+ /* ==========================================
858
+ Empty State
859
+ ========================================== */
860
+
861
+ .empty-state {
862
+ text-align: center;
863
+ padding: var(--space-2xl);
864
+ color: var(--color-text-secondary);
865
+ }
866
+
867
+ .empty-hint {
868
+ color: var(--color-text-muted);
869
+ font-size: 0.9rem;
870
+ margin-top: var(--space-sm);
871
+ }
872
+
873
+ /* ==========================================
874
+ Error Page
875
+ ========================================== */
876
+
877
+ .error-section {
878
+ display: flex;
879
+ justify-content: center;
880
+ align-items: center;
881
+ min-height: 50vh;
882
+ }
883
+
884
+ .error-content {
885
+ text-align: center;
886
+ }
887
+
888
+ .error-code {
889
+ font-size: 6rem;
890
+ font-weight: 700;
891
+ line-height: 1;
892
+ background: linear-gradient(135deg, var(--color-primary) 0%, #9333ea 100%);
893
+ -webkit-background-clip: text;
894
+ -webkit-text-fill-color: transparent;
895
+ background-clip: text;
896
+ }
897
+
898
+ .error-message {
899
+ font-size: 1.25rem;
900
+ color: var(--color-text-secondary);
901
+ margin: var(--space-lg) 0 var(--space-xl);
902
+ }
903
+
904
+ /* ==========================================
905
+ Responsive
906
+ ========================================== */
907
+
908
+ @media (max-width: 768px) {
909
+ .header-content {
910
+ flex-wrap: wrap;
911
+ }
912
+
913
+ .search-input {
914
+ width: 150px;
915
+ }
916
+
917
+ .stats-grid {
918
+ grid-template-columns: repeat(2, 1fr);
919
+ }
920
+
921
+ .playback-controls {
922
+ flex-direction: column;
923
+ gap: var(--space-md);
924
+ }
925
+
926
+ .player-nav {
927
+ flex-wrap: wrap;
928
+ }
929
+
930
+ .nav-button {
931
+ flex: 1;
932
+ justify-content: center;
933
+ min-width: 120px;
934
+ }
935
+ }