/* 首页看板：卡片尺寸与叠放、块 + token 自由排版（类名对着 pa/card_blocks.py）、播放器块与按钮块 */
.board{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-6);align-items:start;grid-auto-flow:dense}
.slot{min-width:0}.slot.s{grid-column:span 1}.slot.l{grid-column:1/-1}   /* 只有两种：小 = 半行（一排两张），大 = 整行 */
@media (max-width:720px){.board{grid-template-columns:minmax(0,1fr)}}   /* 窄屏：小卡也整行 */
.stack{display:flex;gap:var(--sp-6);overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none}
.stack::-webkit-scrollbar{display:none}.stack>.mcard{flex:0 0 100%;scroll-snap-align:start}
.dots{display:flex;justify-content:center;gap:var(--sp-3);margin-top:var(--sp-3)}
.dots button{width:7px;height:7px;padding:0;border:0;border-radius:50%;background:var(--line);cursor:pointer}.dots button.on{background:var(--accent)}
.mcard .more{border:0;background:none;color:var(--muted);cursor:pointer;padding:0 var(--sp-3);border-radius:var(--radius-sm);font-size:var(--text-heading);line-height:1}
.mcard .more:hover{background:var(--bg);color:var(--text)}
.mcard .drop .menu{left:auto;right:0;max-width:min(280px,calc(100vw - 16px))}.mcard .drop .menu button{white-space:normal}
.mcard .menu .sz{display:inline-block;width:auto;padding:3px 9px;margin-left:var(--sp-1);border:1px solid var(--line)}
.mcard .idea{border:0;padding:var(--sp-3) 0;margin:0;border-top:1px solid var(--line);border-radius:0;background:none}
.mcard .idea:first-child{border-top:0}
.mcard .idea{flex-wrap:wrap;gap:var(--sp-4)}.mcard .idea .ideaic{display:none}.mcard .idea .txt{flex:1 1 96px}.ibtns{display:flex;gap:var(--sp-3);flex:none;margin-left:auto}
.slot.s .ibtns,.slot.l .ibtns{flex-direction:column;align-self:center}
.ibtn{flex:none;width:26px;height:26px;padding:0;border-radius:50%;border:1px solid var(--line);background:var(--panel);color:var(--muted);display:grid;place-items:center;cursor:pointer}
.ibtn .i{width:14px;height:14px}.ibtn:hover{color:var(--text);background:var(--bg)}
.ibtn.ok{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.ibtn.ok:hover{background:var(--accent);filter:brightness(1.08);color:var(--on-accent)}
.goalbar{margin:var(--sp-3) 0}.goalbar .bar{height:6px;background:var(--line);border-radius:3px;overflow:hidden;margin-top:var(--sp-2)}
.goalbar .bar i{display:block;height:100%;background:var(--accent)}
.mcard{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-card);padding:var(--sp-7) var(--sp-8);min-width:0;display:flex;flex-direction:column;height:260px}
.mcard.open{height:auto}
.mcard .body{flex:1 1 0;min-height:0;overflow:hidden}.mcard.open .body{flex:none}
.mcard.over:not(.open) .body{-webkit-mask-image:linear-gradient(#000 calc(100% - 26px),transparent);mask-image:linear-gradient(#000 calc(100% - 26px),transparent)}
.mcard.auto .cexp{display:none !important}.mcard .cexp{display:none;align-self:center;margin-bottom:var(--sp-2);font-size:var(--text-small)}.mcard.over .cexp,.mcard.open .cexp{display:block}
.mcard .mtext{max-height:none;overflow:visible}
.mcard .foot{flex:none}
.mcard.warn{border-color:var(--warn)}.mcard.error{border-color:var(--bad)}
.mcard h3{margin:0;font-size:var(--text-body);font-weight:var(--fw-semibold);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mcard .acts{display:flex;gap:var(--sp-1)}
.mcard .acts button{border:0;background:none;color:var(--muted);cursor:pointer;padding:var(--sp-1) 5px;border-radius:var(--radius-sm);font-size:var(--text-small)}
.mcard .acts button:hover{background:var(--bg);color:var(--text)}
.mcard .body{margin:var(--sp-5) 0 var(--sp-2)}
.metric .v{font-size:var(--text-display);font-weight:var(--fw-bold);line-height:1.1;font-variant-numeric:tabular-nums}
.metric .u{font-size:var(--text-small);color:var(--muted);margin-left:var(--sp-2)}
.metric .d{font-size:var(--text-small);margin-left:var(--sp-4);font-variant-numeric:tabular-nums}
.d.up{color:var(--ok)}.d.down{color:var(--bad)}
.spark{display:block;width:100%;height:40px;margin-top:var(--sp-3);color:var(--accent)}
.msg.qd{opacity:.6}
.msg.qd .t .foldbtn{margin:0 0 0 var(--sp-1);padding:0}
.mlist{margin:0;padding-left:var(--sp-9)}.mlist li{margin:3px 0;word-break:break-word}
.mlist li.hasimg{list-style:none;margin-left:-18px;display:flex;gap:var(--sp-5);align-items:flex-start;margin:var(--sp-3) 0 var(--sp-3) -18px}
.lthumb{width:64px;height:64px;object-fit:cover;border-radius:var(--radius-md);flex:none;background:var(--bg)}   /* 列表条目配图：默认 64×64，list 块的 thumb 词可放大 */
.lthumb.lt-m{width:96px;height:96px}.lthumb.lt-l{width:128px;height:128px}
.mtwrap{overflow-x:auto}
/* 块 + token 排版：词汇表在 pa/card_blocks.py，这里的类名要和它一一对应；写在 .sz- 之后的 .w- 才压得过字号自带的字重 */
.mblocks{display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}.b-text{word-break:break-word;min-width:0}
.sz-display{font-size:var(--text-display);font-weight:var(--fw-bold);line-height:1.15;font-variant-numeric:tabular-nums}.sz-title{font-size:var(--text-title);font-weight:var(--fw-bold);line-height:1.3}
.sz-subtitle{font-size:var(--text-lead);font-weight:var(--fw-semibold);line-height:1.35}.sz-body{font-size:var(--text-body)}.sz-caption{font-size:var(--text-caption);line-height:1.4}
.w-regular{font-weight:var(--fw-regular)}.w-strong{font-weight:var(--fw-bold)}
.tn-muted{color:var(--muted)}.tn-accent{color:var(--accent)}.tn-ok{color:var(--ok)}.tn-warn{color:var(--warn)}.tn-bad{color:var(--bad)}
.al-start{text-align:start}.al-center{text-align:center}.al-end{text-align:end}
.ln-1,.ln-2,.ln-3{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.ln-1{-webkit-line-clamp:1}.ln-2{-webkit-line-clamp:2}.ln-3{-webkit-line-clamp:3}
.b-row{display:flex;min-width:0}.b-row.wrap{flex-wrap:wrap}.b-row>.b-text{min-width:0}
.gp-none{gap:0}.gp-s{gap:var(--sp-3)}.gp-m{gap:var(--sp-6)}.gp-l{gap:var(--sp-10)}
.va-baseline{align-items:baseline}.va-center{align-items:center}.va-start{align-items:flex-start}.va-end{align-items:flex-end}
.jf-start{justify-content:flex-start}.jf-center{justify-content:center}.jf-between{justify-content:space-between}.jf-end{justify-content:flex-end}
.b-img img{width:100%;display:block;border-radius:var(--radius-lg);object-fit:cover;background:var(--bg)}.r-wide img{aspect-ratio:16/9}.r-square img{aspect-ratio:1}.r-banner img{aspect-ratio:3/1}
.b-row>.b-img{flex:1;min-width:0}
.b-img.iw-s{width:64px}.b-img.iw-m{width:96px}.b-img.iw-l{width:128px}.b-row>.b-img[class*=iw-]{flex:none}   /* 图片块固定宽度：放在文字旁边的封面 */
.b-prog{min-width:0;flex:1}.b-prog .bar{height:8px;border-radius:var(--radius-xs);background:var(--line);overflow:hidden}.b-prog .bar i{display:block;height:100%;background:var(--accent)}
.b-prog.tn-ok .bar i{background:var(--ok)}.b-prog.tn-warn .bar i{background:var(--warn)}.b-prog.tn-bad .bar i{background:var(--bad)}.b-prog.tn-muted .bar i{background:var(--muted)}
.b-tag{display:inline-block;padding:1px var(--sp-4);border-radius:var(--radius-pill);font-size:var(--text-caption);border:1px solid currentColor;white-space:nowrap}
.b-hr{border:0;border-top:1px solid var(--line);margin:var(--sp-1) 0;width:100%}.b-space.sp-s{height:4px}.b-space.sp-m{height:10px}.b-space.sp-l{height:18px}
.b-spark{min-width:0;flex:1}.b-spark .spark{margin-top:0}.b-spark.tn-ok{color:var(--ok)}.b-spark.tn-warn{color:var(--warn)}.b-spark.tn-bad{color:var(--bad)}.b-spark.tn-muted{color:var(--muted)}
.mlist .tn-ok{color:var(--ok)}.mlist .tn-warn{color:var(--warn)}.mlist .tn-bad{color:var(--bad)}.mlist .tn-muted{color:var(--muted)}
/* 播放器块与按钮块 */
.b-player{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-4) var(--sp-5);border:1px solid var(--line);border-radius:var(--radius-xl);background:var(--bg);min-width:0}
.pl-title{font-size:var(--text-body);font-weight:var(--fw-semibold);word-break:break-word}.pl-seek{flex:1;min-width:40px;accent-color:var(--accent);margin:0}
.pl-ctl{display:flex;align-items:center;gap:var(--sp-2)}.pl-cur,.pl-dur{font-variant-numeric:tabular-nums;margin:0 !important}
.pl-note:empty,.pl-idx:empty{display:none}.pl-note,.pl-idx{margin:0}
.pl-head{display:flex;gap:var(--sp-5);align-items:flex-start}.pl-meta{display:flex;flex-direction:column;gap:var(--sp-1);min-width:0}.pl-cover[hidden]{display:none}   /* 播放器带封面：和列表条目配图同样大小（thumb），换曲目跟着换 */
.pl-b{border:0;background:none;color:var(--text);cursor:pointer;border-radius:50%;min-width:36px;min-height:36px;display:inline-flex;align-items:center;justify-content:center;padding:0}
.pl-b:hover{background:var(--panel)}.pl-b[disabled]{opacity:.35;cursor:default}.pl-b .i{width:20px;height:20px}
.pl-main{background:var(--accent);color:var(--on-accent)}.pl-main:hover{background:var(--accent);opacity:.9}
.b-btn.tn-accent{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}.b-btn.tn-bad{color:var(--bad);border-color:var(--bad)}
.b-btn.tn-ok{color:var(--ok);border-color:var(--ok)}.b-btn.tn-warn{color:var(--warn);border-color:var(--warn)}.b-btn.tn-muted{color:var(--muted)}
.clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.cimgs{display:grid;gap:var(--sp-3);margin-bottom:var(--sp-5)}.cimgs.n2,.cimgs.n3,.cimgs.n4{grid-template-columns:1fr 1fr}
.cimgs a{display:block;border-radius:var(--radius-xl);overflow:hidden;background:var(--bg)}
.cimgs img{display:block;width:100%;aspect-ratio:16/9;object-fit:cover}.cimgs.n1 img{aspect-ratio:2/1}
.mtable{width:100%;border-collapse:collapse;font-size:var(--text-note);display:block;overflow-x:auto}
.mtable th,.mtable td{border-bottom:1px solid var(--line);padding:var(--sp-2) var(--sp-3);text-align:left;white-space:nowrap}
.mtable th{color:var(--muted);font-weight:var(--fw-medium)}
.mtext{word-break:break-word;max-height:240px;overflow:auto}
/* 卡片里的文字排版（md/mdi）：只有这几种样式，内容先转义再套 */
.mtext p{margin:0 0 var(--sp-3)}.mtext p:last-child{margin-bottom:0}
.mh1{font-size:var(--text-title);font-weight:var(--fw-bold);line-height:1.3;margin:var(--sp-1) 0 var(--sp-2)}.mh2{font-size:var(--text-lead);font-weight:var(--fw-bold);margin:var(--sp-3) 0 3px}.mh3{font-size:var(--text-small);font-weight:var(--fw-bold);color:var(--muted);margin:var(--sp-3) 0 var(--sp-1)}
.mtext blockquote,.mlist blockquote{margin:var(--sp-2) 0;padding:var(--sp-1) 0 var(--sp-1) var(--sp-5);border-left:3px solid var(--line);color:var(--muted)}
.mtext ul{margin:var(--sp-1) 0 var(--sp-3);padding-left:var(--sp-9)}.mtext hr{border:0;border-top:1px solid var(--line);margin:var(--sp-4) 0}
.mnote,.mlist .note{font-size:var(--text-caption);color:var(--muted);margin:var(--sp-1) 0}.mlist .note{display:block}
.em{color:var(--accent);font-weight:var(--fw-semibold)}.mtext code,.mlist code,.metric+.muted code{font-family:var(--font-mono-alt);font-size:.9em;background:var(--bg);padding:0 var(--sp-2);border-radius:var(--radius-xs)}
/* 卡片里的音频 */
.maudio{margin-top:var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-4)}.maudio .tt{font-size:var(--text-small);font-weight:var(--fw-semibold)}.maudio audio{width:100%;height:36px;margin-top:var(--sp-1)}
.mcard.muted{border-color:var(--line)}.mcard .src{white-space:nowrap}
.mcard .foot{font-size:var(--text-caption);color:var(--muted);border-top:1px solid var(--line);padding-top:var(--sp-3)}
.mcard .sum{color:var(--text);margin-bottom:var(--sp-1)}
