/* 围棋训练平台 —— 版式照 oa.qinyuan.net（SQG848 式）：
   左侧深色导航栏 220px + 顶栏 64px + 灰底内容区 + 页脚；主内容一律白卡 .sec。 */
:root{
  --ink:#1f2937; --sub:#6b7280; --line:#e5e7eb; --bg:#f3f4f6; --card:#fff;
  --brand:#2563eb; --brand-soft:#eff4ff; --ok:#059669; --warn:#0f6e56; --danger:#dc2626;
}
*{box-sizing:border-box}
[hidden]{display:none!important}   /* 录制面板靠 hidden 开关，不能被 .expbtns 的 display 顶掉 */
body{margin:0;background:var(--bg);color:var(--ink);
  font:14px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif}
a{color:var(--brand);text-decoration:none}
h1,h2{margin:0}
.muted{color:var(--sub);font-size:12.5px}
.sub{color:var(--sub);font-size:12.5px}
.sp{flex:1}
.empty{text-align:center;color:var(--sub);padding:26px 0;font-size:13.5px}
.hint{color:var(--sub);font-size:12.5px}
/* r1684：面棋 —— 新建对局表单 / 盘面右侧信息块 */
.faceform{display:flex;gap:16px;align-items:flex-end;flex-wrap:wrap}
.faceform label{display:flex;flex-direction:column;gap:6px;font-size:12.5px;color:var(--sub)}
.faceform select{height:34px;min-width:180px;padding:0 10px;border:1px solid var(--line);border-radius:8px;background:#fff;font:13.5px inherit;color:var(--fg)}
.faceinfo p{margin:0 0 9px;font-size:13.5px;display:flex;gap:10px;align-items:baseline}
.faceinfo p:last-child{margin-bottom:0}
.faceinfo p .muted{width:40px;flex:none;font-size:12.5px}
.faceinfo p b{font-weight:600}
.faceacts{display:flex;gap:8px;flex-wrap:wrap}
.faceacts form{display:inline-flex;gap:8px;margin:0}
/* r1681：卡片内首行提示与上方分隔线的间距，与下方筛选条对齐（原来 p 自带 1em 上边距 = 多出约 13px） */
.hint.htop{margin:0 0 12px;line-height:1.6}
.bad{color:var(--danger)}
.danger{color:var(--danger)}
.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
code{background:#f3f4f6;border-radius:5px;padding:1px 6px;font-size:12.5px}

/* ============ 外壳 ============ */
.sq-body{display:flex;margin:0;height:100vh;overflow:hidden;background:var(--bg)}
.sq-side{width:236px;flex:0 0 236px;background:linear-gradient(180deg,#1e2734,#19212c);
  color:#cbd5e1;display:flex;flex-direction:column;overflow:hidden;border-right:1px solid #111823}
.sq-side-hd{display:flex;align-items:center;justify-content:center;padding:42px 12px 36px;
  border-bottom:1px solid rgba(255,255,255,.07)}
.sq-brand{display:block;line-height:0}
.sq-lock{width:70px;height:auto;display:block}
.sq-logo{width:34px;height:34px;flex:0 0 34px;border-radius:50%;background:transparent;
  display:flex;align-items:center;justify-content:center;overflow:visible}
.sq-logo img{width:100%;height:100%;display:block;object-fit:contain;transform:none}
.sq-side-t{font-weight:700;color:#f9fafb;font-size:15px}
.sq-nav{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;margin:0;padding:7px 9px 11px}
.sq-nav::-webkit-scrollbar{width:6px}
.sq-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,.13);border-radius:3px}
.sq-nav::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.22)}
.sq-nav-item{display:flex;align-items:center;gap:10px;height:33px;padding:0 11px;margin:0;
  color:#c3ccda;font-size:13.5px;border-radius:8px;white-space:nowrap;
  transition:background .15s ease,color .15s ease}
.sq-nav-item svg{width:17px;height:17px;flex:0 0 17px;fill:none;stroke:currentColor;
  stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;opacity:.66;
  transition:opacity .15s ease}
.sq-nav-item:hover{background:rgba(255,255,255,.07);color:#fff}
.sq-nav-item:hover svg{opacity:1}
.sq-nav-item.active{background:var(--brand);color:#fff;font-weight:600;
  box-shadow:0 2px 10px rgba(37,99,235,.32)}
.sq-nav-item.active svg{opacity:1}
.sq-nav-grp{display:flex;align-items:center;gap:9px;margin:9px 0 4px;padding:0 11px;
  font-size:10.5px;letter-spacing:.12em;color:#78849a;font-weight:600}
.sq-nav-grp::after{content:"";flex:1;height:1px;background:rgba(255,255,255,.09)}

/* 侧栏二级子项（r991）：一级目录不动，子项缩进挂在下面 */
.sq-nav-item.has-child{position:relative}
.sq-nav-item.has-child::after{content:"";width:5px;height:5px;margin-left:auto;
  border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;
  transform:rotate(-45deg) translateY(-1px);opacity:.4}
.sq-nav-item.has-child.open{background:rgba(255,255,255,.075);color:#fff;font-weight:600}
.sq-nav-item.has-child.open svg{opacity:1}
.sq-nav-item.has-child.open::after{opacity:.8}
.sq-nav-item.child{position:relative;height:26px;padding-left:68px;margin:0;
  font-size:12.5px;color:#8b96a8}
.sq-nav-item.child::before{content:"";position:absolute;left:46px;top:50%;width:10px;height:1px;
  background:currentColor;opacity:.35}
.sq-nav-item.child:hover{color:#fff}
.sq-nav-item.child.active{background:var(--brand);color:#fff;font-weight:600;
  box-shadow:0 2px 8px rgba(37,99,235,.28)}
.sq-nav-item.child.active::before{opacity:.8}
.sq-side-ft{display:flex;align-items:center;gap:9px;padding:8px 14px;
  border-top:1px solid rgba(255,255,255,.07);font-size:12.5px;color:#8d99ac}
.sq-side-av{flex:0 0 26px;width:26px;height:26px;border-radius:50%;background:rgba(37,99,235,.92);
  color:#fff;font-size:12px;font-weight:600;display:flex;align-items:center;justify-content:center}
.sq-side-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#dfe5ee}
.sq-side-ft a{color:#8d99ac}
.sq-side-ft a:hover{color:#fff}
.sq-main{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}
.sq-topbar{height:64px;flex:0 0 64px;background:#fff;border-bottom:1px solid var(--line);
  display:flex;align-items:center;justify-content:space-between;padding:0 24px;gap:16px}
.sq-topbar h1{font-size:18px;color:#111827;font-weight:700}
.sq-user{display:flex;align-items:center;gap:12px;font-size:14px;color:#4b5563}
.sq-user .btn{border-color:var(--brand);color:var(--brand);font-weight:700;
  padding:3px 11px;font-size:13px;line-height:1.55;border-radius:7px}
.sq-user .btn:hover{background:var(--brand-soft)}
.sq-content{flex:1;min-width:0;overflow:auto;padding:20px 24px}
.sq-foot{flex:0 0 56px;background:#fff;border-top:1px solid var(--line);display:flex;align-items:center;
  padding:0 24px;font-size:12px;color:#9ca3af}
@media(max-width:900px){
  .sq-body{flex-direction:column;height:auto;overflow:auto}
  .sq-side{width:100%;flex:none;border-bottom:1px solid #374151}
  .sq-lock{width:72px}
  .sq-nav{display:flex;flex-wrap:wrap;margin:8px}
  .sq-nav-item{margin:2px 4px}
  .sq-nav-grp{display:none}
  .sq-main{min-height:100vh}
  .sq-content{padding:16px}
}
@media(max-width:560px){.sq-topbar{height:auto;padding:10px 16px;flex-wrap:wrap;gap:8px}}

/* ============ 白卡 ============ */
.sec{background:#fff;border:1px solid var(--line);border-radius:12px;margin-bottom:18px;overflow:hidden}
.sec-hd{padding:14px 18px 14px 28px;font-weight:700;color:#1f2937;font-size:16px;
  border-bottom:1px solid var(--line);border-left:3px solid var(--brand);margin-left:-1px}
.sec-hd.flex{display:flex;align-items:center;gap:10px;font-weight:400}
/* r23：页头按钮的字号 —— 原先继承 .sec-hd 的 16px，比表单里的「开始上传」大一圈 */
.sec-hd.flex .btn{font-size:14px}
.sec-hd.flex .btn.small{padding:5px 13px;line-height:1.4;font-size:12.5px}
.sec-hd.flex .gb{font-size:16px;font-weight:700;color:#1f2937}
.sec-hd.flex .updnext{color:#1f2937;font-weight:700}
.sec-hd.flex .me-name{font-size:13px;font-weight:400;color:#374151}
.sec-hd.flex .me-lv{font-size:11.5px;font-weight:400;color:#4b5563;background:#f1f2f6;
  border-radius:999px;padding:1px 9px;line-height:1.7}
.sec-bd{padding:18px}
.sec-bd h2{font-size:15px;margin:0 0 10px;font-weight:700}
.btnrow{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin:0 0 16px}

/* ============ 统计 ============ */
.stat{display:flex;gap:40px;flex-wrap:wrap}
.stat .k{font-size:12px;color:var(--sub)}
.stat .v{font-size:22px;font-weight:650;font-variant-numeric:tabular-nums}

/* ============ 按钮 ============ */
.btn{font:inherit;border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:9px;
  padding:8px 15px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:6px;
  /* r1177：以前 nowrap，窗口一窄「录入答案」就撑出按钮外；现在允许折行、最小宽 0 */
  white-space:normal;text-align:center;line-height:1.3;min-width:0;overflow-wrap:anywhere}
.btn:hover{border-color:#c9ced6}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{background:#1d4ed8}
.btn.small{padding:4px 10px;font-size:12.5px}
.btn.tiny{padding:2px 8px;font-size:11.5px;border-radius:7px}
.btn.danger{color:var(--danger);border-color:#fbd5d5}
.btn.ok{background:var(--ok);border-color:var(--ok);color:#fff}
.btn.bad{background:#fff;border-color:#fbd5d5;color:var(--danger)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn:disabled:hover{border-color:var(--line)}

/* ============ 表单 ============ */
input,select,textarea{font:inherit;color:var(--ink);background:#fff;border:1px solid var(--line);
  border-radius:9px;padding:8px 11px;outline:none;width:100%}
input:focus,select:focus,textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
input[type=checkbox],input[type=radio]{width:auto}
label{font-size:13px;color:var(--sub)}
.tagform{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px;margin:14px 0}
.tagform > label,.fld{display:flex;flex-direction:column;gap:6px}
.rowform{display:flex;gap:12px;align-items:flex-end;margin:14px 0}/* r48 字段 + 提交按钮同一行 */
.rowform .tagform{flex:1;margin:0}
.rowform .btn{flex:0 0 auto;white-space:nowrap}
.tagform select{width:100%}
.upload{margin:0}
.upload.narrow{max-width:760px}
.drop{border:1.5px dashed #cbd5e1;border-radius:12px;padding:26px 18px;text-align:center;
  cursor:pointer;background:#fafbfe;transition:.15s;display:block}
.drop:hover{border-color:var(--brand);background:#f5f8ff}
.drop input{display:none}
.radiogroup{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:6px 0 16px}
.radiogroup .rlabel{font-size:13px;color:var(--sub);margin-right:2px}
.radiogroup .r{display:flex;align-items:center;gap:7px;border:1px solid var(--line);border-radius:9px;
  padding:8px 14px;cursor:pointer;font-size:13.5px;color:var(--ink);background:#fff}
.radiogroup .r input{margin:0}
form.inline{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
form.inline input[type=text],form.inline input:not([type]),form.inline select{width:auto;min-width:84px;
  padding:5px 9px;font-size:12.5px;border-radius:7px}
form.inline .lv{min-width:76px;max-width:104px}
form.inline .ut{min-width:78px;max-width:96px}

/* ============ 表格 ============ */
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
.tbl th,.tbl td{padding:7px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}
.tbl th{background:#f8fafc;color:#4b5563;font-weight:600;white-space:nowrap}
.tbl tbody tr:hover{background:#fcfdff}
/* r1117 表格里的空态行居中（`.tbl td` 的 text-align:left 特异性高于 .empty，不写这条会靠左） */
.tbl td.empty{text-align:center;color:var(--sub);padding:26px 10px;font-size:13.5px}
.tbl td.act{white-space:nowrap}
.tbl td.act form{display:inline}
.tbl td.act .btn.small{margin-right:6px}
.tbl td.uid{font-variant-numeric:tabular-nums;color:var(--sub)}
.tbl td.evauth{white-space:nowrap;color:#374151}/* r880 录入人列 */
.tbl td.who{font-size:12px}
.tbl .moves{font-variant-numeric:tabular-nums;letter-spacing:.4px}
.tbl .pc{vertical-align:middle;white-space:nowrap}/* r46 回到普通单元格（display:flex 会让 td 脱离行高、内容靠上）*/
.tbl .pc>*{vertical-align:middle}
.tbl .pc>*+*{margin-left:8px}
.thumb{display:inline-block;border:1px solid var(--line);border-radius:6px;background:#fbfcfe;padding:1px}
.thumb img{width:46px;height:46px;object-fit:contain;display:block;border-radius:5px}
.pid{font-size:11.5px;color:var(--sub)}
.list{margin:0 0 12px;padding-left:20px;font-size:13px}

/* ============ 标签 ============ */
.tag{display:inline-block;font-size:11.5px;padding:2px 8px;border-radius:999px;background:#f1f3f7;color:var(--sub)}
.tag.cat{background:#fff7e6;color:var(--warn)}
.tag.kind{background:#eef2ff;color:#4338ca}
.tag.lvl{background:#ecfdf5;color:var(--ok)}
.tag.color.b{background:#1f2937;color:#fff}
.tag.color.w{background:#fff;color:#1f2937;border:1px solid #d1d5db}
.tag.color.x{background:#f1f3f7;color:var(--sub)}
.tags{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.st{display:inline-block;font-size:11.5px;padding:2px 9px;border-radius:999px}
.st-todo{background:#f1f3f7;color:var(--sub)}
.st-pending{background:#fff7e6;color:var(--warn)}
.st-correct{background:#ecfdf5;color:var(--ok)}
.st-revise{background:#eef2ff;color:#4338ca}
.st-wrong{background:#fef2f2;color:var(--danger)}

/* ============ 标签页 / 筛选 ============ */
.nav-tabs{display:inline-flex;align-items:center;gap:4px;background:#eef0f3;border-radius:12px;padding:5px}
.nav-tab{display:inline-flex;align-items:center;gap:6px;padding:7px 20px;border:none;background:transparent;
  font-size:13.5px;font-weight:500;color:#6b7280;border-radius:9px;transition:all .18s ease;
  white-space:nowrap;text-decoration:none}
.nav-tab:hover{color:var(--brand)}
.nav-tab.active{background:#fff;color:var(--brand);font-weight:600;box-shadow:0 1px 4px rgba(16,24,40,.10)}
.catbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 16px}
.chip{font:inherit;font-size:12.5px;border:1px solid var(--line);background:#fff;border-radius:999px;
  padding:5px 13px;cursor:pointer;color:var(--sub)}
.chip:hover{border-color:#c9ced6}
.chip.on{background:var(--ink);border-color:var(--ink);color:#fff}

/* ============ 折叠面板 ============ */
.upbox{display:none}
.upbox.open{display:block}
.upbox .upload{margin:0 0 16px}
tr.upbox{display:none}
tr.upbox.open{display:table-row}
tr.upbox>td{background:#fbfcfe;padding:14px 18px}
.assignform{max-width:900px}
.assignhd{display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--sub);margin-bottom:10px}
.assignhd b{font-size:14px;color:var(--ink);font-variant-numeric:tabular-nums}
.chkgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:8px;margin-bottom:14px}
.chk{display:flex;align-items:center;gap:8px;border:1px solid var(--line);border-radius:9px;
  padding:8px 12px;cursor:pointer;background:#fff;font-size:13px;color:var(--ink)}
.chk:has(input:checked){border-color:var(--brand);background:var(--brand-soft)}
.chk input{margin:0}
.chk i{font-style:normal;font-size:11.5px;color:var(--sub);margin-left:auto}

/* ============ 题目卡 / 定式卡 ============ */
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(186px,1fr));gap:14px}
.pcard{display:block;border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden;
  transition:.15s;color:inherit}
.pcard:hover{border-color:#c9ced6;box-shadow:0 4px 14px rgba(16,24,40,.08)}
.pimg{height:150px;display:flex;align-items:center;justify-content:center;background:#fbfcfe;padding:8px}
.pimg img{max-width:100%;max-height:100%;object-fit:contain}
.pmeta{padding:10px 12px;display:flex;flex-direction:column;gap:6px}
.rgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
/* r1117 空态在网格里要横跨整行居中，否则只占第一列、看着靠左 */
.rgrid>.empty{grid-column:1/-1;padding:44px 0}
.pickgrid>.empty{grid-column:1/-1;padding:36px 0}
.rcell{display:flex;flex-direction:column;gap:8px}
.rcell .btn{align-self:flex-start}
.rcard{display:block;border:1px solid var(--line);border-radius:12px;background:#fff;padding:14px 16px;
  transition:.15s;color:inherit}
.rcard:hover{border-color:#c9ced6;box-shadow:0 4px 14px rgba(16,24,40,.08)}
.rtop{display:flex;gap:6px;margin-bottom:8px}
.rtitle{font-weight:600;font-size:14px;margin-bottom:6px;word-break:break-all}
.cardbd{display:flex;justify-content:center;margin:2px 0 10px}/* r45 学生端定式卡片里的棋盘容器 */
.cardbd .minibd{width:170px}

/* ============ 答题 / 批改 ============ */
.solve{display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,420px);gap:18px;margin-bottom:18px;
  align-items:start}
.solveimg{background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px;
  display:flex;align-items:center;justify-content:center}
.solveimg img{max-width:100%;border-radius:8px}
.solvepanel{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px}
.solvepanel .tags{margin-bottom:8px}
.solvepanel .sub{margin-bottom:14px}
.bigsteps{display:flex;gap:10px;margin:10px 0 16px}
.bigsteps span{flex:1;text-align:center;font-size:17px;font-weight:650;font-variant-numeric:tabular-nums;
  background:var(--brand-soft);color:var(--brand);border-radius:10px;padding:12px 6px}
.answer .steps{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:12px}
.answer .steps label{display:flex;flex-direction:column;gap:6px}
.answer .steps input{text-align:center;font-size:16px;font-variant-numeric:tabular-nums}
.answer .btn.primary{width:100%}
.answer .boardbar .btn.primary{width:auto}/* r53 悔一手 / 全部重来 / 确认 同一行 */
.reviewform{display:flex;flex-direction:column;gap:12px}
.reviewform textarea{min-height:56px}
.reviewform .btnrow{margin:0}
.hintline{font-size:12.5px;color:var(--sub);margin:0 0 10px}
.revisebox{background:#eef2ff;border:1px solid #c7d2fe;color:#3730a3;border-radius:9px;
  padding:10px 13px;font-size:13px;margin-bottom:14px}
@media(max-width:860px){.solve{grid-template-columns:1fr}}

/* ============ 棋盘 ============ */
.boardwrap{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;
  display:flex;flex-direction:column;align-items:center;gap:12px}
.boardwrap canvas{max-width:100%;height:auto;border-radius:6px}
.boardctl{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:center}
.docview{width:100%;height:74vh;border:1px solid var(--line);border-radius:12px;background:#fff}

/* ============ 提示 ============ */
.err{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c;border-radius:9px;
  padding:10px 13px;font-size:13px;margin:0 0 14px;white-space:pre-wrap;overflow:auto}
.okmsg{background:#ecfdf5;border:1px solid #a7f3d0;color:#047857;border-radius:9px;
  padding:10px 13px;font-size:13px;margin:0 0 14px}

/* ============ 登录页（无侧栏） ============ */
.auth-body{background:var(--bg);display:flex;flex-direction:column;min-height:100vh}
.auth-wrap{flex:1;width:100%;max-width:390px;margin:0 auto;padding:24px 18px;
  display:flex;flex-direction:column;justify-content:center}
.auth{background:#fff;border:1px solid var(--line);border-radius:14px;padding:30px 28px;
  box-shadow:0 1px 2px rgba(16,24,40,.04),0 10px 28px -14px rgba(16,24,40,.14)}
.auth h2{margin:0 0 22px;font-size:20px;text-align:center;font-weight:700}
/* r1112 注册页标题常规字重（不加粗） */
.auth h2.auth-title{font-weight:400}
.auth-logo{margin:0 auto 22px;display:flex;align-items:center;justify-content:center}
.auth-logo img{width:118px;height:118px;display:block;object-fit:contain}
.auth-logo img.lock{width:158px;height:auto;object-fit:contain}
.form{display:flex;flex-direction:column;gap:14px}
.form label{display:flex;flex-direction:column;gap:6px}
.form .btn.primary{width:100%;justify-content:center;padding:10px}
.form .birthpair{display:flex;gap:8px}
.form .birthpair select{flex:1;min-width:0}
/* r1107 注册：学生 / 老师 两块等宽单选 */
.rdgrp{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.rdgrp .rd{display:flex;align-items:center;justify-content:center;padding:11px 0;
  border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer;
  font-size:14px;color:var(--ink);transition:border-color .15s,background .15s,color .15s}
.rdgrp .rd input{position:absolute;opacity:0;width:0;height:0}
.rdgrp .rd:hover{border-color:#c7d2fe}
.rdgrp .rd:has(input:checked){border-color:var(--brand);background:var(--brand-soft);
  color:var(--brand);font-weight:600}
.rdgrp .rd:focus-within{outline:2px solid var(--brand);outline-offset:2px}
.auth-tip{margin:0;text-align:center;font-size:12.5px;color:var(--sub)}
.auth-alt{margin:14px 0 0;padding-top:14px;border-top:1px solid var(--line);
  text-align:center;font-size:13px;color:var(--sub)}
/* r1113 注册页：头部（logo + 标题）+ 紧凑身份卡 */
.auth-head{margin:0 0 22px;text-align:center}
.auth-head .auth-logo{margin:0 auto 26px}
.auth-head .auth-logo img.lock{width:132px}
.auth-head .auth-title{margin:0;font-size:15px;font-weight:400;color:#5b6472;
  letter-spacing:.14em;text-indent:.14em}
.auth-head.sm{margin:0 0 20px}
.auth-head.sm .auth-logo{margin:0 auto 18px}
.auth-head.sm .auth-logo img.lock{width:92px}
.idpick{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.idpick .idcard{display:flex;align-items:center;justify-content:center;gap:7px;height:52px;
  padding:0;border:1px solid var(--line);border-radius:10px;background:#fff;cursor:pointer;
  font:500 15px/1 -apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  color:var(--ink);transition:border-color .15s,background .15s,color .15s,box-shadow .15s,transform .15s}
.idpick .idcard svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.6;
  stroke-linecap:round;stroke-linejoin:round;opacity:.75}
.idpick .idcard:hover{border-color:#c7d2fe;background:#f8faff;color:var(--brand);
  transform:translateY(-1px);box-shadow:0 4px 12px rgba(16,24,40,.07)}
.idpick .idcard:active{transform:translateY(0);box-shadow:none}
.idpick .idcard:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
/* r17：这里原来有一条裸 .small（登录页遗留、全站没人单独用），
   但 .btn.small 也吃到了它 —— 小按钮被顶下去 16px、字还变灰。已删。 */

/* ============ 编号 chip ============ */
.code{display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12px;font-weight:600;letter-spacing:.3px;background:#eef2ff;color:#4338ca;
  border-radius:6px;padding:2px 7px;white-space:nowrap}

/* ============ 统计（小号值：时间类） ============ */
.stat .v.sm{font-size:14px;font-weight:600;color:#374151;font-variant-numeric:tabular-nums}
.stat .v .vs{font-size:14px;font-weight:600;color:var(--sub);margin-left:3px}

/* ============ 状态徽标（作业 / 题目项） ============ */
.st-done{background:#eff4ff;color:var(--brand)}
.st-assigned{background:#f1f3f7;color:var(--sub)}
.st-submitted{background:#fff7e6;color:var(--warn)}
.st-reviewed{background:#ecfdf5;color:var(--ok)}

/* ============ 分配题目（老师页） ============ */
.pickset{border:1px solid var(--line);border-radius:10px;padding:14px;background:#fbfcfe;margin-bottom:16px}
.pickset .chkgrid{margin-bottom:0}
.picktbl td.ck,.picktbl th.ck{width:36px;text-align:center}
.picktbl td.ck input{margin:0}
.picktbl tbody tr:hover{background:#f7faff}
.picktbl .thumb img{width:40px;height:40px}
/* 分配页：题目表与「确认分配」之间留出空隙，别顶到最后一行的分隔线 */
.picktbl + .btnrow{margin-top:14px}

/* ============ 逐题批改 ============ */
.rvblock{border:1px solid var(--line);border-radius:12px;padding:14px;margin-bottom:14px;background:#fff}
.rvblock .solve{margin-bottom:0}
.rvblock .idx{background:#f1f3f7;color:var(--sub);border-radius:999px;font-size:11.5px;padding:2px 8px}
.rvrow{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:4px}
.rvrow .r{display:flex;align-items:center;gap:7px;border:1px solid var(--line);border-radius:9px;
  padding:7px 14px;cursor:pointer;background:#fff;font-size:13.5px;color:var(--ink)}
.rvrow .r input{margin:0}
.rvrow .r:has(input:checked){border-color:var(--brand);background:var(--brand-soft);color:var(--brand);font-weight:600}
.rvrow .hintin{width:auto;min-width:170px;flex:1;max-width:240px;padding:6px 10px;font-size:12.5px}

/* ============ 棋盘（题库 / 作答 / 批改 / 摆子） ============ */
/* overflow:visible —— 局部盘（角）时线一直画到画布边，压在边线上的子要能露出来 */
.gb-svg{display:block;width:100%;height:auto;border-radius:8px;touch-action:manipulation;
  overflow:visible}
.minibd{position:relative;display:inline-block;width:34px;line-height:0}/* 与来源缩略图 .thumb img 同宽；改动须同步 app.py 的 MINIBD_PX */
.minibd .minihint{display:block;font-size:10.5px;line-height:1.45;text-align:center;
  color:var(--sub);background:transparent;padding:0}
a.minilink{display:inline-block;border-radius:8px;transition:box-shadow .15s}
a.minilink:hover{box-shadow:0 0 0 3px var(--brand-soft)}

.solveboard{flex:0 0 460px;max-width:100%}
.solveboard #board,.editbd #board{position:relative;width:100%}
.boardbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px}
.boardbar .turninfo{display:inline-flex;align-items:baseline;gap:14px}
.boardbar .turn{font-size:13px;color:var(--ink);font-weight:600;line-height:1.3}
.boardbar .sp{flex:1}
.paints{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pgroup{display:inline-flex;align-items:center;gap:7px}
.pgroup + .pgroup{margin-left:6px}
.paints #eraseBtn{margin-left:12px}
/* r1699：修改题目页三个落子按钮都只是说明、不可点（擦除靠同色再点一次） */
.paints .pg-erase{margin-left:12px}
.pbtn.tag{cursor:default;color:var(--ink)}
.pbtn.tag:hover{border-color:var(--line);color:var(--ink);background:#fff}
.paintip{font-size:12.5px;color:var(--sub);line-height:1.3;white-space:nowrap}
.pbtn{font:inherit;font-size:12.5px;display:flex;align-items:center;gap:6px;cursor:pointer;
  border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:9px;padding:6px 11px}
.pbtn.on{border-color:var(--brand);background:var(--brand-soft);color:var(--brand);font-weight:600}
.pbtn .dot{width:13px;height:13px;border-radius:50%;display:inline-block;border:1px solid #9a9a94}
.pbtn .dot.b{background:#1e1e1e;border-color:#000}
.pbtn .dot.w{background:#fbfbf8}
.pbtn .dot.e{background:
  linear-gradient(45deg,transparent 44%,var(--danger) 44%,var(--danger) 56%,transparent 56%),#fff;
  border-color:#e0b4b4}
.cnt{font-size:13px;color:var(--sub);line-height:1.3}
.gb-flash{position:absolute;left:50%;top:10px;transform:translateX(-50%);background:rgba(31,41,55,.9);
  color:#fff;font-size:12.5px;padding:6px 14px;border-radius:999px;opacity:0;pointer-events:none;
  transition:opacity .2s;white-space:nowrap}
.gb-flash.on{opacity:1}

/* r19：摆子页 / 录入答案页已改用题目页那套 .probwrap + .sec.pinfo，
   原来的 .editwrap / .editpanel / .frow 无人使用，删掉。 */
.picbox .thumb img{width:104px;height:104px}
.solbox{display:inline-block;width:200px;line-height:0;padding:1px;border:1px solid var(--line);border-radius:6px;background:#fbfcfe}
.solbox .gb-svg{border-radius:5px}
.thumb.sm img{width:34px;height:34px}
.tbl .thumb{vertical-align:middle}/* r46 缩略图在表格里跟文字同中线（原来按 baseline 靠上约 3px） */
.thumb.lg img{width:104px;height:104px}

.kv{display:flex;gap:10px;font-size:13px;margin:4px 0;align-items:baseline}
.kv>span{flex:0 0 52px;color:var(--sub);font-size:12.5px}
.kv>b{font-weight:600;word-break:break-all}

.tbl td.del{text-align:center;width:64px}
/* r23：题库批量改 —— 最左边一列勾选框（表头那个是全选） */
.tbl th.pick,.tbl td.pick{width:38px;text-align:center;padding-right:0}
.tbl .pchk{width:15px;height:15px;margin:0;vertical-align:middle;cursor:pointer;
  accent-color:var(--brand)}
/* 表格里的操作按钮一律纯文字：不打框、不带色 */
.linkbtn{font:inherit;background:none;border:none;padding:0;color:var(--ink);cursor:pointer}
.linkbtn:hover{color:var(--brand);text-decoration:underline}
.xbtn{font:inherit;font-size:17px;line-height:1;cursor:pointer;border:none;background:none;
  color:var(--sub);padding:0}
.xbtn:hover{color:var(--danger)}
tr:has(>td.del) .xbtn{vertical-align:middle}
/* r20：题库列表的「答案 / 讲解」列 —— 一位老师一个纯文字链接，多了自动折行 */
.tbl .wlist{display:inline-flex;gap:12px;flex-wrap:wrap;align-items:baseline}
.tbl .wlnk{font-weight:400;font-size:13px;white-space:nowrap}

@media (max-width:980px){
  .solveboard{flex:1 1 auto;width:100%}
}

/* ============ 题目页（只读棋盘 + 右侧信息框） ============ */
/* 题号：纯文本，不打框、不上色 */
.ptcode{font-size:18px;font-weight:400;color:#111827;letter-spacing:.5px;
  font-variant-numeric:tabular-nums;line-height:1.15}
/* r1178：棋盘列封顶 520（千三屏给 560），剩下的宽度全给右侧信息框 ——
   上一版把棋盘列写成 1fr，1440 的屏上棋盘被拉到 700+，右边挤成一团。 */
.probwrap{display:grid;grid-template-columns:minmax(320px,min(580px,calc(100vh - 250px))) minmax(300px,1fr);gap:18px;
  align-items:start}
/* 宽屏（≥1600）棋盘再给一档；右侧信息框始终吃满剩下的宽度 */
/* r1182：棋盘加大 —— 按屏宽三档放开上限（原 520/600 偏小） */
@media(min-width:1360px){.probwrap{grid-template-columns:minmax(320px,min(660px,calc(100vh - 240px))) minmax(320px,1fr)}}
@media(min-width:1700px){.probwrap{grid-template-columns:minmax(320px,min(760px,calc(100vh - 240px))) minmax(320px,1fr)}}
/* r1215：定式「修改」页 —— 棋盘下面的工具栏（撤销一手 / 全部清空 + 一行说明） */
.jedbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
.jedbar .muted{font-size:12px;line-height:1.45;color:var(--sub)}

.probbd{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px}
.probbd #board{position:relative;width:100%}
.probbd .expc{display:block;width:100%;height:auto;border-radius:8px;cursor:crosshair}
.sec.pinfo{margin:0;overflow:hidden}
/* 第一行：先手 / 题型 / 难度 三格 */
/* r1229：属性行按项数自动分栏（原来是死写 3 列 —— 去掉「步数」后剩 4 项，
   第 4 项换行，`.mc+.mc` 的左边框就变成「难度前面莫名一条竖线」） */
/* r1275：属性行不再吃基类 .pmeta 的 10px 12px 内边距 —— 那 12px 让「先手」比「答案/讲解」
   往右缩了 12px，一眼看着没对齐 */
/* r1275：格子最小 150px —— 120px 时会排成 3 列，4 个属性变成 3+1，最后一项孤零零一行 */
.pinfo .pmeta{display:grid;padding:0;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  border-bottom:1px solid var(--line)}
/* r1275：属性格子改成「标签在左、值在右」，跟「答案 / 讲解」同一套 —— 标签 32px 定宽，
   所有行的标签左边界、内容左边界都对在同一条竖线上 */
.pinfo .mc{display:flex;flex-direction:row;align-items:baseline;gap:10px;
  padding:12px 16px;min-width:0}
/* r1275：标签列给到 40px 且不折行 —— 32px 装不下「知识点」三个字，会断成两行 */
.pinfo .mc .pk{flex:0 0 40px;white-space:nowrap}
.pinfo .mc .mv{flex:1 1 auto;min-width:0}
/* r1229：属性格子之间不再画竖线 —— 换了项数（去掉「步数」）就会在换行的格子上
   留下一截孤立的线，看着像「难度前面有条线」 */
.pinfo .mc+.mc{border-left:0}
.pinfo .mv{font-size:15px;font-weight:650;color:#111827;line-height:1.35}
/* 答案 / 讲解 / 步骤：左标签 + 右内容 */
.pinfo .pblock{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:13px 16px;border-bottom:1px solid var(--line)}
.pinfo .pblock .pk{flex:0 0 40px;white-space:nowrap}
/* r1275：长内容（提示、答案列表、步骤）占满标签后剩余宽度、在标签右边换行，
   而不是整段掉到下一行顶到最左边 —— 掉行会跟上面的「先手」错开一格 */
.pinfo .pblock>.mv,.pinfo .pblock>.alist,.pinfo .pblock>.stepsline{
  flex:1 1 auto;min-width:0}
.pinfo .prow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:13px 16px;border-bottom:1px solid var(--line)}
.pinfo .prow:last-child{border-bottom:0}
.pinfo .prow .pk{flex:0 0 40px;white-space:nowrap}
.pinfo .pk{color:var(--sub);font-size:12.5px}
.pinfo .pv{font-weight:600;margin-right:12px}
.pinfo .pbtns{gap:10px}
.pinfo .alist{display:flex;gap:16px;flex-wrap:wrap;align-items:baseline}
/* r1635：信息框所有「值」统一 15px —— 原来属性值 15px、答案与关联编号 13.5px、
   「暂无」和「-」12.5px，四档大小混在一列里。标签仍 12.5px，层级靠字重与颜色区分。 */
.pinfo .alnk{font-weight:650;font-size:15px}
.pinfo .mc .muted,.pinfo .pblock .muted,.pinfo .alist .muted{font-size:15px;font-weight:500}
/* 难度是一枚标签（.tag 基类 11.5px），紧挨 15px 的属性值会显得发虚，这里放到 12.5px
   r1639：一题多个档位（1段 / 2段 / 3段）各一枚胶囊，只保证不折行 */
.pinfo .mv .tag{font-size:12.5px;font-weight:600;padding:2px 9px;white-space:nowrap;flex:0 0 auto}
.pinfo .mc .mv:has(> .tag.lvl){display:flex;flex-wrap:nowrap;gap:0;align-items:baseline}
.pinfo .alnk.on{color:#111827;text-decoration:underline}
/* r18：每条讲解后面的「删除」（本人或管理员可见），纯文字不带框 */
.pinfo .alist .aitem{display:inline-flex;align-items:center;gap:7px}
.pinfo .alist .delx{display:inline-flex;margin:0}
.pinfo .xdel{font-size:12.5px;color:var(--sub)}
.pinfo .xdel:hover{color:var(--danger)}
.pinfo .stepsline{font-size:12.5px;font-variant-numeric:tabular-nums;word-break:break-all}
/* 讲解播放（点「…讲解」就地展开，不跳页） */
.pinfo .explay{padding:14px 16px;border-bottom:1px solid var(--line);background:#fbfcfe}
.pinfo .explay video{width:100%;display:block;border-radius:10px;background:#000}
/* 录讲解：一行状态 + 一行按钮 */
.pinfo .exprow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:13px 16px;border-bottom:1px solid var(--line)}
.pinfo .expst{font-size:13px;font-weight:600;font-variant-numeric:tabular-nums}
.pinfo .expst.rec{color:var(--danger)}
.pinfo .expbtns{display:flex;gap:10px;flex-wrap:wrap;padding:14px 16px;
  border-bottom:1px solid var(--line);background:#fbfcfe}
/* 第三行：三个按钮 */
.pinfo .pacts{display:flex;gap:10px;flex-wrap:wrap;padding:14px 16px;background:#fbfcfe}
/* r20：右侧框的按钮等宽 —— 三个按钮各占 1/3、两个各占 1/2，左右都对齐 */
.pinfo .pacts .btn{flex:1 1 0;justify-content:center}
.pinfo > form.answer{padding:14px 18px}/* r54 作答区留内边距，字不再顶边框 */
.pinfo > .revisebox{margin:14px 18px}
.pinfo .hint{margin:10px 0 0;line-height:1.65}
.pinfo>:last-child{border-bottom:0}
/* r1177：宽屏时棋盘占满剩余宽度（原来写死 520px，1000~1120px 这一段最挤） */
@media(max-width:1120px){
  .probwrap{grid-template-columns:minmax(0,1fr) minmax(290px,330px)}
  .pinfo .prow1{flex-wrap:wrap}
  .pinfo .prow1 .pf{flex:1 1 46%}
}
/* r1177：窄屏保棋盘 —— 信息卡整块移到棋盘下方，棋盘不再被压扁 */
@media(max-width:960px){
  .probwrap{grid-template-columns:1fr}
  .probbd #board{max-width:520px;margin:0 auto}
  .pinfo .prow1 .pf{flex:1 1 46%}
}
@media(max-width:640px){
  .pinfo .pmeta{grid-template-columns:repeat(2,1fr)}
  .pinfo .pactrow{grid-template-columns:1fr}
  .pinfo .prow1 .pf{flex:1 1 100%}
  .pinfo .pacts .btn{flex:1 1 46%}
}
/* 表格窄屏横向滚动，不挤成一团 */
.sec-bd{overflow-x:auto}
/* r1177：信息卡里的纯文字按钮改 block —— inline-flex 里的文字是匿名 flex 项，
   min-width 仍是 max-content，压不下去；block 才真的能折行 */
.pinfo .pbox-btns .btn,.pinfo .pacts .btn{display:block;width:100%;box-sizing:border-box}

/* ============ r33：一行筛选器 · 可搜索的下拉式多选 ============ */
.filters{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.filters .fpush{margin-left:auto}
.flabel{font-size:12.5px;color:var(--sub);white-space:nowrap}
.flabel b{font-size:14px;color:var(--ink);font-variant-numeric:tabular-nums}
.msel{position:relative;display:inline-block}
.msel-btn{display:inline-flex;align-items:center;gap:9px;min-width:200px;max-width:340px;
  border:1px solid var(--line);background:#fff;border-radius:9px;padding:7px 11px;
  font:inherit;font-size:13px;color:var(--sub);cursor:pointer;text-align:left}
.msel-btn:hover{border-color:#c9ced6}
.msel.open .msel-btn{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.msel-txt{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.msel-txt.on{color:var(--ink);font-weight:600}
.msel-arrow{width:0;height:0;flex:0 0 auto;border-left:4.5px solid transparent;
  border-right:4.5px solid transparent;border-top:5px solid #9aa1ac;transition:transform .18s ease}
.msel.open .msel-arrow{transform:rotate(180deg)}
.msel-pop{display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:60;width:304px;
  max-width:calc(100vw - 32px);
  background:#fff;border:1px solid var(--line);border-radius:12px;padding:8px;
  box-shadow:0 10px 30px rgba(16,24,40,.14)}
.msel.open .msel-pop{display:block}
.msel-sch input{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:8px;
  padding:7px 10px;font:inherit;font-size:13px;color:var(--ink);background:#fff}
.msel-sch input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.msel-list{max-height:232px;overflow:auto;margin:8px 0 4px}
.msel-opt{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:8px;
  font-size:13px;color:var(--ink);cursor:pointer}
.msel-opt:hover{background:#f5f7fa}
.msel-opt:has(input:checked){background:var(--brand-soft);color:var(--brand)}
/* r1219：勾选框被全局 input 样式（padding 8+11、border-radius 9、白底边框）带成了
   「一个空输入框」，难度下拉看着像多了个奇怪的方框。这里还原成 15px 小方框，与 .pchk 一致。 */
.msel-opt input[type=checkbox]{width:15px;height:15px;padding:0;margin:0;border-radius:4px;
  border:1px solid #c7ccd6;background:#fff;flex:0 0 auto;cursor:pointer;accent-color:var(--brand)}
.msel-opt input[type=checkbox]:checked{background:var(--brand);border-color:var(--brand)}
.msel-opt input[type=checkbox]:focus{box-shadow:none}
/* r1227：心算答题 —— 棋盘上的规则遮罩 + 右侧倒计时面板 */
.xnmask{position:absolute;inset:0;background:rgba(255,255,255,.97);border-radius:12px;
  display:flex;align-items:center;justify-content:center;z-index:20;padding:18px}
.xnhd{font-size:13px;font-weight:650;margin:0 0 6px}
.xnrl{margin:0 0 12px;padding-left:19px;font-size:12.5px;line-height:1.75;color:var(--ink)}
.xnrl li{margin:0 0 3px}
.xnrl b,.xnbox b{font-weight:650}
.xnbox{margin:0 0 10px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;
  background:#fbfcfe}
.xnl{font-size:13px;line-height:20px}
.xnl b{font-variant-numeric:tabular-nums;font-size:15px;color:var(--brand)}
/* r1832：心算框里三行字跟「重新开始」
   用固定 20px 行高给一套均匀的节奏，按钮再多留 12px */
.xnbox #xnretry{margin:12px 0 0}
/* r1226：带文字的勾选框（心算题这类开关），勾选框同样别被全局 input 样式撑成输入框 */
.chkv{display:inline-flex;align-items:center;gap:7px;font-size:13px;line-height:1.4;
  color:var(--ink);cursor:pointer;white-space:nowrap}
.chkv input[type=checkbox]{width:15px;height:15px;padding:0;margin:0;border-radius:4px;
  flex:0 0 auto;accent-color:var(--brand);cursor:pointer}
.chkv input[type=checkbox]:focus{box-shadow:none}
.msel-opt input{margin:0}
.msel-opt i{font-style:normal;font-size:11.5px;color:var(--sub);margin-left:auto}
.msel-opt span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.msel-opt b.mlv{flex:none;font-size:11px;font-weight:400;color:#0f6e56;background:#e3f5f0;
  border-radius:999px;padding:1px 7px;line-height:1.55}
.msel-opt i.mbt{flex:none;font-style:normal;font-size:11px;color:#9ca3af;margin-left:0;
  min-width:52px;text-align:right;font-variant-numeric:tabular-nums}
.msel-none{display:none;padding:12px 8px;font-size:12.5px;color:var(--sub);text-align:center}
.msel-foot{display:flex;align-items:center;gap:10px;border-top:1px solid var(--line);padding-top:7px}
.msel-tip{flex:1;font-size:12px;color:var(--sub);font-variant-numeric:tabular-nums}
.msel-lnk{font:inherit;font-size:12.5px;color:var(--brand);background:none;border:none;
  padding:0;cursor:pointer}
.msel-lnk:hover{text-decoration:underline}

/* ============ r34：一行表单 · 下拉式单选（可搜索） ============ */
.oneline{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.oneline .flabel{font-size:12.5px;color:var(--sub);white-space:nowrap}
.psel{position:relative;display:inline-block}
.psel-btn{display:inline-flex;align-items:center;gap:9px;min-width:152px;max-width:260px;
  border:1px solid var(--line);background:#fff;border-radius:9px;padding:7px 11px;
  font:inherit;font-size:13px;color:var(--sub);cursor:pointer;text-align:left}
.psel-btn:hover{border-color:#c9ced6}
.psel-btn:disabled{opacity:.62;cursor:not-allowed;background:#f6f7f9}   /* r865 录答案时先手已定，锁住 */
.psel.open .psel-btn{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.psel.open .msel-arrow{transform:rotate(180deg)}
.psel-txt{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.psel-txt.on{color:var(--ink);font-weight:600}
.psel-pop{display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:60;width:226px;
  max-width:calc(100vw - 32px);
  background:#fff;border:1px solid var(--line);border-radius:12px;padding:8px;
  box-shadow:0 10px 30px rgba(16,24,40,.14)}
.psel.open .psel-pop{display:block}
.psel-list{max-height:224px;overflow:auto;margin:8px 0 0}
.psel-opt{padding:7px 9px;border-radius:8px;font-size:13px;color:var(--ink);cursor:pointer}
.psel-opt:hover{background:#f5f7fa}
.psel-opt.on{background:var(--brand-soft);color:var(--brand);font-weight:600}
.psel-none{display:none;padding:12px 8px;font-size:12.5px;color:var(--sub);text-align:center}
.filebtn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);background:#fff;
  border-radius:9px;padding:7px 13px;font-size:13px;color:var(--ink);cursor:pointer}
.filebtn:hover{border-color:#c9ced6}
.filename{font-size:12.5px;color:var(--sub);max-width:210px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.filename.on{color:var(--ink)}

/* ============ r35：定式页对齐题库页（一行上传 · 批量改难度/类型） ============ */
.oneline input.ttl{width:190px;flex:0 0 190px;font-size:13px;padding:7px 11px}

/* ============ r36：统计卡可点 · 学生表数值可点开 ============ */
.stat .sti{display:block;text-decoration:none;color:inherit;border-radius:10px;
  padding:5px 10px;margin:-5px -10px;transition:background .16s ease}
.stat .sti:hover{background:#f3f6fb}
.stat .sti:hover .v{color:var(--brand)}
a.nlink{color:var(--brand);text-decoration:none;
  border-bottom:1px dashed rgba(37,99,235,.45)}
a.nlink:hover{border-bottom-style:solid}

/* r67 分配页：按学生 / 按班级 两种选择方式 */
.pickwrap{margin-bottom:6px}
.picktabs{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap}
.picktab{border:1px solid var(--line);background:#fff;border-radius:8px;padding:5px 13px;
  font:inherit;font-size:12.5px;color:var(--sub);cursor:pointer;line-height:1.4}
.picktab:hover{border-color:var(--brand);color:var(--brand)}
.picktab.on{background:var(--brand-soft);border-color:var(--brand);color:var(--brand);font-weight:650}
.pickwrap [data-pane][hidden]{display:none}
.pickwrap .pickset{border:0;padding:0;margin:0}
/* r719 分配栏：按学生/按班级 + 选择器 + 确认分配，收在一行，条宽随内容 */
.assignbar{display:flex;width:100%!important;max-width:100%;
  align-items:flex-start;gap:10px 10px;row-gap:8px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:12px;background:#fbfcfe;
  padding:13px 14px 14px;margin:0 0 16px}
.assignbar .pickseg{display:inline-flex;align-items:center;flex:none;gap:2px;
  background:#eceff4;border-radius:9px;padding:3px}
.assignbar .picktab{border:0;background:none;border-radius:7px;padding:6px 14px;
  font-size:13px;line-height:1.25;color:#4b5563}
.assignbar .picktab:hover{color:var(--brand);background:rgba(255,255,255,.65)}
.assignbar .picktab.on{background:#fff;color:var(--brand);font-weight:650;
  box-shadow:0 1px 2px rgba(16,24,40,.12)}
/* r1274：KataGo 推荐 —— 候选按钮常驻，选中的高亮；「用这一手 / 取消预览」单独一组 */
.englist{display:inline-flex;align-items:center;flex-wrap:wrap;gap:6px}
/* r1287：候选点排行首，右侧操作组竖线隔开；中间用 .sp 撑开（basis 0 免得被挤到下一行） */
#engBox{align-items:center}
#engBox>.englist{display:flex;flex:1 1 auto;min-width:0;gap:6px}
#engBox .englist .sp{flex:1 1 0;min-width:0}
.engcands{display:inline-flex;gap:5px;margin-left:0}
.engacts{display:inline-flex;align-items:center;gap:6px;margin-left:auto;
  padding-left:9px;border-left:1px solid var(--line)}
.engacts .muted{font-size:11.5px}
.engc.on{background:var(--brand);border-color:var(--brand);color:#fff}
/* r1285：候选后面的目损（首选 / 差 2.1） */
.engc .eloss{margin-left:5px;font-size:11px;font-weight:400;color:var(--sub)}
.engc.on .eloss{color:rgba(255,255,255,.85)}
/* r1233：操作按钮不折行（「KataGo 推荐」「保存答案」这种多字按钮会被挤成两行） */
.pacts{flex-wrap:wrap}
.pacts .btn{white-space:nowrap}
/* r1252：分配栏「已选 N 名学生 · M 个班级」 */
.assignbar .pickcnt{flex:none;font-size:12.5px;line-height:1.5;color:var(--ink);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.assignbar .pickcnt.none{color:var(--sub)}
/* r1232：分配栏 —— 上「发给谁」班级(单选) / 学生(多选) / 棋力；下「发哪些题」难度 / 题型 / 知识点 */
.assignbar .evfield{display:inline-flex;align-items:center;gap:6px;flex:none;white-space:nowrap}
.assignbar .assignflt{display:inline-flex;align-items:center;gap:8px 12px;flex-wrap:wrap;
  flex:1 1 auto;min-width:0;padding:0;border:0;background:none;margin:0}
.assignbar .assignflt input[type=search]{width:130px}
/* r1224：学生 / 班级两个选择器并排后可同时选；说明放在条外面一行 ——
   放进 .assignbar 里会让 fit-content 的宽算崩、两个选择器被挤成小方块 */
.pickhint{margin:-6px 0 16px;font-size:12px;line-height:1.55;color:#1d4ed8}  /* r1261：说明文字用蓝色，跟灰色正文区分 */
.assignbar .pickbox{flex:none}
.assignbar .pickset{border:0;background:none;padding:0;margin:0}
.assignbar .filters{flex-wrap:nowrap;gap:10px}
.assignbar .flabel{flex:none;white-space:nowrap;font-size:13px;font-weight:400;color:#6b7280}
.assignbar .flabel b{color:#111827;font-weight:650}
.assignbar .msel{display:inline-block;flex:none}
.assignbar .msel-btn{min-width:200px;max-width:320px}
.assignbar .fpush{flex:none}

/* r1634：分配页拆两行 —— 上「发给谁」（班级 / 学生 / 棋力），下「发哪些题」（难度 / 题型 / 知识点）。
   两行的筛选器各管自己那一块，术语因此分开：筛人的叫棋力、筛题的叫难度。 */
.assignbar .rowlb{flex:none;align-self:center;font-size:13px;font-weight:650;
  color:var(--brand);white-space:nowrap;padding-right:2px}
.assignbar.whorow{margin-bottom:14px}
.assignbar .whoflt{display:inline-flex;align-items:center;gap:8px 10px;flex-wrap:wrap;
  flex:1 1 auto;min-width:0;padding:0;border:0;background:none;margin:0}
.assignbar .whoflt .pbtn{white-space:nowrap}
/* r1634b：两行的下拉统一宽度，别一行 200 一行 268；标签列定宽让两行内容起点对齐 */
.assignbar .rowlb{min-width:64px}
.assignbar.whorow .msel-btn,
.assignbar.whatrow .msel-btn{width:210px;min-width:0;max-width:none}
.assignbar.whatrow select{width:210px;min-width:0}
.assignbar.whatrow .evfield{flex:0 0 auto}
.assignbar.whatrow input[type=search]{width:160px;flex:none}
/* r1634c：定式页只有一个「题型」，.pfilter .evfield:only-child 会撑满整行 -> 显式收回 */
.assignbar.whatrow .pfilter{flex:1 1 auto;min-width:0;display:flex;align-items:center;
  gap:12px;flex-wrap:wrap}
.assignbar.whatrow .pfilter .evfield,
.assignbar.whatrow .pfilter .evfield:only-child{flex:0 0 auto}
.assignbar.whatrow .pfilter select.evf{width:210px;min-width:0;max-width:none;flex:none}

/* r67 班级页：直接放在表单里的多选下拉要够宽 */
.sec-bd form > .msel{min-width:320px;max-width:460px}
.sec-bd form > .msel .msel-btn{width:100%}

/* r73 新建班级：与「账号」页同款（rowform + tagform，字段不套外框） */
/* r1629：加了「棋力」共六个字段，改三列两行 */
.clsform .tagform{grid-template-columns:repeat(3,minmax(0,1fr))}
.clsform .tagform > label{min-width:0}
/* 五个控件统一高度 / 圆角 / 内距，看起来是一套 */
.clsform .tagform select,
.clsform .tagform input[type=time],
.clsform .tagform .msel-btn{height:34px;padding:0 11px;border:1px solid var(--line);
  border-radius:9px;font-size:13.5px;background:#fff;color:var(--ink);line-height:32px}
.clsform .tagform select:focus,
.clsform .tagform input[type=time]:focus,
.clsform .tagform .msel-btn:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.clsform .timepair{display:flex;align-items:center;gap:4px;min-width:0}
.clsform .timepair i{color:var(--sub);font-style:normal;line-height:1}
.clsform .timepair input[type=time]{width:auto;min-width:0;flex:1;padding:0 4px;
  font-variant-numeric:tabular-nums}
/* 学生选择：沿用分配作业页原样，只撑满格子 */
.clsform .msel{width:100%;min-width:0}
.clsform .msel .msel-btn{width:100%;max-width:none;display:flex;align-items:center;gap:8px}
@media(max-width:1080px){
  .clsform{flex-wrap:wrap}
  .clsform .tagform{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* r71 表格「操作」列：修改 / 删除 横排 */
td.ops{white-space:nowrap;text-align:left}
td.ops .inline{display:inline-block;margin:0 0 0 8px}
td.ops .btn.small{padding:4px 11px;line-height:1.4}
.table td.ops{width:1%}

/* r80 含下拉弹层的卡片：不要裁掉弹层 */
.sec.sec-open{overflow:visible}
.sec.sec-open .msel-pop{z-index:80}

/* r83 出生年月：年 + 月 两个下拉并排 */
.birthpair{display:flex;align-items:center;gap:6px}
.birthpair select{width:auto;min-width:0;flex:1}
/* r870 账号页：出生年月行内改（年/月 + 存） */
.birthcell{display:flex;align-items:center;gap:4px}
.birthcell .birthpair{flex:0 0 auto}
.birthcell select{width:auto;min-width:0;flex:0 0 auto;padding:2px 4px;font-size:13px}
.birthtd{white-space:nowrap}

/* r85 登录页页脚 */
.auth-foot{border-top:1px solid var(--line);background:#fff;padding:14px 20px;
  text-align:center;font-size:12.5px;color:var(--sub);flex:0 0 auto}
.auth-foot p{margin:0}

/* r934：页脚备案号（备案要求展示备案号并链工信部） */
.sq-foot .ft-bei{margin-left:10px}
.sq-foot .ft-bei a{color:#9ca3af;text-decoration:none}
.sq-foot .ft-bei a:hover{color:var(--brand)}
.auth-foot a{color:inherit;text-decoration:none}
.auth-foot a:hover{color:var(--brand)}

/* r89 班级修改页的删除按钮 */
.clsdel{margin-top:10px}

/* r709：定式列表 → 详情页的入口（编号 / 缩略棋盘都成链接，黑白不抢眼） */
.tbl .clink,.tbl .blink{color:inherit;font-weight:600;text-decoration:none}
.tbl .clink:hover,.tbl .blink:hover{text-decoration:underline;text-underline-offset:3px}
.tbl .blink{display:inline-block;line-height:0}

/* ============ 上传弹框 ============ */
.mask{position:fixed;inset:0;z-index:80;display:none;align-items:center;justify-content:center;
  padding:24px;background:rgba(17,24,39,.45)}
.mask.open{display:flex;overflow:auto}
.dlg{width:100%;max-width:430px;background:#fff;border-radius:14px;padding:22px 22px 18px;
  box-shadow:0 20px 55px rgba(15,23,42,.25)}
.dlg h3{margin:0 0 16px;font-size:16px;font-weight:650}
.dlg .lbl{margin:0 0 8px;font-size:13px;color:var(--sub)}
.dlg .lbl b{color:var(--danger);font-weight:600}
.drop{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  min-height:102px;padding:14px;border:1px dashed #cbd2dc;border-radius:11px;background:#fafbfd;
  text-align:center;cursor:pointer;transition:border-color .15s,background .15s}
.drop:hover{border-color:#a9b4c4}
.drop.over{border-color:var(--brand);background:#f1f5ff}
.drop .dn{font-size:13px;color:var(--ink);word-break:break-all}
.drop .dz{font-size:12px;color:var(--sub)}
.dlg .hint{margin:9px 0 0;font-size:12px;color:var(--sub)}
.dlg .acts{display:flex;justify-content:flex-end;gap:10px;margin:18px 0 0}
/* r873 赛事地点：页内嵌百度地图 */
.mapdlg{position:relative;max-width:780px}
.mapbox{width:100%;height:420px;border-radius:10px;overflow:hidden;background:#eef1f4}
.mapft{display:flex;align-items:center;gap:10px;margin:10px 0 0;font-size:12.5px}
@media (max-width:640px){.mapbox{height:300px}}

/* ============ r720：档位多选（一排可点的标签；题目用难度，学生用棋力） ============ */
.lvpick{display:flex;flex-wrap:wrap;gap:6px}
.lvchk{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:999px;
  padding:3px 11px;font-size:12.5px;line-height:1.5;color:var(--sub);cursor:pointer;background:#fff}
.lvchk input{display:none}
.lvchk:hover{border-color:#c9ced6;color:var(--ink)}
.lvchk:has(input:checked){background:var(--brand-soft);border-color:var(--brand);
  color:var(--brand);font-weight:650}
.pinfo .pblock .lvpick{padding-top:2px}
/* 批改结论 */
.vmsg{font-weight:650}
.vmsg.ok{color:var(--ok)}
.vmsg.bad{color:var(--danger)}
.vmsg.wait{color:var(--warn)}
/* 待办清单 */
.tl{display:flex;flex-direction:column}
.tl-item{display:flex;align-items:center;gap:12px;padding:15px 0;border-bottom:1px solid var(--line)}
.tl-item:last-child{border-bottom:0}
.tl-dot{width:3px;height:24px;border-radius:2px;flex:none;background:#e2e8f0}
.tl-item.todo .tl-dot{background:#2563eb}
.tl-item.fix .tl-dot{background:#dc2626}
.tl-item.wait .tl-dot{background:#d97706}
.tl-item.rec .tl-dot{background:#059669}
.tl-body{flex:1;min-width:0}
.tl-t{font-weight:650;font-size:13.5px;line-height:1.45}
.tl-d{font-size:12.5px;color:var(--sub);margin-top:2px;line-height:1.5}
.tl-n{flex:none;font-size:13px;font-weight:600;color:#111827;background:#f3f4f6;
  border-radius:999px;padding:3px 11px;white-space:nowrap;font-variant-numeric:tabular-nums}
.tl-n .u{font-weight:400;font-size:11.5px;color:var(--sub);margin-left:2px}
.tl-a{flex:none;width:90px;text-align:right}

/* r720：中性提示条（做题页「这一题对了 / 第 N 手不对」） */
.msgb{background:#f8fafc;border:1px solid var(--line);color:#374151;border-radius:9px;
  padding:9px 13px;font-size:13px;margin:0 0 14px}

/* r722 学生「我的定式」卡片：按钮收进卡内底部，卡片与按钮不再分离 */
.rcell{gap:0}
.rcell .btn{align-self:auto}
.rcard{display:flex;flex-direction:column;padding:14px 16px 0}
.rcbody{display:block;color:inherit}
.rcfoot{display:flex;gap:8px;margin:12px -16px 0;padding:10px 16px;border-top:1px solid var(--line)}
.rcfoot .btn{flex:1;justify-content:center;align-self:stretch}
.btn.dis{opacity:.55;cursor:not-allowed;pointer-events:none}

/* r737 赛事表（段级位赛 / 全国赛事） */
.evtbl td.d{white-space:nowrap;font-variant-numeric:tabular-nums;overflow:hidden;color:#374151}
.evtbl td.d.soon{color:var(--danger);font-weight:600}
.evtbl .evn{font-weight:400;line-height:1.5;color:#111827}
.evtbl .evn .tag{margin-left:6px;font-weight:500;vertical-align:1px}
.evtbl .sub{color:var(--sub);font-size:12px;margin-top:3px;line-height:1.5}
.evtbl td.evh{font-size:12.5px;color:#374151}
.evtbl td.evp{font-size:12.5px;color:#374151}
.evtbl td.evg{font-size:12.5px;max-width:250px;line-height:1.7;color:#374151}
.evtbl td.evg .g{display:inline-block;white-space:nowrap;margin-right:9px}
.evtbl td.d .dcell{display:block;max-width:100%;overflow:hidden}
.evtbl td.d .dline{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.evtbl td.evg .gcell{display:-webkit-box;max-width:100%;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  white-space:normal;overflow:hidden;text-overflow:ellipsis}
.evtbl td.evg .gm{color:var(--sub);font-weight:600}
.evtbl td.d .sub{color:var(--sub);font-size:11.5px;margin-top:1px}
.evtbl td.evx{width:1%;white-space:nowrap}
.tag.lv{background:#e3f5f0;color:#0f6e56;font-weight:400}

/* r843 赛事筛选器（段级位赛：组别 / 地点 / 主办方） */
/* r911：赛事 / 日历筛选条统一成分配作业页那套：淡底外框 + label 文字在控件外 + 白底控件 */
.evfilter{display:flex;align-items:center;gap:10px 12px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:12px;background:#fbfcfe;
  padding:9px 12px;margin:0 0 14px}
.evfilter .evfield{display:inline-flex;align-items:center;gap:8px;flex:none}
.evfilter .flabel{font-size:13px;color:#6b7280;white-space:nowrap}
.evfilter .fpush{margin-left:auto}
.evfilter .msel-btn{min-width:132px;max-width:240px;height:32px;padding:0 11px}
.evfilter .msel-txt{font-size:13px}
.evfilter .btn{height:32px;padding:0 13px;font-size:12.5px;
  display:inline-flex;align-items:center}
/* r1738 线上列表：联合筛选器（胜负 / 结束方式 / 差距 / 手数 / 时长 成组） */
/* r1769 学生统计：胜负条 / 评语 / 考级表 */
.say{margin:12px 0 0;color:var(--sub);font-size:13px;line-height:1.7}
/* r1844：考级表撑满外框，添加动作并入表格最后一行 */
/* r1844：考级摘要文字太长，窄屏要能换行（.sec-hd.flex>* 默认 nowrap） */
.sec-hd.flex .certsum{white-space:normal;line-height:1.6}
.certtbl{table-layout:fixed;width:100%}
.certtbl th,.certtbl td{padding:9px 12px}
.certtbl tr.certadd td{background:#fafbfc;border-bottom:0}
.certtbl tr.certadd .evf{width:100%;max-width:100%;box-sizing:border-box}
.certtbl tr.certadd .dpk{display:block}
.certtbl tr.certadd .dpk .evf-d{width:100%;max-width:none}
.certtbl tr.certadd .btn{width:100%}
table.tbl th.right,table.tbl td.right{text-align:right}
/* r1772：统计页的小表按内容宽度排，别把五列摊满整行 */
table.tbl.auto{width:auto;min-width:440px}
table.tbl.auto th,table.tbl.auto td{padding-left:20px;padding-right:20px}
table.tbl.auto th:first-child,table.tbl.auto td:first-child{padding-left:6px}
.evfilter .evcnt{margin-right:12px;white-space:nowrap}
.evfilter .evgrp{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  flex:0 1 auto;min-width:0;order:9;padding:0;border-left:0;margin:2px 0 0;
  justify-content:flex-start}
/* r1752：「对局条件」组里的每个筛选框按项均分撑满，不再固定宽度留大空隙 */
.evfilter .evgrp>.evp{flex:1 1 0;min-width:0}
.evfilter .evgrp>.evp>.fl{flex:none}
.evfilter .evgrp>.evp>select.evf,
.evfilter .evgrp>.evp>input.evf{width:100%;max-width:none;min-width:0}
.evfilter .evgrp>.evpu>input.evf-n{padding-right:34px}
/* r1743：重置单独成项，落第二行右端，与「对局条件」同占满整行 */
.evfilter .evend{order:10;flex:none;margin-left:auto}

/* r1744 日期选择器：自绘月历，替换浏览器原生 date 控件 */
.dpk{position:relative;display:inline-flex;align-items:center}
.dpk .evf-d{width:132px;cursor:pointer;background:#fff;text-align:left;
  color:var(--ink);font-variant-numeric:tabular-nums}
.dpk .evf-d:placeholder-shown{color:#9ca3af}
.evfilter{position:relative;z-index:20}
.dpkpop{display:none;position:fixed;z-index:2000;width:252px;
  box-sizing:border-box;background:#fff;border:1px solid #e5e7eb;border-radius:12px;
  box-shadow:0 14px 32px rgba(17,24,39,.14);padding:10px 10px 9px}
.dpkpop.on{display:block}
.dpkpop .dphd{display:flex;align-items:center;justify-content:space-between;padding:0 2px 8px}
.dpkpop .dpym{font-size:13px;font-weight:600;color:var(--ink)}
.dpkpop .dpnav{width:26px;height:26px;padding:0;border:1px solid #e5e7eb;background:#fff;
  border-radius:7px;color:#4b5563;font-size:14px;line-height:1;cursor:pointer}
.dpkpop .dpnav:hover{background:#f3f4f6}
.dpkpop .dpwk{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:3px}
.dpkpop .dpwk i{font-style:normal;font-size:11px;color:#9ca3af;text-align:center;line-height:1.6}
.dpkpop .dpgr{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dpkpop .dpem{height:30px}
.dpkpop .dpd{height:30px;padding:0;border:0;background:none;border-radius:8px;
  font-size:12.5px;color:var(--ink);cursor:pointer;font-variant-numeric:tabular-nums}
.dpkpop .dpd:hover{background:#eef2ff}
.dpkpop .dpd.today{box-shadow:inset 0 0 0 1px #bfdbfe;color:#1d4ed8}
.dpkpop .dpd.on{background:#2563eb;color:#fff;box-shadow:none}
.dpkpop .dpft{display:flex;gap:8px;margin-top:9px;padding-top:9px;border-top:1px solid #f1f4f9}
.dpkpop .dpq{flex:1;height:28px;padding:0;border:1px solid #e5e7eb;background:#fff;
  border-radius:8px;font-size:12.5px;color:#4b5563;cursor:pointer}
.dpkpop .dpq:hover{background:#f3f4f6}
/* r1742：窄屏把日期快捷与日期框收窄，保证「学生 / 学生棋力 / 日期 / 共N局·重置」同处一行 */
@media (max-width:1400px){
  .evfilter .days{gap:5px}
  .evfilter .days .btn{padding:0 7px;font-size:12px}
  .evfilter .evf-d{width:116px}
  .evfilter .evfield{gap:5px}
  .evfilter select[name="u"],.evfilter select[name="lv"]{width:146px}
}
.evfilter .evp{display:inline-flex;align-items:center;gap:6px;flex:none;white-space:nowrap}
/* r1739：学生、棋力两个下拉同宽 */
.evfilter select[name="u"],.evfilter select[name="lv"]{width:152px;min-width:0;max-width:none;
  overflow:hidden;text-overflow:ellipsis}
.evfilter .evgt{font-size:12.5px;color:var(--sub);position:relative;
  padding-right:11px;margin-right:3px}
.evfilter .evgt::after{content:"";display:block;position:absolute;right:0;top:50%;
  width:1px;height:13px;margin-top:-7px;background:#e2e7ef}
.evfilter input.evf-n{width:64px;min-width:0;padding:0 8px;text-align:right;
  font-variant-numeric:tabular-nums;-moz-appearance:textfield}
.evfilter input.evf-n::-webkit-outer-spin-button,
.evfilter input.evf-n::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.evfilter .evu{font-size:12px;color:var(--sub)}
/* r1746：「分钟」并进输入框内部，末个框的右边界就能和上一行对齐 */
.evfilter .evp.evpu{position:relative}
.evfilter .evpu input.evf-n{width:88px;padding-right:26px;text-align:left;padding-left:9px}
.evfilter .evpu .evu{position:absolute;right:9px;top:50%;margin-top:-8px;line-height:16px;
  font-size:11.5px;color:var(--sub);pointer-events:none}
.evfilter .fl{font-size:12.5px;color:var(--sub)}
.evfilter .fl+.fl,.evfilter select+.fl{margin-left:6px}
.evf{height:32px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:12.5px;color:#374151;padding:0 8px;max-width:148px}
.evf.evf-w{max-width:262px}
.evf:focus{outline:none;border-color:#93b4f5;box-shadow:0 0 0 3px rgba(37,99,235,.10)}
.evfilter .btn{margin-left:6px;flex:none}

/* r850 题库「来源」列：图片缩略图 + 录入老师；手工摆的题写「手动录入 | 王兴」 */
.srcline{display:inline-flex;align-items:center;gap:7px}
.srcline .who{font-size:12px;color:var(--sub);white-space:nowrap}
.srcline .srcm{white-space:nowrap}
.srcline .srcbar{font-size:12px;color:#cbd5e1}

/* ---- r851 赛事：状态 / 费用 / 报名按钮 / 组别多选 / 日历 ---- */
.evtbl td.evname{min-width:0}
.evtbl td.evfee{white-space:nowrap;font-size:12.5px;color:#374151;max-width:180px}
.evtbl th,.evtbl td{padding-left:10px;padding-right:10px}
.evtbl td.dl{font-size:12.5px;color:#374151}
.evtbl .dline{font-variant-numeric:tabular-nums}
.evst{display:inline-block;font-size:11.5px;line-height:1.65;padding:1px 9px;border-radius:999px;white-space:nowrap}
.evst.run{background:#ecfdf5;color:#047857}
.evst.over{background:#fff7ed;color:#0f6e56}
.evst.done{background:#f1f3f7;color:#6b7280}
.evrem{display:inline-flex;align-items:center;gap:4px;margin-left:7px;font-size:11.5px;
  font-weight:600;line-height:1;padding:4px 9px 4px 8px;border-radius:6px;vertical-align:-1px;
  background:#eef4ff;color:#1d4ed8;border:1px solid #c7d9fb}
.evrem svg{flex:none;margin-top:-.5px}
.evtip{font-size:12px;color:#2563eb;background:#eff4ff;border-radius:999px;padding:2px 10px;margin-left:8px}
.signbtn{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 13px;border-radius:999px;
  background:linear-gradient(180deg,#3b82f6,#2563eb);color:#fff;font-size:12.5px;font-weight:600;
  box-shadow:0 1px 2px rgba(37,99,235,.35);transition:transform .12s,box-shadow .12s,filter .12s}
.signbtn:hover{transform:translateY(-1px);box-shadow:0 4px 10px rgba(37,99,235,.32);filter:brightness(1.03)}
.signbtn svg{opacity:.92}
.signoff{font-size:12px;color:#9ca3af}
/* r881：截止按钮（灰态、不可点） */
.signbtn.off,.signbtn.off:hover{background:#eef1f5;color:#9aa3af;font-weight:600;
  box-shadow:none;transform:none;filter:none;cursor:not-allowed;pointer-events:none}
.evchk{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 11px;border:1px solid var(--line);border-radius:8px;background:#fff;font-size:12.5px;color:var(--sub);cursor:pointer;user-select:none}
.evchk:hover{border-color:#c9ced6}
.evchk:has(input:checked){border-color:var(--brand);background:var(--brand-soft);color:var(--brand)}
.evscroll{overflow-x:auto;margin:0 -4px;padding:0 4px}
.msel{position:relative}
.msbtn{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 12px;border:1px solid var(--line);
  border-radius:8px;background:#fff;font:inherit;font-size:12.5px;color:var(--ink);cursor:pointer}
.msbtn:hover{border-color:#c9ced6}
.msbtn.on{border-color:var(--brand);color:var(--brand);background:var(--brand-soft)}
.mslb{color:var(--sub)}
.msbtn.on .mslb{color:inherit}
.msval{font-variant-numeric:tabular-nums}
.mcar{width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;
  border-top:5px solid #9aa3af}
.mspanel{position:absolute;z-index:30;top:36px;left:0;width:268px;max-height:320px;display:none;
  background:#fff;border:1px solid var(--line);border-radius:10px;padding:8px;
  box-shadow:0 12px 30px rgba(15,23,42,.14)}
.msel.open .mspanel{display:block}
.mshd{display:flex;gap:14px;padding:2px 4px 8px;border-bottom:1px solid var(--line);margin-bottom:6px}
.mshd a{font-size:12px}
.mslist{max-height:240px;overflow:auto;display:flex;flex-wrap:wrap}
.msopt{display:flex;align-items:center;width:50%;font-size:12.5px;padding:3px 4px;border-radius:6px;cursor:pointer}
.msopt:hover{background:#f6f7f9}
.msopt input{margin-right:6px}

/* 日历 */
/* r910：整行做成一条通栏工具带（不再分三个小色块），按钮收小 */
.cal-hd{display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:12px;background:#fbfcfe;
  padding:8px 12px;margin:0 0 14px}
.cal-ym{font-size:14.5px}
.calnav{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.calnav .cal-ym{padding:0 6px}
.calnav .btn{padding:3px 10px;font-size:12.5px;border-radius:7px}
.calsep{width:1px;height:14px;background:#e4e8ee;margin:0 3px}
/* 窄屏导航条换行时，竖分隔线会孤零零挂在行尾，直接隐藏 */
@media(max-width:640px){.calsep{display:none}}
.cal-legend{display:flex;align-items:center;gap:14px;font-size:12px;color:var(--sub);flex-wrap:wrap}
.cal-legend .lg{display:inline-flex;align-items:center;gap:5px}
.cal-legend i{width:8px;height:8px;border-radius:50%;display:inline-block;background:#9ca3af}
.cal-legend i.run{background:#10b981}
.cal-legend i.over{background:#f59e0b}
.cal-legend i.done{background:#9ca3af}
.cal-legend i.chip{width:14px;height:8px;border-radius:2px;background:#dbeafe}
.cal-legend i.band{width:14px;height:4px;border-radius:2px;background:#c7d2fe}
.cal{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#fff}
.cal-wds{display:flex;background:#f8fafc;border-bottom:1px solid var(--line)}
.cal-wd{flex:1 1 0;min-width:0;text-align:center;font-size:12px;color:var(--sub);padding:7px 0}
.cal-grid{display:flex;flex-direction:column}
.cal-row{display:flex}
.cal-cell{flex:1 1 0;min-height:104px;min-width:0;overflow:hidden;border-right:1px solid #f1f2f4;border-bottom:1px solid #f1f2f4;padding:6px 7px 8px}
.cal-cell:nth-child(7n){border-right:none}
.cal-cell.out{background:#fcfcfd}
.cal-cell.out .cal-dn{color:#c7ccd4}
.cal-cell.today{background:#f7fbff}
.cal-cell.today .cal-dn{background:var(--brand);color:#fff;border-radius:5px;
  display:inline-block;padding:1px 5px;font-size:11.5px;max-width:100%;
  overflow:hidden;text-overflow:ellipsis}
.cal-dn{font-size:12px;color:var(--sub);margin-bottom:4px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
@media(max-width:1180px){.cal-dn{font-size:11px;letter-spacing:-.2px}}
@media(max-width:900px){.cal-dn{font-size:10px;letter-spacing:-.3px}
  .cal-cell.today .cal-dn{font-size:10px;padding:1px 2px;letter-spacing:-.3px}}
@media(max-width:640px){.cal{overflow-x:auto}.cal-wds,.cal-grid{min-width:490px}}
.evchip{display:flex;align-items:center;gap:5px;width:100%;padding:2px 6px;margin-bottom:3px;border-radius:6px;
  background:#eff6ff;color:#1d4ed8;font-size:11.5px;line-height:1.5;overflow:hidden}
.evchip i{width:5px;height:5px;border-radius:50%;flex:0 0 5px;background:#2563eb}
.evchip span{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.evchip.over{background:#fff8ec;color:#0f6e56}
.evchip.over i{background:#f59e0b}
.evchip.done{background:#f4f5f7;color:#6b7280}
.evchip.done i{background:#9ca3af}
.evband{display:block;height:5px;width:100%;overflow:hidden;margin:-1px 0 3px;border-radius:3px;background:#dbeafe}
.evband span{display:none}
.evband.over{background:#fde9c8}
.evband.done{background:#e5e7eb}
.cal-more{font-size:11px;color:var(--sub)}
/* r868 日历：每场赛事按赛期铺成条，不再区分开赛日 */
.cal-hd .calrt{display:flex;align-items:center;gap:10px 20px;flex-wrap:wrap;justify-content:flex-end;margin-left:auto}
.cal-hd .evfield{display:inline-flex;align-items:center;gap:8px;flex:none}
.cal-hd .flabel{font-size:13px;color:#6b7280;white-space:nowrap}
/* r914：日历筛选的分段控件要独立生效（原来只写在 .assignbar 下，日历里退化成裸按钮、边框黏一起） */
.cal-hd .pickseg{display:inline-flex;align-items:center;flex:none;gap:2px;
  background:#eceff4;border-radius:9px;padding:3px}
.cal-hd .picktab{border:0;background:none;border-radius:7px;padding:6px 14px;
  font-size:12.5px;line-height:1.25;color:#4b5563}
.cal-hd .picktab:hover{color:var(--brand);background:rgba(255,255,255,.65)}
.cal-hd .picktab.on{background:#fff;color:var(--brand);font-weight:650;
  box-shadow:0 1px 2px rgba(16,24,40,.12)}
.cal-hd .cal-legend{gap:12px}
.calwrap{margin:0 0 18px}
.calwrap:last-child{margin-bottom:0}
.calwrap[hidden]{display:none}
.cal-sub{display:flex;align-items:center;gap:9px;margin:0 0 8px;font-size:13.5px;color:var(--ink)}
.cal-sub b{font-weight:650}
.cal-sub .muted{font-size:12px}
.evbar{display:block;height:17px;line-height:17px;padding:0 6px;margin:0 0 3px;
  border-radius:4px;font-size:11.5px;color:#1d4ed8;background:#e6efff;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-decoration:none}
.evbar:hover{filter:brightness(.97)}
.evbar.run{background:#dcfce7;color:#15803d}
.evbar.over{background:#fdeed3;color:#a16207}
.evbar.done{background:#eceef1;color:#6b7280}

/* 赛事弹窗（详情 + 提醒学生） */
.evdlg{max-width:620px;max-height:none;overflow:visible;position:relative}
.dlgx{position:absolute;right:12px;top:10px;border:none;background:transparent;font-size:20px;
  line-height:1;color:#9ca3af;cursor:pointer;padding:2px 6px}
.dlgx:hover{color:#374151}
.evdlg h3{margin:0 30px 12px 0;font-size:15.5px;line-height:1.5;font-weight:600}
.ed-meta{display:grid;grid-template-columns:1fr 1fr;gap:6px 18px;margin:0 0 12px}
.ed-m{display:flex;gap:8px;font-size:12.5px;line-height:1.7}
.ed-m .k{color:var(--sub);flex:0 0 62px}
.ed-m .v{color:var(--ink);word-break:break-all}
.ed-m:nth-child(5){grid-column:1 / -1}
.ed-signrow{margin:2px 0 14px}
.ed-sec{border-top:1px solid var(--line);padding-top:10px;margin-top:6px}
.ed-hd{font-size:12.5px;color:var(--sub);margin:0 0 8px}
.ed-list{display:flex;flex-direction:column;gap:2px;max-height:132px;overflow:auto;margin-bottom:6px}
.ed-ritem{display:flex;align-items:center;gap:10px;font-size:12.5px;padding:3px 2px}
.ed-rn{color:var(--ink)}
.ed-rt{color:#9ca3af;font-size:11.5px}
.ed-ritem form{margin-left:auto}
.xdel{border:none;background:transparent;color:#b6bcc6;font-size:15px;line-height:1;cursor:pointer;padding:0 4px}
.xdel:hover{color:var(--danger)}
.ed-empty{margin:0;font-size:12px;color:#9ca3af}
.ed-row{display:flex;align-items:center;gap:8px;margin:0 0 10px}
.ed-row .fl{font-size:12.5px;color:var(--sub);flex:0 0 auto}
.ed-row select{max-width:220px}
.stpick{display:flex;flex-wrap:wrap;gap:6px;max-height:164px;overflow:auto;padding:2px 0 4px}
.stitem{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:999px;
  padding:3px 11px;font-size:12.5px;cursor:pointer;background:#fff;color:#374151}
.stitem:hover{border-color:#c9ced6}
.stitem i{font-style:normal;font-size:11px;color:#9ca3af}
.stitem:has(input:checked){background:var(--brand-soft);border-color:var(--brand);color:var(--brand)}
.ed-foot{display:flex;align-items:center;gap:10px;margin:12px 0 0}
/* r868 提醒表单收成一行 */
.ed-onerow{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) auto;
  align-items:center;gap:8px;margin:12px 0 0}
.ed-onerow .ed-fld{display:flex;align-items:center;gap:8px;min-width:0}
.ed-onerow .ed-fld #ed-cls{flex:1 1 0;width:0;max-width:none;min-width:0}
.ed-onerow .ed-students{flex:1 1 0;min-width:0}
.ed-onerow .msel{width:100%}
.ed-onerow .msel-btn{width:100%;max-width:none;min-width:0}
.ed-onerow .btn{flex:0 0 auto;white-space:nowrap}
.evdlg .msel-pop{width:100%;min-width:280px}
.evtbl{table-layout:fixed;min-width:1128px}
.evtbl td.evh,.evtbl td.evp{word-break:break-word}
/* 地点最多两行，超出省略（点开弹窗看全址） */
.evtbl td.evp .mapq{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}

.mapq{color:inherit;text-decoration:none;border-bottom:1px dashed var(--line,#d6dce5);cursor:pointer}
.mapq:hover{color:#2563eb;border-bottom-color:#93c5fd}
.mapq i{display:inline-block;margin-left:5px;padding:0 5px;font-style:normal;font-size:11px;
  line-height:16px;color:#2563eb;background:#eef4ff;border:1px solid #d5e3fb;border-radius:5px;
  vertical-align:1px;white-space:nowrap}
.mapq:hover i{background:#dbeafe}

/* ============ r-pwa：功能宫格 / 底部导航 / 离线页 ============ */
.apps-wrap{max-width:1080px}
.apps-grp{margin:0 0 24px}
.apps-hd{font-size:12px;letter-spacing:.12em;color:var(--sub);font-weight:600;margin:0 0 10px 2px}
.apps{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:12px}
.app{position:relative;display:flex;align-items:center;gap:12px;background:var(--card);
  border:1px solid var(--line);border-radius:12px;padding:14px 16px;color:var(--ink);
  transition:border-color .12s ease,box-shadow .12s ease}
.app:hover{border-color:#c9ced6;box-shadow:0 2px 8px rgba(17,24,39,.07)}
.app-ic{flex:0 0 36px;width:36px;height:36px;border-radius:10px;background:var(--brand-soft);
  color:var(--brand);display:flex;align-items:center;justify-content:center}
.app-ic svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
.app-t{font-size:14.5px;font-weight:500}
.app-n{position:absolute;top:8px;right:9px;min-width:18px;height:18px;padding:0 5px;
  border-radius:9px;background:var(--danger);color:#fff;font-size:11px;font-weight:600;
  line-height:18px;text-align:center}
.offline-t{text-align:center;color:var(--sub);margin:0 0 18px}
.sq-nav-item.home{color:#eef2f7;font-weight:600;background:rgba(255,255,255,.05);margin-bottom:3px}
.sq-nav-item.home:hover{background:rgba(255,255,255,.1)}
.sq-nav-item.home.active{background:var(--brand);color:#fff}

/* 底部导航：桌面不显示，≤900px 顶替侧栏 */
.tabbar{display:none}

@media(max-width:900px){
  .sq-side{display:none}
  .sq-main{min-height:100dvh}
  .sq-content{padding:14px 14px 86px}
  .tabbar{position:fixed;left:0;right:0;bottom:0;z-index:80;display:flex;background:#fff;
    border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom);
    box-shadow:0 -1px 4px rgba(17,24,39,.06)}
  .tabbar a{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;
    padding:7px 0 5px;font-size:11px;color:var(--sub);line-height:1.2}
  .tabbar a.on{color:var(--brand);font-weight:600}
  .tabbar svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;
    stroke-linecap:round;stroke-linejoin:round}
  .apps{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .app{padding:13px 14px}
  .sec-bd{overflow-x:auto}
  .sq-foot{display:none}
}

@media(max-width:560px){
  .sq-topbar{height:auto;padding:10px 14px;flex-wrap:wrap;gap:8px}
  .sq-topbar h1{font-size:16px}
  .apps-grp{margin-bottom:18px}
}
@media(max-width:400px){
  .app-ic{flex:0 0 32px;width:32px;height:32px}
  .app-t{font-size:13.8px}
}

/* ============ r-pwa 2：宫格列数对齐 + 移动端页头工具栏换行 ============ */
.apps{grid-template-columns:repeat(4,minmax(0,1fr))}
.app:active{background:#f8fafc}
@media(max-width:1100px){.apps{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:900px){
  .apps{grid-template-columns:repeat(2,minmax(0,1fr))}
  .sec-hd.flex{flex-wrap:wrap;row-gap:8px;padding:12px 14px 12px 20px}
  .sec-hd.flex>*{white-space:nowrap}
  .sec-hd.flex .sp{display:none}
}

/* ============ r-pwa 3：移动端表格收紧 ============ */
@media(max-width:900px){
  .tbl{font-size:12.5px}
  .tbl th,.tbl td{padding:6px 8px}
}

.offline-btn{display:block;width:100%}

/* ============ r991：矮屏侧栏紧凑（1366×768 等 768 高屏不滚动） ============ */
@media (max-height:820px){
  .sq-side-hd{padding:20px 12px 20px}
  .sq-lock{width:62px}
  .sq-nav{padding:5px 9px 8px}
  .sq-nav-grp{margin:6px 0 2px}
  .sq-nav-item{height:30px}
  .sq-nav-item.child{height:25px}
  .sq-side-ft{padding:7px 14px}
}
/* r1018：更矮（720 屏全屏、1366×768 去掉浏览器边框后）再收一档 */
@media (max-height:700px){
  .sq-side-hd{padding:15px 12px 18px}
  .sq-lock{width:52px}
  .sq-nav{padding:3px 9px 5px}
  .sq-nav-grp{margin:3px 0 1px;font-size:9.5px}
  .sq-nav-item{height:26px;font-size:12.5px;gap:9px}
  .sq-nav-item.child{height:22px}
  .sq-nav-item svg{width:14px;height:14px;flex:0 0 14px}
  .sq-side-ft{padding:5px 14px}
}

/* ============ r996 账号页：平时只读，点「修改」原地变可编辑控件 ============ */
tr.urow .uro{display:inline}
tr.urow .urw{display:none}
tr.urow.editing{background:#f7fbff}
tr.urow.editing .uro{display:none}
tr.urow.editing .urw{display:inline-flex;align-items:center;gap:6px}
tr.urow.editing td{padding:7px 10px}
tr.urow .urw input,tr.urow .urw select{height:28px;padding:0 6px;font-size:12.5px;border-radius:6px}
tr.urow .urw input[name=username]{width:96px}
tr.urow .urw input[name=name]{width:74px}
tr.urow .urw input[name=fox_nick]{width:86px}
tr.urow .urw input[name=password]{width:86px}
tr.urow .urw select{width:auto;min-width:60px}
tr.urow .urw .birthpair{gap:4px}
tr.urow .urw .birthpair select{min-width:56px;flex:0 0 auto}
tr.urow .urw .btn.small{padding:3px 8px}
tr.urow .urw .btn.small+.btn.small{margin-left:6px}
tr.urow td.ops .uro{display:inline-flex;align-items:center;gap:8px}
tr.urow td.ops .uro form{display:inline}
tr.urow td.ops .uro .btn{white-space:nowrap}
/* r996b 编辑态：操作列只留「保存 / 取消」（上面那条 inline-flex 特异性更高，必须显式压住） */
tr.urow.editing td.ops span.uro{display:none}

/* ===== r997 班级行内编辑（点「修改」原地改这条记录） ===== */
tr.crow .uro{display:inline}
tr.crow .urw{display:none}
tr.crow.editing{background:#f7fbff}
tr.crow.editing .uro{display:none}
tr.crow.editing .urw{display:inline-flex;align-items:center;gap:6px}
tr.crow.editing td{padding-top:5px;padding-bottom:5px}
tr.crow .urw input,tr.crow .urw select{height:28px;padding:0 6px;font-size:12.5px;border-radius:6px}
tr.crow .urw select{width:auto;min-width:76px}
tr.crow .urw input[type=time]{width:86px}
tr.crow .urw .timepair{display:inline-flex;align-items:center;gap:4px}
tr.crow td.ops .uro{display:inline-flex;align-items:center;gap:8px}
tr.crow td.ops .uro form{display:inline}
tr.crow.editing td.ops span.uro{display:none}
tr.crow .urw .btn.small{padding:3px 10px;margin-left:0}
tr.crow .urw .btn.small+.btn.small{margin-left:6px}
tr.crow .urw .msel{min-width:0}
tr.crow .urw .msel-btn{min-width:100px;width:100px;height:28px;padding:0 7px;
  font-size:12.5px;border-radius:6px;gap:5px}
tr.crow .urw .msel-pop{width:286px}

/* r998b 班级表在窄屏可横向滚动（否则「操作」列被裁掉） */
@media(max-width:900px){
  .tblwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -2px;padding:0 2px}
  .tblwrap .clstbl{min-width:660px}
  .tblwrap .certtbl{min-width:650px}
}
/* r998b 新建班级面板：确认 / 取消 与字段同一底边 */
.clsform .btnrow{margin:0;gap:8px;align-items:flex-end}

/* ===== r999 上传题目：题目文件 + 讲解视频 两个选择框 ===== */
.dlg .lbl2{margin:16px 0 8px}
.dlg .lbl .muted{font-weight:400}
.drop.dropv{min-height:72px;background:#fbfcff}
.drop.dropv .dn{font-size:12.5px}
.oneline .filename[data-for="explain"]{max-width:150px}

/* r1004 班级列表「学生」列显示姓名：单行放不下就省略，鼠标悬停看全名 */
.clstbl td.c-stu{max-width:240px}
.clstbl .stulist{display:block;max-width:240px;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.clstbl .c-stu .urw{max-width:100%}
/* r1004 编辑态：学生选择器的文字与只读态同粗细，不加粗 */
tr.crow.editing .msel-txt.on{font-weight:400}

/* r1006 题库列表：没有 stones 的图片题直接显示题图（尺寸与迷你棋盘一致） */
/* r1183：定式缩略图带手数 → 单独放大到 56（卡片里仍按 170 走）
   r1206：棋盘改成按原图裁切（可能是长方形的），缩略图高度会矮一点；
   r1207：行高按以前的来 —— 固定 56 高、棋盘在格子里居中，看不清就不看 */
.minibd:has(> .gb-svg.recbd){width:84px;min-height:84px;display:inline-flex;
  align-items:center}
.cardbd .minibd:has(> .gb-svg.recbd){width:170px}
.minibd img.pthumb{height:44px;width:auto;max-width:120px;object-fit:contain;
  border:1px solid var(--line);border-radius:4px;background:#fff}
.minibd:has(>img.pthumb){width:auto;max-width:120px}
.tbl .wlnk.vlnk{white-space:nowrap}

/* ============ r1008 对弈 / 统计 ============ */
.foxw{color:inherit}
.foxl{color:var(--danger);font-weight:600}
.foxwhen{font-variant-numeric:tabular-nums;color:var(--sub);white-space:nowrap}
.tbl tr.dayhd td{background:#f8fafc;color:#4b5563;font-size:12.5px;font-weight:600;
  letter-spacing:.2px;border-bottom:1px solid var(--line)}
.tbl tr.dayhd td .muted{margin-left:10px;font-weight:400}
.sec-hd.flex form{margin:0}
.okmsg{margin:0 0 10px;padding:8px 12px;border-radius:8px;background:#ecfdf5;
  color:#065f46;font-size:13px}
.sec-bd .filters+.filters{margin-top:10px}

@media (max-width:900px){
  .tblwrap .foxtbl{min-width:640px}
}
.gdtag{margin-left:5px;font-size:11px;letter-spacing:0}
.foxd{color:var(--sub)}
/* r1676：对弈表手数左对齐；操作 / 讲解两列按钮不换行、之间留 6px */
/* r1679：table.tbl td.num 权重更高，这条必须带 table.tbl 前缀并在其后生效 */
table.tbl.foxtbl th.nl,table.tbl.foxtbl td.num.nl{text-align:left}
.foxact,.foxexp{white-space:nowrap}
.foxact .btn+.btn,.foxexp .btn+.btn{margin-left:6px}

/* r1013：复盘页（棋盘 + 录制条 + 讲解播放） */
.gbd{display:block;width:100%;height:auto;border-radius:8px;background:#e9c98c}
.gbar{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}
.gbar .gply{color:var(--sub);font-size:12.5px;font-variant-numeric:tabular-nums;
  min-width:72px;text-align:center}
.gbd-t{font-size:12.5px;color:var(--sub);font-weight:600;margin:0 0 6px}
.grec{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 16px;
  border-top:1px solid var(--line)}
.gexp{padding:12px 16px;border-bottom:1px solid var(--line)}
.gexp:last-child{border-bottom:0}
.gexp video{display:block;width:100%;height:auto;border-radius:8px;background:#000}

/* r1020：题库 / 定式列表末列「操作」= 修改 / 删除（点修改在本行内变成下拉 + 保存 / 取消） */
tr.qrow .uro,tr.jrow .uro{display:inline}
tr.qrow .urw,tr.jrow .urw{display:none}
tr.qrow.editing,tr.jrow.editing{background:#f7fbff}
tr.qrow.editing .uro,tr.jrow.editing .uro{display:none}
tr.qrow.editing .urw,tr.jrow.editing .urw{display:inline-flex;align-items:center;gap:6px}
tr.qrow.editing td,tr.jrow.editing td{padding-top:5px;padding-bottom:5px}
tr.qrow .urw select,tr.jrow .urw select{height:28px;padding:0 6px;font-size:12.5px;
  border-radius:6px;width:auto;min-width:74px}
tr.qrow td.ops,tr.jrow td.ops{width:1%;white-space:nowrap}
tr.qrow td.ops .uro,tr.jrow td.ops .uro{display:inline-flex;align-items:center;gap:8px}
tr.qrow td.ops .uro form,tr.jrow td.ops .uro form{display:inline;margin:0}
tr.qrow td.ops .btn,tr.jrow td.ops .btn{white-space:nowrap;padding:4px 11px;line-height:1.4}
tr.qrow.editing td.ops span.uro,tr.jrow.editing td.ops span.uro{display:none}

/* r1023：题库 / 定式 行内「难度」多选（复用 .msel），题型 / 类型仍单选 */
tr.qrow .urw .msel,tr.jrow .urw .msel{min-width:0;flex:none}
tr.qrow .urw .msel-btn,tr.jrow .urw .msel-btn{min-width:96px;max-width:150px;height:28px;
  padding:0 7px;font-size:12.5px;border-radius:6px;gap:5px}
tr.qrow .urw .msel-txt,tr.jrow .urw .msel-txt{font-size:12.5px;max-width:112px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
tr.qrow .urw .msel-pop,tr.jrow .urw .msel-pop{width:240px}
/* 筛选条上的题型 / 类型单选下拉 */
.qfilter select.evf{min-width:96px;max-width:150px}
.msel.up .msel-pop{top:auto;bottom:calc(100% + 6px)}
.psel.up .psel-pop{top:auto;bottom:calc(100% + 6px)}
/* r1023：卡片里有下拉弹层打开时不再裁剪（表格行内多选只在卡片里，弹层要能探出去） */
.sec:has(.msel.open){overflow:visible}

/* r1048 定式提示 */
.dlg .inp{width:100%;box-sizing:border-box;padding:10px 12px;border:1px solid var(--line);
  border-radius:10px;font-size:14px;font-family:inherit;outline:none;background:#fff}
.dlg .inp:focus{border-color:var(--brand)}
.oneline input.ttl.wide{width:auto;flex:1 1 300px;max-width:520px}
/* r1177：提示列改成「两行截断」，鼠标悬停看全文；详情页整段换行 */
.htip{display:-webkit-box;max-width:100%;overflow:hidden;text-overflow:ellipsis;
  white-space:normal;vertical-align:bottom;overflow-wrap:anywhere;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.5}
td.htd{max-width:280px}
td.htd .htip{max-width:270px}
.pmeta .hintline .mv .htip{display:block;-webkit-line-clamp:unset;
  overflow:visible;text-overflow:clip;white-space:normal}
.rhint{margin:8px 0 0;font-size:12.5px;line-height:1.55;color:var(--sub)}
.pmeta .hintline{display:flex;gap:10px;align-items:baseline}
.pmeta .hintline .mv{flex:1 1 auto;min-width:0;white-space:normal;line-height:1.65;margin-top:0}
/* r1050：定式详情里的「提示」整段显示（原来挤在 3 列网格的第一列里被截断） */
.pmeta .hintline{display:flex;gap:10px;align-items:baseline;grid-column:1/-1}
.pmeta .hintline .mv{display:block;flex:1 1 auto;min-width:0;white-space:normal;overflow:visible;
  text-overflow:clip;word-break:break-word;line-height:1.7}

/* r1054：录入定式「步数」输入框只占一小格，不拉满整行 */
.pinfo .pblock input.stp{max-width:100px}

/* r1057：统计 → 题目正确率（数字按高低上色，人数字灰） */
.acc{font-weight:650}
.acc.low{color:#dc2626}
.acc.mid{color:#0f6e56}
.acc.high{color:#15803d}
/* r1269：右栏下沿跟左侧棋盘卡对齐。
   `.probwrap` 是 align-items:start，右栏只有内容高，棋盘卡却有整块盘那么高 ——
   两栏底边就差出一大截。这里让右栏撑到行高（棋盘卡多高它就多高），
   最后一张卡吃掉剩余空间，卡底压在与棋盘卡相同的水平线上；
   原图块（.refpop）用 margin-top:auto 贴在这条线上，展开时下沿自然齐平。 */
/* r1271：**棋盘固定大小不拉伸** —— 右边的高度靠 JS 锁到棋盘卡高度（ALIGN_JS），
   整页不会因为展开原图而变长（原来那版把两栏都撑满，右栏一高页面就多一条滚动条） */
.probwrap.palign{align-items:start}
.probwrap.palign .pinright{min-height:0}
/* 注意用 div:last-of-type —— 记录卡后面还挂着一个 <script id="histcfg">，
   `*:last-child` 会把 script 撑大，卡片反而不动 */
.probwrap.palign .pinright>div:last-of-type{flex:1 1 auto;min-height:0}
.probwrap.palign .pinright>.sec.pinfo{display:flex;flex-direction:column}
.probwrap.palign .pinright>.sec.pinfo>.refpop{margin-top:auto}
.acc.blue{color:#1d4ed8}   /* r1235：首次页统一深蓝 */
.accn{color:var(--sub);font-size:12px;margin-left:5px}
/* r1253：题目页右列改成「信息框 + 记录卡」两张，记录卡单独一个外框 */
.probwrap .pinright{display:flex;flex-direction:column;gap:14px;min-width:0}
.pinright>.sec{margin:0}
.hwsec .sec-hd .muted{font-size:12px;font-weight:400}
/* r1293：抬头恢复「X历次做题记录」；正确率缩成右上小字（灰标签 + 深蓝数字 + 灰 对/做） */
.hwsec .sec-hd.flex{flex-wrap:wrap;row-gap:2px}
.hwsec .sec-hd .pk-note{font-weight:400}
/* r1252：题目页「某个学生在这道题上的历次作答」—— 作业号退成一行小字，主维度是题目 */
.pinfo .pk-note{font-weight:400;font-size:11.5px;margin-left:8px;color:var(--sub)}
.hwsec .pk{flex:0 0 auto !important;white-space:nowrap}
.hwsec .hwl{flex:1 1 100%;display:flex;flex-direction:column;align-items:stretch;
  gap:6px;margin-top:4px}
.hwsec .chip{align-self:flex-start;font-size:12px;line-height:1.5;padding:3px 10px;
  border:1px solid var(--line);border-radius:999px;background:#fff;color:var(--sub);cursor:pointer}
.hwsec .chip.on{border-color:var(--brand);color:var(--brand);background:#eef4ff}
/* r1253：右栏窄，一条记录排两行 —— 上面「时间 · 对错 · 说明」，下面小字放作业号，不再挤成折行 */
.hwsec .hwrow{display:grid;grid-template-columns:auto auto 1fr auto;align-items:baseline;
  gap:3px 8px;padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:12.5px;line-height:1.5;color:var(--ink);text-decoration:none}
.hwsec .hwrow:hover{border-color:#c9ced6;background:#fbfcfe}
.hwsec .hwrow.on{border-color:var(--brand);box-shadow:0 0 0 2px rgba(37,99,235,.12)}
.hwsec .hwrow .w{color:var(--sub);font-variant-numeric:tabular-nums;white-space:nowrap}
.hwsec .hwrow .st{font-weight:600;text-align:center}
.hwsec .st-ok{color:#15803d}
.hwsec .st-bad{color:#b91c1c}
.hwsec .st-mid{color:#0f6e56}
.hwsec .st-todo{color:var(--sub);font-weight:400}
/* r1272：作业号跟日期同一行（原来单独占第二行）；中间那句「点击显示错误」用淡灰，
   鼠标移上去才变蓝，平时不抢眼 */
.hwsec .hwrow .d{color:#b0b6bf;white-space:nowrap}
.hwsec .hwrow:hover .d{color:var(--brand)}
/* r1290：没有留存着法的那一行 —— 点了没反应，就别做成可点的样子 */
.hwsec .hwrow.nomv{cursor:default}
.hwsec .hwrow.nomv:hover{border-color:var(--line);background:#fff}
.hwsec .hwrow.nomv:hover .d{color:#b0b6bf}
.hwsec .hwrow .hw{color:#b0b6bf;font-size:10.5px;text-align:right;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.hwsec .hwrow .w{font-size:12px}
/* r1251：原图展开在右侧信息框**下方**（不悬浮、不挡内容），按剩余空间等比缩放 */
/* r1273：原图块不铺底色 —— 底色一铺满整栏，图再小看着也像「被拉满了一整块」 */
/* r1279：原图块改成「标签在左、图片在右」，跟答案/讲解同一套；× 浮在右上角 */
.refpop{position:relative;border-top:1px solid var(--line);background:transparent;
  padding:8px 16px 0}
.refpop .pk{color:var(--sub);font-size:12.5px}
.refpop[hidden]{display:none}
.refpop .x{position:absolute;top:6px;right:14px;z-index:2;
  width:20px;height:20px;border-radius:50%;border:1px solid var(--line);
  background:#fff;color:#6b7280;font-size:13px;line-height:1;cursor:pointer;padding:0}
.refpop .x:hover{color:#111827;border-color:#c9ced6}
/* r1271：原图块自己吃掉卡片剩余高度，图片按 contain 填满、锚点贴底 —— 
   不再用 JS 算像素高度，展开/收起都不会让页面变长，也不会冒滚动条 */
.probwrap.palign .refpop{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;
  padding-bottom:0}   /* 去掉底部内边距，图片下沿才能正好压在卡片底 = 棋盘底 */
/* r1276：原图给一个**稳定的高度上限**（32vh，最多 280px）—— 之前它是「吃满卡片剩余空间」，
   卡片一变高图就跟着变大、顶到整栏宽，看着像每次都错。现在高度封顶、宽度按比例缩。 */
.refpop .imgbox{flex:1 1 auto;min-height:0;max-height:min(32vh,280px);
  display:flex;align-items:center;justify-content:center}   /* r1280：图片在框内上下居中，
   高度有富余时不会贴着下边框 */
/* r1273：图片**只按高度缩放**，宽度跟着长宽比走 —— 不再 width:100% 把整栏撑满、
   再靠 object-fit 留白（老师看着就是「图被拉满了」）。宽高都用 auto + max 限制：
   高度不超剩余空间、宽度不超栏宽，等比缩小；imgbox 底对齐 → 下沿永远贴棋盘下沿。 */
/* r1276：图片尺寸有两条上限，缺一条就会「撑满宽度 / 撑高页面」：
   ① 兜底：不超过视口高度（父容器没有确定高度时，百分比 max-height 会**静默失效**，
      图片就回落到原始尺寸、再被 max-width 拉满整栏 —— 之前反复出问题就是这个）；
   ② 卡片内（.palign）：按「卡片剩余高度」等比缩放，下沿贴住卡片底 = 棋盘底。 */
.refpop img{display:block;width:auto;height:auto;max-width:100%;
  max-height:min(32vh,280px);
  margin:0 auto;border-radius:6px 6px 0 0;background:#fff;
  box-shadow:0 2px 8px rgba(16,24,40,.08)}
.probwrap.palign .refpop img{max-height:100%}
/* 卡片内的原图块始终贴底：图片高度封顶后，块本身不能被拉到卡片顶 */
/* r1278：卡片内**不吃 32vh 的封顶** —— 那个封顶会在按钮和原图之间留一大片空白。
   这里是「有多少空间就占多少」：图片撑满剩余高度、宽度按比例缩，下沿贴卡片底。 */
.probwrap.palign .refpop{display:flex;flex-direction:row;align-items:stretch;gap:10px}
/* 注意：上面 1396 行那条把方向写成 column 了，这里必须显式改回 row，否则标签和图片还是上下排 */
.probwrap.palign .refpop>.pk{flex:0 0 40px;padding-top:3px}
/* r1283：定式页的信息卡直接挂在 probwrap 下（没有 .pinright），也要能竖着排、原图贴底 */
.probwrap.palign>.sec.pinfo{display:flex;flex-direction:column;min-height:0}
.probwrap.palign>.sec.pinfo>.refpop{margin-top:auto}
.probwrap.palign .refpop .imgbox{flex:1 1 auto;min-height:0;max-height:none;
  position:relative;overflow:hidden}   /* r1288：定高盒子（像素由 ALIGN_JS 给） */
/* r1288：图片绝对定位 —— 不参与布局、撑不高卡片，只按盒子大小等比缩放居中。
   之前用 max-height:100% 靠 flex 链给高度，卡片一没被锁住百分比就静默失效，
   图片只剩 max-width 生效 → 按宽度拉满整栏、下沿比棋盘低一截（T000019/18/6 就是这个）。 */
.probwrap.palign .refpop .imgbox>img{position:absolute;top:0;left:0;right:0;bottom:0;
  margin:auto;width:auto;height:auto;max-width:100%;max-height:100%}
/* r1289：改成**贴底**而不是上下居中 —— 大屏上图的原始高度小于可用高度时，
   居中会让下沿浮起来（1920×1080 实测差 12px），贴底才跟棋盘下沿齐。 */
/* r1247：错题缩略图 —— 一行排开，悬停放大看清棋形 */
/* r1250：错题缩略图跟题库列表一样大（34px），不做悬停放大，点一下直接进错题页 */
.wthumb{display:inline-block;width:34px;margin:0 7px 4px 0;line-height:0;
  border-radius:5px}
.wthumb:hover{outline:2px solid var(--brand);outline-offset:1px;border-radius:5px}
/* r1244：展开的学生明细做成「浮起来」的一张卡片 —— 灰底表格里直接嵌表分不清内外 */
/* r1265：回到「浮起来的一张白卡」——上一版为了全白把边框阴影去掉了，悬浮感没了。
   底色保持纯白（卡片内不再有浅蓝斑马纹），外圈仍是表格灰底，卡就浮在上面。 */
.hwtbl tr.hwx>td{background:transparent;border:0;padding:0 0 14px}
.hwtbl tr.hwx>td>.hwkid{display:inline-block;width:auto;min-width:430px;max-width:88%;
  background:#fff;border:1px solid #e3e8ef;border-radius:12px;
  box-shadow:0 8px 22px rgba(16,24,40,.10);padding:8px 14px 10px;margin:-4px 0 0 6px}
.hwtbl tr.hwx .tbl{background:transparent}
.hwtbl tr.hwx .tbl th{background:#fff;border-bottom:1px solid #edf0f4}
/* r1262：里面的学生行也全白（原来套的是列表的斑马纹/浅蓝底，看着不像一整块白） */
.hwtbl tr.hwx .tbl tbody tr>td,.hwtbl tr.hwx .tbl tbody tr:hover>td{background:#fff}
.tag.accbad{background:#fdecec;color:#b91c1c}
.acgok{color:#15803d;font-size:12.5px}

/* r1057：统计 → 题目，分布表里当前下钻的那一行 */
tr.on td{background:#f2f6ff}

/* r1059：统计 → 题目 图表化（题目分布 / 分配分布 / 题目条图 / 分配明细） */
.acc-hd{display:flex;align-items:center;justify-content:space-between;gap:24px;flex-wrap:wrap}
.acc-hd .stat{margin:0}
.duo{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:16px;align-items:start}
@media(max-width:1180px){.duo{grid-template-columns:1fr}}
.duo>.sec{margin:0}
.bars{display:flex;flex-direction:column;gap:11px}
.brow{display:flex;align-items:center;gap:11px}
.blbl{flex:0 0 76px;font-size:13px;color:var(--ink);white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
a.blbl:hover{color:var(--brand);text-decoration:underline}
.rowon .blbl{font-weight:700;color:var(--brand)}
.btrack{flex:1;min-width:70px;height:16px;background:#f1f3f6;border-radius:5px;
  overflow:hidden;position:relative}
.btrack.gap{background:repeating-linear-gradient(45deg,#fdf3f3,#fdf3f3 6px,#fff 6px,#fff 12px);
  border:1px solid #f7dada}
.bfill{display:flex;height:100%;border-radius:5px;overflow:hidden;min-width:3px}
.bseg{display:block;height:100%}
.bseg.a{background:#2563eb}
.bseg.b{background:#c9d8f8}
.bseg.s{background:#5b8def}
.bval{flex:0 0 152px;text-align:right;font-size:12.5px;line-height:1.5;
  font-variant-numeric:tabular-nums}
.bval .muted{font-size:11.5px}
.bnote{margin-top:14px;color:var(--sub);font-size:11.5px;line-height:1.6}
.dev{display:inline-block;margin-left:5px;padding:0 5px;border-radius:5px;font-size:11px;
  background:#eaf7ef;color:#15803d}
.dev.bad{background:#fdecec;color:#b91c1c}
/* 第二层：一题一横条 */
.plist{display:flex;flex-direction:column}
.prow{display:flex;align-items:center;gap:14px;padding:11px 0;border-bottom:1px solid #f1f2f5}
.prow:last-child{border-bottom:0}
.pth{flex:0 0 58px;line-height:0;display:flex;align-items:center;justify-content:center}
.pth .minibd{width:58px}
.pth .minibd img.pthumb{width:58px;height:58px;object-fit:contain;border-radius:4px}
.pmain{flex:1;min-width:0}
.phd{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px}
.pcod{font-weight:650}
.pbar{position:relative;margin:7px 0 5px}
.pbar .thr{position:absolute;left:50%;top:-3px;bottom:-3px;z-index:3;
  border-left:1.5px dashed #e06060}
#pdetail,#ptable{scroll-margin-top:14px}
.pbar .bfill.s-low{background:#dc2626}
.pbar .bfill.s-ok{background:#059669}
.pbar .bfill.s-thin{background:#9ca3af}
.pbar .bfill.s-none{background:transparent;min-width:0}
.pval{font-size:12px;color:var(--sub)}
.pstate{flex:0 0 72px;text-align:right}
/* 第三层：这道题发给了谁 */
.agrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:10px}
.acard{border:1px solid var(--line);border-radius:10px;padding:9px 12px;background:#fff}
.acard .anl{display:flex;align-items:center;gap:7px;font-size:13px}
.acard .ai{font-size:11.5px;color:var(--sub);margin-top:2px}

/* r1062 录入题目：一行四个选择框（难度/题型/知识点/先手）+ 两个带底色的操作框同行 */
.pinfo .prow1{display:flex;align-items:flex-start;gap:10px;padding:14px 16px;
  border-bottom:1px solid var(--line);flex-wrap:nowrap}
.pinfo .prow1 .pf{display:flex;flex-direction:column;gap:6px;min-width:0;flex:1 1 0}
.pinfo .prow1 .pf .pk{flex:none;font-size:12.5px;color:var(--sub)}
.pinfo .prow1 .msel,.pinfo .prow1 .psel{display:block;width:100%}
.pinfo .prow1 .msel-btn,.pinfo .prow1 .psel-btn{width:100%;min-width:0;max-width:none;
  box-sizing:border-box;padding:7px 10px;font-size:13px;gap:6px}
.pinfo .prow1 .msel-pop{width:100%;min-width:236px}
.pinfo .prow1 .psel-pop{width:100%;min-width:172px}
.pinfo .prow1 .msel-tip,.pinfo .prow1 .msel-foot{font-size:12px}
.pinfo .prow1 input.tpc{width:100%;box-sizing:border-box;font:inherit;font-size:13px;
  padding:7px 10px;border:1px solid var(--line);border-radius:9px;background:#fff;color:var(--ink)}
.pinfo .prow1 input.tpc:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.pinfo .pactrow{display:grid;grid-template-columns:minmax(0,1.9fr) minmax(0,1fr) minmax(0,1fr);gap:10px;
  padding:14px 16px;background:#fbfcfe;border-bottom:1px solid var(--line);align-items:stretch}
.pinfo .pbox{display:flex;flex-direction:column;gap:9px;min-width:0;padding:11px 13px;
  background:#f2f5fa;border:1px solid #e2e7ef;border-radius:10px}
.pinfo .pbox-hd{font-size:12.5px;font-weight:400;color:var(--sub)}
.pinfo .pbox-btns{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr))}
.pinfo .pbox-btns .btn{justify-content:center;min-width:0;padding-left:8px;
  padding-right:8px;white-space:normal}
.pinfo .pbox .alist{display:flex;flex-direction:column;gap:5px;flex-wrap:nowrap;flex:1;
  align-items:flex-start;font-size:12.5px;line-height:1.5;min-height:19px}
.pinfo .pbox .alist .aline{display:flex;align-items:baseline;gap:8px;min-width:0}
.pinfo .pbox .alist .ak{color:var(--sub);font-size:12.5px;flex:0 0 auto}
@media(max-width:1180px){
  .pinfo .prow1{flex-wrap:wrap}
  .pinfo .prow1 .pf{flex:1 1 46%}
}
@media(max-width:980px){.pinfo .pactrow{grid-template-columns:1fr}}
.pinfo:has(.prow1){align-self:stretch}

/* r1064 录题页「步数」框：撑满、去掉旧的行内宽度限制与数字微调箭头 */
.pinfo .prow1 input.tpc.stp{max-width:100%;-moz-appearance:textfield;text-align:left}
.pinfo .prow1 input.tpc.stp::-webkit-outer-spin-button,
.pinfo .prow1 input.tpc.stp::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}

/* r1067 统一：下拉框 / 多选框里的字一律不加粗（选中态只改成实色，不加字重） */
.msel-txt.on,.psel-txt.on{font-weight:400}
.msel-btn,.psel-btn{font-weight:400}

/* ============ r1077 管理台（对齐 datahermit 后台） ============ */
.adm-num{font-variant-numeric:tabular-nums;color:var(--sub)}
input.tpc.ren{width:150px;box-sizing:border-box;font:inherit;font-size:13px;padding:5px 8px;
  border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}
input.tpc.ren:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.tbl tr.off td{color:#9ca3af}
.adm-doc{font-size:13.5px;line-height:1.85;color:#374151;max-width:880px}
.adm-doc h3{font-size:14.5px;font-weight:600;color:var(--ink);margin:22px 0 8px}
.adm-doc h3:first-child{margin-top:0}
.adm-doc p{margin:0 0 10px}
.adm-doc ul,.adm-doc ol{margin:6px 0 12px;padding-left:20px}
.adm-doc li{margin:4px 0}
.adm-doc code{font-size:12.5px;background:#f4f6fa;border:1px solid #e6eaf1;border-radius:5px;
  padding:1px 5px}
.adm-doc table.tbl{margin:4px 0 14px}
/* r1121：规则文档里的模板表——首列模板名与「一级目录」不许折行 */
.adm-doc table.tpl-tbl td,.adm-doc table.tpl-tbl th{vertical-align:top;font-size:12.5px}
.adm-doc table.tpl-tbl td:first-child,.adm-doc table.tpl-tbl th:first-child{white-space:nowrap}
.adm-doc table.tpl-tbl td:nth-child(3),.adm-doc table.tpl-tbl th:nth-child(3){white-space:nowrap}

/* r1084 知识点输入框（全站统一）：原生下拉三角删掉，换成与单选一致的箭头
   原来只写在 .prow1 下，别的页面既不居中、又和原生箭头叠成两个 */
.tpcw{position:relative;display:block;width:100%}
.tpcw>input.tpc{padding-right:28px;cursor:text}
/* 三角用伪元素画：CSS 三角是 border-top 撑出来的，整体贴 box 顶部，
   直接给 .tparrow 定位会视觉偏上；改成方形热区 + 伪元素按盒中心画三角 */
.tpcw>.tparrow{position:absolute;right:4px;top:50%;width:22px;height:22px;margin-top:-11px;
  padding:0;border:0;transform:none;background:none;cursor:pointer;line-height:0}
.tpcw>.tparrow::before{content:"";position:absolute;left:50%;top:50%;
  width:0;height:0;margin:-2.5px 0 0 -4.5px;
  border-left:4.5px solid transparent;border-right:4.5px solid transparent;
  border-top:5px solid #9aa1ac;transition:transform .18s ease}
.tpcw input.tpc::-webkit-calendar-picker-indicator,
.tpcw input.tpc::-webkit-list-button{display:none!important;opacity:0!important;
  width:0!important;height:0!important;padding:0!important;margin:0!important}
.tpcw input.tpc::-ms-expand{display:none}
/* r1084 答案页「轮次 / 共 N 手 / 步骤」一律 13.5px（原来 14 / 13 / 12.5 三种） */
.pinfo .pblock .turn,.pinfo .pblock .stepsline{font-size:13.5px;font-weight:400;
  color:var(--ink);line-height:1.5}
.pinfo .pblock .cnt{font-size:13.5px;font-weight:400;color:var(--sub);line-height:1.5}
/* r1084 上传题目：难度改多选下拉，宽度与旁边的下拉齐平 */
.upload .oneline .psel-btn,.upload .oneline .msel-btn{min-width:0;width:150px}
.upload .oneline .psel-pop,.upload .oneline .msel-pop{min-width:236px}

/* ============ r1072 题库行内编辑与录入页同一套控件 ============ */
/* 先手 / 题型 改成按钮式下拉后，压到行内的一行高度 */
tr.qrow .urw .psel,tr.jrow .urw .psel{min-width:0;flex:none}
tr.qrow .urw .psel-btn,tr.jrow .urw .psel-btn{min-width:72px;max-width:160px;height:28px;
  padding:0 7px;font-size:12.5px;border-radius:6px;gap:5px;
  justify-content:flex-start;align-items:center}
tr.qrow .urw .psel-txt,tr.jrow .urw .psel-txt{font-size:12.5px;max-width:114px;text-align:left}
tr.qrow .urw .psel-pop,tr.jrow .urw .psel-pop{width:190px}
tr.qrow .urw .psel-q,tr.jrow .urw .psel-q{padding:5px 8px;font-size:12.5px}
tr.qrow .urw .psel-list,tr.jrow .urw .psel-list{margin:6px 0 0;max-height:196px}
tr.qrow .urw .psel-opt,tr.jrow .urw .psel-opt{padding:6px 8px;font-size:12.5px}
/* 下拉弹层要能探出卡片 */
.sec:has(.psel.open){overflow:visible}
/* 知识点：输入框 + 候选箭头，与步数同一高度 */
tr.qrow .urw .tpcw,tr.jrow .urw .tpcw{display:inline-flex;align-items:center;width:112px;
  position:relative}
tr.qrow .urw .tpcw input.tpc,tr.jrow .urw .tpcw input.tpc{width:100%;box-sizing:border-box;
  padding-right:24px}
tr.qrow .urw .tpcw .tparrow,tr.jrow .urw .tpcw .tparrow{position:absolute;right:3px;top:50%;
  width:18px;height:18px;margin-top:-9px;padding:0;border:0;transform:none;cursor:pointer}
/* 步数：去掉原生微调箭头，与录入页一致 */
tr.qrow .urw input.stp,tr.jrow .urw input.stp{-moz-appearance:textfield;text-align:left}
tr.qrow .urw input.stp::-webkit-outer-spin-button,
tr.qrow .urw input.stp::-webkit-inner-spin-button,
tr.jrow .urw input.stp::-webkit-outer-spin-button,
tr.jrow .urw input.stp::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
/* 档位标签：改蓝底（与主色一致） */
.tag.lvl{background:#e8f0fe;color:#1d4ed8}
.tag.lv{background:#e3f5f0;color:#0f6e56;font-weight:400}
/* r1077 页头（在白卡外面）：18px 标题 + 右侧搜索框（回车即搜，没有按钮） */
.adm-hd{display:flex;align-items:center;gap:10px;margin:0 0 12px}
.adm-hd .gb{font-size:18px;font-weight:600;color:#1f2937}
.adm-card{background:#fff;border:1px solid var(--line);border-radius:10px;overflow-x:auto}
.adm-search{display:flex;align-items:center}
.adm-search .inp{width:280px;height:34px;padding:0 12px;box-sizing:border-box;font:inherit;
  font-size:13px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink)}
.adm-search .inp:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.adm-search input::-webkit-search-cancel-button{-webkit-appearance:none}

/* r1077 规则总入口：一行胶囊页签（选中白底蓝字，右侧跟条数） */
.adm-card > .adm-nav-tabs{margin:14px 16px 0}
.adm-nav-tabs{display:inline-flex;align-items:center;gap:4px;background:#eef0f3;
  border-radius:10px;padding:4px;flex-wrap:wrap}
.adm-nav-tab{display:inline-flex;align-items:center;height:28px;padding:0 15px;border-radius:8px;
  font-size:13px;color:#4b5563;font-weight:400;white-space:nowrap}
.adm-nav-tab:hover{color:var(--brand)}
.adm-nav-tab.on{background:#fff;color:var(--brand);font-weight:600;
  box-shadow:0 1px 4px rgba(16,24,40,.10)}
.adm-nav-tab .n{font-size:12px;font-weight:600;color:#9aa3af;margin-left:7px;
  font-variant-numeric:tabular-nums}
.adm-nav-tab.on .n{color:var(--brand)}

/* r1077 内容面板 + 表格：参考尺寸（14px 字、浅灰表头、行内控件压扁） */
.adm-card > .adm-panel{margin:14px 16px 16px;padding:14px}
.adm-panel{background:#fff;border:1px solid var(--line);border-radius:10px}
.adm-tbl{font-size:14px}
.adm-tbl th,.adm-tbl td{padding:10px 12px;white-space:nowrap}
.adm-tbl input.tpc.ren{height:28px;padding:2px 8px}
.adm-tbl .btn.small{height:26px;padding:0 10px;line-height:24px}
.adm-tbl th{background:#f1f5f9;color:#475569;font-weight:600;font-size:13px}
.adm-tbl tbody tr:hover{background:#f9fbfd}
@media(max-width:900px){
  .adm-search .inp{width:100%}
  .adm-hd{flex-wrap:wrap;row-gap:10px}
}

/* r1082 弹层兜底：上下都塞不下时脱离卡片，位置与限高由 JS 给（贴按钮、内部滚动） */
.msel.fit .msel-pop,.psel.fit .psel-pop{position:fixed;display:flex;flex-direction:column;
  overflow:hidden;min-width:0;z-index:120}
.msel.fit .msel-pop .msel-list,.psel.fit .psel-pop .psel-list{flex:1 1 auto;min-height:64px;overflow:auto}
.msel.fit .msel-sch,.psel.fit .psel-sch{flex:none}
.msel.fit .msel-foot{flex:none}

/* ================= r1092 分配页两列 + 新增账号一行 ================= */
/* 分配页列表：一题/一定式一张卡片，两列并排；每张只留 题目 / 难度 / 题型 / 知识点 */
.pickgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:8px}
.pitem{display:flex;align-items:center;gap:10px;padding:7px 12px;min-width:0;
  border:1px solid var(--line);border-radius:10px;background:#fff}
.pitem:hover{background:#f7faff;border-color:#c7d6f5}
.pitem.off{display:none}
.pitem input{margin:0;flex:none}
.pitem .pibd{flex:none;display:inline-block;line-height:0;cursor:pointer}
.pitem .picode{flex:none;font-size:13px;color:var(--ink);text-decoration:none;
  font-variant-numeric:tabular-nums}
.pitem .picode:hover{color:var(--brand)}
.pitem .pitags{display:flex;align-items:center;gap:5px;flex-wrap:wrap;min-width:0}
.pickgrid:not(.jgrid) .pitem{padding:6px 10px;gap:6px}.pickgrid:not(.jgrid) .pitem .picode{font-size:12.5px}.pickgrid:not(.jgrid) .pitem .pitags{gap:4px}.pickgrid:not(.jgrid) .pitem .tag{padding:1px 6px}.pickgrid:not(.jgrid) .pitem .pitime{margin-left:auto;flex:none;font-size:10.5px;color:var(--sub);white-space:nowrap;font-variant-numeric:tabular-nums}.pickgrid:not(.jgrid) .pitem .pitime.none{color:#c2c9d6}
/* 分配页搜索：贴在「按学生 / 按班级」右侧，无按钮，即时过滤 */
.psearch{flex:none}
.psearch input{width:200px;height:34px;padding:0 11px;font-size:13px;
  border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink)}
.psearch input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
@media(max-width:640px){.pickgrid{grid-template-columns:1fr}}
@media(max-width:900px){
  .psearch{flex:1 1 100%}
  .psearch input{width:100%}
}
/* 新增学生 / 新增老师：字段顺序跟表列一致，全部挤在一行，确认按钮在同一行末尾 */
.newuser .tagform{display:flex;flex-wrap:nowrap;gap:10px;align-items:flex-end}
.newuser .tagform>label{flex:1 1 0;min-width:0;font-size:12.5px}
.newuser .tagform>label.wide{flex:1.6 1 0}
.newuser .tagform input,.newuser .tagform select{width:100%;min-width:0;height:32px;
  padding:0 8px;font-size:13px;border-radius:8px}
.newuser .birthpair{display:flex;gap:6px}
.newuser .birthpair select{flex:1;min-width:0}
@media(max-width:900px){
  .newuser .tagform{flex-wrap:wrap}
  .newuser .tagform>label{flex:1 1 40%}
}

/* r1094 分配提醒：正文黑字，只有「录入」是蓝色链接 */
.warnline{margin:0 0 4px;color:var(--ink)}
.warnline2{margin:0;color:var(--ink);font-size:13px}

/* r1095 对弈页筛选：日期框跟 .evf 同高同框，宽度放开 */
.evf-d{max-width:none;width:152px}
.evfield .btn{margin-left:0}
.evfilter .fl{white-space:nowrap}

/* r1096 搜索框挪到卡片标题右侧：不继承标题字重 */
.sec-hd .psearch input{font-weight:400}

/* r1097 分配页：搜索拆成 难度 / 题型 / 知识点 三个框，放在选择器之后、确认分配之前；定式 3-4 个一行 */
.assignbar .psearch{flex:none}
.assignbar .psearch input{width:100px}
.assignbar .psearch input[data-pf="tp"]{width:116px}
.pickgrid.jgrid{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}
@media(max-width:900px){
  .assignbar .psearch{flex:1 1 calc(33.333% - 8px)}
  .assignbar .psearch input{width:100%}
}
@media(max-width:640px){.pickgrid.jgrid{grid-template-columns:1fr}}
/* r1097 分配栏内控件统一 36px 高 */
.assignbar .msel-btn{height:36px;padding-top:0;padding-bottom:0}
.assignbar .psearch input{height:36px}
.assignbar .fpush{height:36px;padding-top:0;padding-bottom:0}
/* r1097 搜索框去掉原生清除叉（三个窄框里会挤掉文字） */
.psearch input::-webkit-search-cancel-button,
.psearch input::-webkit-search-decoration,
.psearch input::-webkit-search-results-button{-webkit-appearance:none;appearance:none}
.assignbar .psearch input{width:108px}
.assignbar .psearch input[data-pf="tp"]{width:124px}
@media(max-width:900px){
  .assignbar .psearch{flex:1 1 28%;min-width:0}
  .assignbar .psearch input{width:100%;min-width:0}
}
@media(max-width:900px){
  .assignbar{width:auto;max-width:100%}
  .assignbar .psearch{flex:1 1 0}
}

/* r1097 搜索框组：桌面三个窄框并排，窄屏整组换行、内部均分 */
.psearchbar{display:flex;align-items:center;gap:8px;flex:none;min-width:0}
.psearchbar input{width:108px;height:36px;min-width:0;padding:0 10px;font-size:13px;
  border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);
  font-weight:400;-webkit-appearance:none;appearance:none}
.psearchbar input[data-pf="tp"]{width:124px}
.psearchbar input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.psearchbar input::-webkit-search-cancel-button,
.psearchbar input::-webkit-search-decoration{-webkit-appearance:none;appearance:none}
@media(max-width:900px){
  .psearchbar{flex:1 1 100%}
  .psearchbar input{flex:1 1 0;width:auto}
}

/* r1099 对弈筛选：「日期」作为整组标签，领起 7/14/30/90 天与某天日期框 */
.evfield .days{display:inline-flex;align-items:center;gap:8px}
/* r1099 学生统计：本周对弈 0 局照常显示，下面一行小字带上上次对弈日期 */
.fblast{display:inline;font-size:12px;color:var(--sub);margin-left:6px;white-space:nowrap}
/* r1099 窄屏：日期组（标签 + 天数按钮 + 日历框）整组允许折行，不许顶出卡片 */
@media(max-width:760px){
  .evfilter .evfield{flex-wrap:wrap;max-width:100%;min-width:0}
  .evfield .days{flex-wrap:wrap;min-width:0}
  .evfilter .evfield .evf-d{max-width:100%}
}

/* r1100 赛事日历提醒：班级 / 学生各带一个 title，下拉默认「全部」 */
.ed-onerow .fl{flex:none;font-size:13px;color:#6b7280;white-space:nowrap}
/* 学生下拉里补性别标 */
.msel-opt .mgd{font-style:normal;font-size:11.5px;line-height:1.5;color:var(--sub);
  border:1px solid var(--line);border-radius:4px;padding:0 4px;flex:none}
/* r1101 赛事提醒标题：数字可点击查看明细 */
.ed-hd .ed-rcnt{border:0;background:none;padding:0;font:inherit;color:var(--sub)}
.ed-hd .ed-rcnt.on{color:#2563eb;cursor:pointer}
.ed-hd .ed-rcnt.on:hover{text-decoration:underline}
/* r1102 分配页筛选条：难度多选 / 题型单选 / 知识点文本，控件统一 36px */
.pfilter{display:flex;align-items:center;gap:14px;flex:none;min-width:0}
.pfilter .evfield{display:inline-flex;align-items:center;gap:8px;flex:none;white-space:nowrap}
.pfilter .msel-btn{min-width:104px;max-width:170px;height:36px;padding-top:0;padding-bottom:0}
.pfilter select.evf{height:36px;width:104px;font-size:13px}
.pfilter input[data-pf="tp"]{width:104px;height:36px;min-width:0;padding:0 10px;font-size:13px;
  border:1px solid #d8dee8;border-radius:8px;background:#fff;color:var(--ink)}
.pfilter input[data-pf="tp"]:focus{outline:none;border-color:var(--brand);
  box-shadow:0 0 0 3px var(--brand-soft)}
.pfilter input[data-pf="tp"]::-webkit-search-cancel-button,
.pfilter input[data-pf="tp"]::-webkit-search-decoration{-webkit-appearance:none;appearance:none}
@media(max-width:900px){
  .pfilter{flex:1 1 100%;flex-wrap:wrap}
  .pfilter .evfield{flex:1 1 30%;min-width:0}
  .pfilter .msel,.pfilter .msel-btn{width:100%;min-width:0;max-width:none}
  .pfilter select.evf,.pfilter input[data-pf="tp"]{width:100%}
}
@media(max-width:1180px){
  .pfilter{flex:1 1 auto;flex-wrap:wrap}
}
@media(max-width:900px){
  .pfilter .evfield{flex:1 1 calc(50% - 7px)}
}
/* r1102 手机：标签固定窄列、控件撑满，难度/题型各半行、知识点整行 */
@media(max-width:900px){
  .pfilter .evfield{flex:1 1 calc(50% - 7px);min-width:0;gap:6px}
  .pfilter .evfield:nth-child(3){flex:1 1 100%}
  .pfilter .evfield .flabel{flex:0 0 auto;font-size:12.5px}
  .pfilter .msel{flex:1 1 0;min-width:0}
  .pfilter .msel-btn{width:100%;min-width:0;max-width:none}
  .pfilter select.evf{flex:1 1 0;width:auto;min-width:0}
  .pfilter input[data-pf="tp"]{flex:1 1 0;width:auto;min-width:0}
}
.pfilter .evfield:only-child{flex:1 1 100%}
/* r1103 作业两表：不折行，窄屏在卡片内横向滚动 */
.hwtbl th,.hwtbl td{white-space:nowrap}
/* r1105 提醒表单窄屏：两框各占半行，按钮整行 */
@media(max-width:640px){
  .ed-onerow{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .ed-onerow .btn{grid-column:1 / -1;justify-self:start}
}

/* r1135 分配栏：铺满卡片宽，选择器与各筛选器均分（仅桌面，窄屏沿用原有折行规则） */
@media(min-width:1181px){
  .assignbar{width:100%;flex-wrap:nowrap;gap:12px}
  .assignbar .pfilter{display:contents}
  .assignbar .pickbox{flex:1 1 0;min-width:0}
  .assignbar .pickbox .msel{display:block;width:100%;min-width:0}
  .assignbar .pickbox .msel-btn{width:100%;min-width:0;max-width:none}
  .assignbar .pfilter .evfield{flex:1 1 0;min-width:0}
  .assignbar .pfilter .evfield:only-child{flex:1 1 0}
  .assignbar .pfilter .msel{display:block;flex:1 1 0;min-width:0}
  .assignbar .pfilter .msel-btn{width:100%;min-width:0;max-width:none}
  .assignbar .pfilter select.evf{flex:1 1 0;width:auto;min-width:0;max-width:none}
  .assignbar .pfilter input[data-pf="tp"]{flex:1 1 0;width:auto;min-width:0}
}

/* r1166 作业列表：点行在下方展开题目明细 */
.hwtbl tbody tr.hwr{cursor:pointer}
.hwtbl tbody tr.hwr:hover>td{background:#f7faff}
.hwtbl tbody tr.hwx{display:none}
.hwtbl tbody tr.hwx.on{display:table-row}
.hwtbl tbody tr.hwx>td{background:transparent;padding:10px 12px}
.hwxg{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
.tw{display:inline-block;width:9px;height:9px;margin:0 5px 1px 1px;
  border-right:1.5px solid #98a6bd;border-bottom:1.5px solid #98a6bd;
  transform:rotate(-45deg);transition:transform .15s;vertical-align:middle}
tr.hwr.open .tw{transform:rotate(45deg)}

/* r1181：题面 / 答案 / 讲解 三个框 —— 宽屏三框并排；中屏题面独占一行、答案与讲解左右并排；
   窄屏三框上下排。覆盖规则必须写在 .pinfo .pactrow 原始定义之后才生效。 */
.pinfo .pactrow>.pbox:first-child .pbox-btns{grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
.pinfo .pactrow>.pbox:first-child .pbox-btns .btn{padding-left:4px;padding-right:4px;font-size:12.5px}
.pinfo .pactrow>.pbox:not(:first-child) .pbox-btns{grid-template-columns:minmax(0,1fr)}
@media(max-width:1680px){
  .pinfo .pactrow{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .pinfo .pactrow>.pbox:first-child{grid-column:1 / -1}
}
@media(max-width:1180px){
  .pinfo .pactrow{grid-template-columns:minmax(0,1fr)}
  .pinfo .pactrow>.pbox:first-child{grid-column:auto}
}

/* r1184：录入定式 —— 三行：① 先手/类型/难度 ② 第 x 手·共 n 手 ③ 提示（r1192 起无标题） */
.pinfo .seqline{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--ink)}
/* r1192：数字在「第 / 手」正中间 —— 原来 text-align:right + 1.2em 让单字挤向「手」 */
.pinfo .seqline b{font-size:15px;font-weight:650;font-variant-numeric:tabular-nums;
  min-width:1.1em;text-align:center;color:#111827}
.pinfo .pblock.jseq input.stp{width:58px;max-width:58px;text-align:center;padding:3px 4px}.pinfo .pblock.jtxt .ttl{flex:1 1 120px;min-width:0;font-size:13px;padding:7px 11px}
.pinfo .pblock.jtxt .pk2{margin-left:6px}
/* 属性行永远三列（窄屏 46% 的规则会让第三个字段独占一行） */
.pinfo #jAttr .pf{flex:1 1 0;min-width:92px}
/* 提示 / 标题成组：窄屏整组换行，标签不会和输入框分家 */
.pinfo .pblock.jtxt{gap:10px 16px}
.pinfo .pblock.jtxt .jf{display:flex;align-items:center;gap:8px;flex:1 1 180px;min-width:0}
.pinfo .pblock.jtxt .jf .ttl{flex:1 1 auto;min-width:0;font-size:13px;padding:7px 11px}

/* r1185：修改题目 —— 信息卡底部放原图，摆子时对着照片核 */
.pinfo .pblock.refpic{align-items:flex-start}
.pinfo .refpic .refimg{flex:1 1 100%;display:block;background:#fff;border:1px solid var(--line);
  border-radius:10px;padding:8px;overflow:hidden}
.pinfo .refpic .refimg img{display:block;margin:0 auto;max-width:100%;max-height:460px;
  width:auto;height:auto;border-radius:6px}
/* r1186：修改题目页 —— 信息卡与棋盘同高，原图吃掉剩下那段高度，下沿跟棋盘齐平 */
.probwrap.peq{align-items:stretch}
.probwrap.peq .pinfo{display:flex;flex-direction:column}
.probwrap.peq .pinfo .refpic{flex:1 1 0;min-height:200px;display:flex;flex-direction:column;
  align-items:stretch;border-bottom:0;padding-bottom:8px}
.probwrap.peq .refpic .pk{flex:0 0 auto;margin-bottom:8px}
.probwrap.peq .refpic .refimg{flex:1 1 auto;min-height:0;display:flex;align-items:flex-end;
  justify-content:center}
.probwrap.peq .refpic .refimg img{max-width:100%;max-height:100%;width:auto;height:auto;
  object-fit:contain;object-position:center bottom}
/* 窄屏两栏本身就挤，棋盘也小 —— 退回按原图尺寸显示，不强行拉高 */
@media(max-width:1180px){
  .probwrap.peq .pinfo .refpic{flex:0 0 auto;min-height:0}
  .probwrap.peq .refpic .refimg{display:block}
  .probwrap.peq .refpic .refimg img{max-height:320px}
}
/* r1190：题目页点「xx讲解」—— 左侧棋盘那一格换成视频，尺寸与棋盘一致（正方形、同圆角） */
.probbd .expvid{position:relative;width:100%;aspect-ratio:1/1;background:#000;
  border-radius:8px;overflow:hidden}
.probbd .expvid video{display:block;width:100%;height:100%;object-fit:contain;background:#000}
.probbd .expvid-x{position:absolute;top:8px;left:8px;z-index:2;cursor:pointer;
  padding:4px 10px;border:0;border-radius:14px;background:rgba(0,0,0,.45);color:#fff;
  font-size:12px;line-height:18px;font-family:inherit;opacity:.75;transition:opacity .15s,background .15s}
.probbd .expvid-x:hover{opacity:1;background:rgba(0,0,0,.72)}
/* 播放期间棋盘 / 题图 / 录制画面都让位 */
.probbd.playing #board,.probbd.playing .solveimg,.probbd.playing .expc{display:none!important}
@media(max-width:960px){.probbd .expvid{max-width:520px;margin:0 auto}}

/* r1202：定式「修改定式」就地编辑 —— 表单自己当竖向 flex，
   原图吃掉剩余高度，下沿跟左侧棋盘齐平（.probwrap.peq 那一套的上游少了一层 flex 容器） */
.probwrap.peq .pinfo>form{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.probwrap.peq .pinfo>form>.refpic{flex:1 1 0}

/* r1299：角标 = 全站默认的「说明标记 i」（规格照 datahermit /static/style.css 的 .sup-i）：
   14px 圆环、10px/400 蓝字 #2563eb、淡蓝底 #eff6ff、描边 #93c5fd、黑体；悬停出白卡只写一段正文。
   本页只做定位覆盖（卡片贴列头右缘，免得顶出屏幕）。 */
.sup-i{position:relative;display:inline-block;width:14px;height:14px;line-height:13px;
  text-align:center;margin-left:3px;vertical-align:1px;
  font-family:"SimHei","Heiti SC","黑体","Microsoft YaHei","PingFang SC",sans-serif;
  font-size:10px;font-weight:400;font-style:normal;color:#2563eb;background:#eff6ff;
  border:1px solid #93c5fd;border-radius:50%;cursor:help;user-select:none;
  transition:color .15s,border-color .15s,background .15s}
.sup-i:hover,.sup-i:focus{color:#1d4ed8;border-color:#2563eb;background:#dbeafe;outline:none}
.sup-i-card{display:none;position:absolute;left:50%;transform:translateX(-50%);
  top:calc(100% + 9px);width:340px;padding:12px 14px;background:#fff;border:1px solid #e5e7eb;
  border-radius:10px;box-shadow:0 10px 28px rgba(15,23,42,.12);font-size:12px;line-height:1.7;
  font-weight:400;color:#4b5563;text-align:left;white-space:normal;z-index:40}
.sup-i:hover .sup-i-card,.sup-i:focus .sup-i-card{display:block}
.thq{white-space:nowrap}
.thq .sup-i-card{left:auto;right:-8px;transform:none}

/* r1300：说明卡里改回「一行一项」—— 左列标签（灰、不折行），右列说明 */
.sup-i-card .sup-tb{width:100%;border-collapse:collapse;font-size:12px;line-height:1.7}
.sup-i-card .sup-tb th{text-align:left;font-weight:400;color:#9aa3af;white-space:nowrap;
  vertical-align:top;padding:0 10px 5px 0}
.sup-i-card .sup-tb td{color:#4b5563;padding:0 0 5px;vertical-align:top}
.sup-i-card .sup-tb tr:last-child th,.sup-i-card .sup-tb tr:last-child td{padding-bottom:0}

/* r1301：说明卡视觉 —— 标题条 + 细分隔线 + 指向角标的小箭头；正文分条对齐 */
.thq .sup-i-card{width:352px;padding:0;left:auto;right:-10px;transform:none;overflow:visible}
.thq .sup-i-card::before{content:"";position:absolute;top:-5px;right:13px;width:9px;height:9px;
  background:#fbfcfe;border-left:1px solid #e5e7eb;border-top:1px solid #e5e7eb;
  transform:rotate(45deg)}
.sup-i-card .sup-hd{display:block;padding:11px 15px 9px;background:#fbfcfe;
  border-bottom:1px solid #eef0f3;border-radius:10px 10px 0 0;
  font-size:12.5px;font-weight:600;color:#1f2937;letter-spacing:.2px}
.sup-i-card .sup-bd{display:block;padding:11px 15px 13px}
.sup-i-card .sup-tb{width:100%;border-collapse:collapse;font-size:12px;line-height:1.65}
.sup-i-card .sup-tb th{width:66px;text-align:left;font-weight:400;color:#9aa3af;
  white-space:nowrap;vertical-align:top;padding:0 10px 7px 0}
.sup-i-card .sup-tb td{color:#4b5563;padding:0 0 7px;vertical-align:top}
.sup-i-card .sup-tb tr:last-child th,.sup-i-card .sup-tb tr:last-child td{padding-bottom:0}

/* r1301b：说明卡细节 —— 行间细线、更柔的描边与投影、箭头压在卡上方 */
.thq .sup-i-card{border-color:#e8ebf0;box-shadow:0 12px 32px rgba(15,23,42,.14)}
.thq .sup-i-card::before{z-index:1}
.sup-i-card .sup-bd{padding:12px 15px 14px}
.sup-i-card .sup-tb th,.sup-i-card .sup-tb td{padding-bottom:9px}
.sup-i-card .sup-tb tr+tr th,.sup-i-card .sup-tb tr+tr td{border-top:1px solid #f2f4f7;
  padding-top:9px}
.sup-i-card .sup-tb tr:last-child th,.sup-i-card .sup-tb tr:last-child td{padding-bottom:0}

/* r1303：站内确认框（.mask + .dlg，与上传弹框同款） */
.qydlg{max-width:400px;padding:20px 22px 16px}
.qydlg .qymsg{margin:0 0 18px;font-size:14px;line-height:1.7;color:#1f2937}

/* r1307：作业列表状态筛选条 */
.fseg{display:inline-flex;gap:8px;flex-wrap:wrap;align-items:center}
.fseg .btn{margin:0}

/* r1313：状态胶囊 + 圈外数值 */
.stn{font-weight:600;color:#374151;margin-left:3px;font-variant-numeric:tabular-nums;font-size:12px}
.stn.muted{color:var(--sub);font-weight:400}

/* r1315：作业看板学生名列与操作列 */
.nmcell{max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ops{white-space:nowrap}
.ops .btn.tiny{margin-right:4px}

/* r1320：题目区「已选择 N 道」 */
.pickn{font-size:12.5px;color:var(--brand);margin:0 6px;white-space:nowrap}
.pickn b{font-size:14px;font-weight:700;color:var(--brand);
  font-variant-numeric:tabular-nums}

/* r1324：提示句后的「共 N 名学生」 */
.pickhint .pickcnt{margin-left:16px;font-size:12.5px;color:var(--sub);font-weight:400}
.pickhint .pickcnt b{font-size:14px;color:var(--ink);font-weight:700;font-variant-numeric:tabular-nums}

/* r1334：作业看板「下载 / 打印」图标按钮 */
.opbtn{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;line-height:1;
  color:var(--brand);border:1px solid #dfe4ec;border-radius:7px;padding:7px 11px;
  background:#fff;text-decoration:none;white-space:nowrap}
.opbtn:hover{border-color:var(--brand);background:var(--brand-soft)}
.opbtn+.opbtn{margin-left:6px}
.opbtn .iop{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}

/* r1336：分配框内左上角的说明行 */
.assignbar .pickhint{flex:0 0 100%!important;order:-1;width:100%;margin:0;
  font-size:12px;line-height:1.55;color:#1d4ed8;text-align:left}

/* r1338：作业看板行高稍高，下载/打印按钮不挤 */
.hwtbl td{padding-top:11px;padding-bottom:11px}

/* r1340：提示弹框右上角叉 */
.qydlg{position:relative}
.qmx{position:absolute;top:4px;right:6px;border:0;background:none;cursor:pointer;
  font-size:20px;line-height:1;color:#9ca3af;padding:2px 6px;border-radius:6px}
.qmx:hover{color:#111;background:#f1f3f7}

/* r1341：分配框多行时，说明行独占、控件行不被挤出框外 */
.assignbar .evfield,.assignbar .assignflt,.assignbar .fpush{align-self:center}

/* r1342：提示弹框文案居中（qc / qm 通用） */
.qydlg .qymsg{text-align:center}

/* r1343：作业看板时间/状态两组筛选之间的分隔 */
.vgap{display:inline-block;width:1px;height:20px;background:var(--line);margin:0 6px;
  vertical-align:middle}

/* r1346：作业看板两组筛选（日期 / 状态）分组区分 */
.fgroup{display:inline-flex;align-items:center;gap:5px;padding:7px 9px;
  border-radius:9px;background:#f5f7fa;border:1px solid #eef1f5}
.fgroup .fseg{gap:5px}
.fgroup .flabel{padding:0 1px;font-size:12px}
.fgroup .btn{padding:1px 8px;font-size:11.5px;line-height:1.4;border-radius:6px}
.fgroup+.fgroup{margin-left:8px}
.fgroup .flabel{font-size:12px;color:var(--sub);white-space:nowrap;font-weight:400}

/* r1347：左侧日期组与标题的间距 */
.sec-hd .fgroup{margin-left:4px}

/* r1348：外框统一包住「说明 + 控件」两行，assignbar 退化为纯布局行 */
/* 外框：说明一行 + 控件一行，块级强制分行 */
.assignbox{display:block!important;border:1px solid #c7d2fe;border-radius:12px;
  background:#fbfcfe;padding:13px 14px 14px;margin:0 0 16px}
.assignbox>.pickhint{display:block!important;float:none!important;position:static!important;
  margin:0 0 10px!important;padding:0!important;width:auto!important;
  font-size:12px;line-height:1.55;color:#1d4ed8;text-align:left}
.assignbox>.assignbar{display:flex!important;float:none!important;
  width:auto!important;max-width:100%!important;border:0!important;background:none!important;
  padding:0!important;margin:0!important;align-items:center;flex-wrap:wrap;gap:10px}

/* r1354：日期/状态筛选器重设计 —— 外层灰底 + 内层白轨道 + 选中实心 */
.sec-hd .fgroup{display:inline-flex;align-items:center;gap:8px;padding:3px 6px 3px 9px;
  border-radius:10px;background:#f3f4f7;border:1px solid #e7eaef;min-height:36px}
.sec-hd .fgroup .flabel{font-size:12px;color:#6b7280;font-weight:500;white-space:nowrap}
.sec-hd .fgroup .fseg{display:inline-flex;align-items:center;gap:2px;background:#fff;
  border:1px solid #e7eaef;border-radius:8px;padding:2px}
.sec-hd .fgroup .btn{padding:3px 9px;font-size:12px;line-height:1.4;border:0!important;
  background:transparent!important;color:#4b5563!important;border-radius:6px;
  box-shadow:none!important;font-weight:500}
.sec-hd .fgroup .btn:hover{background:#eef1f5!important;color:#111!important}
.sec-hd .fgroup .btn.primary{background:var(--brand)!important;color:#fff!important;
  font-weight:600}
.sec-hd .fgroup .btn.primary:hover{background:var(--brand)!important;color:#fff!important}

/* r1355：筛选器只留白轨道，轨道高度与「一键提醒」一致 */
.sec-hd .fgroup{display:inline-flex;align-items:center;gap:8px;padding:0!important;
  background:none!important;border:0!important;border-radius:0;min-height:0!important}
.sec-hd .fgroup .fseg{display:inline-flex;align-items:center;gap:2px;background:#fff;
  border:1px solid #e6e8ec;border-radius:9px;padding:4px;min-height:38px;
  box-shadow:0 1px 2px rgba(16,24,40,.05)}
.sec-hd .fgroup .btn{padding:6px 12px;font-size:12.5px;line-height:1.3;border:0!important;
  background:transparent!important;color:#4b5563!important;border-radius:7px;
  box-shadow:none!important;font-weight:500}
.sec-hd .fgroup .btn:hover{background:#eef1f5!important;color:#111!important}
.sec-hd .fgroup .btn.primary{background:var(--brand)!important;color:#fff!important;
  font-weight:600}
.sec-hd .fgroup .btn.primary:hover{background:var(--brand)!important;color:#fff!important}

/* r1358：定式页说明与控件同一行（说明压成小字，占左侧） */
.assignbox.compact{display:flex!important;align-items:center;gap:14px;flex-wrap:wrap;
  padding:10px 12px}
.assignbox.compact .pickcnt{margin-left:8px}
.assignbox.compact>.pickhint{flex:0 1 auto;max-width:46%;min-width:0;margin:0!important;
  font-size:11.5px;line-height:1.5;color:#1d4ed8}
.assignbox.compact>.assignbar{flex:0 1 auto;min-width:0}
.assignbox.compact .pickcnt{color:var(--brand)}
.assignbox.compact .pickcnt b{color:var(--brand);font-size:13px}

/* r1361：分析页 KPI 卡 + 正确率进度条 */
.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:12px;margin-bottom:16px}
.kpi{border:1px solid var(--line);border-radius:12px;padding:14px 16px;background:#fff}
.kpi .k{font-size:12px;color:var(--sub)}
.kpi .v{font-size:26px;font-weight:700;color:var(--ink);line-height:1.15;margin-top:4px;
  font-variant-numeric:tabular-nums}
.kpi .v small{font-size:13px;font-weight:500;color:var(--sub);margin-left:2px}
.rbar{display:flex;align-items:center;gap:8px;min-width:130px}
.rbar .tr{flex:1;height:6px;border-radius:3px;background:#eef1f5;overflow:hidden}
.rbar .fl{display:block;height:100%;border-radius:3px;background:#10b981}
.rbar .pc{font-size:12px;font-variant-numeric:tabular-nums;color:#4b5563;
  min-width:42px;text-align:right}
.rbar.mid .fl{background:#f59e0b}
.rbar.low .fl{background:#ef4444}

/* r1362：学生姓名首字头像 */
.sname{display:inline-flex;align-items:center;gap:8px}
.rbar{display:inline-flex}

/* r1363：定式页控件行等分、标签右对齐 */
.assignbox.compact>.assignbar{flex:1 1 auto;min-width:0}
.assignbox.compact .assignbar .evfield{flex:1 1 0;min-width:0}
.assignbox.compact .assignbar .flabel{min-width:44px;text-align:right;
  justify-content:flex-end;display:inline-flex}
.assignbox.compact .assignbar .msel{flex:1 1 0;min-width:0;display:block}
.assignbox.compact .assignbar .msel-btn{min-width:0!important;width:100%;max-width:none}
.assignbox.compact .assignbar .pfilter{flex:1 1 0;min-width:0;display:flex;gap:12px}
.assignbox.compact .assignbar .fpush{flex:none}

/* r1364：KPI 小号文字值 + 表格 hover */
.kpi .v.sm{font-size:17px;line-height:1.35;font-weight:600}
.tbl tbody tr:hover>td{background:#f7f9fc}

/* r1366：双正确率角标 + 两列布局 + 口径说明块 */
.sup{display:inline-block;margin-left:2px;font-size:9.5px;line-height:1;padding:1px 3px;
  border-radius:4px;background:#eef2fb;color:var(--brand);vertical-align:super;
  font-weight:600}
.cols2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:900px){.cols2{grid-template-columns:1fr}}
.note-box{margin-top:12px;padding:12px 14px;border:1px solid var(--line);
  border-radius:10px;background:#fbfcfe;font-size:12px;line-height:1.7;color:#4b5563}
.note-box b{color:#1f2937}
.kpi .ksub{font-size:11.5px;color:var(--sub);margin-top:2px}

/* r1369：作业看板标签列与表头对齐（标签内 padding 会右移 8px） */
.hwtbl td .tag{vertical-align:middle;line-height:1.35}
/* r1513：td.tags 原为 display:flex，flex 容器把标签居中于整行；相邻的题型列是 table-cell，按单元格中线对齐，两者基准差 ~5.8px，看着每行都歪。td.tags 改回 table-cell，恢复同一套垂直对齐。 */
td.tags{display:table-cell}
td.tags>.tag{margin-right:6px}
.hwtbl td .tag:first-child{margin-left:0}

/* r1370：定式页「已选择」改黑色；学生下拉撑满格子 */
.assignbox.compact .pickcnt{color:var(--ink)}
.assignbox.compact .pickcnt b{color:var(--ink);font-size:13px}
.assignbox.compact .assignbar .msel{flex:1 1 auto!important;width:100%!important;
  max-width:none!important;display:block}
.assignbox.compact .assignbar .msel-btn{width:100%!important;min-width:0!important;
  max-width:none!important}

/* r1371：角标 i + 悬浮说明卡 */
.sup{position:relative;cursor:help}
.supcard{display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:60;
  width:250px;padding:10px 12px;background:#fff;border:1px solid var(--line);
  border-radius:9px;box-shadow:0 8px 24px rgba(16,24,40,.14);font-size:12px;
  line-height:1.65;color:#4b5563;text-align:left;font-weight:400;white-space:normal}
.sup:hover .supcard{display:block}
.supcard b{color:#1f2937}

/* r1373：全选 / 清空 按钮 */
.pickops{display:inline-flex;align-items:center;gap:6px;margin-left:0}
.pickops.rt{margin-left:auto}
.sortgrp{display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.pickops.rt{margin-left:10px}
.sortlb{font-size:12px;color:var(--sub)}
.pbtn.on{border-color:var(--brand);color:var(--brand);background:#f5f8ff;font-weight:600}
.assignhd{flex-wrap:wrap;row-gap:8px}
.pbtn{display:inline-flex;align-items:center;gap:4px;font:inherit;font-size:12px;
  line-height:1;padding:5px 9px;border:1px solid var(--line);border-radius:7px;
  background:#fff;color:var(--sub);cursor:pointer}
.pbtn:hover{border-color:var(--brand);color:var(--brand);background:#f5f8ff}
.pbtn:active{transform:translateY(1px)}
.pbtn .i16{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round}

/* r1377：按棋力人数分布条形图 */
.lvbox{display:flex;flex-direction:column;gap:9px}
.lvrow{display:grid;grid-template-columns:54px 1fr 108px 62px;align-items:center;gap:10px}
.lvname{font-size:12.5px;color:#4b5563;text-align:right;white-space:nowrap}
.lvtrack{height:12px;border-radius:6px;background:#eef1f5;overflow:hidden}
.lvfill{display:block;height:100%;border-radius:6px;
  background:linear-gradient(90deg,#9db9f7,#5b8def)}
.lvcnt{font-size:12px;color:#1f2937;font-variant-numeric:tabular-nums}
.lvcnt em{font-style:normal;color:var(--sub);margin-left:6px;font-size:11.5px}
.lvacc{font-size:12px;color:#4b5563;font-variant-numeric:tabular-nums;text-align:right}
@media(max-width:640px){.lvrow{grid-template-columns:46px 1fr 88px 54px;gap:8px}}

/* r1378：棋力人数竖向柱状图（占左半侧） */
.vchart{width:50%;min-width:260px;display:flex;align-items:flex-end;gap:10px;
  height:190px;padding:22px 4px 24px;border-bottom:1px solid #e5e7eb;position:relative}
.vbar{flex:1 1 0;height:100%;display:flex;flex-direction:column;justify-content:flex-end;
  align-items:center;position:relative;min-width:0}
.vbar i{display:block;width:100%;max-width:44px;border-radius:5px 5px 0 0;
  background:linear-gradient(180deg,#8fb3f7,#4b7bec);min-height:3px;
  transition:filter .15s}
.vbar:hover i{filter:brightness(1.06)}
.vbar .vv{font-size:12px;font-weight:600;color:#1f2937;margin-bottom:5px;
  font-variant-numeric:tabular-nums}
.vbar em{position:absolute;bottom:-21px;font-style:normal;font-size:11.5px;
  color:var(--sub);white-space:nowrap}
@media(max-width:760px){.vchart{width:100%}}

/* r1379：SVG 柱状图（专业数据看板风格） */
.chartbox{width:33.33%;min-width:240px}
.barsvg{width:100%;height:auto;display:block;overflow:visible}
.barsvg .gline{stroke:#eef1f5;stroke-width:1}
.barsvg .glab{fill:#9aa3af;font-size:10px;font-variant-numeric:tabular-nums}
.barsvg .gbar{fill:#4b7bec;transition:fill .15s}
.barsvg .gbar:hover{fill:#3563cf}
.barsvg .gval{fill:#1f2937;font-size:11px;font-weight:600;font-variant-numeric:tabular-nums}
.barsvg .gcat{fill:#6b7280;font-size:11px}
@media(max-width:760px){.chartbox{width:100%}}

/* r1385：性别比例环形图 */
.donutbox{display:flex;align-items:center;gap:22px;width:33.33%;min-width:240px}
.donut{width:132px;height:132px;flex:none}
.donut .dnval{fill:#1f2937;font-size:17px;font-weight:700;font-variant-numeric:tabular-nums}
.dnlegend{display:flex;flex-direction:column;gap:8px}
.dnrow{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:#4b5563}
.dnrow b{color:#1f2937;font-variant-numeric:tabular-nums}
.dnrow em{font-style:normal;color:var(--sub);font-size:11.5px;margin-left:2px}
.dncM{width:8px;height:8px;border-radius:2px;background:#4b7bec;display:inline-block}
.dncF{width:8px;height:8px;border-radius:2px;background:#e0798f;display:inline-block}
.dncX{width:8px;height:8px;border-radius:2px;background:#c9ced6;display:inline-block}
@media(max-width:760px){.donutbox{width:100%}}

/* r1386：年龄比例图例色块 1~6 */
.dnc1{width:8px;height:8px;border-radius:2px;background:#4b7bec;display:inline-block}
.dnc2{width:8px;height:8px;border-radius:2px;background:#e0798f;display:inline-block}
.dnc3{width:8px;height:8px;border-radius:2px;background:#5ec2b5;display:inline-block}
.dnc4{width:8px;height:8px;border-radius:2px;background:#f0b429;display:inline-block}
.dnc5{width:8px;height:8px;border-radius:2px;background:#9b8cf0;display:inline-block}
.dnc6{width:8px;height:8px;border-radius:2px;background:#c9ced6;display:inline-block}

/* r1388：人数分布三图并排 */
.distrow{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px}
.distcol{min-width:0}
.disttl{font-size:12px;color:#6b7280;margin-bottom:10px;font-weight:500}
.distcol .chartbox{width:100%}
.donutbox.mini{width:100%;min-width:0;display:flex;flex-direction:column;align-items:center;
  gap:12px}
.donutbox.mini .donut{width:116px;height:116px}
.donutbox.mini .dnlegend{width:100%}
@media(max-width:860px){.distrow{grid-template-columns:1fr}}

/* r1389：环形图各段百分比标在弧上 */
.donut .dnseg{fill:#fff;font-size:9.5px;font-weight:700;
  paint-order:stroke;stroke:rgba(0,0,0,.12);stroke-width:1.2px}

/* r1390：图表视觉重做 */
.barsvg .gline{stroke:#eef1f4;stroke-width:1}
.barsvg .gbase{stroke:#dfe4ea;stroke-width:1}
.barsvg .glab{fill:#a0a8b4;font-size:10px;font-variant-numeric:tabular-nums}
.barsvg .gbar{fill:#3f6fe0}
.barsvg .gbar:hover{fill:#2f5bc4}
.barsvg .gval{fill:#1f2937;font-size:11.5px;font-weight:600;font-variant-numeric:tabular-nums}
.barsvg .gcat{fill:#77808c;font-size:11px}
.donut .dnval{fill:#111827;font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;
  letter-spacing:-.5px}
.donut .dnunit{fill:#9aa3af;font-size:10.5px}
.donut .dnseg{fill:#fff;font-size:10px;font-weight:700}
.donutbox.mini .donut{width:148px;height:148px}
.donutbox.mini{gap:14px}
.dnrow{font-size:12.5px;line-height:1.5}
.disttl{font-size:12px;color:#8b93a1;margin-bottom:14px;font-weight:500;letter-spacing:.02em}
.distrow{gap:28px}

/* r1391：棋力横向条形图 */
.hbars{display:flex;flex-direction:column;gap:7px}
.hrow{display:grid;grid-template-columns:44px 1fr 28px;align-items:center;gap:9px}
.hname{font-size:11.5px;color:#77808c;text-align:right;white-space:nowrap}
.htrack{height:8px;border-radius:4px;background:#f1f3f7;overflow:hidden}
.hfill{display:block;height:100%;border-radius:4px;background:#3f6fe0;min-width:3px}
.hrow:hover .hfill{background:#2f5bc4}
.hval{font-size:11.5px;color:#1f2937;font-weight:600;font-variant-numeric:tabular-nums;
  text-align:right}
.distcol{align-self:start}

/* r1392：三图第二轮打磨 —— 环图与图例并排、条更细、字号统一 */
.donutbox.mini{flex-direction:row;align-items:center;gap:16px;width:100%}
.donutbox.mini .donut{width:136px;height:136px;flex:none}
.donutbox.mini .dnlegend{flex:1 1 auto;min-width:0;gap:7px}
.dnrow{font-size:12px;line-height:1.45;white-space:nowrap}
.dncM,.dncF,.dncX,.dnc1,.dnc2,.dnc3,.dnc4,.dnc5,.dnc6{
  width:9px;height:9px;border-radius:2px;flex:none}
.donut .dnseg{font-size:9.5px;font-weight:700}
.hbars{gap:8px}
.htrack{height:9px;border-radius:5px}
.hfill{border-radius:5px;background:#5b8def}
.hrow:hover .hfill{background:#3f6fe0}
.hname{color:#8b93a1}
.hval{color:#374151}
.distrow{gap:32px;align-items:start}

/* r1393：环形加宽，百分比落位稳定；三列顶部对齐统一 */
.donutbox.mini .donut{width:140px;height:140px}
.donut .dnseg{font-size:9px;letter-spacing:0}
.distcol{min-height:200px}
.distcol .hbars{padding-top:2px}

/* r1394：三列垂直居中 + 环上数字加大 */
.distrow{align-items:center}
.donut .dnseg{font-size:10px}
.distcol{min-height:0}

/* r1395：图表配色对齐 datahermit（blue-600 / slate） */
.hfill{background:#2563eb}
.hrow:hover .hfill{background:#1d4ed8}
.hname{color:#64748b}
.hval{color:#0f172a}
.htrack{background:#f1f5f9}
.disttl{color:#64748b;font-weight:500}
.dnrow{color:#64748b}
.dnrow b{color:#0f172a}
.donut .dnval{fill:#0f172a}
.donut .dnunit{fill:#94a3b8}
.barsvg .gline{stroke:#e2e8f0}
.barsvg .gbase{stroke:#cbd5e1}
.barsvg .glab{fill:#94a3b8}
.barsvg .gbar{fill:#2563eb}
.barsvg .gval{fill:#0f172a}
.barsvg .gcat{fill:#64748b}
.dncM,.dnc1{background:#2563eb}
.dncF,.dnc2{background:#ec7ba8}
.dnc3{background:#34d399}
.dnc4{background:#fbbf24}
.dnc5{background:#a78bfa}
.dnc6,.dncX{background:#cbd5e1}

/* r1396：环再加宽，百分比不压边 */
.donutbox.mini .donut{width:144px;height:144px}
.donut .dnseg{font-size:9.5px}

/* r1397：图表联动筛选 */
.fbar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 12px;font-size:12px;
  color:#64748b}
.ftag{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;
  background:#eff6ff;color:#2563eb;font-size:12px;text-decoration:none;border:1px solid #dbeafe}
.ftag b{margin-left:2px;font-weight:600;color:#94a3b8}
.ftag:hover{background:#dbeafe}
.fclear{margin-left:6px;font-size:12px;color:#94a3b8;text-decoration:none}
.fclear:hover{color:#2563eb}
.dseg{cursor:pointer;transition:opacity .15s}
.dseg:hover{opacity:.85}
.dseg.on{stroke-width:31}
.gbar{cursor:pointer}
.gbar.on{fill:#1d4ed8}

/* r1400：定式列表分页 */
.pager{display:flex;align-items:center;gap:10px;margin:14px 0 4px;font-size:12.5px;
  color:#64748b}
.pager .pbtn{padding:4px 10px;border:1px solid var(--line);border-radius:6px;
  background:#fff;color:#374151;text-decoration:none}
.pager .pbtn:hover{border-color:#2563eb;color:#2563eb}

/* r1401：定式详情页大棋盘（服务端 SVG，带落点字母） */
.probbd .bigbd{width:420px;max-width:100%}
.probbd .bigbd .gb-svg{width:100%;height:auto}

/* r1402：环形居中 + 图例居中；配色黑灰蓝 */
.donutbox.mini{flex-direction:row;align-items:center;justify-content:center;gap:14px}
.donutbox.mini .dnlegend{width:auto;align-items:flex-start}
.dncM,.dnc1{background:#2563eb}
.dncF,.dnc2{background:#94a3b8}
.dnc3{background:#374151}
.dnc4{background:#60a5fa}
.dnc5{background:#cbd5e1}
.dnc6,.dncX{background:#d1d5db}

/* r1405：定式详情大棋盘强制尺寸（覆盖 recbd 的 84px） */
.probbd .bigbd{width:440px!important;max-width:100%}
.probbd .bigbd .gb-svg{width:100%!important;height:auto!important}

/* r1406：详情页大棋盘（.gb-svg.bigbd 自身即目标） */
.probbd .gb-svg.bigbd{width:100%!important;max-width:100%!important;height:auto!important}

/* r1407：详情页棋盘外框不能是 34px（列表缩略图口径） */
.probbd .minibd{width:100%!important;max-width:100%!important}

/* r1408：定式详情棋盘与题目页统一（不强制 px，按容器宽度自适应） */
.probbd .gb-svg.bigbd{width:100%!important;max-width:100%!important;height:auto!important}

/* r1417：统计页 KPI 栅格 + 条形图（定式分析） */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:0 0 18px}
.kpis .kpi b{display:block;font-size:24px;line-height:1.2;color:#0f172a}
.kpis .kpi span{font-size:12px;color:#64748b}
.barrow{display:flex;align-items:center;gap:8px;margin:7px 0;font-size:12.5px}
.barrow .bl{width:46px;color:#64748b;flex:none}
.barrow .bar{height:9px;background:#2563eb;border-radius:4px;min-width:2px}
.barrow .bv{color:#374151;font-variant-numeric:tabular-nums}

/* r1420：AI 胜率列 */
.aiwr{font-variant-numeric:tabular-nums}
.aiwr.hi{color:#b91c1c}
.aiwr.lo{color:#15803d}

/* r1424：每手 AI 对照 */
.aimv-tbl td{font-variant-numeric:tabular-nums}
.aimv.bad{color:#b91c1c;font-weight:600}
.aimv.warn{color:#0f6e56}
.aimv.ok{color:#15803d}

/* r1425：列表分页 */
.pager{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 4px}
.pager .pgnow{font-size:12.5px;color:#64748b}
.pager .disabled{opacity:.4;pointer-events:none}

/* r1427：柱状图类目密集时缩小字号 */
.barsvg.dense .gcat{font-size:8.5px}
.barsvg.dense .gval{font-size:8.5px}

/* r1428：定式库行高与题库对齐（r1464 废止：这里 height:56px 特异性 (0,2,2) 高于
   r1429 的 tr.jrow td (0,1,2)，把行高钉死在 56；max-height:52px 也把缩略图撑高。
   题库行实高 45（40 缩略图 + 2×2 padding + 1 边框），定式按同一套算，见 r1429/r1435） */

/* r1429：题库/定式库一屏 12 题，行高压缩 */
tr.qrow td,tr.jrow td{height:44px;padding:2px 6px;line-height:1.2}
tr.qrow .minibd,tr.qrow .minibd svg,tr.qrow .minibd img{height:40px;width:40px}
tr.qrow .minibd svg{display:block}
tr.qrow td .minilink{font-size:12.5px}

/* r1430：题库缩略图垂直居中 */
tr.qrow td{vertical-align:middle}
tr.qrow td .minibd{display:inline-flex;align-items:center;justify-content:center;height:40px;vertical-align:middle}
tr.qrow td .minibd svg,tr.qrow td .minibd img{display:block;margin:0}

/* r1435：定式库行高与题库完全对齐 —— 定式缩略图跟题库一样压到 40px。
   定式的 svg 带内联 style="width:84px"，样式表普通声明压不住，必须 !important。 */
tr.jrow td{vertical-align:middle}
tr.jrow td .minibd{display:inline-flex;align-items:center;justify-content:center;
  height:40px;width:40px;min-height:0;vertical-align:middle}
tr.jrow td .minibd,tr.jrow td .minibd svg,tr.jrow td .minibd img{
  height:40px!important;width:auto!important;max-width:40px!important;min-height:0!important}
tr.jrow td .minibd svg{display:block;margin:0}
tr.jrow td .minibd img.pthumb{width:40px!important;object-fit:contain}
tr.jrow td.htd{max-height:44px;overflow:hidden}
/* r1436：题库列表筛选条里的难度下拉（与 fseg 按钮同高同白底） */
.sec-hd .fgroup .fselwrap{display:inline-flex;align-items:center;background:#fff;
  border:1px solid #e6e8ec;border-radius:9px;padding:4px;min-height:38px;
  box-shadow:0 1px 2px rgba(16,24,40,.05)}
.sec-hd .fgroup .fsel{border:0;background:transparent;outline:none;cursor:pointer;
  font-size:12.5px;color:#4b5563;padding:6px 6px;border-radius:7px;max-width:132px}
.sec-hd .fgroup .fsel:hover{background:#eef1f5}

/* r1441：题库列表「状态」列圆点 —— 灰=来自题库 / 蓝=AI 修正 / 红=精选 */
/* r1444：状态圆点改内联 SVG（矢量圆，任意缩放/高分屏都锐利），13px 带 1px 描边 */
.stdots{display:inline-flex;align-items:center;gap:7px}
.stdots svg.st-d{display:block;flex:0 0 auto;overflow:visible}
/* r1443：备注行位置/配色同作业页「班级、学生」提示（pickhint 蓝字） */
.sec>.pickhint{margin:0 0 10px 2px;font-size:12px;line-height:1.55;color:#1d4ed8;text-align:left}
.sec-hd .fgroup .msel{display:inline-block;flex:none}
.sec-hd .fgroup .msel-btn{min-width:132px;max-width:200px;min-height:38px;
  padding:6px 11px;font-size:12.5px;border-radius:9px}
.sec-hd .fgroup .msel-txt{font-size:12.5px}
.sec-hd .fgroup .msel-pop{width:244px}

/* r1445：题库筛选条 —— 四个下拉统一成作业页 .msel（白底按钮 + 弹出勾选），
   .fgroup 之前是纯 span，标签和控件的基线对齐，看起来整体偏上，这里改成 flex 居中。 */
.sec-hd .fgroup{display:inline-flex;align-items:center;gap:8px}
.sec-hd .fgroup .flabel{line-height:1.2}
.sec-hd .fgroup .msel{display:inline-block;vertical-align:middle}
.sec-hd .fgroup .msel-btn{min-height:34px;padding:0 11px;font-size:12.5px;
  min-width:118px;max-width:190px;border-radius:9px}
.sec-hd .fgroup .msel-arrow{margin-left:2px}
.sec>.pickhint{display:flex;align-items:center;min-height:32px;padding:0 2px;margin:12px 0 2px}


/* r1450：题库筛选器加到 6 组（难度/题型/来源/状态/答案/讲解）后，页头一行放不下，
   原来按钮被压窄、文字折成两行。这里把页头拆成两块：.fbar 允许折行、.fbtns 不缩不折。 */
.sec-hd.flex:has(>.fbar){flex-wrap:wrap;row-gap:10px}
.sec-hd.flex>.fbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px;row-gap:8px;
  flex:0 1 auto;min-width:0}
.sec-hd.flex>.fbtns{display:flex;align-items:center;gap:10px;flex:0 0 auto}
.sec-hd.flex>.fbtns .btn{flex:0 0 auto;white-space:nowrap}
.sec-hd.flex .btn{white-space:nowrap}
.sec-hd.flex>.fbar .fgroup{flex:0 1 auto;min-width:0}
.sec-hd.flex>.fbar .msel-btn{min-width:92px;max-width:170px}
/* r1450b：1440 屏上「6 组筛选 + 重置/录入/上传」差 40px 放不进一行，收紧组内留白与按钮内边距 */
.sec-hd.flex>.fbar{gap:8px}
.sec-hd.flex>.fbar .fgroup{padding:2px 5px 2px 8px}
.sec-hd.flex>.fbar .msel-btn{min-width:86px;padding:0 8px}


/* r1453：题目页筛选区 —— 照「分配题目」页那只外框（浅底 + 淡紫边 + 圆角），
   说明一行在上，六个筛选与三个按钮同行，按钮靠右。 */
.qfltbox{display:block;border:1px solid #c7d2fe;border-radius:12px;
  background:#fbfcfe;padding:13px 14px 14px;margin:16px 18px 2px}
.qfltbox>.pickhint{margin:0 0 10px;padding:0;font-size:12px;line-height:1.55;
  color:#1d4ed8;text-align:left;min-height:0}
.qfltbox>.qbar{display:flex;align-items:center;
  gap:10px 14px;flex-wrap:wrap;width:auto;max-width:100%;border:0;background:none;
  padding:0;margin:0}
.qfltbox .evfield{display:inline-flex;align-items:center;gap:6px;flex:none;
  white-space:nowrap}
.qfltbox .evfield>.flabel{flex:none;font-size:13px;font-weight:400;color:#6b7280}
.qfltbox .msel{display:inline-block;flex:none}
.qfltbox .msel-btn{min-width:84px;max-width:170px;height:34px;padding:0 10px;
  font-size:13px;border:1px solid var(--line);background:#fff}
.qfltbox .fsp{flex:1 1 0;min-width:0}
.qfltbox .fbtns{display:flex;align-items:center;gap:8px;flex:none}
.qfltbox .fbtns .btn{white-space:nowrap}

/* r1459：胜率字段的参数角标 */
.wrpar{display:inline-block;margin-left:5px;padding:0 5px;border:1px solid #c7d2fe;
  border-radius:8px;background:#eef2ff;color:#1d4ed8;font-size:11px;font-weight:600;
  line-height:15px;vertical-align:2px;cursor:help;white-space:nowrap}

/* r1459：表头可排序（胜率 / 上传时间）—— 点一下按该列排，再点一下换方向 */
table.tbl th>a.thsort{display:inline-flex;align-items:center;gap:3px;
  color:inherit;text-decoration:none;cursor:pointer;white-space:nowrap}
table.tbl th>a.thsort:hover{color:#1d4ed8}
table.tbl th>a.thsort .sarrow{font-size:10px;line-height:1;color:#b6bfcd}
table.tbl th>a.thsort.on{color:#1d4ed8!important}
table.tbl th>a.thsort.on .sarrow{color:#1d4ed8}

/* r1467：可排序列头 + 数值列对齐（照 datahermit /system/category-summary） */
table.tbl th.num{text-align:right}
table.tbl th.num>a.thsort{justify-content:flex-end}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums}

/* r1475 定式详情：原书注释（按手顺列出，当前局面高亮） */
.rnnav{display:flex;align-items:center;margin:0 0 8px}
/* r1476：注释区宽度跟着外框走（原来被挤在半列里），高度不再锁死 300px */
.pinfo .pblock.rnpb{align-items:flex-start}
.pinfo .pblock.rnpb>.rnnav,.pinfo .pblock.rnpb>.rnlist{flex:1 1 100%;width:100%;min-width:0}
.rnnav{flex-wrap:wrap}
.rnlist{max-height:none;overflow:visible;border:1px solid #e6e6e6;border-radius:6px;padding:4px 10px;background:#fcfcfc;box-sizing:border-box}
.rnitem{padding:7px 4px;border-bottom:1px dashed #ececec;font-size:13px;line-height:1.6;color:#333}
.rnitem:last-child{border-bottom:0}
.rnitem.on{background:#eef4ff;border-radius:4px}
.rnstep{display:block;color:#1d4ed8;font-weight:600;font-size:12px;margin-bottom:2px}
.rnbody{white-space:normal;word-break:break-word}

/* r1482：翻页条四个按钮 + 中间的状态文字，统一间距 */
.rnnav{display:flex;align-items:center;gap:6px;margin:0 0 8px;flex-wrap:wrap}
.rnnav .btn{padding:3px 10px;font-size:12px}
.rnnav .muted{margin:0 2px;font-size:12px}
.rnitem.on{background:transparent}

/* r1483：学生分布三图在各自列内水平居中（图例 flex-grow 会把整组推左） */
.distcol{text-align:center}
.distcol .disttl{text-align:center}
.distcol>.barsvg{display:block;margin:0 auto}
.distcol .donutbox.mini{flex-direction:row;flex-wrap:wrap;align-items:center;
  justify-content:center;gap:10px 14px}
.distcol .donutbox.mini .donut{flex:none}
.distcol .donutbox.mini .dnlegend{flex:0 0 auto;width:auto;min-width:0;gap:6px;
  align-items:flex-start;text-align:left}

/* r1485：学生分布四列（新增姓名列表）；环图描边不再被切边 */
.distrow{grid-template-columns:repeat(4,minmax(0,1fr));gap:20px}
.distcol>.barsvg{width:100%;max-width:100%;height:auto}
.distcol .donutbox.mini .donut{width:126px;height:126px}
.distcol .namelist{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;
  align-content:flex-start;width:100%;max-height:176px;overflow:auto;padding:2px}
.nmchip{font-size:12px;line-height:1.55;padding:2px 9px;border-radius:999px;
  background:#f1f5f9;color:#334155;white-space:nowrap}
.nmchip:hover{background:#e2e8f0;color:#2563eb}
@media(max-width:1280px){.distrow{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* r1483：图注（A 于第 8 手处 / 第 12 手于第 2 手处），放在注释框内、注释下方 */
.rnnote{margin-top:6px;padding:6px 8px;border-top:1px dashed #e6e6e6;font-size:12px;line-height:1.7;color:#5b6b7c}

/* r1485b：四列下让环图与图例在 1440 屏也并排（收窄环、缩字距） */
.distcol .donutbox.mini{gap:8px 10px}
.distcol .donutbox.mini .donut{width:118px;height:118px}
.distcol .donutbox.mini .dnlegend{gap:5px}
.distcol .dnrow{font-size:11.5px;gap:5px}

/* r1485c：四列配比 + 姓名列表按整行高度滚动（不留半行） */
.distrow{grid-template-columns:1.15fr 1fr 1.05fr 1.08fr}
.distcol .namelist{max-height:166px;overflow-y:auto;scrollbar-width:thin}
.distcol .namelist::-webkit-scrollbar{width:6px}
.distcol .namelist::-webkit-scrollbar-thumb{background:#d5dbe3;border-radius:3px}
.nmchip{line-height:1.5;padding:2px 9px}

/* r1485d：姓名列表高度对齐整 6 行（22px chip + 6px gap），不出现半行 */
.distcol .namelist{max-height:162px}

/* r1485e：窄于 1400 时四列改 2×2，避免环图图例被挤到环下方 */
@media(max-width:1399px){.distrow{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* r1485f：2×2 时柱图不放大，按原尺寸上限居中 */
.distcol>.barsvg{max-width:340px}

/* r1486：学生分布标题右侧「重置」；姓名列表不设上下拉条（写不下即省略） */
.sec-hd.flex .distreset{margin-left:auto;font-size:12.5px;font-weight:400;color:#94a3b8;
  text-decoration:none;padding:3px 10px;border:1px solid var(--line);border-radius:6px;
  line-height:1.4}
.sec-hd.flex .distreset:hover{color:#2563eb;border-color:#bfd4fb;background:#f8fafc}
.distcol .namelist{max-height:162px;overflow:hidden;scrollbar-width:none}
.distcol .namelist::-webkit-scrollbar{display:none}

/* r1487：姓名列表溢出时右下角显示省略号 */
.distcol .namelist{position:relative}
.distcol .namelist.more::after{content:"…";position:absolute;right:0;bottom:0;
  padding:1px 7px 2px;background:#fff;color:#94a3b8;font-size:14px;font-weight:700;
  line-height:1;border-radius:4px}

/* r1487：三图作筛选器 —— 选中段加重，其余变淡 */
.distrow.hasf .dseg{opacity:.22;transition:opacity .15s}
.distrow.hasf .dseg.on{opacity:1;stroke-width:34}
.distrow.hasf .gbar{opacity:.22;transition:opacity .15s}
.distrow.hasf .gbar.on{opacity:1;fill:#1d4ed8}
.distrow.hasf .gval{opacity:.4}
.distrow.hasf .hfill{opacity:.25}

/* r1487b：柱顶数值不跟着变淡（只淡化柱体） */
.distrow.hasf .gval{opacity:1}

/* r1487c：只有该维度真有选中时才淡化其余项，未筛选的图保持原样 */
.distrow.haslv .gbar{opacity:.2;transition:opacity .15s}
.distrow.haslv .gbar.on{opacity:1;fill:#1d4ed8}
.distrow.hasgd .dseg[data-f="gd"]{opacity:.2;transition:opacity .15s}
.distrow.hasgd .dseg[data-f="gd"].on{opacity:1;stroke-width:34}
.distrow.hasag .dseg[data-f="ag"]{opacity:.2;transition:opacity .15s}
.distrow.hasag .dseg[data-f="ag"].on{opacity:1;stroke-width:34}

/* r1488：四图各自外框 + 整行外框，边界清楚后「环贴边」不再像被裁 */
.distrow{background:#f8fafc;border:1px solid var(--line);border-radius:12px;
  padding:14px;gap:14px}
.distcol{background:#fff;border:1px solid #e8ecf2;border-radius:10px;
  padding:12px 10px 10px;min-width:0}
.distcol .disttl{margin-bottom:10px}
.distcol .namelist{max-height:150px}

/* r1488b：某维无数据时框内不至于空白 */
.distcol .dempty{font-size:12.5px;color:#94a3b8;padding:26px 0}

/* r1488d：四列有框后收一点内边距，保证 1440 屏环与图例仍并排 */
.distcol{padding:10px 6px 8px}
.distcol .donutbox.mini{gap:4px 6px}
.distcol .donutbox.mini .donut{width:110px;height:110px}
.distcol .donutbox.mini .dnlegend{gap:4px}

/* r1488e：姓名列表恢复 6 行整高（22+6 网格），不留半行 */
.distcol .namelist{max-height:162px}

/* r1488f：姓名列表固定 5 行整（134px）+ 底部渐隐，省略号落在右下角不压字 */
.distcol .namelist{max-height:138px}
.distcol .namelist.more::after{right:0;bottom:2px;padding:0 6px 0 18px;
  background:linear-gradient(90deg,rgba(255,255,255,0),#fff 45%)}

/* r1488g：省略号放到列卡右下角，不压姓名 */
.distcol{position:relative}
.distcol .namelist{max-height:134px}
.distcol .namelist.more::after{content:none}
.distcol.hasmore::after{content:"…";position:absolute;right:9px;bottom:4px;color:#94a3b8;
  font-size:14px;font-weight:700;line-height:1}

/* r1488h：列卡底部留白，省略号落在留白里，彻底不压姓名 */
.distcol{padding-bottom:22px}

/* r1491：省略号改为右下角圆形按钮，「…」在按钮内居中；被盖住的姓名直接不显示 */
.distcol.hasmore::after{content:"…";position:absolute;right:9px;bottom:5px;
  width:20px;height:20px;border-radius:50%;background:#eef2f7;color:#64748b;
  font:700 13px/1 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;
  display:flex;align-items:center;justify-content:center;
  padding:0 0 2px;letter-spacing:0;box-sizing:border-box}

/* r1491：「…」圆形按钮落在列卡底部留白里（与列表不相交），不被盖住的姓名全部显示 */
.distcol{padding-bottom:26px}
.distcol.hasmore::after{right:9px;bottom:6px;width:18px;height:18px;
  font-size:12px;padding:0 0 2px}

/* r1491b：把「…」在圆内上移，视觉居中（实测低 1.5px） */
.distcol.hasmore::after{padding:0 0 5px}

/* r1492：学生分布四卡照「母基金与拟合净值」卡样式 —— 标题左对齐 + 文字下划线 +
   标题下横线；同行四卡等宽、等高（取消 align-self:start / align-items:center） */
.distrow{grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;align-items:stretch}
.distcol{align-self:stretch;display:flex;flex-direction:column}
.distcol .disttl{text-align:left;font-size:13px;font-weight:500;color:#6b7280;
  line-height:1.5;padding:0 0 8px;margin:0 0 14px;border-bottom:1px solid #e2e8f0;
  text-decoration:underline;text-underline-offset:4px}
.distcol>.barsvg{margin-top:auto;margin-bottom:auto}
.distcol .donutbox.mini{margin-top:auto;margin-bottom:auto}
.distcol .namelist{margin-bottom:auto}

/* r1492b：等宽四列只在 ≥1400 生效；窄屏仍回 2×2（r1492 的通栏声明盖掉了旧断点） */
@media(max-width:1399px){.distrow{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:860px){.distrow{grid-template-columns:1fr}}

/* r1493：环图不与卡边贴住（视口多留 5 单位 + 卡内距 12px）；图例可点，计数 0 的类目留灰 */
.distcol{padding-left:12px;padding-right:12px}
.distcol .donutbox.mini .donut{width:108px;height:108px;overflow:visible}
.distcol .donutbox.mini{gap:6px 8px}
.distcol .dnlegend{gap:4px}
.distcol .dnrow{font-size:11.5px;cursor:pointer;padding:1px 3px;margin:0 -3px;
  border-radius:5px;transition:background .12s}
.distcol .dnrow:hover{background:#f1f5f9}
.distcol .dnrow.z{opacity:.45}
.distcol .dnrow.on{color:#1d4ed8;font-weight:600}
.distcol .dnrow b{font-variant-numeric:tabular-nums}
.gbar.z{fill:#dbe3ee}

/* r1493b：环收到 100px、图例 11px —— 1400 屏环与图例仍并排（原 108/11.5 差 3px 会折行） */
.distcol .donutbox.mini .donut{width:100px;height:100px}
.distcol .donutbox.mini{gap:4px 6px}
.distcol .dnrow{font-size:11px}

/* r1493c：1400~1450 区间卡内距收到 8px，环与图例仍并排不折行 */
@media(min-width:1400px) and (max-width:1450px){.distcol{padding-left:8px;padding-right:8px}}

/* r1494：定式详情页编号后的标题（OGS 描述里的 ## 标题） */
.ptitle{font-size:15px;font-weight:400;color:#6b7280;margin-left:10px}

/* r1494：类型列上的 OGS 评价标签 */
.catag{display:inline-block;font-size:11.5px;line-height:16px;padding:0 6px;border-radius:3px;margin-left:4px;vertical-align:1px;background:#eef2f7;color:#475569}
.catag.cat-ideal{background:#e7f2e7;color:#2f6b3a}
.catag.cat-good{background:#eaf1fb;color:#31527d}
.catag.cat-mistake{background:#fdecec;color:#9b3131}
.catag.cat-question{background:#fdf4e3;color:#8a6320}
.catag.cat-trick{background:#f1eafb;color:#5b3a8a}

/* r1499：姓名列表放不下时末尾给「+N」按钮（点击弹窗看全部），去掉右下角省略号 */
.distcol.hasmore::after{content:none}
.distcol{padding-bottom:10px}
.distcol .namelist{max-height:150px}
.distcol .nmmore{background:#eff6ff;color:#1d4ed8;border:1px dashed #bfd4fb;
  font:600 12px/1.5 inherit;font-family:inherit;cursor:pointer;padding:2px 9px;
  border-radius:999px}
.distcol .nmmore:hover{background:#dbeafe;border-color:#93b8f7}
.nmdlg{max-width:600px}
.nmgrid{display:flex;flex-wrap:wrap;gap:7px;max-height:56vh;overflow:auto;
  padding:2px;border:1px solid #eef1f6;border-radius:10px;background:#fbfcfe}
.nmgrid .nmchip{font-size:13px;padding:3px 11px;background:#fff;border:1px solid #e8ecf2}

/* r1500：重置按钮从右侧按钮组挪到筛选器后面（左对齐） */
.qfltbox>.qbar>.fclear{margin-left:2px;height:34px;display:inline-flex;
  align-items:center;padding:0 12px;font-size:13px;color:#475569;
  border:1px solid var(--line);background:#fff;border-radius:8px;white-space:nowrap}
.qfltbox>.qbar>.fclear:hover{color:#1d4ed8;border-color:#bfd4fb;background:#f8fafc}

/* r1501：姓名列表整体左对齐（保留左右原有内距） */
.distcol .namelist{justify-content:flex-start}

/* r1503：姓名列表整体块居中（宽度由 JS 收到最长一行），左右留白相等 */
.distcol .namelist{margin-left:auto;margin-right:auto}

/* r1509：范围开关（完整定式 / 全部）—— 筛选条最左侧的两段胶囊 */
  border-radius:9px;overflow:hidden;background:#fff;height:34px}
  color:#4b5563;text-decoration:none;white-space:nowrap;line-height:32px}

/* r1509：详情页分支块（上一层 + 后续候选）*/
.pblock.rnvar{display:flex;align-items:flex-start;gap:0}
.rnvar .varline{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}
.varchip{display:inline-flex;align-items:center;height:26px;padding:0 9px;
  border:1px solid var(--line);border-radius:13px;background:#fff;
  font-size:12.5px;color:#374151;text-decoration:none;white-space:nowrap}
.varchip:hover{border-color:#a5b4fc;background:#f5f7ff;color:#1d4ed8}

/* r1514：一份作业可以同时发给不同棋力的学生 —— 名单完整显示（换行，不省略号），
   跨难度时难度列补一个虚线区间标（3段–5段）。 */
.hwtbl td.nmcell{white-space:nowrap;max-width:260px;min-width:150px;line-height:1.6;
  overflow:hidden;text-overflow:ellipsis}
.hwtbl td.nmcell .nm{display:inline}
/* r1695：作业看板新增「分配老师」列（暂为模拟值），窄屏不折行 */
.hwtbl td.dtcell{white-space:nowrap;min-width:74px}
/* r1652：题数列标题与内容统一左对齐；操作列两个按钮不换行 */
.hwtbl th.nl,.hwtbl td.nl{text-align:left}
/* r1688：上一行权重不够 —— table.tbl td.num 是 (0,2,2)，把带 num 的题数格又拉回右对齐。
   这里加到 (0,3,2) 才压得住。 */
table.tbl.hwtbl th.nl,table.tbl.hwtbl td.nl,table.tbl.hwtbl td.num.nl{text-align:left}
.hwtbl td.ops{white-space:nowrap}
.lvrng{display:inline-block;margin-left:5px;padding:0 5px;font-size:11px;border:1px dashed #c3cbdb;
  border-radius:9px;color:#7b869a;font-size:12px;line-height:18px;vertical-align:1px;
  background:#f7f9fc;font-weight:400}

/* r1520：学生页「棋力变化」列 + 日期序列弹窗 */
.rklink{display:inline-flex;align-items:baseline;gap:3px;text-decoration:none}
.rklink b{font-weight:600;font-size:13px;color:#1e293b}
.rklink:hover b{color:#1d4ed8}
.rkd{font-style:normal;font-size:11.5px;font-variant-numeric:tabular-nums;color:#94a3b8}
.rkd.up{color:#dc2626}
.rkd.dn{color:#16a34a}
.rkdlg{max-width:440px}
.rkdlg .rkhint{font-size:12px;color:#94a3b8;margin:-6px 0 12px}
.rkdlg .tblwrap{max-height:52vh;overflow:auto}

/* r1521：弹窗里的棋力分数小字 */
.rkdlg .rknum{font-style:normal;font-size:11px;color:#94a3b8;margin-left:2px}

/* r1523：棋力变化角标 —— 加宽 + 分条说明 */
.supcard.rkcard{width:390px;max-width:calc(100vw - 40px)}
/* r1554：题目分析正确率角标 —— 与学生分析页同款式，宽度收窄 */
.supcard.ratecard{width:330px;max-width:calc(100vw - 40px)}
.ratecard .rkh{font-weight:600;color:#1f2937;margin-bottom:3px}
.ratecard .rki{margin:2px 0}
.ratecard .rkl{margin:2px 0;padding-left:9px;text-indent:-9px}
.ratecard .rkl.muted{color:#94a3b8}
.rkcard .rkh{font-weight:600;color:#1f2937;margin-bottom:3px}
.rkcard .rkl{margin:2px 0;padding-left:9px;text-indent:-9px}
.rkcard .rkl.muted{color:#94a3b8}

/* r1528：学生详情表 —— 两个正确率列内容左对齐、本周对弈表头右对齐 */
.tbl th.rlf,.tbl td.rlf{text-align:left}
.tbl th.rth{text-align:right}

/* r1529：棋力变化弹窗 —— 折线图（棋力左轴 / 正确率右轴） */
.rkdlg{max-width:560px}
.rkchart{margin:2px 0 14px}
.rksvg{width:100%;height:auto;display:block}
.rksvg .pt:hover{r:5}
.rklegend{display:flex;gap:16px;font-size:11px;color:#64748b;margin:0 0 6px}
.rklegend i{display:inline-block;width:14px;height:2px;vertical-align:middle;margin-right:5px}
.rkempty{font-size:12px;color:#94a3b8;margin:0}

/* r1530：学生详情表「已做题目」列居中（a/b 两个数值分居斜杠两侧） */
.tbl th.rcc,.tbl td.rcc{text-align:center}

/* r1531：已做题目 a/b 严格以斜杠居中；棋力角标改「棋力算法」并加表格 */
.abnum{display:inline-grid;grid-template-columns:1fr auto 1fr}
.abnum>span:first-child{text-align:right}
.abnum>span:last-child{text-align:left}
.rkcard .rki{color:#64748b;margin:0 0 2px}
.rkcard .rksub{font-size:11px;font-weight:600;color:#475569;margin:9px 0 4px}
.rkcard .rktb{display:grid;border:1px solid #e2e8f0;border-radius:6px;overflow:hidden;font-size:11px}
.rkcard .rkt{display:grid;gap:6px;padding:4px 8px;border-top:1px solid #eef2f7;color:#475569}
.rkcard .rkt:first-child{border-top:0;background:#f8fafc;font-weight:600;color:#64748b}
.rkcard .rktb.c3 .rkt{grid-template-columns:66px 52px 1fr}
.rkcard .rktb.c4 .rkt{grid-template-columns:70px 86px 62px 1fr}

/* r1527：OGS 定式详情页 = 局面树。一屏一个局面：退一手 / 落点路径 / 候选列表 / 本局面注释。
   候选在棋盘上画成评价色实心圆 + 白字母（OGS Joseki Explorer 的标法），与列表字母一一对应。 */
.posnav{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:2px 0 7px}
.possno{color:#6b7280;font-size:12.5px;font-variant-numeric:tabular-nums;margin:0 2px}
.pospath{font-size:12.5px;color:#8a93a3;line-height:1.9;padding:0 0 2px;word-break:break-word}
.pospath a{color:#1d4ed8;text-decoration:none}
.pospath a:hover{text-decoration:underline}
.pospath b{color:#111827;font-weight:650}
.pospath .psep{color:#c8cedb;margin:0 5px}
.candlist{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));gap:5px 7px;padding:3px 2px 1px 0}
/* 局面页：右栏自己滚（棋盘不跟着走），一屏看全「局面 / 候选 / 注释」 */
.pinfo:has(.pospath){max-height:calc(100vh - 205px);overflow-y:auto;overscroll-behavior:contain}
.pinfo:has(.pospath)::-webkit-scrollbar{width:6px}
.pinfo:has(.pospath)::-webkit-scrollbar-thumb{background:#d5dbe6;border-radius:3px}
.candlist::-webkit-scrollbar{width:6px}
.candlist::-webkit-scrollbar-thumb{background:#d5dbe6;border-radius:3px}
.candrow{display:flex;align-items:center;gap:9px;padding:5px 9px;border:1px solid #e6eaf1;
  border-radius:8px;text-decoration:none;color:#111827;background:#fff}
.candrow:hover{border-color:#b9c6e4;background:#f7f9ff}
.candno{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;
  border-radius:50%;color:#fff;font-style:normal;font-size:11.5px;font-weight:700;flex:0 0 auto}
.candmv{font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:.3px}
.candcat{font-size:11.5px;color:#6b7280;border:1px solid #e6eaf1;border-radius:9px;
  padding:0 6px;line-height:17px}

/* r1527：局面页的三块（局面 / 候选 / 注释）都占满整行 —— .pblock 是 flex 行，
   容器不撑开时候选行只有 180px 宽，双列排不出来。 */
.pinfo .pblock>.posnav,.pinfo .pblock>.pospath,.pinfo .pblock>.candlist,
.pinfo .pblock>.rnlist{flex:1 1 100%;min-width:0}

/* r1527：局面页收紧行距，让「候选」尽量在一屏里露出来 */
.pinfo:has(.pospath) .pblock{padding:6px 16px}  /* r1540：只压纵向，横向 16px 否则字贴外框 */
.pinfo:has(.pospath) .pmeta .mc{padding:4px 16px}
.pinfo:has(.pospath) .candlist{max-height:min(40vh,300px);overflow-y:auto;padding-right:3px}

/* r1532：学生详情表 —— 去掉姓名首字头像圆点（.avat 已删），两列正确率可排序 */

/* r1540：分配定式 / 作业记录（.assignbox.compact）「学生」多选框宽度仍不对
   —— .pickset 是 .evfield 里的 flex 项，默认 flex:0 1 auto 会收缩到内容宽，
   .msel 的 width:100% 只取到这一层的内容宽（约 70px），于是「选择」按钮被压扁。
   让 .pickset / .filters 一起参与等分，按钮即撑满与「班级」同宽。 */
.assignbox.compact .assignbar .evfield>.pickset{flex:1 1 0;min-width:0;display:block}
.assignbox.compact .assignbar .evfield>.pickset>.filters{min-width:0;flex-wrap:nowrap}

/* r1542：分配定式页 -- OGS 整棵树一行入口（不带勾选框，点进去挑局面） */
.pitem.ogspick{background:#f8fafc;align-items:stretch}
.pitem.ogspick>.pibd{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;
  justify-content:center;gap:3px;padding:8px 10px;border:1px dashed var(--line);
  border-radius:8px;text-decoration:none;box-sizing:border-box;line-height:1.45}
.pitem.ogspick>.pibd b{font-size:13px;color:#111827;white-space:normal;font-weight:650}
.pitem.ogspick>.pibd .pimeta{font-size:11.5px;color:var(--sub);white-space:normal}
.pitem.ogspick>.pitags{flex:none;margin-left:auto}

/* r1546：题目分析 —— 难度 / 题型 / 知识点 汇总当筛选器 */
.tbl.fsel tbody tr.frow>td{padding-top:4px;padding-bottom:4px}
.tbl.fsel tbody tr.frow:hover>td{background:rgba(37,99,235,.05)}
.tbl.fsel tbody tr.frow.on>td{background:rgba(37,99,235,.10)}
.tbl.fsel tbody tr.frow.on td:first-child{box-shadow:inset 3px 0 0 #2563eb}
.tbl.fsel tbody tr.fsum>td{font-weight:600;background:#f8fafc}
.tbl.fsel td a.minilink{text-decoration:none}
.tbl.fsel td a.minilink:hover{text-decoration:underline}
.fchips{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 10px}
.fchip{display:inline-flex;align-items:center;gap:6px;padding:2px 9px;border-radius:999px;
  background:#eef2ff;color:#1e3a8a;font-size:12px;line-height:20px}
.fchip a{color:#1e3a8a;text-decoration:none;font-weight:700;font-size:13px}
.fclear{font-size:12px;color:var(--sub)}
/* ============ r1560：侧栏整体压一档（题库/定式库分成外部/精选后多出一组，一屏放不下） ============ */
.sq-side-hd{padding:32px 12px 27px}
.sq-lock{width:62px}
.sq-nav{padding:5px 9px 8px}
.sq-nav-grp{margin:6px 0 3px;font-size:10px}
.sq-nav-item{height:30px;font-size:13px}
.sq-nav-item.child{height:24px}
.sq-side-ft{padding:7px 14px}
@media (max-height:820px){
  .sq-side-hd{padding:24px 12px 21px}
  .sq-lock{width:54px}
  .sq-nav{padding:4px 9px 6px}
  .sq-nav-grp{margin:5px 0 2px}
  .sq-nav-item{height:27px}
  .sq-nav-item.child{height:23px}
  .sq-side-ft{padding:6px 14px}
}
@media (max-height:700px){
  .sq-side-hd{padding:16px 12px 14px}
  .sq-lock{width:46px}
  .sq-nav{padding:2px 9px 4px}
  .sq-nav-grp{margin:3px 0 1px}
  .sq-nav-item{height:24px;font-size:12.5px}
  .sq-nav-item.child{height:21px}
  .sq-side-ft{padding:4px 14px}
}
/* ============ r1561：外部题库筛选条六等分（随屏宽伸缩） ============ */
.qfltbox>.qbar.eqbar{flex-wrap:nowrap;gap:10px 12px}
.qfltbox>.qbar.eqbar>.fsp{display:none}
.qfltbox>.qbar.eqbar>.evfield{flex:1 1 0;min-width:0;gap:5px}
.qfltbox>.qbar.eqbar>.evfield>.flabel{flex:0 0 auto;font-size:12.5px}
.qfltbox>.qbar.eqbar>.evfield>.msel{display:block;flex:1 1 0;min-width:0}
.qfltbox>.qbar.eqbar>.evfield>.msel>.msel-btn{width:100%;min-width:0;max-width:none}
.qfltbox>.qbar.eqbar>.fclear{flex:0 0 auto}
@media (max-width:1180px){
  .qfltbox>.qbar.eqbar{flex-wrap:wrap}
  .qfltbox>.qbar.eqbar>.evfield{flex:1 1 calc(33.333% - 12px)}
}
@media (max-width:820px){
  .qfltbox>.qbar.eqbar>.evfield{flex:1 1 calc(50% - 10px)}
}
/* r1568：题库 / 题集列表 —— 题目、先手、难度、题型、知识点、答案、来源 七列居中 */
.tbl th.cc,.tbl td.cc{text-align:center}
/* r1590：定式库卡片视图 —— 一张卡 = 一个局面，卡内直接列该局面的全部分支 */
.rgrid.jgrid{grid-template-columns:repeat(auto-fill,minmax(252px,1fr));align-items:start}
.jcard{height:100%}
.jcard .rtop{display:flex;align-items:center;flex-wrap:wrap;gap:6px;font-size:13px;font-weight:600;color:var(--fg);margin-bottom:6px}
.jcard .cardbd{margin:2px 0 8px}
.jcard .tags{font-size:12px;color:#64748b}
.jbr{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:8px 0 2px;max-height:64px;overflow:hidden}
.jbr-t{font-size:11.5px;color:#94a3b8;margin-right:2px;line-height:18px}
.jbr-i{line-height:18px;text-decoration:none;cursor:pointer}
.jbr-i:hover{filter:brightness(.94)}
.jbr-more{font-size:11.5px;color:#94a3b8;line-height:18px}
.vsw{display:inline-flex;gap:6px;margin-right:6px}

/* r1592：题库 / 定式库分页条的上下留白收紧 —— 与筛选框（难度/题型/来源/答案）
   到卡片上沿的 16px 一致；原上 14+12px、下 12+4+18px 太散 */
.pager.pgbar{margin:16px 0 -2px;padding:0 4px}
/* r1593：定式卡片（方案 A）—— 棋盘上标候选点，卡内列候选行（标签 + 落点 + 继 N 手） */
.jcard .rtop{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px}
.jcode{font-size:13px;font-weight:600;color:var(--fg);display:flex;align-items:center;gap:4px}
.jcnt{font-size:11px;font-weight:400;color:#94a3b8;white-space:nowrap}
.jcand{display:flex;flex-direction:column;gap:4px;margin:8px 0 2px}
.jcrow{padding:3px 7px;font-size:12px;gap:7px;text-decoration:none}
.jcrow .candno{width:18px;height:18px;font-size:11px}
.jcrow .candcat{color:#64748b}
.jlen{margin-left:auto;font-size:11px;color:#94a3b8;white-space:nowrap}
.jcd{margin-top:1px}
.jcd summary{font-size:11.5px;color:#64748b;cursor:pointer;padding:2px 4px;list-style:none}
.jcd summary::-webkit-details-marker{display:none}
.jcd summary::before{content:+ ;color:#94a3b8}
/* r1598：定式库「开局路径」—— 前 4 手逐手点选，不占卡片位 */
.pathbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;margin-bottom:8px;background:#f7f9fc;border:1px solid #e3e8f0;border-radius:8px;font-size:12.5px;line-height:20px}
.pthlab{color:#64748b}
.pthsep{color:#c3cbd8}
.pthc{font-weight:600;color:var(--fg);text-decoration:none}
.pthc:hover{color:var(--brand)}
.popt{padding:2px 9px;border:1px solid #dfe5ee;border-radius:999px;background:#fff;color:var(--fg);text-decoration:none;font-size:12px}
.popt:hover{border-color:var(--brand);color:var(--brand)}
.pthdone{color:#94a3b8}
.pthclr{margin-left:8px;color:#64748b;text-decoration:none;font-size:12px}
.pthclr:hover{color:var(--brand)}
.pthsp{flex:1}

/* r1601：来源列的「文件上传」可点，打开原始文件 */
.srcline.srclink{color:#2563eb;text-decoration:none}
.srcline.srclink:hover{text-decoration:underline}
/* r1603：对弈录屏讲解 */
.screc{max-width:760px}
.recbar{display:flex;align-items:center;gap:10px;margin:12px 0}
.recstat{font-size:13px;color:#64748b}
.recview{margin-top:10px}
.recview video{display:block;width:100%;max-width:660px;border-radius:8px;background:#000}
.recold{margin-top:16px;padding-top:12px;border-top:1px solid #e3e8f0;font-size:13px}
.recold video{display:block;width:100%;max-width:660px;border-radius:8px;background:#000;margin-top:6px}
.recrow td{padding:0 0 12px}
.recplay video{width:100%;max-width:540px;border-radius:8px;background:#000}
.recplay .muted{font-size:12px;margin-top:2px}

/* ===== r1605 账号页（/admin/users）编辑态：任何字段都不折行 =====
   点「修改」后各列换成输入框/下拉，列被挤窄，开通时间这种 2026-10-14
   会在连字符处断成两行。整行 nowrap，表格放不下时由外层容器横滚。 */
tr.urow td{white-space:nowrap}
/* 只有小屏（<1280）才允许横向滚动兜底，桌面端靠收窄输入框排进一行 */
@media(max-width:1439px){
  .urowwrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
}

/* r1644：分配页两行筛选器规范化 —— 行内等宽、标签列定宽让控件起止对齐、
   「棋力与难度匹配」与「确认分配」同规格并整组右对齐；班级列表加棋力列 */
.assignbar{--fltw:210px}
.assignbar .rowlb{color:#111827;font-weight:700}
.assignbar .flabel{min-width:46px;flex:none}
.assignbar .assignflt input[type=search]{width:var(--fltw)}
.assignbar.whorow .msel-btn,
.assignbar.whatrow .msel-btn{width:var(--fltw);min-width:0;max-width:none}
.assignbar .rowacts{margin-left:auto;display:flex;align-items:center;gap:10px;
  flex:none;flex-wrap:nowrap}
/* 三个筛选项整块定宽（标签 42 + 控件 210 + 间距 6），两行起点与右边界因此完全对齐 */
.assignbar.whorow .evfield,
.assignbar.whatrow .evfield{width:calc(var(--fltw) + 52px);flex:none;display:flex;
  align-items:center;gap:6px}
.assignbar .evfield .msel{flex:1 1 auto;min-width:0;display:block}
.assignbar .evfield .msel-btn{width:100%}
.assignbar .evfield input[type=search]{flex:1 1 auto;min-width:0;width:auto}
.assignbar .rowacts .btn{white-space:nowrap}
.clstbl .c-lv{white-space:nowrap}
.clstbl .c-lv .tag{margin-right:4px}
.clstbl .c-lv .msel-btn{min-width:110px;max-width:170px}

/* r1644b：窄屏按档收窄三个筛选项，保证两行不换行、不错位（1600 以上维持 210） */
@media (max-width:1500px){.assignbar{--fltw:180px}}
@media (max-width:1340px){.assignbar{--fltw:152px}
  /* r1646c：按钮已挪到「选择题目」行，窄屏不再强制独占一行（放不下才自然换行） */
  .assignbar .rowacts{margin-left:auto}}
/* r1644c：学生选择器多包了 .pickset > .filters 两层，宽度要一路放下去，否则只有 67px */
.assignbar .evfield .pickset,
.assignbar .evfield .filters{display:flex;width:100%;flex:1 1 auto;min-width:0;
  flex-wrap:nowrap;border:0;padding:0;margin:0;background:none}

/* r1646：两行之间留出间距（原来 6px 黏在一起）；两个按钮挪到「选择题目」行右端；
   题型是原生 select，浏览器给的是深色 v 形箭头，换成与多选下拉同款浅灰实心三角。 */
.assignbar.whatrow .rowacts{margin-left:auto}
.assignbar select.evf,
.assignbar .pfilter select,
.assignbar .evfield select.evf{
  -webkit-appearance:none;-moz-appearance:none;appearance:none;
  background-color:#fff;
  background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='5'%3E%3Cpath d='M0 0h9L4.5 5z' fill='%239aa1ac'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 11px center;
  padding-right:26px;
}

/* r1646b：.assignbox>.assignbar 有 margin:0!important，要同权重+重要才能拉开两行 */
.assignbox>.assignbar.whorow{margin-bottom:16px!important}

/* r1649：班级页筛选器并到标题行（「+ 新建班级」左侧），去掉卡片外框改成行内控件 */
.sec-hd.flex>.evfilter{border:0!important;background:none!important;padding:0!important;
  margin:0!important;flex-wrap:nowrap;gap:8px 10px}
.sec-hd.flex>.evfilter .evf{height:32px}
/* r1649b：筛选器并入标题行后，表格与标题行之间补回呼吸空间 */
.clssec .sec-bd{padding-top:10px}

/* r1650：难度改成「起–止」区间 —— 两个下拉平分原来一格的位置，三格仍等宽对齐 */
.assignbar .evfield.lvrange{gap:6px;width:calc(var(--fltw) + 52px);flex:none}
.assignbar .evfield.lvrange select.evf{flex:1 1 0;width:auto;
  min-width:0;max-width:none;padding-right:24px}
.assignbar .lvsep{font-style:normal;color:#9aa1ac;font-size:12px;flex:none}

/* r1656：学生详情表「2周内待订」列 —— 待订题目缩略图 + 已订正次数 */
.fqc{white-space:nowrap}
.fqbox{display:inline-flex;align-items:center;gap:6px}
.fqit{display:inline-flex;align-items:center;gap:4px;padding:2px 6px 2px 2px;
  border:1px solid var(--line);border-radius:6px;background:#fff;text-decoration:none}
.fqit:hover{border-color:#f3b5b5;background:#fff8f8}
.fqit svg{display:block;width:34px;height:34px;border-radius:3px}
.fqit b{font-size:12px;line-height:1;color:#111827;font-weight:700;
  font-variant-numeric:tabular-nums}
.fqmore{font-size:12px;color:var(--sub);text-decoration:none;padding:0 2px}
.fqmore:hover{color:var(--brand)}

/* r1663：学生「2周内待订」合并详情页 —— 一块题 = 左棋盘 + 右题面信息 / 历次着法记录 */
/* r1674：每道题一个大框 —— 卡片淡底 + 加深边框 + 轻阴影，内层棋盘/信息仍纯白 */
.pendcard{background:#fff;border-color:#bcc7d8;box-shadow:0 3px 12px rgba(17,24,39,.10)}
.pendcard .sec-hd{background:#f8fafc}
.pendcard .probbd,.pendcard .sec.pinfo{background:#f7f9fc;border-color:#e2e8f1}
.pendcard+.pendcard{margin-top:18px}
.pendcard .probwrap{grid-template-columns:minmax(240px,min(420px,calc(100vh - 420px))) minmax(320px,1fr)}
.pendcard .probbd{padding:12px}
.pendcard .pendbd{position:relative;width:100%}
.pendcard .prow{display:flex;align-items:baseline;gap:12px;padding:7px 10px;
  border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);
  font-size:12.5px;line-height:1.5;text-decoration:none}
.pendcard .prow:hover{border-color:#c9ced6;background:#fbfcfe}
.pendcard .prow.on{border-color:var(--brand);box-shadow:0 0 0 2px rgba(37,99,235,.12)}
.pendcard .prow.nomv{cursor:default}
.pendcard .prow.nomv:hover{border-color:var(--line);background:#fff}
.pendcard .prow .w{color:var(--sub);font-variant-numeric:tabular-nums;white-space:nowrap}
.pendcard .prow .st{font-weight:600;white-space:nowrap}
.pendcard .prow .no{margin-left:auto;color:#111827;font-variant-numeric:tabular-nums;
  white-space:nowrap}
.pendcard .st-ok{color:#15803d}
.pendcard .st-bad{color:#b91c1c}
.pendcard .st-todo{color:var(--sub);font-weight:400}
/* 两周内 / 两周外之间的分隔线 */
.pendcard .pdiv{display:flex;align-items:center;height:9px;margin:1px 0}
.pendcard .pdiv:before,.pendcard .pdiv:after{content:"";flex:1 1 auto;height:1px;background:var(--line)}
.pendcard{scroll-margin-top:76px}

/* r1667：历次记录 —— 同一份作业里错多次标 ×N；两周分界给出文字 */
.pendcard .prow .st{display:inline-flex;align-items:center;gap:4px}
.pendcard .prow .wx{font-style:normal;font-size:11px;font-weight:700;color:#b91c1c;
  background:#fdeaea;border-radius:4px;padding:0 4px;line-height:16px}
.pendcard .pdiv{height:auto;padding:9px 0;gap:8px}
.pendcard .pdiv i{font-style:normal;font-size:11px;color:var(--sub);white-space:nowrap}


/* r1686：面棋在线对弈 —— 可搜索单选摆在表单里 / 用时与提示 */
.faceform .psel-btn{min-width:200px;height:34px;font-size:13.5px}
.faceform .psel-pop{width:260px}
.facehint{margin:0 0 12px;font-size:13px;line-height:1.6;color:var(--sub)}
.facehint.on{color:var(--brand);font-weight:600}
.faceinfo p .muted{width:56px}
.faceacts{align-items:flex-start}
.faceacts form,.faceacts .btn{flex:0 0 auto;width:auto}
.faceinfo b.run{color:var(--brand)}
.faceinfo b.low{color:#dc2626}


/* r1689：面棋列表 —— 胜方名字右侧挂王冠（IC['crown']），和棋不挂 */
.winic{display:inline-flex;align-items:center;margin-left:5px;vertical-align:-2px;
  color:#c08a1e}
.winic svg{width:15px;height:15px;fill:#f2c65c;stroke:#c08a1e;stroke-width:1.6;
  stroke-linejoin:round}

/* r1705：线上对弈「对手」悬浮战绩卡 */
.oppn{border-bottom:1px dashed #c7cdd6;cursor:help}
#oppCard{position:fixed;z-index:80;min-width:190px;max-width:270px;padding:9px 11px;
  background:#fff;border:1px solid var(--line);border-radius:9px;
  box-shadow:0 8px 24px rgba(15,23,42,.16);font-size:12.5px;line-height:1.55;
  color:var(--ink);pointer-events:none}
.oppk-hd{display:flex;align-items:baseline;gap:7px;margin:0 0 6px;padding-bottom:6px;
  border-bottom:1px solid var(--line)}
.oppk-hd b{font-size:13px;font-weight:600}
.oppk-hd span{color:var(--sub);font-size:12px}
.oppk-r{display:flex;justify-content:space-between;gap:14px;padding:1px 0}
.oppk-r span{color:var(--sub)}
.oppk-r b{font-weight:600;font-variant-numeric:tabular-nums}
.oppk-ft{margin-top:6px;padding-top:5px;border-top:1px solid var(--line);
  color:var(--sub);font-size:11.5px}
.oppk-empty{color:var(--sub);font-size:12px}

/* r1716 面棋列表 / 面棋详情：姓名右侧的棋力小标签 */
.foxtbl td .tag.lv{margin-left:6px;vertical-align:1px;font-weight:400}
.pinfo .mc .mv .tag.lv{font-weight:400}

/* r1720 面棋 / 线上详情：右列信息卡跟棋盘等高（.palign 是 align-items:start，得单独拉伸） */
.probwrap.palign>.pinright{align-self:stretch;display:flex;flex-direction:column;
  gap:14px;min-height:0}
.probwrap.palign>.pinright>.sec.pinfo{flex:1 1 auto;min-height:0}

/* r1722 线上列表：时长列右对齐（表头和单元格一起） */
table.tbl.foxtbl th.foxdur,table.tbl.foxtbl td.foxdur{text-align:right;
  font-variant-numeric:tabular-nums;white-space:nowrap}

/* r1778 统一：表格操作列按钮间距（老师端 / 学生端同一套，不在模板里写内联间距） */
td.ops > a + a,td.ops > a + form,td.ops > form + a,td.ops > span + a{margin-left:10px}
td.ops > a,td.ops > .opbtn,td.ops > .btn{vertical-align:middle}
/* r1778 侧栏：父项与子项之间留 4px 缝，按钮底边不再压在一起 */
.sq-nav-item.has-child{margin-bottom:4px}

/* r1779 操作列三个按钮（开始 / 下载 / 打印）间距统一 10px：.opbtn+.opbtn 的 6px 被这里覆盖 */
td.ops > a + a,td.ops > a + .opbtn,td.ops > .btn + a,td.ops > .btn + .opbtn,td.ops > .opbtn + a,td.ops > .opbtn + .opbtn{margin-left:10px}

/* r1780 做题页「历次着法记录」行样式。原来复用 .pendcard .prow，但做题页没有 pendcard 容器，
   行掉成裸 inline，着法挤成一团看不清 —— 这里给 .hwsec .hwl .prow 单独定样式 */
.hwsec .hwl .prow{display:grid;grid-template-columns:auto 1fr;gap:2px 8px;align-items:baseline;
  padding:7px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;
  font-size:12.5px;line-height:1.5;color:var(--ink);text-decoration:none}
.hwsec .hwl .prow:hover{border-color:#c9ced6;background:#fbfcfe}
.hwsec .hwl .prow.on{border-color:var(--brand);box-shadow:0 0 0 2px rgba(37,99,235,.12)}
.hwsec .hwl .prow .w{color:var(--sub);white-space:nowrap;font-variant-numeric:tabular-nums}
.hwsec .hwl .prow .st{font-weight:600;text-align:right;white-space:nowrap}
.hwsec .hwl .prow .mv{grid-column:1/-1;color:#374151;word-break:break-word}
.hwsec .hwl .prow .no{grid-column:1/-1;color:#b0b6bf;font-size:10.5px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.hwsec .hwl .prow.nomv{cursor:default}
.hwsec .hwl .prow.nomv:hover{border-color:var(--line);background:#fff}

/* r1781 答案单元格：一条直接写；多条带序号逐行列出 */
.ansbox{display:inline-flex;flex-direction:column;gap:2px}
.ansbox .ansln{display:block;white-space:nowrap;font-variant-numeric:tabular-nums}
.ansbox .ansln b{display:inline-block;min-width:15px;margin-right:5px;color:#8a94a6;
  font-weight:600;font-size:11px}
.ansbox .ansall{color:#9aa2ad;font-size:11px;margin-top:1px}
/* 错题库「题目」列缩略图：与题集一致，34px 宽 */
.tbl td.cc a.minilink{display:inline-block;line-height:0}
/* r1782 做题页「历次着法记录」列表限高可滚 —— 记录再多也不会把右栏顶出屏幕，
   卡片标题始终可见；空态单独占一行，看着不像「区块没了」 */
.hwsec .hwl{max-height:min(38vh,320px);overflow-y:auto;padding-right:2px}
.hwsec .hwl .prow .st{min-width:2.4em}

/* ===== r1785 待订页答案/讲解改成进详情页；详情页答案块 ===== */
/* 待订表：同一列里并排的「答案1 答案2」按钮留缝 */
.tbl td.sub > a.btn + a.btn{margin-left:6px}
/* r1831：做题页答案改成老师端那种链接（.alist），小棋盘卡片样式已无用，整块删掉 */

/* ===== r1787：多答案「提示」行 =====
   只把「本题有 N 个答案，您已答对 M 个」里的 N / M 加粗，
   其余文字用常规字重，整行左对齐（在标签右侧起排，长文不顶回最左）。 */
.pinfo .pblock > .ptip{flex:1 1 auto;min-width:0;
  font-size:14px;font-weight:400;color:#111827;line-height:1.5;text-align:left}
/* r1827：提示 / 本次 / 记录 三块内容统一 14px（与「本次」结论「错」同号） */
.pinfo .pblock.hwrk .muted{font-size:14px;font-weight:500}
.pinfo .pblock > .ptip b{font-weight:700}

/* r1811 错题库详情页：布局照老师端题集详情页（.palign），棋盘再放大、右栏收窄 */
.wbd.probwrap{grid-template-columns:minmax(320px,min(680px,calc(100vh - 230px))) minmax(260px,1fr)}
@media(min-width:1360px){.wbd.probwrap{grid-template-columns:minmax(340px,min(800px,calc(100vh - 230px))) minmax(260px,1fr)}}
@media(min-width:1700px){.wbd.probwrap{grid-template-columns:minmax(340px,min(880px,calc(100vh - 230px))) minmax(260px,1fr)}}
@media(max-width:1100px){.wbd.probwrap{grid-template-columns:1fr}}
/* 记录行：时间 / 对错 / 作业编号同一行；编号过长省略，不再折到第二行 */
.wbd .pinfo .pmeta{grid-template-columns:repeat(2,1fr)}
.wbd .hwsec .hwl .prow{grid-template-columns:auto auto minmax(0,1fr)}
.wbd .hwsec .hwl .prow .no{grid-column:3;justify-self:end;max-width:100%;font-size:11px}

/* r1829：错满 3 次的挡屏弹窗 */
.blkmask .dlg{max-width:376px}
.blkmask .dlg h3{margin:0 0 10px}
.blkmask .blkd{margin:0;font-size:14px;line-height:1.7}
.blkmask .blkd+.blkd{margin:6px 0 0}

/* r1835：错满弹窗里的提交表单直接做 flex 子项 */
.blkmask .acts form{display:contents}

/* r1838：错题库详情的「历次着法记录」撑满右栏，不再卡在 320px 裁一半行 */
.probwrap.wbd .pinright>.sec.hwsec{display:flex;flex-direction:column;min-height:0}
.probwrap.wbd .pinright>.sec.hwsec>.sec-bd{display:flex;flex-direction:column;
  flex:1 1 auto;min-height:0}
.probwrap.wbd .pinright>.sec.hwsec .hwl{max-height:none;flex:1 1 auto;min-height:0;overflow:auto}

/* r1842：综合评价趋势曲线 */
.lcgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px}
.lcp{border:1px solid #eef2f7;background:#fafbfc;border-radius:10px;padding:12px 14px 6px}
.lcp .lchd{display:flex;align-items:baseline;gap:8px}
.lcp .lchd b{font-size:13px;font-weight:600;color:#374151}
.lcp .lchd i{font-style:normal;font-size:12px;color:#9aa5b1}
.lcp .lcv{font-size:21px;font-weight:600;color:#111827;line-height:1.3;margin:2px 0 2px}
.lcp .lcv span{font-size:12px;font-weight:400;color:#8a94a6;margin-left:6px}
.lcp .lcs{width:100%;height:auto;display:block}
.lcp .lcempty{color:#a3adba;font-size:13px;margin:34px 0;text-align:center}

/* ============ r1864 多端显示适配层 ============
   目标设备：笔记本（1280×800 / 1366×768 / 1440×900 / 1920×1080，含 125%–150% 缩放）、
   台式机（1920×1080 / 2560×1440）、iPad（768×1024 / 820×1180 / 1024×768 / 1180×820）、
   安卓与华为平板（800×1280 / 1280×800）。本节只做覆盖，不改动上方既有规则，可整段删除回滚。 */

/* 1. 动态视口高度：iPadOS 与安卓浏览器地址栏伸缩时，100vh 会把页面底部顶出屏幕 */
@supports (height:100dvh){
  .sq-body{height:100dvh}
  .sq-main{min-height:100dvh}
}

/* 2. 超宽屏限宽居中：2560 及以上时内容铺满会把列距拉散、字号显得偏小 */
@media (min-width:1680px){
  .sq-content{padding:24px 40px}
  .sq-content>.sec,
  .sq-content>.assignbar,
  .sq-content>.probwrap{max-width:1680px;margin-left:auto;margin-right:auto}
}

/* 3. 表格：固定内容的列不换行，宽度不足时横向滚动，不再压成两行或竖排 */
.sec-bd{overflow-x:auto;overscroll-behavior-x:contain}
.tbl td.cc,.tbl td.sub,.tbl td.evauth,.tbl td.ops,.tbl td.uid,.tbl td.code{white-space:nowrap}
.tbl th{white-space:nowrap}

/* 4. 笔记本与平板横屏（901–1180）：侧栏收窄，把宽度让给内容区 */
@media (min-width:901px) and (max-width:1180px){
  .sq-side{width:204px;flex:0 0 204px}
  .sq-nav-item{padding:0 9px;font-size:13px}
  .sq-nav-item.child{padding-left:56px}
  .sq-nav-item.child::before{left:38px}
  .sq-content{padding:16px 18px}
  .sq-topbar{padding:0 18px}
  .sq-foot{padding:0 18px}
}

/* 5. 笔记本 125%–150% 缩放后视口 1090–1220：表格列距再收一档 */
@media (min-width:1181px) and (max-width:1280px){
  .sq-content{padding:18px 20px}
}

/* 6. 平板竖屏（768–900）：底栏方案保留，内容边距与卡片间距按平板比例放宽 */
@media (min-width:768px) and (max-width:900px){
  .sq-content{padding:18px 20px 92px}
  .sq-topbar{padding:12px 20px}
  .sec-bd{padding:16px 18px}
  .apps{grid-template-columns:repeat(3,minmax(0,1fr))}
}

/* ---- r1864b 窄屏表格可操作化 ----
   列数多的表（题集 12 列）在平板竖屏与手机上无法靠压缩容纳：
   改为横向滚动 + 操作列吸附右侧，保证「修改 / 删除」始终可见，不再被裁到屏幕外。 */
/* r1866：取消自定义横向滚动条 —— 自定义 ::-webkit-scrollbar 会让 .sec-bd 在内容未溢出时
   也常驻一条横向滚动条，且位置在表格底部，需滚到列表末尾才够得到。恢复浏览器默认（按需出现）。 */


@media (max-width:1180px){
  .tbl th,.tbl td{padding:7px 9px}
}

/* ---- r1864c 题集列表窄屏减列 ----
   题集表 12 列，1024 及以下无论怎么压缩都放不下，压缩只会把文字挤成竖排。
   窄屏隐藏「先手 / 题型 / 知识点」三列（三个位置在只读与可编辑两种表头中序号一致），
   保留编号 / 题目 / 难度 / 答案 / 讲解 / 来源 / 更新人 / 更新时间 / 操作。
   完整信息可点题目进入详情查看。 */
@media (max-width:1180px){
  .probtbl{min-width:0}
  .probtbl>thead>tr>th:nth-child(3),.probtbl>tbody>tr>td:nth-child(3),
  .probtbl>thead>tr>th:nth-child(5),.probtbl>tbody>tr>td:nth-child(5),
  .probtbl>thead>tr>th:nth-child(6),.probtbl>tbody>tr>td:nth-child(6){display:none}
}
/* 手机（≤640）：题集表只保留 编号 / 题目 / 答案 / 操作 四列，其余进详情页看 */
@media (max-width:640px){
  .probtbl>thead>tr>th:nth-child(4),.probtbl>tbody>tr>td:nth-child(4),
  .probtbl>thead>tr>th:nth-child(8),.probtbl>tbody>tr>td:nth-child(8),
  .probtbl>thead>tr>th:nth-child(9),.probtbl>tbody>tr>td:nth-child(9),
  .probtbl>thead>tr>th:nth-child(10),.probtbl>tbody>tr>td:nth-child(10),
  .probtbl>thead>tr>th:nth-child(11),.probtbl>tbody>tr>td:nth-child(11){display:none}
  .probtbl{min-width:0}
}

/* ---- r1864d 学生作业列表窄屏减列 ----
   .hwtbl 为「未做」作业表（8 列）：作业编号 / 题数 / 难度 / 题型 / 知识点 / 分配时间 / 分配老师 / 操作。
   平板竖屏（≤900）隐藏题型、知识点、分配老师三列，保证操作按钮不被裁到屏幕外。 */
@media (max-width:900px){
  .hwtbl>thead>tr>th:nth-child(4),.hwtbl>tbody>tr>td:nth-child(4),
  .hwtbl>thead>tr>th:nth-child(5),.hwtbl>tbody>tr>td:nth-child(5),
  .hwtbl>thead>tr>th:nth-child(7),.hwtbl>tbody>tr>td:nth-child(7){display:none}
}

/* ---- r1866 题集答案列排版 ----
   答案列内容为「提供者 + 答案序号」，属辅助信息：字号降一级、链接不拆行。
   悬浮查看全文由链接自带的 title 属性提供，不另加省略。 */
.probtbl td .wlist{font-size:12px;line-height:1.55;color:#6b7280}
.probtbl td .wlist .wlnk{white-space:nowrap}
.probtbl td .wlist .wlnk+.wlnk{margin-left:4px}
