/* ==========================================================================
 * 发票版式（v2.59）—— 矩云 / BVI / HCH 三套 A4 版式整合进收入管理
 *
 * 命名策略：
 *  - 全部选择器带 `.inv-entity-juyun / .inv-entity-bvi / .inv-entity-hch`
 *    命名空间前缀，杜绝与 SPA 现有 `.card/.field/.page` 等类冲突；
 *  - 通用打印根 `#invoice-print-root`（body 级），常态 `display:none`，
 *    打印时 body 加 `.inv-printing`，隐藏 `.app-container`、显示打印根；
 *  - `--inv-*` 变量全部按主体独立定义（复用原模版色板），不触碰 `:root`。
 * ========================================================================== */

/* ---- 通用：A4 页面骨架 + 打印根 ---- */
#invoice-print-root { display: none; }
#invoice-print-root .inv-page-wrap { transform-origin: top left; }

.inv-page {
  position: relative;
  width: 595.28pt;
  height: 841.89pt;
  background: #fff;
  font-family: "Avenir Next", "Avenir", "PingFang SC", "Helvetica Neue", Helvetica, Arial, sans-serif;
  display: flex;
  flex-direction: column;
  -webkit-print-color-adjust: exact;
  print-color-adjust: exact;
}

/* 屏幕预览容器（发票面板预览区） */
#rev-panel-invoices .inv-preview-stage {
  flex: 1;
  overflow: auto;
  padding: 28px;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  background: #eef1f5;
}
#rev-panel-invoices .inv-preview-stage .inv-page { box-shadow: 0 8px 32px rgba(20, 40, 70, .16); }
#rev-panel-invoices .inv-preview-stage .inv-page-wrap { transform-origin: top left; }

/* 打印模态框：激活时预览区显示打印根；打印时隐藏模态框但保留打印根内容 */
/* 卡片与内容区都做成 flex 列且不滚动 —— 预览由 JS 按「可用宽高」把整页 A4 缩到装得下，
   故不需要滚动条。此前卡片(88vh,overflow-y:auto)与内容区(78vh,overflow-y:auto)是两层
   独立滚动容器，任一溢出就会各自冒出一条滚动条。 */
/* 遮罩层默认有 padding:1.5rem 1rem 且自身 overflow-y:auto。若卡片高度按 vh 写死，
   窗口一矮（100vh − 48px < 卡片高度）遮罩层自己就会冒出滚动条。故把该模态框的
   遮罩内边距收小，并让卡片上限与遮罩内容盒**精确相等**，从根上消掉这一层滚动。 */
#invoice-print-modal-overlay { padding: 0.75rem; }
#invoice-print-modal-overlay .modal-card {
  display: flex;
  flex-direction: column;
  /* A4 竖版是 1:1.414 的长条，预览尺寸由**高度**决定，故尽量多给纵向空间 */
  max-height: calc(100vh - 1.5rem);
  padding: 1rem 1.1rem;
  overflow: hidden;
}
/* 头部与按钮行不参与压缩，只让预览区伸缩（否则 overflow:hidden 会把它们裁掉） */
#invoice-print-modal-overlay .modal-header { flex: none; margin-bottom: 0.5rem; }
#invoice-print-modal-overlay .inv-print-body {
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0;
  /* 常态下预览区会自行伸缩、不会溢出，这条 auto 只在极端矮窗口（预览已到
     min-height 下限）时兜底给出滚动条 —— 那种情况下滚动优于把内容裁掉。 */
  overflow: auto;
}
#invoice-print-modal-overlay.active #invoice-print-root {
  display: flex;
  flex: 1 1 auto;
  min-height: 240px;
  justify-content: center;
  align-items: flex-start;
  padding: 12px;
  overflow: hidden;
  background: #eef1f5;
}
#invoice-print-modal-overlay.active #invoice-print-root .inv-page-wrap { transform-origin: top left; }
#invoice-print-modal-overlay.active #invoice-print-root .inv-page { box-shadow: 0 8px 32px rgba(20, 40, 70, .16); }
/* 按钮行是 #invoice-print-root 的**兄弟**节点，不是后代。
   原规则写成 `#invoice-print-root .inv-print-actions`（后代选择器）从未命中，
   绝对定位一直没生效，按钮以静态块堆在预览下方并占去滚动高度。 */
#invoice-print-modal-overlay .inv-print-actions {
  flex: none;
  display: flex;
  gap: 10px;
  justify-content: flex-end;
}

/* ---- 打印控制（全 SPA 唯一 @page 声明） ---- */
@page { size: A4 portrait; margin: 0; }
@media print {
  html, body { margin: 0 !important; padding: 0 !important; background: #fff !important; }
  body.inv-printing .app-container { display: none !important; }
  body.inv-printing .modal-overlay { display: none !important; }
  /* 祖先链必须整条复位。屏幕态为消除滚动条给这条链加了
     内边距 / flex 伸缩 / max-height / overflow:hidden；若不复位，
     它们会在打印时**裁掉发票**（实测下切 225px ≈ 20% 页高）并使页面偏移 50×95px。 */
  body.inv-printing #invoice-print-modal-overlay {
    display: block !important;
    position: static !important;
    background: #fff !important;
    padding: 0 !important;
    margin: 0 !important;
    width: auto !important;
    height: auto !important;
    max-height: none !important;
    overflow: visible !important;
    backdrop-filter: none !important;
  }
  body.inv-printing #invoice-print-modal-overlay .modal-card {
    display: block !important;
    box-shadow: none !important;
    border: 0 !important;
    border-radius: 0 !important;
    max-width: none !important;
    width: auto !important;
    max-height: none !important;
    height: auto !important;
    padding: 0 !important;
    margin: 0 !important;
    overflow: visible !important;
    transform: none !important;
    background: #fff !important;
  }
  body.inv-printing #invoice-print-modal-overlay .inv-print-body {
    display: block !important;
    flex: none !important;
    min-height: 0 !important;
    max-height: none !important;
    height: auto !important;
    padding: 0 !important;
    margin: 0 !important;
    gap: 0 !important;
    overflow: visible !important;
  }
  /* 头部说明文字与按钮行都不进打印输出 */
  body.inv-printing #invoice-print-modal-overlay .modal-header { display: none !important; }
  body.inv-printing #invoice-print-modal-overlay .inv-print-body > div:not(#invoice-print-root) { display: none !important; }
  body.inv-printing #invoice-print-modal-overlay .inv-print-actions { display: none !important; }
  body.inv-printing #invoice-print-root {
    display: block !important;
    /* flex:none 必不可少：作为 flex 项时收缩会绕过下面的 !important 高度
       （实测被压到 897px，而非 841.89pt=1122.5px） */
    flex: none !important;
    width: 595.28pt !important;
    height: 841.89pt !important;
    min-height: 0 !important;
    max-height: none !important;
    margin: 0 !important;
    padding: 0 !important;
    overflow: hidden !important;
    background: #fff !important;
  }
  body.inv-printing #invoice-print-root .inv-page-wrap {
    transform: none !important;
    zoom: 1 !important;
    margin: 0 !important;
    padding: 0 !important;
    width: 595.28pt !important;
    height: 841.89pt !important;
  }
  body.inv-printing #invoice-print-root .inv-page {
    box-shadow: none !important;
    width: 595.28pt !important;
    height: 841.89pt !important;
    max-height: 841.89pt !important;
    overflow: hidden !important;
    page-break-after: avoid !important;
    break-after: avoid !important;
    page-break-inside: avoid !important;
    break-inside: avoid !important;
  }
}

/* ==========================================================================
 * 一、矩云主体（matrixcloud 点阵云）—— 流式布局
 * 色板：slate 深岩板藏青 + steel 钢蓝
 * ========================================================================== */
.inv-entity-juyun {
  --inv-slate:  #1B2A3A;
  --inv-steel:  #3A7FB8;
  --inv-steel-s:#E8F1F7;
  --inv-line:   #E2E8ED;
  --inv-bg:     #F5F7F9;
  --inv-gray:   #6B7A87;
  --inv-gray-l: #97A3AD;
}
.inv-entity-juyun .inv-topbar { position: absolute; left: 0; top: 0; width: 100%; height: 6pt; background: var(--inv-steel); }
.inv-entity-juyun .inv-content { flex: 1; padding: 46pt 48pt 0; }
.inv-entity-juyun .inv-header { display: flex; justify-content: space-between; align-items: flex-start; }
.inv-entity-juyun .inv-brand { display: flex; align-items: center; }
.inv-entity-juyun .inv-brand-logo { height: 38pt; width: auto; display: block; }
.inv-entity-juyun .inv-head-right { text-align: right; }
.inv-entity-juyun .inv-title { font-size: 23pt; font-weight: 700; color: var(--inv-slate); line-height: 1; }
.inv-entity-juyun .inv-title .zh { font-size: 10pt; font-weight: 500; color: var(--inv-steel); margin-left: 6pt; letter-spacing: .2em; }
.inv-entity-juyun .inv-co-name { font-size: 10pt; font-weight: 600; color: var(--inv-slate); margin-top: 10pt; }
.inv-entity-juyun .inv-co-addr { font-size: 8.5pt; color: var(--inv-gray); line-height: 1.5; margin-top: 3pt; width: 258pt; margin-left: auto; }
.inv-entity-juyun .inv-rule { border-top: 2pt solid var(--inv-slate); margin-top: 16pt; }
.inv-entity-juyun .inv-meta { display: grid; grid-template-columns: 1.3fr 1fr 1fr; background: var(--inv-bg); border: 1pt solid var(--inv-line); margin-top: 16pt; }
.inv-entity-juyun .inv-meta-cell { padding: 10pt 16pt; border-right: 1pt solid var(--inv-line); }
.inv-entity-juyun .inv-meta-cell:last-child { border-right: 0; }
.inv-entity-juyun .inv-meta-label { font-size: 7.5pt; font-weight: 700; letter-spacing: .08em; color: var(--inv-steel); }
.inv-entity-juyun .inv-meta-value { font-size: 12.5pt; font-weight: 600; color: var(--inv-slate); margin-top: 4pt; font-variant-numeric: tabular-nums; }
.inv-entity-juyun .inv-bt-label { margin-top: 18pt; font-size: 8pt; font-weight: 700; letter-spacing: .08em; color: var(--inv-steel); }
.inv-entity-juyun .inv-bt-name { font-size: 13pt; font-weight: 600; color: var(--inv-slate); margin-top: 6pt; }
.inv-entity-juyun .inv-bt-addr { font-size: 9.5pt; color: var(--inv-gray); line-height: 1.5; margin-top: 4pt; }
.inv-entity-juyun .inv-bt-desc { font-size: 9.5pt; color: var(--inv-gray); line-height: 1.5; margin-top: 8pt; }
.inv-entity-juyun .inv-bt-desc b { color: var(--inv-slate); font-weight: 600; }
.inv-entity-juyun table.inv-lines { width: 100%; border-collapse: collapse; margin-top: 18pt; font-variant-numeric: tabular-nums; }
.inv-entity-juyun table.inv-lines thead th {
  background: var(--inv-steel); color: #fff; font-size: 8pt; font-weight: 600;
  letter-spacing: .06em; text-align: left; padding: 8pt 12pt; vertical-align: middle;
}
.inv-entity-juyun table.inv-lines thead th span { display: block; font-size: 6.5pt; font-weight: 400; opacity: .62; letter-spacing: .12em; margin-top: 2pt; }
.inv-entity-juyun .c-desc { width: 54%; }
.inv-entity-juyun .c-term { width: 24%; }
.inv-entity-juyun .c-amt  { width: 22%; text-align: right; }
.inv-entity-juyun table.inv-lines tbody td { border-bottom: 1pt solid var(--inv-line); padding: 9pt 12pt; font-size: 10pt; color: var(--inv-slate); vertical-align: top; }
.inv-entity-juyun td.c-desc { font-weight: 600; }
.inv-entity-juyun td.c-term { color: var(--inv-gray); }
.inv-entity-juyun td.c-amt  { font-weight: 600; text-align: right; }
.inv-entity-juyun .inv-total { display: flex; justify-content: flex-end; margin-top: 14pt; }
.inv-entity-juyun .inv-total-inner {
  display: flex; align-items: center; justify-content: space-between;
  background: var(--inv-steel); color: #fff; padding: 11pt 16pt; width: 260pt;
}
.inv-entity-juyun .inv-total-label { font-size: 10pt; font-weight: 600; letter-spacing: .08em; }
.inv-entity-juyun .inv-total-value { font-size: 14pt; font-weight: 700; color: #fff; font-variant-numeric: tabular-nums; }
.inv-entity-juyun .inv-notes { margin-top: 18pt; }
.inv-entity-juyun .inv-notes-label { font-size: 8pt; font-weight: 700; letter-spacing: .08em; color: var(--inv-steel); }
.inv-entity-juyun .inv-notes-text { margin-top: 6pt; font-size: 9pt; color: var(--inv-gray); line-height: 1.6; }
.inv-entity-juyun .inv-footer { margin-top: auto; padding: 0 48pt 30pt; }
.inv-entity-juyun .inv-foot-rule { border-top: 1pt solid var(--inv-line); }
.inv-entity-juyun .inv-foot-inner { display: flex; justify-content: space-between; margin-top: 10pt; font-size: 8pt; color: var(--inv-gray); line-height: 1.5; }
.inv-entity-juyun .inv-foot-inner b { color: var(--inv-slate); font-weight: 600; }
.inv-entity-juyun .inv-foot-right { color: var(--inv-steel); font-weight: 600; white-space: nowrap; }
.inv-entity-juyun .inv-sign-seal { display: flex; align-items: flex-end; justify-content: flex-end; gap: 30pt; margin-bottom: 14pt; }
.inv-entity-juyun .inv-sign { text-align: center; }
.inv-entity-juyun .inv-sign-line { display: inline-block; width: 110pt; border-bottom: 1pt solid var(--inv-line); }
.inv-entity-juyun .inv-sign-lbl { display: block; font-size: 8pt; color: var(--inv-gray-l); margin-top: 6pt; letter-spacing: .04em; }
.inv-entity-juyun .inv-seal {
  /* 圆章直径 40mm（用户口径 **2026-10-14**：「发票 矩云科技 印章在 a4 纸显示原大直径 4 厘米」）。
     ⚠️ 这**改掉了** 2026-09-18「四套版式统一 2.1cm」那条口径 —— 现在**只有矩云科技这一套是 4cm**，
        BVI / HCH / MLESO **仍旧 21mm**（见下面对应规则）。用户点名的是「矩云科技」。
     物理单位在 @page A4 + .inv-page=A4 实寸 + 100% 打印下 1:1 落纸。 */
  width: 113.39pt; height: 113.39pt; /* = 40mm（4cm 圆章原大；113.3858 取 0.01pt 精度，误差 0.2µm。用 pt 是因 v271 的槽位几何判据按 pt 解析、mm 会恒红） */ border: 1pt solid #EEF2F6; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-size: 8pt; color: var(--inv-gray-l); letter-spacing: .08em; flex: none;
}
/* 🔴 盖章后必须收掉边框：全局 box-sizing:border-box 下边框会吃掉内容盒 ——
   .inv-img-seal 是 100%×100%，量出来 = 21mm − 2×边框（headless 实测 71px ≠ 79.37px）。
   空占位不受影响：无图时 applyInvoiceStamps 直接 display:none。 */
.inv-entity-juyun .inv-seal:has(.inv-img-seal) { border: 0; }

/* ==========================================================================
 * 图章 / 签字图片（v2.71）—— 固定尺寸直接盖（用户选定口径，不做每票可调）
 *
 * 注入由 js/app.js `applyInvoiceStamps` 完成：有图则塞 <img>，无图则把占位
 * `display:none`（矩云那个 54pt 隐形圆若留着会像渲染坏了）。
 * 三套版式共用这两个类，位置差异由各版式的 slot 定位负责。
 * `print-color-adjust` 已在 `.inv-page` 上声明，图片打印不掉色。
 * ========================================================================== */
.inv-img-seal {
  width: 100%; height: 100%; object-fit: contain; display: block;
  /* 略微透明更接近真实盖章（油墨透出底下文字），不做可调 */
  opacity: .92;
}
.inv-img-sign {
  display: block; width: 100%; height: auto; max-height: 30pt;
  object-fit: contain; object-position: bottom center;
  margin: 0 auto -2pt;   /* 略微压到签字线上，像签在线上而非线上方悬空 */
}

/* ==========================================================================
 * 二、BVI 主体（RITZ KAY GLOBAL LTD）—— 绝对定位逐像素复刻
 * 色板：navy + gold
 * ========================================================================== */
.inv-entity-bvi {
  --inv-navy:  #0B1F33;
  --inv-gold:  #C49A4A;
  --inv-goldl: #F0D99D;
  --inv-line:  #DBE1E6;
  --inv-bg:    #F4F7F9;
  --inv-gray2: #6D7883;
  --inv-gray3: #52606D;
  --inv-gray4: #8D98A2;
  --inv-ink:   #1E2B37;
}
.inv-entity-bvi .inv-logo { position: absolute; left: 53pt; top: 70pt; width: 190pt; height: 45pt; }
.inv-entity-bvi .inv-logo svg { width: 100%; height: 100%; display: block; }
.inv-entity-bvi .inv-title { position: absolute; left: 442pt; top: 62pt; font-size: 28pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-bvi .inv-rule { position: absolute; height: 0; border-top: .75pt solid var(--inv-line); }
.inv-entity-bvi .inv-hr1 { left: 51pt; top: 155.22pt; width: 493.5pt; }
.inv-entity-bvi .inv-lbl { position: absolute; font-size: 9pt; font-weight: 600; color: var(--inv-gold); line-height: 1; }
.inv-entity-bvi .inv-from-lbl { left: 51pt; top: 181.5pt; }
.inv-entity-bvi .inv-from-name { position: absolute; left: 51pt; top: 201pt; font-size: 14pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-bvi .inv-from-addr { position: absolute; left: 51pt; top: 222pt; width: 250pt; font-size: 10pt; font-weight: 500; color: var(--inv-gray3); line-height: 13.5pt; }
.inv-entity-bvi .inv-ddiv { position: absolute; width: .75pt; background: var(--inv-line); top: 182.22pt; height: 45.75pt; }
.inv-entity-bvi .inv-ddiv1 { left: 390.75pt; }
.inv-entity-bvi .inv-ddiv2 { left: 466.5pt; }
.inv-entity-bvi .inv-d-label { position: absolute; font-size: 8pt; font-weight: 500; color: var(--inv-gray2); line-height: 1; }
.inv-entity-bvi .inv-d-value { position: absolute; font-size: 10pt; font-weight: 500; color: var(--inv-navy); line-height: 1; }
.inv-entity-bvi .inv-dl1 { left: 326.7pt; top: 190.5pt; }
.inv-entity-bvi .inv-dl2 { left: 402.7pt; top: 190.5pt; }
.inv-entity-bvi .inv-dl3 { left: 478.8pt; top: 190.5pt; }
.inv-entity-bvi .inv-dv1 { left: 326.7pt; top: 204pt; }
.inv-entity-bvi .inv-dv2 { left: 402.7pt; top: 204pt; }
.inv-entity-bvi .inv-dv3 { left: 478.8pt; top: 204pt; }
.inv-entity-bvi .inv-bt-lbl { position: absolute; left: 51pt; top: 326.2pt; }
.inv-entity-bvi .inv-bt-name { position: absolute; left: 51pt; top: 345.7pt; font-size: 14pt; font-weight: 600; color: var(--inv-navy); line-height: 1; width: 493pt; }
.inv-entity-bvi .inv-bt-addr { position: absolute; left: 51pt; top: 366.7pt; width: 493pt; font-size: 10pt; font-weight: 500; color: var(--inv-gray3); line-height: 13.5pt; }
.inv-entity-bvi .inv-th-box { position: absolute; top: 426.72pt; height: 32.25pt; background: var(--inv-navy); }
.inv-entity-bvi .inv-th1 { left: 51pt; width: 296.25pt; }
.inv-entity-bvi .inv-th2 { left: 347.25pt; width: 93pt; }
.inv-entity-bvi .inv-th3 { left: 440.25pt; width: 104.25pt; }
.inv-entity-bvi .inv-th-txt { position: absolute; top: 438pt; font-size: 9pt; font-weight: 600; color: #fff; line-height: 1; }
.inv-entity-bvi .inv-th-txt1 { left: 59.5pt; }
.inv-entity-bvi .inv-th-txt2 { left: 347.25pt; width: 83.75pt; text-align: right; }
.inv-entity-bvi .inv-th-txt3 { left: 440.25pt; width: 94.75pt; text-align: right; }
.inv-entity-bvi .inv-tbb { position: absolute; top: 515.22pt; height: 0; border-top: .75pt solid var(--inv-line); }
.inv-entity-bvi .inv-tbb1 { left: 51pt; width: 296.25pt; }
.inv-entity-bvi .inv-tbb2 { left: 347.25pt; width: 93pt; }
.inv-entity-bvi .inv-tbb3 { left: 440.25pt; width: 104.25pt; }
.inv-entity-bvi .inv-td-desc { position: absolute; left: 59.5pt; top: 474pt; width: 280pt; font-size: 12pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-bvi .inv-td-sub  { position: absolute; left: 59.5pt; top: 489.7pt; width: 280pt; font-size: 10pt; font-weight: 500; color: var(--inv-gray2); line-height: 1.3; }
.inv-entity-bvi .inv-td-period { position: absolute; left: 347.25pt; top: 474pt; width: 83.75pt; text-align: right; font-size: 12pt; font-weight: 500; color: var(--inv-ink); line-height: 1; }
.inv-entity-bvi .inv-td-amount { position: absolute; left: 440.25pt; top: 474pt; width: 94.75pt; text-align: right; font-size: 12pt; font-weight: 500; color: var(--inv-ink); line-height: 1; }
.inv-entity-bvi .inv-total { position: absolute; left: 323.25pt; top: 535.47pt; width: 221.25pt; height: 39pt; background: var(--inv-navy); }
.inv-entity-bvi .inv-total .l { position: absolute; left: 11.25pt; top: 11.5pt; font-size: 14pt; font-weight: 600; color: #fff; line-height: 1; }
.inv-entity-bvi .inv-total .v { position: absolute; right: 11.5pt; top: 11.5pt; font-size: 14pt; font-weight: 600; color: var(--inv-goldl); line-height: 1; }
.inv-entity-bvi .inv-pd-lbl { position: absolute; left: 51pt; top: 597pt; }
.inv-entity-bvi .inv-tn-lbl { position: absolute; left: 349.1pt; top: 597pt; }
.inv-entity-bvi .inv-pd-box { position: absolute; left: 51pt; top: 615.72pt; width: 264pt; height: 94.5pt; background: var(--inv-bg); }
.inv-entity-bvi .inv-pd-accent { position: absolute; left: 51pt; top: 615.72pt; width: 1.5pt; height: 94.5pt; background: var(--inv-gold); }
.inv-entity-bvi .inv-pd-line { position: absolute; left: 66.7pt; width: 235pt; font-size: 12pt; color: var(--inv-ink); line-height: 1; }
.inv-entity-bvi .inv-pd-line .k { font-weight: 500; }
.inv-entity-bvi .inv-pd-line .v { font-weight: 600; }
.inv-entity-bvi .inv-pd1 { top: 630.7pt; }
.inv-entity-bvi .inv-pd2 { top: 648pt; }
.inv-entity-bvi .inv-pd3 { top: 666pt; }
.inv-entity-bvi .inv-pd4 { top: 684pt; }
/* v2.81 中转银行：默认隐藏，填了才显示 + 付款块加高（has-int）；空则版式与旧版完全一致 */
.inv-entity-bvi .inv-pd5 { top: 702pt; }
.inv-entity-bvi .inv-pd6 { top: 720pt; }
.inv-entity-bvi .inv-pd-box.has-int, .inv-entity-bvi .inv-pd-accent.has-int { height: 130pt; }
.inv-entity-bvi .inv-tn-text { position: absolute; left: 349.1pt; top: 615.7pt; width: 199pt; font-size: 10pt; font-weight: 500; color: var(--inv-gray2); line-height: 1.45; }
.inv-entity-bvi .inv-sig-line { position: absolute; left: 348.75pt; top: 693.72pt; width: 156pt; height: 0; border-top: .75pt solid var(--inv-gray4); }
.inv-entity-bvi .inv-sig-lbl { position: absolute; left: 349.1pt; top: 699.7pt; font-size: 9pt; font-weight: 500; color: var(--inv-gray2); line-height: 1; }
/* v2.71 槽位：签字压在签字线（693.72pt）正上方；图章置于签认区右侧，避开页脚线（785.97pt） */
.inv-entity-bvi .inv-sign-slot { position: absolute; left: 348.75pt; top: 665pt; width: 156pt; height: 30pt; }
/* 圆章 21mm（=59.53pt）：右缘 468+59.53=527.5pt，仍在内容右界 544.5pt 内；下缘 714.5pt 距页脚线 786pt 充裕 */
.inv-entity-bvi .inv-seal-slot { position: absolute; left: 468pt; top: 655pt; width: 59.53pt; height: 59.53pt; /* = 21mm（2.1cm 圆章原大；59.5276 取 0.01pt 精度，误差 0.9µm。用 pt 是因 v271 的槽位几何判据按 pt 解析） */ }
.inv-entity-bvi .inv-foot-rule { position: absolute; left: 51pt; top: 785.97pt; width: 493.5pt; height: 0; border-top: .75pt solid var(--inv-line); }
.inv-entity-bvi .inv-foot-left { position: absolute; left: 51pt; top: 798.4pt; font-size: 8.5pt; line-height: 1; }
.inv-entity-bvi .inv-foot-left .nm { font-weight: 600; color: var(--inv-navy); }
.inv-entity-bvi .inv-foot-left .ct { color: var(--inv-gray2); }
.inv-entity-bvi .inv-foot-right { position: absolute; left: 427.7pt; top: 798.4pt; width: 116.5pt; text-align: right; font-size: 8.5pt; color: var(--inv-gray2); line-height: 1; }

/* ==========================================================================
 * 三、HCH 主体（HCH INOTECH LIMITED）—— 绝对定位逐像素复刻
 * 色板：navy + blue + teal
 * ========================================================================== */
.inv-entity-hch {
  --inv-navy:   #0E1E37;
  --inv-blue:   #2A82EC;
  --inv-teal:   #3A8FB7;
  --inv-gray:   #5C6B80;
  --inv-bg:     #F1F6FC;
  --inv-border: #DBE6F2;
  --inv-tbody:  #F9FBFD;
}
.inv-entity-hch .inv-topbar-navy { position: absolute; left: 0; top: 0; width: 595.28pt; height: 7pt; background: var(--inv-navy); }
.inv-entity-hch .inv-topbar-blue { position: absolute; left: 420pt; top: 0; width: 175.28pt; height: 7pt; background: var(--inv-blue); }
.inv-entity-hch .inv-logo { position: absolute; left: 363pt; top: 36pt; width: 34pt; height: 21pt; }
.inv-entity-hch .inv-logo svg { width: 100%; height: 100%; display: block; }
.inv-entity-hch .inv-co-name { position: absolute; left: 408pt; top: 39.5pt; font-size: 12.5pt; font-weight: 600; color: var(--inv-navy); line-height: 1; white-space: nowrap; }
.inv-entity-hch .inv-co-addr { position: absolute; left: 280pt; top: 70.5pt; width: 267pt; text-align: right; font-size: 7.5pt; font-weight: 400; color: var(--inv-gray); line-height: 11pt; }
.inv-entity-hch .inv-title { position: absolute; left: 48pt; top: 43pt; font-size: 24pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-hch .inv-rule { position: absolute; height: 0; border-top: 1pt solid var(--inv-bg); }
.inv-entity-hch .inv-hr1 { left: 48pt; top: 116pt; width: 499pt; }
.inv-entity-hch .inv-details { position: absolute; left: 320pt; top: 139pt; width: 227pt; height: 94pt; background: var(--inv-bg); border: 1pt solid var(--inv-border); }
.inv-entity-hch .inv-details .inv-hline { position: absolute; left: 0; top: 47pt; width: 227pt; border-top: 1pt solid var(--inv-border); }
.inv-entity-hch .inv-details .inv-vline { position: absolute; left: 114pt; top: 47pt; width: 0; height: 47pt; border-left: 1pt solid var(--inv-border); }
.inv-entity-hch .inv-dl { position: absolute; font-size: 7pt; font-weight: 600; color: var(--inv-gray); line-height: 1; }
.inv-entity-hch .inv-dv { position: absolute; font-size: 9pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-hch .inv-bt-label { position: absolute; left: 48pt; top: 276pt; font-size: 8pt; font-weight: 600; color: var(--inv-blue); line-height: 1; }
.inv-entity-hch .inv-bt-box { position: absolute; left: 48pt; top: 296pt; width: 499pt; height: 76pt; background: var(--inv-bg); border: 1pt solid var(--inv-border); }
.inv-entity-hch .inv-bt-name { position: absolute; left: 62pt; top: 310pt; font-size: 10pt; font-weight: 600; color: var(--inv-navy); line-height: 1; width: 470pt; }
.inv-entity-hch .inv-bt-addr { position: absolute; left: 62pt; top: 331pt; width: 470pt; font-size: 9pt; font-weight: 400; color: var(--inv-gray); line-height: 12pt; }
.inv-entity-hch .inv-th { position: absolute; left: 48pt; top: 410pt; width: 499pt; height: 34pt; background: var(--inv-navy); }
.inv-entity-hch .inv-th-txt { position: absolute; top: 421pt; font-size: 8pt; font-weight: 600; color: #fff; line-height: 1; }
.inv-entity-hch .inv-th1 { left: 60pt; }
.inv-entity-hch .inv-th2 { left: 362.9pt; }
.inv-entity-hch .inv-th3 { left: 498.7pt; }
.inv-entity-hch .inv-tbody { position: absolute; left: 48pt; top: 446pt; width: 499pt; height: 68pt; background: var(--inv-tbody); }
.inv-entity-hch .inv-td-desc { position: absolute; left: 60pt; top: 459pt; width: 280pt; font-size: 10pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-hch .inv-td-sub  { position: absolute; left: 60pt; top: 479pt; width: 280pt; font-size: 8pt; font-weight: 400; color: var(--inv-gray); line-height: 1.3; }
.inv-entity-hch .inv-td-period { position: absolute; left: 365.9pt; top: 464pt; width: 95pt; font-size: 8pt; font-weight: 400; color: var(--inv-navy); line-height: 1; }
.inv-entity-hch .inv-td-amount { position: absolute; left: 466.4pt; top: 464pt; width: 70pt; font-size: 8pt; font-weight: 600; color: var(--inv-navy); line-height: 1; }
.inv-entity-hch .inv-total { position: absolute; left: 323pt; top: 535pt; width: 224pt; height: 44pt; background: var(--inv-navy); }
.inv-entity-hch .inv-total .l { position: absolute; left: 14pt; top: 15pt; font-size: 10pt; font-weight: 600; color: #fff; line-height: 1; }
.inv-entity-hch .inv-total .v { position: absolute; right: 12pt; top: 16pt; font-size: 9pt; font-weight: 600; color: var(--inv-blue); line-height: 1; }
.inv-entity-hch .inv-pd-label { position: absolute; left: 48pt; top: 620pt; font-size: 8pt; font-weight: 600; color: var(--inv-blue); line-height: 1; }
.inv-entity-hch .inv-tn-label { position: absolute; left: 348pt; top: 620pt; font-size: 8pt; font-weight: 600; color: var(--inv-blue); line-height: 1; }
.inv-entity-hch .inv-pd-box { position: absolute; left: 48pt; top: 642pt; width: 265pt; height: 92pt; background: var(--inv-bg); }
.inv-entity-hch .inv-pd-line { position: absolute; left: 64pt; width: 235pt; font-size: 8.5pt; font-weight: 400; color: var(--inv-gray); line-height: 1; }
.inv-entity-hch .inv-pd-line .k { font-weight: 400; }
.inv-entity-hch .inv-pd-line .v { font-weight: 600; }
.inv-entity-hch .inv-pd1 { top: 658.5pt; }
.inv-entity-hch .inv-pd2 { top: 670.5pt; }
.inv-entity-hch .inv-pd3 { top: 682.5pt; }
.inv-entity-hch .inv-pd4 { top: 694.5pt; }
/* v2.81 中转银行（同上：has-int 才加高） */
.inv-entity-hch .inv-pd5 { top: 706.5pt; }
.inv-entity-hch .inv-pd6 { top: 718.5pt; }
.inv-entity-hch .inv-pd-box.has-int, .inv-entity-hch .inv-pd-accent.has-int { height: 116pt; }
.inv-entity-hch .inv-tn-text { position: absolute; left: 348pt; top: 658.5pt; width: 199pt; font-size: 8.5pt; font-weight: 400; color: var(--inv-gray); line-height: 1.45; }
/* v2.71 签认区：HCH 原版式没有签字位，这里新开一套。
   纵向落在 TERMS 文本块（~694.5pt）与页脚线（786pt）之间，右对齐与付款详情区错开。 */
.inv-entity-hch .inv-sign-slot { position: absolute; left: 348pt; top: 716pt; width: 140pt; height: 28pt; }
.inv-entity-hch .inv-sig-line { position: absolute; left: 348pt; top: 745pt; width: 140pt; height: 0; border-top: .75pt solid var(--inv-border); }
.inv-entity-hch .inv-sig-lbl { position: absolute; left: 348pt; top: 750pt; font-size: 7.5pt; font-weight: 600; color: var(--inv-gray); line-height: 1; }
/* 圆章 21mm：原 left 493pt 时右缘恰齐内容右界 547pt（=595.28−48.28），放大后必须左移，
   保持右缘不变：left = 547 − 59.53 = 487.47pt。下缘 708+59.53=767.5pt 距页脚线 786pt 充裕 */
.inv-entity-hch .inv-seal-slot { position: absolute; left: 487.47pt; top: 708pt; width: 59.53pt; height: 59.53pt; /* = 21mm（2.1cm 圆章原大；59.5276 取 0.01pt 精度，误差 0.9µm。用 pt 是因 v271 的槽位几何判据按 pt 解析） */ }
.inv-entity-hch .inv-foot-rule { position: absolute; left: 48pt; top: 786pt; width: 499pt; height: 0; border-top: 1pt solid var(--inv-bg); }
.inv-entity-hch .inv-foot-left { position: absolute; left: 48pt; top: 798pt; font-size: 7pt; font-weight: 400; color: var(--inv-gray); line-height: 1; }
.inv-entity-hch .inv-foot-right { position: absolute; right: 48.28pt; top: 798pt; font-size: 7pt; font-weight: 600; color: var(--inv-blue); line-height: 1; }

/* ==========================================================================
 * 第 4 套版式：MLESO（v2.90，科技渐变）
 *  - 与另三套同规：所有选择器带 `.inv-entity-mleso` 命名空间前缀。这是硬要求——
 *    .inv-header / .inv-brand / .inv-logo / .inv-topbar 这几个类名另三套也在用，
 *    漏加一条前缀就会串改别人的观感；
 *  - 尺寸/底色/print-color-adjust 沿用公共 `.inv-page` 骨架，此处不重复定义 A4；
 *  - 颜色全为字面量，不定义 CSS 变量，故不触碰 `:root`；不新增 `@page`；
 *  - 流式布局（仅 3 处 absolute 装饰件），不做绝对定位排版，故无 INV_FIT_RULES 条目。
 * 来源：/Users/shuyang/Desktop/发票/MLESO/MLESO发票模版.html 的纸张部分，
 *       并修正原模版 `.stamp-space` 缺失的闭合大括号。
 * ========================================================================== */

.inv-entity-mleso .inv-page {
    /* 尺寸/定位/底色沿用公共 .inv-page 骨架（595.28pt×841.89pt、print-color-adjust:exact）；
       公共骨架是 flex 列，MLESO 是流式块布局 → display:block。此处只覆盖排版参数。 */
    color: #0F172A;
    display: block;
    overflow: hidden;
    padding: 42pt 46pt;
    font-size: 9.5pt;
    line-height: 1.45;
  }

  /* 顶部优雅渐变科技导轨 */
.inv-entity-mleso .paper-top-ribbon {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 5pt;
    background: linear-gradient(90deg, #7928CA 0%, #0070F3 45%, #00DFD8 100%);
  }

  /* 水印背景纹理 */
.inv-entity-mleso .paper-watermark {
    position: absolute;
    right: -60pt;
    bottom: -60pt;
    width: 320pt;
    height: 320pt;
    opacity: 0.025;
    pointer-events: none;
    z-index: 0;
  }

  /* 头部 Header */
.inv-entity-mleso .inv-header {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    position: relative;
    z-index: 1;
    padding-bottom: 24pt;
    border-bottom: 1.2pt solid #F1F5F9;
  }
.inv-entity-mleso .inv-brand-box {
    display: flex;
    flex-direction: column;
    gap: 8pt;
  }
.inv-entity-mleso .inv-logo-wrap {
    height: 34pt;
    display: flex;
    align-items: center;
  }
.inv-entity-mleso .inv-company-addr {
    font-size: 8pt;
    color: #64748B;
    line-height: 1.4;
    max-width: 220pt;
  }
.inv-entity-mleso .inv-title-box {
    text-align: right;
  }
.inv-entity-mleso .inv-headline {
    font-size: 26pt;
    font-weight: 800;
    letter-spacing: 2pt;
    background: linear-gradient(135deg, #0F172A 30%, #2563EB 100%);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    line-height: 1;
    margin-bottom: 6pt;
  }
.inv-entity-mleso .inv-status-pill {
    display: inline-block;
    padding: 3pt 8pt;
    font-size: 7.5pt;
    font-weight: 700;
    letter-spacing: 0.8pt;
    border-radius: 12pt;
    background: #EFF6FF;
    color: #0070F3;
    border: 0.8pt solid #BFDBFE;
    text-transform: uppercase;
  }

  /* 核心指标磁贴栏 (Metric Tiles) — 创新点：不再是呆板方格，而是高质感浮雕磁贴 */
.inv-entity-mleso .metric-strip {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 10pt;
    margin: 18pt 0;
    position: relative;
    z-index: 1;
  }
.inv-entity-mleso .metric-tile {
    background: #F8FAFC;
    border: 0.8pt solid #E2E8F0;
    border-radius: 6pt;
    padding: 8pt 10pt;
  }
.inv-entity-mleso .tile-label {
    font-size: 7pt;
    font-weight: 700;
    color: #64748B;
    letter-spacing: 0.5pt;
    text-transform: uppercase;
    margin-bottom: 3pt;
  }
.inv-entity-mleso .tile-val {
    font-size: 9.5pt;
    font-weight: 700;
    color: #0F172A;
    font-family: 'SF Pro Display', -apple-system, sans-serif;
  }

  /* 账单往来方区块 (Bill To) */
.inv-entity-mleso .parties-grid {
    margin-bottom: 20pt;
    position: relative;
    z-index: 1;
  }
.inv-entity-mleso .party-block {
    background: #FFFFFF;
    border-left: 2.5pt solid #0070F3;
    padding-left: 10pt;
  }
.inv-entity-mleso .party-title {
    font-size: 7.5pt;
    font-weight: 700;
    color: #0070F3;
    letter-spacing: 0.8pt;
    text-transform: uppercase;
    margin-bottom: 4pt;
  }
.inv-entity-mleso .party-name {
    font-size: 11pt;
    font-weight: 700;
    color: #0F172A;
    margin-bottom: 3pt;
  }
.inv-entity-mleso .party-addr {
    font-size: 8pt;
    color: #64748B;
    line-height: 1.4;
  }

  /* 算力与服务费用明细表 (Modern Clean Table) */
.inv-entity-mleso .items-table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 16pt;
    position: relative;
    z-index: 1;
  }
.inv-entity-mleso .items-table thead th {
    background: #F1F5F9;
    color: #475569;
    font-size: 7.5pt;
    font-weight: 700;
    letter-spacing: 0.6pt;
    text-transform: uppercase;
    padding: 8pt 10pt;
    border-top: 1pt solid #E2E8F0;
    border-bottom: 1pt solid #CBD5E1;
  }
.inv-entity-mleso .items-table tbody td {
    padding: 10pt 10pt;
    border-bottom: 0.8pt solid #F1F5F9;
    font-size: 8.5pt;
    vertical-align: top;
  }
.inv-entity-mleso .col-num { width: 28pt; color: #94A3B8; font-weight: 600; }
.inv-entity-mleso .col-desc { }
.inv-entity-mleso .col-period { width: 120pt; color: #64748B; font-size: 8pt; }
.inv-entity-mleso .col-amt { width: 100pt; text-align: right; font-weight: 700; color: #0F172A; }
.inv-entity-mleso .item-name { font-weight: 600; color: #0F172A; margin-bottom: 2pt; }
.inv-entity-mleso .item-tag {
    display: inline-block;
    padding: 1pt 5pt;
    background: #EFF6FF;
    color: #0284C7;
    border-radius: 3pt;
    font-size: 7pt;
    font-weight: 600;
    margin-right: 4pt;
  }
.inv-entity-mleso .item-sub { font-size: 7.5pt; color: #64748B; }

  /* 结算总额区块 (Summary & Total Due) */
.inv-entity-mleso .summary-wrap {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 24pt;
    position: relative;
    z-index: 1;
  }
.inv-entity-mleso .summary-card {
    width: 220pt;
    background: #F8FAFC;
    border: 1pt solid #E2E8F0;
    border-radius: 8pt;
    padding: 12pt 14pt;
  }
.inv-entity-mleso .summary-line {
    display: flex;
    justify-content: space-between;
    font-size: 8pt;
    color: #64748B;
    margin-bottom: 5pt;
  }
.inv-entity-mleso .summary-total {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    border-top: 1.5pt solid #CBD5E1;
    padding-top: 6pt;
    margin-top: 4pt;
  }
.inv-entity-mleso .summary-total .lbl {
    font-size: 9.5pt;
    font-weight: 800;
    color: #0F172A;
    letter-spacing: 0.5pt;
  }
.inv-entity-mleso .summary-total .val {
    font-size: 15pt;
    font-weight: 800;
    color: #0070F3;
    font-family: 'SF Pro Display', -apple-system, sans-serif;
  }
.inv-entity-mleso .amount-words {
    font-size: 7.5pt;
    color: #64748B;
    margin-top: 6pt;
    text-align: right;
    font-style: italic;
  }

  /* 支付银行与右下盖章布局 */
.inv-entity-mleso .settlement-grid {
    display: grid;
    grid-template-columns: 1fr 180pt;
    gap: 16pt;
    position: relative;
    z-index: 1;
    margin-bottom: 20pt;
  }
.inv-entity-mleso .settle-box {
    background: #FFFFFF;
    border: 0.8pt solid #E2E8F0;
    border-radius: 6pt;
    padding: 10pt 12pt;
  }
.inv-entity-mleso .settle-title {
    font-size: 7.5pt;
    font-weight: 700;
    color: #0070F3;
    letter-spacing: 0.6pt;
    text-transform: uppercase;
    margin-bottom: 6pt;
    display: flex;
    align-items: center;
    gap: 4pt;
  }
.inv-entity-mleso .settle-row {
    display: flex;
    font-size: 7.8pt;
    line-height: 1.5;
    margin-bottom: 2pt;
  }
.inv-entity-mleso .settle-key { width: 75pt; color: #64748B; font-weight: 600; }
.inv-entity-mleso .settle-val { flex: 1; color: #0F172A; font-weight: 500; }

  /* 右下盖章授权空间 (Stamp & Signature Box) */
.inv-entity-mleso .stamp-box {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    align-items: flex-end;
    text-align: right;
    padding-top: 1pt;
  }
.inv-entity-mleso .stamp-for {
    font-size: 7.5pt;
    color: #64748B;
    margin-bottom: 2pt;
  }
.inv-entity-mleso .stamp-company {
    font-size: 9.5pt;
    font-weight: 700;
    color: #0F172A;
    letter-spacing: 0.3pt;
  }
/* 盖章 / 签字槽位：**必须给确定尺寸**。共用的 .inv-img-seal 是 width/height:100%，
   若槽位高度为 auto，100% 会回落到图片的固有尺寸（上传时压缩到最长边 600px ≈ 450pt），
   圆章就会撑满整个虚线框、大得离谱。四套版式的圆章统一 21mm（2.1cm 原大）。
   框内校验：签字 108pt + 圆章 59.53pt = 167.5pt < stamp-space 宽 180pt；高 59.53pt < 72pt。 */
.inv-entity-mleso .inv-seal-slot { width: 59.53pt; height: 59.53pt; /* = 21mm（2.1cm 圆章原大；59.5276 取 0.01pt 精度，误差 0.9µm。用 pt 是因 v271 的槽位几何判据按 pt 解析） */ }
.inv-entity-mleso .inv-sign-slot { width: 108pt; height: 26pt; }
/* 盖了章/签了字就把虚线占位框收掉（虚线只是「此处待盖」的提示） */
.inv-entity-mleso .stamp-space:has(.inv-img-seal, .inv-img-sign) { border-color: transparent; }

.inv-entity-mleso .stamp-space {
    width: 180pt;
    height: 72pt;
    margin: 6pt 0;
    border: 1pt dashed #CBD5E1;
    border-radius: 6pt;
    background: transparent;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
  }
  /* 注：原模版此处漏了一个 `}`，使 .stamp-auth-line 的声明被并入 .stamp-space 而失效。
     移植时补上——既还原设计意图，也避免未闭合 `{` 吞掉本文件后续追加的规则。 */
.inv-entity-mleso .stamp-auth-line {
    width: 180pt;
    border-top: 1pt solid #0F172A;
    padding-top: 4pt;
    font-size: 7.5pt;
    font-weight: 600;
    color: #475569;
    text-align: center;
    letter-spacing: 0.3pt;
  }

  /* 底部商业保密脚标 */
.inv-entity-mleso .paper-foot {
    position: absolute;
    bottom: 28pt;
    left: 46pt;
    right: 46pt;
    border-top: 0.8pt solid #E2E8F0;
    padding-top: 10pt;
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-size: 7.5pt;
    color: #94A3B8;
  }
.inv-entity-mleso .foot-confidential {
    font-weight: 600;
    letter-spacing: 0.6pt;
    color: #64748B;
  }
