:root,:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#0c0c0e;--surface:#151518;--raised:#1d1d21;--border:#2c2c33;--border-strong:#3e3e46;--text:#f2f0ea;--muted:#b0aeb8;--accent:#ff5b24;--on-accent:#0c0c0e;--accent-wash:#2a1710;--live:#4be38f;--meter-ok:#4be38f;--meter-warn:#ffa62b;--meter-hot:#ff4d4d;--deck-1:#ff5b24;--deck-2:#5cc8ff;--grain-opacity:.07;--radius:12px;--shadow:none;--font-display:"Big Shoulders Display", "Arial Narrow", sans-serif;--font-heading:var(--font-display);--font-caption:var(--font-display);--font-body:"Barlow", system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--heading-weight:800;--heading-transform:uppercase;--heading-style:normal;--heading-tracking:.02em;--flx-panel:#151518;--flx-panel-stroke:#2c2c33;--flx-zone:#111114;--flx-zone-stroke:#2a2a30;--flx-zone-dash:none;--flx-ctl:#26262c;--flx-ctl-stroke:#44444d;--flx-stroke-w:1.5;--flx-ring:#19191d;--flx-platter:#222227;--flx-hub:#3a3a42;--flx-tick:#4a4a53;--flx-slot:#070708;--flx-cap:#3b3b44;--flx-cap-stroke:#6a6a75;--flx-pointer:#f2f0ea;--flx-pad:#1f1f24;--flx-meter:#2e2e35;--flx-label:#a9a7b2;--flx-label-faint:#8f8d98;--flx-decor-opacity:.5;--flx-glow-opacity:.55;--flx-ring-fill:none;--flx-ring-dash:none;--flx-deck-font:var(--font-display);--flx-deck-style:normal;--flx-deck-size:17px}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f1eadb;--surface:#fbf7ee;--raised:#f3ecdf;--border:#1c1915;--border-strong:#1c1915;--text:#1c1915;--muted:#554e45;--accent:#b02f17;--on-accent:#fffaf2;--accent-wash:#f6dccf;--live:#1f7a43;--meter-ok:#1f7a43;--meter-warn:#b4570a;--meter-hot:#b3261e;--deck-1:#b02f17;--deck-2:#1d5f9e;--grain-opacity:0;--radius:0;--shadow:5px 5px 0 #1c1915;--font-display:"Fraunces", Georgia, serif;--font-heading:var(--font-display);--font-caption:var(--font-display);--font-body:"Instrument Sans", system-ui, sans-serif;--font-mono:"IBM Plex Mono", ui-monospace, monospace;--heading-weight:600;--heading-transform:none;--heading-style:normal;--heading-tracking:-.015em;--flx-panel:#fbf7ee;--flx-panel-stroke:#1c1915;--flx-zone:none;--flx-zone-stroke:#1c1915;--flx-zone-dash:2 5;--flx-ctl:#fbf7ee;--flx-ctl-stroke:#1c1915;--flx-stroke-w:1.6;--flx-ring:#fbf7ee;--flx-platter:#fbf7ee;--flx-hub:#1c1915;--flx-tick:#1c1915;--flx-slot:#1c1915;--flx-cap:#fbf7ee;--flx-cap-stroke:#1c1915;--flx-pointer:#1c1915;--flx-pad:#f3ecdf;--flx-meter:#d6ccb8;--flx-label:#1c1915;--flx-label-faint:#554e45;--flx-decor-opacity:.45;--flx-glow-opacity:0;--flx-ring-fill:#f6dccf;--flx-ring-dash:6 5;--flx-deck-font:"Fraunces", Georgia, serif;--flx-deck-style:italic;--flx-deck-size:20px}*{box-sizing:border-box}html{background:var(--bg)}body{background:var(--bg);color:var(--text);font:16px/1.45 var(--font-body);margin:0}body:before{content:"";pointer-events:none;z-index:0;opacity:var(--grain-opacity);background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 .9 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");position:fixed;inset:0}#root{z-index:1;position:relative}h1,h2,h3{font-family:var(--font-heading);font-weight:var(--heading-weight);text-transform:var(--heading-transform);font-style:var(--heading-style);letter-spacing:var(--heading-tracking);line-height:1}h1{margin:18px 0 12px;font-size:34px}.caption{font:var(--heading-weight) 30px/1.05 var(--font-caption);text-transform:var(--heading-transform);letter-spacing:var(--heading-tracking);text-wrap:balance}.meta{font:600 12px/1.2 var(--font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}a{color:var(--text);-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent);text-underline-offset:3px}.page{max-width:1100px;margin:0 auto;padding:0 16px 48px}.page.narrow{max-width:420px}.app-bar{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;max-width:1100px;margin:0 auto;padding:14px 16px 12px;display:flex}.brand{font:var(--heading-weight) 22px/1 var(--font-display);text-transform:var(--heading-transform);letter-spacing:.04em}.brand b{color:var(--accent);font-weight:inherit}:root[data-theme=light] .brand b{font-style:italic;font-weight:500}.app-bar .tools{align-items:center;gap:8px;display:flex}.btn,button{font:600 15px/1 var(--font-body);color:var(--text);background:var(--surface);border:1.5px solid var(--border-strong);border-radius:var(--radius);cursor:pointer;min-height:44px;padding:12px 16px}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);box-shadow:var(--shadow)}button:focus-visible,.btn:focus-visible,input:focus-visible{outline:3px solid var(--accent);outline-offset:2px}button:disabled{opacity:.6;cursor:default}.theme-toggle{min-height:36px;font:600 12px/1 var(--font-mono);letter-spacing:.08em;text-transform:uppercase;border-radius:99px;padding:8px 12px}input{font:16px var(--font-body);color:var(--text);background:var(--surface);border:1.5px solid var(--border-strong);border-radius:var(--radius)}.chip{font:600 12px/1 var(--font-mono);letter-spacing:.08em;text-transform:uppercase;border:1.5px solid var(--border-strong);background:var(--surface);border-radius:99px;align-items:center;gap:8px;padding:7px 10px;display:inline-flex}.chip i{background:var(--muted);border-radius:50%;width:8px;height:8px}.chip.is-live i{background:var(--live)}.event-list{font:13px/1.4 var(--font-mono);color:var(--text);padding-left:24px}.event-list .muted{color:var(--muted)}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.flx4{background:var(--surface);border:1px solid var(--border);border-radius:calc(var(--radius) + 4px);box-shadow:var(--shadow);margin:16px 0;overflow:hidden}.flx4-svg{width:100%;height:auto;display:block}.flx4-where{border-top:1px solid var(--border);align-items:center;gap:10px;padding:8px 10px;display:flex}.flx-locator{flex:none;width:84px;height:auto}.flx-locator-box{fill:none;stroke:var(--accent);stroke-width:14px}.flx-panel{fill:var(--flx-panel);stroke:var(--flx-panel-stroke);stroke-width:2px}.flx-zone{fill:var(--flx-zone);stroke:var(--flx-zone-stroke);stroke-dasharray:var(--flx-zone-dash)}.flx-body,.flx-cap{fill:var(--flx-ctl);stroke:var(--flx-ctl-stroke);stroke-width:var(--flx-stroke-w)}.flx-ring{fill:var(--flx-ring)}.flx-platter{fill:var(--flx-platter)}.flx-hub{fill:var(--flx-hub)}.flx-tick{stroke:var(--flx-tick);stroke-width:1.2px}.flx-slot{fill:var(--flx-slot)}.flx-cap{fill:var(--flx-cap);stroke:var(--flx-cap-stroke);stroke-width:2px}.flx-pointer{stroke:var(--flx-pointer);stroke-width:3px;stroke-linecap:round;transform-box:view-box}.flx-pad .flx-body{fill:var(--flx-pad)}.flx-meter-seg{fill:var(--flx-meter)}.flx-lbl{font:600 10.5px var(--font-mono);fill:var(--flx-label);letter-spacing:.03em}.flx-lbl-sm{font-size:8px}.flx-lbl-faint{fill:var(--flx-label-faint);font-size:9px}.flx-deck{font:var(--flx-deck-style) 700 var(--flx-deck-size) var(--flx-deck-font);fill:var(--flx-label-faint);letter-spacing:.1em}.flx-decor .flx-body,.flx-decor .flx-pointer,.flx-decor .flx-slot,.flx-decor .flx-meter-seg{opacity:var(--flx-decor-opacity)}.flx-decor .flx-lbl{fill:var(--flx-label-faint)}.flx-jog g,.flx-anim-move{transform-box:view-box}.is-ghost{visibility:hidden}.is-target .flx-body,.is-target .flx-cap{stroke:var(--accent);stroke-width:2.5px}.is-target .flx-cap,.is-target .flx-lbl{fill:var(--accent)}.is-down .flx-body{fill:var(--accent);stroke:var(--accent)}.is-down .flx-lbl{fill:var(--on-accent)}.flx-glow{fill:var(--accent);opacity:var(--flx-glow-opacity)}.flx-halo .flx-halo-ring{fill:var(--flx-ring-fill);stroke:var(--accent);stroke-width:2px;stroke-dasharray:var(--flx-ring-dash)}.flx-halo{animation:1.8s ease-in-out infinite flx-pulse}.flx-halo .flx-halo-ring{animation:1.2s linear infinite flx-march}@keyframes flx-pulse{0%,to{opacity:.4}50%{opacity:1}}@keyframes flx-march{to{stroke-dashoffset:-22px}}.flx-arrow-line{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:round;stroke-dasharray:7 5;animation:.9s linear infinite flx-march}.flx-arrow.is-static .flx-arrow-line{stroke-dasharray:none;animation:none}.flx-arrow-head{fill:var(--accent)}.flx-anim-move{animation:2s ease-in-out infinite flx-move}@keyframes flx-move{0%,15%{transform:var(--flx-from)}70%,to{transform:var(--flx-to)}}.flx-anim-turn-cw{transform-box:view-box;animation:2s ease-in-out infinite flx-turn-cw}.flx-anim-turn-ccw{transform-box:view-box;animation:2s ease-in-out infinite flx-turn-ccw}@keyframes flx-turn-cw{0%,10%{transform:rotate(0)}80%,to{transform:rotate(120deg)}}@keyframes flx-turn-ccw{0%,10%{transform:rotate(0)}80%,to{transform:rotate(-120deg)}}.flx-anim-press .flx-body{animation:2s ease-in-out infinite flx-tap}@keyframes flx-tap{0%,30%,60%,to{fill:var(--flx-ctl)}38%,52%{fill:var(--accent)}}@media (prefers-reduced-motion:reduce){.flx-halo,.flx-halo .flx-halo-ring,.flx-arrow-line,.flx-anim-move,.flx-anim-turn-cw,.flx-anim-turn-ccw,.flx-anim-press .flx-body{animation:none}}.flx-step-dot{fill:var(--accent);stroke:var(--flx-panel);stroke-width:2px}.flx-step-n{font:700 11px var(--font-mono);fill:var(--on-accent)}.flx4-scroll{overscroll-behavior-x:contain;margin:16px 0;overflow-x:auto}.flx4-scroll>.flx4{min-width:720px;margin:0}a.btn{justify-content:center;align-items:center;text-decoration:none;display:inline-flex}.btn.ghost{border-color:var(--border-strong);background:0 0}button.chip{min-height:36px;color:var(--text);cursor:pointer;font:600 12px/1 var(--font-mono);border-radius:99px;padding:7px 10px}.chip.is-live i{animation:2s ease-out infinite chip-beat}@keyframes chip-beat{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--live) 55%, transparent)}70%,to{box-shadow:0 0 0 7px color-mix(in srgb, var(--live) 0%, transparent)}}.page.lesson{padding-top:4px}.step-frame{grid-template-columns:minmax(0,1fr);grid-template-areas:"head""stage""body";row-gap:16px;padding-top:18px;display:grid}.sf-head{grid-area:head}.sf-stage{grid-area:stage;min-width:0}.sf-body{grid-area:body;min-width:0}.sf-stage .flx4{margin:0}.sf-stage .flx4-svg{max-height:min(48vh,440px)}.sf-body>:first-child{margin-top:0}@media (width>=900px){.step-frame{grid-template:"stage head""stage body"1fr/minmax(0,1fr) 340px;align-items:start;column-gap:28px}.step-frame:not(:has(.sf-stage)){grid-template-columns:minmax(0,560px);grid-template-areas:"head""body"}.step-frame .caption{font-size:36px}}h1.title{margin:6px 0 0;font-size:30px;line-height:.95}.steps{gap:4px;margin:14px 0 0;padding:0;list-style:none;display:flex}.steps li{background:var(--flx-meter);border-radius:3px;flex:1;height:6px}.steps li.done{background:var(--text)}.steps li.skipped{background:var(--muted);opacity:.55}.steps li.now{background:var(--accent)}.steps-label{margin:8px 0 0}.caption{margin:0}.question{margin:12px 0 0;font-size:18px;font-weight:600}.actions{flex-wrap:wrap;gap:10px;margin-top:18px;display:flex}.actions .btn.primary{flex:auto;font-weight:700}.aside{color:var(--muted);margin:12px 0 0;font-size:14px}.banner{border-left:3px solid var(--accent);background:var(--accent-wash);color:var(--text);margin:12px 0;padding:10px 12px;font-weight:500}.success{font:var(--heading-weight) 24px/1 var(--font-display);text-transform:var(--heading-transform);color:var(--live);margin:18px 0 0}.success-mark{animation:.35s ease-out success-pop;display:inline-block}@keyframes success-pop{0%{opacity:0;transform:scale(.4)}to{opacity:1;transform:scale(1)}}.options{flex-direction:column;gap:8px;margin-top:16px;display:flex}.option{text-align:left;line-height:1.3}.option.is-wrong{color:var(--muted);text-decoration:line-through}.option.is-right,.option.is-right:disabled{opacity:1;border-color:var(--live)}.explain{border-left:3px solid var(--border-strong);background:var(--raised);margin:12px 0 0;padding:10px 12px}.explain.is-right{border-left-color:var(--live)}.stage{background:var(--surface);border:1px solid var(--border);border-radius:calc(var(--radius) + 4px);box-shadow:var(--shadow);margin:0;padding:10px;overflow:hidden}.stage svg,.stage-img{width:100%;height:auto;display:block}.bg-beat{fill:var(--flx-ctl);stroke:var(--flx-ctl-stroke);stroke-width:1.2px}.bg-beat.is-down{fill:var(--flx-cap);stroke:var(--flx-cap-stroke)}.bg-beat.is-marked{fill:var(--accent);stroke:var(--accent)}.bg-num{font:600 10px var(--font-mono);fill:var(--flx-label-faint)}.bg-num.is-marked{fill:var(--accent)}.bg-bpm{font:600 11px var(--font-mono);fill:var(--muted);letter-spacing:.08em}.wf-bar{fill:var(--muted)}.wf-zone{fill:var(--accent-wash)}.wf-mark{stroke:var(--border-strong);stroke-width:2px;stroke-dasharray:4 4}.wf-mark.is-hot{stroke:var(--accent);stroke-dasharray:none}.wf-lbl{font:600 11px var(--font-mono);fill:var(--muted);letter-spacing:.08em}.wf-lbl.is-hot{fill:var(--accent)}.mt-seg{fill:var(--flx-meter)}.mt-seg.is-lit.is-ok{fill:var(--meter-ok)}.mt-seg.is-lit.is-warn{fill:var(--meter-warn)}.mt-seg.is-lit.is-hot{fill:var(--meter-hot)}.mt-clip{fill:var(--flx-meter)}.mt-clip.is-clip{fill:var(--meter-hot)}.mt-lbl{font:600 12px var(--font-mono);fill:var(--text);letter-spacing:.08em}.mt-lbl.is-faint{fill:var(--muted)}.mt-lbl.is-hot{fill:var(--meter-hot)}.mt-seg.is-live{animation:.9s ease-in-out infinite alternate mt-flick}.es-lbl,.dr-lbl,.en-lbl,.cm-lbl{font:600 11px var(--font-mono);fill:var(--muted);letter-spacing:.05em}.es-lbl.is-hot,.dr-lbl.is-hot{fill:var(--accent)}.es-lbl.is-faint,.en-lbl.is-faint{fill:var(--muted)}.es-lbl.is-d1{fill:var(--deck-1)}.es-lbl.is-d2{fill:var(--deck-2)}.es-axis,.en-axis{stroke:var(--border-strong);stroke-width:1.5px}.es-swap{stroke:var(--accent);stroke-width:1.5px;stroke-dasharray:4 4}.es-line{fill:none;stroke-width:4px;stroke-linejoin:round}.es-line.is-d1{stroke:var(--deck-1)}.es-line.is-d2{stroke:var(--deck-2)}.es-playhead{stroke:var(--text);stroke-width:2px}.es-head.is-live{animation:6s linear infinite es-sweep}.dr-guide{stroke:var(--border);stroke-width:1px;stroke-dasharray:2 4}.dr-kick.is-d1{fill:var(--deck-1)}.dr-kick.is-d2{fill:var(--deck-2);opacity:.9}.dr-kick.is-live{animation:3s ease-in-out infinite alternate dr-slide}.cm-slot{fill:var(--surface);stroke:var(--border-strong);stroke-width:1.5px}.cm-slot.is-A{fill:var(--raised)}.cm-slot.is-near{fill:var(--accent-wash);stroke:var(--accent);stroke-width:2.5px}.cm-slot.is-key{fill:var(--accent);stroke:var(--accent)}.cm-slot.is-live{transform-box:fill-box;transform-origin:50%;animation:1.4s ease-in-out infinite alternate cm-pulse}.cm-num{font:600 12px var(--font-mono);fill:var(--text)}.cm-num.is-key{fill:var(--on-accent)}.cm-mid{font:700 26px var(--font-mono);fill:var(--accent)}.en-zone{fill:var(--raised)}.en-fill{fill:var(--accent-wash);opacity:.7}.en-line{fill:none;stroke:var(--accent);stroke-width:3.5px;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:0}.en-line.is-live{animation:3.5s ease-out infinite en-draw}@keyframes mt-flick{0%{opacity:1}to{opacity:.35}}@keyframes es-sweep{0%{transform:translate(0)}to{transform:translateX(var(--span))}}@keyframes dr-slide{0%{transform:translate(0)}to{transform:translateX(var(--d))}}@keyframes cm-pulse{0%{transform:scale(1)}to{transform:scale(1.14)}}@keyframes en-draw{0%{stroke-dashoffset:1px}70%,to{stroke-dashoffset:0}}@media (prefers-reduced-motion:reduce){.mt-seg.is-live,.es-head.is-live,.dr-kick.is-live,.cm-slot.is-live,.en-line.is-live{animation:none}}.toast{z-index:10;background:var(--raised);border:1.5px solid var(--border-strong);border-radius:var(--radius);max-width:calc(100vw - 32px);box-shadow:var(--shadow);align-items:center;gap:12px;padding:10px 12px;font-size:14px;display:flex;position:fixed;bottom:16px;left:50%;transform:translate(-50%)}.toast .btn{min-height:36px;padding:8px 12px}@media (prefers-reduced-motion:reduce){.chip.is-live i,.success-mark{animation:none}}.beat-pulse{justify-content:center;align-items:center;gap:14px;min-height:120px;display:flex}.beat-dot{background:var(--flx-ctl);border:1.5px solid var(--flx-ctl-stroke);border-radius:50%;width:36px;height:36px;transition:background 80ms,transform 80ms}.beat-dot.is-down{border-color:var(--flx-cap-stroke);width:48px;height:48px}.beat-dot.is-on{background:var(--accent);border-color:var(--accent);transform:scale(1.12)}.beat-dot.is-down.is-on{transform:scale(1.25)}.beat-pulse.is-still .beat-dot{transition:none;transform:none}.dr-kick.is-follow{transition:transform 90ms linear}.match-status{min-height:1.2em;font:700 22px/1.1 var(--font-mono);letter-spacing:.02em;color:var(--accent);margin:12px 0 0}.match-status.is-done{color:var(--live)}.match-controls{flex-direction:column;gap:14px;margin-top:16px;display:flex}.match-tempo{flex-direction:column;gap:6px;display:flex}.match-label{font:600 12px/1 var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.match-tempo input[type=range]{width:100%;min-height:44px;accent-color:var(--deck-2);background:0 0;border:0;margin:0;padding:0}.match-tempo input[type=range]:disabled{opacity:.6}.match-ends{font:600 12px/1 var(--font-mono);color:var(--muted);justify-content:space-between;display:flex}.match-nudge,.match-fine{grid-template-columns:1fr 1fr;gap:10px;display:grid}.match-fine .btn{font-family:var(--font-mono);touch-action:manipulation;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.match-nudge .btn{touch-action:manipulation;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;font-size:20px}@media (prefers-reduced-motion:reduce){.dr-kick.is-follow{transition:none}}.home{padding-top:16px}.continue{border-radius:calc(var(--radius) + 4px);border:1.5px solid var(--accent);background:var(--accent);color:var(--on-accent);box-shadow:var(--shadow);flex-direction:column;gap:10px;padding:22px 18px;text-decoration:none;display:flex}.continue .meta{color:inherit;opacity:.8}.continue-title{font:var(--heading-weight) 28px/1.05 var(--font-display);text-transform:var(--heading-transform);overflow-wrap:anywhere}.continue.is-complete{background:var(--surface);border-color:var(--live);color:var(--text)}.chapters{flex-direction:column;gap:14px;margin:24px 0 0;padding:0;list-style:none;display:flex}.chapter-row{justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:6px;font-weight:600;display:flex}.bar{appearance:none;background:var(--flx-meter);border:0;border-radius:4px;width:100%;height:8px;display:block;overflow:hidden}.bar::-webkit-progress-bar{background:var(--flx-meter)}.bar::-webkit-progress-value{background:var(--accent)}.bar::-moz-progress-bar{background:var(--accent)}.map-chapter{margin-top:24px}.map-chapter h2{margin:0 0 8px}.map-lessons{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.map-lesson{border:1.5px solid var(--border-strong);border-radius:var(--radius);background:var(--surface);grid-template-columns:auto minmax(0,1fr);align-items:baseline;gap:2px 12px;min-height:44px;padding:12px;text-decoration:none;display:grid}.map-code{font:600 13px var(--font-mono);color:var(--muted);grid-row:span 2}.map-title{overflow-wrap:anywhere;font-weight:600}.map-badge{font:600 12px/1.2 var(--font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.map-lesson.is-in-progress,.map-lesson.is-up-next{border-color:var(--accent)}.map-lesson.is-in-progress .map-badge,.map-lesson.is-up-next .map-badge{color:var(--accent)}.map-lesson.is-done .map-badge{color:var(--live)}.map-lesson.is-not-yet .map-title{color:var(--muted)}
