*{box-sizing:border-box;margin:0;padding:0}
/* ---------- 设计变量（计划 §3.1~§3.3，阶段1）----------
   色板为计划 §3.1 建议值（辅助文字按对比度微调，全站用同一 --mut）：暖白纸面约 80%、
   墨色约 15%、品牌绿+柠檬合计 ≤5%。旧默认绿 #16a34a/#22c55e 与其 Tailwind 衍生
   浅绿（#dcfce7/#bbf7d0/#86efac/#d1fae0）已全站同步替换为本色板/令牌，不保留双绿。
   --pri-line 为 --pri 的浅阶描边色（非文本边界，与 --brand-soft 配套），供全站
   浅绿描边统一引用；--lemon 本阶段暂无组件引用，随 §3.1 语义（选学/重点标记）
   在后续阶段接入。 */
:root{
  /* 色彩（计划 §3.1） */
  --pri:#2f7d4e;--prid:#205f3a;
  --brand-soft:#edf4e8;--brand-pale:#f6f8f0;
  --pri-line:#b9c9ae;
  --lime:#c4d96f;--lemon:#e2b84b;
  --bg:#f7f5ef;--ink:#22251f;--mut:#60665d;--line:#d9dcd2;--card:#fffefa;
  --warning:#9a5b16;--danger:#bd3535;
  /* 状态色扩展令牌（2026-10-29 修复 #14：收口散落的硬编码色）：
     --info 承载「信息蓝」（条目类型「任务」、章节「学习中」），同时是 AI 课程
     辅助色的文字基色（一色两义在同一令牌上显式化，改色一处生效）；
     --*-soft/--*-line 为对应浅底与描边阶，供浅色状态面/徽标引用。 */
  --info:#1d4ed8;--info-soft:#eff6ff;--info-line:#bfdbfe;
  --warn-soft:#fef3c7;--warn-line:#fde68a;
  --danger-soft:#fef2f2;
  /* 条目类型辅助色（2026-10-31 审计 P2-1 收口）：原理紫/动手橙此前硬编码在
     .t-原理/.t-动手，与任务蓝（--info）、复盘琥珀（--warning）同族进令牌。 */
  --violet:#6d28d9;--orange:#c2410c;
  /* 深底代码共用令牌（2026-11-02 审计 P0-1）：.code/.cex 等深底代码的底色与
     「普通文本」前景——普通标识符/括号此前继承正文墨色，深底深字对比度仅 1.15:1。
     语义色 token（.c-str 等）保持各自独立浅色，不并入本对。
     输出面与错误前景独立成对（v4 执行书 4.1）：不与普通代码前景混用。 */
  --code-bg:#0f172a;--code-fg:#e2e8f0;
  --out-bg:#111827;--out-fg:#a7f3d0;--code-err-fg:#fca5a5;
  --code-head-bg:#1e293b;--code-head-fg:#94a3b8;
  /* 浮层阴影分级（v4 执行书 4.1）：菜单轻、弹层重，阴影只用于浮层 */
  --shadow-menu:0 8px 24px rgba(0,0,0,.12);
  /* 字体（计划 §3.2：系统字体，不加载在线字体；v4 §4.2 补 ui-monospace 等回退） */
  --font-sans:"PingFang SC","Microsoft YaHei","Segoe UI",system-ui,sans-serif;
  --mono:ui-monospace,Consolas,"Courier New",monospace;
  /* 字号层级（计划 §3.2：首页主标题桌面 38~44 / 页面 H1 27~30 / 正文 16/1.8 /
     辅助 13~14；手机端覆盖见文件末尾的 959px 断点） */
  --fs-hero:34px;--fs-h1:27px;--fs-h2:20px;--fs-body:16px;--fs-aux:13px;--fs-code:13.5px;
  /* 间距节奏（计划 §3.3：4/8/12/16/24/32/48） */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-6:24px;--sp-8:32px;--sp-12:48px;
  /* 圆角（计划 §3.3：控件 8~10px / 独立卡 12~14px；--r-hero 已随阶段3 hero 去卡面移除，
     学习账页卡用 --r-md） */
  --r-sm:8px;--r-ctl:10px;--r-md:12px;--r-card:14px;
  /* 阴影（计划 §3.3：默认内容卡不投阴影，阴影只给下拉菜单/弹层等浮层） */
  --shadow-modal:0 10px 30px rgba(0,0,0,.22);
  /* 顶栏高度（阶段2）：桌面 64px / 手机 60px；遮罩与面板的 top 用同一变量对齐。
     env(safe-area-inset-top) 为 0 的环境下 calc 退化为普通高度，行为不变。 */
  --top-h:64px;
}
body{font-family:var(--font-sans);background:var(--bg);color:var(--ink);line-height:1.8;font-size:var(--fs-body)}
a{color:var(--pri);text-decoration:none}

/* ---------- 顶栏（阶段2：全局导航） ---------- */
/* 桌面端 64px 单行：品牌居左 → 高频直达链接 → 「学习工具」触发按钮（.tnav）→
   独立账号区（.userbox，用户名+退出）。不换行：brand 允许收缩省略，tnav/userbox 不收缩。 */
.top{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:14px;min-height:calc(var(--top-h) + env(safe-area-inset-top));padding:8px 20px;padding-top:calc(8px + env(safe-area-inset-top));background:var(--card);border-bottom:1px solid var(--line);flex-wrap:nowrap;transition:transform .18s}
/* #topbar 只是 renderTop 的挂载容器（自身只有一行高）：不退出布局的话，.top 的
   sticky 包含块被限制在这一行内，向下滚动时顶栏会被父容器带出视口（2026-10-27 修复）。
   display:contents 让 header.top / 遮罩 / 工具菜单以 body 子级身份参与布局，
   sticky 的包含块变成整页 body，顶栏得以全程钉在视口顶部。 */
#topbar{display:contents}
/* 顶栏智能收起（2026-10-27 批）：下滑（滚过阈值）自动收起、上滑立即弹回，
   body.top-hidden 由 app.js 的滚动监听维护。transform 只做视觉位移，sticky
   在流内占位不变；遮罩与工具菜单是 .top 的兄弟节点，不受 transform 影响。 */
body.top-hidden .top{transform:translateY(-100%)}
/* 品牌行（阶段5）：青柠线性 SVG + 文字，ellipsis 收缩职责移到 .brandtext；
   ≤420px 显示完整短名「青柠学堂」（v4 执行书 6.4.4），完整课程名保留在 aria-label */
.brand{display:inline-flex;align-items:center;gap:7px;font-weight:700;font-size:16px;color:var(--ink);white-space:nowrap;min-width:0;overflow:hidden}
.brand svg{flex:none;color:var(--pri)}
.brandtext{overflow:hidden;text-overflow:ellipsis}
.brand-short{display:none}
@media (max-width:420px){
  .brand-short{display:inline}
  .brand-full{display:none}
  .brandtext{overflow:visible;text-overflow:clip}
}
.tnav{display:flex;align-items:center;gap:4px;margin-left:auto;flex-wrap:nowrap;flex-shrink:0}
.tnav a{position:relative;font-size:14px;color:var(--mut);padding:6px 12px;border-radius:var(--r-sm);white-space:nowrap}
.tnav a:hover{color:var(--prid);background:var(--brand-pale)}
/* 当前页三重表达：背景块 + 加深文字 + 底部指示条（不只靠颜色），并配合 aria-current */
.tnav a.on{color:var(--prid);background:var(--brand-soft);font-weight:600}
.tnav a.on::after{content:"";position:absolute;left:12px;right:12px;bottom:3px;height:3px;border-radius:3px;background:var(--pri)}
.burger{display:none;align-items:center;justify-content:center;width:44px;height:44px;border:1px solid var(--line);background:var(--card);border-radius:var(--r-sm);cursor:pointer;flex:none;padding:0;color:var(--ink)}
/* 「学习工具」触发按钮（桌面直达组右侧；手机端顶栏唯一右侧入口） */
.toolsbtn{display:inline-flex;align-items:center;gap:5px;font-family:inherit;font-size:14px;color:var(--mut);background:var(--card);border:none;padding:6px 12px;border-radius:var(--r-sm);cursor:pointer;white-space:nowrap}
.toolsbtn:hover{color:var(--prid);background:var(--brand-pale)}
.toolsbtn.on,body.tools-open .toolsbtn{color:var(--prid);background:var(--brand-soft);font-weight:600}
.toolsbtn .caret{transition:transform .15s}
body.tools-open .toolsbtn .caret{transform:rotate(180deg)}
.userbox{display:flex;align-items:center;gap:8px;padding-left:14px;border-left:1px solid var(--line);flex-shrink:0;white-space:nowrap}
.userbox .chip{max-width:160px;overflow:hidden;text-overflow:ellipsis}
/* ---------- 导航面板：遮罩 + 学习工具菜单（阶段2） ---------- */
/* 遮罩与菜单渲染在 #topbar 里、header.top 的兄弟位置：fixed 定位锚定视口，
   不受 .top 的 sticky 层叠上下文限制（遮罩 35 < 菜单 36 < toast 99）。
   菜单关闭态用 visibility:hidden（不可聚焦），开启后 150ms 淡入。 */
.navscrim{display:none;position:fixed;inset:0;z-index:35;background:rgba(34,37,31,.4)}
body.tools-open .navscrim-tools{display:block}
body.drawer-open .navscrim-drawer{display:block}
.toolsmenu{visibility:hidden;opacity:0;position:fixed;z-index:36;top:calc(var(--top-h) + env(safe-area-inset-top));right:12px;min-width:190px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-menu);padding:6px;display:flex;flex-direction:column;transition:opacity .15s,visibility 0s .15s}
body.tools-open .toolsmenu{visibility:visible;opacity:1;transition:opacity .15s}
.toolsmenu a{display:block;font-size:14px;color:var(--ink);padding:9px 12px;border-radius:var(--r-sm);white-space:nowrap}
.toolsmenu a:hover{color:var(--prid);background:var(--brand-pale)}
.toolsmenu a.on{color:var(--prid);background:var(--brand-soft);font-weight:600;box-shadow:inset 3px 0 0 var(--pri)}
.tm-user{font-size:var(--fs-aux);font-weight:600;color:var(--prid);padding:8px 12px 6px;border-bottom:1px dashed var(--line);margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tm-logout{margin:8px 6px 4px;align-self:flex-start}
.tm-sep{height:1px;background:var(--line);margin:6px}
/* 桌面端菜单只留低频入口：高频同名项、分组标题、分组线、用户名与退出按钮隐藏
   （退出在 .userbox 常驻可见，可达性不减）；选择器带 .toolsmenu 前缀
   压过 .toolsmenu a 的 display:block（特异性 0,2,0 > 0,1,1） */
.tm-group{display:none}
@media (min-width:960px){
  .toolsmenu .tm-dup,.toolsmenu .tm-sep,.toolsmenu .tm-user,.toolsmenu .tm-logout,.toolsmenu .tm-group{display:none}
}
/* 「学习工具」按钮的双标签（v4 执行书 6.4.2）：桌面「学习工具」、手机「更多」，
   可访问名称固定为「学习工具菜单」（aria-label），视觉随断点切换 */
.tb-short{display:none}
/* 手机端「更多」菜单分组标题（6.4.2）：课程与练习 / 进度与支持 / 账号 */
@media (max-width:959px){
  .tb-full{display:none}
  .tb-short{display:inline}
  .tm-group{display:block;font-size:12px;font-weight:600;color:var(--mut);padding:8px 12px 2px;letter-spacing:1px}
  .toolsmenu .tm-sep{display:none}
}

/* ---------- 双栏布局 ---------- */
.layout{display:flex;align-items:flex-start}
.side{width:264px;flex:0 0 264px;position:sticky;top:calc(var(--top-h) + env(safe-area-inset-top));max-height:calc(100vh - var(--top-h) - env(safe-area-inset-top));overflow:auto;padding:16px 12px 60px;border-right:1px solid var(--line);background:var(--card)}
.main{flex:1;min-width:0}
/* ---------- 桌面端课程目录收起/展开（2026-10-27 批）----------
   burger 桌面端常驻显示：点击切换 body.side-hidden（目录完全隐藏、正文占满宽度），
   收起状态由 app.js 存 localStorage 记忆、每次渲染同步回 body；手机端（<960px）
   仍走抽屉（drawer-open），side-hidden 与顶栏收起时的侧栏位移只在桌面媒体查询生效。 */
@media (min-width:960px){
  .burger{display:inline-flex}
  body.side-hidden .side{display:none}
  /* 顶栏智能收起时侧栏顶距同步上移，不留 64px 空档 */
  body.top-hidden .side{top:env(safe-area-inset-top);max-height:calc(100vh - env(safe-area-inset-top))}
}
.content{max-width:720px;margin:22px auto 80px;padding:0 18px}

/* ---------- 侧栏章节导航 ---------- */
.sidehead{font-weight:700;font-size:14px;padding:2px 8px 6px}
.sideprog{font-size:12px;color:var(--mut);padding:0 8px 10px;border-bottom:1px solid var(--line);margin-bottom:10px}
.sch{margin-bottom:6px}
/* 侧栏章名（v4 阶段3 折叠改造）：div → button，点击展开/收起本章课行；
   课数靠右、展开态 chevron 旋转；当前章 caret 主色 */
/* 折叠控件 ≥44px（v4 执行书 9.3 硬门槛，与主区 .chtoggle 同口径；审计补齐） */
button.schname{display:flex;align-items:center;gap:6px;width:100%;min-height:44px;box-sizing:border-box;text-align:left;background:transparent;border:none;font-family:inherit;font-size:var(--fs-aux);font-weight:600;color:var(--prid);padding:5px 8px;line-height:1.45;cursor:pointer;border-radius:var(--r-sm)}
button.schname:hover{background:var(--brand-pale)}
.sch.locked button.schname{color:var(--mut)}
.schcount{margin-left:auto;font-weight:400;color:var(--mut);font-size:12px;white-space:nowrap;font-variant-numeric:tabular-nums}
button.schname .caret{flex:none;color:var(--mut);transition:transform .15s;align-self:center}
.sch:not(.locked) button.schname[aria-expanded="true"] .caret{transform:rotate(180deg);color:var(--pri)}
.schrows{display:flex;flex-direction:column}
.sles{display:flex;align-items:flex-start;gap:8px;font-size:var(--fs-aux);color:var(--ink);padding:5px 8px;border-radius:var(--r-sm);line-height:1.45}
a.sles:hover{background:var(--brand-pale)}
.sles.cur{background:var(--brand-soft);font-weight:600}
.sles.dim{color:var(--mut);cursor:not-allowed}
.sdot{width:8px;height:8px;border-radius:99px;flex:none;margin-top:7px}
.sdot.ok{background:var(--pri)}
.sdot.open{background:var(--line)}
.sdot.lock{background:var(--line)}

/* ---------- 按钮 ---------- */
.btn{display:inline-block;padding:var(--sp-2) var(--sp-4);border-radius:var(--r-ctl);border:1px solid var(--line);background:var(--card);color:var(--ink);font-size:14px;cursor:pointer}
.btn:hover{border-color:var(--pri)}
.btn.pri{background:var(--pri);border-color:var(--pri);color:#fff;font-weight:600}
.btn.pri:hover{background:var(--prid)}
.btn.ghost{background:transparent}
/* 危险确认（v4 执行书 6.16.3）：清空进度/删除账号等不可恢复操作的确认键用语义红，
   不与普通主按钮（品牌绿）混用；取消键保持中性 */
.btn.danger{background:var(--danger);border-color:var(--danger);color:#fff;font-weight:600}
.btn.danger:hover{background:#a02c2c}
.btn.sm{padding:4px 10px;font-size:12px;border-radius:var(--r-sm)}
.btn:disabled{opacity:.4;cursor:not-allowed}
.btn.big{padding:12px 22px;font-size:16px}

/* ---------- 首页（阶段3：编辑式 Hero + 学习账页 + 连续章节账页列表） ---------- */
/* 首页内容放宽到 960px 容纳编辑式双栏（render() 进其他页移除 .home-wide，课程正文 720px 不变） */
.content.home-wide{max-width:960px}
/* Hero 非对称编辑式布局：容器不再自带渐变/边框/大圆角，直接坐在纸面上；
   左列自适应、右列学习账页定宽，960px 以下单栏（见文件末尾移动端块） */
.hero{margin:26px 0 30px;display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:32px;align-items:start}
.hero h1{font-size:var(--fs-hero);line-height:1.25;margin-bottom:10px}
/* 课程分类行（HERO_TAGS 按 slug，未映射 slug 不渲染该节点） */
.herotag{font-size:var(--fs-aux);font-weight:600;color:var(--prid);letter-spacing:.5px;margin-bottom:8px}
/* 课程简介视觉长度控制（-webkit-line-clamp，文案原文不动，DOM 内完整保留）；
   手机端不截断（2026-10-29 修复 #7：3 行钳制会停在句中，小屏空间换完整信息） */
.herotheme{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
/* 章/课/题总量：一行文字统计（等宽数字），不再各做一张白底数据小卡 */
.herostatline{margin-top:10px;font-size:14px;color:var(--mut);font-variant-numeric:tabular-nums}
/* 结课/试学横幅：虚线细边一行字（去实底），只做事实陈述不带链接（v3 计划 5.2：
   动作入口集中到右侧任务台，同屏唯一主 CTA），视觉层级低于任务台主动作按钮 */
.banner{margin-top:16px;padding:10px 14px;border:1px dashed var(--pri-line);border-radius:var(--r-ctl);font-weight:600;font-size:14px;color:var(--prid);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.banner svg{flex:none}
.hero .btn{margin-top:0}
/* 学习账页（hero 右侧，v3 计划 5.3）：第一眼 = 今日委托任务区，进度/等级缩小放次要区 */
.herobrief{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:18px 20px 16px}
.briefhead{display:flex;align-items:center;justify-content:space-between;gap:8px;font-weight:600;font-size:14px;color:var(--prid);border-bottom:1px solid var(--line);padding-bottom:10px;margin-bottom:12px}
.briefhead svg{color:var(--pri);flex:none}
/* 任务区（委托 → 下一步 → 主动作）：委托标题为面板内最大文字（19px），
   主动作 .briefgo 全宽实心主按钮——全页唯一主 CTA */
.brieftask{padding-bottom:14px;border-bottom:1px solid var(--line)}
.briefcap{font-size:12px;font-weight:600;letter-spacing:1px;color:var(--prid);margin-bottom:4px}
.brieftasktitle{font-size:19px;line-height:1.45;font-weight:600;color:var(--ink);word-break:break-word;text-wrap:balance}
.briefnexthint{margin-top:6px;font-size:13px;line-height:1.65;color:var(--mut);word-break:break-word;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.briefnexthint b{color:var(--prid);font-weight:600;margin-right:6px}
.briefgo{display:block;text-align:center;margin-top:12px;padding:10px 16px}
.briefprog{padding-top:12px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.briefprogtext{display:flex;justify-content:space-between;align-items:baseline;gap:10px;font-size:13.5px;margin-bottom:8px}
.briefprogtext b{color:var(--prid);font-weight:600;font-variant-numeric:tabular-nums}
.briefprogtext span{color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.briefprog .chbar{border-radius:99px}
.briefrow{display:flex;justify-content:space-between;gap:10px;align-items:baseline;font-size:14px;padding:11px 0;border-bottom:1px solid var(--line)}
.briefrow span{color:var(--mut);flex:none}
.briefrow b{color:var(--ink);text-align:right;font-variant-numeric:tabular-nums;font-weight:600}
.briefnext{padding-top:11px;font-size:13.5px}
.briefnext span{display:block;color:var(--mut);margin-bottom:2px}
.briefnext b{color:var(--prid);line-height:1.5;word-break:break-word;font-weight:600}
.foot{margin:26px 0 10px;text-align:center}

/* ---------- 章节地图（阶段3：连续账页列表） ---------- */
/* 章头为分隔行：细分隔线 + 等宽章号 + 章名 + 文字状态，不再使用带底色圆角的章头卡；
   课程行之间只用细分隔线，不再各自包边框小卡；章进度条移除，进度由 chmeta 文字承担 */
/* chip 保留两个真实用途：顶栏用户名与章头「试学 · 免费开放」标记 */
.chip{font-size:var(--fs-aux);background:var(--card);border:1px solid var(--line);border-radius:99px;padding:4px 12px;color:var(--ink)}
.chip.trial{border-color:var(--pri-line);color:var(--prid);font-weight:600}
.chsec{margin-bottom:4px}
/* 章头（v4 阶段3 折叠改造；审计修正）：.chhead 回归 flex 行——h2.chheadname 包裹
   .chtoggle 按钮（APG 折叠模式：标题包按钮，button 只含 phrasing 内容，章名不再
   嵌进 button），状态/试学徽标/统计为行内兄弟节点；解锁说明 flex-basis:100% 独占一行。
   原独立「01/02」序号（.chidx）已随 6.5.6 移除——章名自带「章N」不重复编号。 */
.chhead{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;padding:14px 8px 0;border-top:1px solid var(--line)}
.chheadname{margin:0;flex:1;min-width:0;font-size:16px;font-weight:600;line-height:1.45}
.chtoggle{display:flex;align-items:center;gap:10px;flex-wrap:wrap;width:100%;text-align:left;background:transparent;border:none;padding:8px;font-family:inherit;cursor:pointer;border-radius:var(--r-sm);font-size:var(--fs-body);min-height:44px;box-sizing:border-box}
.chtoggle:hover{background:var(--brand-pale)}
.chtoggle .caret{flex:none;color:var(--mut);transition:transform .15s}
.chtoggle[aria-expanded="true"] .caret{transform:rotate(180deg)}
.chsec.chcur .chtoggle .caret{color:var(--pri)}
/* 章名现为 .chtoggle 内的 span（标题语义在父级 h2.chheadname 上），不再承担
   flex:1/min-width 的 flex 项职责（原为 h2 直接作 flex 项时的规则） */
.chname{font-size:16px;font-weight:600}
/* 锁定章：章名转灰弱化，行内另有锁图标与章级解锁说明（不只靠颜色） */
.chsec.chlock .chname{color:var(--mut)}
/* 章级解锁说明（v4 执行书 6.5.5）：每章一条，替代原逐课 26 条 .llocknote */
.chlocknote{flex-basis:100%;display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--mut);padding:0 8px 4px;margin-top:-2px}
.chlocknote svg{flex:none}
/* 章节状态：纯文字（不只靠颜色），去掉原胶囊底与描边 */
.chstat{flex:none;font-size:12px;font-weight:600;white-space:nowrap}
.chstat-done{color:var(--prid)}
.chstat-doing{color:var(--info)}
.chstat-start{color:var(--mut)}
.chstat-lock{color:var(--mut)}
.chmeta{font-size:var(--fs-aux);color:var(--mut);white-space:nowrap;font-variant-numeric:tabular-nums}
.chrows{padding:0 0 10px}
/* 折叠态（审计修正）：作者规则的 display 优先级高于 UA 的 [hidden] 样式
   （.schrows 是 display:flex，实际不会隐藏），显式补 display:none 兜底；
   正常路径折叠时不渲染行内容，此处为结构保险 */
.chrows[hidden],.schrows[hidden]{display:none}
/* 进度条原语（.chbar/.chfill）：首页账页、等级页与选课封面共用；阶段1 已改单色实心 */
.chbar{height:6px;background:var(--line);overflow:hidden}
.chfill{height:100%;background:var(--pri);transition:width .3s}
/* 课程行（账页行）：无边框卡面，行间细分隔线，触控行高 ≥44px */
.lrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:11px 8px;border-radius:var(--r-sm);color:var(--ink);transition:background .15s}
.lrow + .lrow{border-top:1px solid var(--line)}
a.lrow:hover{background:var(--brand-pale)}
/* 锁定行 = <button>（语义化可聚焦）：样式重置回文字行，锁定态不用 hover 假装可点 */
button.lrow{width:100%;text-align:left;font-family:inherit;font-size:var(--fs-body);background:transparent;border:none;cursor:not-allowed;color:var(--mut)}
button.lrow:hover{background:transparent}
.lrow.locked .lname,.lrow.locked .lmeta{color:var(--mut)}
/* 当前课行：左绿条印记 + 浅底 + 「下一步」文字徽标 */
.lrow-cur{background:var(--brand-pale);box-shadow:inset 3px 0 0 var(--pri)}
.lnext{flex:none;font-size:12px;font-weight:600;color:var(--prid);background:var(--brand-soft);border:1px solid var(--pri-line);border-radius:6px;padding:0 6px;white-space:nowrap}
.lst{width:22px;text-align:center;flex:none}
.lname{flex:1;min-width:0;font-weight:600}
.lmeta{font-size:var(--fs-aux);color:var(--mut);white-space:nowrap}

/* ---------- 课程页 ---------- */
/* 页头（阶段4 计划 4.4）：面包屑不变；.lheadmeta 保留（等宽课号 + 课位 + 选学徽标）；
   h1 700/1.35（手机端覆盖见末尾移动端块）。 */
.lhead{margin-bottom:18px}
.crumb{font-size:var(--fs-aux);color:var(--mut);margin-bottom:4px}
.lhead h1{font-size:var(--fs-h1);font-weight:700;line-height:1.35;margin-top:2px}
.lheadmeta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px}
/* 课号徽标去胶囊底/描边（阶段4）：等宽课号纯文字，课号本身即锚点（计划 4.4） */
.lno{font-family:var(--mono);font-size:12px;font-weight:600;color:var(--prid);letter-spacing:.5px}
.lch{font-size:var(--fs-aux);color:var(--mut);white-space:nowrap}
/* 学习目标（阶段4 计划 4.4）：不再用完整浅绿框——左侧细线 + 编号列表直接落纸面 */
.goalbox{margin-top:14px;border-left:2px solid var(--pri-line);padding:2px 0 2px 14px}
.goalhead{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-aux);font-weight:600;color:var(--prid);margin-bottom:4px}
.goalhead svg{flex:none}
ol.goals{margin:0;padding-left:22px;display:grid;gap:4px}
.goals li{font-size:14px;color:var(--ink);line-height:1.65}
.goals li::marker{color:var(--pri);font-weight:600}
/* 完成条去绿底框（阶段4 计划 4.4）：图标 + 文字 + 「下一课」链接一行轻量呈现 */
.donebar{color:var(--prid);font-weight:600;font-size:14.5px;margin-bottom:16px}
.donebar a{font-weight:600}
/* 课页轻量进度（v4 执行书 6.6.2）：页头下一行文字 + 细进度条（progressbar 语义在 DOM）；
   与分页条 pgbar（页脚）呼应，长课随时知道第几张、还剩几张 */
.lprog{margin:2px 0 14px}
.lprogtext{display:flex;justify-content:space-between;align-items:baseline;gap:10px;font-size:13.5px;margin-bottom:5px}
.lprogtext b{color:var(--prid);font-weight:600;font-variant-numeric:tabular-nums}
.lprogtext span{color:var(--mut);font-variant-numeric:tabular-nums;white-space:nowrap}
.lprogbar{height:5px;background:var(--line);border-radius:99px;overflow:hidden}
.lprogfill{height:100%;background:var(--pri);border-radius:99px}

/* ---------- 卡片与课程正文（阶段4 计划 4.4）---------- */
/* .card 基础类仍服务工具页/账号页/管理台等「需要独立表面」的分组内容
   （计划 §5.2 复用契约），本阶段不动；课程正文卡在 cardHtml() 改挂 .lessoncard：
   无边框/无底/无圆角，正文直接落在纸面上，条目类型由小型文字标签承担。 */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);padding:22px;margin-bottom:14px}
.card p{margin:6px 0}
.card h2{font-size:var(--fs-h2);margin:2px 0 12px}
.card .body{white-space:pre-wrap;font-size:var(--fs-body)}
.lessoncard{margin:0 0 20px}
.lessoncard p{margin:6px 0}
.lessoncard h2{font-size:var(--fs-h2);margin:0 0 12px}
.lessoncard .body{white-space:pre-wrap;font-size:var(--fs-body)}
/* 本课自查（app.js bodyHtml：复盘卡 body 的 □ 行转真 checkbox）：block 行式清单，
   勾选框随 --pri 着色；不搞胶囊底/描边（与「去胶囊」设计语言一致）。
   打印按当前勾选态如实呈现，不做强制展开或清空。 */
.selfcheck{display:flex;align-items:flex-start;gap:8px;padding:5px 0;font-size:var(--fs-body);line-height:1.7}
.selfcheck input{width:16px;height:16px;margin:5px 0 0;accent-color:var(--pri);flex:none;cursor:pointer}
.selfcheck span{flex:1;min-width:0}
.selfcheck input:checked + span{color:var(--mut)}
/* 类型标签（阶段4 计划 4.4）：小型文字标签——胶囊底、描边、圆点、粗左条全部移除，
   四类颜色语义只保留在文字色上（蓝=任务 紫=原理 橙=动手 琥珀=复盘），tag-o 中性灰。 */
.tag{display:inline-block;font-size:12px;font-weight:600;line-height:1.6;letter-spacing:.8px;margin-bottom:6px}
.t-任务{color:var(--info)}
.t-原理{color:var(--violet)}
.t-动手{color:var(--orange)}
.t-复盘{color:var(--warning)}
.tag-o{color:var(--mut)}
/* 提示（阶段4 计划 4.4 + §3.1）：去浅蓝底框，柠檬色细左线承载「少量提示」语义，
   不再承载大面积 tinted box */
.tip{margin-top:14px;font-size:13.5px;color:var(--ink);border-left:2px solid var(--lemon);padding:2px 0 2px 12px}
.copyrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:14px}
.center{text-align:center}

/* ---------- 代码块（阶段4 计划 5.3）---------- */
/* 标题栏 flex 化：左标签 + 右「复制代码」按钮（codeBox 渲染）；输出区标题 outhead
   用青绿字与示例代码标题区分层次。深色风格、pre 滚动行为不变。 */
.codebox,.outputbox{margin-top:16px;border-radius:var(--r-md);overflow:hidden;border:1px solid #1e293b}
.codehead{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;font-weight:600;letter-spacing:.4px;color:var(--code-head-fg);background:var(--code-head-bg);padding:6px 12px}
/* 输出区标题内嵌 play 图标（阶段5：▶ 符号换统一 SVG）与文字的间距；
   outhead 无右侧按钮，改为左对齐排版（覆盖 codehead 的 space-between） */
.codehead>svg{flex:none}
.outhead{color:#6ee7b7;justify-content:flex-start;gap:8px}
.codecopy{font-family:inherit;font-size:12px;line-height:1.6;color:#cbd5e1;background:transparent;border:1px solid #334155;border-radius:6px;padding:2px 10px;cursor:pointer;flex:none}
.codecopy:hover{color:#fff;border-color:#64748b}
@media print{
  /* 复制按钮是交互节点，不进打印 */
  .codecopy{display:none}
}
pre{padding:14px;overflow-x:auto;font-size:var(--fs-code);line-height:1.6;font-family:var(--mono);white-space:pre}
.code{background:var(--code-bg);color:var(--code-fg)}
.out{background:var(--out-bg);color:var(--out-fg)}
.c-kw{color:#f472b6}.c-str{color:#fcd34d}.c-com{color:#94a3b8;font-style:italic}.c-num{color:#7dd3fc}.c-bi{color:#93c5fd}
/* .c-com 由 #64748b 提亮至 #94a3b8（§1.3）：对代码深底 #0f172a 的对比度
   从约 3.7:1 提升到约 6.9:1，满足普通文字 ≥4.5:1。 */

/* ---------- 课后练习（阶段4 计划 4.5）---------- */
/* 练习区从正文切出：顶部细分隔线 + 类型标题（计划 4.4「类型标题和细分隔线区分条目」） */
.qsec{margin:26px 0 12px;padding-top:18px;border-top:1px solid var(--line)}
.qsec h2{font-size:var(--fs-h2);margin-bottom:4px}
.qhint{font-size:var(--fs-aux);color:var(--mut)}
/* 题卡保留边界（分组需要）与默认无阴影；题号与题干优先（计划 4.5） */
.qcard{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:18px 20px;margin-bottom:14px}
.qcard.flash{border-color:var(--pri);box-shadow:0 0 0 3px var(--brand-soft)}
/* 题头分层：题号（加粗墨色）→ 题型（纯文字标签）→ 重做中（琥珀文字）→ 完成口径（辅助灰字），
   文字即状态，不只靠颜色；徽标底/描边随阶段4 一并移除。 */
.qtag{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:var(--fs-aux);margin-bottom:12px}
.qnum{font-weight:700;color:var(--ink)}
.qtype{font-weight:600;color:var(--prid)}
.qredo{font-weight:600;color:var(--warning)}
.qcrit{color:var(--mut)}
.qtext{white-space:pre-wrap;font-size:var(--fs-body);margin-bottom:14px}
.ansarea{margin-top:4px}
/* 选项：触控高度 ≥44px；flex 布局让右侧 ✓ 徽标贴边——选中态 = 边框 + ✓
   （计划 4.5「保留勾选与边框」），浅底与内嵌左条随阶段4 移除。 */
.opts{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.opt{display:flex;align-items:center;gap:10px;text-align:left;padding:8px 14px;min-height:44px;border-radius:var(--r-ctl);border:1.5px solid var(--line);background:var(--card);font-size:14.5px;cursor:pointer}
.opt:hover{border-color:var(--pri)}
.opt.on{border-color:var(--pri)}
.opt.on::after{content:"✓";margin-left:auto;font-weight:700;color:var(--prid);flex:none}
/* 判分后只读选项复盘（v4 执行书 6.7.2 / 审计 P1-5）：保留原选项，
   正确项/所选项用文字徽标 + 边框/浅底表达（不只靠颜色），不再绑定作答动作 */
.opts-ro .opt{cursor:default;flex-wrap:wrap}
.opts-ro .opt:hover{border-color:var(--line)}
.opt-right{border-color:var(--pri);background:var(--brand-pale)}
.opt-wrong{border-color:var(--danger);background:var(--danger-soft)}
.optkey{font-family:var(--mono);font-weight:600;font-size:13px;color:var(--mut);width:18px;flex:none;text-align:center}
.opttext{flex:1;min-width:0;word-break:break-word}
.optmark{flex:none;font-size:12.5px;font-weight:600;white-space:nowrap;margin-left:auto}
.opt-right .optmark.ok,.optmark.ok{color:var(--prid)}
.optmark.no{color:var(--danger)}
/* 输入/编辑器 focus 明显：边框变主色 + 柔和光环；outline 行为不移除（键盘焦点
   由全局 :focus-visible 规则补绿色描边，见文件末尾阶段1块）。 */
.ansin{width:100%;padding:10px 12px;border-radius:var(--r-ctl);border:1.5px solid var(--line);font-size:14.5px;font-family:inherit;margin-bottom:10px;resize:vertical;min-height:44px}
.ansin:focus,.qc-ta:focus,.runsrcta:focus{border-color:var(--pri);box-shadow:0 0 0 3px rgba(47,125,78,.16)}
.ansin.mono{font-family:var(--mono)}
/* 提交/重做/运行类按钮触控高度：题卡与运行区内的 .btn 一律 ≥44px（计划 4.5 + 六.2） */
.ansarea .btn,.qrow .btn,.runrow .btn{min-height:44px}
.yourans{font-size:13.5px;color:var(--mut);margin-top:8px}
/* 判分结论块（阶段4 计划 4.5）：对勾/叉圈图标 + 文字着色表达对错——大面积浅绿/浅红底、
   描边与内嵌左条全部移除，状态不只靠颜色（图标形状 + 文字仍在）。 */
.verdict{margin-top:14px;font-weight:600;font-size:15px;display:flex;align-items:center;gap:8px}
.verdict svg{flex:none}
.v-ok{color:var(--prid)}
.v-no{color:var(--danger)}
/* 正确答案与解析分层排版（阶段4 计划 4.5）：正确答案 = 无框正文文本块（粗体前缀），
   解析 = 顶部细分隔线 + 辅助灰字——不再都是带左边线的提示框。 */
.ansline{font-size:14px;margin-top:12px;word-break:break-word}
.ansline pre{margin-top:6px}
.explain{margin-top:14px;font-size:13.5px;color:var(--mut);border-top:1px solid var(--line);padding-top:10px}
.explain b{color:var(--ink)}
.qrow{margin-top:14px;display:flex;align-items:center;gap:12px}
.hint{font-size:var(--fs-aux);color:var(--mut);margin-top:8px}
.hint.inline{margin-top:0}
.bblank{display:inline-block;width:9ch;padding:2px 8px;margin:0 3px;border:none;border-bottom:2px solid var(--pri);background:var(--brand-pale);border-radius:8px 8px 0 0;font-family:var(--mono);font-size:14px;text-align:center;outline:none;vertical-align:baseline}
.bblank:focus{background:var(--brand-soft)}
.bblank.bok{border-bottom-color:var(--prid);background:var(--brand-soft)}
.bblank.berr{border-bottom-color:var(--danger);background:var(--danger-soft)}

/* ---------- 速查手册 ---------- */
.cheatgrp{margin-bottom:22px}
.cheatgrp h2{font-size:17px;margin:0 2px 10px;color:var(--prid)}
.cheatrow{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;margin-bottom:10px}
.csyn{display:inline-block;font-family:var(--mono);font-size:13.5px;background:var(--code-bg);color:var(--out-fg);border-radius:var(--r-sm);padding:3px 10px}
.cdesc{font-size:13.5px;color:var(--mut);margin:8px 0 8px}
.cex{background:var(--code-bg);color:var(--code-fg);border:none;border-radius:8px;padding:8px 10px;font-size:var(--fs-aux)}

/* ---------- 经营等级（阶段5 计划 4.6：账页头部 + 成长阶梯减饰）---------- */
/* 当前等级从「居中大卡 + 青柠徽标 + 光环」改为账页头部行：等级名 + 等宽章节计数
   一行 + 细进度条，与首页学习账页同一语言；品牌印记不再在等级页重复（§3.4：
   印记只在登录品牌区、课程首页和报告等关键位置出现）。 */
.rankhead{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin:20px 0 10px}
.ranklabel{font-size:var(--fs-aux);color:var(--mut)}
.rankval{font-size:26px;font-weight:700;color:var(--prid);line-height:1.2}
.rankprog{display:flex;align-items:center;gap:12px;max-width:340px}
.rankprog .chbar{flex:1;border-radius:99px}
.rankprogtext{font-size:var(--fs-aux);color:var(--mut);white-space:nowrap;font-variant-numeric:tabular-nums}
/* 「下一级条件」从黄底描边框降为柠檬左细线文字行（§3.1 柠檬黄少量提示语义，
   不再承载 tinted box）；下一级名加粗墨色，箭头图标随文字色。 */
.nextcond{display:flex;align-items:flex-start;gap:8px;font-size:13.5px;color:var(--warning);border-left:2px solid var(--lemon);padding:2px 0 2px 12px;margin-top:14px;line-height:1.6}
.nextcond svg{flex:none;margin-top:3px}
.nextcond b{color:var(--ink)}
/* 成长阶梯 = 垂直时间线（保留）：等级圆点之间用 .lstep::before 竖线相连；
   已达成（.done.lit）绿圈对勾、当前（.cur）实心绿点 + 单发「当前」徽标、
   未达成灰点——「已达成」徽标（每级一枚的重复）与当前级 3px 光环已删，
   达成态由对勾图形 + 名称色共同表达，不只靠颜色。
   注意：.lno 曾有全局同名课程编号徽标（.lheadmeta .lno），等级页圆点选择器
   限定 .lstep .lno，互不影响。 */
.ladder{margin:26px 0 16px;display:flex;flex-direction:column}
.lstep{position:relative;display:flex;align-items:flex-start;gap:12px;padding:0 0 20px}
.lstep:last-child{padding-bottom:0}
.lstep::before{content:"";position:absolute;left:14px;top:34px;bottom:4px;width:2px;border-radius:2px;background:var(--line)}
.lstep:last-child::before{display:none}
.lstep.lit::before{background:var(--pri-line)}
.lstep .lno{width:30px;height:30px;border-radius:99px;background:var(--line);color:var(--mut);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:13px;flex:none;position:relative;z-index:1;border:1px solid transparent;font-variant-numeric:tabular-nums;font-family:inherit;padding:0;white-space:normal}
.lstep.lit .lno{background:var(--brand-soft);color:var(--prid);border-color:var(--pri-line)}
.lstep.cur .lno{background:var(--pri);color:#fff;border-color:var(--pri)}
.lmain{flex:1;min-width:0;padding-top:3px}
.ltop{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.lname2{font-weight:700;line-height:1.5}
.lstep.cur .lname2{color:var(--prid)}
.lcond{font-size:var(--fs-aux);color:var(--mut);margin-top:2px;line-height:1.6}
/* 「当前」徽标单发保留：文字形态的状态表达，不只靠绿点颜色 */
.lbadge{font-size:12px;font-weight:600;border-radius:6px;padding:0 8px;line-height:1.7;white-space:nowrap}
.lbcur{color:#fff;background:var(--pri);border:1px solid var(--pri)}

/* ---------- 结课能力报告 ---------- */
.report{text-align:left}
/* 完成祝贺块（阶段5 计划 4.6）：奖章图标 + 祝贺语 + 原进度说明——浅绿底框降为
   无底图标行（§1.2「祝贺」语义不再占 tinted box）；打印时随报告如实呈现 */
.repgrats{display:flex;gap:12px;align-items:flex-start;margin-bottom:16px}
.repgraticon{flex:none;color:var(--pri);margin-top:3px}
.repgrattext{min-width:0}
.repgrattext b{display:block;font-size:19px;color:var(--prid);margin-bottom:2px}
.repgrattext .muted{margin:0}
/* 结课寄语（阶段5 计划 4.6）：从浅绿底 .msg 框改为顶部细线引文块，
   报告页证书操作区之外不再叠 tinted box；.msg 全局样式不动（管理台弹层复用契约）。 */
.reportquote{margin-top:16px;font-size:14px;line-height:1.9;border-top:1px solid var(--line);padding-top:12px}
.reportquote b{color:var(--ink)}
.statrow{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin:16px 0}
.stat{background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:10px 18px;text-align:center;min-width:120px}
.stat b{display:block;font-size:20px;color:var(--prid);font-variant-numeric:tabular-nums}
.stat span{font-size:var(--fs-aux);color:var(--mut)}
.radar{display:block;margin:8px auto 0;max-width:460px;width:100%}
.rring{fill:none;stroke:var(--line);stroke-width:1}
.rspoke{stroke:var(--line);stroke-width:1}
.rarea{fill:rgba(47,125,78,.2);stroke:var(--pri);stroke-width:2;stroke-linejoin:round}
.rlabel{font-size:12px;fill:var(--ink)}
.dimlist{max-width:440px;margin:12px auto 0}
.dimrow{display:flex;align-items:center;gap:10px;margin-bottom:8px;font-size:var(--fs-aux)}
.dimname{width:84px;flex:none}
.dimbar{flex:1;height:8px;background:var(--line);border-radius:99px;overflow:hidden;display:block}
.dimfill{height:100%;background:var(--pri);display:block}
.dimval{width:46px;text-align:right;color:var(--mut);font-variant-numeric:tabular-nums}
.msg{margin-top:16px;background:var(--brand-pale);border:1px solid var(--pri-line);border-radius:var(--r-md);padding:14px 16px;font-size:14px}
/* 报告统计移动端稳定换列（v4 执行书 6.14.3）：2 列网格，作用域限定 .report，
   不影响管理台 .statrow（auth.css） */
@media (max-width:959px){
  .report .statrow{display:grid;grid-template-columns:1fr 1fr;justify-content:stretch}
  .report .stat{min-width:0}
}
/* 报告页底部动作（v4 执行书 6.14.4）：下载证书是证书区唯一主按钮，
   打印/错题本/首页为次级文字动作（同 .lfoot 语言） */
.reportlinks{display:flex;gap:6px 14px;flex-wrap:wrap;margin-top:10px}
.reportlinks .btn{border-color:transparent;background:transparent;color:var(--prid);font-weight:600;min-height:44px}
.reportlinks .btn:hover{background:var(--brand-pale)}
/* 等级页危险操作区（v4 执行书 6.13.3）：清空进度独立谨慎区，
   低视觉权重、44px 触控、危险语义；二次确认走 askConfirm danger */
.dangerzone{margin:26px 0 10px;padding:12px 14px;border-top:1px dashed var(--line);display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;justify-content:space-between}
.dangerzone p{margin:0;font-size:var(--fs-aux);color:var(--mut);flex:1;min-width:0}
.dangerzone .btn{min-height:44px}

/* ---------- 其他 ---------- */
.muted{color:var(--mut);font-size:14px}
/* 轻量文字空态（阶段5 计划 4.6）：工具页空态不再「大图标 + 白卡 + 主按钮」三件套，
   无边框/无底/无图标，一行说明 + 文字链接主动作；错题本/急救包/提问三页共用。
   卡片形态仍保留给需要分组的内容（.card 契约不动）。 */
.emptypage{margin:26px 0 10px;padding:4px 0;color:var(--mut);font-size:14px;line-height:1.9}
.emptypage p{margin:4px 0}
.emptypage a{font-weight:600}
.emptypage .btn{min-height:44px}
#toast{position:fixed;left:50%;bottom:calc(36px + env(safe-area-inset-bottom));transform:translateX(-50%) translateY(20px);background:var(--ink);color:#fff;padding:9px 18px;border-radius:99px;font-size:13.5px;opacity:0;pointer-events:none;transition:.25s;z-index:99;max-width:86vw}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
/* v3 计划 7：交付印记——完成类 toast 前置小型青柠对勾（覆盖图标自带的 ic-ok 主绿色） */
.toastmark{display:inline-flex;margin-right:7px;vertical-align:-3px}
.toastmark svg{display:block;color:var(--lime)}
/* 授权编号页脚：刻意不进打印隐藏清单，让打印的结课报告也带走授权标识 */
#license-footer{position:fixed;right:12px;bottom:calc(10px + env(safe-area-inset-bottom));font-size:12px;color:var(--mut);opacity:.55;pointer-events:none;user-select:none;z-index:5}
/* ICP 备案号（管局要求悬挂于首页底部并链接工信部备案系统）：按常规悬挂方式随文档流
   排在页面末尾居中静止（不做固定角标——固定定位会随滚动悬浮，观感即「动来动去」）；
   <960px 时页面底部有快捷导航栏，见下方媒体查询的留底间距 */
#icp-footer{text-align:center;padding:18px 16px calc(22px + env(safe-area-inset-bottom));font-size:12px;color:var(--mut)}
#icp-footer a{color:inherit;text-decoration:none}
#icp-footer a:hover,#icp-footer a:focus-visible{text-decoration:underline}

/* ---------- 自制确认弹层（askConfirm） ---------- */
.askmask{position:fixed;inset:0;z-index:100;background:rgba(34,37,31,.45);display:flex;align-items:center;justify-content:center;padding:20px}
.askcard{position:relative;background:var(--card);border-radius:14px;box-shadow:var(--shadow-modal);padding:20px;max-width:340px;width:100%}
.askmsg{font-size:14.5px;line-height:1.6;color:var(--ink)}
.askrow{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
/* 提问弹层右上角关闭按钮（v4 执行书 6.16.1：明确的取消/关闭按钮）：
   小尺寸但 ≥44px 命中区（视觉 24px + 透明扩展），不占标题行布局 */
.qa-close{position:absolute;top:10px;right:10px;width:32px;height:32px;line-height:1;font-size:18px;color:var(--mut);background:transparent;border:none;cursor:pointer;padding:0}
.qa-close:hover{color:var(--ink)}
.qa-close::before{content:"";position:absolute;inset:-6px}

/* ---------- 移动端（阶段2：导航与首屏） ---------- */
/* 顶栏单行 60px：burger 与「学习工具」按钮保持 44px 触控目标，整组不换行；
   高频直达链接与账号区隐藏——同名入口全部在「学习工具」菜单里，可达性不减。
   课程目录抽屉 body.drawer-open（左，替换原 nav-open）、工具菜单 body.tools-open，
   两个状态类独立互不复用；遮罩在面板之下（35 < 36），点遮罩/Escape/路由变化关闭。 */
@media (max-width:959px){
  :root{--top-h:60px}
  .burger{display:inline-flex}
  .top{gap:8px;padding:8px 12px}
  .brand{flex:1}
  .tnav .tdirect{display:none}
  .userbox{display:none}
  .toolsbtn{font-size:var(--fs-aux);padding:8px 10px;min-height:44px}
  /* 首页编辑式 Hero 单栏化（阶段3）：学习账页卡随 DOM 顺序移到课程信息之后。
     2026-11-02 审计 P0-2（v4 执行书 6.5.1）：撤销 v3 的 order:-1 置顶——单栏顺序
     回到「课程名/定位 → 简介 → 统计 → 学习账页任务台」，先建立「我在哪门课」，
     再给当前委托与行动；桌面 ≥960px 双栏构图不受影响。 */
  .hero{grid-template-columns:1fr;gap:22px}
  .side{display:none;position:fixed;top:calc(var(--top-h) + env(safe-area-inset-top));left:0;right:0;bottom:0;z-index:36;width:auto;flex:none;max-height:none;overflow:auto;background:#fff;border-right:none;padding:14px 16px 60px}
  body.drawer-open .side{display:block}
  .toolsmenu{left:0;right:0;min-width:0;border-radius:0 0 var(--r-md) var(--r-md);border-left:none;border-right:none;border-top:none}
  /* 底部快捷导航落地间距（v4 执行书 6.4.3）：主内容、toast、授权编号页脚同步留底距，
     互不遮挡；safe-area 缺省环境 calc 退化为普通值 */
  .content{padding:0 14px;margin-top:16px;padding-bottom:calc(88px + env(safe-area-inset-bottom))}
  #toast{bottom:calc(88px + env(safe-area-inset-bottom))}
  #license-footer{bottom:calc(66px + env(safe-area-inset-bottom))}
  #icp-footer{padding-bottom:calc(96px + env(safe-area-inset-bottom))}
}

/* ---------- 移动端底部快捷导航（v4 执行书 6.4.1~6.4.3） ----------
   既有链接的快捷呈现：学习 #/ · 手册 #/cheatsheet · 错题 #/notebook · 我的 #/account；
   仅 <960px 显示；当前项 = 文字 + 顶部指示条 + aria-current（不只靠颜色）；
   z 序：tabbar(32) < 遮罩(35) < 抽屉/菜单(36) < toast(99)，弹层打开时被遮罩盖住 */
.tabbar{display:none}
@media (max-width:959px){
  .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:32;background:var(--card);border-top:1px solid var(--line);padding:4px 8px calc(4px + env(safe-area-inset-bottom));justify-content:space-around}
  .tab{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;flex:1;min-height:48px;font-size:12px;color:var(--mut);position:relative;text-decoration:none}
  .tab span{line-height:1.2}
  .tab:hover{color:var(--prid)}
  .tab.on{color:var(--prid);font-weight:600}
  .tab.on::before{content:"";position:absolute;top:-5px;left:50%;transform:translateX(-50%);width:28px;height:3px;border-radius:3px;background:var(--pri)}
}
@media print{
  /* 底部快捷导航是交互部件，不进打印 */
  .tabbar{display:none!important}
}

/* ---------- 打印（结课报告保存用） ---------- */
@media print{
  .top,.side,.btn,#toast,.burger,.lessonnav{display:none!important}
  .navscrim,.toolsmenu{display:none!important}
  .layout{display:block}
  .content{max-width:none;margin:0;padding:0}
  .card,.qcard{box-shadow:none;break-inside:avoid}
  .lrow{break-inside:avoid}
  /* 阶段5 计划 4.6 打印核对：报告页只隐藏交互控件（证书姓名输入框——其值只用于
     导出 PNG，姓名本身不是报告内容），正文/统计/雷达/寄语全量保留，不丢内容；
     tinted box 打印去底（浅绿底在黑白打印时是灰块），文字与细线保留。 */
  .msg{background:transparent;border-color:var(--line)}
  #cert-name{display:none}
}

/* ---------- 选课卡片页（阶段3：视觉头部 + 响应式网格 + 账号页分组） ---------- */
/* 登录后的「我的课程」页（auth-app.js renderPickerPage）：沿用 auth-gate 居中壳，
   卡片观感对齐 .chcard（圆角 16px、卡间距 18px），进度条直接复用 .chbar/.chfill。 */
.selwrap{max-width:560px;margin:0 auto;padding-top:52px}
.selwrap h1{font-size:24px;margin-bottom:6px}
.selwrap .sub{font-size:13.5px;color:var(--mut)}
/* 课程网格放宽（少量课程时最大约 920px）：auto-fill 网格让卡片保持合理宽度、
   不会被单卡拉到全宽；手机端（<959px）单列。账号页的 .selgrid 不带 .selcourses，
   保持原单列窄版布局。 */
.selgrid{max-width:560px;margin:0 auto;padding-top:18px}
.selgrid.selcourses{max-width:920px;display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:18px}
.selgrid.selcourses .selcard{margin-bottom:0;display:flex;flex-direction:column}
.selgrid.selcourses .selcta{margin-top:auto;padding-top:14px}
.selwrap-wide{max-width:920px}
.selcard{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);padding:20px;margin-bottom:18px;overflow:hidden;cursor:pointer;transition:border-color .15s}
.selcard:hover{border-color:var(--pri)}
.selcard:focus-visible{outline:2px solid var(--pri);outline-offset:2px}
/* 课程视觉头部：课程符号 + 章数徽标；辅助色按 data-slug 区分（Python 课沿用品牌绿、
   AI 课用蓝作辅助色），不改品牌主色；未映射 slug 回退中性灰头部（--bg/--mut，随全站暖纸面色）。 */
.selcover{display:flex;align-items:center;justify-content:space-between;gap:8px;border-radius:var(--r-md);padding:10px 14px;margin-bottom:14px;background:var(--bg);border:1px solid var(--line);color:var(--mut)}
.selsym{display:inline-flex;flex:none}
.selcard[data-slug="python-ecom"] .selcover{background:var(--brand-soft);border-color:var(--pri-line);color:var(--prid)}
.selcard[data-slug="ai-tools"] .selcover{background:var(--info-soft);border-color:var(--info-line);color:var(--info)}
.selcard[data-slug="ai-tools"] .selbadge{color:var(--info);background:var(--info-soft);border-color:var(--info-line)}
.selcard[data-slug="ai-tools"] .selprog .chfill{background:var(--info)}
.selbadge{font-size:12px;font-weight:600;color:var(--prid);background:var(--brand-pale);border:1px solid var(--pri-line);border-radius:6px;padding:2px 8px}
.selname{font-size:var(--fs-h2);margin-bottom:2px}
/* 层级：简介（selsub）→ 课数/题数（selmeta）→ 进度 → 主按钮；网格内收紧简介下边距 */
.selgrid.selcourses .selsub{margin-bottom:4px}
.selmeta{font-size:var(--fs-aux);color:var(--mut);margin-bottom:14px;font-variant-numeric:tabular-nums}
.selsub{font-size:13.5px;color:var(--mut);margin-bottom:14px}
.selprog{display:flex;align-items:center;gap:10px}
.selprog .chbar{flex:1;border-radius:99px}
.selcta{margin-top:14px}
.selempty{max-width:560px;margin:18px auto 0;background:var(--card);border:1px dashed var(--line);border-radius:var(--r-card);padding:40px 20px;text-align:center;color:var(--mut)}
.selempty p{margin-top:8px}
.selemptyhint{font-size:var(--fs-aux)}
/* 选课壳内的非点击卡片（账号页信息/表单卡）：去掉课程卡片的手型与悬停变色 */
.selcard.plain{cursor:default}
.selcard.plain:hover{border-color:var(--line)}
/* 账号页（阶段3）：分组标题由 .selname 承担；「退出登录」降视觉权重——
   虚线淡卡、ghost 小按钮、右对齐，不与「确认修改」主按钮同权重 */
.acctline{font-size:15px}
.selcard.acctfoot{background:transparent;border-style:dashed;box-shadow:none;display:flex;justify-content:flex-end}
@media (max-width:959px){
  /* 审计 P0-3（v4 执行书 6.3.1）：body.auth-gate .content 清零内边距后，
     .selwrap/.selgrid 在 ≤920px 视口无左右 gutter，H1 贴边、与卡片左缘错位；
     统一补 20px，标题/说明/卡片左缘对齐（桌面 ≥960px margin auto 不受影响） */
  .selwrap{padding-top:28px;padding-left:20px;padding-right:20px}
  .selgrid{padding-left:20px;padding-right:20px}
  .selcard{padding:16px}
  .selcta .btn{width:100%}
  .selgrid.selcourses{grid-template-columns:1fr}
}

/* ---------- 管理台布局（v4 执行书 6.17） ----------
   admin.html 同时加载 style.css 与 auth.css；body.admin-page 页面作用域下：
   管理台内容列放宽到 1160px（宽表格舒适），不改动学员端 .content 720px 阅读列；
   页签条 .adm-tabbar（自 tabbarHtml 内联样式提取）；表格滚动区 .tablewrap 为
   可键盘聚焦的命名 region（表格自身横滚、页面不横滚）；删除按钮 .dangerlink 红字。 */
body.admin-page .content{max-width:1160px}
.adm-tabbar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}
.tablewrap{overflow-x:auto}
.tablewrap:focus-visible{outline:2px solid var(--pri);outline-offset:2px}
.btn.dangerlink{color:var(--danger)}
.btn.dangerlink:hover{border-color:var(--danger)}
@media (max-width:959px){
  /* 管理台表单移动端纵向堆叠全宽（6.17.4）；.btn.sm 44px 由全局移动规则承担 */
  body.admin-page .setrow{flex-direction:column;align-items:stretch}
  body.admin-page .setrow .authfield{max-width:none}
  body.admin-page .setrow .btn{width:100%}
}

/* ---------- 管理台课程授权 ---------- */
/* admin.html 同时加载 style.css 与 auth.css：徽标复用 auth.css 的 .badge、弹层复用本文件的
   .askmask/.askcard/.askmsg、说明行复用 .hint，此处只补 adm- 前缀四处新增样式：
   .admcourses（建号勾选区）、.admchk（checkbox 行）、.admbadge（已授课程徽标容器）、.admdlg（授权弹层）。 */
.admcourses{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}
.admchk{display:inline-flex;align-items:center;gap:7px;font-size:13.5px;color:var(--ink);background:var(--card);border:1px solid var(--line);border-radius:var(--r-ctl);padding:6px 12px;cursor:pointer;user-select:none}
.admchk:hover{border-color:var(--pri)}
.admchk input{width:15px;height:15px;margin:0;accent-color:var(--pri);flex:none}
.admbadge{display:flex;flex-wrap:wrap;gap:4px;min-width:150px}
.admbadge .badge{background:var(--brand-soft);border:1px solid var(--pri-line);color:var(--prid)}
.admdlg{max-width:430px}
.admdlg .admcourses{margin-top:12px;max-height:320px;overflow-y:auto}
@media (max-width:959px){
  .admbadge{min-width:0}
  .admdlg{max-width:none}
}

/* ---------- 课程内容分页 ---------- */
/* app.js 课程页内容分页的翻页条（T16）：新类一律 pg- 前缀（.pgbar/.pgbtn/.pgpos），
   不与既有选择器重名、不与 sel-/adm- 前缀交叉、不新增 CSS 变量；
   按钮优先复用 .btn（.pgbtn 仅补 nowrap，移动端微调内边距，不缩成图标）。
   分页条去容器感——无底/无边框/无圆角，一条细分隔线承接正文与课尾；
   v3 计划 6.2：阅读中「下一张」是唯一前进主动作，恢复 .pri 实心品牌绿
   （app.js pgbarHtml 已挂回 pri，此处的旧主色文字规则随之移除避免压过白字）；
   「上一张 / 第 x/y 张」保持次要样式，触控高度 ≥44px；
   禁用态用虚线边框 + 灰字清晰呈现（覆盖 .btn:disabled 的 opacity:.4）。 */
.pgbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:26px 0 6px;padding-top:16px;border-top:1px solid var(--line)}
.pgbtn{white-space:nowrap;min-height:44px}
.pgbtn:disabled{opacity:1;color:var(--mut);background:transparent;border:1px dashed var(--line);cursor:not-allowed}
.pgpos{color:var(--mut);font-size:13.5px;font-variant-numeric:tabular-nums}
@media (max-width:959px){
  /* 按钮不缩成图标：「上一张 / 第x/y张 / 下一张」一行放得下（320px 视口不断行） */
  .pgbar{gap:8px}
  .pgbtn{padding:6px 12px;font-size:var(--fs-aux)}
  .pgpos{font-size:var(--fs-aux)}
}
@media print{
  .pgbar{display:none}
}

/* ---------- 课程页页脚 + 课尾导航（阶段4 计划 5.3 / 2026-10-27 批 / v3 计划 6.3）---------- */
/* .lfoot 仅 renderLesson 渲染：「返回课程目录」「卡住了？去提问」为次要动作行——
   v4 执行书 6.6.3：降为文字形态（去边框底色，主色文字），不再与主分页按钮同权；
   flex 换行兼容 320px 视口，触控高度保持 44px。其他页面的 .foot 不受影响。 */
.foot.lfoot{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:6px 14px}
.foot.lfoot .btn{border-color:transparent;background:transparent;color:var(--prid);font-weight:600;min-height:44px}
.foot.lfoot .btn:hover{background:var(--brand-pale)}
/* 课尾「下一节 / 下一章」导航（app.js lessonNavHtml，#lessonnav 由 settle→refreshChrome
   实时刷新）：阅读中（非末页）不渲染内容；末页完成=主色大按钮（复用 .btn.pri.big）；
   末页未完成=轻量解锁说明（锁图标 + 下一节标题 + 条件，纯文字行不再做成
   虚线按钮壳、不用 cursor:not-allowed 伪装控件）；试学最后一课完成=注册引导。 */
.lessonnav{margin-top:26px;text-align:center}
.lnlock{display:flex;flex-direction:column;align-items:center;gap:4px}
.lnlock-title{display:inline-flex;align-items:center;gap:6px;font-size:14px;color:var(--mut);line-height:1.6}
.lnlock-title svg{flex:none}
.lnlock-hint{font-size:12.5px;color:var(--mut)}
.lnlock-hint a{font-weight:600}

/* ---------- 选学课标记（app.js lesson.optional） ---------- */
/* 章地图 .lrow 与侧栏 .sles 通用标记：纯文字（琥珀色，与「复盘」类型同语义族），
   去胶囊底/描边（2026-10-29 修复 #15：与「去胶囊」方向一致）。
   现有课程无 optional 字段时不渲染该节点，样式零生效。 */
.lopt{flex:none;align-self:center;font-size:12px;font-weight:600;line-height:1.5;color:var(--warning);white-space:nowrap}

/* ---------- 卡点急救包（app.js lesson.faq：课页底部小节 + #/aidkit 汇总页） ---------- */
/* 新类一律 aid- 前缀（.aidkit/.aidbar/.aidgrp/.aident/.aidfix/.aidline/.aidsrc/.aidnote），
   不与既有选择器重名；卡片观感对齐 .qcard/.cheatrow（var(--card) 底、--line 边、10–14px 圆角）。
   无 faq 数据的课不渲染任何 aid- 节点，样式零生效（对侧课程降级红线）。 */
.aidkit{background:var(--card);border:1px solid var(--line);border-radius:14px;margin:22px 0 6px}
.aidkit>summary{cursor:pointer;font-weight:600;font-size:15px;color:var(--prid);padding:12px 18px;min-height:44px;box-sizing:border-box;display:flex;align-items:center}
.aidnote{font-size:var(--fs-aux);color:var(--mut);margin:0 18px 10px}
.aidgrp{margin-bottom:22px}
.aidgrp h2{font-size:17px;margin:0 2px 10px;color:var(--prid)}
/* 条目 = 章内连续列表（v4 执行书 6.10.2）：每条不再各自包白卡，
   组内条目以细分隔线相隔，展开态浅底标示，减少长页条纹感 */
.aident{background:transparent;border:none;border-radius:0;margin:0}
.aident + .aident{border-top:1px solid var(--line)}
.aident[open]{background:var(--brand-pale);border-radius:var(--r-sm)}
.aident>summary{cursor:pointer;font-weight:600;font-size:14.5px;padding:10px 6px;line-height:1.55;min-height:44px;box-sizing:border-box;display:flex;align-items:center;word-break:break-word;border-radius:var(--r-sm)}
/* 展开指示（审计修正）：summary 改 flex 后浏览器不再渲染原生 disclosure 三角
   （display 非 list-item 时无 marker），补 CSS 箭头——收起朝下、展开转朝上，
   随 currentColor 着色；展开态另有浅底标示（6.10.2），可展开性不只靠颜色 */
.aidkit>summary::after,.aident>summary::after{content:"";flex:none;width:7px;height:7px;margin-left:auto;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(45deg);transition:transform .15s}
.aidkit[open]>summary::after,.aident[open]>summary::after{transform:rotate(225deg)}
.aidfix{padding:0 6px 12px;font-size:14px}
.aidline{margin-top:6px}
.aidsrc{margin-top:8px;font-size:var(--fs-aux);color:var(--mut)}
.aidbar{padding:16px 18px}
.aidbar .ansin{margin-bottom:6px}
/* 报错框下方自动匹配的急救条目（改进计划 2026-10-26 第 1 项，app.js errFaqHtml 渲染）：
   沿用 aid- 前缀约定，成因/修法/来源行复用 .aidline/.aidsrc；
   无命中时节点不渲染，样式零生效。 */
.aidhitwrap{margin-top:8px;border-top:1px dashed var(--line);padding-top:8px;font-size:14px}
.aidhithead{font-size:var(--fs-aux);color:var(--mut)}
.aidhit{margin-top:8px}
.aidhit+.aidhit{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.aidsym{font-weight:600;line-height:1.55;word-break:break-all}
@media print{
  /* 课页急救包默认收起（details 无 open），打印按当前展开态如实呈现，不强制展开 */
  .aidbar{box-shadow:none}
}

/* ---------- 在线运行沙箱（计划 1.1，app.js 仅 python-ecom 渲染） ---------- */
/* 新类一律 run- 前缀（.runlaunch/.runwrap/.runsrcta/.runrow/.runout/.runimgs/.runimg/
   .runerrbox/.runerr/.runaidrow），不与既有选择器重名；观感对齐 .codebox/.out/.ansin。
   ai-tools 等 SANDBOX_ON=false 的课程不渲染任何 run- 节点，样式零生效。 */
.runlaunch{margin-top:12px}
.runwrap{margin-top:12px;border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;background:var(--bg)}
.runsrcta{min-height:140px;font-size:var(--fs-code);line-height:1.6}
.runrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:2px}
.runout{margin:12px 0 0;border-radius:var(--r-ctl);padding:10px 12px;font-size:13.5px;white-space:pre-wrap;word-break:break-all;max-height:320px;overflow-y:auto}
.runimgs{margin-top:12px}
.runimg{display:block;max-width:100%;height:auto;border:1px solid var(--line);border-radius:var(--r-ctl);background:#fff;margin:0 auto 12px}
.runerrbox{margin-top:4px}
.runerr{color:var(--code-err-fg)}
.runaidrow{margin-top:6px;font-size:13.5px}
.runaidrow a{color:var(--prid);font-weight:600}
/* 生成文件下载条（沙箱虚拟盘 → Blob 下载；app.js renderFileDownloads 渲染） */
.runfiles{margin-top:12px;border:1px dashed var(--line);border-radius:var(--r-ctl);padding:10px 12px;background:var(--bg)}
.runfileshead{font-size:var(--fs-aux);color:var(--mut);margin-bottom:6px}
.runfile{display:inline-block;margin:2px 14px 2px 0;font-size:13.5px;font-weight:600;color:var(--prid);text-decoration:underline;word-break:break-all}
.runfile-off{color:var(--mut);font-weight:400;text-decoration:none;cursor:default}
@media print{
  /* 下载条是页面内交互节点，不进打印 */
  .runfiles{display:none}
}
@media (max-width:959px){
  .runwrap{padding:10px 12px}
  .runsrcta{min-height:120px}
}
@media print{
  /* 打印按当前页呈现课程内容，交互式运行区不进打印 */
  .runlaunch,.runwrap{display:none}
}

/* ---------- 编程题（计划 2.1，app.js type=编程题：题内编辑器 + worker 判分） ---------- */
/* 新类一律 qc- 前缀（.qc-ta 编辑器 / .qc-pre 题内代码与输出块 / .qc-wrap 输出可换行），
   不与既有选择器重名；按钮与状态行复用 .runrow/.runimgs/.runerrbox/.runerr/.runaidrow。
   无编程题数据的课程（ai-tools 等）不渲染任何 qc- 节点，样式零生效。 */
.qc-ta{min-height:180px;font-size:var(--fs-code);line-height:1.6}
.qc-pre{margin:6px 0 0;border-radius:var(--r-ctl);padding:10px 12px;max-height:320px;overflow:auto}
.qc-wrap{white-space:pre-wrap;word-break:break-all}
@media (max-width:959px){
  .qc-ta{min-height:150px}
}
@media print{
  /* 编程题判分用的参考实现/期望输出随题卡如实进打印；交互运行输出区不进 */
  [id^="qout-"],[id^="qimgs-"]{display:none}
}

/* ---------- 提问板（计划 3.1 学员端：课页提问弹层 + #/questions 我的提问） ---------- */
/* 新类一律 qa- 前缀（.qa-card/.qa-title/.qa-lesson/.qa-lname/.qa-aid/.qa-label/.qa-err/
   .qa-item/.qa-meta/.qa-st/.qa-time/.qa-desc/.qa-code/.qa-reply/.qa-rtime），不与既有
   选择器重名（admin.html 同时加载本文件，已核对 admin-app.js/auth.css 无 qa- 类）；
   弹层复用 .askmask/.askcard/.askrow，输入复用 .ansin，代码块复用 pre.code/.qc-pre。
   未登录/离线版不渲染课页提问按钮与弹层，qa- 节点仅出现在 #/questions 页与弹层内。 */
.askcard.qa-card{max-width:480px}
.qa-title{font-size:17px;font-weight:700;color:var(--prid);margin-bottom:8px}
.qa-lesson{font-size:13.5px;color:var(--mut);margin-bottom:8px}
.qa-lesson b{color:var(--ink)}
.qa-lname{font-size:var(--fs-aux)}
.qa-aid{font-size:var(--fs-aux);background:var(--brand-pale);border:1px solid var(--pri-line);border-radius:var(--r-ctl);padding:8px 12px;margin:0 0 6px}
.qa-aid a{color:var(--prid);font-weight:600}
.qa-label{display:block;font-size:var(--fs-aux);font-weight:600;margin:10px 0 6px}
.qa-err{min-height:20px;font-size:var(--fs-aux);color:var(--danger);margin-top:8px}
.qa-item .qa-meta{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.qa-meta a{font-weight:600}
/* 提问状态：纯文字即状态（修复 #15：琥珀/绿两枚胶囊底全部去掉，与 chstat 同语言） */
.qa-st{flex:none;font-size:12px;font-weight:600}
.qa-st.wait{color:var(--warning)}
.qa-st.done{color:var(--prid)}
.qa-time{margin-left:auto;font-size:var(--fs-aux);color:var(--mut);font-variant-numeric:tabular-nums}
.qa-desc{white-space:pre-wrap;font-size:14px;margin-bottom:8px}
.qa-code{border:1px solid var(--line);border-radius:var(--r-ctl);margin-bottom:8px;overflow:hidden}
.qa-code>summary{cursor:pointer;font-size:var(--fs-aux);color:var(--mut);padding:8px 12px}
.qa-code[open]>summary{color:var(--ink);border-bottom:1px solid var(--line)}
.qa-code .qc-pre{margin:0;border-radius:0}
.qa-reply{background:var(--brand-pale);border:1px solid var(--pri-line);border-radius:var(--r-ctl);padding:10px 12px;font-size:14px;white-space:pre-wrap}
.qa-rtime{display:block;margin-top:6px;font-size:12px;color:var(--mut)}
/* 已答问题公开区（改进计划 2026-10-26 第 6 项，app.js qaLoadPublic/qaPubItemHtml 渲染）：
   沿用 qa- 前缀（.qa-pub/.qa-pub-note/.qa-pub-item/.qa-pub-user/.qa-pub-lesson/
   .qa-pub-ask/.qa-pub-a），观感对齐 .aidkit 折叠卡与 .qa-item；#qa-pub-body 为空态
   或失败提示时只有一行 .muted，其余类零生效。 */
.qa-pub{background:var(--card);border:1px solid var(--line);border-radius:14px;margin:0 0 14px}
.qa-pub>summary{cursor:pointer;font-weight:600;font-size:15px;color:var(--prid);padding:12px 18px}
.qa-pub-note{font-size:var(--fs-aux);color:var(--mut);margin:0 18px 10px}
.qa-pub-item{border-top:1px dashed var(--line);padding:10px 18px;font-size:14px;line-height:1.6}
.qa-pub-item:first-of-type{border-top:none}
.qa-pub-user{display:inline-block;font-weight:600;color:var(--prid);background:var(--brand-soft);border:1px solid var(--pri-line);border-radius:6px;padding:0 8px;margin-right:8px;font-size:var(--fs-aux)}
.qa-pub-lesson{margin-right:8px;font-size:var(--fs-aux)}
.qa-pub-ask{word-break:break-word}
.qa-pub-a{margin-top:4px;color:var(--mut);font-size:13.5px}
.qa-pub-a b{color:var(--ink)}
@media (max-width:959px){
  .askcard.qa-card{padding:16px}
  .qa-time{margin-left:0;flex:1 1 100%}
}
@media print{
  /* 我的提问页按当前展开态如实呈现：原代码折叠与回复内容不做强制展开/隐藏 */
  .qa-item{box-shadow:none;break-inside:avoid}
}

/* ---------- 阶段5：统一线性 SVG 图标对齐 + 错题本强化（计划 4.4 / 5.7）---------- */
/* 内联 SVG 与文字基线对齐：按钮、提示、页脚链、章节状态点、侧栏章名等处的
   图标一律 currentColor + aria-hidden，色语义由状态类（ic-*）或父级文字色继承 */
.btn svg{vertical-align:-3px}
.tip svg{vertical-align:-3px}
.donebar svg{vertical-align:-3px}
.schname svg{vertical-align:-2px}
.aidkit>summary svg,.aidhithead svg,.qa-aid svg{vertical-align:-3px}
/* 状态图标色语义（不只靠颜色：文字/徽标仍表达状态，图标为辅助） */
.ic-ok{color:var(--pri)}
.ic-open{color:var(--prid)}
.ic-todo{color:var(--mut)}
.ic-lock{color:var(--mut)}
.ic-no{color:var(--danger)}
/* 章节行/章头状态点容器内的图标居中（.lst 22px 宽） */
.lst svg{vertical-align:middle}

/* 错题本待重做操作条（app.js renderNotebook）：数量徽章 + 重练主按钮置顶一眼可见；
   移动端取消 .nbact 最小宽度（v4 执行书 6.9.3），计数与主按钮可上下排列 */
.nbtop{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.nbcount{flex:none;display:flex;align-items:baseline;gap:6px}
.nbcount b{font-size:30px;color:var(--prid);font-variant-numeric:tabular-nums;line-height:1.1}
.nbcount span{font-size:var(--fs-aux);color:var(--mut)}
.nbact{flex:1;min-width:240px}
.nbact .btn{display:inline-flex;align-items:center;gap:7px;min-height:44px}
.nbact .btn svg{vertical-align:baseline}
@media (max-width:959px){
  .nbact{min-width:0}
}
/* 解析默认折叠（details.nbexp）：不让解析喧宾夺主，展开后内容与题卡 explain 一字不减 */
.nbexp{margin-top:10px;border:1px dashed var(--line);border-radius:var(--r-ctl)}
.nbexp>summary{cursor:pointer;font-size:var(--fs-aux);color:var(--mut);font-weight:600;padding:8px 12px;line-height:1.6}
.nbexp>summary:hover{color:var(--ink)}
.nbexp[open]>summary{border-bottom:1px solid var(--line)}
.nbexp .explain{margin:10px 12px;border:none;padding:0;background:transparent;border-radius:0}

/* ---------- 阶段1：键盘焦点 + 响应式字号 + 减少动态效果（计划 4.2 / 6.4 / 6.7）---------- */
/* 跳转正文链接（v4 执行书 6.4/6.1，P2-3）：视觉隐藏、键盘聚焦时出现在左上角；
   index.html 与 landing.html 各一枚，目标分别为 #app 与 #main */
.skip{position:absolute;left:-9999px;top:0;z-index:200;background:var(--pri);color:#fff;padding:10px 16px;border-radius:0 0 var(--r-sm) 0;font-size:14px;font-weight:600}
.skip:focus{left:0}
/* 弹层打开期间的背景滚动锁（v4 执行书 6.16.1）：由 app.js/admin-app.js 的弹层助手
   在打开时挂到 body、关闭时摘除；不影响遮罩自身滚动 */
body.modal-open{overflow:hidden}
/* 键盘焦点：全局 focus-visible 绿色描边。鼠标点击不显示（focus-visible 语义），
   键盘 Tab 聚焦必显示；各处原有的 :focus 背景变色反馈保留，两者叠加不冲突。 */
:focus-visible{outline:2px solid var(--pri);outline-offset:2px}
/* 基础规则里移除了 outline 的输入类控件（.bblank / .authfield input 等），
   这里显式补回键盘焦点描边，保证「不能简单移除 outline」的红线 */
.ansin:focus-visible,.bblank:focus-visible,.qc-ta:focus-visible,.runsrcta:focus-visible{outline:2px solid var(--pri);outline-offset:1px}
/* 手机端字号层级（计划 4.2 表：hero 26~30 / 页面 H1 23~26 / 卡片 H2 18~20 / 代码 13~14） */
@media (max-width:959px){
  :root{--fs-hero:30px;--fs-h1:24px;--fs-h2:19px;--fs-code:13px}
  /* 正文页头 h1 更醒目但落在 23~26 区间；「下一课」主按钮手机端占满行宽（阶段4） */
  .lhead h1{font-size:25px}
  .lessonnav .btn.big{width:100%}
  /* 课程简介手机端完整呈现（修复 #7）：摘掉 3 行钳制 */
  .herotheme{display:block;-webkit-line-clamp:none;overflow:visible}
  /* 可编辑输入/代码手机端 16px（v4 执行书 4.2 表 + 6.2.2/6.7.6）：防止 iOS 聚焦自动放大；
     展示代码 pre 仍 13px，不受影响 */
  .ansin,.qc-ta,.runsrcta,.bblank{font-size:16px}
  /* 触控目标 44px（v4 执行书 9.3 硬门槛）：小按钮与代码头在移动端补足高度 */
  .btn.sm{min-height:44px;padding:8px 14px}
  .codehead{min-height:44px}
}
/* ≤420px：hero 主标题再降一档（「…入门营」的「营」字不再单字成行，修复 #6），
   text-wrap:balance 兜底——即使放不下也断成均衡两行而非孤字 */
@media (max-width:420px){
  :root{--fs-hero:25px}
  .hero h1{text-wrap:balance}
}

/* ---------- 课页右栏「本课条目」（2026-10-29 修复 #13，app.js lessonAsideHtml） ----------
   仅 ≥1440px 渲染为布局列：正文仍 720px，右栏 180px 列出本课各张条目 + 练习页，
   当前张高亮，长课定位用；窄屏该栏 display:none，不参与布局，对现有断点零影响。 */
.lessongrid{display:block}
.lessonaside{display:none}
@media (min-width:1440px){
  .content.lesson-wide{max-width:960px}
  .lessongrid{display:grid;grid-template-columns:minmax(0,1fr) 180px;gap:24px;align-items:start}
  /* 最小功能文字 13px（v4 执行书 6.6.5：右栏可读性） */
  .lessonaside{display:block;position:sticky;top:calc(var(--top-h) + 24px);max-height:calc(100vh - var(--top-h) - 48px);overflow:auto;font-size:13px;line-height:1.55}
}
.lahead{font-size:var(--fs-aux);font-weight:600;color:var(--prid);letter-spacing:.5px;margin-bottom:6px}
.laitem{display:block;color:var(--mut);padding:5px 0;border-top:1px solid var(--line)}
.laitem:first-of-type{border-top:none}
.laitem:hover{color:var(--prid)}
.laitem.on{color:var(--ink);font-weight:600}
/* .latag 11→12px（2026-11-02 审计 P2-2：不再用 11px 承载状态或操作；v4 §4.2） */
.latag{display:inline-block;font-size:12px;font-weight:600;margin-right:6px;letter-spacing:.5px}
@media print{
  /* 条目栏是导航部件，不进打印 */
  .lessonaside{display:none!important}
}
/* 减少动态效果：关闭过渡与动画的动态表达，状态变化改为瞬时呈现，不影响功能 */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
}
