/* Design system lifted verbatim from lesson_generator_demo.html, then
   extended with the sidebar-shell layout for the management console. */
:root{
  --teal:#2E6B5E;--teal-d:#0F4C45;--tint:#EAF3F0;--line:#D7E5E0;--ink:#23302C;
  --muted:#6B7B75;--bg:#FAF8F4;--card:#FFFFFF;--warn:#C25B6E;--gold:#B0894B;
  --font:"Microsoft YaHei","PingFang SC","Hiragino Sans GB","Source Han Sans SC",sans-serif;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased}

/* ---- app shell: sidebar + main ---- */
.app{display:flex;min-height:100vh}
.sidebar{width:216px;flex:none;background:linear-gradient(180deg,var(--teal),var(--teal-d));color:#fff;display:flex;flex-direction:column;padding:18px 12px;position:sticky;top:0;height:100vh}
.brand{font-size:17px;font-weight:800;letter-spacing:.5px;padding:6px 10px 4px}
.brand small{display:block;font-size:11px;font-weight:400;opacity:.8;letter-spacing:.3px;margin-top:2px}
.orgpick{margin:12px 6px 16px;font-size:12px}
.orgpick select{width:100%;background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.28);border-radius:8px;padding:7px 9px;font-family:var(--font);font-size:12.5px}
.orgpick select option{color:var(--ink)}
.nav{display:flex;flex-direction:column;gap:3px;margin-top:4px}
.nav a{display:flex;align-items:center;gap:10px;color:rgba(255,255,255,.85);text-decoration:none;padding:9px 11px;border-radius:9px;font-size:13.5px;font-weight:600;cursor:pointer;transition:.12s}
.nav a .i{width:18px;text-align:center;font-size:15px;opacity:.9}
.nav a:hover{background:rgba(255,255,255,.1);color:#fff}
.nav a.active{background:#fff;color:var(--teal-d)}
.nav .sep{height:1px;background:rgba(255,255,255,.16);margin:10px 8px}
.modewrap{display:flex;gap:4px;background:rgba(255,255,255,.1);border-radius:9px;padding:3px;margin:0 6px 10px}
.modewrap .mt{flex:1;text-align:center;font-size:12px;font-weight:600;color:rgba(255,255,255,.8);padding:6px 0;border-radius:7px;cursor:pointer}
.modewrap .mt.on{background:#fff;color:var(--teal-d)}
.side-foot{margin-top:auto;font-size:11px;opacity:.7;padding:8px 10px}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{background:#fff;border-bottom:1px solid var(--line);padding:14px 26px;display:flex;align-items:center;gap:12px}
.topbar .crumb{font-size:16px;font-weight:800;color:var(--teal-d)}
.topbar .crumb .muted{color:var(--muted);font-weight:400;font-size:13px}
.topbar .ctx{margin-left:auto;font-size:12px;color:var(--muted)}
.content{padding:22px 26px 60px;max-width:1120px;width:100%;margin:0 auto}

/* ---- reused demo components ---- */
.panel{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:22px;margin-bottom:18px;box-shadow:0 1px 2px rgba(0,0,0,.02)}
h2.sec{font-size:16px;margin:0 0 4px;color:var(--teal-d);font-weight:700}
.sec-desc{color:var(--muted);font-size:12.5px;margin:0 0 16px}
.btn{display:inline-flex;align-items:center;gap:7px;background:var(--teal);color:#fff;border:none;border-radius:9px;padding:10px 18px;font-size:14px;font-weight:600;cursor:pointer;font-family:var(--font);transition:.15s}
.btn:hover{background:var(--teal-d)}
.btn.ghost{background:#fff;color:var(--teal);border:1px solid var(--teal)}
.btn.ghost:hover{background:var(--tint)}
.btn.sm{padding:6px 12px;font-size:12.5px;border-radius:8px}
.btn.link{background:none;color:var(--muted);padding:8px 4px}
.btn.link:hover{background:none;color:var(--teal)}
.bar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:8px}
.right{margin-left:auto}
.badge{font-size:11px;background:var(--tint);color:var(--teal-d);border:1px solid var(--line);border-radius:6px;padding:3px 9px;font-weight:600}
.chip{font-size:12px;color:#fff;border-radius:20px;padding:4px 11px;font-weight:600;display:inline-flex;align-items:center;gap:6px}
.chip.off{background:var(--tint);color:var(--muted);border:1px dashed var(--line)}
.dot{display:inline-block;width:9px;height:9px;border-radius:50%;vertical-align:middle}
.pill{font-size:11px;border-radius:20px;padding:2px 10px;border:1px solid var(--line);background:var(--tint);color:var(--teal-d)}
.pill.warn{background:#FBE9EC;border-color:#F0C7CF;color:#8a3a4a;font-weight:700}
.pill.gold{background:#FFF7E8;border-color:#EBD7A8;color:#6b551f;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:11px;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(46,107,94,.1)}
.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(46,107,94,.1)}
.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(15,76,69,.35);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 h3{margin:0 0 14px;font-size:16px;color:var(--teal-d)}
.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(--teal);box-shadow:0 0 0 3px rgba(46,107,94,.1)}
.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:11.5px}
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:11px}

.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}
.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:11px;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:11px;transition:transform .15s;flex:none}
.phhead .chev.open{transform:rotate(90deg)}
.phname{font-weight:800;color:#6b551f;font-size:13.5px}
.phkind{font-size:10.5px;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:11.5px;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:11px;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}
.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(--teal);box-shadow:0 0 0 3px rgba(46,107,94,.1)}

/* ---- 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(15,76,69,.4);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}
  .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)}
}

/* ---- 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:10.5px}
.cdnavb:hover{background:var(--tint,#EAF3F0);border-color:var(--teal)}
.cdnavsep{align-self:center;font-size:10.5px;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}
.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:10.5px;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:11px;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{display:flex;gap:6px;align-items:center;flex:1;min-width:0;overflow-x:auto;white-space:nowrap}
.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 .sess{flex:none;font-size:12px;border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:16px;padding:4px 8px 4px 12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;max-width:160px}
.genv .sess span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.genv .sess.on{background:var(--teal);color:#fff;border-color:var(--teal)}
.genv .sess i{font-style:normal;opacity:.55;font-size:14px;line-height:1}
.genv .sess i:hover{opacity:1}
.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:11px;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(--teal);box-shadow:0 0 0 3px rgba(46,107,94,.1)}
.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:11px;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:11.5px;margin-top:3px}
.genv .docorg{text-align:center;color:var(--teal);font-size:11px;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:10.5px;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:11.5px;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:11px;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:11.5px}
.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:11px;transition:transform .15s;flex:none}
.genv .fitbar.open .chev{transform:rotate(90deg)}
.genv .fitnames{font-size:11px;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:10.5px;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 .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(15,76,69,.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:11px;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:11px;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:11.5px}
.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:11px;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:11px}
.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:11px}
.tbview .fc-event{cursor:pointer;border-radius:5px;font-size:11.5px}
.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}

/* 时间块：本周能力覆盖矩阵 */
.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:10.5px;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:11px;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}
.q4mock{font-weight:400;color:var(--warn);font-size:12px;margin-left:6px}
.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:11.5px}
.qform{display:inline-block;color:#fff;border-radius:6px;padding:1px 7px;font-size:11px;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}
.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}
