:root{
  --bg:#0d0f13; --surface:#181b22; --surface2:#1f222b; --surface3:#262a35;
  --text:#e2e4ea; --text2:#8b8fa3; --text3:#565a6e;
  --kick:#d45c5c; --snare:#5d93d8; --crash:#cfa74f;
  --ok:#5cb88a; --fast:#5d93d8; --slow:#d99a4e; --miss:#c94f4f; --accent:#e0734a;
  --border:#2a2d38; --border2:#3a3e4c;
  --paper:#f4f1e8;
  --shadow:0 6px 24px -8px rgba(0,0,0,.55);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{background:var(--bg);color:var(--text);font-family:"Noto Sans JP",system-ui,sans-serif;overflow:hidden;user-select:none;-webkit-user-select:none}
#app{position:relative;width:100vw;height:100vh}
.screen{position:absolute;inset:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:18px;padding:20px}
.screen.active{display:flex;animation:screen-in .22s ease-out}
@keyframes screen-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ---- Buttons ---- */
button{cursor:pointer;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);
  padding:10px 18px;font-size:13px;font-weight:600;font-family:inherit;
  transition:background .12s,border-color .12s,transform .06s}
button:hover{background:var(--surface2);border-color:var(--border2)}
button:active{transform:translateY(1px)}
button:disabled{opacity:.4;cursor:default}
button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
button.big{font-family:"Orbitron",sans-serif;font-size:18px;padding:14px 52px;background:var(--accent);border:none;color:#fff;
  letter-spacing:1px;border-radius:10px;box-shadow:0 4px 16px -6px rgba(224,115,74,.5)}
button.big:hover{filter:brightness(1.08);background:var(--accent)}
.icon-btn{width:38px;height:38px;padding:0;font-size:15px;line-height:1;border-radius:9px;background:rgba(0,0,0,.35)}
.icon-btn:hover{background:var(--surface2)}

/* ---- TITLE ---- */
.logo{font-family:"Orbitron",sans-serif;font-weight:900;letter-spacing:5px;line-height:1;font-size:clamp(42px,9vw,84px);color:var(--text)}
.logo span{color:var(--accent)}
.tagline{color:var(--text2);font-size:13px}
.menu{display:flex;flex-direction:column;align-items:center;gap:13px;margin-top:2px}
.row{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
.filepick{display:inline-flex;align-items:center;gap:6px;border:1px dashed var(--border2);background:transparent;
  padding:10px 20px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;color:var(--text2);
  transition:border-color .12s,color .12s}
.filepick:hover{border-color:var(--text2);color:var(--text)}
.filepick input{display:none}
.hint{color:var(--text3);font-size:11px;max-width:460px;text-align:center;line-height:1.7}
.hint b{color:var(--text2)}

/* song card */
.song-card{min-width:300px;max-width:420px;background:var(--surface);border:1px solid var(--border);border-radius:12px;
  padding:14px 18px;display:flex;flex-direction:column;gap:6px;box-shadow:var(--shadow)}
.song-card-head{display:flex;align-items:baseline;gap:10px}
.song-card-label{font-family:"Orbitron",sans-serif;font-size:9px;letter-spacing:2px;color:var(--accent);font-weight:700}
.song-name{font-size:15px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.song-meta{font-size:11px;color:var(--text2);font-variant-numeric:tabular-nums}
.song-best{font-size:11px;color:var(--crash);font-weight:700;font-variant-numeric:tabular-nums;min-height:14px}

/* ---- GAME ---- */
#screen-game{justify-content:flex-start;gap:0;padding-top:6px;overflow:hidden}
#screen-game>*{flex-shrink:0}
#game-topbar{width:100%;max-width:760px;display:flex;justify-content:space-between;padding:4px 2px}
.topbar-left,.topbar-right{display:flex;gap:6px}
#hud{width:100%;max-width:760px;display:flex;justify-content:space-between;align-items:center;padding:8px 12px;
  background:var(--surface);border:1px solid var(--border);border-radius:8px;margin:4px 0}
.hud-left{display:flex;align-items:baseline;gap:14px}
.score{font-family:"Orbitron",sans-serif;font-size:26px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--text)}
.combo{font-family:"Orbitron",sans-serif;font-size:14px;color:var(--crash);font-weight:700;min-width:96px}
.acc{font-family:"Orbitron",sans-serif;font-size:16px;font-weight:700;text-align:right;font-variant-numeric:tabular-nums}
.judge-counts{font-size:10px;color:var(--text2);text-align:right;font-family:ui-monospace,monospace;margin-top:2px}
#progress{width:100%;max-width:760px;margin:2px 0 6px;background:var(--surface);border-radius:4px;overflow:hidden}
#progress-fill{height:4px;width:0%;background:var(--accent);transition:width .08s linear}
#progress-time{display:flex;justify-content:space-between;font-family:ui-monospace,monospace;font-size:10px;color:var(--text3);padding:2px 4px 0}

/* live notation */
#live-score{display:block;margin:2px 0 6px;border-radius:8px;background:var(--paper);border:1px solid var(--border);
  width:min(680px,calc(100vw - 24px));overflow:hidden}
#live-score.hidden{display:none}
.vf-row{position:relative;padding:2px 0}
.vf-row+.vf-row{border-top:1px solid #e4ddc9}
.vf-target{width:100%;height:108px}
.vf-target svg{display:block}
.vf-next-label{position:absolute;top:2px;left:4px;font:700 9px Orbitron,sans-serif;color:var(--text2);z-index:2}
.vf-playhead{position:absolute;top:2px;bottom:2px;width:2px;background:#b8472f;
  box-shadow:0 0 0 1px rgba(184,71,47,.25);pointer-events:none;z-index:3;transition:left .05s linear}
.vf-playhead::before{content:"";position:absolute;top:-1px;left:50%;transform:translateX(-50%);
  border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #b8472f}

/* playfield */
#playfield{position:relative}
#lanes{display:block;border-radius:8px;background:var(--surface);border:1px solid var(--border)}
#judge-flash{position:absolute;top:34%;left:50%;transform:translateX(-50%);font-family:"Orbitron",sans-serif;
  font-size:32px;font-weight:900;pointer-events:none;opacity:0;letter-spacing:2px;white-space:nowrap}
@keyframes pop{0%{opacity:1;transform:translateX(-50%) scale(1.15)}100%{opacity:0;transform:translateX(-50%) scale(.95)}}
#judge-flash.show{animation:pop .35s ease-out}
#judge-sub{position:absolute;top:calc(34% + 38px);left:50%;transform:translateX(-50%);font-family:"Orbitron",sans-serif;
  font-size:13px;font-weight:700;pointer-events:none;opacity:0;letter-spacing:3px}
#judge-sub.show{animation:pop .4s ease-out}
#countdown{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;
  font-family:"Orbitron",sans-serif;font-size:72px;font-weight:900;color:var(--text);opacity:0;
  text-shadow:0 2px 24px rgba(0,0,0,.6)}
#countdown.show{opacity:1}
#key-hints{display:flex;gap:6px;margin-top:8px;justify-content:center}
.key-hint{width:100px;text-align:center;font-family:"Orbitron",sans-serif;font-weight:700;font-size:14px;padding:8px 0;
  border-radius:6px;border:1px solid var(--border);background:var(--surface);color:var(--text2);
  transition:background .08s,box-shadow .08s}
.key-hint.hit{background:var(--surface3);box-shadow:inset 0 0 0 1px currentColor}

/* pause overlay */
#pause-overlay{position:absolute;inset:0;background:rgba(8,9,12,.78);backdrop-filter:blur(3px);
  display:none;align-items:center;justify-content:center;z-index:20}
#pause-overlay.active{display:flex;animation:screen-in .15s ease-out}
.pause-box{display:flex;flex-direction:column;align-items:center;gap:14px;background:var(--surface);
  border:1px solid var(--border);border-radius:14px;padding:30px 44px;box-shadow:var(--shadow)}
.pause-box h3{font-family:"Orbitron",sans-serif;font-size:16px;letter-spacing:3px;color:var(--text2)}

/* ---- RESULT ---- */
#screen-result h2{font-family:"Orbitron",sans-serif;letter-spacing:4px;font-size:18px;color:var(--text2)}
.result-song{font-size:12px;color:var(--text3);margin-top:-10px}
.rank-grade{font-family:"Orbitron",sans-serif;font-size:88px;font-weight:900;line-height:.9}
.new-record{display:none;font-family:"Orbitron",sans-serif;font-size:13px;font-weight:700;color:var(--crash);
  letter-spacing:2px;animation:record-blink 1s ease-in-out infinite}
.new-record.show{display:block}
@keyframes record-blink{50%{opacity:.45}}
.result-table{border-collapse:collapse;font-size:14px;background:var(--surface);border:1px solid var(--border);border-radius:10px;overflow:hidden}
.result-table td{padding:7px 22px;border-bottom:1px solid var(--border)}
.result-table tr:last-child td{border-bottom:none}
.result-table td:last-child{text-align:right;font-weight:700;font-variant-numeric:tabular-nums;font-family:"Orbitron",sans-serif;font-size:13px}
.j-perfect{color:var(--ok)}.j-good{color:var(--snare)}.j-miss{color:var(--miss)}.j-fastslow{color:var(--text2)}
.submit-row{display:flex;gap:8px}
.submit-row input{padding:10px 12px;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:14px;font-family:inherit}
.submit-row input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.submit-status{font-size:12px;color:var(--text2);height:16px}

/* ---- MODALS ---- */
.modal{position:absolute;inset:0;background:rgba(0,0,0,.62);display:none;align-items:center;justify-content:center;z-index:30}
.modal.active{display:flex}
.modal-box{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:24px;min-width:340px;max-width:90vw;
  display:flex;flex-direction:column;gap:14px;box-shadow:var(--shadow);animation:screen-in .16s ease-out}
.modal-box h3{font-family:"Orbitron",sans-serif;font-size:15px;letter-spacing:1px}
.modal-hint{font-size:12px;color:var(--text2);line-height:1.7}
.keymap-row{display:flex;align-items:center;justify-content:space-between;gap:16px}
.lane-name{font-weight:700;font-size:13px;padding:4px 10px;border-radius:6px;border:1px solid currentColor}
.lane-name.kick{color:var(--kick)}.lane-name.snare{color:var(--snare)}.lane-name.crash{color:var(--crash)}
.key-btn{min-width:80px;font-family:"Orbitron",sans-serif;font-size:13px}
.key-btn.listening{background:var(--accent);border-color:var(--accent);color:#fff;animation:blink .7s infinite}
@keyframes blink{50%{opacity:.45}}
.calib-control{display:flex;align-items:center;justify-content:center;gap:16px;font-size:16px}
.calib-control span{min-width:80px;text-align:center;font-family:"Orbitron",sans-serif}

/* mixer */
.mixer-box{min-width:340px}
.mix-row{display:flex;align-items:center;gap:10px;padding:5px 0}
.mix-row label{min-width:110px;font-size:13px;font-weight:600;color:var(--text2)}
.mix-row input[type=range]{flex:1;-webkit-appearance:none;appearance:none;height:4px;background:var(--border2);border-radius:3px;outline:none;cursor:pointer}
.mix-row input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;border-radius:50%;background:var(--text);cursor:pointer}
.mix-row input[type=range]::-moz-range-thumb{width:16px;height:16px;border-radius:50%;border:none;background:var(--text);cursor:pointer}
.mix-row input[type=range]:focus-visible{outline:2px solid var(--accent)}
.vol-val{min-width:28px;text-align:right;font-family:"Orbitron",sans-serif;font-size:12px;font-weight:700;color:var(--text2)}

/* ranking */
.rank-list{list-style:none;counter-reset:r;max-height:50vh;overflow-y:auto;min-width:320px}
.rank-list li{counter-increment:r;display:flex;align-items:center;justify-content:space-between;padding:9px 6px;border-bottom:1px solid var(--border);font-size:14px}
.rank-list li::before{content:counter(r);color:var(--text3);width:28px;font-family:"Orbitron",sans-serif;font-weight:700;font-size:12px}
.rank-list li .nm{flex:1;margin-left:6px;font-weight:600}
.rank-list li .sc{font-variant-numeric:tabular-nums;font-weight:700;font-family:"Orbitron",sans-serif;font-size:13px}
.rank-list li:nth-child(1) .sc{color:var(--crash)}
.rank-list li.loading,.rank-list li.empty{justify-content:center;color:var(--text3)}

/* drum mapping */
.map-box{min-width:400px;max-width:540px}
.map-chan{display:flex;align-items:center;gap:10px;font-size:13px}
.map-chan select{flex:1;padding:8px 10px;border-radius:8px;border:1px solid var(--border);background:var(--surface2);color:var(--text);font-size:13px;font-family:inherit}
.map-notes{max-height:44vh;overflow-y:auto;display:flex;flex-direction:column;gap:4px}
.map-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 8px;border-radius:6px;background:var(--surface2);border:1px solid var(--border)}
.map-label{font-size:12px}.map-label b{font-family:"Orbitron",sans-serif;margin-right:4px}
.map-cnt{color:var(--text3);font-size:11px;margin-left:3px}
.map-seg{display:flex;gap:3px}
.seg-btn{min-width:30px;padding:6px 0;font-weight:700;font-size:12px;border-radius:6px;background:var(--surface);border:1px solid var(--border)}
.seg-btn.on{background:var(--c,#555);border-color:var(--c,#555);color:#0d0f13}
.map-start{font-size:14px;padding:10px 24px}

/* toast */
#toast{position:fixed;bottom:26px;left:50%;transform:translateX(-50%) translateY(12px);background:var(--surface3);
  color:var(--text);border:1px solid var(--border2);border-radius:10px;padding:11px 20px;font-size:13px;font-weight:600;
  opacity:0;pointer-events:none;transition:opacity .18s,transform .18s;z-index:50;max-width:80vw;box-shadow:var(--shadow)}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* scrollbars */
::-webkit-scrollbar{width:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--border2);border-radius:4px}
