undefined - Follow Up Deployment
Browse files- index.html +507 -414
index.html
CHANGED
|
@@ -14,26 +14,27 @@
|
|
| 14 |
--shadow-strong:0 20px 60px rgba(0,0,0,0.4);
|
| 15 |
}
|
| 16 |
|
| 17 |
-
*{box-sizing:border-box
|
| 18 |
|
| 19 |
-
/*
|
| 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;
|
| 23 |
background:#0a0a1e;overflow-x:hidden;min-height:100vh;position:relative;
|
| 24 |
-
cursor:none;
|
|
|
|
| 25 |
|
| 26 |
-
/*
|
| 27 |
body::before{content:'';position:fixed;inset:0;z-index:0;
|
| 28 |
background:
|
| 29 |
radial-gradient(ellipse 800px 400px at 20% 30%, rgba(157,78,221,0.15) 0%, transparent 50%),
|
| 30 |
radial-gradient(ellipse 600px 300px at 80% 70%, rgba(67,97,238,0.12) 0%, transparent 50%),
|
| 31 |
radial-gradient(ellipse 400px 200px at 50% 50%, rgba(255,107,107,0.08) 0%, transparent 50%),
|
| 32 |
linear-gradient(135deg, var(--bg1) 0%, var(--bg2) 50%, var(--bg3) 100%);
|
| 33 |
-
animation:
|
| 34 |
-
@keyframes
|
| 35 |
|
| 36 |
-
/*
|
| 37 |
.aurora{position:fixed;inset:0;z-index:1;pointer-events:none;
|
| 38 |
background:
|
| 39 |
linear-gradient(45deg,
|
|
@@ -42,32 +43,39 @@
|
|
| 42 |
linear-gradient(-45deg,
|
| 43 |
rgba(255,107,107,0.05) 0%,transparent 30%,rgba(157,78,221,0.07) 70%,transparent 100%);
|
| 44 |
background-size:400% 400%, 300% 300%;
|
| 45 |
-
animation:
|
| 46 |
-
transform:
|
| 47 |
-
@keyframes
|
| 48 |
@keyframes auroraPulse{0%,100%{opacity:0.6}50%{opacity:1}}
|
| 49 |
|
| 50 |
-
/*
|
| 51 |
.cursor{position:fixed;width:20px;height:20px;border-radius:50%;
|
| 52 |
background:radial-gradient(circle,rgba(255,107,107,0.9) 0%,rgba(78,205,196,0.4) 50%,transparent 100%);
|
| 53 |
pointer-events:none;z-index:999999;mix-blend-mode:screen;
|
| 54 |
-
transition:all 0.12s cubic-bezier(0.4,0,0.2,1);transform:
|
| 55 |
left:0;top:0;will-change:transform;
|
| 56 |
box-shadow:0 0 20px rgba(255,107,107,0.6), 0 0 40px rgba(255,107,107,0.3)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
.cursor.hover{transform:scale(1.8) !important;
|
| 58 |
background:radial-gradient(circle,rgba(255,107,107,1) 0%,rgba(78,205,196,0.6) 40%,rgba(157,78,221,0.3) 100%);
|
| 59 |
box-shadow:0 0 30px rgba(255,107,107,0.8), 0 0 60px rgba(255,107,107,0.4)}
|
| 60 |
.cursor-trail{position:fixed;width:4px;height:4px;border-radius:50%;
|
| 61 |
background:rgba(255,107,107,0.8);pointer-events:none;z-index:999998;
|
| 62 |
-
animation:
|
| 63 |
-
@keyframes
|
| 64 |
|
| 65 |
-
/*
|
| 66 |
-
|
| 67 |
-
/* Performance
|
| 68 |
-
.performance-toggle{position:fixed;top:20px;right:
|
| 69 |
display:flex;align-items:center;gap:10px;padding:10px 16px;
|
| 70 |
-
background:rgba(0,0,0,0.85);backdrop-filter:blur(
|
| 71 |
border-radius:25px;border:1px solid rgba(255,255,255,0.2);
|
| 72 |
box-shadow:var(--shadow-medium);cursor:pointer;
|
| 73 |
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);font-size:12px;font-weight:500;
|
|
@@ -77,11 +85,11 @@
|
|
| 77 |
.performance-toggle .mode-icon{font-size:16px;transition:all 0.3s ease}
|
| 78 |
.performance-toggle .mode-text{font-family:'Inter',sans-serif;letter-spacing:0.3px}
|
| 79 |
|
| 80 |
-
/* Performance Settings Panel */
|
| 81 |
.performance-panel{position:fixed;top:70px;right:20px;z-index:9999;
|
| 82 |
-
background:rgba(0,0,0,0.95);backdrop-filter:blur(
|
| 83 |
border-radius:20px;padding:25px;border:1px solid rgba(255,255,255,0.15);
|
| 84 |
-
box-shadow:var(--shadow-strong);min-width:
|
| 85 |
opacity:0;transform:translateY(-20px) scale(0.95);
|
| 86 |
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);pointer-events:none}
|
| 87 |
.performance-panel.visible{opacity:1;transform:translateY(0) scale(1);pointer-events:all}
|
|
@@ -89,12 +97,13 @@
|
|
| 89 |
.performance-panel h3{color:var(--gold);margin:0 0 20px;font-size:18px;
|
| 90 |
font-weight:700;text-align:center;font-family:'Playfair Display',serif}
|
| 91 |
|
| 92 |
-
/* Mode Selection
|
| 93 |
-
.mode-grid{display:grid;grid-template-columns:
|
| 94 |
.mode-card{padding:12px;border-radius:12px;cursor:pointer;
|
| 95 |
border:2px solid rgba(255,255,255,0.1);
|
| 96 |
background:rgba(255,255,255,0.05);
|
| 97 |
-
transition:all 0.3s cubic-bezier(0.4,0,0.2,1);text-align:center
|
|
|
|
| 98 |
.mode-card:hover{transform:translateY(-2px);border-color:rgba(255,107,107,0.4)}
|
| 99 |
.mode-card.active{border-color:var(--neon-primary);background:rgba(255,107,107,0.15);
|
| 100 |
box-shadow:0 0 20px rgba(255,107,107,0.3)}
|
|
@@ -102,117 +111,134 @@
|
|
| 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 Metrics */
|
| 106 |
.perf-metrics{background:rgba(255,255,255,0.05);border-radius:12px;padding:15px;margin-top:15px}
|
| 107 |
.perf-metrics h4{margin:0 0 10px;font-size:13px;color:var(--neon-secondary)}
|
| 108 |
.metric-item{display:flex;justify-content:space-between;margin:8px 0;font-size:11px}
|
| 109 |
.metric-value{color:var(--gold);font-weight:600}
|
| 110 |
|
| 111 |
-
/* Mobile Performance Interface */
|
| 112 |
-
.mobile-perf-toggle{position:fixed;bottom:
|
| 113 |
width:48px;height:48px;border-radius:50%;
|
| 114 |
-
background:rgba(0,0,0,0.9);backdrop-filter:blur(
|
| 115 |
-
border:2px solid rgba(255,255,255,0.3);display:
|
| 116 |
cursor:pointer;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);
|
| 117 |
box-shadow:var(--shadow-medium)}
|
| 118 |
.mobile-perf-toggle:hover{transform:scale(1.1);border-color:rgba(255,107,107,0.6)}
|
| 119 |
.mobile-perf-toggle .perf-icon{font-size:20px;transition:all 0.3s ease}
|
| 120 |
|
| 121 |
-
/* Mobile Performance Panel */
|
| 122 |
.mobile-perf-panel{position:fixed;bottom:0;left:0;right:0;z-index:60;
|
| 123 |
-
background:rgba(0,0,0,0.95);backdrop-filter:blur(
|
| 124 |
border-top:1px solid rgba(255,107,107,0.4);
|
| 125 |
border-radius:25px 25px 0 0;padding:20px;
|
| 126 |
transform:translateY(100%);transition:transform 0.5s cubic-bezier(0.4,0,0.2,1);
|
| 127 |
box-shadow:0 -10px 40px rgba(0,0,0,0.5)}
|
| 128 |
.mobile-perf-panel.visible{transform:translateY(0)}
|
| 129 |
.mobile-perf-panel h3{color:var(--gold);margin:0 0 15px;font-size:16px;text-align:center}
|
| 130 |
-
.mobile-perf-panel .mode-grid{grid-template-columns:repeat(
|
| 131 |
-
.mobile-perf-panel .mode-card{padding:8px 4px}
|
|
|
|
| 132 |
.mobile-perf-panel .mode-emoji{font-size:20px;margin-bottom:4px}
|
| 133 |
.mobile-perf-panel .mode-name{font-size:10px}
|
| 134 |
.mobile-perf-panel .mode-desc{font-size:8px}
|
| 135 |
|
| 136 |
-
/* Performance Mode Classes */
|
| 137 |
-
.ultra-mode{--animation-speed:1;--particle-count:
|
| 138 |
-
.high-mode{--animation-speed:0.8;--particle-count:
|
| 139 |
-
.balanced-mode{--animation-speed:0.6;--particle-count:
|
| 140 |
-
.performance-mode{--animation-speed:0.
|
|
|
|
| 141 |
|
| 142 |
-
/* Dynamic Performance Adjustments */
|
| 143 |
.performance-mode .aurora{opacity:0.3;animation-duration:30s}
|
| 144 |
.performance-mode .music-notes{display:none}
|
| 145 |
.performance-mode .corner-accent{display:none}
|
| 146 |
.performance-mode .cursor-trail{display:none}
|
| 147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 148 |
.balanced-mode .aurora{opacity:0.6;animation-duration:25s}
|
| 149 |
-
.balanced-mode .corner-accent{animation-duration:6s}
|
| 150 |
-
|
| 151 |
.high-mode .aurora{opacity:0.8;animation-duration:22s}
|
| 152 |
-
.high-mode .corner-accent{animation-duration:4s}
|
| 153 |
-
|
| 154 |
.ultra-mode .aurora{opacity:1;animation-duration:20s}
|
| 155 |
-
.ultra-mode .corner-accent{animation-duration:3s}
|
| 156 |
-
|
| 157 |
-
/* ===== END OPTIMIZATION MODE SYSTEM ===== */
|
| 158 |
|
| 159 |
-
/*
|
| 160 |
.music-notes{position:fixed;inset:0;z-index:1;pointer-events:none;overflow:hidden}
|
| 161 |
.note{position:absolute;font-size:24px;color:rgba(255,215,0,0.3);font-family:'Playfair Display',serif;
|
| 162 |
-
animation:
|
| 163 |
text-shadow:0 0 10px rgba(255,215,0,0.4)}
|
| 164 |
-
@keyframes
|
| 165 |
-
0%{transform:
|
| 166 |
10%{opacity:0.6}90%{opacity:0.6}
|
| 167 |
-
100%{transform:
|
| 168 |
}
|
| 169 |
|
| 170 |
-
/*
|
| 171 |
header{text-align:center;padding:30px 0 20px;transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 172 |
-
position:relative;z-index:3;transform:
|
| 173 |
h1{font-size:clamp(32px,8vw,64px);font-weight:900;margin:0;font-family:'Playfair Display',serif;
|
| 174 |
background:linear-gradient(135deg,#ff6b6b 0%,#ffd93d 20%,#4ecdc4 40%,#9d4edd 60%,#ff9a9e 80%,#ff6b6b 100%);
|
| 175 |
background-size:400% 400%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 176 |
-
animation:
|
| 177 |
filter:drop-shadow(0 0 20px rgba(255,107,107,0.5));
|
| 178 |
-
transform:
|
| 179 |
-
h1:hover{transform:
|
| 180 |
transition:transform 0.6s cubic-bezier(0.34,1.56,0.64,1)}
|
| 181 |
-
@keyframes
|
| 182 |
|
| 183 |
.sub{font-size:16px;color:rgba(255,255,255,.9);margin-top:12px;font-weight:300;
|
| 184 |
text-shadow:0 0 15px rgba(255,255,255,0.3);letter-spacing:0.5px}
|
| 185 |
.divider{height:6px;width:140px;margin:20px auto;
|
| 186 |
background:linear-gradient(90deg,#ff6b6b,#ffd93d,#4ecdc4,#9d4edd,#ff9a9e);
|
| 187 |
background-size:400% 100%;border-radius:999px;opacity:.95;
|
| 188 |
-
animation:
|
| 189 |
-
box-shadow:0 0 20px rgba(255,107,107,0.4), 0 4px 15px rgba(0,0,0,0.2);transform:
|
| 190 |
-
@keyframes
|
| 191 |
|
| 192 |
-
|
| 193 |
.panel{position:relative;margin:20px auto 0;max-width:1000px;aspect-ratio:16/9;
|
| 194 |
background:var(--glass-bg);border-radius:32px;overflow:hidden;
|
| 195 |
box-shadow:var(--shadow-strong);z-index:2;
|
| 196 |
-
transform:
|
| 197 |
backdrop-filter:blur(20px);border:1px solid var(--glass-border)}
|
| 198 |
-
.panel:hover{transform:
|
| 199 |
box-shadow:0 25px 80px rgba(0,0,0,0.5), 0 0 50px rgba(255,107,107,0.2)}
|
| 200 |
|
| 201 |
.panel::before{content:'';position:absolute;inset:-6px;border-radius:38px;
|
| 202 |
background:conic-gradient(from 0deg,var(--neon-primary) 0%,var(--magic-purple) 25%,var(--cosmic-blue) 50%,var(--aurora-green) 75%,var(--neon-primary) 100%);
|
| 203 |
-
z-index:-1;animation:
|
| 204 |
filter:blur(2px);opacity:0.8}
|
| 205 |
.panel::after{content:'';position:absolute;inset:-12px;border-radius:44px;
|
| 206 |
background:radial-gradient(ellipse,rgba(255,107,107,0.2) 0%,rgba(78,205,196,0.1) 50%,transparent 100%);
|
| 207 |
-
z-index:-2;filter:blur(15px);animation:
|
| 208 |
-
@keyframes
|
| 209 |
-
@keyframes
|
| 210 |
|
| 211 |
-
/*
|
| 212 |
.panel-accents{position:absolute;inset:0;pointer-events:none;z-index:5}
|
| 213 |
.corner-accent{position:absolute;width:50px;height:50px;border-radius:50%;
|
| 214 |
-
animation:
|
| 215 |
-
filter:blur(1.5px);transform:
|
| 216 |
.corner-accent:nth-child(1){top:-25px;left:-25px;animation-delay:0s;
|
| 217 |
background:radial-gradient(circle,rgba(255,107,107,0.8) 0%,rgba(255,107,107,0.2) 70%,transparent 100%)}
|
| 218 |
.corner-accent:nth-child(2){top:-25px;right:-25px;animation-delay:1s;
|
|
@@ -221,22 +247,22 @@
|
|
| 221 |
background:radial-gradient(circle,rgba(157,78,221,0.8) 0%,rgba(157,78,221,0.2) 70%,transparent 100%)}
|
| 222 |
.corner-accent:nth-child(4){bottom:-25px;right:-25px;animation-delay:3s;
|
| 223 |
background:radial-gradient(circle,rgba(255,211,102,0.8) 0%,rgba(255,211,102,0.2) 70%,transparent 100%)}
|
| 224 |
-
@keyframes
|
| 225 |
0%,100%{transform:scale(0.8) rotate(0deg);opacity:0.5}
|
| 226 |
50%{transform:scale(1.4) rotate(180deg);opacity:0.9}
|
| 227 |
}
|
| 228 |
|
| 229 |
video{width:100%;height:100%;object-fit:cover;background:#000;border-radius:26px;
|
| 230 |
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 231 |
-
filter:contrast(1.08) saturate(1.15) brightness(1.05);transform:
|
| 232 |
|
| 233 |
.chip{position:absolute;bottom:15px;right:15px;padding:10px 16px;border-radius:16px;
|
| 234 |
-
background:rgba(0,0,0,0.85);backdrop-filter:blur(
|
| 235 |
font:13px/1.4 'Inter',monospace;color:#fff;z-index:6;
|
| 236 |
border:1px solid rgba(255,107,107,0.4);
|
| 237 |
-
box-shadow:var(--shadow-medium);transform:
|
| 238 |
|
| 239 |
-
/*
|
| 240 |
.unmute-overlay{position:absolute;top:0;left:0;right:0;bottom:0;
|
| 241 |
background:rgba(0,0,0,0.8);display:flex;align-items:center;justify-content:center;
|
| 242 |
z-index:100;backdrop-filter:blur(25px);border-radius:26px}
|
|
@@ -251,10 +277,10 @@
|
|
| 251 |
box-shadow:0 20px 60px rgba(255,107,107,0.7)}
|
| 252 |
.unmute-btn:active{transform:translateY(-2px) scale(1.02)}
|
| 253 |
|
| 254 |
-
/*
|
| 255 |
.control-panel{position:absolute;bottom:20px;left:50%;transform:translateX(-50%);
|
| 256 |
display:flex;align-items:center;gap:16px;padding:16px 28px;
|
| 257 |
-
background:rgba(0,0,0,0.9);backdrop-filter:blur(
|
| 258 |
border-radius:60px;border:1px solid rgba(255,255,255,0.12);
|
| 259 |
box-shadow:var(--shadow-strong);z-index:10;
|
| 260 |
opacity:0;transform:translateX(-50%) translateY(30px);
|
|
@@ -262,10 +288,10 @@
|
|
| 262 |
.panel:hover .control-panel,.control-panel:hover,.control-panel.active{
|
| 263 |
opacity:1;transform:translateX(-50%) translateY(0)}
|
| 264 |
|
| 265 |
-
/*
|
| 266 |
.mute-btn{width:52px;height:52px;border-radius:50%;border:2px solid rgba(255,255,255,0.25);
|
| 267 |
background:linear-gradient(135deg,rgba(255,107,107,0.25),rgba(78,205,196,0.25));
|
| 268 |
-
backdrop-filter:blur(
|
| 269 |
cursor:pointer;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);position:relative;overflow:hidden}
|
| 270 |
.mute-btn::before{content:'';position:absolute;inset:0;border-radius:50%;
|
| 271 |
background:linear-gradient(45deg,var(--neon-primary),var(--neon-secondary));
|
|
@@ -279,7 +305,7 @@
|
|
| 279 |
filter:drop-shadow(0 0 12px rgba(255,255,255,0.6))}
|
| 280 |
.mute-btn.muted .mute-icon{color:#ff6b6b;filter:drop-shadow(0 0 15px rgba(255,107,107,0.9))}
|
| 281 |
|
| 282 |
-
/*
|
| 283 |
.volume-control{display:flex;align-items:center;gap:12px}
|
| 284 |
.volume-slider{width:100px;height:6px;background:rgba(255,255,255,0.25);
|
| 285 |
border-radius:3px;position:relative;cursor:pointer;overflow:hidden}
|
|
@@ -293,9 +319,9 @@
|
|
| 293 |
transition:all 0.3s cubic-bezier(0.4,0,0.2,1)}
|
| 294 |
.volume-slider:hover .volume-fill::after{transform:scale(1.2)}
|
| 295 |
|
| 296 |
-
/*
|
| 297 |
.control-btn{width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,0.2);
|
| 298 |
-
background:rgba(255,255,255,0.08);backdrop-filter:blur(
|
| 299 |
display:flex;align-items:center;justify-content:center;cursor:pointer;
|
| 300 |
font-size:18px;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);
|
| 301 |
color:rgba(255,255,255,0.85)}
|
|
@@ -306,7 +332,7 @@
|
|
| 306 |
.control-btn.active{background:rgba(255,107,107,0.25);border-color:rgba(255,107,107,0.7);
|
| 307 |
color:#ff6b6b;box-shadow:0 0 25px rgba(255,107,107,0.5)}
|
| 308 |
|
| 309 |
-
/*
|
| 310 |
.progress-bar{position:absolute;bottom:0;left:0;right:0;height:4px;
|
| 311 |
background:rgba(255,255,255,0.15);z-index:8}
|
| 312 |
.progress-fill{height:100%;
|
|
@@ -314,10 +340,10 @@
|
|
| 314 |
width:0%;transition:width 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 315 |
box-shadow:0 0 12px rgba(255,107,107,0.6)}
|
| 316 |
|
| 317 |
-
/*
|
| 318 |
.quality-indicator{position:absolute;top:20px;left:20px;
|
| 319 |
padding:8px 16px;border-radius:25px;font-size:12px;font-weight:600;
|
| 320 |
-
backdrop-filter:blur(
|
| 321 |
font-family:'Inter',sans-serif}
|
| 322 |
.quality-hd{background:rgba(76,222,128,0.25);color:#4ade80;border-color:rgba(76,222,128,0.4);
|
| 323 |
box-shadow:0 0 20px rgba(76,222,128,0.3)}
|
|
@@ -326,9 +352,9 @@
|
|
| 326 |
.quality-low{background:rgba(239,68,68,0.25);color:#ef4444;border-color:rgba(239,68,68,0.4);
|
| 327 |
box-shadow:0 0 20px rgba(239,68,68,0.3)}
|
| 328 |
|
| 329 |
-
/*
|
| 330 |
.shortcuts-overlay{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);
|
| 331 |
-
background:rgba(0,0,0,0.95);backdrop-filter:blur(
|
| 332 |
border-radius:28px;padding:40px;border:1px solid rgba(255,255,255,0.15);
|
| 333 |
z-index:11000;opacity:0;pointer-events:none;
|
| 334 |
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
|
@@ -344,24 +370,24 @@
|
|
| 344 |
font:13px/1 'Inter',monospace;color:var(--neon-primary);font-weight:600;
|
| 345 |
box-shadow:0 2px 8px rgba(0,0,0,0.2)}
|
| 346 |
|
| 347 |
-
/*
|
| 348 |
.info{text-align:center;margin-top:25px;padding:0 15px;
|
| 349 |
-
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);position:relative;z-index:2;transform:
|
| 350 |
.info h2{font-size:clamp(20px,5vw,32px);margin:0;font-family:'Playfair Display',serif;
|
| 351 |
background:linear-gradient(135deg,#fff1a8 0%,#ffd166 50%,#ff9a9e 100%);
|
| 352 |
background-size:300% 300%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 353 |
-
font-weight:700;animation:
|
| 354 |
-
text-shadow:0 0 25px rgba(255,209,102,0.4);transform:
|
| 355 |
-
@keyframes
|
| 356 |
.info p{margin:12px 0 0;color:rgba(255,255,255,.9);font-size:15px;font-weight:300;
|
| 357 |
text-shadow:0 0 8px rgba(255,255,255,0.2)}
|
| 358 |
|
| 359 |
-
/*
|
| 360 |
.schedule{max-width:800px;margin:30px auto;
|
| 361 |
-
background:var(--glass-bg);backdrop-filter:blur(
|
| 362 |
border-radius:28px;padding:30px;transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 363 |
position:relative;z-index:2;border:1px solid var(--glass-border);
|
| 364 |
-
box-shadow:var(--shadow-medium);transform:
|
| 365 |
.schedule:hover{transform:translateY(-5px);box-shadow:var(--shadow-strong)}
|
| 366 |
|
| 367 |
.schedule h3{margin:0 0 20px;font-size:22px;color:var(--gold);text-align:center;
|
|
@@ -369,10 +395,10 @@
|
|
| 369 |
|
| 370 |
.row{display:flex;gap:20px;align-items:flex-start;padding:16px 20px;border-radius:16px;
|
| 371 |
font-size:16px;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);position:relative;overflow:hidden;
|
| 372 |
-
cursor:pointer;transform:
|
| 373 |
.row::before{content:'';position:absolute;left:0;top:0;bottom:0;width:0;
|
| 374 |
background:linear-gradient(90deg,rgba(255,107,107,0.15),rgba(78,205,196,0.15));
|
| 375 |
-
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);transform:
|
| 376 |
.row:hover::before{width:100%}
|
| 377 |
.row:hover{transform:translateX(8px) scale(1.02);
|
| 378 |
background:rgba(255,255,255,0.05);box-shadow:var(--shadow-soft)}
|
|
@@ -385,96 +411,96 @@
|
|
| 385 |
border-left:5px solid #ff6b6b;box-shadow:var(--shadow-medium);
|
| 386 |
transform:translateX(10px) scale(1.03)}
|
| 387 |
.row.active::after{content:'✨';position:absolute;right:20px;top:50%;transform:translateY(-50%);
|
| 388 |
-
font-size:18px;animation:
|
| 389 |
-
@keyframes
|
| 390 |
|
| 391 |
footer{text-align:center;color:rgba(255,255,255,.8);font-size:14px;padding:30px;
|
| 392 |
position:relative;z-index:2;text-shadow:0 0 8px rgba(255,255,255,0.2);font-weight:300}
|
| 393 |
|
| 394 |
-
/*
|
| 395 |
-
.live-badge{position:fixed;top:20px;
|
| 396 |
padding:12px 20px;border-radius:30px;
|
| 397 |
-
background:rgba(0,0,0,0.85);backdrop-filter:blur(
|
| 398 |
color:#ff6b6b;font-weight:600;font-size:15px;
|
| 399 |
box-shadow:var(--shadow-medium);
|
| 400 |
-
animation:
|
| 401 |
-
@keyframes
|
| 402 |
|
| 403 |
.dot{width:10px;height:10px;border-radius:50%;background:#ff3b3b;
|
| 404 |
box-shadow:0 0 15px rgba(255,59,59,.9);
|
| 405 |
-
animation:
|
| 406 |
-
@keyframes
|
| 407 |
|
| 408 |
-
.reactions-badge{position:fixed;
|
| 409 |
-
background:rgba(0,0,0,0.85);backdrop-filter:blur(
|
| 410 |
color:#4ecdc4;font-weight:600;font-size:15px;display:inline-flex;gap:12px;align-items:center;
|
| 411 |
-
box-shadow:var(--shadow-medium);transform:
|
| 412 |
|
| 413 |
-
/*
|
| 414 |
.emoji-panel{position:absolute;right:20px;bottom:110px;z-index:6;display:flex;flex-direction:column;gap:18px}
|
| 415 |
.emoji-btn{width:56px;height:56px;border-radius:50%;border:2px solid rgba(255,255,255,.35);
|
| 416 |
-
background:rgba(0,0,0,.7);backdrop-filter:blur(
|
| 417 |
font-size:26px;cursor:pointer;transition:all 0.3s cubic-bezier(0.4,0,0.2,1);
|
| 418 |
-
box-shadow:var(--shadow-soft);transform:
|
| 419 |
.emoji-btn:hover{transform:scale(1.15) rotateZ(10deg);
|
| 420 |
box-shadow:var(--shadow-medium);border-color:rgba(255,107,107,0.6)}
|
| 421 |
.emoji-btn:active{transform:scale(1.05) rotateZ(5deg)}
|
| 422 |
|
| 423 |
.emoji-count{position:absolute;right:76px;min-width:70px;height:36px;padding:0 16px;border-radius:18px;
|
| 424 |
display:flex;align-items:center;justify-content:center;
|
| 425 |
-
background:rgba(0,0,0,.8);backdrop-filter:blur(
|
| 426 |
font:13px/1.4 'Inter',monospace;color:#fff;font-weight:500;
|
| 427 |
-
box-shadow:var(--shadow-soft);transform:
|
| 428 |
|
| 429 |
-
/*
|
| 430 |
.particle{position:absolute;pointer-events:none;z-index:8;font-size:26px;
|
| 431 |
-
animation:
|
| 432 |
-
@keyframes
|
| 433 |
-
0%{transform:
|
| 434 |
20%{opacity:1}
|
| 435 |
-
100%{transform:
|
| 436 |
}
|
| 437 |
|
| 438 |
.burst{position:absolute;pointer-events:none;z-index:8;
|
| 439 |
-
animation:
|
| 440 |
-
@keyframes
|
| 441 |
0%{transform:scale(0.4) rotate(0deg);opacity:0}
|
| 442 |
60%{transform:scale(1.2) rotate(180deg);opacity:1}
|
| 443 |
100%{transform:scale(1.6) rotate(360deg);opacity:0}
|
| 444 |
}
|
| 445 |
|
| 446 |
-
/*
|
| 447 |
#bubbles{position:fixed;inset:0;overflow:hidden;z-index:1;pointer-events:none}
|
| 448 |
.bubble{position:absolute;bottom:-100px;border-radius:50%;
|
| 449 |
background:linear-gradient(45deg,rgba(255,255,255,.12),rgba(255,107,107,.08));
|
| 450 |
-
animation:
|
| 451 |
-
box-shadow:inset 0 0 20px rgba(255,255,255,0.15);transform:
|
| 452 |
-
@keyframes
|
| 453 |
-
0%{transform:
|
| 454 |
50%{opacity:.8}
|
| 455 |
-
100%{transform:
|
| 456 |
}
|
| 457 |
|
| 458 |
-
/*
|
| 459 |
.welcome-neon{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);
|
| 460 |
z-index:10000;font-size:clamp(36px,9vw,72px);font-weight:900;font-family:'Playfair Display',serif;
|
| 461 |
background:linear-gradient(45deg,#ff6b6b,#ffd93d,#6bcf7f,#4d96ff,#9c88ff,#ff6b6b);
|
| 462 |
background-size:500% 500%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 463 |
-
animation:
|
| 464 |
text-shadow:0 0 40px rgba(255,107,107,0.8);pointer-events:none;opacity:1;
|
| 465 |
filter:drop-shadow(0 0 30px rgba(255,107,107,0.5));transform-origin:center}
|
| 466 |
-
@keyframes
|
| 467 |
-
@keyframes
|
| 468 |
0%{opacity:1;transform:translate(-50%, -50%) scale(1)}
|
| 469 |
80%{opacity:1;transform:translate(-50%, -50%) scale(1.08)}
|
| 470 |
100%{opacity:0;transform:translate(-50%, -50%) scale(0.85)}
|
| 471 |
}
|
| 472 |
|
| 473 |
-
/*
|
| 474 |
.audio-visualizer{position:absolute;bottom:30px;left:30px;display:flex;gap:4px;z-index:6}
|
| 475 |
.audio-bar{width:5px;border-radius:3px;
|
| 476 |
background:linear-gradient(180deg,#ff6b6b 0%,#4ecdc4 50%,#9d4edd 100%);
|
| 477 |
-
animation:
|
| 478 |
box-shadow:0 0 10px rgba(255,107,107,0.4)}
|
| 479 |
.audio-bar:nth-child(1){height:25px;animation-delay:0s}
|
| 480 |
.audio-bar:nth-child(2){height:35px;animation-delay:0.1s}
|
|
@@ -482,16 +508,19 @@
|
|
| 482 |
.audio-bar:nth-child(4){height:55px;animation-delay:0.3s}
|
| 483 |
.audio-bar:nth-child(5){height:45px;animation-delay:0.4s}
|
| 484 |
.audio-bar:nth-child(6){height:35px;animation-delay:0.5s}
|
| 485 |
-
@keyframes
|
| 486 |
|
| 487 |
-
/*
|
| 488 |
@media (max-width:768px) and (orientation:portrait){
|
| 489 |
body{cursor:auto}
|
| 490 |
.cursor,.cursor-trail{display:none !important}
|
| 491 |
-
|
| 492 |
/* Hide desktop performance toggle on mobile */
|
| 493 |
.performance-toggle,.performance-panel{display:none !important}
|
| 494 |
|
|
|
|
|
|
|
|
|
|
| 495 |
header{padding:20px 0 0;transform:translateY(-100%);opacity:0}
|
| 496 |
header.visible{transform:translateY(0);opacity:1}
|
| 497 |
.divider{display:none}
|
|
@@ -503,6 +532,7 @@
|
|
| 503 |
.panel:hover{transform:none}
|
| 504 |
video{border-radius:0}
|
| 505 |
|
|
|
|
| 506 |
.control-panel{
|
| 507 |
position:fixed;
|
| 508 |
bottom:30px;
|
|
@@ -512,7 +542,7 @@
|
|
| 512 |
padding:8px 16px;
|
| 513 |
opacity:1 !important;
|
| 514 |
background:rgba(0,0,0,0.95);
|
| 515 |
-
backdrop-filter:blur(
|
| 516 |
border:1px solid rgba(255,107,107,0.4);
|
| 517 |
z-index:50;
|
| 518 |
box-shadow:var(--shadow-strong);
|
|
@@ -522,6 +552,7 @@
|
|
| 522 |
.volume-slider{width:50px;height:4px}
|
| 523 |
.control-btn{width:32px;height:32px;font-size:12px}
|
| 524 |
|
|
|
|
| 525 |
.emoji-panel{
|
| 526 |
position:fixed;
|
| 527 |
right:15px;
|
|
@@ -533,21 +564,20 @@
|
|
| 533 |
.emoji-btn{width:48px;height:48px;font-size:22px;border:1.5px solid rgba(255,255,255,.4)}
|
| 534 |
.emoji-count{right:60px;min-width:50px;height:28px;font-size:11px}
|
| 535 |
|
| 536 |
-
|
| 537 |
-
.
|
|
|
|
|
|
|
| 538 |
.chip{position:fixed;bottom:85px;right:15px;font-size:11px;padding:6px 10px;z-index:40}
|
| 539 |
-
.audio-visualizer{position:fixed;bottom:85px;
|
| 540 |
.quality-indicator{top:60px;left:15px;font-size:10px;padding:4px 8px;z-index:40}
|
| 541 |
|
| 542 |
-
/* Show mobile performance toggle */
|
| 543 |
-
.mobile-perf-toggle{display:flex}
|
| 544 |
-
|
| 545 |
.info,.schedule{position:relative;margin:0;border-radius:20px 20px 0 0;transform:translateY(-100%);opacity:0}
|
| 546 |
.info.visible,.schedule.visible{transform:translateY(0);opacity:1}
|
| 547 |
|
| 548 |
.bottom-sheet{
|
| 549 |
position:fixed;left:0;right:0;bottom:0;z-index:35;
|
| 550 |
-
background:rgba(0,0,0,.95);backdrop-filter:blur(
|
| 551 |
border-top:1px solid rgba(255,107,107,.5);
|
| 552 |
max-height:45vh;overflow:auto;padding:15px;
|
| 553 |
transform:translateY(100%);transition:transform 0.5s cubic-bezier(0.4,0,0.2,1);
|
|
@@ -556,10 +586,10 @@
|
|
| 556 |
.bottom-sheet.visible{transform:translateY(0)}
|
| 557 |
|
| 558 |
.auto-hide-indicator{
|
| 559 |
-
position:fixed;bottom:
|
| 560 |
background:rgba(0,0,0,.9);color:rgba(255,255,255,.9);
|
| 561 |
padding:8px 20px;border-radius:20px;font-size:12px;z-index:30;
|
| 562 |
-
opacity:0;transition:opacity 0.4s ease;backdrop-filter:blur(
|
| 563 |
border:1px solid rgba(255,107,107,0.4);box-shadow:var(--shadow-soft);
|
| 564 |
}
|
| 565 |
.auto-hide-indicator.visible{opacity:1}
|
|
@@ -577,7 +607,6 @@
|
|
| 577 |
.panel{max-width:95%;margin:15px auto 0}
|
| 578 |
.emoji-panel{right:25px;bottom:120px;gap:14px}
|
| 579 |
.control-panel{bottom:25px;gap:12px;padding:12px 22px}
|
| 580 |
-
.live-badge{right:320px}
|
| 581 |
}
|
| 582 |
|
| 583 |
/* Enhanced Large Desktop Support */
|
|
@@ -588,10 +617,9 @@
|
|
| 588 |
.control-panel{gap:18px;padding:18px 32px}
|
| 589 |
.mute-btn{width:56px;height:56px}
|
| 590 |
.volume-slider{width:120px}
|
| 591 |
-
.live-badge{right:400px}
|
| 592 |
}
|
| 593 |
|
| 594 |
-
/* Performance optimizations */
|
| 595 |
.low-performance *{animation-duration:4s !important}
|
| 596 |
.low-performance .aurora{opacity:0.4}
|
| 597 |
.low-performance .music-notes{display:none}
|
|
@@ -609,15 +637,15 @@
|
|
| 609 |
<div class="cursor" id="cursor"></div>
|
| 610 |
<div class="music-notes" id="music-notes"></div>
|
| 611 |
|
| 612 |
-
<!--
|
| 613 |
<div class="performance-toggle" id="performance-toggle">
|
| 614 |
<span class="mode-icon">⚙️</span>
|
| 615 |
<span class="mode-text" id="mode-text">Balanced</span>
|
| 616 |
</div>
|
| 617 |
|
| 618 |
-
<!--
|
| 619 |
<div class="performance-panel" id="performance-panel">
|
| 620 |
-
<h3>🎨 Visual Quality</h3>
|
| 621 |
<div class="mode-grid">
|
| 622 |
<div class="mode-card" data-mode="ultra">
|
| 623 |
<span class="mode-emoji">🌟</span>
|
|
@@ -639,6 +667,11 @@
|
|
| 639 |
<div class="mode-name">Performance</div>
|
| 640 |
<div class="mode-desc">Maximum speed & efficiency</div>
|
| 641 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 642 |
</div>
|
| 643 |
<div class="perf-metrics">
|
| 644 |
<h4>📊 Current Status</h4>
|
|
@@ -652,29 +685,29 @@
|
|
| 652 |
</div>
|
| 653 |
<div class="metric-item">
|
| 654 |
<span>Particles:</span>
|
| 655 |
-
<span class="metric-value" id="particles-count">
|
| 656 |
</div>
|
| 657 |
</div>
|
| 658 |
</div>
|
| 659 |
|
| 660 |
-
<!--
|
| 661 |
<div class="mobile-perf-toggle" id="mobile-perf-toggle">
|
| 662 |
<span class="perf-icon">⚙️</span>
|
| 663 |
</div>
|
| 664 |
|
| 665 |
-
<!--
|
| 666 |
<div class="mobile-perf-panel" id="mobile-perf-panel">
|
| 667 |
<h3>🎨 Visual Quality</h3>
|
| 668 |
<div class="mode-grid">
|
| 669 |
<div class="mode-card" data-mode="ultra">
|
| 670 |
<span class="mode-emoji">🌟</span>
|
| 671 |
<div class="mode-name">Ultra</div>
|
| 672 |
-
<div class="mode-desc">Max
|
| 673 |
</div>
|
| 674 |
<div class="mode-card" data-mode="high">
|
| 675 |
<span class="mode-emoji">✨</span>
|
| 676 |
<div class="mode-name">High</div>
|
| 677 |
-
<div class="mode-desc">Rich
|
| 678 |
</div>
|
| 679 |
<div class="mode-card active" data-mode="balanced">
|
| 680 |
<span class="mode-emoji">⚖️</span>
|
|
@@ -684,7 +717,12 @@
|
|
| 684 |
<div class="mode-card" data-mode="performance">
|
| 685 |
<span class="mode-emoji">🚀</span>
|
| 686 |
<div class="mode-name">Fast</div>
|
| 687 |
-
<div class="mode-desc">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 688 |
</div>
|
| 689 |
</div>
|
| 690 |
</div>
|
|
@@ -724,6 +762,10 @@
|
|
| 724 |
<span>Performance Toggle</span>
|
| 725 |
<span class="shortcut-key">Q</span>
|
| 726 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 727 |
<div class="shortcut-item">
|
| 728 |
<span>Show Shortcuts</span>
|
| 729 |
<span class="shortcut-key">?</span>
|
|
@@ -740,7 +782,23 @@
|
|
| 740 |
|
| 741 |
<main>
|
| 742 |
<section class="panel" id="panel">
|
| 743 |
-
<canvas id="color-canvas"></canvas>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 744 |
<div class="panel-accents">
|
| 745 |
<div class="corner-accent"></div>
|
| 746 |
<div class="corner-accent"></div>
|
|
@@ -748,166 +806,173 @@
|
|
| 748 |
<div class="corner-accent"></div>
|
| 749 |
</div>
|
| 750 |
|
| 751 |
-
|
| 752 |
-
|
| 753 |
-
<div class="
|
| 754 |
-
|
| 755 |
-
|
| 756 |
-
|
| 757 |
-
|
| 758 |
-
|
| 759 |
-
<!-- Enhanced Unmute Overlay -->
|
| 760 |
-
<div class="unmute-overlay" id="unmute-overlay">
|
| 761 |
-
<button class="unmute-btn" id="unmute-btn">
|
| 762 |
-
<span>🔊</span>
|
| 763 |
-
<span>Click to Enable Sound</span>
|
| 764 |
-
</button>
|
| 765 |
</div>
|
| 766 |
|
| 767 |
-
<video id="player" autoplay muted playsinline loop crossorigin="anonymous"></video>
|
| 768 |
-
<div id="chip" class="chip"></div>
|
| 769 |
-
|
| 770 |
-
<!-- Enhanced Professional Control Panel -->
|
| 771 |
<div class="control-panel" id="control-panel">
|
| 772 |
-
<
|
| 773 |
-
<span class="mute-icon" id="mute-icon"
|
| 774 |
-
</
|
|
|
|
| 775 |
<div class="volume-control">
|
| 776 |
-
<div class="volume-slider" id="volume-slider"
|
| 777 |
<div class="volume-fill" id="volume-fill"></div>
|
| 778 |
</div>
|
| 779 |
</div>
|
| 780 |
-
|
| 781 |
-
<
|
| 782 |
-
|
| 783 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 784 |
</div>
|
| 785 |
|
| 786 |
-
|
| 787 |
-
|
| 788 |
-
<div class="audio-bar"></div>
|
| 789 |
-
<div class="audio-bar"></div>
|
| 790 |
-
<div class="audio-bar"></div>
|
| 791 |
-
<div class="audio-bar"></div>
|
| 792 |
-
<div class="audio-bar"></div>
|
| 793 |
-
<div class="audio-bar"></div>
|
| 794 |
</div>
|
| 795 |
|
| 796 |
-
<!-- Enhanced Emoji Panel -->
|
| 797 |
<div class="emoji-panel" id="emoji-panel">
|
| 798 |
-
<div class="emoji-
|
| 799 |
-
<
|
| 800 |
<div class="emoji-count" id="count-heart">0</div>
|
| 801 |
</div>
|
| 802 |
-
|
| 803 |
-
|
|
|
|
| 804 |
<div class="emoji-count" id="count-fire">0</div>
|
| 805 |
</div>
|
| 806 |
-
|
| 807 |
-
|
|
|
|
| 808 |
<div class="emoji-count" id="count-dancer">0</div>
|
| 809 |
</div>
|
| 810 |
-
|
| 811 |
-
|
|
|
|
| 812 |
<div class="emoji-count" id="count-spark">0</div>
|
| 813 |
</div>
|
| 814 |
</div>
|
| 815 |
</section>
|
|
|
|
| 816 |
|
| 817 |
-
|
| 818 |
-
|
| 819 |
-
|
| 820 |
-
|
| 821 |
-
|
| 822 |
-
|
| 823 |
-
|
| 824 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 825 |
</section>
|
| 826 |
|
| 827 |
-
<section class="
|
| 828 |
-
<
|
| 829 |
-
|
| 830 |
-
<p id="vmeta2">—</p>
|
| 831 |
-
</div>
|
| 832 |
-
<div class="schedule" style="margin-top:15px;">
|
| 833 |
-
<h3>Schedule</h3>
|
| 834 |
-
<div id="rows2"></div>
|
| 835 |
-
</div>
|
| 836 |
</section>
|
|
|
|
| 837 |
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
</
|
| 841 |
|
| 842 |
-
<footer
|
|
|
|
|
|
|
| 843 |
|
| 844 |
<script>
|
| 845 |
-
/*
|
| 846 |
-
const USE_UTC = true;
|
| 847 |
-
let currentDominantColor = '#ff6b6b';
|
| 848 |
-
let audioContext = null;
|
| 849 |
-
let analyser = null;
|
| 850 |
-
let mouseX = 0, mouseY = 0;
|
| 851 |
-
let performanceMode = false;
|
| 852 |
-
let maxFloatingElements = 10;
|
| 853 |
let frameCount = 0;
|
| 854 |
-
let isTheaterMode = false;
|
| 855 |
-
let isControlPanelVisible = false;
|
| 856 |
-
|
| 857 |
-
// NEW: Performance Mode State
|
| 858 |
let currentPerformanceMode = 'balanced';
|
| 859 |
-
let
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
};
|
| 865 |
-
|
| 866 |
-
// State
|
| 867 |
-
let isMuted = true;
|
| 868 |
let currentVolume = 0.5;
|
|
|
|
|
|
|
| 869 |
let isFullscreen = false;
|
| 870 |
let isPictureInPicture = false;
|
| 871 |
-
let
|
|
|
|
| 872 |
|
| 873 |
-
/*
|
| 874 |
const performanceCheck = {
|
| 875 |
-
|
| 876 |
-
lastFrameTime: performance.now(),
|
| 877 |
frameCount: 0,
|
| 878 |
-
fpsHistory: [],
|
| 879 |
avgFps: 60,
|
| 880 |
-
|
| 881 |
update() {
|
| 882 |
-
const
|
| 883 |
this.frameCount++;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 884 |
|
| 885 |
-
|
| 886 |
-
|
| 887 |
-
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
|
| 891 |
-
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
|
| 895 |
-
|
| 896 |
-
|
| 897 |
-
this.lastFrameTime = currentTime;
|
| 898 |
}
|
| 899 |
}
|
| 900 |
};
|
| 901 |
|
| 902 |
-
/*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 903 |
function initPerformanceModeSystem() {
|
| 904 |
const desktopToggle = document.getElementById('performance-toggle');
|
| 905 |
const desktopPanel = document.getElementById('performance-panel');
|
| 906 |
const mobileToggle = document.getElementById('mobile-perf-toggle');
|
| 907 |
const mobilePanel = document.getElementById('mobile-perf-panel');
|
| 908 |
|
| 909 |
-
// Load saved preference
|
| 910 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 911 |
setPerformanceMode(savedMode);
|
| 912 |
|
| 913 |
// Desktop toggle
|
|
@@ -930,7 +995,7 @@ function initPerformanceModeSystem() {
|
|
| 930 |
if (modeCard) {
|
| 931 |
const mode = modeCard.getAttribute('data-mode');
|
| 932 |
setPerformanceMode(mode);
|
| 933 |
-
|
| 934 |
// Hide panels after selection
|
| 935 |
desktopPanel?.classList.remove('visible');
|
| 936 |
mobilePanel?.classList.remove('visible');
|
|
@@ -947,13 +1012,15 @@ function initPerformanceModeSystem() {
|
|
| 947 |
}
|
| 948 |
});
|
| 949 |
|
| 950 |
-
// Keyboard
|
| 951 |
document.addEventListener('keydown', function(e) {
|
| 952 |
-
if (e.key.toLowerCase() === 'q') {
|
| 953 |
const modes = Object.keys(performanceModes);
|
| 954 |
const currentIndex = modes.indexOf(currentPerformanceMode);
|
| 955 |
const nextIndex = (currentIndex + 1) % modes.length;
|
| 956 |
setPerformanceMode(modes[nextIndex]);
|
|
|
|
|
|
|
| 957 |
}
|
| 958 |
});
|
| 959 |
}
|
|
@@ -963,18 +1030,18 @@ function setPerformanceMode(mode) {
|
|
| 963 |
|
| 964 |
currentPerformanceMode = mode;
|
| 965 |
const config = performanceModes[mode];
|
| 966 |
-
|
| 967 |
// Update body class
|
| 968 |
document.body.className = document.body.className.replace(/\b\w+-mode\b/g, '');
|
| 969 |
document.body.classList.add(mode + '-mode');
|
| 970 |
-
|
| 971 |
// Update maxFloatingElements
|
| 972 |
maxFloatingElements = config.particles;
|
| 973 |
-
|
| 974 |
// Update UI indicators
|
| 975 |
const modeText = document.getElementById('mode-text');
|
| 976 |
if (modeText) modeText.textContent = config.name;
|
| 977 |
-
|
| 978 |
// Update active cards
|
| 979 |
document.querySelectorAll('.mode-card').forEach(card => {
|
| 980 |
card.classList.remove('active');
|
|
@@ -989,24 +1056,22 @@ function setPerformanceMode(mode) {
|
|
| 989 |
|
| 990 |
// Save preference
|
| 991 |
localStorage.setItem('performanceMode', mode);
|
| 992 |
-
|
| 993 |
// Apply performance adjustments
|
| 994 |
applyPerformanceSettings();
|
| 995 |
-
|
| 996 |
console.log(`Performance mode set to: ${config.name}`);
|
| 997 |
}
|
| 998 |
|
| 999 |
function applyPerformanceSettings() {
|
| 1000 |
const config = performanceModes[currentPerformanceMode];
|
| 1001 |
-
|
| 1002 |
// Adjust animation speeds
|
| 1003 |
-
const
|
| 1004 |
-
|
| 1005 |
-
|
| 1006 |
-
|
| 1007 |
-
|
| 1008 |
-
});
|
| 1009 |
-
|
| 1010 |
// Update performance metrics display
|
| 1011 |
updatePerformanceMetrics();
|
| 1012 |
}
|
|
@@ -1015,21 +1080,23 @@ function updatePerformanceMetrics() {
|
|
| 1015 |
const fpsDisplay = document.getElementById('fps-display');
|
| 1016 |
const effectsLevel = document.getElementById('effects-level');
|
| 1017 |
const particlesCount = document.getElementById('particles-count');
|
| 1018 |
-
|
| 1019 |
if (fpsDisplay) fpsDisplay.textContent = performanceCheck.avgFps + ' FPS';
|
| 1020 |
if (effectsLevel) {
|
| 1021 |
-
const levels = { ultra: 'Maximum', high: 'High', balanced: 'Medium', performance: 'Low' };
|
| 1022 |
effectsLevel.textContent = levels[currentPerformanceMode];
|
| 1023 |
}
|
| 1024 |
if (particlesCount) particlesCount.textContent = maxFloatingElements + ' Active';
|
| 1025 |
}
|
| 1026 |
|
| 1027 |
-
/*
|
| 1028 |
-
|
|
|
|
|
|
|
|
|
|
| 1029 |
if (isMobileDevice()) return;
|
| 1030 |
-
|
| 1031 |
const cursor = document.getElementById('cursor');
|
| 1032 |
-
let trailCount = 0;
|
| 1033 |
let isMoving = false;
|
| 1034 |
let moveTimeout;
|
| 1035 |
|
|
@@ -1038,15 +1105,15 @@ function initEnhancedCursor(){
|
|
| 1038 |
mouseY = e.clientY;
|
| 1039 |
|
| 1040 |
cursor.style.transform = `translate3d(${mouseX - 10}px, ${mouseY - 10}px, 0)`;
|
| 1041 |
-
|
| 1042 |
isMoving = true;
|
| 1043 |
clearTimeout(moveTimeout);
|
| 1044 |
-
|
| 1045 |
-
//
|
| 1046 |
const config = performanceModes[currentPerformanceMode];
|
| 1047 |
-
const shouldCreateTrail = Math.random() > (0.
|
| 1048 |
-
|
| 1049 |
-
if(shouldCreateTrail && trailCount <
|
| 1050 |
trailCount++;
|
| 1051 |
const trail = document.createElement('div');
|
| 1052 |
trail.className = 'cursor-trail';
|
|
@@ -1054,34 +1121,30 @@ function initEnhancedCursor(){
|
|
| 1054 |
document.body.appendChild(trail);
|
| 1055 |
|
| 1056 |
setTimeout(function() {
|
| 1057 |
-
if (trail.parentNode)
|
| 1058 |
-
|
| 1059 |
-
|
|
|
|
|
|
|
| 1060 |
}
|
| 1061 |
-
|
| 1062 |
moveTimeout = setTimeout(() => { isMoving = false; }, 150);
|
| 1063 |
});
|
| 1064 |
|
| 1065 |
-
//
|
| 1066 |
const interactiveElements = 'button, .control-btn, .emoji-btn, .mute-btn, .row, .shortcut-item, .mode-card, .performance-toggle';
|
| 1067 |
-
|
| 1068 |
document.addEventListener('mouseenter', function(e) {
|
| 1069 |
if (e.target.matches(interactiveElements)) {
|
| 1070 |
cursor.classList.add('hover');
|
| 1071 |
}
|
| 1072 |
}, true);
|
| 1073 |
-
|
| 1074 |
document.addEventListener('mouseleave', function(e) {
|
| 1075 |
if (e.target.matches(interactiveElements)) {
|
| 1076 |
cursor.classList.remove('hover');
|
| 1077 |
}
|
| 1078 |
}, true);
|
| 1079 |
-
|
| 1080 |
-
document.addEventListener('scroll', function() {
|
| 1081 |
-
if (isMoving) {
|
| 1082 |
-
cursor.style.transform = `translate3d(${mouseX - 10}px, ${mouseY - 10}px, 0)`;
|
| 1083 |
-
}
|
| 1084 |
-
}, { passive: true });
|
| 1085 |
}
|
| 1086 |
|
| 1087 |
function isMobileDevice() {
|
|
@@ -1089,7 +1152,7 @@ function isMobileDevice() {
|
|
| 1089 |
(window.innerWidth <= 768 && 'ontouchstart' in window);
|
| 1090 |
}
|
| 1091 |
|
| 1092 |
-
/*
|
| 1093 |
function initSimpleAudioEnable() {
|
| 1094 |
const overlay = document.getElementById('unmute-overlay');
|
| 1095 |
const unmuteBtn = document.getElementById('unmute-btn');
|
|
@@ -1108,7 +1171,7 @@ function initSimpleAudioEnable() {
|
|
| 1108 |
try {
|
| 1109 |
if (!audioContext) {
|
| 1110 |
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
| 1111 |
-
|
| 1112 |
}
|
| 1113 |
} catch (e) {
|
| 1114 |
console.log('Audio context creation failed, continuing without visualizer');
|
|
@@ -1121,7 +1184,7 @@ function initSimpleAudioEnable() {
|
|
| 1121 |
}
|
| 1122 |
}
|
| 1123 |
|
| 1124 |
-
/*
|
| 1125 |
const SCHEDULE_A = [
|
| 1126 |
{ 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 },
|
| 1127 |
{ 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 },
|
|
@@ -1146,6 +1209,8 @@ const SCHEDULE_B = [
|
|
| 1146 |
{ title:"✨ Belly dance ✨ - secret of the goddess", url:"https://ik.imagekit.io/b3mprpaei/%E2%9C%A8%20Belly%20dance%20%E2%9C%A8%20-%20secret%20of%20the%20goddess.mp4", duration:166, start:19.1, end:21 }
|
| 1147 |
];
|
| 1148 |
|
|
|
|
|
|
|
| 1149 |
/* Utilities */
|
| 1150 |
function nowHour(){
|
| 1151 |
const n=new Date();
|
|
@@ -1156,7 +1221,7 @@ function utcDayIndex(){ return (new Date()).getUTCDay(); }
|
|
| 1156 |
function secFmt(s){return `${Math.floor(s/60)}:${String(s%60).padStart(2,'0')}`;}
|
| 1157 |
function clamp(n,min,max){return Math.max(min,Math.min(max,n));}
|
| 1158 |
|
| 1159 |
-
/*
|
| 1160 |
function initMuteControl() {
|
| 1161 |
const muteBtn = document.getElementById('mute-btn');
|
| 1162 |
const muteIcon = document.getElementById('mute-icon');
|
|
@@ -1179,14 +1244,9 @@ function initMuteControl() {
|
|
| 1179 |
muteBtn.classList.remove('muted');
|
| 1180 |
}
|
| 1181 |
|
| 1182 |
-
|
| 1183 |
-
|
| 1184 |
-
|
| 1185 |
-
muteBtn.animate([
|
| 1186 |
-
{transform: 'scale(1)'},
|
| 1187 |
-
{transform: 'scale(1.25)'},
|
| 1188 |
-
{transform: 'scale(1)'}
|
| 1189 |
-
], {duration: animationDuration, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'});
|
| 1190 |
});
|
| 1191 |
}
|
| 1192 |
|
|
@@ -1229,15 +1289,6 @@ function initTheaterMode() {
|
|
| 1229 |
isTheaterMode = !isTheaterMode;
|
| 1230 |
document.body.classList.toggle('theater-mode', isTheaterMode);
|
| 1231 |
theaterBtn.classList.toggle('active', isTheaterMode);
|
| 1232 |
-
|
| 1233 |
-
const config = performanceModes[currentPerformanceMode];
|
| 1234 |
-
const animationDuration = 500 * config.animationSpeed;
|
| 1235 |
-
|
| 1236 |
-
theaterBtn.animate([
|
| 1237 |
-
{transform: 'rotateY(0deg) scale(1)'},
|
| 1238 |
-
{transform: 'rotateY(180deg) scale(1.1)'},
|
| 1239 |
-
{transform: 'rotateY(0deg) scale(1)'}
|
| 1240 |
-
], {duration: animationDuration, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'});
|
| 1241 |
});
|
| 1242 |
}
|
| 1243 |
|
|
@@ -1261,7 +1312,7 @@ function initFullscreenControl() {
|
|
| 1261 |
|
| 1262 |
document.addEventListener('fullscreenchange', function() {
|
| 1263 |
isFullscreen = !!document.fullscreenElement;
|
| 1264 |
-
|
| 1265 |
});
|
| 1266 |
}
|
| 1267 |
|
|
@@ -1309,7 +1360,7 @@ function initKeyboardShortcuts() {
|
|
| 1309 |
document.addEventListener('keydown', function(e) {
|
| 1310 |
switch(e.key.toLowerCase()) {
|
| 1311 |
case 'm':
|
| 1312 |
-
document.getElementById('mute-btn').click();
|
| 1313 |
break;
|
| 1314 |
case 'f':
|
| 1315 |
document.getElementById('fullscreen-btn').click();
|
|
@@ -1320,9 +1371,6 @@ function initKeyboardShortcuts() {
|
|
| 1320 |
case 'p':
|
| 1321 |
document.getElementById('pip-btn').click();
|
| 1322 |
break;
|
| 1323 |
-
case 'q':
|
| 1324 |
-
// Performance mode cycling handled in initPerformanceModeSystem
|
| 1325 |
-
break;
|
| 1326 |
case 'arrowup':
|
| 1327 |
e.preventDefault();
|
| 1328 |
if (audioEnabled) {
|
|
@@ -1414,9 +1462,11 @@ function initQualityIndicator() {
|
|
| 1414 |
});
|
| 1415 |
}
|
| 1416 |
|
| 1417 |
-
/*
|
| 1418 |
let activeFloatingElements = 0;
|
| 1419 |
-
|
|
|
|
|
|
|
| 1420 |
const config = performanceModes[currentPerformanceMode];
|
| 1421 |
if(activeFloatingElements >= config.particles) return;
|
| 1422 |
|
|
@@ -1431,26 +1481,30 @@ function createEnhancedFloatingNote(){
|
|
| 1431 |
|
| 1432 |
activeFloatingElements++;
|
| 1433 |
document.getElementById('music-notes').appendChild(note);
|
|
|
|
| 1434 |
setTimeout(function() {
|
| 1435 |
-
note.
|
| 1436 |
-
|
| 1437 |
-
|
|
|
|
|
|
|
| 1438 |
}
|
| 1439 |
|
| 1440 |
-
function
|
| 1441 |
const canvas = document.getElementById('color-canvas');
|
| 1442 |
const ctx = canvas.getContext('2d');
|
| 1443 |
const video = document.getElementById('player');
|
|
|
|
| 1444 |
|
| 1445 |
-
function
|
| 1446 |
if(!video.videoWidth || !video.videoHeight) return;
|
| 1447 |
|
| 1448 |
-
canvas.width =
|
| 1449 |
-
canvas.height =
|
| 1450 |
|
| 1451 |
try{
|
| 1452 |
-
ctx.drawImage(video, 0, 0,
|
| 1453 |
-
const imageData = ctx.getImageData(
|
| 1454 |
const data = imageData.data;
|
| 1455 |
|
| 1456 |
let r = 0, g = 0, b = 0, count = 0;
|
|
@@ -1466,24 +1520,25 @@ function initEnhancedColorSampling(){
|
|
| 1466 |
r = Math.floor(r / count);
|
| 1467 |
g = Math.floor(g / count);
|
| 1468 |
b = Math.floor(b / count);
|
| 1469 |
-
|
| 1470 |
-
updateEnhancedDynamicColors(r, g, b);
|
| 1471 |
}
|
| 1472 |
}catch(e){
|
|
|
|
| 1473 |
const time = Date.now() / 2500;
|
| 1474 |
const r = Math.floor(128 + 127 * Math.sin(time * 0.15));
|
| 1475 |
const g = Math.floor(128 + 127 * Math.sin(time * 0.25));
|
| 1476 |
const b = Math.floor(128 + 127 * Math.sin(time * 0.35));
|
| 1477 |
-
|
| 1478 |
}
|
| 1479 |
}
|
| 1480 |
|
| 1481 |
const config = performanceModes[currentPerformanceMode];
|
| 1482 |
-
const interval =
|
| 1483 |
-
|
|
|
|
| 1484 |
}
|
| 1485 |
|
| 1486 |
-
function
|
| 1487 |
const root = document.documentElement;
|
| 1488 |
const config = performanceModes[currentPerformanceMode];
|
| 1489 |
|
|
@@ -1496,13 +1551,13 @@ function updateEnhancedDynamicColors(r, g, b){
|
|
| 1496 |
const compG = Math.max(0, 255 - g + intensity * 0.5);
|
| 1497 |
const compB = Math.max(0, 255 - b + intensity * 0.875);
|
| 1498 |
|
| 1499 |
-
root.style.setProperty('--neon-primary',
|
| 1500 |
-
root.style.setProperty('--neon-secondary',
|
| 1501 |
|
| 1502 |
-
currentDominantColor =
|
| 1503 |
}
|
| 1504 |
|
| 1505 |
-
function
|
| 1506 |
if (!audioEnabled || !audioContext) return;
|
| 1507 |
|
| 1508 |
const video = document.getElementById('player');
|
|
@@ -1518,11 +1573,15 @@ function initEnhancedAudioAnalysis(){
|
|
| 1518 |
const bufferLength = analyser.frequencyBinCount;
|
| 1519 |
const dataArray = new Uint8Array(bufferLength);
|
| 1520 |
|
| 1521 |
-
|
|
|
|
|
|
|
| 1522 |
const config = performanceModes[currentPerformanceMode];
|
| 1523 |
-
|
| 1524 |
-
|
| 1525 |
-
|
|
|
|
|
|
|
| 1526 |
return;
|
| 1527 |
}
|
| 1528 |
|
|
@@ -1533,21 +1592,22 @@ function initEnhancedAudioAnalysis(){
|
|
| 1533 |
const value = dataArray[i] || 0;
|
| 1534 |
const normalizedValue = value / 255;
|
| 1535 |
const height = Math.max(8, normalizedValue * 50 * config.effectIntensity);
|
| 1536 |
-
|
| 1537 |
bar.style.height = height + 'px';
|
| 1538 |
});
|
| 1539 |
|
| 1540 |
-
|
|
|
|
| 1541 |
}
|
| 1542 |
|
| 1543 |
-
|
| 1544 |
|
| 1545 |
}catch(e){
|
|
|
|
| 1546 |
const bars = document.querySelectorAll('.audio-bar');
|
| 1547 |
bars.forEach(function(bar, i) {
|
| 1548 |
const config = performanceModes[currentPerformanceMode];
|
| 1549 |
-
const interval = (120 + Math.random() * 180) / config.animationSpeed;
|
| 1550 |
-
|
| 1551 |
setInterval(function() {
|
| 1552 |
const randomHeight = (8 + Math.random() * 40) * config.effectIntensity;
|
| 1553 |
bar.style.height = randomHeight + 'px';
|
|
@@ -1556,13 +1616,14 @@ function initEnhancedAudioAnalysis(){
|
|
| 1556 |
}
|
| 1557 |
}
|
| 1558 |
|
| 1559 |
-
/*
|
| 1560 |
function todaySchedule(){
|
| 1561 |
const d = utcDayIndex();
|
| 1562 |
if(d===1 || d===2 || d===3) return { which:'A (Mon-Tue-Wed)', list: SCHEDULE_A };
|
| 1563 |
return { which:'B (Thu-Fri-Sat-Sun)', list: SCHEDULE_B };
|
| 1564 |
}
|
| 1565 |
|
|
|
|
| 1566 |
const $player = document.getElementById('player');
|
| 1567 |
const $vtitle = document.getElementById('vtitle');
|
| 1568 |
const $vmeta = document.getElementById('vmeta');
|
|
@@ -1604,7 +1665,7 @@ function showSchedule() {
|
|
| 1604 |
isScheduleVisible = true;
|
| 1605 |
|
| 1606 |
if (autoHideTimer) clearTimeout(autoHideTimer);
|
| 1607 |
-
autoHideTimer = setTimeout(
|
| 1608 |
}
|
| 1609 |
|
| 1610 |
function hideSchedule() {
|
|
@@ -1634,7 +1695,7 @@ document.addEventListener('click', function(e) {
|
|
| 1634 |
if (!isMobilePortrait()) return;
|
| 1635 |
if (e.target.closest('.emoji-btn') || e.target.closest('.bottom-sheet') ||
|
| 1636 |
e.target.closest('header') || e.target.closest('.info') || e.target.closest('.schedule') ||
|
| 1637 |
-
e.target.closest('.control-panel') || e.target.closest('.mobile-perf-toggle') ||
|
| 1638 |
e.target.closest('.mobile-perf-panel')) return;
|
| 1639 |
|
| 1640 |
const currentTime = new Date().getTime();
|
|
@@ -1751,13 +1812,17 @@ $player.addEventListener('loadedmetadata', function(){
|
|
| 1751 |
}
|
| 1752 |
|
| 1753 |
setTimeout(function() {
|
| 1754 |
-
|
| 1755 |
}, 1000);
|
| 1756 |
});
|
| 1757 |
|
| 1758 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1759 |
const config = performanceModes[currentPerformanceMode];
|
| 1760 |
-
if(
|
| 1761 |
|
| 1762 |
const b = document.createElement('div');
|
| 1763 |
b.className = 'bubble';
|
|
@@ -1768,14 +1833,18 @@ function createEnhancedBubble(){
|
|
| 1768 |
b.style.animationDuration = ((25 + Math.random() * 25) / config.animationSpeed) + 's';
|
| 1769 |
b.style.opacity = 0.5 * config.effectIntensity;
|
| 1770 |
|
| 1771 |
-
|
| 1772 |
document.getElementById('bubbles').appendChild(b);
|
|
|
|
| 1773 |
setTimeout(function() {
|
| 1774 |
-
b.
|
| 1775 |
-
|
| 1776 |
-
|
|
|
|
|
|
|
| 1777 |
}
|
| 1778 |
|
|
|
|
| 1779 |
const $liveCount = document.getElementById('live-count');
|
| 1780 |
const BUCKETS = [
|
| 1781 |
{start:0,end:6,min:700,max:2000},
|
|
@@ -1814,6 +1883,7 @@ document.addEventListener('visibilitychange', function(){
|
|
| 1814 |
initLive();
|
| 1815 |
liveTimer = setTimeout(tickLive, delay());
|
| 1816 |
|
|
|
|
| 1817 |
const EMOJIS = [{key:'heart',sym:'❤️'},{key:'fire',sym:'🔥'},{key:'dancer',sym:'💃'},{key:'spark',sym:'✨'}];
|
| 1818 |
const STORAGE_PREFIX = 'pro-reactions:';
|
| 1819 |
function utcDateKey(){ const d=new Date(); return d.getUTCFullYear() + '-' + String(d.getUTCMonth()+1).padStart(2,'0') + '-' + String(d.getUTCDate()).padStart(2,'0'); }
|
|
@@ -1856,10 +1926,13 @@ function renderReactions(){
|
|
| 1856 |
'Today ❤️' + reactionCounts.heart + ' 🔥' + reactionCounts.fire + ' 💃' + reactionCounts.dancer + ' ✨' + reactionCounts.spark;
|
| 1857 |
}
|
| 1858 |
|
|
|
|
| 1859 |
let activeParticles = 0;
|
| 1860 |
-
|
|
|
|
|
|
|
| 1861 |
const config = performanceModes[currentPerformanceMode];
|
| 1862 |
-
if(activeParticles >
|
| 1863 |
|
| 1864 |
const pane = document.getElementById('panel').getBoundingClientRect();
|
| 1865 |
const burst = document.createElement('div');
|
|
@@ -1871,12 +1944,15 @@ function spawnEnhancedParticles(type, x, y){
|
|
| 1871 |
burst.style.filter = 'drop-shadow(0 0 15px ' + currentDominantColor + ')';
|
| 1872 |
document.getElementById('panel').appendChild(burst);
|
| 1873 |
activeParticles++;
|
|
|
|
| 1874 |
setTimeout(function(){
|
| 1875 |
-
burst.
|
| 1876 |
-
|
| 1877 |
-
|
|
|
|
|
|
|
| 1878 |
|
| 1879 |
-
const particleCount = Math.floor((
|
| 1880 |
for(let i=0;i<particleCount;i++){
|
| 1881 |
const p = document.createElement('div');
|
| 1882 |
p.className='particle';
|
|
@@ -1888,10 +1964,13 @@ function spawnEnhancedParticles(type, x, y){
|
|
| 1888 |
p.style.filter = 'drop-shadow(0 0 10px ' + currentDominantColor + ')';
|
| 1889 |
document.getElementById('panel').appendChild(p);
|
| 1890 |
activeParticles++;
|
|
|
|
| 1891 |
setTimeout(function(){
|
| 1892 |
-
p.
|
| 1893 |
-
|
| 1894 |
-
|
|
|
|
|
|
|
| 1895 |
}
|
| 1896 |
}
|
| 1897 |
|
|
@@ -1907,16 +1986,11 @@ function setupEmojiClicks(){
|
|
| 1907 |
reactionCounts[type] = (reactionCounts[type]||0) + 1;
|
| 1908 |
saveLocalInc(type);
|
| 1909 |
renderReactions();
|
| 1910 |
-
|
| 1911 |
-
|
| 1912 |
-
|
| 1913 |
-
|
| 1914 |
-
|
| 1915 |
-
btn.animate([
|
| 1916 |
-
{transform:'scale(1) rotateZ(0deg)', filter:'brightness(1)'},
|
| 1917 |
-
{transform:'scale(1.2) rotateZ(15deg)', filter:'brightness(1.4)'},
|
| 1918 |
-
{transform:'scale(1) rotateZ(0deg)', filter:'brightness(1)'}
|
| 1919 |
-
],{duration: animationDuration, easing: 'cubic-bezier(0.34, 1.56, 0.64, 1)'});
|
| 1920 |
});
|
| 1921 |
}
|
| 1922 |
loadReactions();
|
|
@@ -1935,7 +2009,7 @@ function isMobilePortrait(){
|
|
| 1935 |
|
| 1936 |
function applyMobileLayout(){
|
| 1937 |
if(isMobilePortrait()) {
|
| 1938 |
-
setTimeout(
|
| 1939 |
} else {
|
| 1940 |
$header.classList.add('visible');
|
| 1941 |
$info.classList.add('visible');
|
|
@@ -1948,18 +2022,18 @@ function applyMobileLayout(){
|
|
| 1948 |
}
|
| 1949 |
}
|
| 1950 |
|
| 1951 |
-
// Initialize everything
|
| 1952 |
document.addEventListener('DOMContentLoaded', function() {
|
| 1953 |
-
//
|
| 1954 |
initPerformanceModeSystem();
|
| 1955 |
-
|
| 1956 |
initSimpleAudioEnable();
|
| 1957 |
initWelcomeText();
|
| 1958 |
-
|
| 1959 |
if (!isMobileDevice()) {
|
| 1960 |
-
|
| 1961 |
}
|
| 1962 |
-
|
| 1963 |
applyMobileLayout();
|
| 1964 |
window.addEventListener('resize', applyMobileLayout);
|
| 1965 |
|
|
@@ -1975,25 +2049,44 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
| 1975 |
|
| 1976 |
schedulePlay();
|
| 1977 |
|
| 1978 |
-
// Performance-aware intervals
|
| 1979 |
-
setInterval(function() {
|
| 1980 |
const config = performanceModes[currentPerformanceMode];
|
| 1981 |
-
if(Math.random() > (1 - config.effectIntensity * 0.
|
| 1982 |
-
|
|
|
|
|
|
|
| 1983 |
|
| 1984 |
-
setInterval(function() {
|
| 1985 |
const config = performanceModes[currentPerformanceMode];
|
| 1986 |
-
if(Math.random() > (1 - config.effectIntensity * 0.
|
| 1987 |
-
|
|
|
|
|
|
|
| 1988 |
|
| 1989 |
-
|
|
|
|
| 1990 |
frameCount++;
|
| 1991 |
-
|
| 1992 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1993 |
}
|
| 1994 |
-
requestAnimationFrame(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1995 |
});
|
| 1996 |
|
| 1997 |
</script>
|
| 1998 |
-
|
| 1999 |
</html>
|
|
|
|
| 14 |
--shadow-strong:0 20px 60px rgba(0,0,0,0.4);
|
| 15 |
}
|
| 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;
|
| 23 |
background:#0a0a1e;overflow-x:hidden;min-height:100vh;position:relative;
|
| 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%),
|
| 31 |
radial-gradient(ellipse 600px 300px at 80% 70%, rgba(67,97,238,0.12) 0%, transparent 50%),
|
| 32 |
radial-gradient(ellipse 400px 200px at 50% 50%, rgba(255,107,107,0.08) 0%, transparent 50%),
|
| 33 |
linear-gradient(135deg, var(--bg1) 0%, var(--bg2) 50%, var(--bg3) 100%);
|
| 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,
|
|
|
|
| 43 |
linear-gradient(-45deg,
|
| 44 |
rgba(255,107,107,0.05) 0%,transparent 30%,rgba(157,78,221,0.07) 70%,transparent 100%);
|
| 45 |
background-size:400% 400%, 300% 300%;
|
| 46 |
+
animation:aurora 20s ease-in-out infinite, auroraPulse 8s ease-in-out infinite;
|
| 47 |
+
transform:translate3d(0,0,0);will-change:background-position}
|
| 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)}
|
| 68 |
.cursor-trail{position:fixed;width:4px;height:4px;border-radius:50%;
|
| 69 |
background:rgba(255,107,107,0.8);pointer-events:none;z-index:999998;
|
| 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;
|
| 78 |
+
background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);
|
| 79 |
border-radius:25px;border:1px solid rgba(255,255,255,0.2);
|
| 80 |
box-shadow:var(--shadow-medium);cursor:pointer;
|
| 81 |
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);font-size:12px;font-weight:500;
|
|
|
|
| 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);
|
| 92 |
+
box-shadow:var(--shadow-strong);min-width:320px;max-width:90vw;
|
| 93 |
opacity:0;transform:translateY(-20px) scale(0.95);
|
| 94 |
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);pointer-events:none}
|
| 95 |
.performance-panel.visible{opacity:1;transform:translateY(0) scale(1);pointer-events:all}
|
|
|
|
| 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);
|
| 104 |
background:rgba(255,255,255,0.05);
|
| 105 |
+
transition:all 0.3s cubic-bezier(0.4,0,0.2,1);text-align:center;
|
| 106 |
+
min-height:80px;display:flex;flex-direction:column;justify-content:center}
|
| 107 |
.mode-card:hover{transform:translateY(-2px);border-color:rgba(255,107,107,0.4)}
|
| 108 |
.mode-card.active{border-color:var(--neon-primary);background:rgba(255,107,107,0.15);
|
| 109 |
box-shadow:0 0 20px rgba(255,107,107,0.3)}
|
|
|
|
| 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);
|
| 189 |
text-shadow:0 0 10px rgba(255,215,0,0.4)}
|
| 190 |
+
@keyframes floatNote{
|
| 191 |
+
0%{transform:translate3d(0,110vh,0) rotate(0deg);opacity:0}
|
| 192 |
10%{opacity:0.6}90%{opacity:0.6}
|
| 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;
|
| 200 |
background:linear-gradient(135deg,#ff6b6b 0%,#ffd93d 20%,#4ecdc4 40%,#9d4edd 60%,#ff9a9e 80%,#ff6b6b 100%);
|
| 201 |
background-size:400% 400%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 202 |
+
animation:rainbow 8s ease-in-out infinite;
|
| 203 |
filter:drop-shadow(0 0 20px rgba(255,107,107,0.5));
|
| 204 |
+
transform:translate3d(0,0,0);will-change:background-position;letter-spacing:-0.02em}
|
| 205 |
+
h1:hover{transform:translate3d(0,0,0) scale(1.05) rotateX(5deg);
|
| 206 |
transition:transform 0.6s cubic-bezier(0.34,1.56,0.64,1)}
|
| 207 |
+
@keyframes rainbow{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
|
| 208 |
|
| 209 |
.sub{font-size:16px;color:rgba(255,255,255,.9);margin-top:12px;font-weight:300;
|
| 210 |
text-shadow:0 0 15px rgba(255,255,255,0.3);letter-spacing:0.5px}
|
| 211 |
.divider{height:6px;width:140px;margin:20px auto;
|
| 212 |
background:linear-gradient(90deg,#ff6b6b,#ffd93d,#4ecdc4,#9d4edd,#ff9a9e);
|
| 213 |
background-size:400% 100%;border-radius:999px;opacity:.95;
|
| 214 |
+
animation:flow 4s ease-in-out infinite;
|
| 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;
|
| 222 |
+
transform:translate3d(0,0,0);transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 223 |
backdrop-filter:blur(20px);border:1px solid var(--glass-border)}
|
| 224 |
+
.panel:hover{transform:translate3d(0,0,0) scale(1.02) rotateX(2deg) rotateY(1deg);
|
| 225 |
box-shadow:0 25px 80px rgba(0,0,0,0.5), 0 0 50px rgba(255,107,107,0.2)}
|
| 226 |
|
| 227 |
.panel::before{content:'';position:absolute;inset:-6px;border-radius:38px;
|
| 228 |
background:conic-gradient(from 0deg,var(--neon-primary) 0%,var(--magic-purple) 25%,var(--cosmic-blue) 50%,var(--aurora-green) 75%,var(--neon-primary) 100%);
|
| 229 |
+
z-index:-1;animation:holoRotate 12s linear infinite;transform:translate3d(0,0,0);
|
| 230 |
filter:blur(2px);opacity:0.8}
|
| 231 |
.panel::after{content:'';position:absolute;inset:-12px;border-radius:44px;
|
| 232 |
background:radial-gradient(ellipse,rgba(255,107,107,0.2) 0%,rgba(78,205,196,0.1) 50%,transparent 100%);
|
| 233 |
+
z-index:-2;filter:blur(15px);animation:holoGlow 10s ease-in-out infinite;transform:translate3d(0,0,0)}
|
| 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;
|
| 241 |
+
filter:blur(1.5px);transform:translate3d(0,0,0)}
|
| 242 |
.corner-accent:nth-child(1){top:-25px;left:-25px;animation-delay:0s;
|
| 243 |
background:radial-gradient(circle,rgba(255,107,107,0.8) 0%,rgba(255,107,107,0.2) 70%,transparent 100%)}
|
| 244 |
.corner-accent:nth-child(2){top:-25px;right:-25px;animation-delay:1s;
|
|
|
|
| 247 |
background:radial-gradient(circle,rgba(157,78,221,0.8) 0%,rgba(157,78,221,0.2) 70%,transparent 100%)}
|
| 248 |
.corner-accent:nth-child(4){bottom:-25px;right:-25px;animation-delay:3s;
|
| 249 |
background:radial-gradient(circle,rgba(255,211,102,0.8) 0%,rgba(255,211,102,0.2) 70%,transparent 100%)}
|
| 250 |
+
@keyframes cornerPulse{
|
| 251 |
0%,100%{transform:scale(0.8) rotate(0deg);opacity:0.5}
|
| 252 |
50%{transform:scale(1.4) rotate(180deg);opacity:0.9}
|
| 253 |
}
|
| 254 |
|
| 255 |
video{width:100%;height:100%;object-fit:cover;background:#000;border-radius:26px;
|
| 256 |
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 257 |
+
filter:contrast(1.08) saturate(1.15) brightness(1.05);transform:translate3d(0,0,0)}
|
| 258 |
|
| 259 |
.chip{position:absolute;bottom:15px;right:15px;padding:10px 16px;border-radius:16px;
|
| 260 |
+
background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);
|
| 261 |
font:13px/1.4 'Inter',monospace;color:#fff;z-index:6;
|
| 262 |
border:1px solid rgba(255,107,107,0.4);
|
| 263 |
+
box-shadow:var(--shadow-medium);transform:translate3d(0,0,0);font-weight:500}
|
| 264 |
|
| 265 |
+
/* Unmute Overlay */
|
| 266 |
.unmute-overlay{position:absolute;top:0;left:0;right:0;bottom:0;
|
| 267 |
background:rgba(0,0,0,0.8);display:flex;align-items:center;justify-content:center;
|
| 268 |
z-index:100;backdrop-filter:blur(25px);border-radius:26px}
|
|
|
|
| 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);
|
| 284 |
border-radius:60px;border:1px solid rgba(255,255,255,0.12);
|
| 285 |
box-shadow:var(--shadow-strong);z-index:10;
|
| 286 |
opacity:0;transform:translateX(-50%) translateY(30px);
|
|
|
|
| 288 |
.panel:hover .control-panel,.control-panel:hover,.control-panel.active{
|
| 289 |
opacity:1;transform:translateX(-50%) translateY(0)}
|
| 290 |
|
| 291 |
+
/* Volume Button */
|
| 292 |
.mute-btn{width:52px;height:52px;border-radius:50%;border:2px solid rgba(255,255,255,0.25);
|
| 293 |
background:linear-gradient(135deg,rgba(255,107,107,0.25),rgba(78,205,196,0.25));
|
| 294 |
+
backdrop-filter:blur(10px);display:flex;align-items:center;justify-content:center;
|
| 295 |
cursor:pointer;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);position:relative;overflow:hidden}
|
| 296 |
.mute-btn::before{content:'';position:absolute;inset:0;border-radius:50%;
|
| 297 |
background:linear-gradient(45deg,var(--neon-primary),var(--neon-secondary));
|
|
|
|
| 305 |
filter:drop-shadow(0 0 12px rgba(255,255,255,0.6))}
|
| 306 |
.mute-btn.muted .mute-icon{color:#ff6b6b;filter:drop-shadow(0 0 15px rgba(255,107,107,0.9))}
|
| 307 |
|
| 308 |
+
/* Volume Slider */
|
| 309 |
.volume-control{display:flex;align-items:center;gap:12px}
|
| 310 |
.volume-slider{width:100px;height:6px;background:rgba(255,255,255,0.25);
|
| 311 |
border-radius:3px;position:relative;cursor:pointer;overflow:hidden}
|
|
|
|
| 319 |
transition:all 0.3s cubic-bezier(0.4,0,0.2,1)}
|
| 320 |
.volume-slider:hover .volume-fill::after{transform:scale(1.2)}
|
| 321 |
|
| 322 |
+
/* Control Buttons */
|
| 323 |
.control-btn{width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,0.2);
|
| 324 |
+
background:rgba(255,255,255,0.08);backdrop-filter:blur(10px);
|
| 325 |
display:flex;align-items:center;justify-content:center;cursor:pointer;
|
| 326 |
font-size:18px;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);
|
| 327 |
color:rgba(255,255,255,0.85)}
|
|
|
|
| 332 |
.control-btn.active{background:rgba(255,107,107,0.25);border-color:rgba(255,107,107,0.7);
|
| 333 |
color:#ff6b6b;box-shadow:0 0 25px rgba(255,107,107,0.5)}
|
| 334 |
|
| 335 |
+
/* Progress Bar */
|
| 336 |
.progress-bar{position:absolute;bottom:0;left:0;right:0;height:4px;
|
| 337 |
background:rgba(255,255,255,0.15);z-index:8}
|
| 338 |
.progress-fill{height:100%;
|
|
|
|
| 340 |
width:0%;transition:width 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 341 |
box-shadow:0 0 12px rgba(255,107,107,0.6)}
|
| 342 |
|
| 343 |
+
/* Quality Indicator */
|
| 344 |
.quality-indicator{position:absolute;top:20px;left:20px;
|
| 345 |
padding:8px 16px;border-radius:25px;font-size:12px;font-weight:600;
|
| 346 |
+
backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,0.15);z-index:7;
|
| 347 |
font-family:'Inter',sans-serif}
|
| 348 |
.quality-hd{background:rgba(76,222,128,0.25);color:#4ade80;border-color:rgba(76,222,128,0.4);
|
| 349 |
box-shadow:0 0 20px rgba(76,222,128,0.3)}
|
|
|
|
| 352 |
.quality-low{background:rgba(239,68,68,0.25);color:#ef4444;border-color:rgba(239,68,68,0.4);
|
| 353 |
box-shadow:0 0 20px rgba(239,68,68,0.3)}
|
| 354 |
|
| 355 |
+
/* Keyboard Shortcuts */
|
| 356 |
.shortcuts-overlay{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);
|
| 357 |
+
background:rgba(0,0,0,0.95);backdrop-filter:blur(15px);
|
| 358 |
border-radius:28px;padding:40px;border:1px solid rgba(255,255,255,0.15);
|
| 359 |
z-index:11000;opacity:0;pointer-events:none;
|
| 360 |
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
|
|
|
| 370 |
font:13px/1 'Inter',monospace;color:var(--neon-primary);font-weight:600;
|
| 371 |
box-shadow:0 2px 8px rgba(0,0,0,0.2)}
|
| 372 |
|
| 373 |
+
/* Info Section */
|
| 374 |
.info{text-align:center;margin-top:25px;padding:0 15px;
|
| 375 |
+
transition:all 0.6s cubic-bezier(0.4,0,0.2,1);position:relative;z-index:2;transform:translate3d(0,0,0)}
|
| 376 |
.info h2{font-size:clamp(20px,5vw,32px);margin:0;font-family:'Playfair Display',serif;
|
| 377 |
background:linear-gradient(135deg,#fff1a8 0%,#ffd166 50%,#ff9a9e 100%);
|
| 378 |
background-size:300% 300%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 379 |
+
font-weight:700;animation:titleShimmer 6s ease-in-out infinite;
|
| 380 |
+
text-shadow:0 0 25px rgba(255,209,102,0.4);transform:translate3d(0,0,0)}
|
| 381 |
+
@keyframes titleShimmer{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
|
| 382 |
.info p{margin:12px 0 0;color:rgba(255,255,255,.9);font-size:15px;font-weight:300;
|
| 383 |
text-shadow:0 0 8px rgba(255,255,255,0.2)}
|
| 384 |
|
| 385 |
+
/* Schedule Section */
|
| 386 |
.schedule{max-width:800px;margin:30px auto;
|
| 387 |
+
background:var(--glass-bg);backdrop-filter:blur(15px);
|
| 388 |
border-radius:28px;padding:30px;transition:all 0.6s cubic-bezier(0.4,0,0.2,1);
|
| 389 |
position:relative;z-index:2;border:1px solid var(--glass-border);
|
| 390 |
+
box-shadow:var(--shadow-medium);transform:translate3d(0,0,0)}
|
| 391 |
.schedule:hover{transform:translateY(-5px);box-shadow:var(--shadow-strong)}
|
| 392 |
|
| 393 |
.schedule h3{margin:0 0 20px;font-size:22px;color:var(--gold);text-align:center;
|
|
|
|
| 395 |
|
| 396 |
.row{display:flex;gap:20px;align-items:flex-start;padding:16px 20px;border-radius:16px;
|
| 397 |
font-size:16px;transition:all 0.4s cubic-bezier(0.4,0,0.2,1);position:relative;overflow:hidden;
|
| 398 |
+
cursor:pointer;transform:translate3d(0,0,0);margin:8px 0}
|
| 399 |
.row::before{content:'';position:absolute;left:0;top:0;bottom:0;width:0;
|
| 400 |
background:linear-gradient(90deg,rgba(255,107,107,0.15),rgba(78,205,196,0.15));
|
| 401 |
+
transition:all 0.4s cubic-bezier(0.4,0,0.2,1);transform:translate3d(0,0,0)}
|
| 402 |
.row:hover::before{width:100%}
|
| 403 |
.row:hover{transform:translateX(8px) scale(1.02);
|
| 404 |
background:rgba(255,255,255,0.05);box-shadow:var(--shadow-soft)}
|
|
|
|
| 411 |
border-left:5px solid #ff6b6b;box-shadow:var(--shadow-medium);
|
| 412 |
transform:translateX(10px) scale(1.03)}
|
| 413 |
.row.active::after{content:'✨';position:absolute;right:20px;top:50%;transform:translateY(-50%);
|
| 414 |
+
font-size:18px;animation:sparkle 2s ease-in-out infinite}
|
| 415 |
+
@keyframes sparkle{0%,100%{opacity:0.7;transform:translateY(-50%) scale(1)}50%{opacity:1;transform:translateY(-50%) scale(1.2)}}
|
| 416 |
|
| 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);
|
| 424 |
color:#ff6b6b;font-weight:600;font-size:15px;
|
| 425 |
box-shadow:var(--shadow-medium);
|
| 426 |
+
animation:livePulse 3s ease-in-out infinite;transform:translate3d(0,0,0)}
|
| 427 |
+
@keyframes livePulse{0%,100%{box-shadow:var(--shadow-medium)}50%{box-shadow:0 8px 40px rgba(255,107,107,0.6)}}
|
| 428 |
|
| 429 |
.dot{width:10px;height:10px;border-radius:50%;background:#ff3b3b;
|
| 430 |
box-shadow:0 0 15px rgba(255,59,59,.9);
|
| 431 |
+
animation:dotPulse 2s ease-in-out infinite;transform:translate3d(0,0,0)}
|
| 432 |
+
@keyframes dotPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.3)}}
|
| 433 |
|
| 434 |
+
.reactions-badge{position:fixed;bottom:20px;left:20px;z-index:9999;padding:12px 20px;border-radius:30px;
|
| 435 |
+
background:rgba(0,0,0,0.85);backdrop-filter:blur(10px);border:1px solid rgba(78,205,196,.5);
|
| 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;
|
| 443 |
font-size:26px;cursor:pointer;transition:all 0.3s cubic-bezier(0.4,0,0.2,1);
|
| 444 |
+
box-shadow:var(--shadow-soft);transform:translate3d(0,0,0)}
|
| 445 |
.emoji-btn:hover{transform:scale(1.15) rotateZ(10deg);
|
| 446 |
box-shadow:var(--shadow-medium);border-color:rgba(255,107,107,0.6)}
|
| 447 |
.emoji-btn:active{transform:scale(1.05) rotateZ(5deg)}
|
| 448 |
|
| 449 |
.emoji-count{position:absolute;right:76px;min-width:70px;height:36px;padding:0 16px;border-radius:18px;
|
| 450 |
display:flex;align-items:center;justify-content:center;
|
| 451 |
+
background:rgba(0,0,0,.8);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.25);
|
| 452 |
font:13px/1.4 'Inter',monospace;color:#fff;font-weight:500;
|
| 453 |
+
box-shadow:var(--shadow-soft);transform:translate3d(0,0,0)}
|
| 454 |
|
| 455 |
+
/* Particles */
|
| 456 |
.particle{position:absolute;pointer-events:none;z-index:8;font-size:26px;
|
| 457 |
+
animation:floatUp 2s cubic-bezier(0.4,0,0.2,1) forwards;transform:translate3d(0,0,0)}
|
| 458 |
+
@keyframes floatUp{
|
| 459 |
+
0%{transform:translate3d(0,0,0) scale(0.8) rotate(0deg);opacity:0}
|
| 460 |
20%{opacity:1}
|
| 461 |
+
100%{transform:translate3d(0,-200px,0) scale(1.5) rotate(360deg);opacity:0}
|
| 462 |
}
|
| 463 |
|
| 464 |
.burst{position:absolute;pointer-events:none;z-index:8;
|
| 465 |
+
animation:burst 1s cubic-bezier(0.4,0,0.2,1) forwards;transform:translate3d(0,0,0)}
|
| 466 |
+
@keyframes burst{
|
| 467 |
0%{transform:scale(0.4) rotate(0deg);opacity:0}
|
| 468 |
60%{transform:scale(1.2) rotate(180deg);opacity:1}
|
| 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));
|
| 476 |
+
animation:rise linear infinite;
|
| 477 |
+
box-shadow:inset 0 0 20px rgba(255,255,255,0.15);transform:translate3d(0,0,0)}
|
| 478 |
+
@keyframes rise{
|
| 479 |
+
0%{transform:translate3d(0,0,0) scale(1) rotate(0deg);opacity:.5}
|
| 480 |
50%{opacity:.8}
|
| 481 |
+
100%{transform:translate3d(0,-120vh,0) scale(1.3) rotate(360deg);opacity:0}
|
| 482 |
}
|
| 483 |
|
| 484 |
+
/* Welcome Text */
|
| 485 |
.welcome-neon{position:fixed;top:50%;left:50%;transform:translate(-50%, -50%);
|
| 486 |
z-index:10000;font-size:clamp(36px,9vw,72px);font-weight:900;font-family:'Playfair Display',serif;
|
| 487 |
background:linear-gradient(45deg,#ff6b6b,#ffd93d,#6bcf7f,#4d96ff,#9c88ff,#ff6b6b);
|
| 488 |
background-size:500% 500%;-webkit-background-clip:text;background-clip:text;color:transparent;
|
| 489 |
+
animation:neonFlow 4s ease-in-out, fadeOut 5s ease-in-out forwards;
|
| 490 |
text-shadow:0 0 40px rgba(255,107,107,0.8);pointer-events:none;opacity:1;
|
| 491 |
filter:drop-shadow(0 0 30px rgba(255,107,107,0.5));transform-origin:center}
|
| 492 |
+
@keyframes neonFlow{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
|
| 493 |
+
@keyframes fadeOut{
|
| 494 |
0%{opacity:1;transform:translate(-50%, -50%) scale(1)}
|
| 495 |
80%{opacity:1;transform:translate(-50%, -50%) scale(1.08)}
|
| 496 |
100%{opacity:0;transform:translate(-50%, -50%) scale(0.85)}
|
| 497 |
}
|
| 498 |
|
| 499 |
+
/* Audio Visualizer */
|
| 500 |
.audio-visualizer{position:absolute;bottom:30px;left:30px;display:flex;gap:4px;z-index:6}
|
| 501 |
.audio-bar{width:5px;border-radius:3px;
|
| 502 |
background:linear-gradient(180deg,#ff6b6b 0%,#4ecdc4 50%,#9d4edd 100%);
|
| 503 |
+
animation:audioVisualize 1.2s ease-in-out infinite;transform:translate3d(0,0,0);
|
| 504 |
box-shadow:0 0 10px rgba(255,107,107,0.4)}
|
| 505 |
.audio-bar:nth-child(1){height:25px;animation-delay:0s}
|
| 506 |
.audio-bar:nth-child(2){height:35px;animation-delay:0.1s}
|
|
|
|
| 508 |
.audio-bar:nth-child(4){height:55px;animation-delay:0.3s}
|
| 509 |
.audio-bar:nth-child(5){height:45px;animation-delay:0.4s}
|
| 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}
|
|
|
|
| 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;
|
|
|
|
| 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);
|
|
|
|
| 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;
|
|
|
|
| 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);
|
|
|
|
| 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}
|
|
|
|
| 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 */
|
|
|
|
| 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}
|
|
|
|
| 637 |
<div class="cursor" id="cursor"></div>
|
| 638 |
<div class="music-notes" id="music-notes"></div>
|
| 639 |
|
| 640 |
+
<!-- Desktop Performance Toggle -->
|
| 641 |
<div class="performance-toggle" id="performance-toggle">
|
| 642 |
<span class="mode-icon">⚙️</span>
|
| 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">
|
| 650 |
<div class="mode-card" data-mode="ultra">
|
| 651 |
<span class="mode-emoji">🌟</span>
|
|
|
|
| 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>
|
|
|
|
| 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>
|
|
|
|
| 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>
|
|
|
|
| 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>
|
|
|
|
| 782 |
|
| 783 |
<main>
|
| 784 |
<section class="panel" id="panel">
|
| 785 |
+
<canvas id="color-canvas" style="display:none"></canvas>
|
| 786 |
+
|
| 787 |
+
<div class="unmute-overlay" id="unmute-overlay">
|
| 788 |
+
<button class="unmute-btn" id="unmute-btn">
|
| 789 |
+
<span>🔊</span>
|
| 790 |
+
<span>Enable Audio</span>
|
| 791 |
+
</button>
|
| 792 |
+
</div>
|
| 793 |
+
|
| 794 |
+
<video id="player" muted loop playsinline preload="metadata">
|
| 795 |
+
<source src="" />
|
| 796 |
+
Your browser does not support the video tag.
|
| 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>
|
| 804 |
<div class="corner-accent"></div>
|
|
|
|
| 806 |
<div class="corner-accent"></div>
|
| 807 |
</div>
|
| 808 |
|
| 809 |
+
<div class="audio-visualizer">
|
| 810 |
+
<div class="audio-bar"></div>
|
| 811 |
+
<div class="audio-bar"></div>
|
| 812 |
+
<div class="audio-bar"></div>
|
| 813 |
+
<div class="audio-bar"></div>
|
| 814 |
+
<div class="audio-bar"></div>
|
| 815 |
+
<div class="audio-bar"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 816 |
</div>
|
| 817 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 818 |
<div class="control-panel" id="control-panel">
|
| 819 |
+
<button class="mute-btn" id="mute-btn">
|
| 820 |
+
<span class="mute-icon" id="mute-icon">🔊</span>
|
| 821 |
+
</button>
|
| 822 |
+
|
| 823 |
<div class="volume-control">
|
| 824 |
+
<div class="volume-slider" id="volume-slider">
|
| 825 |
<div class="volume-fill" id="volume-fill"></div>
|
| 826 |
</div>
|
| 827 |
</div>
|
| 828 |
+
|
| 829 |
+
<button class="control-btn" id="theater-btn" title="Theater Mode">
|
| 830 |
+
<span>🎭</span>
|
| 831 |
+
</button>
|
| 832 |
+
|
| 833 |
+
<button class="control-btn" id="fullscreen-btn" title="Fullscreen">
|
| 834 |
+
<span>⛶</span>
|
| 835 |
+
</button>
|
| 836 |
+
|
| 837 |
+
<button class="control-btn" id="pip-btn" title="Picture-in-Picture">
|
| 838 |
+
<span>⧉</span>
|
| 839 |
+
</button>
|
| 840 |
+
|
| 841 |
+
<button class="control-btn" id="shortcuts-btn" title="Keyboard Shortcuts">
|
| 842 |
+
<span>⌨</span>
|
| 843 |
+
</button>
|
| 844 |
</div>
|
| 845 |
|
| 846 |
+
<div class="progress-bar">
|
| 847 |
+
<div class="progress-fill" id="progress-fill"></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 848 |
</div>
|
| 849 |
|
|
|
|
| 850 |
<div class="emoji-panel" id="emoji-panel">
|
| 851 |
+
<div class="emoji-btn" data-type="heart" title="Love it!">
|
| 852 |
+
<span>❤️</span>
|
| 853 |
<div class="emoji-count" id="count-heart">0</div>
|
| 854 |
</div>
|
| 855 |
+
|
| 856 |
+
<div class="emoji-btn" data-type="fire" title="On Fire!">
|
| 857 |
+
<span>🔥</span>
|
| 858 |
<div class="emoji-count" id="count-fire">0</div>
|
| 859 |
</div>
|
| 860 |
+
|
| 861 |
+
<div class="emoji-btn" data-type="dancer" title="Amazing Dance!">
|
| 862 |
+
<span>💃</span>
|
| 863 |
<div class="emoji-count" id="count-dancer">0</div>
|
| 864 |
</div>
|
| 865 |
+
|
| 866 |
+
<div class="emoji-btn" data-type="spark" title="Magical!">
|
| 867 |
+
<span>✨</span>
|
| 868 |
<div class="emoji-count" id="count-spark">0</div>
|
| 869 |
</div>
|
| 870 |
</div>
|
| 871 |
</section>
|
| 872 |
+
</main>
|
| 873 |
|
| 874 |
+
<section class="info" id="main-info">
|
| 875 |
+
<h2 id="vtitle">✨ Belly Dance Stream ✨</h2>
|
| 876 |
+
<p id="vmeta">Loading amazing content...</p>
|
| 877 |
+
</section>
|
| 878 |
+
|
| 879 |
+
<section class="schedule" id="main-schedule">
|
| 880 |
+
<h3 id="schedule-title">✨ Global Schedule (UTC) ✨</h3>
|
| 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 |
|
| 901 |
+
<footer>
|
| 902 |
+
<p>✨ Ultimate Belly Dance Experience - Optimized for All Devices ✨</p>
|
| 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
|
|
|
|
| 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');
|
|
|
|
| 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 |
}
|
|
|
|
| 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');
|
|
|
|
| 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 |
}
|
|
|
|
| 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 |
|
|
|
|
| 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';
|
|
|
|
| 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() {
|
|
|
|
| 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');
|
|
|
|
| 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');
|
|
|
|
| 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 },
|
|
|
|
| 1209 |
{ title:"✨ Belly dance ✨ - secret of the goddess", url:"https://ik.imagekit.io/b3mprpaei/%E2%9C%A8%20Belly%20dance%20%E2%9C%A8%20-%20secret%20of%20the%20goddess.mp4", duration:166, start:19.1, end:21 }
|
| 1210 |
];
|
| 1211 |
|
| 1212 |
+
const USE_UTC = true;
|
| 1213 |
+
|
| 1214 |
/* Utilities */
|
| 1215 |
function nowHour(){
|
| 1216 |
const n=new Date();
|
|
|
|
| 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');
|
|
|
|
| 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 |
|
|
|
|
| 1289 |
isTheaterMode = !isTheaterMode;
|
| 1290 |
document.body.classList.toggle('theater-mode', isTheaterMode);
|
| 1291 |
theaterBtn.classList.toggle('active', isTheaterMode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1292 |
});
|
| 1293 |
}
|
| 1294 |
|
|
|
|
| 1312 |
|
| 1313 |
document.addEventListener('fullscreenchange', function() {
|
| 1314 |
isFullscreen = !!document.fullscreenElement;
|
| 1315 |
+
document.getElementById('fullscreen-btn').classList.toggle('active', isFullscreen);
|
| 1316 |
});
|
| 1317 |
}
|
| 1318 |
|
|
|
|
| 1360 |
document.addEventListener('keydown', function(e) {
|
| 1361 |
switch(e.key.toLowerCase()) {
|
| 1362 |
case 'm':
|
| 1363 |
+
if (!e.shiftKey) document.getElementById('mute-btn').click();
|
| 1364 |
break;
|
| 1365 |
case 'f':
|
| 1366 |
document.getElementById('fullscreen-btn').click();
|
|
|
|
| 1371 |
case 'p':
|
| 1372 |
document.getElementById('pip-btn').click();
|
| 1373 |
break;
|
|
|
|
|
|
|
|
|
|
| 1374 |
case 'arrowup':
|
| 1375 |
e.preventDefault();
|
| 1376 |
if (audioEnabled) {
|
|
|
|
| 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 |
|
|
|
|
| 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;
|
|
|
|
| 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 |
|
|
|
|
| 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');
|
|
|
|
| 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 |
|
|
|
|
| 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';
|
|
|
|
| 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');
|
|
|
|
| 1665 |
isScheduleVisible = true;
|
| 1666 |
|
| 1667 |
if (autoHideTimer) clearTimeout(autoHideTimer);
|
| 1668 |
+
autoHideTimer = setTimeout(hideSchedule, 6000);
|
| 1669 |
}
|
| 1670 |
|
| 1671 |
function hideSchedule() {
|
|
|
|
| 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();
|
|
|
|
| 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';
|
|
|
|
| 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},
|
|
|
|
| 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'); }
|
|
|
|
| 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');
|
|
|
|
| 1944 |
burst.style.filter = 'drop-shadow(0 0 15px ' + currentDominantColor + ')';
|
| 1945 |
document.getElementById('panel').appendChild(burst);
|
| 1946 |
activeParticles++;
|
| 1947 |
+
|
| 1948 |
setTimeout(function(){
|
| 1949 |
+
if (burst.parentNode) {
|
| 1950 |
+
burst.remove();
|
| 1951 |
+
activeParticles--;
|
| 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';
|
|
|
|
| 1964 |
p.style.filter = 'drop-shadow(0 0 10px ' + currentDominantColor + ')';
|
| 1965 |
document.getElementById('panel').appendChild(p);
|
| 1966 |
activeParticles++;
|
| 1967 |
+
|
| 1968 |
setTimeout(function(){
|
| 1969 |
+
if (p.parentNode) {
|
| 1970 |
+
p.remove();
|
| 1971 |
+
activeParticles--;
|
| 1972 |
+
}
|
| 1973 |
+
}, 2000);
|
| 1974 |
}
|
| 1975 |
}
|
| 1976 |
|
|
|
|
| 1986 |
reactionCounts[type] = (reactionCounts[type]||0) + 1;
|
| 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();
|
|
|
|
| 2009 |
|
| 2010 |
function applyMobileLayout(){
|
| 2011 |
if(isMobilePortrait()) {
|
| 2012 |
+
setTimeout(showSchedule, 800);
|
| 2013 |
} else {
|
| 2014 |
$header.classList.add('visible');
|
| 2015 |
$info.classList.add('visible');
|
|
|
|
| 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 |
|
|
|
|
| 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>
|
| 2091 |
+
</body>
|
| 2092 |
</html>
|