/* Music Theory Companion. Tokens follow design/DESIGN.md; dark values are our own. */
:root{
  --teal:#356D75;--teal-deep:#2A5A62;--teal-dark:#274F55;--teal-tint:#E4EEEF;
  --orange:#A85A38;--orange-text:#94492A;--orange-tint:#F7E8E0;--orange-tint-2:#E0C3B6;
  --ink:#1D2B2E;--muted:#56666A;--line:#D5DCDD;--band:#F3F6F6;--bg:#fff;--card:#fff;--soft:#FBFCFC;
  --key-white:#fff;--key-black:#14201F;--key-edge:#1D2B2E;--note:#1D2B2E;--staff:#7D8B8E;
  --ok-bg:#E4EEEF;--ok-fg:#274F55;--no-bg:#F7E8E0;--no-fg:#7A3A1F;--idle-bg:#F3F6F6;--idle-fg:#3C4A4D;
  --hero-fg:#E3EEEF;--eyebrow-hero:#F4CDBA;--footer-bg:#1D2B2E;--footer-fg:#C9D6D8;
  --serif:'Source Serif 4',Georgia,'Times New Roman',serif;
  --sans:'Source Sans 3',system-ui,-apple-system,'Segoe UI',sans-serif;
  color-scheme:light;
}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){
  --teal:#6DB0B9;--teal-deep:#173A40;--teal-dark:#CFE6E8;--teal-tint:#1C3438;
  --orange:#A85A38;--orange-text:#E9A27F;--orange-tint:#3A271E;--orange-tint-2:#6A4332;
  --ink:#E4EBEC;--muted:#A2B0B3;--line:#2F3B3D;--band:#141C1E;--bg:#0E1517;--card:#121B1D;--soft:#111A1C;
  --key-white:#EEF2F2;--key-black:#0B1112;--key-edge:#0B1112;--note:#E4EBEC;--staff:#7F9093;
  --ok-bg:#1C3438;--ok-fg:#CFE6E8;--no-bg:#3A271E;--no-fg:#F2C2AA;--idle-bg:#182224;--idle-fg:#C3CFD1;
  --hero-fg:#D3E2E4;--footer-bg:#0A1011;--footer-fg:#A9B8BA;color-scheme:dark}}
:root[data-theme="dark"]{
  --teal:#6DB0B9;--teal-deep:#173A40;--teal-dark:#CFE6E8;--teal-tint:#1C3438;
  --orange:#A85A38;--orange-text:#E9A27F;--orange-tint:#3A271E;--orange-tint-2:#6A4332;
  --ink:#E4EBEC;--muted:#A2B0B3;--line:#2F3B3D;--band:#141C1E;--bg:#0E1517;--card:#121B1D;--soft:#111A1C;
  --key-white:#EEF2F2;--key-black:#0B1112;--key-edge:#0B1112;--note:#E4EBEC;--staff:#7F9093;
  --ok-bg:#1C3438;--ok-fg:#CFE6E8;--no-bg:#3A271E;--no-fg:#F2C2AA;--idle-bg:#182224;--idle-fg:#C3CFD1;
  --hero-fg:#D3E2E4;--footer-bg:#0A1011;--footer-fg:#A9B8BA;color-scheme:dark}

*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);font:17px/1.5 var(--sans);-webkit-text-size-adjust:100%}
a{color:inherit;text-decoration:none}
a:hover{color:var(--orange-text)}
button{font:inherit;color:inherit}
:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.wrap{max-width:1344px;margin:0 auto;padding:0 24px}
.serif{font-family:var(--serif)}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}

/* buttons */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 20px;border-radius:4px;font-weight:700;font-size:16px;cursor:pointer;border:2px solid transparent;line-height:1.2;text-align:center}
.btn-primary{background:var(--orange);color:#fff}
.btn-primary:hover{color:#fff;filter:brightness(1.08)}
.btn-outline{background:transparent;color:var(--teal);border-color:var(--teal)}
.btn-outline:hover{color:var(--teal);background:var(--teal-tint)}
.btn-ghost{background:transparent;color:var(--ink);border-color:#9AA9AC}
.btn-ghost:hover{color:var(--ink);background:var(--band)}
.btn-light{border-color:#fff;color:#fff}
.btn-light:hover{color:#fff;background:rgba(255,255,255,.1)}
.btn-lg{font-size:18px;padding:14px 26px}
.btn:disabled{opacity:.45;cursor:default}

/* header */
.site-header{border-bottom:1px solid var(--line);background:var(--bg);position:sticky;top:0;z-index:20}
.site-header .wrap{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:12px;padding-bottom:12px}
.logo{display:flex;align-items:center;gap:12px;font:700 22px var(--serif)}
.logo-mark{width:36px;height:36px;background:#356D75;display:flex;align-items:center;justify-content:center;border-radius:4px;flex:none}
.head-tools{display:flex;gap:10px;align-items:center}
.icon-btn{width:44px;height:44px;border-radius:4px;border:1px solid var(--line);background:var(--bg);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--ink)}
.icon-btn:hover{background:var(--band)}
.icon-btn svg{width:20px;height:20px}
.icon-btn[aria-pressed="false"] .on-only{display:none}
.icon-btn[aria-pressed="true"] .off-only{display:none}

/* sections */
.band{background:var(--band)}
.section .wrap{padding-top:72px;padding-bottom:72px}
.section .big{margin:0;font:700 40px/1.15 var(--serif)}
.section .lead{margin:12px 0 0;font-size:19px;color:var(--muted);max-width:680px}

/* chapter list */
.chapters{margin-top:36px;background:var(--card);border:1px solid var(--line);border-radius:8px;overflow:hidden}
.chapter{display:flex;flex-wrap:wrap;gap:12px 28px;padding:26px 32px;border-bottom:1px solid var(--line)}
.chapter:last-child{border-bottom:0}
.chapter-n{flex:0 0 56px;font:700 48px/1 var(--serif);color:var(--teal)}
.chapter-body{flex:1 1 300px;min-width:0}
.chapter-title{font:700 26px/1.2 var(--serif)}
.chapter-desc{margin-top:4px;font-size:17px;color:var(--muted)}
.ex-links{margin-top:14px;display:flex;flex-wrap:wrap;gap:8px}
.ex-link{display:inline-flex;align-items:center;gap:8px;min-height:40px;padding:8px 14px;border:1px solid var(--line);border-radius:4px;font-weight:600;font-size:15px;background:var(--bg)}
.ex-link:hover{border-color:var(--teal);color:var(--teal)}
.ex-link .ex-num{color:var(--muted);font-weight:700;font-variant-numeric:tabular-nums}
.ex-link .dot{width:8px;height:8px;border-radius:50%;background:var(--line);flex:none}
.ex-link .dot.some{background:var(--orange)}
.ex-link .dot.good{background:var(--teal)}

/* footer */
.site-footer{background:var(--footer-bg);color:var(--footer-fg)}
.site-footer .wrap{display:flex;flex-wrap:wrap;gap:16px 40px;justify-content:space-between;padding-top:40px;padding-bottom:40px;font-size:15px}
.site-footer strong{display:block;font:700 20px var(--serif);color:#fff}
.site-footer a{text-decoration:underline}

/* breadcrumb */
.crumbs{background:var(--band);border-bottom:1px solid var(--line)}
.crumbs .wrap{padding-top:14px;padding-bottom:14px;font-size:15px;color:var(--muted)}
.crumbs b{color:var(--ink);font-weight:600}

/* exercise page */
.ex-page{padding-top:40px;padding-bottom:72px}
.ex-head{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:12px 24px}
.ex-head h1{margin:8px 0 0;font:700 44px/1.1 var(--serif)}
.ex-intro{margin:16px 0 0;max-width:720px;font:19px/1.6 var(--serif)}
.ex-pager{display:flex;gap:8px}
.ex-cols{margin-top:32px;display:flex;flex-wrap:wrap;gap:32px;align-items:flex-start}
.ex-main{flex:999 1 640px;min-width:0;border:1px solid var(--line);border-radius:8px;padding:28px;background:var(--card)}
.ex-side{flex:1 1 280px;min-width:260px;max-width:400px;display:flex;flex-direction:column;gap:20px}
.q-prompt{margin:0 0 18px;font:600 21px/1.4 var(--serif)}
.q-prompt .big{font-size:1.25em}
.figure{display:flex;flex-direction:column;justify-content:center;align-items:center;overflow-x:auto;padding:4px 0 8px}
.figure svg.notation{max-width:100%;height:auto;display:block}
.figure .bigtext{font:700 44px/1.2 var(--serif);padding:18px 24px;text-align:center}
.figure .seq{font:600 26px/1.4 var(--serif);text-align:center;padding:10px 0;letter-spacing:.02em}
.choices{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}
.choice{min-width:56px;min-height:48px;padding:10px 18px;font-weight:700;font-size:18px;background:var(--bg);color:var(--ink);border:2px solid var(--line);border-radius:4px;cursor:pointer}
.choice.wide{font-size:16px;font-weight:600}
.choice:hover:not(:disabled){border-color:var(--teal);color:var(--teal)}
.choice.right{background:var(--teal);border-color:var(--teal);color:#fff}
.choice.wrong{background:var(--orange);border-color:var(--orange);color:#fff}
.choice:disabled{cursor:default}
.choice:disabled:not(.right):not(.wrong){opacity:.6}
.q-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:22px}
.text-answer{flex:1 1 260px;min-height:48px;padding:10px 14px;font:600 20px var(--sans);border:2px solid var(--line);border-radius:4px;background:var(--bg);color:var(--ink)}
.text-answer:focus{border-color:var(--teal);outline:none}
.text-answer.right{border-color:var(--teal);background:var(--ok-bg)}
.text-answer.wrong{border-color:var(--orange);background:var(--no-bg)}
.tool-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px;align-items:center}
.tool-row .label{font-size:14px;font-weight:700;color:var(--muted);margin-right:4px;text-transform:uppercase;letter-spacing:.06em}
.tool{min-width:48px;min-height:44px;padding:6px 12px;border:2px solid var(--line);border-radius:4px;background:var(--bg);cursor:pointer;font:700 20px var(--serif)}
.tool[aria-pressed="true"]{border-color:var(--teal);background:var(--teal-tint);color:var(--teal)}
.tool:hover{border-color:var(--teal)}
.answer-reveal{margin-top:18px;padding:14px 16px;border-radius:4px;background:var(--band);font-size:16px}
.answer-reveal .figure{margin-top:8px}

/* side panel */
.panel{border:1px solid var(--line);border-top:6px solid var(--teal);border-radius:8px;padding:24px;background:var(--card)}
.panel h2{margin:0;font:700 22px var(--serif)}
.panel-top{display:flex;justify-content:space-between;align-items:baseline;gap:12px}
.panel-count{font-weight:700;font-size:17px;color:var(--teal)}
.bar{margin-top:14px;height:12px;border-radius:6px;background:var(--teal-tint);overflow:hidden}
.bar>div{height:100%;background:var(--orange);transition:width .25s}
.stats{margin-top:12px;display:flex;gap:16px;flex-wrap:wrap;font-size:15px;color:var(--muted)}
.stats b{color:var(--ink)}
.msg{margin-top:18px;padding:14px 16px;border-radius:4px;font-size:17px;line-height:1.5;font-weight:600}
.msg.idle{background:var(--idle-bg);color:var(--idle-fg)}
.msg.ok{background:var(--ok-bg);color:var(--ok-fg)}
.msg.no{background:var(--no-bg);color:var(--no-fg)}
.msg.done{background:var(--teal);color:#fff}
[data-theme="dark"] .msg.done{background:#356D75}
.msg .why{display:block;margin-top:6px;font-weight:400}
.side-btns{display:flex;flex-wrap:wrap;gap:12px}
.side-btns .btn{flex:1 1 120px}
.hint-box{border:1px solid var(--line);border-radius:8px;padding:20px;background:var(--soft);font-size:16px}
.hint-box h3{margin:0 0 8px;font:700 18px var(--serif)}
.hint-box p{margin:6px 0}
.hint-box table{border-collapse:collapse;width:100%;font-size:15px}
.hint-box td,.hint-box th{padding:4px 6px;border-bottom:1px solid var(--line);text-align:left}
.hint-box tr.hl td{background:var(--orange-tint);font-weight:700}
.siblings{border:1px solid var(--line);border-radius:8px;padding:20px;background:var(--card)}
.siblings h3{margin:0 0 10px;font:700 18px var(--serif)}
.siblings a{display:flex;align-items:center;gap:10px;padding:8px 0;font-weight:600;font-size:15px;border-top:1px solid var(--line)}
.siblings a.on{color:var(--teal)}
.siblings a .dot{width:8px;height:8px;border-radius:50%;background:var(--line);flex:none}
.siblings a.on .dot{background:var(--orange)}
.timer{font:700 28px var(--serif);color:var(--orange-text)}

/* keyboard (percent geometry so it scales; ratios from DESIGN.md: W 60, BW 36, H 230, BH 144) */
.kb{position:relative;width:100%;min-width:calc(var(--n,14) * 30px);margin:0 auto;user-select:none;-webkit-user-select:none;touch-action:manipulation}
.kb-keys{position:relative;width:100%}
.kb .wk,.kb .bk{position:absolute;top:0;padding:0;margin:0;border:0}
.kb .wk{height:100%;background:var(--key-white);border:1px solid var(--key-edge);border-radius:0 0 4px 4px}
.kb .bk{background:var(--key-black);border-radius:0 0 3px 3px;z-index:2}
.kb button.wk,.kb button.bk{cursor:pointer}
.kb button.wk:hover{background:#EEF4F5}
.kb button.bk:hover{background:#2A3A3C}
.kb .wk.sel{background:var(--teal-tint)}
.kb .bk.sel{background:var(--teal)}
.kb .wk.hl{background:#F2C9B4}
.kb .bk.hl{background:var(--orange)}
.kb .wk.found{background:#F7E8E0}
.kb .wk.good{background:#CFE3E5}
.kb .bk.good{background:#356D75}
.kb .wk.bad{background:#F2C9B4}
.kb .bk.bad{background:#A85A38}
.kb .tag{position:absolute;left:8%;right:8%;bottom:8px;min-height:30px;display:flex;align-items:center;justify-content:center;font:700 clamp(11px,1.6vw,19px) var(--serif);color:#1D2B2E;background:#E0C3B6;border-radius:2px;pointer-events:none;padding:0 2px;line-height:1.05;text-align:center}
.kb .bk .tag{left:4%;right:4%;bottom:6px;min-height:22px;background:#E0C3B6;font-size:clamp(9px,1.2vw,14px)}
.kb .tag.teal{background:#CFE3E5}
.kb .tag.plain{background:transparent}
.kb .lab{position:absolute;bottom:6px;left:0;right:0;text-align:center;font:600 clamp(10px,1.2vw,14px) var(--sans);color:#56666A;pointer-events:none}
.kb-groups{position:relative;height:36px}
.kb-groups div{position:absolute;text-align:center;font:700 18px var(--serif)}
.kb-groups div::after{content:"";position:absolute;left:0;right:0;top:26px;height:2px;background:currentColor}
.kb-groups .g2{color:#356D75}
.kb-groups .g3{color:#A85A38}
[data-theme="dark"] .kb-groups .g2,.dark-auto .kb-groups .g2{color:var(--teal)}
.kb.colored .bk.g2{background:#356D75}
.kb.colored .bk.g3{background:#A85A38}

#kbBox,.figure{overflow-x:auto;-webkit-overflow-scrolling:touch}
#kbBox{padding-bottom:4px}
.q-feed{display:none}
/* staff (interactive) */
.staff-input{align-items:flex-start}
.staff-input svg{cursor:crosshair;touch-action:manipulation;margin:0 auto}
.staff-input .col-hit{fill:transparent}
.staff-input .col-hit:hover{fill:var(--teal-tint);opacity:.5}

/* circle of fifths */
svg.circle text{font-family:var(--serif)}

/* summary */
.summary{text-align:center;padding:24px 8px}
.summary .score{font:700 64px/1 var(--serif);color:var(--teal)}
.summary p{font-size:18px;color:var(--muted)}

@media (max-width:720px){
  body{font-size:16px}
  .wrap{padding:0 16px}
  .section .wrap{padding-top:48px;padding-bottom:48px}
  .section .big{font-size:32px}
  .chapter{padding:22px 18px}
  .chapter-n{font-size:36px;flex-basis:40px}
  .chapter-title{font-size:22px}
  .ex-page{padding-top:28px}
  .ex-head h1{font-size:32px}
  .ex-intro{font-size:17px}
  .ex-main{padding:18px 14px}
  .ex-side{max-width:none}
  .q-prompt{font-size:19px}
  .site-header{position:static}
  .site-header .wrap{gap:8px 12px}
  .logo{font-size:16px;flex:1 1 auto;gap:8px}
  .logo-mark{width:28px;height:28px}
  .head-tools{gap:4px}
  .icon-btn{width:40px;height:40px}
  .q-feed{display:block;margin-top:16px}
  .q-feed:empty{display:none}
}

/* chapter page */
a.chapter-title:hover{color:var(--teal)}
.chapter-h1{margin:8px 0 0;font:700 44px/1.1 var(--serif)}
.ex-cards{margin-top:32px;background:var(--card);border:1px solid var(--line);border-radius:8px;overflow:hidden;max-width:960px}
.ex-card{display:flex;align-items:center;gap:12px 24px;padding:22px 28px;border-bottom:1px solid var(--line)}
.ex-card:last-child{border-bottom:0}
.ex-card:hover{background:var(--band);color:inherit}
.ex-card:hover .ex-card-title{color:var(--teal)}
.ex-card-num{flex:0 0 64px;font:700 30px/1 var(--serif);color:var(--teal);font-variant-numeric:tabular-nums}
.ex-card-body{flex:1 1 auto;min-width:0}
.ex-card-title{display:flex;align-items:center;gap:10px;font:700 22px/1.25 var(--serif)}
.ex-card-title .dot{width:10px;height:10px;border-radius:50%;background:var(--line);flex:none}
.ex-card-title .dot.some{background:var(--orange)}
.ex-card-title .dot.good{background:var(--teal)}
.ex-card-intro{margin-top:4px;font-size:16px;color:var(--muted)}
.ex-card-go{flex:none;font-weight:700;color:var(--orange-text)}
@media (max-width:720px){
  .chapter-h1{font-size:32px}
  .ex-card{padding:18px 16px;gap:8px 14px}
  .ex-card-num{flex-basis:44px;font-size:22px}
  .ex-card-title{font-size:19px}
  .ex-card-go{display:none}
}
