/* 月结程序 · 本地界面样式（完全离线：无 CDN、无外部字体/图标） */

:root {
  --bg: #f4f5f7;
  --card: #ffffff;
  --border: #d8dde4;
  --text: #1d2530;
  --muted: #66707e;
  --accent: #0b57d0;
  --ok: #1a7f37;    --ok-bg: #e6f4ea;
  --diff: #c62828;  --diff-bg: #fdecea;
  --warn: #9a6700;  --warn-bg: #fff8e1;
  --err: #444a52;   --err-bg: #e9eaec;
  --run: #0b57d0;   --run-bg: #e8f0fe;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: -apple-system, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  font-size: 14px;
  line-height: 1.6;
  background: var(--bg);
  color: var(--text);
}

/* ---------- 页头导航 ---------- */
header {
  display: flex;
  align-items: center;
  gap: 24px;
  background: #1f2937;
  color: #fff;
  padding: 10px 24px;
}
header .brand { font-size: 16px; font-weight: 700; letter-spacing: 1px; }
header nav { display: flex; gap: 4px; flex-wrap: wrap; }
header nav a {
  color: #cbd5e1;
  text-decoration: none;
  padding: 4px 12px;
  border-radius: 6px;
}
header nav a:hover { color: #fff; background: #374151; }
header nav a.active { color: #fff; background: #4b5563; font-weight: 600; }

main { max-width: 1100px; margin: 0 auto; padding: 20px 24px 48px; }

footer {
  max-width: 1100px;
  margin: 0 auto;
  padding: 12px 24px 24px;
  color: var(--muted);
  font-size: 12px;
  border-top: 1px solid var(--border);
}

h1 { font-size: 20px; margin: 8px 0 16px; }
h2 { font-size: 15px; margin: 0 0 10px; }
h1 .small, h2 .small { font-size: 12px; font-weight: 400; color: var(--muted); }
a { color: var(--accent); }
code { background: #eef1f5; padding: 1px 5px; border-radius: 4px; font-size: 12.5px; }
code.small { font-size: 11px; color: var(--muted); }
pre.hint-pre {
  background: #f6f8fa;
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 8px 10px;
  font-size: 12px;
  overflow-x: auto;
  margin: 4px 0 0;
}

/* ---------- 卡片 ---------- */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 16px 18px;
  margin-bottom: 18px;
}
.card.highlight { border-color: var(--accent); }
.card.guide ol { margin: 4px 0 0 18px; padding: 0; }
.card.guide li { margin: 6px 0; }

/* ---------- 表格 ---------- */
table {
  width: 100%;
  border-collapse: collapse;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 8px;
  overflow: hidden;
}
th, td {
  border-bottom: 1px solid var(--border);
  padding: 7px 10px;
  text-align: left;
  vertical-align: top;
}
th { background: #eef1f5; font-weight: 600; white-space: nowrap; }
tbody tr:nth-child(even) { background: #fafbfc; }
tbody tr:last-child td { border-bottom: none; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
td.empty { color: var(--muted); text-align: center; padding: 16px; }
td.ops { white-space: nowrap; }
td.ops a { margin-right: 8px; }
tr.row-diff td { background: var(--diff-bg); }
tr.row-ok td { background: inherit; }
.scroll-x { overflow-x: auto; }   /* 宽表格自己滚，不撑破页面 */

/* ---------- 状态徽章 ---------- */
.badge {
  display: inline-block;
  padding: 1px 8px;
  border-radius: 10px;
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
}
.badge-ok    { color: var(--ok);   background: var(--ok-bg); }
.badge-diff  { color: var(--diff); background: var(--diff-bg); }
.badge-warn  { color: var(--warn); background: var(--warn-bg); }
.badge-error { color: var(--err);  background: var(--err-bg); }
.badge-run   { color: var(--run);  background: var(--run-bg); }
.ok-text   { color: var(--ok); }
.diff-text { color: var(--diff); }

/* ---------- 消息条 ---------- */
.msg {
  padding: 8px 12px;
  border-radius: 8px;
  margin: 10px 0;
  border: 1px solid transparent;
  white-space: pre-wrap;
  word-break: break-word;
}
.msg-ok    { color: var(--ok);   background: var(--ok-bg);   border-color: #b7dfc2; }
.msg-error { color: var(--diff); background: var(--diff-bg); border-color: #f2b8b5; }
.msg-warn  { color: var(--warn); background: var(--warn-bg); border-color: #ead28a; }

/* ---------- 局域网访问提示条（开启时常驻） ---------- */
.lan-banner {
  padding: 8px 12px;
  border-radius: 8px;
  margin: 10px 0 14px;
  border: 1px solid transparent;
  font-size: 13px;
}
.lan-banner.lan-tls   { color: var(--ok);   background: var(--ok-bg);   border-color: #b7dfc2; }
.lan-banner.lan-plain { color: var(--warn); background: var(--warn-bg); border-color: #ead28a; }
.lan-logout { display: inline; }
button.linkish {
  background: none;
  color: inherit;
  text-decoration: underline;
  padding: 0 2px;
  font-size: 13px;
}
button.linkish:hover { filter: none; opacity: 0.75; }
.login-card { max-width: 460px; }

/* ---------- 表单 ---------- */
.form-grid { display: flex; flex-direction: column; gap: 12px; }
.form-grid label { display: block; font-weight: 600; }
.form-grid label input,
.form-grid label select,
.form-grid label textarea {
  display: block;
  margin-top: 3px;
  font-weight: 400;
}
.form-grid label.chk { font-weight: 400; }
.form-grid label.chk input { display: inline; margin-right: 6px; }
fieldset {
  border: 1px dashed var(--border);
  border-radius: 8px;
  padding: 10px 14px;
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin: 0;
}
legend { font-size: 12px; color: var(--muted); padding: 0 6px; }

/* 设备锁死：已授权设备一行一台（名称 + 指纹前 8 位 + 删除） */
.ca-devices { display: flex; flex-direction: column; gap: 6px; }
.ca-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ca-row code { font-size: 12px; color: var(--muted); }
.ca-row label.chk { font-weight: 400; margin: 0; }

input, select, textarea {
  font: inherit;
  color: var(--text);
  background: #fff;
  border: 1px solid var(--border);
  border-radius: 6px;
  padding: 5px 8px;
  max-width: 100%;
}
textarea { width: 100%; font-family: Menlo, Consolas, monospace; font-size: 12.5px; }
input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 2px rgba(11, 87, 208, 0.15);
}
.hint {
  display: block;
  font-size: 12px;
  color: var(--muted);
  font-weight: 400;
  margin-top: 2px;
}
p.hint { margin: 8px 0; }

button, .btn {
  font: inherit;
  display: inline-block;
  background: var(--accent);
  color: #fff;
  border: none;
  border-radius: 6px;
  padding: 6px 16px;
  cursor: pointer;
  text-decoration: none;
}
button:hover, .btn:hover { filter: brightness(1.1); }
button:disabled { background: #9aa4b2; cursor: not-allowed; }
button.secondary { background: #5f6b7a; }
button.danger { background: #fff; color: var(--diff); border: 1px solid var(--diff); padding: 2px 8px; font-size: 12px; }
button.danger:hover { background: var(--diff-bg); }
.actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.inline-form { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
form.inline { display: inline-flex; align-items: center; gap: 4px; margin-right: 8px; }
form.inline button { padding: 2px 8px; font-size: 12px; background: #5f6b7a; }
form.inline input[name="period_tag"] { width: 76px; padding: 2px 6px; font-size: 12px; }

/* ---------- Excel / CSV 与多维表格：列表 → 详情 ---------- */
.source-detail-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
}
.source-detail-head h2, .source-period-head h3 { margin: 0; }
.source-detail-kicker {
  display: block;
  color: var(--muted);
  font-size: 12px;
  font-weight: 600;
  margin-bottom: 2px;
}
.source-kind-legend { display: flex; gap: 8px; flex-wrap: wrap; }
.source-kind-legend span, .source-kind-legend a, .source-field-chips span {
  border: 1px solid var(--border);
  background: #f8fafc;
  border-radius: 999px;
  padding: 2px 9px;
  font-size: 12px;
}
.source-kind-legend a { text-decoration: none; }
.managed-source-table td { vertical-align: middle; }
.managed-source-table td:first-child { min-width: 160px; }
.source-create-form {
  display: grid;
  grid-template-columns: repeat(2, minmax(220px, 1fr));
  gap: 14px 18px;
  max-width: 840px;
}
.source-create-form label { font-weight: 600; }
.source-create-form input { display: block; width: 100%; margin-top: 3px; font-weight: 400; }
.source-create-form .actions { grid-column: 1 / -1; }
.source-summary-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(150px, 1fr));
  gap: 10px;
}
.source-summary-grid > div {
  background: #f8fafc;
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 10px 12px;
}
.source-summary-grid span { display: block; color: var(--muted); font-size: 12px; }
.source-summary-grid strong { display: block; margin-top: 3px; }
.source-period-toolbar, .source-period-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
}
.source-period-list { display: flex; flex-direction: column; gap: 12px; }
.source-period-card {
  border: 1px solid var(--border);
  border-radius: 9px;
  padding: 14px;
}
.source-period-head > div { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.source-version-upload { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.source-version-upload .file-picker { font-weight: 600; }
.source-version-upload input[type="file"] { margin-left: 6px; }
.source-current-version {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin: 12px 0;
  padding: 10px 12px;
  border: 1px solid #b7dfc2;
  border-radius: 8px;
  background: var(--ok-bg);
}
.source-history { margin-top: 10px; }
.source-history summary { cursor: pointer; color: var(--accent); }
.source-empty-periods { padding: 22px; text-align: center; color: var(--muted); }
.source-fields-box { margin-top: 14px; }
.source-field-chips { display: flex; gap: 7px; flex-wrap: wrap; margin-top: 10px; }
.source-field-checks { display: grid; grid-template-columns: repeat(3, minmax(160px, 1fr)); gap: 7px 14px; }
.bitable-connect-panel[hidden] { display: none; }
.source-table-options { columns: 2; margin-bottom: 0; }
@media (max-width: 720px) {
  .source-create-form, .source-summary-grid { grid-template-columns: 1fr; }
  .source-field-checks { grid-template-columns: 1fr; }
  .source-table-options { columns: 1; }
}

/* ---------- 其它 ---------- */
.run-state { margin-top: 10px; color: var(--muted); }
.run-period-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.period-state-pill, .readiness {
  display: inline-flex;
  align-items: center;
  border-radius: 999px;
  padding: 3px 10px;
  font-size: 12px;
  font-weight: 600;
  white-space: nowrap;
}
.period-state-pill.is-open, .readiness-ready { color: var(--ok); background: var(--ok-bg); }
.period-state-pill.is-closed, .readiness-pending { color: var(--warn); background: var(--warn-bg); }
.readiness-auth, .readiness-failed, .readiness-missing { color: var(--diff); background: var(--diff-bg); }
.run-zone-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 14px;
  margin-bottom: 14px;
}
.run-zone-card { margin: 0; display: flex; flex-direction: column; gap: 12px; }
.run-zone-card.has-error { border-color: #f2b8b5; }
.run-zone-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.run-zone-head h2 { margin: 0; }
.run-zone-select { display: inline-flex; align-items: center; gap: 8px; }
.run-zone-select input { margin: 0; }
.run-latest { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; min-height: 28px; }
.run-latest .hint { margin: 0; }
.run-zone-card > button { align-self: flex-start; }
.run-batch-bar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.run-batch-bar .run-confirm { flex: 1 1 420px; }
.run-export-zones { display: flex; gap: 14px; flex-wrap: wrap; }
.run-period-admin summary { cursor: pointer; font-weight: 600; }
.run-progress strong { margin-right: 8px; }
.run-progress:has(.run-failure-list) { border-color: #f2b8b5; }
.run-failure-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.run-failure-head > strong { color: var(--diff); font-size: 18px; }
.run-failure-list { display: grid; gap: 10px; }
.run-failure-item {
  border: 1px solid #f2b8b5;
  border-left: 4px solid var(--diff);
  border-radius: 8px;
  background: var(--diff-bg);
  padding: 12px 14px;
}
.run-failure-item > strong { display: block; margin: 0 0 7px; }
.run-failure-item p { margin: 5px 0; }
.run-result-protection { margin-bottom: 0; }
.run-preserved-result { display: block; margin-top: 5px; }
.preview-confirm { position: sticky; top: 8px; z-index: 3; }
.run-download-zone table { margin-top: 10px; }
.totals { margin: 4px 0 10px; }
.drill { margin-top: 10px; font-size: 13px; }
.drill a.drill-file {
  display: inline-block;
  margin: 2px 6px 2px 0;
  padding: 1px 8px;
  border: 1px solid var(--border);
  border-radius: 10px;
  text-decoration: none;
}
.drill a.drill-file:hover { border-color: var(--accent); }
.drill a.drill-file.active { background: var(--run-bg); border-color: var(--accent); font-weight: 600; }

/* ---------- 功能区 tab 页签 ---------- */
.tabs {
  display: flex;
  gap: 2px;
  flex-wrap: wrap;
  margin: 0 0 16px;
  border-bottom: 2px solid var(--border);
}
.tabs a {
  padding: 6px 16px;
  border: 1px solid transparent;
  border-bottom: none;
  border-radius: 8px 8px 0 0;
  text-decoration: none;
  color: var(--muted);
  position: relative;
  top: 2px;
}
.tabs a:hover { color: var(--text); background: #e9edf2; }
.tabs a.active {
  background: var(--card);
  border-color: var(--border);
  color: var(--text);
  font-weight: 600;
}

/* ---------- 功能区列表 ---------- */
tr.row-disabled td { color: var(--muted); background: #f0f1f3; }
tr.row-sel td { background: var(--run-bg); }
.btn-sm { padding: 2px 10px; font-size: 12px; }

/* ---------- 分类：待指派高亮 ---------- */
.unassigned-box {
  background: var(--warn-bg);
  border: 1px solid #ead28a;
  border-radius: 8px;
  padding: 10px 12px;
  margin: 8px 0 12px;
}
.pill {
  display: inline-block;
  margin: 2px 4px 2px 0;
  padding: 0 8px;
  border-radius: 10px;
  font-size: 12px;
  font-family: Menlo, Consolas, monospace;
  border: 1px solid var(--border);
  background: #fff;
}
.pill-warn { border-color: #ead28a; color: var(--warn); font-weight: 600; }
tr.row-pending td { background: var(--warn-bg); }
.assign-tbl input { width: 240px; }
.two-col { display: flex; gap: 16px; margin: 4px 0; }
.two-col .col-head { flex: 1; font-weight: 600; color: var(--muted); font-size: 12px; }

/* ---------- 结果模版：网格编辑器与网格视图 ---------- */
.grid-editor { border-collapse: collapse; }
.grid-editor td { padding: 2px; border: 1px solid var(--border); }
.cellbox {
  width: 180px;
  font-family: Menlo, Consolas, monospace;
  font-size: 12.5px;
  border: 1px solid transparent;
  border-radius: 4px;
  padding: 4px 6px;
}
.cellbox:focus { border-color: var(--accent); }
.cellbox-formula { background: #eef6ff; color: #0a4b9d; }
.grid-view { border-collapse: collapse; }
.grid-view td {
  border: 1px solid var(--border);
  padding: 5px 10px;
  vertical-align: top;
}
.grid-view td.cell-err {
  background: var(--diff-bg);
  color: var(--diff);
  font-weight: 600;
  font-size: 12px;
  max-width: 340px;
}

/* ---------- 数据源表单：栏位 / 内联单据搜索 / 占位符按钮 / 高级区 ---------- */
.form-grid .fld { display: flex; flex-direction: column; }
.form-grid .fld > label { margin: 0; }
/* 回车键的默认提交目标（= 保存）。刻意不用 display:none —— 隐藏得看不见即可，
   要保持它是表单里"第一个 submit 按钮"，否则回车会去触发「从金蝶刷新清单」。 */
button.default-submit {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px; border: 0;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}

/* form_id 就地搜中文名（清单内嵌在页面里，纯前端过滤，不发请求） */
.ds-pick {
  margin-top: 8px;
  padding: 8px 10px;
  background: #f6f8fa;
  border: 1px solid var(--border);
  border-radius: 8px;
}
.ds-pick .ds-pick-lbl { font-weight: 600; font-size: 13px; }
.ds-pick .ds-pick-lbl input { width: 100%; max-width: 420px; }
.ds-pick-meta { font-size: 12px; color: var(--muted); margin-top: 6px; }
.ds-pick-meta button.linkish { color: var(--accent); font-size: 12px; }
.ds-pick-list {
  display: flex;              /* flex + order：中文名命中的候选项排前面 */
  flex-direction: column;
  margin-top: 8px;
  max-height: 260px;
  overflow-y: auto;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fff;
}
.ds-pick-list[hidden] { display: none; }
button.ds-pick-item {
  display: flex;
  align-items: baseline;
  gap: 10px;
  width: 100%;
  text-align: left;
  background: none;
  color: var(--text);
  border: none;
  border-bottom: 1px solid #eef1f5;
  border-radius: 0;
  padding: 5px 10px;
  font-size: 13px;
}
button.ds-pick-item:hover { background: var(--run-bg); filter: none; }
button.ds-pick-item .nm { flex: 1; }
button.ds-pick-item code { font-size: 11.5px; color: var(--muted); }
.ds-pick-none { order: 2; padding: 8px 10px; font-size: 12px; color: var(--muted); }
.ds-pick-none[hidden] { display: none; }
/* 超出显示上限时明说还有多少条（绝不静默截断） */
.ds-pick-more { order: 3; padding: 8px 10px; font-size: 12px; color: var(--muted); }
.ds-pick-more[hidden] { display: none; }
/* 清单覆盖范围：只有业务单据类型，凭证/科目余额表/报表不在其中 */
.ds-pick-scope { font-size: 12px; color: var(--muted); margin-top: 6px; line-height: 1.6; }

/* 业务名目录条目（已查证入库、字段实测验证过）：带 ✓，排在单据清单前面 */
button.ds-cat-item {
  display: flex;
  align-items: baseline;
  gap: 10px;
  width: 100%;
  text-align: left;
  background: #f3faf5;
  color: var(--text);
  border: none;
  border-bottom: 1px solid #e2efe7;
  border-radius: 0;
  padding: 5px 10px;
  font-size: 13px;
}
button.ds-cat-item:hover { background: #e7f5ec; filter: none; }
button.ds-cat-item .nm { flex: 1; font-weight: 600; }
button.ds-cat-item code { font-size: 11.5px; color: var(--muted); }
.ds-ok { color: #1a7f45; font-size: 11.5px; font-weight: 600; white-space: nowrap; }

/* 选中目录条目后：程序替你设了什么、为什么（不做暗箱动作） */
.ds-cat-note {
  margin-top: 6px;
  padding: 6px 10px;
  border-left: 3px solid #1a7f45;
  background: #f3faf5;
  font-size: 12px;
  line-height: 1.6;
}
.ds-cat-note[hidden] { display: none; }

/* 尚未可用（照实标注，界面上不给选；原因摘自 CATALOG_STATUS.md） */
.ds-na { margin-top: 8px; font-size: 12px; color: var(--muted); line-height: 1.6; }
.ds-na-head { font-weight: 600; }
.ds-na-list { margin: 4px 0 4px 18px; padding: 0; }
.ds-na-item { margin: 2px 0; }
.ds-na-item .nm { color: var(--text); font-weight: 600; }
.ds-na-item code { font-size: 11px; }
.ds-na-item .why { color: var(--muted); }

/* 字段勾选列表（清单来自本机已实测验证的缓存，勾框不参与提交） */
.ds-fields {
  margin-top: 8px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #fff;
}
.ds-fields[hidden] { display: none; }
.ds-fields-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
  background: #f6f8fa;
  font-size: 13px;
}
.ds-fields-head input { flex: 1; min-width: 180px; }
.ds-fields-count { font-size: 12px; color: var(--muted); }
.ds-fields-note { padding: 6px 10px; font-size: 12px; color: var(--muted); line-height: 1.6; }
.ds-fields-box { max-height: 280px; overflow-y: auto; }
.ds-fields-box[hidden] { display: none; }
.ds-fld-grp {
  position: sticky;
  top: 0;
  padding: 4px 10px;
  background: #eef1f5;
  font-size: 12px;
  font-weight: 600;
}
label.ds-fld-item {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  padding: 7px 10px;
  border-bottom: 1px solid #f2f4f7;
  font-size: 12.5px;
  cursor: pointer;
}
label.ds-fld-item:hover { background: var(--run-bg); }
label.ds-fld-item input { margin-top: 3px; }
.ds-fld-copy { display: flex; flex: 1; min-width: 0; flex-direction: column; gap: 2px; }
.ds-fld-label { color: var(--text); font-size: 14px; font-weight: 600; }
.ds-fld-position { color: var(--muted); font-size: 11.5px; font-weight: 400; }
.ds-label-progress { padding: 7px 10px; color: var(--muted); background: #fffaf0; font-size: 12px; }
.ds-manual-fields { margin-top: 8px; border: 1px dashed var(--border); border-radius: 7px; }
.ds-manual-fields > summary { padding: 8px 10px; cursor: pointer; color: var(--muted); font-size: 12px; }
.ds-manual-fields-body { display: flex; flex-direction: column; gap: 8px; padding: 0 10px 10px; }

.ds-auto-note {
  padding: 9px 11px;
  border: 1px solid #cfe2d4;
  border-radius: 7px;
  background: #f2faf4;
  color: #2f6840;
  font-size: 13px;
}
.ds-technical {
  border: 1px solid var(--border);
  border-radius: 7px;
  background: #fafbfc;
}
.ds-technical > summary { padding: 9px 11px; cursor: pointer; color: var(--muted); font-size: 13px; }
.ds-technical-body { display: flex; flex-direction: column; gap: 12px; padding: 0 11px 11px; }
.ds-column-settings {
  border: 1px dashed var(--border);
  border-radius: 7px;
  background: #fafbfc;
}
.ds-column-settings > summary {
  padding: 9px 11px;
  cursor: pointer;
  color: var(--muted);
  font-size: 13px;
}
.ds-column-settings > .fld { padding: 0 11px 11px; }
/* 普通 file 类型保持原来的直接显示；只有 k3_web 默认把程序映射折叠。 */
.ds-column-settings.file-mode { border: 0; background: transparent; }
.ds-column-settings.file-mode > summary { display: none; }
.ds-column-settings.file-mode > .fld { padding: 0; }

/* 必填标记（与表单里按 kind 动态挂上的 required 一一对应） */
b.req {
  margin-left: 6px;
  padding: 0 5px;
  border-radius: 8px;
  background: #fdecec;
  color: #b02a2a;
  border: 1px solid #f3c9c9;
  font-size: 11px;
  font-weight: 600;
  vertical-align: middle;
}

/* 占位符一键插入 */
.ph-btns { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin-top: 4px; }
.ph-btns .hint { display: inline; margin: 0; }
button.ph {
  background: #fff;
  color: var(--accent);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 0 8px;
  font-family: Menlo, Consolas, monospace;
  font-size: 11.5px;
}
button.ph:hover { border-color: var(--accent); background: var(--run-bg); filter: none; }

/* 高级设置（默认折叠） */
details.adv {
  border: 1px dashed var(--border);
  border-radius: 8px;
  padding: 6px 12px;
}
details.adv > summary { cursor: pointer; font-size: 13px; color: var(--muted); }
details.adv[open] > summary { margin-bottom: 10px; }
.adv-body { display: flex; flex-direction: column; gap: 12px; padding-bottom: 6px; }

/* 「发现字段」本轮未实现的说明（照实写原因，不假装有这功能） */
.discovery-note { font-size: 12px; margin: 8px 0 0; }

/* ---------- 结果页分区 ---------- */
.zone-block { margin-bottom: 26px; }
.zone-title {
  font-size: 17px;
  margin: 18px 0 10px;
  padding: 6px 0 6px 12px;
  border-left: 4px solid var(--accent);
}
/* ---------- 汇总取数：中文结果列配置器 ---------- */
.calc-intro p { margin: 4px 0; }
.calc-flow-example {
  display: grid;
  gap: 4px;
  margin: 12px 0;
  padding: 11px 13px;
  border-left: 4px solid var(--accent);
  border-radius: 7px;
  background: #f5f8ff;
}
.calc-step-badge, .calc-step-number {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  height: 24px;
  padding: 0 7px;
  border-radius: 12px;
  background: var(--accent);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
}
.calc-chip {
  display: inline-block;
  margin: 1px 4px 1px 0;
  padding: 1px 8px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: #fff;
  font-size: 12px;
}
.calc-chip-result { border-color: #b9ccef; background: var(--run-bg); color: #174f9c; }
.calc-chip-check { border-color: #86b7a0; background: #edf9f2; color: #17613b; }
.calc-help-tip {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  margin-left: 6px;
  border: 1px solid #7890b8;
  border-radius: 50%;
  color: #315b9d;
  background: #eef4ff;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  cursor: help;
  vertical-align: 1px;
}
.calc-help-tip::after {
  content: attr(data-tip);
  position: absolute;
  right: 0;
  bottom: calc(100% + 8px);
  z-index: 40;
  width: min(390px, 82vw);
  padding: 10px 12px;
  border-radius: 7px;
  background: #253247;
  color: #fff;
  box-shadow: 0 5px 18px rgba(15, 23, 42, .24);
  font-size: 12px;
  font-weight: 400;
  line-height: 1.65;
  white-space: pre-line;
  text-align: left;
  visibility: hidden;
  opacity: 0;
  transform: translateY(3px);
  transition: opacity .12s ease, transform .12s ease;
  pointer-events: none;
}
.calc-help-tip:hover::after,
.calc-help-tip:focus::after {
  visibility: visible;
  opacity: 1;
  transform: translateY(0);
}
.calc-help-tip:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
.calc-section {
  border: 1px solid var(--border);
  border-radius: 9px;
  padding: 14px;
  background: #fafbfc;
}
.calc-section h3, .calc-preview h3 { margin: 0; font-size: 14px; }
.calc-step-settings {
  display: grid;
  grid-template-columns: minmax(240px, 1fr) auto;
  align-items: end;
  gap: 14px;
  margin-top: 12px;
}
.calc-step-settings input { width: 100%; }
.calc-mode-field { min-width: min(100%, 620px); }
.calc-mode-title {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 6px;
  font-weight: 600;
}
.calc-mode-choices {
  display: grid;
  grid-template-columns: repeat(2, minmax(190px, 1fr));
  gap: 8px;
}
.calc-mode-choice {
  min-height: 44px;
  padding: 8px 12px;
  white-space: normal;
  text-align: center;
}
.calc-mode-choice[aria-pressed="true"] {
  border-color: var(--accent);
  background: var(--accent);
  color: #fff;
  box-shadow: 0 0 0 2px rgba(31, 111, 235, .14);
}
.calc-section-head, .calc-output-head, .calc-term-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
}
.calc-dimension-list, .calc-output-list, .calc-terms {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 12px;
}
.calc-basis-source { display: block; margin-top: 12px; }
.calc-basis-source select { display: block; width: min(100%, 520px); margin-top: 5px; }
.calc-dimension-row {
  display: flex;
  align-items: end;
  gap: 10px;
  padding: 10px;
  border: 1px dashed var(--border);
  border-radius: 7px;
  background: #fff;
}
.calc-dimension-row label { flex: 1; }
.calc-dimension-row input { width: 100%; }
.calc-order-controls { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.calc-empty-note { margin: 0; color: var(--muted); font-size: 13px; }
.calc-output-card {
  padding: 14px;
  border: 1px solid #cbd5e1;
  border-radius: 9px;
  background: #fff;
}
.calc-formula-card { border-left: 4px solid #6f8fce; }
.calc-check-card { border-left: 4px solid #4d9870; }
.calc-output-head h4 { margin: 0; font-size: 14px; }
.calc-output-settings, .calc-term-grid, .calc-key-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 10px;
  margin-top: 10px;
}
.calc-formula-grid, .calc-check-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 10px;
  margin-top: 12px;
  padding: 12px;
  border-radius: 8px;
  background: #f8fafc;
}
.calc-formula-grid select, .calc-check-grid select,
.calc-check-grid input { width: 100%; }
.calc-formula-expression {
  min-height: 52px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 7px;
  width: 100%;
  margin-top: 6px;
  padding: 12px 14px;
  border: 1px solid #9fb4d7;
  border-radius: 8px;
  background: #f5f8ff;
  color: #173d74;
  font-size: 16px;
  font-weight: 600;
  line-height: 1.7;
}
.calc-formula-builder {
  display: grid;
  grid-template-columns: minmax(220px, 1fr) auto minmax(180px, .7fr) auto;
  align-items: end;
  gap: 10px;
  margin-top: 12px;
}
.calc-formula-builder select, .calc-formula-builder input { width: 100%; }
.calc-formula-buttons {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 10px;
}
.calc-formula-buttons button { min-width: 44px; }
.calc-formula-token-editor { margin-top: 12px; }
.calc-formula-case {
  margin-top: 14px;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--surface, #fff);
}
.calc-formula-case > .calc-section-head { margin-bottom: 8px; }
.calc-formula-default { border-left: 4px solid #6f8fce; }
.calc-formula-conditions { margin-bottom: 12px; }
.calc-output-settings input, .calc-output-settings select,
.calc-term-grid select, .calc-key-grid select { width: 100%; }
.calc-term-card {
  padding: 12px;
  border: 1px dashed var(--border);
  border-radius: 8px;
  background: #f8fafc;
}
.calc-map-title { margin-top: 12px; font-size: 12px; font-weight: 600; color: var(--muted); }
.calc-filters { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--border); }
.calc-filter-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.calc-filter-head button { margin-left: auto; }
.calc-filter-logic { display: inline-flex; align-items: center; gap: 6px; }
.calc-filter-logic select { width: auto; }
.calc-filter-row {
  display: grid;
  grid-template-columns: minmax(160px, 1.2fr) minmax(120px, .7fr) minmax(160px, 1fr) auto;
  align-items: end;
  gap: 8px;
  margin-top: 8px;
}
.calc-filter-row select, .calc-filter-row input { width: 100%; }
.calc-preview {
  border-left: 4px solid var(--accent);
  border-radius: 7px;
  padding: 12px 14px;
  background: #f5f8ff;
}
.calc-preview-lines p { margin: 7px 0; }
.calc-preview-ok { color: #174f9c; font-weight: 600; }
.calc-preview-pending { color: var(--warn); }
.calc-column-order { margin-top: 14px; padding-top: 12px; border-top: 1px dashed #aebfda; }
.calc-column-order-list { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.calc-column-order-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.calc-column-order-row .calc-chip { min-width: 180px; }

@media (max-width: 720px) {
  .calc-section-head, .calc-output-head, .calc-term-head, .calc-dimension-row {
    align-items: stretch;
    flex-direction: column;
  }
  .calc-step-settings { grid-template-columns: 1fr; }
  .calc-mode-choices { grid-template-columns: 1fr; }
  .calc-dimension-row .danger, .calc-output-head .danger, .calc-term-head .danger {
    align-self: flex-start;
  }
  .calc-filter-row { grid-template-columns: 1fr; }
  .calc-formula-builder { grid-template-columns: 1fr; }
  .calc-filter-head button { margin-left: 0; }
}
