* {
  box-sizing: border-box;
}

body {
  margin: 0;
  color: #1f2933;
  background: #e9edf3;
  font-family: "Microsoft YaHei", "PingFang SC", "Segoe UI", Arial, sans-serif;
  font-size: 14px;
}

button,
.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 36px;
  padding: 0 14px;
  border: 1px solid #3B6EE8;
  border-radius: 6px;
  background: #3B6EE8;
  color: #fff;
  font: inherit;
  text-decoration: none;
  cursor: pointer;
}
.button:hover { background: #2F5CC4; border-color: #2F5CC4; }

button.secondary,
.button.secondary {
  border-color: #cbd5e1;
  background: #fff;
  color: #334155;
}

/* 对账单下载下方的灰色提示框（非按钮、不可点） */
.button.muted-box {
  border-color: #e2e8f0;
  background: #f8fafc;
  color: #94a3b8;
  cursor: default;
}

/* 提示框独占一行，置于对账单下载下方 */
.hint-box {
  margin-top: 6px;
}

button:disabled {
  cursor: not-allowed;
  opacity: 0.65;
}

/* 真正「处理中」的按钮（点击发送/保存后短暂禁用），显示等待光标而非禁止光标 */
button.is-loading {
  cursor: wait;
}

/* 对账「邮件发送」键：默认中性白键（与页面次级键一致，不抢眼）；
   仅当已成功发送过（带 .ra-sent 类 / 有计数角标）才变蓝，作为「已发送」信号。
   开关已外放，状态表达交由独立「自动状态」列承担。 */
button.reconciliationEmailSend {
  background: #fff;
  border: 1px solid #cbd5e1;
  color: #334155;
  font-weight: 600;
}
button.reconciliationEmailSend:hover { background: #f1f5f9; border-color: #94a3b8; }

/* 寄票「下载发票」「邮件发送」「微信发送」键：默认中性白键（与对账发送键一致，不抢眼），无配色。
   状态表达交由独立「自动状态」列承担；已发送次数用右上角橙色小角标提示，不再用蓝/红染色按钮。 */
button.invoiceDownload,
button.invoiceEmailSend,
button.invoiceWeComSend,
button.invoicePreview,
button.invoiceExecute,
button.invoiceMarkSent,
button.invoice-record-view {
  background: #fff;
  border: 1px solid #cbd5e1;
  color: #334155;
  font-weight: 600;
}
button.invoiceDownload:hover,
button.invoiceEmailSend:hover,
button.invoiceWeComSend:hover,
button.invoiceMarkSent:hover,
button.invoice-record-view:hover { background: #f1f5f9; border-color: #94a3b8; }

/* 对账「企微发送」键（发给小琳 / 微信发送业务员）：与邮件发送键默认同为中性白键；
   邮件/微信语义相同，不再用绿色区分通道；有计数（已发送过）才变蓝。 */
button.reconciliationWeComSend {
  background: #fff;
  border: 1px solid #cbd5e1;
  color: #334155;
  font-weight: 600;
}
button.reconciliationWeComSend:hover { background: #f1f5f9; border-color: #94a3b8; }

/* 已成功发送过（有计数角标）→ 发送键变蓝，作为「已发送」视觉信号 */
button.reconciliationEmailSend.ra-sent,
button.reconciliationWeComSend.ra-sent {
  background: #2563eb;
  border: 1px solid #1d4ed8;
  color: #fff;
}
button.reconciliationEmailSend.ra-sent:hover,
button.reconciliationWeComSend.ra-sent:hover { background: #1d4ed8; }

/* 对账「对账确认 / 执行对账」主操作键：默认中性白键（与发送键一致，不抢眼）；
   蓝色仅保留给「已成功发送」(ra-sent) 信号，其它动作键统一走中性白。 */
button.reconcileConfirm,
button.reconcileExecuteOne {
  background: #fff;
  border: 1px solid #cbd5e1;
  color: #334155;
  font-weight: 600;
}
button.reconcileConfirm:hover,
button.reconcileExecuteOne:hover { background: #f1f5f9; border-color: #94a3b8; }

/* 对账「自动状态」独立列开关：关=红（自动化跳过）、开=绿（自动化执行），与基础 .switch 配色一致 */
.recon-auto-cell { text-align: center; vertical-align: middle; }

/* v20260826.4：金蝶UI复刻——执行区功能键图标（图标+文字，14px SVG）。
   .kd-icon 容器：inline-flex 居中 + 与文字 4px 间距；
   .kd-icon svg：14×14，stroke=currentColor 自动跟按钮文字色（蓝/白/灰都自适应）。 */
.kd-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin-right: 4px;
  line-height: 0;
  vertical-align: -2px;
}
.kd-icon svg {
  width: 14px;
  height: 14px;
  display: block;
  flex-shrink: 0;
}
/* 16px 版本（更紧凑的工具栏/行内按钮用） */
.kd-icon.kd-icon-sm svg { width: 12px; height: 12px; }
.kd-icon.kd-icon-sm { margin-right: 3px; }
/* 主按钮蓝底时图标同色继承：已通过 stroke=currentColor 天然处理，无需额外样式 */

/* 发送键右上角「成功发送次数」角标：未发送过（count=0）不在 HTML 中输出，不显示。
   角标绝对定位于键右上，不占用键内文字宽度（键仍保持 5.5em 等宽、不换行）。 */
.recon-actions-2x2 .ra-key { position: relative; }
/* 上排「下载发票」整行跨两列；下排左=预览/联系人，下排右=发送 */
.recon-actions-2x2 .ra-top { grid-column: 1 / -1; }
/* 待开票区：单列纵向堆叠，两键等宽上下对齐（沿用 ra-key 中性白、居中） */
.recon-actions-2x2.recon-actions-stack { grid-template-columns: 5.5em; }
.ra-count {
  position: absolute;
  top: -7px;
  right: -7px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 8px;
  background: #f97316;
  color: #fff;
  font-size: 10px;
  line-height: 16px;
  text-align: center;
  font-weight: 700;
  box-sizing: border-box;
  box-shadow: 0 1px 2px rgba(0,0,0,.25);
}

/* 对账投递对象标签（对账人姓名 / 业务员姓名 / 小琳兜底） */
.rec-recipient {
  display: inline-block;
  padding: 2px 8px;
  margin-right: 6px;
  border-radius: 6px;
  background: #ecfdf5;
  color: #065f46;
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
}
.rec-route-desc { margin: 6px 0; }

/* 对账操作列 2x2 键框：每个分组固定 4 个等尺寸键（对齐发票模块操作列） */
.recon-action-cell { vertical-align: top; }
.recon-actions-2x2 {
  display: grid;
  grid-template-columns: 5.5em 5.5em;
  grid-auto-rows: 1fr;
  gap: 6px;
}
.recon-actions-2x2 .ra-key {
  box-sizing: border-box;
  width: 100%;
  min-height: 36px;
  margin: 0;
  padding: 0 4px;
  text-align: center;
  font-size: 13px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.recon-actions-2x2 .ra-key.button { text-decoration: none; }
/* 微信联系人：禁用显示键（仅展示企微投递对象，不可按下） */
.recon-actions-2x2 .ra-display {
  border-color: #e2e8f0;
  background: #f8fafc;
  color: #475569;
  font-weight: 500;
  cursor: not-allowed;
}
.ra-revert { width: 100%; margin-top: 6px; }
.ra-caption { margin-top: 6px; font-size: 12px; line-height: 1.4; }
.ra-caption.muted { color: #9ca3af; }

/* 投递记录（查看记录）弹窗 */
/* 注意：必须用高特异性选择器覆盖 .modal-overlay .modal-box(max-width:440px)，
   否则 .modal-wide 的宽度永远不生效（v20260821.10 修复）。 */
.modal-overlay .modal-box.modal-wide { max-width: 1400px; width: 96vw; }
.delivery-log-table-wrap { max-height: 60vh; overflow: auto; }
.delivery-log-table .ok { color: #16a34a; font-weight: 600; }
.delivery-log-table .fail { color: #dc2626; font-weight: 600; }
.delivery-log-table .err { color: #b91c1c; font-size: 12px; margin-top: 2px; }

/* 「业务员：xxx（兜底）」投递对象标签：淡紫胶囊，便于一眼看出此单走业务员企微 */
.inv-delivery-recipient {
  display: inline-block;
  padding: 2px 8px;
  margin-right: 6px;
  border-radius: 6px;
  background: #eef2ff;
  color: #3730a3;
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
}
.inv-delivery-recipient small { color: #6b7280; font-weight: 500; }

/* 邮件发送状态弹窗 + 开关拨盘 */
.modal-overlay {
  position: fixed;
  inset: 0;
  display: none;
  align-items: center;
  justify-content: center;
  background: rgba(0, 0, 0, 0.45);
  z-index: 50;
}
.modal-overlay .modal-box {
  background: #fff;
  border-radius: 12px;
  max-width: 440px;
  width: 92vw;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
  overflow: hidden;
}
.modal-overlay .modal-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 12px 16px;
  border-bottom: 1px solid #eee;
}
.modal-overlay .modal-header h3 { margin: 0; font-size: 16px; }
.modal-overlay .modal-close {
  border: none; background: none; font-size: 22px; line-height: 1;
  cursor: pointer; color: #666;
}
.modal-overlay .modal-body { padding: 16px; }
.email-status-stmt { font-weight: 600; margin: 0 0 14px; word-break: break-all; }
.switch-row {
  display: flex; align-items: center; justify-content: center; gap: 12px;
  margin: 10px 0 14px;
}
.switch-label-off, .switch-label-on { color: #555; font-size: 14px; }
.switch { position: relative; display: inline-block; width: 52px; height: 28px; }
.switch input { opacity: 0; width: 0; height: 0; }
.switch .slider {
  position: absolute; cursor: pointer; inset: 0;
  background: #dc2626; border-radius: 999px; transition: 0.2s;
}
.switch .slider::before {
  content: ""; position: absolute; height: 22px; width: 22px;
  left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: 0.2s;
}
.switch input:checked + .slider { background: #16a34a; }
.switch input:checked + .slider::before { transform: translateX(24px); }
/* v20260822.18 起「自动执行」列改为纯徽标（启用/禁用），以下旧开关红态规则已弃用删除。
   .inv-allowed-cell / .inv-email-allowed-cell 仍用于徽标单元格居中。 */
.inv-allowed-cell { text-align: center; }
.inv-email-allowed-cell { text-align: center; }
.modal-actions { display: flex; gap: 10px; margin-top: 8px; flex-wrap: wrap; }
.modal-actions .emailStatusSend:disabled {
  opacity: 0.5; cursor: not-allowed; background: #94a3b8;
}
.email-status-msg { margin: 10px 0 0; min-height: 18px; color: #b91c1c; font-size: 13px; }

.topbar {
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  gap: 16px;
  align-items: center;
  justify-content: space-between;
  padding: 16px 24px;
  border-bottom: 1px solid #d9e2ec;
  background: #fff;
}

.topbar h1 {
  margin: 0 0 4px;
  font-size: 22px;
  font-weight: 700;
}

.topbar p {
  margin: 0;
  color: #64748b;
  font-size: 13px;
}

.topbar p.meta-warning {
  color: #b45309;
  font-weight: 700;
}

.actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  justify-content: flex-end;
}

.actions.console-actions {
  flex-direction: column;
  align-items: flex-end;
}

.action-row {
  display: flex;
  flex-wrap: nowrap;
  gap: 8px;
  justify-content: flex-end;
  white-space: nowrap;
}

.actions form {
  margin: 0;
}

.full-auto-toggle {
  min-width: 120px;
  padding: 8px 14px;
  border-radius: 4px;
  cursor: pointer;
  border: none;
  color: #fff;
  font-weight: 600;
}

.full-auto-toggle.off {
  background: #c0392b;
}

.full-auto-toggle.on {
  background: #27ae60;
}

.fileInput {
  display: none;
}

main {
  width: 100%;
  margin: 0 auto;
  padding: 18px 24px 36px;
}

.credential-panel {
  margin-bottom: 14px;
  border: 1px solid #d9e2ec;
  border-radius: 8px;
  background: #fff;
  padding: 12px 14px;
}

.credential-panel summary {
  width: fit-content;
  color: #1e40af;
  font-weight: 700;
  cursor: pointer;
}

.credential-form {
  display: grid;
  grid-template-columns: minmax(220px, 1fr) minmax(260px, 1fr) auto minmax(220px, 1fr);
  gap: 12px;
  align-items: end;
  margin-top: 14px;
}

.credential-form label {
  display: grid;
  gap: 6px;
  color: #475569;
  font-size: 13px;
}

.credential-form input {
  width: 100%;
  height: 38px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  padding: 0 10px;
  background: #fff;
  font: inherit;
}

.credential-status {
  align-self: center;
  color: #64748b;
  line-height: 1.45;
}

.credential-status.success {
  color: #047857;
}

.credential-status.error {
  color: #b91c1c;
}

.credential-help {
  margin: 10px 0 0;
  color: #64748b;
  font-size: 12px;
}

.module-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
  margin-bottom: 14px;
}

@media (max-width: 900px) {
  .credential-form {
    grid-template-columns: 1fr;
    align-items: stretch;
  }
}

.module-card {
  border: 1px solid #d9e2ec;
  border-radius: 8px;
  background: #fff;
  padding: 14px;
  display: flex;
  flex-direction: column;
}

.module-card h2 {
  margin: 0 0 6px;
  font-size: 18px;
}

.module-card p {
  margin: 0;
  color: #64748b;
}

.module-card-body {
  display: grid;
  gap: 8px;
  margin-top: 12px;
}

.module-stat {
  font-size: 16px;
  font-weight: 700;
}

.module-hint,
.module-status {
  color: #64748b;
  line-height: 1.45;
}

.module-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 14px;
  margin-top: auto;
  justify-content: flex-end;
}

.module-page {
  width: 100%;
  margin: 0 auto;
  padding: 24px 24px 36px;
}

.module-page-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  justify-content: space-between;
  margin: 16px 0 20px;
}

.module-page-actions-left,
.module-page-actions-right {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
}

.module-page-block {
  margin-top: 18px;
  border: 1px solid #e3e8ef;
  border-radius: 6px;
  background: #fff;
  padding: 16px 18px;
  box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
}

.module-page-block h2 {
  margin: 0 0 10px;
  padding-bottom: 8px;
  border-bottom: 2px solid #eef2f7;
  font-size: 17px;
  font-weight: 700;
  color: #101828;
}

.module-page-block > p {
  margin: 0 0 12px;
  color: #475467;
  font-size: 13px;
  line-height: 1.6;
}

.module-page-block > p:last-child {
  margin-bottom: 0;
}

.summary-grid {
  display: grid;
  grid-template-columns: repeat(6, minmax(130px, 1fr));
  gap: 10px;
  margin-bottom: 14px;
}

.metric {
  border: 1px solid #dbe3ec;
  border-radius: 8px;
  background: #fff;
  padding: 12px;
}

.metric span {
  display: block;
  color: #64748b;
  font-size: 12px;
}

.metric strong {
  display: block;
  margin-top: 6px;
  font-size: 22px;
  line-height: 1.1;
}

.toolbar {
  display: flex;
  gap: 12px;
  align-items: center;
  margin-bottom: 14px;
}

.toolbar input {
  width: min(520px, 100%);
  height: 38px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  padding: 0 12px;
  background: #fff;
}

#statusText {
  color: #64748b;
}

.customer-list {
  display: grid;
  gap: 14px;
}

.customer {
  border: 1px solid #d9e2ec;
  border-radius: 8px;
  overflow: hidden;
  background: #fff;
}

.customer.hidden {
  display: none;
}

.customer-head {
  display: grid;
  grid-template-columns: minmax(220px, 1fr) auto;
  gap: 12px;
  align-items: start;
  padding: 12px 16px;
  border-bottom: 1px solid #e5ebf2;
  background: #fbfcfe;
}

.customer-title h2 {
  display: inline-block;
  margin: 0 8px 7px 0;
  font-size: 18px;
  vertical-align: middle;
}

.customer-title .settlement-term {
  display: inline-block;
  margin-bottom: 7px;
  padding: 2px 8px;
  border-radius: 4px;
  background: #eef2f7;
  color: #475569;
  font-size: 12px;
  font-weight: 600;
  vertical-align: middle;
}

.customer-stats {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.toggleDetails {
  min-height: 26px;
  padding: 0 11px;
  border-color: #cbd5e1;
  background: #fff;
  color: #334155;
  font-size: 12px;
}

.pill {
  border-radius: 999px;
  padding: 4px 9px;
  background: #eef2f7;
  color: #334155;
  font-size: 12px;
}

.pill.warning {
  background: #fff1d6;
  color: #8a4b00;
}

.pill.danger {
  background: #ffe4e6;
  color: #be123c;
}

.pill.good {
  background: #dcfce7;
  color: #166534;
}

.tracking {
  width: min(520px, 45vw);
}

.tracking input {
  display: block;
  width: 100%;
  height: 38px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  padding: 0 10px;
  font: inherit;
}

.tracking-input-row {
  display: flex;
  gap: 8px;
  align-items: center;
}

.iconButton {
  width: 38px;
  min-width: 38px;
  height: 38px;
  min-height: 38px;
  padding: 0;
}

.iconButton svg {
  width: 18px;
  height: 18px;
  fill: currentColor;
}

.tracking-meta {
  display: block;
  margin-top: 5px;
  color: #64748b;
  font-size: 12px;
}

.table-wrap {
  overflow: auto;
}

.table-wrap.collapsed {
  display: none;
}

table {
  width: 100%;
  border-collapse: collapse;
}

th,
td {
  border-bottom: 1px solid #e5ebf2;
  border-right: 1px solid #eef2f7;
  padding: 8px 9px;
  text-align: left;
  vertical-align: middle;
  white-space: nowrap;
}

th {
  background: #eef2f7;
  color: #334155;
  font-size: 12px;
  font-weight: 700;
}

td.center {
  text-align: center;
}

th.center {
  text-align: center;
}

td.amount {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

td.days {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

td.days.center {
  text-align: center;
}

td.days.danger {
  color: #be123c;
  font-weight: 700;
}

td.days.warning {
  color: #b45309;
  font-weight: 700;
}

td.days.good {
  color: #15803d;
  font-weight: 700;
}

td.invoice-merged {
  min-width: 190px;
  background: #fbfcfe;
  text-align: center;
  font-weight: 600;
}

/* v20260824.2：对账备注列自动换行 + 宽度锁 20 字符（覆盖全局 td nowrap）
   v20260824.14 修复：原选择器 specificity 与 .jdy-table tbody td(nowrap, 1366 行) 同级且在其前，
   被后者覆盖 → 备注列实际不换行、被长内容撑宽（不再是 20 字符）。
   提高 specificity（.log-table.jdy-table td.recon-note-cell）确保 nowrap 不覆盖。
   v20260824.17 改版（用户拍板）：备注列改为 16 字符宽、不换行、溢出省略号——
   数据单元格不再用 recon-note-cell（改用 .cell-w16 内层 div），本规则仅留表头 16em 对齐。 */
.log-table.jdy-table th.recon-note-cell {
  width: 16em;
  min-width: 16em;
}

/* v20260824.17：对账列表 客户/对账备注/说明/客户订单号组/出库单号组 5 列
   固定 16 字符宽、不换行、溢出省略号（悬停 title 可看完整内容）。
   用 td 内层 div 固定宽度——table-layout:auto 下 td 直接设 max-width 会被内容撑开。 */
.log-table.jdy-table td .cell-w16 {
  width: 16em;
  max-width: 16em;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.empty {
  border: 1px dashed #cbd5e1;
  border-radius: 8px;
  padding: 28px;
  background: #fff;
  color: #64748b;
  text-align: center;
}

.login-body {
  min-height: 100vh;
  display: grid;
  place-items: center;
  background: #eef2f7;
}

.login-panel {
  width: min(380px, calc(100% - 32px));
  border: 1px solid #d9e2ec;
  border-radius: 8px;
  background: #fff;
  padding: 28px;
}

.login-panel h1 {
  margin: 0 0 20px;
  font-size: 22px;
}

.login-form {
  display: grid;
  gap: 14px;
}

.login-form label {
  display: grid;
  gap: 6px;
}

.login-form input {
  height: 38px;
  border: 1px solid #cbd5e1;
  border-radius: 6px;
  padding: 0 10px;
  font: inherit;
}

.login-form button {
  width: 100%;
}

.log-page {
  max-width: none;
}

.log-page h1 {
  font-size: 22px;
}

.log-table {
  margin-top: 14px;
  background: #fff;
}

.log-table td {
  white-space: normal;
  max-width: 420px;
}

/* 对账形式 / 结算时点 列：居中且禁止换行
   v20260911.25：去掉 .log-table 前缀限定，泛化为全表通用——
   应收账款跟踪表是 .jdy-table（不带 .log-table），其「发票号」列加本类后原本不生效。 */
td.col-center-nowrap,
th.col-center-nowrap {
  text-align: center;
  white-space: nowrap;
}

/* v20260911.25：所有「发票号 / 发票号码」列居中（开票管理待寄送·已寄送、应收账款跟踪、
   发票台账、跟踪信息修改日志）。表头与数据格同源，避免出现「合计行居中、数据行左对齐」。 */
td.invoice-no.col-center-nowrap {
  text-align: center;
  white-space: nowrap;
}

/* v20260911.22：对账列表「最新状况」列居中。
   该列单元格内层是 .cell-w16（16em 固定宽块级盒）：td 设 text-align:center 只居中盒内文字，
   盒本身仍左对齐 → 必须给盒子 margin:0 auto 才真正居中。
   仅作用于带 col-center-nowrap 的 td，客户/对账备注/订单号组等列不受影响。
   v20260911.25：同上去掉 .log-table 前缀限定。 */
td.col-center-nowrap .cell-w16 {
  margin: 0 auto;
  text-align: center;
}

/* 对账 / 开票模块列表：标题行（thead 全部 th）居中加粗 */
.log-table.module-list th {
  text-align: center;
  font-weight: 700;
  vertical-align: top;
}

/* 发票台账：表头每列下拉筛选框 */
.th-label {
  margin-bottom: 5px;
  cursor: pointer;
  user-select: none;
}
.th-label:hover { color: #2563eb; }
.sort-ind {
  margin-left: 3px;
  font-size: 11px;
  color: #2563eb;
  font-weight: 700;
}
.sort-hint { color: #2563eb; font-weight: 600; }
.ledger-col-filter {
  display: block;
  width: 100%;
  max-width: 150px;
  margin: 0 auto;
  padding: 3px 4px;
  font-size: 12px;
  line-height: 1.4;
  border: 1px solid #cbd5e1;
  border-radius: 4px;
  background: #fff;
  color: #334155;
}
.ledger-col-filter:focus {
  border-color: #94a3b8;
  outline: none;
}

/* ── 发票台账列表：标题居中加粗；指定列居中/禁止换行 ── */
.invoice-ledger th {
  text-align: center;
  font-weight: 700;
}
.invoice-ledger th.nowrap { white-space: nowrap; }
.invoice-ledger td.center { text-align: center; }
.invoice-ledger td.nowrap { white-space: nowrap; }
.invoice-ledger td.money-col { white-space: nowrap; text-align: right; }
.invoice-ledger button { white-space: nowrap; }

/* ── 查看记录弹窗：标题居中加粗、单元格禁止换行（超出横向滚动） ── */
.delivery-log-table th {
  text-align: center;
  font-weight: 700;
}
.delivery-log-table td {
  white-space: nowrap;
}

/* ── 模块页分区（对账 / 开票）统一视觉：取代原先各自不同底色的内联块 ── */
/* 可对账区：按对账形式分小区（蓝左条区分，统一卡片，不再用各自 hex 底色） */
.zone-form-block {
  border: 1px solid #e3e8ef;
  border-left: 4px solid #2563eb;
  border-radius: 8px;
  background: #fbfcfe;
  padding: 12px 14px;
  margin-bottom: 14px;
}

.zone-form-block:last-child {
  margin-bottom: 0;
}

.zone-form-title {
  margin: 0 0 8px;
  font-size: 15px;
  font-weight: 600;
  color: #344054;
}

/* 待条件满足区：已收货 / 未收货 子分区标题 */
.zone-subtitle {
  margin: 16px 0 6px;
  color: #475467;
  font-size: 15px;
  font-weight: 600;
}

/* 倒计时紧急（已超期） */
.countdown-urgent {
  color: #d9480f;
  font-weight: 600;
}

/* 对账「执行状态」列标签（v20260822.12）：待对账=绿、待确认=黄、待满足=橙、待收货=灰 */
.recon-status-badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.6;
  white-space: nowrap;
}
/* v20260911.11：对账状态列改为常规文本（与对账形式/结算时点一致），去掉彩色 pill 背景/加粗。
   recon-status-badge 类名保留，仅作前端状态筛选的选择器锚点（app.js 取其 textContent）。 */
.recon-status-badge.recon-status-plain {
  display: inline;
  padding: 0;
  border-radius: 0;
  background: none;
  color: inherit;
  font-weight: 400;
}
/* v20260911.17：对账状态「待收货」灰色文字（弱化显示）。
   须排在 .recon-status-plain 之后——同特异性，后者定义的 color 生效。 */
.recon-status-badge.recon-status-muted {
  color: #64748b;
}
/* v20260911.16：组合状态「新组合」= 整格白底 + 橘红(#e8590c)加粗字。
   （v20260911.14 原为红底白字，类名由 cell-new-red 改为 cell-new-highlight。）
   后两条选择器用于压制 .jdy-table tbody tr:hover td / tr.jdy-row-selected td 的
   行高亮背景（特异性更高），保证悬停/选中时白底不被吃掉。 */
.log-table td.cell-new-highlight {
  background: #fff;
  color: #e8590c;
  font-weight: 700;
}
.log-table tbody tr:hover td.cell-new-highlight {
  background: #fff;
  color: #e8590c;
  font-weight: 700;
}
.log-table tbody tr.jdy-row-selected td.cell-new-highlight {
  background: #fff;
  color: #e8590c;
  font-weight: 700;
}
.recon-status-jdy {
  background: #dcfce7;
  color: #15803d;
}
.recon-status-ready {
  background: #fef9c3;
  color: #a16207;
}
.recon-status-waiting {
  background: #ffedd5;
  color: #c2410c;
}
.recon-status-unreceived {
  background: #e2e8f0;
  color: #64748b;
}

/* 「自动执行」状态徽标（v20260822.18）：启用=绿、禁用=红；纯展示不可点，
   切换入口在操作列「启用/禁用」按钮（对账/待开票/待寄送三处共用）。 */
.recon-auto-badge,
.inv-auto-badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.6;
  white-space: nowrap;
}
.recon-auto-badge.on,
.inv-auto-badge.on {
  background: #dcfce7;
  color: #15803d;
}
.recon-auto-badge.off,
.inv-auto-badge.off {
  background: #ffe4e6;
  color: #be123c;
}

/* v20260825.5：对账联系人列（名称 + 渠道标签） */
.rc-wrap { display: flex; align-items: center; }
.rc-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rc-chan { flex: 0 0 auto; margin-left: 4px; padding: 0 6px; border-radius: 999px; font-size: 10px; font-weight: 600; line-height: 1.5; vertical-align: middle; }
.rc-chan.rc-email { background: #EAF3FF; color: #3B6EE8; }
.rc-chan.rc-wecom { background: #dcfce7; color: #15803d; }

@media (max-width: 1050px) {
  .module-grid {
    grid-template-columns: 1fr;
  }

  .summary-grid {
    grid-template-columns: repeat(3, minmax(130px, 1fr));
  }

  .customer-head {
    grid-template-columns: 1fr;
  }

  .tracking {
    width: 100%;
  }
}

@media (max-width: 720px) {
  .topbar {
    position: static;
    align-items: stretch;
    flex-direction: column;
    padding: 14px;
  }

  main {
    padding: 14px;
  }

  .summary-grid {
    grid-template-columns: repeat(2, minmax(120px, 1fr));
  }

}

/* ============ 金蝶 ISAAC 壳（v20260823.1 阶段一）============ */
.jdy-shell {
  display: flex;
  flex-direction: column;
  height: 100vh;
  background: #F5F6F8;
  font-size: 13px;
}
.jdy-topbar {
  height: 48px;
  flex: 0 0 auto;
  background: #fff;
  border-bottom: 0.5px solid #E5E7EB;
  display: flex;
  align-items: center;
  padding: 0 12px;
  gap: 12px;
  z-index: 20;
}
.jdy-topbar-left {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  flex: 1;
}
.jdy-topbar-right {
  display: flex;
  align-items: center;
  gap: 14px;
  color: #374151;
  white-space: nowrap;
}
.jdy-icon-btn {
  /* v20260830.27：主页(home)按钮 44×44，与 .jdy-page-topbar(44px) 及 .jdy-tab(44px) 等高齐平。 */
  /* v20260830.28：width 44px→56px，向右扩大 12px，与右侧页签容器去 gap 后自然衔接。 */
  /* v20260830.29：主页按钮改为与常规页签同款风格——非活动态 background:transparent(透出顶栏浅灰蓝 #e9edf3)，
     活动态白底蓝字浅灰边(与 .jdy-tab.active 完全一致)；区别仅"名称"是 ⌂ 房间图标而非文字、且不可关闭。
     边框改透明占位(避免 active 切换位移)、圆角改 6px 6px 0 0(与页签上圆下直一致)。
     仍固定在 .jdy-page-topbar-left 最左，不在 #jdyTabBar 内 → 不受页签关闭逻辑影响、永不关闭。 */
  width: 56px;
  height: 44px;
  box-sizing: border-box;
  border: 0.5px solid transparent;
  border-radius: 6px 6px 0 0;
  background: transparent;
  color: #6B7280;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: color 0.12s ease, background 0.12s ease;
}
/* v20260830.29：与 .jdy-tab 同款 hover/active（非活动态 hover 仅变字色+淡白，活动态白底蓝字浅灰边）。 */
.jdy-icon-btn:hover:not(.active) { color: #374151; background: rgba(255,255,255,0.45); }
.jdy-icon-btn.active {
  background: #fff;
  color: #1565D8;
  border-color: #E5E7EB;
  border-bottom-color: #fff;
  font-weight: 500;
}
/* v20260910.18：home 房子图标由 ⌂ 字符改为网上 Lucide house 轮廓 SVG（currentColor 描边，跟随按钮灰/蓝状态），
   固定 22×22 比原字符更醒目；SVG 用 display:block 避免 inline 基线留白导致垂直不居中。 */
.jdy-icon-btn svg,
.jdy-home-ico { width: 22px; height: 22px; display: block; }
.jdy-acct { color: #111827; font-weight: 500; }
.jdy-cloud-warn { background: #FEE2E2; color: #B91C1C; padding: 2px 8px; border-radius: 4px; font-size: 12px; }
/* v20260904.14：消息/帮助显式 13px（与页签名称 .jdy-tab 一致，不依赖父级继承） */
.jdy-top-text { color: #6B7280; font-size: 13px; }
/* v20260904.17：头像容器强制 28×28 正方形 + 覆盖 Chromium UA 默认给 <button> 施加的
   min-height:36px（防止按钮太矮不可点击的 UA 规则会把 height:28px 撑成 36px，
   导致 28×36 非正方形 → border-radius:50% 拉成椭圆）。
   关键：min-width/min-height 必须写 0（不能写 28——UA 的 36 比 28 大，取大者后仍然 36px），
   让 height:28px 真正生效；box-sizing:border-box 显式；line-height:1 防 UA 行高撑开；
   appearance:none 彻底清除 UA button chrome（部分浏览器仍会忽略 min-height:0 的写法）。 */
.jdy-avatar {
  appearance: none; -webkit-appearance: none;
  width: 28px; height: 28px; min-width: 0; min-height: 0;
  border-radius: 50%;
  background: #534AB7; color: #fff;
  display: flex; align-items: center; justify-content: center;
  box-sizing: border-box;
  font-weight: 500; font-size: 12px; line-height: 1; text-decoration: none;
  position: relative; overflow: hidden; flex: 0 0 auto;
  padding: 0; border: none; margin: 0;
  cursor: pointer; font-family: inherit;
  vertical-align: middle;
}
.jdy-top-btn { padding: 4px 10px; font-size: 12px; }
.jdy-top-text { cursor: default; }
/* v20260901.29：页签行右侧头像 + 点击展开的用户面板
   v20260904.16：原 1161 行第二条 .jdy-avatar 规则已合并到上面主规则（去重），并加 overflow:hidden/position:relative/flex:0 0 auto 等约束。 */
/* v20260904.16：头像图片圆形裁剪（正圆、不变形）。
   - 容器 .jdy-avatar/.jdy-user-avatar 已是正方形 + border-radius:50% + overflow:hidden
   - img 用 position:absolute + inset:0 完全脱离文档流，永远填满容器，
     不依赖 inline-flex 子元素尺寸，也不受 <button> 默认 box 行为影响
   - object-fit:cover 居中裁剪，任意比例照片都不会变形 */
.jdy-avatar img,
.jdy-user-avatar img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover; border-radius: 50%;
}
.jdy-user-panel {
  /* v20260904.14：right 16px→14px，与右移 2px 的头像按钮保持右缘对齐 */
  position: fixed; top: 50px; right: 14px; z-index: 100;
  width: 248px; background: #fff; border: 1px solid #E5E7EB;
  border-radius: 10px; box-shadow: 0 10px 30px rgba(17,24,39,.16);
  font-size: 13px; color: #1F2937; overflow: hidden;
}
.jdy-user-head { display: flex; align-items: center; gap: 10px; padding: 14px 16px; background: #F5F3FF; }
.jdy-user-avatar { width: 38px; height: 38px; border-radius: 50%; background: #534AB7; color: #fff; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 15px; flex: 0 0 auto; }
.jdy-user-name { font-weight: 600; color: #111827; line-height: 1.3; }
.jdy-user-role { color: #6B7280; font-size: 12px; }
.jdy-user-info { padding: 6px 16px; }
.jdy-user-row { display: flex; justify-content: space-between; padding: 7px 0; border-bottom: 1px dashed #F0F0F0; }
.jdy-user-row span:first-child { color: #9CA3AF; }
.jdy-user-logout { display: block; width: calc(100% - 32px); margin: 14px 16px 16px; padding: 8px 0; background: #FEF2F2; color: #DC2626; border: 1px solid #FECACA; border-radius: 6px; font-size: 13px; cursor: pointer; }
.jdy-user-logout:hover { background: #FEE2E2; }
.jdy-user-confirm { padding: 18px 16px; }
.jdy-user-confirm-text { margin: 0 0 16px; color: #374151; }
.jdy-user-confirm-actions { display: flex; gap: 10px; justify-content: flex-end; }
.jdy-user-confirm-actions button { padding: 6px 14px; border-radius: 6px; font-size: 13px; cursor: pointer; border: 1px solid transparent; }
.jdy-user-cancel { background: #F3F4F6; color: #374151; border-color: #E5E7EB; }
.jdy-user-cancel:hover { background: #E5E7EB; }
.jdy-user-ok { background: #DC2626; color: #fff; }
.jdy-user-ok:hover { background: #B91C1C; }
/* v20260904.11：用户面板「修改密码」入口与密码表单层（改密码功能自系统设置迁入） */
.jdy-user-pwlink { display: block; width: calc(100% - 32px); margin: 4px 16px 0; padding: 8px 0; background: #EEF2FF; color: #4F46E5; border: 1px solid #C7D2FE; border-radius: 6px; font-size: 13px; cursor: pointer; }
.jdy-user-pwlink:hover { background: #E0E7FF; }
.jdy-user-pw { padding: 16px; }
.jdy-user-pw-title { margin: 0 0 10px; font-weight: 600; color: #1F2937; }
.jdy-user-pw label { display: block; margin-bottom: 10px; color: #374151; }
.jdy-user-pw input { display: block; width: 100%; box-sizing: border-box; margin-top: 4px; padding: 6px 8px; border: 1px solid #D1D5DB; border-radius: 6px; font-size: 13px; outline: none; }
.jdy-user-pw input:focus { border-color: #534AB7; }
.jdy-user-pw-status { min-height: 16px; margin: 2px 0 8px; font-size: 12px; color: #DC2626; line-height: 1.4; }
.jdy-user-pw-status.ok { color: #16A34A; }
.jdy-user-save { background: #534AB7; color: #fff; }
.jdy-user-save:hover { background: #4338CA; }
/* v20260904.15：头像图片圆形裁剪（正圆、不变形：object-fit:cover 居中裁切）+ 面板「更换头像」相机钮 */
.jdy-avatar img,
.jdy-user-avatar img {
  display: block; width: 100%; height: 100%;
  object-fit: cover; border-radius: 50%;
}
.jdy-user-avatar-wrap { position: relative; flex: 0 0 auto; }
.jdy-avatar-edit {
  position: absolute; right: -5px; bottom: -5px;
  width: 19px; height: 19px; border-radius: 50%;
  background: #fff; color: #534AB7;
  border: 1px solid #D1D5DB; cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 1px 4px rgba(17, 24, 39, .22);
  transition: background .12s ease, color .12s ease;
}
.jdy-avatar-edit:hover { background: #EEF2FF; color: #4338CA; }
.jdy-avatar-edit .kd-icon { margin: 0; }
.jdy-avatar-edit .kd-icon svg { width: 12px; height: 12px; }
[hidden] { display: none !important; }
.jdy-tabs { display: flex; align-items: flex-end; gap: 0; overflow-x: auto; min-width: 0; }
/* v20260830.9→.10→.11→.12：| 贴在每个页签块的【右侧边线】上（与右边线重合，不再是悬浮外侧的间距管）。
   做法：::after 绝对定位，right:0 + translateX(50%) → 竖线中心正好压在 tab 右边框线上（v12 起 .jdy-tabs gap 已置 0，竖线跨 0 间距贴边）；
   非最后一个 tab 才渲染。home 与首 tab 之间的管子保留（贴在 home 右缘，见下方 .jdy-icon-btn::after）。浅灰 #C0C4CC。 */
.jdy-tabs > .jdy-tab:not(:last-child)::after {
  content: "|";
  color: #C0C4CC;
  font-size: 14px;
  font-weight: 400;
  line-height: 1;
  user-select: none;
  pointer-events: none;
  position: absolute;
  right: 0;
  top: 50%;
  transform: translate(50%, -50%);
}
/* v20260830.11：home 与首 tab 之间的 | 也改为绝对定位、贴 home 按钮右缘线上（与 tab 右侧管子一致）。
   .jdy-icon-btn 加 position:relative，::after 用 right:0+translateX(50%) 让竖线中心压在 home 右边框线上。 */
.jdy-icon-btn { position: relative; }
.jdy-icon-btn::after {
  content: "|";
  color: #C0C4CC;
  font-size: 14px;
  font-weight: 400;
  line-height: 1;
  user-select: none;
  pointer-events: none;
  position: absolute;
  right: 0;
  top: 50%;
  transform: translate(50%, -50%);
}
.jdy-tab {
  /* v20260830.3：非活动页签底色改为浅灰蓝 #e9edf3，与页签行同色 → 非活动态"融入"浅灰蓝外框（恢复浅灰蓝）；
     v20260830.9：去掉加粗态，让"管子|名称×"成为更扁平的页签形态（贴近金蝶模板）。
     边框透明（保留 0.5px 占位，避免 active 切换时位移）；活动态在 .active 里覆盖为白底+蓝字+浅灰边框。
     v20260830.11：position:relative 供 ::after 管子绝对定位贴右缘线。 */
  position: relative;
  border: 0.5px solid transparent;
  background: transparent;
  color: #6B7280;
  padding: 4px 10px;
  border-radius: 6px 6px 0 0;
  font-size: 13px;
  font-weight: 400;
  cursor: pointer;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  /* v20260830.25：页签盒子高度由 30px 提到 44px，与 .jdy-page-topbar(44px) 整行等高 →
     页签填满页签栏、与栏齐平（消除原 30px 页签在 44px 栏里 flex-end 沉底造成的 14px 浅灰蓝留空）；
     名字在 44px 内 align-items:center 自然上下居中。topbar align-items 仍是 flex-end，但等高后等价于填满整行。 */
  height: 44px;
  transition: color 0.12s ease, background 0.12s ease;
}
.jdy-tab:hover:not(.active) { color: #374151; background: rgba(255,255,255,0.45); }
.jdy-tab.active {
  background: #fff;
  /* v20260830.9：激活页签文字改蓝（贴近金蝶品牌蓝 #1565D8），取消紫色 534AB7
     ——用户按金蝶模板风格指定要蓝字。当前上下文中蓝=高亮态（与顶部"金蝶AI·星辰"品牌色呼应）。 */
  color: #1565D8;
  /* 上/左/右浅灰边，底边白（与白底 block1 无缝），形成"凸出白面板"质感，与下方 block1 同色相连 */
  border-color: #E5E7EB;
  border-bottom-color: #fff;
  font-weight: 500;
}
.jdy-tab-close { color: #9CA3AF; cursor: pointer; font-size: 13px; line-height: 1; }
.jdy-tab-close:hover { color: #B91C1C; }
.jdy-body { display: flex; flex: 1 1 auto; min-height: 0; overflow: hidden; }
/* v20260823.13：加回 display:flex flex-direction:column。
   v9 当时删 display:flex 是为了兼容 table thead/tfoot sticky（flex 容器内失效），
   但 v11+ 改用 JS 克隆（cloneH/F 在 .jdy-tbody-wrap div 内，main 是否 flex 都不影响），
   现在可以安全加回 main flex column，让 page-topbar(44)+page-content(flex:1) 正确撑满 100vh。
   没有这条 → page-content 高度=内容 0，page-wrap/wrap 全部 0。 */
.jdy-main { flex: 1 1 auto; min-width: 0; min-height: 0; overflow: hidden; display: flex; flex-direction: column; position: relative; padding: 0; /* v20260823.34：覆盖全局 main{padding:18px 24px 36px}，让 page-content/page-wrap 撑满 main 到视口底，pagebar 普通流沉底 0 留白 */
  /* v20260830.16：恢复标准 UI 风格——内容区铺浅灰蓝 #e9edf3，
     使 banner/list-card 的留白缝隙透出浅灰蓝外框（金蝶标准浅灰蓝 substrate），白卡浮于浅灰蓝之上；
     页签行 .jdy-page-topbar 同为 #e9edf3，整片浅灰蓝连成一个 block。 */ background: #e9edf3; }
.jdy-page-topbar {
  flex: 0 0 auto;
  height: 44px;
  /* v20260830.5：页签行恢复浅灰蓝 #e9edf3（用户指正 v20260830.4 改白是错的；要的是"页签行浅灰蓝 + 下方 block1 同色，整片浅灰蓝连成一个 block"）。
     取消底边线、align-items:flex-end 让活动白页签底贴顶栏底边、活动页签紫字+加粗+浅灰边线在浅灰蓝上做凸出质感。 */
  background: #e9edf3;
  position: sticky;
  top: 0;
  z-index: 5;
  display: flex;
  align-items: flex-end;
  /* v20260830.26：页签栏左右留空 12px→0，页签/页签行内容贴住屏幕左右边缘（用户要求"左右留空间隙都去除，留空0"）。
     注意：此改动使页签栏内容(x=0)与下方 Block1(banner/toolbar 仍 padding:10px 12px… 横向内缩12px，x=12)不再左右对齐——
     属用户显式指定的全出血(bleed)风格，与上 v20260830.18 的"Block1 内容对齐 Block2 边框"是两回事，仅页签栏出血。 */
  padding: 0;
  gap: 12px;
  z-index: 10;
}
.jdy-page-topbar-left {
  display: flex;
  align-items: flex-end;
  /* v20260830.28：主页(home)按钮与右侧页签容器之间的间距 10px→0，去除留空；
     home 按钮同时向右扩大(width 44→56)吃掉该间隙并略延伸，与右侧页签自然衔接。 */
  gap: 0;
  min-width: 0;
  flex: 1;
}
.jdy-page-topbar-right {
  display: flex;
  align-items: center;
  gap: 14px;
  color: #374151;
  white-space: nowrap;
  /* v20260901.30→v20260904.14：右侧三项（消息/帮助/头像）字号统一 13px = 页签名称 .jdy-tab 字号；
     height:44px 填满整行（与 .jdy-tab / home 按钮同高）→ 三项在 44px 顶栏内真正上下居中
     （此前容器只有内容高 28px，被 topbar 的 align-items:flex-end 沉底，视觉偏下）；
     margin-right 12px→10px：整组向右移 2px（距屏幕右边缘 10px）。 */
  font-size: 13px;
  height: 44px;
  margin-right: 10px;
}
.jdy-sidebar {
  width: 150px;
  flex: 0 0 auto;
  background: #2E2D4D;
  color: #D1D5DB;
  display: flex;
  flex-direction: column;
  transition: width 0.2s;
  position: relative;
  position: sticky;
  top: 0;
  align-self: flex-start;
  height: 100vh;
  overflow-y: auto;
}
.jdy-sidebar.collapsed { width: 60px; }
.jdy-sidebar.collapsed .jdy-logo-text,
.jdy-sidebar.collapsed .jdy-nav-txt { display: none; }
.jdy-sidebar.collapsed .jdy-collapse-btn { display: block; }
.jdy-logo {
  padding: 10px 12px;
  border-bottom: 0.5px solid #3F3E5F;
  display: flex;
  align-items: center;
  gap: 8px;
}
.jdy-logo-mark {
  width: 24px; height: 24px;
  background: #534AB7;
  color: #fff;
  border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 500; flex: 0 0 auto;
}
.jdy-logo-title { color: #fff; font-weight: 600; font-size: 17px; white-space: nowrap; }
.jdy-nav { padding: 6px 0; flex: 1 1 auto; }
.jdy-nav-item {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 10px;
  width: 100%;
  padding: 10px 12px;
  background: transparent;
  border: 0;
  border-left: 3px solid transparent;
  color: #D1D5DB;
  font-size: 13px;
  cursor: pointer;
  text-align: left;
}
.jdy-nav-item:hover { background: #3F3E5F; color: #fff; }
.jdy-nav-item.active {
  background: #3F3E5F;
  color: #fff;
  border-left-color: #534AB7;
  font-weight: 500;
}
.jdy-nav-ico { width: 18px; text-align: center; font-size: 15px; flex: 0 0 auto; }
.jdy-nav-txt { white-space: nowrap; }
.jdy-sidebar-foot {
  padding: 8px 12px;
  border-top: 0.5px solid #3F3E5F;
  display: flex;
  justify-content: flex-end;
  align-items: center;
}
.jdy-collapse-btn {
  background: transparent;
  border: 0;
  color: #9CA3AF;
  cursor: pointer;
  font-size: 12px;
  padding: 0;
}
.jdy-collapse-btn:hover { color: #fff; }
/* v20260823.13：删除 v9 残留的 jdy-main overflow:auto 定义（1110 行已是 v11 终版：overflow:hidden+position:relative） */
/* v20260823.11：page-content/page-wrap 改为 flex column，让内部元素可弹性布局。
   v20260823.13：加 flex:1 1 0 让 page-content 在 main flex column 内撑满 100vh，
   否则 wrap 内的 tbody-wrap flex:1 无父级空间可撑。 */
.jdy-page-content { padding: 0; display: flex; flex-direction: column; flex: 1 1 0; min-height: 0; /* v20260829.9：左右 padding 0 16px 0 → 0，让 Block1 搜索行与标题行左右 0 留空同长（此前搜索行比标题窄16px）；底部 .jdy-list-card 自身 8px margin 仍保留 */ }
.jdy-status-text { display: none; }

/* v20260824.22：首行下方横幅——左侧当前页面菜单名（首页/对账管理/...），右侧公司名
   v20260829.3：金蝶连体——去底边线，让标题行与下方搜索行无缝衔接为同一白底区域
   v20260829.4：标题左右 0 留空，与下方搜索条左右对齐（搜索条 .jdy-toolbar 已是 8px 0）
   v20260829.10：整体右移 4 个全角汉字（52px 固定值），与下方搜索行同量缩进保持左对齐 */
.jdy-page-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* v20260830.2→.16：上边距 10px→0，让 block1 与顶部页签行(jdy-page-topbar)0 留空无缝；底 0。
     v20260830.18：左右 padding 0→12px（方向B后背景flush白无灰缝；内容内缩12px使标题/公司名
       与下方白卡 .jdy-list-card 左右边框对齐——左文字贴白卡左框、右文字贴白卡右框）。
     v20260830.19：下 padding 10px→8px，与搜索行上 padding 8px 合计 16px 行距（原20px压到16px）。
     v20260830.20：下 padding 8px→7px，与搜索行上 padding 7px 合计 14px 行距（用户反馈16px仍偏大）。 */
  margin: 0;
  padding: 10px 12px 7px 12px;
  /* v20260830.6 決定 banner 用白 #fff（与 v20260830.5 的"页签行浅灰蓝+block1 同色整片连成 block"相悖）。
     v20260830.21（方向P）曾把 banner 改回浅灰蓝 #e9edf3，用户反馈"不好"已退回 v20260830.20——恢复 #fff。
     banner-left 字号17px/color #111827 保持清晰可读。 */

  background: #fff;
  flex: 0 0 auto;
}
.jdy-page-banner-left {
  /* v20260830.2：标题字号 15px→17px（用户要求页签名再放大一些，比侧栏菜单 .jdy-nav-item 13px 大 4px 更醒目）。
     与下方搜索行 .jdy-search 左对齐（两者左缘同为 10px margin）。 */
  font-size: 17px;
  font-weight: 500;
  color: #111827;
}
.jdy-page-banner-right {
  font-size: 12px;
  color: #6B7280;
}

/* v20260823.11：thead/tfoot 隐藏（CSS sticky 在本环境 Chrome 中即使在 tbody-wrap
   滚动容器内也完全失效），改由 app.js 的 jdyFixTableStickyTbodyWrap() 克隆为 absolute
   覆盖层（相对 .jdy-tbody-wrap，position:relative），绝对定位 0/0 始终固定。
   隐藏方式用 visibility:hidden + height:0 而非 display:none——避免 thead/tfoot
   在 layout 中塌陷影响 tbody 计算。 */
/* v20260823.13：对照金蝶布局——去掉 525px 写死，tbody-wrap 用 flex:1 撑满 main 视口，
   1 屏能放多少行就显示多少（实测 ≈18-20 行，v11 写死 15 行太少）。
   min-height:0 是 flex 子项可收缩到 0 的关键；overflow:auto 让 >可视区 的数据
   通过垂直滚动条查看（保留 Excel 冻结表头/表尾效果）。 */
.jdy-tbody-wrap {
  position: relative;
  flex: 1 1 0;
  min-height: 0;
  /* v20260906.25：恢复原生双轴滚动 overflow:auto——v20260906.23 的 overflow-x:hidden +
     自定义 .jdy-hscroll 已被回滚（其 JS 同步层复杂易错，v23"全乱"即因它），原生横条回来，
     多选列固定由 sticky/JS transform 处理（v22 数据/合计 sticky + v24 表头 transform）。 */
  overflow: auto;
  background: #fff;
}
/* v20260823.40：thead/tfoot 恢复为表格正常区段流式渲染（不再 display:none）。
   表头/合计直接渲染在真实表格里，sticky 单元格与之同表，列宽天然对齐，无需 JS 同步。
   不写 margin-top / padding-bottom → 上下 0 留白。 */
.jdy-tbody-wrap > table.jdy-table { display: table; }
/* v20260828.6：合计栏永远固定在 wrap 底部（横滚条上方，0 留白），且单据行行高不变。
   实测：v20260828.5 的 table{min-height:100%}+tbody{height:100%} 会把多余高度按行分摊，
   短列表行高被拉大（31px→177.66px）；纯 CSS 无解（显式行高/伪元素空行/绝对定位 tfoot
   均实测无效——Chrome 对表格撑高的额外高度一律按行均摊）。改为 JS 垫片：表格保持自然
   高度（行高天然不变），app.js 在 tbody 末尾维护一个 .jdy-spacer-row 空行，高度 = wrap
   可视区剩余空间，把 tfoot 顶到底；长列表时垫片高度=0，tfoot 原生 sticky bottom:0 照常钉底。 */
.jdy-tbody-wrap > table.jdy-table:has(tfoot) > tbody > tr.jdy-spacer-row > td {
  border: none;
  padding: 0;
}

/* v20260824.23：wrap 内表格覆盖 margin-top=0（.log-table 默认 14px 会在 sticky thead 上方留 14px 空挡） */
.jdy-tbody-wrap > table { margin-top: 0 !important; }

/* v20260823.40：sticky 落在单元格上（关键）。
   thead th 竖向粘顶（top:0）→ 抬头标题行固定不动；
   tfoot td 竖向粘底（bottom:0）→ 合计结尾行固定在水平滚动条上方 0 间隔。
   不占正常流空间 → 上下 0 留白；列宽与 tbody 同表天然对齐。 */
.jdy-tbody-wrap > table.jdy-table > thead > tr > th {
  position: sticky;
  top: 0;
  z-index: 30;
}
.jdy-tbody-wrap > table.jdy-table > tfoot > tr > td {
  position: sticky;
  bottom: 0;
  z-index: 30;
}

/* 金蝶式列表页 */
/* v20260823.22：gap 8px → 0，让 tbody-wrap 紧贴 pagebar（合计条和左右滑条 0 留白）。
   toolbar 与 wrap 之间也 0 间隙（统一紧凑，对齐金蝶布局）。
   v20260829.11：左缩进统一收敛到本容器（padding-left:52px = 4 个全角汉字，与 banner 一致）。
     此前 v20260829.10 把 52px 分别加在 banner 与 toolbar 上，而底部 list-card 只有自身 8px
     margin → 卡片左边界(8px)与标题/搜索(52px)错开 44px。"整理"后三者左边界全部落在 52px。 */
.jdy-page-wrap { display: flex; flex-direction: column; flex: 1 1 0; min-height: 0; gap: 0; /* v20260830.1：去除 52px 共享左缩进，改用各区块自身 10px margin，标题/搜索/卡片三者左边界统一落 10px */ padding-left: 0; }
/* v20260829.7：金蝶两段式定稿——底部 Block 2 白卡，含执行键行(.jdy-opbar)+表体(.jdy-tbody-wrap)+分页器(.jdy-pagebar)。
   上 8px = 与顶部 Block 1（标题+搜索）之间一行高度的横向 gap（8px = 本卡左右留白宽度，body #e9edf3 透出）；右 8px / 底 0。
   v20260829.11：左 margin 8px → 0（左缩进由父级 .jdy-page-wrap 的 padding-left:52px 提供），
     使卡片左边界与标题行/搜索行严格对齐（此前错开 44px）。
   v20260829.13：用户定稿"左右上都 8px、下 0"——左 margin 0 → -44px，
     抵消父级 padding-left:52px（有效左留空 = 52-44 = 8px），与右/上 8px 一致；bottom 8px → 0。
   flex column + 子项 flex:0/1 让三段紧贴、合计行 sticky 贴底。 */
.jdy-list-card {
  /* v20260830.1→.16：左右上 10→12px（标准 UI 外框留白），底 0（合计行贴底）；左 12px 与标题/搜索行严格对齐 */
  margin: 12px 12px 0 12px;
  background: #fff;
  border: 1px solid #E5E7EB;
  border-radius: 4px;
  display: flex;
  flex-direction: column;
  flex: 1 1 0;
  min-height: 0;
  overflow: hidden;
}
.jdy-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
  /* v20260829.3：金蝶连体——标题行+搜索行同一区域，左右 0 留空，无分隔
     v20260829.10：曾在本元素加 52px 左缩进
     v20260829.11：52px 缩进上移到父级 .jdy-page-wrap（统一收敛），本元素恢复 0，
       避免与父级叠加成 104px。
     v20260830.1→.16：搜索行左右 margin 12px（与标题行/白卡对齐）；顶部 margin 0 让 Block1 两行间距
       由 banner 的 10px 下 padding 提供（精确 10px）。
     v20260830.18：左右 padding 0→12px（背景flush白无灰缝；内容内缩12px使搜索/筛选框与白卡左框对齐、
       右侧功能按钮与白卡右框对齐）。
     v20260830.19：上 padding 10px→8px，与标题行下 padding 8px 合计 16px 行距（原20px压到16px）；
       下 padding 保持 10px（与下方白卡上外框12px 的间隙不变）。
     v20260830.20：上 padding 8px→7px，与标题行下 padding 7px 合计 14px 行距（用户反馈16px仍偏大）。 */
  padding: 7px 12px 10px 12px;
  margin: 0;
  /* v20260830.6：toolbar 恢复白色 #fff（纠正 v20260830.5——浅灰蓝只用在顶部页签行，
     block1 两行皆白，与 banner/list-card 连贯成白色内容块；页签行浅灰蓝作外框顶条）。 */
  background: #fff;
}
.jdy-toolbar-left { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; flex: 0 0 auto; }
.jdy-toolbar-mid { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; flex: 1 1 auto; padding: 0 8px; }
.jdy-toolbar-right { display: flex; align-items: center; gap: 0; flex: 0 0 auto; }
/* v20260901.14：金蝶式「框+文字」按钮——白底彩字轻边框，主操作实色填充，去图标，仅文字。 */
.jdy-toolbar-right .button {
  background: #fff;
  border: 1px solid #d1d5db;
  border-radius: 3px;
  box-shadow: none;
  color: #3B6EE8;
  min-height: 28px;
  padding: 0 12px;
  margin-left: 6px;
  font-weight: 400;
  gap: 0;
}
.jdy-toolbar-right .button:first-child { margin-left: 0; }
.jdy-toolbar-right .button:hover {
  background: #f3f6fc;
  border-color: #3B6EE8;
  color: #2F5CC4;
}
/* 主操作（下载更新）：蓝实心底色 */
.jdy-toolbar-right .button.primary {
  background: #3B6EE8;
  border-color: #3B6EE8;
  color: #fff;
}
.jdy-toolbar-right .button.primary:hover {
  background: #2F5CC4;
  border-color: #2F5CC4;
  color: #fff;
}
.jdy-toolbar-right .button:disabled {
  background: #fff;
  border-color: #e5e7eb;
  color: #9ca3af;
  opacity: 1;
  cursor: not-allowed;
}
.jdy-toolbar-right .button.primary:disabled {
  background: #93b5f3;
  border-color: #93b5f3;
  color: #fff;
}
/* 分页器（◀ 1/1 ▶）与右侧按钮之间留间距，不被竖线规则误伤 */
.jdy-toolbar-right .jdy-pager {
  margin-left: 10px;
  padding-left: 10px;
  border-left: 1px solid #E5E7EB;
}
.jdy-fullflow-btn { font-weight: 500; }
.jdy-search-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.jdy-search {
  width: 240px;
  /* v20260830.1：恢复常显 1px 灰边框（需求#6：搜索框需要有框）；右侧留 32px 给放大镜图标，
     文字不与图标重叠。focus 时边框转蓝（因边框常显，不再补偿 padding）。
     v20260830.2：显式 height:32px + box-sizing:border-box，与 .jdy-filter-select 严格等高。 */
  height: 32px;
  box-sizing: border-box;
  padding: 6px 32px 6px 10px;
  border: 1px solid #D0D5DD;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
}
.jdy-search:focus {
  outline: none;
  border-color: #3B6EE8;
}
/* v20260830.1：搜索框右侧放大镜图标（需求#6），点击执行搜索 */
.jdy-search-icon {
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  color: #9CA3AF;
}
.jdy-search-icon:hover { color: #3B6EE8; }
.jdy-search-icon .kd-icon svg { width: 16px; height: 16px; }
.jdy-filter-select {
  /* v20260830.2：显式 height:32px + box-sizing:border-box，与 .jdy-search 严格等高（需求#4）。
     二者边框(1px/0.5px)与内边距不同，不设显式高度会有约 1px 落差。 */
  height: 32px;
  box-sizing: border-box;
  padding: 6px 8px;
  border: 0.5px solid #D0D5DD;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
}
.jdy-page-size {
  padding: 6px 8px;
  border: 0.5px solid #D0D5DD;
  border-radius: 6px;
  font-size: 13px;
  background: #fff;
}
.jdy-opbar {
  display: flex;
  align-items: center;
  gap: 0;
  /* v20260829.7：金蝶两段式定稿——执行键行归入底部 Block 2（.jdy-list-card 顶部），
     卡内左右 12px 留白，与下方表头 0 留白（无 border 分隔），与上方搜索行通过卡片上边线区隔。
     （v20260829.6 曾误移回顶部 Block 1，左右 0 留空——本次纠正回卡内。） */
  padding: 6px 12px;
  flex: 0 0 auto;
  flex-wrap: wrap;
}
/* v20260826.5：金蝶执行区复刻——执行键无框无底、蓝字、图标+文字，
   键与键之间用竖线 | 分隔（border-left 实现，紧贴于两键之间）。
   覆盖基础 .button（蓝底白字圆角6px）与 .button.secondary（白底灰边）。 */
.jdy-opbar .button {
  background: transparent;
  border: none;
  border-radius: 0;
  box-shadow: none;
  color: #3B6EE8;
  min-height: 28px;
  padding: 0 12px;
  font-weight: 400;
}
.jdy-opbar .button:hover {
  background: transparent;
  color: #2F5CC4;
}
.jdy-opbar .button:disabled {
  color: #C0C4CC;
  opacity: 1;
}
/* 键间竖线分隔：紧邻的两个执行键之间（第一个键前无竖线） */
.jdy-opbar .button + .button {
  border-left: 1px solid #E5E7EB;
}
/* v20260823.7：工具栏+操作栏合并容器，位于 .jdy-page-topbar 下方正常流。
   v20260823.9：不再 sticky——toolbar 在 table 外部，滚动时天然固定；
   原 sticky 会与 JS 克隆表头（top=44+toolbar高）产生 z-index 竞争。
   v20260829.3：金蝶连体——去底边线，让执行键行与表体无缝衔接为同一区域。
   v20260829.6：曾将执行键行移回本容器（Block 1 含搜索+执行键）。
   v20260829.7：执行键行(.jdy-opbar)再次移出本容器、归入下方 .jdy-list-card。
     本容器现仅含搜索行(.jdy-toolbar)，作为顶部 Block 1（标题+搜索）的搜索行白底，左右 0 留空。
   v20260829.12：整体左移 52px（margin-left:-52px）+ 内容 padding-left:52px 补偿——
     父级 .jdy-page-wrap 的 padding-left:52px 区域是 body 浅灰 #e9edf3 透出，让搜索框左边出现一条灰色色块，
     与上面 banner（白底）视觉割裂。toolbar 自身白底向左溢出 52px 覆盖灰区，让 Block 1 视觉连成一片。 */
.jdy-table-toolbar {
  background: #fff;
  /* v20260830.1：去除 -52px 溢出补偿（v20260829.12 用于盖住父级 52px 灰区）；
     现父级 .jdy-page-wrap 已无左缩进，搜索行由自身 margin:0 10px 对齐 10px。 */
  margin-left: 0;
  padding-left: 0;
}
.jdy-selected-count { color: #6B7280; font-size: 13px; margin-right: 12px; }
.jdy-flex { flex: 1; }
.jdy-pager { color: #6B7280; font-size: 13px; white-space: nowrap; }

.jdy-table {
  /* v20260823.9：thead/tfoot 的 position:sticky 在 Chrome 中要求 separate 模式
     （border-collapse:collapse 会让表格头/尾 sticky 失效，仅普通 div 的 sticky 有效）。
     border-spacing:0 保证视觉上相邻单元格边框无缝。 */
  border-collapse: separate;
  border-spacing: 0;
  background: #fff;
  width: 100%;
  font-size: 13px;
}
/* v20260823.11：恢复 thead/tfoot/pagebar 的 CSS sticky——v10 改用 JS 克隆是因为
   旧结构下 Chrome 的 table thead/tfoot sticky 失效。新结构（tbody-wrap div 525px
   overflow:auto 作为唯一滚动容器，main overflow:hidden 不再滚）让 thead/tfoot 的
   sticky 锚定到 tbody-wrap 滚动容器，pagebar 锚定到 jdy-body 视口，可纯 CSS 解决。 */
.jdy-table thead th {
  background: #F2F4F7;
  border: 1px solid #E5E7EB;  /* v20260905.2: 0.5→1 修复缩列后 border-right 渲染为 1px 小点（sub-pixel 不稳）*/
  padding: 7px 8px;
  text-align: left;
  font-weight: 600;
  color: #1F2937;
  white-space: nowrap;
  user-select: none;
  /* v20260823.40：sticky 直接落在单元格上（见上方 .jdy-tbody-wrap > table.jdy-table > thead > tr > th），
     由浏览器合成器同步绘制，实测本环境 Chrome 稳定生效（thead 整块 sticky 才失效）。 */
}
.jdy-table thead th.jdy-sorted-asc::after { content: " ↑"; color: #534AB7; }
.jdy-table thead th.jdy-sorted-desc::after { content: " ↓"; color: #534AB7; }
/* v20260901.31：应收账款(跟踪)列表表头全部居中（覆盖全局 thead th 左对齐，
   含数值列 right / 居中列 center 等 class，仅作用于 #trackingTable） */
#trackingTable thead th { text-align: center; }
.jdy-table tbody td {
  border: 0.5px solid #F0F0F0;
  /* v20260830.1：行高与表头对齐（需求#3：列表标题行与列表行同高）→ thead 已是 7px 8px，此处 6→7px */
  padding: 7px 8px;
  vertical-align: middle;
  /* v20260823.12：所有列不换行（用户要求，类似 Excel）。移除 max-width:260px
     避免 nowrap 内容被截断；长内容撑宽列，超出 wrap 视口时出现水平滚动条。 */
  white-space: nowrap;
}
.jdy-table tbody tr:hover td { background: #F5F8FF; }
.jdy-table tbody tr.jdy-row-selected td { background: #EAF3FF; }
/* v20260823.7：合计行（tfoot），浅灰底，文字加粗；含金额列时显示数字合计，无金额列时仅显示"合计"标签。
   v20260823.40：合计行 sticky 落在单元格上（见 .jdy-tbody-wrap > table.jdy-table > tfoot > tr > td），
     由浏览器原生 sticky 固定，不再依赖 JS 克隆。
   v20260823.12：加 white-space:nowrap 保持合计行不换行。 */
.jdy-table tfoot tr.jdy-totals-row td {
  background: #FFF7E6;
  border-top: 1px solid #F2E3B3;
  font-weight: 600;
  color: #92400E;
  white-space: nowrap;
  /* v20260830.1：合计行与执行键行(opbar ~40px)同高（需求#4）。
     v20260906.20：高度定 38px → padding 上下 8px + line-height 20px(+1px 上边框) = 38 */
  padding: 8px 8px;
  line-height: 20px;
}
.jdy-table tfoot .jdy-total-label { text-align: left; padding-left: 16px; }
.jdy-check-col { width: 34px; text-align: center; }
/* v20260906.24：4 模块多选列固定在视口左侧——水平滚动时不动。
   表头多选列：单独 position:relative + JS transform 水平反向补偿（避免 thead 整行 sticky top:0
     与 check-col sticky left:0 双轴冲突 → Chrome table-cell 双轴失效 → 表头未锁左的老 bug）。
   数据/合计多选列：单轴 sticky left:0（与 tfoot bottom:0 / 自身 sticky 不冲突），原方案保留。
   背景按所在行配色避免下方数据"透出"，右侧 1px 边框视觉分隔。 */
.jdy-table tbody td.jdy-check-col,
.jdy-table tfoot td.jdy-check-col {
  position: sticky;
  left: 0;
  z-index: 4;
  border-right: 1px solid #E5E7EB;
}
.jdy-table tbody td.jdy-check-col { background: #fff; }
/* v20260906.24：表头多选列锁左。
   v20260906.26：选择器加特异性（压过通用 thead th sticky top:0 / z:30 规则）。
   v20260906.27：改回双轴 CSS sticky（top:0 粘顶 + left:0 锁左）——JS transform 补偿走 scroll 事件
     异步触发，快速拖动慢半帧抖动；CSS sticky 由浏览器合成器同步绘制，与数据多选列一样"纹丝不动"。 */
.jdy-tbody-wrap > table.jdy-table > thead > tr > th.jdy-check-col {
  position: sticky;
  top: 0;
  left: 0;
  z-index: 35;
  background: #F4F7FB;
  border-right: 1px solid #E5E7EB;
}
/* 合计行浅黄 */
.jdy-table tfoot td.jdy-check-col { background: #FFF7E6; z-index: 5; }
/* 选中行高亮跟随 */
.jdy-table tbody tr.jdy-row-selected td.jdy-check-col { background: #EAF3FF; }
/* v20260825.2：复选框金蝶蓝 */
input[type="checkbox"] { accent-color: #3B6EE8; }

.jdy-pagebar {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 0 12px; /* v20260906.21：信息栏定高 36px（height 显式，flex 垂直居中内容，左右留白 12px） */
  height: 36px;
  font-size: 13px;
  color: #374151;
  background: #fff;
  /* v20260829.5：金蝶卡片化——分页器归入 .jdy-list-card 底部，卡内左右 12px 留白，
     与上方表体 0 留白（无 border 分隔），贴底无 margin。
     v20260829.4：拼成卡片底部（border/radius/margin）——由 .jdy-list-card 接管。
     v20260823.34：改回普通流（去 absolute bottom:0）。list-card 是 flex column，
     tbody-wrap flex:1 撑满剩余空间 → pagebar 自然沉到卡底（0 留白）。 */
  flex: 0 0 auto;
}
.jdy-select-all { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
.jdy-count { color: #6B7280; }

/* v20260823.11：v10 残留的 display:none 已删——v11 克隆层 always 显示（Excel 冻结窗格
   模式：表头/表尾永远在视口顶/底，不需要条件隐藏）。
   兼容旧 v10 jdy-clone-pagebar 类名仍保留（如果别处有引用）。 */
.jdy-clone {
  position: absolute;
  left: 0;
  z-index: 30;
  background: #fff;
  box-shadow: 0 2px 8px rgba(17, 24, 39, 0.10);
}
.jdy-clone table.jdy-table { box-shadow: none; }
.jdy-clone .jdy-pagebar { border-top: 0.5px solid #E5E7EB; }
.jdy-page-btn {
  width: 26px; height: 26px;
  border: 0.5px solid #D0D5DD;
  background: #fff;
  border-radius: 4px;
  cursor: pointer;
  font-size: 13px;
}
.jdy-page-num { min-width: 20px; text-align: center; }

/* ===== v20260831.2：应收账款跟踪模块冻结表改造 ===== */
/* v20260905.7：应收「结算期限」列数据居中（v20260905.6 对齐通则——全模块结算期限/结算时点列统一居中） */
.jdy-table td.right, .jdy-table th.right { text-align: right; }
.jdy-table td.cust-name { font-weight: 600; color: #1F2937; white-space: nowrap; }
.jdy-table td.settle-term { color: #475569; white-space: nowrap; text-align: center; }
.jdy-table td.amount-cell { font-weight: 600; color: #1F2937; white-space: nowrap; }
.jdy-table td.op-cell { white-space: nowrap; }
/* v20260831.3：一张发票一行（原主行=客户 → 现主行=发票），新增发票号列与多值提示 */
.jdy-table td.invoice-no { font-weight: 600; color: #1F2937; white-space: nowrap; }
/* 多明细行聚合出「首值 等N项」的单元格：虚线下划线提示可悬停看全文 */
.jdy-table td.multi { cursor: help; border-bottom: 1px dotted #94A3B8; }
/* 展开/收起：仅有多个明细行的发票才有「明细」按钮 */
.jdy-table td.op-cell .toggleDetails {
  border: 0.5px solid #D5DBE4;
  background: #fff;
  border-radius: 3px;
  padding: 2px 8px;
  font-size: 12px;
  color: #475569;
  cursor: pointer;
}
.jdy-table td.op-cell .toggleDetails:hover { border-color: #1565D8; color: #1565D8; }
/* 明细行（发票内出库单子表）默认收起，仅展开时显示 */
.detail-row.collapsed .detail-inner { display: none; }
.detail-row td { background: #FBFCFE; }
.detail-inner { padding: 4px 10px 8px 10px; }

/* ===== v20260905.1：鼠标拖拽调整列宽 ===== */
/* resizer 手柄用 th::before 绘制(右边缘 6px，零 DOM 注入)；避开排序箭头已占用的 th::after */
.jdy-table thead th { position: relative; }
.jdy-table thead th:not(.jdy-check-col)::before {
  content: ""; position: absolute; top: 0; right: 0; height: 100%; width: 6px;
  cursor: col-resize; z-index: 4;
}
.jdy-table thead th:not(.jdy-check-col):hover::before { background: rgba(83,74,183,0.22); }
/* 拖拽进行中：禁用文本选中与单元格 tooltip 干扰 */
body.jdy-col-resizing, body.jdy-col-resizing * { user-select: none; cursor: col-resize !important; }
/* v20260905.1：fixed 布局下列宽严格按 th；单元格溢出单行省略（基线），
   两行截断由下方 v20260905.1b 的 .jdy-cell 包裹层接管（-webkit-line-clamp:2） */
.jdy-table.jdy-colresize-on td, .jdy-table.jdy-colresize-on th { overflow: hidden; text-overflow: ellipsis; }
/* ===== v20260905.1b：单元格两行截断（安全版，纯 CSS clamp，零 JS 量宽） =====
   由 JS jdyWrapClampCells 把纯文本单元格内容包进 .jdy-cell（幂等 data-jdy-cell）；
   超宽内容最多显示 2 行，末行省略号；全文悬浮气泡由 td.title 提供（enableCellTooltips）。
   只作用于 tbody 数据单元格；表头/合计行保持单行 nowrap。 */
.jdy-table.jdy-colresize-on tbody td .jdy-cell {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  white-space: normal;
  word-break: break-all;
  text-align: inherit;
  max-width: 100%;
}
.jdy-subtable {
  border-collapse: separate;
  border-spacing: 0;
  width: 100%;
  font-size: 12px;
}
.jdy-subtable thead th {
  background: #F7F9FC;
  border: 0.5px solid #E5E7EB;
  padding: 5px 8px;
  text-align: left;
  font-weight: 600;
  color: #475569;
  white-space: nowrap;
}
.jdy-subtable tbody td {
  border: 0.5px solid #F0F0F0;
  padding: 5px 8px;
  white-space: nowrap;
  vertical-align: middle;
}
.jdy-subtable .invoice-merged {
  min-width: 170px;
  background: #fbfcfe;
  text-align: center;
  font-weight: 600;
}
/* 跟踪信息列：内联编辑框适配单元格宽度，input 铺满整列 */
/* v20260901.32：固定 20 字符宽（沿用 .cell-w16 的 1em≈1字符 约定，随字号缩放）。
   仅约束 td（与 .cell-w16 同款），表头自动跟随列宽、sticky 表头保持对齐；
   整列恒定 20 字符（按 13px 数据字号 ≈ 260px）。 */
  /* v20260914.3：跟踪信息输入框撑满整格（含 rowspan 跨多行的高）——用 absolute inset 相对 td 定位，
     避开「table-cell 子元素 height:100% 因行高 auto 解析成 auto」的失效坑；flex 列布局让输入框吃满高度、meta 沉底。 */
  .jdy-table td.tracking-cell { position: relative; width: 20em; min-width: 20em; max-width: 20em; vertical-align: top; padding: 4px 6px; }
  .jdy-table td.tracking-cell .tracking { position: absolute; top: 4px; left: 6px; right: 6px; bottom: 4px; display: flex; flex-direction: column; }
  .jdy-table td.tracking-cell .tracking input { flex: 1 1 auto; width: 100%; min-height: 38px; box-sizing: border-box; }
  .jdy-table td.tracking-cell .tracking-meta { font-size: 11px; white-space: normal; margin-top: 4px; flex: 0 0 auto; }
/* 右下角汇总芯片（替代旧顶部 6 卡），元信息失败时标红 */
.jdy-pagebar .jdy-metric {
  display: inline-flex;
  flex-direction: column;
  line-height: 1.15;
  padding: 2px 0;
}
.jdy-pagebar .jdy-metric-label { font-size: 12px; color: #64748B; }
.jdy-pagebar .jdy-metric strong { font-size: 16px; color: #1F2937; }
.jdy-data-meta { margin-left: auto; font-size: 12px; color: #6B7280; white-space: nowrap; }
.jdy-data-meta-warning { color: #BE123C; font-weight: 600; }
/* v20260901.6：pagebar 居中显示「来源 | 更新时间」（flex:1 撑开 + 居中） */
.jdy-pagebar .jdy-tracking-meta { flex: 1; text-align: center; margin-left: 0; }
/* 空态 / 搜索隐藏 */
.jdy-table td.empty { text-align: center; color: #9CA3AF; padding: 24px 0; }
.invoice-row.hidden, .detail-row.hidden { display: none; }

/* ===== v20260825.3：对账「客户」列下拉筛选浮层（金蝶风格）===== */
/* 客户列头内容块：作为 ▾ 的定位上下文（th 本身是 sticky，不能改 position） */
.jdy-th-cell { position: relative; display: block; }
.jdy-col-filter {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translateY(-50%);
  font-size: 10px;
  line-height: 1;
  color: #9CA3AF;
  cursor: pointer;
  padding: 2px 3px;
  border-radius: 3px;
}
/* 客户列排序箭头让位到筛选按钮左侧，确保 ▾ 永远钉在最右且垂直居中 */
.jdy-table thead th[data-col="customer"].jdy-sorted-asc::after,
.jdy-table thead th[data-col="customer"].jdy-sorted-desc::after {
  position: absolute;
  right: 22px;
  top: 50%;
  transform: translateY(-50%);
}
.jdy-col-filter:hover { color: #3B6EE8; background: #EAF3FF; }
.jdy-table thead th.has-filter-open .jdy-col-filter,
.jdy-table thead th.has-filter .jdy-col-filter { color: #3B6EE8; background: #EAF3FF; }
/* 有筛选时整列头轻微高亮（金蝶：筛选列蓝字/浅蓝底） */
.jdy-table thead th.has-filter { background: #EAF3FF; color: #3B6EE8; }

.jdy-col-filter-pop {
  position: fixed;
  background: #fff;
  border: 1px solid #DCDFE6;
  border-radius: 6px;
  box-shadow: 0 6px 20px rgba(17, 24, 39, 0.16);
  z-index: 1000;
  font-size: 13px;
  color: #374151;
  overflow: hidden;
}
.jcf-tabs { display: flex; border-bottom: 1px solid #EEF0F3; }
.jcf-tab {
  flex: 1; padding: 8px 0; border: 0; background: #F7F8FA;
  cursor: pointer; font-size: 13px; color: #6B7280;
}
.jcf-tab.active { background: #fff; color: #3B6EE8; font-weight: 600; border-bottom: 2px solid #3B6EE8; }
.jcf-tools { display: flex; gap: 8px; padding: 8px 10px 4px; }
.jcf-tools button {
  flex: 1; padding: 5px 0; border: 1px solid #DCDFE6; background: #fff;
  border-radius: 4px; cursor: pointer; font-size: 12px; color: #374151;
}
.jcf-tools button:hover { border-color: #3B6EE8; color: #3B6EE8; }
.jcf-search { display: flex; align-items: center; padding: 6px 10px; border-bottom: 1px solid #EEF0F3; }
.jcf-search input {
  flex: 1; border: 1px solid #DCDFE6; border-radius: 4px;
  padding: 5px 8px; font-size: 13px; outline: none;
}
.jcf-search input:focus { border-color: #3B6EE8; }
.jcf-clear { margin-left: 6px; color: #9CA3AF; cursor: pointer; padding: 0 2px; font-size: 14px; }
.jcf-clear:hover { color: #3B6EE8; }
.jcf-list { max-height: 240px; overflow-y: auto; padding: 4px 0; }
.jcf-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer; }
.jcf-item:hover { background: #F5F8FF; }
.jcf-item span { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.jcf-hint { padding: 12px 10px; color: #9CA3AF; text-align: center; font-size: 12px; }
.jcf-foot { display: flex; align-items: center; justify-content: space-between; padding: 8px 10px; border-top: 1px solid #EEF0F3; }
.jcf-mode { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: #6B7280; cursor: pointer; }
.jcf-actions { display: flex; gap: 8px; }
.jcf-actions button {
  padding: 5px 14px; border-radius: 4px; cursor: pointer; font-size: 13px;
  border: 1px solid #DCDFE6; background: #fff; color: #374151;
}
.jcf-reset:hover { border-color: #9CA3AF; }
.jcf-ok { background: #3B6EE8; border-color: #3B6EE8; color: #fff; }
.jcf-ok:hover { background: #2F5FD6; }
/* ===== end v20260825.3 客户列筛选浮层 ===== */

/* 总控台占位（阶段五完善 Dashboard） */
.jdy-dash { padding: 26px 10px 8px 10px; }
.jdy-dash-head h1 { font-size: 20px; font-weight: 500; color: #111827; margin: 0 0 4px; }
.jdy-dash-sub { color: #6B7280; font-size: 13px; margin: 0 0 16px; }
.jdy-dash-actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }

/* 模块页头部（金蝶壳内） */
.module-page-head h1 { font-size: 18px; font-weight: 500; color: #111827; margin: 4px 0 2px; }
.module-page-head p { color: #6B7280; font-size: 13px; margin: 0 0 10px; }
.module-page-actions { margin-bottom: 10px; }

/* ===== v20260906.9 宿主页(模块 iframe 秒切) ===== */
/* ===== v20260906.16 宿主页修正：host-view flex 撑满 + loading 覆盖层 =====
   v15 旧版：.jdy-host-view{height:calc(100vh - 150px)} 在 768 视口=618px，
   iframe 底仅到 709px、离屏幕底差 59px → 信息条(pagebar)悬空不贴屏底。
   现改为 flex:1 1 auto 撑满 #jdyPageContent（main flex 列布局自动分配剩余高度），
   iframe 底=横幅底(83px)+685px=768px=视口底，pagebar 自然贴屏底。 */
.jdy-host-view{position:relative;flex:1 1 auto;min-height:420px;display:flex;flex-direction:column}
.jdy-host-loading{position:absolute;inset:0;z-index:6;display:flex;align-items:center;justify-content:center;color:#7d8694;font-size:13px;background:#fff}
.jdy-host-frame{position:absolute;inset:0;width:100%;height:100%;border:0;display:none;background:#fff}
.jdy-host-frame.active{display:block}
/* 宿主 iframe 内嵌的“纯内容页”：不带壳，正文区域直接铺满 */
.jdy-embed{margin:0;background:#eef1f5;overflow:auto}
.jdy-embed .jdy-tbody-wrap > table.jdy-table{width:100%}

/* ===== v20260906.9 纯内容页(宿主 iframe)：保留 jdy-shell 全部 CSS，仅隐藏侧栏/页签/横幅 ===== */
.jdy-embed .jdy-sidebar{display:none!important}
.jdy-embed .jdy-page-topbar{display:none!important}
.jdy-embed .jdy-page-banner{display:none!important}
.jdy-embed .jdy-main{margin-left:0!important;width:100%!important}

/* v20260910.13 总控台「自动启动时间」卡片上移20px：改走静态CSS通道(引用带?v=版本戳)以绕过tcbgw边缘层对HTML页面按路径的缓存 */
.auto-slots-wrap{position:relative;top:-50px;margin-left:10px;margin-right:10px}
