@agile-team/mach-report 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +54 -10
  2. package/dist/ReportPreview-B-mwUSk9.cjs +6 -0
  3. package/dist/ReportPreview-DKjr4cwO.js +1688 -0
  4. package/dist/defaults-D4o0NCLo.js +9 -0
  5. package/dist/defaults-DOO1yHwx.cjs +1 -0
  6. package/dist/grid-geometry-Dw7BlENr.js +130 -0
  7. package/dist/grid-geometry-bkciiZ4Q.cjs +1 -0
  8. package/dist/index.cjs +6 -6
  9. package/dist/index.d.cts +37 -5
  10. package/dist/index.d.ts +37 -5
  11. package/dist/index.js +1163 -1037
  12. package/dist/pdf.cjs +48 -48
  13. package/dist/pdf.d.cts +18 -0
  14. package/dist/pdf.d.ts +18 -0
  15. package/dist/pdf.js +5605 -5575
  16. package/dist/{plugin-BMoMUxrw.cjs → plugin-2lqgTX26.cjs} +1 -1
  17. package/dist/{plugin-CAcNe0FT.js → plugin-5R00MJQs.js} +1 -1
  18. package/dist/render-plan-CfJ3wf1l.cjs +1 -0
  19. package/dist/render-plan-I9AHvQv7.js +13 -0
  20. package/dist/sql.cjs +42 -42
  21. package/dist/sql.js +1366 -1363
  22. package/dist/style.css +1 -1
  23. package/dist/textwrap-nH0UYU6D.js +108 -0
  24. package/dist/textwrap-oD-t4b4B.cjs +4 -0
  25. package/dist/vue/async.d.cts +33 -7
  26. package/dist/vue/async.d.ts +33 -7
  27. package/dist/vue/index.d.cts +36 -10
  28. package/dist/vue/index.d.ts +36 -10
  29. package/dist/vue-async.cjs +1 -1
  30. package/dist/vue-async.js +3 -3
  31. package/dist/vue.cjs +1 -1
  32. package/dist/vue.js +4 -4
  33. package/dist/xlsx.cjs +24 -24
  34. package/dist/xlsx.d.cts +24 -4
  35. package/dist/xlsx.d.ts +24 -4
  36. package/dist/xlsx.js +8287 -8166
  37. package/package.json +1 -1
  38. package/dist/ReportPreview-BWrQCj9M.js +0 -1643
  39. package/dist/ReportPreview-DY0PGGqF.cjs +0 -6
  40. package/dist/grid-geometry-DBH9ExuY.cjs +0 -1
  41. package/dist/grid-geometry-DONcjshk.js +0 -130
  42. package/dist/textwrap-DdaewxAd.js +0 -117
  43. package/dist/textwrap-DqiFwAV3.cjs +0 -3
package/README.md CHANGED
@@ -3,12 +3,12 @@
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
- <strong>面向业务单据、明细台账与打印场景的 TypeScript 报表引擎</strong><br />
7
- 框架无关内核 · 毫米级页面模型 · Vue 3 预览 · PDF / Excel 输出
6
+ <strong>面向业务宽表、明细台账与标准打印的 TypeScript 报表引擎</strong><br />
7
+ 完整列宽预览 · 连续 Excel · A3 / A4 选配 · 框架无关内核
8
8
  </p>
9
9
 
10
10
  <p align="center">
11
- <img src="https://img.shields.io/badge/source-2.2.0-2563eb" alt="Source version 2.2.0" />
11
+ <img src="https://img.shields.io/badge/source-2.3.1-2563eb" alt="Source version 2.3.1" />
12
12
  <a href="https://www.npmjs.com/package/@agile-team/mach-report"><img src="https://img.shields.io/npm/v/@agile-team/mach-report?label=npm&color=3178c6" alt="npm version" /></a>
13
13
  <a href="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml"><img src="https://github.com/ChenyCHENYU/MachReport/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
14
14
  <a href="https://github.com/ChenyCHENYU/MachReport/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-authorization%20required-dc2626" alt="Authorization required" /></a>
@@ -18,6 +18,7 @@
18
18
 
19
19
  <p align="center">
20
20
  <a href="#60-秒开始"><strong>快速开始</strong></a> ·
21
+ <a href="#完整宽表与标准纸张"><strong>完整宽表</strong></a> ·
21
22
  <a href="#excel-报表能力与边界"><strong>Excel 能力</strong></a> ·
22
23
  <a href="#对齐与可读性">对齐配置</a> ·
23
24
  <a href="#模板配置与管理扩展">模板管理</a> ·
@@ -32,11 +33,12 @@
32
33
 
33
34
  ## 为什么选择 MachReport
34
35
 
35
- MachReport 把模板、数据和输出分开:用 TypeScript DSL 或 JSON 定义纸张与内容,由分页引擎生成统一的 `RenderPlan`,再交给预览、打印或文件导出。适合出入库单、工艺卡、订单明细和分组汇总等需要明确纸张尺寸与分页的业务场景。
36
+ MachReport 把模板、数据和输出分开:用 TypeScript DSL 或 JSON 定义布局与内容,由引擎生成统一的 `RenderPlan`,再交给预览、打印或文件导出。生产日报等多列报表按完整列宽展开;出入库单、工艺卡和订单明细可选标准纸张与分页。
36
37
 
37
38
  | 维度 | 已具备的能力 |
38
39
  | --- | --- |
39
40
  | 页面模型 | 毫米单位、纸张预设与自定义尺寸、页边距、横纵向、文本与表格几何 |
41
+ | 完整宽表 | 自然列宽、横向滚动、默认 100% 预览;纵向分段窗口化,Excel 自动合并连续 Sheet |
40
42
  | 明细与汇总 | 自动折行与分页、重复表头、连续分组小计、末尾总计、页码占位符 |
41
43
  | 数据呈现 | 表头与内容独立对齐、类型自动对齐、数值 / 百分比 / 日期格式化、条件格式 |
42
44
  | 预览交互 | 正文与缩略图双窗口渲染、缩放与适宽、可取消分片搜索、参数面板 |
@@ -84,6 +86,33 @@ const fetcher = createLocalFetcher({
84
86
 
85
87
  标准明细只定义标题和列:默认 A4、10 mm 页边距、`detail` 数据集、表头居中,按内容类型对齐,自动分配列宽并分页。支持固定列宽、权重、横向纸张、分组与总计;复杂单据继续使用 `createTemplate()` 自由排版。
86
88
 
89
+ ### 完整宽表与标准纸张
90
+
91
+ 同一个工厂增加 `layout: "wide"`,列数增加时表格随之展开。自动列默认每列 30 mm,`columnWidthMm` 调整统一宽度;单列 `widthMm` 优先,`flex` 是基准宽度的倍数。页面接入、接口和数据集写法保持一致。
92
+
93
+ ```ts
94
+ const template = createTableTemplate({
95
+ layout: "wide",
96
+ title: "炼钢生产日报",
97
+ columns: [
98
+ { header: "日期", field: "date", widthMm: 32 },
99
+ { header: "班组", field: "team", widthMm: 24 },
100
+ { header: "产量", field: "output", format: { kind: "number", digits: 3 } }
101
+ // 继续声明全部业务列,列宽不受 A3/A4 限制。
102
+ ]
103
+ });
104
+ ```
105
+
106
+ 宽表默认按 100% 显示,横向滚动查看全部列;适宽和缩放仍可手动选择。内部纵向分段用于预览窗口化,Excel 默认把同一逻辑表还原为一张连续 Sheet,保留全部列、行与原始值,重复页头只写一次。
107
+
108
+ | 使用目标 | 配置 |
109
+ | --- | --- |
110
+ | 完整宽表预览 + 连续 Excel | 模板 `layout: "wide"`;导出无需额外配置 |
111
+ | 宽表的 Excel 另选打印纸型 | 应用配置 `xlsx: { paperSize: "a3" }` 或 `"a4"`,只影响打印设置 |
112
+ | 按标准纸张排版预览 / PDF / 打印 | 模板 `paper: "a3", landscape: true` 或 `paper: "a4"`,保持默认 `layout: "page"` |
113
+
114
+ `wide` 与模板的 `paper / landscape` 分别表达自然列宽和固定纸张,不同时设置。标准纸张模式保持原有余量分配;显式固定列宽超出纸张会报错。列很多时优先宽表,避免把所有列挤进一张纸的可用宽度。Excel 打印纸型不会改写工作表列宽。
115
+
87
116
  ### 项目接入:注册一次,页面只传 ID 和参数
88
117
 
89
118
  模板与业务取数集中注册,分页、校验、参数面板、多报表合并及请求生命周期交给包内处理。Vue 用户从同一个 `/vue` 入口获取组件和核心能力。
@@ -149,17 +178,17 @@ await writeFile("report.xlsx", new Uint8Array(buffer));
149
178
 
150
179
  | 项目 | 当前行为 |
151
180
  | --- | --- |
152
- | 工作簿结构 | 每个报表页生成一张工作表,默认 `Sheet1`、`Sheet2`…,可自定义名称 |
181
+ | 工作簿结构 | 默认 `sheetMode: "auto"`:宽表按逻辑表生成连续 Sheet,普通页面仍每页一张;可显式选择 pages / continuous |
153
182
  | 表格结构 | 表头、明细、小计 / 总计的渲染结果,列宽、行高、跨行 / 跨列合并 |
154
183
  | 基础样式 | 字号、字体族、加粗 / 斜体 / 下划线、颜色、水平 / 垂直对齐、换行、底色与边框开关 |
155
184
  | 标题文本 | 按组件顺序写入合并行;页面绝对坐标转换为工作表行流 |
156
- | 单元格类型 | 默认 `text` 保留显示文本;`raw` 保留列表原始数值、布尔、文本编号、空值和汇总数值 |
185
+ | 单元格类型 | 宽表默认 raw,普通页面默认 text;可显式覆盖,raw 保留数值、布尔、文本编号、空值和汇总数值 |
157
186
  | 数字格式 | `raw` 模式沿用小数位、千分位和百分比格式,不猜测文本编号的类型 |
158
187
  | 非表格内容 | 图片、条码、二维码、图表、嵌套组件和无文本回退的富文本等暂不导出,跳过时返回 `warnings` |
159
- | 版式与打印 | 自动识别 A3 / A4 / A5,可配置 `paperSize`;自定义尺寸回退有告警,绝对坐标仍转为行流 |
188
+ | 版式与打印 | 普通页面自动识别 A3 / A4 / A5;宽表默认不强制纸型,可选 paperSize,工作表列宽保持完整 |
160
189
  | Excel 编辑工作流 | 尚无 `.xlsx` 模板导入、交互式工作簿编辑、公式计算或透视表 API |
161
190
 
162
- 列表自动保留原始值,Vue 可在配置中一次启用 `xlsx: { valueMode: "raw" }`;旧计划没有原始值时继续导出显示文本。日期对象、公式和自定义布局仍需业务明确处理。Excel 不做 PDF 坐标复刻;可使用返回的 ExcelJS `workbook` 继续处理并重新序列化。
191
+ 列表自动保留原始值,Vue 可在配置中一次启用 `xlsx: { valueMode: "raw" }`;旧计划没有原始值时继续导出显示文本。连续导出使用包内记录的逻辑行与列身份,不按文字猜测重复表头;多报表保持独立 Sheet。显式 continuous 要求可识别的列表结构,不支持的布局会报错。日期对象、公式和自由布局仍需业务明确处理。Excel 不做 PDF 坐标复刻;可使用返回的 ExcelJS `workbook` 继续处理并重新序列化。
163
192
 
164
193
  完整示例、类型保留策略和注意事项见 [Excel 导出指南](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/EXCEL.md)。
165
194
 
@@ -187,6 +216,19 @@ const template = createTableTemplate({
187
216
 
188
217
  `align` 支持 `auto / left / center / right / justify`;`headerAlign` 支持四种明确对齐。`headerStyle` 可独立配置表头字体、底色与垂直对齐。条件规则只覆盖内容;旧低层模板未配置新字段时保留原有行为。DOM、Canvas、PDF 和 Excel 使用同一份解析后的样式。
189
218
 
219
+ ## 还原一致性与宿主样式
220
+
221
+ 模板的列样式、表头样式和条件规则是报表样式入口;应用主题控制预览外壳。包内隔离普通宿主表格、文本和图片 CSS,并按统一网格坐标绘制单元格,避免全局 padding、行高或边框撑破计划尺寸。列表内距、字号继承和跨单位覆盖统一处理,使用侧保持原来的模板和页面写法。
222
+
223
+ | 输出 | 验收重点与范围 |
224
+ | --- | --- |
225
+ | DOM / 浏览器打印 | 固定几何、合并格、字体继承、独立边框、普通宿主 CSS 隔离;自定义纸张保留毫米精度 |
226
+ | Canvas / PNG | 文本、表格、基本形状的尺寸与样式;图片型组件、完整富文本与部分高级文字样式仍有限制 |
227
+ | PDF | 网格、内距、行高、垂直对齐、字体与图片输出;缺字、裁切及不支持样式提供诊断 |
228
+ | Excel | 完整行列、原始值、合并、行高、连续表;按工作表语义输出,不复刻自由页面坐标 |
229
+
230
+ 字体可用性、宿主强制 `!important` 或伪元素规则,以及不同出口本身的能力差异,仍需按业务模板验收。详细支持矩阵、真实回归与质量门禁见[质量与还原说明](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/QUALITY.md)。
231
+
190
232
  ## 模板配置与管理扩展
191
233
 
192
234
  模板文档只保存布局与描述,可存为 JSON 文件或交给现有后台。模板 ID、名称、修订号和布局形成明确契约;查询接口、数据与鉴权继续使用项目已有能力。
@@ -340,7 +382,8 @@ pnpm test:e2e
340
382
  | `pnpm lint` | ESLint 检查 |
341
383
  | `pnpm test` / `pnpm test:coverage` | Vitest 单元测试 / 覆盖率 |
342
384
  | `pnpm build` | 引擎、Vue、联邦与示例构建 |
343
- | `pnpm verify` | 类型、Lint、构建、覆盖率、文档与打包消费端校验 |
385
+ | `pnpm verify` | 类型、Lint、复杂度、构建、覆盖率、文档与打包消费端校验 |
386
+ | `pnpm check:quality` | 生产 TS / Vue 函数圈复杂度上限 20,输出可复核统计 |
344
387
  | `pnpm check:consumer` | npm 产物在隔离目录的 ESM / CJS 运行与类型验证 |
345
388
  | `pnpm test:e2e` | Playwright 浏览器端到端验证 |
346
389
  | `pnpm --filter @agile-team/example-minimal dev` | 启动本地报表示例 |
@@ -360,6 +403,7 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
360
403
  | 本地报表 | [最小示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/minimal):出库单、工艺卡、多页与多模板预览 |
361
404
  | 远程组件 | [模块联邦示例](https://github.com/ChenyCHENYU/MachReport/tree/main/examples/fed-host) · [部署包](https://github.com/ChenyCHENYU/MachReport/tree/main/packages/federation) |
362
405
  | 排版与字体 | [字体测量与校准](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/font-calibration.md) |
406
+ | 工程质量与还原 | [质量与还原说明](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/QUALITY.md):复杂度、宿主样式隔离、输出支持矩阵 |
363
407
  | 版本记录 | [Changelog](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/CHANGELOG.md) |
364
408
  | 工程协作 | [AGENTS.md](https://github.com/ChenyCHENYU/MachReport/blob/main/AGENTS.md) |
365
409
  | 产品演进 | [项目评审与优化优先级](https://github.com/ChenyCHENYU/MachReport/blob/main/docs/PROJECT_REVIEW.md) |
@@ -367,7 +411,7 @@ CI 使用同一套校验命令,并在构建后检查实际发布产物。协
367
411
 
368
412
  ## 版本与授权
369
413
 
370
- 当前源码版本为 `2.2.0`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
414
+ 当前源码版本为 `2.3.1`,以 [`packages/mach-report/package.json`](https://github.com/ChenyCHENYU/MachReport/blob/main/packages/mach-report/package.json) 为准;npm 已发布版本由顶部 npm 标识展示。
371
415
 
372
416
  Copyright © 2026 ChenyCHENYU (Agile Team). All rights reserved.
373
417
 
@@ -0,0 +1,6 @@
1
+ "use strict";var Wt=Object.create;var et=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var At=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,qt=Object.prototype.hasOwnProperty;var jt=(t,n,a,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of At(n))!qt.call(t,r)&&r!==a&&et(t,r,{get:()=>n[r],enumerable:!(o=Lt(n,r))||o.enumerable});return t};var tt=(t,n,a)=>(a=t!=null?Wt(Ht(t)):{},jt(n||!t||!t.__esModule?et(a,"default",{value:t,enumerable:!0}):a,t));const e=require("vue"),se=require("@agile-team/mach-report"),lt=require("./page-window-index-DEjnM6IB.cjs"),st=require("./render-plan-CfJ3wf1l.cjs"),ie=require("./plugin-2lqgTX26.cjs");function He(t){return t==null?[]:Array.isArray(t)?t.map(String).filter(n=>n!==""):String(t).split(",").map(n=>n.trim()).filter(n=>n!=="")}function Ut(t){return He(t).join(",")}class Pe extends Error{constructor(n){super(n),this.name="PlanLoadError"}}function Kt(t={}){const{baseUrl:n="",headers:a,credentials:o,timeoutMs:r=3e4}=t,l=n.replace(/\/+$/,"");return async({url:i,method:u,params:m,signal:v})=>{let f=`${l}${i}`;if(m&&Object.keys(m).length>0){const y=f.indexOf("#"),S=y>=0?f.slice(y):"",E=y>=0?f.slice(0,y):f,B=E.indexOf("?"),$=B>=0?E.slice(0,B):E,P=new URLSearchParams(B>=0?E.slice(B+1):"");for(const[N,W]of Object.entries(m))P.set(N,W);f=`${$}?${P}${S}`}const p=(y,S)=>{const E=new Pe(y);return Object.defineProperty(E,"cause",{value:S,configurable:!0,writable:!0}),E};if(v?.aborted)throw p(`请求已取消: ${i}`,v.reason);const h=new AbortController;let g;const F=()=>{h.signal.aborted||(g="external",h.abort(v?.reason))};v?.addEventListener("abort",F,{once:!0});const M=setTimeout(()=>{h.signal.aborted||(g="timeout",h.abort())},r);try{const y=await fetch(f,{method:u.toUpperCase(),headers:{Accept:"application/json",...a},credentials:o,signal:h.signal});if(!y.ok)throw new Pe(`HTTP ${y.status} ${i}`);return await y.json()}catch(y){throw g==="timeout"?p(`请求超时(${r}ms): ${i}`,y):g==="external"?p(`请求已取消: ${i}`,y):y instanceof Pe?y:p(`请求失败(${i}): ${y instanceof Error?y.message:String(y)}`,y)}finally{clearTimeout(M),v?.removeEventListener("abort",F)}}}function it(t,n,a={}){const o=a.pxPerMm??3.7795275590551185,r=e.computed(()=>Math.max(0,e.unref(a.gapPx)??18)),l=e.ref(0),i=e.ref(800),u=e.computed(()=>{const y=t.value?.pages??[];return lt.createPageWindowIndex(y.map(S=>S.pageHeightMm*o),r.value)}),m=e.computed(()=>{let y=0;for(const S of t.value?.pages??[])y=Math.max(y,S.pageWidthMm*o);return{w:y,h:u.value.totalHeightPx}}),v=e.computed(()=>u.value.window(i.value/n.value,l.value/n.value,e.unref(a.overscan)??1)),f=e.computed(()=>{const y=t.value;if(!y)return[];const{start:S,end:E}=v.value;return y.pages.slice(S,E+1).map((B,$)=>({page:B,index:S+$}))});let p=0,h=!1;function g(y){y&&(l.value=y.scrollTop,i.value=y.clientHeight||800)}function F(y,S){return E=>{p||h||(p=requestAnimationFrame(()=>{if(p=0,h||(g(E),S.value<=0))return;const B=Math.max(0,E.scrollTop+32)/n.value;y.value=Math.min(S.value,u.value.pageAt(B)+1)}))}}function M(){h=!0,p&&cancelAnimationFrame(p),p=0}return e.onScopeDispose(M),{contentSize:m,windowRange:v,visiblePages:f,makeScrollHandler:F,refreshViewport:g,pageOffsetPx:y=>u.value.offsetAt(y),destroy:M}}function ct(t){const n=e.ref(1),a=e.ref("fit");let o=0;function r(){o&&cancelAnimationFrame(o),o=0}function l(){r(),o=requestAnimationFrame(()=>{if(o=0,a.value!=="fit")return;const u=t();!u?.viewport||u.viewport.clientWidth<=48||!Number.isFinite(u.pageWidthPx)||(n.value=Math.min(1,(u.viewport.clientWidth-48)/Math.max(1,u.pageWidthPx)))})}function i(u){if(u==="fit")a.value="fit",l();else{if(!Number.isFinite(u))return;r(),a.value="raw",n.value=Math.min(3,Math.max(.3,u/100))}}return e.getCurrentScope()&&e.onScopeDispose(r),{zoom:n,zoomMode:a,applyFitZoom:l,setZoom:i}}const $e=8;function Se(){return new Promise(t=>setTimeout(t,0))}function ke(t){return`p${t.pageWidthMm}x${t.pageHeightMm}`.replace(/[.+]/g,"_")}function qe(t){const n=new Map;return t.pages.forEach(r=>{n.has(ke(r))||n.set(ke(r),r)}),`<!doctype html><html><head><meta charset="utf-8"><style>${`.mr-page{margin:0 auto;page-break-after:always;}
2
+ .mr-page tr{break-inside:avoid;page-break-inside:avoid;}
3
+ .mr-comp{break-inside:avoid;page-break-inside:avoid;}
4
+ ${[...n.values()].map(r=>`@page ${ke(r)}{size:${r.pageWidthMm}mm ${r.pageHeightMm}mm;margin:0;}`).join(`
5
+ `)}
6
+ body{margin:0;background:#fff;}`}</style></head><body>`}function je(t){const n=se.renderPage(t,96,{},document);return n.style.page=ke(t),n.outerHTML}function Ue(t){return{head:qe(t),pageChunks:t.pages.map(je)}}async function Gt(t,n={}){const a={schemaVersion:"mach-report-batch-print",pages:t.flatMap(i=>i.pages)};if(a.pages.length===0)return;const o=qe(a),r=document.createElement("iframe");r.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(r);let l=!1;try{const i=r.contentDocument;i.open(),i.write(o);for(let u=0;u<a.pages.length;u++)i.write(je(a.pages[u])),u%$e===$e-1&&(n.onProgress?.(u+1,a.pages.length),await Se());i.write("</body></html>"),i.close(),await Se(),n.onProgress?.(a.pages.length,a.pages.length),l=!0,r.contentWindow?.focus(),r.contentWindow?.print()}catch(i){n.onError?.(i instanceof Error?`批量打印失败: ${i.message}`:"批量打印失败")}finally{l?setTimeout(()=>r.remove(),6e4):r.remove()}}function ut(t){const{head:n,pageChunks:a}=Ue(t);return{html:`${`<!doctype html><html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="utf-8"><!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:Zoom>100</w:Zoom></w:WordDocument></xml><![endif]-->${n.replace(/^<!doctype html><html><head>/,"")}`}${a.join("")}</body></html>`,filename:"mach-report.doc"}}function dt(t,n){let a=null,o=!1,r=!1,l=0;const i=new Map,u=new Map;let m=null,v=null,f=null,p=null,h=null;function g(s,d){return!r&&t.value===s&&l===d}function F(){if(r)return;const s=[...i.values()].reverse().find(d=>g(d.plan,d.epoch))?.format??null;s!==m&&(m=s,n.onBusy?.(s))}function M(s,d,x){const k={};return i.set(k,{plan:s,epoch:d,format:x}),F(),k}function y(s){i.delete(s),F()}function S(){for(const[s,d]of u)g(d.plan,d.epoch)||(s.close(),u.delete(s))}const E=e.watch(t,()=>{l++,B(),F(),S()},{flush:"sync"});function B(){a?.remove(),a=null}function $(){r=!0,l++,E(),B(),S(),i.clear(),n.onPrinting?.(!1)}function P(s,d){const x=URL.createObjectURL(s);setTimeout(()=>URL.revokeObjectURL(x),1e4);const k=document.createElement("a");k.href=x,k.download=d,k.click()}async function N(){if(o)return;const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;o=!0,n.onPrinting?.(!0),B();const x=qe(s);a=document.createElement("iframe"),a.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;",document.body.appendChild(a);const k=a;try{const C=k.contentDocument;C.open(),C.write(x);for(let O=0;O<s.pages.length;O++)if(C.write(je(s.pages[O])),O%$e===$e-1&&await Se(),k!==a)return;if(C.write("</body></html>"),C.close(),await Se(),!g(s,d)||k!==a)return;k.contentWindow?.focus(),k.contentWindow?.print()}catch{k===a&&B(),g(s,d)&&n.onError("调用打印失败,请改用导出 PDF","print")}finally{o=!1,r||n.onPrinting?.(!1)}}function W(s,d){if(v?.plan===s&&v.epoch===d)return v.promise;const x=Promise.resolve().then(()=>{if(!g(s,d))throw new Error("报表已切换或卸载");return n.getPdfExporter()(s,k=>{g(s,d)&&n.onWarning?.(k)})}).finally(()=>{v?.promise===x&&(v=null)});return v={plan:s,epoch:d,promise:x},x}async function z(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(f?.plan===s&&f.epoch===d)return f.promise;const x=M(s,d,"PDF"),k=(async()=>{try{const C=await W(s,d);if(!g(s,d))return;P(new Blob([C],{type:"application/pdf"}),"mach-report.pdf")}catch(C){g(s,d)&&n.onError(C instanceof Error?`PDF 导出失败: ${C.message}`:"PDF 导出失败","pdf")}finally{y(x),f?.token===x&&(f=null)}})();return f={plan:s,epoch:d,promise:k,token:x},k}async function L(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(p?.plan===s&&p.epoch===d)return p.promise;const x={...n.getXlsxOptions?.()},k=M(s,d,"Excel"),C=(async()=>{try{const{renderPlanToXlsx:O}=await import("@agile-team/mach-report/xlsx");if(!g(s,d))return;const{buffer:H,warnings:q}=await O(s,x);if(!g(s,d)||(q.length>0&&n.onWarning?.(`Excel 导出有 ${q.length} 条提示:${q.slice(0,2).join(";")}`),!g(s,d)))return;P(new Blob([H],{type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}),"mach-report.xlsx")}catch(O){g(s,d)&&n.onError(O instanceof Error?`Excel 导出失败: ${O.message}`:"Excel 导出失败","export")}finally{y(k),p?.token===k&&(p=null)}})();return p={plan:s,epoch:d,promise:C,token:k},C}async function R(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l;if(h?.plan===s&&h.epoch===d)return h.promise;const x=M(s,d,"图片"),k=(async()=>{try{const{blobs:C}=await se.renderPlanToImages(s,{dpr:Math.min(2,typeof devicePixelRatio=="number"?devicePixelRatio:1)});if(!g(s,d))return;C.forEach((O,H)=>{P(O,C.length>1?`mach-report-page-${H+1}.png`:"mach-report.png")})}catch(C){g(s,d)&&n.onError(C instanceof Error?`图片导出失败: ${C.message}`:"图片导出失败","export")}finally{y(x),h?.token===x&&(h=null)}})();return h={plan:s,epoch:d,promise:k,token:x},k}function Z(){const s=t.value;if(!(r||!s||s.pages.length===0))try{const{html:d,filename:x}=ut(s);P(new Blob([d],{type:"application/msword;charset=utf-8"}),x)}catch(d){n.onError(d instanceof Error?`Word 导出失败: ${d.message}`:"Word 导出失败","export")}}async function K(s){const d=t.value;if(!(r||!d||d.pages.length===0)){if(s==="pdf"){await z();return}if(s==="xlsx"||s==="excel"){await L();return}if(s==="png"||s==="image"){await R();return}if(s==="word"||s==="doc"){Z();return}if(s!=="html"){n.onError(`不支持的导出格式:${s}`,"export");return}try{const{head:x,pageChunks:k}=Ue(d),C=`${x}${k.join("")}</body></html>`;P(new Blob([C],{type:"text/html;charset=utf-8"}),"mach-report.html")}catch(x){n.onError(x instanceof Error?`HTML 导出失败: ${x.message}`:"HTML 导出失败","export")}}}function oe(){const s=t.value;if(r||!s||s.pages.length===0)return;const d=l,x=window.open("","_blank");if(!x){n.onError("浏览器拦截了弹窗,请允许弹窗后重试","pdf");return}u.set(x,{plan:s,epoch:d});const k=M(s,d,"PDF");W(s,d).then(C=>{if(!g(s,d)||x.closed){u.delete(x)&&x.close();return}const O=URL.createObjectURL(new Blob([C],{type:"application/pdf"}));setTimeout(()=>URL.revokeObjectURL(O),6e4);const H=x.document;H.title="PDF 预览",H.documentElement.style.height="100%",H.body.style.cssText="margin:0;height:100%;";const q=H.createElement("iframe");q.title="PDF 预览",q.style.cssText="display:block;width:100%;height:100%;border:0;",q.src=O,H.body.replaceChildren(q),u.delete(x)}).catch(C=>{x.close(),u.delete(x),g(s,d)&&n.onError(C instanceof Error?`PDF 预览失败: ${C.message}`:"PDF 预览失败","pdf")}).finally(()=>y(k))}return{print:N,exportAs:K,exportImages:R,exportWord:Z,openPdfWindow:oe,releasePrintFrame:B,dispose:$}}const ft="mrp-hit";function Yt(t){t.querySelectorAll(`mark.${ft}`).forEach(a=>{const o=a.parentNode;if(o){for(;a.firstChild;)o.insertBefore(a.firstChild,a);a.remove(),o.normalize()}})}function Zt(t,n){const a=n.trim();if(!a)return 0;const o=a.toLowerCase(),r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(u){const m=u.parentElement;return!m||m.closest("mark")||/^(SCRIPT|STYLE)$/.test(m.tagName)?NodeFilter.FILTER_REJECT:(u.nodeValue??"").toLowerCase().includes(o)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),l=[];for(let u=r.nextNode();u;u=r.nextNode())l.push(u);let i=0;for(const u of l){const m=u.nodeValue??"",v=m.toLowerCase(),f=u.parentElement;if(!f)continue;const p=document.createDocumentFragment();let h=0,g=v.indexOf(o);for(;g>=0;){g>h&&p.appendChild(document.createTextNode(m.slice(h,g)));const F=document.createElement("mark");F.className=ft,F.textContent=m.slice(g,g+a.length),p.appendChild(F),i++,h=g+a.length,g=v.indexOf(o,h)}h<m.length&&p.appendChild(document.createTextNode(m.slice(h))),f.replaceChild(p,u)}return i}const Jt=new Set(["line","rect","ellipse","chart"]);function*Xt(t){for(const n of t.cells??[])for(const a of n??[])yield a?.text??"",yield*a?.children??[]}function*Qt(t){if(st.isRichText(t))for(const n of t.richParagraphs)for(const a of n.segments??[])yield(a.kind==="field"?a.field:a.text)??"";else t.lines?.length?yield*t.lines:yield t.text??""}function*_t(t){const n=[t.values()];for(;n.length>0;){const a=n[n.length-1].next();if(a.done){n.pop();continue}const o=a.value;if(typeof o=="string"){yield o;continue}yield"",!st.isImageBackedComponent(o)&&(o.kind==="text"?n.push(Qt(o)):o.grid?n.push(Xt(o.grid)):Jt.has(o.kind)||(yield o.fallbackText??""))}}function*en(t){for(let n=0;n<t.pages.length;n++){for(const a of _t(t.pages[n].components))yield{text:a,pageIndex:n};yield{text:"",pageIndex:n}}}function tn(t,n){const a=t.toLowerCase();let o=0;for(let r=a.indexOf(n);r>=0;r=a.indexOf(n,r+n.length))o++;return o}function nn(t){const{plan:n,gotoPage:a,highlight:o,clearHighlights:r}=t,l=e.ref(!1),i=e.ref(""),u=e.ref(0),m=e.ref(0),v=e.ref(!1);let f=[];const p=e.computed(()=>{if(m.value===0)return null;const $=u.value;let P=0,N=f.length-1;for(;P<N;){const z=P+N>>>1;f[z].cumulative<=$?P=z+1:N=z}const W=f[P];return W?{pageIndex:W.pageIndex,occurrence:$-(f[P-1]?.cumulative??0)}:null});let h=null,g=null,F=0;function M(){F++,h&&clearTimeout(h),g&&clearTimeout(g),h=g=null,v.value=!1}function y($){i.value=$,u.value=0,m.value=0,f=[],v.value=!1;const P=$.trim().toLowerCase(),N=n.value;if(!P||!N)return;v.value=!0;const W=F,z=en(N),L=[];let R=0;function Z(){if(g=null,W!==F||N!==n.value)return;const K=performance.now();let oe=0;for(;oe<5e3&&performance.now()-K<4;){const s=z.next();if(s.done){f=L,m.value=R,v.value=!1,f[0]&&a(f[0].pageIndex+1);return}const d=tn(s.value.text,P);if(d>0){R+=d;const x=L[L.length-1];x?.pageIndex===s.value.pageIndex?x.cumulative=R:L.push({pageIndex:s.value.pageIndex,cumulative:R})}oe++}g=setTimeout(Z,0)}Z()}function S($){if(M(),i.value=$,u.value=m.value=0,f=[],!$.trim()){y("");return}v.value=!0,h=setTimeout(()=>{h=null,y($)},Math.max(0,e.unref(t.debounceMs)??200))}function E($){const P=m.value;if(P===0||v.value)return;u.value=(u.value+$+P)%P;const N=p.value;N&&a(N.pageIndex+1)}function B(){M(),i.value="",u.value=m.value=0,f=[]}return e.watch(n,B,{flush:"sync"}),e.onScopeDispose(B),{visible:l,query:i,matchIndex:u,matchCount:m,activeMatch:p,searching:v,toggle:()=>{l.value=!l.value},onInput:S,onNav:E,apply:$=>{i.value.trim()&&o($,i.value.trim())},clear:$=>{r($)},reset:B}}function rn(t,n){const a=e.computed(()=>{if(t.value)return!0;if(typeof location>"u")return!1;try{return new URLSearchParams(location.search).get("mrp-debug")==="1"}catch{return!1}}),o=e.computed(()=>!a.value||!n.plan.value?0:Math.round(JSON.stringify(n.plan.value).length/1024)),r=e.computed(()=>!a.value||!n.plan.value?null:{pages:n.pageCount.value,window:`${n.windowRange.value.start}-${n.windowRange.value.end}`,zoom:`${Math.round(n.zoom.value*100)}%`,loadMs:`${n.loadMs.value}ms`,planKB:o.value});return{enabled:a,debugStats:r}}function on(t,n){const{thumbsRoot:a,visible:o,renderThumbCanvas:r}=n,l=e.ref(0),i=e.ref(800),u=e.computed(()=>(t.value?.pages??[]).map(E=>Math.round(E.pageHeightMm/E.pageWidthMm*116))),m=e.computed(()=>lt.createPageWindowIndex(u.value.map(E=>E+20),8)),v=e.computed(()=>m.value.window(i.value,l.value,1)),f=e.computed(()=>{if(!o.value)return[];const{start:E,end:B}=v.value;return u.value.slice(E,B+1).map(($,P)=>({index:E+P,height:$}))});let p=0,h=0,g=!1;function F(){const E=a.value;E&&(l.value=E.scrollTop,i.value=E.clientHeight||800)}function M(){g||h||(h=requestAnimationFrame(()=>{h=0,F()}))}function y(){if(f.value,p&&cancelAnimationFrame(p),p=0,g||!o.value||!t.value||!a.value)return;F();const E=f.value,B=t.value,$=a.value;let P=0;function N(){if(p=0,!(g||!o.value||t.value!==B||a.value!==$)){for(let W=0;P<E.length&&W<2;W++,P++){const z=E[P].index,L=$.querySelector(`[data-thumb="${z+1}"]`);if(!L||L.childElementCount>0)continue;const R=r(z);R&&(R.style.width="100%",R.style.height="100%",R.style.display="block",L.appendChild(R))}P<E.length&&(p=requestAnimationFrame(N))}}p=requestAnimationFrame(N)}function S(){g=!0,p&&cancelAnimationFrame(p),h&&cancelAnimationFrame(h),p=h=0}return e.onScopeDispose(S),{schedule:y,destroy:S,onScroll:M,windowRange:v,visibleThumbs:f}}function an(){const t=e.shallowRef(0);return{loadMs:t,start(){return typeof performance<"u"?performance.now():0},end(n){t.value=n?Math.round(performance.now()-n):0}}}const ln={class:"mrp-toolbar"},sn={class:"mrp-title"},cn=["disabled"],un={class:"mrp-pageinfo"},dn=["disabled"],fn={key:1,class:"mrp-search"},pn=["placeholder","value"],mn={key:0,class:"mrp-search-count",role:"status"},vn=["disabled"],gn=["disabled"],hn=e.defineComponent({__name:"ReportToolbar",props:{pageCount:{},currentPage:{},zoomMode:{},zoom:{},showExport:{type:Boolean},showPrint:{type:Boolean},showPdfWindow:{type:Boolean},messages:{},search:{},thumbsVisible:{type:Boolean}},emits:["goto","zoom","export","print","pdf-window","search-input","search-nav","search-toggle","thumbs-toggle"],setup(t){const n=t,a=e.ref(null);e.watch(()=>n.search.visible,r=>{r&&e.nextTick(()=>a.value?.focus())});function o(r,l,i){return r.replace("{cur}",String(l)).replace("{total}",String(i))}return(r,l)=>(e.openBlock(),e.createElementBlock("div",ln,[e.createElementVNode("span",sn,e.toDisplayString(t.messages.title),1),t.pageCount>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage<=1,onClick:l[0]||(l[0]=i=>r.$emit("goto",t.currentPage-1))},e.toDisplayString(t.messages.prevPage),9,cn),e.createElementVNode("span",un,e.toDisplayString(o(t.messages.pageInfo,t.currentPage,t.pageCount)),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.currentPage>=t.pageCount,onClick:l[1]||(l[1]=i=>r.$emit("goto",t.currentPage+1))},e.toDisplayString(t.messages.nextPage),9,dn)],64)):e.createCommentVNode("",!0),l[17]||(l[17]=e.createElementVNode("span",{class:"mrp-spacer"},null,-1)),t.search.visible?(e.openBlock(),e.createElementBlock("div",fn,[e.createElementVNode("input",{ref_key:"searchInputRef",ref:a,class:"mrp-search-input",type:"text",placeholder:t.messages.searchPlaceholder,value:t.search.query,onInput:l[2]||(l[2]=i=>r.$emit("search-input",i.target.value))},null,40,pn),t.search.query?(e.openBlock(),e.createElementBlock("span",mn,e.toDisplayString(t.search.searching?t.messages.searching??"搜索中…":o(t.messages.matchInfo,t.search.matchCount>0?t.search.matchIndex+1:0,t.search.matchCount)),1)):e.createCommentVNode("",!0),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:l[3]||(l[3]=i=>r.$emit("search-nav",-1))},e.toDisplayString(t.messages.prevMatch),9,vn),e.createElementVNode("button",{class:"mrp-nav",type:"button",disabled:t.search.matchCount===0,onClick:l[4]||(l[4]=i=>r.$emit("search-nav",1))},e.toDisplayString(t.messages.nextMatch),9,gn)])):e.createCommentVNode("",!0),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.search.visible}]),type:"button",title:"Ctrl+F",onClick:l[5]||(l[5]=i=>r.$emit("search-toggle"))}," 🔍 ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.thumbsVisible}]),type:"button",onClick:l[6]||(l[6]=i=>r.$emit("thumbs-toggle"))}," ▦ "+e.toDisplayString(t.messages.thumbnails),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="fit"}]),type:"button",onClick:l[7]||(l[7]=i=>r.$emit("zoom","fit"))},e.toDisplayString(t.messages.fitWidth),3),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===100}]),type:"button",onClick:l[8]||(l[8]=i=>r.$emit("zoom",100))}," 100% ",2),e.createElementVNode("button",{class:e.normalizeClass(["mrp-nav",{"mrp-active":t.zoomMode==="raw"&&Math.round(t.zoom*100)===150}]),type:"button",onClick:l[9]||(l[9]=i=>r.$emit("zoom",150))}," 150% ",2),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:2,class:"mrp-nav",type:"button",onClick:l[10]||(l[10]=i=>r.$emit("export","html"))},e.toDisplayString(t.messages.exportHtml),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:3,class:"mrp-nav",type:"button",onClick:l[11]||(l[11]=i=>r.$emit("export","pdf"))},e.toDisplayString(t.messages.exportPdf),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:4,class:"mrp-nav",type:"button",onClick:l[12]||(l[12]=i=>r.$emit("export","xlsx"))},e.toDisplayString(t.messages.exportExcel),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:5,class:"mrp-nav",type:"button",onClick:l[13]||(l[13]=i=>r.$emit("export","png"))},e.toDisplayString(t.messages.exportImage),1)):e.createCommentVNode("",!0),t.showExport?(e.openBlock(),e.createElementBlock("button",{key:6,class:"mrp-nav",type:"button",onClick:l[14]||(l[14]=i=>r.$emit("export","word"))},e.toDisplayString(t.messages.exportWord),1)):e.createCommentVNode("",!0),t.showPrint?(e.openBlock(),e.createElementBlock("button",{key:7,class:"mrp-nav",type:"button",onClick:l[15]||(l[15]=i=>r.$emit("print"))},e.toDisplayString(t.messages.print),1)):e.createCommentVNode("",!0),t.showPdfWindow?(e.openBlock(),e.createElementBlock("button",{key:8,class:"mrp-nav",type:"button",onClick:l[16]||(l[16]=i=>r.$emit("pdf-window"))},e.toDisplayString(t.messages.pdfWindow),1)):e.createCommentVNode("",!0)]))}}),Ke=(t,n)=>{const a=t.__vccOpts||t;for(const[o,r]of n)a[o]=r;return a},pt=Ke(hn,[["__scopeId","data-v-601f8fa8"]]),wn={class:"mrp-params"},yn={class:"mrp-params-title"},bn={class:"mrp-params-grid"},xn={class:"mrp-param-label"},En={key:0,class:"mrp-param-star"},Pn=["value","onChange"],kn={value:"",disabled:"",hidden:""},Cn=["value"],$n=["type","placeholder","value","onInput"],Sn={class:"mrp-params-actions"},Bn=e.defineComponent({__name:"ReportParamPanel",props:{defs:{},modelValue:{},messages:{},attempted:{type:Boolean}},emits:["update:modelValue","query","reset"],setup(t,{emit:n}){const a=t,o=n,r=e.ref({...a.modelValue});e.watch(()=>a.modelValue,m=>{r.value={...m}});const l=e.computed(()=>a.defs.map(m=>({def:m,label:m.label??m.field,value:r.value[m.field]??""})));function i(m,v){r.value={...r.value,[m]:v},o("update:modelValue",{...r.value})}function u(m){const v=a.defs.find(f=>f.field===m);return a.attempted&&v?.required===!0&&!(r.value[m]??"").trim()}return(m,v)=>(e.openBlock(),e.createElementBlock("div",wn,[e.createElementVNode("span",yn,e.toDisplayString(t.messages.paramsTitle),1),e.createElementVNode("div",bn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,f=>(e.openBlock(),e.createElementBlock("label",{key:f.def.field,class:e.normalizeClass(["mrp-param",{"mrp-param-missing":u(f.def.field)}])},[e.createElementVNode("span",xn,[e.createTextVNode(e.toDisplayString(f.label),1),f.def.required?(e.openBlock(),e.createElementBlock("i",En,"*")):e.createCommentVNode("",!0)]),(f.def.type??"text")==="select"?(e.openBlock(),e.createElementBlock("select",{key:0,class:"mrp-param-input",value:f.value,onChange:p=>i(f.def.field,p.target.value),onKeydown:v[0]||(v[0]=e.withKeys(p=>m.$emit("query"),["enter"]))},[e.createElementVNode("option",kn,e.toDisplayString(f.def.placeholder??`请选择${f.label}`),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.def.options??[],p=>(e.openBlock(),e.createElementBlock("option",{key:p.value,value:p.value},e.toDisplayString(p.label),9,Cn))),128))],40,Pn)):(e.openBlock(),e.createElementBlock("input",{key:1,class:"mrp-param-input",type:f.def.type==="number"?"number":f.def.type==="date"?"date":"text",placeholder:f.def.placeholder??`请输入${f.label}`,value:f.value,onInput:p=>i(f.def.field,p.target.value),onKeydown:v[1]||(v[1]=e.withKeys(p=>m.$emit("query"),["enter"]))},null,40,$n))],2))),128))]),e.createElementVNode("div",Sn,[e.createElementVNode("button",{class:"mrp-nav mrp-param-query",type:"button",onClick:v[2]||(v[2]=f=>m.$emit("query"))},e.toDisplayString(t.messages.query),1),e.createElementVNode("button",{class:"mrp-nav",type:"button",onClick:v[3]||(v[3]=f=>m.$emit("reset"))},e.toDisplayString(t.messages.reset),1)])]))}}),mt=Ke(Bn,[["__scopeId","data-v-aafce92d"]]),vt={title:"报表预览",prevPage:"‹ 上一页",nextPage:"下一页 ›",pageInfo:"{cur} / {total}",fitWidth:"适宽",exportHtml:"导出 HTML",exportPdf:"导出 PDF",exportExcel:"导出 Excel",exportImage:"导出图片",exportWord:"导出 Word",exporting:"正在生成 {format}…",print:"打印",pdfWindow:"PDF 窗口",loading:"报表渲染中…",empty:"暂无预览数据",errorPrefix:"",retry:"重试",pdfFontUnavailable:"PDF 字体尚未就绪,请联系管理员检查字体配置;预览及其它导出仍可使用。",searchPlaceholder:"搜索报表内容",matchInfo:"{cur}/{total}",prevMatch:"‹",nextMatch:"›",thumbnails:"缩略图",paramsTitle:"查询条件",query:"查 询",reset:"重 置",paramRequired:"请填写{label}",searching:"搜索中…"},gt={shellBg:"#525659",shellFg:"#e8e8e8",toolbarBg:"#323639",toolbarBorder:"#22252a",toolbarFg:"#e8e8e8",btnFg:"#cfcfcf",btnBorder:"#4a4d52",btnHoverBg:"#414549",btnHoverFg:"#ffffff",btnActiveBg:"#2d5fb8"};function ht(t={}){return{...t,defaults:t.defaults??{},presets:t.presets??{}}}function Rn(t){return t}const ne={showExport:!0,showPrint:!0,showPdfWindow:!0,showParams:!0,gapPx:18,pdfFontUrl:"/simhei.ttf",logger:console},Mn={warn:()=>{},info:()=>{}};function Ce(t,n){return{...t,...n,theme:{...t?.theme,...n?.theme},messages:{...t?.messages,...n?.messages},preview:{...t?.preview,...n?.preview},xlsx:{...t?.xlsx,...n?.xlsx}}}function wt(t,n){const a=n?t?.presets?.[n]:t?.defaultPreset?t?.presets?.[t.defaultPreset]:void 0,o=Ce(t?.defaults,a);return{showExport:o.showExport??ne.showExport,showPrint:o.showPrint??ne.showPrint,showPdfWindow:o.showPdfWindow??ne.showPdfWindow,showParams:o.showParams??ne.showParams,gapPx:o.gapPx??ne.gapPx,pdfFontUrl:o.pdfFontUrl??ne.pdfFontUrl,theme:{...gt,...o.theme},messages:{...vt,...o.messages},logger:o.logger??ne.logger,preview:{overscanPages:nt(o.preview?.overscanPages,1,10,!0),searchDebounceMs:nt(o.preview?.searchDebounceMs,200,2e3)},xlsx:{...o.xlsx}}}function nt(t,n,a,o=!1){if(t==null||!Number.isFinite(t))return n;const r=Math.max(0,Math.min(a,t));return o?Math.floor(r):r}function yt(t){const n={};return t.shellBg!=null&&(n["--mrp-shell-bg"]=t.shellBg),t.shellFg!=null&&(n["--mrp-shell-fg"]=t.shellFg),t.toolbarBg!=null&&(n["--mrp-toolbar-bg"]=t.toolbarBg),t.toolbarBorder!=null&&(n["--mrp-toolbar-border"]=t.toolbarBorder),t.toolbarFg!=null&&(n["--mrp-toolbar-fg"]=t.toolbarFg),t.btnFg!=null&&(n["--mrp-btn-fg"]=t.btnFg),t.btnBorder!=null&&(n["--mrp-btn-border"]=t.btnBorder),t.btnHoverBg!=null&&(n["--mrp-btn-hover-bg"]=t.btnHoverBg),t.btnHoverFg!=null&&(n["--mrp-btn-hover-fg"]=t.btnHoverFg),t.btnActiveBg!=null&&(n["--mrp-btn-active-bg"]=t.btnActiveBg),n}function Fn(t){const n=e.inject(ie.MACH_REPORT_CONFIG_KEY,null),a=e.computed(()=>{const o=n?.value??null,r="defaults"in t||"presets"in t||"defaultPreset"in t?ht(t):{defaults:t,presets:{}};if(!o)return r;const l={...o.presets,...r.presets};for(const i of Object.keys(l))l[i]=Ce(Ce(o.presets[i],r.defaults),r.presets[i]);return{defaults:Ce(o.defaults,r.defaults),presets:l,defaultPreset:r.defaultPreset??o.defaultPreset}});e.provide(ie.MACH_REPORT_CONFIG_KEY,a)}function bt(){return e.inject(ie.MACH_REPORT_CONFIG_KEY,e.computed(()=>null))}const rt=new Map,le=new Map,Tn=15e3;function Ae(t,n){return Object.assign(new Error(t),{cause:n})}function me(t,n){return`PDF 字体 ${JSON.stringify(t)}:${n}。请部署支持报表文字的字体文件,并将 pdfFontUrl 配置为可访问的字体 URL;西文报表可设为空串`}function Be(t){if(t?.reason instanceof Error&&t.reason.name==="AbortError")return t.reason;const n=Ae("PDF 字体检查已取消",t?.reason);return n.name="AbortError",n}async function Dn(t,n){let a=!1;const o=setTimeout(()=>{a=!0,n.abort()},Tn);try{const r=await fetch(t,{method:"HEAD",signal:n.signal});if(n.signal.aborted)throw Be(n.signal);if(r.status===405||r.status===501||r.type==="opaque")return{status:"unverified",fontUrl:t,message:`PDF 字体 ${JSON.stringify(t)} 无法通过 HEAD 检查验证;仍可尝试导出,届时会加载并校验字体`};if(!r.ok){const i=new Error(`字体请求返回 HTTP ${r.status}`);return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}const l=r.headers.get("content-type")??"";if(/text\/html|application\/xhtml\+xml/i.test(l)){const i=new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}if(/^text\//i.test(l)||/(?:\/|\+)json(?:\s*;|$)/i.test(l)){const i=new Error(`字体 URL 返回 ${l} 文本响应,不是字体文件`);return{status:"error",fontUrl:t,message:me(t,i.message),cause:i}}return{status:"available",fontUrl:t,message:"PDF 字体资源可达;文字覆盖范围将在实际导出时校验"}}catch(r){if(n.signal.aborted&&!a)throw Be(n.signal);return{status:"error",fontUrl:t,message:me(t,a?"字体检查超时,请检查网络或字体服务":"字体检查失败,请检查网络、字体服务或跨域访问配置"),cause:r}}finally{clearTimeout(o)}}function Nn(t,n){if(n?.aborted)return Promise.reject(Be(n));if(!t)return Promise.resolve({status:"disabled",fontUrl:t,message:"已停用自定义 PDF 字体;内置字体用于西文,其他文字会在导出时校验"});const a=rt.get(t);if(a)return Promise.resolve(a);let o=le.get(t);if(!o){const l=new AbortController;o={controller:l,promise:Dn(t,l),subscribers:0};const i=o;le.set(t,i),i.promise=i.promise.then(u=>(!l.signal.aborted&&u.status==="available"&&rt.set(t,u),u)).finally(()=>{le.get(t)===i&&le.delete(t)})}const r=o;return r.subscribers++,new Promise((l,i)=>{let u=!1;const m=()=>u?!1:(u=!0,r.subscribers--,n?.removeEventListener("abort",v),!0),v=()=>{m()&&(r.subscribers===0&&(le.get(t)===r&&le.delete(t),r.controller.abort()),i(Be(n)))};n?.addEventListener("abort",v,{once:!0}),r.promise.then(f=>{m()&&l(f)},f=>{m()&&i(f)}),n?.aborted&&v()})}function xt(t={fontUrl:"/simhei.ttf"}){let n=null;const a=async(o,r)=>{n||(n=await import("@agile-team/mach-report/pdf"));let l=null;if(t.fontUrl)try{if(l=await n.loadFontWithCache(t.fontUrl,{strict:!0}),!l?.byteLength)throw new Error("字体文件为空或加载失败")}catch(p){const h=p instanceof Error?p.message:String(p);throw Ae(me(t.fontUrl,h),p)}let i;try{i=await n.renderPlanToPdf(o,l?{customFontBytes:l}:{})}catch(p){if(!l)throw p;const h=p instanceof Error?p.message:String(p);throw Ae(`PDF 生成失败:${h}。当前字体 URL 为 ${JSON.stringify(t.fontUrl)};请确认该文件是有效字体,或重新配置 pdfFontUrl`,p)}const{bytes:u,unsupportedTextCount:m,pageErrors:v,fidelityWarnings:f}=i;if(m>0)throw new Error(`PDF 中有 ${m} 行文字无法编码;请部署支持所用文字的字体并配置 pdfFontUrl`);if(v.length>0)throw new Error(`PDF 有 ${v.length} 页渲染失败:${v[0]}`);return f.length>0&&r?.(`PDF 有 ${f.length} 处版式降级:${f.slice(0,2).join(";")}`),u};return a.checkFont=o=>Nn(t.fontUrl,o),a}class re extends Error{constructor(n,a,o){super(a),this.name="MachReportError",this.code=n,this.cause=o}}function Et(t){return t instanceof re?{code:t.code,cause:t.cause}:{code:"render",cause:t}}const Vn={key:2,class:"mrp-export-notice mrp-export-warning",role:"status"},In={class:"mrp-main"},On={key:0,class:"mrp-state"},zn={key:1,class:"mrp-state mrp-error"},Wn={key:2,class:"mrp-state"},Ln=["data-page"],An=["onClick"],Hn=["data-thumb"],qn={class:"mrp-thumb-no"},jn={class:"mrp-overlay"},Un={key:3,class:"mrp-debug","aria-hidden":"true"},Ee=96/25.4,ot="mach-report:ui",at="mach-report:ui:wide",Kn=e.defineComponent({__name:"ReportPreview",props:{reportId:{type:[String,Array],default:null},params:{type:Object,default:()=>({})},height:{type:String,default:"100vh"},autoLoad:{type:Boolean,default:!0},showExport:{type:Boolean,default:void 0},showPrint:{type:Boolean,default:void 0},showPdfWindow:{type:Boolean,default:void 0},gapPx:{type:Number,default:void 0},messages:{type:Object,default:void 0},preset:{type:String,default:void 0},debug:{type:Boolean,default:!1},paramDefs:{type:Array,default:void 0},showParams:{type:Boolean,default:void 0},fetcher:{type:Function,default:null}},emits:["loaded","error","warning"],setup(t,{expose:n,emit:a}){e.useCssVars(c=>({v8eb72344:$.value+"px"}));const o=t,r=a,l=e.shallowRef(null),i=e.ref(!1),u=e.ref(""),m=e.shallowRef(null),v=e.ref(null),f=e.ref(!1),p=e.shallowRef(Object.freeze({status:"unchecked",fontUrl:""})),h=e.ref(null),g=e.ref(1),F=e.ref(null),M=e.ref(null),y=e.ref(null),S=e.ref(!1),E=an(),B=e.computed(()=>!!l.value?.pages.length&&l.value.pages.every(c=>c.layout==="wide")),$=e.computed(()=>Math.max(0,O.value));let P=ot;const N=e.inject(ie.MACH_REPORT_FETCHER_KEY,null),W=e.inject(ie.MACH_REPORT_PDF_EXPORTER_KEY,null),z=e.computed(()=>He(o.reportId)),L=e.computed(()=>o.fetcher??N),R=e.computed(()=>l.value?.pages.length??0),Z=e.computed(()=>Object.freeze({loading:i.value,hasPlan:R.value>0,pageCount:R.value,currentPage:g.value,exporting:v.value,printing:f.value,canExport:!i.value&&R.value>0&&v.value===null,canPrint:!i.value&&R.value>0&&!f.value,error:m.value,pdfFont:p.value}));function K(c,w,b){m.value=Object.freeze({message:c,code:w,cause:b}),r("error",c,{code:w,cause:b})}const oe=bt(),s=e.computed(()=>wt(oe.value,o.preset)),d=e.computed(()=>({...s.value.messages,...o.messages})),x=e.computed(()=>o.showExport??s.value.showExport),k=e.computed(()=>o.showPrint??s.value.showPrint),C=e.computed(()=>o.showPdfWindow??s.value.showPdfWindow),O=e.computed(()=>o.gapPx??(B.value?0:s.value.gapPx)),H=e.computed(()=>o.showParams??s.value.showParams);let q=null,Re=null;function Ge(){if(W)return W;const c=s.value.pdfFontUrl;return(!Re||q!==c)&&(q=c,Re=xt({fontUrl:c})),Re}let ve=0,ce=null,ge=null,J=!1;function Me(){ve++,ce?.abort(),ce=null}async function he(){if(J)throw new re("config","报表预览已卸载");Me();const c=ve,w=new AbortController;ce=w;const b=s.value.pdfFontUrl;p.value=Object.freeze({status:"checking",fontUrl:b});try{const V=Ge(),I=V.checkFont?await V.checkFont(w.signal):{status:"unverified",fontUrl:"",message:"自定义 PDF 导出器未提供字体预检查;字体由宿主确认"};return!J&&c===ve&&!w.signal.aborted&&(p.value=Object.freeze({...I})),I}catch(V){if(w.signal.aborted)throw V;const I={status:"error",fontUrl:b,message:V instanceof Error?V.message:"PDF 字体检查失败",cause:V};return!J&&c===ve&&(p.value=Object.freeze(I)),I}finally{ce===w&&(ce=null)}}function kt(){he().catch(()=>{})}e.watch([l,()=>s.value.pdfFontUrl,x,C],()=>{const c=p.value.fontUrl===s.value.pdfFontUrl;Me(),(!c||p.value.status==="checking")&&(p.value=Object.freeze({status:"unchecked",fontUrl:s.value.pdfFontUrl})),!J&&R.value>0&&(x.value||C.value)&&he().catch(()=>{})},{immediate:!0});const X=e.computed(()=>o.paramDefs??L.value?.getParamDefs?.(z.value)??[]),ee=e.ref({}),Fe=e.ref(!1);function ue(c){const w={};for(const b of c)w[b.field]=o.params[b.field]??b.defaultValue??"";ee.value=w,Fe.value=!1}ue(X.value),e.watch(X,c=>ue(c)),e.watch(z,()=>ue(X.value)),e.watch(()=>JSON.stringify(o.params),()=>ue(X.value));const Ct=e.computed(()=>{const c={...o.params};for(const[w,b]of Object.entries(ee.value))b===""?delete c[w]:c[w]=b;return c});function $t(){return X.value.filter(c=>c.required===!0&&!(ee.value[c.field]??"").trim())}function St(){Fe.value=!0;const c=$t();if(c.length>0){const w=c[0].label??c[0].field,b=d.value.paramRequired.replace("{label}",w);u.value=b,K(b,"param");return}te()}function Bt(){ue(X.value)}const Rt=e.computed(()=>({height:o.height,...yt(s.value.theme)})),{zoom:A,zoomMode:de,applyFitZoom:Ye,setZoom:fe}=ct(()=>({viewport:M.value,pageWidthPx:Te.contentSize.value.w||210*Ee})),Te=it(l,A,{pxPerMm:Ee,gapPx:O,overscan:e.computed(()=>s.value.preview.overscanPages)}),{contentSize:De,windowRange:pe,visiblePages:Ze,makeScrollHandler:Mt,refreshViewport:Ne}=Te,Ft=Mt(g,R);function Ve(c){fe(c*100)}function we(){Tt(),l.value=null,g.value=1,T.reset()}let Q=0,G=null;async function te(){if(J)return;const c=++Q;G?.abort(),G=null;const w=L.value;if(i.value=!1,m.value=null,z.value.length===0){u.value="缺少报表 ID",we(),K(u.value,"param");return}if(!w){u.value="未提供渲染数据源 fetcher",we(),K(u.value,"config");return}i.value=!0,u.value="",h.value=null,we();const b=E.start(),V=new AbortController;G=V;const I=new Set;function be(D){c!==Q||V.signal.aborted||I.has(D)||(I.add(D),s.value.logger.warn("[mach-report] 报表告警:",D),r("warning",D))}try{const D=await w({reportIds:z.value,params:{...Ct.value},signal:V.signal,onWarning:be});if(c!==Q)return;const j=se.validateRenderPlan(D);if(!j.ok){const xe=j.errors.slice(0,3).map(_e=>`${_e.path}: ${_e.message}`).join("; ");throw new re("validate",`渲染计划校验失败(${j.errors.length} 处): ${xe}`)}if(j.warnings.forEach(xe=>be(`${xe.path}: ${xe.message}`)),c!==Q||V.signal.aborted)return;l.value=D,g.value=1,E.end(b),M.value&&(M.value.scrollTop=0,M.value.scrollLeft=0);const _=B.value?at:ot;_!==P&&(P=_,Qe()),de.value==="fit"&&Ye(),r("loaded",D.pages.length)}catch(D){if(c!==Q)return;const j=D instanceof re?D:D instanceof se.ReportSourceError?new re(D.code,D.message,D.cause):new re("fetch",D instanceof Error?D.message:"预览加载失败",D);u.value=j.message;const _=Et(j);K(j.message,_.code,_.cause)}finally{c===Q&&(i.value=!1),G===V&&(G=null)}}function Y(c){if(J||R.value<=0)return;const w=Math.max(1,Math.min(R.value,c));g.value=w;const b=M.value;b&&(b.scrollTop=Te.pageOffsetPx(w-1)*A.value,Ne(b))}const ye=dt(l,{getPdfExporter:Ge,getXlsxOptions:()=>s.value.xlsx,onError:(c,w)=>{h.value={kind:"error",message:c},K(c,w??"print")},onWarning:c=>{h.value={kind:"warning",message:c},r("warning",c)},onBusy:c=>{v.value=c,c?h.value={kind:"progress",message:d.value.exporting.replace("{format}",c)}:h.value?.kind==="progress"&&(h.value=null)},onPrinting:c=>{f.value=c}}),{releasePrintFrame:Tt,dispose:Dt}=ye;async function Ie(){m.value=null,await ye.print()}async function Oe(c){m.value=null,await ye.exportAs(c)}function ze(){m.value=null,ye.openPdfWindow()}async function Je(c,w={}){J||(ee.value={...ee.value,...c},w.reload!==!1&&await te())}const Nt={reload:te,print:Ie,exportAs:Oe,openPdfWindow:ze,gotoPage:Y,setParams:Je,checkPdfFont:he,get state(){return Z.value}};e.provide(ie.MACH_REPORT_CONTROLLER_KEY,Nt);const T=nn({plan:l,gotoPage:Y,debounceMs:e.computed(()=>s.value.preview.searchDebounceMs),highlight:Zt,clearHighlights:Yt});function Vt(c){c.ctrlKey&&(c.preventDefault(),Ve(A.value*(c.deltaY<0?1.1:1/1.1)))}function It(c){if((c.ctrlKey||c.metaKey)&&c.key.toLowerCase()==="f"){c.preventDefault(),T.visible.value||T.toggle();return}switch(c.key){case"PageDown":c.preventDefault(),Y(g.value+1);break;case"PageUp":c.preventDefault(),Y(g.value-1);break;case"Home":c.preventDefault(),Y(1);break;case"End":c.preventDefault(),Y(R.value);break;case"+":case"=":c.preventDefault(),Ve(A.value*1.1);break;case"-":c.preventDefault(),Ve(A.value/1.1);break}}function Ot(){try{localStorage.setItem(P,JSON.stringify({zoomMode:de.value==="fit"?"fit":Math.round(A.value*100)}))}catch{}}e.watch([de,A],Ot);let We="";function Xe(c=!1){const w=T.activeMatch.value;if(!B.value||!w)return;const b=`${T.query.value}:${T.matchIndex.value}:${w.pageIndex}`;if(!c&&b===We)return;const I=F.value?.querySelector(`[data-page="${w.pageIndex+1}"]`)?.querySelectorAll("mark.mrp-hit")[w.occurrence];I&&(I.scrollIntoView?.({block:"nearest",inline:"nearest"}),We=b)}e.watchEffect(()=>{const c=l.value;if(!c)return;const w=T.activeMatch.value;T.matchIndex.value,w||(We=""),Ze.value;const b=F.value;if(!b)return;b.querySelectorAll(".mrp-page-holder").forEach(I=>{const be=Number(I.dataset.page??0)-1,D=c.pages[be];if(!D||I.childElementCount>0){if(I.firstElementChild){const _=I.firstElementChild;T.clear(_),T.apply(_)}return}I.style.width=`${D.pageWidthMm*Ee}px`;const j=se.renderPage(D,96,{},document);T.apply(j),I.appendChild(j)}),Xe()},{flush:"post"}),e.watch(()=>T.query.value,c=>{c||F.value?.querySelectorAll(".mrp-page-holder").forEach(w=>{T.clear(w)})});const U=on(l,{thumbsRoot:y,visible:S,renderThumbCanvas:c=>{try{const w=l.value.pages[c],b=Math.min(.2,116/Math.max(1,w.pageWidthMm*Ee)),{canvases:V}=se.renderPlanToCanvas(l.value,{start:c,end:c,dpr:b});return V[0]??null}catch{return null}}});e.watchEffect(()=>{U.schedule()},{flush:"post"});const zt=e.computed(()=>o.debug),{debugStats:ae}=rn(zt,{plan:l,pageCount:R,windowRange:pe,zoom:A,loadMs:E.loadMs});function Le(){Ne(M.value),U.schedule(),de.value==="fit"&&Ye(),Xe(!0)}function Qe(){fe(P===at?100:"fit");try{const c=JSON.parse(localStorage.getItem(P)??"{}");c.zoomMode==="fit"?fe("fit"):typeof c.zoomMode=="number"&&fe(c.zoomMode)}catch{}}return e.onMounted(()=>{window.addEventListener("resize",Le),typeof ResizeObserver<"u"&&M.value&&(ge=new ResizeObserver(Le),ge.observe(M.value)),Ne(M.value),Qe(),o.autoLoad&&te()}),e.onUnmounted(()=>{J=!0,Me(),Q++,G?.abort(),G=null,window.removeEventListener("resize",Le),ge?.disconnect(),ge=null,U.destroy(),T.reset(),Dt()}),e.watch(()=>[JSON.stringify(z.value),JSON.stringify(o.params),L.value],()=>{if(o.autoLoad){te();return}Q++,G?.abort(),G=null,i.value=!1,u.value="",m.value=null,h.value=null,we()}),n({reload:te,print:Ie,exportAs:Oe,openPdfWindow:ze,gotoPage:Y,setParams:Je,checkPdfFont:he,state:Z}),(c,w)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["mach-report-preview",{"mrp-wide-report":B.value}]),style:e.normalizeStyle(Rt.value)},[H.value&&X.value.length>0?(e.openBlock(),e.createBlock(mt,{key:0,defs:X.value,modelValue:ee.value,"onUpdate:modelValue":w[0]||(w[0]=b=>ee.value=b),messages:d.value,attempted:Fe.value,onQuery:St,onReset:Bt},null,8,["defs","modelValue","messages","attempted"])):e.createCommentVNode("",!0),e.createVNode(pt,{"page-count":R.value,"current-page":g.value,"zoom-mode":e.unref(de),zoom:e.unref(A),"show-export":x.value,"show-print":k.value,"show-pdf-window":C.value,messages:d.value,search:{visible:e.unref(T).visible.value,query:e.unref(T).query.value,matchIndex:e.unref(T).matchIndex.value,matchCount:e.unref(T).matchCount.value,searching:e.unref(T).searching.value},"thumbs-visible":S.value,onGoto:Y,onZoom:e.unref(fe),onExport:w[1]||(w[1]=b=>Oe(b)),onPrint:Ie,onPdfWindow:ze,onSearchInput:e.unref(T).onInput,onSearchNav:e.unref(T).onNav,onSearchToggle:e.unref(T).toggle,onThumbsToggle:w[2]||(w[2]=b=>S.value=!S.value)},null,8,["page-count","current-page","zoom-mode","zoom","show-export","show-print","show-pdf-window","messages","search","thumbs-visible","onZoom","onSearchInput","onSearchNav","onSearchToggle"]),h.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:e.normalizeClass(["mrp-export-notice",`mrp-export-${h.value.kind}`]),role:"alert"},e.toDisplayString(h.value.message),3)):e.createCommentVNode("",!0),p.value.status==="error"&&(x.value||C.value)?(e.openBlock(),e.createElementBlock("div",Vn,[e.createTextVNode(e.toDisplayString(d.value.pdfFontUnavailable)+" ",1),e.createElementVNode("button",{type:"button",onClick:kt},e.toDisplayString(d.value.retry),1)])):e.createCommentVNode("",!0),e.createElementVNode("div",In,[e.createElementVNode("div",{ref_key:"viewportRef",ref:M,class:"mrp-body",tabindex:"0",onWheel:Vt,onKeydown:It,onScrollPassive:w[3]||(w[3]=b=>e.unref(Ft)(b.target))},[i.value?(e.openBlock(),e.createElementBlock("div",On,e.toDisplayString(d.value.loading),1)):u.value?(e.openBlock(),e.createElementBlock("div",zn,[e.createTextVNode(e.toDisplayString(u.value)+" ",1),e.createElementVNode("button",{class:"mrp-retry",type:"button",onClick:te},e.toDisplayString(d.value.retry),1)])):!l.value||R.value===0?(e.openBlock(),e.createElementBlock("div",Wn,e.toDisplayString(d.value.empty),1)):(e.openBlock(),e.createElementBlock("div",{key:3,class:"mrp-scale",style:e.normalizeStyle({width:`${e.unref(De).w*e.unref(A)}px`,height:`${e.unref(De).h*e.unref(A)}px`})},[e.createElementVNode("div",{ref_key:"containerRef",ref:F,class:"mrp-scale-inner",style:e.normalizeStyle({transform:`scale(${e.unref(A)})`,transformOrigin:"top left",width:`${e.unref(De).w}px`})},[e.unref(pe).padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-spacer-top",style:e.normalizeStyle({height:`${e.unref(pe).padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Ze),b=>(e.openBlock(),e.createElementBlock("div",{key:b.index,class:"mrp-page-holder","data-page":b.index+1},null,8,Ln))),128)),e.unref(pe).padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-spacer-bottom",style:e.normalizeStyle({height:`${e.unref(pe).padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],4)],4))],544),S.value&&R.value>0?(e.openBlock(),e.createElementBlock("aside",{key:0,ref_key:"thumbsRef",ref:y,class:"mrp-thumbs",onScrollPassive:w[4]||(w[4]=(...b)=>e.unref(U).onScroll&&e.unref(U).onScroll(...b))},[e.unref(U).windowRange.value.padTopPx>0?(e.openBlock(),e.createElementBlock("div",{key:0,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(U).windowRange.value.padTopPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(U).visibleThumbs.value,b=>(e.openBlock(),e.createElementBlock("div",{key:b.index,class:e.normalizeClass(["mrp-thumb",{"mrp-thumb-active":b.index+1===g.value}]),style:e.normalizeStyle({height:`${b.height+20}px`}),onClick:V=>Y(b.index+1)},[e.createElementVNode("div",{class:"mrp-thumb-box","data-thumb":b.index+1,style:e.normalizeStyle({height:`${b.height}px`})},null,12,Hn),e.createElementVNode("span",qn,e.toDisplayString(b.index+1),1)],14,An))),128)),e.unref(U).windowRange.value.padBottomPx>0?(e.openBlock(),e.createElementBlock("div",{key:1,class:"mrp-thumb-spacer",style:e.normalizeStyle({height:`${e.unref(U).windowRange.value.padBottomPx}px`}),"aria-hidden":"true"},null,4)):e.createCommentVNode("",!0)],544)):e.createCommentVNode("",!0)]),e.createElementVNode("div",jn,[e.renderSlot(c.$slots,"default",{},void 0,!0)]),e.unref(ae)?(e.openBlock(),e.createElementBlock("div",Un,[w[5]||(w[5]=e.createElementVNode("div",null,"mach-report debug",-1)),e.createElementVNode("div",null,"pages: "+e.toDisplayString(e.unref(ae).pages)+" | window: ["+e.toDisplayString(e.unref(ae).window)+"]",1),e.createElementVNode("div",null,"zoom: "+e.toDisplayString(e.unref(ae).zoom)+" | load: "+e.toDisplayString(e.unref(ae).loadMs),1),e.createElementVNode("div",null,"plan: "+e.toDisplayString(e.unref(ae).planKB)+"KB",1)])):e.createCommentVNode("",!0)],6))}}),Pt=Ke(Kn,[["__scopeId","data-v-48919dc8"]]),Gn=Object.freeze(Object.defineProperty({__proto__:null,default:Pt},Symbol.toStringTag,{value:"Module"}));exports.DEFAULT_MESSAGES=vt;exports.DEFAULT_THEME=gt;exports.MachReportError=re;exports.PlanLoadError=Pe;exports.ReportParamPanel=mt;exports.ReportPreview=Pt;exports.ReportPreview$1=Gn;exports.ReportToolbar=pt;exports.SILENT_LOGGER=Mn;exports.buildPrintDocument=Ue;exports.buildWordHtml=ut;exports.createDefaultPdfExporter=xt;exports.createFetchRequest=Kt;exports.defineMachReportConfig=ht;exports.defineMachReportPreset=Rn;exports.joinReportIds=Ut;exports.normalizeReportIds=He;exports.printPlans=Gt;exports.provideMachReportConfig=Fn;exports.resolveConfig=wt;exports.themeToCssVars=yt;exports.toErrorDetail=Et;exports.useMachReportConfig=bt;exports.usePageWindow=it;exports.usePrintExport=dt;exports.useZoom=ct;