/* 沃隆港项目教学管理工作台 · 移动优先样式（无框架、无构建） */
:root{
  --ink:#1f2328; --ink2:#4a5058; --ink3:#828a94;
  --line:#e3e6ea; --bg:#f2f4f5; --card:#fff;
  --blue:#185fa5; --blue-bg:#e6f1fb; --blue-bd:#b5d4f4;
  --teal:#0f6e56; --teal-bg:#e1f5ee;
  --amber:#854f0b; --amber-bg:#faeeda;
  --red:#a32d2d; --red-bg:#fcebeb;
  --gray-bg:#f1efe8;
  --nav-h:56px;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei","PingFang SC",sans-serif;
  font-size:15px;line-height:1.6;-webkit-text-size-adjust:100%;
  padding-bottom:calc(var(--nav-h) + env(safe-area-inset-bottom,0px));
}
a{color:var(--blue);text-decoration:none}
h1{font-size:18px;margin:0 0 4px;font-weight:600}
h2{font-size:15px;margin:18px 0 8px;font-weight:600;color:var(--ink2)}
h3{font-size:14px;margin:14px 0 6px;font-weight:600;color:var(--ink2)}

/* ---- 双语：英文为主 + 中文小字（国际项目）---- */
.bi{display:inline-flex;flex-direction:column;line-height:1.25;min-width:0;vertical-align:middle}
.bi .en{font-weight:500}
.bi .zh{font-size:11px;font-weight:400;color:var(--ink3);margin-top:1px;letter-spacing:.2px}
.topbar .bi .zh{font-size:10px;margin-top:0}
.tabbar .bi .en{font-size:13px}
.tabbar .bi .zh{font-size:10px;margin-top:0}
th .bi,td .bi{align-items:flex-start}
.btn .bi{align-items:center}
.btn .bi .zh{color:rgba(255,255,255,.72)}
.btn.ghost .bi .zh{color:var(--ink3)}
.stat .bi{align-items:flex-start}
.stat .bi .en{font-size:21px;font-weight:600;color:var(--blue)}
.stat .bi .zh{font-size:11px}
.stat .l .bi .en{font-size:12.5px;font-weight:400;color:var(--ink3)}

/* ---- 三档排版的补充：inl=短标签内联一行；single=长句单语（不叠中文）---- */
/* 窄屏（<560px）不强制单行：nowrap 会让栅格列的 min-content 变成整句宽，
   三列统计卡在手机上可把页面撑出横向滚动（右侧被裁的根因） */
.bi.inl{display:inline}
@media(min-width:560px){.bi.inl{white-space:nowrap}}
.bi.inl .zh{margin-left:6px}
.single{color:inherit}
/* 底部导航是窄栏，内联双语一律回退为紧凑叠层，避免 4 个入口互相挤压 */
.tabbar .bi.inl{display:inline-flex;flex-direction:column;align-items:center;white-space:normal}
.tabbar .bi.inl .en{font-size:13px}
.tabbar .bi.inl .zh{margin-left:0;margin-top:0;font-size:10px}

/* 顶栏 */
.topbar{
  position:sticky;top:0;z-index:20;background:var(--card);border-bottom:1px solid var(--line);
  padding:8px 14px;display:flex;align-items:center;gap:10px;
  padding-top:calc(8px + env(safe-area-inset-top,0px));
}
.tb-title{font-size:14px;flex:1;min-width:0;overflow:hidden}
.tb-back{font-size:22px;line-height:1;color:var(--ink2);text-decoration:none;
  padding:0 8px 2px 0;flex:none;min-width:28px;text-align:center}
.tb-back:active{color:var(--blue)}
.tb-sub{font-size:12px;color:var(--ink3);white-space:nowrap;flex:none}
/* 窄屏（≤420px）岗位名会把顶栏挤到重叠，直接不显示 —— 名字本身还在「我的」里 */
@media(max-width:420px){.tb-sub{display:none}}
.tb-out{font-size:12.5px;color:var(--ink3);border:1px solid var(--line);border-radius:20px;padding:3px 10px;white-space:nowrap;flex:none}

.wrap{max-width:820px;margin:0 auto;padding:14px}
.muted{color:var(--ink3)}
.kv{font-size:12.5px;color:var(--ink3)}
.small{font-size:12.5px}

/* 卡片 */
.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px;margin:10px 0}
.card.tight{padding:12px}
.card h3:first-child,.card h2:first-child{margin-top:0}
.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
.grid>*{min-width:0} /* 栅格子项可收缩，防止长标签把整页撑出横向滚动 */
.grid.g3{grid-template-columns:repeat(3,1fr)}
@media(min-width:560px){.grid{grid-template-columns:repeat(3,1fr)}.grid.g3{grid-template-columns:repeat(4,1fr)}}
.stat{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px;overflow:hidden}
.stat .n{font-size:22px;font-weight:600;color:var(--blue);line-height:1.25}
.stat .l{font-size:12.5px;color:var(--ink3)}

.note{background:var(--blue-bg);border:1px solid var(--blue-bd);border-radius:10px;padding:10px 12px;font-size:13px;margin:10px 0}
.warn{background:var(--amber-bg);border:1px solid #fac775;border-radius:10px;padding:10px 12px;font-size:13px;margin:10px 0}
.danger{background:var(--red-bg);border:1px solid #f7c1c1;border-radius:10px;padding:10px 12px;font-size:13px;margin:10px 0}
.ok{background:var(--teal-bg);border:1px solid #9fe1cb;border-radius:10px;padding:10px 12px;font-size:13px;margin:10px 0}

.chip{display:inline-block;font-size:11.5px;padding:1px 7px;border-radius:20px;background:var(--blue-bg);color:var(--blue);border:1px solid var(--blue-bd);margin-right:4px;white-space:nowrap}
.chip.g{background:var(--gray-bg);color:var(--ink2);border-color:var(--line)}
.chip.a{background:var(--amber-bg);color:var(--amber);border-color:#fac775}
.chip.t{background:var(--teal-bg);color:var(--teal);border-color:#9fe1cb}
.chip.r{background:var(--red-bg);color:var(--red);border-color:#f7c1c1}

/* 列表 */
.list{background:var(--card);border:1px solid var(--line);border-radius:12px;overflow:hidden;margin:10px 0}
.row{display:flex;gap:10px;padding:11px 13px;border-bottom:1px solid var(--line);align-items:flex-start}
.row:last-child{border-bottom:0}
.row .main{flex:1;min-width:0}
.row .t{font-size:14.5px;font-weight:500}
.row .s{font-size:12.5px;color:var(--ink3);margin-top:2px}
.row .r{font-size:12.5px;color:var(--ink3);text-align:right;white-space:nowrap}
/* .row 里放多个表单控件时（会议新建把 3 个字段横排），子 div 默认 min-width:auto
   会被控件固有宽度顶住、整行溢出；给它们 min-width:0 才能跟着容器收缩。 */
.row>div{min-width:0}
.dot{width:8px;height:8px;border-radius:50%;background:var(--blue);margin-top:7px;flex:0 0 8px}
.dot.gy{background:#c9ced4}.dot.am{background:#ef9f27}.dot.rd{background:#e24b4a}.dot.tl{background:#1d9e75}

/* 表格 */
.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:10px -14px;padding:0 14px}
table{width:100%;border-collapse:collapse;font-size:13px;background:var(--card)}
th,td{border:1px solid var(--line);padding:7px 9px;text-align:left;white-space:nowrap}
th{background:var(--gray-bg);font-weight:600}
td.wrap{white-space:normal}

/* 表单 */
label{display:block;font-size:13px;color:var(--ink2);margin:10px 0 4px}
/* 表单控件统一样式。
   ⚠️ 这里必须把日期/时间/数字类 input 一并列上：它们默认不被 input[type=text] 的规则覆盖，
      用的是浏览器原生长相（无 padding、有约 13rem 的固有最小宽度），
      在窄屏会把卡片顶出横向滚动（2026-10-19 在会议新建页踩到）。 */
input[type=text],input[type=password],input[type=tel],input[type=email],
input[type=date],input[type=time],input[type=datetime-local],input[type=number],
input[type=search],select,textarea{
  width:100%;min-width:0;padding:11px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;
  font-size:16px;font-family:inherit;color:var(--ink);
}
input:focus,input[type=password]:focus,select:focus,textarea:focus{outline:none;border-color:var(--blue)}
.btn{display:block;width:100%;padding:12px;border:0;border-radius:10px;background:var(--blue);color:#fff;
  font-size:15.5px;font-family:inherit;font-weight:500;margin-top:16px;cursor:pointer}
.btn.ghost{background:#fff;color:var(--ink2);border:1px solid var(--line)}
.btn:active{opacity:.85}
/* 小按钮：原来 .btn small 没有定义 —— 全部继承了 .btn 的 display:block;width:100%，
   于是在卡片头、表格里变成整行蓝色大块，跟正文抢空间（2026-10-18 修）。
   行内使用一律用 .btn.small，卡片头部用 .btn.small.nw 保证不换行。 */
.btn.small{display:inline-block;width:auto;margin:0;padding:7px 13px;
  font-size:13px;border-radius:8px;line-height:1.35}
.btn.small.ghost{padding:6px 12px;font-size:12.5px}
.btn.inline{display:inline-block;width:auto;margin:0}
/* 行内按钮：.row 是 flex，而 .btn 基础样式是 width:100% ——
   100% 按父容器算，与左边的标题并排时总宽超出容器，整页右侧被顶出横向滚动。
   公告/会议/反馈工作台的卡片头都踩过（2026-10-19 修）。 */
.row>.btn{margin-top:0;flex:none;width:auto}

/* 底部导航 */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;background:var(--card);
  border-top:1px solid var(--line);height:calc(var(--nav-h) + env(safe-area-inset-bottom,0px));
  padding-bottom:env(safe-area-inset-bottom,0px);
}
/* 底部导航：选中项用「浅底胶囊 + 居中 3px 指示条」（2026-10-18 项目办选定 A 方案） */
.tabbar a{position:relative;flex:1;display:flex;align-items:center;justify-content:center;
  font-size:13px;color:var(--ink3);font-weight:400;
  transition:background .12s ease,color .12s ease}
.tabbar a:active{background:var(--blue-bg)}
.tabbar a.on{color:#0C447C;font-weight:500}
.tabbar a.on:before{content:"";position:absolute;left:50%;top:5px;transform:translateX(-50%);
  width:calc(100% - 14px);height:calc(100% - 10px);background:var(--blue-bg);
  border-radius:10px;z-index:-1}
.tabbar a.on:after{content:"";position:absolute;left:50%;transform:translateX(-50%);top:0;
  width:26px;height:3px;background:var(--blue);border-radius:0 0 3px 3px}
.tabbar a:focus-visible{outline:2px solid var(--blue);outline-offset:-3px}
/* 中文小字在窄栏里取 10.5px：再小就看不清，再大会让 5 个入口互相挤压 */
.tabbar .bi .zh{font-size:10.5px}

/* 分段切换器（课表「按班级查看」这类）：选中＝蓝底白字，未选＝白底灰字。
   原来用 .chip，而 .chip 默认就是蓝底蓝字 —— 未选中看起来也像选中。 */
.seg{display:inline-flex;background:var(--card);border:1px solid var(--line);
  border-radius:999px;overflow:hidden;margin:2px 0}
.seg a{font-size:12.5px;padding:6px 13px;color:var(--ink2);text-decoration:none;
  border-right:1px solid var(--line);white-space:nowrap}
.seg a:last-child{border-right:0}
.seg a.on{background:var(--blue);color:#fff;font-weight:500}
.seg a:not(.on):active{background:var(--blue-bg)}

/* 表单分节（请假登记等长表单）：节标题 + 两列字段 + 说明小字 */
.fsec{border-top:1px solid var(--line);margin-top:12px;padding-top:10px}
.fsec.last{border-bottom:0}
.fsec-h{font-size:12px;font-weight:600;color:var(--blue);letter-spacing:.02em;margin-bottom:8px}
.fl{display:block;font-size:12px;color:var(--ink3);margin:8px 0 4px}
.fh{font-size:11.5px;color:var(--ink3);margin-top:5px;line-height:1.5}
.frow2{display:grid;grid-template-columns:1fr 1fr;gap:0 12px;margin-top:2px}
.frow2>div{min-width:0}
/* 三列字段（投放范围 / 类型 / 到期）：桌面一行三个，<560px 落成单列 ——
   三个下拉挤在一行时，手机上「类型」只剩一条缝、日期只剩 yyyy/mm/（2026-10-19 修）。 */
.frow3{display:grid;grid-template-columns:1fr;gap:0 12px;margin-top:2px}
.frow3>div{min-width:0}
@media(min-width:560px){.frow3{grid-template-columns:repeat(3,1fr)}}
/* 日期/时间行：原生 date / datetime-local 控件自带最小宽度，窄屏并排必然被裁 */
@media(max-width:559px){.frow2.fdate{grid-template-columns:1fr}}
.factions{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;
  border-top:1px solid var(--line);padding-top:12px}
.factions .btn{margin:0}

/* 复选清单（新建会议选参会人）：组头 + 两列勾选，整行可点。
   原来把名单塞进「卡片套卡片」，固定 320px 高溢出滚动，最后一行被切成半截 —— 看着像坏了。 */
.pick{border:1px solid var(--line);border-radius:10px;padding:4px;margin-top:8px}
.pick-h{display:flex;align-items:center;gap:10px;padding:3px 7px 6px}
.pick-h .t{flex:1;min-width:0;font-size:12px;font-weight:600;color:var(--blue)}
.pick-g{display:grid;grid-template-columns:1fr;gap:1px}
@media(min-width:560px){.pick-g{grid-template-columns:1fr 1fr;gap:1px 6px}}
.pick-i{display:flex;align-items:center;gap:8px;padding:8px;border-radius:8px;
  font-size:13.5px;cursor:pointer;min-width:0}
.pick-i:hover{background:var(--blue-bg)}
.pick-i.on{background:var(--blue-bg)}
.pick-i input{width:auto;flex:none;margin:0;accent-color:var(--blue)}
.pick-i .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pick-i .ps{flex:none;font-size:11.5px;color:var(--ink3)}

/* 整行可点的列表（学生名册等）：点行任意位置进详情，键盘 Enter 同样可用 */
table.clickable tr[data-href]{cursor:pointer}
table.clickable tr[data-href]:hover{background:var(--blue-bg)}
table.clickable tr[data-href]:focus-visible{outline:2px solid var(--blue);outline-offset:-2px}
table.clickable tr[data-href] td a{text-decoration:none;font-weight:500}

/* 登录页 */
.login-bg{min-height:100vh;display:flex;flex-direction:column;justify-content:center;padding:24px;padding-bottom:24px}
.login-org{font-size:12.5px;color:var(--ink3);line-height:1.5;margin-bottom:6px}
.login-card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:20px;max-width:420px;width:100%;margin:0 auto}
.login-h{font-size:19px;font-weight:600;margin:4px 0 16px}
.err{background:var(--red-bg);border:1px solid #f7c1c1;color:var(--red);border-radius:10px;padding:9px 12px;font-size:13.5px;margin-bottom:10px}
.foot{text-align:center;font-size:11.5px;color:var(--ink3);margin-top:18px;line-height:1.7}

/* ---- P2 基础数据维护页 ---- */
/* 表单：窄屏单列、宽屏两列（移动优先，避免一行塞两个输入框） */
.fg2{display:grid;grid-template-columns:1fr;gap:0 12px}
@media(min-width:560px){.fg2{grid-template-columns:1fr 1fr}}
.fg2>div{min-width:0}
form.inline{display:inline;margin:0}
.linkbtn{background:none;border:0;padding:0 2px;color:var(--blue);font:inherit;font-size:13px;cursor:pointer}
.linkbtn.rd{color:var(--red)}
.inline-rename{display:flex;gap:6px;align-items:center;margin:4px 0}
.inline-rename input{flex:1;min-width:0;padding:6px 8px;font-size:13px}
.chk{display:flex;align-items:flex-start;gap:7px;font-size:12.5px;color:var(--ink2);margin:7px 0}
.chk input{width:auto;flex:0 0 auto;margin-top:4px}
.perms{display:grid;grid-template-columns:1fr;gap:0 12px}
@media(min-width:560px){.perms{grid-template-columns:1fr 1fr}}
.sub{display:block;font-size:11.5px;color:var(--ink3);margin-top:1px}
textarea.code{font-family:Consolas,"Courier New",monospace;font-size:13px;min-height:150px;line-height:1.5}
code{background:var(--gray-bg);border-radius:4px;padding:1px 5px;font-size:12.5px}
button.chip{border:1px solid var(--blue-bd);cursor:pointer;font-family:inherit}
a.row{color:inherit;text-decoration:none}
.row .t .bi,.row .s .bi{align-items:flex-start}

/* 周课表：每节课的「调整」折叠块（默认收起，点开才展开表单） */
.adj{border-bottom:1px solid var(--line);background:var(--gray-bg)}
.adj:last-child{border-bottom:0}
.adj>summary{list-style:none;cursor:pointer;padding:5px 13px;font-size:12px;color:var(--blue);
  display:flex;align-items:center;gap:6px;user-select:none}
.adj>summary::-webkit-details-marker{display:none}
.adj>summary:before{content:"＋";font-size:13px;line-height:1}
.adj[open]>summary:before{content:"－"}
.adj>summary:active{opacity:.7}
.adj .row{border-bottom:0}

/* ============================================================
   响应式表格（手机 ≤560px）：自动转为卡片式，避免横向滚动
   —— 由 base.html 的一段小脚本给每个 td 打上 data-label（取表头文字），
      这里用 attr() 渲染成「标签 + 值」两列，模板无需逐处改动。
   ============================================================ */
@media(max-width:560px){
  .scroll.rt-wrap{overflow:visible;margin:0;padding:0}
  table.rt{display:block;width:100%;background:none;border:0}
  /* 浏览器会自动插入 <tbody>（display:table-row-group），若不改成 block，
     它会把 tr/tbody 当表格内容处理、行宽退化成内容宽度（约 234px） */
  table.rt tbody,table.rt thead,table.rt tfoot{display:block}
  table.rt .rt-head{display:none}
  table.rt tbody>tr{display:block;background:var(--card);border:1px solid var(--line);
    border-radius:10px;padding:9px 12px;margin:0 0 8px;box-sizing:border-box}
  table.rt td{display:flex;gap:10px;align-items:baseline;border:0;padding:2px 0;
    white-space:normal;font-size:13.5px}
  table.rt td:before{content:attr(data-label);flex:0 0 42%;color:var(--ink3);
    font-size:11px;line-height:1.55;word-break:break-word}
  table.rt td[colspan]{display:block}
  table.rt td[colspan]:before{content:none}
  table.rt td[data-label=""]:before{content:none}
}

/* ============================================================
   P4 学情档案
   ============================================================ */
/* 填写单：列=学生、行=字段。这是唯一「必须保持表格形态」的表 —— 手机端靠横向滑动切换学生，
   模板上标了 class="nor"，base.html 的卡片化脚本会跳过它。 */
.sheetwrap{margin:10px 0;padding:0}
table.sheet{background:var(--card);table-layout:fixed}
table.sheet th.fld{position:sticky;left:0;z-index:2;background:var(--gray-bg);
  width:150px;min-width:150px;white-space:normal;font-size:12.5px;text-align:left}
table.sheet th.stu,table.sheet td{width:190px;min-width:190px;vertical-align:top}
table.sheet th.stu{font-weight:600;text-align:center}
table.sheet td{padding:6px}
table.sheet select{width:100%;padding:7px 8px;font-size:14px}
table.sheet textarea{width:100%;font-size:13px;padding:7px 8px;line-height:1.5}
table.sheet th.fld .sub{font-weight:400;color:var(--ink3);font-size:10.5px;margin-top:2px}

/* 学生端：七维度格子 */
.dimgrid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
@media(min-width:560px){.dimgrid{grid-template-columns:repeat(4,1fr)}}
.dimcell{display:flex;align-items:center;gap:6px;background:var(--gray-bg);
  border-radius:8px;padding:5px 8px;min-width:0}
.dimcell .l{font-size:11.5px;color:var(--ink2);flex:1;min-width:0}
.dimcell .v{flex:0 0 auto}

/* 打印 / 另存为 PDF：只留正文，去掉导航与按钮 */
.print-title{display:none}
@media print{
  .tb,.tabbar,.chip.g,.card.tight,.scroll{overflow:visible!important}
  .tb,.tabbar,.btn,.linkbtn{display:none!important}
  body{background:#fff}
  .print-title{display:block;text-align:center;margin:0 0 14px}
  .print-title .org{font-size:11px;color:#666}
  .print-title h1{font-size:20px;margin:4px 0}
  .print-title .sub{font-size:12px;color:#666}
  table{font-size:10.5px;page-break-inside:auto}
  tr{page-break-inside:avoid}
  th,td{white-space:normal!important}
}


/* ============================================================
   P4 分值控件（2026-10-16 由「五档」改为 0–10 分值）
   十一格点击条：单击赋分、按住可拖动连续赋分；右侧实时显示「分数 + 阶段说明」。
   一套控件同时服务桌面网格与手机「逐个学生」—— 手机端只是把表格切成只显示当前列。
   ============================================================ */
.sb{min-width:0}
.segs{display:flex;gap:2px}
.sg{flex:1 1 0;min-width:6px;height:18px;border-radius:3px;background:var(--gray-bg);
  border:.5px solid var(--line);cursor:pointer;touch-action:none}
.sg.on{background:var(--blue-bg);border-color:var(--blue-bd)}
.sg:nth-child(-n+5).on{background:var(--red-bg);border-color:#eeb8b8}
.sg:nth-child(6).on,.sg:nth-child(7).on{background:var(--amber-bg);border-color:#eed3a3}
.sg:nth-child(8).on,.sg:nth-child(9).on{background:var(--blue-bg);border-color:var(--blue-bd)}
.sg:nth-child(10).on,.sg:nth-child(11).on{background:var(--teal-bg);border-color:#a6d8c6}
.sg.edge{outline:1.5px solid rgba(0,0,0,.22);outline-offset:-1.5px}
.sbline{display:flex;align-items:baseline;gap:6px;margin-top:3px;font-size:12px;
  min-width:0;flex-wrap:wrap}
.sbline .sv{font-weight:600;color:var(--ink);flex:0 0 auto}
.sbline .sl{color:var(--ink3);flex:1 1 auto;min-width:0;white-space:normal;line-height:1.35}
.sbline .nb{margin-left:auto;font-size:11px;color:var(--ink3);background:none;border:0;
  padding:0;cursor:pointer;flex:0 0 auto}
.sbline .nb.on{color:var(--red);font-weight:600}
.sb.lk .sg{cursor:default}
.autoval{font-size:12.5px;color:var(--ink)}
.autoval b{font-size:14px}

/* 进度条 */
.pbar{height:5px;border-radius:3px;background:var(--gray-bg);overflow:hidden;margin-top:8px}
.pbar>i{display:block;height:5px;background:var(--teal);transition:width .2s}
th.stu .done{font-size:10px;padding:0 4px}

/* 评语短语库 */
.phr{margin-top:6px}
.phrg{margin-bottom:8px}
.phrg .sub{margin-bottom:4px}
.ph{display:inline-block;margin:0 5px 5px 0;cursor:pointer;font-size:12px}

/* 手机端「逐个学生」切换器 */
.who{display:none;align-items:center;gap:10px}
.who b{flex:1 1 auto;text-align:center;font-size:14px}

/* 与上周差异 */
.tr{font-size:11px;margin-top:1px}
.tr.up{color:var(--blue)}
.tr.down{color:var(--red)}
.sub.auto{color:var(--teal);font-weight:600}

/* 手机（≤560px）：表格只显示「字段 + 当前学生」一列 —— 一屏一人，不再左右滑 */
@media(max-width:560px){
  .who{display:flex}
  table.sheet th.stu,table.sheet td.stu-cell{display:none}
  table.sheet th.stu.cur,table.sheet td.stu-cell.cur{display:table-cell}
  table.sheet th.fld{width:104px;min-width:104px;font-size:12px}
  table.sheet th.stu.cur,table.sheet td.stu-cell.cur{width:auto;min-width:0}
  .sg{height:22px}
  .sheetwrap{padding-bottom:4px}
}

/* 学生端：科目卡片（点击原地展开） */
.subject{border:1px solid var(--line);border-radius:12px;background:var(--card);
  overflow:hidden;margin-bottom:8px}
.subject>summary{list-style:none;cursor:pointer;padding:11px 13px}
.subject>summary::-webkit-details-marker{display:none}
.subject>summary:active{background:var(--gray-bg)}
.subject .hd{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.subject .hd .t{font-size:14px;font-weight:600;color:var(--ink)}
.subject .hd .m{margin-left:auto;font-size:12px;color:var(--ink3)}
.subject .sub2{font-size:12px;color:var(--ink2);margin-top:3px}
.subject .pills{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.subject .body{border-top:1px solid var(--line);background:var(--gray-bg);padding:11px 13px}
.weeks{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
.weeks .wk{font-size:12px;padding:2px 9px;border-radius:99px;border:1px solid var(--line);
  color:var(--ink2);cursor:pointer;background:var(--card)}
.weeks .wk.on{background:var(--blue-bg);border-color:var(--blue-bd);color:var(--blue)}
.wkbody{display:none}
.wkbody.on{display:block}

/* ---- 看板周次条（2026-10-18 重做）----
   原来「切换周次」用的是 <details class="adj"> 套 .chip：.adj 是列表里折叠行的样式
   （灰底整行、带「＋」前缀），当按钮用既不像按钮；展开后 16 个 chip 在 flex:none 容器里
   按 max-content 排，直接把卡片撑破。现在改成左右箭头 + 横向滚动条：
   一行放得下全部 16 周，当前周蓝底白字，进入页面自动滚到中间。 */
.wkbar{display:flex;align-items:center;gap:7px;margin-top:11px;
  border-top:1px solid var(--line);padding-top:11px}
.wk-nav{flex:0 0 30px;height:30px;line-height:28px;text-align:center;font-size:17px;
  color:var(--ink2);border:1px solid var(--line);border-radius:8px;background:var(--card)}
.wk-nav:active{background:var(--blue-bg);border-color:var(--blue-bd)}
.wk-nav.off{opacity:.32}
/* min-width:0 —— 没有它，flex 子项按内容宽撑开，16 个周次会把卡片顶出横向滚动 */
.wk-scroll{position:relative;flex:1 1 auto;min-width:0;display:flex;gap:5px;
  overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:1px 0}
.wk-scroll::-webkit-scrollbar{display:none}
.wk-scroll .wk{flex:0 0 auto;font-size:12px;line-height:1.5;padding:3px 11px;
  border-radius:99px;border:1px solid var(--line);color:var(--ink2);
  background:var(--card);white-space:nowrap}
.wk-scroll .wk:active{background:var(--blue-bg)}
.wk-scroll .wk.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:500}

/* 阶段说明色签（学生端 / 区间维护 / 档案页共用） */
.pill{display:inline-block;font-size:12px;padding:2px 8px;border-radius:6px;
  background:var(--gray-bg);color:var(--ink2)}
.pill.ok{background:var(--teal-bg);color:var(--teal)}
.pill.info{background:var(--blue-bg);color:var(--blue)}
.pill.warn{background:var(--amber-bg);color:var(--amber)}
.pill.bad{background:var(--red-bg);color:var(--red)}
.pill.na{background:var(--gray-bg);color:var(--ink3)}

/* ============================================================
   P6 建议反馈
   ============================================================ */
/* 工作台的「主题」列允许折行：全表 th/td 默认 nowrap，标题一长就会把整页撑出横向滚动 */
td.wrap{white-space:normal;min-width:150px}
/* 内部备注整块染底色：提交人永远看不到它，处理时也别误当成可回复的内容复制出去 */
.n-inner{background:var(--amber-bg);border-color:var(--amber-bd) !important}
.fbcode{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:20px;letter-spacing:3px;
  font-weight:600;color:var(--ink)}

/* ============================================================
   P10 看板与导出中心
   图表不引库：纯 CSS 水平条。手机（320px）上「标签 84px + 条自适应 + 数值 52px」，
   条本身 flex:1/min-width:0，永远不会把页面撑出横向滚动。
   ============================================================ */
.kpi{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
@media(min-width:560px){.kpi{grid-template-columns:repeat(4,1fr)}}
.kpi>.stat{min-width:0;min-height:96px}
.kpi .stat .n{font-size:20px}
/* 指标卡数字标红。⚠️ `danger-n` 一直在模板里写、CSS 里却没定义 ——
   看板的「未点名」「触线」从上线起就没真正变红过（2026-10-19 补）。 */
.stat .n.danger-n{color:var(--red)}
/* 六卡版：手机 2×3，宽屏 3×2（4+2 的排法会留两个空位，很难看） */
.kpi.six{grid-template-columns:repeat(2,1fr)}
@media(min-width:560px){.kpi.six{grid-template-columns:repeat(3,1fr)}}
/* 可点指标卡：整块是链接，底部给一句明确的动作（原来只有数字，不知道该点哪） */
a.stat{display:block;text-decoration:none;color:inherit;
  transition:border-color .12s ease,background .12s ease}
a.stat:hover{border-color:var(--blue-bd);background:var(--blue-bg)}
a.stat:active{background:var(--blue-bg)}
a.stat .go{font-size:11.5px;color:var(--blue);margin-top:3px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row .go2{font-size:11.5px;color:var(--blue);flex:none;white-space:nowrap}
/* 指标卡：标题最多两行、动作一行，卡片等高，避免 6 张卡高低不齐 */
a.stat{padding:11px 12px;min-height:106px;display:flex;flex-direction:column;justify-content:space-between}
a.stat .l{line-height:1.35;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.nw{flex:none;white-space:nowrap}

/* 学生名册：卡片列表（手机 1 列 / ≥560px 2 列），点卡片进个人页 */
.roster{display:grid;grid-template-columns:1fr;gap:8px;margin:10px 0}
@media(min-width:560px){.roster{grid-template-columns:1fr 1fr}}
.roster .stu{display:flex;align-items:center;gap:10px;background:var(--card);
  border:1px solid var(--line);border-radius:12px;padding:11px 13px;
  text-decoration:none;color:inherit;transition:border-color .12s ease,background .12s ease}
.roster .stu:hover,.roster .stu:active{border-color:var(--blue-bd);background:var(--blue-bg)}
.roster .stu-name{font-size:15px;font-weight:600;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.roster .stu-meta{font-size:11.5px;font-variant-numeric:tabular-nums}
.roster .stu-go{flex:none;color:var(--ink3);font-size:18px;line-height:1}

/* 行式小列表（个人页的出勤/档案/成绩）：左侧两行文字，右侧一个数值，不用表格 */
.mrow{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
.mrow:last-child{border-bottom:0}
.mrow .mmain{flex:1;min-width:0}
.mrow .mt{font-size:13.5px;line-height:1.35}
.mrow .mval{flex:none;font-size:14px;font-variant-numeric:tabular-nums;text-align:right}
/* 计薪周填报：一行 = 一个教师，「差异原因」按需展开在行下方（2026-10-18 晚）
   以前 9 行各摆一个常显的「差异原因」空框，看起来像每行都得填点什么；
   现在只有把数字改得和建议值不一样时才滑出这一行，用琥珀底提示「这行要说明」。 */
.pcell{border-bottom:1px solid var(--line);padding:1px 0 7px}
.pcell:last-child{border-bottom:0}
.pdiff{margin-top:-2px}
.pdiff input{width:100%;font-size:12.5px;padding:6px 9px;background:var(--amber-bg);
  border-color:#fac775;color:var(--ink)}
.pdiff input::placeholder{color:var(--amber);opacity:.75}
.pdiff[hidden]{display:none}
/* 概览数字行（应出勤合计等）：一个大数 + 一行算式，不用栅格卡免得手机挤成两行 */
.bignum{font-size:24px;font-weight:600;color:var(--blue);line-height:1.2;
  font-variant-numeric:tabular-nums}
/* 行尾的次要动作（「调整」这类）：默认灰、悬停才变蓝，避免一屏十几条蓝链接抢眼 */
.mini{font-size:12px;color:var(--ink3);white-space:nowrap}
.mini:hover,.mini:active{color:var(--blue)}
.kbox{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px}
.krow{display:flex;align-items:center;gap:8px;padding:5px 0;font-size:13px}
.krow .kl{flex:0 0 88px;width:88px;color:var(--ink3);font-size:12px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.krow .kt{flex:1 1 auto;min-width:0;height:10px;background:var(--gray-bg);border-radius:6px;overflow:hidden}
.krow .kb{height:100%;border-radius:6px;background:var(--blue);min-width:2px}
.krow .kb.tl{background:#1d9e75}.krow .kb.am{background:#ef9f27}.krow .kb.rd{background:#e24b4a}
.krow .kn{flex:0 0 52px;width:52px;text-align:right;color:var(--ink2);
  font-variant-numeric:tabular-nums;font-size:12.5px}
.krow .kl.wide{flex-basis:112px;width:112px}
/* 导出项：名称 + 说明在左，下载按钮在右；手机上按钮不换行也不挤压正文 */
.xrow{display:flex;gap:10px;align-items:center;padding:11px 13px;border-bottom:1px solid var(--line)}
.xrow:last-child{border-bottom:0}
.xrow .xm{flex:1;min-width:0}
.xrow .xt{font-size:14px;font-weight:500}
.xrow .xs{font-size:12px;color:var(--ink3);margin-top:2px}
.xrow .xa{flex:0 0 auto}
@media(max-width:400px){
  .krow .kl{flex-basis:72px;width:72px}
  .krow .kn{flex-basis:46px;width:46px}
}
