.piano-page{--p-bg:#edf0e8;--p-surface:#fafbf4;--p-text:#213f38;--p-muted:#596b63;--p-border:#c2d0c4;--p-stage:#172724;--p-gold:#f1cd79;--p-mint:#8fddc2;--p-lilac:#c7abed;background:var(--p-bg);color:var(--p-text);margin:0;overflow:hidden;font-family:Arial,Helvetica,sans-serif}
html[data-theme="dark"] .piano-page{--p-bg:#172724;--p-surface:#20352e;--p-text:#f0f3e9;--p-muted:#b6c9ba;--p-border:#496355}
.piano-page *{box-sizing:border-box}.piano-page [hidden]{display:none!important}.piano-page button,.piano-page select,.piano-page input{font:inherit}.piano-page button{cursor:pointer}.piano-page button:disabled{opacity:.45;cursor:not-allowed}.piano-page :focus-visible{outline:3px solid #b68c2d;outline-offset:3px}.piano-page .top{width:100%;max-width:none;margin:0;min-height:70px;padding:12px 24px;border-bottom:1px solid var(--p-border);display:flex;align-items:center;justify-content:space-between;gap:14px;background:var(--p-surface)}.piano-top nav{display:flex;align-items:center;gap:7px}.piano-brand{display:flex;align-items:center;gap:18px}.piano-brand h1{font-size:18px;letter-spacing:-.03em;margin:0}.piano-page .brand{font-size:15px;color:var(--p-text)}.brand-divider{height:22px;width:1px;background:var(--p-border)}.icon-control{width:42px;height:42px;padding:9px;border:1px solid var(--p-border);border-radius:50%;background:transparent;color:var(--p-text);display:inline-flex;align-items:center;justify-content:center;flex:none;font-size:28px}.icon-control svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}.icon-control:hover{background:color-mix(in srgb,var(--p-border),transparent 70%)}.mic-status{font-size:11px;display:flex;align-items:center;gap:7px;margin-right:10px;color:var(--p-muted)}.mic-status i{width:7px;height:7px;border-radius:50%;background:#839085;flex:none}.mic-status[data-state="listening"] i{background:#4f997e;box-shadow:0 0 0 4px #62a78e20}.mic-status[data-state="calibrating"] i,.mic-status[data-state="starting"] i{background:#c69b3f}.piano-main{height:calc(100dvh - 70px);display:grid;grid-template-rows:minmax(240px,1fr) auto;position:relative}.practice-stage{position:relative;overflow:hidden;background:var(--p-stage);color:#f1f1e3;min-height:0}.practice-stage canvas{width:100%;height:100%;display:block}.stage-heading{position:absolute;top:22px;left:25px;right:25px;display:flex;justify-content:space-between;font-size:10px;font-weight:600;letter-spacing:.19em;color:#b8c9bd;pointer-events:none}.stage-heading span:last-child{border:1px solid #6a8171;border-radius:30px;padding:6px 10px;margin-top:-6px}.target-card{position:absolute;top:76px;left:25px;max-width:235px;display:grid;gap:8px;pointer-events:none}.target-card>span:first-child{font-size:9px;letter-spacing:.2em;color:#b8c9bd}.target-card strong{font-size:clamp(36px,6vw,76px);font-weight:500;line-height:1;letter-spacing:-.07em;color:var(--p-gold)}.target-card>span:nth-child(3){font-size:13px;color:#e1e8de}.note-tags{display:flex;flex-wrap:wrap;gap:6px}.note-tags span{border:1px solid #89987f60;border-radius:7px;font-size:11px;padding:6px 9px;background:#b3c3920a}.target-card .text-control{pointer-events:auto;justify-self:start;margin-top:7px;color:#c1d1c2;font-size:12px}.text-control{border:0;background:none;color:var(--p-muted);padding:9px 0;font-size:12px;text-decoration:underline;text-underline-offset:4px}.session-hud{position:absolute;right:25px;top:82px;display:grid;gap:23px;text-align:right;pointer-events:none}.session-hud div{display:grid;gap:5px}.session-hud strong{font-size:26px;line-height:1;font-weight:500;font-variant-numeric:tabular-nums;letter-spacing:-.04em}.session-hud span{font-size:8px;letter-spacing:.17em;color:#a5bcae}.hit-zone{position:absolute;bottom:15px;left:25px;right:25px;display:flex;justify-content:space-between;align-items:center;gap:10px;font-size:12px;color:#c3d4c6;min-height:18px}.hit-zone #feedback[data-kind="hit"]{color:var(--p-mint)}.hit-zone #feedback[data-kind="miss"]{color:var(--p-gold)}.hit-zone #time-left{color:#98ae9f;font-variant-numeric:tabular-nums}.idle-card{position:absolute;left:50%;top:48%;transform:translate(-50%,-50%);text-align:center;max-width:450px;width:90%;padding:25px}.idle-icon{color:var(--p-gold);font-size:38px}.idle-card h2{font-weight:500;font-size:clamp(27px,4vw,43px);letter-spacing:-.04em;margin:17px 0 12px}.idle-card p{color:#b7c9ba;font-size:14px;margin-bottom:25px}.primary-button,.secondary-button{min-height:46px;border:1px solid transparent;padding:13px 19px;border-radius:12px;font-weight:600;font-size:13px;display:inline-flex;gap:17px;align-items:center;justify-content:center}.primary-button{background:var(--p-gold);color:#293724}.primary-button:hover{background:#ffe1a0}.secondary-button{background:transparent;border-color:var(--p-border);color:var(--p-text)}.paused-banner{position:absolute;inset:auto 25% 25%;display:flex;flex-direction:column;align-items:center;gap:13px;z-index:2;padding:22px;background:#21372fee;border:1px solid #6c897a;border-radius:17px;box-shadow:0 14px 50px #0005}.paused-banner>span{font-size:10px;letter-spacing:.12em;color:#c5d4c7;text-align:center}.paused-banner .text-control{color:#bccab9}.piano-dock{background:var(--p-surface);padding:10px 24px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--p-border)}.detector-bar{display:flex;justify-content:space-between;align-items:center;gap:15px;margin-bottom:12px;min-height:35px}.heard{display:flex;gap:14px;align-items:center;min-width:0}.heard strong{font-size:13px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:50vw}.dock-label{font-size:8px;letter-spacing:.15em;color:var(--p-muted);flex:none}.signal{display:flex;align-items:center;gap:10px;margin-left:auto}.signal span{font-size:8px;letter-spacing:.06em;color:var(--p-muted)}.signal meter{width:65px;height:5px}.detector-bar>.text-control{white-space:nowrap}.keyboard-scroll{overflow-x:auto;padding-bottom:4px;scrollbar-width:thin;scrollbar-color:var(--p-border) transparent}.keyboard{position:relative;display:flex;height:100px;min-width:780px;user-select:none;touch-action:pan-x;gap:2px}.piano-key{position:relative;min-width:0;flex:1;border:1px solid #c3cab9;border-radius:0 0 6px 6px;background:#f5f6e9;color:#52614e;font-size:9px;display:flex;align-items:flex-end;justify-content:center;padding:5px 0 8px;touch-action:none;-webkit-user-select:none;user-select:none}.piano-key .key-shortcut{position:absolute;bottom:23px;font-size:8px;opacity:.5}.piano-key.black{position:absolute;top:0;width:2.08%;height:60%;background:#203a30;border:1px solid #1b2c24;color:#d4dece;z-index:2;padding-bottom:9px;border-radius:0 0 5px 5px;box-shadow:0 4px 0 #13241d}.piano-key.target{background:#f0d58e;border-color:#9d873f;box-shadow:inset 0 -4px #cead66}.piano-key.black.target{background:#b3944b;color:#fff5d8;box-shadow:0 4px 0 #7b682b}.piano-key.heard{background:#a9dbbf;border-color:#448669;box-shadow:inset 0 -4px #68a68c}.piano-key.black.heard{background:#458c73;box-shadow:0 4px 0 #2b6e54;color:#f2fff4}.piano-key.target.heard{background:#c8df94;box-shadow:inset 0 -4px #90ab64}.piano-key[aria-pressed="true"]{filter:brightness(.85)}.keyboard-legend{display:flex;align-items:center;gap:18px;font-size:9px;color:var(--p-muted);padding:7px 0 0}.keyboard-legend>span{display:flex;align-items:center;gap:5px}.keyboard-legend>span:last-child{margin-left:auto;text-align:right}.keyboard-legend i{width:7px;height:7px;border-radius:50%}.target-dot{background:#d1aa52}.heard-dot{background:#5aa988}.screen-notice{position:absolute;bottom:210px;left:50%;transform:translateX(-50%);margin:0;max-width:calc(100% - 35px);color:#e1ecd8;background:#294334;border:1px solid #547761;border-radius:10px;padding:10px 16px;font-size:12px;z-index:4}.screen-notice:empty{display:none}.piano-dialog{background:var(--p-surface);color:var(--p-text);border:1px solid var(--p-border);border-radius:22px;padding:25px;width:min(535px,calc(100vw - 30px));max-height:calc(100dvh - 36px);overflow:auto;box-shadow:0 25px 100px #0004}.piano-dialog::backdrop{background:#0c211cb0;backdrop-filter:blur(7px)}.dialog-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:23px}.dialog-heading h2{font-size:25px;font-weight:500;letter-spacing:-.035em;line-height:1.2;margin:7px 0 0}.dialog-heading .eyebrow{font-size:9px;letter-spacing:.15em;color:var(--p-muted)}.mode-picker{border:0;padding:0;margin:0 0 20px;display:grid;grid-template-columns:1fr 1fr;gap:9px}.mode-picker legend{font-size:11px;color:var(--p-muted);margin-bottom:8px}.mode-picker label{display:block;cursor:pointer}.mode-picker input{position:absolute;width:1px;height:1px;opacity:0}.mode-picker label>span{display:flex;flex-direction:column;gap:6px;border:1px solid var(--p-border);border-radius:12px;padding:14px 13px;min-height:73px}.mode-picker input:checked+span{border-color:#759785;background:#85b39b24;box-shadow:0 0 0 1px #759785}.mode-picker input:focus-visible+span{outline:3px solid #b68c2d;outline-offset:3px}.mode-picker b{font-size:12px;font-weight:600}.mode-picker small{font-size:10px;color:var(--p-muted)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px;margin:0 0 16px}.form-grid>label{display:grid;gap:7px;font-size:11px;color:var(--p-muted)}.piano-page select{width:100%;min-width:0;min-height:44px;border:1px solid var(--p-border);background:var(--p-surface);color:var(--p-text);border-radius:9px;padding:9px 25px 9px 10px;font-size:12px}.speed-label{display:grid;gap:9px;font-size:11px;color:var(--p-muted);margin-bottom:18px}.speed-label>span{display:flex;justify-content:space-between}.speed-label output{color:var(--p-text);font-variant-numeric:tabular-nums}.piano-page input[type="range"]{width:100%;accent-color:#5b8b72}.check-label{display:flex;align-items:center;gap:10px;font-size:12px;margin:12px 0 19px}.check-label input{width:18px;height:18px;accent-color:#5b8b72;flex:none}.check-label>span{display:grid;gap:4px}.check-label small{font-size:10px;color:var(--p-muted)}.progress-note{font-size:11px;color:var(--p-muted);line-height:1.5}.start-actions{display:grid;gap:9px;margin-top:17px}.start-status{font-size:12px;color:var(--p-muted);line-height:1.5}.start-status:empty{display:none}.technical-note{border-top:1px solid var(--p-border);margin-top:20px;padding-top:13px;font-size:11px;line-height:1.65;color:var(--p-muted)}.technical-note summary{cursor:pointer;color:var(--p-text)}.technical-note a{color:inherit}.diagram-dialog{width:min(750px,calc(100vw - 30px))}.diagram-dialog>p{font-size:13px;color:var(--p-muted);line-height:1.6}.diagram-keyboard{position:relative;height:135px;display:flex;gap:2px;margin:22px 0}.diagram-keyboard .piano-key{font-size:10px;pointer-events:none}.diagram-keyboard .piano-key.black{width:4%;height:60%}.diagram-dialog .note-tags{color:var(--p-text)}.diagram-note{font-size:11px!important}.diagram-dialog>.primary-button{margin-top:15px;width:100%}.result-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:15px;margin:28px 0}.result-stats>div{display:grid;gap:7px}.result-stats strong{font-size:38px;font-weight:500;letter-spacing:-.05em}.result-stats span{font-size:12px;color:var(--p-muted)}.results-dialog>p{font-size:13px;color:var(--p-muted);line-height:1.6}.results-dialog>.primary-button{width:100%;margin-top:15px}.piano-page .tools-install-control,.piano-page .tools-theme-control{width:42px;height:42px;min-width:42px;min-height:42px;margin:0;border-color:var(--p-border);background:transparent;color:var(--p-text)}
@media(min-width:1300px){.target-card{left:35px;top:85px}.session-hud{right:35px}.keyboard{height:115px}.piano-dock{padding-left:30px;padding-right:30px}}
@media(max-width:720px){.piano-page .top{padding:9px 12px;min-height:61px;gap:7px}.piano-top nav{gap:4px}.piano-brand{gap:9px}.piano-page .brand{font-size:11px}.piano-page .brand span,.brand-divider{display:none}.piano-brand h1{font-size:14px}.icon-control,.piano-page .tools-install-control,.piano-page .tools-theme-control{width:35px;height:35px;min-width:35px;min-height:35px;padding:7px}.mic-status{margin:0 4px 0 0}.mic-status span{display:none}.piano-main{height:calc(100dvh - 61px)}.stage-heading{top:17px;left:15px;right:15px;font-size:8px}.target-card{top:61px;left:15px;max-width:155px;gap:6px}.target-card strong{font-size:42px}.target-card>span:nth-child(3){font-size:11px}.target-card .note-tags{max-width:150px}.target-card .note-tags span{padding:4px 6px;font-size:9px}.target-card .text-control{font-size:10px}.session-hud{top:67px;right:15px;gap:18px}.session-hud strong{font-size:21px}.session-hud span{font-size:7px}.piano-dock{padding:7px 12px calc(7px + env(safe-area-inset-bottom))}.detector-bar{gap:6px;margin-bottom:7px}.heard{display:grid;gap:4px}.heard strong{font-size:11px;max-width:44vw}.signal{display:grid;gap:4px}.signal span{font-size:7px}.signal meter{width:50px}.detector-bar>.text-control{font-size:10px}.keyboard{height:100px;min-width:650px}.keyboard-legend{gap:10px;font-size:8px}.keyboard-legend>span:last-child{max-width:45vw;line-height:1.5}.hit-zone{left:15px;right:15px;bottom:12px;font-size:10px}.paused-banner{inset:auto 14px 24%;padding:18px}.paused-banner>span{font-size:9px}.piano-dialog{padding:21px 18px;border-radius:17px}.dialog-heading h2{font-size:23px}.screen-notice{bottom:185px;font-size:11px}.diagram-keyboard{height:108px}}
@media(max-height:600px) and (min-width:721px){.piano-main{grid-template-rows:minmax(175px,1fr) auto}.piano-dock{padding-top:5px;padding-bottom:5px}.keyboard{height:77px}.keyboard-legend{padding-top:4px}.target-card{top:48px}.target-card strong{font-size:36px}.session-hud{top:55px;gap:13px}.target-card .note-tags,.target-card .text-control{display:none}.hit-zone{bottom:9px}}
@media(prefers-reduced-motion:reduce){.piano-page *{scroll-behavior:auto!important;transition:none!important}.piano-dialog::backdrop{backdrop-filter:none}}
/* Keep intrinsic keyboard/canvas widths inside the full-screen grid, not the viewport. */
.piano-main{width:100%;min-width:0;grid-template-columns:minmax(0,1fr)}
.practice-stage,.piano-dock,.keyboard-scroll{min-width:0;max-width:100%}
.piano-page .top{flex-wrap:nowrap}
.piano-page .top nav{width:auto;flex:none;flex-wrap:nowrap}
@media(max-width:720px){
  .piano-page .top{min-height:64px}
  .piano-main{height:calc(100dvh - 64px)}
  .piano-page .top nav{gap:3px}
  .piano-brand{gap:7px;flex:none}
  .piano-brand h1{font-size:13px}
  .icon-control,.piano-page .tools-install-control,.piano-page .tools-theme-control{width:44px;height:44px;min-width:44px;min-height:44px;padding:10px}
}
@media(max-width:380px){.piano-brand .brand{display:none}}
