/* 课页壳 · lesson.css：课内样式（一课、四步走、八拍、讲解、判分、互动降级、复述、教材图）。归属：数学线，谁的文件谁改、谁提交。源在构建脚本目录 scripts/shell/，build_lesson_pages.py 原样拼进产物 baike/shell/；2026-10-07 从构建脚本的大字符串里原样拆出（只搬不改）。 */
/* ---------- 先猜再做（PS，2026-09-19）：答题框上方那一行两个小按钮 ---------- */
.ps-guess{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-top:var(--sp-3)}
.ps-q{font-size:var(--fs-sm);color:var(--c-ink-2)}
.ps-opt{cursor:pointer;font-weight:600}
.ps-opt:hover{background:var(--c-surface-2)}
.ps-guess .why{flex:1 1 100%}
.box.-pr.is-locked>*:not(.ps-guess):not(.bk):not(.stem):not(.qfig){opacity:.45;pointer-events:none}
.ps-lock.is-locked{opacity:.45;pointer-events:none}
@media(max-width:640px){.uw-card .pick.-primary{width:100%}}
.nav-row .btn-sm{white-space:nowrap;font-size:var(--fs-sm);color:var(--c-ink-2)}
.fold-head .ft{white-space:nowrap}
.fold-head .n{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:500;color:var(--c-ink-3)}
/* 路线图 */
.route{position:relative;display:flex;flex-direction:column}
.stn{display:flex;gap:var(--sp-3);align-items:flex-start;position:relative;padding:0 0 var(--sp-4) 0;text-align:left;border:0;background:transparent;width:100%}
.stn .dot{flex:none;width:28px;height:28px;border-radius:50%;border:2px solid var(--c-ink-3);background:var(--c-bg);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}
.stn .dot svg{width:14px;height:14px;stroke:#fff;stroke-width:3}
.stn::before{content:"";position:absolute;left:13px;top:28px;bottom:0;width:2px;background:var(--c-line)}
.stn:last-child::before{display:none}
.stn .sc{flex:1;min-width:0;border:1px solid var(--c-line);border-radius:var(--r-md);background:var(--c-surface);padding:var(--sp-3) var(--sp-4)}
.stn .sb{font-size:var(--fs-xs);color:var(--c-ink-3)}
.stn .st{font-weight:600;line-height:1.35;margin-top:2px;font-size:var(--fs-md)}
.stn .ss{font-size:var(--fs-xs);margin-top:var(--sp-1);color:var(--c-ink-2)}
.stn.is-done .dot{background:var(--c-ok);border-color:var(--c-ok)}
.stn.is-done::before{background:var(--c-ok)}
.stn.is-now .dot{border-color:var(--c-accent);background:var(--c-accent)}
.stn.is-now .sc{border-color:var(--c-accent);box-shadow:0 0 0 3px var(--c-accent-soft)}
.stn.is-now .ss{color:var(--c-accent);font-weight:600}
.stn.is-todo .dot{border-style:dashed}
.stn.is-todo .sc{border-style:dashed;background:transparent;color:var(--c-ink-2)}
@media(min-width:641px){.route{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-4) 0}.stn{flex-direction:column;padding:0 var(--sp-2) 0 0}.stn::before{left:28px;right:0;top:13px;bottom:auto;height:2px;width:auto}.stn:nth-child(4n)::before{display:none}.stn .sc{width:100%;min-height:96px}}
.route-x{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;margin-bottom:var(--sp-4)}
/* 课 */
.crumb{font-size:var(--fs-sm);color:var(--c-ink-2);display:flex;gap:var(--sp-1);flex-wrap:wrap;align-items:center}
.crumb .sep{color:var(--c-ink-3)}
.crumb a{text-decoration:none}
.prose>*{margin:0}.prose>*+*{margin-top:var(--sp-3)}
.prose .lead{font-size:var(--fs-md)}
@media(min-width:641px){.prose .lead{font-size:var(--fs-lg);font-weight:400}}
.fig{display:flex;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);background:var(--c-surface-2);border-radius:var(--r-md)}
.fig .i{color:var(--c-ink-3);margin-top:2px}
.fig .fr{font-weight:600;font-size:var(--fs-sm)}
.fig .fc{color:var(--c-ink-2);font-size:var(--fs-sm);margin-top:2px}
.fig .fc p{margin:0}.fig .fc p+p{margin-top:var(--sp-1)}
.fig>div{min-width:0;flex:1}
.fig svg:not(.i){max-width:100%;height:auto;display:block;background:#fff;border-radius:var(--r-sm);margin-bottom:var(--sp-2)}
.box.q{margin-top:0}
.box.ex{margin-top:0}
.box .bk{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--c-ink-3);margin-bottom:var(--sp-2);flex-wrap:wrap}
.box .bk b{color:var(--c-ink)}
.box .bk .n{margin-left:auto;color:var(--c-ink-3);font-variant-numeric:tabular-nums;white-space:nowrap}
.box.ex .bk{color:var(--c-accent);font-weight:600}
.box.ex .bk b{color:var(--c-accent)}
.box .stem{font-size:var(--fs-md);font-weight:600;line-height:1.6}
.box .stem p{margin:0}.box .stem p+p{margin-top:var(--sp-2)}
@media(min-width:641px){.box .stem{font-size:var(--fs-lg)}}
.sol-steps{list-style:none;padding:0;margin:0;display:grid;gap:8px}
.sol-steps li{display:flex;gap:12px;align-items:baseline;padding:10px 14px;border-radius:var(--r-md);background:var(--c-surface);border:1px solid var(--c-line)}
.sol-steps li .n{font-size:var(--fs-xs);color:var(--c-ink-3);width:1.4em;flex:none;font-variant-numeric:tabular-nums}
.box .sol-steps{margin-top:var(--sp-3)}
.box .ans{margin-top:var(--sp-3);font-weight:700}
.box .src{color:var(--c-ink-3);font-size:var(--fs-xs);margin-top:var(--sp-2)}
.box .acts{display:flex;gap:var(--sp-3);margin-top:var(--sp-4);flex-wrap:wrap;align-items:center}
.box.-ex .stem.-q{background:transparent;padding:0}
.box.-ex .sol-h{margin-top:var(--sp-5);font-size:var(--fs-sm);font-weight:700;color:var(--c-ink-2)}
.box.-ex .sol-h+.sol-steps{margin-top:var(--sp-2)}
/* 例题解法步骤 ol.steps（v3ExSolution / v4ExSolA）：共享 .steps 的 grid 会撞上来，还原单列、去掉 ol 自带序号，只用 span.n（2026-09-24） */
.box.-ex ol.steps{display:grid;grid-template-columns:none;list-style:none;padding:0;margin:var(--sp-2) 0 0;gap:6px}
.box.-ex ol.steps li{display:flex;gap:10px;align-items:baseline}
.box.-ex ol.steps li .n{flex:none;width:1.4em;color:var(--c-ink-3);font-size:var(--fs-sm);font-variant-numeric:tabular-nums}
.box.-ex .answer{display:flex;gap:var(--sp-3);align-items:center;margin-top:var(--sp-4)}
.box.-ex .answer .lab{color:var(--c-ink-2);font-size:var(--fs-sm);white-space:nowrap}
.box.-ex .answer .input{font-size:var(--fs-lg);min-width:0}
.box.-ex .mine{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-3);align-items:baseline;margin-top:var(--sp-2);font-size:var(--fs-sm);color:var(--c-ink-2)}
.box.-ex .mine .same{color:var(--c-ok);font-weight:700}
.box.-ex .mine .diff{color:var(--c-accent);font-weight:700}
.rv-off{display:none!important}
@media(prefers-reduced-motion:no-preference){.rv-in{animation:rvIn 250ms var(--ease) both}}
@keyframes rvIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.box.is-rv{cursor:pointer}
.box.-pr .answer{display:flex;gap:var(--sp-3);align-items:center;margin-top:var(--sp-3)}
.box.-pr .answer .lab{color:var(--c-ink-2);font-size:var(--fs-sm);white-space:nowrap}
.box.-pr .answer .input{font-size:var(--fs-lg)}
.box.-pr .expl{margin-top:var(--sp-3);color:var(--c-ink-2)}
.box.-pr .expl p{margin:0}.box.-pr .expl p+p{margin-top:var(--sp-2)}
.box.is-ok{border-color:var(--c-ok)}
.box.is-err{border-color:var(--c-warn-line)}
.box.-pr .self{display:flex;gap:var(--sp-2);margin-top:var(--sp-3)}
.box.-pr .self .btn{flex:1}
.box.-pr .opts{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}
.box.-pr .cells{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);margin-top:var(--sp-3)}
.box.-pr .cells .cell{display:flex;align-items:center;gap:var(--sp-2);flex:1 1 160px;min-width:0}
.box.-pr .cells .lab{color:var(--c-ink-2);font-size:var(--fs-sm);white-space:nowrap}
.box.-pr .cells .input{font-size:var(--fs-lg);min-width:0;flex:1}
.box.-pr .opts .btn{flex:1 1 40%;min-width:120px}
.box.-pr .opts .btn.is-on{background:var(--c-accent-soft);border-color:var(--c-accent);color:var(--c-accent-hover)}
.box.-pr .hint-in{margin-top:var(--sp-2);color:var(--c-warn);font-size:var(--fs-sm)}
.box.-pr .acts{margin-top:var(--sp-3)}
.done-rows{display:flex;flex-direction:column}
.done-rows .dr{display:flex;align-items:center;gap:var(--sp-2);min-height:40px;padding:var(--sp-1) 0;border-bottom:1px solid var(--c-line);color:var(--c-ink-2);font-size:var(--fs-sm)}
.done-rows .dr .t{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.done-rows .dr .r{flex:none;font-variant-numeric:tabular-nums}
.done-rows .dr .i{width:16px;height:16px;flex:none}
.done-rows .dr.-ok .i{color:var(--c-ok)}
.done-rows .dr.-err .i{color:var(--c-warn)}
.done-rows .dr.-seen .i{color:var(--c-ink-3)}
.err-pop{border-left:3px solid var(--c-warn);background:var(--c-warn-soft);border-radius:0 var(--r-md) var(--r-md) 0;padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-3)}
.err-pop .ek{font-size:var(--fs-xs);color:var(--c-warn);font-weight:700;margin-bottom:4px}
.err-pop p{margin:0;font-size:var(--fs-sm)}
.err-pop p+p{margin-top:var(--sp-1);color:var(--c-ink-2)}
.err-pop p:first-of-type{font-weight:600}
.err-list{display:flex;flex-direction:column;gap:var(--sp-3);padding-top:var(--sp-3)}
.err-list .e{font-size:var(--fs-sm);padding-left:var(--sp-3);border-left:2px solid var(--c-line)}
.err-list .e p{margin:0}.err-list .e p:first-child{font-weight:600}.err-list .e p+p{color:var(--c-ink-2)}
.err-list .eg{font-size:var(--fs-xs);color:var(--c-ink-3);font-weight:600;margin-top:var(--sp-2)}
.checks{display:flex;flex-direction:column;gap:var(--sp-2)}
.checks .ck{display:flex;align-items:center;gap:var(--sp-3)}
.checks .ck .check{width:24px;height:24px;color:transparent}
.checks .ck .check.is-half{border-color:var(--c-accent)}
.checks .ck .check.is-half::after{content:"";width:10px;height:10px;border-radius:50%;background:var(--c-accent)}
.start .h1{margin-top:0;font-size:var(--fs-xl)}
/* 指标并一行（课内页精细化 v001）：原来三块灰砖，现在一行 faint 文字 */
.start .facts{display:block;margin-top:var(--sp-3);font-size:var(--fs-sm);color:var(--c-ink-2);line-height:1.6}
.start .facts b{color:var(--c-ink)}
/* 引言折「多看一点」：一条文字链，不是卡 */
.moreline{margin-top:var(--sp-2)}
.moreline>.fold-head{min-height:0;padding:0;font-size:var(--fs-sm);font-weight:500;color:var(--c-accent);width:auto;gap:3px}
.moreline>.fold-head .i{width:14px;height:14px;margin-left:0}
.moreline>.fold-body{display:none;border-top:0;padding:var(--sp-2) 0 0}
.moreline.is-open>.fold-body{display:block}
/* 开始卡手机：学完能做到什么 / 学习前需要什么 并排一行 */
.foldline{display:flex;gap:var(--sp-3);align-items:flex-start}
.foldline>*{flex:1 1 0;min-width:0}
@media(max-width:400px){.foldline{flex-direction:column}.foldline>*{width:100%}}
.start .sects{list-style:none;padding:0;margin:var(--sp-2) 0 0;display:flex;flex-direction:column;gap:var(--sp-1)}
.start .sects li{display:flex;gap:var(--sp-2);font-size:var(--fs-md)}
.start .sects li .n{color:var(--c-ink-3);font-variant-numeric:tabular-nums;flex:none;width:1.4em}
.cando{list-style:none;padding:var(--sp-2) 0 0;margin:0;display:flex;flex-direction:column;gap:var(--sp-2)}
.cando li{display:flex;gap:var(--sp-2);font-size:var(--fs-sm);color:var(--c-ink-2)}
.cando li .i{flex:none;width:18px;height:18px;color:var(--c-ok);margin-top:3px}
.prereq{margin:var(--sp-2) 0 0;padding-left:1.2em}
.prereq li{font-size:var(--fs-sm);color:var(--c-ink-2)}
.sticky-bottom{position:sticky;left:auto;right:auto;bottom:0;padding:var(--sp-3) 0 0;background:linear-gradient(to top,var(--c-bg) 70%,transparent);margin-top:var(--sp-4)}
.sticky-bottom.stack-sm{background:linear-gradient(to top,var(--c-bg) 85%,transparent)}
@media(max-width:640px){#inner .lp-body{padding-bottom:var(--sticky-h,128px)}}
/* 手机贴底条（小毛病打包 ③）：课内页（老三步）与错题本做题页的按钮条，内容短时也贴住屏幕底——钉在底栏上面（同共享组件 .sticky-bottom 的 bottom:var(--nav-h)）；
   底栏占着屏幕最底下那一条，这页不用 viewport-fit=cover，iPhone 底部安全区由浏览器让出；万一底栏不在（--nav-h 为 0）就按安全区留白。
   条子钉住后不占文档流：正文底部留出条的高度（课内页用 stickyRoom 量的 --sticky-h；做题页按两颗按钮的高度留）。八拍课（lesson-v4）自己有贴底，不动。 */
@media(max-width:640px){
 #inner.lp2:not(.lesson-v4) .sticky-bottom,#inner .mb-task .sticky-bottom{position:fixed;left:0;right:0;bottom:var(--nav-h);z-index:11;margin:0;padding:var(--sp-3) var(--pad-page) max(var(--sp-3),calc(env(safe-area-inset-bottom,0px) - var(--nav-h)));background:var(--c-glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-top:1px solid var(--c-line)}
 #inner.lp2:not(.lesson-v4) .lp-body{padding-bottom:0}
 #inner.lp2:not(.lesson-v4){padding-bottom:var(--sticky-h,128px)}
 #inner:has(.mb-task .sticky-bottom){padding-bottom:168px}
}
.big-done{display:flex;align-items:center;gap:var(--sp-3)}
/* 完成页「用自己的话讲一遍」（成长后台阶段 2 · F2） */
.rc-card{margin-top:var(--sp-4)}
.rc-card .rc-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);flex-wrap:wrap}
.rc-card .rc-h .eyebrow{margin-bottom:0}
.rc-clock{font-size:var(--fs-sm);font-weight:700;color:var(--c-accent);font-variant-numeric:tabular-nums;white-space:nowrap}
.rc-card .rc-lead{margin-top:var(--sp-2);color:var(--c-ink-2);font-size:var(--fs-md)}
.rc-card .rc-h,.rc-card .rc-lead,.rc-card .rc-acts,.rc-card .rc-quiet,.rc-card .rc-ta,.rc-card .rc-bar,.rc-card .rc-said,.rc-card .rc-ask,.rc-card .rc-line,.rc-card .rc-note{position:relative;z-index:1}
.rc-acts{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-3);flex-wrap:wrap}
.rc-acts>.btn{flex:0 1 auto;max-width:100%}
.rc-bar{height:6px;border-radius:3px;background:var(--c-surface-2);margin-top:var(--sp-3);overflow:hidden}
.rc-bar>i{display:block;height:100%;width:0;background:var(--c-accent);border-radius:3px}
.rc-card .rc-ta{min-height:88px;padding:var(--sp-2) var(--sp-4);line-height:1.6;resize:vertical;display:block;width:100%;margin-top:var(--sp-3)}
.rc-note{margin-top:var(--sp-2);font-size:var(--fs-sm);color:var(--c-ink-2)}
.rc-note.-warn{color:var(--c-warn)}
.rc-said{margin-top:var(--sp-3);padding:var(--sp-2) var(--sp-3);border-left:2px solid var(--c-line);color:var(--c-ink-2);font-size:var(--fs-sm);white-space:pre-wrap;word-break:break-word}
.rc-ask{margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);background:var(--c-accent-soft);font-weight:600;word-break:break-word}
.rc-line{display:flex;align-items:flex-start;gap:var(--sp-2);margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border-radius:var(--r-md);background:var(--c-surface-2);font-weight:600;word-break:break-word}
.rc-line .i{flex:none;width:20px;height:20px;margin-top:2px}
.rc-line.-ok{background:var(--c-accent-soft)}
.rc-line.-ok .i{color:var(--c-ok)}
.rc-line.-again .i{color:var(--c-warn)}
.rc-quiet{margin-top:var(--sp-3);color:var(--c-ink-2);font-size:var(--fs-sm);display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
/* 两个数学单元的视觉互动试点：仍是课内静态 HTML，不保存额外状态。 */
.pilot-shelf{display:grid;grid-template-columns:1fr;gap:var(--sp-2)}
@media(min-width:641px){.pilot-shelf{grid-template-columns:repeat(2,minmax(0,1fr))}}
.pilot-link{display:flex;align-items:center;gap:var(--sp-3);min-height:72px;padding:var(--sp-3) var(--sp-4);border:1px solid var(--c-line);border-radius:var(--r-lg);background:var(--c-surface);text-align:left;cursor:pointer}
.pilot-link:hover{border-color:var(--c-accent-soft-2);box-shadow:var(--sh-hover)}
.pilot-link .pv{width:46px;height:46px;display:grid;place-items:center;border-radius:14px;background:var(--c-accent-soft);color:var(--c-accent);font-size:24px;flex:none}
.pilot-link .title{font-weight:700}.pilot-link .meta{margin-top:2px;color:var(--c-ink-2);font-size:var(--fs-sm)}
/* 数学互动（.math-pilot / .mp-*）的样式整体迁到 scripts/pilots/runtime.css，由页面单独引入。 */
/* 讲解正文 */
.xh{font-size:var(--fs-sm);font-weight:700;color:var(--c-ink-2);letter-spacing:.02em;margin:0 0 var(--sp-1);display:flex;align-items:center;gap:var(--sp-2)}
.xh::before{content:"";width:10px;height:2px;background:var(--c-accent);border-radius:1px;flex:none}
.xb+.xb{margin-top:var(--sp-5)}
.xb p{margin:0}
.xb p+p,.xb p+ol,.xb ol+p,.xb ol+ol{margin-top:var(--sp-3)}
.xb .key{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);font-weight:600}
.xb.-scope p{color:var(--c-ink-2);font-size:var(--fs-sm);border-left:2px solid var(--c-line);padding-left:var(--sp-3)}
.xb.-activity h3{font-size:var(--fs-sm);color:var(--c-ink-2);margin:var(--sp-3) 0 var(--sp-1)}
.xb.-activity ul,.xb.-activity ol{margin:0;padding-left:1.3em}
.xb.-activity p{margin-top:var(--sp-2)}
.calc{list-style:none;margin:var(--sp-3) 0 0;padding:var(--sp-2) 0 var(--sp-2) var(--sp-4);border-left:2px solid var(--c-line);display:flex;flex-direction:column;gap:6px}
.calc .lead{color:var(--c-ink-2);font-size:var(--fs-sm)}
.calc li{display:flex;gap:var(--sp-2);align-items:baseline}
.calc li .n{color:var(--c-ink-3);font-size:var(--fs-sm);flex:none;font-variant-numeric:tabular-nums}
.calc .tail{color:var(--c-ink-2);font-size:var(--fs-sm);margin-top:2px}
b.num{font-weight:700;font-variant-numeric:tabular-nums;font-family:var(--font-mono);font-size:.95em;letter-spacing:.01em}
.btn-lg{white-space:normal;text-align:center;line-height:1.25}
.ex-fold .fold-head{padding:0 var(--sp-4);min-height:44px;font-size:var(--fs-sm);color:var(--c-ink-2);font-weight:500}
.flash{outline:3px solid var(--c-accent);outline-offset:4px;border-radius:var(--r-md)}
.list-units{display:flex;flex-direction:column;background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-2) 0}
.list-units .row{border-bottom:1px solid var(--c-line)}
.list-units .row:last-child{border-bottom:0}
.list-units .tn-c{padding-left:var(--pad-card)}
.list-units .row .title{font-size:var(--fs-md)}
/* 底部固定操作条（≥641）：上一课 · 课名 ｜ 第 i 节 / 共 n 节 · 小节名 ｜ 弱按钮 + 主按钮（底子在共享组件 .abar） */
.abar{display:none}
@media(min-width:641px){.abar{display:flex;height:auto;min-height:var(--abar-h);min-width:0;padding:0 var(--pad-page) 0 calc(var(--nav-w) + var(--pad-page))}}
.abar .ab-in{width:var(--lp2-w);max-width:100%;margin:0 auto;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,auto) auto;align-items:center;gap:var(--sp-4)}
.abar .ab-l{display:inline-flex;align-items:center;gap:4px;color:var(--c-ink-2);font-size:var(--fs-sm);background:transparent;border:0;cursor:pointer;min-width:0;max-width:100%;justify-self:start;padding:0;text-align:left;font-family:inherit}
.abar .ab-l span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.abar .ab-l .i{width:18px;height:18px}
.abar button.ab-l:hover{color:var(--c-accent)}
.abar .ab-l.is-muted{color:var(--c-ink-3);cursor:default}
.abar .ab-m{font-size:var(--fs-sm);color:var(--c-ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums;text-align:center;max-width:420px;min-width:0}
.abar .ab-m b{color:var(--c-ink);font-weight:600}
@media(max-width:1279px){.abar .ab-m{max-width:200px}}
.abar .ab-r{justify-self:end;display:flex;gap:var(--sp-2);align-items:center;min-width:0}
.abar .btn{white-space:nowrap}
/* 课内页：标题行 + 一条进度 + 两列 */
.lp2-title{display:flex;align-items:baseline;gap:var(--sp-3) var(--sp-4);min-width:0;flex-wrap:wrap}
.lp2-title .h2{font-size:var(--fs-xl);min-width:0}
.lp2-title .crumb{margin-left:auto;flex:none;flex-wrap:nowrap;white-space:nowrap;color:var(--c-ink-3);max-width:100%;overflow:hidden;text-overflow:ellipsis}
.lp2-title .crumb a,.lp2-title .crumb span{white-space:nowrap}
/* 一条进度（样式按共享 .steps：段名小字 + 一排细条；当前段蓝紫、做完蓝紫、当前格淡紫底加底线） */
.pbar{display:flex;gap:var(--sp-5);margin-top:var(--sp-3);align-items:flex-end}
.pseg{flex:1;display:flex;flex-direction:column;gap:var(--sp-2);min-width:0}
.pseg .pl{font-size:var(--fs-xs);color:var(--c-ink-3);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pseg .pc{display:flex;gap:3px}
.pseg .pc i{flex:1;height:5px;border-radius:999px;background:var(--c-line)}
.pseg.is-on .pl{color:var(--c-accent);font-weight:600}
.pseg.is-on .pc i.done{background:var(--c-accent)}
.pseg.is-on .pc i.on{background:var(--c-accent-soft-2);box-shadow:inset 0 -2px 0 var(--c-accent)}
.pseg.is-done .pl{color:var(--c-accent-hover)}
.pseg.is-done .pc i{background:var(--c-accent)}
.lp2-cols{margin-top:var(--sp-5)}
.lp2-cols>.col-text{min-width:0}
@media(min-width:1280px){.lp2-cols{display:grid;grid-template-columns:var(--col-text) var(--col-side);gap:var(--col-gap);align-items:start}
 .lp2-cols>.col-side{position:sticky;top:16px;display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}}
.sec-h{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap}
.sec-h .h3{min-width:0}
.kicker{display:inline-flex;align-items:center;gap:var(--sp-1);font-size:var(--fs-xs);color:var(--c-ink-2);background:var(--c-surface-2);border-radius:var(--r-pill);padding:2px 10px;flex:none;white-space:nowrap}
.kicker.-accent{background:var(--c-accent-soft);color:var(--c-accent)}
.col-text .sec-h+.sec-h,.col-text .box+.sec-h{margin-top:var(--sp-5)}
/* 右列内容块 */
.side-key{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4)}
.side-key .sk,.side-blk .sk,.side-back .sk{font-size:var(--fs-xs);color:var(--c-ink-2);font-weight:700;margin-bottom:4px;letter-spacing:.02em}
.side-key .sk{color:var(--c-accent)}
.side-key{color:var(--c-accent-hover)}
.side-key p{font-weight:600;margin:0}
.side-blk .nx{display:flex;flex-direction:column;gap:var(--sp-2)}
.side-blk .nx .row{min-height:52px;border:1px solid var(--c-line);border-radius:var(--r-md);padding:var(--sp-2) var(--sp-3);background:var(--c-surface)}
.side-blk .nx .row:hover{background:var(--c-surface-2)}
.side-blk .nx .row .title{font-size:var(--fs-sm);font-weight:500}
.side-blk .nx .row .meta{font-size:var(--fs-xs)}
.side-blk .nx .row.-all{border-style:dashed;background:transparent;min-height:44px}
.side-blk .nx .row.-all .title{color:var(--c-ink-2);font-weight:500}
.side-blk .nx .row .chev{width:16px;height:16px;color:var(--c-ink-3)}
.side-back{border:0;border-radius:0;background:transparent;padding:0}
.side-back p{margin:0;font-size:var(--fs-sm);color:var(--c-ink)}
.side-back .lnk{display:inline-flex;align-items:center;gap:4px;margin-top:var(--sp-2);font-size:var(--fs-sm);font-weight:600;color:var(--c-accent);background:transparent;border:0;padding:0;cursor:pointer}
.side-back .lnk .i{width:16px;height:16px}
.col-side .card-fold.-quiet{background:var(--c-surface);border-color:var(--c-line)}
.col-side .card-fold.-quiet .fold-head{color:var(--c-ink);font-weight:600}
.col-side .card-fold.-quiet .fold-head{font-size:var(--fs-sm)}
.col-side .card-fold .fold-body{border-top-color:var(--c-line);padding-bottom:var(--sp-3)}
.col-side .cando{padding-top:var(--sp-3)}
.col-side .prereq{margin:var(--sp-2) 0 0;padding-left:1.2em}
.col-side .prereq li+li{margin-top:var(--sp-1)}
/* 教材图：缩略卡（第 1 张 / 题干图）与更多图里的行 */
.fig.-img{display:block;padding:0;background:transparent}
.figcard{display:block;width:100%;text-align:left;border:1px solid var(--c-line);border-radius:var(--r-lg);background:var(--c-surface);overflow:hidden;cursor:zoom-in;padding:0;color:inherit}
.figcard:hover{background:var(--c-surface-2)}
.figcard .th{display:block;height:var(--figh);overflow:hidden;background:var(--c-surface-2);border-bottom:1px solid var(--c-line)}
.figcard .th img{width:100%;height:100%;object-fit:cover;object-position:top;display:block}
.figcard .fb{display:block;padding:var(--sp-3) var(--sp-4)}
.figcard .fr{display:block;font-weight:600;font-size:var(--fs-sm)}
.figcard .fc{color:var(--c-ink-2);font-size:var(--fs-sm);margin-top:2px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.figcard .fz{color:var(--c-accent);font-size:var(--fs-xs);font-weight:600;margin-top:var(--sp-2);display:inline-flex;gap:4px;align-items:center}
.figcard .fz .i{width:14px;height:14px}
.figrows{display:flex;flex-direction:column;padding-top:var(--sp-2)}
.figrow{display:flex;gap:var(--sp-3);padding:var(--sp-2) var(--sp-1);border:0;border-top:1px solid var(--c-line);background:transparent;width:100%;text-align:left;cursor:zoom-in;align-items:flex-start;color:inherit}
.figrows>:first-child .figrow{border-top:0}
.figrow:hover{background:var(--c-surface-2)}
.figrow img{width:56px;height:72px;object-fit:cover;object-position:top;border-radius:var(--r-sm);flex:none;border:1px solid var(--c-line);background:#fff}
.figrow>span{min-width:0;display:block}
.figrow .fr{display:block;font-weight:600;font-size:var(--fs-xs)}
.figrow .fc{color:var(--c-ink-2);font-size:var(--fs-xs);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.figrows .fig:not(.-img){margin-top:var(--sp-2)}
.qfig{margin:var(--sp-2) 0 var(--sp-3);padding-top:0}
.qfig .figrow{border-top:0;border:1px solid var(--c-line);border-radius:var(--r-md);padding:var(--sp-2)}
/* 页脚免责声明 */
.foot{margin-top:var(--sp-7);padding-top:var(--sp-4);border-top:1px solid var(--c-line);color:var(--c-ink-3);font-size:var(--fs-xs)}
@media(max-width:640px){.foot{margin-top:var(--sp-6);padding-bottom:var(--sp-4)}}
/* 完成页 */
.done-acts{display:flex;gap:var(--sp-3);flex-wrap:wrap;margin-top:var(--sp-5)}
@media(max-width:640px){.done-acts{flex-direction:column}.done-acts .btn{width:100%}}
/* 手机：页头压成一条进度 + 一行文字 */
.phead{display:flex;flex-direction:column;gap:var(--sp-2);padding-bottom:var(--sp-3);border-bottom:1px solid var(--c-line)}
.paper .btn{margin-left:auto}
.lp-main>.stack{margin-top:0}
.lp-main .box.ex{margin-top:var(--sp-5)}
.start.lp-main .prose .lead{color:var(--c-ink-2);line-height:1.9}
.phead .pbar{margin-top:0;gap:var(--sp-3)}
.phead .pt{font-size:var(--fs-sm);color:var(--c-ink-2)}
.phead .pt b{color:var(--c-ink)}
/* 教材图大图层（零依赖） */
.ov{position:fixed;inset:0;z-index:60;display:flex;flex-direction:column}
.ov[hidden]{display:none}
.ov .ov-bg{position:absolute;inset:0;background:rgba(0,0,0,.84)}
.ov .ov-top{position:relative;display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) var(--sp-3);color:#fff;font-size:var(--fs-sm);flex-wrap:wrap}
.ov .ov-top .t{flex:1 1 40%;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600}
.ov .ov-top button{background:rgba(255,255,255,.14);border:0;color:#fff;border-radius:var(--r-md);min-height:40px;padding:0 var(--sp-3);font-size:var(--fs-sm);flex:none}
.ov .ov-top button[disabled]{opacity:.32}
.ov .ov-stage{position:relative;flex:1;min-height:0;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}
.ov .ov-stage img{max-width:100%;max-height:100%;display:block;transform-origin:center center;background:#fff;cursor:grab;-webkit-user-select:none;user-select:none}
.ov .ov-stage img.-drag{cursor:grabbing}
.ov .ov-cap{position:relative;max-height:30%;overflow:auto;color:#EDE7DE;background:rgba(0,0,0,.36);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-sm);line-height:1.6}
.ov .ov-cap p{margin:0}
.ov .ov-cap p+p{margin-top:var(--sp-2)}
@media(max-width:640px){.ov .ov-cap{max-height:38%}
.ov .ov-top{padding:var(--sp-2) var(--sp-2) 0;gap:6px}
.ov .ov-top .t{flex:1 1 100%;order:-1;padding:0 var(--sp-1) 4px}
.ov .ov-top button{flex:1 1 0;min-width:0;padding:0 var(--sp-2);min-height:38px;margin-bottom:var(--sp-2)}}
.r2-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:var(--sp-4) var(--pad-card) var(--sp-2)}.r2-pad{padding:var(--sp-3) var(--pad-card) var(--pad-card)}
/* ---------- 一节四步走（v3，仅名单课 / ?flow=v3；容器 #inner.lesson-v3）---------- */
.sbar{display:flex;gap:var(--sp-3);margin-top:var(--sp-3)}
.sstep{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px;padding:0;border:0;background:transparent;text-align:left;color:var(--c-ink-3);cursor:default;font:inherit;min-height:44px;justify-content:flex-end}
.sstep .sl{display:flex;align-items:center;gap:5px;font-size:var(--fs-sm);min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sstep .sl .i{width:15px;height:15px;flex:none}
.sstep .sl .dot{width:15px;height:15px;border-radius:50%;border:1.5px dashed currentColor;flex:none;box-sizing:border-box}
.sstep .sl .dot.-on{border:0;background:var(--c-accent)}
.sstep i.bar{display:block;height:6px;border-radius:3px;background:var(--c-line)}
.sstep.is-done{color:var(--c-ok);cursor:pointer}
.sstep.is-done i.bar{background:var(--c-ok)}
.sstep.is-done:hover .sl{text-decoration:underline}
.sstep.is-on{color:var(--c-ink);font-weight:700}
.sstep.is-on i.bar{background:var(--c-accent)}
.sstep.is-todo{color:var(--c-lock)}
.sstep:disabled{opacity:1}
.lesson-v3 .phead{border-bottom:0;padding-bottom:var(--sp-2)}
.lesson-v3 .phead .sbar{margin-top:0}
@media(max-width:640px){.sbar{gap:var(--sp-2)}.sstep .sl{font-size:var(--fs-xs)}
 .lesson-v3 .phead{position:sticky;top:0;z-index:4;background:var(--c-bg);margin-top:calc(-1*var(--pad-page));padding-top:var(--sp-3);border-bottom:1px solid var(--c-line)}
 .lesson-v3 .v3-pad{height:56px}
 .lesson-v3 .sticky-bottom .rowflex .btn{min-height:44px}}
.cards{display:grid;gap:var(--sp-4)}
@media(min-width:641px){.cards.-two{grid-template-columns:1fr 1fr;align-items:start}}
.lcard{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-4) var(--sp-5) var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}
.lcard .lch{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);font-weight:700;color:var(--c-ink-2);min-height:22px}
.lcard .lch .nb{width:22px;height:22px;border-radius:50%;background:var(--c-accent-soft);color:var(--c-accent);font-size:var(--fs-xs);font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex:none}
.lcard p,.lcard ol,.lcard ul{margin:0}
.lcard .key{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);font-weight:600}
.lcard .key.-fml{text-align:center;font-weight:700;letter-spacing:.04em;color:var(--c-accent)}
.lcard .tail{font-size:var(--fs-xs);color:var(--c-ink-3)}
.lcard .more{align-self:flex-start;min-height:44px;font-size:var(--fs-sm);color:var(--c-ink-2);background:transparent;border:0;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:4px}
.lcard .more .i{width:16px;height:16px}
.lcard .more-body{display:flex;flex-direction:column;gap:var(--sp-3);padding-top:var(--sp-2);border-top:1px dashed var(--c-line)}
.lead-in{display:flex;gap:var(--sp-2);align-items:flex-start;background:var(--c-surface-2);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);color:var(--c-ink-2);font-size:var(--fs-sm);line-height:1.55}
.lead-in .i{width:18px;height:18px;flex:none;margin-top:2px;color:var(--c-ink-3)}
.lookback{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);margin-top:var(--sp-3)}
.lookback .lk{font-size:var(--fs-xs);font-weight:700;color:var(--c-accent);margin-bottom:2px}
.err-pop.-note{border-left-color:var(--c-warn);background:var(--c-warn-soft)}
.err-pop.-note .ek{color:var(--c-warn)}
.err-pop.-note p:first-of-type{font-weight:600;color:var(--c-ink)}
.back-cards{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-2)}
.back-cards .bc{display:flex;align-items:center;gap:var(--sp-2);border:1px solid var(--c-line);border-radius:var(--r-md);background:var(--c-surface);padding:var(--sp-2) var(--sp-3);font-size:var(--fs-sm);text-align:left;cursor:pointer;width:100%;min-height:44px;font:inherit}
.back-cards .bc .nb{width:20px;height:20px;border-radius:50%;background:var(--c-surface-2);color:var(--c-ink-2);font-size:var(--fs-xs);font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex:none}
.back-cards .bc .i{margin-left:auto;width:16px;height:16px;color:var(--c-ink-3);flex:none}
/* ===== 课内页精细化 v001 新增 ===== */
/* 反馈一行：「还差一点 · 正确是 X」要连着排，不换行 */
.inline-fb.-warn b{display:inline}
/* 互动块挂不上的降级卡：虚线框 + 教材图 + 一句话 */
.degrade{border-style:dashed}
.degrade .fig{border:0;padding:0;background:transparent}
.degrade .msg{margin:var(--sp-3) 0 0;font-size:var(--fs-sm);color:var(--c-ink-2)}
/* 游客判完题的一行提醒 */
.gnote{display:flex;align-items:center;gap:8px;margin-top:var(--sp-2);font-size:var(--fs-sm);color:var(--c-ink-3);flex-wrap:wrap}
.gnote .i{width:14px;height:14px;flex:none}
.gnote .lnk{min-height:0}
/* 完成页「本概念其他课」升成正文一块：本课那一行标出来 */
.others .row.-here .title{color:var(--c-accent)}
.others .row.-here .state{color:var(--c-ok)}
.others .row.-here .state .i{width:14px;height:14px}
/* 讲做法小卡（card-sub）：紧跟题卡，卡里没有主按钮 */
.howto.ai-box{margin-top:var(--sp-3)}
.howto .acts{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-3);flex-wrap:wrap}
.btn-primary.is-soft{background:var(--c-accent-soft);border-color:var(--c-accent-soft);color:var(--c-accent);box-shadow:none}
.btn-primary.is-soft:hover{background:var(--c-accent-soft);border-color:var(--c-accent)}
/* 故事线第 3 / 6 拍：没拖到位时主按钮置灰不可点（data-v4dyn + disabled） */
.btn-primary[data-v4dyn][disabled],.btn-primary[data-v4dyn][disabled]:hover{background:var(--c-surface-2);border-color:var(--c-line);color:var(--c-ink-3);box-shadow:none;cursor:not-allowed}
.v3-fin{display:flex;align-items:center;gap:var(--sp-3)}
.v3-fin .check{width:40px;height:40px;background:var(--c-ok-soft);border-color:var(--c-ok-soft);color:var(--c-ok)}
.v3-recap{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-4) var(--sp-5)}
.v3-recap .sk{font-size:var(--fs-xs);font-weight:700;color:var(--c-ink-3);margin-bottom:var(--sp-2)}
.v3-recap p{margin:0;line-height:1.7}
.v3-recap .t{font-weight:700;font-size:var(--fs-lg);line-height:1.35;margin-bottom:var(--sp-2)}
.v3-recap.-next{background:var(--c-accent-soft);border-color:transparent}
.v3-recap.-next .sk{color:var(--c-accent)}
.lcard .lfig{margin-top:var(--sp-2)}
.lcard .lfig.-mp .mp-host{margin:0}
.v3fig{display:block;width:100%;max-width:540px;height:auto;margin:0 auto}
.v3fig .cell{fill:var(--c-surface-2);stroke:var(--c-line);stroke-width:1.5}
.v3fig .v{fill:var(--c-accent);font-weight:700}
.v3fig .l{fill:var(--c-ink-2)}
.v3fig .op{fill:var(--c-ink-2);font-weight:700}
.v3fig .ar{stroke:var(--c-ink-3)}
.v3fig .ar.-h{fill:var(--c-ink-3)}
.v3fig .cell.-dash{fill:none;stroke-dasharray:7 5}
@media(min-width:1280px){.lp2-cols.-one{display:block}}
.lesson-v3 .box.-ex .acts .btn-secondary{min-height:44px}
/* ---------- 一节故事线七拍（v4，仅名单课 / ?flow=v4；容器 #inner.lesson-v4，2026-09-20）---------- */
.tbar{display:flex;align-items:center;gap:var(--sp-3);min-width:0;margin-top:var(--sp-3)}
.tdots{display:flex;align-items:center;flex:none}
.tdot{width:34px;height:44px;padding:0;border:0;background:transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--c-ink-3);cursor:default;flex:none;font:inherit}
.tdot .c{width:var(--beat);height:var(--beat);border-radius:50%;border:1.5px solid var(--c-line);background:var(--c-surface);display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;transition:background var(--t-state) var(--ease)}
.tdot.is-on .c{width:var(--beat-cur);height:var(--beat-cur)}
.tdot .c .i{width:13px;height:13px;stroke-width:2.5}
.tdot.is-done{cursor:pointer;color:var(--c-ok)}
.tdot.is-done .c{border-color:var(--c-ok);background:var(--c-ok-soft)}
.tdot.is-done:hover .c{background:var(--c-ok);color:#fff}
.tdot.is-on .c{border-color:var(--c-accent);background:var(--c-accent)}
.tdot.is-todo .c{border-style:dashed;border-color:var(--c-lock);background:transparent}
.tmeta{font-size:var(--fs-sm);color:var(--c-ink-2);min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
.tmeta b{color:var(--c-ink);font-weight:600}
.lesson-v4 .phead{border-bottom:0;padding-bottom:var(--sp-2)}
.lesson-v4 .phead .tbar{margin-top:0}
.lesson-v4 .lp2-cols{margin-top:var(--sp-3)}
.lesson-v4 .col-text.stack>.sec-h{margin-bottom:calc(-1*var(--sp-2))}
@media(max-width:640px){.tbar{flex-direction:column;align-items:flex-start;gap:0}.tdot{width:30px}.tmeta{max-width:100%}
 .lesson-v4 .phead{position:sticky;top:0;z-index:4;background:var(--c-bg);margin-top:calc(-1*var(--pad-page));padding-top:var(--sp-2);border-bottom:1px solid var(--c-line)}
 .lesson-v4 .v3-pad{height:56px}
 .lesson-v4 .sticky-bottom .rowflex .btn{min-height:44px}}
.v4-grid .lead{font-size:var(--fs-lg);line-height:1.55;color:var(--c-ink);font-weight:600}
.v4-grid .src{color:var(--c-ink-3);font-size:var(--fs-xs)}
.stembox{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-3) var(--sp-5)}
.stembox .intro{font-size:var(--fs-md);color:var(--c-ink-2);margin-bottom:var(--sp-2)}
.stembox .stem{font-size:var(--fs-lg);line-height:1.6}.stembox .stem p{margin:0}
.stembox .src{color:var(--c-ink-3);font-size:var(--fs-xs);margin-top:var(--sp-2)}
.v4-fig{min-width:0}.v4-fig .mp-host{margin:0}.v4-fig .lfig{margin:0}
.v4-fig .tf-cap{font-size:var(--fs-sm);color:var(--c-ink-2);line-height:1.55;margin-top:var(--sp-2)}
.lesson-v4 .guess,.v4-grid .guess{display:block;margin-top:0;font-size:inherit;color:inherit}
.guess .gq{font-size:var(--fs-lg);font-weight:700;margin-bottom:var(--sp-3)}
.guess .gopts{display:flex;gap:var(--sp-3)}
.guess .gb{flex:1 1 0;min-width:0;min-height:64px;border:1.5px solid var(--c-line);border-radius:var(--r-lg);background:var(--c-surface);font-size:var(--fs-lg);font-weight:700;cursor:pointer;padding:var(--sp-3) var(--sp-4);font-family:inherit;color:var(--c-ink)}
.guess .gb:hover{background:var(--c-surface-2)}
.guess .gb.is-pick,.guess .gb.is-pick:hover{border-color:var(--c-accent);background:var(--c-accent-soft);color:var(--c-accent)}
.guess .gb .gmark{display:none;font-size:var(--fs-sm);font-weight:600;margin-left:6px}
.guess .gb.is-pick .gmark{display:inline}
.guess .gskip{display:inline-flex;align-items:center;min-height:44px;margin-top:var(--sp-1);background:transparent;border:0;padding:0;color:var(--c-ink-3);font-size:var(--fs-sm);cursor:pointer;text-decoration:underline;font-family:inherit}
.guess.is-done .gb:not(.is-pick){opacity:.5}
.guess .quietline{font-size:var(--fs-sm);color:var(--c-ink-3);margin-top:var(--sp-2)}
.guess.-pr .gb{min-height:48px;font-size:var(--fs-md)}
.guess .gopts.-three .gb{font-size:var(--fs-md);padding:var(--sp-2) var(--sp-2)}
@media(max-width:640px){.guess .gopts{flex-direction:column}.stembox .stem,.guess .gq{font-size:var(--fs-md)}}
.reveal{border-radius:var(--r-lg);padding:var(--sp-4) var(--sp-5);display:flex;gap:var(--sp-3);align-items:flex-start;margin-top:0}
.reveal>.i{width:22px;height:22px;flex:none;margin-top:2px}
.reveal .rk{font-size:var(--fs-xs);font-weight:700;margin-bottom:3px}
.reveal p{margin:0;font-size:var(--fs-lg);line-height:1.5;font-weight:600}
.reveal.-hit{background:var(--c-ok-soft);color:var(--c-ink)}.reveal.-hit>.i,.reveal.-hit .rk{color:var(--c-ok)}
.reveal.-miss{background:var(--c-warn-soft);color:var(--c-ink)}.reveal.-miss>.i,.reveal.-miss .rk{color:var(--c-warn)}
.namecard{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-4) var(--sp-5) var(--sp-5);display:flex;flex-direction:column;gap:var(--sp-3)}
.namecard .nk{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-sm);font-weight:700;color:var(--c-ink-2)}
.namecard .nk .i{width:18px;height:18px;color:var(--c-accent)}
.namecard p{margin:0;font-size:var(--fs-lg);line-height:1.6}
.namecard .formula{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);text-align:center;font-size:var(--fs-lg);font-weight:700;color:var(--c-accent);letter-spacing:.04em}
@media(max-width:640px){.reveal p,.namecard p,.namecard .formula{font-size:var(--fs-md)}}
.calc{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-3) var(--sp-4)}
.calc .ck{font-size:var(--fs-xs);font-weight:700;color:var(--c-ink-3);margin-bottom:var(--sp-2)}
.calc .cl{font-size:var(--fs-sm);line-height:1.55;padding:var(--sp-2) 0;border-top:1px dashed var(--c-line)}
.calc .cl:first-of-type{border-top:0}
.ansline{background:var(--c-accent-soft);border-radius:var(--r-md);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-lg);font-weight:700;line-height:1.5}
@media(max-width:640px){.ansline{font-size:var(--fs-md)}}
.mini-fold{border:1px solid var(--c-line);border-radius:var(--r-md);background:var(--c-surface)}
.mini-fold>button{width:100%;display:flex;align-items:center;gap:var(--sp-2);background:transparent;border:0;padding:var(--sp-3) var(--sp-4);min-height:44px;font-size:var(--fs-sm);color:var(--c-ink-2);cursor:pointer;text-align:left;font-family:inherit}
.mini-fold>button .i{width:16px;height:16px;flex:none}.mini-fold>button .chev{margin-left:auto;transition:transform var(--t-collapse) var(--ease)}
.mini-fold .mf-body{display:none;padding:0 var(--sp-4) var(--sp-4);font-size:var(--fs-sm);line-height:1.6;color:var(--c-ink-2)}
.mini-fold.is-open .mf-body{display:block}.mini-fold.is-open>button .chev{transform:rotate(180deg)}
.abar .hintline{font-size:var(--fs-sm);color:var(--c-ink-3);white-space:nowrap}
/* ---------- 一拍一屏（v002，2026-09-20）：#inner.lesson-v4 定高、拍内不出页面滚动。
   data-fit=tall（宽<700 上下堆）| wide（宽≥1000 且宽>高 左图右文）| mid（其余，上下堆、第 5 拍算式两列）由页面 JS 按视口定；
   压不下时按序加 is-tight → is-tighter → is-scroll（最后一招：文字列自己滚，页面仍不滚）。图 / 互动画布由 v4Fit() 按剩余高度等比定宽。 */
.main.-v4{padding-bottom:var(--pad-page)}
/* 故事线页面里字号最小 14px（任务单 §1）：xs / sm 两档在这里抬到 14，底栏同 */
.lesson-v4,body:has(.main.-v4) .abar{--fs-xs:calc(14px*var(--fsx));--fs-sm:calc(14px*var(--fsx))}
.lesson-v4 b.num{font-size:1em}
@media(max-width:640px){.main.-v4{padding:var(--sp-3) var(--pad-page) var(--sp-2)}}
.main.-v4 .main-inner.lesson-v4{height:100%;display:flex;flex-direction:column;min-height:0}
.lesson-v4[data-fit=wide]{max-width:min(1240px,100%)}
.lesson-v4 .foot{display:none}
.lesson-v4 .v4-top{flex:none;display:flex;flex-direction:column;gap:var(--sp-2)}
.lesson-v4 .v4-top .tbar{margin-top:0}
.lesson-v4 .lp2-title .h2{font-size:var(--fs-lg)}
.lesson-v4 .phead{flex:none}
@media(max-width:640px){.lesson-v4 .phead{position:static;margin-top:0;padding-top:0}}
.lesson-v4 .v4-grid{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:var(--sp-3);margin-top:var(--sp-3);overflow:hidden}
.lesson-v4 .v4-t{display:contents}
.lesson-v4 .v4-a{order:1}.lesson-v4 .v4-f{order:2}.lesson-v4 .v4-b{order:3}
.lesson-v4 .v4-a,.lesson-v4 .v4-b{flex:none;display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}
.lesson-v4 .v4-a:empty,.lesson-v4 .v4-b:empty{display:none}
.lesson-v4 .v4-bb{display:contents}
.lesson-v4 .v4-f{flex:0 1 auto;min-height:0;overflow:hidden;display:flex;flex-direction:column;align-items:center;min-width:0}
.lesson-v4 .v4-f .v4-fig{width:100%;display:flex;flex-direction:column;align-items:center;min-height:0}
/* 上下堆时图位及图框保留完整高度；放不下交给 v4Fit 收紧或滚动，不让画布溢出盖住图注。 */
.lesson-v4:not([data-fit=wide]) .v4-f,.lesson-v4:not([data-fit=wide]) .v4-f .v4-fig{flex-shrink:0}
.lesson-v4 .v4-f .mp-host,.lesson-v4 .v4-f .lfig{width:100%;margin:0 auto}
.lesson-v4 .v4-f .mp-stage svg{margin:0 auto}
.lesson-v4 .v4-f .tf-cap{flex:none;width:100%;margin-top:var(--sp-2)}
/* 宽档「图左、文字右」（2026-09-24 课内右栏）：.v4-grid 两列（58 / 42），行 = 13 行 auto + 1 行 1fr 兜底。
   从 .v4-grid 到运行时节点之间的六层壳全部子网格透传（盒子都在：v4Fit 量 .v4-f / .mp-host、验收量 .v4-fig 都量得到），
   运行时节点不摘出 .mp-host，只点名格子：舞台左列跨全部行，其余按任务单 §0 顺序一行一个落右列；row-gap 0，上下距离由节点自带 margin 出。 */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr){display:grid;grid-template-columns:minmax(0,58fr) minmax(0,42fr);grid-template-rows:repeat(13,auto) minmax(0,1fr);column-gap:var(--sp-5);row-gap:0;align-items:start;overflow:hidden}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) :is(.v4-t,.v4-f,.v4-fig,.mp-host,.mp-body,.math-pilot){display:grid;grid-template-columns:subgrid;grid-template-rows:subgrid;grid-column:1 / -1;grid-row:1 / -1;min-width:0;min-height:0;height:auto;max-height:none;max-width:none!important;overflow:visible;margin:0;padding:0;border:0;background:none;border-radius:0;order:0;pointer-events:none}
/* 修（2026-09-24 下午）：透传壳的盒子铺满整块（跨两列全部行），会罩住右列 .v4-b 里的猜题按钮（elementFromPoint 取到 .mp-body）。
   透传壳本身不接鼠标，它们的直接子节点（真正落格子的运行时节点、舞台、.v4-a / .v4-b / 图注）接回来；「只看不动」的 .math-pilot.-still 照旧整块不接。 */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) :is(.v4-t,.v4-f,.v4-fig,.mp-host,.mp-body,.math-pilot)>:not(.v4-t,.v4-f,.v4-fig,.mp-host,.mp-body,.math-pilot){pointer-events:auto}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .math-pilot.-still *{pointer-events:none}
/* 舞台自己当那张淡紫卡：边框 / 圆角 / 内边距 = 原来卡（.math-pilot 边 + 内边距）+ 舞台（边 + 内边距）之和，画布宽与改前一样（标签像素距离不变） */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .mp-stage{grid-column:1;grid-row:2 / -1;align-self:start;margin:0;background:var(--c-mp-panel);border:1px solid var(--c-line);border-radius:var(--r-lg);padding:calc(var(--sp-4) + var(--sp-2) + 1px)}
/* 用户 9/24 追加 ①：故事（.v4-a）挪到最上面横跨两栏（拍进度条之下、两栏之上）；舞台与右列都从第 2 行起 */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-a{grid-column:1 / -1;grid-row:1;margin-bottom:var(--sp-3)}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Tip{grid-column:2;grid-row:2;margin-top:var(--sp-3)}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Say{grid-column:2;grid-row:3}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Ask{grid-column:2;grid-row:4}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .mp-acts{grid-column:2;grid-row:5}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Keys{grid-column:2;grid-row:6}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Do{grid-column:2;grid-row:7}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Cmp{grid-column:2;grid-row:8}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Prog{grid-column:2;grid-row:9}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Sum{grid-column:2;grid-row:10}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Note{grid-column:2;grid-row:11}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-b{grid-column:2;grid-row:13;margin-top:var(--sp-3)}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) :is(.mp-head,.mp-phases){grid-column:1;grid-row:2}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-a,.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-b{display:flex;flex-direction:column;gap:var(--sp-3);min-width:0;position:relative;z-index:1}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .mp-acts .mp-act{flex:0 1 auto;min-width:160px}
/* 用户 9/24 追加 ②：宽档不再出壳的引子小提示（「先看它拆一遍」「轮到你了，照着拆一次」这类 .lead-in）；手机 / 中档照旧 */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .lead-in{display:none}
/* 用户 9/24 追加 ③：讲解字幕改累加式——壳里只保证 #v3Say 能多行（不截断、不 nowrap）；固定高与滚动归做课线 pilots/runtime.css（.mp-say:not(:empty)），壳里不设 max-height / height / overflow */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) #v3Say{white-space:normal}
/* 无互动的节（静态图 .lfig + 图注 .tf-cap）与互动挂不上的退路图：.v4-f 不借格子，整块落左列、里面照旧竖排（.tf-cap 仍是 .v4-fig 的下一个兄弟） */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-f:not(:has(.mp-host)){display:flex;flex-direction:column;align-items:center;grid-column:1;grid-row:2 / -1;align-self:stretch;height:auto;overflow:hidden}
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-f:not(:has(.mp-host)) .v4-fig{display:flex;flex-direction:column;align-items:center;grid-column:auto;grid-row:auto;width:100%;min-height:0}
/* 有互动的节第 1 拍若带图注：图注是文字，落右列（在壳的提示 .v4-b 上面一行）；类名与父子关系不变 */
.lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-f:has(.mp-host)>.tf-cap{grid-column:2;grid-row:12;width:auto;margin-top:var(--sp-3);position:relative;z-index:1}
.lesson-v4[data-fit=wide].is-tight .v4-grid:not(.-pr) :is(.v4-t,.v4-f,.v4-fig,.mp-host,.mp-body,.math-pilot){gap:inherit}
@media(max-width:1100px){.lesson-v4[data-fit=wide] .v4-grid:not(.-pr){grid-template-columns:minmax(0,54fr) minmax(0,46fr)}}
/* 老浏览器兜底：不认 subgrid 的，宽档保持原来的左图右文（互动文字留在图下），不碎版 */
@supports not (grid-template-rows:subgrid){
  .lesson-v4[data-fit=wide] .v4-grid:not(.-pr){grid-template-rows:minmax(0,1fr)}
  .lesson-v4[data-fit=wide] .v4-grid:not(.-pr) :is(.v4-t,.v4-f,.v4-fig,.mp-host,.mp-body,.math-pilot){display:block;grid-row:auto}
  .lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-t{grid-column:2;grid-row:1;display:flex;flex-direction:column;gap:var(--sp-3);overflow:auto;max-height:100%}
  .lesson-v4[data-fit=wide] .v4-grid:not(.-pr) .v4-f{grid-column:1;grid-row:1}
  .lesson-v4[data-fit=wide] .v4-grid:not(.-pr) :is(.v4-a,.v4-b,#v3Tip,#v3Say,#v3Ask,.mp-acts,#v3Keys,#v3Do,#v3Cmp,#v3Prog,#v3Sum,#v3Note,.mp-stage){grid-column:auto;grid-row:auto}
}
.lesson-v4[data-fit=mid] .v4-b.-two{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start}
.lesson-v4[data-fit=mid] .v4-b.-two .v4-bb{display:flex;flex-direction:column;gap:var(--sp-3)}
.lesson-v4[data-fit=mid] .v4-b.-two>.card-fold{grid-column:1 / -1}
.lesson-v4 .v4-grid.-pr{display:block;overflow:auto;max-width:820px;width:100%;margin-left:auto;margin-right:auto}
.lesson-v4 .v4-grid.-pr>.v4-t{display:flex;flex-direction:column;gap:var(--sp-3)}
.lesson-v4 .v4-grid.-pr .v4-a{order:0}
/* 习题拍（-pr，第 7、8 拍）宽档两栏（2026-09-24）：题干 + 作答在左，说明 / 反馈 / 解析在右；tall / mid 仍走上面三行的单列 820。
   .v4-t / .v4-a 借两列（行自己排，一屏几道试一试也不挤一格）；题卡跨两列（还是一张卡），卡里题面类默认左列，反馈类点名右列。 */
.lesson-v4[data-fit=wide] .v4-grid.-pr{display:grid;grid-template-columns:minmax(0,55fr) minmax(0,45fr);grid-template-rows:auto;column-gap:var(--sp-5);row-gap:0;align-items:start;align-content:start;max-width:1240px;overflow:hidden auto}
.lesson-v4[data-fit=wide] .v4-grid.-pr>.v4-t{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;grid-row:1;gap:normal;min-width:0}
.lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a{display:grid;grid-template-columns:subgrid;grid-column:1 / -1;column-gap:normal;row-gap:var(--sp-3);align-items:start;min-width:0}
.lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a>*{grid-column:1 / -1;min-width:0}
.lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a>:is(.guess,.ai-box,.v3-fin){grid-column:1}
.lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a>:is(.card-fold,.err-pop,.v3-recap){grid-column:2}
.lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a>.box{display:grid;grid-template-columns:subgrid;grid-template-rows:repeat(7,auto) minmax(0,1fr);grid-column:1 / -1;row-gap:0;align-items:start;align-content:start}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>*{grid-column:1;min-width:0}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>:is(.inline-fb,.hint-in){grid-column:2;grid-row:1;margin-top:0}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>:is(.sol,.card-fold,.reveal,.expl){grid-column:2;grid-row:2 / 9;margin-top:0;align-self:start}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box:not(:has(>:is(.inline-fb,.hint-in)))>:is(.sol,.card-fold,.reveal,.expl){grid-row:1 / 9}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box:has(>:is(.inline-fb,.hint-in))>:is(.sol,.card-fold,.reveal,.expl){margin-top:var(--sp-3)}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>:is(.sol,.card-fold,.reveal,.expl)~:is(.sol,.card-fold,.reveal,.expl){grid-row:auto;margin-top:var(--sp-3)}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>:is(.said,.gnote){grid-column:2}
.lesson-v4[data-fit=wide] .v4-grid.-pr .box>.src{grid-column:2;grid-row:9;align-self:end;margin-top:var(--sp-3)}
@supports not (grid-template-rows:subgrid){
  .lesson-v4[data-fit=wide] .v4-grid.-pr{display:block;max-width:820px;margin:0 auto}
  .lesson-v4[data-fit=wide] .v4-grid.-pr :is(.v4-a,.v4-a>.box){display:block}
  .lesson-v4[data-fit=wide] .v4-grid.-pr>.v4-t{display:flex;flex-direction:column;gap:var(--sp-3)}
  .lesson-v4[data-fit=wide] .v4-grid.-pr .v4-a{display:flex;flex-direction:column;gap:var(--sp-3)}
}
.lesson-v4 .v4-bot{flex:none;position:static;margin-top:var(--sp-2);padding-top:var(--sp-2);background:none}
.lesson-v4 .v4-bot .rowflex{flex-wrap:nowrap;gap:var(--sp-2);justify-content:flex-start}
.lesson-v4 .v4-bot .btn-primary{flex:1 1 auto;width:auto;min-width:0;min-height:48px;padding:0 var(--sp-3);font-size:var(--fs-md);white-space:nowrap}
.lesson-v4 .v4-bot .btn-ghost{flex:none;padding:0 var(--sp-1);min-height:44px;white-space:nowrap;font-size:var(--fs-sm);gap:2px}
.lesson-v4 .v4-bot .rowflex:empty{display:none}
.lesson-v4[data-fit=tall] .guess .gopts{flex-direction:row}
.lesson-v4[data-fit=tall] .guess .gb{min-height:52px;padding:var(--sp-2) var(--sp-3)}
.lesson-v4[data-fit=tall] .guess .gskip{min-height:36px;margin-top:0}
.lesson-v4[data-fit=tall] .lp2-title,.lesson-v4[data-fit=tall] .v4-grid .src{display:none}
.lesson-v4[data-fit=tall]:not(.is-tight) [data-act=v4replay]{display:none}
.lesson-v4.is-tight .lp2-title,.lesson-v4.is-tight .v4-grid .src,.lesson-v4.is-tight .quietline{display:none}
.lesson-v4.is-tight .qintro{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.lesson-v4.is-tighter .qintro{-webkit-line-clamp:1}
.lesson-v4.is-tighter .tf-cap{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}
.lesson-v4.is-nointro .qintro,.lesson-v4.is-nointro .tf-cap{display:none}
/* 配置讲解页的正文、公式、步骤和标题始终展开；压缩档只沿用字号/间距，不藏必要内容。 */
.lesson-v4.has-teaching-page .teaching-page :is(.teaching-copy,.formula,.cl){white-space:normal;overflow:visible;-webkit-line-clamp:unset}
.lesson-v4.has-teaching-page.is-tighter .teaching-page .nk{display:block}
.lesson-v4.is-tight .v4-grid,.lesson-v4.is-tight .v4-a,.lesson-v4.is-tight .v4-b,.lesson-v4.is-tight .v4-t{gap:var(--sp-2)}
.lesson-v4.is-tight .v4-grid{margin-top:var(--sp-2)}
.lesson-v4.is-tight .qintro,.lesson-v4.is-tight .guess .gq,.lesson-v4.is-tight .reveal p,.lesson-v4.is-tight .namecard p,.lesson-v4.is-tight .namecard .formula,.lesson-v4.is-tight .ansline,.lesson-v4.is-tight .v4-grid .lead{font-size:var(--fs-md);line-height:1.5}
.lesson-v4.is-tight .guess .gb{min-height:48px}.lesson-v4.is-tight .guess .gq{margin-bottom:var(--sp-2)}
.lesson-v4.is-tight .reveal{padding:var(--sp-3) var(--sp-4)}.lesson-v4.is-tight .namecard{padding:var(--sp-3) var(--sp-4);gap:var(--sp-2)}
.lesson-v4.is-tight .lead-in{padding:var(--sp-2) var(--sp-3)}.lesson-v4.is-tight .calc .cl{padding:var(--sp-1) 0}
.lesson-v4.is-tight .ansline{padding:var(--sp-2) var(--sp-3)}
.lesson-v4.is-tighter .tmeta{display:none}
.lesson-v4.is-tighter .qintro,.lesson-v4.is-tighter .guess .gq,.lesson-v4.is-tighter .reveal p,.lesson-v4.is-tighter .namecard p,.lesson-v4.is-tighter .namecard .formula,.lesson-v4.is-tighter .ansline,.lesson-v4.is-tighter .v4-grid .lead,.lesson-v4.is-tighter .guess .gb,.lesson-v4.is-tighter .lead-in,.lesson-v4.is-tighter .calc .cl{font-size:14px;line-height:1.45}
.lesson-v4.is-tighter .guess .gb{min-height:44px}.lesson-v4.is-tighter .namecard .nk,.lesson-v4.is-tighter .reveal .rk,.lesson-v4.is-tighter .calc .ck{display:none}
.lesson-v4.is-tighter .sec-h .h3{font-size:var(--fs-md)}
/* 题目条：三种摆法都在（tall / mid 拍进度下方、wide 右栏顶部），压缩档只缩字号到 14px，不省、不截断 */
.qbar{display:flex;gap:var(--sp-2);align-items:flex-start;background:var(--c-surface);border:1px solid var(--c-line);border-left:3px solid var(--c-accent);border-radius:var(--r-md);padding:var(--sp-2) var(--sp-3)}
.qbar .qk{flex:none;font-size:var(--fs-xs);font-weight:700;color:var(--c-accent);line-height:1.6;padding-top:2px;white-space:nowrap}
.qbar .qt{min-width:0;font-size:var(--fs-sm);line-height:1.6;color:var(--c-ink)}
.qbar .qt p{margin:0}
.v4-grid[data-b="1"] .qbar .qt{font-size:var(--fs-md)}
.qintro{font-size:var(--fs-sm);color:var(--c-ink-2);line-height:1.55}
.lesson-v4.is-tighter .qbar .qt,.lesson-v4.is-tighter .v4-grid[data-b="1"] .qbar .qt{font-size:14px;line-height:1.45}
.lesson-v4[data-fit=tall].is-tight .sec-h{display:none}
/* 手机收紧档不再整块藏折叠卡（2026-10-07）：标题行常在、没点开时收成 44px 一行；点开后内容一直在，放不下走 is-scroll 文字列自己滚 */
.lesson-v4[data-fit=tall].is-tighter .card-fold:not(.is-open)>.fold-head{min-height:44px}
.lesson-v4[data-fit=tall].is-nointro .lead-in{display:none}
.lesson-v4[data-fit=tall].is-tighter .calc .cl{padding:3px 0;line-height:1.4}.lesson-v4[data-fit=tall].is-tighter .calc{padding:var(--sp-2) var(--sp-3)}
.lesson-v4.is-scroll .v4-f{flex:none;overflow:visible}.lesson-v4.is-scroll .v4-b{flex:1 1 0;min-height:96px;overflow:auto}
/* 最后一招补两条（2026-09-21，配 V11 的「画布只认列宽」）。页面（document）仍然一格不滚。
   ① 横屏宽档：图列顶不下就图列自己滚，不许让 .v4-grid 的 overflow:hidden 把块底下的键盘条切掉。
   ② 上下堆两档：文字列滚到底仍放不下时，整条内容列自己滚 —— 否则 .v4-b 会被挤到 .v4-grid 外面看不见。 */
.lesson-v4[data-fit=wide].is-scroll .v4-grid:not(.-pr){overflow:hidden auto}
.lesson-v4[data-fit=wide].is-scroll .v4-grid:not(.-pr) .mp-stage{position:sticky;top:0}
.lesson-v4:not([data-fit=wide]).is-scroll .v4-grid{overflow:hidden auto}
/* 展开课内说明时保留完整图文，内容格滚动；图位和文字块不能再相互缩压。 */
.lesson-v4.has-open-fold .v4-grid:not(.-pr){overflow:hidden auto}
.lesson-v4.has-open-fold .v4-f{flex:none;overflow:visible}
.lesson-v4.has-open-fold .v4-b{flex:none;min-height:auto;overflow:visible}
.lesson-v4.has-open-fold[data-fit=wide] .v4-grid:not(.-pr) .v4-f:not(:has(.mp-host)){overflow:visible}

.sticky-bottom .hintline{display:block;text-align:center;font-size:var(--fs-sm);color:var(--c-ink-3);padding:var(--sp-3) 0}
/* ---------- 上课模式（儿童体验六条 必-5，2026-09-24 晚）：进入八拍 body 加 is-class，全屏上课 ----------
   左上 × 回本课（开始卡）· 中间「看 → 做 → 换 → 练」四段进度（文案占位，做课线定稿）· 右上声音开关占位；
   学习中不出现侧栏、顶栏（品牌 / 面包屑 / 字号 / 进门 / 搜索）、手机底导航、标题行、八个拍点与「第 N 拍」、页脚「内容依据…」。
   今早的宽档右栏子网格一字不动；只在它外面收壳。拍点 .tdot 仍在 DOM（验收按 title 反查拍列表），只是不上屏。
   图上指令条 / 气泡 / 横幅 / 演示手的样式在 pilots/runtime.css；这里只管壳。 */
:root{--c-instr:#25283E;--c-instr-ink:#FFFFFF}
:root[data-theme="dark"]{--c-instr:#F1F1F8;--c-instr-ink:#16172A}
@media(prefers-color-scheme:dark){:root[data-theme="auto"]{--c-instr:#F1F1F8;--c-instr-ink:#16172A}}
.cls-top{display:none}
body.is-class #top,body.is-class #rail,body.is-class #tabs,body.is-class .rail-drawer{display:none!important}
body.is-class{grid-template-rows:minmax(0,1fr)}
@media(min-width:641px){body.is-class{grid-template-rows:minmax(0,1fr) var(--abar-h)}body.is-class.no-abar{grid-template-rows:minmax(0,1fr)}}
body.is-class .body{grid-template-columns:minmax(0,1fr)!important}
body.is-class .main.-v4{padding:0 var(--pad-page) var(--sp-3)}
/* 2026-09-25 收回副作用：上课模式藏了侧栏，正文列跟着变宽，互动图吃满列宽就放大了（M08-U010 @1440 596→642、@1280 503→629，
   标签离图的屏幕像素变大，selfcheck V4a 越 40 硬线）。舞台宽度要与改前一致 → 上课模式下正文最宽 = 改前那一列宽（视口 − 侧栏 − 两边留白），居中；
   窄屏（≤640）本来就没侧栏，不管。 */
@media(min-width:641px){body.is-class .main.-v4 .main-inner.lesson-v4{max-width:calc(100% - var(--nav-w));margin-left:auto;margin-right:auto}
 body.is-class .main.-v4 .lesson-v4[data-fit=wide]{max-width:min(1240px,calc(100% - var(--nav-w)))}}
body.is-class .lesson-v4 .lp2-title,body.is-class .lesson-v4 .tbar,body.is-class .lesson-v4 .foot,body.is-class .abar .ab-m{display:none!important}
body.is-class .lesson-v4 .phead{border-bottom:0;padding-bottom:0}
body.is-class .cls-top{flex:none;display:flex;align-items:center;gap:var(--sp-3);min-height:56px;padding:0 var(--sp-1);border-bottom:1px solid var(--c-line);margin:0 0 var(--sp-1)}
.cls-x,.cls-snd{width:44px;height:44px;flex:none;border:0;background:none;border-radius:var(--r-md);display:grid;place-items:center;color:var(--c-ink-2);cursor:pointer;padding:0;font:inherit}
.cls-x:hover{background:var(--c-surface-2);color:var(--c-ink)}
.cls-x svg,.cls-snd svg{width:22px;height:22px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.cls-snd[disabled]{opacity:.45;cursor:default}
.cls-prog{flex:1 1 auto;display:flex;align-items:center;justify-content:center;gap:6px;min-width:0}
.cls-seg{display:flex;flex-direction:column;align-items:center;gap:4px;flex:0 1 120px;min-width:40px}
.cls-seg .bar{width:100%;height:6px;border-radius:3px;background:var(--c-line);overflow:hidden}
.cls-seg .bar i{display:block;height:100%;width:0;background:var(--c-accent);border-radius:3px;transition:width .4s var(--ease)}
.cls-seg .lb{font-size:var(--fs-sm);color:var(--c-ink-3);font-weight:700;white-space:nowrap;line-height:1.2}
.cls-seg.is-done .bar i{background:var(--c-ok)}.cls-seg.is-done .lb{color:var(--c-ok)}
.cls-seg.is-on .lb{color:var(--c-accent)}
.cls-arrow{color:var(--c-ink-3);font-size:12px;flex:none;margin-bottom:18px}
/* 节名只放 title 属性（设计包「宽档右侧一句节名，可不要」）：不上屏，拍 2 / 3 / 6 屏上字省出来 */
.cls-title{display:none;font-size:var(--fs-sm);color:var(--c-ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
@media(max-width:640px){body.is-class .main.-v4{padding:0 8px 8px}
 body.is-class .cls-top{min-height:48px;gap:var(--sp-1);padding:0}
 body.is-class .cls-seg{flex:1 1 0}body.is-class .cls-seg .lb{font-size:13px}body.is-class .cls-arrow{display:none}}
/* 窄档：图占屏宽 ≥90% —— 块的外框与内边距归零（第 1～6 拍同宽，冻结拍也一样），舞台只留 4px */
body.is-class .lesson-v4[data-fit=tall] .math-pilot,body.is-class .lesson-v4[data-fit=tall] .math-pilot.-still{padding:0;border:0;background:none;border-radius:0}
body.is-class .lesson-v4[data-fit=tall] .mp-stage{padding:4px}
/* 故事条：动手的拍（2 / 3 / 6）收成一个小签「题目（点开看）」，点开展开并记住（本机键 baike.class.story）；1 / 4 / 5 拍照旧全文 */
body.is-class .v4-grid .qbar.is-fold{cursor:pointer}
body.is-class .v4-grid .qbar.is-fold:not(.is-open){align-self:flex-start;align-items:center;min-height:44px;padding:4px 14px;border-radius:var(--r-pill);border-left:1px solid var(--c-line)}
body.is-class .v4-grid .qbar.is-fold:not(.is-open) .qt{display:none}
body.is-class .v4-grid .qbar.is-fold:not(.is-open) .qk{padding-top:0}
body.is-class .v4-grid .qbar.is-fold:not(.is-open) .qk::after{content:"（点开看）";font-weight:400;color:var(--c-ink-3)}
body.is-class .v4-grid .qbar.is-fold:focus-visible{outline:2px solid var(--c-accent);outline-offset:2px}
/* 应该改 ②：四段上方的节圆点；拍 1 小标题里的「第 N 节 / 这一节」不上屏 */
.cls-mid{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:4px}
.cls-secs{display:flex;justify-content:center;gap:6px}
.cls-secs i{width:8px;height:8px;border-radius:50%;border:1.5px solid var(--c-line);box-sizing:border-box}
.cls-secs i.is-done{background:var(--c-ok);border-color:var(--c-ok)}
.cls-secs i.is-on{background:var(--c-accent);border-color:var(--c-accent);width:18px;border-radius:4px}
body.is-class .lesson-v4 .sec-h .kicker{display:none}
/* 应该改 ⑤：猜之前遮住的答案格显示「？」，说明先不出 */
.v4-f.is-hiding .tf-cap{display:none}
.v4-fig text.is-hid{fill:var(--c-accent)!important;font-weight:800}
/* 动手的拍：「现在做什么」只由图上的指令条管，引子小提示不再单出 */
body.is-class .v4-grid:is([data-b="2"],[data-b="3"],[data-b="6"]) .lead-in{display:none}

.lesson-v4[data-fit=wide] .v4-grid[data-b="5"] .lead-in{display:flex}
.lesson-v4[data-fit=tall].is-nointro .v4-grid[data-b="5"] .lead-in{display:flex}
