:root {
  --bg: #f6f5f2;
  --card: #ffffff;
  --text: #1d1d1b;
  --muted: #6f6c66;
  --line: #e2dfd8;
  --accent: #c2410c;
  --accent-soft: #fde7da;
  --clean: #15803d;
  --tense: #ca8a04;
  --fail: #b91c1c;
  --heat0: #e9e6df;
  --heat1: #fbc9a8;
  --heat2: #f59160;
  --heat3: #c2410c;
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg: #161514;
    --card: #211f1d;
    --text: #eceae6;
    --muted: #9b968e;
    --line: #34312d;
    --accent: #fb8c4b;
    --accent-soft: #3b2417;
    --clean: #4ade80;
    --tense: #facc15;
    --fail: #f87171;
    --heat0: #2b2926;
    --heat1: #5a3220;
    --heat2: #a14d22;
    --heat3: #fb8c4b;
  }
}
* { box-sizing: border-box; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font: 15px/1.45 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
button, input, select, textarea { font: inherit; color: inherit; }
button {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 6px 12px;
  cursor: pointer;
}
button:hover { border-color: var(--muted); }
button.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
button.danger { color: var(--fail); border-color: var(--fail); }
button.big { padding: 10px 18px; font-weight: 600; }
button.icon { width: 34px; padding: 6px 0; }
input, select, textarea {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: 8px;
  padding: 6px 8px;
}
input[type=number] { width: 72px; }
h2 { font-size: 15px; margin: 22px 0 8px; color: var(--muted); font-weight: 600; }
.muted { color: var(--muted); }

.top {
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  padding: 12px 16px; border-bottom: 1px solid var(--line); background: var(--card);
}
.top h1 { margin: 0; font-size: 18px; display: flex; align-items: center; gap: 8px; }
.store { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 999px; background: var(--accent-soft); color: var(--muted); }
.store:empty { display: none; }
.store.warn { color: var(--fail); }
.tabs { display: flex; gap: 4px; flex-wrap: wrap; }
.tabs button { border: none; background: none; color: var(--muted); }
.tabs button.active { background: var(--accent-soft); color: var(--accent); font-weight: 600; }

.metro {
  position: sticky; top: 0; z-index: 5;
  background: var(--card); border-bottom: 1px solid var(--line);
  padding: 8px 16px; display: flex; flex-direction: column; gap: 6px;
}
.metro-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.metro .unit, .metro .label { color: var(--muted); }
.metro .sub { margin-right: auto; }
.timer { font-variant-numeric: tabular-nums; font-size: 20px; font-weight: 600; min-width: 60px; }
.timer.running { color: var(--accent); }
.metro.playing #playBtn { background: var(--text); border-color: var(--text); color: var(--bg); }

main { max-width: 760px; margin: 0 auto; padding: 16px; }
.view { display: none; }
.view.active { display: block; }

.today-head { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.days { display: flex; gap: 4px; }
.days button { width: 40px; font-weight: 600; }
.days button.active { background: var(--accent); border-color: var(--accent); color: #fff; }
.days button.next::after { content: "•"; color: var(--accent); margin-left: 2px; }
.days button.active.next::after { color: #fff; }
.day-title { margin: 10px 0 12px; color: var(--muted); }

.ex {
  background: var(--card); border: 1px solid var(--line); border-radius: 12px;
  padding: 10px 12px; margin-bottom: 8px;
}
.ex.done { border-color: var(--accent); }
.ex-top { display: flex; align-items: flex-start; gap: 10px; }
.ex-top input[type=checkbox] { width: 20px; height: 20px; margin-top: 2px; accent-color: var(--accent); }
.ex-name { font-weight: 600; flex: 1; }
.ex-hint { color: var(--muted); font-size: 13px; font-weight: 400; display: block; }
.ex-remove { border: none; background: none; color: var(--muted); padding: 0 4px; }
.ex-ctrl { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 8px 0 0 30px; }
.sugg { font-size: 13px; color: var(--muted); }
.sugg b { color: var(--text); }
.q { display: flex; gap: 4px; }
.q button { font-size: 13px; padding: 4px 8px; }
.q button.on[data-q=clean] { background: var(--clean); border-color: var(--clean); color: #fff; }
.q button.on[data-q=tense] { background: var(--tense); border-color: var(--tense); color: #000; }
.q button.on[data-q=fail] { background: var(--fail); border-color: var(--fail); color: #fff; }

.add-ex { display: flex; gap: 8px; margin: 12px 0; }
.add-ex select { flex: 1; min-width: 0; }
.sess-foot { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; margin-top: 16px; }
.sess-foot label { display: flex; flex-direction: column; gap: 4px; color: var(--muted); font-size: 13px; }
.sess-foot .grow { flex: 1; min-width: 220px; }
.sess-foot textarea { width: 100%; resize: vertical; color: var(--text); }

.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; }
.stat { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 10px 12px; }
.stat .v { font-size: 24px; font-weight: 700; }
.stat .k { color: var(--muted); font-size: 13px; }

.heatmap { display: grid; grid-auto-flow: column; grid-auto-columns: 14px; justify-content: start; grid-template-rows: repeat(7, 14px); gap: 3px; overflow-x: auto; padding-bottom: 4px; }
.heatmap div { width: 14px; height: 14px; border-radius: 3px; background: var(--heat0); }
.heatmap .l1 { background: var(--heat1); }
.heatmap .l2 { background: var(--heat2); }
.heatmap .l3 { background: var(--heat3); }
.heatmap .today { outline: 2px solid var(--text); outline-offset: -1px; }

#chartEx { width: 100%; max-width: 420px; }
.chart { margin-top: 10px; background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 8px; }
.chart svg { width: 100%; height: auto; display: block; }
.chart .axis { stroke: var(--line); }
.chart .lbl { fill: var(--muted); font-size: 11px; }
.chart .ln { fill: none; stroke: var(--accent); stroke-width: 2; }
.chart .pt-clean { fill: var(--clean); }
.chart .pt-tense { fill: var(--tense); }
.chart .pt-fail { fill: var(--fail); }
.chart .pt-none { fill: var(--muted); }
.chart .empty { color: var(--muted); padding: 24px; text-align: center; }
.legend { display: flex; gap: 14px; font-size: 12px; color: var(--muted); padding: 4px 8px 0; }
.legend i { display: inline-block; width: 9px; height: 9px; border-radius: 50%; margin-right: 4px; }
.hand-test { margin-top: 12px; }

.sess { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 10px 12px; margin-bottom: 8px; }
.sess-h { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.sess-h b { font-size: 15px; }
.sess ul { margin: 6px 0 0; padding-left: 18px; }
.sess li { font-size: 14px; }
.dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-left: 6px; }
.dot.clean { background: var(--clean); } .dot.tense { background: var(--tense); } .dot.fail { background: var(--fail); }
.sess .notes { color: var(--muted); font-size: 13px; margin-top: 6px; white-space: pre-wrap; }

.data-btns { display: flex; gap: 8px; flex-wrap: wrap; }
.file-btn { border: 1px solid var(--line); border-radius: 8px; padding: 6px 12px; cursor: pointer; background: var(--card); }
.file-btn input { display: none; }

.toast {
  position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%);
  background: var(--text); color: var(--bg); padding: 10px 16px; border-radius: 10px;
  opacity: 0; pointer-events: none; transition: opacity .2s;
}
.toast.show { opacity: 1; }

/* Ноты упражнения */
.notation { margin: 8px 0 0 30px; cursor: pointer; }
.notation .stave { display: block; max-width: 100%; height: auto; overflow: visible; }
.stave .st, .stave .bl, .stave .stem { stroke: var(--muted); stroke-width: 1.2; }
.stave .stem { stroke: var(--text); stroke-width: 1.4; }
.stave .clef, .stave .bm, .stave ellipse { fill: var(--text); }
.stave .acc { fill: none; stroke: var(--text); stroke-width: 1.6; stroke-linejoin: round; }
.stave .stk { fill: var(--text); font-size: 12px; font-weight: 700; text-anchor: middle; }
.stave .stk.l { fill: var(--accent); }
.stave .tri { fill: var(--muted); font-size: 10px; font-style: italic; text-anchor: middle; }
.stave .ph { stroke: var(--accent); stroke-width: 2; opacity: 0; }
.stave .ph.on { opacity: .85; }
.stave .n.now ellipse, .stave .n.now .stk { fill: var(--accent); }
.stave .n.now .stem, .stave .n.now .acc { stroke: var(--accent); }
.ex.active { box-shadow: inset 3px 0 0 var(--accent); }
.pat-v { display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: 4px; }
.pat-v button { font-size: 12px; padding: 2px 8px; color: var(--muted); }
.pat-v button.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); font-weight: 600; }
.pat-note { font-size: 12px; color: var(--muted); }
@media (max-width: 600px) { .notation { margin-left: 0; } }
.pat-v .reps { font-size: 12px; color: var(--muted); align-self: center; margin-left: 6px; font-variant-numeric: tabular-nums; }
.pat-v .reps.live { color: var(--accent); font-weight: 600; }
.notation .preview { margin-top: 6px; padding-top: 4px; border-top: 1px dashed var(--line); opacity: .8; }
.notation .preview-h { font-size: 12px; font-weight: 600; color: var(--accent); }
.ex { position: relative; }
.ex .countin {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font-size: 110px; font-weight: 800; color: var(--accent); opacity: .18;
  pointer-events: none; font-variant-numeric: tabular-nums;
}
.ex .countin.beat { animation: countin-beat .5s ease-out; }
@keyframes countin-beat { from { opacity: .45; transform: scale(1.15); } to { opacity: .18; transform: scale(1); } }
