:root{--bg: #f7f7f9;--panel: #ffffff;--border: #d9d9e3;--text: #1f2328;--muted: #6b7280;--accent: #1565c0;--hit: #2e7d32;--wrong: #c62828;--loop-bg: rgba(33, 150, 243, .1)}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font-family:Segoe UI,Microsoft YaHei,system-ui,sans-serif}#app{display:flex;flex-direction:column;height:100vh;height:100dvh}.app-header{display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:8px 14px;background:var(--panel);border-bottom:1px solid var(--border)}#control-panel{display:flex;align-items:center;gap:10px;flex-wrap:wrap}:where(button,select,input,a,[tabindex]):focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}.control{display:flex;align-items:center;gap:4px;font-size:14px;color:var(--muted)}.control select,.control button,.control input[type=number]{font:inherit;font-size:14px;padding:5px 8px;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text);transition:border-color .15s,color .15s}.control select:hover:not(:disabled),.control button:hover:not(:disabled),.control input[type=number]:hover:not(:disabled){border-color:var(--accent)}.control button{cursor:pointer}.control button:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.control button:disabled,.control select:disabled{opacity:.5;cursor:not-allowed}.control input[type=checkbox]:disabled{opacity:.5;cursor:not-allowed}.menu{position:relative}.menu>.menu-btn:after{content:"▾";margin-left:6px;font-size:11px;color:var(--muted)}.menu-panel{position:absolute;top:calc(100% + 6px);left:0;z-index:50;display:flex;flex-direction:column;gap:8px;width:200px;box-sizing:border-box;padding:10px 12px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 10px 30px #00000024}.menu-panel .control{width:100%}.menu-panel .control>span{flex:0 0 auto;white-space:nowrap}.menu-panel select{flex:1 1 auto;min-width:0;width:auto;box-sizing:border-box}.menu-panel[hidden]{display:none}.bpm-combo{position:relative}.bpm-list{position:absolute;top:calc(100% + 4px);left:0;z-index:50;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:4px;width:100%;min-width:132px;max-height:208px;overflow:auto;box-sizing:border-box;padding:6px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 10px 30px #00000024}.bpm-list[hidden]{display:none}.bpm-item{font:inherit;font-size:12px;padding:4px 2px;border:1px solid transparent;border-radius:5px;background:transparent;color:var(--text);cursor:pointer}.bpm-item:hover{border-color:var(--accent);color:var(--accent)}.feedback-bar{min-height:52px;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:14px;padding:6px 14px;background:var(--panel);border-top:1px solid var(--border);font-size:14px}.feedback-bar .fb-left{grid-column:1;justify-self:stretch;min-width:0;display:flex;align-items:center;gap:14px}.feedback-bar .fb-stack{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:2px}.feedback-bar .fb-messages{min-width:0;overflow:hidden;display:flex;align-items:baseline;gap:6px;white-space:nowrap;font-size:13px}.feedback-bar .fb-keyslot:not([hidden])~.fb-persistent:not([hidden]):before,.feedback-bar .fb-keyslot:not([hidden])~.fb-transient:not([hidden]):before{content:"·";margin-right:6px;color:var(--muted);font-weight:400}.feedback-bar .fb-seek{display:flex;align-items:center;gap:8px;min-width:0}.feedback-bar .fb-seek-range{flex:1 1 auto;min-width:0;height:14px;margin:0;accent-color:var(--accent);cursor:pointer}.feedback-bar .fb-seek-range:disabled{opacity:.35;cursor:default}.feedback-bar .score-entry button.ab-btn{display:inline-flex;align-items:stretch;padding:0;overflow:hidden}.feedback-bar .score-entry button.ab-btn .ab-half{display:flex;align-items:center;padding:8px 7px;color:var(--text)}.feedback-bar .score-entry button.ab-btn .ab-sep{display:flex;align-items:center;color:var(--muted)}.feedback-bar .score-entry button.ab-btn.a-set .ab-a,.feedback-bar .score-entry button.ab-btn.ab-set .ab-a,.feedback-bar .score-entry button.ab-btn.ab-set .ab-b,.feedback-bar .score-entry button.ab-btn.ab-set .ab-sep{background:var(--accent);color:#fff}.feedback-bar .score-entry button.ab-btn:disabled{opacity:.35;cursor:default}.feedback-bar .fb-seek-pos{flex:0 0 auto;font-size:11px;line-height:1;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.feedback-bar .score-entry{display:flex;align-items:center;gap:10px;flex:0 0 auto}.feedback-bar .score-entry button{font:inherit;font-size:16px;font-weight:600;padding:8px 18px;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text);cursor:pointer}.feedback-bar .score-entry button:hover{border-color:var(--accent);color:var(--accent)}.feedback-bar .score-entry button.icon-btn{padding:8px 12px;display:inline-flex;align-items:center;justify-content:center}.feedback-bar .score-entry button.icon-btn svg{display:block}.feedback-bar .wrong{color:var(--wrong);font-weight:600;animation:flash .3s}.feedback-bar .fb-persistent{flex:0 1 auto;min-width:0;color:var(--muted);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;animation:none}.feedback-bar .fb-persistent.wrong{color:var(--wrong);font-weight:600}.feedback-bar .fb-persistent.ok{color:var(--hit)}.feedback-bar .stuck{color:#b26a00;font-weight:600}.feedback-bar .fb-keyslot{flex:0 0 auto;min-width:0;font-weight:600;line-height:1.2;color:var(--accent)}.feedback-bar .fb-keyslot[hidden]{display:none}.feedback-bar .fb-keyslot.wrong{color:var(--wrong)}.feedback-bar .fb-keyslot.stuck{color:#b26a00}.feedback-bar .session-controls{grid-column:2;justify-self:end;display:flex;gap:10px;flex-shrink:0}.feedback-bar .session-btn{font-size:16px;font-weight:600;padding:8px 22px;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text);cursor:pointer;transition:background .15s,border-color .15s,color .15s,transform .06s}.feedback-bar .session-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.feedback-bar .session-btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.feedback-bar .session-btn.primary:hover:not(:disabled){background:#0d47a1;border-color:#0d47a1;color:#fff}.feedback-bar .session-btn:active:not(:disabled){transform:scale(.96)}.feedback-bar .session-btn.icon-btn{padding:8px 12px;display:inline-flex;align-items:center;justify-content:center}.feedback-bar .session-btn.icon-btn svg{display:block}.feedback-bar .session-btn:disabled{opacity:.5;cursor:not-allowed}.feedback-bar .session-btn.primary:disabled{background:#a8c0da;border-color:#a8c0da;color:#fff}.feedback-bar .info{color:var(--accent);font-weight:600}.feedback-bar .ok{color:var(--hit);font-weight:600}@keyframes flash{0%{opacity:.2}to{opacity:1}}.score-container{flex:1;overflow:auto;scrollbar-gutter:stable;padding:12px;background:#fff;position:relative}.score-container::-webkit-scrollbar{width:10px;height:10px}.score-container::-webkit-scrollbar-thumb{background:#c9ccd6;border:2px solid #fff;border-radius:6px}.score-container::-webkit-scrollbar-thumb:hover{background:#a9adb9}.score-container::-webkit-scrollbar-track{background:transparent}.score-empty{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;color:var(--muted);pointer-events:none;user-select:none}.score-empty[hidden]{display:none}.score-empty-icon{font-size:56px;line-height:1;opacity:.55;margin-bottom:8px}.score-empty-title{margin:0;font-size:20px;font-weight:600;color:var(--text)}.score-empty-sub{margin:0;font-size:14px}.score-empty-hint{margin:10px 0 0;font-size:14px;color:var(--accent)}.score-canvas{width:100%;position:relative}.loop-range-layer{position:absolute;inset:0;pointer-events:none;z-index:0}.loop-range-band{position:absolute;background:var(--loop-bg);border-radius:4px}.score-canvas img[id^=cursorImg]{pointer-events:none}.score-container.drag-over{outline:2px dashed var(--accent);outline-offset:-6px;background:#eef4fc}.keyboard-hint{padding:6px 10px 10px;background:var(--panel);border-top:1px solid var(--border);user-select:none}.keyboard-hint .keys{position:relative;height:60px}.keyboard-hint .key{position:absolute;top:0;height:100%;touch-action:none;box-sizing:border-box;border:1px solid var(--border);border-radius:0 0 3px 3px;background:#fff;cursor:pointer;z-index:1;transition:background-color .06s ease-out,box-shadow .06s ease-out}.keyboard-hint .key.black{height:62%;background:#22252b;border-color:#22252b;border-radius:0 0 2px 2px;box-shadow:0 2px 2px #0006;z-index:2}.keyboard-hint .key.current{background:var(--accent);border-color:var(--accent)}.keyboard-hint .key.wrong{background:var(--wrong);border-color:var(--wrong)}.keyboard-hint .key.pressed{box-shadow:inset 0 3px 8px #00000059}.keyboard-hint .key.pressed.idle{background:#f9a825;border-color:#c9820a}.keyboard-hint .key.pressed.correct{background:var(--hit);border-color:var(--hit)}.keyboard-hint .key.pressed.wrong{background:var(--wrong);border-color:var(--wrong)}.keyboard-hint .key.c{border-bottom:3px solid var(--accent)}.keyboard-hint .label{font-size:12px;color:var(--muted);margin-bottom:4px}.app-footer{display:flex;justify-content:space-between;gap:12px;padding:4px 14px;background:var(--panel);border-top:1px solid var(--border);font-size:12px;color:var(--muted)}.app-footer b,.app-footer span{font-variant-numeric:tabular-nums}.app-footer span{margin-right:0}.note-legend{display:flex;align-items:center;gap:12px;white-space:nowrap}.legend-item{display:inline-flex;align-items:center;gap:4px;margin-right:0}.legend-item i{display:inline-block;width:12px;height:12px;border-radius:3px}.tb-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#0f172a73;z-index:1000}.tb-overlay[hidden]{display:none}.tb-countdown-circle{width:180px;height:180px;border-radius:50%;background:var(--panel);border:4px solid var(--accent);display:flex;align-items:center;justify-content:center;box-shadow:0 12px 40px #1565c040}.tb-countdown-circle.pop{animation:tb-pop 1s ease-out}.tb-countdown-num{font-size:84px;font-weight:700;color:var(--accent)}@keyframes tb-pop{0%{transform:scale(.6);opacity:.2}20%{transform:scale(1.05);opacity:1}to{transform:scale(1)}}.tb-score-card{background:var(--panel);border-radius:14px;padding:28px 36px;min-width:320px;text-align:center;box-shadow:0 16px 48px #00000040}.tb-score-card h2{margin:0 0 12px;font-size:18px}.tb-score-value{font-size:64px;font-weight:800;line-height:1.1}.tb-score-value.excellent{color:var(--hit)}.tb-score-value.ok{color:var(--accent)}.tb-score-value.poor{color:var(--wrong)}.tb-score-detail{color:var(--muted);font-size:13px;margin:10px 0 18px}.tb-score-card button{font:inherit;padding:8px 28px;border:none;border-radius:8px;background:var(--accent);color:#fff;cursor:pointer}.tb-score-card button:hover{opacity:.9}.tb-score-breakdown{list-style:none;margin:0 0 18px;padding:0;font-size:14px;color:var(--text)}.tb-score-breakdown li{display:flex;justify-content:space-between;gap:24px;padding:3px 0;border-bottom:1px dashed var(--border)}.tb-score-breakdown li.penalty{color:var(--wrong)}.tb-confirm-card{background:var(--panel);border-radius:14px;padding:24px 32px;width:min(400px,92vw);text-align:center;box-shadow:0 16px 48px #00000040}.tb-confirm-card h2{margin:0 0 10px;font-size:18px}.tb-confirm-message{color:var(--muted);font-size:14px;line-height:1.6;margin:0 0 20px}.tb-confirm-actions{display:flex;justify-content:center;gap:12px}.tb-confirm-actions button{font:inherit;padding:8px 24px;border:none;border-radius:8px;cursor:pointer}.tb-confirm-actions .tb-confirm-ok{background:var(--accent);color:#fff}.tb-confirm-actions .tb-confirm-cancel{background:var(--border);color:var(--text)}.tb-confirm-actions button:hover{opacity:.9}.tb-song-card{background:var(--panel);border-radius:14px;padding:22px 26px;width:min(440px,92vw);max-height:80vh;display:flex;flex-direction:column;box-shadow:0 16px 48px #00000040}.tb-song-card h2{margin:0 0 12px;font-size:18px}.tb-drawer-overlay{justify-content:flex-start;align-items:stretch}.tb-drawer{width:min(340px,86vw);height:100%;max-height:none;border-radius:0 14px 14px 0;padding:18px 18px 16px;transform:translate(-100%);transition:transform .18s ease-out}.tb-drawer-overlay.is-open .tb-drawer{transform:none}.tb-drawer .tb-playlist{min-height:0;max-height:none}.tb-drawer-footer{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px}.tb-drawer-entry{display:flex;align-items:center;gap:8px}.tb-drawer-footer>button{align-self:center}.tb-drawer-footer .icon-btn{align-self:center;padding:7px 11px;background:transparent;color:var(--text);border:1px solid var(--border);border-radius:6px;display:inline-flex;align-items:center;justify-content:center}.tb-drawer-footer .icon-btn:hover{opacity:1;border-color:var(--accent);color:var(--accent)}@media (prefers-reduced-motion: reduce){.tb-drawer{transition:none}}.tb-song-search{width:100%;box-sizing:border-box;margin-bottom:10px;padding:8px 10px;font:inherit;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text)}.tb-song-search:focus{outline:none;border-color:var(--accent)}.tb-tree{overflow:auto;padding:4px 2px;flex:1;min-height:280px;border:1px solid var(--border);border-radius:8px}.tb-tree-row{display:flex;align-items:center;gap:6px;padding:4px 6px;cursor:pointer;user-select:none}.tb-tree-row:hover{background:#7f7f7f1f}.tb-tree-toggle{width:14px;text-align:center;color:var(--muted);font-size:11px}.tb-tree-children{padding-left:16px}.tb-tree-file{padding:4px 6px 4px 26px;cursor:pointer;border-radius:6px;display:flex;align-items:center;gap:6px}.tb-tree-check{margin:0;flex:none;cursor:pointer}.tb-tree-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-song-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-top:10px}.tb-song-actions button{align-self:center}.tb-song-actions .tb-bulk-btn{background:transparent;color:var(--text);border:1px solid var(--border)}.tb-song-actions .tb-bulk-btn:disabled{opacity:.45;cursor:default}.tb-tree-file:hover{background:var(--accent);color:#fff}.tb-playlist{overflow:auto;padding:4px 2px;flex:1;min-height:200px;max-height:46vh;border:1px solid var(--border);border-radius:8px}.tb-playlist-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;cursor:pointer;user-select:none}.tb-playlist-item:hover{background:#7f7f7f1f}.tb-playlist-item.is-current{color:var(--accent);font-weight:600}.tb-playlist-kind{flex:0 0 auto;font-size:12px;color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:0 4px}.tb-playlist-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-playlist-current{flex:0 0 auto;font-size:12px;color:var(--accent)}.tb-playlist-remove{flex:0 0 auto;width:20px;height:20px;line-height:18px;text-align:center;border-radius:50%;color:var(--muted);cursor:pointer}.tb-playlist-remove:hover{background:#dc26261f;color:#dc2626}.tb-song-status{color:var(--muted);font-size:13px;margin:10px 0;min-height:18px}.tb-song-card button{align-self:flex-end;font:inherit;padding:8px 28px;border:none;border-radius:8px;background:var(--accent);color:#fff;cursor:pointer}.tb-song-card button:hover{opacity:.9}.score-options,.train-options{display:flex;gap:12px}.menu-panel .score-options,.menu-panel .train-options{flex-direction:column;gap:8px}.score-opt,.train-opt{display:inline-flex;align-items:center;gap:4px;font-size:13px;white-space:nowrap;cursor:pointer}.keyboard-hint .key .finger{position:absolute;left:0;right:0;bottom:1px;text-align:center;font-size:9px;line-height:1;font-weight:700;color:#5a6472;pointer-events:none}.keyboard-hint .key.black .finger{color:#cfd8e3}.score-container[hidden],.keyboard-hint[hidden],.feedback-bar[hidden],.game-workspace[hidden]{display:none}.game-workspace{display:flex;flex-direction:column;flex:1;min-height:0;background:#fff}.game-topbar{position:relative;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:6px 14px;border-bottom:1px solid var(--border);background:var(--panel)}.game-topbar-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}.tool-icon{font:inherit;font-size:18px;line-height:1;width:30px;height:30px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--muted);cursor:pointer}.tool-icon:hover{border-color:var(--accent);color:var(--accent)}.game-topbar-actions-left{display:flex;align-items:center;gap:8px;flex:0 0 auto}.tool-action{font:inherit;font-size:13px;line-height:1;height:30px;padding:0 12px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text);cursor:pointer}.tool-action:hover{border-color:var(--accent);color:var(--accent)}.tool-return{font:inherit;font-size:16px;line-height:1;width:30px;height:30px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--muted);cursor:pointer;flex:0 0 auto}.tool-return:hover{border-color:var(--wrong);color:var(--wrong)}.tool-settings-pop{position:absolute;top:calc(100% + 6px);right:8px;z-index:30;min-width:220px;padding:14px;background:#fff;border:1px solid var(--border);border-radius:8px;box-shadow:0 6px 24px #0000002e;display:flex;flex-direction:column;gap:12px}.tool-settings-pop[hidden]{display:none}.tool-settings{display:flex;flex-direction:column;gap:12px;font-size:14px;color:var(--text)}.ts-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.ts-row>span{white-space:nowrap}.ts-select{font:inherit;padding:4px 6px;border:1px solid var(--border);border-radius:6px;min-width:110px}.ts-check{display:inline-flex;align-items:center;gap:6px;cursor:pointer}.ts-groups{display:flex;flex-direction:column;gap:8px}.ts-groups-title{font-weight:600;color:var(--text)}.ts-groups-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px 14px}.game-title{font-weight:600;font-size:16px}.game-mount{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px}.tool-buttons{display:flex;flex-direction:column;gap:8px}.tool-buttons button{font:inherit;font-size:14px;padding:6px 10px;border:1px solid var(--border);border-radius:6px;background:#fff;color:var(--text);cursor:pointer;text-align:left}.tool-buttons button:hover{border-color:var(--accent);color:var(--accent)}.note-game-head{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:10px}.note-game-target{font-size:22px;font-weight:600;color:var(--accent)}.note-game-stat{font-size:14px;color:var(--muted)}.note-staff{width:100%;flex:1 1 auto;min-height:0}.staff-line,.staff-ledger{stroke:#333;stroke-width:1.4}.staff-ledger{stroke-width:1.2}.staff-bar{fill:#333}.staff-clef{font-size:64px;fill:#333}.staff-note{fill:var(--accent)}.staff-note.current{stroke:#111;stroke-width:2.5}.staff-note.done{fill:#9aa;opacity:.5}.staff-stem{stroke:var(--accent);stroke-width:2.5}.staff-acc{font-size:26px;fill:#333}.staff-ottava{stroke:#333;stroke-width:1.2;stroke-dasharray:5 3}.staff-ottava-label{font-style:italic;font-weight:600;font-size:18px;fill:#333}@media (max-width: 720px){.app-header{gap:8px;padding:6px 8px}#control-panel{gap:6px}.keyboard-hint{padding:4px 6px 6px}.keyboard-hint .keys{height:44px}.app-footer{flex-wrap:wrap;gap:4px 12px;padding:4px 8px}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
