*,:before,:after{box-sizing:border-box;margin:0;padding:0}:root{--accent:#77f;--accent2:#fc0;--bg:#05050e;--surface:#0d0d1c;--surface2:#13132a;--border:#1e1e40;--text:#e0e0f8;--muted:#6666a0;--radius:14px}html,body,#root{background:var(--bg);width:100%;height:100%;color:var(--text);overflow:hidden}body{font-family:Inter,Segoe UI,system-ui,sans-serif}.app{flex-direction:column;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:relative;overflow:hidden}.error-banner{z-index:200;color:#fff;background:#c13;justify-content:space-between;align-items:center;padding:10px 20px;font-size:14px;font-weight:600;display:flex;position:fixed;top:0;left:0;right:0}.error-banner button{color:#fff;cursor:pointer;background:0 0;border:none;padding:0 4px;font-size:18px}.screen{flex-direction:column;justify-content:center;align-items:center;gap:20px;width:100%;height:100%;padding:32px;display:flex;position:relative}.upload-screen{gap:24px}.upload-bg-grid{z-index:0;background-image:linear-gradient(#5050c80d 1px,#0000 1px),linear-gradient(90deg,#5050c80d 1px,#0000 1px);background-size:40px 40px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 80%);mask-image:radial-gradient(#000 30%,#0000 80%)}.upload-hero{text-align:center;z-index:1}.game-title{letter-spacing:.12em;color:#fff;text-shadow:0 0 40px #7878ff99;font-family:Orbitron,monospace;font-size:clamp(2.8rem,8vw,5rem);font-weight:900}.title-accent{background:linear-gradient(135deg,#88f,#f4c,#fc0);-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.game-subtitle{color:var(--muted);margin-top:6px;font-size:1rem;font-weight:300}.drop-zone{z-index:1;background:var(--surface);border:1.5px solid var(--border);cursor:pointer;border-radius:20px;flex-direction:column;align-items:center;gap:10px;width:min(460px,90vw);padding:40px 32px;transition:border-color .2s,background .2s,transform .15s,box-shadow .2s;display:flex;position:relative;overflow:hidden}.drop-zone:before{content:"";pointer-events:none;background:radial-gradient(at 50% 0,#6464ff14,#0000 70%);position:absolute;inset:0}.drop-zone:hover,.drop-zone.drag-over{border-color:var(--accent);background:var(--surface2);transform:translateY(-2px);box-shadow:0 8px 40px #5050c833}.drop-zone.drag-over{border-style:solid;border-color:#aaf}.drop-waveform{align-items:center;gap:3px;height:36px;margin-bottom:4px;display:flex}.drop-bar{background:var(--accent);opacity:.5;border-radius:2px;width:4px;animation:1.2s ease-in-out infinite alternate wavebar}.drop-bar:nth-child(odd){animation-duration:.9s}.drop-bar:nth-child(3n){animation-duration:1.4s}.drop-zone:hover .drop-bar{opacity:.9}@keyframes wavebar{0%{height:6px}to{height:28px}}.drop-text{color:var(--text);font-size:1.1rem;font-weight:700}.drop-subtext{color:var(--muted);font-size:.85rem}.drop-formats{color:var(--muted);opacity:.6;letter-spacing:.08em;margin-top:4px;font-size:.75rem}.demo-btn{border:1px solid var(--border);color:var(--muted);cursor:pointer;letter-spacing:.04em;background:0 0;border-radius:20px;margin-top:6px;padding:7px 20px;font-size:.78rem;font-weight:600;transition:color .15s,border-color .15s}.demo-btn:hover{color:var(--accent);border-color:var(--accent)}.yt-section{z-index:1;flex-direction:column;align-items:center;gap:10px;width:min(460px,90vw);display:flex}.yt-divider{width:100%;color:var(--muted);align-items:center;gap:12px;font-size:.78rem;display:flex}.yt-divider:before,.yt-divider:after{content:"";background:var(--border);flex:1;height:1px}.yt-row{gap:8px;width:100%;display:flex}.yt-input{background:var(--surface);border:1.5px solid var(--border);color:var(--text);border-radius:10px;outline:none;flex:1;padding:10px 14px;font-size:.88rem;transition:border-color .2s}.yt-input:focus{border-color:var(--accent)}.yt-input:disabled{opacity:.5}.yt-input::placeholder{color:var(--muted)}.yt-btn{color:#fff;cursor:pointer;background:red;border:none;border-radius:10px;justify-content:center;align-items:center;min-width:46px;padding:10px 18px;font-size:1rem;font-weight:700;transition:background .2s,opacity .2s;display:flex}.yt-btn:hover:not(:disabled){background:#c00}.yt-btn:disabled{opacity:.45;cursor:not-allowed}.yt-spinner{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.7s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.yt-status{color:var(--muted);font-size:.8rem}.yt-error{color:#f45;font-size:.8rem}.controls-row{z-index:1;flex-wrap:wrap;justify-content:center;align-items:center;gap:12px;display:flex}.key-hint{color:var(--muted);align-items:center;gap:4px;font-size:.85rem;display:flex}kbd{background:var(--surface2);border:1px solid var(--border);width:26px;height:26px;color:var(--accent);border-radius:6px;justify-content:center;align-items:center;font-family:monospace;font-size:14px;display:inline-flex}.keybind-toggle-btn{background:var(--surface);border:1px solid var(--border);color:var(--muted);cursor:pointer;border-radius:8px;padding:6px 14px;font-size:.8rem;transition:color .2s,border-color .2s}.keybind-toggle-btn:hover{color:var(--text);border-color:var(--accent)}.keybind-panel{z-index:1;background:var(--surface);border:1px solid var(--border);border-radius:14px;flex-direction:column;align-items:center;gap:12px;width:min(340px,90vw);padding:16px 20px;display:flex}.keybind-grid{flex-direction:column;gap:8px;width:100%;display:flex}.keybind-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.keybind-label{color:var(--muted);min-width:80px;font-size:.88rem}.keybind-btn{background:var(--surface2);border:1.5px solid var(--border);min-width:110px;color:var(--text);cursor:pointer;border-radius:8px;padding:6px 18px;font-family:Orbitron,monospace;font-size:.82rem;font-weight:700;transition:border-color .2s,color .2s}.keybind-btn:hover{border-color:var(--accent);color:var(--accent)}.keybind-btn.listening{border-color:var(--accent2);color:var(--accent2);animation:.8s ease-in-out infinite alternate pulse-border}@keyframes pulse-border{0%{border-color:var(--accent2)}to{border-color:#0000}}.keybind-reset-btn{border:1px solid var(--border);color:var(--muted);cursor:pointer;background:0 0;border-radius:8px;padding:5px 16px;font-size:.78rem;transition:color .2s,border-color .2s}.keybind-reset-btn:hover{color:#f65;border-color:#f65}.feature-pills{z-index:1;flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.pill{background:var(--surface2);border:1px solid var(--border);color:var(--muted);letter-spacing:.04em;border-radius:20px;padding:4px 12px;font-size:.75rem;font-weight:600}.difficulty-screen{gap:28px}.diff-header{align-items:center;gap:16px;padding:0 24px;display:flex;position:absolute;top:20px;left:0;right:0}.back-btn{background:var(--surface2);border:1px solid var(--border);color:var(--muted);cursor:pointer;border-radius:8px;padding:8px 14px;font-size:13px;transition:color .15s,border-color .15s}.back-btn:hover{color:var(--text);border-color:var(--accent)}.diff-song-name{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;max-width:60vw;font-size:13px;overflow:hidden}.diff-title{color:var(--text);letter-spacing:.1em;font-family:Orbitron,monospace;font-size:1.6rem;font-weight:700}.diff-cards{flex-wrap:wrap;justify-content:center;gap:16px;max-width:900px;display:flex}.diff-card{background:var(--surface);border:1.5px solid var(--border);cursor:pointer;text-align:center;border-radius:16px;flex-direction:column;align-items:center;gap:8px;width:min(190px,42vw);padding:24px 16px;transition:all .2s;display:flex;position:relative;overflow:hidden}.diff-card:before{content:"";background:var(--card-color,var(--accent));opacity:0;height:3px;transition:opacity .2s;position:absolute;top:0;left:0;right:0}.diff-card:hover{border-color:var(--card-color,var(--accent));box-shadow:0 12px 40px color-mix(in srgb, var(--card-color,var(--accent)) 30%, transparent);background:var(--surface2);transform:translateY(-4px)}.diff-card:hover:before{opacity:1}.diff-emoji{font-size:2.2rem;line-height:1}.diff-name{color:var(--card-color,var(--accent));font-family:Orbitron,monospace;font-size:1rem;font-weight:700}.diff-desc{color:var(--muted);font-size:.78rem}.diff-stats{color:var(--muted);background:var(--bg);border-radius:20px;gap:8px;margin-top:4px;padding:4px 10px;font-size:.72rem;display:flex}.diff-hint{color:var(--muted);opacity:.6;text-align:center;font-size:.8rem}.demo-mode-btn{border:1.5px solid var(--muted);color:var(--muted);letter-spacing:.05em;cursor:pointer;background:0 0;border-radius:30px;margin-top:4px;padding:10px 28px;font-family:Orbitron,monospace;font-size:.78rem;font-weight:700;transition:color .2s,border-color .2s,box-shadow .2s}.demo-mode-btn:hover{color:var(--accent2);border-color:var(--accent2);box-shadow:0 0 14px #ffcc0040}.loading-screen{gap:0}.loading-card{background:var(--surface);border:1px solid var(--border);border-radius:20px;flex-direction:column;align-items:center;gap:14px;width:min(420px,90vw);padding:40px 48px;display:flex}.loading-icon{width:64px;height:64px;position:relative}.loading-ring{border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:.8s linear infinite spin;position:absolute;inset:0}.loading-note{justify-content:center;align-items:center;font-size:1.5rem;display:flex;position:absolute;inset:0}.loading-filename{color:var(--text);text-overflow:ellipsis;white-space:nowrap;text-align:center;max-width:320px;font-size:.9rem;overflow:hidden}.loading-diff-badge{font-size:.85rem;font-weight:700}.loading-bar-wrap{background:var(--surface2);border-radius:2px;width:100%;height:4px;overflow:hidden}.loading-bar{border-radius:2px;height:100%;transition:width .4s;box-shadow:0 0 8px}.loading-status{color:var(--muted);text-align:center;font-size:.8rem}.game-screen{background:#05050e;flex-direction:column;width:100vw;height:100vh;display:flex}.game-topbar{border-bottom:1px solid var(--border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#05050ee6;flex-shrink:0;justify-content:space-between;align-items:center;height:38px;padding:0 16px;display:flex}.song-name{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;max-width:60vw;font-size:12px;overflow:hidden}.live-score{color:#fff;font-family:Orbitron,monospace;font-size:15px;font-weight:700;transition:color .3s}.live-score.on-fire{color:#f93;text-shadow:0 0 12px #f60}.game-canvas{flex:1;width:100%;display:block}.lane-labels{border-top:1px solid var(--border);background:#05050ee6;flex-shrink:0;height:34px;display:flex}.lane-label{opacity:.7;flex:1;justify-content:center;align-items:center;font-size:1.3rem;display:flex}.lane-label-0{color:#57f}.lane-label-1{color:#3d7}.lane-label-2{color:#f46}.lane-label-3{color:#fc2}.topbar-left{align-items:center;gap:8px;min-width:0;display:flex}.topbar-btn{color:var(--muted);cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1a;border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;font-size:14px;transition:color .15s,background .15s;display:flex}.topbar-btn:hover{color:var(--text);background:#ffffff1f}.pause-overlay{z-index:10;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#05050ed1;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.pause-card{background:var(--surface);border:1px solid var(--border);border-radius:20px;flex-direction:column;align-items:center;gap:16px;padding:40px 56px;display:flex}.pause-title{color:var(--text);letter-spacing:.18em;font-family:Orbitron,monospace;font-size:2rem;font-weight:900}.pause-resume-btn,.pause-back-btn{cursor:pointer;border-radius:10px;width:200px;padding:12px;font-size:.95rem;font-weight:700;transition:transform .1s,box-shadow .2s}.pause-resume-btn{background:var(--accent);color:#fff;border:none;box-shadow:0 0 20px #6464ff4d}.pause-resume-btn:hover{transform:translateY(-1px);box-shadow:0 4px 24px #6464ff80}.pause-back-btn{border:1px solid var(--border);color:var(--muted);background:0 0}.pause-back-btn:hover{border-color:var(--accent);color:var(--text)}.results-screen{gap:0}.results-bg-glow{pointer-events:none;z-index:0;position:absolute;inset:0}.results-card{z-index:1;background:var(--surface);border:1px solid var(--border);border-radius:24px;flex-direction:column;align-items:center;gap:12px;width:min(500px,94vw);padding:32px 40px;display:flex;position:relative;box-shadow:0 24px 80px #0009}.results-song{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;max-width:380px;font-size:.85rem;overflow:hidden}.results-diff{font-size:.85rem;font-weight:700}.results-badge{letter-spacing:.1em;border-radius:20px;padding:4px 16px;font-size:.78rem;font-weight:800}.all-perfect{color:#ffe066;background:#ffe06626;border:1px solid #ffe06644}.full-combo{color:#5cf;background:#55ccff26;border:1px solid #5cf4}.grade-badge{font-family:Orbitron,monospace;font-size:5.5rem;font-weight:900;line-height:1}.results-score-wrap{text-align:center}.results-score{color:#fff;font-family:Orbitron,monospace;font-size:2.4rem;font-weight:700}.results-accuracy{color:var(--muted);margin-top:2px;font-size:.95rem}.results-breakdown{flex-direction:column;gap:8px;width:100%;margin:4px 0;display:flex}.rb-row{align-items:center;gap:10px;display:flex}.rb-label{color:var(--muted);text-align:right;flex-shrink:0;width:72px;font-size:.78rem}.rb-bar-wrap{background:var(--surface2);border-radius:3px;flex:1;height:6px;overflow:hidden}.rb-bar{border-radius:3px;height:100%;transition:width .8s cubic-bezier(.16,1,.3,1)}.rb-count{width:40px;font-family:monospace;font-size:.85rem;font-weight:700}.perfect-c{color:#ffe066}.good-c{color:#5cf}.miss-c{color:#f45}.combo-c{color:#c8f}.results-actions{gap:10px;margin-top:4px;display:flex}.btn-retry,.btn-new-song{cursor:pointer;border:none;border-radius:10px;padding:12px 24px;font-size:.9rem;font-weight:700;transition:transform .1s,box-shadow .2s}.btn-retry{background:var(--surface2);color:var(--text);border:1px solid var(--border)}.btn-retry:hover{border-color:var(--accent);color:var(--accent);transform:translateY(-1px)}.btn-new-song{background:var(--accent);color:#fff;box-shadow:0 0 20px #6464ff4d}.btn-new-song:hover{transform:translateY(-2px);box-shadow:0 4px 24px #6464ff80}.btn-new-song:active,.btn-retry:active{transform:scale(.97)}
