:root{--accent: #34c759;--accent-press: #2aa74a;--info: #0a84ff;--warn: #ff9f0a;--danger: #ff453a;--gold: #ffd60a;--radius-sm: 10px;--radius: 16px;--radius-lg: 22px;--radius-xl: 28px;--ease-out: cubic-bezier(.22, .61, .36, 1);--ease-spring: cubic-bezier(.34, 1.36, .64, 1);--dur-fast: .12s;--dur: .26s;--tap-scale: .97}:root,[data-theme=light]{--bg: #f5f5f7;--bg-elevated: #ffffff;--bg-sunken: #ebebef;--surface: rgba(255, 255, 255, .72);--surface-strong: rgba(255, 255, 255, .92);--chrome: rgba(250, 250, 252, .72);--text: #1c1c1e;--text-secondary: #55555c;--text-tertiary: #8e8e93;--separator: rgba(60, 60, 67, .12);--separator-strong: rgba(60, 60, 67, .22);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .06), 0 0 0 .5px rgba(0, 0, 0, .04);--shadow: 0 4px 16px rgba(0, 0, 0, .08), 0 0 0 .5px rgba(0, 0, 0, .04);--shadow-lg: 0 16px 48px rgba(0, 0, 0, .14), 0 0 0 .5px rgba(0, 0, 0, .05);--key-white: #ffffff;--key-white-edge: rgba(0, 0, 0, .14);--key-black: #2c2c2e;--staff-ink: #48484a}[data-theme=dark]{--bg: #000000;--bg-elevated: #1c1c1e;--bg-sunken: #0a0a0c;--surface: rgba(28, 28, 30, .72);--surface-strong: rgba(38, 38, 42, .92);--chrome: rgba(20, 20, 22, .72);--text: #f5f5f7;--text-secondary: #a1a1a8;--text-tertiary: #6e6e76;--separator: rgba(255, 255, 255, .1);--separator-strong: rgba(255, 255, 255, .18);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .5);--shadow: 0 6px 20px rgba(0, 0, 0, .55);--shadow-lg: 0 20px 56px rgba(0, 0, 0, .7);--key-white: #e8e8ec;--key-white-edge: rgba(0, 0, 0, .5);--key-black: #18181a;--staff-ink: #9a9aa2}*{box-sizing:border-box}html{transition:background-color var(--dur) var(--ease-out)}body{margin:0;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,system-ui,Inter,Helvetica Neue,sans-serif;font-size:1rem;line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;transition:background-color var(--dur) var(--ease-out),color var(--dur) var(--ease-out)}h1,h2,h3{margin:0;font-weight:700;letter-spacing:-.02em;line-height:1.15}h1{font-size:clamp(1.75rem,4vw,2.25rem)}h2{font-size:clamp(1.25rem,3vw,1.5rem)}h3{font-size:1.05rem;letter-spacing:-.01em}p{margin:0}button{font-family:inherit;color:inherit}:focus-visible{outline:2.5px solid var(--info);outline-offset:3px;border-radius:6px}.app{min-height:100vh;display:flex;flex-direction:column}.topbar{position:sticky;top:0;z-index:20;background:var(--chrome);backdrop-filter:blur(22px) saturate(180%);-webkit-backdrop-filter:blur(22px) saturate(180%);border-bottom:.5px solid var(--separator)}.topbar-inner{max-width:640px;margin:0 auto;padding:10px 16px;display:flex;align-items:center;justify-content:space-between;gap:12px}.brand{display:flex;align-items:center;gap:8px;min-width:0}.brand-mark{font-size:1.25rem}.brand-name{font-weight:650;letter-spacing:-.015em;font-size:1.0625rem}.topbar-stats{display:flex;align-items:center;gap:8px}.xp-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border-radius:999px;background:var(--bg-sunken);font-size:.8125rem;font-weight:600;letter-spacing:.01em;color:var(--text-secondary);white-space:nowrap}.xp-chip strong{color:var(--text);font-weight:700}.sync-dot{width:6px;height:6px;border-radius:50%;background:var(--text-tertiary)}.sync-dot.is-saving{background:var(--info);animation:pulse-soft 1.2s ease-in-out infinite}.sync-dot.is-error{background:var(--danger)}@keyframes pulse-soft{0%,to{opacity:.35}50%{opacity:1}}.icon-btn{width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:12px;background:var(--bg-sunken);font-size:1rem;cursor:pointer;transition:transform var(--dur-fast) var(--ease-out),background var(--dur-fast) var(--ease-out)}.icon-btn:hover{background:var(--separator)}.icon-btn:active{transform:scale(var(--tap-scale))}.icon-btn.is-connected{background:color-mix(in srgb,var(--accent) 18%,transparent);color:var(--accent)}.account-btn{font-weight:700;font-size:.875rem}.app-main{flex:1;display:flex;justify-content:center;padding:24px 16px calc(64px + env(safe-area-inset-bottom))}.lesson-map{width:100%;max-width:520px}.unit-block{margin-bottom:40px}.unit-header{position:sticky;top:60px;z-index:5;display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:8px 4px;margin-bottom:18px;background:linear-gradient(to bottom,var(--bg) 60%,transparent)}.unit-title{font-size:.8125rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.unit-count{font-size:.8125rem;font-weight:600;color:var(--text-tertiary);font-variant-numeric:tabular-nums}.unit-path{display:flex;flex-direction:column;gap:18px}.lesson-row{display:flex;align-items:center;gap:16px;width:100%}.lesson-row.align-left{justify-content:flex-start}.lesson-row.align-right{flex-direction:row-reverse;justify-content:flex-end;text-align:right}.lesson-node{position:relative;width:68px;height:68px;flex-shrink:0;border:none;border-radius:24px;background:var(--bg-elevated);box-shadow:var(--shadow);font-size:1.75rem;cursor:pointer;display:grid;place-items:center;transition:transform var(--dur-fast) var(--ease-out),box-shadow var(--dur) var(--ease-out)}.lesson-node:active{transform:scale(.94)}.lesson-node:hover:not(:disabled){box-shadow:var(--shadow-lg)}.lesson-node.is-completed{background:linear-gradient(160deg,color-mix(in srgb,var(--accent) 22%,var(--bg-elevated)),var(--bg-elevated))}.lesson-node.is-boss{width:78px;height:78px;border-radius:28px;font-size:2rem}.lesson-node.is-locked{background:var(--bg-sunken);box-shadow:none;cursor:not-allowed;opacity:.6;font-size:1.25rem}.lesson-node.is-next{box-shadow:var(--shadow),0 0 0 3px color-mix(in srgb,var(--accent) 55%,transparent)}.lesson-pulse{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;border-radius:28px;border:2px solid var(--accent);opacity:0;animation:halo 2.4s var(--ease-out) infinite;pointer-events:none}@keyframes halo{0%{opacity:.5;transform:scale(1)}70%{opacity:0;transform:scale(1.18)}to{opacity:0;transform:scale(1.18)}}.lesson-label{display:flex;flex-direction:column;gap:2px;min-width:0}.lesson-title{font-weight:600;font-size:.9375rem;letter-spacing:-.01em}.lesson-stars{color:var(--gold);font-size:.8125rem;letter-spacing:2px}.lesson-hint-next{font-size:.8125rem;font-weight:600;color:var(--accent)}.exercise-screen{width:100%;max-width:600px;display:flex;flex-direction:column;align-items:center;gap:20px}.exercise-progress{width:100%;display:flex;align-items:center;gap:14px}.progress-bar{flex:1;height:10px;border-radius:999px;background:var(--bg-sunken);overflow:hidden}.progress-bar-fill{height:100%;border-radius:999px;background:var(--accent);transition:width var(--dur) var(--ease-out)}.card,.exercise-card{width:100%;background:var(--bg-elevated);border-radius:var(--radius-xl);box-shadow:var(--shadow);padding:28px 22px;display:flex;flex-direction:column;align-items:center;gap:18px;text-align:center}.lead{color:var(--text-secondary);max-width:40ch}.exercise-prompt{font-size:1.1875rem;font-weight:650;letter-spacing:-.015em;line-height:1.3;max-width:32ch}.note-target-name{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;color:var(--info)}.lyrics{font-size:.875rem;color:var(--text-secondary);font-style:italic}.hint{font-size:.8125rem;color:var(--text-tertiary)}.success-text{color:var(--accent);font-weight:650}.warning{color:var(--danger);font-weight:600;font-size:.875rem}.missed-label{color:var(--danger);font-weight:700;margin:0}.chord-label{font-size:1.375rem;font-weight:700;letter-spacing:-.02em;color:var(--info)}.celebration-icon{font-size:3.5rem;animation:pop-in .52s var(--ease-spring)}@keyframes pop-in{0%{transform:scale(.4);opacity:0}to{transform:scale(1);opacity:1}}.stars-earned{font-size:2.25rem;color:var(--gold);letter-spacing:6px}.xp-gain{font-size:1.125rem;font-weight:650;color:var(--accent)}.btn{border:none;border-radius:14px;padding:13px 22px;font-size:1rem;font-weight:650;letter-spacing:-.01em;cursor:pointer;transition:transform var(--dur-fast) var(--ease-out),background var(--dur-fast) var(--ease-out),opacity var(--dur-fast) var(--ease-out)}.btn:active:not(:disabled){transform:scale(var(--tap-scale))}.btn:disabled{opacity:.45;cursor:default}.btn-block{width:100%}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover:not(:disabled){background:var(--accent-press)}.btn-secondary{background:var(--bg-sunken);color:var(--text)}.btn-secondary:hover:not(:disabled){background:var(--separator)}.btn-quiet{background:transparent;color:var(--info)}.btn-quiet:hover:not(:disabled){background:color-mix(in srgb,var(--info) 10%,transparent)}.btn-ghost{background:transparent;color:var(--info);box-shadow:inset 0 0 0 1.5px var(--separator-strong)}.preview-btn{align-self:center}.choice-row{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}.segmented{display:flex;padding:3px;gap:3px;border-radius:12px;background:var(--bg-sunken)}.segmented button{flex:1;border:none;border-radius:9px;padding:9px 12px;background:transparent;font-size:.9375rem;font-weight:600;cursor:pointer;color:var(--text-secondary);transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out)}.segmented button.is-active{background:var(--bg-elevated);color:var(--text);box-shadow:var(--shadow-sm)}.segmented button:disabled{opacity:.4;cursor:not-allowed}.staff{max-width:100%;height:auto;overflow:visible}.staff-line,.ledger-line{stroke:var(--staff-ink);stroke-width:1.25;opacity:.55}.clef{font-size:56px;fill:var(--text);font-family:serif}.clef-bass{font-size:44px}.now-line{stroke:var(--accent);stroke-width:2;opacity:.7}.note-block{stroke:#00000029;stroke-width:1;transition:opacity var(--dur-fast) var(--ease-out)}.note-block.is-active{stroke:var(--text);stroke-width:2.5}.note-block.is-correct{stroke:var(--accent);stroke-width:2.5}.note-block.is-wrong{stroke:var(--danger);stroke-width:2.5}.note-block.is-rest{fill:var(--bg-sunken);stroke:var(--separator-strong);stroke-dasharray:3 3}.note-block-label{font-size:13px;font-weight:700;fill:#1c1c1e;pointer-events:none;-webkit-user-select:none;user-select:none}.rest-label{fill:var(--text-tertiary);font-size:15px}.hand-label{font-size:10px;font-weight:700;fill:var(--text-tertiary);text-transform:uppercase;letter-spacing:.08em}.grand-staff{max-width:100%}.piano{position:relative;width:100%;max-width:560px;height:210px;-webkit-user-select:none;user-select:none;touch-action:none;filter:drop-shadow(0 8px 20px rgba(0,0,0,.16))}.piano-white-row{display:flex;width:100%;height:100%}.piano-black-row{position:absolute;inset:0 0 auto 0;height:60%;pointer-events:none}.key{border:none;padding:0;position:relative;cursor:pointer;transition:background var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}.key-white{height:100%;background:var(--key-white);box-shadow:inset -1px 0 0 var(--key-white-edge),inset 0 -1px 0 var(--key-white-edge);border-radius:0 0 9px 9px;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:9px;padding-bottom:11px}.key-white:first-child{border-top-left-radius:4px}.key-white.is-pressed{background:color-mix(in srgb,var(--info) 26%,var(--key-white))}.key-white.is-target{box-shadow:inset 0 0 0 3px var(--gold),inset -1px 0 0 var(--key-white-edge)}.key-white.is-correct{background:color-mix(in srgb,var(--accent) 34%,var(--key-white))}.key-white.is-wrong{background:color-mix(in srgb,var(--danger) 34%,var(--key-white))}.key-label{font-size:1rem;font-weight:700;letter-spacing:-.01em;color:#3a3a3c;pointer-events:none}.key-color-bar{display:block;width:66%;height:7px;border-radius:999px;background:var(--key-color, transparent);pointer-events:none}.key-black{position:absolute;height:100%;background:linear-gradient(180deg,#3a3a3c,var(--key-black));border-radius:0 0 6px 6px;box-shadow:0 3px 6px #0006;pointer-events:all;z-index:2}.key-black.is-pressed{background:var(--info)}.key-black.is-target{box-shadow:inset 0 0 0 3px var(--gold)}.key-black.is-correct{background:var(--accent)}.key-black.is-wrong{background:var(--danger)}.metronome-row{display:flex;align-items:center;gap:10px}.metronome-dot{width:18px;height:18px;border-radius:50%;background:var(--bg-sunken);box-shadow:inset 0 0 0 1.5px var(--separator-strong);transition:transform 70ms var(--ease-out),background 70ms var(--ease-out)}.metronome-dot.is-pulsing{background:var(--gold);transform:scale(1.35);box-shadow:none}.metronome-dot.is-pulsing-sub{background:var(--info);transform:scale(1.12);box-shadow:none}.sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:flex;align-items:flex-end;justify-content:center;padding:0;background:#0006;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);animation:fade-in var(--dur) var(--ease-out)}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.sheet{width:100%;max-width:460px;max-height:88vh;overflow-y:auto;background:var(--surface-strong);backdrop-filter:blur(30px) saturate(180%);-webkit-backdrop-filter:blur(30px) saturate(180%);border-radius:var(--radius-xl) var(--radius-xl) 0 0;box-shadow:var(--shadow-lg);padding:12px 22px calc(28px + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:14px;animation:sheet-up .34s var(--ease-spring)}@keyframes sheet-up{0%{transform:translateY(28px) scale(.98);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.sheet-grabber{width:38px;height:5px;border-radius:999px;background:var(--separator-strong);align-self:center;margin-bottom:6px}.sheet-lead{color:var(--text-secondary);font-size:.9375rem}.sheet-actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}.sheet hr{border:none;border-top:.5px solid var(--separator);width:100%;margin:2px 0}.badge{display:inline-block;margin-left:8px;padding:2px 8px;border-radius:999px;background:color-mix(in srgb,var(--info) 18%,transparent);color:var(--info);font-size:.75rem;font-weight:700}.stat-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.stat-tile{display:flex;flex-direction:column;gap:2px;padding:14px;border-radius:var(--radius);background:var(--bg-sunken)}.stat-value{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;font-variant-numeric:tabular-nums}.stat-label{font-size:.75rem;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.05em}.admin-box{display:flex;flex-direction:column;gap:10px;padding:16px;border-radius:var(--radius);background:color-mix(in srgb,var(--info) 8%,transparent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--info) 22%,transparent)}.status-line{display:flex;align-items:center;gap:8px;font-size:.875rem;color:var(--text-secondary)}.status-dot{width:8px;height:8px;border-radius:50%;background:var(--text-tertiary)}.status-line.is-ok{color:var(--accent)}.status-line.is-ok .status-dot{background:var(--accent)}.field{display:flex;flex-direction:column;gap:6px;text-align:left}.field>span{font-size:.8125rem;font-weight:600;color:var(--text-secondary)}.field input,.field select{width:100%;padding:12px 14px;border-radius:12px;border:none;box-shadow:inset 0 0 0 1.5px var(--separator-strong);background:var(--bg-elevated);color:var(--text);font-size:1rem;font-family:inherit;transition:box-shadow var(--dur-fast) var(--ease-out)}.field input:focus,.field select:focus{outline:none;box-shadow:inset 0 0 0 2px var(--info)}.switch-row{display:flex;align-items:flex-start;gap:12px;text-align:left;font-size:.9375rem}.switch-row input{width:20px;height:20px;margin-top:2px;accent-color:var(--accent)}.switch-row span{display:flex;flex-direction:column;gap:2px}.boot-screen{min-height:100vh;display:grid;place-items:center;background:var(--bg)}.boot-logo{font-size:3rem;animation:pulse-soft 1.4s ease-in-out infinite}.auth-screen{min-height:100vh;display:grid;place-items:center;padding:24px 16px;background:var(--bg)}.auth-card{width:100%;max-width:400px;background:var(--bg-elevated);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg);padding:32px 26px;display:flex;flex-direction:column;gap:16px;animation:pop-in .42s var(--ease-out)}.auth-brand{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center}.auth-logo{font-size:2.5rem}.auth-sub{color:var(--text-secondary);font-size:.9375rem;max-width:30ch}.auth-form{display:flex;flex-direction:column;gap:14px}.auth-hint{text-align:center}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.btn:active,.icon-btn:active,.lesson-node:active{transform:none}}@media (prefers-reduced-transparency: reduce){.topbar,.sheet{background:var(--bg-elevated);backdrop-filter:none;-webkit-backdrop-filter:none}.sheet-backdrop{backdrop-filter:none;-webkit-backdrop-filter:none}}@media (prefers-contrast: more){.card,.exercise-card,.auth-card{box-shadow:0 0 0 1.5px var(--separator-strong)}.hint,.lead{color:var(--text)}}@media (max-width: 480px){.piano{height:168px}.clef{font-size:44px}.key-label{font-size:.875rem}.lesson-node{width:60px;height:60px;border-radius:20px;font-size:1.5rem}.lesson-node.is-boss{width:68px;height:68px;border-radius:24px}.card,.exercise-card{padding:22px 16px}.app-main{padding-left:12px;padding-right:12px}}
