/* ═══════════════════════════════════════════════════════════════════════════
   统一打印排版（全系统：凭证 / 报表 / 单据）

   技术约定（与 .print-area 打印机制配套，零第三方库）：
   · 打印内容一律用 HTML <table> + Bootstrap 5 表格类（table / table-sm /
     table-bordered / table-light）排版——打印引擎对表格的分页、列宽、单元格
     定位确定性最好；div/flex/绝对定位跨页会错位、截断或整块丢失。
   · 显示/隐藏一律用 Bootstrap 5 打印工具类：d-print-block / d-print-table /
     d-print-none（无需自定义 display 规则）。
   · 本文件只承担三件 Bootstrap 工具类做不到的事：
     ① 纸张与页边距（@page）；
     ② 单据块分页（break-before / break-after）；
     ③ 票证细节（边框、字号、签章行、条件说明行、跨页表头重复）。
   · 打印入口：页面打印按钮直接 window.print()；打印范围由 app.css 的 :has() 规则
     收敛到 .print-area 子树（其余内容 display:none，不占位 → 从第 1 页顶部流式分页）。
     不再依赖任何 JS 打印辅助脚本（原 dataweb-print.js 已删除），也无需 Ctrl+P 兜底路径。
   · 颜色：票据框线是内容的一部分，故对打印件声明 print-color-adjust: exact，
     否则浏览器「省墨」模式会把浅灰表头与底纹打印成白色。
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── 纸张：单据为 A4 横向（凭证表格列多，纵向会挤压摘要与科目） ── */
@page {
    size: A4 landscape;
    margin: 10mm 8mm;
}

/* ── 例外：供应商随货单据走**纵向**（送货单 / 随货图纸清单）──
   为什么它们该纵向：这两张是**竖排单据**——列只有 5~6 个（#/物料/数量/单位），
   横向 A4 会把内容拉成一条、右侧大片留白；而凭证是 8+ 列，才需要横向。
   ⚠ 用命名页（`page: x` + `@page x`）而不是"给 body 加类"：属性 `page` 只在**生成页盒**的
   元素上生效，而 `.print-area` 是 body 里的一个 div——给 div 设 `page` 是无效的。
   ⚠ 用 `body:has(.print-area)` 而不是 JS 加类：本仓打印机制**刻意零 JS 宿主**
   （见 app.css 打印段与 .razor 里的注释）。所以只要打印区用了 .supplier-print-doc，纸张自动变纵向。 */
@page supplier-portrait {
    size: A4 portrait;
    margin: 10mm 8mm;
}

body:has(.supplier-print-doc) {
    page: supplier-portrait;
}

/* ── 工单作业文件：工单卡走**纵向**、每张随卡图纸走**横向** —— 同一次打印里两种纸 ──
   为什么必须拆：全局 @page 只有一个方向（上面 A4 横向）⇒ 竖排的工单卡被横向打印——
   二维码显得巨大（源 px 属性 150px ≈ 39.7mm）且右侧大片空白；而横版图纸一旦纵向又会缩到看不清。

   ⭐ 2026-10-12 收口批：判据从"打印区那一个范围类 + 三个范围按钮"改成**按打印块声明命名页**。
   为什么改（现场缺陷）：范围按钮把"一份工单的作业文件"拆成三个入口 —— 现场点了最显眼的按钮
   却拿不到图纸（或以为打全了、其实只打了卡）。打印入口已收敛成一个【打印】：一次打印 =
   预览里的全部内容（卡 + 每张图纸），逐页分页。
   ⚠ 旧写法（`body:has(.print-area.print-scope-card){page:wo-card}` 与 `print-scope.js` 的打印前
   范围收敛）连注释一起删了：那套依赖"打印区上只有一个范围类"这个**只在 JS 跑过之后才成立**的
   不变量，而那段 JS 已随打印范围一起删除。

   ⚠⚠ **同一作业里两种纸张大小是实测档位**（原注释担心"MDN 并未保证"，本批已用本仓引擎验过）：
   Edge 154 `--headless=new --print-to-pdf`，一份 HTML 里两个块各挂 `page: wo-card` /
   `page: wo-drawing` ⇒ 输出 2 页，第 1 页 MediaBox **209.9 × 297.0mm（纵向 ✓）**、
   第 2 页 **297.0 × 209.9mm（横向 ✓）**（离线台 `.tmp-printtest/named-page.html`）。
   ⚠ 那条离线路径不认 `size: A4` 关键字（须写等价 mm），但**真实打印对话框认**；
   仓库这两条规则保持 `A4 portrait/landscape` 不改（浏览器按纸名选纸，比写死 mm 更稳）。
   已知边界（不变）：打印对话框里用户改的方向/纸张仍是最终值 —— CSS 只能给**默认**。 */
@page wo-card {
    size: A4 portrait;
    margin: 10mm 8mm 22mm;
}

@page wo-drawing {
    size: A4 landscape;
    margin: 8mm 6mm;
}

/* ⚠ `page` 属性只对**生成页盒的块级元素**生效（给 `.print-area` 这种 div 设无效，见上面 :30-33）
   ⇒ 下面两条把它挂在**两个块的类**上。本仓打印时 body:has(.print-area) 已把
   .modal/.modal-dialog/.modal-content/.modal-body 强制 static + overflow:visible
   （app.css 的打印段），祖先链不再是定位元素 ⇒ 这两个块具备生效条件。
   ⛔ 不要把判据改回"读打印区上的范围类"或"给 body 设方向"：
   · 前者要求"打印区上只有一个范围类"，而那要么靠 JS 在打印前收敛（`print-scope.js`，已删除）、
     要么靠静态类互斥 —— 块上的类在 `.razor` 里是**静态并存**的，而 `:has()` 只看"元素在不在
     子树里"、不看可见性 ⇒ 2026-10-03 已踩过：本该 3 页只剩 1 页、卡还按全局 @page 出横向；
   · 后者表达不了"一份作业两种纸"（body 只有一个 `page` 值）。
   取值口径：`.print-card-block` 只出现在工单卡上、`.job-doc-block` 只出现在图纸/作业文件块上
   （`ProductionOrders.razor` 的打印区是唯一渲染它们的地方）。 */
.print-area .print-card-block {
    page: wo-card;
}

.print-area .job-doc-block {
    page: wo-drawing;
}

/* ══ 扫码指令表：A4 **纵向**一张纸（2026-10-13 对齐 Odoo 20 barcode 批）══════════════════
   🐞 为什么必须补这一条（离线台实测抓出的真缺陷）：上面那个全局 @page 是 **A4 横向**，
   而指令表此前**没有任何命名页** ⇒ 它按横向排版，12 条指令的内容高 207.97mm >
   横向可打印高 190mm（再扣打印区 p-3 内边距只剩约 181.5mm）⇒ **溢出成 2 页**，
   第 2 页只有「返回扫码中心 / CMD:BACK」一条（墨迹 0.46%，几乎白页）。
   ⚠ 顺带记一个坑：`PrintPreviewModal` 的 `Paper="PortraitA4"` **只决定屏幕上的纸面宽度**
   （`--app-print-paper-w: 733px`），**不影响纸张方向** —— 真实方向只由这里的 @page 决定
   （见 `PrintPreviewOptions.cs` 的注释）。所以"弹窗标题写着 A4 纵向"并不等于纸上就是纵向。
   实测：加上这条命名页后同一份 DOM 输出 **1 页** 209.9×297.0mm，余量约 60mm。
   ⚠ `page` 挂在 body 上（`:has()` 命中）而不是挂在 `.scan-command-sheet` 这个 div 上 ——
   与上面 :72-82 同一原因（属性 `page` 只对生成页盒的块级元素生效）。 */
@page scan-sheet-portrait {
    size: A4 portrait;
    /* ⚠ 左右 10mm 而不是 8mm：离线台实测两种都是 1 页，但 10mm 把"最靠边的墨"（3 条分组下划线，
       1px #333，正好压在可打印区边缘）从距纸边 7.87mm 推到 **9.78mm** ⇒ 对不可打印区偏大的机器
       （喷墨常见 5mm、个别 6.35mm）仍留 ≥3mm 余量。零风险的余量，就取它。 */
    margin: 10mm 10mm;
}

body:has(.scan-command-sheet) {
    page: scan-sheet-portrait;
}

/* 打印件统一：黑字白底、精确输出底色与框线、禁止因「省墨」丢框线 */
.print-doc,
.print-doc * {
    color: #000;
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
}

.print-doc {
    font-size: 12px;
    line-height: 1.45;
}

/* 屏幕预览宽度档位（打印时统一整宽，见 app.css 中 @media print 的 .print-area 规则） */
.print-area-w-lg {
    max-width: 900px;
}

.print-area-w-full {
    max-width: 100%;
}

/* ── 单据块：一张单据 / 一张凭证 = 一块；一次打印多张时块间分页 ── */
.print-page-block {
    page-break-inside: avoid;
    break-inside: avoid;
}

.print-page-block + .print-page-block {
    page-break-before: always;
    break-before: page;
}

/* ── 表格骨架：框线清晰、金额右对齐、表头跨页重复 ── */
.print-doc-table {
    width: 100%;
    border-collapse: collapse;
    table-layout: fixed;
    margin: 0;
}

.print-doc-table th,
.print-doc-table td {
    border: 1px solid #000;
    padding: 3px 5px;
    vertical-align: middle;
    word-break: break-word;
}

.print-doc-table thead th {
    background: #f0f0f0;
    text-align: center;
    font-weight: 600;
}

/* 明细表跨页时表头在每页重复出现（凭证行多时仍可读） */
.print-doc-grid thead {
    display: table-header-group;
}

.print-doc-grid tr {
    page-break-inside: avoid;
    break-inside: avoid;
}

/* ── 抬头块：核算单位 / 单据名 / 状态 / 单号 / 日期 ── */
.print-doc-head {
    border-bottom: 0;
}

.print-doc-head td {
    border: 1px solid #000;
}

.print-doc-head-title {
    text-align: center;
    font-size: 16px;
    font-weight: 700;
    letter-spacing: 4px;
}

.print-doc-head-meta {
    font-size: 11px;
}

/* ── 明细表 ── */
.print-doc-grid .print-doc-summary {
    font-size: 11px;
}

.print-doc-account-no {
    font-family: Consolas, "Courier New", monospace;
    letter-spacing: 1px;
    margin-right: 4px;
}

.print-doc-grid tfoot .print-doc-total td {
    background: #f7f7f7;
    font-weight: 700;
}

/* ── 键值配对表（发票登记单的往来单位 / 发票号等） ── */
.print-doc-pairs .print-doc-label {
    background: #f7f7f7;
    text-align: center;
    width: 14%;
}

/* ── 页脚块：金额大写 + 签章 + 条件说明 ── */
.print-doc-foot {
    border-top: 0;
    margin-top: -1px; /* 与明细表底框线重叠，避免双线 */
}

.print-doc-foot td {
    border: 1px solid #000;
    font-size: 11px;
}

.print-doc-sign {
    letter-spacing: 1px;
    white-space: nowrap;
}

.print-doc-conditions {
    font-size: 10px;
    color: #333;
}

.print-doc-condition + .print-doc-condition::before {
    content: "　·　";
}

/* ── 屏幕预览微调（打印时由 app.css 统一整宽） ── */
@media screen {
    .print-doc {
        background: #fff;
    }
}

/* ── 打印微调：单据块内的表格不再二次分页；避免最后一块留空白页 ── */
@media print {
    .print-page-block:last-child {
        page-break-after: auto;
        break-after: auto;
    }

    /* 预览弹窗内的表格容器若带 overflow 滚动，打印时必须放开，否则只打印可视区 */
    .print-area .table-responsive {
        overflow: visible !important;
    }
}
