/* =========================================================================
   在售平台 · 分题 / 领题 / 账号管理 / 正确率 / 登录 的样式
   v5（2026-09-26）：左侧侧边栏布局、表头吸顶、chips 美化、动效、卡片并排、
   分派操作卡（选人+数量）。设计令牌与质检台 style.css 同族。
   ⚠️ [hidden] 那条必须留着：任何 display 都不能盖掉它，否则 hidden 会失效。
   ⚠️ .card 不能写 overflow:hidden —— 会把表头 sticky 的参照系变成卡片自己，
      表头就吸不住顶了。卡片底部圆角由表格最后一行 td 自收。
   ========================================================================= */

* { box-sizing: border-box; margin: 0; padding: 0; }

/* ---------- 表格切换器（2026-09-28 多张"大表"） ----------
   和下面的工作表切换器是两层：这里选**电子表格文档**，那里选文档里的**标签页**。
   只有一张表时不给下拉（显示表名即可），但组长仍看得到「＋」——
   否则他没法加第二张，而加第二张正是这个功能的目的。 */
.tablepick {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12.5px; color: var(--tx2);
  background: var(--bg); border: 1px solid var(--line);
  border-radius: 6px; padding: 2px 6px 2px 6px;
}
.tablepick .ico { font-size: 12px; line-height: 1; }
.tablepick .tpname { font-size: 12.5px; color: var(--tx); max-width: 200px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tablepick-sel {
  font: inherit; font-size: 12.5px; color: var(--tx);
  background: transparent; border: 0; outline: none; cursor: pointer;
  max-width: 200px; padding: 2px 0;
}
.tablepick:hover { border-color: var(--tx3); }
.tablepick .tpadd, .tablepick .tpdel {
  font: inherit; font-size: 13px; line-height: 1; cursor: pointer;
  border: 1px solid var(--line); background: #fff; color: var(--tx2);
  border-radius: 5px; padding: 1px 6px;
}
.tablepick .tpadd:hover { border-color: var(--brand, #185FA5); color: var(--brand, #185FA5); }
.tablepick .tpdel:hover { border-color: var(--danger, #A32D2D); color: var(--danger, #A32D2D); }
@media (max-width: 720px) {
  .tablepick .ico { display: none; }
  .tablepick-sel, .tablepick .tpname { max-width: 120px; }
}

/* ---------- 工作表切换器（2026-09-27 多 sheet） ----------
   放在顶栏数据源徽标旁边。只有一张工作表时整个 #sheetPick 是 hidden 的，
   所以单表用户界面上看不到任何多余的东西。 */
.sheetpick {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12.5px; color: var(--tx2);
  background: var(--bg); border: 1px solid var(--line);
  border-radius: 6px; padding: 2px 8px 2px 6px;
}
.sheetpick .ico { font-size: 12px; line-height: 1; }
.sheetpick-sel {
  font: inherit; font-size: 12.5px; color: var(--tx);
  background: transparent; border: 0; outline: none; cursor: pointer;
  max-width: 240px; padding: 2px 0;
}
.sheetpick:hover { border-color: var(--tx3); }
/* 窄屏：只留下拉本身，省地方 */
@media (max-width: 720px) {
  .sheetpick { padding: 2px 4px; }
  .sheetpick .ico { display: none; }
  .sheetpick-sel { max-width: 130px; }
}

:root {
  --bg: #F6F7F9; --card: #FFFFFF; --line: #E7E9EE; --line2: #D6DAE2;
  --tx: #1B2230; --tx2: #5A6274; --tx3: #9299A8;
  --blue: #2563EB; --blue-h: #1D4ED8; --blue-bg: #EBF2FF;
  --ok: #067A4E; --ok-bg: #E2F6EC;
  --no: #C1291F; --no-bg: #FDECEA;
  --amber: #A05A03; --amber-bg: #FDF1DC;
  --sh-sm: 0 1px 2px rgba(16,24,40,.05), 0 1px 3px rgba(16,24,40,.06);
  --sh-md: 0 4px 10px rgba(16,24,40,.06), 0 10px 28px rgba(16,24,40,.08);
  --sh-lg: 0 12px 24px rgba(16,24,40,.12), 0 24px 56px rgba(16,24,40,.18);
  --r-lg: 14px; --r-md: 10px; --r-sm: 8px;
  --side-w: 216px;
  --header-h: 56px;
}

[hidden] { display: none !important; }

html { font-size: 13.5px; }
body {
  font-family: system-ui, -apple-system, "Segoe UI", "Microsoft YaHei", sans-serif;
  background: var(--bg); color: var(--tx);
  min-height: 100vh; line-height: 1.6; -webkit-font-smoothing: antialiased;
}

.layout { display: flex; min-height: 100vh; }

/* ---------- 左侧侧边栏 ---------- */
.side {
  width: var(--side-w); flex: 0 0 var(--side-w);
  background: linear-gradient(180deg, #FFFFFF 0%, #FAFBFE 100%);
  border-right: 1px solid var(--line);
  position: sticky; top: 0; height: 100vh;
  display: flex; flex-direction: column;
  padding: 16px 12px 14px; z-index: 40;
}
.side .logo-row { display: flex; align-items: center; gap: 10px; padding: 2px 8px 16px; }
.logo {
  width: 30px; height: 30px; border-radius: 9px;
  background: linear-gradient(135deg, #3B82F6, #2563EB);
  box-shadow: 0 2px 6px rgba(37,99,235,.35);
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 14px; font-weight: 600; flex: 0 0 auto;
}
.side .logo-row b { font-size: 14.5px; font-weight: 600; letter-spacing: .2px; }
.side nav { display: flex; flex-direction: column; gap: 3px; }
.side nav a {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; border-radius: 10px;
  color: var(--tx2); text-decoration: none; font-size: 13.5px; cursor: pointer;
  transition: all .13s ease; user-select: none;
}
.side nav a .ico { width: 20px; text-align: center; font-size: 14px; opacity: .85; }
.side nav a:hover { background: #F1F4FA; color: var(--tx); }
.side nav a.on { background: var(--blue-bg); color: var(--blue); font-weight: 600; box-shadow: inset 3px 0 0 var(--blue); }
.side nav a .new { font-size: 10px; background: var(--blue); color: #fff; border-radius: 4px; padding: 1px 5px; margin-left: auto; }
.side .side-tip { margin: 14px 8px 0; padding: 10px 11px; border-radius: 10px; background: var(--bg); border: 1px solid var(--line); font-size: 11.5px; color: var(--tx3); line-height: 1.65; }
.side .side-foot { margin-top: auto; border-top: 1px solid var(--line); padding-top: 12px; display: flex; align-items: center; gap: 9px; }
.avatar { width: 30px; height: 30px; border-radius: 50%; background: linear-gradient(135deg, #FFE7C2, #FFD79A); color: #935D00; display: flex; align-items: center; justify-content: center; font-size: 12.5px; font-weight: 600; flex: 0 0 auto; }
.side-foot .who-nm { font-size: 12.5px; font-weight: 500; line-height: 1.3; }
.side-foot .btn-exit { margin-left: auto; background: none; border: 0; color: var(--tx3); cursor: pointer; font-size: 12px; padding: 4px 6px; border-radius: 6px; }
.side-foot .btn-exit:hover { background: var(--bg); color: var(--no); }

/* ---------- 右侧主区 ---------- */
.right { flex: 1; min-width: 0; display: flex; flex-direction: column; }
header.bar {
  height: var(--header-h); flex: 0 0 var(--header-h); background: rgba(255,255,255,.86);
  backdrop-filter: blur(10px); border-bottom: 1px solid var(--line);
  display: flex; align-items: center; gap: 12px; padding: 0 20px;
  position: sticky; top: 0; z-index: 30;
}
.srcbadge { font-size: 11.5px; color: var(--tx2); background: var(--bg); border: 1px solid var(--line); padding: 3px 10px; border-radius: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 360px; }
.spacer { flex: 1; }
.hdbtn { font: inherit; font-size: 12.5px; cursor: pointer; color: var(--tx2); background: var(--card); border: 1px solid var(--line2); border-radius: var(--r-sm); padding: 6px 13px; white-space: nowrap; transition: all .15s ease; }
.hdbtn:hover { background: #F3F5F9; color: var(--tx); border-color: #C2C8D4; transform: translateY(-1px); box-shadow: var(--sh-sm); }
.hdbtn:active { transform: translateY(0); }
.hdbtn.primary { background: var(--blue); border-color: var(--blue); color: #fff; box-shadow: 0 1px 3px rgba(37,99,235,.35); }
.hdbtn.primary:hover { background: var(--blue-h); color: #fff; }
.hdbtn.danger { background: var(--no); border-color: var(--no); color: #fff; }
.hdbtn.danger:hover { background: #A6211A; color: #fff; }
.hdbtn:disabled { opacity: .45; cursor: not-allowed; transform: none; box-shadow: none; }

main { flex: 1; padding: 20px 24px 60px; max-width: 2100px; width: 100%; margin: 0 auto; }

/* ---------- 卡片 ---------- */
.card { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg); margin-bottom: 16px; box-shadow: var(--sh-sm); animation: cardIn .3s ease both; }
@keyframes cardIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
.card > .cardhead { padding: 13px 18px; border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.card > .cardhead h2 { font-size: 14.5px; font-weight: 600; }
.card > .cardbody { padding: 16px 18px; }
.muted { color: var(--tx3); }
.sm { font-size: 12px; }
.hint { color: var(--tx2); font-size: 12.5px; line-height: 1.75; }
.hint b { color: var(--tx); }

/* 两张卡并排一行（账号概况 + 注册口令） */
.card-row { display: flex; gap: 16px; align-items: stretch; }
.card-row > .card { flex: 1; margin-bottom: 16px; }

/* ---------- 统计小格 ---------- */
.stats { display: flex; gap: 12px; flex-wrap: wrap; }
.statbox { background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 16px 9px; min-width: 96px; box-shadow: var(--sh-sm); transition: transform .15s ease, box-shadow .15s ease; }
.statbox:hover { transform: translateY(-2px); box-shadow: var(--sh-md); }
.statbox .k { font-size: 11.5px; color: var(--tx3); }
.statbox .v { font-size: 21px; font-weight: 650; font-variant-numeric: tabular-nums; letter-spacing: -.3px; }
.statbox.warn .v { color: var(--amber); }
.statbox.ok .v { color: var(--ok); }
.statbox.err .v { color: var(--no); }
.statbox.blue .v { color: var(--blue); }

/* ---------- 表单 ---------- */
label.f { display: block; }
label.f > .lb { display: block; font-size: 12px; color: var(--tx2); margin-bottom: 6px; }
input[type=text], input[type=password], input[type=number], select, textarea {
  font: inherit; padding: 8px 12px; border: 1px solid var(--line2); border-radius: var(--r-sm);
  background: var(--card); color: var(--tx); width: 100%; transition: border-color .15s, box-shadow .15s;
}
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(37,99,235,.12); }
input:disabled, select:disabled { background: var(--bg); color: var(--tx3); }
select { width: auto; min-width: 150px; }
.row { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
.grow { flex: 1; min-width: 200px; }
input[type=number] { font-variant-numeric: tabular-nums; }

/* ---------- 表格（表头吸顶：随页面滚，贴顶栏下方） ---------- */
.tablewrap { }

/* ══════════ 列设置页里的字段表（2026-10-11 从弹窗搬成页面）══════════
   历史：弹窗时代这张表在自己的滚动盒子里，而表头是 sticky + `top: var(--header-h)`
   （那是**整页滚动**用的页顶栏厚度）→ 表头被往下顶 60px、看起来像"被内容压住"。
   现在整页滚动，默认那条 sticky 规则就是对的，所以**不再需要** `top: 0` 的覆盖；
   这里只保留列宽（6 列：字段 / 列字母 / 显示名 / **显示类型** / 删除·核心 / 核对）。
   ★ 2026-10-12（platform-44）：第 4 列是新增的「显示类型」三选一
     （图片展示 / 链接按钮 / 展示文本 —— 用户要求"列设置加一个选项分为三个选择"）。 */
#grpBody table.grid { min-width: 1020px; }
#grpBody table.grid th:nth-child(1), #grpBody table.grid td:nth-child(1) { width: 250px; }
#grpBody table.grid th:nth-child(2), #grpBody table.grid td:nth-child(2) { width: 120px; }
#grpBody table.grid th:nth-child(3), #grpBody table.grid td:nth-child(3) { width: 180px; }
#grpBody table.grid th:nth-child(4), #grpBody table.grid td:nth-child(4) { width: 190px; }
#grpBody table.grid th:nth-child(5), #grpBody table.grid td:nth-child(5) { width: 96px; }
/* 自动识别后"没认出来"的行：标黄（要核对的就是这几行） */
#grpBody table.grid tbody tr.missed > td { background: #FFFBF0; }
#grpBody table.grid tbody tr.missed > td:first-child { box-shadow: inset 3px 0 0 #E8A33D; }
table.grid { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 12.8px; }
table.grid th, table.grid td { padding: 9px 12px; text-align: left; border-bottom: 1px solid var(--line); vertical-align: middle; }
table.grid thead th { position: sticky; top: var(--header-h); z-index: 5; background: #F7F8FB; box-shadow: 0 1px 0 var(--line2), 0 4px 10px -6px rgba(16,24,40,.10); font-weight: 600; color: var(--tx2); font-size: 11.5px; white-space: nowrap; }
table.grid tbody tr { transition: background .1s; }
table.grid tbody tr:hover td { background: #F6F8FC; }
table.grid td.mono { font-family: ui-monospace, Consolas, monospace; font-size: 11.8px; }
table.grid td.num, table.grid th.num { text-align: right; font-variant-numeric: tabular-nums; }
table.grid th.chk, table.grid td.chk { width: 36px; text-align: center; }
table.grid input[type=checkbox] { width: 15px; height: 15px; cursor: pointer; accent-color: var(--blue); }
table.grid tbody tr:last-child td:first-child { border-bottom-left-radius: var(--r-lg); }
table.grid tbody tr:last-child td:last-child { border-bottom-right-radius: var(--r-lg); }

/* ---------- 可排序表头（点一下升、再点降、第三下取消） ---------- */
/* 用 button 而不是 th 上绑事件：键盘也能操作，而且点击区域明确 */
table.grid th.sortable { padding: 0; }
table.grid th.sortable > button {
  font: inherit; font-size: 11.5px; font-weight: 600; color: inherit;
  background: transparent; border: 0; cursor: pointer; width: 100%;
  padding: 9px 12px; text-align: left; display: inline-flex; align-items: center; gap: 5px;
  transition: color .13s, background .13s;
}
table.grid th.sortable.num > button { justify-content: flex-end; }
table.grid th.sortable > button:hover { color: var(--blue); background: #EEF3FB; }
table.grid th.sortable.on > button { color: var(--blue); }
/* 未排序时给个淡淡的提示箭头，鼠标悬停才明显 —— 免得表头看起来像纯文字 */
table.grid th.sortable > button::after {
  content: '⇅'; font-size: 10px; opacity: .28; transition: opacity .13s;
}
table.grid th.sortable > button:hover::after { opacity: .7; }
table.grid th.sortable.on.asc > button::after { content: '↑'; opacity: 1; }
table.grid th.sortable.on.desc > button::after { content: '↓'; opacity: 1; }

/* ---------- 分页条 ---------- */
/* 放在 .tablewrap 外面（表格里是 sticky 定位，塞进去会打架） */
.pagebar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 10px 18px; border-top: 1px solid var(--line);
  font-size: 12.5px; color: var(--tx2);
}
.pagebar .rng { font-variant-numeric: tabular-nums; }
.pagebar .rng b { color: var(--tx); }
.pagebar .sp { flex: 1; }
.pagebar button {
  font: inherit; font-size: 12.5px; cursor: pointer; color: var(--tx2);
  background: var(--card); border: 1px solid var(--line2); border-radius: var(--r-sm);
  padding: 5px 12px; transition: all .13s;
}
.pagebar button:hover:not(:disabled) { background: #F3F5F9; color: var(--tx); border-color: #C2C8D4; }
.pagebar button:disabled { opacity: .45; cursor: not-allowed; }
.pagebar select {
  font: inherit; font-size: 12.5px; padding: 5px 8px; width: auto; min-width: 72px;
  border: 1px solid var(--line2); border-radius: var(--r-sm); background: var(--card); color: var(--tx);
}
.pagebar .pageno { font-variant-numeric: tabular-nums; }

.pill { font-size: 11px; padding: 2.5px 9px; border-radius: 6px; white-space: nowrap; font-weight: 500; }
.pill.ok { background: var(--ok-bg); color: var(--ok); }
.pill.todo { background: var(--amber-bg); color: var(--amber); }
.pill.err { background: var(--no-bg); color: var(--no); }
.pill.none { background: var(--bg); color: var(--tx3); border: 1px solid var(--line); }
.pill.mine { background: var(--blue-bg); color: var(--blue); }
/* ★ 2026-10-27（B-30 · BUG-042）：「跳过 N」—— 中性灰，和"已判/已写回"区分开 */
.pill.skip { background: var(--bg); color: var(--tx2); border: 1px solid var(--line); }

.lv { font-size: 11px; padding: 2px 8px; border-radius: 6px; white-space: nowrap; }
.lv1 { background: var(--blue-bg); color: var(--blue); }
.lv2 { background: var(--amber-bg); color: var(--amber); }
.lv3 { background: var(--bg); color: var(--tx2); border: 1px solid var(--line); }

/* ---------- 按钮 / 输入框的尺寸变体 ---------- */
/* 为什么要有：这几个值原来散在各页的 style="..." 里硬调（padding:8px 16px、width:220px…），
   同一种东西四个页面四种写法。收进 CSS 之后改一次就全变。 */
.hdbtn.btn-sm { padding: 8px 16px; }
.input-sm { width: 130px; }        /* 数量输入框 */
.input-md { width: 220px; }        /* 搜索框 */

/* ---------- 一个小间距工具（原来到处写 style="margin-top:12px"） ---------- */
.mt-2 { margin-top: 10px; }
.mt-3 { margin-top: 14px; }

/* ---------- 筛选 chips（胶囊 + 数量徽标） ---------- */
.chips { display: flex; gap: 8px; flex-wrap: wrap; }
.chip { display: inline-flex; align-items: center; gap: 7px; font: inherit; font-size: 12.5px; padding: 6px 14px; border-radius: 20px; cursor: pointer; background: var(--card); border: 1px solid var(--line2); color: var(--tx2); transition: all .15s ease; box-shadow: var(--sh-sm); }
.chip:hover { border-color: #B8C4D8; color: var(--tx); transform: translateY(-1px); box-shadow: var(--sh-md); }
.chip.on { background: var(--blue); border-color: var(--blue); color: #fff; font-weight: 600; box-shadow: 0 2px 6px rgba(37,99,235,.3); }
.chip .n { font-size: 10.5px; padding: 1px 7px; border-radius: 10px; background: var(--bg); color: var(--tx3); font-variant-numeric: tabular-nums; }
.chip.on .n { background: rgba(255,255,255,.22); color: #fff; }

/* ---------- 分派操作卡（分题 / 抽走 / 改派） ---------- */
.mode-seg { display: inline-flex; gap: 3px; padding: 3px; border-radius: 10px; background: var(--bg); border: 1px solid var(--line); }
.mode-seg button { font: inherit; font-size: 13px; cursor: pointer; padding: 6px 16px; background: transparent; color: var(--tx2); border: 0; border-radius: 7px; transition: all .15s; }
.mode-seg button:hover { color: var(--tx); }
.mode-seg button.on { background: var(--card); color: var(--blue); font-weight: 600; box-shadow: var(--sh-sm); }
.mode-seg button.on.danger { color: var(--no); }

.range-form { display: flex; gap: 14px; align-items: flex-end; flex-wrap: wrap; margin-top: 14px; }
.range-form label.f { margin: 0; }
.range-form .cell-who select { min-width: 190px; }
.range-form .go { padding: 9px 22px; font-weight: 600; }

.range-summary { margin-left: auto; display: flex; align-items: center; gap: 10px; padding: 6px 14px; border-radius: 10px; background: var(--blue-bg); border: 1px solid #C9DBFC; transition: all .2s ease; }
.range-summary.idle { background: var(--bg); border-color: var(--line); color: var(--tx3); }
.range-summary.danger { background: var(--no-bg); border-color: #E9BDBD; }
.range-summary.danger .big { color: var(--no); }
.range-summary .big { font-size: 19px; font-weight: 700; color: var(--blue); font-variant-numeric: tabular-nums; }
.range-summary.idle .big { color: var(--tx3); }
.range-summary .who { font-size: 12.5px; color: var(--tx2); }
.range-summary .who b { color: var(--tx); }

.range-detail { margin-top: 14px; padding: 12px 14px; border-radius: var(--r-md); background: var(--bg); border: 1px dashed var(--line2); font-size: 12.5px; color: var(--tx2); line-height: 1.8; }
.range-detail b { color: var(--tx); }
.range-detail .warn { color: var(--amber); font-weight: 600; }
.range-detail .ok { color: var(--ok); font-weight: 600; }
.range-detail .err { color: var(--no); font-weight: 600; }
.range-detail .skip-list { font-family: ui-monospace, Consolas, monospace; font-size: 11.5px; color: var(--tx3); }

/* 可收起的明细卡头 */
.cardhead.clickable { cursor: pointer; user-select: none; }
.cardhead.clickable:hover h2 { color: var(--blue); }
.toggle-arrow { display: inline-block; transition: transform .2s ease; font-size: 11px; color: var(--tx3); }
.toggle-arrow.open { transform: rotate(180deg); }

/* 正确率迷你条形 */
.ratebar { width: 120px; height: 6px; background: #EDF0F5; border-radius: 3px; overflow: hidden; display: inline-block; vertical-align: 2px; margin-left: 8px; }
.ratebar i { display: block; height: 100%; border-radius: 3px; transition: width .4s ease; }
.ratebar i.ok { background: #22A06B; } .ratebar i.mid { background: #E8A23D; } .ratebar i.bad { background: #D64545; }

/* ---------- 列设置页（2026-10-11，从弹窗改成独立页面）----------
   用户要求：「四大类缩略展示，点击对应的然后开始设置对应的行，页面要简洁美观，方便交互」。
   缩略卡 = 一行五张，每张写清"这一类几个字段、配了几列、哪几项不显示"；
   点哪张，下面那张表就换成哪一类的字段行（一次只看一类，不挤）。 */
.grpgrid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; margin-bottom: 16px; }
@media (max-width: 1280px) { .grpgrid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 820px) { .grpgrid { grid-template-columns: 1fr 1fr; } }
.grpcard { text-align: left; cursor: pointer; font: inherit; color: var(--tx);
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 12px 14px; transition: all .12s; display: flex; flex-direction: column; gap: 6px; }
.grpcard:hover { border-color: var(--blue); box-shadow: 0 4px 14px -6px rgba(37,99,235,.35); }
.grpcard.on { border-color: var(--blue); background: var(--blue-bg); box-shadow: 0 0 0 2px #DCE8FF; }
.grpcard .gt { display: flex; align-items: center; gap: 8px; font-size: 13.5px; }
.grpcard .gd { font-size: 12px; color: var(--tx3); line-height: 1.6; }
.grpcard .gm { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 2px; }
/* 列设置页里每行的两个输入框：列字母窄、显示名宽 */
.colset input.colsel { width: 56px; text-transform: uppercase; font-family: ui-monospace, Consolas, monospace;
  font-size: 12.5px; padding: 5px 8px; border: 1px solid var(--line2); border-radius: 7px; background: var(--card); color: var(--tx); }
.colset input.nameinp { width: 100%; min-width: 120px; font-size: 12.5px; padding: 5px 8px;
  border: 1px solid var(--line2); border-radius: 7px; background: var(--card); color: var(--tx); }
.colset input.colsel:focus, .colset input.nameinp:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 2px #DCE8FF; }
/* ★ 2026-10-12（platform-44）：列设置里的「显示类型」三选一（图片展示 / 链接按钮 / 展示文本） */
.colset select.typesel { width: 100%; min-width: 132px; font: inherit; font-size: 12.5px; padding: 5px 8px;
  border: 1px solid var(--line2); border-radius: 7px; background: var(--card); color: var(--tx); cursor: pointer; }
.colset select.typesel:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 2px #DCE8FF; }
/* ★ 2026-10-12（platform-45）：**列位重叠**提示（同一列被两项使用）。
   用户真机报的「缩略图标题写着 1688 商品图、可我的 Q 列是左i截图」——
   除"标题写死"这个主因，第二种来源就是列位重叠（内置图片字段 skuImageY 的默认列正好是 Q）。
   这类错不报错、只是显示得不对，所以要显眼但**不刺眼**（蓝色提示，不是红色报错）。 */
.banner.clash { border-color: #C9DBFC; background: var(--blue-bg); color: var(--blue-h);
  text-align: left; padding: 12px 14px; line-height: 1.75; }
.banner.clash b { display: block; margin-bottom: 2px; }
.banner.clash .sm { color: var(--tx2); margin-top: 4px; }
.sm.clashline { color: #A06000; margin-top: 3px; }

/* ---------- 复检页（2026-10-10 阶段③）----------
   两张卡片并排（窄屏自动堆成一列）：左边「是否修改」、右边「是否申诉」。
   卡片里一次只显示一条（上一条/下一条翻），所以要限高 + 内部滚动 ——
   免得一条长数据把另一张卡片顶到屏幕外。 */
.two-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; }
@media (max-width: 1100px) { .two-cards { grid-template-columns: 1fr; } }
.two-cards .card { margin-bottom: 0; }
.two-cards .cardhead h2 { display: flex; align-items: center; gap: 8px; }
.two-cards .cardbody { max-height: 66vh; overflow: auto; }
.rowline { display: flex; align-items: center; gap: 8px; }
.fieldgrid { display: grid; grid-template-columns: 1fr; gap: 4px; margin-top: 4px; border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; }
.fitem { display: grid; grid-template-columns: 172px 1fr; gap: 8px; padding: 6px 10px; background: var(--card); border-bottom: 1px solid var(--line); font-size: 12.5px; }
.fitem:last-child { border-bottom: 0; }
.fitem .fk { color: var(--tx2); }
.fitem .fv { color: var(--tx); word-break: break-all; white-space: pre-wrap; }
.quotebox { border: 1px solid #C9DBFC; background: var(--blue-bg); border-radius: var(--r-md); padding: 10px 12px; }
.two-cards button.btn, .two-cards button.primary {
  font: inherit; font-size: 12.5px; padding: 6px 14px; border-radius: 8px; cursor: pointer;
  border: 1px solid var(--line2); background: var(--card); color: var(--tx);
}
.two-cards button.btn:hover:not(:disabled) { border-color: var(--blue); color: var(--blue); }
.two-cards button.btn:disabled { opacity: .45; cursor: not-allowed; }
.two-cards button.primary { background: var(--blue); border-color: var(--blue); color: #fff; font-weight: 600; }
.two-cards button.primary:hover:not(:disabled) { background: var(--blue-h); border-color: var(--blue-h); }
.two-cards select, .two-cards input[type=text] {
  font: inherit; font-size: 12.5px; padding: 5px 9px; border: 1px solid var(--line2);
  border-radius: 7px; background: var(--card); color: var(--tx); min-width: 120px;
}
.two-cards input[type=text] { flex: 1 1 auto; min-width: 0; }
/* 复检页选一线那一行（宽度收进 CSS，不在 HTML 里写内联尺寸 —— 平台的一致约定） */
.pickwho { margin: 0; flex: 0 0 300px; }
.pickwho select { width: 100%; }

/* ---------- 提示 / 空态 ---------- */.banner { background: var(--card); border: 1px dashed var(--line2); border-radius: var(--r-lg); padding: 22px; text-align: center; color: var(--tx2); font-size: 13px; }
.banner.err { border-color: #E9BDBD; background: var(--no-bg); color: var(--no); }
/* 2026-10-09：列设置弹窗要显示"保存不了/注意"两种反馈。
   ⚠️ 必须是**左对齐**（默认 .banner 是居中的，多行警告居中读不清） */
.banner.warn { border-color: #EED4A6; background: var(--amber-bg); color: var(--amber); text-align: left; padding: 12px 14px; }
.banner.err.left { text-align: left; padding: 12px 14px; }
/* ★ 2026-10-12（platform-46）：**保存后核对**那条横幅（列设置页 #savedBox）。
   用户原话：「保存之后再重新点进去就是默认的设置了……要不然难以对比呀」——
   这条绿横幅就是"你刚存的这份，服务器上确实是它"。 */
.banner.ok { border-color: #BFE3D4; background: var(--ok-bg); color: #0F6E56; }
.banner.ok.left { text-align: left; padding: 12px 14px; }
/* ★ 2026-10-11：「读出来 0 行」的说明框（分题页）。
   为什么单独一套：它不是"出错了"，而是"读到了但一行都不合格" —— 得把
   判据列现在配的是哪一列、该去哪儿改，一行一行说清楚（多行必须左对齐）。 */
.banner.diag { margin-top: 10px; }
.banner.diag .diag-title { font-weight: 600; font-size: 13.5px; margin-bottom: 6px; }
.banner.diag .diag-line { font-size: 12.5px; line-height: 1.7; color: var(--tx2); }
.empty { text-align: center; padding: 34px 16px; color: var(--tx3); }
.empty .big { font-size: 30px; margin-bottom: 8px; filter: grayscale(.2); }
.empty .t { font-size: 13px; color: var(--tx2); }

/* ---------- 弹框 ---------- */
.modal { position: fixed; inset: 0; background: rgba(15,17,21,.45); display: flex; align-items: center; justify-content: center; padding: 20px; z-index: 60; animation: fadeIn .18s ease; }
@keyframes fadeIn { from { opacity: 0; } }
.modal-card { background: var(--card); border-radius: 16px; border: 1px solid var(--line); width: 100%; max-width: 470px; max-height: 86vh; overflow: auto; box-shadow: var(--sh-lg); animation: popIn .22s cubic-bezier(.2,.9,.3,1.15); }
/* 2026-10-09：列设置弹窗（表格管理页）是"字段表"（4 列），窄了没法看 */
.modal-card.wide { max-width: 880px; }
@keyframes popIn { from { opacity: 0; transform: scale(.94); } }
.modal-head { padding: 14px 18px; border-bottom: 1px solid var(--line); display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.modal-head h3 { font-size: 14.5px; font-weight: 600; }
.modal-head .x { background: transparent; border: 0; font: inherit; font-size: 14px; cursor: pointer; color: var(--tx3); padding: 3px 8px; border-radius: 7px; transition: all .12s; }
.modal-head .x:hover { background: var(--bg); color: var(--tx); }
.modal-body { padding: 16px 18px; }
.modal-body p { margin-bottom: 8px; line-height: 1.75; color: var(--tx2); }
.modal-body p b { color: var(--tx); }
.modal-actions { padding: 13px 18px; border-top: 1px solid var(--line); display: flex; justify-content: flex-end; gap: 9px; }
.modal-actions button { font: inherit; font-size: 13px; cursor: pointer; padding: 8px 17px; border: 1px solid var(--line2); border-radius: var(--r-sm); background: var(--card); color: var(--tx); transition: all .13s; }
.modal-actions button:hover { background: var(--bg); }
.modal-actions button.primary { background: var(--blue); border-color: var(--blue); color: #fff; }
.modal-actions button.primary:hover { background: var(--blue-h); }
.modal-actions button.danger { background: var(--no); border-color: var(--no); color: #fff; }
/* ★ 2026-10-16（插件批次）：弹窗按钮禁用态（「全判完 → 开始质检」禁用时用；同全站 .45 变淡惯例） */
.modal-actions button:disabled { opacity: .45; cursor: not-allowed; }
.modal-actions button:disabled:hover { background: var(--card); }
.modal-actions button.primary:disabled, .modal-actions button.primary:disabled:hover { background: var(--blue); border-color: var(--blue); }

/* ---------- toast ---------- */
#toast { position: fixed; left: calc(50% + var(--side-w) / 2); transform: translateX(-50%) translateY(-16px); top: 70px; background: #232936; color: #fff; padding: 10px 18px; border-radius: 10px; font-size: 13px; opacity: 0; pointer-events: none; transition: opacity .2s ease, transform .2s ease; z-index: 90; box-shadow: var(--sh-md); max-width: min(600px, calc(100vw - var(--side-w) - 40px)); }
#toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
#toast.err { background: var(--no); }
#toast.ok { background: #0B7A52; }

/* ---------- 注册口令 ---------- */
.codebox { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; background: linear-gradient(135deg, #EBF2FF, #F2F7FF); border: 1px solid #C9DBFC; border-radius: var(--r-md); padding: 14px 18px; }
.codebox .code { font-family: ui-monospace, Consolas, monospace; font-size: 28px; letter-spacing: 6px; font-weight: 700; color: var(--blue); }
.codebox .meta { font-size: 12px; color: var(--tx2); line-height: 1.7; }

/* ---------- 登录页（与平台同令牌） ---------- */
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; background: radial-gradient(900px 260px at 50% -60px, #EDF2FC 0%, transparent 70%), var(--bg); }
.login-card { width: 380px; max-width: 100%; padding: 28px 28px 24px; background: var(--card); border: 1px solid var(--line); border-radius: 18px; box-shadow: var(--sh-lg); }
.login-card .brand-row { display: flex; align-items: center; gap: 11px; margin-bottom: 3px; }
.login-card h1 { font-size: 19px; margin: 0; }
.login-card .sub { color: var(--tx3); font-size: 12.5px; margin: 0 0 18px; }
.login-card .seg { display: flex; gap: 5px; margin-bottom: 18px; background: var(--bg); padding: 4px; border-radius: 10px; }
.login-card .seg button { flex: 1; font: inherit; font-size: 13.5px; cursor: pointer; padding: 7.5px 0; background: transparent; color: var(--tx2); border: 0; border-radius: 8px; transition: all .15s; }
.login-card .seg button.on { background: var(--card); color: var(--blue); font-weight: 600; box-shadow: var(--sh-sm); }
.login-card label { display: block; color: var(--tx2); font-size: 12.5px; margin-bottom: 6px; }
.login-card input { width: 100%; padding: 10px 13px; font-size: 14px; margin-bottom: 14px; background: var(--card); color: var(--tx); border: 1px solid var(--line2); border-radius: var(--r-sm); transition: border-color .15s, box-shadow .15s; }
.login-card input:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(37,99,235,.12); }
.login-card .go { width: 100%; margin-top: 4px; padding: 10.5px; font: inherit; font-size: 14.5px; font-weight: 600; cursor: pointer; background: var(--blue); color: #fff; border: 0; border-radius: var(--r-sm); box-shadow: 0 2px 8px rgba(37,99,235,.35); transition: all .15s; }
.login-card .go:hover { background: var(--blue-h); transform: translateY(-1px); }
.login-card .go:disabled { opacity: .5; cursor: not-allowed; transform: none; }
.login-card .err { margin-top: 12px; color: #C1291F; font-size: 13px; min-height: 19px; white-space: pre-wrap; }
.login-card .hintbox { margin-bottom: 14px; padding: 10px 12px; border-radius: 8px; font-size: 12.5px; line-height: 1.7; background: var(--blue-bg); border: 1px solid #C9DBFC; color: #1E4FBE; }
.login-card .hintbox.warn { background: var(--amber-bg); border-color: #EED4A6; color: var(--amber); }
.login-card .note { margin-top: 16px; color: var(--tx3); font-size: 12px; line-height: 1.75; }
.login-card .note b { color: var(--tx2); font-weight: 600; }

/* ---------- 窄屏：侧边栏折成顶部横条 ---------- */
@media (max-width: 900px) {
  .layout { flex-direction: column; }
  .side { width: 100%; flex: 0 0 auto; height: auto; position: static; flex-direction: row; align-items: center; gap: 8px; padding: 8px 12px; }
  .side nav { flex-direction: row; flex: 1; overflow-x: auto; }
  .side nav a { padding: 8px 10px; white-space: nowrap; }
  .side .logo-row { padding: 0 6px; }
  .side .logo-row b, .side .side-tip { display: none; }
  .side .side-foot { margin: 0; border: 0; padding: 0; }
  .side-foot .who-nm { display: none; }
  #toast { left: 50%; }
  main { padding: 14px 12px 60px; }
  .range-summary { margin-left: 0; }
  .card-row { flex-direction: column; gap: 0; }
}

/* ---------- 复检页「认领条数」输入框（2026-10-16 简化版/认领制）---------- */
.claim-count { width: 90px; font: inherit; font-size: 12.5px; padding: 6px 8px;
               border: 1px solid var(--line2); border-radius: var(--r-sm); background: var(--card); color: var(--tx); }

/* ---------- 质检页「计划制」顶栏与行内输入（2026-10-16 · platform-56 P3）----------
   日期 / G 两个小输入要紧凑地并排（.planbar），日期本身加粗醒目（防在历史计划上误操作）；
   操作按钮排（.oprow）—— 是"质检页计划制"自己长出来的样式，别处不共用
   （复检页的认领条数在 .claim-count）。 */
.planbar { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--tx2); white-space: nowrap; }
.planbar input[type="date"], .planbar input[type="number"] {
  font: inherit; font-size: 12.5px; padding: 5px 8px;
  border: 1px solid var(--line2); border-radius: var(--r-sm); background: var(--card); color: var(--tx);
}
.planbar input[type="date"] { font-weight: 600; }
.planbar input[type="number"] { width: 62px; text-align: center; }
.oprow { display: flex; gap: 6px; flex-wrap: wrap; }
/* ★ 2026-10-18（BUG-008）：分配池勾选 / 每线分配明细 / 未分配红字 */
.poolbox { display: flex; flex-wrap: wrap; gap: 8px 14px; margin: 8px 0 10px; }
.poolbox label { display: flex; align-items: center; gap: 5px; font-size: 13px; color: var(--tx2); }
.assigncell { font-size: 12px; color: var(--tx2); line-height: 1.7; }
.assigncell b { color: var(--tx1); }
.warnline { color: var(--danger, #A32D2D); font-weight: 600; }

/* ---------- 列设置页「同款判定」区块（2026-10-16 · platform-56 P3）---------- */
.bucketrow { display: flex; gap: 14px; flex-wrap: wrap; align-items: flex-end; }
.bucketrow .f { flex: 1 1 240px; }
.bucketrow select, .bucketrow input[type="text"] { width: 100%; }

/* ---------- 质检页左侧「同款率」窄卡（2026-10-25 · B-12 · BUG-023）---------- */
.qcLayout { display:grid; grid-template-columns:196px minmax(0,1fr); gap:12px; align-items:start; }
.rateCard { position:sticky; top:12px; }
.rateCard .cardbody { padding:10px 12px; }
.rateDate { width:100%; margin-bottom:6px; }
.rateBlock { padding:8px 0; border-top:1px solid #EEF0F4; }
.rateBlock:first-of-type { border-top:none; }
.rateBlock .rl { font-size:12px; color:#666; }
.rateBlock .rv { font-size:24px; font-weight:700; line-height:1.2; }
.rateBlock .rs { font-size:11px; color:#888; margin-top:2px; line-height:1.4; }
/* ★ 2026-11-04：左侧「今天每个质检抽了多少」—— 名字 + 抽检条数 + 同款条数 */
.qcLoad { margin-top:4px; }
.qcLoad .row { display:flex; align-items:baseline; gap:6px; font-size:12px; line-height:1.9; }
.qcLoad .row + .row { border-top:1px dashed #F0F2F6; }
.qcLoad .nm { flex:1 1 auto; color:#333; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.qcLoad .n1 { color:#333; font-variant-numeric:tabular-nums; }
.qcLoad .n2 { color:#8A6D1F; font-variant-numeric:tabular-nums; min-width:52px; text-align:right; }
.qcLoad .row.sum { border-top:1px solid #E6E9EF; color:#666; }
.qcLoad .row.sum .nm { color:#666; }
@media (max-width:900px) { .qcLayout { grid-template-columns:1fr; } .rateCard { position:static; } }

/* ---------- 复检页「无主」卡片（2026-10-25 · B-16 · BUG-027）---------- */
.unown-row { margin:10px 0; flex-wrap:wrap; gap:10px; }
.unown-tag { font-size:12.5px; color:var(--tx2); font-weight:600; }
.unown-pick { display:inline-flex; flex-wrap:wrap; gap:4px 14px; }
.unown-pick .pickone { display:inline-flex; align-items:center; gap:4px; font-size:12.5px; color:var(--tx); cursor:pointer; }
.unown-pick input[type=checkbox] { width:14px; height:14px; cursor:pointer; accent-color:var(--blue); }
