/* ============================================================
 * 搏格幼儿园体测系统 · 设计系统 (Design System)
 * 令牌源自已确认的体测品牌色，统一全系统视觉
 * 含 亮/暗/系统 主题、玻璃态、磁性微交互、打印样式
 * ============================================================ */
:root{
  --c-primary:#155E63; --c-primary-d:#114B50; --c-primary-l:#1B7A85;
  --c-accent:#E8833A; --c-accent-d:#D06B25;
  --c-bg:#EEF1F4; --c-surface:#FFFFFF; --c-surface-2:#F6F8FA;
  --c-border:#E6EAEE; --c-border-strong:#D6DCE2;
  --c-text:#1F2A33; --c-text-2:#5B6675; --c-text-3:#98A2AE;
  /* ===== 评级语义色 · 方案B「加深莫兰迪」（2026-10-17）=====
   * 目标：整体更沉稳、更有「报告」的分量感，而不是幼儿园教具的轻快感。
   * 【为什么必须同时改前景墨】色一加深，白字就可能不够亮、深墨就可能不够暗 ——
   * 实测 #C9A227 配 #3A2F00 是 5.47:1 达标，但把黄压到 #8A6B0C 配同一个深墨
   * 反而掉到 3.96:1（黄色越深越吃深墨）。所以四档全部改用白字，
   * 并逐个验过对比度：
   *   优秀 #1E5C42 / 白 7.88:1   良好 #12545A / 白 8.60:1
   *   合格 #8A6B0C / 白 5.01:1   待加强 #A83A2E / 白 6.35:1     全部 ≥4.5:1（AA）
   * 【对比原值】原本四档都在 4.99~5.47:1，加深后有两档超过 7:1，层次更清楚。 */
  --c-excellent:#1E5C42; --c-good:#12545A; --c-pass:#8A6B0C; --c-weak:#A83A2E;
  /* 语义色上的前景墨色：亮色下全部用白；暗色下语义色本身变亮，必须换深墨才达 AA */
  /* 合格色加深后，白字(5.01:1)优于深墨(3.96:1)，故这一档的前景色也改白。
     理由写在上面 --c-* 的注释里 —— 前景色不能沿用旧的，必须跟着背景一起重算。 */
  --c-on-excellent:#fff; --c-on-good:#fff; --c-on-pass:#fff; --c-on-weak:#fff;
  /* 橙色文字墨：橙 tint 底上的可读正文色（浅底用深墨，深底用亮橙） */
  --c-accent-ink:#9C4E12;
  --c-weak-solid:#A83A2E;   /* 与 --c-weak 同步加深，保持 danger 按钮与评级色一致 */
  /* 实心按钮前景墨：浅色主题下主色/橙都是深色，白字够用；
     暗色主题下 --c-primary 变成亮青、--c-accent 变成亮橙，白字对比度仅约 2.1:1（不达标），
     故暗色改用深墨：#04252A on #2BC4C9 = 7.5:1，#3A1A05 on #F0914A = 6.7:1
     注：--c-weak-solid 亮暗都保持深红 #C0473B，故其前景墨两套主题都是白（5.1:1） */
  --c-on-primary:#fff; --c-on-accent:#fff; --c-on-weak-solid:#fff;
  --radius:14px; --radius-sm:9px; --radius-lg:20px;
  --shadow-sm:0 1px 3px rgba(18,28,38,.06);
  --shadow:0 4px 16px rgba(18,28,38,.08);
  --shadow-md:0 10px 34px rgba(18,28,38,.12);
  /* 交互语义令牌：聚焦环 / hover 投影 / 弱化填充，全站只此四处允许出现 rgba */
  --ring-primary:rgba(21,94,99,.13); --ring-weak:rgba(192,71,59,.15);
  --ring-accent:rgba(232,131,58,.18);
  --shadow-primary:0 6px 18px rgba(21,94,99,.30);
  --shadow-accent:0 6px 18px rgba(232,131,58,.30);
  --shadow-weak:0 6px 18px rgba(192,71,59,.28);
  --fill-primary:rgba(21,94,99,.09); --fill-weak:rgba(192,71,59,.09);
  --fill-muted:rgba(152,162,174,.16);
  --sidebar-w:248px;
  --font: "PingFang SC","Microsoft YaHei",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
  --font-num: "Bahnschrift","DIN Alternate","Avenir Next Condensed","Segoe UI",sans-serif;
}
[data-theme="dark"]{
  --c-primary:#2BC4C9; --c-primary-d:#1B7A85; --c-primary-l:#3FD3D8;
  --c-accent:#F0914A; --c-accent-d:#E8833A;
  --c-bg:#0E171B; --c-surface:#16242A; --c-surface-2:#1C2D34;
  --c-border:#243840; --c-border-strong:#2E4450;
  --c-text:#E7EEF1; --c-text-2:#9FB0B8; --c-text-3:#6B7C85;
  --c-excellent:#4CC38A; --c-good:#2BC4C9; --c-pass:#E0B53E; --c-weak:#E8655A;
  /* 暗色：语义色是"亮色"，白字会失效 → 前景改深墨；--c-weak-solid 供 danger 实心按钮用 */
  --c-on-excellent:#0A2E1E; --c-on-good:#052E31; --c-on-pass:#2E2400; --c-on-weak:#3A0F0A;
  --c-accent-ink:#F5B77E;
  --c-weak-solid:#C0473B;
  --c-on-primary:#04252A; --c-on-accent:#3A1A05; --c-on-weak-solid:#fff;
  --shadow-sm:0 1px 3px rgba(0,0,0,.3);
  --shadow:0 4px 16px rgba(0,0,0,.4);
  --shadow-md:0 10px 34px rgba(0,0,0,.5);
  /* 暗色：环与投影改用冷调深色，避免亮青在深底上"发光"刺眼 */
  --ring-primary:rgba(43,196,201,.20); --ring-weak:rgba(232,101,90,.24);
  --ring-accent:rgba(240,145,74,.22);
  --shadow-primary:0 6px 20px rgba(0,0,0,.55);
  --shadow-accent:0 6px 20px rgba(0,0,0,.55);
  --shadow-weak:0 6px 20px rgba(0,0,0,.55);
  --fill-primary:rgba(43,196,201,.14); --fill-weak:rgba(232,101,90,.16);
  --fill-muted:rgba(159,176,184,.14);
}
/* 暗色下压暗品牌渐变横幅（含总览四步卡、工作台英雄条），避免亮青刺眼 */
[data-theme="dark"] .exp-hero,
[data-theme="dark"] .card[style*="var(--c-primary)"]{background:linear-gradient(135deg,#123B41,#175058)!important;border:1px solid var(--c-border)}
[data-theme="dark"] .card[style*="var(--c-primary)"] h2{color:#fff}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font-family:var(--font);background:var(--c-bg);color:var(--c-text);line-height:1.55;
  -webkit-font-smoothing:antialiased;font-size:14px;transition:background .3s,color .3s}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:var(--c-border-strong);border-radius:6px}

/* ---------- 布局 ---------- */
.app{display:flex;min-height:100vh}
/* 深青侧边栏：品牌反转，两业务板块一眼分区 */
.sidebar{width:var(--sidebar-w);flex-shrink:0;background:linear-gradient(180deg,#114B50 0%,#0F4247 100%);
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;z-index:20}
.sidebar .brand{display:flex;align-items:center;gap:11px;padding:20px 18px;border-bottom:1px solid rgba(255,255,255,.12)}
.brand .logo{width:38px;height:38px;border-radius:11px;background:var(--c-accent);
  color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:18px;flex-shrink:0}
.brand .t1{font-weight:800;font-size:15px;color:#fff;line-height:1.1}
.brand .t2{font-size:11px;color:rgba(255,255,255,.55)}
.nav{flex:1;padding:12px 10px;overflow-y:auto}
.nav a{display:flex;align-items:center;gap:11px;padding:10px 13px;border-radius:var(--radius-sm);color:rgba(255,255,255,.82);
  font-weight:600;font-size:13.5px;margin-bottom:3px;transition:.18s;position:relative}
.nav a .ic{width:15px;height:15px;flex-shrink:0;opacity:.85}
.nav a:hover{background:rgba(255,255,255,.08);color:#fff}
.nav a.active{background:rgba(255,255,255,.16);color:#fff}
.nav a.active::before{content:'';position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--c-accent)}
.nav-group{margin-bottom:14px}
.nav-group-title{font-size:11px;font-weight:700;color:rgba(255,255,255,.48);letter-spacing:.06em;padding:6px 13px 5px}
.sidebar .foot{padding:14px 16px;border-top:1px solid rgba(255,255,255,.12);font-size:11px;color:rgba(255,255,255,.5);line-height:1.6}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{display:flex;align-items:center;gap:16px;padding:16px 26px;background:var(--c-surface);border-bottom:1px solid var(--c-border);position:sticky;top:0;z-index:15}
.topbar h1{font-size:19px;font-weight:800;color:var(--c-text)}
.topbar .sub{font-size:12.5px;color:var(--c-text-3);margin-top:2px}
.topbar .spacer{flex:1}
.content{padding:24px 26px 60px;max-width:1280px;width:100%}
.menu-btn{display:none;background:none;border:1px solid var(--c-border);border-radius:8px;padding:7px 11px;font-size:16px;color:var(--c-text-2)}

/* ---------- 移动端适配（手机录入，不影响桌面） ---------- */
@media (max-width: 768px) {
  .sidebar{position:fixed;left:0;top:0;bottom:0;width:248px;max-width:82vw;transform:translateX(-100%);transition:transform .25s ease;box-shadow:var(--shadow-md);z-index:60}
  .sidebar.open{transform:translateX(0)}
  .sidebar .foot{display:none}
  .menu-btn{display:flex;align-items:center;justify-content:center}
  .content{padding:14px 13px 90px}
  .topbar{padding:11px 13px;gap:10px}
  .topbar h1{font-size:16px}
  .row{gap:10px}
  .row>*{min-width:100%}
  /* 录入表：输入框触摸友好 + 评级列冻结常驻右侧（手机无需横滑到底看分） */
  #entryTable .ev{height:44px;font-size:16px;width:100%;text-align:center}
  #entryTable th,#entryTable td{padding:9px 7px;font-size:12.5px}
  #entryTable th:last-child,#entryTable td:last-child{position:sticky;right:0;background:var(--c-surface);z-index:2;box-shadow:-7px 0 12px -7px rgba(0,0,0,.15)}
  #entryTable tr.err td{background:rgba(192,71,59,.07)}
  /* 保存区吸底，手机录完一键保存 */
  .entry-actions{position:sticky;bottom:0;z-index:30;background:var(--c-surface);border:1px solid var(--c-border);box-shadow:0 -6px 18px rgba(0,0,0,.08);margin-bottom:0}
  .entry-actions .btn{font-size:15px;padding:13px 18px}
}
@media (max-width: 768px) and (min-width: 481px){ .row>*{min-width:calc(50% - 5px)} }

/* ---------- 主题切换 ---------- */
.theme-toggle{display:flex;background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:20px;padding:3px;gap:2px}
.theme-toggle button{border:none;background:none;padding:5px 11px;border-radius:16px;font-size:12.5px;color:var(--c-text-2);font-weight:600;transition:.15s}
.theme-toggle button.on{background:var(--c-surface);color:var(--c-primary);box-shadow:var(--shadow-sm)}

/* ---------- 卡片 ---------- */
.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--radius);padding:18px 20px;box-shadow:var(--shadow-sm);margin-bottom:18px}
.card.glass{background:linear-gradient(160deg,rgba(255,255,255,.7),rgba(255,255,255,.4));backdrop-filter:blur(14px) saturate(160%);border:1px solid rgba(255,255,255,.5)}
[data-theme="dark"] .card.glass{background:linear-gradient(160deg,rgba(44,196,201,.08),rgba(27,122,133,.03));border-color:var(--c-border)}
.card h2{font-size:15.5px;color:var(--c-primary);font-weight:800;margin-bottom:14px;display:flex;align-items:center;gap:9px}
.card h2::before{content:'';width:4px;height:17px;background:var(--c-primary);border-radius:3px}
.card h3{font-size:13.5px;font-weight:700;color:var(--c-text);margin:14px 0 8px}
.grid{display:grid;gap:16px}
.grid-2{grid-template-columns:repeat(2,1fr)}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-4{grid-template-columns:repeat(4,1fr)}
@media(max-width:980px){.grid-4{grid-template-columns:repeat(2,1fr)}.grid-3{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.grid-2,.grid-3,.grid-4{grid-template-columns:1fr}}

/* ---------- KPI ---------- */
.kpi{background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow-sm);position:relative;overflow:hidden;transition:.2s}
.kpi:hover{box-shadow:var(--shadow-md)}
.kpi .lab{font-size:12.5px;color:var(--c-text-2);font-weight:600}
.kpi .num{font-family:var(--font-num);font-size:30px;font-weight:800;color:var(--c-primary);line-height:1.1;margin-top:6px;letter-spacing:.01em;font-variant-numeric:tabular-nums}
.kpi .ic{position:absolute;right:14px;top:14px;font-size:22px;opacity:.16}
.kpi .sub{font-size:11.5px;color:var(--c-text-3);margin-top:4px}

/* ---------- 按钮 ----------
 * 交互语言（全站统一）：hover 只做「提亮 + 投影加深」，绝不位移。
 * 原因：卡片、表格行、按钮同时上浮会让整页"漂"，失去重量感。
 * 只有 :active 的 scale(.97) 是允许的按下反馈。 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;font-weight:700;font-size:13.5px;
  border:1px solid transparent;border-radius:var(--radius-sm);padding:10px 17px;white-space:nowrap;
  transition:background .18s,box-shadow .18s,border-color .18s,color .18s,filter .18s}
.btn:active{transform:scale(.97)}
.btn--primary{background:var(--c-primary);color:var(--c-on-primary)}
.btn--primary:hover{background:var(--c-primary-l);box-shadow:var(--shadow-primary)}
[data-theme="dark"] .btn--primary:hover{background:var(--c-primary-d);box-shadow:var(--shadow-primary)}
.btn--accent{background:var(--c-accent);color:var(--c-on-accent)}
.btn--accent:hover{background:var(--c-accent);filter:brightness(1.06);box-shadow:var(--shadow-accent)}
[data-theme="dark"] .btn--accent:hover{background:var(--c-accent-d);filter:none;box-shadow:var(--shadow-accent)}
.btn--ghost{background:var(--c-surface);color:var(--c-primary);border-color:var(--c-border)}
.btn--ghost:hover{background:var(--c-surface-2);border-color:var(--c-primary-l);color:var(--c-primary-l)}
[data-theme="dark"] .btn--ghost:hover{color:var(--c-primary)}
/* info：家长报告等中性的第三条路径，用主色浅底而非橙，避免与"谈单橙"抢语义 */
.btn--info{background:var(--fill-primary);color:var(--c-primary);border-color:transparent}
.btn--info:hover{background:var(--fill-primary);filter:brightness(.97);border-color:var(--c-primary-l)}
[data-theme="dark"] .btn--info:hover{filter:none}
/* danger：仅用于删除确认等不可逆动作 */
.btn--danger{background:var(--c-weak-solid);color:var(--c-on-weak-solid)}
.btn--danger:hover{background:var(--c-weak-solid);filter:brightness(1.08);box-shadow:var(--shadow-weak)}
[data-theme="dark"] .btn--danger:hover{filter:brightness(1.14)}
.btn--sm{padding:6px 12px;font-size:12.5px}
.btn[disabled],.btn[disabled]:hover{opacity:.5;cursor:not-allowed;box-shadow:none;filter:none;transform:none}
/* 纯图标小按钮：常态隐形边框，hover/focus 才显形，避免表格操作列噪声 */
.btn--icon{padding:6px 8px;gap:0;background:transparent;color:var(--c-text-2);border-color:transparent}
.btn--icon:hover{background:var(--c-surface-2);border-color:var(--c-border);color:var(--c-primary)}
.btn--icon:focus-visible{outline:none;border-color:var(--c-primary);box-shadow:0 0 0 3px var(--ring-primary)}
.btn--icon.is-danger:hover{background:var(--fill-weak);border-color:var(--c-weak);color:var(--c-weak)}
/* 表格操作列容器：图标按钮成组，间距 6px，垂直居中，不换行 */
.row-actions{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:nowrap}

/* ---------- 表单 ---------- */
.field{margin-bottom:13px}
.field label{display:block;font-size:12.5px;color:var(--c-text-2);font-weight:600;margin-bottom:6px}
.input,.select{width:100%;padding:10px 13px;border:1px solid var(--c-border);border-radius:var(--radius-sm);font-size:13.5px;background:var(--c-surface);color:var(--c-text);font-family:inherit;transition:.15s}
.input:focus,.select:focus{outline:none;border-color:var(--c-primary);box-shadow:0 0 0 3px var(--ring-primary)}
/* 录入越界态：红框 + 红环，键盘聚焦时保持红环不被主色环覆盖。
   兼容两种类名：约定的 .input--err 与 views.js 实际使用的 .err */
.input--err,.input.input--err,.input.err{border-color:var(--c-weak);background:var(--fill-weak);color:var(--c-text)}
.input--err:focus,.input--err:focus-visible,.input.err:focus,.input.err:focus-visible{
  outline:none;border-color:var(--c-weak);box-shadow:0 0 0 3px var(--ring-weak)}
.select--err{border-color:var(--c-weak)}
.row{display:flex;gap:13px;flex-wrap:wrap}
.row>*{flex:1;min-width:160px}
.inline{display:flex;gap:10px;align-items:center;flex-wrap:wrap}

/* ---------- 表格 ---------- */
.tbl-wrap{overflow-x:auto;border:1px solid var(--c-border);border-radius:var(--radius);background:var(--c-surface)}
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
table.tbl th{text-align:left;color:var(--c-text-2);font-weight:700;font-size:11.5px;padding:11px 13px;background:var(--c-surface-2);border-bottom:1px solid var(--c-border);white-space:nowrap}
table.tbl td{padding:10px 13px;border-bottom:1px solid var(--c-border);vertical-align:middle}
table.tbl tr:last-child td{border-bottom:none}
table.tbl tbody tr:hover{background:var(--c-surface-2)}
/* 录入/打印等宽表头多行场景：表头吸顶，滚动时列名始终可见 */
table.tbl thead th{position:sticky;top:0;z-index:5;box-shadow:inset 0 -1px 0 var(--c-border)}
/* 表头吸顶后被压在下方的高亮行加一点 z-index 兜底，避免被表头遮住 */
table.tbl tbody tr{z-index:1;position:relative}
/* 操作列：内容居中且不换行，与 .row-actions 呼应 */
table.tbl td .row-actions{min-height:28px}
.tnum{font-variant-numeric:tabular-nums}

/* ---------- 体测录入表：密度优化（1440px 一屏可见 15+ 名学员） ----------
 * 目标行高 ≈ 40px（原 ≈ 58px）。手段：输入框定宽 76px 居中、单元 padding 收到 7px、
 * 行高压缩。移动端 44px 触摸高在 @media(max-width:768px) 内单独保护，不受此段影响。 */
#entryTable table.tbl{font-size:12.5px}
#entryTable table.tbl th{padding:7px 6px;font-size:11px;line-height:1.35}
#entryTable table.tbl td{padding:7px 6px;text-align:center}
#entryTable table.tbl td:first-child{text-align:left;padding-left:12px}
/* 输入框：定宽 76px 居中（覆盖 JS 内联的 62px 需提高优先级，这里用 !important 收口） */
#entryTable .ev{width:76px!important;height:30px;padding:0 6px;text-align:center;
  font-family:var(--font-num);font-size:14px;font-weight:700;letter-spacing:.02em}
#entryTable .ev:focus{text-align:center}
/* 实时评级列：数字与徽章压缩为单行，节省行高 */
#entryTable td:last-child>div{display:flex;align-items:center;justify-content:center;gap:6px}
#entryTable td:last-child>div>div:first-child{font-family:var(--font-num);font-variant-numeric:tabular-nums}
@media (max-width:768px){
  /* 移动端回归：本段桌面规则写在文件更后方、特异性相同或更高，
     故必须在同等条件下"再声明一次"才能覆盖，否则移动端会被桌面密度规则压掉。
     触摸高 44px 与 padding 9px 7px 是手机录入的可用性底线，不可下调。 */
  #entryTable .ev{width:100%!important;height:44px;font-size:16px;padding:0 8px}
  #entryTable table.tbl th{padding:9px 7px;font-size:11.5px}
  #entryTable table.tbl td{padding:9px 7px;font-size:12.5px}
  #entryTable table.tbl td:first-child{padding-left:7px;text-align:center}
}

/* ---------- 徽章 / 评级 ---------- */
/* 语义色一律配对前景墨色令牌：暗色下评级色变亮，白字会失效，故不能写死 #fff */
.badge{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;padding:3px 10px;border-radius:20px;color:var(--c-on-good);white-space:nowrap}
.badge.excellent{background:var(--c-excellent);color:var(--c-on-excellent)}
.badge.good{background:var(--c-good);color:var(--c-on-good)}
.badge.pass{background:var(--c-pass);color:var(--c-on-pass)}
.badge.weak{background:var(--c-weak);color:var(--c-on-weak)}
/* 未测 / 无数据：中性灰，绝不占用合格色金黄，避免"没测"被误读成"刚及格" */
.badge.muted,.badge--muted{background:var(--c-surface-2);color:var(--c-text-3);border:1px solid var(--c-border);padding:2px 9px}
.grade-dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex-shrink:0}
.grade-dot.excellent{background:var(--c-excellent)}.grade-dot.good{background:var(--c-good)}
.grade-dot.pass{background:var(--c-pass)}.grade-dot.weak{background:var(--c-weak)}
.grade-dot.muted{background:var(--c-border-strong)}
/* 记分牌数字：与 KPI 同一套 DIN 风数字，保证全站数字等宽对齐 */
.score-pill{font-family:var(--font-num);font-weight:800;font-size:15px;font-variant-numeric:tabular-nums;letter-spacing:.01em}
.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--c-text-2);margin-top:12px}
.legend i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:5px;vertical-align:-1px}

/* ---------- 进度条 ---------- */
.bar{height:9px;border-radius:6px;background:var(--c-surface-2);overflow:hidden;margin-top:6px}
.bar>i{display:block;height:100%;border-radius:6px;background:linear-gradient(90deg,var(--c-primary),var(--c-primary-l))}
/* 未测 / 0 数据进度条：中性灰，不使用合格色金黄 */
.bar.muted,.bar--muted{background:var(--c-surface-2);border:1px dashed var(--c-border-strong);height:9px}
.bar--muted>i,.bar.muted>i{background:var(--c-border-strong)}

/* ---------- 提示条 / 说明 ---------- */
.note{font-size:12.5px;color:var(--c-text-2);line-height:1.7;background:var(--c-surface-2);border-left:3px solid var(--c-primary-l);padding:11px 14px;border-radius:0 8px 8px 0;margin-top:12px}
.ref-note{font-size:11.5px;color:var(--c-text-3);line-height:1.6;background:var(--c-surface-2);border-radius:6px;padding:6px 10px;margin-top:6px;margin-bottom:10px}

/* ---------- 空态（.empty / .empty-card 双轨合并） ----------
 * 图标 44px / 标题 13px·600·text-2 / 副文案 12px·text-3 / CTA 槽 margin-top 16px。
 * .exp-empty 走同一套（见文末别名），避免两页空态视觉分裂。 */
.empty{text-align:center;padding:46px 20px;color:var(--c-text-3);display:flex;flex-direction:column;align-items:center}
.empty .big{font-size:44px;line-height:1;opacity:.42;margin-bottom:14px}
.empty h3,.empty .t{font-size:13px;font-weight:600;color:var(--c-text-2);margin-bottom:5px}
.empty p,.empty .d{font-size:12px;color:var(--c-text-3);line-height:1.65;max-width:420px}
/* CTA 插槽：仅在有按钮时才占位，无按钮时不产生空隙 */
.empty .cta,.empty-card .cta{margin-top:16px;display:flex;justify-content:center;gap:10px;flex-wrap:wrap}
.empty .cta:empty,.empty-card .cta:empty{display:none}
/* 整卡空态：撑满可视区，让"没数据"成为明确状态而非页面塌陷 */
.empty-card{background:var(--c-surface);border:1px dashed var(--c-border-strong);border-radius:var(--radius);
  padding:40px 24px;min-height:400px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;color:var(--c-text-3);box-shadow:var(--shadow-sm)}
.empty-card .big{font-size:44px;line-height:1;opacity:.42;margin-bottom:14px}
.empty-card h3,.empty-card .t{font-size:13px;font-weight:600;color:var(--c-text-2);margin-bottom:5px}
.empty-card p,.empty-card .d{font-size:12px;color:var(--c-text-3);line-height:1.65;max-width:420px}
@media (max-width:768px){ .empty-card{min-height:300px;padding:28px 16px} }

/* 未保存 / 草稿提示条：橙色属"行动提醒"，与谈单橙同源但用浅底弱化，不抢主 CTA */
.dirty-tip{display:flex;align-items:center;gap:9px;margin:0 0 12px;padding:9px 13px;border-radius:var(--radius-sm);
  background:var(--ring-accent);border:1px solid var(--c-accent);color:var(--c-accent-ink);
  font-size:12.5px;font-weight:600;line-height:1.55}
.dirty-tip .ic{font-size:14px;flex-shrink:0}
.dirty-tip .txt{flex:1;min-width:0}
.dirty-tip .btn{margin-left:auto;flex-shrink:0}
[data-theme="dark"] .dirty-tip{color:var(--c-text)}

/* 表格行内"未保存"标记：极小橙点标签，不抢评级色 */
.unsaved-flag{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:700;line-height:1;
  padding:3px 7px;border-radius:20px;background:var(--ring-accent);color:var(--c-accent-ink);white-space:nowrap;
  border:1px solid var(--c-accent);vertical-align:middle}
[data-theme="dark"] .unsaved-flag{color:var(--c-text)}
.unsaved-flag::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--c-accent);flex-shrink:0}

/* ---------- 更多操作下拉（表格操作列收敛） ---------- */
.more-menu{position:relative;display:inline-flex;vertical-align:middle}
.more-btn{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:28px;min-width:28px;
  padding:0 8px;border:1px solid transparent;border-radius:var(--radius-sm);background:transparent;
  color:var(--c-text-2);font-size:13px;font-weight:700;line-height:1;transition:.15s}
/* 展开态类名统一为 .open —— 与既有 .sidebar.open 保持同一约定，
   避免出现 .is-open / .open 两套叫法导致浮层永远不显示。 */
.more-btn:hover,.more-menu.open .more-btn,.more-btn:focus-visible{background:var(--c-surface-2);
  border-color:var(--c-border);color:var(--c-primary);outline:none}
/* 浮层：默认向下；靠表格底部时由 JS 加 .more-pop--up 翻到上方，避免被视口裁切 */
.more-pop{position:absolute;top:calc(100% + 6px);right:0;min-width:148px;z-index:60;
  background:var(--c-surface);border:1px solid var(--c-border);border-radius:var(--radius-sm);
  box-shadow:var(--shadow-md);padding:5px;display:none;text-align:left}
.more-pop--up{top:auto;bottom:calc(100% + 6px)}
.more-menu.open .more-pop{display:block;animation:moreIn .14s ease}
@keyframes moreIn{from{opacity:0;transform:translateY(-3px)}to{opacity:1;transform:none}}
.more-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;border-radius:6px;
  background:none;font-family:inherit;font-size:12.5px;font-weight:600;color:var(--c-text-2);text-align:left;transition:.13s}
.more-item:hover,.more-item:focus-visible{background:var(--c-surface-2);color:var(--c-primary);outline:none}
.more-item .ic{width:14px;text-align:center;flex-shrink:0;font-size:13px}
.more-item--danger{color:var(--c-weak)}
.more-item--danger:hover,.more-item--danger:focus-visible{background:var(--fill-weak);color:var(--c-weak)}
.more-sep{height:1px;background:var(--c-border);margin:5px 4px}
/* 移动端浮层贴近手指：改为左对齐铺开，触控目标 ≥40px */
@media (max-width:768px){
  .more-pop{min-width:170px}
  .more-item{padding:11px 12px;font-size:13.5px}
}

/* ---------- 品牌纪律收口：未保存/草稿提示不得占用合格色金黄 ----------
 * views.js 录入页有一段页面内 <style>，把 .unsaved-flag / .dirty-tip 写成了
 * var(--c-pass)（合格色金黄）。金黄在体测系统里已被"合格"评级独占，
 * 未保存提示若也用金黄，会被读成"这条已合格"，属语义串色。
 * 页面内 <style> 在层叠中晚于本表，故这里用 body 前缀提高特异性来收口，
 * 无需改动 views.js。橙色属"行动提醒"，与橙色纪律不冲突。
 * ⚠ 若后续 views.js 自行改回主色，本段可整段删除。 */
body .unsaved-flag{display:inline-flex;align-items:center;gap:4px;padding:3px 7px;border-radius:20px;
  background:var(--ring-accent);border:1px solid var(--c-accent);color:var(--c-accent-ink);
  font-size:10.5px;font-weight:700;line-height:1;margin-left:5px;vertical-align:middle}
body .unsaved-flag::before{content:'';width:5px;height:5px;border-radius:50%;background:var(--c-accent);flex-shrink:0}
body .dirty-tip{display:flex;align-items:center;gap:9px;margin:0 0 12px;padding:9px 13px;
  border-radius:var(--radius-sm);background:var(--ring-accent);border:1px solid var(--c-accent);
  border-left:3px solid var(--c-accent);color:var(--c-accent-ink);font-size:12.5px;font-weight:600;line-height:1.55}
[data-theme="dark"] body .unsaved-flag,
[data-theme="dark"] body .dirty-tip{color:var(--c-text)}
/* 未保存行的左侧标记：与 .unsaved-flag 同源，用橙不用金黄 */
body #entryTable tr.unsaved-row td:first-child{box-shadow:inset 3px 0 0 var(--c-accent)}
.toast{position:fixed;left:50%;top:20px;transform:translateX(-50%) translateY(-20px);background:var(--c-primary-d);color:#fff;padding:12px 20px;border-radius:11px;font-size:13.5px;font-weight:700;box-shadow:var(--shadow-md);opacity:0;transition:.28s;z-index:200;pointer-events:none;max-width:90%}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ============================================================
 * 品牌纪律 · 橙色收敛（团测域）
 * 橙色 = 谈单 / 转化 / 关键行动点睛。团测域（学员管理、体测录入）
 * 内的一切按钮与标签一律回落深青主色，橙色只留给全站级关键行动
 * （如录入页"提交测评"）与未保存提醒。
 * 由于部分按钮由 JS 内联 background，此处用选择器 + !important 收口；
 * 成员1 后续把内联 background 去掉后，这些规则可平滑退化为无操作。
 * 前景色统一走 --c-on-primary / --c-on-accent 墨色令牌，保证暗色下不糊。
 * ============================================================ */
#view .card .btn--accent{background:var(--c-primary);color:var(--c-on-primary)}
#view .card .btn--accent:hover{background:var(--c-primary-l);box-shadow:var(--shadow-primary)}
[data-theme="dark"] #view .card .btn--accent:hover{background:var(--c-primary-d)}
/* 学员管理表格内的行内操作按钮（含 JS 内联底色的批量打印入口） */
#stuTable .btn--accent,
#stuTable .btn--accent[style*="--c-primary-l"]{background:var(--c-primary)!important;color:var(--c-on-primary)!important;border-color:transparent!important}
#stuTable .btn--accent:hover{background:var(--c-primary-l)!important;box-shadow:var(--shadow-primary)}
[data-theme="dark"] #stuTable .btn--accent:hover{background:var(--c-primary-d)!important}
/* 录入页保存区：橙色只留给"提交测评"这一个关键行动 */
.entry-actions{position:relative}
.entry-actions .btn--accent{background:var(--c-primary);color:var(--c-on-primary)}
.entry-actions .btn--accent:hover{background:var(--c-primary-l);box-shadow:var(--shadow-primary)}
[data-theme="dark"] .entry-actions .btn--accent:hover{background:var(--c-primary-d)}
/* 唯一保留橙色的关键行动：提交/保存体测 */
.entry-actions #save{background:var(--c-accent);color:var(--c-on-accent)}
.entry-actions #save:hover{background:var(--c-accent);filter:brightness(1.06);box-shadow:var(--shadow-accent)}
[data-theme="dark"] .entry-actions #save:hover{background:var(--c-accent-d);filter:none;box-shadow:var(--shadow-accent)}
/* 快捷操作区：录入是主路径，用主色，不用橙 */
#view .card .btn--accent[href="#/entry"]{background:var(--c-primary);color:var(--c-on-primary)}

/* ============================================================
 * 记分牌数字字体统一（Bahnschrift / DIN 风，零加载）
 * 所有"大数字"必须同族同 tabular-nums，否则跨页数字宽度不一致、跳字。
 * 范围仅限屏幕层组件；A4 打印区（.print-cover/.cover-stat/.kinder-report/
 * .ov-* 园所报告）一律不动，避免影响既有分页与像素级排版。
 * ============================================================ */
.kpi .num,.score-pill,.item-row .sc,.report-hero .ring .num,
.lan-box .lan-u,.fg-stu-list b{font-family:var(--font-num);font-variant-numeric:tabular-nums}
.report-hero .ring .num{font-weight:800}

/* ============================================================
 * 园所总览"四步"横幅：三张卡时排布不塌
 * 原 grid-4 在只有 3 张卡时会留下空列；auto-fit + minmax(200px,1fr)
 * 使 3 张与 4 张都均分满宽，第四张补上后自动成 4 列。
 * 说明：views.js 目前该容器用的是内联 grid-template-columns，
 * 故下面用属性选择器 + !important 桥接；成员1 改为 class="grid auto-fit"
 * 后即可删除桥接规则。
 * ============================================================ */
.grid.auto-fit{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.card[style*="var(--c-primary)"]>div[style*="grid-template-columns"]{
  grid-template-columns:repeat(auto-fit,minmax(200px,1fr))!important}
@media(max-width:980px){
  .grid.auto-fit{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}
  .card[style*="var(--c-primary)"]>div[style*="grid-template-columns"]{
    grid-template-columns:repeat(auto-fit,minmax(170px,1fr))!important}
}
@media(max-width:640px){
  .grid.auto-fit{grid-template-columns:1fr}
  .card[style*="var(--c-primary)"]>div[style*="grid-template-columns"]{grid-template-columns:1fr!important}
}

/* ---------- 更多操作浮层 · 防裁切 ----------
 * .tbl-wrap 有 overflow-x:auto，会把 .more-pop（absolute）裁掉。
 * 方案 A（推荐，零 JS 依赖）：容器上用 :has() 感知展开态并放开 overflow。
 *   目前只对 #stuTable 生效——学员表列少，不需要横向滚动，放开无副作用。
 * 方案 B（兜底）：成员1 在展开时给 .tbl-wrap 加 .tbl-wrap--popfix。
 * ⚠ 体测录入表 #entryTable 列多，禁止放开 overflow，否则横向滚动失效。
 *
 * ⚠⚠ 下轮隐患预告（主理人要求记录）：若将来要在 #entryTable 录入表使用 .more-menu，
 * 会同时撞上三个层叠/裁切问题，届时不能直接复用本文档的 #stuTable 规则：
 *   ① 横向滚动：.tbl-wrap 必须保持 overflow-x:auto，浮层会被横向裁切，
 *      :has() 放开 overflow 的方案在这里不可用（会破坏滚动）；
 *      需要改用 position:fixed 挂到 body，或由 JS 计算并锁定 left/top。
 *   ② 层级：#entryTable 的 sticky 评级列 z-index:2、吸底保存区 z-index:30，
 *      再叠加 thead th 的 z-index:5，浮层需要更高的层级才能浮在最上。
 *   ③ 触摸：移动端单元格可点区域小，浮层条目需 ≥44px 触摸高，
 *      且必须处理横向滚动时的定位跟随。
 *   建议：下轮若确需在录入表加操作浮层，单独设计一套 fixed 定位方案，
 *         不要直接复制本文档规则。 */
#stuTable:has(.more-menu.open){overflow:visible}
.tbl-wrap--popfix{overflow:visible!important}
/* ---------- 浮层层级修正（实测 bug：删除条目被吸顶表头盖住，点不到） ----------
 * 症结：table.tbl tbody tr 是独立 stacking context（position:relative; z-index:1），
 * 所以 .more-pop 的 z-index:60 只在 tr 内部生效，对外只等价于"层级 1 的 tr"，
 * 而吸顶表头 thead th 是 z-index:5 → 表头压住整行，浮层顶部条目无法点击。
 * 修法：把"展开中的那一行"整体抬到表头之上（70 > 5）。
 * 安全性：tr 自身只有 background-color 与 inset box-shadow（均不溢出 tr 盒），
 * 抬层级不会遮挡相邻行；相邻未展开行仍是 z-index:1，不受影响。
 * 作用域限定 #stuTable：录入表列多且依赖横向滚动，暂不使用浮层，不受影响。 */
#stuTable tbody tr:has(.more-menu.open){position:relative;z-index:70}
/* 展开行的浮层自身层级同步抬高，双保险（万一 tr 的 stacking context 变化） */
#stuTable .more-menu.open .more-pop{z-index:70}


/* ---------- exp 空态别名（.exp-empty 并入统一空态规范） ---------- */
.exp-empty{text-align:center;padding:46px 20px;color:var(--c-text-3);display:flex;flex-direction:column;align-items:center}
.exp-empty .big{font-size:44px;line-height:1;opacity:.42;margin-bottom:14px}
.exp-empty h3,.exp-empty .t{font-size:13px;font-weight:600;color:var(--c-text-2);margin-bottom:5px}
.exp-empty p,.exp-empty .d{font-size:12px;color:var(--c-text-3);line-height:1.65;max-width:420px}
.exp-empty .cta{margin-top:16px;display:flex;justify-content:center;gap:10px;flex-wrap:wrap}
.exp-empty .cta:empty{display:none}

/* 登录页局域网地址 + 录入已录标记 */
.lan-box{margin-top:16px;padding:14px 16px;border:1px dashed var(--c-primary-l);border-radius:var(--radius-sm);background:var(--c-surface-2);text-align:center}
.lan-box .lan-t{font-size:12.5px;color:var(--c-text-2);font-weight:600}
.lan-box .lan-u{font-size:17px;font-weight:800;color:var(--c-primary);margin:6px 0 2px;word-break:break-all}
.done-row{background:rgba(46,125,91,.07)}
.done-row td:first-child{box-shadow:inset 3px 0 0 var(--c-excellent)}

/* ---------- 模态 ---------- */
.modal-mask{position:fixed;inset:0;background:rgba(8,15,18,.45);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:150;padding:20px}
.modal{background:var(--c-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);width:100%;max-width:460px;padding:22px 24px;max-height:90vh;overflow:auto}
.modal h3{font-size:16px;font-weight:800;color:var(--c-primary);margin-bottom:16px}
.modal .actions{display:flex;gap:10px;justify-content:flex-end;margin-top:20px}

/* ---------- 评级大卡 ---------- */
.report-hero{display:flex;align-items:center;gap:22px;background:linear-gradient(135deg,var(--c-primary-d),var(--c-primary-l));color:#fff;border-radius:var(--radius-lg);padding:24px 28px;box-shadow:var(--shadow-md)}
.report-hero .ring{width:104px;height:104px;border-radius:50%;background:conic-gradient(#fff calc(var(--p)*1%),rgba(255,255,255,.22) 0);display:flex;align-items:center;justify-content:center;flex-direction:column;flex-shrink:0}
.report-hero .ring .inner{width:82px;height:82px;border-radius:50%;background:var(--c-primary-d);display:flex;flex-direction:column;align-items:center;justify-content:center}
.report-hero .ring .num{font-size:30px;font-weight:800;line-height:1}
.report-hero .ring .lbl{font-size:11px;opacity:.85}
.report-hero .meta h2{color:#fff;font-size:20px;margin-bottom:4px}
.report-hero .meta .lvl{font-size:15px;font-weight:700;opacity:.95}
.report-hero .meta .tags{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}
.report-hero .meta .tags span{background:rgba(255,255,255,.18);padding:3px 11px;border-radius:20px;font-size:12px}

/* 单项明细 */
.item-row{display:flex;align-items:center;gap:14px;padding:11px 0;border-bottom:1px solid var(--c-border)}
.item-row:last-child{border-bottom:none}
.item-row .name{width:120px;font-weight:600;flex-shrink:0}
.item-row .val{width:96px;text-align:right;font-variant-numeric:tabular-nums;color:var(--c-text-2);font-size:12.5px}
.item-row .sc{width:54px;text-align:center;font-weight:800;font-size:15px}
.item-row .track{flex:1}

/* 薄弱项聚焦 */
/* 薄弱项聚焦 - 卡片式 v2 */
.fg-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:8px}
.fg-card{background:#fff;border:1px solid #E8DDD0;border-radius:12px;overflow:hidden;transition:box-shadow .2s}
.fg-card:hover{box-shadow:var(--shadow)}
.fg-head{display:flex;align-items:center;gap:10px;padding:13px 16px;background:linear-gradient(135deg,#FBF3E6,#F8EBD3);border-bottom:1px solid #EDE3D5}
.fg-icon{font-size:20px;flex-shrink:0}
.fg-title-row{flex:1;display:flex;justify-content:space-between;align-items:center;gap:8px}
.fg-name{font-size:14.5px;font-weight:800;color:#155E63}
.fg-badge{font-size:11.5px;font-weight:700;color:#C0473B;background:#fff;padding:3px 9px;border-radius:10px;white-space:nowrap;flex-shrink:0}
.fg-students{padding:9px 16px;border-bottom:1px solid #F5F0E8;display:flex;align-items:baseline;gap:6px;font-size:11px}
.fg-stu-label{color:#98A2AE;font-weight:700;flex-shrink:0;white-space:nowrap}
.fg-stu-list{color:#5B6675;line-height:1.5}
/* ④ 训练主题方案卡片（诊断+行动一体） */
.tt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;margin-top:6px}
.tt-card{background:#fff;border:1px solid #E0DED8;border-radius:12px;overflow:hidden;transition:box-shadow .2s}
.tt-card:hover{box-shadow:var(--shadow)}
.tt-head{display:flex;align-items:center;gap:8px;padding:13px 16px;background:linear-gradient(135deg,#E7F0F1,#D4E6EA);border-bottom:1px solid #C8DCE0}
.tt-icon{font-size:20px;flex-shrink:0}
.tt-name{font-size:15px;font-weight:800;color:#155E63;flex:1}
.tt-freq{font-size:11px;font-weight:700;color:#1B7A85;background:#fff;padding:3px 9px;border-radius:10px;flex-shrink:0}
/* 诊断信息行（维度+人数+学员） */
.tt-diag{padding:10px 16px;display:flex;flex-direction:column;gap:4px;background:#FAFBFC;border-bottom:1px solid #F0EEE9}
.tt-dim-info{font-size:11.5px;font-weight:700;color:#155E63}
.tt-stu-info{font-size:11px;color:#7A8A95;line-height:1.5}
.tt-goal{font-size:12.5px;color:#3D4852;padding:8px 16px 4px;line-height:1.65;font-weight:500}
.tt-acts{padding:4px 16px 14px}
.tt-act-label{font-size:11px;font-weight:700;color:#E8833A;margin-bottom:4px}
.tt-list{margin:0;padding-left:18px;color:#3D4852}
.tt-list li{font-size:12px;line-height:1.65;margin:3px 0}
/* 学期分阶段训练规划 */
.sem-direction{margin-top:14px;padding:12px 16px;background:#EFF6F6;border-left:4px solid #155E63;border-radius:8px;font-size:13.5px;line-height:1.7;color:#26424A}
.sem-direction b{color:#155E63}
.sem-plan{margin-top:14px;display:flex;flex-direction:column;gap:10px}
.sem-phase{background:#fff;border:1px solid #E8E4DC;border-radius:10px;overflow:hidden}
.sem-phase-head{display:flex;align-items:center;gap:8px;padding:10px 16px;background:#F5F2EC}
.sem-phase-tag{font-size:11px;font-weight:800;color:#fff;padding:3px 10px;border-radius:6px;flex-shrink:0}
.sem-phase-tag.early{background:#1B7A85}
.sem-phase-tag.mid{background:#E8833A}
.sem-phase-tag.late{background:#155E63}
.sem-phase-time{font-size:12.5px;font-weight:700;color:#3D4852}
.sem-body{padding:10px 16px 14px}
.sem-focus{font-size:12px;color:#3D4852;margin:0 0 4px;line-height:1.55}
.sem-detail{font-size:11.5px;color:#6B7580;margin:0;line-height:1.65}
.sec-title-sm{font-size:14px;font-weight:800;color:#155E63;margin:18px 0 8px;padding-left:2px}
@media (max-width:560px){ .fg-grid{grid-template-columns:1fr} .tt-grid{grid-template-columns:1fr} }

/* ---------- 报告打印区 ---------- */
.print-page{background:#fff;color:#1F2A33;max-width:760px;margin:0 auto;padding:34px 40px;border-radius:8px;box-shadow:var(--shadow-md)}
.print-page h1{font-size:22px;color:var(--c-primary);text-align:center;margin-bottom:4px}
.print-page .p-sub{text-align:center;color:#5B6675;font-size:13px;margin-bottom:20px}

/* 整班报告 · 封面汇总页 */
.print-cover{background:linear-gradient(160deg,var(--c-primary-d),var(--c-primary-l));color:#fff}
.print-cover h1{color:#fff;font-size:26px;margin-bottom:6px}
.print-cover .cover-brand{text-align:center;font-size:13px;letter-spacing:2px;opacity:.85;margin-bottom:14px}
.print-cover .p-sub{color:rgba(255,255,255,.88)}
.cover-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:20px 0}
.cover-stat{background:rgba(255,255,255,.13);border-radius:12px;padding:14px 8px;text-align:center}
.cover-stat .n{font-size:26px;font-weight:800;line-height:1.1}
.cover-stat .l{font-size:12px;opacity:.86;margin-top:5px}

/* 整班报告 · 每个孩子分页 */
.child-page{border-top:6px solid var(--c-primary)}
.child-head{display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap;border-bottom:1px solid var(--c-border);padding-bottom:10px;margin-bottom:14px}
.child-head .cn{font-size:18px;font-weight:800;display:flex;align-items:center;gap:9px}
.child-head .child-meta{font-size:12.5px;color:var(--c-text-2)}
.child-foot{margin-top:18px;padding-top:10px;border-top:1px dashed var(--c-border-strong);font-size:11px;color:var(--c-text-3);text-align:center}

@media print{
  body{background:#fff}
  .sidebar,.topbar,.no-print{display:none!important}
  .content{padding:0;max-width:100%}
  .print-page{box-shadow:none;max-width:100%}
  .report-hero{background:var(--c-primary-d)!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .badge,.grade-dot,.bar>i{ -webkit-print-color-adjust:exact;print-color-adjust:exact}
  .print-cover,.cover-stat{ -webkit-print-color-adjust:exact;print-color-adjust:exact}
  @page{size:A4;margin:8mm}
}
.mobile-nav{display:none}
@media(max-width:860px){
  .sidebar{position:fixed;left:0;top:0;transform:translateX(-100%);transition:.25s}
  .sidebar.open{transform:translateX(0)}
  .menu-btn{display:inline-flex}
  .mobile-nav{display:flex}
}

/* ---------- 登录页 ---------- */
body.logged-out .sidebar{display:none}
body.logged-out .topbar{background:transparent;border:none;box-shadow:none}
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;
  background:radial-gradient(1200px 600px at 50% -10%,var(--c-primary-l),transparent),linear-gradient(135deg,var(--c-primary),var(--c-primary-d));
}
.login-card{width:100%;max-width:380px;background:var(--c-surface);border-radius:var(--radius-lg);padding:30px 28px;
  box-shadow:var(--shadow-md);border:1px solid var(--c-border)}
.login-card .field{margin-bottom:13px}
.login-card h2{color:var(--c-text)}
.login-card .p-sub{font-size:12px;color:var(--c-text-3)}

/* ============================================================
 * 幼儿园体测报告 · 敲定版 A4 式（.kinder-report 命名空间）
 * 移植自 report-kindergarten-a4.html，品牌色固定，打印稳定
 * ============================================================ */
.kinder-report{font-family:var(--font);color:#1F2A33}
.kinder-report .top{background:linear-gradient(135deg,#114B50,#155E63);color:#fff;overflow:hidden;border-radius:12px}
.kinder-report .top-head{padding:20px 24px}
.kinder-report .title-row{display:flex;align-items:baseline;gap:7px;margin-bottom:8px}
.kinder-report .brand{font-size:30px;font-weight:900;letter-spacing:2px}
.kinder-report .title{font-size:30px;font-weight:800}
.kinder-report .top-info{font-size:13.5px;opacity:.92;display:flex;align-items:center;flex-wrap:wrap;gap:5px}
.kinder-report .top-info b{font-weight:700;font-size:14.5px;opacity:1}
.kinder-report .top-info .dot-sep{opacity:.6}
.kinder-report .top-info .pill{display:inline-block;background:rgba(255,255,255,.22);color:#fff;border-radius:10px;padding:1px 10px;font-size:11px;font-weight:500}
.kinder-report .basis{background:rgba(0,0,0,.18);padding:10px 22px;font-size:11.5px;color:rgba(255,255,255,.92);border-top:1px solid rgba(255,255,255,.1)}
.kinder-report .basis b{font-weight:600;color:#fff}
.kinder-report .basis .sub{display:block;margin-top:3px}
.kinder-report .score-header{background:linear-gradient(135deg,#F2F8F8,#EAF3F4);border:1px solid #E6EAEE;border-radius:12px;padding:20px 24px;margin-top:16px}
.kinder-report .score-main{display:flex;align-items:center;gap:24px}
.kinder-report .score-big{font-size:52px;font-weight:900;color:#155E63;line-height:1;letter-spacing:-1px}
.kinder-report .score-big sub{font-size:14px;font-weight:600;color:#98A2AE;margin-left:4px}
.kinder-report .score-divider{width:1px;height:48px;background:#E6EAEE;flex-shrink:0}
.kinder-report .score-info{flex:1}
.kinder-report .score-level{display:inline-block;font-size:15px;font-weight:700;color:#fff;padding:4px 16px;border-radius:6px;letter-spacing:1px}
.kinder-report .score-summary{margin-top:10px;font-size:13.5px;line-height:1.6;font-weight:500;border-top:1px solid #dce8ed;padding-top:12px}
.kinder-report .sec-title{font-size:15px;color:#155E63;font-weight:700;margin:26px 0 12px;padding-bottom:6px;border-bottom:2.5px solid #D8E2E6;letter-spacing:.5px;display:flex;align-items:center;gap:8px}
.kinder-report .sec-title::before{content:'';width:4px;height:16px;background:#155E63;border-radius:2px;display:inline-block}
.kinder-report .dim-item{margin:12px 0;padding:11px 16px;background:#fff;border:1px solid #E6EAEE;border-radius:9px;box-shadow:0 1px 2px rgba(18,28,38,.03)}
.kinder-report .dim-label{font-size:13.5px;color:#1F2A33;font-weight:600;margin-bottom:8px}
.kinder-report .dim-label .val{color:#E8833A;font-weight:700;font-size:13.5px}
.kinder-report .dim-ref{display:block;font-size:11px;color:#9AA5B1;font-weight:500;margin-top:2px;line-height:1.45}
.kinder-report .zone-bar{flex:1;height:30px;background:#fff;border:1.5px solid #DCE3E8;border-radius:7px;position:relative;margin:0 14px;overflow:hidden;display:flex;box-shadow:inset 0 1px 3px rgba(0,0,0,.04)}
.kinder-report .zone-bar .z{height:100%;border-right:1.5px solid #E2E8EC;display:flex;align-items:center;justify-content:center;font-size:11.5px;color:#555;font-weight:500}
.kinder-report .zone-bar .z:last-child{border-right:none}
/* 色带浅底：随方案B 一起加深一档。
   【文字色必须同步加深】原来四档都直接用 var(--c-*) 当字色，
   而浅底上的旧字色对比度其实只有 4.37:1（需努力档，没达 AA）。
   改成与新底色同族的深色后全部 ≥6.6:1。 */
.kinder-report .zone-bar .z.need{min-width:25%;color:#7A2E28;background:linear-gradient(180deg,#F0D5D0,#F7E4E0)}
.kinder-report .zone-bar .z.ok{min-width:25%;color:#5F4A0A;background:linear-gradient(180deg,#F2E2B8,#F8EDD4)}
.kinder-report .zone-bar .z.good{min-width:25%;color:#12454C;background:linear-gradient(180deg,#C2DEDE,#D6E9EA)}
.kinder-report .zone-bar .z.excellent{flex:1;color:#1E4A38;background:linear-gradient(180deg,#BCDCC8,#D2E8DC)}
.kinder-report .zone-bar .dot{position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-top:11px solid #E8833A;z-index:3;left:var(--pos);filter:drop-shadow(0 2px 3px rgba(232,131,58,.35))}

/* ===== 分值区间尺 · 分界值标注（2026-10-17 新增）=====
 * 需求：家长要知道「多少算合格、多少算优秀」，而不只是看一个分数。
 * 做法：把四档从「等宽」改成按真实分界线切分，并在下方标出三个分界值。
 *
 * 为什么四档不再等宽：等宽暗示「每提升一档难度相同」，那是假的。
 * 例如身高从 113→117 只差 4 厘米，117→120 差 3 厘米，但都很难；
 * 而走平衡木从 9.3→6.3 差 3 秒，6.3→5.1 差 1.2 秒，轻松得多。
 * 宽度必须反映真实距离。
 */
/* dim-row：彩条与评级并排（补回被弄丢的 flex 容器） */
.kinder-report .dim-row{display:flex;align-items:flex-start;gap:0}
/* dim-zone-wrap：彩条 + 分界值标注，纵向排布这一列 */
.kinder-report .dim-zone-wrap{
  display:flex;flex-direction:column;flex:1;min-width:0;
}
/* 彩条本体：撑满本列宽度 */
.kinder-report .dim-zone-wrap > .zone-bar{width:100%;margin:0 14px;flex:0 0 auto}
/* 不等宽档位：宽度由内联 style 给定，这里只需解除 CSS 里的等宽下限 */
.kinder-report .zone-bar--scaled .z{min-width:0!important;flex:0 0 auto}
/* 档位分界线：白色实线，让相邻两档的边界清晰可辨 */
.kinder-report .zone-bar .zone-edge{
  position:absolute;top:0;bottom:0;width:2px;margin-left:-1px;
  background:#fff;box-shadow:0 0 0 1px rgba(26,42,58,.16);border-radius:1px;z-index:2;
}
/* 分界值标注：与档位边界严格同坐标，保证「数字正对它上方那条线」 */
.kinder-report .zone-ticks{
  position:relative;height:14px;width:100%;margin:3px 14px 0;flex:0 0 auto;
}
.kinder-report .zone-tick{
  position:absolute;top:0;transform:translateX(-50%);
  display:flex;align-items:baseline;gap:1px;white-space:nowrap;
}
.kinder-report .zone-tick b{
  font-size:10.5px;font-weight:700;color:#5B6675;line-height:1.2;
  font-variant-numeric:tabular-nums;
}
.kinder-report .zone-tick em{font-style:normal;font-size:9.5px;color:#9AA5B1;font-weight:500}

/* ===== 体重 / BMI 的双向区间尺（2026-10-17 新增）=====
 * 与素质项的四档尺语义相反：这里是「两端差、中间好」，
 * 所以配色也反过来 —— 正常段用好色，两端用警示色。
 * 家长一眼能看出「偏轻」还是「偏重」，以及离正常区间差多少。
 */
/* 双向区间配色同样加深一档，四段对比度 6.17~6.79:1（全部 AA）。
   语义是「两端警示、中间正常」，所以正常段用绿、两端走黄→红。 */
.kinder-report .zone-bar--window .z.light{background:linear-gradient(180deg,#F2E2B8,#F8EDD4);color:#5F4A0A}
.kinder-report .zone-bar--window .z.normal{background:linear-gradient(180deg,#BCDCC8,#D2E8DC);color:#1E4A38}
.kinder-report .zone-bar--window .z.heavy{background:linear-gradient(180deg,#F0D5D0,#F7E4E0);color:#7A2E28}
.kinder-report .zone-bar--window .z.obese{background:linear-gradient(180deg,#E8B8B0,#F1CFC9);color:#6E241C}
.kinder-report .zone-bar--window .z{font-weight:600}
.kinder-report .lv{font-weight:700;font-size:15px;width:60px;text-align:right;flex-shrink:0}
.kinder-report .lv.ok{color:#2E7D5B}.kinder-report .lv.good{color:#1B7A85}.kinder-report .lv.weak{color:#C0473B}.kinder-report .lv.pass{color:#C9A227}.kinder-report .lv.untested{color:#9AA5B1}
.kinder-report .dim-untested{background:#F7F9FA;border-style:dashed}
.kinder-report .advice{margin-top:8px;border-radius:12px;padding:18px 20px;border:1px solid #E8DDD0;background:linear-gradient(135deg,#FCF6ED,#FBF3E6)}
.kinder-report .advice .h{font-size:15px;font-weight:700;margin-bottom:10px;color:#155E63}
.kinder-report .advice .lead{font-size:12.5px;color:#3D4852;line-height:1.7;margin-bottom:10px;font-weight:500;background:#fff;border:1px solid #EDE3D5;border-radius:8px;padding:9px 12px}
.kinder-report .advice .lead b{color:#155E63}
.kinder-report .advice .r3{margin-top:10px;padding-top:10px;border-top:1px dashed #E6D6A8}
.kinder-report .advice .r3:first-of-type{border-top:none;padding-top:0;margin-top:0}
.kinder-report .advice .r3 .k{font-size:12px;font-weight:700;color:#155E63;display:block;margin-bottom:2px}
.kinder-report .advice .r3 .v{font-size:13px;color:#3D4852;line-height:1.7}
.kinder-report .advice .r3 .v b{color:#1F2A33}
.kinder-report .profile-wrap{display:flex;gap:14px;align-items:flex-start;margin-top:4px;padding:14px 16px;border-radius:12px;background:linear-gradient(135deg,#EAF4F5,#E1EDEC);border:1px solid #CFE3E5}
.kinder-report .profile-left{flex:1.15;min-width:0}
.kinder-report .profile-right{flex:0 0 188px;display:flex;flex-direction:column;align-items:center}
.kinder-report .compare-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:6px 10px}
.kinder-report .cmp-item{background:#fff;border:1px solid #E6EAEE;border-radius:8px;padding:6px 9px}
.kinder-report .cmp-item .cn{font-size:10.5px;color:#5B6675;font-weight:600;margin-bottom:3px;display:block}
.kinder-report .cmp-bar-wrap{position:relative;height:7px;background:#f3f5f7;border-radius:4px;overflow:hidden;margin-bottom:3px}
.kinder-report .cmp-bar-me{height:100%;border-radius:4px;background:#155E63}
.kinder-report .cmp-bar-avg{position:absolute;top:0;height:100%;width:2px;background:#C0473B;z-index:2}
.kinder-report .cmp-vals{display:flex;justify-content:space-between;font-size:9.5px}
.kinder-report .cmp-vals .me{color:#155E63;font-weight:700}
.kinder-report .cmp-vals .av{color:#C0473B}
.kinder-report .radar{width:188px;max-width:100%;height:auto}
.kinder-report .radar-legend{display:flex;gap:16px;justify-content:center;font-size:11px;color:#5B6675;margin-top:4px}
.kinder-report .radar-legend i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-right:4px;vertical-align:-1px}
.kinder-report .pt-read b{color:#1F2A33}
.kinder-report .fit{border:1px solid #E6EAEE;border-radius:12px;overflow:hidden;margin-top:8px}
.kinder-report .fit .fh{background:linear-gradient(135deg,#E8F2F3,#DFEBEC);padding:12px 16px;font-size:13.5px;font-weight:700;color:#155E63;border-bottom:1px solid #E6EAEE}
.kinder-report .fit .fh small{display:block;font-size:10.5px;color:#5B6675;font-weight:400;margin-top:2px}
.kinder-report .fit table{width:100%;border-collapse:collapse;font-size:12.5px}
.kinder-report .fit th,.kinder-report .fit td{border-bottom:1px solid #f0f3f5;padding:9px 12px;text-align:left;vertical-align:top}
.kinder-report .fit th{background:#FAFBFC;color:#5B6675;font-weight:600;width:54px}
.kinder-report .fit td{color:#5B6675;line-height:1.6}
.kinder-report .fit td b{color:#1F2A33}
.kinder-report .fit tr:last-child td{border-bottom:none}
.kinder-report .fit .fnote{font-size:10.5px;color:#98A2AE;padding:8px 14px;background:#FAFBFC;border-top:1px solid #f0f3f5}
.kinder-report .parent-say{margin-top:16px;padding:14px 20px;border-radius:12px;background:linear-gradient(135deg,#EEF6F7,#E4F0F2);border:1px solid #D8E2E6}
.kinder-report .parent-say .ph{font-size:14px;font-weight:700;color:#155E63;margin-bottom:6px;letter-spacing:.3px}
.kinder-report .parent-say .pv{font-size:13px;line-height:1.8;color:#3D4852}
.kinder-report .parent-say .pv b{color:#1F2A33}
.kinder-report .parent-say .pq{display:block;margin-top:10px;padding-top:10px;border-top:1px dashed #C8DDD8;font-size:14px;font-weight:700;color:#155E63;text-align:center;letter-spacing:.5px}
.kinder-report .qr-row{display:flex;align-items:center;gap:14px;margin-top:18px;border-top:1.5px solid #E6EAEE;padding-top:16px}
.kinder-report .qr{border:1px solid #E6EAEE;border-radius:8px;padding:4px;background:#fff;width:64px;height:64px;flex-shrink:0}
.kinder-report .qt{font-size:11.5px;color:#5B6675;line-height:1.55}
.kinder-report .qt b{color:#1F2A33}
.kinder-report .qt .sm{display:block;font-size:9.5px;color:#98A2AE;margin-top:3px}
.kinder-report .foot{font-size:10.5px;color:#98A2AE;padding-top:12px;line-height:1.7;border-top:1px solid #f0f3f5;margin-top:14px;text-align:center}
.kinder-report .class-train{margin-top:8px;padding:14px 18px;border-radius:12px;background:linear-gradient(135deg,#FBF3E6,#F8EBD3);border:1px solid #E8DDD0}
.kinder-report .class-train .ct-lead{font-size:13px;color:#3D4852;line-height:1.7;margin-bottom:10px;font-weight:500}
.kinder-report .class-train .ct-list{list-style:none;margin:0;padding:0}
.kinder-report .class-train .ct-list li{padding:10px 12px;margin:6px 0;background:#fff;border:1px solid #EDE3D5;border-radius:8px}
.kinder-report .class-train .ct-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}
.kinder-report .class-train .ct-name{font-size:13.5px;font-weight:700;color:#155E63}
.kinder-report .class-train .ct-stat{font-size:11.5px;color:#C0473B;font-weight:700}
.kinder-report .class-train .ct-act{font-size:12px;color:#3D4852;line-height:1.6}
.kinder-report .class-train .ct-foot{font-size:10.5px;color:#98A2AE;margin-top:8px;padding-top:8px;border-top:1px dashed #E6D6A8}
.kinder-report .class-train.balanced{background:linear-gradient(135deg,#E0F0F1,#D8E8EA);border-color:#B8D4D6}
/* r3: 薄弱项学员名 */
.focus-names{font-size:12px;color:#5B6675;padding:4px 10px;background:rgba(255,255,255,.7);border-radius:6px;margin-top:4px;display:inline-block}
/* r4: 卡片式运动发展建议 */
.class-train-v2{margin-top:10px}
.ctv2-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.ct-card{background:#fff;border:1px solid #E8DDD0;border-radius:12px;overflow:hidden;transition:box-shadow .2s}
.ct-card:hover{box-shadow:var(--shadow)}
.ct-card-head{display:flex;align-items:center;gap:8px;padding:12px 16px;background:linear-gradient(135deg,#FBF3E6,#F8EBD3);border-bottom:1px solid #EDE3D5}
.ct-card-head .ct-icon{font-size:20px}
.ct-card-head .ct-card-name{font-size:15px;font-weight:800;color:#155E63;flex:1}
.ct-card-head .ct-card-stat{font-size:12px;color:#C0473B;font-weight:700;background:#fff;padding:2px 10px;border-radius:10px}
.ct-card-students{font-size:11.5px;color:#7A8A95;padding:6px 16px;background:#FAFBFC;border-bottom:1px solid #F2F5F7}
.ct-card-body{padding:14px 16px}
.ct-card-label{font-size:11.5px;font-weight:700;color:#E8833A;margin-bottom:3px}
.ct-card-text{font-size:12.5px;color:#3D4852;line-height:1.65}
/* r5: 本学期重点训练 */
.sec-divider{height:1px;background:#DCE6E8;border:none;margin:26px 0}
.semester-box{margin-top:18px;padding:18px 22px;border-radius:12px;background:linear-gradient(135deg,#EEF4F8,#E4EDF2);border:1px solid #C8D8E0}
.sem-title{font-size:15px;font-weight:800;color:#155E63;margin-bottom:12px;display:flex;align-items:center;gap:6px}
.sem-tags{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.sem-tag{display:inline-block;padding:6px 16px;background:#fff;border:2px solid #155E63;border-radius:20px;font-size:13px;font-weight:700;color:#155E63}
.sem-note{font-size:12px;color:#5B6675;line-height:1.7}
/* r5: 重点关注学员 */
.key-students{margin-top:18px;padding:18px 22px;border-radius:12px;background:linear-gradient(135deg,#FEF6F0,#FDF0E8);border:1px solid #E8DDD0}
.ks-title{font-size:15px;font-weight:800;color:#C0473B;margin-bottom:12px}
.ks-tbl{margin-top:8px}
.ks-tbl th{background:#FEF0E6!important}
.ks-tbl td{padding:10px 12px!important}
.ks-foot{margin-top:10px;padding-top:10px;border-top:1px dashed #E6D6A8;font-size:11px;color:#98A2AE}
.kinder-report .print-page{break-after:page}
.kinder-report .print-page:last-child{break-after:auto}
/* 批量打印：每份个人报告之间强制分页，避免挤在同一张纸 */
.batch-child{page-break-before:always;break-before:page}
.batch-note{margin:14px 4px;padding:10px 14px;background:#EAF3F4;border:1px solid #CFE3E5;border-radius:8px;font-size:13px;color:#155E63}
@media print{
  .kinder-report .top,.kinder-report .score-header,.kinder-report .advice,.kinder-report .fit .fh,.kinder-report .pc.ref,.kinder-report .print-page,.kinder-report .dim-item,.kinder-report .zone-bar .z,.kinder-report .cmp-bar-me,.kinder-report .qr,.kinder-report .basis{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .kinder-report .print-page{box-shadow:none;border-radius:0;break-after:page;page-break-after:after}
  .kinder-report .score-level{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  /* —— v2.14 精准手术：基于真实测量数据，目标 page1 ≤1000px —— */
  .kinder-report{font-size:10.5px;line-height:1.38}
  /* 头部: 145→90px */
  .kinder-report .top-head{padding:7px 16px!important}
  .kinder-report .brand,.kinder-report .title{font-size:24px!important}
  .kinder-report .top-info{font-size:10px!important}
  .kinder-report .top-info b{font-size:11px!important}
  .kinder-report .top-info .pill{font-size:9px!important;padding:0 7px!important}
  .kinder-report .basis{padding:4px 16px!important;font-size:9.5px!important}
  /* 综合分区: 211→130px */
  .kinder-report .score-header{padding:10px 16px!important;margin-top:8px!important}
  .kinder-report .score-big{font-size:28px!important}
  .kinder-report .score-big sub{font-size:11px!important}
  .kinder-report .score-divider{height:32px!important}
  .kinder-report .score-level{font-size:13px!important;padding:2px 14px!important}
  .kinder-report .score-summary{font-size:10.5px!important;margin-top:5px!important;padding-top:6px!important;line-height:1.4!important}
  /* 标题: 31→20px */
  .kinder-report .sec-title{margin:10px 0 5px!important;font-size:12px!important;padding-bottom:3px!important}
  /* 维度条: 83→40px/条 ×9 = 360px (从747px砍掉387px!) */
  .kinder-report .dim-item{padding:3px 10px!important;margin:2px 0!important;border-radius:6px!important}
.kinder-report .dim-label{font-size:10px!important;margin-bottom:1px!important}
.kinder-report .dim-label .val{font-size:10px!important}
.kinder-report .dim-ref{font-size:9px!important;margin-top:1px!important}
  .kinder-report .zone-bar{height:16px!important;margin:0 8px!important;border-radius:5px!important}
  .kinder-report .zone-bar .z{font-size:9px!important}
  .kinder-report .zone-bar .dot{border-left-width:4px!important;border-top-width:7px!important}
  .kinder-report .zone-ticks{height:11px!important;margin:2px 8px 0!important}
  .kinder-report .zone-tick b{font-size:8.5px!important}
  .kinder-report .zone-tick em{display:none!important}
  .kinder-report .zone-bar .zone-edge{box-shadow:0 0 0 1px #5B6675!important}
  .kinder-report .zone-bar--window .z.light{background:#eee!important;color:#000!important}
  .kinder-report .zone-bar--window .z.normal{background:#ccc!important;color:#000!important}
  .kinder-report .zone-bar--window .z.heavy{background:#e0e0e0!important;color:#000!important}
  .kinder-report .zone-bar--window .z.obese{background:#f0f0f0!important;color:#000!important}
  .kinder-report .lv{font-size:11px!important;width:42px!important}
  /* 参考说明: 49→32px */
  .kinder-report .ref-note{font-size:9px!important;margin:4px 0!important;line-height:1.3!important;display:block}
  /* 建议区: 500→260px (砍掉240px!) */
  .kinder-report .advice{padding:11px 18px!important;margin-top:8px!important;border-radius:12px!important}
  .kinder-report .advice .h{font-size:14px!important;margin-bottom:6px!important}
  .kinder-report .advice .lead{font-size:11.5px!important;line-height:1.6!important;padding:7px 12px!important;margin-bottom:7px!important;border-radius:7px!important}
  .kinder-report .advice .r3{padding-top:4px!important;margin-top:4px!important}
  .kinder-report .advice .r3 .v{font-size:11.5px!important;line-height:1.65!important}
  .kinder-report .advice .r3 .k{font-size:11.5px!important;margin-bottom:3px!important}
  /* page2: 自然排满 */
  .kinder-report .profile-right{flex:0 0 145px}
  .kinder-report .radar{width:145px}
  .kinder-report .radar-legend{font-size:9px}
  .kinder-report .fit{margin-top:18px!important}
  .kinder-report .fit .fh{padding:9px 14px!important;font-size:14px!important}
  .kinder-report .fit table{font-size:11px!important}
  .kinder-report .fit th,.kinder-report .fit td{padding:5px 10px!important}
  .kinder-report .cmp-item{padding:3px 6px!important}
  .kinder-report .cmp-vals{font-size:8.5px!important}
  .kinder-report .qr-row{margin-top:10px!important;padding-top:10px!important}
  .kinder-report .qr{width:48px!important;height:48px!important}
  .kinder-report .qt{font-size:9.5px!important}
  .kinder-report .foot{font-size:10px!important;padding-top:8px!important;margin-top:8px!important}
  .kinder-report .parent-say{margin-top:14px!important;padding:10px 16px!important;border-radius:10px!important}
  .kinder-report .parent-say .ph{font-size:12.5px!important;margin-bottom:4px!important}
  .kinder-report .parent-say .pv{font-size:11px!important;line-height:1.65!important}
  .kinder-report .parent-say .pq{font-size:12px!important;font-weight:700!important;color:#155E63!important;display:block!important;margin-top:8px!important;padding-top:8px!important;border-top:1px dashed #C8DDD8!important;text-align:center!important}
  /* 防止区块被跨页截断 */
  .kinder-report .dim-item,
  .kinder-report .advice,
  .kinder-report .sec-title,
  .kinder-report .fit,
  .kinder-report .profile-wrap,
  .kinder-report .parent-say{page-break-inside:avoid;break-inside:avoid}
  .ct-card,.semester-box,.key-students,.class-train-v2,.fg-card,.tt-card,.sem-phase{page-break-inside:avoid;break-inside:avoid}
  .ct-card-head,.fg-head,.tt-head,.sem-phase-head{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .tt-freq{border:1.5px solid #1B7A85!important;padding:2px 8px!important;font-size:10.5px!important}
  .sem-phase-tag{-webkit-print-color-adjust:exact;print-color-adjust:exact!important}
  .sem-tag{border:1.5px solid #155E63!important;padding:4px 12px!important;font-size:11px!important}
}

/* ============================================================
 * 双板块改造 · 后台层（index.html）令牌桥
 * -------------------------------------------------------------
 * 【为什么需要这一段】
 * report-dual.css 的类名（.rp-sector / .rp-intake / .rp-mgr）全部用
 * var(--rp-*) 取色，而这些 --rp-* 令牌原本定义在 report.css 的 :root，
 * 而 report.css 只有 report.html 加载 —— 后台页只加载 style.css。
 * 直接把 report.css 也挂上会连带引入 246 个 .rp-* 规则（报告专用版式、
 * A4 打印规则），会污染后台布局。
 *
 * 【做法】
 * 只在 .kg-dual-scope 作用域内补齐 report-dual.css 用到的 35 个 --rp-*，
 * 全部薄别名指向本文件既有的 --c-* —— 亮/暗两套主题自动跟随，
 * 不新增任何色值，也不会影响 report.html（那边不加载 style.css）。
 * ============================================================ */
.kg-dual-scope{
  /* —— 底层别名：与 report.css §0 同序同义，保证两页观感一致 —— */
  --rp-bg:            var(--c-bg);
  --rp-surface:       var(--c-surface);
  --rp-surface-2:     var(--c-surface-2);
  --rp-border:        var(--c-border);
  --rp-border-strong: var(--c-border-strong);
  --rp-line:          var(--c-border);
  --rp-text:          var(--c-text);
  --rp-text-2:        var(--c-text-2);
  --rp-text-3:        var(--c-text-3);

  --rp-primary:       var(--c-primary);
  --rp-primary-d:     var(--c-primary-d);
  --rp-primary-l:     var(--c-primary-l);
  --rp-accent:        var(--c-accent);
  --rp-accent-d:      var(--c-accent-d);
  --rp-accent-ink:    var(--c-accent-ink);

  --rp-excellent:     var(--c-excellent);
  --rp-good:          var(--c-good);
  --rp-pass:          var(--c-pass);
  --rp-weak:          var(--c-weak);
  --rp-weak-solid:    var(--c-weak-solid);
  --rp-untested:      #B7C0CA;              /* 未测中性灰，与 report.css 同值 */

  --rp-on-excellent:  var(--c-on-excellent);
  --rp-on-good:       var(--c-on-good);
  --rp-on-pass:       var(--c-on-pass);
  --rp-on-weak:       var(--c-on-weak);
  --rp-on-primary:    var(--c-on-primary);
  --rp-on-accent:     var(--c-on-accent);
  --rp-on-weak-solid: var(--c-on-weak-solid);
  --rp-on-untested:   var(--c-text-3);

  --rp-ring-primary:  var(--ring-primary);
  --rp-ring-accent:   var(--ring-accent);
  --rp-ring-weak:     var(--ring-weak);
  --rp-fill-primary:  var(--fill-primary);
  --rp-fill-accent:   var(--ring-accent);
  --rp-fill-weak:     var(--fill-weak);
  --rp-fill-muted:    var(--fill-muted);

  --rp-radius:        var(--radius);
  --rp-radius-sm:     var(--radius-sm);
  --rp-radius-lg:     var(--radius-lg);
  --rp-shadow-sm:     var(--shadow-sm);
  --rp-shadow:        var(--shadow);
  --rp-shadow-md:     var(--shadow-md);
  --rp-shadow-primary:var(--shadow-primary);
  --rp-shadow-accent: var(--shadow-accent);

  --rp-font:      var(--font);
  --rp-font-num:  var(--font-num);
  --rp-tap: 44px;
}

/* ============================================================
 * 双板块 · 后台侧栏（随板块切换的两套分组）
 * -------------------------------------------------------------
 * 【产品要求】两个板块的学员数据不打通 —— 这必须在「导航」这一层就成立：
 * 侧栏整体换组、互不可见。否则园所老师一进系统就看到机构入口，
 * 会以为可以互相继承数据。
 * 实现：两组并列写进 DOM，用 [data-nav-set] 显隐切换（见 views.js 的
 * Sector.apply()）。不用 display:none 之外的隐藏方案 —— 侧栏条目少，
 * 一次性切换代价可忽略，换来的是「切换零重排、无闪动」。
 * ============================================================ */
.nav-set{display:none}
.nav-set.is-on{display:block}

/* 板块标识条：侧栏顶部告诉用户"我现在在哪个板块里"，并提供一键互换。
   这是「必须一键可换」的可发现性载体 —— 藏在设置里等于没有。 */
.sector-tab{
  display:flex;align-items:center;gap:7px;
  margin:2px 3px 12px;padding:8px 10px;
  border-radius:var(--radius-sm);
  background:rgba(255,255,255,.10);
  border:1px solid rgba(255,255,255,.14);
  color:#fff;font-family:inherit;font-size:12px;font-weight:700;
  text-align:left;width:calc(100% - 6px);
  transition:background .18s,border-color .18s;
}
.sector-tab:hover{background:rgba(255,255,255,.17)}
.sector-tab:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(255,255,255,.28)}
.sector-tab__ico{font-size:14px;line-height:1;flex-shrink:0}
.sector-tab__b{flex:1;min-width:0}
.sector-tab__cur{display:block;font-size:10.5px;font-weight:600;color:rgba(255,255,255,.62);margin-top:2px}
.sector-tab__go{flex-shrink:0;font-size:11px;color:rgba(255,255,255,.6);font-weight:700}

/* 板块专属分组标题色：园所亮青 / 机构主青，与 report-dual 的 --rpd-* 同源 */
.nav-set--kind .nav-group-title{color:rgba(120,222,228,.82)}
.nav-set--org  .nav-group-title{color:rgba(79,199,205,.86)}

/* ============================================================
 * 双板块 · 后台侧对 report-dual.css 的最小修正
 * -------------------------------------------------------------
 * report-dual.css 是视觉组交付、本轮我无改动权，故修正写在这里。
 * 只用「后台侧作用域」限定（.kg-dual-scope），不会影响 report.html。
 *
 * 【已撤回】下面曾有两条针对 .rp-sector__dots 的修正（点阵说明文字被压成竖排）。
 * 视觉组已在 report-dual.css 源头修好（.rp-sector__dots 加 flex-wrap:nowrap、
 * ::after 加 flex-shrink:0 + white-space:nowrap，并在 <330px 时让点阵换行）。
 * 故此处撤回 —— 同一行为在两个文件里各写一份，后改的那份必然变成死代码。
 * ============================================================ */

/* ② 机构侧分组标题「机构体测 · 一对一业务」在窄侧栏下会挤成两行，
   与系统组的分组标题不一致。统一单行省略，保持侧栏节奏一致。
   注意：侧栏在 #view 之外，故此处不能用 .kg-dual-scope 限定
   （那是有意为之 —— 分组标题是 .nav-set 自己的类，全站仅此一处使用）。 */
.nav-set--org .nav-group-title,
.nav-set--kind .nav-group-title{
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

/* ============================================================
 * 测评方法与标准页（#/methods）
 * 仅引用既有 --c-* / --ring-* / --radius* / --font-num 令牌，不新造色值。
 * 布局 / 语义钩子类，全站仅此页使用。
 * ============================================================ */

/* 枢纽第三入口：板块选择页内「测评方法与标准」全宽中立入口带（中性，不用 kind/org 色） */
.rp-method-entry{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:14px 0;padding:14px 18px;border:1px solid var(--c-border);border-left:3px solid var(--c-primary-l);border-radius:var(--radius);background:var(--c-surface-2);color:var(--c-text);text-decoration:none;font-weight:700}
.rp-method-entry:hover{background:var(--c-surface)}
/* 标准库页内 CTA 卡片：左 accent 边，引导去方法页 */
.rp-cta{border-left:3px solid var(--c-primary-l)}
.rp-cta p{margin:6px 0 12px;font-size:13px;color:var(--c-text-2);line-height:1.6}

/* 方法页：逐项卡片（网格内等高，阈值块贴底对齐） */
.ms-item{display:flex;flex-direction:column}
.ms-item__idx{font-family:var(--font-num);font-size:13px;font-weight:800;color:var(--c-primary);margin-right:2px}
/* 场地布置块：教练照此能把场地布置出来（器械规格 + 画法 + 注意事项）。
   用浅底+ 左侧主色边与下方「测试方法」块拉开层级，避免三块文字糊成一片。 */
.ms-venue{margin-top:10px;padding:11px 13px;background:var(--c-surface-2);border-left:3px solid var(--c-primary-l);border-radius:var(--radius-sm)}
.ms-venue h3{margin:0 0 6px;font-size:12.5px;font-weight:700;color:var(--c-primary)}
.ms-venue__head{margin:0;font-size:12.5px;line-height:1.7;color:var(--c-text)}
/* 器材招标参数等「依据来源」注：橙色 = 采购/标准出处，与机构色同源 */
.ms-venue__note{margin:8px 0 0;padding:7px 9px;font-size:11.5px;line-height:1.6;color:var(--c-accent-ink);background:var(--ring-accent);border-radius:var(--radius-sm)}
.ms-venue .ms-list{margin-top:9px}
.ms-venue .ms-list li{font-size:12.5px;line-height:1.6}
/* 摆位坐标表：只列点位，列窄、内容左对齐 */
.ms-layout{width:100%;max-width:300px;margin-top:10px;border-collapse:collapse;font-size:12px}
.ms-layout th,.ms-layout td{border:1px solid var(--c-border);padding:5px 9px;text-align:left}
.ms-layout th{background:var(--c-surface);color:var(--c-text-2);font-weight:700;font-size:11.5px}
.ms-method{margin-top:14px}
.ms-list{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}
.ms-list li{font-size:13px;line-height:1.6;color:var(--c-text)}
.ms-list b{color:var(--c-text-2);font-weight:700;margin-right:4px}
.ms-standard{margin-top:auto;padding-top:14px;border-top:1px solid var(--c-border)}
.ms-fig{margin:12px 0 0;border:1px dashed var(--c-border-strong);background:var(--c-surface-2);border-radius:var(--radius-sm);padding:10px;text-align:center;color:var(--c-text-3);font-size:12px}
.ms-fig img{display:block;width:100%;max-height:160px;object-fit:contain;background:var(--c-surface);border-radius:var(--radius-sm)}
.ms-fig figcaption{margin-top:6px;font-size:11.5px;color:var(--c-text-3)}

/* 机构专享：体姿体态评估整节（accent 色系，复用 --ring-accent / --c-accent-ink） */
.ms-posture{border:1px solid var(--c-accent);border-left:3px solid var(--c-accent);background:var(--ring-accent)}
.ms-posture h2::before{background:var(--c-accent)}
.ms-posture__tag{background:var(--ring-accent);color:var(--c-accent-ink);border:1px solid var(--c-accent);border-radius:20px;padding:2px 9px;font-size:11px;font-weight:700;margin-left:auto}
.ms-posture__grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:12px}
.ms-posture__item{background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:12px}
.ms-posture__item h3{font-size:13.5px;font-weight:700;margin:0 0 6px;color:var(--c-text)}

/* 页内板块分段控件（园所 / 机构）：仅控制本页体姿段显隐，复用既有令牌 */
.ms-sector{display:inline-flex;background:var(--c-surface-2);border:1px solid var(--c-border);border-radius:20px;padding:3px;gap:2px;margin-top:12px}
.ms-sector__btn{border:none;background:none;padding:6px 16px;border-radius:16px;font-size:12.5px;color:var(--c-text-2);font-weight:600;transition:.15s;cursor:pointer}
.ms-sector__btn:hover{color:var(--c-primary-l)}
.ms-sector__btn.on{background:var(--c-surface);color:var(--c-primary);box-shadow:var(--shadow-sm)}

/* ============================================================
 * 测评方法与标准页 · v2（打印 / 导出 / 返回）
 * -------------------------------------------------------------
 * 【作用域纪律】下面所有 @media print 规则一律带 `.ms-doc` 前缀。
 * 原因：本页的 .grid-3 / .tbl / .note / .card 全是**全站共用类**，
 * 整班批量打印（views.js 2xxx 的 print-page）也吃这些类。
 * 一旦裸写 `.grid-3{grid-template-columns:...}` 或 `.tbl th{...}`，
 * 就会污染整班打印的排版 —— 那是另一个业务闭环，不能被这一页带崩。
 * 与 report-dual.css §8 同纪律。
 * ============================================================ */

/* ---------- 屏显：口径说明与工具条 ---------- */

/* 页头工具条：直接放进 .card h2 行内。
   .card h2 已是 display:flex;align-items:center;gap:9px，
   margin-left:auto 即可推到右侧 —— 零新增容器、零新增 flex 父级。 */
.ms-tools{margin-left:auto;display:flex;align-items:center;gap:8px}
.ms-tools__back{margin-right:8px}
/* ⚠️ 必需：全站 .btn 内没有 .ic 尺寸规则（.ic 只在 .nav a / .kpi 里有定义），
   无宽高的内联 SVG 会被 Chrome 当成 replaced element 渲染成 300×150 撑爆按钮。 */
.ms-tools .ic{width:15px;height:15px;flex-shrink:0}

/* 页头那一行裸文本说明（替代原 .note 段落）。
   用 --c-text-2 不用 --c-text-3：后者在白底上对比度不足 4.5:1，正文读不清。 */
.ms-sub{margin:-4px 0 0;font-size:12px;line-height:1.6;color:var(--c-text-2)}

/* 口径说明：回答「这两个下拉是做什么用的」 */
.ms-scope{margin-top:10px;font-size:11.5px;line-height:1.6;color:var(--c-text-3)}
.ms-scope b{color:var(--c-primary);font-weight:700}
/* 口径切换后的状态文字。刻意不用 UI.toast：toast 2.6s 自动消失，
   连续切换性别/年龄组时是纯干扰（而且读屏用户根本拿不到）。 */
.ms-state{display:block;margin-top:2px;min-height:1em;font-size:11.5px;line-height:1.6;color:var(--c-text-3)}
.ms-state:empty{display:none}

/* 打印页眉：屏显隐藏、仅打印出现（结构必须是 .ms-hd 的兄弟，见 views.js 契约 3） */
.ms-printhead{display:none}

/* 打印锚点：整页内容的作用域根 */
.ms-doc{position:relative}

/* 阈值表标题行上的口径戳：屏显隐藏。
   理由：口径是**数字的属性**不是页的属性，纸面翻到第 2/3 页时
   读者看得到项目名却看不到口径，戳必须与数字同屏（每卡一枚）。 */
.ms-stamp{display:none}

/* 落款（复用全局 .child-foot，屏显就是文档页脚一行） */
.ms-foot{margin-top:4px}

/* ---------- 窄屏 ---------- */
@media(max-width:640px){
  .ms-hd h2{flex-wrap:wrap}
  .ms-tools{flex-basis:100%;margin-left:0;justify-content:flex-start;flex-wrap:wrap}
  .ms-tools__back{margin-right:0}
  /* 触控底线：当前 padding:6px 16px 约 30px，远低于 44px */
  .ms-sector__btn{min-height:44px}
}

/* ============================================================
 * 打印态（@page 严禁改动 —— A4/8mm 是全站基线，整班批量打印依赖它）
 * ============================================================ */
@media print{
  /* ---------- 深色主题兜底（必做） ----------
     全局打印规则只有 body{background:#fff}，而 --c-* 令牌在
     [data-theme="dark"] 下仍是暗色值 ⇒ 深色用户打印会**白底白字整份空白**。

     ⚠️ 为什么挂在 .ms-doc 而不是规格里建议的 .kg-dual-scope（实测踩坑）：
     .kg-dual-scope 就是 #view 本身，整班批量打印 / 家长报告 / 园所报告全在它里面。
     把令牌覆盖写到它身上，会连带把这些页面的语义色（--c-primary 封面渐变、
     --c-excellent/good/pass/weak 徽章、.report-hero）在打印时一起打成黑灰 ——
     实测确认 tokPrimary 变 #000、tokExcellent 变 #000，即整班打印视觉回归。
     而"继承值永远输给元素自身声明"这条规则对 .ms-doc 同样成立
     （[data-theme="dark"] 在 <html> 上，.ms-doc 是它的后代，自身声明照样赢），
     所以挂在 .ms-doc 上既拿到深色兜底，又零外溢。这才是本页作用域纪律的本意。 */
  .ms-doc{
    --c-bg:#fff; --c-surface:#fff; --c-surface-2:#F2F2F2;
    --c-border:#B9B9B9; --c-border-strong:#8C8C8C;
    --c-text:#000; --c-text-2:#333; --c-text-3:#555;
    --c-primary:#000; --c-primary-d:#000; --c-primary-l:#333;
    --c-accent:#000; --c-accent-d:#000; --c-accent-ink:#000;
    --c-excellent:#000; --c-good:#000; --c-pass:#000; --c-weak:#000;
    /* ⚠️ 语义色成对覆盖：--c-pass 变黑必须同时把 --c-on-pass 提为白，
       否则浅色主题的深墨前景 #3A2F00 会印成「黑底黑字」。四条评级色同理。 */
    --c-on-excellent:#fff; --c-on-good:#fff; --c-on-pass:#fff; --c-on-weak:#fff;
    --c-weak-solid:#000; --c-on-weak-solid:#fff; --c-on-primary:#fff; --c-on-accent:#fff;
    --ring-primary:#fff; --ring-weak:#fff; --ring-accent:#fff;
    --fill-primary:#fff; --fill-weak:#fff; --fill-muted:#fff;
    --shadow-sm:none; --shadow:none; --shadow-md:none;
    --shadow-primary:none; --shadow-accent:none; --shadow-weak:none;
    color:#000;   /* 令牌覆盖只解决"谁去读 var(--c-text)"，解决不了"继承 color 本身"：
                    body 上已解析好的 color:#E7EEF1（暗色前景）会继承给 .ms-doc /
                    .tbl td 这些没有自己 color 的元素 —— 白卡片 + 白字 = 空白。*/
    background:#fff;
  }

  /* ---------- 退场 / 现身 ---------- */
  /* 头部卡整块不上纸：标题、口径说明、筛选器、分段控件、工具条全都没意义 */
  .ms-doc .ms-hd{display:none!important}
  .ms-doc .ms-printhead{
    display:flex!important;justify-content:space-between;align-items:flex-end;gap:10pt;
    border-bottom:.75pt solid #999;padding-bottom:4pt;margin:0 0 8pt;
  }
  .ms-doc .ms-printhead b{display:block;font-size:12pt;color:#000;line-height:1.3}
  .ms-doc .ms-printhead span{display:block;font-size:8.5pt;color:#555;line-height:1.4}
  .ms-doc .ms-printhead__l{max-width:70%}
  .ms-doc .ms-printhead__r{text-align:right;white-space:nowrap}

  /* ---------- 分页防撕裂 ---------- */
  .ms-doc .ms-item{break-inside:avoid;page-break-inside:avoid;border-radius:2pt}
  .ms-doc .ms-item h2{break-after:avoid;page-break-after:avoid;font-size:11pt}
  .ms-doc .ms-item h3{break-after:avoid;page-break-after:avoid;font-size:9.5pt}
  .ms-doc .ms-thr tr,.ms-doc .ms-posture__item{break-inside:avoid;page-break-inside:avoid}
  /* 显式声明打印列数：不依赖打印视口是否命中 980px 断点
     （headless Chrome 的打印视口宽度不可靠，媒体查询常常不按预期命中）。 */
  .ms-doc .ms-grid-3{grid-template-columns:repeat(2,1fr)!important;gap:6pt!important}

  /* ---------- 口径戳上纸 ---------- */
  .ms-doc .ms-stamp{
    display:inline-block!important;margin-left:6pt;padding:0 4pt;
    border:.5pt solid #999;border-radius:2pt;background:#F2F2F2;
    font-size:7.5pt;font-weight:400;color:#000;vertical-align:1pt;
  }

  /* ---------- 器械占位图「塌陷空壳」而非整体 display:none ----------
     整体 display:none 的话，将来补真图时纸面会**静默少一块**。
     这里只去掉框/底/内边距/外边距 —— 壳内只剩 display:none 的 img 与
     被隐藏的文案，无内容 ⇒ 高度自然归零（塌陷空壳）。
     ⚠️ 刻意**不写 height:0 + overflow:hidden**：那样真图接入后会被裁掉，
     而规格要求「真图接入时由 JS 去掉 img 内联 display:none，本段零改动即生效」。
     「器械示意 · 待补充」是内部待办，不上纸。

     ⚠️ 也刻意**不写 font-size:0 / line-height:0**（实测它们是冗余的）：
     占位文案已被下面的 span{display:none} 干掉，壳内本就无内容，实测
     加与不加 font-size/line-height 两版壳高都是 0px。但 line-height:0 会被
     将来可能加的 <figcaption> 继承（style.css 的 .ms-fig figcaption 只显式
     声明了 font-size，没声明 line-height）⇒ 行盒高度 0、文字压扁叠在一起，
     而且「看起来有内容」极难排查。去掉这两行后，「零改动即生效」对 img 与
     figcaption 同时成立。 */
  .ms-doc .ms-fig{border:0!important;background:none!important;padding:0!important;margin:0!important}
  .ms-doc .ms-fig span{display:none!important}

  /* ---------- 徽章灰阶安全 ----------
     四档评级色（优秀绿/良好青/合格金/待加强红）在黑白打印会塌成同一坨黑，
     读者无法区分档位。故统一改成白底黑字 + 细描边，档位靠文字本身承载。 */
  .ms-doc .badge{
    background:#fff!important;color:#000!important;
    border:.5pt solid #999!important;border-radius:2pt!important;
    padding:1pt 5pt!important;font-size:8pt;
  }
  /* 类别标签（力量类/柔韧类…）用虚线描边，保留「这是类别标签不是评级」的区分 */
  .ms-doc .badge.muted{border-style:dashed!important;background:#F2F2F2!important}
  .ms-doc .tbl th{
    background:#F2F2F2!important;color:#000!important;
    border-bottom:.75pt solid #8C8C8C!important;
    font-size:8.5pt;padding:4pt 6pt!important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
  }
  .ms-doc .tbl td{font-size:9pt;padding:3pt 6pt!important;border-bottom:.5pt solid #B9B9B9!important}

  /* ---------- 体态段 ----------
     橙底在纸上无意义（没有灰阶对应），改白底 + 黑色左边框保住
     「机构专享」的分区语义。其内部 <p> 用了内联 font-size/color
     （views.js postureHtml），覆盖必须 !important。 */
  .ms-doc .ms-posture{
    background:#fff!important;border:.5pt solid #999!important;
    border-left:1.5pt solid #000!important;border-radius:2pt!important;
    break-inside:avoid;page-break-inside:avoid;
  }
  .ms-doc .ms-posture h2{color:#000!important;font-size:11.5pt}
  .ms-doc .ms-posture h2::before{background:#000!important}
  .ms-doc .ms-posture p{font-size:9pt!important;color:#333!important;line-height:1.6!important}
  .ms-doc .ms-posture__grid{gap:5pt!important}
  .ms-doc .ms-posture__item{background:#fff!important;border:.5pt solid #B9B9B9!important;border-radius:2pt!important;padding:6pt!important}
  .ms-doc .ms-posture__item h3{font-size:9.5pt!important}
  .ms-doc .ms-posture__tag{background:#fff!important;color:#000!important;border:.5pt solid #000!important}

  /* ---------- 其他 ---------- */
  /* ---------- .ref-note：打印态只留来源半句 ----------
     「具体阈值按性别 + 年龄组在 标准库 查询」这半句在纸上有两个问题：
       1. 死指针 —— 拿纸的人无处可去「标准库」；
       2. 与紧邻上方的 .ms-stamp「口径 男 · 3岁」语义重复且自相矛盾
          ——卡片已声明了口径，又说「按性别+年龄组去别处查」。
     故打印态整句撤掉，只保留与导出件 d-src 完全一致的来源句，
     让「屏幕 / 打印 / 导出」三个出口对「来源」的表述收敛成同一句。 */
  .ms-doc .ref-note{background:none!important;border:0!important;padding:3pt 0 0!important;font-size:8pt!important;color:#555!important;margin-bottom:0!important}
  .ms-doc .ref-note__go{display:none!important}
  .ms-doc .ms-list li{font-size:9pt!important;line-height:1.55!important}
  .ms-doc .ms-list{gap:4pt!important}

  /* ── 场地布置块：纸上改为「白底 + 黑左边框」，与屏显的浅蓝底区分。
     纸面不需要靠底色分块，左边框足以表达「这是场地规格」这一独立语义层级。
     摆位表是教练照着摆的关键数据，**禁止塌陷**（与 .ms-fig 相反：那个是空占位，
     这个有真实内容），字号给到 8.5pt 保证坐标数字在 A4 上清晰可读。 ── */
  .ms-doc .ms-venue{
    margin-top:7pt!important;padding:6pt 8pt!important;
    background:#fff!important;border:1pt solid #999!important;
    border-left:2.5pt solid #000!important;border-radius:0!important;
  }
  .ms-doc .ms-venue h3{font-size:9.5pt!important;color:#000!important;margin:0 0 3pt!important}
  .ms-doc .ms-venue__head{font-size:8.5pt!important;line-height:1.55!important;color:#000!important}
  .ms-doc .ms-venue__note{
    font-size:8pt!important;color:#333!important;background:#fff!important;
    border:.5pt solid #999!important;border-radius:0!important;padding:4pt 6pt!important;
    -webkit-print-color-adjust:exact;print-color-adjust:exact;
  }
  .ms-doc .ms-venue .ms-list li{font-size:8.5pt!important;line-height:1.5!important;color:#000!important}
  .ms-doc .ms-layout{
    max-width:none!important;font-size:8.5pt!important;margin-top:6pt!important;
    break-inside:avoid;page-break-inside:avoid;
  }
  .ms-doc .ms-layout th,.ms-doc .ms-layout td{
    border:.5pt solid #999!important;padding:3pt 5pt!important;color:#000!important;
  }
  .ms-doc .ms-layout th{
    background:#F2F2F2!important;-webkit-print-color-adjust:exact;print-color-adjust:exact;
    font-size:8pt!important;
  }
  .ms-doc .card{box-shadow:none!important;border-color:#B9B9B9!important}

  /* 落款：复用全局 .child-foot（无父级作用域，此处仅收窄到本页作用域） */
  .ms-doc .child-foot{
    font-size:7.5pt;color:#555;text-align:center;
    border-top:.5pt solid #999;padding-top:4pt;margin-top:8pt;
    break-inside:avoid;page-break-inside:avoid;
  }
}

/* ============================================================
 * 编号对照表打印页（.cd-sheet）
 * -------------------------------------------------------------
 * 【场景】园所一次拿到全部查询编号：园所固定码贴大门、园长编号交园长、
 *   每个班一张小贴纸贴班门口。目标是**一张 A4 纸全印完，剪开就能用**，
 *   免得园所跑几趟、印好几张纸。
 *
 * 【为什么单独一套作用域而不是复用 .ms-doc】
 *   .ms-doc 的打印规则（隐藏 .ms-hd、令牌全转黑）是为「测评方法文档」写的，
 *   把编号对照表塞进去会继承到与本页无关的隐藏/清零规则。
 *   故独立作用域，代价是令牌兜底要再写一遍 —— 这是刻意的隔离。
 *
 * 【打印三条硬要求】
 *   ① 深色主题必须兜底（否则白底白字）：令牌覆盖 + 显式 color/background
 *   ② 裁剪线用 **虚线 border**（不是 CSS background-image）——
 *      背景图在部分打印机低墨模式下不打印，剪不断就白印一页
 *   ③ 每个贴纸必须 break-inside:avoid，否则一个班跨两页、裁剪线对不上
 * ============================================================ */
.cd-sheet{
  --cd-line:#c9d2d8; --cd-line-strong:#8a959d;
  --cd-ink:#1f2a33; --cd-ink-2:#4a5560; --cd-ink-3:#7b8794;
  --cd-teal:#155e63; --cd-orange:#e8833a;
  --cd-warn-bg:#fff8f2;
  padding:0; margin:0; color:var(--cd-ink);
  font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
}
.cd-sheet *{box-sizing:border-box}

/* ---------- 抬头 ---------- */
.cd-sheet .cd-head{
  display:flex;justify-content:space-between;align-items:flex-end;
  gap:14px;border-bottom:1.5pt solid var(--cd-teal);padding-bottom:5px;margin-bottom:10px;
}
.cd-sheet .cd-head__l h1{
  margin:0;font-size:17pt;font-weight:800;color:var(--cd-ink);letter-spacing:-.3pt;line-height:1.25;
}
.cd-sheet .cd-head__l p{margin:3px 0 0;font-size:9pt;color:var(--cd-ink-2);line-height:1.6}
.cd-sheet .cd-head__r{text-align:right;font-size:8pt;color:var(--cd-ink-3);line-height:1.7;white-space:nowrap}
.cd-sheet .cd-head__r b{display:block;font-size:10pt;color:var(--cd-teal);font-weight:800}

/* ---------- 区块标题 ---------- */
.cd-sheet .cd-sec{
  display:flex;align-items:center;gap:7px;margin:0 0 6px;
  font-size:11pt;font-weight:800;color:var(--cd-ink);
}
.cd-sheet .cd-sec i{
  font-style:normal;width:19px;height:19px;flex:0 0 19px;border-radius:5px;
  background:var(--cd-teal);color:#fff;font-size:10pt;font-weight:800;
  display:flex;align-items:center;justify-content:center;
}
.cd-sheet .cd-sec span{font-size:8pt;font-weight:400;color:var(--cd-ink-3);margin-left:2px}

/* ---------- 园所固定码（剪下贴大门）---------- */
.cd-sheet .cd-hero{
  display:flex;gap:16px;align-items:center;
  border:1.2pt dashed var(--cd-line-strong);border-radius:9px;
  padding:10px;margin-bottom:10px;background:#fff;
}
.cd-sheet .cd-hero__qr{
  flex:0 0 auto;padding:5px;background:#fff;
  border:.8pt solid var(--cd-line);border-radius:7px;
}
.cd-sheet .cd-hero__qr svg{display:block;width:104px;height:104px}
.cd-sheet .cd-hero__b{flex:1;min-width:0}
.cd-sheet .cd-hero__t{
  font-size:12.5pt;font-weight:800;color:var(--cd-ink);margin:0 0 5px;line-height:1.35;
}
.cd-sheet .cd-hero__d{font-size:9pt;color:var(--cd-ink-2);line-height:1.85;margin:0}
.cd-sheet .cd-hero__d b{color:var(--cd-ink)}
.cd-sheet .cd-hero__url{
  margin-top:5px;padding:4px 7px;background:#f4f7f8;border-radius:5px;
  font-size:7.5pt;color:var(--cd-ink-3);word-break:break-all;
  font-family:ui-monospace,Consolas,monospace;line-height:1.5;
}
.cd-sheet .cd-hero__tip{
  margin-top:5px;font-size:7.5pt;color:var(--cd-orange);font-weight:700;line-height:1.55;
}

/* ---------- 园长编号（醒目条）---------- */
.cd-sheet .cd-principal{
  display:flex;align-items:center;gap:14px;
  border:1.2pt solid var(--cd-teal);border-radius:9px;
  padding:9px 14px;margin-bottom:10px;background:var(--cd-warn-bg);
}
.cd-sheet .cd-principal__k{font-size:9.5pt;font-weight:700;color:var(--cd-ink-2);line-height:1.6}
.cd-sheet .cd-principal__code{
  font-size:22pt;font-weight:800;letter-spacing:.14em;color:var(--cd-teal);
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;line-height:1.1;
}
.cd-sheet .cd-principal__n{
  font-size:8pt;color:var(--cd-ink-3);line-height:1.7;flex:1;min-width:0;
}
.cd-sheet .cd-principal--none{
  justify-content:center;font-size:9.5pt;color:var(--cd-ink-3);
  background:#fff;border-style:dashed;border-color:var(--cd-line-strong);
}

/* ---------- 班级编号对照表 ---------- */
.cd-sheet .cd-tbl{width:100%;border-collapse:collapse;font-size:9pt;margin-bottom:6px}
.cd-sheet .cd-tbl th{
  background:#eef3f4;color:var(--cd-ink-2);font-weight:700;font-size:8pt;
  text-align:left;padding:5px 8px;border:.6pt solid var(--cd-line-strong);
  white-space:nowrap;
}
.cd-sheet .cd-tbl td{
  padding:3.5px 8px;border:.6pt solid var(--cd-line);color:var(--cd-ink);
  line-height:1.45;vertical-align:middle;
}
.cd-sheet .cd-tbl tr{break-inside:avoid;page-break-inside:avoid}
.cd-sheet .cd-tbl .cd-tbl__code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13pt;font-weight:800;letter-spacing:.09em;color:var(--cd-teal);white-space:nowrap;
}
.cd-sheet .cd-tbl .cd-tbl__n{text-align:right;color:var(--cd-ink-3);font-size:8pt;white-space:nowrap}
.cd-sheet .cd-tbl .cd-tbl__tag{
  display:inline-block;padding:1px 6px;border-radius:9px;
  font-size:7.5pt;font-weight:700;background:#eef3f4;color:var(--cd-ink-2);
}
.cd-sheet .cd-tbl .cd-tbl__tag--off{background:#f6e9e7;color:#a83b2c}
.cd-sheet .cd-tbl .cd-tbl__tag--dead{background:#f0f2f3;color:#8a95a0}

/* ---------- 班级贴纸（剪下贴班门口）---------- */
.cd-sheet .cd-stickers{
  display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:2px;
}
.cd-sheet .cd-sticker{
  border:1pt dashed var(--cd-line-strong);border-radius:8px;
  padding:6px 10px;break-inside:avoid;page-break-inside:avoid;
  display:flex;gap:11px;align-items:center;background:#fff;
}
.cd-sheet .cd-sticker__qr{flex:0 0 auto;padding:3px;background:#fff;border:.6pt solid var(--cd-line);border-radius:5px}
/* ⚠️ 96px 是实测的解码下限（60/72/84px 用 OpenCV 独立解码器均失败）。
   贴纸是要真印出来扫的，宁可大一点也不不能扫不出 —— 低于 96px 等于废纸。 */
.cd-sheet .cd-sticker__qr svg{display:block;width:96px;height:96px}
.cd-sheet .cd-sticker__b{flex:1;min-width:0}
.cd-sheet .cd-sticker__c{
  font-size:7.5pt;color:var(--cd-ink-3);line-height:1.45;margin:0 0 1px;
}
.cd-sheet .cd-sticker__n{
  font-size:9pt;font-weight:800;color:var(--cd-ink);line-height:1.3;margin:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.cd-sheet .cd-sticker__code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13pt;font-weight:800;letter-spacing:.08em;color:var(--cd-teal);
  line-height:1.2;margin:1px 0 0;
}

/* ---------- 落款 ---------- */
.cd-sheet .cd-foot{
  margin-top:9px;padding-top:6px;border-top:.6pt solid var(--cd-line);
  font-size:7.5pt;color:var(--cd-ink-3);line-height:1.85;text-align:center;
}
.cd-sheet .cd-foot b{color:var(--cd-ink-2)}

/* ============================================================
 * 打印态
 * ============================================================ */
@media print{
  /* 深色主题兜底：.cd-sheet 自己声明令牌 + color/background，
     即使在 [data-theme=dark] 下也保持白底黑字。 */
  .cd-sheet{
    --cd-line:#B9B9B9; --cd-line-strong:#8C8C8C;
    --cd-ink:#000; --cd-ink-2:#333; --cd-ink-3:#555;
    --cd-teal:#000; --cd-orange:#000; --cd-warn-bg:#fff;
    color:#000!important;background:#fff!important;
  }
  /* 屏幕上不打印的东西 */
  .cd-no-print{display:none!important}
  .cd-sheet .card{box-shadow:none!important;border-color:#B9B9B9!important}
  /* 二维码必须强制上墨：部分打印机会对 SVG 做栅格化并丢色 */
  .cd-sheet .cd-hero__qr svg,
  .cd-sheet .cd-sticker__qr svg{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .cd-sheet .cd-hero__qr,
  .cd-sheet .cd-sticker__qr{-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .cd-sheet .cd-tbl th{background:#F2F2F2!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .cd-sheet .cd-principal{background:#fff!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .cd-sheet .cd-hero__url{background:#F6F6F6!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  .cd-sheet .cd-tbl .cd-tbl__tag{background:#F2F2F2!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  /* 贴纸网格跨页不断行 */
  .cd-sheet .cd-stickers{break-inside:auto}
}
