Meneman commited on
Commit
c389608
·
verified ·
1 Parent(s): 497c13e

undefined - Follow Up Deployment

Browse files
Files changed (1) hide show
  1. index.html +484 -866
index.html CHANGED
@@ -16,7 +16,7 @@
16
 
17
  *{box-sizing:border-box}
18
 
19
- /* OPTIMIZED: Typography */
20
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=Playfair+Display:wght@400;500;600;700;800;900&display=swap');
21
 
22
  body{margin:0;color:#f8f8f8;font-family:'Inter','Segoe UI',system-ui,-apple-system,Roboto,Arial,sans-serif;
@@ -24,7 +24,7 @@
24
  cursor:none;font-weight:400;letter-spacing:-0.025em;
25
  transform:translate3d(0,0,0);will-change:auto}
26
 
27
- /* OPTIMIZED: Multi-Layer Background System */
28
  body::before{content:'';position:fixed;inset:0;z-index:0;
29
  background:
30
  radial-gradient(ellipse 800px 400px at 20% 30%, rgba(157,78,221,0.15) 0%, transparent 50%),
@@ -34,7 +34,7 @@
34
  animation:breathing 15s ease-in-out infinite;transform:translate3d(0,0,0)}
35
  @keyframes breathing{0%,100%{opacity:0.85;transform:translate3d(0,0,0) scale(1)}50%{opacity:1;transform:translate3d(0,0,0) scale(1.02)}}
36
 
37
- /* OPTIMIZED: Aurora Effect */
38
  .aurora{position:fixed;inset:0;z-index:1;pointer-events:none;
39
  background:
40
  linear-gradient(45deg,
@@ -48,20 +48,13 @@
48
  @keyframes aurora{0%,100%{background-position:0% 0%, 100% 100%}50%{background-position:100% 100%, 0% 0%}}
49
  @keyframes auroraPulse{0%,100%{opacity:0.6}50%{opacity:1}}
50
 
51
- /* OPTIMIZED: Cursor System - Desktop Only */
52
  .cursor{position:fixed;width:20px;height:20px;border-radius:50%;
53
  background:radial-gradient(circle,rgba(255,107,107,0.9) 0%,rgba(78,205,196,0.4) 50%,transparent 100%);
54
  pointer-events:none;z-index:999999;mix-blend-mode:screen;
55
  transition:all 0.12s cubic-bezier(0.4,0,0.2,1);transform:translate3d(0,0,0);
56
  left:0;top:0;will-change:transform;
57
  box-shadow:0 0 20px rgba(255,107,107,0.6), 0 0 40px rgba(255,107,107,0.3)}
58
-
59
- /* FIXED: Mobile-first performance optimization */
60
- @media (max-width:768px) and (orientation:portrait){
61
- body{cursor:auto}
62
- .cursor,.cursor-trail{display:none !important}
63
- }
64
-
65
  .cursor.hover{transform:scale(1.8) !important;
66
  background:radial-gradient(circle,rgba(255,107,107,1) 0%,rgba(78,205,196,0.6) 40%,rgba(157,78,221,0.3) 100%);
67
  box-shadow:0 0 30px rgba(255,107,107,0.8), 0 0 60px rgba(255,107,107,0.4)}
@@ -70,8 +63,6 @@
70
  animation:trailFade 0.8s cubic-bezier(0.4,0,0.2,1) forwards}
71
  @keyframes trailFade{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.3)}}
72
 
73
- /* FIXED: Optimization Mode System - Non-overlapping mobile layout */
74
-
75
  /* Desktop Performance Toggle */
76
  .performance-toggle{position:fixed;top:20px;right:20px;z-index:10000;
77
  display:flex;align-items:center;gap:10px;padding:10px 16px;
@@ -85,7 +76,7 @@
85
  .performance-toggle .mode-icon{font-size:16px;transition:all 0.3s ease}
86
  .performance-toggle .mode-text{font-family:'Inter',sans-serif;letter-spacing:0.3px}
87
 
88
- /* FIXED: Performance Settings Panel */
89
  .performance-panel{position:fixed;top:70px;right:20px;z-index:9999;
90
  background:rgba(0,0,0,0.95);backdrop-filter:blur(15px);
91
  border-radius:20px;padding:25px;border:1px solid rgba(255,255,255,0.15);
@@ -97,7 +88,7 @@
97
  .performance-panel h3{color:var(--gold);margin:0 0 20px;font-size:18px;
98
  font-weight:700;text-align:center;font-family:'Playfair Display',serif}
99
 
100
- /* FIXED: Mode Selection Grid - Better mobile layout */
101
  .mode-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:10px;margin-bottom:20px}
102
  .mode-card{padding:12px;border-radius:12px;cursor:pointer;
103
  border:2px solid rgba(255,255,255,0.1);
@@ -111,78 +102,13 @@
111
  .mode-card .mode-name{font-size:13px;font-weight:600;margin-bottom:4px}
112
  .mode-card .mode-desc{font-size:10px;opacity:0.7;line-height:1.3}
113
 
114
- /* Special styling for Mobile+ mode */
115
- .mode-card[data-mode="mobile-plus"]{
116
- grid-column:span 2;
117
- background:linear-gradient(135deg, rgba(0,255,127,0.1), rgba(0,191,255,0.1));
118
- border-color:rgba(0,255,127,0.3)}
119
- .mode-card[data-mode="mobile-plus"]:hover{
120
- border-color:rgba(0,255,127,0.6);transform:translateY(-3px) scale(1.02)}
121
- .mode-card[data-mode="mobile-plus"].active{
122
- border-color:#00ff7f;background:rgba(0,255,127,0.2);
123
- box-shadow:0 0 25px rgba(0,255,127,0.4)}
124
-
125
- /* Performance Metrics */
126
- .perf-metrics{background:rgba(255,255,255,0.05);border-radius:12px;padding:15px;margin-top:15px}
127
- .perf-metrics h4{margin:0 0 10px;font-size:13px;color:var(--neon-secondary)}
128
- .metric-item{display:flex;justify-content:space-between;margin:8px 0;font-size:11px}
129
- .metric-value{color:var(--gold);font-weight:600}
130
-
131
- /* FIXED: Mobile Performance Interface - No overlapping */
132
- .mobile-perf-toggle{position:fixed;bottom:100px;right:15px;z-index:50;
133
- width:48px;height:48px;border-radius:50%;
134
- background:rgba(0,0,0,0.9);backdrop-filter:blur(10px);
135
- border:2px solid rgba(255,255,255,0.3);display:none;align-items:center;justify-content:center;
136
- cursor:pointer;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);
137
- box-shadow:var(--shadow-medium)}
138
- .mobile-perf-toggle:hover{transform:scale(1.1);border-color:rgba(255,107,107,0.6)}
139
- .mobile-perf-toggle .perf-icon{font-size:20px;transition:all 0.3s ease}
140
-
141
- /* FIXED: Mobile Performance Panel - Proper positioning */
142
- .mobile-perf-panel{position:fixed;bottom:0;left:0;right:0;z-index:60;
143
- background:rgba(0,0,0,0.95);backdrop-filter:blur(15px);
144
- border-top:1px solid rgba(255,107,107,0.4);
145
- border-radius:25px 25px 0 0;padding:20px;
146
- transform:translateY(100%);transition:transform 0.5s cubic-bezier(0.4,0,0.2,1);
147
- box-shadow:0 -10px 40px rgba(0,0,0,0.5)}
148
- .mobile-perf-panel.visible{transform:translateY(0)}
149
- .mobile-perf-panel h3{color:var(--gold);margin:0 0 15px;font-size:16px;text-align:center}
150
- .mobile-perf-panel .mode-grid{grid-template-columns:repeat(2,1fr);gap:8px}
151
- .mobile-perf-panel .mode-card{padding:8px 4px;min-height:60px}
152
- .mobile-perf-panel .mode-card[data-mode="mobile-plus"]{grid-column:span 2}
153
- .mobile-perf-panel .mode-emoji{font-size:20px;margin-bottom:4px}
154
- .mobile-perf-panel .mode-name{font-size:10px}
155
- .mobile-perf-panel .mode-desc{font-size:8px}
156
-
157
- /* OPTIMIZED: Performance Mode Classes */
158
  .ultra-mode{--animation-speed:1;--particle-count:8;--effect-intensity:1}
159
  .high-mode{--animation-speed:0.8;--particle-count:6;--effect-intensity:0.8}
160
  .balanced-mode{--animation-speed:0.6;--particle-count:4;--effect-intensity:0.6}
161
  .performance-mode{--animation-speed:0.4;--particle-count:2;--effect-intensity:0.4}
162
- .mobile-plus-mode{--animation-speed:0.2;--particle-count:1;--effect-intensity:0.2}
163
-
164
- /* OPTIMIZED: Dynamic Performance Adjustments */
165
- .performance-mode .aurora{opacity:0.3;animation-duration:30s}
166
- .performance-mode .music-notes{display:none}
167
- .performance-mode .corner-accent{display:none}
168
- .performance-mode .cursor-trail{display:none}
169
-
170
- /* Mobile+ Mode - Ultra Performance */
171
- .mobile-plus-mode .aurora{opacity:0.1;animation-duration:60s}
172
- .mobile-plus-mode .music-notes{display:none !important}
173
- .mobile-plus-mode .corner-accent{display:none !important}
174
- .mobile-plus-mode .cursor-trail{display:none !important}
175
- .mobile-plus-mode .bubble{display:none !important}
176
- .mobile-plus-mode body::before{animation:none;opacity:0.7}
177
- .mobile-plus-mode .panel::before{display:none}
178
- .mobile-plus-mode .panel::after{display:none}
179
- .mobile-plus-mode .audio-visualizer{display:none}
180
-
181
- .balanced-mode .aurora{opacity:0.6;animation-duration:25s}
182
- .high-mode .aurora{opacity:0.8;animation-duration:22s}
183
- .ultra-mode .aurora{opacity:1;animation-duration:20s}
184
-
185
- /* OPTIMIZED: Floating Elements */
186
  .music-notes{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden}
187
  .note{position:absolute;font-size:24px;color:rgba(255,215,0,0.3);font-family:'Playfair Display',serif;
188
  animation:floatNote 12s linear infinite;transform:translate3d(0,0,0);
@@ -193,7 +119,7 @@
193
  100%{transform:translate3d(0,-10vh,0) rotate(360deg);opacity:0}
194
  }
195
 
196
- /* OPTIMIZED: Header */
197
  header{text-align:center;padding:30px 0 20px;transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
198
  position:relative;z-index:3;transform:translate3d(0,0,0)}
199
  h1{font-size:clamp(32px,8vw,64px);font-weight:900;margin:0;font-family:'Playfair Display',serif;
@@ -215,7 +141,7 @@
215
  box-shadow:0 0 20px rgba(255,107,107,0.4), 0 4px 15px rgba(0,0,0,0.2);transform:translate3d(0,0,0)}
216
  @keyframes flow{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
217
 
218
- /* OPTIMIZED: Video Panel */
219
  .panel{position:relative;margin:20px auto 0;max-width:1000px;aspect-ratio:16/9;
220
  background:var(--glass-bg);border-radius:32px;overflow:hidden;
221
  box-shadow:var(--shadow-strong);z-index:2;
@@ -234,7 +160,7 @@
234
  @keyframes holoRotate{0%{transform:rotate(0deg) scale(1)}50%{transform:rotate(180deg) scale(1.02)}100%{transform:rotate(360deg) scale(1)}}
235
  @keyframes holoGlow{0%,100%{opacity:0.6}50%{opacity:1}}
236
 
237
- /* OPTIMIZED: Corner Accents */
238
  .panel-accents{position:absolute;inset:0;pointer-events:none;z-index:5}
239
  .corner-accent{position:absolute;width:50px;height:50px;border-radius:50%;
240
  animation:cornerPulse 4s ease-in-out infinite;
@@ -277,7 +203,7 @@
277
  box-shadow:0 20px 60px rgba(255,107,107,0.7)}
278
  .unmute-btn:active{transform:translateY(-2px) scale(1.02)}
279
 
280
- /* OPTIMIZED: Control Panel */
281
  .control-panel{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);
282
  display:flex;align-items:center;gap:16px;padding:16px 28px;
283
  background:rgba(0,0,0,0.9);backdrop-filter:blur(15px);
@@ -417,7 +343,7 @@
417
  footer{text-align:center;color:rgba(255,255,255,.8);font-size:14px;padding:30px;
418
  position:relative;z-index:2;text-shadow:0 0 8px rgba(255,255,255,0.2);font-weight:300}
419
 
420
- /* FIXED: Badges - Non-overlapping positioning */
421
  .live-badge{position:fixed;top:20px;left:20px;z-index:9999;display:inline-flex;align-items:center;gap:10px;
422
  padding:12px 20px;border-radius:30px;
423
  background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);border:1px solid rgba(255,107,107,.5);
@@ -436,7 +362,7 @@
436
  color:#4ecdc4;font-weight:600;font-size:15px;display:inline-flex;gap:12px;align-items:center;
437
  box-shadow:var(--shadow-medium);transform:translate3d(0,0,0)}
438
 
439
- /* FIXED: Emoji Panel - Mobile positioning fixed */
440
  .emoji-panel{position:absolute;right:20px;bottom:110px;z-index:6;display:flex;flex-direction:column;gap:18px}
441
  .emoji-btn{width:56px;height:56px;border-radius:50%;border:2px solid rgba(255,255,255,.35);
442
  background:rgba(0,0,0,.7);backdrop-filter:blur(10px);display:flex;align-items:center;justify-content:center;
@@ -469,7 +395,7 @@
469
  100%{transform:scale(1.6) rotate(360deg);opacity:0}
470
  }
471
 
472
- /* OPTIMIZED: Bubbles */
473
  #bubbles{position:fixed;inset:0;overflow:hidden;z-index:1;pointer-events:none}
474
  .bubble{position:absolute;bottom:-100px;border-radius:50%;
475
  background:linear-gradient(45deg,rgba(255,255,255,.12),rgba(255,107,107,.08));
@@ -510,124 +436,142 @@
510
  .audio-bar:nth-child(6){height:35px;animation-delay:0.5s}
511
  @keyframes audioVisualize{0%,100%{transform:scaleY(0.4)}50%{transform:scaleY(1.3)}}
512
 
513
- /* FIXED: MOBILE RESPONSIVE DESIGN - No overlapping elements */
514
- @media (max-width:768px) and (orientation:portrait){
515
- body{cursor:auto}
516
- .cursor,.cursor-trail{display:none !important}
517
 
518
- /* Hide desktop performance toggle on mobile */
 
 
 
519
  .performance-toggle,.performance-panel{display:none !important}
520
-
521
- /* Show mobile performance toggle */
522
- .mobile-perf-toggle{display:flex !important}
523
-
524
- header{padding:20px 0 0;transform:translateY(-100%);opacity:0}
525
- header.visible{transform:translateY(0);opacity:1}
 
 
 
 
 
526
  .divider{display:none}
527
- h1{font-size:clamp(28px,8vw,48px)}
528
 
529
- .panel{margin:0;max-width:none;border-radius:0;aspect-ratio:auto;position:fixed;inset:0;height:100vh;border:none}
530
- .panel::before{inset:-3px;border-radius:0}
531
- .panel::after{inset:-6px;border-radius:0}
532
- .panel:hover{transform:none}
533
- video{border-radius:0}
 
 
534
 
535
- /* FIXED: Control panel positioning for mobile */
536
  .control-panel{
537
- position:fixed;
538
- bottom:30px;
539
- left:50%;
540
- transform:translateX(-50%);
541
- gap:8px;
542
- padding:8px 16px;
 
543
  opacity:1 !important;
544
- background:rgba(0,0,0,0.95);
545
- backdrop-filter:blur(15px);
546
- border:1px solid rgba(255,107,107,0.4);
547
- z-index:50;
548
- box-shadow:var(--shadow-strong);
549
  }
550
- .mute-btn{width:40px;height:40px;border:1px solid rgba(255,107,107,0.5)}
551
- .mute-icon{font-size:16px}
552
- .volume-slider{width:50px;height:4px}
553
- .control-btn{width:32px;height:32px;font-size:12px}
 
 
 
 
 
 
 
 
 
 
 
 
554
 
555
- /* FIXED: Emoji panel mobile positioning - no overlap */
556
  .emoji-panel{
557
- position:fixed;
558
- right:15px;
559
- top:50%;
560
- transform:translateY(-50%);
561
- gap:12px;
562
- z-index:45;
563
  }
564
- .emoji-btn{width:48px;height:48px;font-size:22px;border:1.5px solid rgba(255,255,255,.4)}
565
- .emoji-count{right:60px;min-width:50px;height:28px;font-size:11px}
 
 
566
 
567
- /* FIXED: Badge positioning - no overlap */
568
- .live-badge{top:15px;left:15px;font-size:12px;padding:8px 12px;z-index:55}
569
- .reactions-badge{bottom:90px;left:15px;font-size:12px;padding:8px 12px;z-index:55}
570
-
571
- .chip{position:fixed;bottom:85px;right:15px;font-size:11px;padding:6px 10px;z-index:40}
572
- .audio-visualizer{position:fixed;bottom:85px;right:80px;z-index:40}
573
- .quality-indicator{top:60px;left:15px;font-size:10px;padding:4px 8px;z-index:40}
574
-
575
- .info,.schedule{position:relative;margin:0;border-radius:20px 20px 0 0;transform:translateY(-100%);opacity:0}
576
- .info.visible,.schedule.visible{transform:translateY(0);opacity:1}
577
-
578
- .bottom-sheet{
579
- position:fixed;left:0;right:0;bottom:0;z-index:35;
580
- background:rgba(0,0,0,.95);backdrop-filter:blur(15px);
581
- border-top:1px solid rgba(255,107,107,.5);
582
- max-height:45vh;overflow:auto;padding:15px;
583
- transform:translateY(100%);transition:transform 0.5s cubic-bezier(0.4,0,0.2,1);
584
- border-radius:25px 25px 0 0;box-shadow:var(--shadow-strong);
585
  }
586
- .bottom-sheet.visible{transform:translateY(0)}
587
-
588
- .auto-hide-indicator{
589
- position:fixed;bottom:150px;left:50%;transform:translateX(-50%);
590
- background:rgba(0,0,0,.9);color:rgba(255,255,255,.9);
591
- padding:8px 20px;border-radius:20px;font-size:12px;z-index:30;
592
- opacity:0;transition:opacity 0.4s ease;backdrop-filter:blur(10px);
593
- border:1px solid rgba(255,107,107,0.4);box-shadow:var(--shadow-soft);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
594
  }
595
- .auto-hide-indicator.visible{opacity:1}
596
- }
597
 
598
- /* Hide mobile performance toggle on desktop */
599
- @media (min-width:769px) {
600
- .mobile-perf-toggle,.mobile-perf-panel{display:none !important}
601
- .bottom-sheet{display:none !important}
602
- .auto-hide-indicator{display:none !important}
603
- }
604
 
605
- /* Enhanced Tablet Support */
606
- @media (max-width:1024px) and (min-width:769px) {
607
- .panel{max-width:95%;margin:15px auto 0}
608
- .emoji-panel{right:25px;bottom:120px;gap:14px}
609
- .control-panel{bottom:25px;gap:12px;padding:12px 22px}
610
  }
611
 
612
- /* Enhanced Large Desktop Support */
613
- @media (min-width:1400px) {
614
- .panel{max-width:1200px}
615
- .emoji-panel{gap:20px}
616
- .emoji-btn{width:60px;height:60px;font-size:28px}
617
- .control-panel{gap:18px;padding:18px 32px}
618
- .mute-btn{width:56px;height:56px}
619
- .volume-slider{width:120px}
620
  }
621
 
622
- /* OPTIMIZED: Performance optimizations */
623
- .low-performance *{animation-duration:4s !important}
624
- .low-performance .aurora{opacity:0.4}
625
- .low-performance .music-notes{display:none}
626
- .low-performance .corner-accent{display:none}
627
-
628
  @media (prefers-reduced-motion: reduce) {
629
- *{animation-duration:0.01ms !important;animation-iteration-count:1 !important;transition-duration:0.01ms !important}
630
- .aurora,.music-notes,.corner-accent{display:none}
631
  }
632
  </style>
633
  </head>
@@ -643,7 +587,7 @@
643
  <span class="mode-text" id="mode-text">Balanced</span>
644
  </div>
645
 
646
- <!-- Enhanced Desktop Performance Panel -->
647
  <div class="performance-panel" id="performance-panel">
648
  <h3>🎨 Visual Quality & Performance</h3>
649
  <div class="mode-grid">
@@ -667,63 +611,6 @@
667
  <div class="mode-name">Performance</div>
668
  <div class="mode-desc">Maximum speed & efficiency</div>
669
  </div>
670
- <div class="mode-card" data-mode="mobile-plus">
671
- <span class="mode-emoji">📱</span>
672
- <div class="mode-name">Mobile+</div>
673
- <div class="mode-desc">Ultra mobile optimization</div>
674
- </div>
675
- </div>
676
- <div class="perf-metrics">
677
- <h4>📊 Current Status</h4>
678
- <div class="metric-item">
679
- <span>Frame Rate:</span>
680
- <span class="metric-value" id="fps-display">60 FPS</span>
681
- </div>
682
- <div class="metric-item">
683
- <span>Effects Level:</span>
684
- <span class="metric-value" id="effects-level">Medium</span>
685
- </div>
686
- <div class="metric-item">
687
- <span>Particles:</span>
688
- <span class="metric-value" id="particles-count">4 Active</span>
689
- </div>
690
- </div>
691
- </div>
692
-
693
- <!-- Enhanced Mobile Performance Toggle -->
694
- <div class="mobile-perf-toggle" id="mobile-perf-toggle">
695
- <span class="perf-icon">⚙️</span>
696
- </div>
697
-
698
- <!-- Enhanced Mobile Performance Panel -->
699
- <div class="mobile-perf-panel" id="mobile-perf-panel">
700
- <h3>🎨 Visual Quality</h3>
701
- <div class="mode-grid">
702
- <div class="mode-card" data-mode="ultra">
703
- <span class="mode-emoji">🌟</span>
704
- <div class="mode-name">Ultra</div>
705
- <div class="mode-desc">Max</div>
706
- </div>
707
- <div class="mode-card" data-mode="high">
708
- <span class="mode-emoji">✨</span>
709
- <div class="mode-name">High</div>
710
- <div class="mode-desc">Rich</div>
711
- </div>
712
- <div class="mode-card active" data-mode="balanced">
713
- <span class="mode-emoji">⚖️</span>
714
- <div class="mode-name">Balanced</div>
715
- <div class="mode-desc">Optimal</div>
716
- </div>
717
- <div class="mode-card" data-mode="performance">
718
- <span class="mode-emoji">🚀</span>
719
- <div class="mode-name">Fast</div>
720
- <div class="mode-desc">Speed</div>
721
- </div>
722
- <div class="mode-card" data-mode="mobile-plus">
723
- <span class="mode-emoji">📱</span>
724
- <div class="mode-name">Mobile+</div>
725
- <div class="mode-desc">Ultra</div>
726
- </div>
727
  </div>
728
  </div>
729
 
@@ -731,7 +618,7 @@
731
  <div class="reactions-badge" id="today-reactions">Today ❤️0 🔥0 💃0 ✨0</div>
732
  <div id="bubbles"></div>
733
 
734
- <!-- Enhanced Keyboard Shortcuts Overlay -->
735
  <div class="shortcuts-overlay" id="shortcuts-overlay">
736
  <h3>⌨️ Keyboard Shortcuts</h3>
737
  <div class="shortcut-item">
@@ -762,10 +649,6 @@
762
  <span>Performance Toggle</span>
763
  <span class="shortcut-key">Q</span>
764
  </div>
765
- <div class="shortcut-item">
766
- <span>Mobile+ Mode</span>
767
- <span class="shortcut-key">Shift+M</span>
768
- </div>
769
  <div class="shortcut-item">
770
  <span>Show Shortcuts</span>
771
  <span class="shortcut-key">?</span>
@@ -797,7 +680,6 @@
797
  </video>
798
 
799
  <div class="quality-indicator quality-hd" id="quality-indicator">HD</div>
800
- <div class="chip" id="chip">Local: —</div>
801
 
802
  <div class="panel-accents">
803
  <div class="corner-accent"></div>
@@ -881,20 +763,13 @@
881
  <div id="rows"></div>
882
  </section>
883
 
884
- <!-- Mobile Bottom Sheet -->
885
- <div class="bottom-sheet" id="bottom-sheet">
886
- <section class="info">
887
- <h2 id="vtitle2">✨ Belly Dance Stream ✨</h2>
888
- <p id="vmeta2">Loading amazing content...</p>
889
- </section>
890
-
891
- <section class="schedule">
892
- <h3>✨ Today's Schedule ✨</h3>
893
- <div id="rows2"></div>
894
- </section>
895
  </div>
896
 
897
- <div class="auto-hide-indicator" id="auto-hide-indicator">
898
  Double tap to show schedule
899
  </div>
900
 
@@ -903,256 +778,311 @@
903
  </footer>
904
 
905
  <script>
906
- /* OPTIMIZED: Global Variables & Performance Monitoring */
907
- let frameCount = 0;
908
- let currentPerformanceMode = 'balanced';
909
- let maxFloatingElements = 4;
910
  let audioEnabled = false;
911
- let audioContext = null;
912
- let analyser = null;
913
  let isMuted = false;
914
  let currentVolume = 0.5;
915
- let currentDominantColor = '#ff6b6b';
916
- let mouseX = 0, mouseY = 0;
917
- let isFullscreen = false;
918
- let isPictureInPicture = false;
919
- let isTheaterMode = false;
920
- let isControlPanelVisible = false;
921
-
922
- /* OPTIMIZED: Performance Monitoring System */
923
- const performanceCheck = {
924
- lastTime: performance.now(),
925
- frameCount: 0,
926
- avgFps: 60,
927
- update() {
928
- const now = performance.now();
929
- this.frameCount++;
930
-
931
- if (now - this.lastTime >= 1000) {
932
- this.avgFps = Math.round((this.frameCount * 1000) / (now - this.lastTime));
933
- this.frameCount = 0;
934
- this.lastTime = now;
935
 
936
- // Auto-adjust performance mode based on FPS
937
- this.autoAdjustPerformance();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
938
  }
939
- },
940
-
941
- autoAdjustPerformance() {
942
- if (this.avgFps < 30 && currentPerformanceMode !== 'mobile-plus') {
943
- console.log('Low FPS detected, switching to Mobile+ mode');
944
- setPerformanceMode('mobile-plus');
945
- } else if (this.avgFps > 55 && currentPerformanceMode === 'mobile-plus') {
946
- console.log('FPS improved, switching to Performance mode');
947
- setPerformanceMode('performance');
 
 
 
 
 
 
 
 
 
 
 
 
 
948
  }
949
- }
950
- };
951
-
952
- /* OPTIMIZED: Performance Mode Configuration */
953
- const performanceModes = {
954
- 'ultra': { name: 'Ultra', icon: '🌟', particles: 8, animationSpeed: 1.0, effectIntensity: 1.0 },
955
- 'high': { name: 'High', icon: '✨', particles: 6, animationSpeed: 0.8, effectIntensity: 0.8 },
956
- 'balanced': { name: 'Balanced', icon: '⚖️', particles: 4, animationSpeed: 0.6, effectIntensity: 0.6 },
957
- 'performance': { name: 'Performance', icon: '🚀', particles: 2, animationSpeed: 0.4, effectIntensity: 0.4 },
958
- 'mobile-plus': { name: 'Mobile+', icon: '📱', particles: 1, animationSpeed: 0.2, effectIntensity: 0.2 }
959
- };
960
-
961
- /* OPTIMIZED: Performance Mode System */
962
- function initPerformanceModeSystem() {
963
- const desktopToggle = document.getElementById('performance-toggle');
964
- const desktopPanel = document.getElementById('performance-panel');
965
- const mobileToggle = document.getElementById('mobile-perf-toggle');
966
- const mobilePanel = document.getElementById('mobile-perf-panel');
967
-
968
- // Load saved preference with mobile auto-detection
969
- let savedMode = localStorage.getItem('performanceMode') || 'balanced';
970
-
971
- // Auto-suggest Mobile+ for mobile devices
972
- if (!localStorage.getItem('performanceMode') && isMobileDevice()) {
973
- savedMode = 'mobile-plus';
974
- }
975
 
976
- setPerformanceMode(savedMode);
 
 
 
 
 
 
 
977
 
978
- // Desktop toggle
979
- if (desktopToggle) {
980
- desktopToggle.addEventListener('click', function() {
981
- desktopPanel.classList.toggle('visible');
982
  });
983
- }
984
 
985
- // Mobile toggle
986
- if (mobileToggle) {
987
- mobileToggle.addEventListener('click', function() {
988
- mobilePanel.classList.toggle('visible');
 
 
 
989
  });
990
  }
991
 
992
- // Mode selection (both desktop and mobile)
993
- document.addEventListener('click', function(e) {
994
- const modeCard = e.target.closest('.mode-card');
995
- if (modeCard) {
996
- const mode = modeCard.getAttribute('data-mode');
997
- setPerformanceMode(mode);
998
-
999
- // Hide panels after selection
1000
- desktopPanel?.classList.remove('visible');
1001
- mobilePanel?.classList.remove('visible');
1002
- }
1003
- });
1004
 
1005
- // Close panels when clicking outside
1006
- document.addEventListener('click', function(e) {
1007
- if (!e.target.closest('.performance-toggle') && !e.target.closest('.performance-panel')) {
1008
- desktopPanel?.classList.remove('visible');
1009
- }
1010
- if (!e.target.closest('.mobile-perf-toggle') && !e.target.closest('.mobile-perf-panel')) {
1011
- mobilePanel?.classList.remove('visible');
1012
- }
1013
- });
1014
 
1015
- // Keyboard shortcuts
1016
- document.addEventListener('keydown', function(e) {
1017
- if (e.key.toLowerCase() === 'q' && !e.shiftKey) {
1018
- const modes = Object.keys(performanceModes);
1019
- const currentIndex = modes.indexOf(currentPerformanceMode);
1020
- const nextIndex = (currentIndex + 1) % modes.length;
1021
- setPerformanceMode(modes[nextIndex]);
1022
- } else if (e.key.toLowerCase() === 'm' && e.shiftKey) {
1023
- setPerformanceMode('mobile-plus');
1024
- }
1025
- });
1026
- }
1027
 
1028
- function setPerformanceMode(mode) {
1029
- if (!performanceModes[mode]) return;
1030
 
1031
- currentPerformanceMode = mode;
1032
- const config = performanceModes[mode];
 
 
 
 
1033
 
1034
- // Update body class
1035
- document.body.className = document.body.className.replace(/\b\w+-mode\b/g, '');
1036
- document.body.classList.add(mode + '-mode');
1037
 
1038
- // Update maxFloatingElements
1039
- maxFloatingElements = config.particles;
 
1040
 
1041
- // Update UI indicators
1042
- const modeText = document.getElementById('mode-text');
1043
- if (modeText) modeText.textContent = config.name;
 
1044
 
1045
- // Update active cards
1046
- document.querySelectorAll('.mode-card').forEach(card => {
1047
- card.classList.remove('active');
1048
- if (card.getAttribute('data-mode') === mode) {
1049
- card.classList.add('active');
1050
- }
1051
- });
1052
 
1053
- // Update mobile toggle icon
1054
- const mobileIcon = document.querySelector('.mobile-perf-toggle .perf-icon');
1055
- if (mobileIcon) mobileIcon.textContent = config.icon;
1056
 
1057
- // Save preference
1058
- localStorage.setItem('performanceMode', mode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1059
 
1060
- // Apply performance adjustments
1061
- applyPerformanceSettings();
1062
 
1063
- console.log(`Performance mode set to: ${config.name}`);
1064
- }
1065
 
1066
- function applyPerformanceSettings() {
1067
- const config = performanceModes[currentPerformanceMode];
 
 
 
1068
 
1069
- // Adjust animation speeds
1070
- const root = document.documentElement;
1071
- root.style.setProperty('--animation-speed', config.animationSpeed);
1072
- root.style.setProperty('--particle-count', config.particles);
1073
- root.style.setProperty('--effect-intensity', config.effectIntensity);
 
1074
 
1075
- // Update performance metrics display
1076
- updatePerformanceMetrics();
1077
- }
1078
 
1079
- function updatePerformanceMetrics() {
1080
- const fpsDisplay = document.getElementById('fps-display');
1081
- const effectsLevel = document.getElementById('effects-level');
1082
- const particlesCount = document.getElementById('particles-count');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1083
 
1084
- if (fpsDisplay) fpsDisplay.textContent = performanceCheck.avgFps + ' FPS';
1085
- if (effectsLevel) {
1086
- const levels = { ultra: 'Maximum', high: 'High', balanced: 'Medium', performance: 'Low', 'mobile-plus': 'Minimal' };
1087
- effectsLevel.textContent = levels[currentPerformanceMode];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1088
  }
1089
- if (particlesCount) particlesCount.textContent = maxFloatingElements + ' Active';
1090
- }
1091
 
1092
- /* OPTIMIZED: Cursor System - Desktop Only */
1093
- let trailCount = 0;
1094
- const maxTrails = 3;
1095
 
1096
- function initOptimizedCursor(){
1097
- if (isMobileDevice()) return;
 
 
 
 
 
1098
 
1099
- const cursor = document.getElementById('cursor');
1100
- let isMoving = false;
1101
- let moveTimeout;
 
 
 
1102
 
1103
- document.addEventListener('mousemove', function(e) {
1104
- mouseX = e.clientX;
1105
- mouseY = e.clientY;
 
 
 
 
 
 
1106
 
1107
- cursor.style.transform = `translate3d(${mouseX - 10}px, ${mouseY - 10}px, 0)`;
 
 
 
 
 
1108
 
1109
- isMoving = true;
1110
- clearTimeout(moveTimeout);
 
 
 
 
1111
 
1112
- // Optimized trail with performance limits
1113
- const config = performanceModes[currentPerformanceMode];
1114
- const shouldCreateTrail = Math.random() > (0.9 - (config.effectIntensity * 0.1));
1115
-
1116
- if(shouldCreateTrail && trailCount < maxTrails) {
1117
- trailCount++;
1118
- const trail = document.createElement('div');
1119
- trail.className = 'cursor-trail';
1120
- trail.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
1121
- document.body.appendChild(trail);
1122
-
1123
- setTimeout(function() {
1124
- if (trail.parentNode) {
1125
- trail.remove();
1126
- trailCount--;
1127
- }
1128
- }, 800);
1129
- }
1130
 
1131
- moveTimeout = setTimeout(() => { isMoving = false; }, 150);
1132
- });
 
 
 
 
 
1133
 
1134
- // Optimized hover effects
1135
- const interactiveElements = 'button, .control-btn, .emoji-btn, .mute-btn, .row, .shortcut-item, .mode-card, .performance-toggle';
1136
 
1137
- document.addEventListener('mouseenter', function(e) {
1138
- if (e.target.matches(interactiveElements)) {
1139
- cursor.classList.add('hover');
1140
- }
1141
- }, true);
 
1142
 
1143
- document.addEventListener('mouseleave', function(e) {
1144
- if (e.target.matches(interactiveElements)) {
1145
- cursor.classList.remove('hover');
1146
  }
1147
- }, true);
1148
- }
1149
 
1150
- function isMobileDevice() {
1151
- return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
1152
- (window.innerWidth <= 768 && 'ontouchstart' in window);
1153
  }
1154
 
1155
- /* OPTIMIZED: Audio Enable */
1156
  function initSimpleAudioEnable() {
1157
  const overlay = document.getElementById('unmute-overlay');
1158
  const unmuteBtn = document.getElementById('unmute-btn');
@@ -1167,15 +1097,6 @@ function initSimpleAudioEnable() {
1167
  document.getElementById('mute-btn').classList.remove('muted');
1168
  overlay.classList.add('hidden');
1169
  localStorage.setItem('audioEnabled', 'true');
1170
-
1171
- try {
1172
- if (!audioContext) {
1173
- audioContext = new (window.AudioContext || window.webkitAudioContext)();
1174
- initOptimizedAudioAnalysis();
1175
- }
1176
- } catch (e) {
1177
- console.log('Audio context creation failed, continuing without visualizer');
1178
- }
1179
  });
1180
 
1181
  if (localStorage.getItem('audioEnabled') === 'true') {
@@ -1184,7 +1105,7 @@ function initSimpleAudioEnable() {
1184
  }
1185
  }
1186
 
1187
- /* OPTIMIZED: Schedules */
1188
  const SCHEDULE_A = [
1189
  { title:"Dance in Front of the Library of Alexandria", url:"https://ik.imagekit.io/plerqlkuh/A%20dance%20in%20front%20of%20the%20Library%20of%20Alexandria.mp4", duration:155, start:0, end:2.667 },
1190
  { title:"✨ Belly dance ✨ - sensual dance", url:"https://ik.imagekit.io/plerqlkuh/%E2%9C%A8%20Belly%20dance%20%E2%9C%A8%20-%20-%20sensual%20dance.mp4", duration:113, start:2.667, end:5.333 },
@@ -1221,7 +1142,7 @@ function utcDayIndex(){ return (new Date()).getUTCDay(); }
1221
  function secFmt(s){return `${Math.floor(s/60)}:${String(s%60).padStart(2,'0')}`;}
1222
  function clamp(n,min,max){return Math.max(min,Math.min(max,n));}
1223
 
1224
- /* OPTIMIZED: Control Functions */
1225
  function initMuteControl() {
1226
  const muteBtn = document.getElementById('mute-btn');
1227
  const muteIcon = document.getElementById('mute-icon');
@@ -1243,10 +1164,6 @@ function initMuteControl() {
1243
  muteIcon.textContent = '🔊';
1244
  muteBtn.classList.remove('muted');
1245
  }
1246
-
1247
- // Optimized animation
1248
- muteBtn.style.transform = 'scale(1.25)';
1249
- setTimeout(() => { muteBtn.style.transform = ''; }, 200);
1250
  });
1251
  }
1252
 
@@ -1284,6 +1201,7 @@ function initVolumeControl() {
1284
 
1285
  function initTheaterMode() {
1286
  const theaterBtn = document.getElementById('theater-btn');
 
1287
 
1288
  theaterBtn.addEventListener('click', function() {
1289
  isTheaterMode = !isTheaterMode;
@@ -1294,6 +1212,8 @@ function initTheaterMode() {
1294
 
1295
  function initFullscreenControl() {
1296
  const fullscreenBtn = document.getElementById('fullscreen-btn');
 
 
1297
  const panel = document.getElementById('panel');
1298
 
1299
  fullscreenBtn.addEventListener('click', function() {
@@ -1318,6 +1238,8 @@ function initFullscreenControl() {
1318
 
1319
  function initPictureInPictureControl() {
1320
  const pipBtn = document.getElementById('pip-btn');
 
 
1321
  const player = document.getElementById('player');
1322
 
1323
  pipBtn.addEventListener('click', async function() {
@@ -1347,6 +1269,8 @@ function initKeyboardShortcuts() {
1347
  const shortcutsBtn = document.getElementById('shortcuts-btn');
1348
  const shortcutsOverlay = document.getElementById('shortcuts-overlay');
1349
 
 
 
1350
  shortcutsBtn.addEventListener('click', function() {
1351
  shortcutsOverlay.classList.toggle('visible');
1352
  });
@@ -1363,13 +1287,13 @@ function initKeyboardShortcuts() {
1363
  if (!e.shiftKey) document.getElementById('mute-btn').click();
1364
  break;
1365
  case 'f':
1366
- document.getElementById('fullscreen-btn').click();
1367
  break;
1368
  case 't':
1369
- document.getElementById('theater-btn').click();
1370
  break;
1371
  case 'p':
1372
- document.getElementById('pip-btn').click();
1373
  break;
1374
  case 'arrowup':
1375
  e.preventDefault();
@@ -1388,13 +1312,15 @@ function initKeyboardShortcuts() {
1388
  }
1389
  break;
1390
  case '?':
1391
- shortcutsOverlay.classList.toggle('visible');
1392
  break;
1393
  }
1394
  });
1395
  }
1396
 
1397
  function initControlPanelVisibility() {
 
 
1398
  const panel = document.getElementById('panel');
1399
  const controlPanel = document.getElementById('control-panel');
1400
 
@@ -1462,267 +1388,50 @@ function initQualityIndicator() {
1462
  });
1463
  }
1464
 
1465
- /* OPTIMIZED: Floating Elements with Performance Limits */
1466
- let activeFloatingElements = 0;
1467
- let noteCreateTimer = null;
1468
-
1469
- function createOptimizedFloatingNote(){
1470
- const config = performanceModes[currentPerformanceMode];
1471
- if(activeFloatingElements >= config.particles) return;
1472
-
1473
- const notes = ['♪', '♫', '♬', '♩', '𝄞', '𝄢'];
1474
- const note = document.createElement('div');
1475
- note.className = 'note';
1476
- note.textContent = notes[Math.floor(Math.random() * notes.length)];
1477
- note.style.left = Math.random() * 100 + 'vw';
1478
- note.style.animationDuration = ((10 + Math.random() * 4) / config.animationSpeed) + 's';
1479
- note.style.fontSize = (20 + Math.random() * 8) + 'px';
1480
- note.style.opacity = 0.3 * config.effectIntensity;
1481
-
1482
- activeFloatingElements++;
1483
- document.getElementById('music-notes').appendChild(note);
1484
-
1485
- setTimeout(function() {
1486
- if (note.parentNode) {
1487
- note.remove();
1488
- activeFloatingElements--;
1489
- }
1490
- }, 12000 / config.animationSpeed);
1491
- }
1492
-
1493
- function initOptimizedColorSampling(){
1494
- const canvas = document.getElementById('color-canvas');
1495
- const ctx = canvas.getContext('2d');
1496
- const video = document.getElementById('player');
1497
- let colorSampleTimer = null;
1498
-
1499
- function sampleColors(){
1500
- if(!video.videoWidth || !video.videoHeight) return;
1501
-
1502
- canvas.width = 30;
1503
- canvas.height = 20;
1504
-
1505
- try{
1506
- ctx.drawImage(video, 0, 0, 30, 20);
1507
- const imageData = ctx.getImageData(5, 5, 20, 10);
1508
- const data = imageData.data;
1509
-
1510
- let r = 0, g = 0, b = 0, count = 0;
1511
-
1512
- for(let i = 0; i < data.length; i += 20) {
1513
- r += data[i];
1514
- g += data[i + 1];
1515
- b += data[i + 2];
1516
- count++;
1517
- }
1518
-
1519
- if(count > 0){
1520
- r = Math.floor(r / count);
1521
- g = Math.floor(g / count);
1522
- b = Math.floor(b / count);
1523
- updateDynamicColors(r, g, b);
1524
- }
1525
- }catch(e){
1526
- // Fallback to time-based colors
1527
- const time = Date.now() / 2500;
1528
- const r = Math.floor(128 + 127 * Math.sin(time * 0.15));
1529
- const g = Math.floor(128 + 127 * Math.sin(time * 0.25));
1530
- const b = Math.floor(128 + 127 * Math.sin(time * 0.35));
1531
- updateDynamicColors(r, g, b);
1532
- }
1533
- }
1534
-
1535
- const config = performanceModes[currentPerformanceMode];
1536
- const interval = Math.max(500, 1000 / config.animationSpeed);
1537
-
1538
- colorSampleTimer = setInterval(sampleColors, interval);
1539
- }
1540
-
1541
- function updateDynamicColors(r, g, b){
1542
- const root = document.documentElement;
1543
- const config = performanceModes[currentPerformanceMode];
1544
-
1545
- const intensity = 40 * config.effectIntensity;
1546
- const enhancedR = Math.min(255, r + intensity);
1547
- const enhancedG = Math.min(255, g + intensity * 0.625);
1548
- const enhancedB = Math.min(255, b + intensity * 1.25);
1549
-
1550
- const compR = Math.max(0, 255 - r + intensity * 0.625);
1551
- const compG = Math.max(0, 255 - g + intensity * 0.5);
1552
- const compB = Math.max(0, 255 - b + intensity * 0.875);
1553
-
1554
- root.style.setProperty('--neon-primary', `rgb(${enhancedR}, ${enhancedG}, ${enhancedB})`);
1555
- root.style.setProperty('--neon-secondary', `rgb(${compR}, ${compG}, ${compB})`);
1556
-
1557
- currentDominantColor = `rgb(${enhancedR}, ${enhancedG}, ${enhancedB})`;
1558
- }
1559
-
1560
- function initOptimizedAudioAnalysis(){
1561
- if (!audioEnabled || !audioContext) return;
1562
-
1563
- const video = document.getElementById('player');
1564
-
1565
- try{
1566
- const source = audioContext.createMediaElementSource(video);
1567
- analyser = audioContext.createAnalyser();
1568
-
1569
- source.connect(analyser);
1570
- analyser.connect(audioContext.destination);
1571
-
1572
- analyser.fftSize = 64;
1573
- const bufferLength = analyser.frequencyBinCount;
1574
- const dataArray = new Uint8Array(bufferLength);
1575
-
1576
- let visualizerFrame = 0;
1577
-
1578
- function updateVisualizer(){
1579
- const config = performanceModes[currentPerformanceMode];
1580
-
1581
- // Throttle updates based on performance mode
1582
- if(visualizerFrame % Math.max(1, Math.floor(4 / config.animationSpeed)) !== 0) {
1583
- visualizerFrame++;
1584
- requestAnimationFrame(updateVisualizer);
1585
- return;
1586
- }
1587
-
1588
- analyser.getByteFrequencyData(dataArray);
1589
-
1590
- const bars = document.querySelectorAll('.audio-bar');
1591
- bars.forEach(function(bar, i) {
1592
- const value = dataArray[i] || 0;
1593
- const normalizedValue = value / 255;
1594
- const height = Math.max(8, normalizedValue * 50 * config.effectIntensity);
1595
- bar.style.height = height + 'px';
1596
- });
1597
-
1598
- visualizerFrame++;
1599
- requestAnimationFrame(updateVisualizer);
1600
- }
1601
-
1602
- updateVisualizer();
1603
-
1604
- }catch(e){
1605
- // Fallback to random visualization
1606
- const bars = document.querySelectorAll('.audio-bar');
1607
- bars.forEach(function(bar, i) {
1608
- const config = performanceModes[currentPerformanceMode];
1609
- const interval = Math.max(100, (120 + Math.random() * 180) / config.animationSpeed);
1610
-
1611
- setInterval(function() {
1612
- const randomHeight = (8 + Math.random() * 40) * config.effectIntensity;
1613
- bar.style.height = randomHeight + 'px';
1614
- }, interval);
1615
- });
1616
- }
1617
- }
1618
-
1619
- /* Schedule and Content Management */
1620
  function todaySchedule(){
1621
  const d = utcDayIndex();
1622
  if(d===1 || d===2 || d===3) return { which:'A (Mon-Tue-Wed)', list: SCHEDULE_A };
1623
  return { which:'B (Thu-Fri-Sat-Sun)', list: SCHEDULE_B };
1624
  }
1625
 
1626
- // Cache DOM elements for better performance
1627
  const $player = document.getElementById('player');
1628
  const $vtitle = document.getElementById('vtitle');
1629
  const $vmeta = document.getElementById('vmeta');
1630
- const $vtitle2 = document.getElementById('vtitle2');
1631
- const $vmeta2 = document.getElementById('vmeta2');
1632
- const $chip = document.getElementById('chip');
1633
  const $rows = document.getElementById('rows');
1634
- const $rows2 = document.getElementById('rows2');
1635
- const $ht = document.getElementById('header-time');
1636
  const $todayTitle = document.getElementById('schedule-title');
1637
- const $bottom = document.getElementById('bottom-sheet');
1638
- const $indicator = document.getElementById('auto-hide-indicator');
1639
- const $header = document.getElementById('main-header');
1640
- const $info = document.getElementById('main-info');
1641
- const $schedule = document.getElementById('main-schedule');
1642
- const $welcomeNeon = document.getElementById('welcome-neon');
1643
-
1644
- function initWelcomeText() {
1645
- if (localStorage.getItem('proWelcomeShown') === 'true') {
1646
- $welcomeNeon.style.display = 'none';
1647
- return;
1648
- }
1649
-
1650
- setTimeout(function() {
1651
- $welcomeNeon.style.display = 'none';
1652
- localStorage.setItem('proWelcomeShown', 'true');
1653
- }, 5000);
1654
- }
1655
-
1656
- let autoHideTimer = null;
1657
- let isScheduleVisible = false;
1658
-
1659
- function showSchedule() {
1660
- if (!isMobilePortrait()) return;
1661
- $header.classList.add('visible');
1662
- $info.classList.add('visible');
1663
- $schedule.classList.add('visible');
1664
- $bottom.classList.add('visible');
1665
- isScheduleVisible = true;
1666
-
1667
- if (autoHideTimer) clearTimeout(autoHideTimer);
1668
- autoHideTimer = setTimeout(hideSchedule, 6000);
1669
- }
1670
-
1671
- function hideSchedule() {
1672
- if (!isMobilePortrait()) return;
1673
- $header.classList.remove('visible');
1674
- $info.classList.remove('visible');
1675
- $schedule.classList.remove('visible');
1676
- $bottom.classList.remove('visible');
1677
- isScheduleVisible = false;
1678
- if (autoHideTimer) {
1679
- clearTimeout(autoHideTimer);
1680
- autoHideTimer = null;
1681
- }
1682
- showIndicator();
1683
- }
1684
-
1685
- function showIndicator() {
1686
- if (!isMobilePortrait()) return;
1687
- $indicator.classList.add('visible');
1688
- setTimeout(function() { $indicator.classList.remove('visible'); }, 3000);
1689
- }
1690
-
1691
- let lastClickTime = 0;
1692
- const doubleClickDelay = 400;
1693
-
1694
- document.addEventListener('click', function(e) {
1695
- if (!isMobilePortrait()) return;
1696
- if (e.target.closest('.emoji-btn') || e.target.closest('.bottom-sheet') ||
1697
- e.target.closest('header') || e.target.closest('.info') || e.target.closest('.schedule') ||
1698
- e.target.closest('.control-panel') || e.target.closest('.mobile-perf-toggle') ||
1699
- e.target.closest('.mobile-perf-panel')) return;
1700
-
1701
- const currentTime = new Date().getTime();
1702
- const timeDiff = currentTime - lastClickTime;
1703
-
1704
- if (timeDiff < doubleClickDelay) {
1705
- e.preventDefault();
1706
- if (!isScheduleVisible) showSchedule();
1707
- }
1708
- lastClickTime = currentTime;
1709
- });
1710
 
1711
  function renderScheduleUI(){
1712
  const sel = todaySchedule();
1713
  const list = sel.list;
1714
- $rows.innerHTML = '';
1715
- list.forEach(function(v, idx) {
1716
- const div = document.createElement('div');
1717
- div.className = 'row';
1718
- div.innerHTML = '<div class="time">' + formatHourRange(v.start,v.end) + '</div><div class="name">' + v.title + '</div>';
1719
- $rows.appendChild(div);
1720
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
1721
 
1722
- if($rows2) $rows2.innerHTML = $rows.innerHTML;
1723
  const dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
1724
  const d = utcDayIndex();
1725
- $todayTitle.textContent = '✨ Global Schedule (UTC) — ' + dayNames[d] + ' — Set ' + sel.which;
 
 
1726
  }
1727
 
1728
  function formatHourRange(startH, endH){
@@ -1738,8 +1447,10 @@ renderScheduleUI();
1738
 
1739
  function updateHeader(){
1740
  const n = new Date();
1741
- $ht.textContent = 'Local: ' + n.toLocaleTimeString() + ' | UTC: ' + n.toUTCString().split(' ')[4];
1742
- if($chip) $chip.textContent = 'Local: ' + n.toLocaleTimeString();
 
 
1743
  }
1744
  setInterval(updateHeader,1000);
1745
  updateHeader();
@@ -1783,12 +1494,10 @@ function schedulePlay(){
1783
  console.log('Autoplay prevented (normal behavior)');
1784
  });
1785
 
1786
- $vtitle.textContent = v.title;
1787
- $vmeta.textContent = 'Duration: ' + secFmt(v.duration);
1788
- if($vtitle2) $vtitle2.textContent = v.title;
1789
- if($vmeta2) $vmeta2.textContent = 'Duration: ' + secFmt(v.duration);
1790
 
1791
- const rowNodes = document.querySelectorAll('#rows .row, #rows2 .row');
1792
  rowNodes.forEach(function(r,i) {
1793
  r.classList.toggle('active', (i%list.length)===idx);
1794
  });
@@ -1810,42 +1519,9 @@ $player.addEventListener('loadedmetadata', function(){
1810
  } else {
1811
  $player.style.objectFit = 'cover';
1812
  }
1813
-
1814
- setTimeout(function() {
1815
- initOptimizedColorSampling();
1816
- }, 1000);
1817
  });
1818
 
1819
- /* OPTIMIZED: Bubble System */
1820
- let activeBubbles = 0;
1821
- const maxBubbles = 10;
1822
-
1823
- function createOptimizedBubble(){
1824
- const config = performanceModes[currentPerformanceMode];
1825
- if(activeBubbles >= Math.min(maxBubbles, config.particles)) return;
1826
-
1827
- const b = document.createElement('div');
1828
- b.className = 'bubble';
1829
- const s = (25 + Math.random() * 70) * config.effectIntensity;
1830
- b.style.width = s + 'px';
1831
- b.style.height = s + 'px';
1832
- b.style.left = (Math.random() * 100) + 'vw';
1833
- b.style.animationDuration = ((25 + Math.random() * 25) / config.animationSpeed) + 's';
1834
- b.style.opacity = 0.5 * config.effectIntensity;
1835
-
1836
- activeBubbles++;
1837
- document.getElementById('bubbles').appendChild(b);
1838
-
1839
- setTimeout(function() {
1840
- if (b.parentNode) {
1841
- b.remove();
1842
- activeBubbles--;
1843
- }
1844
- }, 40000 / config.animationSpeed);
1845
- }
1846
-
1847
- /* OPTIMIZED: Live Count System */
1848
- const $liveCount = document.getElementById('live-count');
1849
  const BUCKETS = [
1850
  {start:0,end:6,min:700,max:2000},
1851
  {start:6,end:12,min:1400,max:3500},
@@ -1862,7 +1538,7 @@ function initLive(){
1862
  liveBucket = bucketFor(h);
1863
  const span = liveBucket.max - liveBucket.min;
1864
  liveCount = liveBucket.min + Math.floor(span * (0.3 + Math.random()*0.4));
1865
- $liveCount.textContent = liveCount.toLocaleString();
1866
  }
1867
  function tickLive(){
1868
  const h = nowHour();
@@ -1873,7 +1549,7 @@ function tickLive(){
1873
  } else {
1874
  liveCount = clamp(liveCount + randStep(), liveBucket.min, liveBucket.max);
1875
  }
1876
- $liveCount.textContent = liveCount.toLocaleString();
1877
  liveTimer = setTimeout(tickLive, delay());
1878
  }
1879
  document.addEventListener('visibilitychange', function(){
@@ -1883,7 +1559,7 @@ document.addEventListener('visibilitychange', function(){
1883
  initLive();
1884
  liveTimer = setTimeout(tickLive, delay());
1885
 
1886
- /* OPTIMIZED: Reactions System */
1887
  const EMOJIS = [{key:'heart',sym:'❤️'},{key:'fire',sym:'🔥'},{key:'dancer',sym:'💃'},{key:'spark',sym:'✨'}];
1888
  const STORAGE_PREFIX = 'pro-reactions:';
1889
  function utcDateKey(){ const d=new Date(); return d.getUTCFullYear() + '-' + String(d.getUTCMonth()+1).padStart(2,'0') + '-' + String(d.getUTCDate()).padStart(2,'0'); }
@@ -1918,21 +1594,31 @@ function saveLocalInc(type){
1918
  }catch(e){}
1919
  }
1920
  function renderReactions(){
1921
- document.getElementById('count-heart').textContent = reactionCounts.heart.toLocaleString();
1922
- document.getElementById('count-fire').textContent = reactionCounts.fire.toLocaleString();
1923
- document.getElementById('count-dancer').textContent = reactionCounts.dancer.toLocaleString();
1924
- document.getElementById('count-spark').textContent = reactionCounts.spark.toLocaleString();
1925
- document.getElementById('today-reactions').textContent =
1926
- 'Today ❤️' + reactionCounts.heart + ' 🔥' + reactionCounts.fire + ' 💃' + reactionCounts.dancer + ' ✨' + reactionCounts.spark;
 
 
 
 
 
 
 
 
 
 
 
1927
  }
1928
 
1929
- /* OPTIMIZED: Particle System */
1930
  let activeParticles = 0;
1931
- const maxParticles = 15;
1932
 
1933
  function spawnOptimizedParticles(type, x, y){
1934
- const config = performanceModes[currentPerformanceMode];
1935
- if(activeParticles > maxParticles * config.effectIntensity) return;
1936
 
1937
  const pane = document.getElementById('panel').getBoundingClientRect();
1938
  const burst = document.createElement('div');
@@ -1941,7 +1627,6 @@ function spawnOptimizedParticles(type, x, y){
1941
  burst.style.top=(y-pane.top-25)+'px';
1942
  burst.textContent = EMOJIS.find(function(e) { return e.key===type; }).sym;
1943
  burst.style.fontSize='35px';
1944
- burst.style.filter = 'drop-shadow(0 0 15px ' + currentDominantColor + ')';
1945
  document.getElementById('panel').appendChild(burst);
1946
  activeParticles++;
1947
 
@@ -1952,7 +1637,7 @@ function spawnOptimizedParticles(type, x, y){
1952
  }
1953
  }, 1000);
1954
 
1955
- const particleCount = Math.floor((config.effectIntensity > 0.5 ? 8 : 4) * config.effectIntensity);
1956
  for(let i=0;i<particleCount;i++){
1957
  const p = document.createElement('div');
1958
  p.className='particle';
@@ -1960,8 +1645,6 @@ function spawnOptimizedParticles(type, x, y){
1960
  p.style.left = (x - pane.left + (Math.random()*80-40)) + 'px';
1961
  p.style.top = (y - pane.top + (Math.random()*40-20)) + 'px';
1962
  p.style.animationDelay = (Math.random()*300) + 'ms';
1963
- p.style.animationDuration = (2 / config.animationSpeed) + 's';
1964
- p.style.filter = 'drop-shadow(0 0 10px ' + currentDominantColor + ')';
1965
  document.getElementById('panel').appendChild(p);
1966
  activeParticles++;
1967
 
@@ -1976,6 +1659,8 @@ function spawnOptimizedParticles(type, x, y){
1976
 
1977
  function setupEmojiClicks(){
1978
  const panel = document.getElementById('emoji-panel');
 
 
1979
  panel.addEventListener('click', function(ev){
1980
  const btn = ev.target.closest('.emoji-btn');
1981
  if(!btn) return;
@@ -1987,10 +1672,6 @@ function setupEmojiClicks(){
1987
  saveLocalInc(type);
1988
  renderReactions();
1989
  spawnOptimizedParticles(type, x, y);
1990
-
1991
- // Optimized animation
1992
- btn.style.transform = 'scale(1.2) rotateZ(15deg)';
1993
- setTimeout(() => { btn.style.transform = ''; }, 300);
1994
  });
1995
  }
1996
  loadReactions();
@@ -2003,88 +1684,25 @@ function msToNextUtcMidnight(){
2003
  }
2004
  setTimeout(function() { location.reload(); }, msToNextUtcMidnight()+1500);
2005
 
2006
- function isMobilePortrait(){
2007
- return window.matchMedia('(max-width:768px) and (orientation:portrait)').matches;
2008
- }
2009
-
2010
- function applyMobileLayout(){
2011
- if(isMobilePortrait()) {
2012
- setTimeout(showSchedule, 800);
2013
- } else {
2014
- $header.classList.add('visible');
2015
- $info.classList.add('visible');
2016
- $schedule.classList.add('visible');
2017
- $bottom.classList.remove('visible');
2018
- if (autoHideTimer) {
2019
- clearTimeout(autoHideTimer);
2020
- autoHideTimer = null;
2021
- }
2022
- }
2023
- }
2024
-
2025
- // OPTIMIZED: Initialize everything with proper cleanup
2026
  document.addEventListener('DOMContentLoaded', function() {
2027
- // Initialize performance mode system first
2028
- initPerformanceModeSystem();
2029
-
2030
  initSimpleAudioEnable();
2031
- initWelcomeText();
2032
-
2033
- if (!isMobileDevice()) {
2034
- initOptimizedCursor();
2035
- }
2036
-
2037
- applyMobileLayout();
2038
- window.addEventListener('resize', applyMobileLayout);
2039
-
2040
  initMuteControl();
2041
  initVolumeControl();
2042
- initTheaterMode();
2043
- initFullscreenControl();
2044
- initPictureInPictureControl();
2045
- initKeyboardShortcuts();
2046
- initControlPanelVisibility();
 
 
 
 
2047
  initProgressBar();
2048
  initQualityIndicator();
2049
-
2050
  schedulePlay();
2051
-
2052
- // OPTIMIZED: Performance-aware intervals with cleanup
2053
- const noteInterval = setInterval(function() {
2054
- const config = performanceModes[currentPerformanceMode];
2055
- if(Math.random() > (1 - config.effectIntensity * 0.5)) {
2056
- createOptimizedFloatingNote();
2057
- }
2058
- }, 4000);
2059
-
2060
- const bubbleInterval = setInterval(function() {
2061
- const config = performanceModes[currentPerformanceMode];
2062
- if(Math.random() > (1 - config.effectIntensity * 0.6)) {
2063
- createOptimizedBubble();
2064
- }
2065
- }, 1500);
2066
-
2067
- // OPTIMIZED: Performance monitoring with throttling
2068
- function optimizedPerformanceMonitor() {
2069
- frameCount++;
2070
-
2071
- // Only update performance check every 60 frames
2072
- if (frameCount % 60 === 0) {
2073
- performanceCheck.update();
2074
- }
2075
-
2076
- requestAnimationFrame(optimizedPerformanceMonitor);
2077
- }
2078
- requestAnimationFrame(optimizedPerformanceMonitor);
2079
-
2080
- // Cleanup on page unload
2081
- window.addEventListener('beforeunload', function() {
2082
- clearInterval(noteInterval);
2083
- clearInterval(bubbleInterval);
2084
- if (playTimer) clearTimeout(playTimer);
2085
- if (liveTimer) clearTimeout(liveTimer);
2086
- if (autoHideTimer) clearTimeout(autoHideTimer);
2087
- });
2088
  });
2089
 
2090
  </script>
 
16
 
17
  *{box-sizing:border-box}
18
 
19
+ /* DESKTOP-FIRST: Full Experience */
20
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=Playfair+Display:wght@400;500;600;700;800;900&display=swap');
21
 
22
  body{margin:0;color:#f8f8f8;font-family:'Inter','Segoe UI',system-ui,-apple-system,Roboto,Arial,sans-serif;
 
24
  cursor:none;font-weight:400;letter-spacing:-0.025em;
25
  transform:translate3d(0,0,0);will-change:auto}
26
 
27
+ /* Multi-Layer Background System */
28
  body::before{content:'';position:fixed;inset:0;z-index:0;
29
  background:
30
  radial-gradient(ellipse 800px 400px at 20% 30%, rgba(157,78,221,0.15) 0%, transparent 50%),
 
34
  animation:breathing 15s ease-in-out infinite;transform:translate3d(0,0,0)}
35
  @keyframes breathing{0%,100%{opacity:0.85;transform:translate3d(0,0,0) scale(1)}50%{opacity:1;transform:translate3d(0,0,0) scale(1.02)}}
36
 
37
+ /* Aurora Effect */
38
  .aurora{position:fixed;inset:0;z-index:1;pointer-events:none;
39
  background:
40
  linear-gradient(45deg,
 
48
  @keyframes aurora{0%,100%{background-position:0% 0%, 100% 100%}50%{background-position:100% 100%, 0% 0%}}
49
  @keyframes auroraPulse{0%,100%{opacity:0.6}50%{opacity:1}}
50
 
51
+ /* Cursor System - Desktop Only */
52
  .cursor{position:fixed;width:20px;height:20px;border-radius:50%;
53
  background:radial-gradient(circle,rgba(255,107,107,0.9) 0%,rgba(78,205,196,0.4) 50%,transparent 100%);
54
  pointer-events:none;z-index:999999;mix-blend-mode:screen;
55
  transition:all 0.12s cubic-bezier(0.4,0,0.2,1);transform:translate3d(0,0,0);
56
  left:0;top:0;will-change:transform;
57
  box-shadow:0 0 20px rgba(255,107,107,0.6), 0 0 40px rgba(255,107,107,0.3)}
 
 
 
 
 
 
 
58
  .cursor.hover{transform:scale(1.8) !important;
59
  background:radial-gradient(circle,rgba(255,107,107,1) 0%,rgba(78,205,196,0.6) 40%,rgba(157,78,221,0.3) 100%);
60
  box-shadow:0 0 30px rgba(255,107,107,0.8), 0 0 60px rgba(255,107,107,0.4)}
 
63
  animation:trailFade 0.8s cubic-bezier(0.4,0,0.2,1) forwards}
64
  @keyframes trailFade{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.3)}}
65
 
 
 
66
  /* Desktop Performance Toggle */
67
  .performance-toggle{position:fixed;top:20px;right:20px;z-index:10000;
68
  display:flex;align-items:center;gap:10px;padding:10px 16px;
 
76
  .performance-toggle .mode-icon{font-size:16px;transition:all 0.3s ease}
77
  .performance-toggle .mode-text{font-family:'Inter',sans-serif;letter-spacing:0.3px}
78
 
79
+ /* Performance Settings Panel */
80
  .performance-panel{position:fixed;top:70px;right:20px;z-index:9999;
81
  background:rgba(0,0,0,0.95);backdrop-filter:blur(15px);
82
  border-radius:20px;padding:25px;border:1px solid rgba(255,255,255,0.15);
 
88
  .performance-panel h3{color:var(--gold);margin:0 0 20px;font-size:18px;
89
  font-weight:700;text-align:center;font-family:'Playfair Display',serif}
90
 
91
+ /* Mode Selection Grid */
92
  .mode-grid{display:grid;grid-template-columns:repeat(2, 1fr);gap:10px;margin-bottom:20px}
93
  .mode-card{padding:12px;border-radius:12px;cursor:pointer;
94
  border:2px solid rgba(255,255,255,0.1);
 
102
  .mode-card .mode-name{font-size:13px;font-weight:600;margin-bottom:4px}
103
  .mode-card .mode-desc{font-size:10px;opacity:0.7;line-height:1.3}
104
 
105
+ /* Performance Modes */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  .ultra-mode{--animation-speed:1;--particle-count:8;--effect-intensity:1}
107
  .high-mode{--animation-speed:0.8;--particle-count:6;--effect-intensity:0.8}
108
  .balanced-mode{--animation-speed:0.6;--particle-count:4;--effect-intensity:0.6}
109
  .performance-mode{--animation-speed:0.4;--particle-count:2;--effect-intensity:0.4}
110
+
111
+ /* Floating Elements */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  .music-notes{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden}
113
  .note{position:absolute;font-size:24px;color:rgba(255,215,0,0.3);font-family:'Playfair Display',serif;
114
  animation:floatNote 12s linear infinite;transform:translate3d(0,0,0);
 
119
  100%{transform:translate3d(0,-10vh,0) rotate(360deg);opacity:0}
120
  }
121
 
122
+ /* Header */
123
  header{text-align:center;padding:30px 0 20px;transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
124
  position:relative;z-index:3;transform:translate3d(0,0,0)}
125
  h1{font-size:clamp(32px,8vw,64px);font-weight:900;margin:0;font-family:'Playfair Display',serif;
 
141
  box-shadow:0 0 20px rgba(255,107,107,0.4), 0 4px 15px rgba(0,0,0,0.2);transform:translate3d(0,0,0)}
142
  @keyframes flow{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
143
 
144
+ /* Video Panel */
145
  .panel{position:relative;margin:20px auto 0;max-width:1000px;aspect-ratio:16/9;
146
  background:var(--glass-bg);border-radius:32px;overflow:hidden;
147
  box-shadow:var(--shadow-strong);z-index:2;
 
160
  @keyframes holoRotate{0%{transform:rotate(0deg) scale(1)}50%{transform:rotate(180deg) scale(1.02)}100%{transform:rotate(360deg) scale(1)}}
161
  @keyframes holoGlow{0%,100%{opacity:0.6}50%{opacity:1}}
162
 
163
+ /* Corner Accents */
164
  .panel-accents{position:absolute;inset:0;pointer-events:none;z-index:5}
165
  .corner-accent{position:absolute;width:50px;height:50px;border-radius:50%;
166
  animation:cornerPulse 4s ease-in-out infinite;
 
203
  box-shadow:0 20px 60px rgba(255,107,107,0.7)}
204
  .unmute-btn:active{transform:translateY(-2px) scale(1.02)}
205
 
206
+ /* Control Panel */
207
  .control-panel{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);
208
  display:flex;align-items:center;gap:16px;padding:16px 28px;
209
  background:rgba(0,0,0,0.9);backdrop-filter:blur(15px);
 
343
  footer{text-align:center;color:rgba(255,255,255,.8);font-size:14px;padding:30px;
344
  position:relative;z-index:2;text-shadow:0 0 8px rgba(255,255,255,0.2);font-weight:300}
345
 
346
+ /* Badges - Desktop positioning */
347
  .live-badge{position:fixed;top:20px;left:20px;z-index:9999;display:inline-flex;align-items:center;gap:10px;
348
  padding:12px 20px;border-radius:30px;
349
  background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);border:1px solid rgba(255,107,107,.5);
 
362
  color:#4ecdc4;font-weight:600;font-size:15px;display:inline-flex;gap:12px;align-items:center;
363
  box-shadow:var(--shadow-medium);transform:translate3d(0,0,0)}
364
 
365
+ /* Emoji Panel - Desktop */
366
  .emoji-panel{position:absolute;right:20px;bottom:110px;z-index:6;display:flex;flex-direction:column;gap:18px}
367
  .emoji-btn{width:56px;height:56px;border-radius:50%;border:2px solid rgba(255,255,255,.35);
368
  background:rgba(0,0,0,.7);backdrop-filter:blur(10px);display:flex;align-items:center;justify-content:center;
 
395
  100%{transform:scale(1.6) rotate(360deg);opacity:0}
396
  }
397
 
398
+ /* Bubbles */
399
  #bubbles{position:fixed;inset:0;overflow:hidden;z-index:1;pointer-events:none}
400
  .bubble{position:absolute;bottom:-100px;border-radius:50%;
401
  background:linear-gradient(45deg,rgba(255,255,255,.12),rgba(255,107,107,.08));
 
436
  .audio-bar:nth-child(6){height:35px;animation-delay:0.5s}
437
  @keyframes audioVisualize{0%,100%{transform:scaleY(0.4)}50%{transform:scaleY(1.3)}}
438
 
439
+ /* ============================================= */
440
+ /* ULTRA-MINIMAL MOBILE MODE - COMPLETELY SEPARATE INTERFACE */
441
+ /* ============================================= */
 
442
 
443
+ @media (max-width:768px) and (orientation:portrait){
444
+ /* DISABLE ALL DESKTOP FEATURES */
445
+ body{cursor:auto !important;background:#0a0a1e !important}
446
+ .cursor,.cursor-trail,.aurora,.music-notes,.corner-accent,.panel::before,.panel::after{display:none !important}
447
  .performance-toggle,.performance-panel{display:none !important}
448
+ body::before{display:none !important}
449
+ #bubbles{display:none !important}
450
+ .welcome-neon{display:none !important}
451
+
452
+ /* MOBILE-ONLY: Ultra-Simple Layout */
453
+ header{padding:10px 0;background:rgba(0,0,0,0.9);position:fixed;top:0;left:0;right:0;z-index:100;
454
+ border-bottom:1px solid rgba(255,107,107,0.3)}
455
+ h1{font-size:24px !important;margin:0;animation:none !important;
456
+ background:linear-gradient(90deg,#ff6b6b,#4ecdc4) !important;
457
+ -webkit-background-clip:text !important;background-clip:text !important;color:transparent !important}
458
+ .sub{font-size:12px;margin:5px 0 0}
459
  .divider{display:none}
 
460
 
461
+ /* MOBILE-ONLY: Simplified Video Panel */
462
+ .panel{margin:60px 0 0 0 !important;max-width:none !important;border-radius:0 !important;
463
+ aspect-ratio:auto !important;position:fixed !important;inset:0 !important;
464
+ height:calc(100vh - 60px) !important;border:none !important;background:#000 !important;
465
+ backdrop-filter:none !important;box-shadow:none !important}
466
+ .panel:hover{transform:none !important}
467
+ video{border-radius:0 !important;filter:none !important}
468
 
469
+ /* MOBILE-ONLY: Minimal Controls */
470
  .control-panel{
471
+ position:fixed !important;
472
+ bottom:10px !important;
473
+ left:10px !important;
474
+ right:10px !important;
475
+ transform:none !important;
476
+ gap:8px !important;
477
+ padding:8px 12px !important;
478
  opacity:1 !important;
479
+ background:rgba(0,0,0,0.95) !important;
480
+ backdrop-filter:blur(5px) !important;
481
+ border:1px solid rgba(255,107,107,0.4) !important;
482
+ z-index:50 !important;
483
+ border-radius:25px !important;
484
  }
485
+ .mute-btn{width:36px !important;height:36px !important;border:1px solid rgba(255,107,107,0.5) !important;
486
+ backdrop-filter:none !important}
487
+ .mute-icon{font-size:16px !important}
488
+ .volume-slider{width:60px !important;height:4px !important}
489
+ .control-btn{width:28px !important;height:28px !important;font-size:12px !important;
490
+ backdrop-filter:none !important}
491
+
492
+ /* MOBILE-ONLY: Simple Badges */
493
+ .live-badge{top:70px !important;left:10px !important;font-size:11px !important;
494
+ padding:6px 10px !important;z-index:55 !important;backdrop-filter:blur(5px) !important}
495
+ .reactions-badge{bottom:70px !important;left:10px !important;font-size:11px !important;
496
+ padding:6px 10px !important;z-index:55 !important;backdrop-filter:blur(5px) !important}
497
+
498
+ /* MOBILE-ONLY: Minimal Quality Indicator */
499
+ .quality-indicator{top:70px !important;right:10px !important;font-size:10px !important;
500
+ padding:4px 8px !important;z-index:40 !important;backdrop-filter:blur(5px) !important}
501
 
502
+ /* MOBILE-ONLY: Simple Emoji Panel */
503
  .emoji-panel{
504
+ position:fixed !important;
505
+ right:10px !important;
506
+ top:50% !important;
507
+ transform:translateY(-50%) !important;
508
+ gap:8px !important;
509
+ z-index:45 !important;
510
  }
511
+ .emoji-btn{width:40px !important;height:40px !important;font-size:18px !important;
512
+ border:1px solid rgba(255,255,255,.4) !important;backdrop-filter:blur(5px) !important}
513
+ .emoji-count{right:50px !important;min-width:40px !important;height:24px !important;
514
+ font-size:10px !important;backdrop-filter:blur(5px) !important}
515
 
516
+ /* MOBILE-ONLY: Ultra-Simple Schedule */
517
+ .mobile-schedule{
518
+ position:fixed;
519
+ bottom:0;
520
+ left:0;
521
+ right:0;
522
+ z-index:60;
523
+ background:rgba(0,0,0,0.95);
524
+ border-top:1px solid rgba(255,107,107,0.4);
525
+ transform:translateY(100%);
526
+ transition:transform 0.3s ease;
527
+ max-height:40vh;
528
+ overflow-y:auto;
529
+ padding:15px;
 
 
 
 
530
  }
531
+ .mobile-schedule.visible{transform:translateY(0)}
532
+ .mobile-schedule h3{color:var(--gold);margin:0 0 15px;font-size:16px;text-align:center}
533
+ .mobile-schedule .row{padding:8px 12px;margin:4px 0;font-size:14px;border-radius:8px}
534
+ .mobile-schedule .row .time{width:80px;font-size:12px}
535
+ .mobile-schedule .row .name{font-size:12px}
536
+
537
+ /* MOBILE-ONLY: Tap Indicator */
538
+ .mobile-tap-indicator{
539
+ position:fixed;
540
+ bottom:80px;
541
+ left:50%;
542
+ transform:translateX(-50%);
543
+ background:rgba(0,0,0,0.9);
544
+ color:rgba(255,255,255,0.9);
545
+ padding:6px 15px;
546
+ border-radius:15px;
547
+ font-size:11px;
548
+ z-index:30;
549
+ opacity:0;
550
+ transition:opacity 0.3s ease;
551
+ backdrop-filter:blur(5px);
552
+ border:1px solid rgba(255,107,107,0.4);
553
  }
554
+ .mobile-tap-indicator.visible{opacity:1}
 
555
 
556
+ /* MOBILE-ONLY: Hide Desktop Elements */
557
+ .info,.schedule,footer,.shortcuts-overlay,.audio-visualizer{display:none !important}
 
 
 
 
558
 
559
+ /* MOBILE-ONLY: No Effects */
560
+ *{animation:none !important;transition:none !important;backdrop-filter:none !important;
561
+ box-shadow:none !important;filter:none !important}
562
+ .control-panel,.emoji-btn,.live-badge,.reactions-badge,.quality-indicator{
563
+ backdrop-filter:blur(5px) !important}
564
  }
565
 
566
+ /* Hide mobile elements on desktop */
567
+ @media (min-width:769px) {
568
+ .mobile-schedule,.mobile-tap-indicator{display:none !important}
 
 
 
 
 
569
  }
570
 
571
+ /* Disable ALL animations for reduced motion */
 
 
 
 
 
572
  @media (prefers-reduced-motion: reduce) {
573
+ *{animation:none !important;animation-iteration-count:1 !important;transition:none !important}
574
+ .aurora,.music-notes,.corner-accent{display:none !important}
575
  }
576
  </style>
577
  </head>
 
587
  <span class="mode-text" id="mode-text">Balanced</span>
588
  </div>
589
 
590
+ <!-- Desktop Performance Panel -->
591
  <div class="performance-panel" id="performance-panel">
592
  <h3>🎨 Visual Quality & Performance</h3>
593
  <div class="mode-grid">
 
611
  <div class="mode-name">Performance</div>
612
  <div class="mode-desc">Maximum speed & efficiency</div>
613
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
614
  </div>
615
  </div>
616
 
 
618
  <div class="reactions-badge" id="today-reactions">Today ❤️0 🔥0 💃0 ✨0</div>
619
  <div id="bubbles"></div>
620
 
621
+ <!-- Keyboard Shortcuts Overlay -->
622
  <div class="shortcuts-overlay" id="shortcuts-overlay">
623
  <h3>⌨️ Keyboard Shortcuts</h3>
624
  <div class="shortcut-item">
 
649
  <span>Performance Toggle</span>
650
  <span class="shortcut-key">Q</span>
651
  </div>
 
 
 
 
652
  <div class="shortcut-item">
653
  <span>Show Shortcuts</span>
654
  <span class="shortcut-key">?</span>
 
680
  </video>
681
 
682
  <div class="quality-indicator quality-hd" id="quality-indicator">HD</div>
 
683
 
684
  <div class="panel-accents">
685
  <div class="corner-accent"></div>
 
763
  <div id="rows"></div>
764
  </section>
765
 
766
+ <!-- MOBILE-ONLY: Ultra-Simple Schedule -->
767
+ <div class="mobile-schedule" id="mobile-schedule">
768
+ <h3>✨ Today's Schedule ✨</h3>
769
+ <div id="mobile-rows"></div>
 
 
 
 
 
 
 
770
  </div>
771
 
772
+ <div class="mobile-tap-indicator" id="mobile-tap-indicator">
773
  Double tap to show schedule
774
  </div>
775
 
 
778
  </footer>
779
 
780
  <script>
781
+ /* ULTRA-MOBILE OPTIMIZED: Minimal JavaScript for Mobile */
782
+ let isMobile = false;
 
 
783
  let audioEnabled = false;
 
 
784
  let isMuted = false;
785
  let currentVolume = 0.5;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
786
 
787
+ /* Detect Mobile Device */
788
+ function detectMobile() {
789
+ isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||
790
+ (window.innerWidth <= 768 && 'ontouchstart' in window);
791
+ return isMobile;
792
+ }
793
+
794
+ /* DESKTOP-ONLY: Full Performance System */
795
+ if (!detectMobile()) {
796
+ // Full desktop experience with all features
797
+ let frameCount = 0;
798
+ let currentPerformanceMode = 'balanced';
799
+ let maxFloatingElements = 4;
800
+ let audioContext = null;
801
+ let analyser = null;
802
+ let currentDominantColor = '#ff6b6b';
803
+ let mouseX = 0, mouseY = 0;
804
+ let isFullscreen = false;
805
+ let isPictureInPicture = false;
806
+ let isTheaterMode = false;
807
+ let isControlPanelVisible = false;
808
+
809
+ /* Performance Monitoring System */
810
+ const performanceCheck = {
811
+ lastTime: performance.now(),
812
+ frameCount: 0,
813
+ avgFps: 60,
814
+ update() {
815
+ const now = performance.now();
816
+ this.frameCount++;
817
+
818
+ if (now - this.lastTime >= 1000) {
819
+ this.avgFps = Math.round((this.frameCount * 1000) / (now - this.lastTime));
820
+ this.frameCount = 0;
821
+ this.lastTime = now;
822
+ }
823
  }
824
+ };
825
+
826
+ /* Performance Mode Configuration */
827
+ const performanceModes = {
828
+ 'ultra': { name: 'Ultra', icon: '🌟', particles: 8, animationSpeed: 1.0, effectIntensity: 1.0 },
829
+ 'high': { name: 'High', icon: '✨', particles: 6, animationSpeed: 0.8, effectIntensity: 0.8 },
830
+ 'balanced': { name: 'Balanced', icon: '⚖️', particles: 4, animationSpeed: 0.6, effectIntensity: 0.6 },
831
+ 'performance': { name: 'Performance', icon: '🚀', particles: 2, animationSpeed: 0.4, effectIntensity: 0.4 }
832
+ };
833
+
834
+ /* Performance Mode System */
835
+ function initPerformanceModeSystem() {
836
+ const desktopToggle = document.getElementById('performance-toggle');
837
+ const desktopPanel = document.getElementById('performance-panel');
838
+
839
+ let savedMode = localStorage.getItem('performanceMode') || 'balanced';
840
+ setPerformanceMode(savedMode);
841
+
842
+ if (desktopToggle) {
843
+ desktopToggle.addEventListener('click', function() {
844
+ desktopPanel.classList.toggle('visible');
845
+ });
846
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
847
 
848
+ document.addEventListener('click', function(e) {
849
+ const modeCard = e.target.closest('.mode-card');
850
+ if (modeCard) {
851
+ const mode = modeCard.getAttribute('data-mode');
852
+ setPerformanceMode(mode);
853
+ desktopPanel?.classList.remove('visible');
854
+ }
855
+ });
856
 
857
+ document.addEventListener('click', function(e) {
858
+ if (!e.target.closest('.performance-toggle') && !e.target.closest('.performance-panel')) {
859
+ desktopPanel?.classList.remove('visible');
860
+ }
861
  });
 
862
 
863
+ document.addEventListener('keydown', function(e) {
864
+ if (e.key.toLowerCase() === 'q' && !e.shiftKey) {
865
+ const modes = Object.keys(performanceModes);
866
+ const currentIndex = modes.indexOf(currentPerformanceMode);
867
+ const nextIndex = (currentIndex + 1) % modes.length;
868
+ setPerformanceMode(modes[nextIndex]);
869
+ }
870
  });
871
  }
872
 
873
+ function setPerformanceMode(mode) {
874
+ if (!performanceModes[mode]) return;
 
 
 
 
 
 
 
 
 
 
875
 
876
+ currentPerformanceMode = mode;
877
+ const config = performanceModes[mode];
 
 
 
 
 
 
 
878
 
879
+ document.body.className = document.body.className.replace(/\b\w+-mode\b/g, '');
880
+ document.body.classList.add(mode + '-mode');
881
+ maxFloatingElements = config.particles;
 
 
 
 
 
 
 
 
 
882
 
883
+ const modeText = document.getElementById('mode-text');
884
+ if (modeText) modeText.textContent = config.name;
885
 
886
+ document.querySelectorAll('.mode-card').forEach(card => {
887
+ card.classList.remove('active');
888
+ if (card.getAttribute('data-mode') === mode) {
889
+ card.classList.add('active');
890
+ }
891
+ });
892
 
893
+ localStorage.setItem('performanceMode', mode);
894
+ console.log(`Performance mode set to: ${config.name}`);
895
+ }
896
 
897
+ /* Cursor System */
898
+ let trailCount = 0;
899
+ const maxTrails = 3;
900
 
901
+ function initOptimizedCursor(){
902
+ const cursor = document.getElementById('cursor');
903
+ let isMoving = false;
904
+ let moveTimeout;
905
 
906
+ document.addEventListener('mousemove', function(e) {
907
+ mouseX = e.clientX;
908
+ mouseY = e.clientY;
909
+ cursor.style.transform = `translate3d(${mouseX - 10}px, ${mouseY - 10}px, 0)`;
 
 
 
910
 
911
+ isMoving = true;
912
+ clearTimeout(moveTimeout);
 
913
 
914
+ const config = performanceModes[currentPerformanceMode];
915
+ const shouldCreateTrail = Math.random() > (0.9 - (config.effectIntensity * 0.1));
916
+
917
+ if(shouldCreateTrail && trailCount < maxTrails) {
918
+ trailCount++;
919
+ const trail = document.createElement('div');
920
+ trail.className = 'cursor-trail';
921
+ trail.style.transform = `translate3d(${mouseX}px, ${mouseY}px, 0)`;
922
+ document.body.appendChild(trail);
923
+
924
+ setTimeout(function() {
925
+ if (trail.parentNode) {
926
+ trail.remove();
927
+ trailCount--;
928
+ }
929
+ }, 800);
930
+ }
931
 
932
+ moveTimeout = setTimeout(() => { isMoving = false; }, 150);
933
+ });
934
 
935
+ const interactiveElements = 'button, .control-btn, .emoji-btn, .mute-btn, .row, .shortcut-item, .mode-card, .performance-toggle';
 
936
 
937
+ document.addEventListener('mouseenter', function(e) {
938
+ if (e.target.matches(interactiveElements)) {
939
+ cursor.classList.add('hover');
940
+ }
941
+ }, true);
942
 
943
+ document.addEventListener('mouseleave', function(e) {
944
+ if (e.target.matches(interactiveElements)) {
945
+ cursor.classList.remove('hover');
946
+ }
947
+ }, true);
948
+ }
949
 
950
+ /* Floating Elements */
951
+ let activeFloatingElements = 0;
 
952
 
953
+ function createOptimizedFloatingNote(){
954
+ const config = performanceModes[currentPerformanceMode];
955
+ if(activeFloatingElements >= config.particles) return;
956
+
957
+ const notes = ['♪', '♫', '♬', '♩', '𝄞', '𝄢'];
958
+ const note = document.createElement('div');
959
+ note.className = 'note';
960
+ note.textContent = notes[Math.floor(Math.random() * notes.length)];
961
+ note.style.left = Math.random() * 100 + 'vw';
962
+ note.style.animationDuration = ((10 + Math.random() * 4) / config.animationSpeed) + 's';
963
+ note.style.fontSize = (20 + Math.random() * 8) + 'px';
964
+ note.style.opacity = 0.3 * config.effectIntensity;
965
+
966
+ activeFloatingElements++;
967
+ document.getElementById('music-notes').appendChild(note);
968
+
969
+ setTimeout(function() {
970
+ if (note.parentNode) {
971
+ note.remove();
972
+ activeFloatingElements--;
973
+ }
974
+ }, 12000 / config.animationSpeed);
975
+ }
976
+
977
+ /* Bubble System */
978
+ let activeBubbles = 0;
979
+ const maxBubbles = 10;
980
 
981
+ function createOptimizedBubble(){
982
+ const config = performanceModes[currentPerformanceMode];
983
+ if(activeBubbles >= Math.min(maxBubbles, config.particles)) return;
984
+
985
+ const b = document.createElement('div');
986
+ b.className = 'bubble';
987
+ const s = (25 + Math.random() * 70) * config.effectIntensity;
988
+ b.style.width = s + 'px';
989
+ b.style.height = s + 'px';
990
+ b.style.left = (Math.random() * 100) + 'vw';
991
+ b.style.animationDuration = ((25 + Math.random() * 25) / config.animationSpeed) + 's';
992
+ b.style.opacity = 0.5 * config.effectIntensity;
993
+
994
+ activeBubbles++;
995
+ document.getElementById('bubbles').appendChild(b);
996
+
997
+ setTimeout(function() {
998
+ if (b.parentNode) {
999
+ b.remove();
1000
+ activeBubbles--;
1001
+ }
1002
+ }, 40000 / config.animationSpeed);
1003
  }
 
 
1004
 
1005
+ // Initialize desktop features
1006
+ initPerformanceModeSystem();
1007
+ initOptimizedCursor();
1008
 
1009
+ // Desktop intervals
1010
+ setInterval(function() {
1011
+ const config = performanceModes[currentPerformanceMode];
1012
+ if(Math.random() > (1 - config.effectIntensity * 0.5)) {
1013
+ createOptimizedFloatingNote();
1014
+ }
1015
+ }, 4000);
1016
 
1017
+ setInterval(function() {
1018
+ const config = performanceModes[currentPerformanceMode];
1019
+ if(Math.random() > (1 - config.effectIntensity * 0.6)) {
1020
+ createOptimizedBubble();
1021
+ }
1022
+ }, 1500);
1023
 
1024
+ function optimizedPerformanceMonitor() {
1025
+ frameCount++;
1026
+ if (frameCount % 60 === 0) {
1027
+ performanceCheck.update();
1028
+ }
1029
+ requestAnimationFrame(optimizedPerformanceMonitor);
1030
+ }
1031
+ requestAnimationFrame(optimizedPerformanceMonitor);
1032
+ }
1033
 
1034
+ /* MOBILE-ONLY: Ultra-Minimal Experience */
1035
+ if (detectMobile()) {
1036
+ console.log('Mobile device detected - using ultra-minimal mode');
1037
+
1038
+ let isScheduleVisible = false;
1039
+ let autoHideTimer = null;
1040
 
1041
+ function showMobileSchedule() {
1042
+ const schedule = document.getElementById('mobile-schedule');
1043
+ const indicator = document.getElementById('mobile-tap-indicator');
1044
+
1045
+ schedule.classList.add('visible');
1046
+ isScheduleVisible = true;
1047
 
1048
+ if (autoHideTimer) clearTimeout(autoHideTimer);
1049
+ autoHideTimer = setTimeout(function() {
1050
+ schedule.classList.remove('visible');
1051
+ isScheduleVisible = false;
1052
+ showMobileIndicator();
1053
+ }, 5000);
1054
+ }
 
 
 
 
 
 
 
 
 
 
 
1055
 
1056
+ function showMobileIndicator() {
1057
+ const indicator = document.getElementById('mobile-tap-indicator');
1058
+ indicator.classList.add('visible');
1059
+ setTimeout(function() {
1060
+ indicator.classList.remove('visible');
1061
+ }, 2000);
1062
+ }
1063
 
1064
+ let lastClickTime = 0;
1065
+ const doubleClickDelay = 400;
1066
 
1067
+ document.addEventListener('click', function(e) {
1068
+ if (e.target.closest('.emoji-btn') || e.target.closest('.mobile-schedule') ||
1069
+ e.target.closest('.control-panel')) return;
1070
+
1071
+ const currentTime = new Date().getTime();
1072
+ const timeDiff = currentTime - lastClickTime;
1073
 
1074
+ if (timeDiff < doubleClickDelay) {
1075
+ e.preventDefault();
1076
+ if (!isScheduleVisible) showMobileSchedule();
1077
  }
1078
+ lastClickTime = currentTime;
1079
+ });
1080
 
1081
+ // Show initial indicator
1082
+ setTimeout(showMobileIndicator, 1000);
 
1083
  }
1084
 
1085
+ /* SHARED: Audio Enable */
1086
  function initSimpleAudioEnable() {
1087
  const overlay = document.getElementById('unmute-overlay');
1088
  const unmuteBtn = document.getElementById('unmute-btn');
 
1097
  document.getElementById('mute-btn').classList.remove('muted');
1098
  overlay.classList.add('hidden');
1099
  localStorage.setItem('audioEnabled', 'true');
 
 
 
 
 
 
 
 
 
1100
  });
1101
 
1102
  if (localStorage.getItem('audioEnabled') === 'true') {
 
1105
  }
1106
  }
1107
 
1108
+ /* SHARED: Schedules */
1109
  const SCHEDULE_A = [
1110
  { title:"Dance in Front of the Library of Alexandria", url:"https://ik.imagekit.io/plerqlkuh/A%20dance%20in%20front%20of%20the%20Library%20of%20Alexandria.mp4", duration:155, start:0, end:2.667 },
1111
  { title:"✨ Belly dance ✨ - sensual dance", url:"https://ik.imagekit.io/plerqlkuh/%E2%9C%A8%20Belly%20dance%20%E2%9C%A8%20-%20-%20sensual%20dance.mp4", duration:113, start:2.667, end:5.333 },
 
1142
  function secFmt(s){return `${Math.floor(s/60)}:${String(s%60).padStart(2,'0')}`;}
1143
  function clamp(n,min,max){return Math.max(min,Math.min(max,n));}
1144
 
1145
+ /* SHARED: Control Functions */
1146
  function initMuteControl() {
1147
  const muteBtn = document.getElementById('mute-btn');
1148
  const muteIcon = document.getElementById('mute-icon');
 
1164
  muteIcon.textContent = '🔊';
1165
  muteBtn.classList.remove('muted');
1166
  }
 
 
 
 
1167
  });
1168
  }
1169
 
 
1201
 
1202
  function initTheaterMode() {
1203
  const theaterBtn = document.getElementById('theater-btn');
1204
+ if (!theaterBtn) return;
1205
 
1206
  theaterBtn.addEventListener('click', function() {
1207
  isTheaterMode = !isTheaterMode;
 
1212
 
1213
  function initFullscreenControl() {
1214
  const fullscreenBtn = document.getElementById('fullscreen-btn');
1215
+ if (!fullscreenBtn) return;
1216
+
1217
  const panel = document.getElementById('panel');
1218
 
1219
  fullscreenBtn.addEventListener('click', function() {
 
1238
 
1239
  function initPictureInPictureControl() {
1240
  const pipBtn = document.getElementById('pip-btn');
1241
+ if (!pipBtn) return;
1242
+
1243
  const player = document.getElementById('player');
1244
 
1245
  pipBtn.addEventListener('click', async function() {
 
1269
  const shortcutsBtn = document.getElementById('shortcuts-btn');
1270
  const shortcutsOverlay = document.getElementById('shortcuts-overlay');
1271
 
1272
+ if (!shortcutsBtn || !shortcutsOverlay) return;
1273
+
1274
  shortcutsBtn.addEventListener('click', function() {
1275
  shortcutsOverlay.classList.toggle('visible');
1276
  });
 
1287
  if (!e.shiftKey) document.getElementById('mute-btn').click();
1288
  break;
1289
  case 'f':
1290
+ if (document.getElementById('fullscreen-btn')) document.getElementById('fullscreen-btn').click();
1291
  break;
1292
  case 't':
1293
+ if (document.getElementById('theater-btn')) document.getElementById('theater-btn').click();
1294
  break;
1295
  case 'p':
1296
+ if (document.getElementById('pip-btn')) document.getElementById('pip-btn').click();
1297
  break;
1298
  case 'arrowup':
1299
  e.preventDefault();
 
1312
  }
1313
  break;
1314
  case '?':
1315
+ if (shortcutsOverlay) shortcutsOverlay.classList.toggle('visible');
1316
  break;
1317
  }
1318
  });
1319
  }
1320
 
1321
  function initControlPanelVisibility() {
1322
+ if (detectMobile()) return; // Skip for mobile
1323
+
1324
  const panel = document.getElementById('panel');
1325
  const controlPanel = document.getElementById('control-panel');
1326
 
 
1388
  });
1389
  }
1390
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1391
  function todaySchedule(){
1392
  const d = utcDayIndex();
1393
  if(d===1 || d===2 || d===3) return { which:'A (Mon-Tue-Wed)', list: SCHEDULE_A };
1394
  return { which:'B (Thu-Fri-Sat-Sun)', list: SCHEDULE_B };
1395
  }
1396
 
1397
+ // Cache DOM elements
1398
  const $player = document.getElementById('player');
1399
  const $vtitle = document.getElementById('vtitle');
1400
  const $vmeta = document.getElementById('vmeta');
 
 
 
1401
  const $rows = document.getElementById('rows');
1402
+ const $mobileRows = document.getElementById('mobile-rows');
 
1403
  const $todayTitle = document.getElementById('schedule-title');
1404
+ const $liveCount = document.getElementById('live-count');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1405
 
1406
  function renderScheduleUI(){
1407
  const sel = todaySchedule();
1408
  const list = sel.list;
1409
+
1410
+ if ($rows) {
1411
+ $rows.innerHTML = '';
1412
+ list.forEach(function(v, idx) {
1413
+ const div = document.createElement('div');
1414
+ div.className = 'row';
1415
+ div.innerHTML = '<div class="time">' + formatHourRange(v.start,v.end) + '</div><div class="name">' + v.title + '</div>';
1416
+ $rows.appendChild(div);
1417
+ });
1418
+ }
1419
+
1420
+ if ($mobileRows) {
1421
+ $mobileRows.innerHTML = '';
1422
+ list.forEach(function(v, idx) {
1423
+ const div = document.createElement('div');
1424
+ div.className = 'row';
1425
+ div.innerHTML = '<div class="time">' + formatHourRange(v.start,v.end) + '</div><div class="name">' + v.title + '</div>';
1426
+ $mobileRows.appendChild(div);
1427
+ });
1428
+ }
1429
 
 
1430
  const dayNames = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
1431
  const d = utcDayIndex();
1432
+ if ($todayTitle) {
1433
+ $todayTitle.textContent = '✨ Global Schedule (UTC) — ' + dayNames[d] + ' — Set ' + sel.which;
1434
+ }
1435
  }
1436
 
1437
  function formatHourRange(startH, endH){
 
1447
 
1448
  function updateHeader(){
1449
  const n = new Date();
1450
+ const headerTime = document.getElementById('header-time');
1451
+ if (headerTime) {
1452
+ headerTime.textContent = 'Local: ' + n.toLocaleTimeString() + ' | UTC: ' + n.toUTCString().split(' ')[4];
1453
+ }
1454
  }
1455
  setInterval(updateHeader,1000);
1456
  updateHeader();
 
1494
  console.log('Autoplay prevented (normal behavior)');
1495
  });
1496
 
1497
+ if ($vtitle) $vtitle.textContent = v.title;
1498
+ if ($vmeta) $vmeta.textContent = 'Duration: ' + secFmt(v.duration);
 
 
1499
 
1500
+ const rowNodes = document.querySelectorAll('#rows .row, #mobile-rows .row');
1501
  rowNodes.forEach(function(r,i) {
1502
  r.classList.toggle('active', (i%list.length)===idx);
1503
  });
 
1519
  } else {
1520
  $player.style.objectFit = 'cover';
1521
  }
 
 
 
 
1522
  });
1523
 
1524
+ /* Live Count System */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1525
  const BUCKETS = [
1526
  {start:0,end:6,min:700,max:2000},
1527
  {start:6,end:12,min:1400,max:3500},
 
1538
  liveBucket = bucketFor(h);
1539
  const span = liveBucket.max - liveBucket.min;
1540
  liveCount = liveBucket.min + Math.floor(span * (0.3 + Math.random()*0.4));
1541
+ if ($liveCount) $liveCount.textContent = liveCount.toLocaleString();
1542
  }
1543
  function tickLive(){
1544
  const h = nowHour();
 
1549
  } else {
1550
  liveCount = clamp(liveCount + randStep(), liveBucket.min, liveBucket.max);
1551
  }
1552
+ if ($liveCount) $liveCount.textContent = liveCount.toLocaleString();
1553
  liveTimer = setTimeout(tickLive, delay());
1554
  }
1555
  document.addEventListener('visibilitychange', function(){
 
1559
  initLive();
1560
  liveTimer = setTimeout(tickLive, delay());
1561
 
1562
+ /* Reactions System */
1563
  const EMOJIS = [{key:'heart',sym:'❤️'},{key:'fire',sym:'🔥'},{key:'dancer',sym:'💃'},{key:'spark',sym:'✨'}];
1564
  const STORAGE_PREFIX = 'pro-reactions:';
1565
  function utcDateKey(){ const d=new Date(); return d.getUTCFullYear() + '-' + String(d.getUTCMonth()+1).padStart(2,'0') + '-' + String(d.getUTCDate()).padStart(2,'0'); }
 
1594
  }catch(e){}
1595
  }
1596
  function renderReactions(){
1597
+ const elements = {
1598
+ 'count-heart': reactionCounts.heart.toLocaleString(),
1599
+ 'count-fire': reactionCounts.fire.toLocaleString(),
1600
+ 'count-dancer': reactionCounts.dancer.toLocaleString(),
1601
+ 'count-spark': reactionCounts.spark.toLocaleString()
1602
+ };
1603
+
1604
+ Object.keys(elements).forEach(id => {
1605
+ const el = document.getElementById(id);
1606
+ if (el) el.textContent = elements[id];
1607
+ });
1608
+
1609
+ const todayReactions = document.getElementById('today-reactions');
1610
+ if (todayReactions) {
1611
+ todayReactions.textContent =
1612
+ 'Today ❤️' + reactionCounts.heart + ' 🔥' + reactionCounts.fire + ' 💃' + reactionCounts.dancer + ' ✨' + reactionCounts.spark;
1613
+ }
1614
  }
1615
 
1616
+ /* Particle System */
1617
  let activeParticles = 0;
1618
+ const maxParticles = detectMobile() ? 3 : 15;
1619
 
1620
  function spawnOptimizedParticles(type, x, y){
1621
+ if(activeParticles > maxParticles) return;
 
1622
 
1623
  const pane = document.getElementById('panel').getBoundingClientRect();
1624
  const burst = document.createElement('div');
 
1627
  burst.style.top=(y-pane.top-25)+'px';
1628
  burst.textContent = EMOJIS.find(function(e) { return e.key===type; }).sym;
1629
  burst.style.fontSize='35px';
 
1630
  document.getElementById('panel').appendChild(burst);
1631
  activeParticles++;
1632
 
 
1637
  }
1638
  }, 1000);
1639
 
1640
+ const particleCount = detectMobile() ? 2 : 6;
1641
  for(let i=0;i<particleCount;i++){
1642
  const p = document.createElement('div');
1643
  p.className='particle';
 
1645
  p.style.left = (x - pane.left + (Math.random()*80-40)) + 'px';
1646
  p.style.top = (y - pane.top + (Math.random()*40-20)) + 'px';
1647
  p.style.animationDelay = (Math.random()*300) + 'ms';
 
 
1648
  document.getElementById('panel').appendChild(p);
1649
  activeParticles++;
1650
 
 
1659
 
1660
  function setupEmojiClicks(){
1661
  const panel = document.getElementById('emoji-panel');
1662
+ if (!panel) return;
1663
+
1664
  panel.addEventListener('click', function(ev){
1665
  const btn = ev.target.closest('.emoji-btn');
1666
  if(!btn) return;
 
1672
  saveLocalInc(type);
1673
  renderReactions();
1674
  spawnOptimizedParticles(type, x, y);
 
 
 
 
1675
  });
1676
  }
1677
  loadReactions();
 
1684
  }
1685
  setTimeout(function() { location.reload(); }, msToNextUtcMidnight()+1500);
1686
 
1687
+ // Initialize everything
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1688
  document.addEventListener('DOMContentLoaded', function() {
1689
+ console.log('Initializing ultra-optimized version for:', detectMobile() ? 'Mobile' : 'Desktop');
1690
+
 
1691
  initSimpleAudioEnable();
 
 
 
 
 
 
 
 
 
1692
  initMuteControl();
1693
  initVolumeControl();
1694
+
1695
+ if (!detectMobile()) {
1696
+ initTheaterMode();
1697
+ initFullscreenControl();
1698
+ initPictureInPictureControl();
1699
+ initKeyboardShortcuts();
1700
+ initControlPanelVisibility();
1701
+ }
1702
+
1703
  initProgressBar();
1704
  initQualityIndicator();
 
1705
  schedulePlay();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1706
  });
1707
 
1708
  </script>