*{margin:0;padding:0;box-sizing:border-box;font-family:"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif}
:root{
  --bg:#0d1117;--panel:#161b22;--panel2:#1c2330;--line:#2a3342;
  --text:#e6edf3;--sub:#8b98a9;--accent:#22c55e;--accent2:#f59e0b;--danger:#ef4444;
  --blue:#3b82f6;--purple:#a855f7;
}
html,body{background:var(--bg);color:var(--text);min-height:100vh;-webkit-tap-highlight-color:transparent}
main{max-width:1180px;margin:0 auto;padding:20px 16px 80px}
.topbar{display:flex;align-items:center;gap:12px;padding:10px 16px;background:var(--panel);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50;flex-wrap:wrap}
.logo{width:32px;height:32px;border-radius:9px;background:linear-gradient(135deg,var(--accent),#0ea5e9);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:16px;color:#fff;flex-shrink:0}
.brand{font-weight:700;font-size:15px;white-space:nowrap}.brand small{color:var(--sub);font-weight:400;margin-left:5px;font-size:11px}
.nav{display:flex;gap:2px;flex-wrap:wrap}
.nav button{background:none;border:none;color:var(--sub);padding:6px 12px;border-radius:8px;cursor:pointer;font-size:14px}
.nav button.on{background:var(--panel2);color:var(--text);font-weight:600}
.nav button:hover{color:var(--text)}
.spacer{flex:1}
.badge{padding:4px 10px;border-radius:20px;font-size:12px;background:rgba(139,152,169,.12);color:var(--sub);border:1px solid var(--line);white-space:nowrap}
.badge.on{background:rgba(34,197,94,.12);color:var(--accent);border-color:rgba(34,197,94,.35)}
.badge.err{background:rgba(239,68,68,.12);color:var(--danger);border-color:rgba(239,68,68,.35)}
.view{display:none}
.view.on{display:block}
h2{font-size:19px;margin-bottom:4px}
.sub{color:var(--sub);font-size:13px;margin-bottom:18px}
.grid{display:grid;gap:14px;margin-top:14px}
.g3{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}
.g2{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px}
.card h3{font-size:14.5px;margin-bottom:10px;display:flex;align-items:center;gap:8px}
.card .desc{color:var(--sub);font-size:12.5px;line-height:1.7}
.card .desc code{background:var(--panel2);padding:1px 5px;border-radius:4px;color:var(--accent)}
.icon{width:30px;height:30px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;font-size:15px;background:var(--panel2)}
.big-btn{display:block;width:100%;text-align:center;padding:11px;border:none;border-radius:10px;background:linear-gradient(135deg,var(--accent),#16a34a);color:#fff;font-size:14px;font-weight:600;cursor:pointer;margin-top:12px}
.big-btn:active{transform:scale(.98)}
.ghost{background:var(--panel2);color:var(--text);border:1px solid var(--line)}
.btn-row{display:flex;gap:10px;margin-top:12px}
.tag{display:inline-block;padding:2px 8px;border-radius:6px;font-size:11px;margin-right:6px;background:var(--panel2);color:var(--sub)}
.tag.g{background:rgba(34,197,94,.12);color:var(--accent)}
.tag.b{background:rgba(59,130,246,.12);color:var(--blue)}
.tag.y{background:rgba(245,158,11,.12);color:var(--accent2)}
.tag.p{background:rgba(168,85,247,.12);color:var(--purple)}
.path{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}
.step{flex:1;min-width:110px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;padding:10px;text-align:center}
.step .lv{font-size:11px;color:var(--sub);margin-bottom:3px}
.step .nm{font-weight:600;font-size:13px}
.step.on{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}
.arrow{color:var(--sub)}
.stat-row{display:flex;gap:16px;margin-top:14px;flex-wrap:wrap}
.stat{text-align:center;flex:1;min-width:80px}
.stat .v{font-size:19px;font-weight:700}
.stat .small{font-size:11px;color:var(--sub)}
.opt{display:grid;gap:10px;margin-top:6px}
.opt-row{display:flex;align-items:center;gap:10px;font-size:13px}
.opt-row label{width:86px;color:var(--sub);flex-shrink:0}
.opt-row select{flex:1;background:var(--panel2);border:1px solid var(--line);color:var(--text);padding:8px;border-radius:8px;font-size:13px;outline:none}
.scale-box{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.scale-box .n{width:40px;height:40px;border-radius:9px;background:var(--panel2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:700}
.skill-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-top:14px}
.skill{padding:12px;border-radius:10px;background:var(--panel2);border:1px solid var(--line);cursor:pointer;font-size:13px;text-align:center}
.skill.on{border-color:var(--accent);background:rgba(34,197,94,.08);color:var(--accent)}
.skill .en{color:var(--sub);font-size:11px;margin-top:3px}
.skill.on .en{color:var(--sub)}
.tags-block{line-height:2}
.metro{display:flex;align-items:center;gap:14px;margin:10px 0}
.bpm{font-size:38px;font-weight:800;color:var(--accent)}
.metro input[type=range]{width:100%;accent-color:var(--accent)}
.rhythm-display{font-size:26px;font-weight:700;letter-spacing:4px;padding:18px;background:var(--panel2);border-radius:12px;text-align:center;color:var(--accent);font-family:Consolas,monospace}
.dropzone{border:2px dashed var(--line);border-radius:14px;padding:28px;text-align:center;color:var(--sub);cursor:pointer;font-size:13px}
.dropzone b{color:var(--text)}
.dropzone:hover{border-color:var(--accent)}
#scoreImgPreview img{max-width:100%;border-radius:10px;margin-top:12px;border:1px solid var(--line)}
.score-line{display:flex;gap:4px;flex-wrap:wrap;align-items:flex-end;background:var(--panel2);border-radius:10px;padding:14px;min-height:70px;overflow-x:auto}
.sn{display:flex;flex-direction:column;align-items:center;min-width:34px;padding:6px 4px;border-radius:8px;position:relative}
.sn .num{font-size:20px;font-weight:700;line-height:1.1}
.sn .tk{font-size:10px;color:var(--accent2);font-weight:700;margin-top:2px}
.sn .oct{font-size:10px;color:var(--blue);margin-top:1px}
.sn.rest .num{color:var(--sub)}
.sn.barline{border-left:2px solid var(--line);border-radius:0;min-width:8px;padding:0}
.sn.cur{background:rgba(34,197,94,.18);border:1px solid var(--accent)}
.sn.ok{background:rgba(34,197,94,.15)}
.sn.bad{background:rgba(239,68,68,.15)}
/* slur group: top arc line across notes */
.sn.slur-in::before{content:'';position:absolute;top:-4px;height:2.5px;background:#8b5cf6;border-radius:2px;z-index:2}
.sn.slur-start::before{left:50%;right:-2px}
.sn.slur-mid::before{left:-2px;right:-2px}
.sn.slur-end::before{left:-2px;right:50%}
.sn .dur{font-size:9px;color:var(--sub)}
.pitch-meter{margin:12px 0}
.pm-bar{height:10px;background:var(--panel2);border-radius:6px;overflow:hidden;position:relative}
.pm-fill{height:100%;width:0%;background:linear-gradient(90deg,var(--danger),var(--accent2),var(--accent));border-radius:6px;transition:width .15s}
.pm-label{font-size:12px;color:var(--sub);margin-top:6px}
.finger-edit{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px;margin-top:12px}
.fe-item{padding:8px;border-radius:8px;background:var(--panel2);border:1px solid var(--line);cursor:pointer;text-align:center;font-size:13px}
.fe-item.on{border-color:var(--accent)}
.fe-item .fe-name{font-weight:700}
.fe-item .fe-keys{font-size:10px;color:var(--sub);margin-top:3px}
.finger-box{display:inline-flex;flex-direction:column;align-items:center;gap:4px;margin-top:10px}
.finger-row{display:flex;gap:8px}
.fk{width:26px;height:26px;border-radius:50%;background:var(--panel2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:10px;color:var(--sub)}
.fk.press{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 0 8px rgba(34,197,94,.5)}
.fk.oct{background:var(--panel2);border-color:var(--blue);color:var(--blue)}
.fk.oct.press{background:var(--blue);border-color:var(--blue);color:#fff}
.fk-label{font-size:10px;color:var(--sub);text-align:center}

/* 会话 */
.session-overlay{position:fixed;inset:0;background:var(--bg);z-index:100;display:none;flex-direction:column}
.session-overlay.on{display:flex}
.session-top{display:flex;align-items:center;gap:12px;padding:12px 16px;background:var(--panel);border-bottom:1px solid var(--line)}
.s-btn{padding:6px 12px;border-radius:8px;background:var(--panel2);border:1px solid var(--line);color:var(--text);cursor:pointer;font-size:13px}
#sessionTitle{flex:1;text-align:center;font-weight:600}
.session-body{flex:1;overflow-y:auto;display:flex;align-items:center;justify-content:center;padding:20px}
.session-stage{max-width:760px;width:100%;text-align:center}
.session-group{color:var(--sub);font-size:13px;margin-bottom:8px}
.session-notes{display:flex;gap:4px;flex-wrap:wrap;justify-content:center;margin-bottom:20px}
.session-current{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:24px 16px;margin-bottom:16px}
.cur-num{font-size:72px;font-weight:800;color:var(--accent);line-height:1}
.cur-meta{color:var(--sub);font-size:13px;margin-top:8px}
.cur-meta.ok{color:var(--accent)}
.cur-meta.bad{color:var(--danger)}
.session-status{font-size:14px;color:var(--sub);margin-bottom:10px}
.session-msg{font-size:15px;font-weight:600;min-height:22px;margin-top:8px}
.session-msg.ok{color:var(--accent)}
.session-msg.bad{color:var(--danger)}
.session-msg.info{color:var(--blue)}
.session-bottom{display:flex;background:var(--panel);border-top:1px solid var(--line);padding:10px 0}
.sb-item{flex:1;text-align:center}
.sb-label{display:block;font-size:10px;color:var(--sub)}
.sb-item span:last-child{font-size:16px;font-weight:700}

/* 悬浮节拍器 */
.metrodock{position:fixed;right:16px;bottom:16px;z-index:90;width:250px;background:var(--panel);border:1px solid var(--line);border-radius:14px;box-shadow:0 8px 30px rgba(0,0,0,.5);overflow:hidden}
.metrodock .hd{display:flex;align-items:center;gap:8px;padding:10px 14px;background:var(--panel2);cursor:pointer;font-size:13px;font-weight:600}
.metrodock .bd{padding:12px 14px;display:none}
.metrodock.open .bd{display:block}
.metrodock .bpm2{font-size:26px;font-weight:800;color:var(--accent)}
.metrodock .mini-row{display:flex;align-items:center;gap:10px}
.metrodock input[type=range]{width:100%;accent-color:var(--accent)}
.metrodock .btns{display:flex;gap:8px;margin-top:8px}
.metrodock .btns button{flex:1;padding:8px;border:none;border-radius:8px;cursor:pointer;background:var(--panel2);color:var(--text);font-size:12.5px}
.metrodock .btns button.go{background:linear-gradient(135deg,var(--accent),#16a34a);color:#fff;font-weight:600}
.foot{text-align:center;color:var(--sub);font-size:11px;padding:14px;border-top:1px solid var(--line)}
@media(max-width:640px){
  .nav{width:100%;order:3;overflow-x:auto;display:flex}
  .brand small{display:none}
  .metrodock{right:10px;bottom:10px;width:220px}
  .cur-num{font-size:56px}
  .opt-row label{width:74px}
}

/* ===== ²¹³äÑùʽ ===== */
.tip{padding:10px 12px;border-radius:10px;background:rgba(59,130,246,.08);border:1px solid rgba(59,130,246,.25);color:var(--sub);font-size:12.5px;line-height:1.7}
.form-row{display:flex;align-items:center;gap:8px;margin:10px 0;flex-wrap:wrap}
.form-row label{font-size:12.5px;color:var(--sub);white-space:nowrap}
.form-row select,.form-row input{background:var(--panel2);border:1px solid var(--line);color:var(--text);border-radius:8px;padding:7px 10px;font-size:13px;outline:none}
.form-row select:focus,.form-row input:focus{border-color:var(--accent)}
.rhythm-pattern{font-size:26px;font-weight:800;letter-spacing:6px;text-align:center;margin:14px 0;color:var(--accent);font-family:Consolas,monospace}
.mic-meter{width:100%;height:14px;background:var(--panel2);border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-top:8px}
.mm-fill{height:100%;background:linear-gradient(90deg,var(--accent),#84cc16);border-radius:8px;transition:width .1s}
.cur-note{flex:1.2;text-align:center;background:var(--panel2);border:1px solid var(--line);border-radius:14px;padding:20px 12px}
.cur-num{font-size:88px;font-weight:800;color:var(--accent);line-height:1;text-shadow:0 0 30px rgba(34,197,94,.35)}
.cur-meta{color:var(--sub);font-size:13px;margin-top:6px}
.finger-row{display:flex;gap:6px;justify-content:center;margin-top:12px;flex-wrap:wrap}
.fk{width:34px;height:34px;border-radius:50%;background:var(--panel2);border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:9px;color:var(--sub)}
.fk.oct{border-color:var(--blue);color:var(--blue)}
.fk.press{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 0 10px rgba(34,197,94,.5)}
.fk-label{font-size:11px;color:var(--sub)}
.session-notes{display:flex;gap:6px;flex-wrap:wrap;padding:12px;background:var(--panel2);border:1px solid var(--line);border-radius:12px;min-height:64px;align-items:center;justify-content:center}
.session-notes .sn{min-width:38px;padding:8px 6px;border-radius:8px;background:var(--panel);border:1px solid var(--line);text-align:center;position:relative;transition:.2s}
.session-notes .sn .num{font-size:20px;font-weight:700}
.session-notes .sn .oct{color:var(--blue);font-size:11px}
.session-notes .sn .tk{color:var(--accent2);font-size:10px;font-weight:700;display:block}
.session-notes .sn.cur{border-color:var(--accent);box-shadow:0 0 12px rgba(34,197,94,.4);transform:translateY(-3px)}
.session-notes .sn.ok{border-color:var(--accent);background:rgba(34,197,94,.12)}
.session-notes .sn.ok .num{color:var(--accent)}
.session-notes .barline{width:0;height:26px;border-left:2px solid var(--line);margin:0 2px}
.score-line{display:flex;gap:4px;flex-wrap:wrap;margin-top:12px;padding:12px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;overflow-x:auto}
.score-line .sn{min-width:34px;padding:6px 4px;border-radius:6px;background:var(--panel);border:1px solid var(--line);text-align:center;font-size:16px;font-weight:700}
.score-line .sn .oct{color:var(--blue);font-size:10px}
.score-line .sn .tk{color:var(--accent2);font-size:10px;font-weight:700;display:block}
.score-line .sn.rest{opacity:.5}
.score-line .barline{width:0;height:22px;border-left:2px solid var(--line);margin:0 2px}
.score-input{width:100%;min-height:190px;background:var(--panel2);border:1px solid var(--line);border-radius:10px;color:var(--text);padding:12px;font-size:13px;font-family:Consolas,monospace;line-height:1.8;resize:vertical;outline:none}
.score-input:focus{border-color:var(--accent)}
.img-preview{margin-top:10px;max-height:280px;overflow:auto;border-radius:10px}
.img-preview img{max-width:100%;display:block}
.card-inner{margin-top:14px;padding:14px;background:var(--panel2);border:1px solid var(--line);border-radius:10px}
.finger-edit{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:8px;margin-top:12px}
.fe-item{padding:8px;border-radius:8px;background:var(--panel2);border:1px solid var(--line);cursor:pointer;text-align:center;opacity:.55}
.fe-item.on{opacity:1;border-color:var(--accent)}
.fe-name{font-size:13px;font-weight:600}
.fe-keys{font-family:Consolas,monospace;font-size:11px;color:var(--sub);margin-top:3px;letter-spacing:1px}
.session-ft{display:flex;align-items:center;gap:14px;margin-top:14px}
.session-ft .big-btn{width:auto;margin:0;padding:10px 22px}
.session-hd{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.session-tools{display:flex;gap:10px;align-items:center}
.tool-item{background:var(--panel2);border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:12.5px;color:var(--sub)}
.session .close{background:var(--panel2);border:1px solid var(--line);color:var(--sub);border-radius:8px;width:32px;height:32px;cursor:pointer;font-size:14px}
.session-status{font-size:14px;font-weight:600;margin-bottom:8px}
.session-msg{font-size:14px;font-weight:700;margin:8px 0;min-height:20px}
.session-msg.ok{color:var(--accent)}
.session-msg.info{color:var(--blue)}
.session-main{display:flex;gap:14px;margin-top:14px;flex-wrap:wrap}
.session-side{flex:1;min-width:240px;background:var(--panel2);border:1px solid var(--line);border-radius:14px;padding:16px}
.session-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:12px}
@media(max-width:640px){.session-main{flex-direction:column}.cur-num{font-size:64px}.session-stats{grid-template-columns:repeat(2,1fr)}}

/* ===== 简谱化渲染（v2）===== */
/* 高低音点：高音红 / 低音蓝，加粗加大 */
.oct-row{height:14px;display:flex;justify-content:center;gap:2px;line-height:1}
.oct-dot{display:inline-block;width:9px;height:9px;border-radius:50%}
.oct-dot.hi{background:#ef4444;box-shadow:0 0 4px rgba(239,68,68,.8)}
.oct-dot.lo{background:#3b82f6;box-shadow:0 0 4px rgba(59,130,246,.8)}
.session-notes .sn .oct, .score-line .sn .oct{font-size:0}
/* 减时线（下划线） */
.dur-row{height:12px;display:flex;justify-content:center;gap:2px;line-height:1}
.dur-line{display:inline-block;width:18px;height:3px;background:#333;border-radius:2px}
body.dark .dur-line{background:#e5e7eb}
/* 增时线 */
.dur-more{display:inline-block;width:7px;height:2px;background:#666;margin-left:2px;vertical-align:middle}
body.dark .dur-more{background:#cbd5e1}
.dur-more-row{height:8px;text-align:left;padding-left:4px}
/* 附点 */
.dot-mark{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:1px;vertical-align:super}
/* 技巧符号 */
.sign-row{height:14px;display:flex;justify-content:center;gap:2px;line-height:1}
.sign{font-style:normal;font-weight:800;font-size:11px}
.sign.tk{color:var(--accent2)}
.sign.slur{color:#8b5cf6}
.sign.gliss{color:#f59e0b}
.sign.vib{color:#ec4899}
.sign.breath{color:#14b8a6}
.sign.stacc{color:#8b5cf6;font-size:14px}
.sign.acc{color:#f59e0b}
/* 当前音符区：大号高低音点 + 符号 */
.cur-num-wrap{position:relative;display:inline-block;padding:6px 0}
.cur-oct-hi{height:22px;display:flex;justify-content:center;gap:4px}
.cur-oct-lo{height:22px;display:flex;justify-content:center;gap:4px}
.cur-num-wrap .oct-dot{width:14px;height:14px}
.cur-dur{height:18px;display:flex;justify-content:center;align-items:center;gap:3px}
.cur-dur .dur-line{width:34px;height:4px}
.cur-dur .dur-more{width:10px;height:3px}
.cur-signs{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;margin-bottom:6px;min-height:22px}
.cur-signs .cs{font-size:13px;font-weight:800;padding:2px 8px;border-radius:6px}
.cs.tk{color:var(--accent2);background:rgba(251,146,60,.12)}
.cs.slur{color:#8b5cf6;background:rgba(139,92,246,.12)}
.cs.gliss{color:#f59e0b;background:rgba(245,158,11,.12)}
.cs.vib{color:#ec4899;background:rgba(236,72,153,.12)}
.cs.breath{color:#14b8a6;background:rgba(20,184,166,.12)}
/* 增时线文本行 */
.dur-row.more{color:#666;font-weight:800;letter-spacing:2px;font-size:12px;line-height:1;height:12px;display:flex;justify-content:center;align-items:center}
body.dark .dur-row.more{color:#cbd5e1}


/* ==== 2026-08-22 fix: custom finger merge display + desktop enlarge ==== */
.fk-edit{width:46px;height:46px;font-size:13px}
.fe-item.custom{border-color:var(--blue);box-shadow:0 0 0 1px var(--blue) inset}
.fe-item .fe-tag{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:6px;background:var(--blue);color:#fff;font-size:10px;font-weight:600;vertical-align:2px}
@media(min-width:641px){
  .finger-edit{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px;margin-top:16px}
  .fe-item{padding:16px 12px;border-radius:12px;font-size:16px}
  .fe-item .fe-name{font-size:18px}
  .fe-item .fe-keys{font-size:17px;letter-spacing:4px;margin-top:7px;color:var(--accent);font-weight:700}
  .fe-item .fe-tag{font-size:12px;padding:2px 8px;margin-left:8px}
  .fk{width:42px;height:42px;font-size:15px}
  .fk-edit{width:60px;height:60px;font-size:17px}
  .fk-label{font-size:14px}
  .finger-row{gap:10px}
}
