@agile-team/mach-report 2.1.0 → 2.3.0

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 +130 -16
  2. package/dist/ReportPreview-CLENbOCL.cjs +6 -0
  3. package/dist/ReportPreview-CwTGfyTq.js +1679 -0
  4. package/dist/grid-geometry-CWmJ9c9y.js +130 -0
  5. package/dist/grid-geometry-DBH9ExuY.cjs +1 -0
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +110 -16
  8. package/dist/index.d.ts +110 -16
  9. package/dist/index.js +1099 -718
  10. package/dist/page-window-index-CIuT4BAv.js +43 -0
  11. package/dist/page-window-index-DEjnM6IB.cjs +1 -0
  12. package/dist/pdf.cjs +46 -46
  13. package/dist/pdf.d.cts +20 -0
  14. package/dist/pdf.d.ts +20 -0
  15. package/dist/pdf.js +6 -6
  16. package/dist/{plugin-Bl00j_CP.cjs → plugin-MSh_OhoW.cjs} +1 -1
  17. package/dist/{plugin-DVScnZ4C.js → plugin-uoO9VA6O.js} +2 -2
  18. package/dist/report-params-B3Fia6JO.js +10 -0
  19. package/dist/report-params-D1gZ1DME.cjs +1 -0
  20. package/dist/style.css +1 -1
  21. package/dist/textwrap-BQyrpYSR.js +117 -0
  22. package/dist/textwrap-DqiFwAV3.cjs +3 -0
  23. package/dist/vue/async.d.cts +77 -2
  24. package/dist/vue/async.d.ts +77 -2
  25. package/dist/vue/index.d.cts +91 -14
  26. package/dist/vue/index.d.ts +91 -14
  27. package/dist/vue-async.cjs +1 -1
  28. package/dist/vue-async.js +3 -3
  29. package/dist/vue.cjs +1 -1
  30. package/dist/vue.js +4 -4
  31. package/dist/xlsx.cjs +21 -21
  32. package/dist/xlsx.d.cts +28 -2
  33. package/dist/xlsx.d.ts +28 -2
  34. package/dist/xlsx.js +5637 -5515
  35. package/package.json +3 -2
  36. package/dist/ReportPreview-Dwdsyk9b.js +0 -1558
  37. package/dist/ReportPreview-VHAIfsz1.cjs +0 -6
  38. package/dist/grid-geometry-BXpOxznT.cjs +0 -1
  39. package/dist/grid-geometry-Bs8QXz1X.js +0 -65
  40. package/dist/report-params-BB85g7mg.js +0 -10
  41. package/dist/report-params-D1NeY-eR.cjs +0 -1
  42. package/dist/style-CFZ-HE2s.cjs +0 -3
  43. package/dist/style-DnmtG7Gl.js +0 -180
@@ -0,0 +1,130 @@
1
+ const H = 1.35, O = 10.5, B = 0.75, b = "#333333", v = "#000000", N = "1.0.0-mach", k = 25.4, U = 96;
2
+ function I(t = 96) {
3
+ return t / 25.4;
4
+ }
5
+ function $(t, s = 96) {
6
+ return (t || 0) * I(s);
7
+ }
8
+ function y(t, s = 96) {
9
+ return t / I(s);
10
+ }
11
+ function F(t, s = 96) {
12
+ return t * s / 72;
13
+ }
14
+ function G(t, s) {
15
+ const r = 10 ** s;
16
+ return Math.round(t * r) / r;
17
+ }
18
+ const K = {
19
+ a3: { widthMm: 297, heightMm: 420 },
20
+ a4: { widthMm: 210, heightMm: 297 },
21
+ a5: { widthMm: 148, heightMm: 210 },
22
+ b4: { widthMm: 250, heightMm: 353 },
23
+ b5: { widthMm: 176, heightMm: 250 }
24
+ };
25
+ function W(t, s = 96, r = 10.5) {
26
+ if (t?.fontSizePx != null)
27
+ return { fontSizePt: t.fontSizePx * 72 / s, fontSizePx: t.fontSizePx };
28
+ const h = t?.fontSize ?? r;
29
+ return { fontSizePt: h, fontSizePx: F(h, s) };
30
+ }
31
+ function j(t, s = b) {
32
+ return {
33
+ color: t?.borderColor ?? t?.lineColor ?? s,
34
+ widthPt: t?.lineWidthPt ?? 0.75
35
+ };
36
+ }
37
+ function V(t, s = v) {
38
+ return t?.color ?? s;
39
+ }
40
+ function X(t) {
41
+ return t?.lineHeight ?? 1.35;
42
+ }
43
+ function Z(t) {
44
+ const s = t?.borderTop !== !1, r = t?.borderRight !== !1, h = t?.borderBottom !== !1, a = t?.borderLeft !== !1;
45
+ return { top: s, right: r, bottom: h, left: a, inner: s || r || h || a };
46
+ }
47
+ function L(t, s) {
48
+ const r = t.length;
49
+ if (r === 0) return [];
50
+ const h = t.reduce((l, i) => l + i, 0), a = h > 0 && s > 0 ? s / h : 1, c = [];
51
+ let S = 0;
52
+ for (let l = 0; l < r; l++) {
53
+ const i = Math.max(0, t[l] * a);
54
+ c.push({ pos: S, size: i }), S += i;
55
+ }
56
+ return c;
57
+ }
58
+ function q(t, s, r) {
59
+ const h = t.cells ?? [], a = Math.max(h.length, 1), c = t.colWidthsMm?.length ?? Math.max(1, ...h.map((o) => Array.isArray(o) ? o.length : 0)), S = t.colWidthsMm?.length ? L(t.colWidthsMm, s) : Array.from({ length: c }, (o, n) => ({
60
+ pos: s * n / c,
61
+ size: s / c
62
+ })), l = (o) => o <= 0 ? 0 : o >= c ? S[S.length - 1].pos + S[S.length - 1].size : S[o].pos, i = t.rowHeightsMm?.length ? L(t.rowHeightsMm, r) : Array.from({ length: a }, (o, n) => ({
63
+ pos: r * n / a,
64
+ size: r / a
65
+ })), d = (o) => o <= 0 ? 0 : o >= a ? i[i.length - 1].pos + i[i.length - 1].size : i[o].pos, p = /* @__PURE__ */ new Set(), E = (o, n) => `${o}:${n}`, T = [], g = /* @__PURE__ */ new Set(), w = /* @__PURE__ */ new Set(), x = (o, n) => `v${o}:${n}`, C = (o, n) => `h${o}:${n}`;
66
+ h.forEach((o, n) => {
67
+ if (!Array.isArray(o)) return;
68
+ let e = 0;
69
+ for (const m of o) {
70
+ for (; e < c && p.has(E(n, e)); ) e++;
71
+ if (e >= c) break;
72
+ const R = Math.max(1, Math.min(m?.colSpan ?? 1, c - e)), z = Math.max(1, m?.rowSpan ?? 1), P = Math.min(a, n + z), M = Math.min(c, e + R);
73
+ for (let f = n; f < P; f++)
74
+ for (let u = e; u < M; u++)
75
+ p.add(E(f, u));
76
+ for (let f = e + 1; f < M; f++)
77
+ for (let u = n; u < P; u++) g.add(x(f, u));
78
+ for (let f = n + 1; f < P; f++)
79
+ for (let u = e; u < M; u++) w.add(C(f, u));
80
+ const A = l(e), D = d(n);
81
+ T.push({
82
+ ri: n,
83
+ ci: e,
84
+ cell: m ?? {},
85
+ xMm: A,
86
+ yMm: D,
87
+ widthMm: l(M) - A,
88
+ heightMm: d(P) - D
89
+ }), e = M;
90
+ }
91
+ });
92
+ const _ = [];
93
+ for (let o = 1; o < c; o++) {
94
+ let n = -1;
95
+ for (let e = 0; e <= a; e++) {
96
+ const m = e < a && !g.has(x(o, e));
97
+ m && n < 0 && (n = e), !m && n >= 0 && (_.push({ kind: "v", pos: l(o), from: d(n), to: d(e) }), n = -1);
98
+ }
99
+ }
100
+ for (let o = 1; o < a; o++) {
101
+ let n = -1;
102
+ for (let e = 0; e <= c; e++) {
103
+ const m = e < c && !w.has(C(o, e));
104
+ m && n < 0 && (n = e), !m && n >= 0 && (_.push({ kind: "h", pos: d(o), from: l(n), to: l(e) }), n = -1);
105
+ }
106
+ }
107
+ return { columns: S, rows: i, cells: T, edges: _ };
108
+ }
109
+ export {
110
+ U as C,
111
+ O as D,
112
+ H as L,
113
+ k as M,
114
+ K as P,
115
+ N as S,
116
+ v as a,
117
+ G as b,
118
+ j as c,
119
+ Z as d,
120
+ X as e,
121
+ V as f,
122
+ q as g,
123
+ B as h,
124
+ b as i,
125
+ I as j,
126
+ y as k,
127
+ $ as m,
128
+ F as p,
129
+ W as r
130
+ };
@@ -0,0 +1 @@
1
+ "use strict";const w="#333333",F="#000000",N="1.0.0-mach";function M(o=96){return o/25.4}function z(o,r=96){return(o||0)*M(r)}function U(o,r=96){return o/M(r)}function O(o,r=96){return o*r/72}function B(o,r){const s=10**r;return Math.round(o*s)/s}const b={a3:{widthMm:297,heightMm:420},a4:{widthMm:210,heightMm:297},a5:{widthMm:148,heightMm:210},b4:{widthMm:250,heightMm:353},b5:{widthMm:176,heightMm:250}};function k(o,r=96,s=10.5){if(o?.fontSizePx!=null)return{fontSizePt:o.fontSizePx*72/r,fontSizePx:o.fontSizePx};const h=o?.fontSize??s;return{fontSizePt:h,fontSizePx:O(h,r)}}function G(o,r=w){return{color:o?.borderColor??o?.lineColor??r,widthPt:o?.lineWidthPt??.75}}function $(o,r=F){return o?.color??r}function y(o){return o?.lineHeight??1.35}function K(o){const r=o?.borderTop!==!1,s=o?.borderRight!==!1,h=o?.borderBottom!==!1,l=o?.borderLeft!==!1;return{top:r,right:s,bottom:h,left:l,inner:r||s||h||l}}function g(o,r){const s=o.length;if(s===0)return[];const h=o.reduce((i,f)=>i+f,0),l=h>0&&r>0?r/h:1,c=[];let u=0;for(let i=0;i<s;i++){const f=Math.max(0,o[i]*l);c.push({pos:u,size:f}),u+=f}return c}function V(o,r,s){const h=o.cells??[],l=Math.max(h.length,1),c=o.colWidthsMm?.length??Math.max(1,...h.map(t=>Array.isArray(t)?t.length:0)),u=o.colWidthsMm?.length?g(o.colWidthsMm,r):Array.from({length:c},(t,n)=>({pos:r*n/c,size:r/c})),i=t=>t<=0?0:t>=c?u[u.length-1].pos+u[u.length-1].size:u[t].pos,f=o.rowHeightsMm?.length?g(o.rowHeightsMm,s):Array.from({length:l},(t,n)=>({pos:s*n/l,size:s/l})),T=t=>t<=0?0:t>=l?f[f.length-1].pos+f[f.length-1].size:f[t].pos,d=new Set,C=(t,n)=>`${t}:${n}`,L=[],A=new Set,R=new Set,p=(t,n)=>`v${t}:${n}`,x=(t,n)=>`h${t}:${n}`;h.forEach((t,n)=>{if(!Array.isArray(t))return;let e=0;for(const S of t){for(;e<c&&d.has(C(n,e));)e++;if(e>=c)break;const H=Math.max(1,Math.min(S?.colSpan??1,c-e)),v=Math.max(1,S?.rowSpan??1),P=Math.min(l,n+v),E=Math.min(c,e+H);for(let _=n;_<P;_++)for(let a=e;a<E;a++)d.add(C(_,a));for(let _=e+1;_<E;_++)for(let a=n;a<P;a++)A.add(p(_,a));for(let _=n+1;_<P;_++)for(let a=e;a<E;a++)R.add(x(_,a));const D=i(e),I=T(n);L.push({ri:n,ci:e,cell:S??{},xMm:D,yMm:I,widthMm:i(E)-D,heightMm:T(P)-I}),e=E}});const m=[];for(let t=1;t<c;t++){let n=-1;for(let e=0;e<=l;e++){const S=e<l&&!A.has(p(t,e));S&&n<0&&(n=e),!S&&n>=0&&(m.push({kind:"v",pos:i(t),from:T(n),to:T(e)}),n=-1)}}for(let t=1;t<l;t++){let n=-1;for(let e=0;e<=c;e++){const S=e<c&&!R.has(x(t,e));S&&n<0&&(n=e),!S&&n>=0&&(m.push({kind:"h",pos:T(t),from:i(n),to:i(e)}),n=-1)}}return{columns:u,rows:f,cells:L,edges:m}}exports.CSS_DPI=96;exports.DEFAULT_BORDER_PT=.75;exports.DEFAULT_FONT_PT=10.5;exports.DEFAULT_STROKE_COLOR=w;exports.DEFAULT_TEXT_COLOR=F;exports.LINE_HEIGHT=1.35;exports.MM_PER_INCH=25.4;exports.PAPER_SIZES=b;exports.SCHEMA_VERSION_MACH=N;exports.mmToPx=z;exports.mmToPxFactor=M;exports.ptToPx=O;exports.pxToMm=U;exports.resolveBoxBorders=K;exports.resolveFontSize=k;exports.resolveGridLayout=V;exports.resolveLineHeight=y;exports.resolveStroke=G;exports.resolveTextColor=$;exports.round=B;
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./style-CFZ-HE2s.cjs"),fe=require("./grid-geometry-BXpOxznT.cjs"),Ce=require("./report-params-D1NeY-eR.cjs");function ge(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const r=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(r.getTime())?null:r}const n=new Date(e);return Number.isNaN(n.getTime())?null:n}function Z(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function Ae(e,t){const n=r=>String(r).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,n(e.getMonth()+1)).replace(/DD/g,n(e.getDate())).replace(/hh/g,n(e.getHours())).replace(/mm/g,n(e.getMinutes())).replace(/ss/g,n(e.getSeconds()))}function Re(e,t,n){return n!=null?t?Z(e,n):e.toFixed(n):t?Z(e):String(e)}function q(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function K(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const n=q(e);return n==null?String(e):Re(n,t.thousands===!0,t.digits)}case"percent":{const n=q(e);return n==null?String(e):`${Z(n*100,t.digits??2)}%`}case"date":{const n=t.pattern??"YYYY-MM-DD",r=e instanceof Date?e:ge(String(e));return r?Ae(r,n):String(e)}default:return String(e)}}function ue(e,t){const n=e[t.field];if(n==null||n==="")return!1;if(typeof t.value=="number"){const i=q(n);if(i==null)return!1;switch(t.op){case">":return i>t.value;case">=":return i>=t.value;case"<":return i<t.value;case"<=":return i<=t.value;case"==":return i===t.value;case"!=":return i!==t.value}}const r=String(n),o=String(t.value);switch(t.op){case"==":return r===o;case"!=":return r!==o;case">":return r>o;case">=":return r>=o;case"<":return r<o;case"<=":return r<=o}return!1}const He=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function j(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ne(e,t,n,r){const o=e[t];(typeof o!="number"||!Number.isFinite(o))&&r.push({path:`${n}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function X(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?n.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):He.has(o)||r.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const s of["leftMm","topMm","widthMm","heightMm"])Ne(e,s,t,n);typeof e.leftMm=="number"&&e.leftMm<-100&&n.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const s of["widthMm","heightMm"])typeof e[s]=="number"&&e[s]<0&&n.push({path:`${t}.${s}`,message:"组件尺寸不能为负数"});const i=e.grid;i!==void 0&&(!j(i)||!Array.isArray(i.cells)?n.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):i.cells.forEach((s,l)=>{if(!Array.isArray(s)){n.push({path:`${t}.grid.cells.${l}`,message:"行应为数组"});return}s.forEach((m,f)=>{m!=null&&j(m)&&Array.isArray(m.children)&&m.children.forEach((h,c)=>{X(h,`${t}.grid.cells.${l}.${f}.children.${c}`,n,r)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((s,l)=>{(!j(s)||!Array.isArray(s.segments))&&n.push({path:`${t}.richParagraphs.${l}`,message:"段落缺少 segments 数组"})}):n.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function pe(e,t,n,r=[]){if(!j(e)){n.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,i=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&n.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof i!="number"||!(i>0&&i<5e3))&&n.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(i)}`});const a=e.components;Array.isArray(a)?Array.isArray(a)&&a.forEach((s,l)=>X(s,`${t}.components.${l}`,n,r)):n.push({path:`${t}.components`,message:"components 应为数组"})}function Q(e){const t=[],n=[],r=j(e)?e.pages:void 0;if(!Array.isArray(r))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{r.forEach((i,a)=>pe(i,`$.pages.${a}`,t,n)),r.length>2e3&&n.push({path:"$.pages",message:`页数异常大(${r.length} 页),渲染与打印耗时可能显著增加`});const o=r.reduce((i,a)=>i+(j(a)&&Array.isArray(a.components)?a.components.length:0),0);o>5e4&&n.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:n}}function Le(e){const t=Q(e);if(!t.ok){const n=t.errors.slice(0,3).map(r=>`${r.path}: ${r.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${n}`)}return e.pages}function de(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function _e(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function Fe(e,t){const r=(e.fontSizePt??d.DEFAULT_FONT_PT)*d.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*r+o)}function Me(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function Be(e,t){const n=e.fontSizePt??d.DEFAULT_FONT_PT,r=e.paddingMm??1,o=e.columns.map(u=>({fontSize:n,align:"left",verticalAlign:"middle",...u.style})),i=e.columns.map(u=>({fontSize:n,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...u.style||{}})),a=e.columns.map(u=>u.header),s=a.map((u,g)=>d.wrapText(u,e.columns[g].widthMm-r*2,{fontSizePt:n,bold:e.headerBold??!0},t)),l=Math.max(...s.map(u=>u.length),1),m=Fe(e,l),f=a.map((u,g)=>({text:u,style:i[g]})),h=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},c=e.columns.map(u=>u.widthMm);return{fontSizePt:n,paddingMm:r,cellStyles:o,borderStyle:h,headerHeightMm:m,headerGrid:{cells:[f],colWidthsMm:c,rowHeightsMm:[m]},colWidthsMm:c,columns:e.columns}}function me(e,t,n){const r=e.columns,o=new Array(r.length);let i=1;for(let f=0;f<r.length;f++){const h=r[f];o[f]=h.format?K(t[h.field],h.format):Me(t[h.field])}const a=new Array(r.length);for(let f=0;f<r.length;f++){const h=d.wrapText(o[f],r[f].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},n);a[f]=h,h.length>i&&(i=h.length)}const s=e.fontSizePt*d.LINE_HEIGHT*25.4/72,l=Math.max(e.rowHeightFloorMm,i*s+e.paddingMm*2),m=new Array(r.length);for(let f=0;f<r.length;f++){const h=r[f];let c=e.cellStyles[f];if(h.rules){for(const u of h.rules)if(ue(t,u.when)){c={...c??{},...u.style};break}}m[f]={text:o[f],style:c}}return{grid:{cells:[m],colWidthsMm:e.colWidthsMm,rowHeightsMm:[l]},heightMm:l}}function we(e,t,n={}){const r=typeof n=="number"?{mmPerRow:n}:n,o=r.mmPerRow??0,i=r.measurer??d.heuristicMeasurer,a=[],s=[];let l=0;const m=h=>`${h}_${(++l).toString(36)}`,f=[];for(const h of e.pages){const c=de(h),u=()=>_e(h,c),g=c.marginTopMm,S=[],P=()=>{if(s.push({pageWidthMm:c.widthMm,pageHeightMm:c.heightMm,marginTopMm:c.marginTopMm,marginBottomMm:c.marginBottomMm,marginLeftMm:c.marginLeftMm,marginRightMm:c.marginRightMm,components:c.components}),S.length>0){const x=s.length;for(const w of S){const v={...w,text:String(w.text??"").replace(/\{page\}/g,String(x))};s[s.length-1].components.push(v),v.text.includes("{totalPages}")&&f.push(v)}}};for(const x of h.components){if(x.kind!=="list"){if(x.kind==="text"&&typeof x.text=="string"){const y=x.text;if(y.includes("{page}")||y.includes("{totalPages}")){S.push(x);continue}}c.components.push(x);continue}const w=x,v=t[w.dataset];Array.isArray(v)||a.push(`数据集 ${w.dataset} 未提供数据,列表 ${w.id??""} 输出为空`);const p=Array.isArray(v)?v:[],E=w.columns.reduce((y,M)=>y+M.widthMm,0),G=E>w.widthMm?w.widthMm/E:1,C=G===1?w:{...w,columns:w.columns.map(y=>({...y,widthMm:y.widthMm*G}))},k={...Be(C,i),rowHeightFloorMm:C.rowHeightMm??0},U={kind:"rect",leftMm:w.leftMm,topMm:0,widthMm:w.widthMm,heightMm:k.headerHeightMm,grid:k.headerGrid,nid:m("listh"),style:k.borderStyle};let b=w.topMm;const H=(y,M)=>{y.components.push({...U,topMm:M})};H(c,b),b+=k.headerHeightMm+o;const _=y=>{if(b+y>u()){P();const M=de(h);c.components=M.components,c.heightMm=M.heightMm,C.headerEveryPage!==!1?(H(c,w.topMm),b=w.topMm+k.headerHeightMm):b=g}},T=(y,M,$)=>{const A=C.headerEveryPage!==!1?w.topMm+k.headerHeightMm:g,B=u()-A;M>B&&a.push(`列表 ${w.id??w.dataset} 行高 ${M.toFixed(2)}mm 超出单页可用高度 ${B.toFixed(2)}mm,预览与打印可能截断内容`),_(M),c.components.push({kind:"rect",leftMm:w.leftMm,topMm:b,widthMm:w.widthMm,heightMm:M,grid:y,nid:m($),style:k.borderStyle}),b+=M},N=()=>me(k,{},i).heightMm,R=(y,M,$,A)=>{const B=[],se=Math.max(1,Math.min(A,C.columns.length)),le={fontSize:k.fontSizePt,...$};B.push({text:y,colSpan:se,style:{bold:!0,...le}});for(let J=se;J<C.columns.length;J++){const $e=C.columns[J];B.push({text:M.get($e.field)??"",style:le})}const ke=k.fontSizePt*d.LINE_HEIGHT*25.4/72,ce=Math.max(k.rowHeightFloorMm,ke+k.paddingMm*2);return{grid:{cells:[B],colWidthsMm:k.colWidthsMm,rowHeightsMm:[ce]},heightMm:ce}},I=(y,M)=>{let $=0;for(const A of y){const B=typeof A[M]=="number"?A[M]:Number(A[M]);Number.isFinite(B)&&($+=B)}return $},Y=(y,M)=>{const $=C.columns.find(A=>A.field===M);return K(I(y,M),$?.format??{kind:"number",thousands:!0})},F=C.groupBy,ie=y=>{const M=C.columns.findIndex($=>y.includes($.field));return M>0?M:1},V=[];if(F){const y=new Map;for(const M of p){const $=Me(M[F.field]),A=y.get($);A?A.push(M):y.set($,[M])}for(const[M,$]of y){V.push({kind:"groupHeader",label:(F.headerTemplate??"{value}").replace(/\{value\}/g,M)});for(const A of $)V.push({kind:"row",row:A});F.subtotal&&F.subtotal.length>0&&V.push({kind:"subtotal",label:F.subtotalLabel??"小计",rows:$})}}else for(const y of p)V.push({kind:"row",row:y});const ae=N();for(const y of V)if(y.kind==="row"){const M=me(k,y.row,i);T(M.grid,M.heightMm,"listr")}else if(y.kind==="groupHeader"){const M=R(y.label,new Map,F?.headerStyle??{},C.columns.length);F?.keepWithNext!==!1&&b+M.heightMm+ae>u()&&_(M.heightMm+ae),T(M.grid,M.heightMm,"listg")}else if(y.kind==="subtotal"){const M=new Map;for(const A of F.subtotal??[])M.set(A,Y(y.rows,A));const $=R(y.label,M,F?.subtotalStyle??{},ie(F.subtotal??[]));T($.grid,$.heightMm,"listst")}if(C.grandTotal){const y=typeof C.grandTotal=="object"?C.grandTotal:void 0,M=y?.fields??F?.subtotal??[];if(M.length>0){const $=new Map;for(const B of M)$.set(B,Y(p,B));const A=R(y?.label??"合计",$,y?.style??{},ie(M));T(A.grid,A.heightMm,"listgt")}else a.push(`列表 ${w.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}P()}for(const h of f){const c=h.text;typeof c=="string"&&c.includes("{totalPages}")&&(h.text=c.replace(/\{totalPages\}/g,String(s.length)))}return{plan:{schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:s},warnings:a}}const ze={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function L(e,t){return t?.classNames?.[e]??ze[e]}class z{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,o=2){return this.add(t,`${d.round(d.mmToPx(n,r),o)}px`)}toString(){let t="";for(const[n,r]of this.props)t+=`${n}:${r};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function be(e,t,n){const r=t.style||{};e.add("color",r.color).add("background-color",r.backgroundColor).add("font-family",r.fontFamily).add("font-weight",r.bold?"700":void 0).add("font-style",r.italic?"italic":void 0).add("text-decoration",r.underline?"underline":void 0).add("letter-spacing",r.letterSpacing!=null?`${r.letterSpacing}pt`:void 0).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0);const o=d.resolveFontSize(r,n);e.add("font-size",`${d.round(o.fontSizePx,2)}px`)}function De(e,t,n,r,o){const i=o.createElement("table");if(i.className=L("grid",r),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(i),e.colWidthsMm){const m=o.createElement("colgroup");for(const f of e.colWidthsMm){const h=o.createElement("col");new z().mm("width",f,n).applyTo(h),m.appendChild(h)}i.appendChild(m)}const a=d.resolveBoxBorders(t.style),s=d.resolveStroke(t.style),l=a.inner?`${d.round(s.widthPt*n/72,2)}px solid ${s.color}`:"";return e.cells.forEach((m,f)=>{const h=o.createElement("tr");h.className=L("row",r),e.rowHeightsMm?.[f]!=null&&new z().mm("height",e.rowHeightsMm[f],n).applyTo(h),(m||[]).forEach(c=>{const u=o.createElement("td");u.className=L("cell",r),c?.colSpan&&(u.colSpan=c.colSpan),c?.rowSpan&&(u.rowSpan=c.rowSpan);const g=new z;if(l&&g.add("border",l),c?.style){const S=c.style;g.add("text-align",S.align).add("vertical-align",S.verticalAlign).add("background-color",S.backgroundColor).add("color",S.color).add("font-weight",S.bold?"700":void 0),g.add("font-size",`${d.round(d.resolveFontSize(S,n).fontSizePx,2)}px`)}if(g.applyTo(u),c?.text!=null&&(u.textContent=c.text),c?.children?.length)for(const S of c.children)u.appendChild(ee(S,n,r,o));h.appendChild(u)}),i.appendChild(h)}),i}function Oe(e,t,n,r){const o=r.createElement("div");o.className=L("text",n);const i=e.style||{},a=new z().add("text-align",i.align).add("display","flex").add("flex-direction","column").add("justify-content",i.verticalAlign==="middle"?"center":i.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(be(a,e,t),a.applyTo(o),d.isRichText(e)){const s=r.createElement("div");s.className=L("rich",n);for(const l of e.richParagraphs){const m=r.createElement("div");m.className=L("paragraph",n),new z().add("text-align",l.align).add("line-height",l.lineHeight!=null?String(l.lineHeight):void 0).mm("margin-top",l.spaceBeforeMm??0,t).mm("margin-bottom",l.spaceAfterMm??0,t).mm("text-indent",l.indentMm??0,t).applyTo(m);for(const h of l.segments||[]){const c=r.createElement("span");if(c.className=L("segment",n),c.textContent=h.kind==="field"?h.field??"":h.text??"",h.style){const u=new z().add("color",h.style.color).add("font-weight",h.style.bold?"700":void 0);u.add("font-size",`${d.round(d.resolveFontSize(h.style,t).fontSizePx,2)}px`),u.applyTo(c)}m.appendChild(c)}s.appendChild(m)}return o.appendChild(s),o}if(Array.isArray(e.lines)&&e.lines.length>0){const s=r.createElement("div");s.className=L("lines",n),i.lineHeight!=null&&new z().add("line-height",String(i.lineHeight)).applyTo(s);for(const l of e.lines){const m=r.createElement("div");m.className=L("line",n),m.textContent=l,s.appendChild(m)}return o.appendChild(s),o}return o.textContent=e.text??"",o}function Ie(e,t,n){const r=n.createElement("img");return r.className=L("image",t),r.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(r),r.alt=e.kind,r}function he(e,t,n,r){const o=r.createElement("div");o.className=L("shape",n);const i=e.style||{},a=d.resolveStroke(i),s=d.resolveBoxBorders(i),l=`${d.round(a.widthPt*t/72,2)}px solid ${a.color}`,m=new z;return e.grid||e.kind==="rect"?(s.top&&m.add("border-top",l),s.right&&m.add("border-right",l),s.bottom&&m.add("border-bottom",l),s.left&&m.add("border-left",l)):e.kind==="ellipse"?(s.inner&&m.add("border",l).add("border-radius","50%"),i.backgroundColor&&m.add("background-color",i.backgroundColor)):e.kind==="line"&&m.add("height","0").add("border-top",l),m.add("box-sizing","border-box").add("width","100%").add("height","100%"),m.applyTo(o),o}function ee(e,t,n,r){const o=r.createElement("div");o.className=`${L("comp",n)} mr-kind-${e.kind}`;const i=new z().add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(be(i,e,t),i.applyTo(o),d.isImageBackedComponent(e))return o.appendChild(Ie(e,n,r)),o;if(e.kind==="text")return o.appendChild(Oe(e,t,n,r)),o;if(e.grid){const s=he(e,t,n,r);return s.appendChild(De(e.grid,e,t,n,r)),o.appendChild(s),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(he(e,t,n,r)),o;const a=r.createElement("div");return a.className=L("unknown",n),a.textContent=e.fallbackText??"",o.appendChild(a),o}function ye(e,t,n,r){const o=r.createElement("div");o.className=L("page",n),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const i of e.components)o.appendChild(ee(i,t,n,r));return o}function We(e,t,n={}){const r=n.dpi??96,o=t.createElement("div");return o.className=L("root",n),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(i=>{o.appendChild(ye(i,r,n,t))}),o}function Se(e){const{pageHeightsPx:t,viewportHeightPx:n,scrollTopPx:r,overscan:o=1,gapPx:i=0}=e,a=t.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const s=Math.max(0,i),l=new Array(a+1);l[0]=0;for(let p=0;p<a;p++)l[p+1]=l[p]+Math.max(0,t[p]??0)+s;const m=l[a],f=Math.max(0,r);let h=0,c=0,u=a-1;for(;c<=u;){const p=c+u>>1;l[p]<=f?(h=p,c=p+1):u=p-1}const g=Math.max(0,Math.min(a-1,h-o)),S=l[h]+Math.max(0,n);let P=a-1;for(c=0,u=a-1;c<=u;){const p=c+u>>1;l[p+1]<S?c=p+1:(P=p,u=p-1)}const x=Math.min(a-1,P+o),w=l[g],v=Math.max(0,m-l[x+1]);return{start:g,end:x,padTopPx:w,padBottomPx:v}}const te=96/25.4;function ne(e,t=96){const n=t/96*te;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function je(e,t,n){const r=document.createElement("canvas"),{widthPx:o,heightPx:i}=ne(e,n);r.width=Math.round(o*t),r.height=Math.round(i*t),r.style.width=`${o}px`,r.style.height=`${i}px`;const a=r.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(t,t),a.fillStyle="#ffffff",a.fillRect(0,0,o,i),{canvas:r,ctx:a}}function Ge(e,t=96){return d.resolveFontSize(e,t).fontSizePx}function Te(e,t,n,r,o,i,a,s="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${a}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,m=t.text===""?[""]:t.text.split(`
2
- `),f=m.length*l;let h=r;s==="middle"?h=r+(i-f)/2:s==="bottom"&&(h=r+i-f),m.forEach((c,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const g=t.align==="center"?n+o/2:t.align==="right"?n+o:n;e.fillText(c,g,h+u*l+t.fontSizePx*.8,o)}),e.textAlign="left"}function Ue(e,t,n,r,o,i,a,s,l,m,f){const h=fe.resolveGridLayout(t,i/s,a/s),c=d.resolveBoxBorders(n.style),u=d.resolveStroke(n.style);for(const g of h.cells){const S=g.cell.style?.backgroundColor;S&&(e.fillStyle=S,e.fillRect(r+g.xMm*s,o+g.yMm*s,g.widthMm*s,g.heightMm*s))}if(c.inner){e.strokeStyle=u.color,e.lineWidth=d.ptToPx(u.widthPt,l);for(const g of h.edges)e.beginPath(),g.kind==="v"?(e.moveTo(r+g.pos*s,o+g.from*s),e.lineTo(r+g.pos*s,o+g.to*s)):(e.moveTo(r+g.from*s,o+g.pos*s),e.lineTo(r+g.to*s,o+g.pos*s)),e.stroke();e.beginPath(),c.top&&(e.moveTo(r,o),e.lineTo(r+i,o)),c.right&&(e.moveTo(r+i,o),e.lineTo(r+i,o+a)),c.bottom&&(e.moveTo(r+i,o+a),e.lineTo(r,o+a)),c.left&&(e.moveTo(r,o+a),e.lineTo(r,o)),e.stroke()}for(const g of h.cells){const S=typeof g.cell.text=="string"?g.cell.text:"";if(!S)continue;const P=g.cell.style,x=P?.fontSize??d.DEFAULT_FONT_PT,w=d.wrapText(S,g.widthMm-1,{fontSizePt:x},f).join(`
3
- `);Te(e,{text:w,fontSizePx:d.resolveFontSize(P,l).fontSizePx,bold:P?.bold??!1,color:P?.color??d.resolveTextColor(n.style,d.DEFAULT_TEXT_COLOR),align:P?.align??"left",lineHeight:d.LINE_HEIGHT},r+(g.xMm+.5)*s,o+g.yMm*s,Math.max(0,(g.widthMm-1)*s),g.heightMm*s,m,P?.verticalAlign??"middle")}}function ve(e,t,n,r,o,i){const a=t.leftMm*n,s=t.topMm*n,l=t.widthMm*n,m=t.heightMm*n,f=t.style??{};if(t.grid){Ue(e,t.grid,t,a,s,l,m,n,r,o,i);return}switch(t.kind){case"text":{const h=f.fontSize??d.DEFAULT_FONT_PT,c=d.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(g=>g.text??g.field??"").join("")).join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("./grid-geometry-DBH9ExuY.cjs"),C=require("./textwrap-DqiFwAV3.cjs"),ot=require("./page-window-index-DEjnM6IB.cjs"),rt=require("./report-params-D1gZ1DME.cjs");function be(e){if(!e||e.kind==="date")return;const t=e.digits;if(!(t!==void 0&&(!Number.isInteger(t)||t<0||t>100))){if(e.kind==="percent"){const n=t??2;return`0${n?`.${"0".repeat(n)}`:""}%`}return t===void 0?e.thousands?"#,##0.###############":void 0:`${e.thousands?"#,##0":"0"}${t?`.${"0".repeat(t)}`:""}`}}function Fe(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const o=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(o.getTime())?null:o}const n=new Date(e);return Number.isNaN(n.getTime())?null:n}function Me(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function it(e,t){const n=o=>String(o).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,n(e.getMonth()+1)).replace(/DD/g,n(e.getDate())).replace(/hh/g,n(e.getHours())).replace(/mm/g,n(e.getMinutes())).replace(/ss/g,n(e.getSeconds()))}function st(e,t,n){return n!=null?t?Me(e,n):e.toFixed(n):t?Me(e):String(e)}function me(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function we(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const n=me(e);return n==null?String(e):st(n,t.thousands===!0,t.digits)}case"percent":{const n=me(e);return n==null?String(e):`${Me(n*100,t.digits??2)}%`}case"date":{const n=t.pattern??"YYYY-MM-DD",o=e instanceof Date?e:Fe(String(e));return o?it(o,n):String(e)}default:return String(e)}}function Le(e,t){const n=e[t.field];if(n==null||n==="")return!1;if(typeof t.value=="number"){const s=me(n);if(s==null)return!1;switch(t.op){case">":return s>t.value;case">=":return s>=t.value;case"<":return s<t.value;case"<=":return s<=t.value;case"==":return s===t.value;case"!=":return s!==t.value}}const o=String(n),r=String(t.value);switch(t.op){case"==":return o===r;case"!=":return o!==r;case">":return o>r;case">=":return o>=r;case"<":return o<r;case"<=":return o<=r}return!1}const at=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function X(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function lt(e,t,n,o){const r=e[t];(typeof r!="number"||!Number.isFinite(r))&&o.push({path:`${n}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(r)}`})}function ge(e,t,n,o=[]){if(!X(e)){n.push({path:t,message:"组件应为对象"});return}const r=e.kind;typeof r!="string"?n.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):at.has(r)||o.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(r)},将以兜底方式渲染`});for(const l of["leftMm","topMm","widthMm","heightMm"])lt(e,l,t,n);typeof e.leftMm=="number"&&e.leftMm<-100&&n.push({path:`${t}.leftMm`,message:"几何数值异常(leftMm<-100)"});for(const l of["widthMm","heightMm"])typeof e[l]=="number"&&e[l]<0&&n.push({path:`${t}.${l}`,message:"组件尺寸不能为负数"});const s=e.table;if(s!==void 0){const l=`${t}.table`;if(!X(s))n.push({path:l,message:"逻辑表来源应为对象"});else{(typeof s.id!="string"||!s.id.trim())&&n.push({path:`${l}.id`,message:"逻辑表 ID 应为非空字符串"});const d=s.role;["header","body","group-header","subtotal","grand-total"].includes(d)||n.push({path:`${l}.role`,message:"未知逻辑表行角色"});const m=s.rowIndex;(typeof m!="number"||!Number.isInteger(m)||(d==="header"?m!==-1:m<0))&&n.push({path:`${l}.rowIndex`,message:"表头索引应为 -1,内容行索引应为非负整数"}),(!Array.isArray(s.columnKeys)||s.columnKeys.some(h=>typeof h!="string"))&&n.push({path:`${l}.columnKeys`,message:"逻辑列字段应为字符串数组"}),s.layout!==void 0&&s.layout!=="page"&&s.layout!=="wide"&&n.push({path:`${l}.layout`,message:"布局应为 page 或 wide"}),s.title!==void 0&&typeof s.title!="string"&&n.push({path:`${l}.title`,message:"逻辑表名称应为字符串"})}}const i=e.grid;i!==void 0&&(!X(i)||!Array.isArray(i.cells)?n.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):i.cells.forEach((l,d)=>{if(!Array.isArray(l)){n.push({path:`${t}.grid.cells.${d}`,message:"行应为数组"});return}l.forEach((m,h)=>{m!=null&&X(m)&&Array.isArray(m.children)&&m.children.forEach((f,u)=>{ge(f,`${t}.grid.cells.${d}.${h}.children.${u}`,n,o)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((l,d)=>{(!X(l)||!Array.isArray(l.segments))&&n.push({path:`${t}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):n.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function Ie(e,t,n,o=[]){if(!X(e)){n.push({path:t,message:"页应为对象"});return}const r=e.pageWidthMm,s=e.pageHeightMm;(typeof r!="number"||!Number.isFinite(r)||r<=0)&&n.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(r)}`}),(typeof s!="number"||!(s>0&&s<5e3))&&n.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(s)}`}),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${t}.layout`,message:"布局应为 page 或 wide"});const i=e.components;Array.isArray(i)?Array.isArray(i)&&i.forEach((a,l)=>ge(a,`${t}.components.${l}`,n,o)):n.push({path:`${t}.components`,message:"components 应为数组"})}function $e(e){const t=[],n=[],o=X(e)?e.pages:void 0;if(!Array.isArray(o))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{o.forEach((s,i)=>Ie(s,`$.pages.${i}`,t,n)),o.length>2e3&&n.push({path:"$.pages",message:`页数异常大(${o.length} 页),渲染与打印耗时可能显著增加`});const r=o.reduce((s,i)=>s+(X(i)&&Array.isArray(i.components)?i.components.length:0),0);r>5e4&&n.push({path:"$.pages",message:`组件总数异常大(${r} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:n}}function dt(e){const t=$e(e);if(!t.ok){const n=t.errors.slice(0,3).map(o=>`${o.path}: ${o.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${n}`)}return e.pages}function _e(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function ct(e,t){return t.heightMm-(e.layout==="wide"?t.marginBottomMm:e.marginBottomMm??t.marginBottomMm)}function De(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function ze(e,t){let n=e.textMetrics.get(t);if(!n){const o=g.resolveFontSize(t).fontSizePt;n={measureOptions:{fontSizePt:o,bold:t.bold,letterSpacingPt:t.letterSpacing===void 0?void 0:t.letterSpacing*72/96},lineMm:o*(t.lineHeight??g.LINE_HEIGHT)*25.4/72},e.textMetrics.set(t,n)}return n}function je(e,t){return t?.kind==="number"||t?.kind==="percent"?"right":t?.kind==="date"||e instanceof Date||typeof e=="boolean"?"center":typeof e=="number"&&Number.isFinite(e)?"right":"left"}function mt(e){if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e}function ft(e,t){const n=e.fontSizePt??g.DEFAULT_FONT_PT,o=e.paddingMm??1,r=e.columns.map(c=>c.align??c.style?.align??e.align??"left"),s=e.columns.map((c,w)=>({fontSize:n,verticalAlign:"middle",...c.style,align:r[w]==="auto"?"left":r[w]})),i=s.map((c,w)=>r[w]==="auto"?{left:c,center:{...c,align:"center"},right:{...c,align:"right"}}:void 0),a=e.columns.map((c,w)=>c.rules?.map(M=>{const E=i[w];if(E)return{left:{...E.left,...M.style},center:{...E.center,...M.style},right:{...E.right,...M.style}};const S={...s[w],...M.style};return{left:S,center:S,right:S}})),l=e.columns.map(c=>({fontSize:n,bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...c.style||{},...e.headerAlign===void 0?{}:{align:e.headerAlign},...e.headerStyle,...c.headerAlign===void 0?{}:{align:c.headerAlign},...c.headerStyle})),d=e.columns.map(c=>c.header);let m=e.rowHeightMm??0;for(let c=0;c<d.length;c++){const w=l[c],M=g.resolveFontSize(w).fontSizePt,E=C.wrapText(d[c],e.columns[c].widthMm-o*2,{fontSizePt:M,bold:w.bold},t),S=M*(w.lineHeight??g.LINE_HEIGHT)*25.4/72;m=Math.max(m,Math.max(E.length,1)*S+o*2)}const h=d.map((c,w)=>({text:c,style:l[w]})),f=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0},u=e.columns.map(c=>c.widthMm);return{fontSizePt:n,paddingMm:o,cellStyles:s,autoStyles:i,ruleStyles:a,textMetrics:new WeakMap,numberFormats:e.columns.map(c=>be(c.format)),borderStyle:f,headerHeightMm:m,headerGrid:{cells:[h],colWidthsMm:u,rowHeightsMm:[m]},colWidthsMm:u,columns:e.columns}}function Oe(e,t,n){const o=e.columns;let r=e.rowHeightFloorMm;const s=new Array(o.length);for(let i=0;i<o.length;i++){const a=o[i],l=t[a.field],d=e.autoStyles[i]?je(l,a.format):"left";let m=e.autoStyles[i]?.[d]??e.cellStyles[i];if(a.rules)for(let M=0;M<a.rules.length;M++){const E=a.rules[M];if(Le(t,E.when)){m=e.ruleStyles[i][M][d];break}}const h=a.format?we(l,a.format):De(l),f=ze(e,m),u=C.wrapText(h,a.widthMm-e.paddingMm*2,f.measureOptions,n);r=Math.max(r,u.length*f.lineMm+e.paddingMm*2);const c=mt(l),w={text:h,style:m};c!==void 0&&(w.value=c),typeof c=="number"&&e.numberFormats[i]!==void 0&&(w.numberFormat=e.numberFormats[i]),s[i]=w}return{grid:{cells:[s],colWidthsMm:e.colWidthsMm,rowHeightsMm:[r]},heightMm:r}}function We(e,t,n={}){const o=typeof n=="number"?{mmPerRow:n}:n,r=o.mmPerRow??0,s=o.measurer??C.heuristicMeasurer,i=[],a=[];let l=0;const d=h=>`${h}_${(++l).toString(36)}`,m=[];for(const[h,f]of e.pages.entries()){const u=_e(f),c=()=>ct(f,u),w=u.marginTopMm,M=[],E=(S=!1)=>{if(a.push({pageWidthMm:u.widthMm,pageHeightMm:u.heightMm,...f.layout===void 0?{}:{layout:f.layout},marginTopMm:u.marginTopMm,marginBottomMm:u.marginBottomMm,marginLeftMm:u.marginLeftMm,marginRightMm:u.marginRightMm,components:u.components}),M.length>0){const x=a.length;for(const T of M){const O={...T,text:String(T.text??"").replace(/\{page\}/g,String(x))};a[a.length-1].components.push(O),O.text.includes("{totalPages}")&&m.push(O)}}if(f.layout==="wide"){const x=a[a.length-1],T=x.components.reduce((L,P)=>Math.max(L,P.topMm+P.heightMm),0),O=S?f.marginBottomMm??0:0;x.pageHeightMm=Math.max(1,T+O),x.marginBottomMm=O}};for(const[S,x]of f.components.entries()){if(x.kind!=="list"){if(x.kind==="text"&&typeof x.text=="string"){const $=x.text;if($.includes("{page}")||$.includes("{totalPages}")){M.push(x);continue}}u.components.push(x);continue}const T=x,O=t[T.dataset];Array.isArray(O)||i.push(`数据集 ${T.dataset} 未提供数据,列表 ${T.id??""} 输出为空`);const L=Array.isArray(O)?O:[],P=T.columns.reduce(($,b)=>$+b.widthMm,0),v=P>T.widthMm?T.widthMm/P:1,p=v===1?T:{...T,columns:T.columns.map($=>({...$,widthMm:$.widthMm*v}))},y={id:`table:${h}:${S}`,columnKeys:T.columns.map($=>$.field),...T.layout===void 0?{}:{layout:T.layout},...T.title===void 0?{}:{title:T.title}};let B=0;const A={...ft(p,s),rowHeightFloorMm:p.rowHeightMm??0},k={kind:"rect",leftMm:T.leftMm,topMm:0,widthMm:T.widthMm,heightMm:A.headerHeightMm,grid:A.headerGrid,nid:d("listh"),table:{...y,role:"header",rowIndex:-1},style:A.borderStyle};let R=T.topMm;const I=($,b)=>{$.components.push({...k,topMm:b})};I(u,R),R+=A.headerHeightMm+r;const J=$=>{if(R+$>c()){E();const b=_e(f);u.components=b.components,u.heightMm=b.heightMm,f.layout==="wide"&&(u.marginTopMm=0,u.marginBottomMm=0);const N=f.layout==="wide"?0:T.topMm;p.headerEveryPage!==!1?(I(u,N),R=N+A.headerHeightMm):R=f.layout==="wide"?0:w}},Q=($,b,N,_)=>{const z=f.layout==="wide"?0:T.topMm,ee=p.headerEveryPage!==!1?z+A.headerHeightMm:f.layout==="wide"?0:w,oe=c()-ee;b>oe&&i.push(`列表 ${T.id??T.dataset} 行高 ${b.toFixed(2)}mm 超出单页可用高度 ${oe.toFixed(2)}mm,预览与打印可能截断内容`),J(b),u.components.push({kind:"rect",leftMm:T.leftMm,topMm:R,widthMm:T.widthMm,heightMm:b,grid:$,nid:d(N),table:{...y,role:_,rowIndex:B++},style:A.borderStyle}),R+=b},et=()=>Oe(A,{},s).heightMm,pe=($,b,N,_)=>{const z=[],ee=Math.max(1,Math.min(_,p.columns.length)),oe={fontSize:A.fontSizePt,...N};z.push({text:$,colSpan:ee,style:{bold:!0,...oe}});for(let Y=ee;Y<p.columns.length;Y++){const re=p.columns[Y],ie=b.get(re.field),de=A.autoStyles[Y]?.[je(ie?.value,re.format)]??A.cellStyles[Y];z.push({...ie,text:ie?.text??"",style:{...de,...oe}})}let ae=A.rowHeightFloorMm,le=0;for(const Y of z){let re=0;const ie=le+(Y.colSpan??1);for(;le<ie;le++)re+=A.colWidthsMm[le]??0;const de=ze(A,Y.style),nt=C.wrapText(Y.text??"",re-A.paddingMm*2,de.measureOptions,s);ae=Math.max(ae,nt.length*de.lineMm+A.paddingMm*2)}return{grid:{cells:[z],colWidthsMm:A.colWidthsMm,rowHeightsMm:[ae]},heightMm:ae}},tt=($,b)=>{let N=0;for(const _ of $){const z=typeof _[b]=="number"?_[b]:Number(_[b]);Number.isFinite(z)&&(N+=z)}return N},Ne=($,b)=>{const _=p.columns.find(ee=>ee.field===b)?.format??{kind:"number",thousands:!0},z=tt($,b);return{text:we(z,_),value:z,numberFormat:be(_)}},V=p.groupBy,Re=$=>{const b=p.columns.findIndex(N=>$.includes(N.field));return b>0?b:1},ne=[];if(V){const $=new Map;for(const b of L){const N=De(b[V.field]),_=$.get(N);_?_.push(b):$.set(N,[b])}for(const[b,N]of $){ne.push({kind:"groupHeader",label:(V.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const _ of N)ne.push({kind:"row",row:_});V.subtotal&&V.subtotal.length>0&&ne.push({kind:"subtotal",label:V.subtotalLabel??"小计",rows:N})}}else for(const $ of L)ne.push({kind:"row",row:$});const Ce=et();for(const $ of ne)if($.kind==="row"){const b=Oe(A,$.row,s);Q(b.grid,b.heightMm,"listr","body")}else if($.kind==="groupHeader"){const b=pe($.label,new Map,V?.headerStyle??{},p.columns.length);V?.keepWithNext!==!1&&R+b.heightMm+Ce>c()&&J(b.heightMm+Ce),Q(b.grid,b.heightMm,"listg","group-header")}else if($.kind==="subtotal"){const b=new Map;for(const _ of V.subtotal??[])b.set(_,Ne($.rows,_));const N=pe($.label,b,V?.subtotalStyle??{},Re(V.subtotal??[]));Q(N.grid,N.heightMm,"listst","subtotal")}if(p.grandTotal){const $=typeof p.grandTotal=="object"?p.grandTotal:void 0,b=$?.fields??V?.subtotal??[];if(b.length>0){const N=new Map;for(const z of b)N.set(z,Ne(L,z));const _=pe($?.label??"合计",N,$?.style??{},Re(b));Q(_.grid,_.heightMm,"listgt","grand-total")}else i.push(`列表 ${T.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}E(!0)}for(const h of m){const f=h.text;typeof f=="string"&&f.includes("{totalPages}")&&(h.text=f.replace(/\{totalPages\}/g,String(a.length)))}return{plan:{schemaVersion:C.RENDER_PLAN_SCHEMA_VERSION,pages:a},warnings:i}}const ht={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function D(e,t){return t?.classNames?.[e]??ht[e]}class G{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,o,r=2){return this.add(t,`${g.round(g.mmToPx(n,o),r)}px`)}toString(){let t="";for(const[n,o]of this.props)t+=`${n}:${o};`;return t}applyTo(t){const n=this.toString();n&&(t.style.cssText=n)}}function Ve(e,t,n){const o=t.style||{};e.add("color",o.color).add("background-color",o.backgroundColor).add("font-family",o.fontFamily).add("font-weight",o.bold?"700":void 0).add("font-style",o.italic?"italic":void 0).add("text-decoration",o.underline?"underline":void 0).add("letter-spacing",o.letterSpacing!=null?`${o.letterSpacing}pt`:void 0).add("opacity",o.opacity!=null?String(o.opacity):void 0).add("transform",o.rotateDeg?`rotate(${o.rotateDeg}deg)`:void 0);const r=g.resolveFontSize(o,n);e.add("font-size",`${g.round(r.fontSizePx,2)}px`)}function gt(e,t,n,o,r){const s=r.createElement("table");if(s.className=D("grid",o),new G().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(s),e.colWidthsMm){const d=r.createElement("colgroup");for(const m of e.colWidthsMm){const h=r.createElement("col");new G().mm("width",m,n).applyTo(h),d.appendChild(h)}s.appendChild(d)}const i=g.resolveBoxBorders(t.style),a=g.resolveStroke(t.style),l=i.inner?`${g.round(a.widthPt*n/72,2)}px solid ${a.color}`:"";return e.cells.forEach((d,m)=>{const h=r.createElement("tr");h.className=D("row",o),e.rowHeightsMm?.[m]!=null&&new G().mm("height",e.rowHeightsMm[m],n).applyTo(h),(d||[]).forEach(f=>{const u=r.createElement("td");u.className=D("cell",o),f?.colSpan&&(u.colSpan=f.colSpan),f?.rowSpan&&(u.rowSpan=f.rowSpan);const c=new G;if(l&&c.add("border",l),f?.style){const w=f.style;c.add("text-align",w.align).add("vertical-align",w.verticalAlign).add("background-color",w.backgroundColor).add("color",w.color).add("font-weight",w.bold?"700":void 0),c.add("font-size",`${g.round(g.resolveFontSize(w,n).fontSizePx,2)}px`)}if(c.applyTo(u),f?.text!=null&&(u.textContent=f.text),f?.children?.length)for(const w of f.children)u.appendChild(Se(w,n,o,r));h.appendChild(u)}),s.appendChild(h)}),s}function ut(e,t,n,o){const r=o.createElement("div");r.className=D("text",n);const s=e.style||{},i=new G().add("text-align",s.align).add("display","flex").add("flex-direction","column").add("justify-content",s.verticalAlign==="middle"?"center":s.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(Ve(i,e,t),i.applyTo(r),C.isRichText(e)){const a=o.createElement("div");a.className=D("rich",n);for(const l of e.richParagraphs){const d=o.createElement("div");d.className=D("paragraph",n),new G().add("text-align",l.align).add("line-height",l.lineHeight!=null?String(l.lineHeight):void 0).mm("margin-top",l.spaceBeforeMm??0,t).mm("margin-bottom",l.spaceAfterMm??0,t).mm("text-indent",l.indentMm??0,t).applyTo(d);for(const h of l.segments||[]){const f=o.createElement("span");if(f.className=D("segment",n),f.textContent=h.kind==="field"?h.field??"":h.text??"",h.style){const u=new G().add("color",h.style.color).add("font-weight",h.style.bold?"700":void 0);u.add("font-size",`${g.round(g.resolveFontSize(h.style,t).fontSizePx,2)}px`),u.applyTo(f)}d.appendChild(f)}a.appendChild(d)}return r.appendChild(a),r}if(Array.isArray(e.lines)&&e.lines.length>0){const a=o.createElement("div");a.className=D("lines",n),s.lineHeight!=null&&new G().add("line-height",String(s.lineHeight)).applyTo(a);for(const l of e.lines){const d=o.createElement("div");d.className=D("line",n),d.textContent=l,a.appendChild(d)}return r.appendChild(a),r}return r.textContent=e.text??"",r}function pt(e,t,n){const o=n.createElement("img");return o.className=D("image",t),o.src=e.imageData,new G().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(o),o.alt=e.kind,o}function He(e,t,n,o){const r=o.createElement("div");r.className=D("shape",n);const s=e.style||{},i=g.resolveStroke(s),a=g.resolveBoxBorders(s),l=`${g.round(i.widthPt*t/72,2)}px solid ${i.color}`,d=new G;return e.grid||e.kind==="rect"?(a.top&&d.add("border-top",l),a.right&&d.add("border-right",l),a.bottom&&d.add("border-bottom",l),a.left&&d.add("border-left",l)):e.kind==="ellipse"?(a.inner&&d.add("border",l).add("border-radius","50%"),s.backgroundColor&&d.add("background-color",s.backgroundColor)):e.kind==="line"&&d.add("height","0").add("border-top",l),d.add("box-sizing","border-box").add("width","100%").add("height","100%"),d.applyTo(r),r}function Se(e,t,n,o){const r=o.createElement("div");r.className=`${D("comp",n)} mr-kind-${e.kind}`;const s=new G().add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(Ve(s,e,t),s.applyTo(r),C.isImageBackedComponent(e))return r.appendChild(pt(e,n,o)),r;if(e.kind==="text")return r.appendChild(ut(e,t,n,o)),r;if(e.grid){const a=He(e,t,n,o);return a.appendChild(gt(e.grid,e,t,n,o)),r.appendChild(a),r}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return r.appendChild(He(e,t,n,o)),r;const i=o.createElement("div");return i.className=D("unknown",n),i.textContent=e.fallbackText??"",r.appendChild(i),r}function Ue(e,t,n,o){const r=o.createElement("div");r.className=D("page",n),new G().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",g.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(r);for(const s of e.components)r.appendChild(Se(s,t,n,o));return r}function yt(e,t,n={}){const o=n.dpi??96,r=t.createElement("div");return r.className=D("root",n),r.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(s=>{r.appendChild(Ue(s,o,n,t))}),r}function Ge(e){return ot.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const Te=96/25.4;function ve(e,t=96){const n=t/96*Te;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Mt(e,t,n){const o=document.createElement("canvas"),{widthPx:r,heightPx:s}=ve(e,n);o.width=Math.round(r*t),o.height=Math.round(s*t),o.style.width=`${r}px`,o.style.height=`${s}px`;const i=o.getContext("2d");if(!i)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return i.scale(t,t),i.fillStyle="#ffffff",i.fillRect(0,0,r,s),{canvas:o,ctx:i}}function bt(e,t=96){return g.resolveFontSize(e,t).fontSizePx}function Je(e,t,n,o,r,s,i,a="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${i}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,d=t.text===""?[""]:t.text.split(`
2
+ `),m=d.length*l;let h=o;a==="middle"?h=o+(s-m)/2:a==="bottom"&&(h=o+s-m),d.forEach((f,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const c=t.align==="center"?n+r/2:t.align==="right"?n+r:n;e.fillText(f,c,h+u*l+t.fontSizePx*.8,r)}),e.textAlign="left"}function wt(e,t,n,o,r,s,i,a,l,d,m){const h=g.resolveGridLayout(t,s/a,i/a),f=g.resolveBoxBorders(n.style),u=g.resolveStroke(n.style);for(const c of h.cells){const w=c.cell.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(o+c.xMm*a,r+c.yMm*a,c.widthMm*a,c.heightMm*a))}if(f.inner){e.strokeStyle=u.color,e.lineWidth=g.ptToPx(u.widthPt,l);for(const c of h.edges)e.beginPath(),c.kind==="v"?(e.moveTo(o+c.pos*a,r+c.from*a),e.lineTo(o+c.pos*a,r+c.to*a)):(e.moveTo(o+c.from*a,r+c.pos*a),e.lineTo(o+c.to*a,r+c.pos*a)),e.stroke();e.beginPath(),f.top&&(e.moveTo(o,r),e.lineTo(o+s,r)),f.right&&(e.moveTo(o+s,r),e.lineTo(o+s,r+i)),f.bottom&&(e.moveTo(o+s,r+i),e.lineTo(o,r+i)),f.left&&(e.moveTo(o,r+i),e.lineTo(o,r)),e.stroke()}for(const c of h.cells){const w=typeof c.cell.text=="string"?c.cell.text:"";if(!w)continue;const M=c.cell.style,E=M?.fontSize??g.DEFAULT_FONT_PT,S=C.wrapText(w,c.widthMm-1,{fontSizePt:E},m).join(`
3
+ `);Je(e,{text:S,fontSizePx:g.resolveFontSize(M,l).fontSizePx,bold:M?.bold??!1,color:M?.color??g.resolveTextColor(n.style,g.DEFAULT_TEXT_COLOR),align:M?.align??"left",lineHeight:g.LINE_HEIGHT},o+(c.xMm+.5)*a,r+c.yMm*a,Math.max(0,(c.widthMm-1)*a),c.heightMm*a,d,M?.verticalAlign??"middle")}}function Ye(e,t,n,o,r,s){const i=t.leftMm*n,a=t.topMm*n,l=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(t.grid){wt(e,t.grid,t,i,a,l,d,n,o,r,s);return}switch(t.kind){case"text":{const h=m.fontSize??g.DEFAULT_FONT_PT,f=C.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(c=>c.text??c.field??"").join("")).join(`
4
4
  `):Array.isArray(t.lines)&&t.lines.length>0?t.lines.join(`
5
- `):d.wrapText(t.text??"",t.widthMm,{fontSizePt:h},i).join(`
6
- `);Te(e,{text:c,fontSizePx:d.resolveFontSize(f,r).fontSizePx,bold:f.bold??!1,color:d.resolveTextColor(f),align:f.align??"left",lineHeight:d.resolveLineHeight(f)},a,s,l,m,o,f.verticalAlign);break}case"rect":{const h=d.resolveStroke(f),c=d.resolveBoxBorders(f);f.backgroundColor&&(e.fillStyle=f.backgroundColor,e.fillRect(a,s,l,m)),c.inner&&(e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),e.beginPath(),c.top&&(e.moveTo(a,s),e.lineTo(a+l,s)),c.right&&(e.moveTo(a+l,s),e.lineTo(a+l,s+m)),c.bottom&&(e.moveTo(a+l,s+m),e.lineTo(a,s+m)),c.left&&(e.moveTo(a,s+m),e.lineTo(a,s)),e.stroke());break}case"line":{const h=d.resolveStroke({...f,borderColor:f.lineColor??f.borderColor});e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),e.beginPath(),e.moveTo(a,s+m/2),e.lineTo(a+l,s+m/2),e.stroke();break}case"ellipse":{const h=d.resolveStroke(f);e.strokeStyle=h.color,e.lineWidth=d.ptToPx(h.widthPt,r),f.backgroundColor&&(e.fillStyle=f.backgroundColor,e.beginPath(),e.ellipse(a+l/2,s+m/2,l/2,m/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+l/2,s+m/2,l/2,m/2,0,0,Math.PI*2),e.stroke();break}}}async function Ve(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...o}=t,{canvases:i}=Pe(e,o),a=n==="jpeg"?"image/jpeg":"image/png",s=[];for(const l of i)s.push(await new Promise(m=>l.toBlob(f=>m(f),a,r))??new Blob([],{type:a}));return{blobs:s}}function Pe(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*te,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,s=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),m=[];for(let f=s;f<=l;f++){const h=e.pages[f],{canvas:c,ctx:u}=je(h,n,r);for(const g of h.components)ve(u,g,o,r,i,a);m.push(c)}return{canvases:m}}function Ye(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,o=r/96*te,i=t.fontFamily??'"Microsoft YaHei", sans-serif',a=t.measurer??d.heuristicMeasurer,s=t.overscan??1,l=t.gapPx??18,m=t.pagesPerFrame??1,f=e.pages.map(b=>b.pageHeightMm*o),h=Math.max(1,...e.pages.map(b=>b.pageWidthMm*o)),c={start:0,end:-1};let u=null,g=null,S=null,P=null,x=[],w=0,v=[];function p(){const b=u;b.innerHTML="",g=document.createElement("div"),g.style.cssText=`width:${h}px;margin:0 auto;`,S=document.createElement("div"),P=document.createElement("div"),g.appendChild(S),x=[];const H=Math.min(e.pages.length,3+s*2);for(let _=0;_<H;_++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,g.appendChild(T),x.push(T)}g.appendChild(P),b.appendChild(g)}function E(b,H){const _=e.pages[H],{widthPx:T,heightPx:N}=ne(_,r);let R=b.firstElementChild;(!R||R.tagName!=="CANVAS")&&(R=document.createElement("canvas"),b.innerHTML="",b.appendChild(R)),R.width=Math.round(T*n),R.height=Math.round(N*n),R.style.width=`${T}px`,R.style.height=`${N}px`;const I=R.getContext("2d");if(I){I.setTransform(1,0,0,1,0,0),I.scale(n,n),I.fillStyle="#ffffff",I.fillRect(0,0,T,N);for(const Y of _.components)ve(I,Y,o,r,i,a);R.dataset.canvasPage=String(H),b.style.height=`${N}px`,b.style.width=`${T}px`}}function G(b){c.start=b.start,c.end=b.end,S.style.height=`${b.start*l+f.slice(0,b.start).reduce((T,N)=>T+N,0)}px`;const H=e.pages.length-1-b.end;P.style.height=`${H*l+f.slice(b.end+1).reduce((T,N)=>T+N,0)}px`;const _=b.end-b.start+1;x.forEach((T,N)=>{if(N<_){T.style.display="";const R=b.start+N;T.style.height=`${f[R]??0}px`}else T.style.display="none"}),v=[];for(let T=b.start;T<=b.end;T++){const N=x[T-b.start];if(!N)continue;N.firstElementChild?.dataset?.canvasPage!==String(T)&&v.push(T)}C()}function C(){w||v.length===0||(w=requestAnimationFrame(()=>{w=0;let b=Math.max(1,m);for(;v.length>0&&b-- >0;){const H=v.shift(),_=x[H-c.start];_&&E(_,H)}v.length>0&&C()}))}function k(){w||(w=requestAnimationFrame(()=>{w=0;const b=u,H=Se({pageHeightsPx:f,viewportHeightPx:b.clientHeight,scrollTopPx:b.scrollTop,overscan:s,gapPx:l});H.start!==c.start||H.end!==c.end?G(H):C()}))}let U=null;return{attach(b){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=b,p(),b.addEventListener("scroll",k,{passive:!0}),typeof ResizeObserver<"u"&&(U=new ResizeObserver(()=>k()),U.observe(b)),k()},destroy(){w&&cancelAnimationFrame(w),w=0,U?.disconnect(),U=null,u?.removeEventListener("scroll",k),v=[],g?.remove(),u=null},window(){return{...c}}}}function re(e,t,n){let r,o;if(typeof e=="string"){const i=d.PAPER_SIZES[e];if(!i)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);r=i.widthMm,o=i.heightMm}else typeof e=="number"?(r=e,o=t??297):(r=e.widthMm,o=e.heightMm);return n?{widthMm:o,heightMm:r}:{widthMm:r,heightMm:o}}class Ee{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const i=r!=null&&!("margins"in r)&&!("landscape"in r)&&("marginTopMm"in r||"marginBottomMm"in r||"marginLeftMm"in r||"marginRightMm"in r)?{margins:r}:typeof n=="number"?r??{}:n,{widthMm:a,heightMm:s}=re(t,typeof n=="number"?n:void 0,i.landscape),l=i.margins??{};return this.pending=new xe(this,{widthMm:a,heightMm:s,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class xe{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},r={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:r}),this}list(t,n,r,o={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...o}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,o={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:o}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,r,o){return this.components.push({kind:"qrcode",leftMm:r,topMm:o,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function qe(){return new Ee}function O(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Je(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const t=e.paper===void 0?"a4":e.paper;if(typeof t!="string"&&(typeof t!="object"||t===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof t=="string"&&!Object.prototype.hasOwnProperty.call(d.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(d.PAPER_SIZES).join("/")})`);const{widthMm:n,heightMm:r}=re(t,void 0,e.landscape);if(O(n,"纸张 widthMm"),O(r,"纸张 heightMm"),e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const o=e.margins??{},i={marginTopMm:o.marginTopMm===void 0?10:o.marginTopMm,marginBottomMm:o.marginBottomMm===void 0?10:o.marginBottomMm,marginLeftMm:o.marginLeftMm===void 0?10:o.marginLeftMm,marginRightMm:o.marginRightMm===void 0?10:o.marginRightMm};for(const[p,E]of Object.entries(i))O(E,p,!0);const a=n-i.marginLeftMm-i.marginRightMm,s=r-i.marginTopMm-i.marginBottomMm;if(a<=0||s<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const l=e.dataset===void 0?"detail":e.dataset;if(typeof l!="string"||!l.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const m=e.titleHeightMm===void 0?10:e.titleHeightMm,f=e.titleGapMm===void 0?4:e.titleGapMm;O(m,"titleHeightMm"),O(f,"titleGapMm",!0);const h=e.title!==void 0&&e.title.length>0,c=h?m+f:0;if(c>=s)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const u=e.listOptions??{};for(const p of["fontSizePt","rowHeightMm","paddingMm"]){const E=u[p];E!==void 0&&O(E,`listOptions.${p}`,p==="paddingMm")}let g=0,S=0;for(const[p,E]of e.columns.entries()){if(!E||typeof E.header!="string"||typeof E.field!="string"||!E.field.trim())throw new Error(`columns[${p}] 需要字符串 header 与非空 field`);E.flex!==void 0&&O(E.flex,`columns[${p}].flex`),E.widthMm!==void 0?(O(E.widthMm,`columns[${p}].widthMm`),g+=E.widthMm):S=Math.max(S,E.flex??1)}if(g>a)throw new Error(`固定列宽 ${g}mm 超出页面可用宽度 ${a}mm`);const P=a-g;if(S>0&&P<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const x=S>0?e.columns.reduce((p,E)=>p+(E.widthMm===void 0?(E.flex??1)/S:0),0):0,w=e.columns.map(({widthMm:p,flex:E,...G},C)=>{const k=p??P*((E??1)/S)/x;return O(k,`columns[${C}] 分配后的 widthMm`),{...G,widthMm:k}}),v={widthMm:n,heightMm:r,...i,components:[]};return h&&v.components.push({kind:"text",text:e.title,leftMm:i.marginLeftMm,topMm:i.marginTopMm,widthMm:a,heightMm:m,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),v.components.push({...u,kind:"list",dataset:l,columns:w,leftMm:i.marginLeftMm,topMm:i.marginTopMm+c,widthMm:S>0?a:g}),e.params===void 0?{pages:[v]}:{params:e.params,pages:[v]}}function Ze(e){if(!("mapData"in e))return e;const{load:t,mapData:n,...r}=e;return{...r,load:async o=>{const i=await t(o);W(o.signal);try{return n(i,o)}catch(a){throw new D("validate",`报表 ${o.reportId} 数据映射失败`,a)}}}}class D extends Error{constructor(t,n,r){super(n),this.name="ReportSourceError",this.code=t,this.cause=r}}function oe(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function W(e){if(e?.aborted)throw oe(e)}function Ke(e,t){return t?new Promise((n,r)=>{const o=()=>t.removeEventListener("abort",i),i=()=>{o(),r(oe(t))};t.addEventListener("abort",i,{once:!0}),t.aborted&&i(),Promise.resolve(e).then(a=>{o(),n(a)},a=>{o(),r(a)})}):Promise.resolve(e)}function Xe(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new D("validate",`报表 ${t} 的数据集应为对象`);for(const[n,r]of Object.entries(e))if(!Array.isArray(r)||r.some(o=>!o||typeof o!="object"||Array.isArray(o)))throw new D("validate",`报表 ${t} 的数据集 ${n} 应为对象数组`)}function Qe(e,t={}){function n(o){const i=Object.prototype.hasOwnProperty.call(e,o)?e[o]:void 0;if(!i)throw new D("config",`未注册报表 ${o}`);return i}return Object.assign(async({reportIds:o,params:i,signal:a,onWarning:s})=>{if(W(a),o.length===0)throw new D("config","缺少报表 ID");const l=o.map(n),m=[],f=[];for(const[g,S]of l.entries()){W(a);const P=o[g],x={reportId:P,params:{...i},signal:a};let w;try{w=await Ke(S.load?S.load(x):S.datasets??{},a)}catch(p){throw a?.aborted?oe(a):p instanceof D?p:new D("fetch",`报表 ${P} 取数失败:${p instanceof Error?p.message:String(p)}`,p)}W(a),Xe(w,P);let v;try{v=we(S.template,w,S.pagination)}catch(p){throw new D("validate",`报表 ${P} 排版失败:${p instanceof Error?p.message:String(p)}`,p)}for(const p of v.plan.pages)m.push(p);f.push(...v.warnings.map(p=>`${P}: ${p}`))}W(a);const h={schemaVersion:d.RENDER_PLAN_SCHEMA_VERSION,pages:m},c=Q(h);if(!c.ok)throw new D("validate",`渲染计划校验失败:${c.errors.slice(0,3).map(g=>`${g.path}: ${g.message}`).join("; ")}`);f.push(...c.warnings.map(g=>`${g.path}: ${g.message}`));const u=s??t.onWarning??(g=>console.warn("[mach-report]",g));for(const g of f)W(a),u(g);return W(a),h},{getParamDefs:o=>Ce.getReportParamDefs(e,o)})}exports.CSS_DPI=d.CSS_DPI;exports.DEFAULT_BORDER_PT=d.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=d.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=d.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=d.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=d.LINE_HEIGHT;exports.MM_PER_INCH=d.MM_PER_INCH;exports.PAPER_SIZES=d.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=d.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_MACH=d.SCHEMA_VERSION_MACH;exports.charWidthEm=d.charWidthEm;exports.createCanvasMeasurer=d.createCanvasMeasurer;exports.createHeuristicMeasurer=d.createHeuristicMeasurer;exports.heuristicMeasurer=d.heuristicMeasurer;exports.isImageBackedComponent=d.isImageBackedComponent;exports.isRichText=d.isRichText;exports.measureTextMm=d.measureTextMm;exports.mmToPx=d.mmToPx;exports.mmToPxFactor=d.mmToPxFactor;exports.ptToPx=d.ptToPx;exports.pxToMm=d.pxToMm;exports.resolveBoxBorders=d.resolveBoxBorders;exports.resolveFontSize=d.resolveFontSize;exports.resolveLineHeight=d.resolveLineHeight;exports.resolveStroke=d.resolveStroke;exports.resolveTextColor=d.resolveTextColor;exports.round=d.round;exports.wrapText=d.wrapText;exports.resolveGridLayout=fe.resolveGridLayout;exports.PageBuilder=xe;exports.ReportSourceError=D;exports.TemplateBuilder=Ee;exports.assertRenderPlan=Le;exports.classOf=L;exports.computePageWindow=Se;exports.createCanvasPager=Ye;exports.createReportSource=Qe;exports.createTableTemplate=Je;exports.createTemplate=qe;exports.defineReport=Ze;exports.evalStyleRule=ue;exports.formatValue=K;exports.measurePageSizePx=ne;exports.paginateTemplate=we;exports.parseDateLocal=ge;exports.planFontSizePx=Ge;exports.renderComponent=ee;exports.renderPage=ye;exports.renderPlan=We;exports.renderPlanToCanvas=Pe;exports.renderPlanToImages=Ve;exports.resolvePaper=re;exports.toNumber=q;exports.validateComponent=X;exports.validatePage=pe;exports.validateRenderPlan=Q;
5
+ `):C.wrapText(t.text??"",t.widthMm,{fontSizePt:h},s).join(`
6
+ `);Je(e,{text:f,fontSizePx:g.resolveFontSize(m,o).fontSizePx,bold:m.bold??!1,color:g.resolveTextColor(m),align:m.align??"left",lineHeight:g.resolveLineHeight(m)},i,a,l,d,r,m.verticalAlign);break}case"rect":{const h=g.resolveStroke(m),f=g.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(i,a,l,d)),f.inner&&(e.strokeStyle=h.color,e.lineWidth=g.ptToPx(h.widthPt,o),e.beginPath(),f.top&&(e.moveTo(i,a),e.lineTo(i+l,a)),f.right&&(e.moveTo(i+l,a),e.lineTo(i+l,a+d)),f.bottom&&(e.moveTo(i+l,a+d),e.lineTo(i,a+d)),f.left&&(e.moveTo(i,a+d),e.lineTo(i,a)),e.stroke());break}case"line":{const h=g.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=g.ptToPx(h.widthPt,o),e.beginPath(),e.moveTo(i,a+d/2),e.lineTo(i+l,a+d/2),e.stroke();break}case"ellipse":{const h=g.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=g.ptToPx(h.widthPt,o),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(i+l/2,a+d/2,l/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(i+l/2,a+d/2,l/2,d/2,0,0,Math.PI*2),e.stroke();break}}}async function $t(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:o=.92,...r}=t,{canvases:s}=qe(e,r),i=n==="jpeg"?"image/jpeg":"image/png",a=[];for(const l of s)a.push(await new Promise(d=>l.toBlob(m=>d(m),i,o))??new Blob([],{type:i}));return{blobs:a}}function qe(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=t.dpi??96,r=o/96*Te,s=t.fontFamily??'"Microsoft YaHei", sans-serif',i=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),d=[];for(let m=a;m<=l;m++){const h=e.pages[m],{canvas:f,ctx:u}=Mt(h,n,o);for(const c of h.components)Ye(u,c,r,o,s,i);d.push(f)}return{canvases:d}}function St(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=t.dpi??96,r=o/96*Te,s=t.fontFamily??'"Microsoft YaHei", sans-serif',i=t.measurer??C.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,d=t.pagesPerFrame??1,m=e.pages.map(y=>y.pageHeightMm*r),h=Math.max(1,...e.pages.map(y=>y.pageWidthMm*r)),f={start:0,end:-1};let u=null,c=null,w=null,M=null,E=[],S=0,x=[];function T(){const y=u;y.innerHTML="",c=document.createElement("div"),c.style.cssText=`width:${h}px;margin:0 auto;`,w=document.createElement("div"),M=document.createElement("div"),c.appendChild(w),E=[];const B=Math.min(e.pages.length,3+a*2);for(let A=0;A<B;A++){const k=document.createElement("div");k.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,c.appendChild(k),E.push(k)}c.appendChild(M),y.appendChild(c)}function O(y,B){const A=e.pages[B],{widthPx:k,heightPx:R}=ve(A,o);let I=y.firstElementChild;(!I||I.tagName!=="CANVAS")&&(I=document.createElement("canvas"),y.innerHTML="",y.appendChild(I)),I.width=Math.round(k*n),I.height=Math.round(R*n),I.style.width=`${k}px`,I.style.height=`${R}px`;const J=I.getContext("2d");if(J){J.setTransform(1,0,0,1,0,0),J.scale(n,n),J.fillStyle="#ffffff",J.fillRect(0,0,k,R);for(const Q of A.components)Ye(J,Q,r,o,s,i);I.dataset.canvasPage=String(B),y.style.height=`${R}px`,y.style.width=`${k}px`}}function L(y){f.start=y.start,f.end=y.end,w.style.height=`${y.start*l+m.slice(0,y.start).reduce((k,R)=>k+R,0)}px`;const B=e.pages.length-1-y.end;M.style.height=`${B*l+m.slice(y.end+1).reduce((k,R)=>k+R,0)}px`;const A=y.end-y.start+1;E.forEach((k,R)=>{if(R<A){k.style.display="";const I=y.start+R;k.style.height=`${m[I]??0}px`}else k.style.display="none"}),x=[];for(let k=y.start;k<=y.end;k++){const R=E[k-y.start];if(!R)continue;R.firstElementChild?.dataset?.canvasPage!==String(k)&&x.push(k)}P()}function P(){S||x.length===0||(S=requestAnimationFrame(()=>{S=0;let y=Math.max(1,d);for(;x.length>0&&y-- >0;){const B=x.shift(),A=E[B-f.start];A&&O(A,B)}x.length>0&&P()}))}function v(){S||(S=requestAnimationFrame(()=>{S=0;const y=u,B=Ge({pageHeightsPx:m,viewportHeightPx:y.clientHeight,scrollTopPx:y.scrollTop,overscan:a,gapPx:l});B.start!==f.start||B.end!==f.end?L(B):P()}))}let p=null;return{attach(y){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=y,T(),y.addEventListener("scroll",v,{passive:!0}),typeof ResizeObserver<"u"&&(p=new ResizeObserver(()=>v()),p.observe(y)),v()},destroy(){S&&cancelAnimationFrame(S),S=0,p?.disconnect(),p=null,u?.removeEventListener("scroll",v),x=[],c?.remove(),u=null},window(){return{...f}}}}function Ee(e,t,n){let o,r;if(typeof e=="string"){const s=g.PAPER_SIZES[e];if(!s)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(g.PAPER_SIZES).join("/")})`);o=s.widthMm,r=s.heightMm}else typeof e=="number"?(o=e,r=t??297):(o=e.widthMm,r=e.heightMm);return n?{widthMm:r,heightMm:o}:{widthMm:o,heightMm:r}}class Ke{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",n={},o){this.collect();const s=o!=null&&!("margins"in o)&&!("landscape"in o)&&("marginTopMm"in o||"marginBottomMm"in o||"marginLeftMm"in o||"marginRightMm"in o)?{margins:o}:typeof n=="number"?o??{}:n,{widthMm:i,heightMm:a}=Ee(t,typeof n=="number"?n:void 0,s.landscape),l=s.margins??{};return this.pending=new Xe(this,{widthMm:i,heightMm:a,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class Xe{constructor(t,n){this.parent=t,this.page=n,this.components=[]}text(t,n={},o={}){return this.components.push({kind:"text",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??60,heightMm:n.heightMm??8,text:t,style:o}),this}list(t,n,o,r={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:o,...r}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,o,r={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:o,heightMm:.5,style:r}),this}barcode(t,n){return this.components.push({kind:"barcode",leftMm:n.leftMm??0,topMm:n.topMm??0,widthMm:n.widthMm??40,heightMm:n.heightMm??12,fallbackText:t}),this}qrcode(t,n,o,r){return this.components.push({kind:"qrcode",leftMm:o,topMm:r,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Tt(){return new Ke}function U(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function ce(e,t,n){if(e!==void 0&&!["left","center","right","justify",...n?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${n?"/auto":""}`)}function vt(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const t=e.layout??"page";if(t!=="page"&&t!=="wide")throw new Error("layout 必须是 page 或 wide");if(t==="wide"&&(e.paper!==void 0||e.landscape!==void 0))throw new Error('宽表布局不能同时指定 paper 或 landscape;标准纸型请使用 layout: "page"');if(t!=="wide"&&e.columnWidthMm!==void 0)throw new Error('columnWidthMm 仅适用于 layout: "wide"');const n=e.columnWidthMm??30;U(n,"columnWidthMm");const o=e.paper===void 0?"a4":e.paper;if(typeof o!="string"&&(typeof o!="object"||o===null)||e.landscape!==void 0&&typeof e.landscape!="boolean")throw new Error("paper 必须是纸张预设名或 { widthMm, heightMm } 对象,landscape 必须是布尔值");if(typeof o=="string"&&!Object.prototype.hasOwnProperty.call(g.PAPER_SIZES,o))throw new Error(`未知纸张预设 "${o}"(可用:${Object.keys(g.PAPER_SIZES).join("/")})`);const r=Ee(o,void 0,e.landscape);let s=r.widthMm;const i=r.heightMm;if(U(s,"纸张 widthMm"),U(i,"纸张 heightMm"),e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const a=e.margins??{},l={marginTopMm:a.marginTopMm===void 0?10:a.marginTopMm,marginBottomMm:a.marginBottomMm===void 0?10:a.marginBottomMm,marginLeftMm:a.marginLeftMm===void 0?10:a.marginLeftMm,marginRightMm:a.marginRightMm===void 0?10:a.marginRightMm};for(const[P,v]of Object.entries(l))U(v,P,!0);let d=s-l.marginLeftMm-l.marginRightMm;const m=i-l.marginTopMm-l.marginBottomMm;if(t==="page"&&d<=0||m<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const h=e.dataset===void 0?"detail":e.dataset;if(typeof h!="string"||!h.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const f=e.titleHeightMm===void 0?10:e.titleHeightMm,u=e.titleGapMm===void 0?4:e.titleGapMm;U(f,"titleHeightMm"),U(u,"titleGapMm",!0);const c=e.title!==void 0&&e.title.length>0,w=c?f+u:0;if(w>=m)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const M=e.listOptions??{};ce(M.align,"listOptions.align",!0),ce(M.headerAlign,"listOptions.headerAlign",!1);for(const P of["fontSizePt","rowHeightMm","paddingMm"]){const v=M[P];v!==void 0&&U(v,`listOptions.${P}`,P==="paddingMm")}let E=0,S=0;for(const[P,v]of e.columns.entries()){if(!v||typeof v.header!="string"||typeof v.field!="string"||!v.field.trim())throw new Error(`columns[${P}] 需要字符串 header 与非空 field`);ce(v.align,`columns[${P}].align`,!0),ce(v.headerAlign,`columns[${P}].headerAlign`,!1),v.flex!==void 0&&U(v.flex,`columns[${P}].flex`),v.widthMm!==void 0?(U(v.widthMm,`columns[${P}].widthMm`),E+=v.widthMm):S=Math.max(S,v.flex??1)}if(t==="page"&&E>d)throw new Error(`固定列宽 ${E}mm 超出页面可用宽度 ${d}mm`);const x=d-E;if(t==="page"&&S>0&&x<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const T=S>0?e.columns.reduce((P,v)=>P+(v.widthMm===void 0?(v.flex??1)/S:0),0):0,O=e.columns.map(({widthMm:P,flex:v,...p},y)=>{const B=P??(t==="wide"?n*(v??1):x*((v??1)/S)/T);return U(B,`columns[${y}] 分配后的 widthMm`),{...p,widthMm:B}});t==="wide"&&(d=O.reduce((P,v)=>P+v.widthMm,0),U(d,"宽表总列宽"),s=d+l.marginLeftMm+l.marginRightMm,U(s,"宽表总宽度"));const L={widthMm:s,heightMm:i,...l,components:[],...t==="wide"?{layout:t}:{}};return c&&L.components.push({kind:"text",text:e.title,leftMm:l.marginLeftMm,topMm:l.marginTopMm,widthMm:d,heightMm:f,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),L.components.push({align:"auto",headerAlign:"center",...M,kind:"list",...t==="wide"?{layout:t}:{},...c?{title:e.title}:{},dataset:h,columns:O,leftMm:l.marginLeftMm,topMm:l.marginTopMm+w,widthMm:t==="wide"||S>0?d:E}),e.params===void 0?{pages:[L]}:{params:e.params,pages:[L]}}const Pe="1.0";class Z extends Error{constructor(t){super(`模板校验失败:${t.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ")}`),this.errors=t,this.name="ReportTemplateError"}}const Et=new Set(["__proto__","prototype","constructor"]),Pt=new Set(["schemaVersion","id","name","revision","description","template"]),At=new Set(["left","center","right","justify"]),ye=2e5,xt=64,Ae=1e7;function H(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function xe(e,t){const n=new Set;let o=0,r=0,s=!1;const i=(a,l,d)=>{if(s)return;if(++o>ye){o===ye+1&&t.push({path:l,message:"模板超过 JSON 节点安全上限"});return}if(d>xt){t.push({path:l,message:"模板嵌套层级过深"});return}if(typeof a=="string"){r+=a.length,r>Ae&&(s=!0,t.push({path:l,message:"模板文本超过 1000 万字符的安全上限"}));return}if(a===null||typeof a=="boolean"||typeof a=="number"&&Number.isFinite(a))return;if(!a||typeof a!="object"){t.push({path:l,message:"模板只允许 JSON 值,不允许函数、undefined 或非有限数字"});return}if(n.has(a)){t.push({path:l,message:"模板不能包含循环引用"});return}const m=Object.getPrototypeOf(a);if(Array.isArray(a)&&m!==Array.prototype||!Array.isArray(a)&&m!==Object.prototype&&m!==null){t.push({path:l,message:"模板对象必须使用普通 JSON 对象原型"});return}if(Array.isArray(a)&&(Object.keys(a).length!==a.length||Object.keys(a).some(h=>!/^(0|[1-9]\d*)$/.test(h)||Number(h)>=a.length))){t.push({path:l,message:"模板数组不能包含空位或额外属性"});return}if(Object.getOwnPropertySymbols(a).length>0){t.push({path:l,message:"模板不能包含 Symbol 键"});return}n.add(a);for(const[h,f]of Object.entries(Object.getOwnPropertyDescriptors(a)))if(!(Array.isArray(a)&&h==="length")&&(Et.has(h)?t.push({path:`${l}.${h}`,message:"模板不能包含可能污染原型的键"}):f.get||f.set||!f.enumerable?t.push({path:`${l}.${h}`,message:"模板不能包含访问器或不可枚举字段"}):i(f.value,`${l}.${h}`,d+1),o>ye||s))break;n.delete(a)};i(e,"$",0)}function F(e,t,n,o,r=!1){const s=e[t];s===void 0&&!r||(typeof s!="string"||r&&!s.trim())&&o.push({path:`${n}.${t}`,message:r?"应为非空字符串":"应为字符串"})}function W(e,t,n,o,r=0,s=!1){const i=e[t];i===void 0&&!s||(typeof i!="number"||!Number.isFinite(i)||i<r)&&o.push({path:`${n}.${t}`,message:`应为大于等于 ${r} 的有限数字`})}function se(e,t,n,o){e[t]!==void 0&&typeof e[t]!="boolean"&&o.push({path:`${n}.${t}`,message:"应为布尔值"})}function te(e,t,n,o=!1){e!==void 0&&!At.has(e)&&!(o&&e==="auto")&&n.push({path:t,message:`未知对齐方式${o?"(支持 auto)":""}`})}function q(e,t,n){if(e!==void 0){if(!H(e)){n.push({path:t,message:"样式应为对象"});return}te(e.align,`${t}.align`,n),e.verticalAlign!==void 0&&!["top","middle","bottom"].includes(e.verticalAlign)&&n.push({path:`${t}.verticalAlign`,message:"未知垂直对齐方式"});for(const o of["fontSize","fontSizePx","lineWidthPt","lineHeight"])W(e,o,t,n);for(const o of["letterSpacing","rotateDeg"])W(e,o,t,n,-1/0);W(e,"opacity",t,n),typeof e.opacity=="number"&&e.opacity>1&&n.push({path:`${t}.opacity`,message:"透明度不能大于 1"});for(const o of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])se(e,o,t,n);for(const o of["fontFamily","color","backgroundColor","lineColor","borderColor"])F(e,o,t,n)}}function kt(e,t,n){if(e===void 0)return;if(!Array.isArray(e)){n.push({path:t,message:"参数定义应为数组"});return}const o=new Set;e.forEach((r,s)=>{const i=`${t}.${s}`;if(!H(r)){n.push({path:i,message:"参数定义应为对象"});return}F(r,"field",i,n,!0),typeof r.field=="string"&&(o.has(r.field)&&n.push({path:`${i}.field`,message:"参数名重复"}),o.add(r.field)),r.type!==void 0&&!["text","number","date","select"].includes(r.type)&&n.push({path:`${i}.type`,message:"未知参数类型"});for(const a of["label","defaultValue","placeholder"])F(r,a,i,n);se(r,"required",i,n),r.options!==void 0&&(Array.isArray(r.options)?r.options.forEach((a,l)=>{const d=`${i}.options.${l}`;if(!H(a))n.push({path:d,message:"选项应为对象"});else for(const m of["label","value"])typeof a[m]!="string"&&n.push({path:`${d}.${m}`,message:"选项标签与值应为字符串(允许空白选项)"})}):n.push({path:`${i}.options`,message:"选项应为数组"}))})}function Nt(e,t,n){for(const o of["leftMm","topMm"])W(e,o,t,n,-1/0,!0);W(e,"widthMm",t,n,Number.MIN_VALUE,!0),F(e,"dataset",t,n,!0),F(e,"title",t,n),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&n.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),!Array.isArray(e.columns)||e.columns.length===0?n.push({path:`${t}.columns`,message:"列表至少需要一列"}):e.columns.forEach((o,r)=>{const s=`${t}.columns.${r}`;if(!H(o)){n.push({path:s,message:"列应为对象"});return}if(typeof o.header!="string"&&n.push({path:`${s}.header`,message:"表头应为字符串(允许空白表头)"}),F(o,"field",s,n,!0),W(o,"widthMm",s,n,Number.MIN_VALUE,!0),q(o.style,`${s}.style`,n),q(o.headerStyle,`${s}.headerStyle`,n),te(o.align,`${s}.align`,n,!0),te(o.headerAlign,`${s}.headerAlign`,n),o.format!==void 0)if(!H(o.format)||!["number","percent","date"].includes(o.format.kind))n.push({path:`${s}.format`,message:"未知列格式"});else{const i=o.format.digits;i!==void 0&&(typeof i!="number"||!Number.isInteger(i)||i<0||i>100)&&n.push({path:`${s}.format.digits`,message:"小数位应为 0–100 的整数"}),se(o.format,"thousands",`${s}.format`,n),F(o.format,"pattern",`${s}.format`,n)}o.rules!==void 0&&(Array.isArray(o.rules)?o.rules.forEach((i,a)=>{const l=`${s}.rules.${a}`;if(!H(i)||!H(i.when)){n.push({path:l,message:"条件格式缺少 when 对象"});return}F(i.when,"field",`${l}.when`,n,!0),[">",">=","<","<=","==","!="].includes(i.when.op)||n.push({path:`${l}.when.op`,message:"未知条件运算符"}),typeof i.when.value!="number"&&typeof i.when.value!="string"&&n.push({path:`${l}.when.value`,message:"条件值应为数字或字符串"}),q(i.style,`${l}.style`,n)}):n.push({path:`${s}.rules`,message:"条件格式应为数组"}))});for(const o of["fontSizePt","rowHeightMm"])W(e,o,t,n,Number.MIN_VALUE);W(e,"paddingMm",t,n);for(const o of["headerBold","headerEveryPage","border"])se(e,o,t,n);if(F(e,"headerBackgroundColor",t,n),te(e.align,`${t}.align`,n,!0),te(e.headerAlign,`${t}.headerAlign`,n),q(e.headerStyle,`${t}.headerStyle`,n),e.groupBy!==void 0)if(!H(e.groupBy))n.push({path:`${t}.groupBy`,message:"分组应为对象"});else{F(e.groupBy,"field",`${t}.groupBy`,n,!0);for(const o of["headerTemplate","subtotalLabel"])F(e.groupBy,o,`${t}.groupBy`,n);for(const o of["headerStyle","subtotalStyle"])q(e.groupBy[o],`${t}.groupBy.${o}`,n);se(e.groupBy,"keepWithNext",`${t}.groupBy`,n),e.groupBy.subtotal!==void 0&&(!Array.isArray(e.groupBy.subtotal)||e.groupBy.subtotal.some(o=>typeof o!="string"))&&n.push({path:`${t}.groupBy.subtotal`,message:"小计字段应为字符串数组"})}e.grandTotal!==void 0&&typeof e.grandTotal!="boolean"&&(H(e.grandTotal)?(F(e.grandTotal,"label",`${t}.grandTotal`,n),q(e.grandTotal.style,`${t}.grandTotal.style`,n),e.grandTotal.fields!==void 0&&(!Array.isArray(e.grandTotal.fields)||e.grandTotal.fields.some(o=>typeof o!="string"))&&n.push({path:`${t}.grandTotal.fields`,message:"合计字段应为字符串数组"})):n.push({path:`${t}.grandTotal`,message:"合计应为布尔值或对象"}))}function Ze(e,t,n){q(e.style,`${t}.style`,n);for(const r of["text","rawText","imageData","fallbackText","nid","rkey"])F(e,r,t,n);if(e.lines!==void 0&&(!Array.isArray(e.lines)||e.lines.some(r=>typeof r!="string"))&&n.push({path:`${t}.lines`,message:"文本行应为字符串数组"}),Array.isArray(e.richParagraphs)&&e.richParagraphs.forEach((r,s)=>{if(!H(r))return;const i=`${t}.richParagraphs.${s}`;te(r.align,`${i}.align`,n);for(const a of["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"])W(r,a,i,n);Array.isArray(r.segments)&&r.segments.forEach((a,l)=>{const d=`${i}.segments.${l}`;if(!H(a)){n.push({path:d,message:"富文本片段应为对象"});return}a.kind!==void 0&&a.kind!=="text"&&a.kind!=="field"&&n.push({path:`${d}.kind`,message:"未知富文本片段类型"});for(const m of["text","field"])F(a,m,d,n);q(a.style,`${d}.style`,n)})}),!H(e.grid))return;const o=e.grid;W(o,"gapMm",`${t}.grid`,n);for(const r of["colWidthsMm","rowHeightsMm"]){const s=o[r];s!==void 0&&(!Array.isArray(s)||s.some(i=>typeof i!="number"||!Number.isFinite(i)||i<0))&&n.push({path:`${t}.grid.${r}`,message:"网格尺寸应为有限非负数字数组"})}Array.isArray(o.cells)&&o.cells.forEach((r,s)=>{Array.isArray(r)&&r.forEach((i,a)=>{const l=`${t}.grid.cells.${s}.${a}`;if(i!==null){if(!H(i)){n.push({path:l,message:"网格单元格应为对象或 null"});return}for(const d of["text","rawText","numberFormat"])F(i,d,l,n);for(const d of["colSpan","rowSpan"]){const m=i[d];m!==void 0&&(typeof m!="number"||!Number.isInteger(m)||m<=0)&&n.push({path:`${l}.${d}`,message:"跨度应为正整数"})}i.value!==void 0&&i.value!==null&&!["string","number","boolean"].includes(typeof i.value)&&n.push({path:`${l}.value`,message:"Excel 原始值应为字符串、数字、布尔值或 null"}),q(i.style,`${l}.style`,n),i.children!==void 0&&(Array.isArray(i.children)?i.children.forEach((d,m)=>{H(d)&&Ze(d,`${l}.children.${m}`,n)}):n.push({path:`${l}.children`,message:"嵌套组件应为数组"}))}})})}function ke(e){const t=[],n=[];return xe(e,t),t.length?{ok:!1,errors:t,warnings:n}:(H(e)?(e.schemaVersion!==void 0&&e.schemaVersion!==C.RENDER_PLAN_SCHEMA_VERSION&&t.push({path:"$.schemaVersion",message:"不支持的模板 schemaVersion"}),kt(e.params,"$.params",t),!Array.isArray(e.pages)||e.pages.length===0?t.push({path:"$.pages",message:"模板至少需要一页"}):e.pages.forEach((o,r)=>{const s=`$.pages.${r}`;if(!H(o)){t.push({path:s,message:"页应为对象"});return}W(o,"widthMm",s,t,Number.MIN_VALUE,!0),W(o,"heightMm",s,t,Number.MIN_VALUE,!0),o.layout!==void 0&&o.layout!=="page"&&o.layout!=="wide"&&t.push({path:`${s}.layout`,message:"布局应为 page 或 wide"}),typeof o.heightMm=="number"&&o.heightMm>=5e3&&t.push({path:`${s}.heightMm`,message:"页高应小于 5000mm"});for(const i of["marginTopMm","marginBottomMm","marginLeftMm","marginRightMm"])W(o,i,s,t);typeof o.widthMm=="number"&&Number(o.marginLeftMm??0)+Number(o.marginRightMm??0)>=o.widthMm&&t.push({path:s,message:"横向页边距占满页面"}),typeof o.heightMm=="number"&&Number(o.marginTopMm??0)+Number(o.marginBottomMm??0)>=o.heightMm&&t.push({path:s,message:"纵向页边距占满页面"}),Array.isArray(o.components)?o.components.forEach((i,a)=>{const l=`${s}.components.${a}`;H(i)&&i.kind==="list"?Nt(i,l,t):(ge(i,l,t,n),H(i)&&Ze(i,l,t))}):t.push({path:`${s}.components`,message:"组件应为数组"})})):t.push({path:"$",message:"模板应为对象"}),{ok:t.length===0,errors:t,warnings:n})}function Qe(e){const t=[],n=[];if(xe(e,t),t.length)return{ok:!1,errors:t,warnings:n};if(!H(e))t.push({path:"$",message:"模板文档应为对象"});else{for(const r of Object.keys(e))Pt.has(r)||t.push({path:`$.${r}`,message:"模板文档存在未知字段;只保存模板与描述,不保存取数或业务数据"});e.schemaVersion!==Pe&&t.push({path:"$.schemaVersion",message:"不支持的模板文档版本"});for(const r of["id","name"])F(e,r,"$",t,!0);for(const r of["revision","description"])F(e,r,"$",t);const o=ke(e.template);t.push(...o.errors.map(r=>({...r,path:`$.template${r.path.slice(1)}`}))),n.push(...o.warnings.map(r=>({...r,path:`$.template${r.path.slice(1)}`})))}return{ok:t.length===0,errors:t,warnings:n}}function ue(e){const t=Qe(e);if(!t.ok)throw new Z(t.errors)}function Rt(e){const t=[];if(xe(e,t),t.length)throw new Z(t);const n={...e,schemaVersion:e.schemaVersion??Pe};return ue(n),fe(n)}function Ct(e){let t=e;if(typeof e=="string"){if(e.length>Ae)throw new Z([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);try{t=JSON.parse(e)}catch{throw new Z([{path:"$",message:"模板 JSON 语法无效"}])}}return ue(t),fe(t)}function _t(e){ue(e);const t=JSON.stringify(e,null,2);if(t.length>Ae)throw new Z([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);return t}function fe(e){return JSON.parse(JSON.stringify(e))}function Ot(e=[]){const t=new Map,n={get:o=>{const r=t.get(o);return r?fe(r):void 0},list:()=>Array.from(t.values(),({template:o,...r})=>({...r})),register:(o,r={})=>{if(ue(o),t.has(o.id)&&!r.replace)throw new Z([{path:"$.id",message:`模板 ID ${o.id} 已注册;更新需显式 replace:true`}]);t.set(o.id,fe(o))},remove:o=>t.delete(o)};for(const o of e)n.register(o);return n}function Ht(e){if(!("mapData"in e))return e;const{load:t,mapData:n,...o}=e;return{...o,load:async r=>{const s=await t(r);K(r.signal);try{return n(s,r)}catch(i){throw new j("validate",`报表 ${r.reportId} 数据映射失败`,i)}}}}class j extends Error{constructor(t,n,o){super(n),this.name="ReportSourceError",this.code=t,this.cause=o}}function he(e){const t=new Error("报表加载已取消");return t.name="AbortError",Object.defineProperty(t,"cause",{value:e.reason}),t}function K(e){if(e?.aborted)throw he(e)}function Be(e,t){return t?new Promise((n,o)=>{const r=()=>t.removeEventListener("abort",s),s=()=>{r(),o(he(t))};t.addEventListener("abort",s,{once:!0}),t.aborted&&s(),Promise.resolve(e).then(i=>{r(),n(i)},i=>{r(),o(i)})}):Promise.resolve(e)}function Bt(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new j("validate",`报表 ${t} 的数据集应为对象`);for(const[n,o]of Object.entries(e))if(!Array.isArray(o)||o.some(r=>!r||typeof r!="object"||Array.isArray(r)))throw new j("validate",`报表 ${t} 的数据集 ${n} 应为对象数组`)}function Ft(e,t={}){function n(r){const s=Object.prototype.hasOwnProperty.call(e,r)?e[r]:void 0;if(!s)throw new j("config",`未注册报表 ${r}`);return s}return Object.assign(async({reportIds:r,params:s,signal:i,onWarning:a})=>{K(i);const l=[...r],d={...s};if(l.length===0)throw new j("config","缺少报表 ID");const m=l.map(n),h=[],f=[];for(const[M,E]of m.entries()){K(i);const S=l[M],x={reportId:S,params:{...d},signal:i};let T;if(typeof E.template=="function")try{T=await Be(E.template(x),i),K(i);const p=ke(T);if(!p.ok)throw new j("validate",`报表 ${S} 模板校验失败:${p.errors.slice(0,3).map(y=>`${y.path}: ${y.message}`).join("; ")}`);f.push(...p.warnings.map(y=>`${S}: ${y.path}: ${y.message}`))}catch(p){throw i?.aborted?he(i):p instanceof j?p:p instanceof Z?new j("validate",`报表 ${S} 模板校验失败:${p.message}`,p):new j("fetch",`报表 ${S} 模板加载失败:${p instanceof Error?p.message:String(p)}`,p)}else T=E.template;let O;try{O=await Be(E.load?E.load(x):E.datasets??{},i)}catch(p){throw i?.aborted?he(i):p instanceof j?p:new j("fetch",`报表 ${S} 取数失败:${p instanceof Error?p.message:String(p)}`,p)}K(i),Bt(O,S);let L;try{L=We(T,O,E.pagination)}catch(p){throw new j("validate",`报表 ${S} 排版失败:${p instanceof Error?p.message:String(p)}`,p)}const P=new Map,v=p=>{let y=P.get(p);return y===void 0&&(y=JSON.stringify([M,S,p]),P.set(p,y)),y};for(const p of L.plan.pages)h.push({...p,components:p.components.map(y=>y.table?{...y,table:{...y.table,id:v(y.table.id)}}:y)});f.push(...L.warnings.map(p=>`${S}: ${p}`))}K(i);const u={schemaVersion:C.RENDER_PLAN_SCHEMA_VERSION,pages:h},c=$e(u);if(!c.ok)throw new j("validate",`渲染计划校验失败:${c.errors.slice(0,3).map(M=>`${M.path}: ${M.message}`).join("; ")}`);f.push(...c.warnings.map(M=>`${M.path}: ${M.message}`));const w=a??t.onWarning??(M=>console.warn("[mach-report]",M));for(const M of f)K(i),w(M);return K(i),u},{getParamDefs:r=>rt.getReportParamDefs(e,r)})}exports.CSS_DPI=g.CSS_DPI;exports.DEFAULT_BORDER_PT=g.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=g.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=g.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=g.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=g.LINE_HEIGHT;exports.MM_PER_INCH=g.MM_PER_INCH;exports.PAPER_SIZES=g.PAPER_SIZES;exports.SCHEMA_VERSION_MACH=g.SCHEMA_VERSION_MACH;exports.mmToPx=g.mmToPx;exports.mmToPxFactor=g.mmToPxFactor;exports.ptToPx=g.ptToPx;exports.pxToMm=g.pxToMm;exports.resolveBoxBorders=g.resolveBoxBorders;exports.resolveFontSize=g.resolveFontSize;exports.resolveGridLayout=g.resolveGridLayout;exports.resolveLineHeight=g.resolveLineHeight;exports.resolveStroke=g.resolveStroke;exports.resolveTextColor=g.resolveTextColor;exports.round=g.round;exports.RENDER_PLAN_SCHEMA_VERSION=C.RENDER_PLAN_SCHEMA_VERSION;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.isImageBackedComponent=C.isImageBackedComponent;exports.isRichText=C.isRichText;exports.measureTextMm=C.measureTextMm;exports.wrapText=C.wrapText;exports.PageBuilder=Xe;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=Pe;exports.ReportSourceError=j;exports.ReportTemplateError=Z;exports.TemplateBuilder=Ke;exports.assertRenderPlan=dt;exports.classOf=D;exports.computePageWindow=Ge;exports.createCanvasPager=St;exports.createReportSource=Ft;exports.createTableTemplate=vt;exports.createTemplate=Tt;exports.createTemplateRegistry=Ot;exports.defineReport=Ht;exports.defineReportTemplate=Rt;exports.evalStyleRule=Le;exports.formatValue=we;exports.measurePageSizePx=ve;exports.paginateTemplate=We;exports.parseDateLocal=Fe;exports.parseReportTemplate=Ct;exports.planFontSizePx=bt;exports.renderComponent=Se;exports.renderPage=Ue;exports.renderPlan=yt;exports.renderPlanToCanvas=qe;exports.renderPlanToImages=$t;exports.resolvePaper=Ee;exports.serializeReportTemplate=_t;exports.toExcelNumberFormat=be;exports.toNumber=me;exports.validateComponent=ge;exports.validatePage=Ie;exports.validateRenderPlan=$e;exports.validateReportTemplate=ke;exports.validateReportTemplateDocument=Qe;