/* =========================================================================
   文档稿件对比智能体 —— 样式
   浅色主题，业务化配色；差异用醒目但克制的三色
   ========================================================================= */
:root{
  --bg:#f4f6fa;
  --panel:#ffffff;
  --ink:#1b2330;
  --ink-2:#4a5566;
  --ink-3:#8494a8;
  --line:#e2e8f2;
  --line-2:#d3dbe8;
  --brand:#2f6df6;
  --brand-d:#1c52cc;
  --brand-l:#eaf1ff;

  --del-bg:#ffe9e9;
  --del-ink:#b42318;
  --del-line:#f4a09a;
  --ins-bg:#e4f8ec;
  --ins-ink:#0f7a45;
  --ins-line:#8ed6ae;
  --chg-bg:#fff3d4;
  --chg-ink:#8a5a00;
  --chg-line:#f0c674;
  --fmt-bg:#f0e9ff;
  --fmt-ink:#6b34d6;
  --fmt-line:#b79bf0;

  --r:10px;
  --sh:0 1px 2px rgba(20,32,54,.06), 0 6px 20px rgba(20,32,54,.06);
  --mono:"SF Mono",Consolas,"Cascadia Mono",Menlo,monospace;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  background:var(--bg);color:var(--ink);
  font:14px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei","PingFang SC",sans-serif;
  -webkit-font-smoothing:antialiased;
}
h1,h2,h3,h4{margin:0;font-weight:700}
button,input,select{font-family:inherit;font-size:inherit;color:inherit}
.hidden{display:none !important}

/* ---------------- 顶栏 ---------------- */
.topbar{
  position:sticky;top:0;z-index:40;
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:12px 24px;background:#fff;
  border-bottom:1px solid var(--line);
  box-shadow:0 1px 8px rgba(20,32,54,.05);
}
.brand{display:flex;align-items:center;gap:12px;min-width:0}
.logo{
  width:38px;height:38px;border-radius:11px;flex:none;
  background:linear-gradient(140deg,var(--brand),#6f4bf0);
  color:#fff;display:grid;place-items:center;font-size:19px;font-weight:800;
  box-shadow:0 4px 12px rgba(47,109,246,.32);
}
.brand-txt h1{font-size:16px;letter-spacing:.2px}
.brand-txt p{margin:1px 0 0;font-size:12px;color:var(--ink-3)}
.top-actions{display:flex;align-items:center;gap:12px}
.stat-chips{display:flex;gap:7px;flex-wrap:wrap}
.chip{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;
  border:1px solid transparent;white-space:nowrap;
}
.chip i{font-style:normal;opacity:.75;font-weight:500}
.chip.c-chg{background:var(--chg-bg);color:var(--chg-ink);border-color:var(--chg-line)}
.chip.c-ins{background:var(--ins-bg);color:var(--ins-ink);border-color:var(--ins-line)}
.chip.c-del{background:var(--del-bg);color:var(--del-ink);border-color:var(--del-line)}
.chip.c-fmt{background:var(--fmt-bg);color:var(--fmt-ink);border-color:var(--fmt-line)}
.chip.c-ok{background:#eaf7ee;color:#1a7f45;border-color:#b7e2c6}
.chip.c-sim{background:var(--brand-l);color:var(--brand-d);border-color:#c3d8ff}

/* ---------------- 面板 ---------------- */
.panel{
  margin:16px 24px;background:var(--panel);
  border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh);
}
.panel-hd{
  display:flex;align-items:center;gap:12px;
  padding:14px 18px;border-bottom:1px solid var(--line);flex-wrap:wrap;
}
.panel-hd h2{font-size:14.5px}
.panel-hd .step{
  width:22px;height:22px;border-radius:7px;flex:none;
  background:var(--brand);color:#fff;display:grid;place-items:center;
  font-size:12px;font-weight:700;
}
.hd-actions{margin-left:auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.panel-ft{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:12px 18px;border-top:1px solid var(--line);background:#fafbfe;
  border-radius:0 0 var(--r) var(--r);
}

/* ---------------- 按钮 ---------------- */
.btn{
  border:1px solid var(--line-2);background:#fff;color:var(--ink-2);
  padding:7px 14px;border-radius:8px;cursor:pointer;font-weight:600;
  transition:.16s;white-space:nowrap;
}
.btn:hover{border-color:var(--brand);color:var(--brand-d);background:var(--brand-l)}
.btn:active{transform:translateY(1px)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 2px 8px rgba(47,109,246,.28)}
.btn.primary:hover{background:var(--brand-d);color:#fff}
.btn.big{padding:10px 26px;font-size:14.5px}
.btn.tiny{padding:4px 10px;font-size:12.5px}
.btn.ghost{background:transparent}
.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.mini-check{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;color:var(--ink-2);cursor:pointer;user-select:none}
.mini-check input{accent-color:var(--brand);margin:0}
.hint{font-size:12px;color:var(--ink-3);margin:0}
.grow{flex:1}

/* ---------------- 上传区 ---------------- */
.dropzone{
  margin:16px 18px;border:1.5px dashed var(--line-2);border-radius:12px;
  background:linear-gradient(180deg,#fbfcff,#f7f9fd);
  cursor:pointer;transition:.18s;
}
.dropzone:hover,.dropzone.over{border-color:var(--brand);background:var(--brand-l)}
.dz-inner{padding:26px 16px;text-align:center;color:var(--ink-2)}
.dz-inner p{margin:2px 0}
.dz-icon{font-size:26px;color:var(--brand);line-height:1}
.dz-sub{font-size:12px;color:var(--ink-3)}

/* 文件列表 */
.file-list{display:flex;flex-wrap:wrap;gap:10px;padding:0 18px 16px}
.file-card{
  display:flex;align-items:center;gap:10px;
  padding:9px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;
  min-width:250px;max-width:340px;position:relative;
}
.file-card.is-base{border-color:var(--brand);background:var(--brand-l);box-shadow:0 0 0 2px rgba(47,109,246,.12)}
.file-card .ft{
  width:34px;height:34px;border-radius:8px;flex:none;display:grid;place-items:center;
  font-size:10px;font-weight:800;color:#fff;letter-spacing:.3px;
}
.ft-word{background:#2b579a}.ft-excel{background:#1d6f42}.ft-pdf{background:#c0392b}
.file-card .fm{min-width:0;flex:1}
.file-card .fn{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.file-card .fs{font-size:11.5px;color:var(--ink-3);display:flex;gap:8px;flex-wrap:wrap}
.badge{font-size:10.5px;padding:1px 6px;border-radius:5px;background:var(--brand);color:#fff;font-weight:700}
.badge.b2{background:#6f4bf0}
.file-x{
  border:0;background:transparent;color:var(--ink-3);cursor:pointer;
  font-size:16px;line-height:1;padding:2px 4px;border-radius:5px;
}
.file-x:hover{background:var(--del-bg);color:var(--del-ink)}
.card-role{font-size:11px;color:var(--brand-d);font-weight:700}

/* 对比设置条 */
.compare-bar{
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  padding:13px 18px;border-top:1px solid var(--line);background:#fafbfe;
  border-radius:0 0 var(--r) var(--r);
}
.cb-left{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.cb-label{font-size:12px;font-weight:700;color:var(--ink-3);letter-spacing:.4px}
.cb-group{display:flex;align-items:center;gap:6px}
.cb-group label{font-size:12.5px;color:var(--ink-2)}
.cb-arrow{color:var(--brand);font-size:17px;font-weight:700}
select,input[type=number],input[type=text]{
  border:1px solid var(--line-2);border-radius:7px;padding:5px 8px;background:#fff;
  outline:none;transition:.15s;
}
select:focus,input:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(47,109,246,.13)}
select[multiple]{padding:2px;min-width:150px}

/* ---------------- Excel 设置 ---------------- */
.excel-grid{
  display:grid;grid-template-columns:260px 300px 1fr;gap:14px;padding:16px 18px;
  grid-auto-rows:min-content;
}
.excel-grid{grid-template-areas:"a b c" "d d d" ". . ."}
.excel-grid .ex-card:nth-child(1){grid-area:a}
.excel-grid .ex-card:nth-child(2){grid-area:b}
.excel-grid .ex-card:nth-child(3){grid-area:c}
.excel-grid .ex-card:nth-child(4){grid-area:d}
@media (max-width:1200px){
  .excel-grid{grid-template-columns:1fr;grid-template-areas:"a" "b" "c" "d"}
}
.ex-card{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:#fcfdff}
.ex-card h3{font-size:12.5px;margin-bottom:9px;color:var(--ink-2);letter-spacing:.3px}
.ex-row{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:12.5px}
.ex-row label{width:78px;flex:none;color:var(--ink-2)}
.ex-row select,.ex-row input{flex:1;min-width:0}
.rng{display:flex;align-items:center;gap:5px;flex:1}
.rng input{width:64px}
.rng em{font-style:normal;color:var(--ink-3)}

.col-picker{
  display:flex;flex-wrap:wrap;gap:6px;max-height:172px;overflow:auto;
  padding:9px;border:1px solid var(--line);border-radius:8px;background:#fff;
}
.col-chip{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 9px;border-radius:7px;border:1px solid var(--line-2);
  font-size:12px;cursor:pointer;user-select:none;background:#fff;transition:.13s;
}
.col-chip:hover{border-color:var(--brand)}
.col-chip input{margin:0;accent-color:var(--brand)}
.col-chip.on{background:var(--brand-l);border-color:var(--brand);color:var(--brand-d);font-weight:600}
.col-chip.key{border-color:#6f4bf0;background:#f2ecff;color:#5b28c8}
.col-chip .kc{font-size:10px;font-weight:700;color:#6f4bf0}
.col-chip:not(.on){opacity:.5}
.cp-actions{display:flex;align-items:center;gap:8px;margin-top:9px;flex-wrap:wrap}
.export-kinds{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:9px 11px;border:1px dashed var(--line-2);border-radius:8px;background:#fbfcfe;
}
.ek-label{font-size:12px;color:var(--ink-3);font-weight:600}
.kind-chip{
  display:inline-flex;align-items:center;gap:5px;
  padding:3px 9px;border-radius:7px;border:1px solid var(--line-2);
  font-size:12px;cursor:pointer;user-select:none;background:#fff;transition:.13s;
}
.kind-chip:hover{border-color:var(--brand)}
.kind-chip input{margin:0;accent-color:var(--brand)}
.kind-chip b{
  min-width:16px;text-align:center;padding:0 5px;border-radius:9px;
  font-size:11px;background:var(--brand-l);color:var(--brand-d);font-weight:700;
}
.kind-chip[data-kind="onlyA"] b{background:#ffe9ec;color:#c0392b}
.kind-chip[data-kind="onlyB"] b{background:#e7f6ec;color:#1e8e4a}
.kind-chip[data-kind="diff"] b{background:#fff4df;color:#b9770e}
.ek-actions{display:flex;gap:6px;margin-left:auto}
.key-picker{display:flex;flex-wrap:wrap;gap:6px}
.key-picker:empty::after{content:"请在上方勾选列后，这里会列出可选的主键列";color:var(--ink-3);font-size:12px}

/* ---------------- 结果：摘要条 ---------------- */
.summary-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:11px 18px;background:linear-gradient(90deg,#fafbff,#f6f9ff);
  border-bottom:1px solid var(--line);
}
.sb-item{display:flex;align-items:baseline;gap:5px;font-size:12.5px;color:var(--ink-2)}
.sb-item b{font-size:16px;font-weight:800}
.sb-item b.c-chg{color:var(--chg-ink)}.sb-item b.c-ins{color:var(--ins-ink)}
.sb-item b.c-del{color:var(--del-ink)}.sb-item b.c-fmt{color:var(--fmt-ink)}
.sb-item b.c-ok{color:#1a7f45}
.sb-note{font-size:12px;color:var(--ink-3);margin-left:auto}
.verdict{padding:3px 11px;border-radius:999px;font-size:12px;font-weight:700}
.verdict.bad{background:var(--del-bg);color:var(--del-ink)}
.verdict.ok{background:#eaf7ee;color:#1a7f45}
.verdict.fmtonly{background:var(--fmt-bg);color:var(--fmt-ink);border:1px solid var(--fmt-line)}

/* 视图切换 */
.view-tabs{display:inline-flex;background:#eef1f7;border-radius:9px;padding:3px;gap:2px}
.vt{
  border:0;background:transparent;padding:5px 13px;border-radius:7px;cursor:pointer;
  font-size:12.5px;font-weight:600;color:var(--ink-2);transition:.14s;
}
.vt:hover{color:var(--brand-d)}
.vt.active{background:#fff;color:var(--brand-d);box-shadow:0 1px 3px rgba(20,32,54,.12)}
.vt.vt-off{opacity:.4;cursor:not-allowed}
.vt.vt-off:hover{color:var(--ink-2)}

/* ---------------- 并排视图 ---------------- */
.split-views{}
.split-view{margin:0}
.split-heads{
  display:grid;grid-template-columns:1fr 1fr;gap:0;
  border-bottom:1px solid var(--line);background:#fbfcfe;
}
.split-heads .col-head{
  padding:9px 16px;display:flex;align-items:center;gap:9px;min-width:0;
}
.split-heads .col-head:first-child{border-right:1px solid var(--line)}
.col-head .dot{width:8px;height:8px;border-radius:50%;flex:none}
.col-head .nm{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.col-head .mt{font-size:11.5px;color:var(--ink-3);margin-left:auto;white-space:nowrap}

.split-body{
  display:grid;grid-template-columns:1fr 1fr;
  height:min(70vh,900px);overflow:hidden;
}
.split-body .col{overflow:auto;padding:0;scroll-behavior:auto}
.split-body .col:first-child{border-right:1px solid var(--line);background:#fffdfd}
.split-body .col-b{background:#fdfffe}

/* ============ Excel 双窗口原文 ============ */
.xl-split-body{
  display:grid;grid-template-columns:1fr 1fr;
  height:min(70vh,900px);overflow:hidden;
  border-top:1px solid var(--line);
}
.xl-split-body .xl-col{overflow:auto;scroll-behavior:auto;background:#fff}
.xl-split-body .xl-col:first-child{border-right:1px solid var(--line);background:#fffdfd}
.xl-split-body .xl-col:last-child{background:#fdfffe}
.xl-plain{padding:0}
.xl-plain .xv{width:100%;border-collapse:collapse;font-size:12.5px}
.xl-plain .xv th{
  position:sticky;top:0;z-index:2;background:#f6f8fb;
  border:1px solid var(--line);padding:6px 8px;font-size:11.5px;
  font-weight:700;color:var(--ink-2);white-space:nowrap;text-align:left;
}
.xl-plain .xv td{
  border:1px solid #eef2f7;padding:5px 8px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:220px;
}
/* 行号列固定，长表横向滚动时也能对上是第几行 */
.xl-plain .xv .rownum{
  width:46px;min-width:46px;max-width:46px;text-align:right;
  color:#a9b6c8;font-family:var(--mono);font-size:10.5px;
  background:#fbfcfe;position:sticky;left:0;z-index:1;
}
.xl-plain .xv thead .rownum{z-index:3;background:#f6f8fb}
.xl-plain .xv tr.k-onlyA{background:#fff5f4}
.xl-plain .xv tr.k-onlyB{background:#f3fbf5}
.xl-plain .xv tr.k-diff{background:#fffdf2}
.xl-plain .xv td.cell-chg{background:#ffe9a8;font-weight:700;color:#8a5a00}

/* ============ Excel 输出列筛选 ============ */
.panel.sub{margin-top:16px;border:1px solid var(--line)}
.panel.sub .panel-bd{padding:12px 18px}
.panel.sub .hint{margin:0 0 8px}
#xlOutCols{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
#xlExportPanel .step{background:#0f9d58}
/* 分组标题占满一行，把「参与比对」与「未参与比对」明确分开 */
#xlOutCols .og-label{
  flex:1 0 100%;margin:8px 0 2px;font-size:11.5px;font-weight:700;
  color:var(--ink-3);letter-spacing:.02em;
}
#xlOutCols .og-label:first-child{margin-top:0}
/* 未参与比对的列打标签，避免看着像也参与了比对 */
.col-chip .tag-uncompared{
  margin-left:5px;font-size:10px;font-weight:600;color:#8a94a6;
  background:#f0f2f5;border-radius:3px;padding:0 4px;line-height:15px;
}
.col-chip:not(.on) .tag-uncompared{opacity:.7}

/* 段落行 */
.blk{
  display:flex;gap:9px;padding:5px 16px 5px 8px;
  border-bottom:1px solid #f1f4f9;align-items:flex-start;
}
.blk .gutter{
  flex:none;width:44px;text-align:right;font-size:10.5px;color:#a9b6c8;
  font-family:var(--mono);padding-top:3px;user-select:none;
}
.blk .content{flex:1;min-width:0;white-space:pre-wrap;word-break:break-word;font-size:13.5px}
.blk.empty .content{
  color:#b9c3d2;font-style:italic;font-size:12.5px;
}
.blk.pad{background:repeating-linear-gradient(45deg,#fafbfd,#fafbfd 8px,#f4f6fa 8px,#f4f6fa 16px)}

.blk.k-del{background:var(--del-bg)}
.blk.k-del .content{color:var(--del-ink)}
.blk.k-ins{background:var(--ins-bg)}
.blk.k-ins .content{color:var(--ins-ink)}
.blk.k-chg{background:#fffdf6}
.blk.k-fmtonly{background:var(--fmt-bg)}
.blk.fmark{border-left:3px solid var(--fmt-line);padding-left:5px}

/* 行内差异片段 */
.d-del{background:#ffc9c9;color:var(--del-ink);text-decoration:line-through;text-decoration-thickness:1.5px;border-radius:3px;padding:0 1.5px}
.d-ins{background:#b6ecc9;color:var(--ins-ink);border-radius:3px;padding:0 1.5px;font-weight:600}
.d-chg{background:var(--chg-bg);color:var(--chg-ink);border-radius:3px;padding:0 1.5px}

/* 表格行块 */
.blk.trow .content{font-size:12.5px}
.blk.trow .tcell{
  display:inline-block;padding:0 7px;border-right:1px solid var(--line-2);margin-right:0;
}
.blk.trow .tcell.chg-a{background:#ffc9c9}
.blk.trow .tcell.chg-b{background:#b6ecc9}
.blk.k-del .tcell.chg-a,.blk.k-ins .tcell.chg-b{background:transparent}

/* 格式徽标 */
.fmt-tag{
  display:block;margin-top:4px;
  font-size:10.5px;font-weight:700;color:var(--fmt-ink);
  background:var(--fmt-bg);border:1px solid var(--fmt-line);
  border-radius:5px;padding:3px 6px;cursor:help;
}
/* 左右分栏：每栏只显示本侧的实际格式值，宽度对半，扫一眼就清楚 */
.fmt-tag .ft-row{display:flex;align-items:baseline;gap:6px;padding:1px 0}
.fmt-tag .ft-row+.ft-row{border-top:1px dotted var(--fmt-line)}
.fmt-tag .ft-key{flex:none;opacity:.72;font-weight:600;min-width:0}
.fmt-tag .ft-val{flex:1;min-width:0;font-weight:700;word-break:break-all;
  font-family:var(--mono);letter-spacing:-.2px}
.fmt-tag.side-a{border-left:3px solid var(--del-line)}
.fmt-tag.side-b{border-left:3px solid var(--ins-line)}

/* 颜色色块 */
.swatch{
  display:inline-block;width:11px;height:11px;border-radius:3px;
  border:1px solid rgba(0,0,0,.22);margin-right:5px;vertical-align:-1px;
  box-shadow:0 0 0 1.5px #fff inset;
}

/* 差异清单 */
.list-view,.fmt-view{padding:14px 18px;height:min(70vh,900px);overflow:auto}
.lv-item{
  border:1px solid var(--line);border-radius:9px;margin-bottom:9px;overflow:hidden;background:#fff;
}
.lv-hd{
  display:flex;align-items:center;gap:9px;padding:7px 12px;background:#fafbfe;
  border-bottom:1px solid var(--line);font-size:12px;color:var(--ink-2);
}
.lv-hd .n{
  font-family:var(--mono);font-size:10.5px;background:#e8edf6;color:var(--ink-2);
  border-radius:5px;padding:1px 6px;
}
.lv-bd{padding:9px 12px;font-size:13px;white-space:pre-wrap;word-break:break-word}
.lv-row{display:grid;grid-template-columns:34px 1fr;gap:9px;padding:2px 0}
.lv-row .s{
  font-size:10.5px;font-weight:800;text-align:center;border-radius:5px;padding:1px 0;height:19px;
}
.lv-row .s.a{background:var(--del-bg);color:var(--del-ink)}
.lv-row .s.b{background:var(--ins-bg);color:var(--ins-ink)}
.lv-row .s.eq{background:#eef1f7;color:var(--ink-3)}
.tag{
  font-size:10.5px;font-weight:700;padding:1px 7px;border-radius:5px;
}
.tag.chg{background:var(--chg-bg);color:var(--chg-ink)}
.tag.ins{background:var(--ins-bg);color:var(--ins-ink)}
.tag.del{background:var(--del-bg);color:var(--del-ink)}
.tag.fmt{background:var(--fmt-bg);color:var(--fmt-ink)}

/* 格式差异页 */
.fv-legend{
  display:flex;align-items:center;gap:10px;padding:7px 12px;margin-bottom:9px;
  background:#fff;border:1px solid var(--line);border-radius:8px;font-size:12px;
}
.fv-legend .lg{font-weight:700;max-width:44%;overflow:hidden;
  white-space:nowrap;text-overflow:ellipsis}
.fv-legend .lg.a{color:var(--del-ink)}
.fv-legend .lg.b{color:var(--ins-ink)}
.fv-legend .lg.ar{color:var(--ink-3);flex:none;font-weight:400}
.fv-card{border:1px solid var(--line);border-radius:9px;margin-bottom:9px;background:#fff;overflow:hidden}
.fv-hd{
  display:flex;align-items:center;gap:9px;padding:7px 12px;background:#fafbfe;
  border-bottom:1px solid var(--line);font-size:12px;
}
.fv-hd .tt{font-weight:700;color:var(--ink-2);flex:1;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fv-row{display:grid;grid-template-columns:104px 1fr 22px 1fr;gap:9px;padding:5px 12px;font-size:12.5px;align-items:baseline}
.fv-row+.fv-row{border-top:1px dashed var(--line)}
.fv-row .k{color:var(--fmt-ink);font-weight:700;font-size:11.5px}
.fv-row .va{color:var(--del-ink);font-family:var(--mono);font-size:11.5px;word-break:break-all}
.fv-row .vb{color:var(--ins-ink);font-family:var(--mono);font-size:11.5px;word-break:break-all}
.fv-row .ar{color:var(--ink-3);text-align:center}
.fv-row .va.has-swatch,.fv-row .vb.has-swatch{font-family:inherit}
.fv-row .va.has-swatch{color:var(--del-ink)}
.fv-row .vb.has-swatch{color:var(--ins-ink)}
/* 「片段结构 2 段→1 段」是伴随信息不是格式问题，单列为脚注 */
.fv-struct{
  padding:4px 12px;font-size:11.5px;color:var(--ink-3);
  background:#fafbfe;border-top:1px dashed var(--line);font-style:italic;
}
.fv-row .va.none,.fv-row .vb.none{color:#aab4c2;font-style:italic;font-family:inherit}
.fv-empty{text-align:center;padding:50px 20px;color:var(--ink-3)}
.fv-empty .big{font-size:34px;display:block;margin-bottom:8px}

/* ---------------- Excel 结果 ---------------- */
.excel-view{padding:14px 18px;height:min(70vh,900px);overflow:auto}
.xv-stats{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:12px}
.xv-stat{
  flex:1;min-width:120px;border:1px solid var(--line);border-radius:9px;padding:9px 12px;background:#fff;
}
.xv-stat .t{font-size:11.5px;color:var(--ink-3)}
.xv-stat .v{font-size:19px;font-weight:800;line-height:1.3}
.xv-stat.v-chg .v{color:var(--chg-ink)}
.xv-stat.v-onlya .v{color:var(--del-ink)}
.xv-stat.v-onlyb .v{color:var(--ins-ink)}
.xv-stat.v-same .v{color:#1a7f45}
table.xv{width:100%;border-collapse:collapse;font-size:12.5px;background:#fff;border-radius:9px;overflow:hidden}
table.xv th{
  background:#f4f7fc;text-align:left;padding:8px 10px;font-weight:700;font-size:11.5px;
  color:var(--ink-2);border-bottom:1px solid var(--line-2);white-space:nowrap;position:sticky;top:0;z-index:2;
}
table.xv td{padding:6px 10px;border-bottom:1px solid #f1f4f9;vertical-align:top}
table.xv tr.k-diff td{background:#fffdf3}
table.xv tr.k-onlyA td{background:var(--del-bg)}
table.xv tr.k-onlyB td{background:var(--ins-bg)}
table.xv td.k{font-family:var(--mono);font-size:11.5px;color:var(--ink-2);white-space:nowrap}
table.xv .cell-a{background:#ffc9c9;border-radius:3px;padding:0 3px}
table.xv .cell-b{background:#b6ecc9;border-radius:3px;padding:0 3px}
table.xv .none{color:#aab4c2;font-style:italic}
.rowkind{
  font-size:10.5px;font-weight:700;padding:1px 6px;border-radius:5px;white-space:nowrap;
}
.rowkind.k-diff{background:var(--chg-bg);color:var(--chg-ink)}
.rowkind.k-onlyA{background:#ffc9c9;color:var(--del-ink)}
.rowkind.k-onlyB{background:#b6ecc9;color:var(--ins-ink)}
.rowkind.k-same{background:#eef1f7;color:var(--ink-3)}

/* ---------------- 浮层 ---------------- */
.modal-mask{
  position:fixed;inset:0;background:rgba(16,24,40,.5);z-index:100;
  display:grid;place-items:center;padding:24px;backdrop-filter:blur(2px);
}
.modal{
  background:#fff;border-radius:14px;max-width:640px;width:100%;max-height:82vh;
  display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(10,20,40,.3);
}
.modal-hd{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--line)}
.modal-hd h3{font-size:15px}
.modal-bd{padding:16px 18px;overflow:auto;font-size:13.5px;line-height:1.75;color:var(--ink-2)}
.modal-bd h4{font-size:13.5px;color:var(--ink);margin:14px 0 6px}
.modal-bd h4:first-child{margin-top:0}
.modal-bd ol{margin:0;padding-left:20px}
.modal-bd li{margin:3px 0}

.toast{
  position:fixed;left:50%;bottom:28px;transform:translateX(-50%);
  background:#1f2a3a;color:#fff;padding:9px 18px;border-radius:9px;font-size:13px;
  z-index:200;box-shadow:0 8px 26px rgba(10,20,40,.28);max-width:80vw;
}
.loading{
  position:fixed;inset:0;background:rgba(244,246,250,.82);z-index:150;
  display:grid;place-items:center;gap:12px;grid-auto-flow:row;
}
.spinner{
  width:38px;height:38px;border:3px solid var(--line-2);border-top-color:var(--brand);
  border-radius:50%;animation:spin .8s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}
.loading p{margin:0;color:var(--ink-2);font-weight:600}

/* 滚动条 */
.col::-webkit-scrollbar,.list-view::-webkit-scrollbar,.fmt-view::-webkit-scrollbar,.excel-view::-webkit-scrollbar{width:11px;height:11px}
.col::-webkit-scrollbar-thumb{background:#cfd8e6;border-radius:6px;border:3px solid transparent;background-clip:content-box}
.col::-webkit-scrollbar-thumb:hover{background:#aebbd0;background-clip:content-box}
.col::-webkit-scrollbar-track{background:transparent}
