:root{--ink:#171714;--paper:#d7d7d7;--accent:#8b4f36;--accent-soft:#eadbd2;--gold:#c47d52;--muted:#6c6963;--good:#386d51;--bad:#9b423a}
*{box-sizing:border-box}
body{margin:0;min-height:100vh;background:var(--paper);color:var(--ink);font-family:Arial,Helvetica,sans-serif}
button{font:inherit}
.app{width:min(1180px,100%);margin:auto;padding:24px clamp(16px,4vw,50px) 36px}
header{display:flex;align-items:center;gap:12px;margin-bottom:18px}
.back{color:var(--muted);font-size:.72rem;letter-spacing:.1em;text-decoration:none;text-transform:uppercase;border-bottom:1px solid #aaa;padding-bottom:3px}
.back:hover,.back:focus-visible{color:var(--accent);border-color:var(--accent)}
.counter{margin-left:auto;color:var(--muted);font-size:.9rem}
.round-button{position:relative;z-index:70;width:38px;height:32px;border:1px solid #aaa;border-radius:16px;background:rgba(215,215,215,.58);color:var(--accent);font-size:1.2rem;line-height:1;cursor:pointer}
.round-button:hover,.round-button:focus-visible{background:var(--accent-soft);border-color:var(--accent)}
.progress{height:3px;background:#bbb8b1;margin-bottom:20px}
.progress span{display:block;height:100%;width:0;background:var(--accent);transition:width .35s}
.overview{position:relative;padding:50px 0 30px;max-height:250px;overflow:hidden;cursor:pointer;contain:layout paint}.overview:focus-visible{outline:4px solid var(--accent);outline-offset:8px}.overview.gone{display:none}.overview-scroll{overflow-x:auto;padding:10px 0 24px}.full-piano{position:relative;height:128px;display:flex;min-width:880px;margin:auto;box-shadow:0 10px 28px rgba(23,23,20,.12);transform:translateZ(0)}.full-white{height:128px;flex:1;background:#fff;border:1px solid #9ba0a4;border-right:0}.full-white:last-child{border-right:1px solid #9ba0a4}.full-black{position:absolute;top:0;width:1.45%;height:78px;background:var(--ink);z-index:2;transform:translateX(-50%)}.play-symbol{position:absolute;left:50%;top:50%;z-index:5;transform:translate(-50%,-50%);width:68px;height:68px;border-radius:50%;background:var(--accent);color:#fff;display:grid;place-items:center;font-size:2rem;box-shadow:0 8px 24px rgba(23,23,20,.3);padding-left:5px}.keyboard-flight{position:fixed;inset:0;z-index:50;background:var(--paper);overflow:hidden;pointer-events:none;will-change:opacity}.keyboard-flight .full-piano{position:absolute;margin:0;transform:none;will-change:left,top,width,height}.keyboard-flight .full-white{height:100%}.keyboard-flight .full-black{height:61%}.keyboard-flight .full-white.zoom-key{background:var(--accent-soft);box-shadow:inset 0 -9px 0 var(--gold)}.zoom{visibility:hidden;pointer-events:none}.zoom.ready{visibility:visible;pointer-events:auto}
.instruction{display:none}
.phase-intro{display:grid;position:fixed;inset:0;z-index:60;background:rgba(215,215,215,.68);backdrop-filter:blur(3px);place-items:center;padding:24px;text-align:center;opacity:0;visibility:hidden;pointer-events:none;transition:opacity 1.2s ease,visibility 0s linear 1.2s}.phase-intro.show{opacity:1;visibility:visible;pointer-events:auto;transition:opacity 1.2s ease}.phase-intro>div{max-width:700px}.phase-intro h2{font:400 clamp(1.8rem,4vw,3rem) Georgia,serif;line-height:1.22;margin:0 0 30px}.phase-intro #introGo{width:58px;height:58px;border:0;border-radius:50%;background:var(--accent);color:#fff;font-size:1.65rem;padding-left:5px;cursor:pointer;box-shadow:0 8px 24px rgba(23,23,20,.22)}
.difficulty{display:flex;justify-content:center;align-items:center;gap:8px;flex-wrap:wrap;margin:14px 0 4px}
.difficulty[hidden]{display:none}
.difficulty span{font-size:.78rem;color:var(--muted);letter-spacing:.08em;text-transform:uppercase}
.difficulty button{border:1px solid #aaa;background:transparent;color:var(--ink);padding:8px 13px;border-radius:18px;cursor:pointer}
.difficulty button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:#fff}
.staff-wrap{max-width:930px;margin:2px auto 0;overflow:hidden;min-height:250px}
.staff{display:block;width:100%;height:auto;overflow:visible}
.staff line{stroke:var(--ink)}
.note-choice{cursor:pointer}
.note-choice .halo{fill:transparent}
.note-choice:hover .halo,.note-choice:focus .halo{fill:var(--accent-soft)}
.note-choice.correct .note-head{fill:var(--good)}
.note-choice.wrong .note-head{fill:var(--bad)}
.note-head{fill:var(--ink)}
.note-name{opacity:0;fill:var(--ink);stroke:rgba(247,245,240,.96);stroke-width:5px;paint-order:stroke fill;font:700 17px Georgia,serif;pointer-events:none}.note-choice.show-name .note-name{opacity:1}.note-choice.correct .note-name{fill:var(--good)}.note-choice.wrong .note-name{fill:var(--bad)}
.keyboard-scroll{overflow-x:auto;padding:8px 2px 17px}
.keyboard{--keys:15;position:relative;display:flex;width:max(760px,calc(var(--keys) * 47px));height:205px;margin:auto;filter:drop-shadow(0 13px 15px rgba(23,23,20,.13));user-select:none}
.keyboard.wide-range{width:100%;min-width:0}
.key{position:relative;flex:1 0 0;height:205px;background:#faf9f5;border:1px solid #77746e;border-right:0;padding:0;cursor:pointer;transition:background .16s,transform .16s}
.key:last-of-type{border-right:1px solid #77746e}
.key.context{background:#efeee9;cursor:default;opacity:.72}
.key span{position:absolute;bottom:13px;left:50%;transform:translateX(-50%) translateY(12px);font:400 1.1rem Georgia,serif;opacity:0;transition:opacity .2s,transform .25s}
.key.orient span{opacity:1;transform:translateX(-50%) translateY(0)}
.key.source,.key.orient{background:var(--accent-soft)}
body[data-game="bass"] .key.source,body[data-game="bass"] .key.orient{box-shadow:inset 0 -9px 0 var(--accent)}
.key.correct{background:#dbe9df}.key.wrong{background:#edd9d6}
.key.show-name span{opacity:1;transform:translateX(-50%) translateY(0)}
.key:focus-visible{outline:4px solid var(--accent);outline-offset:-5px;z-index:5}
.black{position:absolute;top:0;width:calc(62% / var(--keys));height:126px;background:var(--ink);z-index:3;transform:translateX(-50%);pointer-events:none;border:1px solid #000}
.choices{min-height:62px;display:flex;justify-content:center;gap:9px;flex-wrap:wrap;margin:12px auto 0}
.choice{min-width:72px;border:2px solid #aaa;border-radius:10px;background:rgba(255,255,255,.52);color:var(--ink);font:400 1.35rem Georgia,serif;padding:10px 13px;cursor:pointer}
.choice.source{color:#fff;border-color:var(--accent);background:var(--accent)}
.choice.correct{color:var(--good);border-color:var(--good);background:#dbe9df}
.choice.wrong{color:var(--bad);border-color:var(--bad);background:#edd9d6}
.controls{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:10px}
.start{border:0;background:var(--ink);color:#f6f2e9;padding:14px 24px;font-size:.75rem;font-weight:bold;letter-spacing:.14em;text-transform:uppercase;cursor:pointer}
.sound{width:46px;height:46px;border:0;border-radius:50%;background:var(--accent);color:#fff;font-size:1.25rem;cursor:pointer}
.message{text-align:center;min-height:26px;margin-top:10px;font:1rem/1.4 Georgia,serif;color:var(--muted)}
.message.good{color:var(--good)}.message.bad{color:var(--bad)}
.complete{text-align:center;padding:25px 0}.complete strong{display:block;font:400 3rem Georgia,serif;color:var(--good)}
@media(max-width:650px){.app{padding:16px 12px 28px}.intro{min-height:118px}.staff-wrap{min-height:205px}.keyboard{height:180px}.key{height:180px}.black{height:110px}.choice{min-width:60px;padding:9px}.counter{display:none}.full-piano{min-width:720px;height:105px}.full-white{height:105px}.full-black{height:65px}}
@media(prefers-reduced-motion:reduce){*{transition-duration:.01ms!important;animation-duration:.01ms!important}}
