/* 围棋训练平台 —— 版式照 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:#b45309; --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}
.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:220px;flex:0 0 220px;background:#1f2937;color:#d1d5db;display:flex;flex-direction:column;overflow-y:auto}
.sq-side-hd{display:flex;align-items:center;justify-content:center;padding:16px 12px;border-bottom:1px solid #374151}
.sq-lock{width:80px;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{margin:10px 0}
.sq-nav-item{display:block;padding:9px 16px;color:#d1d5db;font-size:14px;border-radius:6px;margin:2px 10px}
.sq-nav-item:hover{background:#374151;color:#fff}
.sq-nav-item.active{background:var(--brand);color:#fff;font-weight:600}
.sq-nav-grp{margin:14px 0 4px;padding:0 16px;font-size:11px;letter-spacing:.1em;color:#8b93a1;font-weight:600}/* r47 一级目录 */
.sq-nav-item.sub{padding-left:30px;font-size:13.5px}
.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:64px}
  .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 .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;white-space:nowrap;display:inline-flex;align-items:center;gap:6px}
.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}
.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}
.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 3px rgba(16,24,40,.06)}
.auth h2{margin:0 0 22px;font-size:20px;text-align:center;font-weight:700}
.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}
/* 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:1px}

/* ============ 状态徽标（作业 / 题目项） ============ */
.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;gap:6px}
.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}
.probwrap{display:grid;grid-template-columns:minmax(0,520px) minmax(360px,1fr);gap:18px;
  align-items:flex-start}
.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}
/* 第一行：先手 / 题型 / 等级 三格 */
.pinfo .pmeta{display:grid;grid-template-columns:repeat(3,1fr);border-bottom:1px solid var(--line)}
.pinfo .mc{display:flex;flex-direction:column;gap:3px;padding:13px 16px;min-width:0}
.pinfo .mc+.mc{border-left:1px solid var(--line)}
.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 32px}
.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 32px}
.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}
.pinfo .alnk{font-weight:600;font-size:13.5px}
.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}
@media(max-width:980px){.probwrap{grid-template-columns:1fr}}

/* ============ 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;
  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)}
.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:600;color:#4a6ea8;background:#eef3fb;
  border-radius:4px;padding:1px 5px;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;
  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:-moz-fit-content;width:fit-content;max-width:100%;
  align-items:center;gap:10px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:12px;background:#fbfcfe;
  padding:9px 12px;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)}
.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}

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

/* r73 新建班级：与「账号」页同款（rowform + tagform，字段不套外框） */
/* 五列等宽 */
.clsform .tagform{grid-template-columns:repeat(5,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:#eef2ff;color:#4338ca;font-weight:500}

/* 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}
.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{font-size:12px;color:#64748b;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:#b45309}
.evst.done{background:#f1f3f7;color:#6b7280}
.evrem{display:inline-block;margin-left:6px;font-size:11px;padding:1px 7px;border-radius:999px;
  background:#eff4ff;color:#2563eb}
.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:#b45309}
.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:flex;align-items:center;gap:8px;flex-wrap:nowrap;margin:12px 0 0}
.ed-onerow #ed-cls{flex:0 0 auto;width:132px;max-width:132px}
.ed-onerow .ed-students{flex:1 1 auto;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}
