/* ═══════════════════════════════════════════════════════════════════
   方向 A · 象牙 · 墨 · 一点黄
   设计稿：docs/design/*.dc.html（Brand.dc.html 是总表）。
   尺寸颜色间距从稿子的 inline style 抄，不凭感觉。

   **黄是品牌，不是底色**：底用象牙白，字用墨，黄只出现在 Logo、主按钮、
   选中态、提示条这四处——所以每一处黄都有分量。六个面的颜色只当标记色
   （活动卡色条、登记表列头、六边形顶点、轨迹线），不做底不做字。

   跟稿子的一处**有意出入**：稿子里有 108 处 11px / 11.5px / 10.5px，
   而它自己的「四条规矩」和需求都写着**字不小于 12px**。规矩赢——
   那些一律抬到 12px，比例不变。`console/test_min_font.py` 守着这条线。
   ═══════════════════════════════════════════════════════════════════ */

/* Manrope 只管数字和拉丁，自托管在 /fonts（**不引 Google Fonts**——
   园所网络多半出不去，引了就是每次开页面都等一个超时）。
   中文走系统字体：装不上第三方中文字体的机器太多，而系统字体一定在。 */
@font-face{
  font-family:"Manrope";
  src:url("/fonts/manrope-latin.woff2") format("woff2");
  font-weight:500 800;            /* 可变字重，一个文件覆盖 500–800 */
  font-style:normal;
  font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,
                U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,
                U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}

:root{
  /* 中性 */
  --ivory:#F7F5EF;    /* 页面底 */
  --rail:#F1EEE6;     /* 侧栏 */
  --surface:#FFFFFF;  /* 白面：只用一层 */
  --line:#E7E3DA;     /* 分隔线 */
  --line-2:#D9D4C8;   /* 控件描边 */
  --ink:#1E2321;      /* 主字 */
  --ink-2:#5C635E;    /* 次字 */
  --ink-3:#8C928B;    /* 说明字 */
  /* 黄 */
  --yellow:#FFD575; --cream:#FFE9B7; --y-100:#FFECB8; --y-50:#FFF6DE; --amber:#8A6200;
  /* 六个面：只当标记色 */
  --f-motor:#CF4A21; --f-lang:#D9A000; --f-social:#5C9A2A;
  --f-think:#0784A6; --f-attn:#3050C8; --f-order:#A63A8B;
  /* 状态 */
  --s-good:#2E6B5E; --s-onway:#D08C1F; --s-help:#4A6FA5;
  /* 字 */
  --font:"Manrope","PingFang SC","Microsoft YaHei","Noto Sans SC",sans-serif;
  --fs-12:12px; --fs-14:14px; --fs-16:16px; --fs-20:20px; --fs-28:28px;
  --r-ctl:9px; --r-card:12px; --r-panel:14px;
  --shadow-float:0 8px 20px rgba(30,35,33,.10);   /* 只给浮起的东西 */

  /* ---- 旧名字接到新 token 上 ----
     这个文件里还有上千条规则写着 --teal / --tint / --bg 这些旧名。
     一次性全改名等于把整份样式重写一遍，改错一个就是一处看不见的塌陷。
     **先把旧名指到新 token**：深绿主题当场就没了，旧规则继续成立，
     然后一页一页往新名字上搬。这几行是过渡，不是长期设计。 */
  --teal:var(--ink); --teal-d:var(--ink); --tint:var(--y-50);
  --muted:var(--ink-2); --bg:var(--ivory); --card:var(--surface);
  --warn:#B4412F; --gold:var(--amber);
}

*{box-sizing:border-box}
/* 数字一律等宽：课表上的时间、档次、出勤天数是**一列一列对着看**的，
   比例数字会让每一行的小数点错开，扫一眼就看不出哪个大哪个小。 */
body,input,select,textarea,button,table{font-variant-numeric:tabular-nums}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased}

/* ---- 壳：侧栏 232 + 顶栏 60（照 docs/design/Main.dc.html） ---- */
/* 只做电脑端（≥1024px）。手机端不做适配，但也不弄坏——窄屏下侧栏照旧收成抽屉。 */
.app{display:flex;min-height:100vh;background:var(--ivory)}
.sidebar{width:232px;flex:none;background:var(--rail);border-right:1px solid var(--line);
  color:var(--ink);display:flex;flex-direction:column;gap:22px;padding:20px 14px 16px;
  position:sticky;top:0;height:100vh}

/* Logo + 产品名：灵悟心愈 · 课程 · <园所名> */
.brand{display:flex;align-items:center;gap:10px;padding:0 4px}
.brand img{width:34px;height:34px;border-radius:9px;display:block;flex:none}
.brand .bn{display:flex;flex-direction:column;line-height:1.15;min-width:0}
.brand .bn b{font-size:15px;font-weight:800;letter-spacing:.02em}
.brand .bn small{font-size:12px;color:var(--ink-3);letter-spacing:.08em;font-weight:500;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.nav{display:flex;flex-direction:column;gap:4px}
.nav a{display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:10px;
  background:transparent;color:var(--ink-2);font-size:14px;font-weight:500;
  text-decoration:none;cursor:pointer;transition:.12s}
.nav a svg{display:block;flex:none;width:20px;height:20px}
.nav a:hover{background:rgba(255,255,255,.6);color:var(--ink)}
.nav a.active{background:var(--surface);color:var(--ink);font-weight:700;
  box-shadow:0 1px 2px rgba(30,35,33,.06)}
.nav a .dot{width:6px;height:6px;border-radius:50%;background:var(--yellow);margin-left:auto;flex:none}
.nav .sep{height:1px;background:var(--line);margin:10px 8px}

/* 底部当前用户卡 */
.sidefoot{margin-top:auto;display:flex;align-items:center;gap:10px;padding:10px;
  border-radius:12px;background:var(--surface);border:1px solid var(--line)}
.sidefoot .av{width:30px;height:30px;border-radius:50%;background:var(--yellow);color:var(--ink);
  font-weight:800;font-size:13px;display:grid;place-items:center;flex:none}
.sidefoot .who{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.sidefoot .who b{font-size:13px;font-weight:700}
.sidefoot .who small{font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sidefoot .out{margin-left:auto;color:var(--ink-3);cursor:pointer;display:grid;place-items:center;
  width:26px;height:26px;border-radius:7px;flex:none}
.sidefoot .out:hover{background:var(--ivory);color:var(--ink)}
.orgpick{margin:0 4px}
.orgpick select{width:100%;background:var(--surface);color:var(--ink);border:1px solid var(--line-2);
  border-radius:var(--r-ctl);padding:7px 9px;font-family:var(--font);font-size:12px}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
/* 顶栏 60：页名 + 副标 + 右侧动作区 */
.topbar{height:60px;flex:none;display:flex;align-items:center;gap:16px;padding:0 28px;
  border-bottom:1px solid var(--line);background:var(--ivory)}
.topbar .crumb{display:flex;align-items:baseline;gap:10px;min-width:0}
.topbar .crumb b{font-size:20px;font-weight:800;letter-spacing:-.01em}
.topbar .crumb .sub{font-size:13px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.topbar .crumb a{color:inherit;text-decoration:none;cursor:pointer}
.topbar .crumb a:hover{color:var(--amber)}
.topbar .acts{margin-left:auto;display:flex;align-items:center;gap:10px}
.content{padding:20px 28px 40px;width:100%}

/* ---- 三种按钮，不再有第四种 ---- */
.btn{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;
  border-radius:var(--r-ctl);font-family:var(--font);font-size:13.5px;font-weight:700;
  cursor:pointer;background:var(--surface);color:var(--ink);border:1px solid var(--line-2);
  transition:.12s;white-space:nowrap}
.btn svg{display:block;flex:none;width:16px;height:16px}
.btn:hover{border-color:var(--ink-3)}
.btn.pri{background:var(--yellow);color:var(--ink);border-color:var(--yellow)}   /* 主：黄底墨字 */
.btn.pri:hover{background:var(--cream);border-color:var(--cream)}
.btn.ghost{background:var(--surface);color:var(--ink);border-color:var(--line-2)} /* 次：白底描边 */
.btn.link{background:transparent;color:var(--ink-2);border-color:transparent;padding:0 8px} /* 静：文字 */
.btn.link:hover{background:transparent;color:var(--ink)}
.btn.sm{height:30px;padding:0 11px;font-size:12px}
.btn[disabled],.btn.off{opacity:.45;cursor:not-allowed}
.iconbtn{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;
  color:var(--ink-2);cursor:pointer;border:1px solid transparent;background:transparent;
  padding:0;font:inherit}
.iconbtn:hover{background:var(--surface);border-color:var(--line)}

/* ---- chip 只表状态，不当按钮 ---- */
.chip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px;
  border-radius:999px;border:1px solid var(--line-2);background:var(--surface);
  color:var(--ink-2);font-size:12px;font-weight:600;white-space:nowrap}
.chip i{width:7px;height:7px;border-radius:50%;display:inline-block;flex:none;background:var(--ink-3)}
.chip.good i{background:var(--s-good)}
.chip.warn i{background:var(--s-onway)}
.chip.help i{background:var(--s-help)}
.chip.hint{background:var(--y-50)}
.chip.on{background:var(--y-100);border-color:var(--yellow);color:var(--ink)}
.chip small{font-size:12px;color:var(--ink-3);font-weight:500}

/* 分段控件（出勤五段式） */
.seg{display:inline-flex;gap:2px;padding:3px;background:var(--ivory);border-radius:var(--r-ctl)}
.seg span,.seg button{padding:0 12px;height:30px;display:inline-flex;align-items:center;border-radius:7px;
  color:var(--ink-2);font-size:12.5px;font-weight:600;cursor:pointer;
  border:none;background:none;font-family:var(--font)}
.seg span.on,.seg button.on{background:var(--ink);color:#fff;font-weight:700}

/* 提示条：黄 50 底 + 黄 100 边，只在真有话说的时候出现 */
.notebar{display:flex;align-items:center;gap:14px;padding:12px 16px;border-radius:var(--r-card);
  background:var(--y-50);border:1px solid var(--y-100)}
.notebar .ic{width:34px;height:34px;border-radius:10px;background:var(--yellow);color:var(--ink);
  display:grid;place-items:center;flex:none}
.notebar .tx{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.notebar .tx b{font-size:14px;font-weight:700}
.notebar .tx small{font-size:12.5px;color:var(--ink-2)}
.notebar .acts{margin-left:auto;display:flex;gap:8px;flex:none}
/* 手机上动作那一排换到下一行（AQ 手点时看到的）：两颗按钮 flex:none 占着，字那一栏被挤到 28px，
   「这是系统给的一版建议课表」一个字一行竖着排。图标 + 字一行，按钮自己一行靠右 */
@media(max-width:768px){
  .notebar{flex-wrap:wrap}
  .notebar .tx{flex:1 1 0}
  .notebar .acts{flex:1 0 100%;justify-content:flex-end;flex-wrap:wrap}
}

/* ---- reused demo components ---- */
/* 白面只用一层：卡片不套卡片，分区靠留白和一条线（四条规矩之二） */
.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-panel);padding:20px;margin-bottom:16px}
h2.sec{font-size:16px;margin:0 0 4px;color:var(--ink);font-weight:800;letter-spacing:-.01em}
.sec-desc{color:var(--muted);font-size:12.5px;margin:0 0 16px}
/* 按钮和 chip 的定义**只在上面那一处**。这儿原先还有一份（深绿主按钮、
   会变色的 chip），两份叠着，后写的赢——于是「班级名看不见」那个 bug 修在
   上面那份、界面上生效的却是这份。删掉，不留第二份。 */
.bar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:8px}
.right{margin-left:auto}
.badge{font-size:12px;background:var(--y-50);color:var(--amber);border:1px solid var(--line);border-radius:6px;padding:3px 9px;font-weight:600}
.chip.sm{height:24px;padding:0 9px}
.chip.hue{color:#fff;border-color:transparent}            /* 贴一块颜色的标签（能力簇） */
.chip.off{background:var(--ivory);color:var(--ink-3);border-style:dashed}
.dot{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:middle}
.pill{font-size:12px;border-radius:999px;padding:2px 10px;border:1px solid var(--line-2);background:var(--surface);color:var(--ink-2)}
.pill.warn{background:#FBE9EC;border-color:#F0C7CF;color:#8a3a4a;font-weight:700}
.pill.gold{background:var(--y-50);border-color:var(--y-100);color:var(--amber);font-weight:700}
.rate{display:inline-flex;gap:3px}
.rate span{width:24px;height:22px;border:1px solid var(--line);border-radius:6px;display:grid;place-items:center;font-size:12px;cursor:pointer;color:var(--muted)}
.rate span:hover{border-color:var(--teal)}
.rate span.on{background:var(--teal);color:#fff;border-color:var(--teal)}

/* ---- metric cards (概览) ---- */
.metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:18px}
.metric{background:#fff;border:1px solid var(--line);border-radius:12px;padding:15px 16px}
.metric .n{font-size:26px;font-weight:800;color:var(--teal-d)}
.metric .l{font-size:12px;color:var(--muted);margin-top:2px}

/* ---- roster grid ---- */
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.rcard{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px;cursor:pointer;transition:.12s;display:flex;gap:12px;align-items:flex-start}
.rcard:hover{border-color:var(--teal);box-shadow:0 2px 10px rgba(30,35,33,.08)}
.avatar{width:44px;height:44px;border-radius:50%;background:var(--tint);color:var(--teal-d);display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:800;flex:none}
.rcard .nm{font-size:15px;font-weight:700;color:var(--teal-d)}
.rcard .mt{font-size:12px;color:var(--muted);margin-top:1px}
.rcard .tags{display:flex;gap:5px;flex-wrap:wrap;margin-top:7px}
.classcard{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;cursor:pointer;transition:.12s}
.classcard:hover{border-color:var(--teal);box-shadow:0 2px 10px rgba(30,35,33,.08)}
.classcard .cn{font-size:16px;font-weight:800;color:var(--teal-d)}
.classcard .cc{font-size:12px;color:var(--muted);margin-top:4px}

/* ---- student profile ---- */
.phead{background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px;display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.phead .avatar{width:52px;height:52px;font-size:18px}
.phead .nm{font-size:18px;font-weight:800;color:var(--teal-d)}
.phead .nm small{font-size:12px;color:var(--muted);font-weight:400}
.phead .metabar{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.cardgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}
.scard{background:#fff;border:1px solid var(--line);border-radius:12px;padding:13px 15px}
.scard h4{font-size:13px;font-weight:700;color:var(--teal-d);margin:0 0 9px;display:flex;align-items:center;gap:7px}
.kv{display:flex;justify-content:space-between;padding:3px 0;font-size:12.5px}
.kv .k{color:var(--muted)}
.alertbox{background:#FBE9EC;border:1px solid #F0C7CF;border-radius:8px;padding:6px 9px;color:#8a3a4a;font-size:12px;margin-bottom:7px}
.obsrow{display:flex;gap:10px;align-items:center;padding:6px 0;font-size:12.5px;border-bottom:1px solid #F1EFE9}
.obsrow:last-child{border-bottom:none}
.obsrow .oc{font-weight:700;color:var(--teal-d);width:88px;flex:none}
.obsrow .om{flex:1;color:#3c4a45}
.insightbox{background:#E9F4EF;border:1px solid #C2DFD5;border-radius:12px;padding:11px 14px;margin-top:12px;display:flex;gap:9px;font-size:12.5px;color:#2E6B5E}

/* ---- modal ---- */
/* 遮罩是墨色不是深绿——换视觉时漏了这一条，弹层一开整页泛绿，
   而那正是最容易被当成「这一版就长这样」的地方 */
.mask{position:fixed;inset:0;background:rgba(30,35,33,.38);display:flex;align-items:center;justify-content:center;z-index:40;padding:20px}
.modal{background:#fff;border-radius:14px;padding:22px;width:min(520px,100%);max-height:88vh;overflow:auto}
.modal.wide{width:min(680px,100%)}
.modal h3{margin:0 0 14px;font-size:16px;color:var(--ink);font-weight:800}
.field{margin-bottom:12px}
.field label{display:block;font-size:12px;color:var(--muted);margin-bottom:4px}
.field input,.field select,.field textarea{width:100%;border:1px solid var(--line);border-radius:9px;padding:9px 11px;font-family:var(--font);font-size:13.5px;color:var(--ink)}
.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--yellow);box-shadow:0 0 0 3px var(--y-50)}
.frow{display:flex;gap:10px}.frow>.field{flex:1}
.lvgrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}
.lvopt{border:1px solid var(--line);border-radius:9px;padding:9px;background:#fff;cursor:pointer;transition:.12s}
.lvopt:hover{border-color:var(--teal)}
.lvopt.on{border:2px solid var(--teal);background:var(--tint)}
.matrix{overflow-x:auto;border:1px solid var(--line);border-radius:12px}
table.mx{border-collapse:collapse;width:100%;font-size:12px}
table.mx th,table.mx td{border:1px solid var(--line);padding:7px 6px;text-align:center}
table.mx thead th{background:var(--tint);color:var(--teal-d);font-weight:700;font-size:12px}
table.mx th.nm,table.mx td.nm{text-align:left;font-weight:700;color:var(--teal-d);white-space:nowrap;cursor:pointer}
table.mx th.focus,table.mx td.focus{text-align:left;white-space:nowrap}
.cell{display:inline-block;min-width:18px;font-weight:700;color:var(--teal-d)}
.cell.gap{background:#FFF7E8;color:#6b551f;border-radius:6px;padding:1px 7px;font-size:12px}

.empty{text-align:center;color:var(--muted);padding:50px 20px;font-size:13px}
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:var(--teal-d);color:#fff;padding:11px 20px;border-radius:10px;font-size:13px;box-shadow:0 6px 24px rgba(0,0,0,.2);opacity:0;transition:.25s;z-index:60;
  /* 只是一句提示，不接点击（AP 复查）：淡掉之后它还在那儿（透明、层级 60），手机上又挪到了例子和链接那一块，
     点那儿什么都不发生 */
  pointer-events:none}
.toast.show{opacity:1}
.hidden{display:none!important}
/* ---- formatted prompt reader (只读排版) ---- */
.promptdoc{font-size:14.5px;line-height:1.8;color:var(--ink);max-width:820px}
.promptdoc p{margin:8px 0}
.promptdoc .ph-h{font-size:15px;font-weight:800;color:var(--teal-d);background:var(--tint);border-left:3px solid var(--teal);border-radius:0 8px 8px 0;padding:9px 12px;margin:18px 0 10px}
.promptdoc .ph-h:first-child{margin-top:0}
.promptdoc .ph-list{margin:8px 0 8px 4px;padding-left:22px}
.promptdoc .ph-list li{margin:6px 0}
.promptdoc .ph{background:#FFF7E8;border:1px solid #EBD7A8;border-radius:6px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:12.5px;color:#6b551f}
.promptdoc .q{color:var(--teal-d);font-weight:600}
.promptdoc .ph-pre{background:#0F4C45;color:#E1F5EE;border-radius:10px;padding:14px 16px;overflow-x:auto;font-family:ui-monospace,monospace;font-size:12.5px;line-height:1.6;margin:10px 0;white-space:pre}

/* ---- prompt composition (消息拼装 + 占位符超链接) ---- */
.msgblock{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:6px 20px 14px;margin-bottom:14px;box-shadow:0 1px 2px rgba(0,0,0,.02)}
.msgrole{font-size:12px;font-weight:800;letter-spacing:.5px;color:var(--teal);text-transform:uppercase;padding:10px 0 4px;border-bottom:1px dashed var(--line);margin-bottom:8px}
.msgbody .segtext{max-width:none}
.msgbody .segtext p:first-child{margin-top:0}
.phbar{border:1px solid var(--gold);background:#FFF7E8;border-radius:10px;margin:10px 0;overflow:hidden}
.phhead{display:flex;align-items:center;gap:8px;padding:9px 12px;cursor:pointer;user-select:none;flex-wrap:wrap}
.phhead:hover{background:#FBEFD6}
.phhead .chev{color:#6b551f;font-size:12px;transition:transform .15s;flex:none}
.phhead .chev.open{transform:rotate(90deg)}
.phname{font-weight:800;color:#6b551f;font-size:13.5px}
.phkind{font-size:12px;font-weight:700;border-radius:20px;padding:1px 9px}
.phkind.shared{background:#E1F5EE;color:#0F6E56}
.phkind.data{background:#E6F1FB;color:#185FA5}
.phkind.runtime{background:#F1EFE8;color:#5F5E5A}
.phdesc{font-size:12px;color:#8a7a52;flex:1;min-width:160px}
.phexp{border-top:1px solid #EBD7A8;padding:12px 14px;background:#fff;font-size:13.5px}
.phexp.hidden{display:none}

/* ---- 课程详情文档 ---- */
.cdoc{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:22px 26px;box-shadow:0 1px 2px rgba(0,0,0,.02)}
.cdttl{font-size:19px;font-weight:800;color:var(--teal-d);display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cdbadge{font-size:12px;font-weight:700;color:var(--teal-d);background:var(--tint);border:1px solid var(--line);border-radius:20px;padding:2px 10px}
.cdorg{color:var(--teal);font-size:12.5px;border-bottom:2px solid var(--teal);padding-bottom:8px;margin:4px 0 12px}
.cdnote{background:#EAF3F0;border:1px solid var(--line);border-radius:8px;padding:9px 12px;color:#2E6B5E;font-size:12.5px;margin-bottom:12px}
.cdss{font-weight:800;color:var(--teal-d);font-size:13.5px;border-left:3px solid var(--teal);padding-left:8px;margin:14px 0 5px}
.cdmeta{font-size:12.5px;color:#3c4a45;margin:6px 0}
.cdmeta b,.cdp b{color:var(--teal-d)}
.cdp{font-size:13px;color:#3c4a45;line-height:1.7;margin:2px 0}
.cdul,.cdol{margin:4px 0 4px 20px;padding:0}
.cdul li,.cdol li{margin:4px 0;color:#3c4a45;font-size:13px;line-height:1.6}

/* ---- 管理助手 chat ---- */
.asschat{display:flex;flex-direction:column;height:calc(100vh - 120px);max-width:820px}
.asmsgs{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:10px;padding:6px 2px}
.asmsgs .b{max-width:88%;padding:10px 13px;border-radius:12px;font-size:14px;line-height:1.65}
.asmsgs .b.me{align-self:flex-end;background:var(--teal);color:#fff;border-radius:12px 12px 3px 12px}
.asmsgs .b.ai{align-self:flex-start;background:#fff;border:1px solid var(--line);border-radius:12px 12px 12px 3px}
.asmsgs .astoday{align-self:flex-start;font-size:12px;color:var(--ink-3);padding:0 4px;margin-top:-4px}
.astips{display:flex;gap:6px;flex-wrap:wrap;padding:8px 0}
.quick{font-size:12px;background:var(--tint);border:none;border-radius:16px;padding:5px 11px;color:var(--teal-d);cursor:pointer;font-family:var(--font)}
.quick:hover{background:var(--line)}
.asinp{display:flex;gap:8px;align-items:flex-end;padding-top:8px;border-top:1px solid var(--line)}
.asinp textarea{flex:1;border:1px solid var(--line);border-radius:12px;padding:10px 12px;font-family:var(--font);font-size:14px;resize:none}
.asinp textarea:focus{outline:none;border-color:var(--yellow);box-shadow:0 0 0 3px var(--y-50)}

/* ---- mobile shell: hamburger + slide-in drawer ---- */
.hamburger{display:none;align-items:center;justify-content:center;width:38px;height:38px;border:1px solid var(--line);border-radius:9px;background:#fff;color:var(--teal-d);font-size:19px;cursor:pointer;flex:none;padding:0}
.backdrop{display:none;position:fixed;inset:0;background:rgba(30,35,33,.42);z-index:45}
.backdrop.show{display:block}
@media(max-width:768px){
  .sidebar{position:fixed;left:0;top:0;z-index:50;width:236px;height:100vh;transform:translateX(-100%);transition:transform .2s ease;box-shadow:none}
  .sidebar.open{transform:none;box-shadow:0 0 40px rgba(0,0,0,.35)}
  .hamburger{display:inline-flex}
  .topbar{padding:10px 12px}
  .topbar .crumb{font-size:15px}
  /* 顶栏在手机上两行（AP）：页名一行、动作一行，动作放不下就在这一行里横着滑。
     原先挤在一行：「我们班这周」那五颗按钮 711px 宽，整页被撑到 793px、页名竖着折成一个字一行，
     贴底的「跟助手说一句…」落到屏幕外面 */
  .topbar{height:auto;min-height:56px;flex-wrap:wrap;row-gap:8px}
  .topbar .crumb{flex:1 1 auto;min-width:0}
  .topbar .crumb b{white-space:nowrap}
  .topbar .acts{margin-left:0;flex:1 1 100%;min-width:0;overflow-x:auto;padding-bottom:2px}
  .topbar .acts > *{flex:none}
  .topbar .acts:empty{display:none}
  .topbar .ctx{display:none}
  .content{padding:12px 12px 40px}
  .metrics{grid-template-columns:repeat(2,1fr)}
  .grid,.cardgrid{grid-template-columns:1fr}
  .frow{flex-direction:column;gap:0}
  .modal{padding:18px}
  .schedgrid{grid-template-columns:1fr!important}
  .asschat{height:calc(100vh - 92px)}

  /* 「只显示活动」：手机上打开一个活动的链接，就该只看到这个活动。
     幼教是站在教室里单手拿着手机点观察表的——侧栏和顶栏每占一行，登记表就少一行。
     退路留在页内那个「返回」上，所以收掉顶栏不会把人困住。 */
  body.actonly .sidebar,
  body.actonly .backdrop,
  body.actonly .topbar{display:none}
  body.actonly .content{padding:10px 10px 40px}
  /* 登记表在手机上要撑满：横向滚动留给它自己，别跟页面抢 */
  body.actonly .q4scroll{max-width:100%}
}

/* ---- v7: 课程详情三读者可读性 ---- */
.cdnav{position:sticky;top:0;z-index:5;display:flex;gap:8px;background:#FAF8F4;padding:8px 0;border-bottom:1px solid var(--line);margin:10px 0 4px;flex-wrap:wrap}
.cdnavb{border:1px solid var(--line);background:#fff;border-radius:20px;padding:5px 13px;cursor:pointer;font-family:var(--font);font-size:12.5px;font-weight:700;color:var(--teal-d);display:flex;align-items:center;gap:5px}
.cdnavb small{font-weight:400;color:var(--muted);font-size:12px}
.cdnavb:hover{background:var(--tint,#EAF3F0);border-color:var(--teal)}
.cdnavsep{align-self:center;font-size:12px;font-weight:700;color:#a08245;border-left:2px solid #EBD7A8;padding-left:10px;margin-left:4px;white-space:nowrap}
.cdnavb.sos{border-color:#EBD7A8;background:#FFFBF2;color:#854F0B}
.cdnavb.sos:hover{background:#FAEEDA;border-color:#C9A45C}
/* 章节抽屉目录：固定在右缘、约 1/5 屏高处伸出小尾巴，点开滑出菜单，保持展开直到手动收起 */
.cdnav2{position:fixed;top:20vh;right:0;z-index:40;display:flex;align-items:flex-start;transform:translateX(calc(100% - 36px));transition:transform .28s cubic-bezier(.4,0,.2,1)}
.cdnav2.open{transform:translateX(0)}
.cdnav2-tail{flex:0 0 36px;width:36px;align-self:flex-start;margin-top:4px;border:none;background:var(--teal-d);color:#fff;border-radius:13px 0 0 13px;padding:15px 0;cursor:pointer;box-shadow:-3px 3px 10px rgba(0,0,0,.22);font-family:var(--font);display:flex;flex-direction:column;align-items:center;gap:4px}
.cdnav2-tail::before{content:"🔖";font-size:15px}
.cdnav2-tail span{writing-mode:vertical-rl;text-orientation:upright;font-size:13px;font-weight:800;letter-spacing:3px}
.cdnav2.open .cdnav2-tail::before{content:"✕";font-weight:800}
.cdnav2-panel{width:206px;max-height:66vh;overflow:auto;background:#fff;border:1px solid var(--line);border-right:none;border-radius:14px 0 0 14px;box-shadow:-8px 8px 30px rgba(0,0,0,.18);padding:8px 8px 10px;-webkit-overflow-scrolling:touch}
.cdnav2-hd{font-size:12px;font-weight:800;color:var(--muted);letter-spacing:1px;padding:4px 8px 8px}
.cdnav2-grp{font-size:12px;font-weight:800;color:#a08245;border-top:1px dashed #EBD7A8;margin:8px 4px 3px;padding:8px 4px 2px}
.cdnav2-item{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:none;background:transparent;border-radius:10px;padding:10px 8px;cursor:pointer;font-family:var(--font);color:var(--teal-d);font-size:13.5px;font-weight:700}
.cdnav2-item:hover,.cdnav2-item:active{background:var(--tint,#EAF3F0)}
.cdnav2-item .ci{flex:0 0 20px;text-align:center;font-size:15px}
.cdnav2-item .ct{display:flex;flex-direction:column;line-height:1.22}
.cdnav2-item .ct small{font-weight:400;color:var(--muted);font-size:12px;margin-top:1px}
.cdnav2-item.sos{color:#854F0B}
.cdnav2-item.sos:hover,.cdnav2-item.sos:active{background:#FAEEDA}
/* 课程操作下拉：把一排操作按钮收进「⚙ 操作」菜单，省顶部空间 */
.acts{position:relative;display:inline-block}
.acts-trig .caret{display:inline-block;transition:transform .2s}
.acts.open .acts-trig .caret{transform:rotate(180deg)}
.acts-menu{position:absolute;top:calc(100% + 6px);right:0;min-width:210px;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 34px rgba(0,0,0,.18);padding:6px;z-index:50;display:none}
.acts.open .acts-menu{display:block}
.acts-menu .btn{display:flex;width:100%;justify-content:flex-start;align-items:center;gap:8px;background:transparent;color:var(--teal-d);border:none;border-radius:8px;padding:11px 12px;font-size:13.5px;font-weight:700;white-space:nowrap}
.acts-menu .btn:hover{background:var(--tint,#EAF3F0)}
.acts-menu .btn:disabled{opacity:.55;cursor:default}
.acts-sep{height:1px;background:var(--line);margin:5px 6px}
.cdsec{display:flex;align-items:center;gap:10px;font-weight:800;color:var(--teal-d);font-size:15.5px;margin:24px 0 4px;padding-top:10px;border-top:2px solid var(--line);scroll-margin-top:52px}
.rolebadge{font-size:12px;color:#fff;background:var(--teal);border-radius:12px;padding:2px 10px;font-weight:700}
.cdsteps li{margin:9px 0;line-height:1.65}
.cchip{display:inline-block;font-size:12px;border-radius:10px;padding:1px 8px;margin-right:6px;font-weight:700;vertical-align:1px}
.cchip.who{background:var(--teal);color:#fff}
.cchip.tm{background:#F4EFE2;color:#6b5b2a;border:1px solid #E5DCC4}
.preplist{list-style:none;margin:4px 0;padding:0}
.preplist li{margin:6px 0;background:#fff;border:1px solid var(--line);border-radius:10px;padding:8px 11px}
.preplist li.done .pbody{opacity:.45;text-decoration:line-through}
.preplist label{display:flex;align-items:flex-start;gap:8px;cursor:pointer}
.preplist input{margin-top:3px;transform:scale(1.15);accent-color:var(--teal)}
.preplist .pbody{flex:1;line-height:1.6}

/* ---- v8: 课纲生成（原独立生成页，已并入 SPA，全部作用域限定在 .genv）---- */
.genv{display:flex;flex-direction:column;height:calc(100vh - 120px);background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden;font-size:13px}
.genv .gvhead{display:flex;align-items:center;gap:10px;padding:7px 12px;border-bottom:1px solid var(--line);flex:none;background:#fff}
.genv .sesstrip{flex:none;display:flex;align-items:center;min-width:0}
.genv .sessnew{flex:none;font-size:12px;border:1px dashed var(--teal);background:#fff;color:var(--teal-d);border-radius:16px;padding:4px 11px;cursor:pointer;font-family:var(--font)}
/* 「正在改课程库哪一节」——生成器里唯一的课程归属提示 */
.genv .gvbound{flex:1;min-width:0;overflow:hidden;white-space:nowrap}
.genv .bd{font-size:12px;color:var(--muted);display:inline-flex;align-items:center;gap:6px;max-width:100%}
.genv .bd.on{background:#eef6f4;border:1px solid var(--teal);color:var(--teal-d);border-radius:16px;padding:3px 8px 3px 11px;font-weight:700}
.genv .bdt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.genv .bd i{flex:none;font-style:normal;opacity:.55;font-size:14px;line-height:1;cursor:pointer}
.genv .bd i:hover{opacity:1}
/* 草稿会话：收成下拉，别再平铺成一排像「课程列表」 */
.genv .drafts{font-size:12px;color:var(--muted);display:inline-flex;align-items:center;gap:5px}
.genv .drafts select{max-width:150px;border:1px solid var(--line);border-radius:7px;padding:4px 8px;font-family:var(--font);font-size:12px;color:var(--ink);background:#fff}
.genv .drafts i{font-style:normal;opacity:.55;font-size:14px;cursor:pointer}
.genv .drafts i:hover{opacity:1}
/* 「打开课程库」选择器 */
.gplist{max-height:46vh;overflow-y:auto;border:1px solid var(--line);border-radius:10px}
.gprow{padding:9px 12px;border-bottom:1px solid var(--line);cursor:pointer}
.gprow:last-child{border-bottom:none}
.gprow:hover{background:var(--tint)}
.gprow .nm{font-weight:700}
.gprow .mt{color:var(--muted);font-size:12px}
.gpmeta{display:flex;align-items:center;gap:6px;margin-top:5px;font-size:12px}
.genv .gvctx{flex:none;font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.genv .gvctx select{border:1px solid var(--line);border-radius:7px;padding:4px 8px;font-family:var(--font);font-size:12px;color:var(--ink);background:#fff}
.genv .gvtabbar{display:none}
.genv .gvmain{flex:1;display:grid;grid-template-columns:minmax(300px,4fr) 6fr;min-height:0}
.genv .gvmain.solo{grid-template-columns:1fr}
.genv .gvmain.solo .gvright{display:none}
.genv .gvcol{min-height:0;display:flex;flex-direction:column}
.genv .gvleft{border-right:1px solid var(--line)}
.genv .gvmain.solo .gvleft{border-right:none}
.genv .gvright{background:#FCFBF9}
.genv .collab{font-size:12px;color:var(--muted);font-weight:700;padding:10px 14px 4px;flex:none}
.genv .msgs{flex:1;overflow-y:auto;padding:6px 14px;display:flex;flex-direction:column;gap:9px}
.genv .b{max-width:90%;padding:8px 11px;border-radius:12px;font-size:12.5px;line-height:1.6}
.genv .b.me{align-self:flex-end;background:var(--teal);color:#fff;border-radius:12px 12px 3px 12px}
.genv .b.ai{align-self:flex-start;background:#fff;border:1px solid var(--line);border-radius:12px 12px 12px 3px}
.genv .ginp{flex:none;padding:8px 14px 12px;display:flex;gap:7px;align-items:flex-end}
.genv .ginp textarea{flex:1;border:1px solid var(--line);border-radius:12px;padding:9px 11px;font-family:var(--font);font-size:13px;resize:none;height:40px;color:var(--ink)}
.genv .ginp textarea:focus{outline:none;border-color:var(--yellow);box-shadow:0 0 0 3px var(--y-50)}
.genv .gsend{width:38px;height:38px;flex:none;background:var(--teal);color:#fff;border:none;border-radius:10px;cursor:pointer;font-size:17px}
.genv .gsend:hover{background:var(--teal-d)}
.genv .preview{flex:1;overflow-y:auto;padding:14px}
.genv .empty{color:var(--muted);text-align:center;padding:70px 24px;font-size:13px}
.genv .gvexp{flex:none;border-top:1px solid var(--line);background:#fff;padding:11px 16px;display:flex;gap:9px;align-items:center}
.genv .gvexp .h{flex:1;font-size:12px;color:var(--muted);font-weight:700;margin:0}
.genv .dl{border:none;background:var(--teal);color:#fff;border-radius:10px;padding:9px 20px;font-weight:700;font-family:var(--font);font-size:13px;cursor:pointer}
.genv .dl:disabled{background:#B9C7C2;cursor:not-allowed}
.genv .dl:hover:not(:disabled){background:var(--teal-d)}
.genv .dl.ghost{background:#fff;color:var(--teal);border:1px solid var(--teal)}
.genv .dl.ghost:hover:not(:disabled){background:var(--tint)}
.genv .dl.ghost:disabled{background:#fff;color:#B9C7C2;border-color:var(--line)}
.genv .dots3{display:inline-flex;gap:4px;align-items:center;color:var(--teal)}
.genv .dots3 span{width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.35;animation:dbounce 1s infinite}
.genv .dots3 span:nth-child(2){animation-delay:.15s}
.genv .dots3 span:nth-child(3){animation-delay:.3s}
@keyframes dbounce{0%,60%,100%{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}
.genv .genbar{display:flex;align-items:center;gap:9px;color:var(--teal-d);font-size:12.5px;padding:10px 13px;background:var(--tint);border:1px solid var(--line);border-radius:12px;margin:0 auto 12px;max-width:660px}
.genv .docpage{background:#fff;border:1px solid var(--line);box-shadow:0 1px 6px rgba(0,0,0,.06);border-radius:3px;padding:24px 28px;max-width:660px;margin:0 auto;color:#23302C;font-size:12.5px}
.genv .docttl{text-align:center;font-size:19px;font-weight:800;color:var(--teal-d)}
.genv .docsub{text-align:center;font-style:italic;color:var(--muted);font-size:12px;margin-top:3px}
.genv .docorg{text-align:center;color:var(--teal);font-size:12px;border-bottom:2px solid var(--teal);padding-bottom:8px;margin:6px 0 14px}
.genv .docsec{margin-bottom:16px}
.genv .dsh{font-weight:800;color:var(--teal-d);font-size:14px;border-left:3px solid var(--teal);padding-left:8px;margin-bottom:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.genv .dbadge{font-size:12px;font-weight:700;color:var(--teal-d);background:var(--tint);border:1px solid var(--line);border-radius:20px;padding:1px 9px}
.genv .dnote{background:#EAF3F0;border:1px solid var(--line);border-radius:8px;padding:8px 11px;color:#2E6B5E;font-size:12px;margin-bottom:12px}
.genv .dmeta{font-size:12px;color:#3c4a45;margin:4px 0}
.genv .dmeta b{color:var(--teal-d)}
.genv .dp{font-size:12.5px;color:#3c4a45;margin:2px 0 4px;line-height:1.6}
.genv .dss{font-weight:700;color:var(--teal-d);margin:9px 0 3px}
.genv .dul,.genv .dol{margin:2px 0 2px 22px;padding:0}
.genv .dul li,.genv .dol li{margin:3px 0;color:#3c4a45}
.genv .doccov{border-top:1px dashed var(--line);padding-top:10px;margin-top:10px;color:#3c4a45}
.genv .dtbl{border-collapse:collapse;width:100%;font-size:12px;margin-top:4px}
.genv .dtbl th,.genv .dtbl td{border:1px solid var(--line);padding:4px 7px;text-align:left}
.genv .dtbl th{background:var(--tint);color:var(--teal-d)}
.genv .fitpanel{background:#FFFBF2;border:1px solid #EBD7A8;border-radius:8px;padding:10px 14px;margin:0 auto 12px;max-width:660px;font-size:12px}
.genv .fitpanel .fh{font-weight:700;color:#6b551f}
.genv .fitbar{display:flex;align-items:center;gap:8px;cursor:pointer;user-select:none}
.genv .fitbar .fsum{display:flex;gap:6px;margin-left:auto}
.genv .fitbar .chev{font-style:normal;color:#6b551f;font-size:12px;transition:transform .15s;flex:none}
.genv .fitbar.open .chev{transform:rotate(90deg)}
.genv .fitnames{font-size:12px;color:#7a5a12;margin-top:6px}
.genv .fitload{display:flex;gap:8px;align-items:center;color:#6b551f;padding:6px 0 2px}
.genv .fcard{padding:9px 0;border-top:1px solid #F0E6CC}
.genv .fct{display:flex;align-items:center;gap:8px;margin-bottom:4px}
.genv .fct .fn{font-weight:700;color:var(--teal-d)}
.genv .fb{font-size:12px;padding:1px 9px;border-radius:20px;font-weight:700}
.genv .fb.ok{background:#E1F5EE;color:#0F6E56}
.genv .fb.warn{background:#FAEEDA;color:#854F0B}
.genv .fl{display:flex;gap:6px;color:#3c4a45;line-height:1.6;padding:1px 0}
.genv .fl i{font-style:normal;flex:none;color:#1D9E75}
.genv .fl.warn{color:#7a5a12}
.genv .fl.warn i{color:#BA7517}
/* 手机端：顶部标签切换「对话 / 预览」，一次一屏 */
@media(max-width:760px){
  .genv{height:calc(100vh - 92px);border-radius:10px}
  .genv .gvhead{flex-wrap:wrap;row-gap:6px}
  .genv .gvbound{flex-basis:100%;order:9}   /* 窄屏单独占一行，否则「正在改《…》」的脱离× 被挤出屏幕点不到 */
  .genv .gvtabbar{display:none;gap:6px;padding:7px 12px;background:#fff;border-bottom:1px solid var(--line);flex:none}
  .genv.has-doc .gvtabbar{display:flex}
  .genv .gvtabbar button{flex:1;border:1px solid var(--line);background:#fff;color:var(--teal-d);border-radius:9px;padding:9px 0;font-size:13px;font-weight:700;font-family:var(--font);cursor:pointer}
  .genv .gvtabbar button.on{background:var(--teal);color:#fff;border-color:var(--teal)}
  .genv .gvmain{grid-template-columns:1fr}
  .genv .gvleft{border-right:none}
  .genv.has-doc.mtab-preview .gvleft{display:none}
  .genv.has-doc.mtab-preview .gvright{display:flex}
  .genv.has-doc.mtab-chat .gvright{display:none}
  .genv .preview{padding:10px}
  .genv .docpage{padding:16px 15px;max-width:none}
  .genv .fitpanel{max-width:none}
  .genv .gvexp{padding:9px 12px;flex-wrap:wrap}
}

/* ---- 课表：FullCalendar 主题化 + 课程库拖拽 ---- */
#calRoot{font-family:var(--font);font-size:13px}
#calRoot .fc{--fc-border-color:var(--line);--fc-today-bg-color:var(--tint);--fc-page-bg-color:var(--card);--fc-neutral-bg-color:#f7f4ee}
#calRoot .fc .fc-toolbar-title{font-size:17px;font-weight:800;color:var(--teal-d)}
#calRoot .fc .fc-button{background:var(--teal);border-color:var(--teal);font-family:var(--font);font-weight:600;box-shadow:none;text-transform:none}
#calRoot .fc .fc-button:hover{background:var(--teal-d);border-color:var(--teal-d)}
#calRoot .fc .fc-button-primary:not(:disabled).fc-button-active,#calRoot .fc .fc-button-primary:not(:disabled):active{background:var(--teal-d);border-color:var(--teal-d)}
#calRoot .fc .fc-button:focus{box-shadow:0 0 0 3px rgba(46,107,94,.25)}
#calRoot .fc .fc-col-header-cell-cushion{color:var(--muted);font-weight:600;padding:6px 4px}
#calRoot .fc .fc-daygrid-day-number{color:var(--ink);padding:4px 6px}
#calRoot .fc .fc-daygrid-day.fc-day-today .fc-daygrid-day-number{color:var(--teal-d);font-weight:800}
#calRoot .fc-event{cursor:pointer;font-size:12px;padding:1px 4px;border-radius:5px}
#calRoot .fc-daygrid-day-frame{min-height:78px}
.rcard.fc-drag{transition:box-shadow .12s,transform .06s}
.rcard.fc-drag:hover{box-shadow:0 2px 10px rgba(30,35,33,.12)}
.rcard.fc-drag:active{cursor:grabbing}
.drag-h{color:var(--muted);cursor:grab;user-select:none;font-size:13px}
@media (max-width:820px){.schedgrid{grid-template-columns:1fr!important}}

/* ---- 时间块（草图）视图 tbview ---- */
.tbview .tb-note{background:var(--tint);border:1px solid var(--line);border-radius:12px;padding:12px 16px;margin-bottom:16px;font-size:13px;color:var(--teal-d)}
.tbview .tb-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:start}
@media(max-width:900px){.tbview .tb-grid{grid-template-columns:1fr}}
.tbview .tb-acthead{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.tbview .tb-acthead .t{font-size:17px;font-weight:800;color:var(--teal-d)}
.tbview .tb-acthead .th{color:var(--muted);font-size:13px}
.tbview .tb-switch{margin-left:auto;display:flex;gap:6px}
.tbview .tb-switch button{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 10px;font-family:var(--font);font-size:12.5px;cursor:pointer;color:var(--ink)}
.tbview .tb-switch button.on{background:var(--teal);color:#fff;border-color:var(--teal)}
.tbview .tb-block{display:flex;gap:12px;padding:12px 12px 12px 0;border-radius:12px;margin-bottom:10px;border:1px solid var(--line);overflow:hidden;background:#fff;cursor:pointer}
.tbview .tb-block.sel{outline:2px solid var(--teal);outline-offset:-1px}
.tbview .tb-stripe{width:6px;flex:none;align-self:stretch}
.tbview .tb-body{flex:1;min-width:0;padding:2px 0}
.tbview .tb-row1{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tbview .tb-ico{font-size:16px}
.tbview .tb-lbl{font-weight:700}
.tbview .tb-why{color:var(--muted);font-size:12.5px;margin-top:3px}
.tbview .tb-place{font-size:12px;margin-top:5px;color:var(--teal-d);font-weight:700}
.tbview .tb-dur{background:var(--ink);color:#fff;font-size:12px;font-weight:700;padding:1px 8px;border-radius:20px;white-space:nowrap}
.tbview .tb-anchor{font-size:12px;font-weight:700;color:#fff;background:var(--teal-d);padding:1px 8px;border-radius:20px}
.tbview .tb-totals{display:flex;gap:18px;margin-top:6px;padding-top:12px;border-top:1px dashed var(--line);font-size:13px}
.tbview .tb-totals .n{font-weight:800;color:var(--teal-d);font-size:16px}
.tbview .tb-totals .k{color:var(--muted);font-size:12px}
.tbview .tb-weektabs{display:flex;gap:6px;margin-bottom:10px}
.tbview .tb-weektab{flex:1;text-align:center;border:1px solid var(--line);background:#fff;border-radius:9px;padding:6px 4px;cursor:pointer;font-size:12.5px;line-height:1.3}
.tbview .tb-weektab.on{background:var(--teal);color:#fff;border-color:var(--teal)}
.tbview .tb-weektab.anchor{border-color:var(--teal)}
.tbview .tb-weektab .cnt{display:block;font-size:12px;opacity:.7;margin-top:1px}
.tbview .tb-editor{display:none;border:1px solid var(--teal);background:var(--tint);border-radius:11px;padding:11px 13px;margin-bottom:10px}
.tbview .tb-editor.show{display:block}
.tbview .tb-er{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.tbview .tb-er+.tb-er{margin-top:9px}
.tbview .tb-lab{color:var(--muted);font-size:12px}
.tbview .tb-step{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 11px;cursor:pointer;font-family:var(--font);font-size:13px;font-weight:700;color:var(--teal-d)}
.tbview .tb-step:hover{background:#f2efe6}
.tbview .tb-step.ghost{color:var(--muted);font-weight:400}
.tbview .tb-step.done{margin-left:auto;background:var(--teal);color:#fff;border-color:var(--teal)}
.tbview .tb-val{font-weight:800;color:var(--teal-d);min-width:54px;text-align:center}
.tbview .tb-allday{display:flex;flex-direction:column;gap:6px;margin-bottom:8px}
.tbview .tb-chip{border:1px dashed var(--gold);background:#fbf7f1;border-radius:9px;padding:8px 11px;cursor:pointer;font-size:12.5px;display:flex;gap:8px;align-items:center}
.tbview .tb-chip.sel{outline:2px solid var(--teal)}
.tbview .tb-chip .hint{color:var(--muted);margin-left:auto;font-size:12px}
.tbview .tb-timeline{position:relative;border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden}
.tbview .tb-tlinner{position:relative}
.tbview .tb-hourline{position:absolute;left:0;right:0;border-top:1px solid #eef2f0}
.tbview .tb-hourlbl{position:absolute;left:6px;font-size:12px;color:var(--muted);transform:translateY(-7px)}
.tbview .tb-lane{position:absolute;left:48px;right:8px;top:0;bottom:0}
.tbview .tb-ev{position:absolute;left:0;right:0;border-radius:8px;padding:3px 9px;font-size:12px;overflow:hidden;color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.35);cursor:pointer}
.tbview .tb-ev .evt{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.35}
.tbview .tb-ev .evd{opacity:.9;font-size:12px}
.tbview .tb-ev.busy{background:repeating-linear-gradient(45deg,#c9d3cf,#c9d3cf 6px,#bfcac6 6px,#bfcac6 12px);color:#3c4b46;cursor:default;box-shadow:none}
.tbview .tb-ev.collide{box-shadow:0 0 0 2px var(--warn)}
.tbview .tb-ev.sel{box-shadow:0 0 0 3px var(--teal),inset 0 0 0 1px rgba(255,255,255,.5);z-index:3}
.tbview .tb-reminder{margin-top:14px;border:1px solid var(--teal);background:var(--tint);border-radius:12px;padding:13px 15px}
.tbview .tb-reminder h4{margin:0 0 8px;color:var(--teal-d);font-size:13.5px}
.tbview .tb-rrow{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:3px 0}
.tbview .tb-rrow .d{color:var(--muted);min-width:66px}
.tbview .tb-warn{color:var(--warn);font-weight:700;margin-top:8px;font-size:12.5px}
.tbview .tb-datatoggle{margin-top:20px;text-align:center}
.tbview .tb-data{background:#0f1e1b;color:#cfe3dc;border-radius:12px;padding:16px 18px;overflow:auto;font-size:12px;line-height:1.55;margin-top:14px;display:none}
.tbview .tb-data .k{color:#7fd1b9}
.tbview .tb-data .s{color:#e6c079}
.tbview .tb-data .n{color:#9ecbff}

/* 时间块：日历全宽视图 */
.tbview .tb-calhead{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.tbview .tb-calhead .tb-switch{margin-left:auto}

/* 时间块：Apple 日历式（FullCalendar）主题化 */
.tbview .tb-hint{background:var(--tint);border:1px solid var(--line);border-radius:12px;padding:10px 14px;margin-bottom:14px;font-size:12.5px;color:var(--teal-d)}
.tbview #tbCal{font-family:var(--font);font-size:13px}
.tbview .fc{--fc-border-color:var(--line);--fc-today-bg-color:var(--tint);--fc-now-indicator-color:var(--warn);--fc-page-bg-color:var(--card)}
.tbview .fc .fc-toolbar.fc-header-toolbar{margin-bottom:12px;gap:8px;flex-wrap:wrap}
.tbview .fc .fc-toolbar-title{font-size:18px;font-weight:800;color:var(--teal-d)}
.tbview .fc .fc-button{background:var(--teal);border-color:var(--teal);font-family:var(--font);font-weight:600;box-shadow:none;text-transform:none;padding:5px 11px}
.tbview .fc .fc-button:hover{background:var(--teal-d);border-color:var(--teal-d)}
.tbview .fc .fc-button-primary:not(:disabled).fc-button-active{background:var(--teal-d);border-color:var(--teal-d)}
.tbview .fc .fc-button:focus{box-shadow:0 0 0 3px rgba(46,107,94,.25)}
.tbview .fc .fc-planWeek-button,.tbview .fc .fc-planDay-button{background:var(--gold);border-color:var(--gold)}
.tbview .fc .fc-planWeek-button:hover,.tbview .fc .fc-planDay-button:hover{background:#9a763f;border-color:#9a763f}
.tbview .fc .fc-col-header-cell-cushion{color:var(--muted);font-weight:600;padding:8px 4px}
.tbview .fc .fc-timegrid-slot{height:2.1em}
.tbview .fc .fc-timegrid-axis-cushion,.tbview .fc .fc-timegrid-slot-label-cushion{color:var(--muted);font-size:12px}
.tbview .fc-event{cursor:pointer;border-radius:5px;font-size:12px}
.tbview .fc-event .fc-event-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* 时间块：单击高亮整节 + 可读详情弹窗 */
.tbview .fc-event.tb-sel{box-shadow:0 0 0 2px #fff,0 0 0 4px var(--teal);filter:saturate(1.2);z-index:5}
.tb-detail{background:var(--tint);border-radius:10px;padding:11px 14px;margin:0 0 14px}
.tb-drow{display:flex;gap:10px;align-items:center;font-size:14px;padding:3px 0;color:var(--ink)}
.tb-drow .ic{width:20px;text-align:center;flex:none}
.tb-seq-h{font-size:12px;color:var(--muted);margin:0 0 6px}
.tb-seq{border:1px solid var(--line);border-radius:10px;overflow:hidden;margin-bottom:14px}
.tb-seqrow{display:flex;gap:9px;align-items:center;padding:8px 13px;font-size:13px;border-top:1px solid var(--line)}
.tb-seqrow:first-child{border-top:none}
.tb-seqrow.on{background:var(--tint);font-weight:700;color:var(--teal-d)}
.tb-seqrow .t{margin-left:auto;color:var(--muted);font-size:12.5px;font-weight:400}
.tb-link{display:inline-flex;align-items:center;gap:6px;color:var(--teal);font-weight:700;cursor:pointer;text-decoration:none;font-size:13.5px;margin:0 0 14px}
.tb-link:hover{color:var(--teal-d);text-decoration:underline}
.tb-adjust{border-top:1px dashed var(--line);padding-top:12px}
.tb-adjust .lbl{font-size:12px;color:var(--muted);margin:0 0 8px}

/* 时间块：班级选择条 */
.tbview .tb-clsbar{display:flex;align-items:center;gap:10px;margin-bottom:12px;font-size:13px;color:var(--teal-d)}
.tbview .tb-clsbar select{border:1px solid var(--line);border-radius:8px;padding:6px 9px;font-family:var(--font)}
.tbview .tb-clsbar .tb-hintline{color:var(--muted);font-size:12px;margin-left:auto}
/* 排课操作记录（谁改的·可撤销） */
.tb-log{max-height:52vh;overflow:auto;border:1px solid var(--line);border-radius:10px}
.tb-logrow{display:grid;grid-template-columns:1fr auto;gap:2px 10px;padding:8px 11px;border-bottom:1px solid var(--line)}
.tb-logrow:last-child{border-bottom:none}
.tb-logmain{font-size:13px;color:#243330}
.tb-logmeta{font-size:12px;color:var(--muted);grid-column:1}
.tb-logact{grid-row:1/3;grid-column:2;align-self:center}
.tb-logdone{font-size:12px;color:var(--muted)}

/* 时间块：本周能力覆盖矩阵 */
.tbview .tb-mtitle{font-weight:800;color:var(--teal-d);font-size:14px;margin-bottom:10px;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.tbview .tb-mtitle .miss{color:var(--warn);font-weight:700;font-size:12.5px}
.tbview .tb-mtitle .ok{color:var(--teal);font-weight:700;font-size:12.5px}
.tbview .tb-mscroll{overflow-x:auto;border:1px solid var(--line);border-radius:12px}
.tbview .tb-mtable{border-collapse:collapse;width:100%;font-size:13px}
.tbview .tb-mtable th,.tbview .tb-mtable td{border:1px solid var(--line);padding:7px 10px;text-align:center;white-space:nowrap}
.tbview .tb-mtable th{background:var(--tint);color:var(--teal-d);font-weight:700;font-size:12px}
.tbview .tb-mtable th .cn{display:block;font-weight:400;color:var(--muted);font-size:12px;margin-top:1px}
.tbview .tb-mtable th.miss{background:#f7e4e6;color:var(--warn)}
.tbview .tb-mtable th.miss .cn{color:var(--warn)}
.tbview .tb-mtable th.act,.tbview .tb-mtable td.act{text-align:left;position:sticky;left:0;z-index:1}
.tbview .tb-mtable td.act{background:#fff}
.tbview .tb-mtable td.act .d{color:var(--muted);font-size:12px;margin-left:6px}
.tbview .tb-mtable td.on{color:var(--teal);font-weight:800}
.tbview .tb-mtable td.off{color:#cdd8d3}
.tbview .tb-mtable tr.sum td{background:#f7f4ee;font-weight:800}
.tbview .tb-mtable tr.sum td.miss{color:var(--warn);background:#f7e4e6}

/* 时间块：排课进度条（可跨刷新恢复） */
.tbview .tb-progress{align-items:center;gap:2px;background:var(--tint);border:1px solid var(--teal);border-radius:10px;padding:9px 13px;margin-bottom:12px;font-size:13px;color:var(--teal-d)}
.tbview .tb-progress b{color:var(--teal-d)}
.tbview .tb-progress .hint{color:var(--muted);font-size:12px;font-weight:400;margin-left:6px}
.tbview .tb-spin{display:inline-block;animation:tbspin 1.6s linear infinite;margin-right:4px}
@keyframes tbspin{to{transform:rotate(360deg)}}

/* 时间块：覆盖矩阵可折叠 */
.tbview .tb-mtitle{cursor:pointer;user-select:none}
.tbview .tb-chev{color:var(--muted);font-size:12px;margin-right:6px;display:inline-block;width:10px}
.tbview .tb-mbody{margin-top:2px}

/* 时间块：覆盖矩阵——色点网格样式 */
.tbview .tb-msub{font-weight:600;color:var(--muted);font-size:13px;margin-left:10px}
.tbview .tb-mdesc{color:var(--muted);font-size:12.5px;margin:0 0 14px;line-height:1.6}
.tbview .tb-dot{display:inline-block;width:11px;height:11px;border-radius:50%;vertical-align:middle}
.tbview .tb-mscroll{overflow-x:auto;border:1px solid var(--line);border-radius:12px;background:#fff}
.tbview .tb-mtable{border-collapse:collapse;width:100%;font-size:13px}
.tbview .tb-mtable th,.tbview .tb-mtable td{padding:11px 12px;text-align:center;border:none;border-top:1px solid #eef2f0;white-space:nowrap}
.tbview .tb-mtable thead th{border-top:none;background:var(--tint);color:var(--teal-d);font-weight:700;vertical-align:bottom;font-size:12px}
.tbview .tb-mtable thead th .cn{display:block;font-weight:600;margin-top:7px;font-size:12px}
.tbview .tb-mtable th.act,.tbview .tb-mtable td.act{text-align:left;position:sticky;left:0;background:#fff}
.tbview .tb-mtable thead th.act{background:var(--tint);vertical-align:middle}
.tbview .tb-mtable td.act{color:var(--ink)}
.tbview .tb-mtable td.act .d{color:var(--muted);font-size:12px;margin-left:6px;font-weight:400}
.tbview .tb-mtable tr.sum td{font-weight:800;color:var(--teal-d);border-top:2px solid var(--line)}
.tbview .tb-mtable tr.sum td.miss{color:var(--warn)}
.tbview .tb-mfoot{margin-top:14px;padding:10px 14px;border-radius:10px;font-size:12.5px;font-weight:600}
.tbview .tb-mfoot.ok{background:var(--tint);color:var(--teal-d)}
.tbview .tb-mfoot.warn{background:#f7e4e6;color:var(--warn)}

/* 课程库：多选删除 */
.cura-card.selc{outline:2px solid var(--teal);outline-offset:-1px;background:var(--tint)}
.cura-cb{width:16px;height:16px;flex:none;cursor:pointer;accent-color:var(--teal)}

/* SOP 观察 4 问 */
.q4box{border:1px solid #bfe0d7;background:#f3faf7;border-radius:12px;padding:12px 14px;margin:6px 0 12px}
.q4hd{font-weight:800;color:var(--teal-d);font-size:13.5px;margin-bottom:8px;display:flex;align-items:center;flex-wrap:wrap;gap:6px}
.q4mock{font-weight:400;color:var(--warn);font-size:12px;margin-left:6px}
/* 一周一份：让老师一眼知道这套题管一整周，不是这一节专属的 */
.q4week{font-weight:600;color:var(--teal);font-size:12px;margin-left:6px;background:var(--tint);border-radius:999px;padding:1px 8px}
.q4link{margin-left:auto;font-weight:600}
/* 直达链接落地时闪一下，指明该看哪一块 */
.cdflash{animation:cdflash 2s ease-out}
@keyframes cdflash{0%,55%{background:#fdf3d4}100%{background:transparent}}
.q4{background:#fff;border:1px solid var(--line);border-radius:9px;padding:8px 11px;margin:6px 0}
.q4h{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:3px}
.q4q{font-size:14px;color:#243330}
.q4t{color:var(--muted);font-size:12px}
.qform{display:inline-block;color:#fff;border-radius:6px;padding:1px 7px;font-size:12px;font-weight:700}
.qform.yn{background:var(--teal)}.qform.cq{background:#4C86C2}.qform.fs{background:#C0894B}
.q4sub{font-size:12.5px;color:var(--muted);margin:2px 0 8px}
.q4scroll{overflow-x:auto;border:1px solid var(--line);border-radius:10px;background:#fff}
.q4grid{border-collapse:collapse;font-size:12.5px;min-width:100%}
.q4grid th,.q4grid td{border:1px solid #eef2f0;padding:6px 8px}
.q4grid thead th{background:var(--tint);color:var(--teal-d);font-weight:700;position:sticky;top:0}
.q4grid th.q4rh,.q4grid td.q4rh{text-align:left;position:sticky;left:0;background:#fff;min-width:84px;white-space:nowrap;font-weight:600}
.q4grid thead th.q4rh{background:var(--tint)}
.q4grid th.q4qcol{text-align:left;vertical-align:top;min-width:150px;max-width:230px;white-space:normal}
.q4grid th.q4qcol .q4qt{font-weight:400;color:var(--ink);margin-top:4px;line-height:1.4;font-size:12px}
.q4grid td.q4c{text-align:center;color:var(--teal-d);font-size:15px;min-width:60px}
.q4grid td.q4c.blank{background:#fcfdfd}
/* 登记表的格子是真控件：点一下就落库（没有保存按钮）。手指要够得着——
   幼教是在教室里、用手机点这张表的，44px 是能稳稳点中的下限。 */
.q4grid td.q4c{padding:2px}
.q4ck{width:22px;height:22px;margin:0;cursor:pointer;accent-color:var(--teal)}
.q4grid td.q4c:has(.q4ck){min-height:44px}
.q4in{width:100%;min-width:130px;border:1px solid var(--line);border-radius:6px;padding:7px 8px;font-size:13px;font-family:inherit;background:#fff}
.q4in:focus{outline:2px solid var(--teal);outline-offset:-1px}
/* 存的时候淡一下，存上了闪一下绿——老师点完要立刻知道记上没有 */
.q4ck.saving,.q4in.saving{opacity:.45}
.q4ck.saved{outline:2px solid var(--ok,#3a9a6d);outline-offset:2px;border-radius:4px}
.q4in.saved{border-color:var(--ok,#3a9a6d)}
.q4why{font-size:12.5px;color:var(--muted);margin-top:8px;line-height:1.55}
.q4sel{font-size:12.5px;color:var(--teal-d);margin-top:5px}
/* 观察4问·状态占位（课程详情） */
.q4stat{border-radius:10px;padding:11px 14px;font-size:13px;line-height:1.6;margin:6px 0 12px}
.q4stat.pend{background:#fbf7ee;border:1px solid #ecdcc0;color:#7a5f2e}
.q4stat.gen{background:#f3faf7;border:1px solid #bfe0d7;color:var(--teal-d)}
/* 观察4问·状态徽章（课表日详情） */
.tb-obs{border-radius:8px;padding:7px 11px;font-size:12.5px;font-weight:600;margin:8px 0}
.tb-obs.ready{background:#f3faf7;color:var(--teal-d)}
.tb-obs.gen{background:#eef6fb;color:#2f6ea0}
.tb-obs.pend{background:#fbf7ee;color:#7a5f2e}

/* ---- 合规审议页 ---- */
.cprow{display:flex;gap:14px;align-items:stretch}
.cpta{flex:1;border:1px solid var(--line);border-radius:10px;padding:12px;font-family:var(--font);font-size:13px;line-height:1.7;resize:vertical;background:#fff;color:var(--ink)}
.cpside{width:150px;display:flex;flex-direction:column;gap:8px}
.cphint{font-size:12px;color:var(--muted);line-height:1.5}
.cpin{flex:1;border:1px solid var(--line);border-radius:8px;padding:8px 10px;font-family:var(--font);font-size:13px}
.cplock{font-size:12px;font-weight:600;color:var(--muted);background:var(--tint);border-radius:20px;padding:2px 10px;margin-left:6px}
.cpwarn{background:#FDF6E7;border:1px solid var(--gold);color:#7A5E22;border-radius:9px;padding:9px 12px;font-size:12.5px;margin-bottom:12px}
.cpthemes{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:16px}
.cptheme{font-size:12px;border:1px solid var(--line);border-radius:20px;padding:4px 12px;color:var(--muted);background:#fff}
.cptheme.on{border-color:var(--teal);color:var(--teal);font-weight:600;background:var(--tint)}
.cph4{font-size:13px;font-weight:700;margin:16px 0 8px;color:var(--ink)}
.cph4 small{font-weight:400;color:var(--muted);margin-left:6px}
.cpweeks{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px}
.cpweek{text-align:left;background:#fff;border:1px solid var(--line);border-radius:11px;padding:12px 14px;cursor:pointer;font-family:var(--font);transition:.15s;display:flex;flex-direction:column;gap:3px}
.cpweek:hover{border-color:var(--teal);background:var(--tint)}
.cpweek b{font-size:13.5px;color:var(--teal-d)}
.cpweek span{font-size:13px;color:var(--ink)}
.cpweek small{font-size:12px;color:var(--muted)}
.cpgates{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-top:14px}
.cpgate{border:1px solid var(--line);border-radius:11px;padding:12px 14px;background:#fff}
.cpgate.ok{border-color:var(--teal);background:var(--tint)}
.cpgate.no{border-color:var(--warn);background:#FDF2F4}
.cpgt{font-size:12.5px;font-weight:700;color:var(--ink)}
.cpgn{font-size:22px;font-weight:800;color:var(--teal-d);line-height:1.2}
.cpgn small{font-size:13px;font-weight:600;color:var(--muted)}
.cpgs{font-size:12px;font-weight:600;color:var(--muted)}
.cpgd{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.4}
.cpllm{margin-top:14px;background:var(--tint);border:1px solid var(--line);border-radius:10px;padding:11px 14px;font-size:12.5px;color:var(--ink);display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.cpfp{font-size:12px;color:var(--muted);font-family:ui-monospace,monospace}
.cpcols{display:grid;grid-template-columns:1.3fr 1fr;gap:18px;align-items:start}
@media(max-width:1000px){.cpcols{grid-template-columns:1fr}}
.cpday{border:1px solid var(--line);border-radius:11px;margin-bottom:10px;overflow:hidden}
.cpdh{background:var(--tint);padding:8px 12px;font-size:13px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cpact{display:grid;grid-template-columns:18px 1fr 74px 66px 42px 36px;gap:6px;align-items:center;padding:6px 12px;font-size:12.5px;border-top:1px solid var(--line)}
.cpact.locked{background:#FCFBF8}
.cpan{font-weight:600;color:var(--ink)}
.cpat,.cpaf,.cpad,.cpao{color:var(--muted);font-size:12px}
.cpag{display:none}
.cpcov{display:flex;align-items:center;gap:9px;margin-bottom:7px;font-size:12.5px}
.cpcd{width:34px;color:var(--ink)}
.cpcbar{flex:1;height:9px;background:var(--tint);border-radius:6px;overflow:hidden}
.cpcbar i{display:block;height:100%;background:var(--teal);border-radius:6px}
.cpcbar i.low{background:var(--warn)}
.cpcp{width:36px;text-align:right;color:var(--muted);font-weight:600}
.cpcp.low{color:var(--warn)}
.cpn{font-size:12px;background:var(--teal);color:#fff;border-radius:20px;padding:1px 9px;font-weight:700;margin-left:5px}
.cpcmt{border:1px solid var(--line);border-radius:9px;padding:9px 11px;margin-bottom:8px;background:#fff}
.cpcmt.auto{border-left:3px solid var(--warn)}
.cpch{font-size:12px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:7px}
.cpch code{font-weight:400;font-size:12px;color:var(--muted);background:var(--tint);padding:1px 6px;border-radius:4px}
.cpcb{font-size:12.5px;color:var(--muted);margin-top:4px;line-height:1.55}
.cpaddc{display:flex;gap:8px;margin-top:10px}
.cpsig{font-size:12px;font-weight:600;border-radius:20px;padding:3px 10px}
.cpsig.ok{background:var(--tint);color:var(--teal-d)}
.cpsig.stale{background:#FDF2F4;color:var(--warn)}
.cpfail{border-left:3px solid var(--warn);background:#FDF2F4;border-radius:0 9px 9px 0;padding:10px 13px;margin-bottom:9px}
.cpfail.warn{border-left-color:var(--gold);background:#FDF6E7}
.cpfh{font-size:13px;font-weight:700;color:var(--ink)}
.cpfh code{font-size:12px;background:#fff;border:1px solid var(--line);padding:1px 6px;border-radius:4px;font-weight:400}
.cpfe{font-size:12.5px;color:var(--ink);margin-top:3px}
.cpfb{font-size:12px;color:var(--muted);margin-top:3px;line-height:1.5}
.cprule{border-bottom:1px solid var(--line);padding:9px 0}
.cptag{font-size:12px;font-weight:700;border-radius:5px;padding:1px 6px;margin-left:5px}
.cptag.block{background:#FDF2F4;color:var(--warn)}
.cptag.warn{background:#FDF6E7;color:var(--gold)}
.cptag.k{background:var(--tint);color:var(--muted);font-weight:600}
.cpmask{position:fixed;inset:0;background:rgba(20,30,28,.45);display:flex;align-items:flex-start;justify-content:center;z-index:60;padding:24px;overflow-y:auto}
.cpdlg{background:#fff;border-radius:14px;padding:22px;max-width:820px;width:100%}
.cptrail{white-space:pre-wrap;font-family:var(--font);font-size:12.5px;line-height:1.7;color:var(--ink);margin:0}
.cpsig.block{background:#FDF6E7;color:var(--gold)}
.cpday .btn[disabled],.sec-desc .btn[disabled]{opacity:.45;cursor:not-allowed}
.cpdone{background:var(--tint);border:1px solid var(--teal);border-radius:10px;padding:10px 14px;font-size:12.5px;color:var(--teal-d);margin-top:14px}
/* 发下去之后那一行：这一周的主题游戏包（AO）。没生成出来那一句用提醒色 */
.cplight{margin-top:8px;gap:8px;align-items:center}
.cplight .cphint.bad{color:var(--warn);font-weight:700}
.cptrail{font-size:12.5px;line-height:1.7}
.cpth{font-weight:700;color:var(--ink);margin-top:14px}
.cpth:first-child{margin-top:0}
.cptl{color:var(--muted);padding-left:16px;position:relative}
.cptl::before{content:"·";position:absolute;left:6px}
.cptrail code{font-size:12px;background:var(--tint);padding:1px 5px;border-radius:4px;color:var(--teal-d)}
.cptrail b{color:var(--teal-d)}

/* ---- 首页驾驶舱 ---- */
.ovhead{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:16px;flex-wrap:wrap}
.ovh{font-size:19px;font-weight:800;margin:0 0 4px}
.ovh small{font-size:13px;font-weight:400;color:var(--muted);margin-left:8px}
.ovterm{font-size:12.5px;color:var(--muted)}
.ovbadge{font-size:12.5px;font-weight:700;border-radius:20px;padding:6px 15px;white-space:nowrap}
.ovbadge.ok{background:var(--tint);color:var(--teal-d)}
.ovbadge.busy{background:#FDF6E7;color:var(--gold)}
.ovclass{margin-bottom:16px}
.ovclass:last-child{margin-bottom:0}
.ovch{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:wrap;font-size:13.5px}
.ovcb{font-size:12px;color:var(--muted);background:var(--tint);border-radius:20px;padding:2px 9px}
.ovmiss{font-size:12px;font-weight:600;color:var(--warn);background:#FDF2F4;border-radius:20px;padding:2px 10px}
.ovok{font-size:12px;font-weight:600;color:var(--teal);background:var(--tint);border-radius:20px;padding:2px 10px}
.ovdays{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
.ovd{border:1px solid var(--line);border-radius:10px;padding:9px 10px;background:#fff;cursor:pointer;transition:.15s;min-height:78px}
.ovd:hover{border-color:var(--teal);background:var(--tint)}
.ovd.gap{border-style:dashed;border-color:var(--warn);background:#FDF2F4}
.ovdn{font-size:12.5px;font-weight:700;color:var(--ink)}
.ovdc{font-size:12px;color:var(--muted);margin-top:1px}
.ovd.gap .ovdc{color:var(--warn);font-weight:600}
.ovdt{font-size:12px;color:var(--muted);margin-top:5px;line-height:1.45}
.ovinc{margin-top:8px;font-size:12px;color:var(--gold);background:#FDF6E7;border-radius:8px;padding:7px 11px}
.ovcols{display:grid;grid-template-columns:1fr 1fr;gap:18px;align-items:start}
@media(max-width:900px){.ovcols{grid-template-columns:1fr}.ovdays{grid-template-columns:repeat(2,1fr)}}
.ovact{border-left:3px solid var(--line);padding:9px 0 9px 12px;margin-bottom:12px;display:grid;grid-template-columns:1fr auto;gap:4px 12px;align-items:center}
.ovact.high{border-left-color:var(--warn)}
.ovact.mid{border-left-color:var(--gold)}
.ovat{font-size:13.5px;font-weight:600;color:var(--ink)}
.ovad{font-size:12px;color:var(--muted);grid-column:1}
.ovact .btn{grid-row:1/3;grid-column:2}
.ovclear{text-align:center;padding:26px 10px;color:var(--teal);font-size:16px;font-weight:700}
.ovclear small{display:block;font-size:12.5px;font-weight:400;color:var(--muted);margin-top:5px}
.ovalert{border-radius:9px;padding:9px 12px;margin-bottom:8px;cursor:pointer;background:var(--tint);transition:.15s}
.ovalert:hover{filter:brightness(.97)}
.ovalert.warn{background:#FDF6E7}
.ovlt{font-size:13px;font-weight:600;color:var(--ink)}
.ovld{font-size:12px;color:var(--muted);margin-top:2px;line-height:1.5}
.ovzones{display:grid;grid-template-columns:repeat(5,1fr);gap:8px}
@media(max-width:900px){.ovzones{grid-template-columns:repeat(2,1fr)}}
.ovz{border:1px solid var(--line);border-radius:10px;padding:10px;background:#fff}
.ovzd{font-size:12px;color:var(--muted)}
.ovzn{font-size:13.5px;font-weight:700;color:var(--teal-d);margin:2px 0}
.ovza{font-size:12px;color:var(--muted)}
.cpsave{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:14px 0 4px;padding:10px 12px;background:var(--tint);border-radius:9px;font-size:12.5px}
.cpstart{display:flex;align-items:center;gap:7px;color:var(--muted)}

/* ---- 课程审签：卡片 + 逐节审查 ---- */
.cpsaved{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;background:var(--tint);border-radius:11px;padding:14px 16px;margin-top:12px}
.cpsaved b{font-size:14px}
.cpgen{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12.5px;color:var(--muted)}
.cpgen select{border:1px solid var(--line);border-radius:7px;padding:5px 8px;font-family:var(--font);font-size:12.5px;background:#fff}
.cploading{text-align:center;padding:40px 20px;color:var(--muted);font-size:13.5px}
.cpcards{display:grid;grid-template-columns:repeat(5,1fr);gap:10px;margin:14px 0}
@media(max-width:1000px){.cpcards{grid-template-columns:repeat(2,1fr)}}
.cpcard{border:1px solid var(--line);border-radius:12px;padding:13px;background:#fff;cursor:pointer;transition:.15s;display:flex;flex-direction:column;gap:3px;min-height:132px}
.cpcard:hover{border-color:var(--teal);box-shadow:0 2px 10px rgba(46,107,94,.09)}
.cpcard.signed{border-color:var(--teal);background:var(--tint)}
.cpcard.blocked{border-color:var(--warn);background:#FDF2F4}
.cpcd{font-size:12px;color:var(--muted);font-weight:600}
.cpct{font-size:14px;font-weight:700;color:var(--ink);line-height:1.35}
.cpcs{font-size:12px;color:var(--muted)}
.cpcm{font-size:12px;color:var(--muted);margin-top:auto}
.cpcstate{font-size:12px;font-weight:700;border-radius:20px;padding:2px 9px;align-self:flex-start;background:var(--tint);color:var(--muted)}
.cpcstate.signed{background:var(--teal);color:#fff}
.cpcstate.blocked{background:#FDF2F4;color:var(--warn)}
.cpcstate.ready{background:#FDF6E7;color:var(--gold)}
.cpwgs{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:12px;color:var(--muted);border-top:1px solid var(--line);padding-top:12px}
.cpwg{border-radius:20px;padding:3px 11px;background:var(--tint);color:var(--teal-d);font-weight:600}
.cpwg.no{background:#FDF2F4;color:var(--warn)}
.cpwg small{font-weight:400;opacity:.8}
.cpstart2{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px}
.cprev{padding:0;overflow:hidden}
.cprh{display:flex;align-items:center;gap:14px;padding:14px 20px;border-bottom:1px solid var(--line);background:var(--tint);flex-wrap:wrap}
.cprt{flex:1;display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:14px}
.cprc{font-size:12px;color:var(--muted)}
.cprnav{display:flex;gap:7px}
.cprbody{display:grid;grid-template-columns:1.35fr 1fr;min-height:420px}
@media(max-width:1050px){.cprbody{grid-template-columns:1fr}}
.cprleft{padding:18px 20px;border-right:1px solid var(--line)}
.cprright{padding:18px 20px;background:#FCFBF8}
.cprrh{font-size:12.5px;font-weight:700;color:var(--muted);margin-bottom:12px;letter-spacing:.4px}
.cplsrc{font-size:12px;color:var(--muted);background:var(--tint);border-radius:8px;padding:8px 11px;margin-bottom:12px;line-height:1.6}
.cplsub{font-size:12.5px;color:var(--muted);margin-bottom:10px}
.cplact{border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-bottom:10px;background:#fff}
.cplan{font-size:14px;font-weight:700;color:var(--ink);margin-bottom:6px}
.cplab{font-size:12px;font-weight:600;color:var(--muted);background:var(--tint);border-radius:20px;padding:2px 9px;margin-left:7px}
.cpll{font-size:12.5px;color:var(--muted);line-height:1.65;margin-top:5px}
.cpll b{color:var(--ink);margin-right:6px}
.cpll ol{margin:4px 0 0;padding-left:18px}
.cpll li{margin-bottom:3px}
.cplnote{font-size:12.5px;color:var(--muted);background:var(--tint);border-radius:9px;padding:10px 13px;margin-top:10px;line-height:1.65}
.cplnote b{display:block;color:var(--ink);margin-bottom:3px}
.cpckcls{margin-bottom:16px}
.cpchk{border-left:2px solid var(--line);padding:7px 0 7px 11px;margin-bottom:9px}
.cpchk.pass{border-left-color:var(--teal)}
.cpchk.fail,.cpchk.flagged{border-left-color:var(--warn)}
.cpchk[class*="n/a"],.cpchk.skipped{border-left-color:var(--line);opacity:.72}
.cpchh{font-size:12.5px;font-weight:700;color:var(--ink);display:flex;gap:7px;align-items:baseline}
.cpci{font-weight:800}
.cpchk.pass .cpci{color:var(--teal)}
.cpchk.fail .cpci,.cpchk.flagged .cpci{color:var(--warn)}
.cpcw{font-size:12.5px;color:var(--ink);margin-top:3px;line-height:1.6}
.cpcb2{font-size:12px;color:var(--muted);margin-top:3px;line-height:1.5}
.cpcattr{font-size:12px;color:var(--gold);background:#FDF6E7;border-radius:7px;padding:6px 9px;margin-top:5px;line-height:1.5}
.cprfoot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 20px;border-top:1px solid var(--line);background:#fff}
.cprblock{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:13px;font-weight:600;color:var(--warn)}
.cpchk.look{border-left-color:var(--gold)}
.cpckw{font-size:12px;color:var(--gold);background:#FDF6E7;border-radius:7px;padding:6px 9px;margin-top:5px;line-height:1.5}
.cpissue{border:1px solid var(--line);border-radius:12px;padding:15px 17px;margin-bottom:14px;background:#fff}
.cpissue.block{border-color:var(--warn);background:#FDF2F4}
.cpissue.warn{border-color:var(--gold);background:#FDF6E7}
.cpiq{font-size:15px;font-weight:700;color:var(--ink)}
.cpid{font-size:12.5px;color:var(--muted);margin:5px 0 12px;line-height:1.6}
.cpopts{display:grid;gap:8px}
.cpopt{display:grid;grid-template-columns:18px 1fr;gap:3px 9px;align-items:center;border:1px solid var(--line);border-radius:9px;padding:9px 12px;cursor:pointer;background:#fff;transition:.12s}
.cpopt:hover{border-color:var(--teal)}
.cpopt.on{border-color:var(--teal);background:var(--tint)}
.cpopt input{grid-row:1/3;margin:0;accent-color:var(--teal)}
.cpol{font-size:13.5px;font-weight:600;color:var(--ink)}
.cpol em{font-style:normal;font-size:12px;font-weight:700;color:var(--teal);background:var(--tint);border-radius:20px;padding:1px 8px;margin-left:7px}
.cpoh{font-size:12px;color:var(--muted);line-height:1.5}
.cppick{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:7px;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line)}
.cppi{display:flex;align-items:center;gap:8px;font-size:12.5px;border:1px solid var(--line);border-radius:8px;padding:7px 10px;cursor:pointer;background:#fff}
.cppi.on{border-color:var(--teal);background:var(--tint)}
.cppi small{color:var(--muted)}
.cppi input{accent-color:var(--teal);margin:0}
.cpnote{font-size:12.5px;color:var(--teal-d);background:var(--tint);border-radius:9px;padding:9px 13px;margin-bottom:12px}
.cpborrow{font-size:12px;color:var(--gold);background:#FDF6E7;border-radius:20px;padding:1px 7px;margin-left:6px}
.srnext{border:1px solid var(--teal);background:var(--tint)}
.srnext b{font-size:13.5px;color:var(--teal-d)}

/* ---- 排期对话：一问一答摆出这一周每天上什么 ---- */
.scmsgs{max-height:38vh;overflow-y:auto;border:1px solid var(--line);border-radius:11px;
  padding:12px;margin:4px 0 10px;background:#FCFBF8}
.scmsg{max-width:80%;font-size:12.5px;line-height:1.6;border-radius:11px;padding:8px 11px;margin-bottom:8px}
.scmsg.ai{background:#fff;border:1px solid var(--line)}
.scmsg.me{background:var(--teal);color:#fff;margin-left:auto}
.scmsg.busy{color:var(--muted)}
.scgrid{display:grid;grid-template-columns:repeat(5,1fr);gap:7px;margin-top:4px}
.scday{border:1px solid var(--line);border-radius:9px;background:#fff;padding:7px 8px;min-width:0}
.scday>b{font-size:12px;color:var(--teal-d)}
.scslot{margin-top:5px}
.scslot i{font-style:normal;font-size:12px;color:var(--muted);display:block;margin-bottom:2px}
.scslot .wgact{display:block;margin:0 0 3px}
.scnone{font-size:12px;color:var(--line)}
.scbar{display:flex;gap:8px;align-items:center;margin-bottom:10px}
.scbar .cpin{flex:1}
@media(max-width:820px){.scgrid{grid-template-columns:1fr}}

/* ---- 按「周」排的日历：一格就是一周，导入后指出这几周落在哪儿 ---- */
.wkcal{max-height:52vh;overflow-y:auto;margin:4px 0 14px;border:1px solid var(--line);border-radius:11px;padding:10px 12px}
.wkmrow{display:flex;align-items:flex-start;gap:10px;padding:6px 0;border-bottom:1px solid rgba(0,0,0,.05)}
.wkmrow:last-child{border-bottom:none}
.wkmon{width:52px;flex:none;font-size:12.5px;color:var(--teal-d);padding-top:8px}
.wkcells{display:grid;grid-template-columns:repeat(5,1fr);gap:6px;flex:1}
.wkcell{border:1px solid var(--line);background:#fff;border-radius:9px;padding:6px 7px;cursor:pointer;
  font-family:var(--font);text-align:left;min-width:0;display:flex;flex-direction:column;gap:1px}
.wkcell i{font-style:normal;font-size:12px;color:var(--muted)}
.wkcell b{font-size:12px;color:var(--teal-d);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wkcell span{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wkcell:hover{border-color:var(--teal);background:var(--tint)}
.wkcell.on{background:var(--teal);border-color:var(--teal)}
.wkcell.on i,.wkcell.on b,.wkcell.on span{color:#fff}
.wkcell.now{box-shadow:0 0 0 2px rgba(201,162,74,.35)}
.wkcell.taken{background:#FDF6E7;border-color:var(--gold)}
.wkcell.taken .wktaken{color:#7A5E22}
.wkcell.on.taken{background:var(--warn,#B4574B);border-color:var(--warn,#B4574B)}
.wkow{display:block;margin-top:7px;font-size:12px;cursor:pointer}
.wkow input{margin-right:5px;vertical-align:-1px}

/* ---- 合规三步走：老师在链条的哪一步 ---- */
.steps{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 14px}
.step{display:flex;align-items:center;gap:7px;border:1px solid var(--line);background:#fff;
  border-radius:20px;padding:5px 14px 5px 6px;cursor:pointer;font-family:var(--font)}
.step i{width:19px;height:19px;border-radius:50%;background:var(--tint);color:var(--muted);
  font-style:normal;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center}
.step b{font-size:12.5px;font-weight:600;color:var(--muted)}
.step:hover{border-color:var(--teal)}
.step.done i{background:var(--teal);color:#fff}
.step.done b{color:var(--teal-d)}
.step.on{background:var(--teal);border-color:var(--teal)}
.step.on i{background:rgba(255,255,255,.25);color:#fff}
.step.on b{color:#fff}
.stepwhy{flex-basis:100%;margin-top:2px}
@media(max-width:700px){.stepwhy{flex-basis:auto}}

.genmode{display:flex;gap:6px;background:var(--tint);border-radius:10px;padding:4px;margin-bottom:16px;width:fit-content}
.genmode button{border:none;background:none;font-family:var(--font);font-size:13px;font-weight:600;color:var(--muted);padding:7px 16px;border-radius:8px;cursor:pointer}
.genmode button.on{background:#fff;color:var(--teal-d);box-shadow:0 1px 3px rgba(0,0,0,.06)}
.cprow2{display:flex;align-items:center;justify-content:space-between;gap:14px;border:1px solid var(--line);border-radius:11px;padding:13px 16px;margin-bottom:9px;cursor:pointer;background:#fff;transition:.15s}
.cprow2:hover{border-color:var(--teal);background:var(--tint)}
.cprw b{font-size:14px}
.cprw .cphint{display:block;margin-top:2px}
.cpst{font-size:12px;font-weight:700;border-radius:20px;padding:3px 11px;white-space:nowrap}
.cpst.draft{background:var(--tint);color:var(--muted)}
.cpst.in_review{background:#FDF6E7;color:var(--gold)}
.cpst.approved{background:var(--tint);color:var(--teal-d)}
/* 「都批准了，等发给各班」（.approved）是个**中间态**：批完了但老师还看不见，
   所以它留着那个淡底。「已发给各班」才是放出去了，描一道边跟它分开——
   两个状态长一个样的话，她分不出这一周到底有没有到老师手上 */
.cpst.published{background:var(--y-50);color:var(--amber);border:1px solid var(--cream)}
.cpst.scheduled{background:var(--teal);color:#fff}
.cphist{border-left:2px solid var(--line);padding-left:14px}
.cphe{display:grid;grid-template-columns:76px minmax(62px,auto) minmax(0,1fr) auto;gap:10px;align-items:baseline;padding:7px 0;font-size:12.5px;border-bottom:1px solid var(--line)}
.cphe:last-child{border-bottom:none}
.cphw{color:var(--muted);font-size:12px}
.cphk{font-size:12px;font-weight:700;border-radius:20px;padding:1px 8px;text-align:center;background:var(--tint);color:var(--muted);white-space:nowrap}
.cphk.section_rejected{background:#FDF2F4;color:var(--warn)}
.cphk.section_approved{background:var(--tint);color:var(--teal-d)}
.cphk.section_revised,.cphk.revised{background:#FDF6E7;color:var(--gold)}
.cphk.approved,.cphk.plan_approved{background:var(--tint);color:var(--teal-d)}
.cphk.scheduled{background:var(--teal);color:#fff}
.cphd{color:var(--ink);line-height:1.5;min-width:0;overflow-wrap:anywhere}
.cpha{color:var(--muted);font-size:12px}
.ascard{border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:12px;background:#fff}
.asch{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px;font-size:14px}
.asdate{width:150px}
.assum{font-size:12.5px;color:var(--teal-d);background:var(--tint);border-radius:8px;padding:8px 11px;margin-bottom:10px}
.asadj{display:grid;grid-template-columns:18px 1fr;gap:10px;align-items:start;border:1px solid var(--line);border-radius:9px;padding:10px 12px;margin-bottom:8px;cursor:pointer;transition:.12s}
.asadj:hover{border-color:var(--teal)}
.asadj.on{border-color:var(--teal);background:var(--tint)}
.asadj input{margin:3px 0 0;accent-color:var(--teal)}
.asah{font-size:13px;color:var(--ink);line-height:1.55}
.astype{font-size:12px;font-weight:700;border-radius:20px;padding:1px 8px;margin-right:7px;background:var(--gold);color:#fff}
.astype.skip{background:var(--warn)}
.astype.extend{background:var(--teal)}
.astype.shorten{background:var(--muted)}
.asawhy{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.6}
.asawhy b{color:var(--ink)}
.asnone{font-size:12.5px;color:var(--muted);padding:8px 0}

/* ---- 已批准方案：上传 / 切换 / 查看内容 ---- */
.wgimp{display:flex;flex-direction:column;gap:12px}
.wgdrop{display:flex;align-items:center;gap:14px;border:2px dashed var(--line);border-radius:12px;padding:18px 20px;background:#FCFBF8;transition:.15s}
.wgdrop.over{border-color:var(--teal);background:var(--tint)}
.wgdi{font-size:26px;line-height:1}
.wgdrop b{font-size:14px}
.wgdrop .btn{margin-left:auto}
.wgor{text-align:center;font-size:12px;color:var(--muted);position:relative}
.wgor::before,.wgor::after{content:"";position:absolute;top:50%;width:calc(50% - 44px);height:1px;background:var(--line)}
.wgor::before{left:0}.wgor::after{right:0}
.wgimpf{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.wgplan{border:1px solid var(--line);border-radius:12px;padding:14px 16px;background:var(--tint)}
.wgph b{font-size:15px}
.wgbadge{font-size:12px;font-weight:700;color:#fff;background:var(--teal);border-radius:20px;padding:2px 10px;margin-left:9px}
.wgstats{display:flex;gap:18px;flex-wrap:wrap;margin-top:10px;font-size:12.5px;color:var(--muted)}
.wgstats b{font-size:17px;color:var(--teal-d);margin-right:4px}
.wgswitch{margin-top:10px;padding-top:10px;border-top:1px solid var(--line);font-size:12px;color:var(--muted);display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.wgsw{border:1px solid var(--line);background:#fff;border-radius:20px;padding:3px 11px;font-size:12px;font-family:var(--font);color:var(--teal-d);cursor:pointer}
.wgsw:hover{border-color:var(--teal);background:var(--tint)}
.wgdetail{border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin-top:14px;background:#fff}
.wgweek{border-left:2px solid var(--line);padding:0 0 12px 13px;margin-bottom:4px}
.wgweek:last-child{padding-bottom:0}
.wgwh{font-size:13.5px;margin-bottom:6px}
.wgwh b{color:var(--teal-d);margin-right:6px}
.wgwh .cphint{margin-left:8px}
.wgacts{display:flex;flex-wrap:wrap;gap:6px}
.wgact{display:inline-flex;align-items:baseline;gap:6px;font-size:12px;border:1px solid var(--line);border-radius:8px;padding:4px 10px;background:#fff}
.wgact i{font-style:normal;font-size:12px;color:var(--muted)}
.wgact b{font-size:12px;color:var(--teal-d);font-weight:600}
.wgact.rec{border-style:dashed;background:#FCFBF8}
.wgzones{display:grid;gap:7px}
.wgzone{display:grid;grid-template-columns:100px 1fr;gap:10px;font-size:12px;padding:6px 0;border-bottom:1px solid var(--line)}
.wgzone:last-child{border-bottom:none}
.wgzone b{color:var(--teal-d)}
.wgzone span{color:var(--muted);line-height:1.6}
.wgsw i{font-style:normal;font-size:12px;color:var(--muted);margin-left:7px}
.fhint{font-size:12px;color:var(--muted);line-height:1.55;margin-top:5px}
.wgage{font-size:12px;font-weight:700;color:var(--teal-d);background:#fff;border:1px solid var(--teal);border-radius:20px;padding:2px 10px;margin-left:9px}
.wgage.none{color:var(--warn);border-color:var(--warn)}
.wgfix{font-size:12.5px;color:var(--muted);display:flex;flex-direction:column;gap:2px}
.wgfix b{font-size:13.5px;color:var(--teal-d)}
.wgfix i{font-style:normal;font-size:12px;line-height:1.5;max-width:420px}
.wgsw b{display:block;font-size:12px;color:var(--teal-d)}
.wgbands{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
.wgbt{flex:1;min-width:140px;border:1px solid var(--line);background:#fff;border-radius:11px;padding:10px 14px;font-family:var(--font);font-size:13.5px;font-weight:600;color:var(--ink);cursor:pointer;text-align:left;transition:.15s}
.wgbt:hover{border-color:var(--teal)}
.wgbt.on{border-color:var(--teal);background:var(--tint);color:var(--teal-d)}
.wgbt.empty{color:var(--muted)}
.wgbt i{display:block;font-style:normal;font-size:12px;font-weight:400;color:var(--muted);margin-top:2px}
.wgbt.hascls{border-left:3px solid var(--teal)}
.wgbatch{border:1px solid var(--teal);border-radius:12px;padding:14px 16px;margin-top:14px;background:#fff}
.wgbh b{font-size:14px}
.wgbh .cphint{display:block;margin-top:2px}
.wgbpick{display:flex;gap:9px;flex-wrap:wrap;align-items:center;margin:12px 0}
.wgbo{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:10px;padding:8px 13px;cursor:pointer;font-size:13px;transition:.12s}
.wgbo:hover{border-color:var(--teal)}
.wgbo.on{border-color:var(--teal);background:var(--tint)}
.wgbo.off{opacity:.5;cursor:not-allowed}
.wgbo input{accent-color:var(--teal);margin:0}
.wgbo i{font-style:normal;font-size:12px;color:var(--muted)}
.wgbgo{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.wgbar{height:6px;background:var(--tint);border-radius:6px;overflow:hidden;margin:10px auto;max-width:340px}
.wgbar i{display:block;height:100%;background:var(--teal);transition:width .3s}
.wgprow{display:grid;grid-template-columns:96px 1fr auto auto;gap:14px;align-items:center;border:1px solid var(--line);border-radius:11px;padding:12px 15px;margin-bottom:9px;background:#fff}
.wgprow.open{border-color:var(--teal)}
.wgprow.none{background:#FCFBF8;border-style:dashed}
.wgpb{font-size:13px;font-weight:700;color:var(--teal-d)}
.wgprow.none .wgpb{color:var(--muted)}
.wgpn b{font-size:14px}
.wgpn .cphint{display:block;margin-top:2px}
.wgps{display:flex;gap:14px;font-size:12px;color:var(--muted);white-space:nowrap}
.wgps b{font-size:15px;color:var(--teal-d);margin-right:3px}
.wgpd{grid-column:1/-1;margin-top:6px}
@media(max-width:860px){.wgprow{grid-template-columns:1fr auto}.wgps{grid-column:1/-1}}
.wgoutline{border:1px solid var(--line);border-radius:12px;padding:14px 16px;background:var(--tint);margin-bottom:16px}
.wgoh{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-bottom:4px}
.wgoh b{font-size:14px}
.wgoutline .cph4:first-of-type{margin-top:10px}
.wgoutline .wgzone{border-bottom-color:rgba(0,0,0,.06)}
.wgprow{grid-template-columns:96px 1fr auto}

/* ---- 逐段审查 ---- */
.srhead .srsrc{font-size:12px;color:var(--muted);background:var(--tint);border-radius:8px;padding:8px 11px;line-height:1.6}
.srver{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:10px;font-size:12.5px;color:var(--muted)}
.srver select{border:1px solid var(--line);border-radius:7px;padding:5px 9px;font-family:var(--font);font-size:12.5px;background:#fff;margin-left:6px}
.srbrief{color:var(--teal-d)}
.srprog{font-size:12.5px;font-weight:700;color:var(--gold);background:#FDF6E7;border-radius:20px;padding:4px 13px;white-space:nowrap}
.srprog.ok{color:var(--teal-d);background:var(--tint)}
.srrej{margin-top:10px;font-size:12.5px;font-weight:600;color:var(--warn);background:#FDF2F4;border-radius:9px;padding:9px 13px}
.srsec{padding:0;overflow:hidden;border-left:3px solid var(--line)}
.srsec.approved{border-left-color:var(--teal)}
.srsec.rejected{border-left-color:var(--warn)}
.srsec.hasadj{border-left-color:var(--gold)}
.srsh{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:11px 18px;background:var(--tint);border-bottom:1px solid var(--line)}
.srkind{font-size:13.5px;font-weight:700;color:var(--ink)}
.srst{font-size:12px;font-weight:700;border-radius:20px;padding:2px 9px;background:#fff;color:var(--muted)}
.srst.approved{background:var(--teal);color:#fff}
.srst.rejected{background:var(--warn);color:#fff}
.srst.pending{background:#FDF6E7;color:var(--gold)}
.sradjb{font-size:12px;font-weight:700;color:var(--gold);background:#FDF6E7;border-radius:20px;padding:2px 9px}
.srbody{display:grid;grid-template-columns:1.4fr 1fr;min-height:70px}
@media(max-width:1000px){.srbody{grid-template-columns:1fr}}
.srleft{padding:14px 18px;border-right:1px solid var(--line)}
.srright{padding:14px 18px;background:#FCFBF8;font-size:12px}
.sritems{margin:0;padding-left:20px;font-size:13px;line-height:1.75}
.sritems li{margin-bottom:5px}
.srtext{font-size:13px;line-height:1.75;white-space:pre-wrap}
mark.sradj{background:#FDF6E7;border-bottom:2px solid var(--gold);padding:1px 2px;border-radius:3px;cursor:help;position:relative}
mark.sradj:hover::after{content:attr(data-tip);position:absolute;left:0;top:calc(100% + 6px);z-index:20;width:290px;background:var(--ink);color:#fff;font-size:12px;line-height:1.55;border-radius:8px;padding:8px 11px;white-space:normal;box-shadow:0 4px 14px rgba(0,0,0,.18)}
.sradjlist{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}
.sradjh{font-size:12px;font-weight:700;color:var(--gold);margin-bottom:6px}
.sradji{font-size:12.5px;margin-bottom:7px}
.sradji b{margin-left:4px}
.srck{margin-bottom:12px}
.srckh{font-size:12px;font-weight:700;color:var(--muted);margin-bottom:6px;letter-spacing:.3px}
.srckl{display:grid;grid-template-columns:14px 1fr;gap:6px;margin-bottom:6px;line-height:1.55}
.srckl b{display:block;font-size:12px;color:var(--ink);font-weight:600}
.srckl i{display:block;font-style:normal;font-size:12px;color:var(--muted)}
.srckl.pass .cpci{color:var(--teal)}
.srckl.fail .cpci,.srckl.flagged .cpci{color:var(--warn)}
.srcm{border-top:1px dashed var(--line);padding-top:9px;margin-top:9px}
.srcmi{font-size:12px;color:var(--muted);margin-bottom:5px;line-height:1.55}
.srcmi b{color:var(--ink);margin-right:6px}
.srcbox{display:flex;gap:7px;margin-top:6px}
.srhist{border-top:1px dashed var(--line);padding-top:9px;margin-top:9px}
.srhi{font-size:12px;margin-bottom:6px}
.srhr{color:var(--ink);line-height:1.5}
.srhi summary{color:var(--muted);cursor:pointer;font-size:12px;margin-top:2px}
.srprev{background:#fff;border:1px solid var(--line);border-radius:7px;padding:8px 10px;margin-top:5px;white-space:pre-wrap;color:var(--muted);font-size:12px;line-height:1.6}
.srfoot{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:10px 18px;border-top:1px solid var(--line);background:#fff}
.sredit{display:flex;flex-direction:column;gap:9px}
.srebtn{display:flex;gap:9px;align-items:center}
.srstu{display:inline-block;font-size:12px;font-weight:600;color:var(--teal-d);background:var(--tint);border:1px solid var(--line);border-radius:20px;padding:1px 9px;margin-left:6px;cursor:help;position:relative}
.srstu:hover{border-color:var(--teal)}
.srstu:hover::after{content:attr(data-tip);position:absolute;left:0;top:calc(100% + 6px);z-index:30;width:230px;background:var(--ink);color:#fff;font-size:12px;font-weight:400;line-height:1.55;border-radius:8px;padding:8px 11px;white-space:normal;box-shadow:0 4px 14px rgba(0,0,0,.18)}

/* ---- 首页 · 下周这六件活（长在「待办」里）---- */
.wfctx{font-size:12px;color:var(--muted);margin:0 0 10px;padding-bottom:8px;border-bottom:1px dashed var(--line)}
.wfact{display:block;border-left:3px solid var(--teal);background:#FDFCFA;border-radius:0 10px 10px 0;padding:10px 12px 10px 13px}
.wfact.open{background:#fff;box-shadow:0 2px 10px rgba(46,107,94,.08)}
.wfar{display:flex;align-items:center;gap:12px}
.wfam{flex:1;min-width:0}
.wfnum{color:var(--teal);margin-right:4px}
.wftag{font-size:12px;font-weight:700;border-radius:5px;padding:1px 6px;margin-left:6px;background:#F1EFE9;color:var(--muted)}
.wftag.mine{background:var(--tint);color:var(--teal-d)}
.wfnext{font-size:12px;color:var(--muted);margin-top:10px}
.wfbody{border-top:1px dashed var(--line);margin-top:12px;padding-top:13px}
.wfmeta{font-size:12px;color:var(--muted);line-height:1.6;margin-bottom:10px}
.wfrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px}
.wflab{display:block;font-size:12.5px;color:var(--muted);margin-top:12px}
.wflab .cpin,.wflab .cpta{width:100%;box-sizing:border-box;margin-top:5px}
.wfcard{background:#fff;border:1px solid var(--line);border-radius:11px;padding:13px 15px}
.wfth{font-size:16px;font-weight:700;color:var(--teal-d)}
.wfwhy{font-size:12.5px;color:var(--ink);line-height:1.65;margin-top:5px}
.wfhooks{font-size:12px;color:var(--muted);line-height:1.6;margin-top:5px}
.wfok{background:var(--tint);border-radius:9px;padding:9px 12px;font-size:12.5px;color:var(--teal-d);margin-top:10px}
.wfcands{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.wfcand{border:1px solid var(--line);border-radius:11px;padding:11px 13px;background:#fff}
.wfcand.on{border-color:var(--teal);background:var(--tint)}
.wfch{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:14.5px}
.wfdet{margin-top:10px;font-size:12.5px}
.wfdet summary{color:var(--muted);cursor:pointer}
.wfbands{display:flex;flex-direction:column;gap:8px}
.wfband{display:flex;align-items:center;gap:11px;border:1px solid var(--line);border-radius:11px;padding:11px 13px;background:#fff;cursor:pointer}
.wfband.on{border-color:var(--teal);background:var(--tint)}
.wfband.off{opacity:.6;cursor:default}
.wfband input{accent-color:var(--teal)}
.wfband>div{flex:1}
.wfband .cphint{margin-left:8px}
.wfbst{font-size:12px;font-weight:600;color:var(--gold);white-space:nowrap}
.wfbst.ok{color:var(--teal)}
.wfbst.off{color:var(--muted)}
.wfplan{border:1px solid var(--line);border-radius:11px;padding:12px 14px;margin-bottom:9px;background:#fff}
.wfph{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wflessons{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px}
.wfles{font-size:12px;border:1px solid var(--line);border-radius:20px;padding:2px 10px;color:var(--muted)}
.wfles.ok{border-color:var(--teal);color:var(--teal-d);background:var(--tint)}
.wfcls{border:1px solid var(--line);border-radius:11px;margin-bottom:9px;background:#fff;overflow:hidden}
.wfcls.open{border-color:var(--teal)}
.wfclsh{display:flex;align-items:center;gap:11px;flex-wrap:wrap;padding:12px 14px}
.wfclsh b{font-size:14px}
.wfclss{flex:1;font-size:12px;color:var(--gold);text-align:right}
.wfaseditor{border-top:1px dashed var(--line);padding:12px 14px 14px;background:#FDFCFA}
.wfdraft{border:1px solid var(--line);border-radius:11px;padding:12px 14px;margin-bottom:9px;background:#fff}
.wfdraft.open{border-color:var(--teal)}
.wfdh{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.wfdh .cphint{display:block;margin-top:2px}
.wfdlist{margin:10px 0}
.wfdrow{border-top:1px dashed var(--line);padding:9px 0;font-size:13px}
.wfdd{display:inline-block;min-width:110px;color:var(--muted);font-size:12px}
.wfdadj{font-size:12.5px;margin:6px 0 0 110px;line-height:1.6}
@media(max-width:760px){
  .wfhead{flex-wrap:wrap}
  .wfmore,.wfhint{width:100%;text-align:right}
  .wfdadj{margin-left:0}
}

/* ---- 首页 · 班级切换 + 花名册 ---- */
.clsbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:16px}
.clsbl{font-size:12px;color:var(--muted);margin-right:2px}
.clschip{display:flex;flex-direction:column;gap:1px;border:1px solid var(--line);background:#fff;border-radius:11px;padding:7px 14px;cursor:pointer;transition:.12s;line-height:1.35}
.clschip:hover{border-color:var(--teal)}
.clschip b{font-size:13.5px;color:var(--ink)}
.clschip small{font-size:12px;color:var(--muted)}
.clschip.on{border-color:var(--teal);background:var(--teal);box-shadow:0 2px 8px rgba(46,107,94,.18)}
.clschip.on b,.clschip.on small{color:#fff}
.ovcls{font-weight:400;color:var(--muted);font-size:12.5px;margin-left:6px}
.rosterl{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.rkid{border:1px solid var(--line);border-radius:12px;background:#fff;padding:13px 15px}
.rkh{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.rkh b{font-size:15px;color:var(--ink)}
.rkh small{font-size:12px;color:var(--muted)}
.rkb{margin-left:auto;display:flex;align-items:center;gap:9px}
.rprof{font-size:12px;color:var(--teal);cursor:pointer;white-space:nowrap}
.rcaus{display:flex;flex-direction:column;gap:5px;margin:9px 0}
.rcau{font-size:12px;border-radius:7px;padding:5px 9px;line-height:1.5}
.rcau.allergy{background:#FDF2F4;color:#8C3B49}
.rcau.health{background:#FDF6E7;color:#7A5E22}
.rcau.flag{background:var(--tint);color:var(--teal-d)}
.rcau.none{background:transparent;color:var(--muted);padding:0}
.rlikes{border-top:1px dashed var(--line);padding-top:9px;font-size:12.5px}
.rlt{display:block;color:var(--teal-d);margin-bottom:5px}
.rctx{color:var(--ink);line-height:1.6;margin-bottom:5px}
.rctx b{color:var(--muted);font-weight:600}
.rnote{color:var(--ink);line-height:1.6;padding-left:9px;border-left:2px solid var(--line);margin:4px 0}
.rfrom{font-size:12px;color:var(--muted);margin-top:6px}
.rnone{font-size:12px;color:var(--muted);line-height:1.6}
@media(max-width:760px){.rosterl{grid-template-columns:1fr}}

/* ---- 执行确认：备选（排不下的活动，只读）+ 花名册对照 ---- */
.fxclash{margin-top:10px}
.fxcl{font-size:12.5px;line-height:1.9;color:var(--ink)}
.fxcl.muted{color:var(--muted)}
.exbench{border:1px solid var(--line);background:var(--paper,#FAFAF7);border-radius:11px;padding:10px 14px;margin-bottom:8px}
.exbt{font-size:13.5px;color:var(--ink);font-weight:600}
.exbw{font-size:12.5px;color:var(--muted);margin-top:3px}

/* ---- 逐段审查 · 帮助参考（能力覆盖）---- */
.sraside{background:#FBFAF7}
.sracov{display:flex;flex-direction:column;gap:5px;margin:8px 0 6px}
.sracl{display:flex;align-items:baseline;gap:7px;font-size:12px;color:var(--muted);line-height:1.5}
.sracl.on{color:var(--ink)}
.sracl b{font-weight:600;flex:none}
.sracl i{font-style:normal;font-size:12px;color:var(--muted)}
.sradot{width:8px;height:8px;border-radius:50%;border:1px solid var(--line);flex:none;align-self:center}
.srasum{font-size:12px;color:var(--ink);line-height:1.6;margin:6px 0}
.wfband.miss{border-color:var(--gold);background:#FDF9F0;opacity:1}
.wfbi{flex:none;width:14px;height:14px;border-radius:50%;background:var(--gold);color:#fff;font-size:12px;font-weight:700;display:grid;place-items:center}
.wfbst.miss{color:var(--gold)}
.wfgoal{font-size:14px;font-weight:700;color:var(--ink);background:#FDF6E7;border-radius:9px;padding:9px 12px;margin-bottom:12px}
.wfgoal.ok{background:var(--tint);color:var(--teal-d)}
.wfready{font-size:12px;color:var(--muted);margin-top:10px}
.nav a .navn{margin-left:auto;font-size:12px;font-weight:700;background:var(--gold);color:#fff;border-radius:20px;padding:1px 7px;min-width:16px;text-align:center}
.nav a.active .navn{background:var(--teal)}
.wfstepbody{margin-top:4px}
.crumb .cbup{color:var(--muted);cursor:pointer;font-weight:600}
.crumb .cbup:hover{color:var(--teal)}
.crumb .cbsep{color:var(--line);margin:0 7px}

/* ---- 逐段审查 · 一条一条审 ---- */
.sritems .sritem{margin:0 0 10px}
.sriw{display:flex;align-items:flex-start;gap:10px}
.srix{flex:1;min-width:0;line-height:1.7}
.srib{flex:none;display:flex;gap:4px;opacity:.35;transition:.12s}
.sritem:hover .srib,.sritem.approved .srib,.sritem.rejected .srib{opacity:1}
.srick,.srixb{width:24px;height:24px;border:1px solid var(--line);background:#fff;border-radius:7px;cursor:pointer;font-size:13px;line-height:1;color:var(--muted);font-family:var(--font)}
.srick:hover,.srick.on{border-color:var(--teal);background:var(--teal);color:#fff}
.srixb:hover,.srixb.on{border-color:var(--warn);background:var(--warn);color:#fff}
.sritem.approved .srix{color:var(--muted)}
.sritem.rejected .srix{background:#FDF2F4;border-radius:7px;padding:3px 7px;margin:-3px -7px}
.srinote{font-size:12px;color:var(--warn);margin:5px 0 0 0;line-height:1.6}
.srirej{margin:8px 0 0;border:1px solid var(--line);border-radius:11px;padding:10px;background:#FCFBF8}
.srirej .scmsg{max-width:100%}
.srorig{border-left:3px solid var(--gold);background:#FDF6E7;border-radius:0 8px 8px 0;
  padding:8px 11px;margin:2px 0 10px;font-size:12.5px;line-height:1.6}
.srorig i{font-style:normal;color:#7A5E22;margin-right:5px}
.srdiff{border:1px solid var(--teal);border-radius:9px;padding:8px 10px;margin:6px 0;background:#fff}
.srdiff>b{font-size:12px;color:var(--teal-d)}
.srdnew{margin:5px 0 0;padding-left:18px;font-size:12px;line-height:1.6}
.srdnew li.chg{background:#FDF6E7;border-radius:4px;padding:2px 5px}
.srdnew li>b{color:var(--muted);font-weight:600;margin-right:3px}
.srdnew{list-style:none;padding-left:0}
.srirej .scbar{margin:8px 0 6px}
.srirej .cpta{width:100%;box-sizing:border-box}
.sricnt{font-size:12px;color:var(--muted);margin-left:8px}
.srckl .srok{display:block;width:fit-content;margin-top:5px;font-size:12px;font-weight:700;border:1px solid var(--line);background:#fff;color:var(--teal-d);border-radius:16px;padding:2px 10px;cursor:pointer;font-family:var(--font)}
.srckl .srok:hover{border-color:var(--teal);background:var(--tint)}
.srckl .srok.on{background:var(--teal);border-color:var(--teal);color:#fff}
.srckl.done b{color:var(--muted)}

/* ---- 生成活动：起始周一 + 已生成/还缺 ---- */
.wgstart{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12.5px;color:var(--muted);background:var(--tint);border-radius:9px;padding:9px 12px;margin:10px 0}
.wgstart.miss{background:#FDF6E7;color:#7A5E22}
.wgstart .cpin{width:150px;flex:none}
/* 起始日长在方案那一行里：横跨整行，紧贴年龄段与来源文件名，读起来是这份方案的属性 */
.wgpstart{grid-column:1/-1;margin:4px 0 0}
.wgpdefault{display:flex;flex-wrap:wrap;align-items:center;gap:2px}
.wgpstart.loud{border:1px solid #E2C27F;align-items:flex-start}
.wgmisst{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;line-height:1.6}
.wgmisst b{color:var(--ink);font-size:13px}

/* ---- 安排日程：小/中/大班并排，一列一个年级 ---- */
.wgcols{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;align-items:start}
/* **只有一个年龄段有内容时铺满整行**：三列里两列写着「这一周还没有这个年级的
   活动」，真正要看的那一列被挤成三分之一宽，玩法那三张小卡只好竖着叠。
   铺满之后它们横着排成一行（`.wgcols.one .cpvars`），一眼看得全 */
.wgcols.one{grid-template-columns:1fr}
.wgcols.one .wgcol.none{display:none}
/* 铺满整行之后，玩法那三张小卡**横着排成一行**——挤在三分之一宽里时它们
   只能竖着叠，她要滚三屏才看得全一节活动的三个玩法 */
.wgcols.one .vcards{grid-template-columns:repeat(3,1fr)}
.wgcol.on{border-color:var(--teal)}
/* 设计活动那页：一列一个年级，卡片竖着叠 */
.cpcards.col{display:flex;flex-direction:column;gap:10px}
/* 一天一组：日子写一次，组里每张卡自己写上午/下午 */
.cpday{display:flex;flex-direction:column;gap:6px}
.cprow2.busy{cursor:default;opacity:.75}
.cpst.designing{background:#FDF6E7;color:#7A5E22}
.cpst.placed{background:var(--tint);color:var(--teal-d)}
.cpst.confirmed{background:var(--teal);color:#fff}
.asch{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cpday>b{font-size:12px;color:var(--teal-d)}
.cpcards.col .cpcd{font-size:12px;color:var(--muted)}
.cpcards.col .cpcard{width:auto}
.wgcol{border:1px solid var(--line);border-radius:12px;background:#fff;padding:12px 13px;min-width:0}
.wgcol.none{border-style:dashed;background:#FCFBF8;text-align:center;padding:26px 13px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:3px}
.wgcol.none:hover{border-color:var(--teal);background:var(--tint)}
.wgplus{font-size:26px;line-height:1;color:var(--teal);margin-bottom:4px}
.wgcol.none b{font-size:13.5px;color:var(--teal-d)}
.wgch{display:flex;flex-direction:column;gap:1px;margin-bottom:8px}
.wgch b{font-size:14px;color:var(--teal-d)}
.wgch .cphint{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wgcol .wgpstart{margin:0 0 9px;padding:7px 9px;font-size:12px}
.wgcol .wgpstart .cpin{width:130px}
/* 一列滚一整学年：列高固定，往下滚续渲。overflow-y 不影响重叠自检（它只跳过 overflow-x） */
.wgwks{display:flex;flex-direction:column;gap:7px;max-height:60vh;overflow-y:auto;padding-right:3px}
.wgwk.none{border-style:dashed;background:#FCFBF8;cursor:pointer}
.wgwk.none:hover{border-color:var(--teal);background:var(--tint)}
.wgwk.none .wgwkh{cursor:pointer}
.wgplus.sm{font-size:15px;line-height:1;margin:0}
.wgend{text-align:center;font-size:12px;color:var(--muted);padding:6px 0 2px}
.wgwk{border:1px solid var(--line);border-radius:9px;padding:8px 10px;background:#FCFBF8}
.wgwk.made{background:#fff;border-color:var(--teal)}
/* 本周：老师翻一屏就找不着北了，这一周得跳出来 */
.wgwk.now{border-color:var(--gold);box-shadow:0 0 0 2px rgba(201,162,74,.18)}
.wgnow{font-style:normal;font-size:12px;font-weight:700;color:#7A5E22;background:#FDF6E7;
  border-radius:9px;padding:1px 7px;margin-left:6px;vertical-align:1px}
.wgwkh{cursor:pointer;min-width:0}
.wgwkh b{font-size:12.5px;color:var(--teal-d);margin-right:5px}
.wgwkt{font-size:12.5px}
.wgwkh .cphint{display:block;margin-top:1px;font-size:12px}
.wgwka{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:7px}
.wgwka .cpst{font-size:12px;padding:1px 8px}
.wgwk .wgacts{margin-top:8px;padding-top:8px;border-top:1px solid var(--line)}
/* 展开一周：按天分组，一天一行——这是老师手里那张作息表的样子 */
.wgdays{display:flex;flex-direction:column;gap:6px}
.wgday{display:flex;gap:8px;align-items:flex-start}
.wgday>b{flex:none;width:30px;font-size:12px;color:var(--teal-d);padding-top:3px}
.wgdacts{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}
/* 每个活动自己的状态：设计中金框、待审绿框、已批准实心 */
.wgact u{text-decoration:none;font-size:12px;margin-left:6px;color:var(--muted)}
.wgact.a-designing{border-color:var(--gold)}
.wgact.a-designing u{color:#7A5E22}
.wgact.a-designed{border-color:var(--teal)}
.wgact.a-approved{background:var(--tint);border-color:var(--teal)}
.wgact.a-approved u{color:var(--teal-d)}
.wgact.go{cursor:pointer}
.wgact.go:hover{border-color:var(--teal);background:var(--tint)}
@media(max-width:900px){.wgcols{grid-template-columns:1fr}}
.wgpstart .wgwk2{font-size:13px;color:var(--teal-d);flex:none}
/* 前后那一周有没有：跟当前这份方案分开一行，别跟日期挤在一起 */
.wgaround{flex-basis:100%;font-size:12px;color:var(--muted)}
.wgbo .wgbmiss{margin-left:auto;font-size:12px;font-weight:700;color:var(--gold);white-space:nowrap}
.wgbo.off .wgbmiss{color:var(--muted)}
.wgbo .btn.link{flex:none;padding:2px 6px}

/* ---- 名单批量建档：一人一行摆出来，缺什么标什么 ---- */
/* 表比对话好使：二十几个孩子，老师要的是一眼扫过去看哪一行是红的，而不是来回聊。 */
.ritext{width:100%;min-height:150px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;
  font:13px/1.7 inherit;background:#FCFBF8;resize:vertical;margin-bottom:12px}
.ritext:focus{outline:none;border-color:var(--teal)}
.rinote{font-size:12.5px;color:var(--muted);background:var(--tint);border-radius:8px;padding:8px 11px;margin-bottom:10px}
.riscroll{max-height:46vh;overflow:auto;border:1px solid var(--line);border-radius:10px}
/* 窄屏上宁可整张表横向滚，也不要把列挤到一个字一行——那是看不懂的 */
.ritab{border-collapse:collapse;width:100%;min-width:700px;font-size:12.5px}
.ritab th{position:sticky;top:0;background:var(--tint);text-align:left;font-weight:600;
  padding:7px 9px;border-bottom:1px solid var(--line);white-space:nowrap;z-index:1}
.ritab td{padding:4px 6px;border-bottom:1px solid #F1EFE9;vertical-align:top}
.ritab tr:last-child td{border-bottom:none}
.ritab tr.ribad td{background:#FFFBF2}
.ritab th.nar,.ritab td:nth-child(2){width:62px}
/* 姓名钉住：窄屏上表要横向滚，滚过去还得知道这一行是谁 */
.ritab td:nth-child(1),.ritab th:nth-child(1){position:sticky;left:0;background:#fff;z-index:1;min-width:88px}
.ritab th:nth-child(1){background:var(--tint);z-index:3}
.ritab tr.ribad td:nth-child(1){background:#FFFBF2}
.ritab td:nth-child(3){min-width:118px}
.ritab td:nth-child(4){min-width:112px}
.ritab td:nth-child(5){min-width:190px;white-space:normal}
/* 第 6 列是「拍照录像同意」那个勾（AC 加的），「情况」挪到第 7 列 */
.ritab td:nth-child(6){text-align:center}
.ritab td:nth-child(7){white-space:nowrap}
.riin{width:100%;min-width:0;padding:5px 7px;border:1px solid transparent;border-radius:6px;
  font:12.5px inherit;background:transparent}
.riin:hover{border-color:var(--line)}
.riin:focus{outline:none;border-color:var(--teal);background:#fff}
.riin.nar{width:62px}
.rinew{font-size:12px;color:var(--gold);margin:2px 0 0 7px;white-space:nowrap}
/* 备注里认出来的过敏单独亮一行：过敏写在备注里等于没写，得让老师当场看见 */
.riall{font-size:12px;color:var(--warn);font-weight:600;margin:2px 0 0 7px}
.ristate{font-size:12px;white-space:nowrap}
.ristate.ok{color:var(--teal);font-weight:700}
.ristate.bad{color:var(--warn)}
.ristate.warn,.ristate.dup{color:var(--gold)}
.rinewbox{border:1px solid #EBD7A8;background:#FFFBF2;border-radius:10px;padding:9px 12px;margin-bottom:10px}
.rinewhd{font-size:12.5px;font-weight:700;color:#6b551f;margin-bottom:5px}
.rinewrow{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:12.5px;flex-wrap:wrap}
.rinewrow .right{margin-left:auto}

/* 班本调整还在后台算：说清在等什么，别让老师对着转圈猜这一页坏没坏 */
.exfit{border:1px dashed var(--line);background:#FCFBF8}
.exfit .cploading{padding:10px 0 2px}


}

/* ---- 园所固定安排：导入面板 + 课表上的灰块 ---- */
.fxpanel .fxstatus{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.fxrow{display:flex;align-items:center;gap:10px;font-size:12.5px}
.fxrow .pill{min-width:58px;text-align:center}
.fxtxt.muted,.fxpanel .muted{color:var(--muted)}
.fxlist{margin:0 0 6px;padding-left:18px;font-size:12.5px;color:var(--ink)}
.fxlist li{margin:2px 0}
.fxwarn{margin:0;padding-left:18px;font-size:12.5px;color:#7A5E22;background:#FDF6E7;border:1px solid var(--gold);border-radius:9px;padding:8px 12px 8px 28px}
.fxwarn li{margin:3px 0}
.fxmap{max-height:320px;overflow:auto;border:1px solid var(--line);border-radius:9px}
.fxmap table.ritab td:nth-child(1){min-width:120px}
.fxmap table.ritab td:nth-child(2){width:28px;color:var(--muted);text-align:center}
.fxmap select{border:1px solid var(--line);border-radius:8px;padding:5px 8px;font-family:var(--font);font-size:12.5px;max-width:260px}
.fxpick{cursor:pointer;display:inline-block}
.cpok{background:var(--tint);border:1px solid var(--line);color:var(--teal-d);border-radius:9px;padding:10px 12px;font-size:12.5px}
/* 日历上的固定块：灰、不可拖、字不加粗——它不是课，是这个班那个上午本来在哪儿 */
.fc-event.fixed-ev,.fc-daygrid-event.fixed-ev{--fixed-bg:#E9ECEA;--fixed-bd:#CBD3CF;--fixed-fg:#4A5551;cursor:default;opacity:.95}
.fc-event.fixed-ev .fc-event-title{font-weight:500;font-style:italic}

/* ---- 我们班这周（照 docs/design/Main.dc.html）---- */
.cwhead{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.cwhead .chips,.cwwk{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.cwsplit{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:20px;align-items:start}
@media(max-width:1100px){.cwsplit{grid-template-columns:1fr}}
.cwgridwrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-panel);
  overflow:hidden;padding:0;margin:0}
.cwscroll{overflow-x:auto}
.cwtable{width:100%;border-collapse:collapse;table-layout:fixed;min-width:820px}
.cwtable th,.cwtable td{vertical-align:top;padding:0;border:0}
.cwtable tr+tr{border-top:1px solid var(--line)}
.cwtable th.cwt,.cwtable td.cwt{width:120px;text-align:left;padding:10px 12px}
.cwtable td+td,.cwtable th+th{border-left:1px solid var(--line)}
/* 表头：周一 13/800 + 日期 12 灰；今天那一列点一颗黄点 */
.cwtable th.cwd{padding:10px 12px;text-align:left;font-weight:400}
.cwtable th.cwd b{font-size:13px;font-weight:800}
.cwtable th.cwd small{font-size:12px;color:var(--ink-3);margin-left:6px;font-weight:500}
.cwtable th.cwd i.today{width:6px;height:6px;border-radius:50%;background:var(--yellow);
  display:inline-block;margin-left:auto;float:right;margin-top:6px}
.cwtable thead th{background:var(--surface);border-bottom:1px solid var(--line)}
.cwtable th.cwt{font-size:12px;color:var(--ink-3);letter-spacing:.08em;font-weight:500}
/* 时间列：8:15–9:00（12/700）+ 这一段叫什么（12 灰） */
.cwtable td.cwt b{display:block;font-size:12px;font-weight:700}
.cwtable td.cwt small{display:block;font-size:12px;color:var(--ink-3);margin-top:2px}
/* **别给 td 设 display:flex** —— 那会让它不再是表格单元格，五列当场塌成一竖条。
   间距走子元素的 margin。 */
.cwcell{background:var(--surface);padding:10px 6px;vertical-align:top}
.cwcell>*+*{margin-top:6px}
/* 「这天不上」只在鼠标进了这一格才出现：动作在东西上，不长期占着地方 */
.cwfoot{opacity:0;transition:.12s;text-align:right}
.cwcell:hover .cwfoot{opacity:1}
.cwfoot .lnk{font-size:12px;color:var(--ink-3);cursor:pointer;background:none;border:0;font-family:var(--font)}
.cwfoot .lnk:hover{color:var(--amber)}
.cwtail{font-size:12px;color:var(--ink-3);padding:0 4px}
.cwnote{font-size:12px;color:var(--ink-3);line-height:1.5}
.cwcell.blocked{background:var(--ivory)}
.cwcell.skipped{background:var(--ivory)}
/* 固定行：灰底一条，文字尾巴带小笔（点了能改叫法） */
.cwfixed{background:var(--ivory);color:var(--ink-2);text-align:center;font-size:12.5px;
  padding:10px 12px!important;cursor:pointer}
.cwfixed .pen{color:var(--ink-3);margin-left:6px;vertical-align:-2px;display:inline-block}
.cwfixed .pen svg{width:13px;height:13px;display:block}
.cwfixed:hover .pen{color:var(--amber)}
.cwfixed small{display:block;font-size:12px;color:var(--ink-3);margin-top:2px}

/* 卡片：一行活动名，一行「类型 · 时间」，左边 3px 面色条 */
.cwcard{position:relative;display:flex;flex-direction:column;gap:2px;
  padding:8px 10px 8px 12px;background:var(--surface);border:1px solid var(--line);
  border-radius:8px;cursor:pointer;transition:.12s}
.cwcard .bar3{position:absolute;left:0;top:8px;bottom:8px;width:3px;border-radius:3px;background:var(--ink-3)}
.cwcard .nm{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:22px}
.cwcard .mt{font-size:12px;color:var(--ink-3);white-space:nowrap}
.cwcard:hover{box-shadow:var(--shadow-float);transform:translateY(-1px)}
.cwcard .more{position:absolute;top:6px;right:6px;width:22px;height:22px;border-radius:6px;
  background:var(--ivory);display:none;place-items:center;color:var(--ink-2)}
.cwcard:hover .more{display:grid}
.cwcard.sel{border-color:var(--yellow);box-shadow:0 0 0 2px var(--y-100)}
.cwcard[draggable="true"]{cursor:grab}
/* 专用室那张锁住的卡（AK-2）：园所排的，挪不动——象牙底、实线、名字前一把小锁；不浮起（拿不起来） */
.cwcard.locked{background:var(--ivory);border-style:solid;cursor:pointer}
.cwcard.locked:hover{transform:none}
.cwcard.locked .nm{display:flex;align-items:center;gap:4px}
.cwcard.locked .nm svg,.outblk .obk svg{width:13px;height:13px;flex:none;color:var(--ink-3)}
.cwcard .cwtheme{font-size:12px;color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 户外游戏那一大块（AK-2）：一整个上午。标题一行、主题一行（点了改）、三颗静按钮——窄屏下按钮自己折行 */
.cwcell.outblk{vertical-align:top}
.outblk .obk{display:flex;align-items:flex-start;gap:4px;font-size:13px;line-height:1.35}
.outblk .obk svg{margin-top:2px}
.outblk .obk b{font-weight:700;flex:1;min-width:0;overflow-wrap:anywhere}
.outblk .obk small{display:block;font-size:12px;font-weight:400;color:var(--ink-3)}
.outblk .obt{display:block;font-size:12.5px;color:var(--ink-2);text-align:left;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0}
.outblk button.obt{background:none;border:0;cursor:pointer;font-family:var(--font)}
.outblk button.obt:hover{color:var(--amber)}
.outblk .obacts{display:flex;flex-wrap:wrap;gap:4px}
/* 一日作息那一页：户外游戏表上没排的周，哪天上午是户外（AK-2）——一个窄下拉，不占一整行 */
.dtout{margin:8px 0 10px}
.dtout select,.fxrot select{width:auto;min-width:120px;max-width:100%}
.outblk .obd{font-size:12px;color:var(--ink-3);display:flex;align-items:center;gap:4px}
.outblk button.obopen{display:block;width:100%;text-align:left;background:none;border:0;padding:0;cursor:pointer;
  font-family:var(--font);color:inherit}
.outblk button.obopen .obk{margin-bottom:2px}
.outblk .actdot{margin-left:4px}
/* 面色条：六个面 */
.f-motor{background:var(--f-motor)!important} .f-lang{background:var(--f-lang)!important}
.f-social{background:var(--f-social)!important} .f-think{background:var(--f-think)!important}
.f-attn{background:var(--f-attn)!important} .f-order{background:var(--f-order)!important}

/* 空格子：只画虚线和容量点，不写废话 */
.cwslot{display:flex;align-items:center;justify-content:space-between;height:34px;padding:0 8px;
  border:1px dashed var(--line-2);border-radius:8px;color:var(--ink-3);font-size:12px}
.cwslot.full{display:block;height:auto;border:0;padding:0}
/* 拖到哪儿哪儿亮黄边 */
.cwslot.hot{border-color:var(--yellow);border-style:solid;background:var(--y-50);color:var(--amber)}
/* 落在一张卡上 = 对调 / 换活动：那张卡描一圈黄边（放不下的不亮，AL） */
.cwcard.hot{outline:2px solid var(--yellow);outline-offset:1px}
/* 拖影：只写名字的小卡。默认拖影是整张卡半透明的一大块，挡住她要落的那一格 */
.cwghost{position:fixed;top:-200px;left:-200px;max-width:200px;padding:6px 10px;background:var(--surface);
  border:1px solid var(--line);border-radius:8px;font-size:13px;font-weight:700;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;box-shadow:var(--shadow-float)}
/* 拖着的时候：卡不再浮起、「…」收起——指针扫过一排卡时别一张张跳起来 */
body.dragging .cwcard:hover{transform:none;box-shadow:none}
body.dragging .cwcard .more{visibility:hidden}
/* 课程库刚拖进来、服务端还没回话的那一张：先不让动（落下去 id 可能要变） */
.cwcard.pending{opacity:.6;cursor:progress}
.cwslot.bad{border-color:#B4412F;color:#B4412F}
/* 园所固定安排占着、这一段里又有她的卡：空着的那几格画成占着（不收卡），跟整格灰块同一个底 */
.cwslot.occ{border-style:solid;border-color:var(--line);background:var(--ivory);justify-content:flex-start;gap:4px}
/* 区域游戏那一格（老师自己填，AK-1）空着：一颗「写一个区域游戏」，不是一条光秃秃的虚线。
   照旧收拖进来的卡（虚线框还在，拖上去一样亮黄边） */
.cwslot.self{padding:0 3px}
/* 主题游戏包还在想（AO）：空着的轻格写一句、转个圈——等它想好，这一格就有卡了 */
.cwslot.thinking{justify-content:flex-start;gap:6px;color:var(--ink-3);font-size:12px}
.cwslot.thinking svg{flex:none}
.cwzonebtn{display:inline-flex;align-items:center;gap:5px;width:100%;height:28px;padding:0 6px;
  border:0;border-radius:6px;background:transparent;color:var(--amber);font-family:var(--font);
  font-size:12px;font-weight:700;cursor:pointer;white-space:nowrap;overflow:hidden}
.cwzonebtn:hover{background:var(--y-50)}
.cwzonebtn svg{flex:none}
/* 写区域游戏那个弹层：能力 chip 是能点的，**选中的要看得出来**（U 那一次 class 对了、样子没有） */
.cwzone .capchip{cursor:pointer;font-family:var(--font)}
.cwzone .capchip.on{background:var(--y-100);border-color:var(--yellow);color:var(--ink)}
.cwzgk{display:block;font-size:12px;color:var(--ink-3);margin-top:6px}
.cwzai{margin-top:6px}
.cwzfocus{white-space:pre-line}
.cwsport{font-size:12px;color:var(--ink-3);padding:0 4px}

/* 右边 300：备选 / 课程库 两个页签 */
/* 右栏钉住、自己滚：课表那一侧一屏放不下，往下滚的时候右边这一栏（备选 + 课程库）
   要跟着留在视线里——不然拖一张卡得先滚回顶上去找它。
   顶栏 60px + 12px 的呼吸；自己滚，不跟着页面走。 */
.cwbench{width:300px;display:flex;flex-direction:column;gap:12px;background:transparent;
  border:0;padding:0;margin:0;
  position:sticky;top:72px;max-height:calc(100vh - 84px);overflow-y:auto}
/* 窄屏时右栏落到课表下面——那会儿它是页面的一部分，钉住反而把它压成一条缝 */
@media(max-width:1100px){.cwbench{position:static;max-height:none;overflow-y:visible}}
.cwtabs{display:flex;gap:4px;padding:4px;background:var(--ivory);border-radius:10px}
.cwtabs .tb{flex:1;padding:7px 0;border-radius:8px;font-size:13px;font-weight:600;color:var(--ink-2);
  text-align:center;cursor:pointer;border:0;background:transparent;font-family:var(--font)}
.cwtabs .tb.on{background:var(--surface);font-weight:700;color:var(--ink);box-shadow:0 1px 2px rgba(30,35,33,.06)}
.cwtabs .tb span{color:var(--ink-3);font-weight:600;margin-left:4px}
.cwhint{margin:0;font-size:12px;color:var(--ink-3);line-height:1.5}
/* 备选卡：带拖柄 */
.bcard{position:relative;display:flex;align-items:flex-start;gap:10px;padding:10px 10px 10px 12px;
  background:var(--surface);border:1px solid var(--line);border-radius:10px;cursor:grab;transition:.12s}
.bcard:hover{box-shadow:var(--shadow-float)}
.bcard .bar3{position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:3px}
.bcard .bd{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}
.bcard .bd b{font-size:13px;font-weight:700}
.bcard .bd .mt{font-size:12px;color:var(--ink-3)}
.bcard .bd .why{font-size:12px;color:var(--ink-2)}
.bcard .grip{color:var(--ink-3);flex:none;display:grid;place-items:center;padding-top:2px}
.bcard.sel{border-color:var(--yellow);box-shadow:0 0 0 2px var(--y-100)}
.cwbench .hot{outline:2px dashed var(--yellow);border-radius:10px}
.benchnote{margin-top:auto;padding:12px;border-radius:10px;background:var(--y-50);
  border:1px solid var(--y-100);font-size:12px;color:var(--ink-2);line-height:1.55}
.benchnote b{color:var(--ink);display:block}
.cwload{padding:40px;text-align:center;color:var(--ink-3)}
.cwdays{display:none;gap:6px;margin-bottom:8px}

@media(max-width:820px){
  .cwdays{display:flex}
  .cwtable{min-width:0}
  .cwtable td.cwt,.cwtable th.cwt{width:92px}
  .cwscroll.day1 .cwd:not(.d1),.cwscroll.day1 .cwcell:not(.d1),
  .cwscroll.day2 .cwd:not(.d2),.cwscroll.day2 .cwcell:not(.d2),
  .cwscroll.day3 .cwd:not(.d3),.cwscroll.day3 .cwcell:not(.d3),
  .cwscroll.day4 .cwd:not(.d4),.cwscroll.day4 .cwcell:not(.d4),
  .cwscroll.day5 .cwd:not(.d5),.cwscroll.day5 .cwcell:not(.d5){display:none}
  .cwbench{width:auto}
  /* 一天一列时那一列要**撑满**（AQ）。只藏掉另外四天的格子不够：固定行（点心、午餐……）是
     `colspan=5` 的一整条，表格照样按六列排，看得见的那一天只分到五分之一（390 宽下 54px），
     卡上的名字截成「《…」。这时每一行改成两列的格子（时间 92px + 这一天），跟表格那一套列宽无关。
     **只在这儿改 display**：宽屏那张表照旧是表格（上面那条「别给 td 设 display:flex」说的是宽屏）；
     拖放挂在壳子上、认的是 data-drop / data-card，跟表格结构无关 */
  .cwscroll[class*="day"] .cwtable,.cwscroll[class*="day"] .cwtable>tbody{display:block}
  .cwscroll[class*="day"] .cwtable tr{display:grid;grid-template-columns:92px minmax(0,1fr)}
  .cwscroll[class*="day"] .cwtable td.cwt,.cwscroll[class*="day"] .cwtable th.cwt{width:auto}
  /* 卡撑满格子；名字一行放不下就两行，再多省略；卡高跟着内容 */
  .cwscroll .cwcard{width:100%;box-sizing:border-box}
  .cwscroll .cwcard .nm{white-space:normal;overflow-wrap:anywhere;display:-webkit-box;
    -webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}
  .cwscroll .cwcard .mt{white-space:normal}
}
/* 触屏上没有 hover：卡上的「…」一直摆着（点卡本身是开教案），跟档案里那颗「删掉」同一个道理 */
@media (hover:none){.cwcard .more{display:grid}}

/* ---- 我们班的孩子（kids.js）---- */
/* 花名册沿用 .rosterl/.rkid 那一套（本来就是 #overview 上更全的那个渲染器），
   这儿只加两块新的：每行的「今天」，和成长档案里 24 项能力那张表。 */
.rdaily{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.daygrp{display:inline-flex;gap:4px}
.dayb{font-size:12px;padding:4px 10px;border-radius:8px;border:1px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;font-family:var(--font);transition:.12s}
.dayb:hover{border-color:var(--teal)}
.dayb.on{background:var(--teal);border-color:var(--teal);color:#fff;font-weight:700}
.dayn{flex:1;min-width:150px;font-size:12.5px;padding:6px 10px;border:1px solid var(--line);border-radius:8px;font-family:var(--font);background:#fff;color:var(--ink)}
.dayn:focus{outline:none;border-color:var(--teal)}
.dayl{border:1px solid var(--line);border-radius:12px;overflow:hidden}
.dayr{display:flex;gap:12px;align-items:flex-start;padding:8px 14px;border-bottom:1px solid var(--line);background:#fff;font-size:12.5px}
.dayr:last-child{border-bottom:none}
.dayr .oc{width:92px;flex:none;color:var(--muted)}
.dayr .om{display:flex;gap:6px;align-items:center;flex-wrap:wrap}

/* 24 项能力：一项一行，行上就写清这一档是哪次活动、谁、什么时候记的 */
.capwrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(330px,1fr));gap:14px}
.capgrp{border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden}
.capgh{margin:0;padding:9px 14px;font-size:13px;background:var(--tint);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:7px}
.caprow{border-bottom:1px solid var(--line)}
.caprow:last-child{border-bottom:none}
.caphd{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 10px;align-items:center;padding:8px 14px;cursor:pointer}
.caphd:hover{background:var(--bg)}
.caprow.open .caphd{background:var(--bg)}
.capn{font-size:13px;font-weight:600}
.capfrom{grid-column:1/-1;font-size:12px;color:var(--muted)}
.capfrom.none{font-style:normal;opacity:.75}
.capjump{color:var(--teal);cursor:pointer;margin-left:4px}
.capjump:hover{text-decoration:underline}
.capbody{padding:2px 14px 12px;background:var(--bg);border-top:1px dashed var(--line)}
.caphint{font-size:12px;color:var(--muted);margin:8px 0;line-height:1.65}
.caprec{display:flex;gap:10px;align-items:flex-start;font-size:12px;padding:5px 0;border-top:1px solid var(--line)}
.caprec .oc{width:52px;flex:none;color:var(--muted)}
.capadd{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.capal{font-size:12px;color:var(--muted)}
.rate.pick span{cursor:pointer}
.rate.pick span:hover{border-color:var(--teal);color:var(--teal-d)}

/* 卡片右下角那个「登记表」入口 */
.cwsheet{display:block;margin-top:4px;font-size:12px;color:var(--teal);cursor:pointer}
.cwsheet:hover{text-decoration:underline}
@media(max-width:760px){
  .capwrap{grid-template-columns:1fr}
  .rdaily{gap:6px}
  .dayn{min-width:100%}
}

/* 随手记 + 记录流 */
.nbox{border:1px solid var(--line);border-radius:12px;padding:12px;background:#fff}
.ntext{width:100%;border:1px solid var(--line);border-radius:9px;padding:9px 11px;font-family:var(--font);font-size:13px;color:var(--ink);resize:vertical}
.ntext:focus{outline:none;border-color:var(--teal)}
.nrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px}
.nbd{flex:0 0 auto;min-width:0;width:auto}
.nbfile{font-size:12.5px;color:var(--teal);cursor:pointer;border:1px dashed var(--line);border-radius:8px;padding:6px 10px}
.nbfile input{display:none}
.strl{margin-top:12px;border-top:1px dashed var(--line)}
.strow{display:flex;gap:12px;align-items:flex-start;padding:9px 0;border-bottom:1px solid var(--line);font-size:12.5px}
.strow:last-child{border-bottom:none}
.strow .oc{width:52px;flex:none;color:var(--muted)}
.strow .om{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0}
.stag{font-size:12px;border-radius:6px;padding:1px 7px;font-weight:700}
.stag.sheet{background:var(--tint);color:var(--teal-d);border:1px solid var(--line)}
.stag.note{background:#FFF7E8;color:#6b551f;border:1px solid #EBD7A8}
.strow .svia{font-size:12px;color:var(--ink-3)}
/* 删掉：hover 出来（动作在东西上）；手机上没有 hover，一直摆着 */
.strow .sdel{visibility:hidden;margin-left:auto;font-size:12px}
.strow:hover .sdel,.strow .sdel:focus{visibility:visible}
@media (hover:none){.strow .sdel{visibility:visible}}
.srate{font-size:14px;color:var(--teal-d)}
.scap{font-weight:600}
.sctx{color:var(--muted)}
.swho{color:var(--muted)}
.strow .rnote{flex-basis:100%;margin:2px 0 0;color:#3c4a45}
.sphoto{flex-basis:100%;display:block;margin-top:5px}
.sphoto img{max-width:220px;max-height:160px;border-radius:9px;border:1px solid var(--line);display:block}

/* 学期档案预览 */
.pfbox{max-height:58vh;overflow:auto;padding-right:4px}
.pfh{margin:14px 0 4px;font-size:13.5px;color:var(--teal-d)}
.pfh:first-child{margin-top:0}
.pfgs{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px}
.pfg{border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:#fff}
.pfg>b{font-size:12.5px;color:var(--teal-d)}
.pfi{display:flex;justify-content:space-between;gap:8px;font-size:12px;padding:3px 0;border-top:1px solid var(--line)}
.pfi.none{color:var(--muted)}
.pfrs{border:1px solid var(--line);border-radius:10px;overflow:hidden}
.pfr{display:flex;gap:10px;align-items:flex-start;padding:8px 12px;border-bottom:1px solid var(--line);background:#fff;font-size:12.5px;cursor:pointer}
.pfr:last-child{border-bottom:none}
.pfr.off{background:var(--bg);color:var(--muted);text-decoration:line-through}
.pfr .oc{width:78px;flex:none;color:var(--muted)}
.pfr input{margin-top:3px}

/* 状态条：chips 一行，解释收进「为什么」 */
.cwstatus{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0}
.cwstatus .cwlast{margin-left:auto;font-size:12px;color:var(--ink-3)}
.wknav{display:flex;align-items:center;gap:6px;background:var(--surface);
  border:1px solid var(--line-2);border-radius:10px;padding:3px 4px}
.wknav .wkl{font-size:13px;font-weight:700;padding:0 6px;white-space:nowrap}
.wknav .iconbtn{width:28px;height:28px;border-radius:7px}
.mlist{display:flex;flex-direction:column;gap:6px;margin:10px 0}
.cwset{font-style:normal;font-size:12px;margin-left:6px;padding:1px 6px;border-radius:6px;
  background:var(--ivory);color:var(--ink-3)}
.cwset.no{background:#FBECEC;color:#B4412F}
.cwset.auto{background:var(--y-50);color:var(--amber)}

/* ---- 我们班的孩子：今天 · 点名 + 孩子卡（照 docs/design/Kids.dc.html）---- */
.rollcall{padding:16px 20px 8px}
.rchead{display:flex;align-items:center;gap:12px;padding-bottom:8px}
.rchead b{font-size:15px;font-weight:800}
.rcrow{display:grid;grid-template-columns:200px auto auto minmax(0,1fr);gap:18px;
  align-items:center;padding:8px 0;border-top:1px solid var(--line)}
/* 点过的那一行左边一道黄条：分得清「系统默认的」和「她真点过的」 */
.rcrow.done{box-shadow:inset 3px 0 0 var(--yellow)}
.rcwho{display:flex;align-items:center;gap:10px;min-width:0}
.rcwho .av{width:32px;height:32px;border-radius:50%;background:var(--y-100);
  display:grid;place-items:center;font-weight:800;font-size:13px;flex:none}
.rcwho .nm{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.rcwho .nm b{font-size:14px;font-weight:700}
.rcwho .nm small{font-size:12px;color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.moods{display:flex;gap:2px}
.moods .mood{width:34px;height:34px;display:grid;place-items:center;border-radius:9px;cursor:pointer}
.moods .mood:hover{background:var(--ivory)}
.rcrow .dayn{height:32px}
/* 备注框 + 「记一下」：按钮**只在内容跟已存的不一样时**出现，一行里就这一个主按钮。
   平时不占位（display:none），出现时挤在框右边，框自己缩一点，不换行。 */
.ntwrap{display:flex;align-items:center;gap:8px;min-width:0}
.ntwrap .dayn{min-width:0}
.ntbtn{display:none;flex:none}
.ntbtn.on{display:inline-flex}
.ntbtn.ok{display:inline-flex;align-items:center;font-size:12px;color:var(--ink-3);
  background:transparent;border:none;padding:0 4px;font-family:var(--font);white-space:nowrap}
/* 手机上（AP）：四列挤一行要 612px，390 宽的屏幕整页被撑宽、贴底的东西落到屏幕外——
   名字和情绪一行、出勤一行、备注一行 */
@media (max-width:768px){
  .rollcall{padding:12px 12px 6px}
  .rcrow{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"who moods" "seg seg" "note note";gap:8px 12px}
  .rcrow .rcwho{grid-area:who}
  .rcrow .moods{grid-area:moods}
  .rcrow .seg{grid-area:seg;justify-self:start;max-width:100%;overflow-x:auto}
  .rcrow .ntwrap{grid-area:note}
}

.kidgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}
.kcard{display:flex;flex-direction:column;gap:10px;padding:14px 16px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-panel);cursor:pointer;transition:.12s}
.kcard:hover{box-shadow:var(--shadow-float);transform:translateY(-1px)}
.khead{display:flex;align-items:center;gap:12px}
.kname{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}
.kname b{font-size:15px;font-weight:800;display:flex;align-items:baseline;gap:6px}
.kname b span{font-size:12px;font-weight:500;color:var(--ink-3)}
.kname small{font-size:12px;color:var(--ink-3)}
.kgo{color:var(--ink-3);flex:none;display:grid;place-items:center}
.kcau{display:flex;gap:6px;flex-wrap:wrap;min-height:26px}
.klast{margin:0;font-size:12.5px;color:var(--ink-2);line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.klast.none{color:var(--ink-3)}

/* ---- 成长档案页（照 docs/design/Archive.dc.html）---- */
.ahead{display:grid;grid-template-columns:340px minmax(0,1fr);gap:20px;padding:20px 24px}
.ahex svg{width:100%;height:auto;display:block}
.alegend{display:flex;gap:14px;font-size:12px;color:var(--ink-2);margin-top:4px;padding-left:6px}
.alegend i{display:inline-block;width:18px;border-top:2px solid #B9B4A8;margin-right:5px;vertical-align:middle}
.alegend i.b1{border-top:3px solid var(--s-good)}
.abody{display:flex;flex-direction:column;gap:12px;min-width:0}
.awho{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.awho b{font-size:24px;font-weight:800;letter-spacing:-.01em}
.awho small{font-size:13px;color:var(--ink-3)}
.anums{display:flex;gap:22px}
.anums b{font-size:22px;font-weight:800;display:block;line-height:1.1}
.anums b span{font-size:13px;color:var(--ink-3);font-weight:600}
.anums small{font-size:12px;color:var(--ink-3)}
.afacets{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.afacet{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:start;
  padding:9px 10px;border:1px solid var(--line);border-radius:8px;background:var(--ivory)}
.afacet .fdot{width:10px;height:10px;border-radius:50%;margin-top:4px;flex:none}
.afacet b{font-size:12.5px;font-weight:700}
.afacet b small{font-weight:400;color:var(--ink-3);margin-left:6px}
.afacet p{margin:2px 0 0;font-size:12px;color:var(--ink-2);line-height:1.5}
.aanalysis{padding:12px 14px;background:var(--y-50);border:1px solid var(--y-100);border-radius:8px;
  font-size:12.5px;line-height:1.7;color:var(--ink-2)}
.aanalysis b{color:var(--amber)}
.asplit{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(0,1fr);gap:14px;align-items:start}
@media(max-width:1100px){.asplit,.ahead{grid-template-columns:1fr}}
.asec{font-size:13.5px;font-weight:800;display:block;margin-bottom:4px}
.anote{padding:14px 16px}
.amonths .mrow{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:6px}
.amonths figure{margin:0;text-align:center;font-size:12px;color:var(--ink-3)}
.amonths svg{width:100%;height:auto;display:block}
.amonths figcaption b{display:block;color:var(--ink);font-weight:700}
.amonths figure.now{background:var(--y-50);border-radius:10px;box-shadow:inset 0 0 0 1px var(--y-100)}
.amonths figure.future figcaption b{color:var(--ink-3);font-weight:600}
.cgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px 26px;margin-top:8px}
.cgrp{border-top:3px solid var(--c);padding-top:6px}
.cgrp header{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:2px}
.cgrp header b{font-size:12.5px}
.cgrp header b small{font-weight:400;color:var(--ink-3);margin-left:6px}
.crow{display:grid;grid-template-columns:minmax(0,1fr) 88px 44px;gap:8px;align-items:center;
  padding:4px 0;border-top:1px solid var(--line);cursor:pointer}
.crow:hover{background:var(--ivory)}
.crow .nm{font-size:12px}
.crow .nm.none{color:var(--ink-3)}
.crow svg{width:88px;height:26px;display:block}
.crow .lv{font-size:12px;font-weight:700;text-align:right}
.crow .lv.none{color:var(--ink-3);font-weight:400}
.astream{position:sticky;top:16px}

/* 全园状态表 */
.board{width:100%;border-collapse:collapse;margin-top:8px}
/* 手机上这张表放不下就自己横着滑（AP）：不套这一层，408px 的表把整页撑出 390 宽的屏幕 */
.boardwrap{max-width:100%;overflow-x:auto}
.board th{text-align:left;font-size:12px;color:var(--ink-3);font-weight:500;letter-spacing:.08em;
  padding:8px 10px;border-bottom:1px solid var(--line)}
.board th.n,.board td.n{text-align:right}
.board td{padding:10px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:middle}
.board tbody tr{cursor:pointer}
.board tbody tr:hover{background:var(--ivory)}
/* 班名和年龄段**竖着排**，不并排：并排时窄屏一换行，两个行内盒子会叠在一起
   （test_ui_overlap 在 820px 抓到过）。竖排还顺带让这一列在窄屏上不撑破。 */
.board td .cn{display:flex;flex-direction:column;line-height:1.25}
.board td b{font-size:13.5px;font-weight:700}
.board td small{color:var(--ink-3);font-size:12px}
.board td.n{font-weight:700;font-variant-numeric:tabular-nums}
.board td.n.bad{color:#B4412F}
.board td.go{width:28px;color:var(--ink-3)}

/* 月度观察记录：和 docx 一样的四列表 */
.recmeta{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:10px 0}
.recmeta label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--ink-3)}
.rectab{width:100%;border-collapse:collapse;min-width:900px}
.rectab th{background:var(--ivory);border:1px solid var(--line);padding:8px;font-size:12.5px;font-weight:700}
.rectab td{border:1px solid var(--line);padding:8px;vertical-align:top;width:25%}
.rectab td b{font-size:12.5px}
.saybox{margin:4px 0;font-size:12.5px;line-height:1.6;background:var(--ivory);
  border-radius:8px;padding:8px 10px;color:var(--ink)}
.rectab textarea{width:100%;font-size:12px}

/* 四列表那个弹层要宽一点——这张表本来就是横向 A4 的样子 */
.modal.xwide{width:min(1180px,96vw)}

/* 观察质量教练：提示条挂在输入框下面，不遮住她正在写的字 */
.coach{margin-top:8px;padding:10px 12px;border-radius:10px;background:var(--y-50);
  border:1px solid var(--y-100);display:flex;flex-direction:column;gap:8px}
.coach .ctip{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink)}
.cmarks{display:flex;gap:12px;flex-wrap:wrap}
.cmark{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-2);cursor:pointer}
.cmark.on{color:var(--ink);font-weight:600}
.cacts{display:flex;gap:6px;align-items:center}
.calt{border-top:1px dashed var(--y-100);padding-top:8px;display:flex;flex-direction:column;gap:6px}
.calttext{font-size:12.5px;line-height:1.6;background:var(--surface);border:1px solid var(--line);
  border-radius:8px;padding:8px 10px}
.stalek{color:var(--amber);cursor:pointer;text-decoration:underline}
.stalek:hover{color:var(--ink)}

/* ---- 个别化支持计划（成长档案页底下那一块）----
   视觉上跟别的 panel 一样，只多一条左边线：这一块是**给少数孩子**的，
   看得到的人也少，不该长得像全班都有的东西。字号一律 ≥12px（静态检查盯着）。 */
.asup{border-left:3px solid var(--yellow)}
.suphead{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin:6px 0}
.suphead .chip{font-size:12px}
.supacts{display:flex;gap:6px}
.supwhy{font-size:13px;line-height:1.6;margin:4px 0}
.supwho{border-top:1px dashed var(--line);padding-top:6px;margin-top:6px}
.supsec{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.supsec>header{display:flex;align-items:center;justify-content:space-between;gap:8px}
.supsec>header b{font-size:13px;font-weight:800}
.supgoal{border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-top:10px;background:var(--surface)}
.supgoal>header{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:6px}
.supgoal>header b{font-size:13.5px;font-weight:800;margin-right:4px}
.supgoal p{font-size:13px;line-height:1.6;margin:4px 0}
.supk{display:block;font-size:12.5px;font-weight:700;color:var(--ink-3);margin:10px 0 2px}
.supstrat{margin:2px 0 0 18px;padding:0;font-size:13px;line-height:1.7}
.supweek{margin:6px 0 0 18px;padding:0;font-size:12.5px;line-height:1.7;color:var(--ink-3)}
.supweek b{color:var(--ink);font-weight:700;margin-right:4px}
.supcurve{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0}
.supcurve span{display:flex;flex-direction:column;align-items:center;min-width:44px;
  border:1px solid var(--line);border-radius:8px;padding:4px 6px;background:var(--ivory)}
.supcurve b{font-size:15px;line-height:1.2}
.supcurve small{font-size:12px;color:var(--muted)}
.suptab{width:100%;border-collapse:collapse;margin-top:6px;font-size:12.5px}
.suptab td{border:1px solid var(--line);padding:6px 8px;vertical-align:top;line-height:1.6}
.suptab td.d{width:1%;white-space:nowrap;color:var(--muted)}
.supreview{margin-top:10px;border:1px dashed var(--line);border-radius:10px;padding:10px 12px;background:var(--ivory)}
.supreview.done{border-style:solid;background:var(--surface)}
.supreview b{display:block;font-size:12.5px;font-weight:800;margin-bottom:2px}
.supreview p{font-size:13px;line-height:1.7;margin:4px 0}
.supreview textarea{width:100%;margin:6px 0}
.supedit{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-top:8px}
.supedit textarea{width:100%;margin-top:8px}
/* 记录流上那一个勾。没标的时候淡，标了变成那个目标的名字 */
.supmk{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--muted);cursor:pointer}
.supmk.on{color:var(--teal-d);font-weight:700}
.supmk input{margin:0}

/* ---- 教学后记（弹层里那一块）---- */
.fbbox{margin:6px 0 12px}
.fbk{display:block;font-size:12.5px;font-weight:700;color:var(--ink-3);margin:12px 0 4px}
.fbnone{margin-top:8px}
.fbhad{margin:4px 0 0;color:var(--ink-2)}
.fbhist{border-top:1px solid var(--line);padding-top:10px;margin-top:6px}
.fbnote{display:flex;flex-wrap:wrap;gap:8px;align-items:baseline;padding:6px 0;
  border-bottom:1px solid var(--line);font-size:12.5px;line-height:1.6}
.fbnote:last-child{border-bottom:none}
.fbnote .fbt{flex:1;min-width:180px}
.fbv{font-size:12px;font-weight:700;border-radius:6px;padding:1px 7px;border:1px solid var(--line)}
.fbv.vgood{background:var(--y-50);color:var(--amber)}
.fbv.vhard{background:#FBEDEA;color:var(--warn)}

/* ---- 教研页 ---- */
.qahead{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start;justify-content:space-between;margin-bottom:8px}
.qahead .cphint{margin:2px 0 0;max-width:62ch}
.qatab{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:6px}
.qatab th{text-align:left;font-weight:700;color:var(--ink-3);padding:6px 8px;border-bottom:1px solid var(--line)}
.qatab td{padding:7px 8px;border-bottom:1px solid var(--line);vertical-align:middle}
.qatab tr:last-child td{border-bottom:none}
.qatab .nm{font-weight:700}
.qatab .nm small{display:block;font-weight:400;color:var(--muted)}
.qatab .num{text-align:right;font-variant-numeric:tabular-nums;width:92px}
.qatab .bar1{width:120px}
.qatab .bar1 i{display:block;height:6px;border-radius:3px;background:var(--y-100);min-width:2px}
/* 热力图：颜色是**面的颜色**加透明度，不是红黄绿——红黄绿会被读成好坏 */
.qagrids{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:18px;margin-top:8px}
.qak{display:block;font-size:12.5px;font-weight:700;color:var(--ink-3);margin-bottom:2px}
.qatab.heat th{font-size:12px;text-align:center;padding:4px 2px}
.qatab.heat th .fdot{display:block;width:8px;height:8px;border-radius:50%;margin:0 auto 2px}
.qatab.heat td.hc{text-align:center;font-variant-numeric:tabular-nums;border:1px solid var(--line)}
.qatab.heat td.hc.none{color:var(--ink-3);background:repeating-linear-gradient(45deg,
  var(--ivory),var(--ivory) 4px,var(--rail) 4px,var(--rail) 8px)}
.qatab.heat td.hc.thin{outline:2px solid var(--amber);outline-offset:-2px}
.chip .x{margin-left:6px;cursor:pointer;font-weight:700}

/* ---- 学年切换 ---- */
.cph4 .lnk.sy{float:right;font-size:12px;font-weight:400;color:var(--ink-3);cursor:pointer}
.cph4 .lnk.sy:hover{color:var(--ink)}
.sybox{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:10px 0}
.sybox .cphint{margin:2px 0 8px}
.btn.off{opacity:.45;cursor:not-allowed}
.syarch{margin-top:18px;border-top:1px solid var(--line);padding-top:10px}
.syarch summary{font-size:12.5px;font-weight:700;color:var(--ink-3);cursor:pointer}
.syrow{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:7px 0;
  border-bottom:1px solid var(--line);font-size:13px}
.syrow:last-child{border-bottom:none}
.syrow b{min-width:90px}

/* ---- 园长学期报告 ----
   每一节：先数字后话。两块之间留一条线，**别让它们看起来是一段** */
.rpsec{margin-top:14px}
.rpnum{margin:6px 0 10px;max-width:520px}
.rpnum td{border-bottom:1px solid var(--line);padding:5px 8px}
.rpnum td.num{text-align:right;font-variant-numeric:tabular-nums;font-weight:700}
.rpnone{font-size:12.5px;color:var(--ink-3);font-style:italic;margin:6px 0 10px}
.rptext{font-size:13.5px;line-height:1.8;margin:6px 0 4px;padding-top:8px;
  border-top:1px solid var(--line)}
.rpsec textarea{width:100%;margin-top:6px}

/* ---- 人员与账号 ---- */
.acsec{margin-top:14px}
.acrow{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:9px 0;
  border-bottom:1px solid var(--line);font-size:13px}
.acrow:last-child{border-bottom:none}
.acrow b{min-width:88px}
.acrow.off b,.acrow.off .cphint{opacity:.55}
.acacts{margin-left:auto;display:flex;gap:12px}
.acacts .lnk{font-size:12.5px;color:var(--ink-3);cursor:pointer}
.acacts .lnk:hover{color:var(--ink)}
.chip.pick{cursor:pointer;display:inline-flex;align-items:center;gap:5px}
.chip.pick input{margin:0}
.qatab tr.bad td{background:#FBEDEA}
.qatab td.code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}

/* ---- 登录 / 强制改密：两页共用一个壳（app.js 的 authShell）----
   底是象牙不是渐变。原先那条 linear-gradient(var(--teal),var(--teal-d)) 在过渡
   别名之后两头都解成 --ink，线上其实是一整屏墨黑——不是更好，是更糟。
   黄在这一屏出现三处：Logo、主按钮、输入框选中态，正好是规范里四处中的三处。 */
.authwrap{position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;
  padding:20px;background:var(--ivory);
  background-image:radial-gradient(120% 80% at 50% -10%,var(--rail) 0%,var(--ivory) 60%)}
.authcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-panel);
  padding:30px 28px;width:min(380px,100%);box-shadow:var(--shadow-float);text-align:left}
.authlogo{width:72px;height:72px;border-radius:18px;display:block;margin:0 auto 14px}
.authtitle{font-size:20px;font-weight:800;color:var(--ink);text-align:center}
.authsub{font-size:12.5px;color:var(--ink-3);margin:4px 0 20px;text-align:center;line-height:1.6}
.autherr{color:var(--warn);font-size:12.5px;min-height:18px;line-height:1.5}
.btn.authgo{width:100%;justify-content:center;margin-top:6px}
.authfoot{text-align:center;margin-top:14px}
/* 登录一次管 30 天（AP）：公用手机上用完要退——一行小字，不是一道闸 */
.authhint{text-align:center;font-size:12px;color:var(--ink-3);margin:10px 0 0}
.authfoot a{color:var(--ink-2);font-size:12.5px;cursor:pointer}
.authfoot a:hover{color:var(--ink)}

/* ---- 分段条：页内 tab（设计活动 / 园所设置）----
   在 topbar 和 #view 之间，**不在 #view 里**——内层渲染函数会整个重写 #view。
   空的时候整条不占位。 */
.subnav{flex:none;padding:12px 28px 0;background:var(--ivory)}
.subnav:empty{display:none}
.subnav .cwtabs{max-width:620px}
@media (max-width:720px){ .subnav{padding:10px 16px 0} }

/* ---- 课程方案：只读概览（园所设置 › 课程方案）----
   跟「生成」那三列长得不一样是有意的：那边是可以动手的长列表，
   这边是一学期看一次的对账卡。 */
.wgplans{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin-top:10px}
.wgpcard{display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);
  border-radius:var(--r-card);padding:14px 16px;background:var(--surface)}
.wgpcard>b{font-size:14px;font-weight:800}
.wgpcard .wgpname{font-size:13px;color:var(--ink-2);line-height:1.5}
.wgpcard.none{align-items:center;justify-content:center;text-align:center;min-height:150px;
  border-style:dashed;cursor:pointer}
.wgpcard.none:hover{border-color:var(--yellow);background:var(--y-50)}
.wgptaken{display:flex;flex-wrap:wrap;gap:5px;margin-top:4px}
.wgptaken .chip{font-size:12px}

/* ---- 助手：右下角常驻按钮 + 右侧抽屉 ----
   层级刻意排在弹层**下面**：`.mask` 是 40、`.cpmask` 是 60，
   抽屉 35 / 按钮 34——确认框永远盖得住它，不会出现「点了确定却被抽屉挡住」。
   抽屉是 position:fixed 的覆盖层，不挤压布局，底下那一页照常滚。 */
.asfab{position:fixed;right:24px;bottom:24px;z-index:34;width:48px;height:48px;border-radius:50%;
  background:var(--ink);color:#fff;border:none;cursor:pointer;display:none;
  align-items:center;justify-content:center;box-shadow:var(--shadow-float);
  transition:right .22s cubic-bezier(.4,0,.2,1),transform .12s}
.asfab.on{display:inline-flex}
.asfab:hover{transform:translateY(-1px)}
.asfab svg{width:22px;height:22px;display:block}
/* 停上去才出「助手」两个字——按钮本身不带标签，一个圆点就够 */
.asfab::after{content:attr(data-tip);position:absolute;right:calc(100% + 10px);top:50%;
  transform:translateY(-50%);background:var(--ink);color:#fff;font-size:12px;line-height:1;
  padding:6px 9px;border-radius:7px;white-space:nowrap;opacity:0;pointer-events:none;transition:.12s}
.asfab:hover::after{opacity:1}
/* 抽屉开着时按钮挪到抽屉左边，不压在对话上 */
.asfab.open{right:calc(min(420px,100vw) + 24px)}

.asdrawer{position:fixed;right:0;top:0;bottom:0;width:min(420px,100vw);z-index:35;
  background:var(--surface);border-left:1px solid var(--line);
  box-shadow:var(--shadow-float);display:none;flex-direction:column;padding:16px 20px 18px}
.asdrawer.on{display:flex}
.asdhead{display:flex;align-items:center;gap:10px;margin-bottom:2px}
.asdhead b{flex:1;font-size:16px;font-weight:800}
.asdwhat{font-size:12.5px;color:var(--ink-3);line-height:1.6;margin:2px 0 8px}
/* 抽屉里那份对话要撑满抽屉，不是页面。
   **三层都要 flex:1 + min-height:0**：`#asHost` 是 `renderAssistant` 写进去的那个
   中间层，漏了它，对话就挤在顶上、底下空一大片。 */
.asdrawer > #asHost{flex:1;min-height:0;display:flex;flex-direction:column}
.asdrawer .asschat{height:auto;flex:1;min-height:0;max-width:none}
.asdrawer .asmsgs{min-height:0}
/* placeholder 缩短了（见 copy.js 的 assist.ph），一行装得下；
   留一点最小高度让它别太局促 */
.asdrawer .asinp textarea{min-height:42px}
@media (max-width:720px){
  /* 窄屏抽屉占满，按钮挪不出去——开着就藏起来，关它用表头那个 × */
  .asfab.open{display:none}
  .asdrawer{padding:14px 16px 16px}
}

/* ---- 手机上跟助手说话（AP，≤768px；场景见 app.js 里 asMobile 那一段） ---- */
.asdock{display:none}
body.aslock{position:fixed;left:0;right:0;width:100%;overflow:hidden}
@media (max-width:768px){
  /* 整屏。高度跟着**看得见的那一块**（`--vh` / `--vtop` 由 visualViewport 写）：键盘弹出来那一块变矮，
     输入框永远在键盘上面。`100vh` 在 iOS Safari 和微信里是没有地址栏那一版，输入框会被顶到屏幕外 */
  .asdrawer{left:var(--vleft,0);right:auto;width:100vw;width:var(--vw,100vw);top:var(--vtop,0);bottom:auto;
    height:100vh;height:100dvh;height:var(--vh,100dvh);
    border-left:none;padding:10px 12px calc(10px + env(safe-area-inset-bottom,0px))}
  /* **键盘起来时输入框不许掉到键盘底下**（AP 复查）：对话还空着时那一列例子有 292px 高、顶上那段说明 80px，
     flex 子项默认缩不下去——输入框和「发送」整块被挤出抽屉底边。例子那一块缩得下、自己滚；
     键盘起来（`body.askb`，asVh 判）时顶上那段说明收起来、底部安全区那一截也不要了 */
  .asdrawer .asmsgs{flex:1 1 0;min-height:0}
  .asdrawer .astips{flex:0 1 auto;min-height:0;overflow-y:auto}
  body.askb .asdrawer .asdwhat{display:none}
  body.askb .asdrawer{padding-bottom:8px}
  .asfab.open{display:none}
  /* 16px：iOS 对小于 16px 的输入框聚焦时会把整页放大、退出来还不复原（不是我们的字号规矩，只往上改） */
  /* 最低两行高：手机上那句 placeholder（键盘上的麦克风可以直接口述）一行放不下，一行高就只露半句 */
  .asdrawer .asinp textarea{font-size:16px;line-height:1.5;min-height:70px}
  .asdrawer .asinp .btn{height:44px;min-width:68px;font-size:15px;justify-content:center}
  .asmsgs .b{font-size:15px;max-width:92%}
  .asdrawer .astips{flex-direction:column;align-items:stretch;flex-wrap:nowrap}
  .asdrawer .astips .quick{font-size:15px;text-align:left;padding:10px 12px;border-radius:12px}
  .asdrawer .aslinks{flex-direction:column;align-items:stretch}
  .asdrawer .aslinks .btn{height:44px;justify-content:center;font-size:15px}
  /* 老师那三页底部常驻的「跟助手说一句…」：在最底，页面内容底下留出它的高度 */
  .asdock.on{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:33;background:var(--surface);
    border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom,0px))}
  .asdockb{flex:1;display:flex;align-items:center;gap:8px;height:44px;padding:0 14px;border-radius:22px;
    border:1px solid var(--line-2);background:var(--ivory);color:var(--ink-3);font-size:15px;
    font-family:var(--font);text-align:left;cursor:pointer}
  .asdockb svg{width:18px;height:18px;flex:none}
  body.hasdock .content{padding-bottom:calc(40px + 60px + env(safe-area-inset-bottom,0px))}
  body.hasdock .asfab{display:none}
  body.hasdock .toast{bottom:calc(84px + env(safe-area-inset-bottom,0px))}
  /* 「只显示活动」：那一页是单手点登记表的，别多占一行 */
  body.actonly .asdock{display:none}
  /* 她在页面上的输入框里打字时收起来（AP 复查）：安卓微信是键盘把整页顶矮，贴底的这一条跟着停在键盘正上方，
     正好盖住她在写的那一格（点名备注、随手记） */
  body.kbd .asdock{display:none}
  body.kbd.hasdock .content{padding-bottom:40px}
  /* 页面上的输入框也 16px（AP 复查）：点名备注 12.5px、随手记 13px——iOS 聚焦时把整页放大、不复原，
     之后打开抽屉，看得见的那一块比抽屉窄，「发送」落在屏幕外。从根上不让它放大（只往上改） */
  .content input:not([type=checkbox]):not([type=radio]):not([type=range]),
  .content textarea, .content select{font-size:16px}
}

/* ---- 设计活动 · 这周 / 往期 ---- */
.dwpanel .fbk{margin-top:16px}
.dwth{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:4px 0}
.dwth b{font-size:17px;font-weight:800}
.dwno{font-size:13px;color:var(--ink-3);line-height:1.6;margin:4px 0}
/* 状态链：定主题 → 生成 → 审议 → 发给各班。**四步都画出来**——
   她看得见还差哪一步，就不会批完之后以为事情办完了 */
.cwol .cwadd{margin-top:6px}
.dwchain{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0 0 10px}
.dwstep{font-size:12px;line-height:1;padding:6px 10px;border-radius:999px;
  background:var(--ivory);color:var(--ink-3);border:1px solid var(--line);white-space:nowrap}
.dwstep.done{background:var(--y-50);color:var(--amber);border-color:var(--cream)}
.dwstep.now{background:var(--yellow);color:var(--ink);border-color:var(--yellow);font-weight:700}
.dwstep+.dwstep{position:relative}
/* 「这是 AI 拟的，不是你写的」那一句 + 她的大纲原文。
   两样摆在一起才比得出来；只摆清单的话她没有参照物 */
.wgaiwarn{font-size:13px;line-height:1.6;margin:0 0 8px;padding:8px 11px;border-radius:9px;
  background:var(--y-50);color:var(--amber);border:1px solid var(--cream);font-weight:600}
.wgmine{margin:0 0 10px}
.wgmt{margin:4px 0 0;padding:8px 11px;border-radius:9px;background:var(--ivory);
  border:1px solid var(--line);font-size:12.5px;line-height:1.7;color:var(--ink-2);
  white-space:pre-wrap;font-family:inherit;max-height:160px;overflow:auto}
/* 「上次没做成」那一句：说清为什么，不是报错——所以不用红 */
.dwwhy{font-size:12.5px;color:var(--ink-2);line-height:1.6;margin:4px 0 6px;
  padding:7px 10px;border-radius:8px;background:var(--ivory);border:1px solid var(--line)}
/* 「…」展开的那一小条动作（AH）。收在卡里、贴着标题下面——
   动作在东西上，不放页面角落。 */
.dwmore{display:flex;gap:10px;flex-wrap:wrap;margin:0 0 8px;padding:6px 10px;
  border-radius:8px;background:var(--ivory);border:1px solid var(--line)}
/* 重置预览里那两张清单。用列表不用一段话：她要一条一条看「这条我认不认」 */
.dwlist{margin:4px 0 10px;padding-left:18px;font-size:13px;color:var(--ink-2);
  line-height:1.8}
.dwlist li{margin:0}
/* 往期日历：一行一周，一格一个年龄段 */
.dwcal{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:8px}
.dwcal th{text-align:left;font-weight:700;color:var(--ink-3);padding:7px 10px;
  border-bottom:1px solid var(--line);white-space:nowrap}
.dwcal td{border:1px solid var(--line);padding:9px 10px;vertical-align:top}
.dwcal td.nm{white-space:nowrap;border-left:none}
.dwcal td.nm b{font-weight:700}
.dwcal td.nm small{display:block;color:var(--amber);font-weight:700}
.dwcal tr.now td{background:var(--y-50)}
.dwcal .dwc{min-width:180px}
.dwcal .dwc b{display:block;margin-bottom:5px}
.dwcal .dwc b.none{color:var(--ink-3);font-weight:400}
.dwcal .dwc.none{color:var(--ink-3)}
.dwcal .dwc.can{cursor:pointer}
.dwcal .dwc.can:hover{background:var(--ivory)}
.dwcal .dwc .cphint{display:block;margin-top:5px}
/* 那几个状态在 .cpst 家族里原本没有底色（线上就是无底色的），补齐 */
.cpst.designed,.cpst.reviewing{background:#FDF6E7;color:#7A5E22}
.cpst.imported,.cpst.arranged{background:var(--ivory);color:var(--ink-3)}

/* ---- 一段话拆成几条随手记（ainote.js） ----
   卡片不套卡片：外面那层是 .anwrap（白面一层），里面每条只画一道描边，
   不再给底色。不知道是谁的那张用黄框 + 黄底——黄是「要你看一眼」的颜色，
   红留给真正的错。 */
.anwrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-panel);padding:16px 18px;margin-bottom:14px}
.anbox{margin-top:6px}
.ancaut{margin:12px 0 8px;padding:9px 12px;border-radius:10px;background:var(--y-50);border:1px solid var(--cream);color:var(--amber);font-size:12.5px;font-weight:700}
.ancards{display:flex;flex-direction:column;gap:9px;margin-top:10px}
.ancard{border:1px solid var(--line);border-radius:var(--r-card);padding:10px 12px}
.ancard.ask{border-color:var(--yellow);background:var(--y-50)}
.anhd{display:flex;align-items:center;gap:9px;margin-bottom:7px}
.annm{font-size:13.5px;font-weight:800;color:var(--ink)}
.anwhy{font-size:12px;color:var(--ink-3)}
.anx{margin-left:auto;cursor:pointer;color:var(--ink-3);display:inline-flex;padding:3px;border-radius:7px}
.anx:hover{background:var(--line);color:var(--ink)}
.anpick{display:inline-flex;align-items:center;gap:6px;border:1px dashed var(--line-2);background:var(--surface);border-radius:9px;padding:5px 10px;cursor:pointer;font-family:var(--font);font-size:12.5px;font-weight:700;color:var(--amber)}
.antx{width:100%;border:1px solid var(--line);border-radius:9px;padding:8px 10px;font-family:var(--font);font-size:13px;color:var(--ink);background:var(--surface);resize:vertical}
.antx:focus{outline:none;border-color:var(--ink)}
.antip{display:block;margin-top:6px;font-size:12px;color:var(--amber)}
.anwho{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}

/* ---- 这一周的大纲：贴在老师那一页最上头，不折叠不摘要 ---- */
.cwol{display:flex;gap:10px;align-items:baseline;background:var(--y-50);border:1px solid var(--cream);border-radius:var(--r-card);padding:10px 14px;margin-bottom:12px}
.cwol b{flex:0 0 auto;font-size:12px;font-weight:800;color:var(--amber);letter-spacing:1px}
.cwol span{font-size:13.5px;color:var(--ink);line-height:1.55}

/* ---- 和 AI 改这一周 ---- */
.wcbox{margin-top:10px;border:1px solid var(--line);border-radius:var(--r-card);padding:10px 12px}
.wcbox.warn{border-color:var(--cream);background:var(--y-50)}
.wcl{margin:4px 0 0;padding-left:18px;font-size:13px;color:var(--ink);line-height:1.7}
.wcbox.warn .wcl{color:var(--amber)}

/* ---- 待批那一列 ---- */
.sopl{display:flex;flex-direction:column;gap:7px}
.sopr{display:flex;align-items:center;gap:10px;border:1px solid var(--line);border-radius:var(--r-card);padding:9px 12px}
.sopr b{font-size:13.5px;font-weight:800}
.sopr .cphint{flex:1}
/* 批周那一页：这一班表上老师自创、主任还没看过的那几节，缩进挂在这一班下面 */
.sopown{display:flex;flex-direction:column;gap:6px;margin:-1px 0 4px 18px}
.sopown>.cphint{flex:none}
.sopown .sopr{border-style:dashed}
/* 成长档案右栏：基本信息 + 联系人（AA：老师改得了自己班孩子的那几项） */
.kinfo .kv{display:flex;gap:10px;font-size:13px;padding:3px 0}
.kinfo .kv .k{width:72px;flex:none;color:var(--muted)}
.kguard{display:flex;align-items:center;gap:6px;padding:5px 0;border-top:1px solid var(--line);font-size:13px}
.kguard>span{flex:1;min-width:0}
.kguard small{display:block;color:var(--muted);font-size:12px}
.fixv{font-size:14px;font-weight:700;padding:6px 0}
/* 审议卡上「老师说不好上」那一条：原话原样摆着，不摘要 */
.cphard{margin-top:5px;font-size:12px;color:var(--amber);line-height:1.5}
.cphard span{display:block;color:var(--ink-2)}
.cphard span::before{content:"「"}
.cphard span::after{content:"」"}

/* ---- 顶栏搜人 ---- */
.ksearch{position:relative;margin-left:14px;flex:0 0 auto}
/* 窄屏收起来。顶栏本来就挤（面包屑 + 这一页的动作），再塞一个 204px 的框，
   面包屑那行副标就被挤出去了——test_ui_overlap 当场抓到。搜人是电脑端
   （≥1024px，见文件开头「界面规矩」）的东西，窄屏下班级本来就少，
   花名册翻得过来。 */
@media (max-width:1023px){ .ksearch{display:none!important} }
.ksearch input{border:1px solid var(--line-2);border-radius:var(--r-ctl);padding:6px 11px;font-family:var(--font);font-size:13px;color:var(--ink);background:var(--surface);width:190px}
.ksearch input:focus{outline:none;border-color:var(--ink)}
.kres{position:absolute;top:36px;left:0;min-width:260px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-float);padding:5px;z-index:50;max-height:60vh;overflow:auto}
.kres button{display:flex;align-items:baseline;gap:8px;width:100%;text-align:left;border:none;background:transparent;border-radius:9px;padding:8px 10px;cursor:pointer;font-family:var(--font);font-size:13px;color:var(--ink)}
.kres button:hover{background:var(--y-50)}
.kres b{font-weight:800}
.kres em{font-style:normal;color:var(--ink-2);font-size:12px}
.kres small{margin-left:auto;color:var(--ink-3);font-size:12px}

/* ---- 撞上全园安排：只说一句 ---- */
.cwoe{background:var(--y-50);border:1px solid var(--cream);border-radius:var(--r-card);padding:10px 14px;margin-bottom:12px}
.cwoe div{font-size:13px;line-height:1.7}
.cwoe b{color:var(--amber);font-weight:800;margin-right:8px}
.cwoe span{color:var(--ink)}
.cwoe .cphint{margin:4px 0 0}
.oeform{margin-top:10px}

/* 建号时「勾了几个年龄段」那句结论：空着 = 全园，得当场看得见 */
.acband{margin:7px 0 2px;font-size:12.5px;font-weight:700}
.acband .all{color:var(--amber)}
.acband .ok{color:var(--ink-2)}

/* ---- 按我们班改一改 ---- */
.cadeal{display:flex;flex-direction:column;gap:5px;background:var(--y-50);border:1px solid var(--cream);border-radius:var(--r-card);padding:10px 13px;margin:10px 0}
.cadeal div{display:flex;gap:9px;align-items:baseline;font-size:12.5px;line-height:1.6}
.cadeal b{flex:0 0 auto;font-weight:800}
.cadeal b.ok{color:var(--s-good)}
.cadeal b.warn{color:var(--amber)}
.cadeal span{color:var(--ink-2)}
.cahand{margin-top:10px}
.cafk{display:block;font-size:12px;font-weight:800;color:var(--ink-2);margin:9px 0 4px}
.cahead{display:grid;grid-template-columns:130px 1fr 1fr;gap:10px;margin-top:12px;font-size:12px;font-weight:800;color:var(--ink-3)}
.carows{display:flex;flex-direction:column;gap:7px;margin-top:5px}
.carow{display:grid;grid-template-columns:130px 1fr 1fr;gap:10px;align-items:start;border:1px solid var(--line);border-radius:var(--r-card);padding:9px 11px}
.carow.lock{border-color:var(--yellow);background:var(--y-50)}
.carow b{font-size:13px;font-weight:800;color:var(--ink)}
.carow b em{display:block;font-style:normal;font-size:12px;font-weight:700;color:var(--amber);margin-top:2px}
.cacell{font-size:12.5px;line-height:1.6;color:var(--ink-2);white-space:pre-wrap;word-break:break-word}
.cacell.new{color:var(--ink)}
/* 卡片上「班本调整 · N 处」 */
.cwadapt{display:inline-block;margin-top:4px;font-size:12px;font-weight:700;color:var(--amber);cursor:pointer}
.cwadapt:hover{text-decoration:underline}
/* 备选 / 库里的小标签 */
.btag{display:inline-block;margin-left:6px;font-style:normal;font-size:12px;font-weight:700;color:var(--ink-3)}
.btag.wait{color:var(--amber)}

/* 自定主题那条：拟好的活动清单，勾掉不要的、名字可以改 */
.wgcas{display:flex;flex-direction:column;gap:7px;margin:10px 0}
.wgca{display:grid;grid-template-columns:22px 110px 1fr 1.2fr;gap:9px;align-items:center;border:1px solid var(--line);border-radius:var(--r-card);padding:8px 11px}
.wgca.on{border-color:var(--line-2);background:var(--surface)}
.wgca:not(.on){opacity:.5}
.wgcat,.wgcan{width:100%}

/* 「排了 9 张，还有 3 格空着」——顶上那条说实话的带 */
.cwvac{background:var(--y-50);border:1px solid var(--cream);border-radius:var(--r-card);padding:9px 14px;margin-bottom:12px;font-size:13px;color:var(--amber);font-weight:700;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* 黄带里那个「一键填满」：这句话说的就是这件事，就地给个入口。
   静按钮（文字），顶栏那颗才是主按钮——一屏只一个主按钮。 */
.cwvac .btn.link{color:var(--ink);font-size:13px;font-weight:700;text-decoration:underline;height:auto;padding:0}
/* 卡上那个小标：这张不是这一周的主题，是从课程库补进来的 */
.cwfromlib{align-self:flex-start;margin-top:2px;font-size:12px;line-height:1.4;padding:1px 6px;border-radius:6px;background:var(--ivory);border:1px solid var(--line);color:var(--ink-3);font-weight:600}

/* ---- 点卡片打开教案 ---- */
/* 教案正文那一份是课案页那套渲染（app.js curriculumDoc）。里面那个「目录」抽屉
   是 position:fixed 的，摆进弹层会飘在页面右缘——弹层里用不上它，藏掉。 */
.modal.cwdoc .cdnav2{display:none!important}
.cwdocbody{max-height:62vh;overflow-y:auto;margin:10px 0;border:1px solid var(--line);border-radius:var(--r-card);padding:12px 14px}
/* 教案弹层那一排动作：**钉在标题下面**，一行放不下就横着滚，不折成两行。
   折两行的代价是正文被挤下去，而她滚下去之后这一排就看不见了。 */
.cwacts{display:flex;flex-wrap:nowrap;gap:7px;overflow-x:auto;padding:8px 0;
  position:sticky;top:0;z-index:2;background:#fff;border-bottom:1px solid var(--line)}
.cwacts .btn{font-size:12.5px;flex:none;white-space:nowrap}
/* 做过的那几件事带一颗小点：改过、写过后记 */
.actdot{width:6px;height:6px;border-radius:50%;background:var(--yellow);
  display:inline-block;margin-left:5px;flex:none}
/* 「我们班的情况」抽屉里的一条 */
.cpline{display:flex;gap:10px;align-items:flex-start;padding:9px 0;border-top:1px solid var(--line)}
.cpline:first-child{border-top:none}
.cpline .tx{flex:1;min-width:0;font-size:13px;line-height:1.5;color:var(--ink)}
.cpline .src{font-size:12px;color:var(--ink-3);margin-top:2px}
.cpline .acts{display:flex;gap:4px;flex:none}

/* ---- 课程库按周分组 ---- */
.libkinds{margin:8px 0 6px}
.libgrp{margin-bottom:7px}
.libhd{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:1px solid var(--line);background:var(--surface);border-radius:var(--r-card);padding:8px 11px;cursor:pointer;font-family:var(--font);font-size:12.5px;font-weight:800;color:var(--ink)}
.libhd.on{background:var(--y-50);border-color:var(--cream)}
.libhd span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.libhd em{font-style:normal;font-weight:700;color:var(--ink-3);font-size:12px}
.libhd i{font-style:normal;width:14px;text-align:center;color:var(--ink-3)}
.libcards{display:flex;flex-direction:column;gap:8px;margin-top:7px}

/* ---- 本周能力覆盖矩阵 ---- */
/* 六个群的颜色**只出现在这几个点上**：不做底色、不做字色（设计规范）。 */
.hexdot{width:9px;height:9px;border-radius:50%;display:inline-block;vertical-align:middle}
.hexdot.hollow{background:transparent;border:1.5px solid var(--line-2)}
.hexdots{display:inline-flex;gap:4px;align-items:center;margin-right:8px}
.hexbox{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);
  padding:14px 16px;margin-bottom:14px}
.hexhd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.hexhd b{font-size:15px;font-weight:800}
.hexhd .sub{font-size:13px;color:var(--ink-2);font-weight:700}
.hexscroll{overflow-x:auto;margin-top:10px}
.hextable{border-collapse:collapse;width:100%;font-size:12.5px}
.hextable th,.hextable td{border-bottom:1px solid var(--line);padding:7px 8px;text-align:center;
  white-space:nowrap}
.hextable th{font-weight:700;color:var(--ink-2);font-size:12px}
.hextable th .cn{display:block;margin-top:3px}
.hextable .act{text-align:left;color:var(--ink);max-width:260px;overflow:hidden;
  text-overflow:ellipsis}
.hextable tr.sum td{font-weight:800;border-bottom:none;background:var(--ivory)}
/* 活动名那一格：名字长了截断，「按类型推的」那个 chip 不许被截掉 */
.hextable .hexact{display:flex;align-items:center;gap:6px;min-width:0;max-width:260px}
.hextable .hexact .lbl{overflow:hidden;text-overflow:ellipsis;min-width:0}
.chip.hexsug{flex:none;height:20px;padding:0 7px;font-size:12px;font-weight:600;
  color:var(--ink-3);cursor:help}
.hexsugnote{margin-top:8px}
.hextable tr.sum td.miss{color:var(--amber)}
/* 审议页那一张下面那一组主题游戏包（AQ）：隔一条线、字淡一档、点是空心的 */
.hextable tr.hexsetsep td{border-top:2px solid var(--line-2);background:var(--ivory);color:var(--ink-2);
  font-size:12px;font-weight:700;padding:5px 8px}
.hextable tr.hexsetrow td.act{color:var(--ink-2)}
.hextable .hexsetn{color:var(--ink-3);font-weight:600}
.hexfoot{margin-top:10px;padding:8px 12px;border-radius:10px;font-size:13px;font-weight:700;
  word-break:break-word;line-height:1.5}
.hexfoot.ok{background:#EAF5F0;color:#2E6B5E}
.hexfoot.warn{background:var(--y-50);color:var(--amber)}
.hexfoot.wait{background:var(--ivory);color:var(--ink-2);font-weight:600}
.hexfoot .btn.link{font-size:13px;font-weight:700;color:var(--ink);text-decoration:underline}
/* 老师页那一条折叠的 */
.hexline{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:700;
  color:var(--ink-2);background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-card);padding:8px 14px;margin-bottom:12px;cursor:pointer}

/* ---- 教案上的理念对照 / 靶能力 chip ---- */
.capchips{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 10px}
.capchip{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;font-weight:700;
  padding:3px 10px;border-radius:999px;background:var(--ivory);color:var(--ink);
  border:1px solid var(--line);border-left:3px solid var(--line-2)}
/* 理念对照那一排是**只读的对照**，压得更淡一点，别跟靶能力抢 */
.capchip.fw{font-weight:600;color:var(--ink-2);border-left-color:var(--line)}
.capchip i{font-style:normal;cursor:pointer;color:var(--ink-3);font-size:13px}
.capgoals li b{font-weight:800}

/* ---- 登记表那三颗 ①②③ ----
   **这几条以前一条都没有**：`.obsb.on` 在 HTML 里加了半年，而 CSS 里没有
   `.obsb` 任何一条规则——点下去 class 变了、样子一点没变。老师看到的是
   「点了没反应」，于是同一格点了又点。判「选中态」要比 computed style,
   不能只比 class：class 早就对了，缺的就是样子。 */
.obsb{display:inline-flex;align-items:center;justify-content:center;
  width:26px;height:26px;margin:0 2px;padding:0;font-size:13px;line-height:1;
  border:1px solid var(--line-2);border-radius:999px;background:#fff;color:var(--ink-2);
  cursor:pointer;font-family:var(--font);transition:background .12s,border-color .12s}
.obsb:hover{border-color:var(--ink-3)}
/* 选中态用**品牌黄**（设计规范：黄只出现在 Logo / 主按钮 / 选中态 / 提示条） */
.obsb.on{background:var(--yellow);border-color:var(--yellow);color:var(--ink);font-weight:800}
/* 按默认落下来的那一格画**空心**：它跟她一格一格点出来的不是一回事,
   读这份档案的人要分得出来。再点一下就变实心（她自己确认过了）。 */
.obsb.bulk{background:transparent;border:1.5px dashed var(--yellow);color:var(--amber);
  font-weight:800}
.obsc.saved{outline:2px solid var(--yellow);outline-offset:-2px;border-radius:6px}
.obsdef2{display:flex;align-items:center;gap:4px;justify-content:center;margin-top:4px}
.obsdef2 .obsb{width:22px;height:22px;font-size:12px}
.obsdef2 small{font-size:12px;color:var(--ink-3)}

/* ---------- 生成分枝（AB）：一个玩法一张小卡 ----------
   审议页、老师挑玩法、自己写一个、换个玩法四处共用（app.js 的 vCard）。
   小卡只描边不铺白：它常摆在白面板或白卡里，卡片不套卡片。 */
.vcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px;margin:6px 0}
.vcard{border:1px solid var(--line-2);border-radius:var(--r-card);padding:9px 11px;display:flex;flex-direction:column;gap:4px;min-width:0}
.vcard.on{border-color:var(--ink);background:var(--y-50)}
.vcard b{font-size:14px;font-weight:800;color:var(--ink)}
.vcard p{font-size:13px;line-height:1.5;color:var(--ink-2);margin:0}
.vcard .vk{font-size:12px;color:var(--ink-3)}
.vcard .vacts{display:flex;gap:6px;justify-content:flex-end;margin-top:4px;flex-wrap:wrap}
/* 审议页那一行：跟 .cpcard 同一个外框，不可点（点进去是审教案，这一节还没有教案） */
.cpvar{border:1px dashed var(--line-2);border-radius:12px;padding:13px;display:flex;flex-direction:column;gap:3px}
.cpvar.signed{border-style:solid;border-color:var(--teal);background:var(--tint)}
.cpvar .cpcd{width:auto}
.modal.cwpick .vcards{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}
.caswitch{margin-top:12px;border-top:1px solid var(--line);padding-top:10px}
/* 教案页上的备选开场 / 延伸：点一下换着看 */
.cdalts{margin:8px 0 12px;display:flex;flex-direction:column;gap:6px}
.cdalt{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:13px}
.cdaltk{font-weight:700;color:var(--ink);flex:none}
.cdaltv{flex:1;min-width:160px;color:var(--ink-2);line-height:1.5}
/* 随手记里视频抽出来的那几张画面（AC） */
.sframes{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin-top:4px}
.sframes img{width:56px;height:42px;object-fit:cover;border-radius:6px;border:1px solid var(--line)}

/* 助手回的链接和「确定 / 算了」两颗（AM） */
.aslinks{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}
.aslinks .btn{text-decoration:none}

/* ---------- 教案在右边整屏打开（AR，docpanel.js） ----------
   一整条从顶到底，**盖在页面右边、不挤页面**：「我们班这周」那张表要 800 多宽，挤到一半就成了一条竖缝。
   左边露出来的那几天照样看得见、点得动（点另一张卡右边换成那一节）；左边那道边拖得动，宽度记在这台设备上。
   层级 33：压在助手按钮（34）、抽屉（35）、弹层（40）下面——上完了怎么样、改一改那几个弹层开在它上面。 */
:root{--dpw:clamp(440px,46vw,860px)}
.dpanel{position:fixed;top:0;right:0;bottom:0;width:var(--dpw);z-index:33;display:none;flex-direction:column;
  background:var(--surface);border-left:1px solid var(--line);box-shadow:var(--shadow-float);overflow:hidden}
.dpanel.on{display:flex}
body.dpopen .asfab:not(.open){right:calc(var(--dpw) + 24px)}
.dpgrip{position:absolute;left:-4px;top:0;bottom:0;width:8px;cursor:col-resize;z-index:3}
.dpgrip::after{content:"";position:absolute;left:3px;top:50%;width:2px;height:36px;margin-top:-18px;
  border-radius:2px;background:var(--line-2)}
.dpgrip:hover::after{background:var(--ink-3)}
body.dpdrag{cursor:col-resize;user-select:none}
.dphead{display:flex;align-items:center;gap:8px;padding:16px 16px 12px 20px;border-bottom:1px solid var(--line)}
.dphead h3{flex:1;margin:0;font-size:17px;line-height:1.35;min-width:0;overflow-wrap:anywhere}
.dpclose{flex:none;width:32px;height:32px;border-radius:8px;border:0;background:none;cursor:pointer;
  color:var(--ink-2);display:grid;place-items:center}
.dpclose:hover{background:var(--ivory)}
.dpclose svg{width:18px;height:18px}
.dphint{margin:10px 20px 0;font-size:12px;color:var(--ink-3);line-height:1.5}
.dpbody{flex:1;overflow-y:auto;padding:12px 20px 32px;position:relative}
.dpbody .cwdocbody{max-height:none;overflow:visible;border:0;padding:0;margin:12px 0 0}
.dpbody .cdnav2{display:none!important}
/* 选中一段字之后冒出来的那一条（直接改 / 让 AI 改），改的时候展开成一小块 */
.dpsel{position:absolute;z-index:2;display:flex;gap:6px;padding:6px;background:var(--surface);
  border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-float)}
.dpsel[hidden]{display:none}
.dpsel .btn{display:inline-flex;align-items:center;gap:4px}
.dpsel .btn svg{width:14px;height:14px}
.dpsel.wide{flex-direction:column;align-items:stretch;width:min(420px,calc(100% - 16px));gap:8px;padding:12px}
.dpsel.wide .bar{margin:0}
.dpsel textarea,.dpsel input{width:100%;box-sizing:border-box;font:inherit;font-size:14px;line-height:1.5;
  padding:8px 10px;border:1px solid var(--line-2);border-radius:8px;background:var(--surface);color:var(--ink)}
.dpk{font-size:13px}
.dpquote{margin:0;font-size:12.5px;color:var(--ink-2);background:var(--ivory);border-radius:6px;padding:6px 8px;
  max-height:6em;overflow:auto}
.dpdiff{max-height:40vh;overflow:auto}
.dpdiff .dprow{display:grid;gap:4px;margin:6px 0}
.dpdiff .dprow b{font-size:12.5px}
@media (min-width:769px){
  /* 存下来的宽度在大屏上拖的、换到小窗口上：左边至少露 240（`dpClampW` 在脚本里也夹一次） */
  .dpanel{max-width:calc(100vw - 240px)}
}
@media (max-width:768px){
  /* 手机上整屏，**跟着看得见的那一块**（跟助手抽屉同一套 --vh / --vtop / --vw，`asVh` 写的）：键盘起来那一块变矮，
     改那几个字的框不被压在键盘底下。底下那一页用 `dpLock` 锁（iOS 上光 overflow:hidden 锁不住） */
  .dpanel{left:var(--vleft,0);right:auto;width:100vw;width:var(--vw,100vw);top:var(--vtop,0);bottom:auto;
    height:100dvh;height:var(--vh,100dvh)}
  .dpgrip{display:none}
  body.dpopen .asfab,body.dpopen .asdock{display:none}
  .dpsel textarea,.dpsel input{font-size:16px}
}
.dpbody .cwacts{flex-wrap:wrap;overflow:visible}
