:root{
  /* 基底：比原版深/冷一档，控制台感（旧名保留，4 板块自动继承） */
  --bg:#f1f3f8; --bg-sunk:#e7eaf2; --card:#fff; --card-2:#fafbfe;
  --ink:#1b2030; --ink-2:#3a4151; --muted:#8b92a3; --faint:#c2c8d2;
  --line:#dde1ec; --line-2:#eaecf3;
  /* 品牌点缀（靛蓝→violet 退为点缀） */
  --accent:#6366f1; --accent2:#8b5cf6; --accent-wash:#ecedfb;
  --grad:linear-gradient(145deg,var(--accent),var(--accent2));
  --ok:#10b981; --warn:#dc2626; --gold:#f59e0b;
  /* --shadow 保留为别名，三档阴影：默认轻 / hover 升 / 浮层 */
  --shadow:0 1px 2px rgba(28,32,48,.05); --sh-1:0 1px 2px rgba(28,32,48,.05);
  --sh-2:0 2px 8px rgba(28,32,48,.08); --sh-pop:0 8px 24px rgba(28,32,48,.14);
  /* JLPT 7 档级别色：入门最浅柔，升级渐深，N1 最重；泛听走中性石板灰 */
  --lv-intro:#5eb89a;--lv-intro-bg:#e8f5f0;--lv-intro-ln:#cfe9e0;
  --lv-n5:#3aa6a0;--lv-n5-bg:#e3f4f3;--lv-n5-ln:#c4e8e6;
  --lv-n4:#2f8fc7;--lv-n4-bg:#e4f1fa;--lv-n4-ln:#c5e2f3;
  --lv-n3:#3a6fd8;--lv-n3-bg:#e7eefc;--lv-n3-ln:#cdddfa;
  --lv-n2:#5654d6;--lv-n2-bg:#ebebfb;--lv-n2-ln:#d6d6f6;
  --lv-n1:#6d3fc4;--lv-n1-bg:#efe9fa;--lv-n1-ln:#ddd0f4;
  --lv-ext:#7c8696;--lv-ext-bg:#eef0f4;--lv-ext-ln:#dde1ea;
  --lv-none:#aab1bf;--lv-none-bg:#f0f2f6;--lv-none-ln:#e2e6ee;
  /* 字号 / 字重 / 圆角 / 间距 / 控件高 / 动效 */
  --fs-micro:11px;--fs-sm:12px;--fs-base:13px;--fs-md:14px;--fs-lg:16px;--fs-xl:20px;--fs-2xl:28px;
  --fw-semi:600;--fw-bold:700;
  --r-chip:6px;--r-sm:8px;--r-md:10px;--r-lg:12px;--r-pill:999px;
  --s1:4px;--s2:8px;--s3:12px;--s4:16px;--s5:20px;--s6:24px;--s8:32px;
  --ctl-h:30px;--row-h:34px;
  --ease:cubic-bezier(.2,.6,.2,1);--t-fast:.12s;--t:.2s;
}
/* 数字等宽：计数/百分比对齐防跳 */
body{font-feature-settings:"tnum" 1;-webkit-font-smoothing:antialiased}
.num,.pct,.lno,.cnt,.tally,.ov-v{font-variant-numeric:tabular-nums}
/* 级别色属性钩子：el.dataset.lv='n5' 即解析 --lv/--lv-bg/--lv-ln */
[data-lv=intro]{--lv:var(--lv-intro);--lv-bg:var(--lv-intro-bg);--lv-ln:var(--lv-intro-ln)}
[data-lv=n5]{--lv:var(--lv-n5);--lv-bg:var(--lv-n5-bg);--lv-ln:var(--lv-n5-ln)}
[data-lv=n4]{--lv:var(--lv-n4);--lv-bg:var(--lv-n4-bg);--lv-ln:var(--lv-n4-ln)}
[data-lv=n3]{--lv:var(--lv-n3);--lv-bg:var(--lv-n3-bg);--lv-ln:var(--lv-n3-ln)}
[data-lv=n2]{--lv:var(--lv-n2);--lv-bg:var(--lv-n2-bg);--lv-ln:var(--lv-n2-ln)}
[data-lv=n1]{--lv:var(--lv-n1);--lv-bg:var(--lv-n1-bg);--lv-ln:var(--lv-n1-ln)}
[data-lv=ext]{--lv:var(--lv-ext);--lv-bg:var(--lv-ext-bg);--lv-ln:var(--lv-ext-ln)}
[data-lv=none]{--lv:var(--lv-none);--lv-bg:var(--lv-none-bg);--lv-ln:var(--lv-none-ln)}
/* 全局微交互 + 无障碍降级 */
.studycard,.shelfitem,.catcard,.scard,.lrow{transition:transform var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease)}
.box{transition:background var(--t-fast),border-color var(--t-fast),transform .08s}
.box:active{transform:scale(.88)}
.tab,.chip,.seg,.subtab,.qbtn,.lvdot{transition:.15s var(--ease)}
@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
*{box-sizing:border-box}
[hidden]{display:none!important}
body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--ink)}
.muted{color:var(--muted)}.err{color:#dc2626;font-size:13px}
.gate{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:linear-gradient(160deg,#eef1f6,#e7eaf5)}
.gate-card{background:var(--card);padding:28px 32px;border-radius:16px;box-shadow:var(--shadow);width:320px;text-align:center}
.gate-card h1{font-size:20px;margin:0 0 4px}
.gate-card input{width:100%;padding:10px 12px;margin:14px 0 10px;border:1px solid var(--line);border-radius:10px;font-size:15px}
.gate-card button,.tab{cursor:pointer}
.gate-card button{width:100%;padding:10px;border:0;border-radius:10px;background:linear-gradient(145deg,var(--accent),var(--accent2));color:#fff;font-size:15px}
.topbar{display:flex;align-items:center;gap:14px;padding:10px 16px;background:var(--card);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:5}
.brand{font-weight:700}
.tabs{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tab{padding:8px 12px;border:0;background:transparent;border-radius:0;font-size:var(--fs-md);color:var(--muted);border-bottom:2px solid transparent;white-space:nowrap}
.tab:hover{color:var(--ink-2)}
.tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:var(--fw-semi)}
.sync{margin-left:auto;font-size:12px;color:var(--muted)}
main{max-width:1100px;margin:0 auto;padding:20px}
.series-group{margin-bottom:22px}
.series-name{font-size:12px;letter-spacing:1px;color:var(--muted);text-transform:uppercase;margin:0 0 10px}
.bookcard{background:var(--card);border-radius:14px;box-shadow:var(--shadow);padding:14px 16px;margin-bottom:14px}
.bookcard h3{margin:0 0 4px;font-size:15px}
.bookcard .meta{font-size:12px;color:var(--muted);margin-bottom:10px}
.progress{height:6px;border-radius:6px;background:var(--bg-sunk);overflow:hidden;margin-bottom:12px}
/* 一条规则两表现：带 data-lv 的容器染级别色，否则回落品牌渐变 */
.progress>div{height:100%;background:var(--lv,linear-gradient(90deg,var(--accent),var(--accent2)))}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{padding:5px 7px;border-bottom:1px solid var(--line);text-align:left}
th{font-size:11px;color:var(--muted);font-weight:600}
td.c,th.c{text-align:center;width:34px}
.box{width:18px;height:18px;border:2px solid #c7cbf5;border-radius:5px;display:inline-block;cursor:pointer;vertical-align:middle}
.box.on{background:var(--accent);border-color:var(--accent);position:relative}
.box.on::after{content:"✓";color:#fff;font-size:12px;position:absolute;left:3px;top:-2px}
.date-in{width:96px;border:1px solid var(--line);border-radius:6px;padding:3px 5px;font-size:12px}
.bookgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px}
.studycard{position:relative;background:var(--card);border-radius:12px;box-shadow:var(--sh-1);padding:12px 14px;cursor:pointer;border-left:3px solid var(--lv,transparent)}
.studycard:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
.sc-t{font-size:14px;font-weight:600;margin-bottom:4px;line-height:1.3}
.sc-m{font-size:11px}
.backbtn{border:1px solid var(--line);background:#fff;border-radius:8px;padding:6px 12px;font-size:13px;cursor:pointer;margin-bottom:12px}
.backbtn:hover{background:#f3f3f3}
.addform{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:#fff;border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:14px}
.addform input{border:1px solid var(--line);border-radius:8px;padding:6px 10px;font-size:13px}
.addform #isbnin,.addform #qin{min-width:230px}
.addform button{font-size:13px;padding:6px 12px;border:1px solid var(--line);border-radius:8px;background:#fff;cursor:pointer}
.addform #isbngo,.addform #qgo{background:linear-gradient(145deg,var(--accent),var(--accent2));color:#fff;border:0}
.addform .cancel{color:var(--muted)}
.addform .addstatus{font-size:12px}
.scanwrap{flex-basis:100%;margin-top:8px}
.scanwrap video{width:100%;max-width:360px;border-radius:10px;background:#000}
.rtoolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:14px}
.rtoolbar button,.importbtn{font-size:13px;padding:6px 12px;border:1px solid var(--line);border-radius:8px;background:#fff;cursor:pointer}
.rtoolbar #add-isbn,.rtoolbar #add-series{background:linear-gradient(145deg,var(--accent),var(--accent2));color:#fff;border:0}
.rfilters{display:flex;gap:4px;margin-left:8px}
.rf{border-radius:20px!important;color:var(--muted)}
.rf.on{background:var(--accent-wash)!important;color:var(--accent)}
.shelf{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:16px}
.shelfitem{background:var(--card);border-radius:var(--r-lg);box-shadow:var(--sh-1);padding:10px;cursor:pointer}
.shelfitem:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
.cv{width:100%;height:180px;object-fit:cover;border-radius:8px;display:block}
.cv.ph{display:flex;align-items:flex-end;color:#fff;padding:8px;font-size:12px;font-weight:600;box-shadow:0 4px 10px rgba(99,102,241,.25)}
.si-t{font-size:13px;font-weight:600;margin:8px 0 2px;line-height:1.3}
.si-m{font-size:11px}
.det{margin-top:16px}
.det-h{display:flex;justify-content:space-between;align-items:center}
.det-h button{border:0;background:none;cursor:pointer;font-size:16px}
.det-actions{display:flex;gap:10px;align-items:center}
.det-actions .del{font-size:13px;color:#dc2626;border:1px solid #f3c2c2;border-radius:6px;padding:2px 10px}
.det-actions .del:hover{background:#fdecec}
.det-row{display:flex;gap:10px;align-items:center;font-size:13px;margin:10px 0;flex-wrap:wrap}
.det-row select,.tv{border:1px solid var(--line);border-radius:6px;padding:3px 6px}
.tv{width:60px}
.vols{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.vol{display:flex;flex-direction:column;align-items:center;gap:3px;border:1px solid var(--line);border-radius:8px;padding:6px 8px}
.vno{font-size:12px;color:var(--muted)}
.vb{width:26px;height:24px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer;font-size:12px}
.vol.issue{min-width:84px}
.vol.issue .vno{white-space:nowrap;font-size:11px}
.vb.own.on{background:#fde68a;border-color:#f59e0b}
.vb.read.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.note{width:100%;min-height:54px;border:1px solid var(--line);border-radius:8px;padding:8px;font-family:inherit;font-size:13px;margin-top:6px}
/* ---- 运动板块 ---- */
.subtabs{display:flex;gap:6px;margin-bottom:16px}
.subtab{cursor:pointer;padding:6px 14px;border:1px solid var(--line);background:#fff;border-radius:20px;font-size:14px;color:var(--muted)}
.subtab.active{background:var(--accent-wash);color:var(--accent);border-color:transparent}
.f-hint{font-size:13px;line-height:1.6;margin:4px 0 14px}
.f-stats{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.statcard{background:var(--card);border-radius:12px;box-shadow:var(--shadow);padding:14px 16px}
.stat-n{font-size:28px;font-weight:700;line-height:1}
.stat-goal{font-size:15px;color:var(--muted);font-weight:600}
.stat-l{font-size:12px;margin-top:6px}
.stat-sub{font-size:11px;margin-top:4px}
.stat-sub.warn{color:#dc2626}
.statcard .progress{margin-top:8px;margin-bottom:0}
/* 力量：范畴卡 → 级别行 → 历史 */
.exo-bar{display:flex;align-items:center;gap:12px;margin-bottom:12px;flex-wrap:wrap}
.segctrl{display:inline-flex;background:var(--bg-sunk);border-radius:12px;padding:3px;gap:2px}
.seg{border:0;background:transparent;border-radius:10px;padding:7px 18px;font-size:14px;font-weight:600;color:var(--muted);cursor:pointer}
.seg.on{background:#fff;color:var(--accent);box-shadow:0 1px 3px rgba(30,40,60,.12)}
.histbtn{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:10px;padding:7px 14px;font-size:13px;cursor:pointer}
.histbtn:hover{background:#f3f3f3}
.exo-desc{font-size:12px;margin:0 2px 16px;line-height:1.6}
.catgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}
.catcard{display:flex;align-items:center;gap:12px;text-align:left;background:var(--card);border:0;border-radius:16px;box-shadow:var(--shadow);padding:12px;cursor:pointer;transition:transform .1s}
.catcard:hover{transform:translateY(-2px)}
.catname{font-size:16px;font-weight:700}
.catsub{font-size:12px;margin-top:3px}
/* 演示图（两帧交替的小动图） */
.exg-wrap{position:relative;width:84px;height:84px;flex:0 0 84px;border-radius:12px;overflow:hidden;background:linear-gradient(150deg,#eef0fb,#e7eaf5);display:flex;align-items:center;justify-content:center}
.exg-wrap.cat{width:64px;height:64px;flex-basis:64px}
.exg-ph{font-size:26px}
.exg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#fff}
.cat-h{display:flex;align-items:baseline;gap:12px;margin:6px 0 16px}
.cat-title{margin:0;font-size:20px}
.levels{display:flex;flex-direction:column;gap:12px}
.lvrow{display:flex;gap:14px;background:var(--card);border-radius:16px;box-shadow:var(--shadow);padding:14px 16px}
.lvrow.cur{outline:2px solid var(--accent)}
.lv-main{flex:1;min-width:0}
.lv-top{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.lv-no{font-size:12px;font-weight:700;color:#fff;background:linear-gradient(145deg,var(--accent),var(--accent2));border-radius:6px;padding:2px 8px}
.lv-name{font-size:16px;font-weight:600}
.lv-demo{font-size:12px;color:var(--accent);text-decoration:none;margin-left:auto;white-space:nowrap}
.lv-tgt{font-size:12px;margin:6px 0 10px}
.lv-log{display:flex;gap:8px;flex-wrap:wrap}
.lv-in{width:52px;border:1px solid var(--line);border-radius:10px;padding:7px;font-size:14px;text-align:center}
.lv-rec{background:linear-gradient(145deg,var(--accent),var(--accent2));color:#fff;border:0;border-radius:10px;padding:7px 16px;font-size:14px;cursor:pointer}
.exo-ok{color:var(--ok);font-weight:600}
.histlist{display:flex;flex-direction:column}
.hist-date{font-size:12px;color:var(--muted);font-weight:600;margin:14px 0 6px}
.hist-row{display:flex;align-items:center;gap:10px;background:var(--card);border-radius:10px;box-shadow:var(--shadow);padding:10px 14px;margin-bottom:6px}
.hist-mv{font-weight:600;font-size:14px;min-width:96px}
.hist-lv{font-size:12px;flex:1}
.hist-val{font-size:14px;font-weight:600}
.hist-del{border:0;background:none;color:var(--muted);cursor:pointer;font-size:14px}
.hist-del:hover{color:#dc2626}
.lv-cue{font-size:13px;line-height:1.5;margin:4px 0 2px;color:#3a4151}
/* 训练方案 */
.program{max-width:760px}
.pg-sec{margin:0 0 18px}
.pg-sec h3{font-size:15px;margin:0 0 6px}
.pg-sec p{font-size:14px;line-height:1.7;margin:0;color:#3a4151}
.pg-hero{background:var(--card);border-radius:14px;box-shadow:var(--shadow);padding:16px 18px}
.pg-focus{font-size:12px;margin:0 0 10px}
.pg-table{width:100%;border-collapse:collapse;font-size:13px}
.pg-table th{font-size:11px;color:var(--muted);text-align:left;padding:6px 8px;border-bottom:1px solid var(--line)}
.pg-table td{padding:8px;border-bottom:1px solid var(--line);vertical-align:top}
.pg-pat{font-weight:600;min-width:92px}
.pg-sch{white-space:nowrap}
.pg-note{font-size:12px;line-height:1.5}
.pg-cite{font-size:12px;color:var(--muted);margin:0;padding-left:18px;line-height:1.8}
/* 骑行卡片 */
.f-cfg{margin-bottom:10px}
.f-cfg label{font-size:13px;display:flex;align-items:center;gap:6px}
.f-cfg input{width:90px}
.shelf.rides{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.rideitem{padding:12px 14px}
.ri-top{display:flex;justify-content:space-between;font-size:12px}
.ri-date{font-weight:600}
.ri-big{font-size:26px;font-weight:700;margin:6px 0 2px}
.ri-u{font-size:13px;color:var(--muted);font-weight:600}
/* 心率分区条 */
.zones{margin:12px 0}
.zrow{display:flex;align-items:center;gap:8px;margin:5px 0;font-size:12px}
.zlbl{width:64px;color:var(--muted)}
.zbar{flex:1;height:10px;background:#eef0f4;border-radius:6px;overflow:hidden}
.zfill{height:100%}
.zval{width:64px;text-align:right}
.zfill.z1{background:#7c8696}.zfill.z2{background:#3aa6a0}.zfill.z3{background:#3a6fd8}.zfill.z4{background:#8b5cf6}.zfill.z5{background:#dc2626}
/* ===== 听力板块「素材控制台」===== */
.lvchip{display:inline-block;font-size:var(--fs-micro);font-weight:var(--fw-bold);padding:2px 8px;border-radius:var(--r-pill);color:var(--lv,var(--ink-2));background:var(--lv-bg,var(--bg-sunk))}
/* 总览带（取代 hero） */
.overview{display:flex;gap:8px;padding:0 0 12px;overflow-x:auto;scrollbar-width:none}
.overview::-webkit-scrollbar{display:none}
.ov{flex:0 0 auto;min-width:132px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 10px;box-shadow:var(--sh-1)}
.ov-k{font-size:var(--fs-micro);color:var(--muted);white-space:nowrap}
.ov-v{font-size:18px;font-weight:var(--fw-bold);line-height:1.1;margin:2px 0 6px}
.ov .progress{height:4px;margin:0}
/* 听力工具栏（sticky，复用 .segctrl/.seg） */
.l-toolbar{position:sticky;top:49px;z-index:3;display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px 0;margin-bottom:6px;background:var(--bg);border-bottom:1px solid var(--line)}
.l-search{flex:1;min-width:170px;height:var(--ctl-h);border:1px solid var(--line);border-radius:var(--r-md);padding:0 10px;font-size:var(--fs-base);background:var(--card)}
.chips{display:flex;gap:4px;flex-wrap:wrap}
.chip{height:var(--ctl-h);display:inline-flex;align-items:center;padding:0 10px;font-size:var(--fs-sm);color:var(--muted);background:var(--card);border:1px solid var(--line);border-radius:var(--r-chip);cursor:pointer}
.chip:hover{border-color:var(--faint)}
.chip.on{background:var(--accent-wash);color:var(--accent);border-color:transparent;font-weight:var(--fw-semi)}
.l-toolbar .seg{padding:0 12px;height:var(--ctl-h);display:inline-flex;align-items:center;font-size:var(--fs-sm)}
/* 级别快跳 dot */
.lvjump{display:flex;gap:6px;margin-left:auto;align-items:center}
.lvdot{width:13px;height:13px;border-radius:50%;background:var(--lv,var(--faint));opacity:.5;cursor:pointer;border:0}
.lvdot:hover,.lvdot.on{opacity:1;box-shadow:0 0 0 3px var(--lv-bg,var(--bg-sunk))}
/* 级别分组带 */
.lv-band{display:flex;align-items:center;gap:10px;margin:18px 0 10px;scroll-margin-top:100px}
.lv-band .dot{width:10px;height:10px;border-radius:3px;background:var(--lv,var(--faint));flex:0 0 auto}
.lv-band .name{font-size:var(--fs-lg);font-weight:var(--fw-bold)}
.lv-band .cnt{font-size:var(--fs-sm);color:var(--muted)}
.lv-band .barwrap{flex:1;max-width:160px;height:4px;border-radius:4px;background:var(--bg-sunk);overflow:hidden}
.lv-band .barwrap>i{display:block;height:100%;background:var(--lv,var(--accent))}
/* 系列卡 */
.scards{display:grid;grid-template-columns:repeat(auto-fill,minmax(244px,1fr));gap:10px}
.scard{position:relative;background:var(--card);border:1px solid var(--line);border-left:3px solid var(--lv,var(--line));border-radius:var(--r-md);box-shadow:var(--sh-1);padding:10px 12px;cursor:pointer}
.scard:hover{box-shadow:var(--sh-2);transform:translateY(-1px);border-color:var(--lv-ln,var(--faint))}
.scard .pct{position:absolute;top:8px;right:10px;font-size:var(--fs-md);font-weight:var(--fw-bold);color:var(--lv,var(--ink-2))}
.scard .t{font-size:var(--fs-md);font-weight:var(--fw-semi);margin:0 46px 6px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.scard .meta{display:flex;gap:5px;flex-wrap:wrap;align-items:center;font-size:var(--fs-sm);color:var(--muted);margin-bottom:6px}
.scard .src-badge{padding:1px 7px;border-radius:var(--r-pill);background:var(--bg-sunk);font-size:var(--fs-micro);color:var(--ink-2);font-weight:var(--fw-semi)}
.scard .skill{padding:1px 7px;border-radius:var(--r-pill);background:var(--bg-sunk);font-size:var(--fs-micro)}
.scard .src-sub,.dhead .src-sub{font-size:var(--fs-micro);color:var(--muted)}
.scard .fmt{font-size:var(--fs-micro);color:var(--muted);margin-bottom:6px}
.scard .progress{height:4px;margin:0 0 4px}
.scard .cnt{font-size:var(--fs-micro);color:var(--muted)}
/* 详情头 */
.dhead{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--lv,var(--line));border-radius:var(--r-lg);box-shadow:var(--sh-1);padding:14px 16px;margin-bottom:14px}
.dhead h2{margin:0 0 8px;font-size:var(--fs-xl)}
.dhead .meta{display:flex;gap:6px;flex-wrap:wrap;align-items:center;font-size:var(--fs-sm);color:var(--muted);margin-bottom:10px}
.dhead .src-badge{padding:1px 8px;border-radius:var(--r-pill);background:var(--bg-sunk);font-size:var(--fs-micro);color:var(--ink-2);font-weight:var(--fw-semi)}
.dhead .skill{padding:1px 8px;border-radius:var(--r-pill);background:var(--bg-sunk);font-size:var(--fs-micro)}
.dhead .progress{height:7px;margin:0}
/* 整季快捷条 */
.season-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 10px;margin:14px 0 8px;background:var(--lv-bg,var(--card-2));border:1px solid var(--lv-ln,var(--line));border-radius:var(--r-md)}
.season-bar .stitle{font-weight:var(--fw-semi);font-size:var(--fs-md)}
.qbtn{height:var(--ctl-h);padding:0 12px;font-size:var(--fs-sm);background:var(--card);border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;color:var(--ink-2)}
.qbtn:hover{border-color:var(--lv,var(--accent));color:var(--lv,var(--accent))}
.season-bar .tally{margin-left:auto;font-size:var(--fs-base);font-weight:var(--fw-semi)}
.season-bar .tally b{color:var(--lv,var(--accent))}
/* 课程行 */
.lessons{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--card)}
.lrow{display:flex;align-items:center;gap:10px;min-height:var(--row-h);padding:6px 12px;font-size:var(--fs-base);border-bottom:1px solid var(--line-2);cursor:pointer}
.lrow:nth-child(even){background:var(--card-2)}
.lrow:last-child{border-bottom:0}
.lrow:hover{background:var(--accent-wash)}
.lrow .lno{width:34px;text-align:right;color:var(--muted);font-size:var(--fs-sm)}
.lrow .lbl{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lrow .vid{font-size:11px;color:var(--accent)}
.lrow .last{font-size:var(--fs-micro);color:var(--muted);white-space:nowrap;min-width:40px;text-align:right;font-variant-numeric:tabular-nums}
/* 遍数计数器：点行 +1（今天又听一遍），↺ 撤销 */
.lrow .rep{display:inline-flex;align-items:center;gap:4px;min-width:60px}
.rep-c{display:inline-flex;align-items:center;gap:3px;height:24px;padding:0 9px;border-radius:var(--r-pill);font-size:var(--fs-sm);font-weight:var(--fw-bold);border:1px solid var(--line);background:var(--card);color:var(--faint);font-variant-numeric:tabular-nums}
.rep-ic{font-size:12px;filter:grayscale(1);opacity:.55}
.lrow.done .rep-c{color:var(--lv,var(--accent));background:var(--lv-bg,var(--accent-wash));border-color:var(--lv-ln,transparent)}
.lrow.done .rep-ic{filter:none;opacity:1}
.lrow:hover .rep-c{border-color:var(--lv,var(--accent));color:var(--lv,var(--accent))}
.rep-undo{border:0;background:none;color:var(--faint);cursor:pointer;font-size:15px;line-height:1;padding:0 3px}
.rep-undo:hover{color:var(--warn)}
.l-tip{font-size:var(--fs-sm);margin:0 2px 6px}

/* 遍数色阶（×10 熟练 / ×25 金）+ 行内相对底衬条（Last.fm 式：条长 = 本书内相对遍数） */
.rep-c[data-tier="ok"]{color:var(--ok);background:color-mix(in srgb,var(--ok) 12%,transparent);border-color:color-mix(in srgb,var(--ok) 35%,transparent)}
.rep-c[data-tier="gold"]{color:var(--gold);background:color-mix(in srgb,var(--gold) 14%,transparent);border-color:color-mix(in srgb,var(--gold) 40%,transparent)}
.lrow .rep-meter{width:52px;height:5px;border-radius:3px;background:var(--line-2);overflow:hidden;flex:none}
.lrow .rep-meter>i{display:block;height:100%;border-radius:3px;background:var(--lv,var(--accent));opacity:.65;width:0;transition:width var(--t-fast) var(--ease)}
.lrow .last{min-width:72px}

/* CD/分卷组条（比整本条轻一档，吸顶跟住滚动）+ 批量撤销提示 + 行内 CD 短标签 */
.season-bar.cd-bar{margin:10px 0 6px;padding:6px 10px;background:var(--card);position:sticky;top:49px;z-index:2}
.lgrp{flex:none;padding:1px 7px;border-radius:var(--r-pill);font-size:var(--fs-micro);font-weight:var(--fw-semi);background:var(--lv-bg,var(--bg-sunk));color:var(--lv,var(--ink-2));border:1px solid var(--lv-ln,transparent);font-variant-numeric:tabular-nums}
.season-bar.cd-bar .stitle{font-size:var(--fs-sm);color:var(--ink-2)}
.season-bar .batchmsg{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-sm);color:var(--ok)}
.season-bar .batchmsg .undo-batch{height:22px;padding:0 8px}
.qbtn-danger:hover{border-color:var(--warn);color:var(--warn)}

/* 「耳から覚える」专页：书架卡（卡上直接整本 +1）+ 28 天热力条 */
.mk-head h2{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.mk-head .mk-sub{font-size:var(--fs-sm);color:var(--muted);font-weight:var(--fw-normal,400)}
.mk-heat{display:flex;align-items:center;gap:3px;margin:2px 2px 6px}
.mk-heat>i{width:14px;height:14px;border-radius:3px;background:var(--bg-sunk)}
.mk-heat>i[data-t="1"]{background:color-mix(in srgb,var(--accent) 25%,var(--bg-sunk))}
.mk-heat>i[data-t="2"]{background:color-mix(in srgb,var(--accent) 45%,var(--bg-sunk))}
.mk-heat>i[data-t="3"]{background:color-mix(in srgb,var(--accent) 70%,var(--bg-sunk))}
.mk-heat>i[data-t="4"]{background:var(--accent)}
.mk-heat .mk-heat-cap{font-size:var(--fs-micro);color:var(--faint);margin-left:6px}
.mkgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px}
.mkcard{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--lv,var(--line));border-radius:var(--r-md);box-shadow:var(--sh-1);padding:10px 12px;cursor:pointer;transition:transform var(--t-fast) var(--ease),box-shadow var(--t-fast) var(--ease)}
.mkcard:hover{transform:translateY(-1px);box-shadow:var(--sh-2,var(--sh-1))}
.mkcard .mk-row1{display:flex;align-items:center;margin-bottom:4px}
.mkcard .mk-type{padding:1px 8px;border-radius:var(--r-pill);background:var(--lv-bg,var(--bg-sunk));color:var(--lv,var(--ink-2));font-size:var(--fs-micro);font-weight:var(--fw-semi);border:1px solid var(--lv-ln,transparent)}
.mkcard .mk-rounds{margin-left:auto;font-size:var(--fs-md);font-weight:var(--fw-bold);color:var(--lv,var(--ink-2))}
.mkcard .mk-rounds[data-tier="ok"]{color:var(--ok)}
.mkcard .mk-rounds[data-tier="gold"]{color:var(--gold)}
.mkcard .mk-name{font-size:var(--fs-md);font-weight:var(--fw-semi);margin-bottom:6px}
.mkcard .mk-hint{font-size:var(--fs-micro);font-weight:400}
.mkcard .progress{height:4px;margin:0 0 5px}
.mkcard .mk-cnt{font-size:var(--fs-micro);color:var(--muted);margin-bottom:8px;min-height:1.2em}
.mkcard .mk-cnt b{color:var(--ok)}
.mkcard .mk-actions{display:flex;align-items:center;gap:8px}
@media (max-width:640px){.mkgrid{grid-template-columns:1fr}.mk-heat>i{width:10px;height:10px}}

/* 原始收听日志：按天倒序，精确到分 */
.l-log{border:1px solid var(--line);border-radius:var(--r-md);background:var(--card);margin:0 0 10px;max-height:420px;overflow-y:auto}
.l-log .log-day{display:flex;align-items:center;gap:8px;padding:7px 12px 4px;position:sticky;top:0;background:var(--card);border-bottom:1px solid var(--line-2)}
.l-log .log-date{font-weight:var(--fw-semi);font-size:var(--fs-sm)}
.l-log .log-n{font-size:var(--fs-micro);color:var(--muted);margin-left:auto}
.l-log .log-row{display:flex;align-items:baseline;gap:10px;padding:3px 12px;font-size:var(--fs-sm)}
.l-log .log-row:nth-child(even){background:var(--card-2)}
.l-log .log-t{color:var(--muted);font-variant-numeric:tabular-nums;width:40px;flex:none}
.l-log .log-lbl{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.l-log .log-grp{font-size:var(--fs-micro);color:var(--faint);white-space:nowrap}
.ov-sub{font-size:var(--fs-micro);color:var(--muted);margin-top:4px}
@media(max-width:560px){
  .topbar{gap:8px;padding:8px 12px}
  .tab{padding:7px 9px;font-size:var(--fs-base)}
  .l-toolbar{top:45px}
  .scards{grid-template-columns:1fr}
  .lvjump{margin-left:0;order:9}
}
/* ===== 骑行训练仪表盘 ===== */
:root{
  --tr-ready:var(--ok);--tr-ready-bg:#e6f7f0;
  --tr-mod:var(--gold);--tr-mod-bg:#fef4e3;
  --tr-low:var(--warn);--tr-low-bg:#fdecec;
  --tr-rest:var(--lv-ext);--tr-rest-bg:var(--lv-ext-bg);
  --ln-chronic:var(--accent);--ln-acute:var(--accent2);--ln-form:var(--ok);
}
.exo-bar .seg-title{margin-right:auto;font-size:var(--fs-lg)}
.start-plan{display:flex;gap:10px;align-items:center;flex-wrap:wrap;background:var(--lv-ext-bg);border:1px solid var(--line);border-radius:var(--r-md);padding:8px 12px;margin-bottom:14px;font-size:var(--fs-sm);color:var(--ink-2)}
/* 今日处方卡（整站唯一渐变描边，制造焦点） */
.rx-card{position:relative;border:1px solid transparent;border-radius:var(--r-lg);padding:16px 18px;margin-bottom:18px;background:linear-gradient(var(--card),var(--card)) padding-box,var(--grad) border-box;box-shadow:var(--sh-2)}
.rx-card.is-rest{background:linear-gradient(var(--card),var(--card)) padding-box,var(--tr-rest) border-box}
.rx-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap}
.rx-meta{font-size:var(--fs-sm);color:var(--muted)}
.rx-type{font-size:var(--fs-2xl);font-weight:var(--fw-bold);line-height:1.05;margin:6px 0 2px;display:flex;align-items:center;gap:8px}
.rx-struct{font-size:var(--fs-md);color:var(--ink-2);font-variant-numeric:tabular-nums}
.rx-why,.rx-feel{font-size:var(--fs-base);line-height:1.6;margin:6px 0 0}
.rx-why b,.rx-feel b{color:var(--muted);font-weight:var(--fw-semi)}
.rx-flag{font-size:var(--fs-sm);color:var(--tr-mod);margin-top:6px}
.rx-detail{font-size:var(--fs-sm);color:var(--muted);margin-top:10px;font-variant-numeric:tabular-nums;line-height:1.6}
.rx-cmd{font-size:var(--fs-sm);color:var(--muted);margin-top:8px;text-align:right}
.rx-cmd code{background:var(--bg-sunk);border-radius:var(--r-chip);padding:1px 6px}
/* 准备度环 */
.gauge-wrap{display:flex;flex-direction:column;align-items:center;gap:2px;flex-shrink:0}
.gauge{width:64px;height:64px;transform:rotate(-90deg)}
.g-track{fill:none;stroke:var(--bg-sunk);stroke-width:7}
.g-val{fill:none;stroke:var(--tr-ready);stroke-width:7;stroke-linecap:round;transition:stroke-dashoffset .6s var(--ease)}
.gauge[data-band=mod] .g-val{stroke:var(--tr-mod)}.gauge[data-band=low] .g-val{stroke:var(--tr-low)}.gauge[data-band=rest] .g-val{stroke:var(--tr-rest)}
.g-num{transform:rotate(90deg);transform-origin:center;text-anchor:middle;font-size:20px;font-weight:700;fill:var(--ink);font-variant-numeric:tabular-nums}
.gauge-lbl{font-size:var(--fs-micro)}
/* 训练状态徽章 */
.tr-pill{display:inline-flex;align-items:center;gap:6px;background:var(--tr-ready-bg);color:var(--tr-ready);border-radius:var(--r-pill);padding:4px 12px;font-size:var(--fs-sm);font-weight:var(--fw-semi);margin:0 0 10px}
.tr-pill .dot{width:8px;height:8px;border-radius:50%;background:currentColor}
.tr-pill[data-st=维持]{background:var(--tr-mod-bg);color:var(--tr-mod)}
.tr-pill[data-st=过劳],.tr-pill[data-st=紧张]{background:var(--tr-low-bg);color:var(--tr-low)}
.tr-pill[data-st=恢复]{background:var(--tr-rest-bg);color:var(--tr-rest)}
/* 指标卡内嵌可视化 */
.balance-bar{height:8px;border-radius:var(--r-pill);position:relative;margin-top:8px;background:linear-gradient(90deg,var(--tr-rest-bg) 0 30%,var(--tr-ready-bg) 30% 65%,var(--tr-mod-bg) 65% 82%,var(--tr-low-bg) 82%)}
.balance-bar .dot{position:absolute;top:-3px;width:14px;height:14px;border-radius:50%;background:#fff;border:3px solid var(--tr-ready);transform:translateX(-50%)}
.spark{width:60px;height:20px;display:block;margin-top:6px}
.spark polyline{fill:none;stroke:var(--accent);stroke-width:1.5}
/* 本周块 */
.wk-block{margin:8px 0 16px}
.wk-h{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}
.zstack{display:flex;height:14px;border-radius:var(--r-pill);overflow:hidden;margin:8px 0}
.zstack>span.z1{background:#7c8696}.zstack>span.z2{background:#3aa6a0}.zstack>span.z3{background:#3a6fd8}.zstack>span.z4{background:#8b5cf6}.zstack>span.z5{background:#dc2626}
/* 周历热力 */
.weekcal{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;margin:10px 0}
.wc-cell{aspect-ratio:1;border-radius:var(--r-sm);background:var(--accent);display:flex;flex-direction:column;align-items:center;justify-content:center;color:#fff;cursor:pointer;position:relative;gap:2px}
.wc-cell.empty{background:var(--bg-sunk);color:var(--muted);cursor:default}
.wc-cell.today{box-shadow:0 0 0 2px var(--accent)}
.wc-d{font-size:11px;opacity:.85}.wc-ic{font-size:15px}
/* 最近骑行 mini 行 */
.mini-rides{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--card);margin-top:4px}
.mini-ride{display:flex;align-items:center;gap:10px;padding:8px 12px;font-size:var(--fs-base);cursor:pointer;border-bottom:1px solid var(--line-2)}
.mini-ride:last-child{border-bottom:0}.mini-ride:hover{background:var(--accent-wash)}
.mini-ride .mr-d{color:var(--muted);font-size:var(--fs-sm);width:92px}.mini-ride .mr-m{flex:1}.mini-ride .mr-l{color:var(--muted);font-size:var(--fs-sm)}
/* 负荷三线折叠 */
.tr-fold{margin-top:14px}.tr-fold>summary{cursor:pointer;font-size:var(--fs-md);color:var(--ink-2);padding:6px 0}
.loadchart{overflow-x:auto}.loadchart svg{display:block;min-width:360px;width:100%;height:150px}
.lc-chronic{fill:none;stroke:var(--ln-chronic);stroke-width:2;stroke-linejoin:round}
.lc-acute{fill:none;stroke:var(--ln-acute);stroke-width:2;stroke-linejoin:round}
.lc-legend{display:flex;gap:14px;flex-wrap:wrap;font-size:var(--fs-sm);color:var(--muted);margin-top:4px}
.lc-legend i{display:inline-block;width:14px;height:2px;vertical-align:middle;margin-right:4px}
/* 计划页 */
.blk-h{display:flex;align-items:baseline;gap:8px}
.wp-row{display:grid;grid-template-columns:repeat(7,1fr);gap:5px;margin-top:4px}
.wp-cell{display:flex;flex-direction:column;align-items:center;gap:2px;background:var(--bg-sunk);border-radius:var(--r-sm);padding:6px 2px;font-size:var(--fs-micro);color:var(--ink-2)}
.wp-ic{font-size:16px}.wp-d{color:var(--muted)}.wp-l{font-size:10px;text-align:center;line-height:1.2}
.rc-row{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;padding:7px 0;border-bottom:1px solid var(--line-2);font-size:var(--fs-sm)}
.rc-row:last-child{border-bottom:0}.rc-ic{font-size:15px}.rc-l{font-weight:var(--fw-semi);min-width:54px}.rc-t{min-width:74px}.rc-z{min-width:120px;color:var(--accent)}.rc-s{flex:1;min-width:200px;line-height:1.5}
.hist-tools{margin-bottom:14px}.hist-tools>summary{cursor:pointer;padding:6px 0}
@media(max-width:560px){.rc-z,.rc-s{min-width:100%}.rx-type{font-size:22px}.mini-ride .mr-d{width:70px}}
/* 骑行历史：周分组 + 迷你分区条 + 详情地点 */
.wk-hdr{display:flex;justify-content:space-between;align-items:baseline;gap:8px;margin:16px 0 8px;font-size:var(--fs-sm)}
.wk-hdr .wk-rng{font-weight:var(--fw-semi);font-size:var(--fs-base)}
.rideitem .zmini{display:flex;height:6px;border-radius:3px;overflow:hidden;margin-top:8px}
.zmini>span.z1{background:#7c8696}.zmini>span.z2{background:#3aa6a0}.zmini>span.z3{background:#3a6fd8}.zmini>span.z4{background:#8b5cf6}.zmini>span.z5{background:#dc2626}
.det-loc{font-size:var(--fs-sm);margin:0 0 8px}
/* 骑行详情弹窗（覆盖层，桌面居中 / 手机底部 sheet，不再塞列表底部） */
body.modal-open{overflow:hidden}
.ride-ov{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;background:rgba(18,22,34,.5);padding:16px;animation:ovfade .15s var(--ease)}
@keyframes ovfade{from{opacity:0}to{opacity:1}}
.ride-modal{background:var(--card);border-radius:var(--r-lg);box-shadow:var(--sh-pop);width:100%;max-width:560px;max-height:86vh;overflow:auto;padding:14px 18px 18px}
.rm-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;position:sticky;top:0;background:var(--card);padding:4px 0 6px;margin-bottom:2px;z-index:1}
.rm-head h3{margin:0;font-size:var(--fs-lg);line-height:1.3}
.rm-x{border:0;background:var(--bg-sunk);color:var(--muted);width:30px;height:30px;border-radius:50%;cursor:pointer;font-size:14px;flex:0 0 auto;line-height:1}
.rm-x:hover{background:var(--line);color:var(--ink)}
.rm-note-l{display:block;font-size:var(--fs-sm);margin:12px 0 4px}
.rm-foot{margin-top:14px;text-align:right}
.rm-foot .del{font-size:var(--fs-sm);color:var(--warn);border:1px solid #f3c2c2;border-radius:var(--r-sm);padding:6px 14px;background:#fff;cursor:pointer}
.rm-foot .del:hover{background:#fdecec}
@media(max-width:560px){.ride-ov{align-items:flex-end;padding:0}.ride-modal{max-width:none;max-height:92vh;border-radius:var(--r-lg) var(--r-lg) 0 0;animation:sheetup .22s var(--ease)}}
@keyframes sheetup{from{transform:translateY(100%)}to{transform:translateY(0)}}
@media print{.topbar,.gate,.sync{display:none!important}main{max-width:none;padding:0}.bookcard{break-inside:avoid;box-shadow:none;border:1px solid #ccc}}
