@agile-team/mach-report 2.12.0 → 2.14.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 (97) hide show
  1. package/README.md +27 -3
  2. package/dist/ExcelBindingWizard-CLT2p7P3.cjs +1 -0
  3. package/dist/ExcelBindingWizard-CvsWR8Ga.js +1485 -0
  4. package/dist/{ParamEditor-BLaE5q5W.js → ParamEditor-CflQV3eQ.js} +191 -187
  5. package/dist/ParamEditor-vIDzvpPV.cjs +1 -0
  6. package/dist/ReportBatchPanel-DkxTzBkD.cjs +1 -0
  7. package/dist/{ReportBatchPanel-B5ClP9tm.js → ReportBatchPanel-LqVgiqp7.js} +3 -3
  8. package/dist/ReportPreview-CvbqLUzM.cjs +6 -0
  9. package/dist/ReportPreview-D_ywJ_-H.js +4533 -0
  10. package/dist/{ReportTemplateLibrary-BZB-XWjj.js → ReportTemplateLibrary-MjWEtc7X.js} +1 -1
  11. package/dist/ReportTemplateLibrary-cQ1sqNYo.cjs +1 -0
  12. package/dist/RuleEditor-BaR6xUiI.cjs +1 -0
  13. package/dist/RuleEditor-ChuXMlei.js +2037 -0
  14. package/dist/TemplateOutlinePanel-BHKP89Xz.cjs +1 -0
  15. package/dist/TemplateOutlinePanel-Dci6aRn1.js +96 -0
  16. package/dist/TemplateReusePanel-B7Gmyc1z.js +388 -0
  17. package/dist/TemplateReusePanel-CY5eO2Sh.cjs +1 -0
  18. package/dist/TemplateReviewPanel-DjlX3xpt.js +592 -0
  19. package/dist/TemplateReviewPanel-JvZe9_4G.cjs +1 -0
  20. package/dist/{batch-mRqhhhjt.js → batch-DzaTNLWI.js} +23 -16
  21. package/dist/batch-xMkqYiTr.cjs +1 -0
  22. package/dist/config-0UIohTS7.cjs +1 -0
  23. package/dist/{config-B612mw0x.js → config-Dt9NtCPl.js} +227 -186
  24. package/dist/data-explanation-BktvER5B.cjs +1 -0
  25. package/dist/data-explanation-C_J6jYNi.js +16 -0
  26. package/dist/designer-Ci1LizA9.js +5020 -0
  27. package/dist/designer-rtmVIIdN.cjs +2 -0
  28. package/dist/designer.cjs +1 -2
  29. package/dist/designer.d.cts +306 -3
  30. package/dist/designer.d.ts +306 -3
  31. package/dist/designer.js +21 -4266
  32. package/dist/font-loader-DHto6Lra.js +297 -0
  33. package/dist/font-loader-vhCT8znW.cjs +1 -0
  34. package/dist/index.cjs +8 -8
  35. package/dist/index.d.cts +182 -1
  36. package/dist/index.d.ts +182 -1
  37. package/dist/index.js +728 -628
  38. package/dist/{template-review-BzpcI-tR.js → json-snapshot-BeFT3Tso.js} +867 -637
  39. package/dist/json-snapshot-D1NTP2oI.cjs +2 -0
  40. package/dist/pdf-8UPQebOE.js +36288 -0
  41. package/dist/pdf-AyJGb22z.cjs +101 -0
  42. package/dist/pdf.cjs +1 -101
  43. package/dist/pdf.js +9 -36579
  44. package/dist/plugin-BGKf-Tqg.js +22 -0
  45. package/dist/{plugin-BDTU4D94.cjs → plugin-CktLH_Iy.cjs} +1 -1
  46. package/dist/{region-binding-workflow-CcUq8W2Q.js → region-binding-workflow-DEJbhpCv.js} +1 -1
  47. package/dist/server/node.d.cts +46 -11
  48. package/dist/server/node.d.ts +46 -11
  49. package/dist/server-node.cjs +1 -1
  50. package/dist/server-node.js +294 -280
  51. package/dist/server.cjs +1 -1
  52. package/dist/server.d.cts +107 -12
  53. package/dist/server.d.ts +107 -12
  54. package/dist/server.js +713 -453
  55. package/dist/style.css +1 -1
  56. package/dist/template-bindings-BJR4k7qZ.cjs +1 -0
  57. package/dist/template-bindings-Daui7hLF.js +252 -0
  58. package/dist/template-fragments-CLkGo6To.js +187 -0
  59. package/dist/template-fragments-DFUpq5QM.cjs +1 -0
  60. package/dist/template-outline-B3xVkzSv.cjs +1 -0
  61. package/dist/template-outline-CFenM1PV.js +88 -0
  62. package/dist/{template-registry-BjE1VS6g.js → template-registry-COXDEJEM.js} +1 -1
  63. package/dist/{useLocalDraft-C07SYRnC.js → useLocalDraft-BnhcxXk_.js} +1 -1
  64. package/dist/{useLocalDraft-Yiw1wFgI.cjs → useLocalDraft-CioIfDb6.cjs} +1 -1
  65. package/dist/{validate-DbgEM1Hh.js → validate-CkQBWCeg.js} +3 -3
  66. package/dist/vue/async.d.cts +72 -2
  67. package/dist/vue/async.d.ts +72 -2
  68. package/dist/vue/index.d.cts +124 -5
  69. package/dist/vue/index.d.ts +124 -5
  70. package/dist/vue-async.cjs +1 -1
  71. package/dist/vue-async.js +5 -5
  72. package/dist/vue.cjs +1 -1
  73. package/dist/vue.js +78 -71
  74. package/dist/{workbook-session-BPb3TMnT.js → workbook-session-BfK1yHOO.js} +1 -1
  75. package/dist/worker.cjs +1 -1
  76. package/dist/worker.d.cts +46 -11
  77. package/dist/worker.d.ts +46 -11
  78. package/dist/worker.js +59 -55
  79. package/dist/xlsx.js +3 -3
  80. package/package.json +1 -1
  81. package/dist/ExcelBindingWizard-CeAf4QSE.js +0 -1465
  82. package/dist/ExcelBindingWizard-y0mT-AHR.cjs +0 -1
  83. package/dist/ParamEditor-MBBC7lUE.cjs +0 -1
  84. package/dist/ReportBatchPanel-Dc-SDkYA.cjs +0 -1
  85. package/dist/ReportPreview-DWXROHBP.cjs +0 -6
  86. package/dist/ReportPreview-DiNXhQI0.js +0 -4138
  87. package/dist/ReportTemplateLibrary-5fk5CQBO.cjs +0 -1
  88. package/dist/RuleEditor-ChRzNQuF.cjs +0 -1
  89. package/dist/RuleEditor-DzAmW5YH.js +0 -2024
  90. package/dist/TemplateReviewPanel-BKofGrV9.js +0 -222
  91. package/dist/TemplateReviewPanel-DwtOcLue.cjs +0 -1
  92. package/dist/batch-Bt3Fd27Z.cjs +0 -1
  93. package/dist/config-BRoLo2oj.cjs +0 -1
  94. package/dist/plugin-Cd5G2QQn.js +0 -22
  95. package/dist/record-bindings-By_UKZ2g.cjs +0 -1
  96. package/dist/record-bindings-D-5jQlTj.js +0 -196
  97. package/dist/template-review-BfCC8Ng9.cjs +0 -2
@@ -0,0 +1,297 @@
1
+ const f = /* @__PURE__ */ new Map();
2
+ let b = 0, d = { maxFonts: 8, maxBytes: 64 * 1024 * 1024, maxFontBytes: 24 * 1024 * 1024 };
3
+ function D() {
4
+ for (; f.size > d.maxFonts || b > d.maxBytes; ) {
5
+ const t = f.keys().next().value;
6
+ b -= f.get(t).byteLength, f.delete(t);
7
+ }
8
+ }
9
+ function nt(t) {
10
+ const e = { ...d, ...t };
11
+ if (!Object.values(e).every((n) => Number.isSafeInteger(n) && n > 0)) throw new Error("字体缓存预算应为正整数字节/数量");
12
+ d = e;
13
+ for (const [n, a] of f) a.byteLength > d.maxFontBytes && P(n);
14
+ D();
15
+ }
16
+ function B() {
17
+ return { fonts: f.size, bytes: b, ...d };
18
+ }
19
+ function U(t) {
20
+ const e = f.get(t);
21
+ return e && (f.delete(t), f.set(t, e)), e;
22
+ }
23
+ function P(t) {
24
+ const e = f.get(t);
25
+ e && (b -= e.byteLength), f.delete(t);
26
+ }
27
+ function z() {
28
+ f.clear(), b = 0;
29
+ }
30
+ function W(t, e) {
31
+ P(t), !(e.byteLength > d.maxBytes || e.byteLength > d.maxFontBytes) && (f.set(t, e), b += e.byteLength, D());
32
+ }
33
+ const j = "mach-report-fonts", u = "fonts";
34
+ function H() {
35
+ return new Promise((t, e) => {
36
+ const n = indexedDB.open(j, 1);
37
+ n.onupgradeneeded = () => {
38
+ n.result.objectStoreNames.contains(u) || n.result.createObjectStore(u);
39
+ }, n.onsuccess = () => t(n.result), n.onerror = () => e(n.error);
40
+ });
41
+ }
42
+ function M(t) {
43
+ if (t instanceof Uint8Array) return { bytes: t, accessedAt: 0 };
44
+ const e = t;
45
+ return e?.bytes instanceof Uint8Array && Number.isFinite(e.accessedAt) ? e : void 0;
46
+ }
47
+ async function T(t, e) {
48
+ if (typeof indexedDB > "u") return t;
49
+ let n;
50
+ try {
51
+ return n = await H(), await e(n);
52
+ } catch {
53
+ return t;
54
+ } finally {
55
+ n?.close();
56
+ }
57
+ }
58
+ function V(t) {
59
+ return T(null, (e) => new Promise((n, a) => {
60
+ const r = e.transaction(u, "readwrite"), o = r.objectStore(u), i = o.get(t);
61
+ let c = null;
62
+ i.onsuccess = () => {
63
+ const s = M(i.result);
64
+ s && s.bytes.byteLength <= B().maxFontBytes ? (c = s.bytes, o.put({ bytes: s.bytes, accessedAt: Date.now() }, t)) : i.result !== void 0 && o.delete(t);
65
+ }, r.oncomplete = () => n(c), r.onerror = () => a(r.error), r.onabort = () => a(r.error);
66
+ }));
67
+ }
68
+ function $(t, e, n, a) {
69
+ const r = B(), o = e.filter((s) => s.key !== n);
70
+ t.delete(n), a.byteLength <= Math.min(r.maxFontBytes, r.maxBytes) && o.unshift({ key: n, bytes: a.byteLength, accessedAt: Date.now() }), o.sort((s, h) => h.accessedAt - s.accessedAt);
71
+ let i = 0, c = 0;
72
+ for (const s of o) {
73
+ if (c >= r.maxFonts || i + s.bytes > r.maxBytes || s.bytes > r.maxFontBytes) {
74
+ t.delete(s.key);
75
+ continue;
76
+ }
77
+ i += s.bytes, c++, s.key === n && t.put({ bytes: a, accessedAt: s.accessedAt }, n);
78
+ }
79
+ }
80
+ function q(t, e) {
81
+ return T(void 0, (n) => new Promise((a, r) => {
82
+ const o = n.transaction(u, "readwrite"), i = o.objectStore(u), c = i.openCursor(), s = [];
83
+ c.onsuccess = () => {
84
+ const h = c.result;
85
+ if (!h) {
86
+ $(i, s, t, e);
87
+ return;
88
+ }
89
+ const L = M(h.value);
90
+ L ? s.push({ key: h.key, bytes: L.bytes.byteLength, accessedAt: L.accessedAt }) : h.delete(), h.continue();
91
+ }, o.oncomplete = () => a(), o.onerror = () => r(o.error), o.onabort = () => r(o.error);
92
+ }));
93
+ }
94
+ function C(t) {
95
+ return T(void 0, (e) => new Promise((n, a) => {
96
+ const r = e.transaction(u, "readwrite"), o = r.objectStore(u);
97
+ t === void 0 ? o.clear() : o.delete(t), r.oncomplete = () => n(), r.onerror = () => a(r.error), r.onabort = () => a(r.error);
98
+ }));
99
+ }
100
+ let p = 0, x = 0, v = Promise.resolve();
101
+ const g = /* @__PURE__ */ new Map();
102
+ async function G(t) {
103
+ y.set(t, (y.get(t) ?? 0) + 1), P(t), l.delete(t);
104
+ const e = g.get(t), n = (async () => {
105
+ await v, await e, await w.get(t), await C(t);
106
+ })();
107
+ g.set(t, n);
108
+ try {
109
+ await n;
110
+ } finally {
111
+ g.get(t) === n && g.delete(t);
112
+ }
113
+ }
114
+ async function rt() {
115
+ p++, z(), l.clear(), y.clear();
116
+ const t = v, e = (async () => {
117
+ await t, await Promise.all(w.values()), await C();
118
+ })();
119
+ v = e.catch(() => {
120
+ }), await e;
121
+ }
122
+ const y = /* @__PURE__ */ new Map(), w = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Set();
123
+ function N() {
124
+ !x && !E.size && y.clear();
125
+ }
126
+ const O = /* @__PURE__ */ new WeakMap();
127
+ function J(t) {
128
+ const e = new TextDecoder().decode(t.subarray(0, 256));
129
+ return /^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e);
130
+ }
131
+ function k(t) {
132
+ if (t.byteLength === 0) throw new Error("字体文件为空");
133
+ if (J(t)) throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");
134
+ }
135
+ function I(t) {
136
+ const e = O.get(t);
137
+ if (e) return e;
138
+ const n = (async () => {
139
+ const a = String.fromCharCode(...t.subarray(0, 4));
140
+ if (!["\0\0\0", "true", "OTTO", "wOFF", "wOF2", "ttcf"].includes(a))
141
+ throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");
142
+ const { default: r } = await import("./pdf-8UPQebOE.js").then((i) => i.f), o = r.create(t);
143
+ if (!Number.isFinite(o.unitsPerEm) || o.unitsPerEm <= 0 || !o.characterSet?.length || !o.numGlyphs)
144
+ throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件");
145
+ })();
146
+ return O.set(t, n), n;
147
+ }
148
+ function S(t, e, n = !1) {
149
+ const a = n ? "字体加载超时,请检查网络或字体服务" : e instanceof Error ? e.message : String(e);
150
+ return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`), { cause: e });
151
+ }
152
+ function A(t, e) {
153
+ if (t > e) throw new Error(`字体文件超过单字体下载预算(${e}字节)`);
154
+ }
155
+ async function _(t, e, n) {
156
+ const a = Number(t.headers?.get("content-length"));
157
+ try {
158
+ Number.isFinite(a) && A(a, e);
159
+ } catch (r) {
160
+ throw t.body?.cancel(r).catch(() => {
161
+ }), r;
162
+ }
163
+ if (!t.body) {
164
+ const r = new Uint8Array(await F(t.arrayBuffer(), n));
165
+ return A(r.byteLength, e), r;
166
+ }
167
+ return R(t.body, e, n);
168
+ }
169
+ async function R(t, e, n) {
170
+ const a = t.getReader(), r = [];
171
+ let o = 0;
172
+ try {
173
+ for (; ; ) {
174
+ const s = await F(a.read(), n);
175
+ if (s.done) break;
176
+ o += s.value.byteLength, A(o, e), r.push(s.value);
177
+ }
178
+ const i = new Uint8Array(o);
179
+ let c = 0;
180
+ for (const s of r)
181
+ i.set(s, c), c += s.byteLength;
182
+ return i;
183
+ } catch (i) {
184
+ throw a.cancel(i).catch(() => {
185
+ }), i;
186
+ } finally {
187
+ a.releaseLock();
188
+ }
189
+ }
190
+ async function K(t, e, n) {
191
+ if (t[0] !== 31 || t[1] !== 139) return t;
192
+ if (typeof DecompressionStream > "u") throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");
193
+ const r = new ReadableStream({ start(o) {
194
+ o.enqueue(t), o.close();
195
+ } }).pipeThrough(new DecompressionStream("gzip"));
196
+ return R(r, e, n);
197
+ }
198
+ async function Q(t) {
199
+ const e = new AbortController();
200
+ let n = !1;
201
+ const a = setTimeout(() => {
202
+ n = !0, e.abort();
203
+ }, 15e3);
204
+ try {
205
+ const r = await fetch(t, { signal: e.signal });
206
+ if (!r.ok) throw new Error(`字体请求返回 HTTP ${r.status}`);
207
+ if (/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type") ?? ""))
208
+ throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");
209
+ const o = B().maxFontBytes, i = await _(r, o, e.signal), c = await K(i, o, e.signal);
210
+ return k(c), { bytes: c, fromCache: !1 };
211
+ } catch (r) {
212
+ throw e.abort(), S(t, r, n);
213
+ } finally {
214
+ clearTimeout(a);
215
+ }
216
+ }
217
+ async function X(t) {
218
+ await v, await g.get(t);
219
+ const e = await V(t);
220
+ if (e)
221
+ try {
222
+ return k(e), { bytes: e, fromCache: !0 };
223
+ } catch {
224
+ }
225
+ return Q(t);
226
+ }
227
+ function Y(t) {
228
+ const e = l.get(t);
229
+ if (e) return e;
230
+ const n = X(t);
231
+ l.set(t, n), E.add(n);
232
+ const a = () => {
233
+ l.get(t) === n && l.delete(t), E.delete(n), N();
234
+ };
235
+ return n.then(a, a), n;
236
+ }
237
+ async function Z(t, e, n, a) {
238
+ if ((y.get(t) ?? 0) !== n || p !== a) return;
239
+ W(t, e);
240
+ const r = w.get(t);
241
+ if (r) {
242
+ await r;
243
+ return;
244
+ }
245
+ const o = q(t, e);
246
+ w.set(t, o), await o, w.get(t) === o && w.delete(t);
247
+ }
248
+ function m(t) {
249
+ return t.reason ?? new DOMException("字体加载已取消", "AbortError");
250
+ }
251
+ function F(t, e) {
252
+ return e ? e.aborted ? Promise.reject(m(e)) : new Promise((n, a) => {
253
+ const r = () => {
254
+ e.removeEventListener("abort", r), a(m(e));
255
+ };
256
+ e.addEventListener("abort", r, { once: !0 }), t.then((o) => {
257
+ e.removeEventListener("abort", r), n(o);
258
+ }, (o) => {
259
+ e.removeEventListener("abort", r), a(o);
260
+ });
261
+ }) : t;
262
+ }
263
+ async function tt(t, e, n, a, r) {
264
+ try {
265
+ return await F(I(e.bytes), n.signal), e.bytes;
266
+ } catch (o) {
267
+ if (n.signal?.aborted) throw m(n.signal);
268
+ if ((y.get(t) ?? 0) !== a || p !== r) throw S(t, o);
269
+ if (await G(t), e.fromCache) return await et(t, n);
270
+ throw S(t, o);
271
+ }
272
+ }
273
+ async function et(t, e = {}) {
274
+ if (e.signal?.aborted) throw m(e.signal);
275
+ const n = y.get(t) ?? 0, a = p, r = U(t);
276
+ if (r && !e.strict) return r;
277
+ const o = r ? void 0 : Y(t);
278
+ x++;
279
+ try {
280
+ const i = r ? { bytes: r, fromCache: !0 } : await F(o, e.signal), c = e.strict ? await tt(t, i, e, n, a) : i.bytes;
281
+ if (e.signal?.aborted) throw m(e.signal);
282
+ return r || await F(Z(t, c, n, a), e.signal), c;
283
+ } catch (i) {
284
+ if (e.signal?.aborted) throw m(e.signal);
285
+ if (e.strict) throw i;
286
+ return null;
287
+ } finally {
288
+ x--, N();
289
+ }
290
+ }
291
+ export {
292
+ rt as clearFontCache,
293
+ nt as configureFontCache,
294
+ B as getFontCacheStats,
295
+ G as invalidateFontCache,
296
+ et as loadFontWithCache
297
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=new Map;let b=0,d={maxFonts:8,maxBytes:64*1024*1024,maxFontBytes:24*1024*1024};function O(){for(;f.size>d.maxFonts||b>d.maxBytes;){const t=f.keys().next().value;b-=f.get(t).byteLength,f.delete(t)}}function W(t){const e={...d,...t};if(!Object.values(e).every(n=>Number.isSafeInteger(n)&&n>0))throw new Error("字体缓存预算应为正整数字节/数量");d=e;for(const[n,a]of f)a.byteLength>d.maxFontBytes&&B(n);O()}function p(){return{fonts:f.size,bytes:b,...d}}function j(t){const e=f.get(t);return e&&(f.delete(t),f.set(t,e)),e}function B(t){const e=f.get(t);e&&(b-=e.byteLength),f.delete(t)}function q(){f.clear(),b=0}function H(t,e){B(t),!(e.byteLength>d.maxBytes||e.byteLength>d.maxFontBytes)&&(f.set(t,e),b+=e.byteLength,O())}const V="mach-report-fonts",u="fonts";function $(){return new Promise((t,e)=>{const n=indexedDB.open(V,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(u)||n.result.createObjectStore(u)},n.onsuccess=()=>t(n.result),n.onerror=()=>e(n.error)})}function M(t){if(t instanceof Uint8Array)return{bytes:t,accessedAt:0};const e=t;return e?.bytes instanceof Uint8Array&&Number.isFinite(e.accessedAt)?e:void 0}async function C(t,e){if(typeof indexedDB>"u")return t;let n;try{return n=await $(),await e(n)}catch{return t}finally{n?.close()}}function G(t){return C(null,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u),i=o.get(t);let c=null;i.onsuccess=()=>{const s=M(i.result);s&&s.bytes.byteLength<=p().maxFontBytes?(c=s.bytes,o.put({bytes:s.bytes,accessedAt:Date.now()},t)):i.result!==void 0&&o.delete(t)},r.oncomplete=()=>n(c),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}function J(t,e,n,a){const r=p(),o=e.filter(s=>s.key!==n);t.delete(n),a.byteLength<=Math.min(r.maxFontBytes,r.maxBytes)&&o.unshift({key:n,bytes:a.byteLength,accessedAt:Date.now()}),o.sort((s,h)=>h.accessedAt-s.accessedAt);let i=0,c=0;for(const s of o){if(c>=r.maxFonts||i+s.bytes>r.maxBytes||s.bytes>r.maxFontBytes){t.delete(s.key);continue}i+=s.bytes,c++,s.key===n&&t.put({bytes:a,accessedAt:s.accessedAt},n)}}function _(t,e){return C(void 0,n=>new Promise((a,r)=>{const o=n.transaction(u,"readwrite"),i=o.objectStore(u),c=i.openCursor(),s=[];c.onsuccess=()=>{const h=c.result;if(!h){J(i,s,t,e);return}const x=M(h.value);x?s.push({key:h.key,bytes:x.bytes.byteLength,accessedAt:x.accessedAt}):h.delete(),h.continue()},o.oncomplete=()=>a(),o.onerror=()=>r(o.error),o.onabort=()=>r(o.error)}))}function D(t){return C(void 0,e=>new Promise((n,a)=>{const r=e.transaction(u,"readwrite"),o=r.objectStore(u);t===void 0?o.clear():o.delete(t),r.oncomplete=()=>n(),r.onerror=()=>a(r.error),r.onabort=()=>a(r.error)}))}let L=0,S=0,v=Promise.resolve();const g=new Map;async function N(t){l.set(t,(l.get(t)??0)+1),B(t),w.delete(t);const e=g.get(t),n=(async()=>{await v,await e,await y.get(t),await D(t)})();g.set(t,n);try{await n}finally{g.get(t)===n&&g.delete(t)}}async function I(){L++,q(),w.clear(),l.clear();const t=v,e=(async()=>{await t,await Promise.all(y.values()),await D()})();v=e.catch(()=>{}),await e}const l=new Map,y=new Map,w=new Map,E=new Set;function k(){!S&&!E.size&&l.clear()}const T=new WeakMap;function K(t){const e=new TextDecoder().decode(t.subarray(0,256));return/^\s*(?:\uFEFF)?\s*<(?:!doctype\s+html|html|head|body)(?:\s|>)/i.test(e)}function R(t){if(t.byteLength===0)throw new Error("字体文件为空");if(K(t))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件")}function Q(t){const e=T.get(t);if(e)return e;const n=(async()=>{const a=String.fromCharCode(...t.subarray(0,4));if(!["\0\0\0","true","OTTO","wOFF","wOF2","ttcf"].includes(a))throw new Error("文件内容不是支持的 TTF/OTF/WOFF 字体(可能返回了 JSON 或文本)");const{default:r}=await Promise.resolve().then(()=>require("./pdf-AyJGb22z.cjs")).then(i=>i.fontkit_es),o=r.create(t);if(!Number.isFinite(o.unitsPerEm)||o.unitsPerEm<=0||!o.characterSet?.length||!o.numGlyphs)throw new Error("字体结构无效或不含可嵌入的单字体;请提供有效的 TTF/OTF/WOFF 文件")})();return T.set(t,n),n}function A(t,e,n=!1){const a=n?"字体加载超时,请检查网络或字体服务":e instanceof Error?e.message:String(e);return Object.assign(new Error(`PDF 字体 ${JSON.stringify(t)} 加载失败:${a}`),{cause:e})}function P(t,e){if(t>e)throw new Error(`字体文件超过单字体下载预算(${e}字节)`)}async function X(t,e,n){const a=Number(t.headers?.get("content-length"));try{Number.isFinite(a)&&P(a,e)}catch(r){throw t.body?.cancel(r).catch(()=>{}),r}if(!t.body){const r=new Uint8Array(await F(t.arrayBuffer(),n));return P(r.byteLength,e),r}return U(t.body,e,n)}async function U(t,e,n){const a=t.getReader(),r=[];let o=0;try{for(;;){const s=await F(a.read(),n);if(s.done)break;o+=s.value.byteLength,P(o,e),r.push(s.value)}const i=new Uint8Array(o);let c=0;for(const s of r)i.set(s,c),c+=s.byteLength;return i}catch(i){throw a.cancel(i).catch(()=>{}),i}finally{a.releaseLock()}}async function Y(t,e,n){if(t[0]!==31||t[1]!==139)return t;if(typeof DecompressionStream>"u")throw new Error("当前环境不支持 gzip 字体解压,请使用未压缩的字体 URL 或支持 DecompressionStream 的浏览器 / Node 环境");const r=new ReadableStream({start(o){o.enqueue(t),o.close()}}).pipeThrough(new DecompressionStream("gzip"));return U(r,e,n)}async function Z(t){const e=new AbortController;let n=!1;const a=setTimeout(()=>{n=!0,e.abort()},15e3);try{const r=await fetch(t,{signal:e.signal});if(!r.ok)throw new Error(`字体请求返回 HTTP ${r.status}`);if(/text\/html|application\/xhtml\+xml/i.test(r.headers?.get("content-type")??""))throw new Error("字体 URL 返回 HTML 页面(可能是 SPA 路由回退),不是字体文件");const o=p().maxFontBytes,i=await X(r,o,e.signal),c=await Y(i,o,e.signal);return R(c),{bytes:c,fromCache:!1}}catch(r){throw e.abort(),A(t,r,n)}finally{clearTimeout(a)}}async function tt(t){await v,await g.get(t);const e=await G(t);if(e)try{return R(e),{bytes:e,fromCache:!0}}catch{}return Z(t)}function et(t){const e=w.get(t);if(e)return e;const n=tt(t);w.set(t,n),E.add(n);const a=()=>{w.get(t)===n&&w.delete(t),E.delete(n),k()};return n.then(a,a),n}async function nt(t,e,n,a){if((l.get(t)??0)!==n||L!==a)return;H(t,e);const r=y.get(t);if(r){await r;return}const o=_(t,e);y.set(t,o),await o,y.get(t)===o&&y.delete(t)}function m(t){return t.reason??new DOMException("字体加载已取消","AbortError")}function F(t,e){return e?e.aborted?Promise.reject(m(e)):new Promise((n,a)=>{const r=()=>{e.removeEventListener("abort",r),a(m(e))};e.addEventListener("abort",r,{once:!0}),t.then(o=>{e.removeEventListener("abort",r),n(o)},o=>{e.removeEventListener("abort",r),a(o)})}):t}async function rt(t,e,n,a,r){try{return await F(Q(e.bytes),n.signal),e.bytes}catch(o){if(n.signal?.aborted)throw m(n.signal);if((l.get(t)??0)!==a||L!==r)throw A(t,o);if(await N(t),e.fromCache)return await z(t,n);throw A(t,o)}}async function z(t,e={}){if(e.signal?.aborted)throw m(e.signal);const n=l.get(t)??0,a=L,r=j(t);if(r&&!e.strict)return r;const o=r?void 0:et(t);S++;try{const i=r?{bytes:r,fromCache:!0}:await F(o,e.signal),c=e.strict?await rt(t,i,e,n,a):i.bytes;if(e.signal?.aborted)throw m(e.signal);return r||await F(nt(t,c,n,a),e.signal),c}catch(i){if(e.signal?.aborted)throw m(e.signal);if(e.strict)throw i;return null}finally{S--,k()}}exports.clearFontCache=I;exports.configureFontCache=W;exports.getFontCacheStats=p;exports.invalidateFontCache=N;exports.loadFontWithCache=z;
package/dist/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("./defaults-xhmcLLrf.cjs"),U=require("./record-bindings-By_UKZ2g.cjs"),u=require("./style-UgIJSA1F.cjs"),W=require("./render-plan-7xpGrCEl.cjs"),ee=require("./validate-BJ5HIWY8.cjs"),oe=require("./dataset-BkRmwgeJ.cjs"),C=require("./assets-C2U-e-Sz.cjs"),f=require("./template-review-BfCC8Ng9.cjs"),ae=require("./grid-geometry-CZ_cYB6O.cjs"),Ee=require("./grid-strokes-Cr7DwUux.cjs"),$=require("./capabilities-CsZ-pNHR.cjs"),ze=require("./progress-BnLiS5eH.cjs"),We=require("./page-window-index-DEjnM6IB.cjs"),M=require("./template-registry-D3SjENi6.cjs"),H=require("./param-validation-DCK039V1.cjs"),se=require("./tree-BX380Rr7.cjs"),Ue={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 S(e,t){return t?.classNames?.[e]??Ue[e]}class je{constructor(){this.props=[]}add(t,n){return n==null||n===!1||n===""?this:(this.props.push([t,String(n)]),this)}mm(t,n,r,i=2){return this.add(t,`${u.round(u.mmToPx(n,r),i)}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 T(e,t="unset"){return new je().add("all",t).add("display",e).add("box-sizing","border-box")}function Te(e,t,n){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const r=u.resolveFontSize(t,n);e.add("font-size",`${u.round(r.fontSizePx,2)}px`)}function qe(e,t,n){const r=t.style??{};Te(e,r,n),e.add("background-color",r.backgroundColor).add("opacity",r.opacity!=null?String(r.opacity):void 0).add("transform",r.rotateDeg?`rotate(${r.rotateDeg}deg)`:void 0)}function Ge(e,t,n,r,i,o){const s=e.cell,a=o.createElement("td");a.className=S("cell",i),a.dataset.mrRowIndex=String(e.ri),a.dataset.mrColumnIndex=String(e.ci),a.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(a.colSpan=s.colSpan),s.rowSpan&&(a.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("block").add("position","absolute").mm("left",e.xMm,r).mm("top",e.yMm,r).mm("width",e.widthMm,r).mm("height",e.heightMm,r).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Te(c,l,r),c.applyTo(a);const d=o.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",n+(s.indentMm??0),r).mm("right",n,r).mm("top",n,r).mm("bottom",n,r).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(le(m,r,i,o));return a.appendChild(d),a}function Ve(e,t,n,r){return Ee.resolveGridStrokes(e,t).map(i=>{const o=`${u.round(i.widthPt*n/72,2)}px solid ${i.color}`,s=r.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const a=i.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",a?i.from:i.pos,n).mm("top",a?i.pos:i.from,n).mm("width",a?i.to-i.from:0,n).mm("height",a?0:i.to-i.from,n).add(a?"border-top":"border-left",o).applyTo(s),s})}function Ye(e,t,n,r,i){const o=i.createElement("table");o.className=S("grid",r),o.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(o);const s=ae.resolveGridLayout(e,t.widthMm,t.heightMm),a=i.createElement("tbody");T("contents").applyTo(a),o.appendChild(a);const l=e.cells.map(()=>{const d=i.createElement("tr");return d.className=S("row",r),d.setAttribute("role","row"),T("contents").applyTo(d),a.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(Ge(d,t,e.paddingMm??.5,n,r,i));const c=i.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(o,...Ve(s,t,n,i)),c}function Je(e,t,n,r){const i=r.createElement("div");i.className=S("paragraph",n),T("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(i);for(const o of e.segments||[]){const s=r.createElement("span");s.className=S("segment",n),s.textContent=o.kind==="field"?o.field??"":o.text??"";const a=T("inline");if(o.style){const l=o.style;a.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&a.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}a.applyTo(s),i.appendChild(s)}return i}function Ke(e,t,n,r){if(W.isRichText(e)){const i=r.createElement("div");i.className=S("rich",n),T("block").applyTo(i);for(const o of e.richParagraphs)i.appendChild(Je(o,t,n,r));return i}if(Array.isArray(e.lines)&&e.lines.length>0){const i=r.createElement("div");i.className=S("lines",n),T("block").applyTo(i);for(const o of e.lines){const s=r.createElement("div");s.className=S("line",n),s.textContent=o,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),i.appendChild(s)}return i}return e.text??""}function Xe(e,t,n,r){const i=r.createElement("div");i.className=S("text",n);const o=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",o.verticalAlign==="middle"?"center":o.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(i),i.append(Ke(e,t,n,r)),i}function Ze(e,t,n){const r=n.createElement("img");return r.className=S("image",t),r.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(r),r.alt=e.kind,r}function fe(e,t,n,r){const i=r.createElement("div");i.className=S("shape",n);const o=e.style||{},s=u.resolveStroke(o),a=u.resolveBoxBorders(o),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(a.top&&c.add("border-top",l),a.right&&c.add("border-right",l),a.bottom&&c.add("border-bottom",l),a.left&&c.add("border-left",l)):e.kind==="ellipse"?(a.inner&&c.add("border",l).add("border-radius","50%"),o.backgroundColor&&c.add("background-color",o.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(i),i}function Qe(e,t,n){const r=n.createElementNS("http://www.w3.org/2000/svg","svg"),i=u.mmToPx(e.widthMm,t),o=u.mmToPx(e.heightMm,t);r.setAttribute("width",String(Math.max(1,i))),r.setAttribute("height",String(Math.max(1,o))),r.setAttribute("aria-hidden","true"),r.style.overflow="visible",r.style.display="block";const s=n.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(i)),s.setAttribute("y1",e.lineDirection==="up"?String(o):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(o));const a=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",a.color),s.setAttribute("stroke-width",String(a.widthPt*t/72)),r.appendChild(s),r}function le(e,t,n,r){const i=r.createElement("div");i.className=`${S("comp",n)} mr-kind-${e.kind}`;const o=T("block").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(qe(o,e,t),o.applyTo(i),W.isImageBackedComponent(e))return i.appendChild(Ze(e,n,r)),i;if(e.kind==="text")return i.appendChild(Xe(e,t,n,r)),i;if(e.grid){const a=fe(e,t,n,r);return a.appendChild(Ye(e.grid,e,t,n,r)),i.appendChild(a),i}if(e.kind==="line"&&e.lineDirection)return i.appendChild(Qe(e,t,r)),i;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return i.appendChild(fe(e,t,n,r)),i;const s=r.createElement("div");return s.className=S("unknown",n),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),i.appendChild(s),i}function Re(e,t,n,r){const i=r.createElement("div");return i.className=S("page",n),T("block","initial").add("position","relative").add("font-family",L.DEFAULT_FONT_FAMILY).add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",L.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(i),e.components.forEach((o,s)=>{const a=le(o,t,n,r);a.dataset.mrComponentIndex=String(s),i.appendChild(a)}),i}function et(e,t,n={}){const r=n.dpi??96;$.reportOutputDiagnostics(e,"dom",n);const i=t.createElement("div");return i.className=S("root",n),T("block").applyTo(i),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(o=>{i.appendChild(Re(o,r,n,t))}),i}function k(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const tt=(e,t)=>(k(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((n,r)=>{const i=new Image,o=()=>{i.onload=null,i.onerror=null,t?.removeEventListener("abort",s)},s=()=>{o(),i.src="",r(t?.reason??new DOMException("The operation was aborted.","AbortError"))};i.onload=()=>{o(),n(i)},i.onerror=()=>{o(),r(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),i.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function nt(e,t,n){return k(n),n?new Promise((r,i)=>{const o=()=>i(n.reason??new DOMException("The operation was aborted.","AbortError"));n.addEventListener("abort",o,{once:!0}),Promise.resolve().then(()=>e(t,n)).then(r,i).finally(()=>n.removeEventListener("abort",o))}):e(t)}async function rt(e,t,n){const r=new Map;for(const i of e.components)!W.isImageBackedComponent(i)||r.has(i.imageData)||r.set(i.imageData,await nt(t,i.imageData,n));return k(n),r}function it(e,t,n,r,i,o){const s=t,a=s.naturalWidth??s.width??i,l=s.naturalHeight??s.height??o;if(a<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(i/a,o/l),d=a*c,m=l*c;e.drawImage(t,n+(i-d)/2,r+(o-m)/2,d,m)}function xe(e){return We.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const ce=96/25.4;function te(e,t=96){const n=t/96*ce;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*n)),heightPx:Math.max(1,Math.round(e.pageHeightMm*n))}}function Se(e,t,n,r=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(n)||n<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(r)||r<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const i=te(e,n),o=Math.round(i.widthPx*t),s=Math.round(i.heightPx*t);if(!Number.isSafeInteger(o)||!Number.isSafeInteger(s)||o*s>r)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:o,height:s}}function Ce(e,t,n,r){const i=document.createElement("canvas"),{widthPx:o,heightPx:s}=te(e,n),a=Se(e,t,n,r);i.width=a.width,i.height=a.height,i.style.width=`${o}px`,i.style.height=`${s}px`;const l=i.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,o,s),{canvas:i,ctx:l}}function ot(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Pe(e,t,n,r,i,o,s,a="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
2
- `),d=c.length*l;let m=r;a==="middle"?m=r+(o-d)/2:a==="bottom"&&(m=r+o-d),c.forEach((h,g)=>{at(e,h,t,n,m+g*l+t.fontSizePx*.8,i)}),e.textAlign="left"}function at(e,t,n,r,i,o){const s=Array.from(t),a=n.letterSpacingPx??0;if(!a){e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const m=n.align==="center"?r+o/2:n.align==="right"?r+o:r;e.fillText(t,m,i);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*a,c=n.align==="center"?r+(o-l)/2:n.align==="right"?r+o-l:r;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*a,i),d+=m})}function st(e,t,n,r,i,o,s){for(const a of Ee.resolveGridStrokes(t,n))e.strokeStyle=a.color,e.lineWidth=u.ptToPx(a.widthPt,s),e.beginPath(),a.kind==="v"?(e.moveTo(r+a.pos*o,i+a.from*o),e.lineTo(r+a.pos*o,i+a.to*o)):(e.moveTo(r+a.from*o,i+a.pos*o),e.lineTo(r+a.to*o,i+a.pos*o)),e.stroke()}function lt(e,t,n,r,i,o){e.beginPath(),t.top&&(e.moveTo(n,r),e.lineTo(n+i,r)),t.right&&(e.moveTo(n+i,r),e.lineTo(n+i,r+o)),t.bottom&&(e.moveTo(n+i,r+o),e.lineTo(n,r+o)),t.left&&(e.moveTo(n,r+o),e.lineTo(n,r)),e.stroke()}function ct(e,t,n,r,i,o,s,a,l,c,d){const m=ae.resolveGridLayout(t,o/a,s/a);for(const g of m.cells){const w=g.cell.style?.backgroundColor??n.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(r+g.xMm*a,i+g.yMm*a,g.widthMm*a,g.heightMm*a))}st(e,m,n,r,i,a,l);const h=t.paddingMm??.5;for(const g of m.cells){const w=g.cell.text??"";if(!w)continue;const b=u.mergeComponentStyles(n.style,g.cell.style),_=u.resolveFontSize(b,l),I=g.cell.indentMm??0,P=Math.max(0,g.widthMm-2*h-I),F=C.wrapText(w,P,{fontSizePt:_.fontSizePt,bold:b.bold,italic:b.italic,fontFamily:b.fontFamily??c,letterSpacingPt:b.letterSpacing},d).join(`
3
- `);Pe(e,{text:F,fontSizePx:_.fontSizePx,bold:b.bold??!1,italic:b.italic,color:u.resolveTextColor(b,L.DEFAULT_TEXT_COLOR),align:b.align??"left",lineHeight:u.resolveLineHeight(b),letterSpacingPx:u.ptToPx(b.letterSpacing??0,l)},r+(g.xMm+h+I)*a,i+(g.yMm+h)*a,P*a,Math.max(0,g.heightMm-2*h)*a,b.fontFamily??c,b.verticalAlign??"middle")}}function dt(e,t,n,r,i,o,s,a,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=W.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("./defaults-xhmcLLrf.cjs"),G=require("./template-bindings-BJR4k7qZ.cjs"),u=require("./style-UgIJSA1F.cjs"),U=require("./render-plan-7xpGrCEl.cjs"),X=require("./validate-BJ5HIWY8.cjs"),ce=require("./dataset-BkRmwgeJ.cjs"),A=require("./assets-C2U-e-Sz.cjs"),f=require("./json-snapshot-D1NTP2oI.cjs"),de=require("./grid-geometry-CZ_cYB6O.cjs"),Le=require("./grid-strokes-Cr7DwUux.cjs"),B=require("./capabilities-CsZ-pNHR.cjs"),Ke=require("./progress-BnLiS5eH.cjs"),Xe=require("./page-window-index-DEjnM6IB.cjs"),M=require("./template-registry-D3SjENi6.cjs"),W=require("./param-validation-DCK039V1.cjs"),me=require("./data-explanation-BktvER5B.cjs"),he=require("./template-outline-B3xVkzSv.cjs"),oe=require("./template-fragments-DFUpq5QM.cjs"),ge=require("./tree-BX380Rr7.cjs"),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 P(e,t){return t?.classNames?.[e]??Ze[e]}class Qe{constructor(){this.props=[]}add(t,r){return r==null||r===!1||r===""?this:(this.props.push([t,String(r)]),this)}mm(t,r,n,o=2){return this.add(t,`${u.round(u.mmToPx(r,n),o)}px`)}toString(){let t="";for(const[r,n]of this.props)t+=`${r}:${n};`;return t}applyTo(t){const r=this.toString();r&&(t.style.cssText=r)}}function T(e,t="unset"){return new Qe().add("all",t).add("display",e).add("box-sizing","border-box")}function Ie(e,t,r){e.add("color",t.color).add("font-family",t.fontFamily).add("font-weight",t.bold!=null?t.bold?"700":"400":void 0).add("font-style",t.italic!=null?t.italic?"italic":"normal":void 0).add("text-decoration",t.underline!=null?t.underline?"underline":"none":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("line-height",String(u.resolveLineHeight(t))).add("text-align",t.align);const n=u.resolveFontSize(t,r);e.add("font-size",`${u.round(n.fontSizePx,2)}px`)}function et(e,t,r){const n=t.style??{};Ie(e,n,r),e.add("background-color",n.backgroundColor).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0)}function tt(e,t,r,n,o,a){const s=e.cell,i=a.createElement("td");i.className=P("cell",o),i.dataset.mrRowIndex=String(e.ri),i.dataset.mrColumnIndex=String(e.ci),i.setAttribute("role",t.table?.role==="header"?"columnheader":"cell"),s.colSpan&&(i.colSpan=s.colSpan),s.rowSpan&&(i.rowSpan=s.rowSpan);const l=u.mergeComponentStyles(t.style,s.style),c=T("block").add("position","absolute").mm("left",e.xMm,n).mm("top",e.yMm,n).mm("width",e.widthMm,n).mm("height",e.heightMm,n).add("background-color",l.backgroundColor).add("vertical-align",l.verticalAlign??"middle");Ie(c,l,n),c.applyTo(i);const d=a.createElement("div");d.className="mr-cell-content",T("flex").add("position","absolute").mm("left",r+(s.indentMm??0),n).mm("right",r,n).mm("top",r,n).mm("bottom",r,n).add("flex-direction","column").add("justify-content",l.verticalAlign==="top"?"flex-start":l.verticalAlign==="bottom"?"flex-end":"center").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(d),s.text!=null&&d.append(s.text);for(const m of s.children??[])d.appendChild(ue(m,n,o,a));return i.appendChild(d),i}function rt(e,t,r,n){return Le.resolveGridStrokes(e,t).map(o=>{const a=`${u.round(o.widthPt*r/72,2)}px solid ${o.color}`,s=n.createElement("div");s.className="mr-grid-edge",s.setAttribute("aria-hidden","true");const i=o.kind==="h";return T("block").add("position","absolute").add("pointer-events","none").mm("left",i?o.from:o.pos,r).mm("top",i?o.pos:o.from,r).mm("width",i?o.to-o.from:0,r).mm("height",i?0:o.to-o.from,r).add(i?"border-top":"border-left",a).applyTo(s),s})}function nt(e,t,r,n,o){const a=o.createElement("table");a.className=P("grid",n),a.setAttribute("role","table"),T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(a);const s=de.resolveGridLayout(e,t.widthMm,t.heightMm),i=o.createElement("tbody");T("contents").applyTo(i),a.appendChild(i);const l=e.cells.map(()=>{const d=o.createElement("tr");return d.className=P("row",n),d.setAttribute("role","row"),T("contents").applyTo(d),i.appendChild(d),d});for(const d of s.cells)l[d.ri].appendChild(tt(d,t,e.paddingMm??.5,r,n,o));const c=o.createElement("div");return T("block").add("position","relative").add("width","100%").add("height","100%").applyTo(c),c.append(a,...rt(s,t,r,o)),c}function ot(e,t,r,n){const o=n.createElement("div");o.className=P("paragraph",r),T("block").add("text-align",e.align).add("line-height",e.lineHeight!=null?String(e.lineHeight):void 0).mm("margin-top",e.spaceBeforeMm??0,t).mm("margin-bottom",e.spaceAfterMm??0,t).mm("text-indent",e.indentMm??0,t).applyTo(o);for(const a of e.segments||[]){const s=n.createElement("span");s.className=P("segment",r),s.textContent=a.kind==="field"?a.field??"":a.text??"";const i=T("inline");if(a.style){const l=a.style;i.add("color",l.color).add("font-family",l.fontFamily).add("font-weight",l.bold!=null?l.bold?"700":"400":void 0).add("font-style",l.italic!=null?l.italic?"italic":"normal":void 0).add("text-decoration",l.underline!=null?l.underline?"underline":"none":void 0),(l.fontSize!=null||l.fontSizePx!=null)&&i.add("font-size",`${u.round(u.resolveFontSize(l,t).fontSizePx,2)}px`)}i.applyTo(s),o.appendChild(s)}return o}function it(e,t,r,n){if(U.isRichText(e)){const o=n.createElement("div");o.className=P("rich",r),T("block").applyTo(o);for(const a of e.richParagraphs)o.appendChild(ot(a,t,r,n));return o}if(Array.isArray(e.lines)&&e.lines.length>0){const o=n.createElement("div");o.className=P("lines",r),T("block").applyTo(o);for(const a of e.lines){const s=n.createElement("div");s.className=P("line",r),s.textContent=a,T("block").add("white-space","pre").add("min-height","1lh").applyTo(s),o.appendChild(s)}return o}return e.text??""}function at(e,t,r,n){const o=n.createElement("div");o.className=P("text",r);const a=e.style||{};return T("flex").add("width","100%").add("height","100%").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow-wrap","anywhere").add("overflow","hidden").applyTo(o),o.append(it(e,t,r,n)),o}function st(e,t,r){const n=r.createElement("img");return n.className=P("image",t),n.src=e.imageData,T("block").add("width","100%").add("height","100%").add("object-fit","contain").applyTo(n),n.alt=e.kind,n}function Ee(e,t,r,n){const o=n.createElement("div");o.className=P("shape",r);const a=e.style||{},s=u.resolveStroke(a),i=u.resolveBoxBorders(a),l=`${u.round(s.widthPt*t/72,2)}px solid ${s.color}`,c=T("block");return e.grid?c.add("position","relative"):e.kind==="rect"?(i.top&&c.add("border-top",l),i.right&&c.add("border-right",l),i.bottom&&c.add("border-bottom",l),i.left&&c.add("border-left",l)):e.kind==="ellipse"?(i.inner&&c.add("border",l).add("border-radius","50%"),a.backgroundColor&&c.add("background-color",a.backgroundColor)):e.kind==="line"&&c.add("height","0").add("border-top",l),c.add("box-sizing","border-box").add("width","100%").add("height","100%"),c.applyTo(o),o}function lt(e,t,r){const n=r.createElementNS("http://www.w3.org/2000/svg","svg"),o=u.mmToPx(e.widthMm,t),a=u.mmToPx(e.heightMm,t);n.setAttribute("width",String(Math.max(1,o))),n.setAttribute("height",String(Math.max(1,a))),n.setAttribute("aria-hidden","true"),n.style.overflow="visible",n.style.display="block";const s=r.createElementNS("http://www.w3.org/2000/svg","line");s.setAttribute("x1","0"),s.setAttribute("x2",String(o)),s.setAttribute("y1",e.lineDirection==="up"?String(a):"0"),s.setAttribute("y2",e.lineDirection==="up"?"0":String(a));const i=u.resolveStroke({...e.style,borderColor:e.style?.lineColor??e.style?.borderColor});return s.setAttribute("stroke",i.color),s.setAttribute("stroke-width",String(i.widthPt*t/72)),n.appendChild(s),n}function ue(e,t,r,n){const o=n.createElement("div");o.className=`${P("comp",r)} mr-kind-${e.kind}`;const a=T("block").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(et(a,e,t),a.applyTo(o),U.isImageBackedComponent(e))return o.appendChild(st(e,r,n)),o;if(e.kind==="text")return o.appendChild(at(e,t,r,n)),o;if(e.grid){const i=Ee(e,t,r,n);return i.appendChild(nt(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"&&e.lineDirection)return o.appendChild(lt(e,t,n)),o;if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse")return o.appendChild(Ee(e,t,r,n)),o;const s=n.createElement("div");return s.className=P("unknown",r),T("block").applyTo(s),s.textContent=e.fallbackText??`[${e.kind}]`,s.dataset.mrUnsupported=e.kind,s.setAttribute("role","note"),o.appendChild(s),o}function ke(e,t,r,n){const o=n.createElement("div");return o.className=P("page",r),T("block","initial").add("position","relative").add("font-family",$.DEFAULT_FONT_FAMILY).add("font-size",`${u.round(u.resolveFontSize(void 0,t).fontSizePx,2)}px`).add("line-height",String(u.resolveLineHeight(void 0))).add("white-space","pre-wrap").add("direction","ltr").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("color",$.DEFAULT_TEXT_COLOR).add("overflow","hidden").add("box-sizing","border-box").applyTo(o),e.components.forEach((a,s)=>{const i=ue(a,t,r,n);i.dataset.mrComponentIndex=String(s),o.appendChild(i)}),o}function ct(e,t,r={}){const n=r.dpi??96;B.reportOutputDiagnostics(e,"dom",r);const o=t.createElement("div");return o.className=P("root",r),T("block").applyTo(o),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{o.appendChild(ke(a,n,r,t))}),o}function D(e){if(e?.aborted)throw e.reason??new DOMException("The operation was aborted.","AbortError")}const dt=(e,t)=>(D(t),/^data:image\/(?:png|jpe?g|webp|gif|svg\+xml)[;,]/i.test(e)?new Promise((r,n)=>{const o=new Image,a=()=>{o.onload=null,o.onerror=null,t?.removeEventListener("abort",s)},s=()=>{a(),o.src="",n(t?.reason??new DOMException("The operation was aborted.","AbortError"))};o.onload=()=>{a(),r(o)},o.onerror=()=>{a(),n(new Error("Image could not be decoded for Canvas output."))},t?.addEventListener("abort",s,{once:!0}),o.src=e}):Promise.reject(new TypeError("Canvas imageData must be an image data URL; provide imageLoader for other sources.")));function mt(e,t,r){return D(r),r?new Promise((n,o)=>{const a=()=>o(r.reason??new DOMException("The operation was aborted.","AbortError"));r.addEventListener("abort",a,{once:!0}),Promise.resolve().then(()=>e(t,r)).then(n,o).finally(()=>r.removeEventListener("abort",a))}):e(t)}async function ht(e,t,r){const n=new Map;for(const o of e.components)!U.isImageBackedComponent(o)||n.has(o.imageData)||n.set(o.imageData,await mt(t,o.imageData,r));return D(r),n}function gt(e,t,r,n,o,a){const s=t,i=s.naturalWidth??s.width??o,l=s.naturalHeight??s.height??a;if(i<=0||l<=0)throw new RangeError("Decoded Canvas image dimensions must be positive.");const c=Math.min(o/i,a/l),d=i*c,m=l*c;e.drawImage(t,r+(o-d)/2,n+(a-m)/2,d,m)}function Fe(e){return Xe.createPageWindowIndex(e.pageHeightsPx,e.gapPx).window(e.viewportHeightPx,e.scrollTopPx,e.overscan)}const pe=96/25.4;function ie(e,t=96){const r=t/96*pe;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function $e(e,t,r,n=64e6){if(!Number.isFinite(t)||t<=0||!Number.isFinite(r)||r<=0)throw new RangeError("Canvas dpr and dpi must be positive finite numbers.");if(!Number.isFinite(n)||n<=0)throw new RangeError("maxCanvasPixels must be positive and finite.");const o=ie(e,r),a=Math.round(o.widthPx*t),s=Math.round(o.heightPx*t);if(!Number.isSafeInteger(a)||!Number.isSafeInteger(s)||a*s>n)throw new RangeError("Canvas page exceeds maxCanvasPixels; reduce resolution or split the report.");return{width:a,height:s}}function De(e,t,r,n){const o=document.createElement("canvas"),{widthPx:a,heightPx:s}=ie(e,r),i=$e(e,t,r,n);o.width=i.width,o.height=i.height,o.style.width=`${a}px`,o.style.height=`${s}px`;const l=o.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,a,s),{canvas:o,ctx:l}}function ut(e,t=96){return u.resolveFontSize(e,t).fontSizePx}function Ne(e,t,r,n,o,a,s,i="top"){e.font=`${t.italic?"italic ":""}${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,"letterSpacing"in e&&(e.letterSpacing="0px"),e.fillStyle=t.color,e.textBaseline="alphabetic";const l=t.fontSizePx*t.lineHeight,c=t.text===""?[""]:t.text.split(`
2
+ `),d=c.length*l;let m=n;i==="middle"?m=n+(a-d)/2:i==="bottom"&&(m=n+a-d),c.forEach((h,g)=>{pt(e,h,t,r,m+g*l+t.fontSizePx*.8,o)}),e.textAlign="left"}function pt(e,t,r,n,o,a){const s=Array.from(t),i=r.letterSpacingPx??0;if(!i){e.textAlign=r.align==="center"?"center":r.align==="right"?"right":"left";const m=r.align==="center"?n+a/2:r.align==="right"?n+a:n;e.fillText(t,m,o);return}const l=e.measureText(t).width+Math.max(0,s.length-1)*i,c=r.align==="center"?n+(a-l)/2:r.align==="right"?n+a-l:n;e.textAlign="left";let d="";s.forEach((m,h)=>{e.fillText(m,c+e.measureText(d).width+h*i,o),d+=m})}function ft(e,t,r,n,o,a,s){for(const i of Le.resolveGridStrokes(t,r))e.strokeStyle=i.color,e.lineWidth=u.ptToPx(i.widthPt,s),e.beginPath(),i.kind==="v"?(e.moveTo(n+i.pos*a,o+i.from*a),e.lineTo(n+i.pos*a,o+i.to*a)):(e.moveTo(n+i.from*a,o+i.pos*a),e.lineTo(n+i.to*a,o+i.pos*a)),e.stroke()}function wt(e,t,r,n,o,a){e.beginPath(),t.top&&(e.moveTo(r,n),e.lineTo(r+o,n)),t.right&&(e.moveTo(r+o,n),e.lineTo(r+o,n+a)),t.bottom&&(e.moveTo(r+o,n+a),e.lineTo(r,n+a)),t.left&&(e.moveTo(r,n+a),e.lineTo(r,n)),e.stroke()}function vt(e,t,r,n,o,a,s,i,l,c,d){const m=de.resolveGridLayout(t,a/i,s/i);for(const g of m.cells){const p=g.cell.style?.backgroundColor??r.style?.backgroundColor;p&&(e.fillStyle=p,e.fillRect(n+g.xMm*i,o+g.yMm*i,g.widthMm*i,g.heightMm*i))}ft(e,m,r,n,o,i,l);const h=t.paddingMm??.5;for(const g of m.cells){const p=g.cell.text??"";if(!p)continue;const y=u.mergeComponentStyles(r.style,g.cell.style),L=u.resolveFontSize(y,l),R=g.cell.indentMm??0,x=Math.max(0,g.widthMm-2*h-R),I=A.wrapText(p,x,{fontSizePt:L.fontSizePt,bold:y.bold,italic:y.italic,fontFamily:y.fontFamily??c,letterSpacingPt:y.letterSpacing},d).join(`
3
+ `);Ne(e,{text:I,fontSizePx:L.fontSizePx,bold:y.bold??!1,italic:y.italic,color:u.resolveTextColor(y,$.DEFAULT_TEXT_COLOR),align:y.align??"left",lineHeight:u.resolveLineHeight(y),letterSpacingPx:u.ptToPx(y.letterSpacing??0,l)},n+(g.xMm+h+R)*i,o+(g.yMm+h)*i,x*i,Math.max(0,g.heightMm-2*h)*i,y.fontFamily??c,y.verticalAlign??"middle")}}function yt(e,t,r,n,o,a,s,i,l){const c=t.style??{},d=u.resolveFontSize(c,s),m=U.isRichText(t)?t.richParagraphs.map(h=>h.segments.map(g=>g.text??g.field??"").join("")).join(`
4
4
  `):t.lines?.length?t.lines.join(`
5
- `):C.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??a,letterSpacingPt:c.letterSpacing},l).join(`
6
- `);Pe(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},n,r,i,o,c.fontFamily??a,c.verticalAlign)}function de(e,t,n,r,i,o,s){const a=t.leftMm*n,l=t.topMm*n,c=t.widthMm*n,d=t.heightMm*n,m=t.style??{};if(W.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?it(e,h,a,l,c,d):we(e,t,a,l,c,d);return}if(t.grid){ct(e,t.grid,t,a,l,c,d,n,r,i,o);return}switch(t.kind){case"text":{dt(e,t,a,l,c,d,r,i,o);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(a,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),lt(e,g,a,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,w=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(a,g),e.lineTo(a+c,w),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,r),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:we(e,t,a,l,c,d);break}}function we(e,t,n,r,i,o){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(n,r,i,o),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,n+3,r+14),e.restore()}async function mt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:n="png",quality:r=.92,...i}=t;if(n!=="png"&&n!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(r)||r<0||r>1)throw new RangeError("Image quality must be between 0 and 1.");k(t.signal);const o=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=o.plan;const s=[...o.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],a=n==="jpeg"?"image/jpeg":"image/png",l=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){k(t.signal);const m=await Ae(e.pages[d],d,i,s);try{l.push(await ut(m,a,r,t.signal))}finally{m.width=0,m.height=0}await ze.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return k(t.signal),{blobs:l,diagnostics:s}}function ut(e,t,n,r){return k(r),new Promise((i,o)=>{const s=()=>o(r?.reason??new DOMException("The operation was aborted.","AbortError"));r?.addEventListener("abort",s,{once:!0});try{e.toBlob(a=>{r?.removeEventListener("abort",s),a?i(a):o(new Error("Canvas encoding failed; no empty image was emitted."))},t,n)}catch(a){r?.removeEventListener("abort",s),o(a)}})}function ht(e,t={}){if(k(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=$.reportOutputDiagnostics(e,"canvas",t),m=gt(e,a,l);for(const h of m)$.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new $.OutputFidelityError(d);for(let h=a;h<=l;h++){k(t.signal);const g=e.pages[h],{canvas:w,ctx:b}=Ce(g,n,r,t.maxCanvasPixels);for(const _ of g.components)de(b,_,i,r,o,s);c.push(w)}return{canvases:c,diagnostics:d}}function gt(e,t,n){return n<t?[]:e.pages.slice(t,n+1).flatMap((r,i)=>r.components.flatMap((o,s)=>W.isImageBackedComponent(o)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+i,componentIndex:s,kind:o.kind,nid:o.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function pt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");k(t.signal);const n=await C.resolvePlanAssets(e,{...t,format:"canvas"});e=n.plan;const r=[...n.diagnostics,...$.reportOutputDiagnostics(e,"canvas",t)],i=[],o=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=o;s++)i.push(await Ae(e.pages[s],s,t,r));return{canvases:i,diagnostics:r}}async function Ae(e,t,n,r){const i=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),o=n.dpi??96,s=n.fontFamily??L.DEFAULT_FONT_FAMILY,a=await Ie(e,t,n,r);k(n.signal);const{canvas:l,ctx:c}=Ce(e,i,o,n.maxCanvasPixels);for(const d of e.components)de(c,d,o/25.4,o,s,n.measurer??C.heuristicMeasurer,a);return l}async function Ie(e,t,n,r){const i=n.imageLoader??tt;return rt(e,async(o,s)=>{try{return await i(o,s)}catch(a){if(s?.aborted)throw a;const l=e.components.findIndex(m=>m.imageData===o),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw r.push(d),$.notifyOutputDiagnostic(d,n),a}},n.signal)}function ft(e,t={}){const n=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),r=t.dpi??96,i=r/96*ce,o=t.fontFamily??L.DEFAULT_FONT_FAMILY,s=t.measurer??C.heuristicMeasurer,a=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),h={start:0,end:-1};let g=null,w=null,b=null,_=null,I=[],P=0,F=[],Y=0,G=new AbortController;const he=[];function $e(){const p=g;p.innerHTML="",w=document.createElement("div"),w.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),_=document.createElement("div"),w.appendChild(b),I=[];const R=Math.min(e.pages.length,3+a*2);for(let z=0;z<R;z++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,w.appendChild(E),I.push(E)}w.appendChild(_),p.appendChild(w)}async function _e(p,R){const z=Y,E=await C.resolvePlanAssets(e,{...t,signal:G.signal,format:"canvas",start:R,end:R});he.push(...E.diagnostics);const A=E.plan.pages[R],X=await Ie(A,R,{...t,signal:G.signal},he);if(z!==Y||!g)return;const{widthPx:re,heightPx:ie}=te(A,r);let B=p.firstElementChild;(!B||B.tagName!=="CANVAS")&&(B=document.createElement("canvas"),p.innerHTML="",p.appendChild(B));const pe=Se(A,n,r,t.maxCanvasPixels);B.width=pe.width,B.height=pe.height,B.style.width=`${re}px`,B.style.height=`${ie}px`;const j=B.getContext("2d");if(j){j.setTransform(1,0,0,1,0,0),j.scale(n,n),j.fillStyle="#ffffff",j.fillRect(0,0,re,ie);for(const He of A.components)de(j,He,i,r,o,s,X);B.dataset.canvasPage=String(R),p.style.height=`${ie}px`,p.style.width=`${re}px`}}function Be(p){Y++,h.start=p.start,h.end=p.end,b.style.height=`${p.start*l+d.slice(0,p.start).reduce((E,A)=>E+A,0)}px`;const R=e.pages.length-1-p.end;_.style.height=`${R*l+d.slice(p.end+1).reduce((E,A)=>E+A,0)}px`;const z=p.end-p.start+1;I.forEach((E,A)=>{if(A<z){E.style.display="";const X=p.start+A;E.style.height=`${d[X]??0}px`}else E.style.display="none"}),F=[];for(let E=p.start;E<=p.end;E++){const A=I[E-p.start];if(!A)continue;A.firstElementChild?.dataset?.canvasPage!==String(E)&&F.push(E)}ne()}function ne(){P||F.length===0||(P=requestAnimationFrame(()=>{P=0;let p=Math.max(1,c);for(;F.length>0&&p-- >0;){const R=F.shift(),z=I[R-h.start];z&&_e(z,R).catch(()=>{})}F.length>0&&ne()}))}function J(){P||(P=requestAnimationFrame(()=>{P=0;const p=g,R=xe({pageHeightsPx:d,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:a,gapPx:l});R.start!==h.start||R.end!==h.end?Be(R):ne()}))}let K=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");k(t.signal),G=new AbortController,t.signal?.addEventListener("abort",ge,{once:!0}),$.reportOutputDiagnostics(e,"canvas",t),g=p,$e(),p.addEventListener("scroll",J,{passive:!0}),typeof ResizeObserver<"u"&&(K=new ResizeObserver(()=>J()),K.observe(p)),J()},destroy(){Y++,G.abort(),t.signal?.removeEventListener("abort",ge),P&&cancelAnimationFrame(P),P=0,K?.disconnect(),K=null,g?.removeEventListener("scroll",J),F=[],w?.remove(),g=null},window(){return{...h}}};function ge(){G.abort(t.signal?.reason)}}function me(e,t,n){let r,i;if(typeof e=="string"){const o=u.PAPER_SIZES[e];if(!o)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);r=o.widthMm,i=o.heightMm}else typeof e=="number"?(r=e,i=t??297):(r=e.widthMm,i=e.heightMm);return n?{widthMm:i,heightMm:r}:{widthMm:r,heightMm:i}}class Le{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}params(t){return this.templateParams=t,this}page(t="a4",n={},r){this.collect();const o=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:s,heightMm:a}=me(t,typeof n=="number"?n:void 0,o.landscape),l=o.margins??{};return this.pending=new ke(this,{widthMm:s,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}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class ke{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,i={}){return this.components.push({kind:"list",leftMm:n.leftMm??10,topMm:n.topMm??30,widthMm:n.widthMm??180,dataset:t,columns:r,...i}),this}rect(t,n={}){return this.components.push({kind:"rect",...t,style:n}),this}line(t,n,r,i={}){return this.components.push({kind:"line",leftMm:t,topMm:n,widthMm:r,heightMm:.5,style:i}),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,i){return this.components.push({kind:"qrcode",leftMm:r,topMm:i,widthMm:n,heightMm:n,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function wt(){return new Le}function vt(e,t={}){return oe.validateDatasetRows([],e),e.fields.map(n=>({field:n.field,header:`${n.label??n.field}${n.unit?` (${n.unit})`:""}`,semanticRole:n.semanticRole??(n.type==="number"||n.type==="decimal"?"measure":n.type==="date"?"date":n.enum?"dimension":"text"),...t[n.field]}))}function D(e,t,n=!1){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new Error(`${t} 必须是有限${n?"非负":"正"}数`)}function Z(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 yt(e){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;return D(n,"columnWidthMm"),{layout:t,columnWidthMm:n}}function bt(e){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(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const n=me(t,void 0,e.landscape),r=n.widthMm,i=n.heightMm;return D(r,"纸张 widthMm"),D(i,"纸张 heightMm"),{widthMm:r,heightMm:i}}function Mt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},n={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[r,i]of Object.entries(n))D(i,r,!0);return n}function Et(e,t){const n=e.dataset===void 0?"detail":e.dataset;if(typeof n!="string"||!n.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const r=e.titleHeightMm===void 0?10:e.titleHeightMm,i=e.titleGapMm===void 0?4:e.titleGapMm;D(r,"titleHeightMm"),D(i,"titleGapMm",!0);const o=e.title!==void 0&&e.title.length>0,s=o?r+i:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:n,titleHeightMm:r,hasTitle:o,titleSpaceMm:s}}function Tt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};Z(t.align,"listOptions.align",!0),Z(t.headerAlign,"listOptions.headerAlign",!1);for(const n of["fontSizePt","rowHeightMm","paddingMm"]){const r=t[n];r!==void 0&&D(r,`listOptions.${n}`,n==="paddingMm")}return t}function Rt(e){let t=0,n=0;for(const[r,i]of e.entries()){if(!i||typeof i.header!="string"||typeof i.field!="string"||!i.field.trim())throw new Error(`columns[${r}] 需要字符串 header 与非空 field`);Z(i.align,`columns[${r}].align`,!0),Z(i.headerAlign,`columns[${r}].headerAlign`,!1),i.flex!==void 0&&D(i.flex,`columns[${r}].flex`),i.widthMm!==void 0?(D(i.widthMm,`columns[${r}].widthMm`),t+=i.widthMm):n=Math.max(n,i.flex??1)}return{fixedWidthMm:t,maxFlex:n}}function xt(e,t,n,r){const{fixedWidthMm:i,maxFlex:o}=Rt(e.columns);if(t==="page"&&i>r)throw new Error(`固定列宽 ${i}mm 超出页面可用宽度 ${r}mm`);const s=r-i;if(t==="page"&&o>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const a=o>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/o:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?n*(d??1):s*((d??1)/o)/a);return D(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:i,maxFlex:o}}function St(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:n}=yt(e),r=bt(e);let i=r.widthMm;const o=r.heightMm,s=Mt(e);let a=i-s.marginLeftMm-s.marginRightMm;const l=o-s.marginTopMm-s.marginBottomMm;if(t==="page"&&a<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=Et(e,l),g=Tt(e),{columns:w,fixedWidthMm:b,maxFlex:_}=xt(e,t,n,a);t==="wide"&&(a=w.reduce((P,F)=>P+F.widthMm,0),D(a,"宽表总列宽"),i=a+s.marginLeftMm+s.marginRightMm,D(i,"宽表总宽度"));const I={widthMm:i,heightMm:o,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&I.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:a,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),I.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:w,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||_>0?a:b}),e.params===void 0?{pages:[I]}:{params:e.params,pages:[I]}}function Ct(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:n,copies:r,params:i}=e,o=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...n===void 0?{}:{rowKey:n},...r===void 0?{}:{copies:r}},...i===void 0?{}:{params:i},pages:o.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},a=M.validateReportTemplate(s);if(!a.ok)throw new M.ReportTemplateError(a.errors);return JSON.parse(JSON.stringify(s))}function Pt(e){return e}class N extends Error{constructor(t,n){super(n),this.code=t,this.name="ReportTemplateStoreError"}}function O(e){return JSON.parse(JSON.stringify(e))}function x(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function ve(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new N("history","修订号无效或已达上限");return String(t+1)}function At(e,t={}){const n=async(s,a)=>{x(a);const l=await e.read(s,a);return x(a),l?O(l):void 0},r=async(s,a)=>{const l=await n(s,a.signal);if((l?.revision??null)!==a.expectedRevision)throw new N("conflict","模板已变化,请重新读取后提交");return l},i=async(s,a,l)=>{if(x(a.signal),!await e.compareAndSwap(s.id,a.expectedRevision,O(s),{signal:a.signal,...l?{publication:O(l)}:{}}))throw new N("conflict","模板已被其他请求更新");return O(s)},o=async(s,a,l,c)=>{if(t.beforePublish){x(l.signal);const g=await t.beforePublish({document:M.parseReportTemplate(a),previous:s.published?M.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new N("review",g?.issues?.find(w=>w.severity==="error")?.message??"模板发布检查未通过");x(l.signal)}const d=ve(s),m=M.parseReportTemplate({...a,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),i({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{x(s);const a=await e.list(s);return x(s),O(a)},get:async(s,a={})=>{const l=await n(s,a.signal),c=a.draft?l?.draft:l?.published;return c?M.parseReportTemplate(c):void 0},history:async(s,a)=>{x(a);const l=await e.history(s,a);return x(a),O(l)},saveDraft:async(s,a)=>{a={...a},x(a.signal);const l=M.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await r(l.id,a),d=ve(c);return i({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},a)},publish:async(s,a)=>{a={...a};const l=await r(s,a);if(!l)throw new N("missing","模板不存在");if(!l.draft)throw new N("draft","没有可发布的草稿");return o(l,l.draft,a)},rollback:async(s,a,l)=>{l={...l};const c=await r(s,l);if(!c)throw new N("missing","模板不存在");x(l.signal);const d=await e.getVersion(s,a,l.signal);if(!d)throw new N("history","历史修订不存在");return o(c,d.document,l,a)}}}function It(){const e=new Map,t=new Map;return{read:async(n,r)=>{x(r);const i=e.get(n);return i?O(i):void 0},list:async n=>(x(n),Array.from(e.values(),({id:r,revision:i,publishedRevision:o})=>({id:r,revision:i,...o?{publishedRevision:o}:{}}))),history:async(n,r)=>(x(r),Array.from(t.get(n)?.values()??[],i=>O(i))),getVersion:async(n,r,i)=>{x(i);const o=t.get(n)?.get(r);return o?O(o):void 0},compareAndSwap:async(n,r,i,o)=>{if(x(o.signal),(e.get(n)?.revision??null)!==r)return!1;if(i.id!==n)throw new N("history","状态 ID 与存储 ID 不一致");const s=O(i),a=o.publication;if(a){const l=t.get(n)??new Map;if(l.has(a.revision)||a.revision!==i.revision||a.document.id!==n)throw new N("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(a.revision,O(a)),t.set(n,l)}return e.set(n,s),!0}}}function Lt(e,t){const n=e.publishedRevision??e.published?.revision;for(const r of[e.draftRevision,n])if(r!==void 0&&(typeof r!="string"||!r.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==n))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&n!==void 0&&n!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...n===void 0?{}:{publishedRevision:n}}}function kt(e,t){const n=M.parseReportTemplate(e);if(t.id===n.id)throw new Error("复制模板应使用新的 ID");const{revision:r,...i}=n;return M.parseReportTemplate({...i,id:t.id,name:t.name})}function Dt(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,n=new Map,r=[];for(const i of e){const o=M.parseReportTemplate(i.document);if(t.has(o.id))throw new Error(`模板 ID 重复:${o.id}`);if(i.category!==void 0&&(typeof i.category!="string"||i.category.length>128)||i.tags!==void 0&&(!Array.isArray(i.tags)||i.tags.length>20||i.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=Lt(i,o),{template:a,...l}=o;t.set(o.id,o),i.published?n.set(o.id,M.parseReportTemplate(i.published)):s.publishedRevision&&n.set(o.id,M.parseReportTemplate(o)),r.push({...l,...s,...i.category?{category:i.category}:{},...i.tags?{tags:[...i.tags]}:{}})}return r.sort((i,o)=>i.id<o.id?-1:1),{search:async i=>{ye(i.signal);const o=i.limit??30;if(!Number.isSafeInteger(o)||o<1||o>100)throw new RangeError("模板每页数量应为 1–100");const s=i.query?.trim().toLocaleLowerCase()??"",a=r.filter(c=>(!i.category||c.category===i.category)&&(!i.cursor||c.id>i.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of r)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:a.slice(0,o),...a.length>o?{next:a[o-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(i,o)=>{ye(o.signal);const s=o.mode==="published"?n.get(i):t.get(i);return s?M.parseReportTemplate(s):void 0}}}function ye(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function Ft(e){return e.map(t=>t.map(n=>/[\t\r\n"]/.test(n)?`"${n.replace(/"/g,'""')}"`:n).join(" ")).join(`\r
7
- `)}function Nt(e,t){const n=e[e.length-1];e.length>1&&n?.length===1&&n[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Ot(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const n=[[]];let r="",i=!1,o=!1,s=0;function a(){if(++s>t)throw new Error("Clipboard cell limit exceeded");n[n.length-1].push(r),r="",o=!1}for(let l=0;l<e.length;l++){const c=e[l];if(i){if(c!=='"'){r+=c;continue}if(e[l+1]==='"'){r+='"',l++;continue}i=!1,o=!0;continue}if(c==='"'&&!r&&!o){i=!0;continue}if(c===" "){a();continue}if(c==="\r"||c===`
8
- `){a(),n.push([]),c==="\r"&&e[l+1]===`
9
- `&&l++;continue}if(o)throw new Error("Invalid quoted clipboard value");r+=c}if(i)throw new Error("Unclosed clipboard quote");return a(),Nt(n,e),n}class De extends Error{constructor(t,n,r){const i=typeof n.label=="string"?n.label:"单元格",o={definition:`${i}的编辑器配置无效`,type:`${i}的编辑器与数据类型不一致`,required:`${i}不能为空`,min:`${i}不能小于 ${r}`,max:`${i}不能大于 ${r}`,precision:`${i}最多保留 ${r} 位小数`,length:`${i}最多允许 ${r} 个字符`,choice:`${i}请选择有效选项`,date:`${i}请输入有效日期(YYYY-MM-DD)`};super(o[t]),this.code=t,this.field=n,this.expected=r,this.name="ReportCellFieldError"}}function v(e,t,n){throw new De(t,e,n)}function Fe(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function $t(e){const[t="",n="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(n))}function _t(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&$t(t)>e.precision&&v(e,"precision",e.precision)}function Bt(e,t){Fe(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Ht(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function zt(e){[e.min,e.max].some(t=>t!==void 0&&!Fe(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Wt(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const n=e.valueType==="text"?"string":e.valueType,r=new Set;for(const i of t.options)(!i||typeof i.value!==n||typeof i.value=="number"&&!Number.isFinite(i.value))&&v(t,"definition"),i.label!==void 0&&typeof i.label!="string"&&v(t,"definition"),r.has(i.value)&&v(t,"definition"),r.add(i.value)}function Ut(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function Ne(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),Ut(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Ht(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&zt(t),t.type==="enum"&&Wt(e,t)}function jt(e,t,n){if(!e.editable)throw new f.ReportCellEditError("readonly");n&&Ne(e,n);const r=f.parseReportCellInput(e,t);return n?(n.required&&typeof r=="string"&&!r.trim()&&v(n,"required"),r===null||r===""?(n.required&&v(n,"required"),r):(n.type==="number"&&_t(n,r),n.type==="date"&&Bt(n,r),n.type==="text"&&n.maxLength!==void 0&&[...String(r)].length>n.maxLength&&v(n,"length",n.maxLength),n.type==="enum"&&!n.options.some(i=>Object.is(i.value,r))&&v(n,"choice"),r)):r}class y extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function q(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function Q(e,t=1){const n=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new y("limit");q(e.signal),Math.floor(e.scanned/2048)>n&&(await e.yieldToHost(),q(e.signal))}function ue(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function be(e,t,n){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(a=>Number.isSafeInteger(a)&&a>=0))throw new y("selection");const r=e.pages[t.pageIndex]?.components[t.componentIndex];if(!r?.grid||t.rowIndex>=r.grid.cells.length)throw new y("selection");const i=r.grid.colWidthsMm?.length??r.grid.cells.reduce((a,l)=>Math.max(a,l.length),1);if(t.columnIndex>=i)throw new y("selection");const o=r.table,s=e.pages[n.pageIndex]?.components[n.componentIndex]?.table;if(o&&s&&o.id===s.id){const a=s.columnKeys.indexOf(o.columnKeys[t.columnIndex]??"");if(a<0)throw new y("selection");return{grid:o.id,row:ue(r)+t.rowIndex,column:a}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function qt(e,t,n){const r=be(e,t.anchor,t.anchor),i=be(e,t.focus,t.anchor);if(r.grid!==i.grid)throw new y("selection");const o=(Math.abs(r.row-i.row)+1)*(Math.abs(r.column-i.column)+1);if(!Number.isSafeInteger(o)||o>n)throw new y("limit");return{grid:r.grid,rowStart:Math.min(r.row,i.row),rowEnd:Math.max(r.row,i.row),columnStart:Math.min(r.column,i.column),columnEnd:Math.max(r.column,i.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function Gt(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function Vt(e){if(e.valueType==="text"||e.valueType==="boolean"||Gt(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new y("precision");return t}function Yt(e,t,n){if(e.seen.has(n))return;e.seen.add(n),e.selected++;const r=t?Vt(t):null;r===null?e.excluded++:e.values.push(r)}function Jt(e,t,n,r){return r.origin?e.table?.id===r.origin.id:`${t}:${n}`===r.grid}function Kt(e,t,n){return n.origin?n.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function Xt(e,t,n,r){const i=r.origin?ue(e)+t:t,o=Kt(e,n,r);return i<r.rowStart||i>r.rowEnd||o<r.columnStart||o>r.columnEnd?null:`${r.grid}:${i}:${o}`}function Zt(e,t){const n=t.origin?ue(e):0,r=Math.max(0,t.rowStart-n),i=Math.min(e.grid.cells.length,t.rowEnd-n+1);return i>r?i:0}async function Qt(e,t,n,r,i){const o=e.grid;if(t>r.maxScanned)throw new y("limit");const s=o.colWidthsMm?.length??o.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>r.maxScanned)throw new y("limit");const a=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await r.yieldToHost(),q(r.signal));let c=0;for(const d of o.cells[l]){for(await Q(r);c<s&&(a.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(o.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await Q(r,m-1);for(let w=c;w<c+m;w++)a.set(w,h);const g=Xt(e,l,c,n);g&&Yt(i,d,g),c+=m}}}async function en(e,t,n){const r={values:[],seen:new Set,excluded:0,selected:0};for(let i=0;i<e.pages.length;i++){await Q(n);const o=e.pages[i];for(let s=0;s<o.components.length;s++){await Q(n);const a=o.components[s];if(!a.grid||!Jt(a,i,s,t)||a.table&&a.table.role!=="body")continue;const l=Zt(a,t);l&&await Qt(a,l,t,n,r)}}return r}function V(e){if(!Number.isFinite(e))throw new y("overflow");return e}function tn(e){let t=0,n=0;for(const r of e){const i=r-n,o=V(t+i);n=o-t-i,t=o}return t}async function Me(e,t){let n=[...e],r=new Array(e.length);for(let o=1;o<e.length;o*=2){for(let s=0;s<e.length;s+=o*2){const a=Math.min(s+o,e.length),l=Math.min(s+o*2,e.length);let c=s,d=a;for(let m=s;m<l;m++)r[m]=d>=l||c<a&&n[c]<=n[d]?n[c++]:n[d++],m%2048===0&&(await t.yieldToHost(),q(t.signal))}[n,r]=[r,n]}const i=Math.floor(n.length/2);return n.length%2?n[i]:V(n[i-1]/2+n[i]/2)}function nn(e){const t=tn(e);let n=1/0,r=-1/0;for(const i of e)n=Math.min(n,i),r=Math.max(r,i);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:n,MAX:r,COUNT:e.length}}function Oe(e,t){if(typeof e!="string"||e.length>256)throw new y("expression");const n=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!n.length||n.length>64)throw new y("expression");let r=0;function i(a){if(a>16)throw new y("expression");const l=n[r++];if(l==="+"||l==="-")return(l==="-"?-1:1)*i(a+1);if(l==="("){const c=o(0,a+1);if(n[r++]!==")")throw new y("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return V(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return V(Number(l));throw new y("expression")}function o(a,l){let c=i(l);for(;r<n.length;){const d=n[r],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<a)break;r++;const h=o(m+1,l+1);if(d==="/"&&h===0)throw new y("division");c=V(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=o(1,0);if(r!==n.length)throw new y("expression");return s}function rn(e){const t=e.maxCells??1e5,n=e.maxScannedCells??2e5,r=e.precision??2;if(![t,n].every(i=>Number.isSafeInteger(i)&&i>=1&&i<=2e6))throw new y("limit");if(!Number.isInteger(r)||r<0||r>12)throw new y("precision");return{maxCells:t,maxScanned:n,precision:r}}async function on(e,t,n={}){const r=rn(n),i={scanned:0,maxScanned:r.maxScanned,signal:n.signal,yieldToHost:n.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};q(i.signal);const o=await en(e,qt(e,t,r.maxCells),i),s=n.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new y("expression");let a=null;if(s==="count")a=o.values.length;else if(o.values.length)if(s==="median")a=await Me(o.values,i);else{const l=nn(o.values);s==="expression"?(/\bMEDIAN\b/i.test(n.expression??"")&&(l.MEDIAN=await Me(o.values,i)),a=Oe(n.expression??"",l)):a=l[s.toUpperCase()]}if(q(i.signal),a!==null&&Number.isInteger(a)&&!Number.isSafeInteger(a))throw new y("precision");return{value:a,formatted:a===null?"—":a.toFixed(r.precision),numericCells:o.values.length,excludedCells:o.excluded,selectedCells:o.selected,precision:r.precision}}exports.DEFAULT_BORDER_PT=L.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=L.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=L.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=L.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=L.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=L.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=L.SCHEMA_VERSION_MACH;exports.ReportBindingError=U.ReportBindingError;exports.evalStyleRule=U.evalStyleRule;exports.formatValue=U.formatValue;exports.parseDateLocal=U.parseDateLocal;exports.resolveComponentBinding=U.resolveComponentBinding;exports.toExcelNumberFormat=U.toExcelNumberFormat;exports.toNumber=U.toNumber;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=W.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=W.isImageBackedComponent;exports.isRichText=W.isRichText;exports.assertRenderPlan=ee.assertRenderPlan;exports.validateComponent=ee.validateComponent;exports.validatePage=ee.validatePage;exports.validateRenderPlan=ee.validateRenderPlan;exports.datasetJsonSchema=oe.datasetJsonSchema;exports.validateDatasetRows=oe.validateDatasetRows;exports.OutputAssetError=C.OutputAssetError;exports.charWidthEm=C.charWidthEm;exports.createCanvasMeasurer=C.createCanvasMeasurer;exports.createHeuristicMeasurer=C.createHeuristicMeasurer;exports.heuristicMeasurer=C.heuristicMeasurer;exports.measureTextMm=C.measureTextMm;exports.resolvePlanAssets=C.resolvePlanAssets;exports.wrapText=C.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=ae.resolveGridLayout;exports.OutputFidelityError=$.OutputFidelityError;exports.inspectOutputCapabilities=$.inspectOutputCapabilities;exports.reportOutputDiagnostics=$.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=M.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=M.ReportTemplateError;exports.createTemplateRegistry=M.createTemplateRegistry;exports.defineReportTemplate=M.defineReportTemplate;exports.parseReportTemplate=M.parseReportTemplate;exports.serializeReportTemplate=M.serializeReportTemplate;exports.validateReportTemplate=M.validateReportTemplate;exports.validateReportTemplateDocument=M.validateReportTemplateDocument;exports.ReportParamValidationError=H.ReportParamValidationError;exports.assertReportParams=H.assertReportParams;exports.formatReportDateRange=H.formatReportDateRange;exports.isReportDate=H.isReportDate;exports.isReportMonth=H.isReportMonth;exports.isReportYear=H.isReportYear;exports.parseReportDateRange=H.parseReportDateRange;exports.reportParamsJsonSchema=H.reportParamsJsonSchema;exports.validateReportParamDefinitions=H.validateReportParamDefinitions;exports.validateReportParams=H.validateReportParams;exports.TreeRowLimitError=se.TreeRowLimitError;exports.createTreeTable=se.createTreeTable;exports.validateTreeOptions=se.validateTreeOptions;exports.PageBuilder=ke;exports.ReportCalculationError=y;exports.ReportCellFieldError=De;exports.ReportTemplateStoreError=N;exports.TemplateBuilder=Le;exports.calculateReportSelection=on;exports.classOf=S;exports.cloneReportTemplate=kt;exports.columnsFromContract=vt;exports.computePageWindow=xe;exports.createCanvasPager=ft;exports.createLabelTemplate=Ct;exports.createLocalTemplateCatalog=Dt;exports.createMemoryTemplateStore=It;exports.createProviderReport=Pt;exports.createTableTemplate=St;exports.createTemplate=wt;exports.createTemplateManager=At;exports.evaluateReportAggregateExpression=Oe;exports.formatReportClipboard=Ft;exports.measurePageSizePx=te;exports.parseReportCellFieldInput=jt;exports.parseReportClipboard=Ot;exports.planFontSizePx=ot;exports.renderComponent=le;exports.renderPage=Re;exports.renderPlan=et;exports.renderPlanToCanvas=ht;exports.renderPlanToCanvasAsync=pt;exports.renderPlanToImages=mt;exports.resolvePaper=me;exports.validateReportCellFieldDefinition=Ne;
5
+ `):A.wrapText(t.text??"",t.widthMm,{fontSizePt:d.fontSizePt,bold:c.bold,italic:c.italic,fontFamily:c.fontFamily??i,letterSpacingPt:c.letterSpacing},l).join(`
6
+ `);Ne(e,{text:m,fontSizePx:d.fontSizePx,bold:c.bold??!1,italic:c.italic,color:u.resolveTextColor(c),align:c.align??"left",lineHeight:u.resolveLineHeight(c),letterSpacingPx:u.ptToPx(c.letterSpacing??0,s)},r,n,o,a,c.fontFamily??i,c.verticalAlign)}function fe(e,t,r,n,o,a,s){const i=t.leftMm*r,l=t.topMm*r,c=t.widthMm*r,d=t.heightMm*r,m=t.style??{};if(U.isImageBackedComponent(t)){const h=s?.get(t.imageData);h?gt(e,h,i,l,c,d):Te(e,t,i,l,c,d);return}if(t.grid){vt(e,t.grid,t,i,l,c,d,r,n,o,a);return}switch(t.kind){case"text":{yt(e,t,i,l,c,d,n,o,a);break}case"rect":{const h=u.resolveStroke(m),g=u.resolveBoxBorders(m);m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.fillRect(i,l,c,d)),g.inner&&(e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),wt(e,g,i,l,c,d));break}case"line":{const h=u.resolveStroke({...m,borderColor:m.lineColor??m.borderColor});e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),e.beginPath();const g=t.lineDirection==="up"?l+d:t.lineDirection==="down"?l:l+d/2,p=t.lineDirection==="up"?l:t.lineDirection==="down"?l+d:l+d/2;e.moveTo(i,g),e.lineTo(i+c,p),e.stroke();break}case"ellipse":{const h=u.resolveStroke(m);e.strokeStyle=h.color,e.lineWidth=u.ptToPx(h.widthPt,n),m.backgroundColor&&(e.fillStyle=m.backgroundColor,e.beginPath(),e.ellipse(i+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(i+c/2,l+d/2,c/2,d/2,0,0,Math.PI*2),e.stroke();break}default:Te(e,t,i,l,c,d);break}}function Te(e,t,r,n,o,a){e.save(),e.strokeStyle="#94a3b8",e.strokeRect(r,n,o,a),e.fillStyle="#64748b",e.font="12px sans-serif",e.fillText(t.fallbackText??`[${t.kind}]`,r+3,n+14),e.restore()}async function bt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:r="png",quality:n=.92,...o}=t;if(r!=="png"&&r!=="jpeg")throw new TypeError("Image format must be png or jpeg.");if(!Number.isFinite(n)||n<0||n>1)throw new RangeError("Image quality must be between 0 and 1.");D(t.signal);const a=await A.resolvePlanAssets(e,{...t,format:"canvas"});e=a.plan;const s=[...a.diagnostics,...B.reportOutputDiagnostics(e,"canvas",t)],i=r==="jpeg"?"image/jpeg":"image/png",l=[],c=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let d=Math.max(0,t.start??0);d<=c;d++){D(t.signal);const m=await Oe(e.pages[d],d,o,s);try{l.push(await Mt(m,i,n,t.signal))}finally{m.width=0,m.height=0}await Ke.outputCheckpoint(t,l.length,c-Math.max(0,t.start??0)+1)}return D(t.signal),{blobs:l,diagnostics:s}}function Mt(e,t,r,n){return D(n),new Promise((o,a)=>{const s=()=>a(n?.reason??new DOMException("The operation was aborted.","AbortError"));n?.addEventListener("abort",s,{once:!0});try{e.toBlob(i=>{n?.removeEventListener("abort",s),i?o(i):a(new Error("Canvas encoding failed; no empty image was emitted."))},t,r)}catch(i){n?.removeEventListener("abort",s),a(i)}})}function Et(e,t={}){if(D(t.signal),typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*pe,a=t.fontFamily??$.DEFAULT_FONT_FAMILY,s=t.measurer??A.heuristicMeasurer,i=Math.max(0,t.start??0),l=Math.min(e.pages.length-1,t.end??e.pages.length-1),c=[],d=B.reportOutputDiagnostics(e,"canvas",t),m=Tt(e,i,l);for(const h of m)B.notifyOutputDiagnostic(h,t),d.push(h);if(t.fidelity==="strict"&&m.length)throw new B.OutputFidelityError(d);for(let h=i;h<=l;h++){D(t.signal);const g=e.pages[h],{canvas:p,ctx:y}=De(g,r,n,t.maxCanvasPixels);for(const L of g.components)fe(y,L,o,n,a,s);c.push(p)}return{canvases:c,diagnostics:d}}function Tt(e,t,r){return r<t?[]:e.pages.slice(t,r+1).flatMap((n,o)=>n.components.flatMap((a,s)=>U.isImageBackedComponent(a)?[{code:"async-image-required",severity:"warning",format:"canvas",pageIndex:t+o,componentIndex:s,kind:a.kind,nid:a.nid,message:"Use renderPlanToCanvasAsync or renderPlanToImages to decode and include images."}]:[]))}async function xt(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvasAsync 需要浏览器环境(Node 请使用 PDF 或 XLSX 输出)");D(t.signal);const r=await A.resolvePlanAssets(e,{...t,format:"canvas"});e=r.plan;const n=[...r.diagnostics,...B.reportOutputDiagnostics(e,"canvas",t)],o=[],a=Math.min(e.pages.length-1,t.end??e.pages.length-1);for(let s=Math.max(0,t.start??0);s<=a;s++)o.push(await Oe(e.pages[s],s,t,n));return{canvases:o,diagnostics:n}}async function Oe(e,t,r,n){const o=r.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),a=r.dpi??96,s=r.fontFamily??$.DEFAULT_FONT_FAMILY,i=await _e(e,t,r,n);D(r.signal);const{canvas:l,ctx:c}=De(e,o,a,r.maxCanvasPixels);for(const d of e.components)fe(c,d,a/25.4,a,s,r.measurer??A.heuristicMeasurer,i);return l}async function _e(e,t,r,n){const o=r.imageLoader??dt;return ht(e,async(a,s)=>{try{return await o(a,s)}catch(i){if(s?.aborted)throw i;const l=e.components.findIndex(m=>m.imageData===a),c=e.components[l],d={code:"image-decode-failed",severity:"warning",format:"canvas",pageIndex:t,componentIndex:l,kind:c.kind,nid:c.nid,message:"Image decoding failed; raster output was cancelled instead of omitting the image."};throw n.push(d),B.notifyOutputDiagnostic(d,r),i}},r.signal)}function Rt(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*pe,a=t.fontFamily??$.DEFAULT_FONT_FAMILY,s=t.measurer??A.heuristicMeasurer,i=t.overscan??1,l=t.gapPx??18,c=t.pagesPerFrame??1,d=e.pages.map(w=>w.pageHeightMm*o),m=Math.max(1,...e.pages.map(w=>w.pageWidthMm*o)),h={start:0,end:-1};let g=null,p=null,y=null,L=null,R=[],x=0,I=[],V=0,H=new AbortController;const ye=[];function Ve(){const w=g;w.innerHTML="",p=document.createElement("div"),p.style.cssText=`width:${m}px;margin:0 auto;`,y=document.createElement("div"),L=document.createElement("div"),p.appendChild(y),R=[];const S=Math.min(e.pages.length,3+i*2);for(let j=0;j<S;j++){const E=document.createElement("div");E.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,p.appendChild(E),R.push(E)}p.appendChild(L),w.appendChild(p)}async function Ge(w,S){const j=V,E=await A.resolvePlanAssets(e,{...t,signal:H.signal,format:"canvas",start:S,end:S});ye.push(...E.diagnostics);const k=E.plan.pages[S],ee=await _e(k,S,{...t,signal:H.signal},ye);if(j!==V||!g)return;const{widthPx:se,heightPx:le}=ie(k,n);let z=w.firstElementChild;(!z||z.tagName!=="CANVAS")&&(z=document.createElement("canvas"),w.innerHTML="",w.appendChild(z));const Me=$e(k,r,n,t.maxCanvasPixels);z.width=Me.width,z.height=Me.height,z.style.width=`${se}px`,z.style.height=`${le}px`;const Y=z.getContext("2d");if(Y){Y.setTransform(1,0,0,1,0,0),Y.scale(r,r),Y.fillStyle="#ffffff",Y.fillRect(0,0,se,le);for(const Je of k.components)fe(Y,Je,o,n,a,s,ee);z.dataset.canvasPage=String(S),w.style.height=`${le}px`,w.style.width=`${se}px`}}function Ye(w){V++,h.start=w.start,h.end=w.end,y.style.height=`${w.start*l+d.slice(0,w.start).reduce((E,k)=>E+k,0)}px`;const S=e.pages.length-1-w.end;L.style.height=`${S*l+d.slice(w.end+1).reduce((E,k)=>E+k,0)}px`;const j=w.end-w.start+1;R.forEach((E,k)=>{if(k<j){E.style.display="";const ee=w.start+k;E.style.height=`${d[ee]??0}px`}else E.style.display="none"}),I=[];for(let E=w.start;E<=w.end;E++){const k=R[E-w.start];if(!k)continue;k.firstElementChild?.dataset?.canvasPage!==String(E)&&I.push(E)}ae()}function ae(){x||I.length===0||(x=requestAnimationFrame(()=>{x=0;let w=Math.max(1,c);for(;I.length>0&&w-- >0;){const S=I.shift(),j=R[S-h.start];j&&Ge(j,S).catch(()=>{})}I.length>0&&ae()}))}function Z(){x||(x=requestAnimationFrame(()=>{x=0;const w=g,S=Fe({pageHeightsPx:d,viewportHeightPx:w.clientHeight,scrollTopPx:w.scrollTop,overscan:i,gapPx:l});S.start!==h.start||S.end!==h.end?Ye(S):ae()}))}let Q=null;return{attach(w){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");D(t.signal),H=new AbortController,t.signal?.addEventListener("abort",be,{once:!0}),B.reportOutputDiagnostics(e,"canvas",t),g=w,Ve(),w.addEventListener("scroll",Z,{passive:!0}),typeof ResizeObserver<"u"&&(Q=new ResizeObserver(()=>Z()),Q.observe(w)),Z()},destroy(){V++,H.abort(),t.signal?.removeEventListener("abort",be),x&&cancelAnimationFrame(x),x=0,Q?.disconnect(),Q=null,g?.removeEventListener("scroll",Z),I=[],p?.remove(),g=null},window(){return{...h}}};function be(){H.abort(t.signal?.reason)}}function we(e,t,r){let n,o;if(typeof e=="string"){const a=u.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);n=a.widthMm,o=a.heightMm}else typeof e=="number"?(n=e,o=t??297):(n=e.widthMm,o=e.heightMm);return r?{widthMm:o,heightMm:n}:{widthMm:n,heightMm:o}}class Be{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}repeat(t){return this.templateRepeat=t,this}params(t){return this.templateParams=t,this}page(t="a4",r={},n){this.collect();const a=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:typeof r=="number"?n??{}:r,{widthMm:s,heightMm:i}=we(t,typeof r=="number"?r:void 0,a.landscape),l=a.margins??{};return this.pending=new He(this,{widthMm:s,heightMm:i,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}:{},...this.templateRepeat?{repeat:this.templateRepeat}:{},pages:this.pages}}}class He{constructor(t,r){this.parent=t,this.page=r,this.components=[]}text(t,r={},n={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:t,style:n}),this}list(t,r,n,o={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:t,columns:n,...o}),this}rect(t,r={}){return this.components.push({kind:"rect",...t,style:r}),this}line(t,r,n,o={}){return this.components.push({kind:"line",leftMm:t,topMm:r,widthMm:n,heightMm:.5,style:o}),this}barcode(t,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:t}),this}qrcode(t,r,n,o){return this.components.push({kind:"qrcode",leftMm:n,topMm:o,widthMm:r,heightMm:r,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function St(){return new Be}function Ct(e,t={}){return ce.validateDatasetRows([],e),e.fields.map(r=>({field:r.field,header:`${r.label??r.field}${r.unit?` (${r.unit})`:""}`,semanticRole:r.semanticRole??(r.type==="number"||r.type==="decimal"?"measure":r.type==="date"?"date":r.enum?"dimension":"text"),...t[r.field]}))}function N(e,t,r=!1){if(!Number.isFinite(e)||(r?e<0:e<=0))throw new Error(`${t} 必须是有限${r?"非负":"正"}数`)}function re(e,t,r){if(e!==void 0&&!["left","center","right","justify",...r?["auto"]:[]].includes(e))throw new Error(`${t} 必须是 left/center/right/justify${r?"/auto":""}`)}function Pt(e){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 r=e.columnWidthMm??30;return N(r,"columnWidthMm"),{layout:t,columnWidthMm:r}}function At(e){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(u.PAPER_SIZES,t))throw new Error(`未知纸张预设 "${t}"(可用:${Object.keys(u.PAPER_SIZES).join("/")})`);const r=we(t,void 0,e.landscape),n=r.widthMm,o=r.heightMm;return N(n,"纸张 widthMm"),N(o,"纸张 heightMm"),{widthMm:n,heightMm:o}}function Lt(e){if(e.margins!==void 0&&(!e.margins||typeof e.margins!="object"||Array.isArray(e.margins)))throw new Error("margins 必须是页边距对象");const t=e.margins??{},r={marginTopMm:t.marginTopMm===void 0?10:t.marginTopMm,marginBottomMm:t.marginBottomMm===void 0?10:t.marginBottomMm,marginLeftMm:t.marginLeftMm===void 0?10:t.marginLeftMm,marginRightMm:t.marginRightMm===void 0?10:t.marginRightMm};for(const[n,o]of Object.entries(r))N(o,n,!0);return r}function It(e,t){const r=e.dataset===void 0?"detail":e.dataset;if(typeof r!="string"||!r.trim())throw new Error("dataset 必须是非空字符串");if(e.title!==void 0&&typeof e.title!="string")throw new Error("title 必须是字符串");const n=e.titleHeightMm===void 0?10:e.titleHeightMm,o=e.titleGapMm===void 0?4:e.titleGapMm;N(n,"titleHeightMm"),N(o,"titleGapMm",!0);const a=e.title!==void 0&&e.title.length>0,s=a?n+o:0;if(s>=t)throw new Error("标题高度与间距占满页面,必须为表格保留可用高度");return{dataset:r,titleHeightMm:n,hasTitle:a,titleSpaceMm:s}}function kt(e){if(e.listOptions!==void 0&&(!e.listOptions||typeof e.listOptions!="object"||Array.isArray(e.listOptions)))throw new Error("listOptions 必须是列表配置对象");const t=e.listOptions??{};re(t.align,"listOptions.align",!0),re(t.headerAlign,"listOptions.headerAlign",!1);for(const r of["fontSizePt","rowHeightMm","paddingMm"]){const n=t[r];n!==void 0&&N(n,`listOptions.${r}`,r==="paddingMm")}return t}function Ft(e){let t=0,r=0;for(const[n,o]of e.entries()){if(!o||typeof o.header!="string"||typeof o.field!="string"||!o.field.trim())throw new Error(`columns[${n}] 需要字符串 header 与非空 field`);re(o.align,`columns[${n}].align`,!0),re(o.headerAlign,`columns[${n}].headerAlign`,!1),o.flex!==void 0&&N(o.flex,`columns[${n}].flex`),o.widthMm!==void 0?(N(o.widthMm,`columns[${n}].widthMm`),t+=o.widthMm):r=Math.max(r,o.flex??1)}return{fixedWidthMm:t,maxFlex:r}}function $t(e,t,r,n){const{fixedWidthMm:o,maxFlex:a}=Ft(e.columns);if(t==="page"&&o>n)throw new Error(`固定列宽 ${o}mm 超出页面可用宽度 ${n}mm`);const s=n-o;if(t==="page"&&a>0&&s<=0)throw new Error("固定列占满页面可用宽度,自动列需要正的剩余宽度");const i=a>0?e.columns.reduce((c,d)=>c+(d.widthMm===void 0?(d.flex??1)/a:0),0):0;return{columns:e.columns.map(({widthMm:c,flex:d,...m},h)=>{const g=c??(t==="wide"?r*(d??1):s*((d??1)/a)/i);return N(g,`columns[${h}] 分配后的 widthMm`),{...m,widthMm:g}}),fixedWidthMm:o,maxFlex:a}}function Dt(e){if(!e||typeof e!="object")throw new Error("标准明细模板需要 options 对象");if(!Array.isArray(e.columns)||e.columns.length===0)throw new Error("columns 至少需要一列");const{layout:t,columnWidthMm:r}=Pt(e),n=At(e);let o=n.widthMm;const a=n.heightMm,s=Lt(e);let i=o-s.marginLeftMm-s.marginRightMm;const l=a-s.marginTopMm-s.marginBottomMm;if(t==="page"&&i<=0||l<=0)throw new Error("页边距占满纸张,必须保留正的可用宽度和高度");const{dataset:c,titleHeightMm:d,hasTitle:m,titleSpaceMm:h}=It(e,l),g=kt(e),{columns:p,fixedWidthMm:y,maxFlex:L}=$t(e,t,r,i);t==="wide"&&(i=p.reduce((x,I)=>x+I.widthMm,0),N(i,"宽表总列宽"),o=i+s.marginLeftMm+s.marginRightMm,N(o,"宽表总宽度"));const R={widthMm:o,heightMm:a,...s,components:[],...t==="wide"?{layout:t}:{}};return m&&R.components.push({kind:"text",text:e.title,leftMm:s.marginLeftMm,topMm:s.marginTopMm,widthMm:i,heightMm:d,style:{fontSize:16,bold:!0,align:"center",verticalAlign:"middle",...e.titleStyle}}),R.components.push({align:"auto",headerAlign:"center",...g,kind:"list",...t==="wide"?{layout:t}:{},...m?{title:e.title}:{},dataset:c,columns:p,leftMm:s.marginLeftMm,topMm:s.marginTopMm+h,widthMm:t==="wide"||L>0?i:y}),e.params===void 0?{pages:[R]}:{params:e.params,pages:[R]}}function Nt(e){if(e.components!==void 0&&e.pages!==void 0)throw new TypeError("标签 components 与 pages 只能选择一种");const{dataset:t,rowKey:r,copies:n,params:o}=e,a=e.pages??[{components:e.components??[]}],s={repeat:{dataset:t,...r===void 0?{}:{rowKey:r},...n===void 0?{}:{copies:n}},...o===void 0?{}:{params:o},pages:a.map(l=>({widthMm:l.widthMm??e.widthMm??80,heightMm:l.heightMm??e.heightMm??55,marginTopMm:0,marginRightMm:0,marginBottomMm:0,marginLeftMm:0,components:l.components,...l.meta===void 0?{}:{meta:l.meta}}))},i=M.validateReportTemplate(s);if(!i.ok)throw new M.ReportTemplateError(i.errors);return JSON.parse(JSON.stringify(s))}function Ot(e){if(!e||typeof e!="object"||!e.repeat)throw new f.ReportSourceError("config","defineLabelReport 需要带 repeat 的固定标签模板");const t=M.validateReportTemplate(e);if(!t.ok)throw new M.ReportTemplateError(t.errors);return e.repeat.dataset}function xe(e,t){if(!Array.isArray(e))throw new f.ReportSourceError("validate","标签数据应为对象数组;请从业务响应中提取行数组");return{[t]:e}}function _t(e){const{template:t,rows:r,load:n,dataSchema:o,params:a,pagination:s,dataValidation:i}=e,l=Ot(t);if(r!==void 0==(n!==void 0)||n!==void 0&&typeof n!="function")throw new f.ReportSourceError("config","标签报表应且只能配置 rows 或 load 其中一种数据来源");const c={template:t,params:a,pagination:s,dataValidation:i,...o===void 0?{}:{dataSchema:{[l]:o}}};return n?f.defineReport({...c,load:n,mapData:d=>xe(d,l)}):{...c,datasets:xe(r,l)}}function Bt(e){return e}class O extends Error{constructor(t,r){super(r),this.code=t,this.name="ReportTemplateStoreError"}}function _(e){return JSON.parse(JSON.stringify(e))}function C(e){if(!e?.aborted)return;const t=new Error("模板操作已取消");throw t.name="AbortError",t}function Re(e){const t=e?Number(e.revision):0;if(!Number.isSafeInteger(t)||t<0||t>=Number.MAX_SAFE_INTEGER)throw new O("history","修订号无效或已达上限");return String(t+1)}function Ht(e,t={}){const r=async(s,i)=>{C(i);const l=await e.read(s,i);return C(i),l?_(l):void 0},n=async(s,i)=>{const l=await r(s,i.signal);if((l?.revision??null)!==i.expectedRevision)throw new O("conflict","模板已变化,请重新读取后提交");return l},o=async(s,i,l)=>{if(C(i.signal),!await e.compareAndSwap(s.id,i.expectedRevision,_(s),{signal:i.signal,...l?{publication:_(l)}:{}}))throw new O("conflict","模板已被其他请求更新");return _(s)},a=async(s,i,l,c)=>{if(t.beforePublish){C(l.signal);const g=await t.beforePublish({document:M.parseReportTemplate(i),previous:s.published?M.parseReportTemplate(s.published):void 0,signal:l.signal});if(!g||g.ok!==!0)throw new O("review",g?.issues?.find(p=>p.severity==="error")?.message??"模板发布检查未通过");C(l.signal)}const d=Re(s),m=M.parseReportTemplate({...i,revision:d}),h={revision:d,document:m,publishedAt:(t.now?.()??new Date).toISOString()};return c!==void 0&&(h.restoredFrom=c),o({id:s.id,revision:d,publishedRevision:d,published:m},l,h)};return{list:async s=>{C(s);const i=await e.list(s);return C(s),_(i)},get:async(s,i={})=>{const l=await r(s,i.signal),c=i.draft?l?.draft:l?.published;return c?M.parseReportTemplate(c):void 0},history:async(s,i)=>{C(i);const l=await e.history(s,i);return C(i),_(l)},saveDraft:async(s,i)=>{i={...i},C(i.signal);const l=M.parseReportTemplate(t.migrate?await t.migrate(s):s),c=await n(l.id,i),d=Re(c);return o({id:l.id,revision:d,draft:{...l,revision:d},...c?.publishedRevision?{publishedRevision:c.publishedRevision,published:c.published}:{}},i)},publish:async(s,i)=>{i={...i};const l=await n(s,i);if(!l)throw new O("missing","模板不存在");if(!l.draft)throw new O("draft","没有可发布的草稿");return a(l,l.draft,i)},rollback:async(s,i,l)=>{l={...l};const c=await n(s,l);if(!c)throw new O("missing","模板不存在");C(l.signal);const d=await e.getVersion(s,i,l.signal);if(!d)throw new O("history","历史修订不存在");return a(c,d.document,l,i)}}}function zt(){const e=new Map,t=new Map;return{read:async(r,n)=>{C(n);const o=e.get(r);return o?_(o):void 0},list:async r=>(C(r),Array.from(e.values(),({id:n,revision:o,publishedRevision:a})=>({id:n,revision:o,...a?{publishedRevision:a}:{}}))),history:async(r,n)=>(C(n),Array.from(t.get(r)?.values()??[],o=>_(o))),getVersion:async(r,n,o)=>{C(o);const a=t.get(r)?.get(n);return a?_(a):void 0},compareAndSwap:async(r,n,o,a)=>{if(C(a.signal),(e.get(r)?.revision??null)!==n)return!1;if(o.id!==r)throw new O("history","状态 ID 与存储 ID 不一致");const s=_(o),i=a.publication;if(i){const l=t.get(r)??new Map;if(l.has(i.revision)||i.revision!==o.revision||i.document.id!==r)throw new O("history","发布修订不可覆盖,且必须与状态修订和模板 ID 一致");l.set(i.revision,_(i)),t.set(r,l)}return e.set(r,s),!0}}}function Wt(e,t){const r=e.publishedRevision??e.published?.revision;for(const n of[e.draftRevision,r])if(n!==void 0&&(typeof n!="string"||!n.trim()))throw new TypeError("模板生命周期修订应为非空字符串");if(e.draftRevision!==void 0&&e.draftRevision!==t.revision)throw new TypeError("可编辑文档应与草稿修订一致");if(e.published&&(e.published.id!==t.id||e.published.revision!==r))throw new TypeError("发布文档身份或修订不一致");if(!e.published&&r!==void 0&&r!==t.revision)throw new TypeError("发布修订需要对应的独立文档");return{...e.draftRevision===void 0?{}:{draftRevision:e.draftRevision},...r===void 0?{}:{publishedRevision:r}}}function jt(e,t){const r=M.parseReportTemplate(e);if(t.id===r.id)throw new Error("复制模板应使用新的 ID");const{revision:n,...o}=r;return M.parseReportTemplate({...o,id:t.id,name:t.name})}function Ut(e){if(!Array.isArray(e)||e.length>1e3)throw new RangeError("本地模板目录最多 1000 项");const t=new Map,r=new Map,n=[];for(const o of e){const a=M.parseReportTemplate(o.document);if(t.has(a.id))throw new Error(`模板 ID 重复:${a.id}`);if(o.category!==void 0&&(typeof o.category!="string"||o.category.length>128)||o.tags!==void 0&&(!Array.isArray(o.tags)||o.tags.length>20||o.tags.some(c=>typeof c!="string"||c.length>128)))throw new TypeError("模板分类和标签无效");const s=Wt(o,a),{template:i,...l}=a;t.set(a.id,a),o.published?r.set(a.id,M.parseReportTemplate(o.published)):s.publishedRevision&&r.set(a.id,M.parseReportTemplate(a)),n.push({...l,...s,...o.category?{category:o.category}:{},...o.tags?{tags:[...o.tags]}:{}})}return n.sort((o,a)=>o.id<a.id?-1:1),{search:async o=>{Se(o.signal);const a=o.limit??30;if(!Number.isSafeInteger(a)||a<1||a>100)throw new RangeError("模板每页数量应为 1–100");const s=o.query?.trim().toLocaleLowerCase()??"",i=n.filter(c=>(!o.category||c.category===o.category)&&(!o.cursor||c.id>o.cursor)&&(!s||[c.id,c.name,c.description,...c.tags??[]].some(d=>d?.toLocaleLowerCase().includes(s)))),l=new Map;for(const c of n)c.category&&l.set(c.category,(l.get(c.category)??0)+1);return JSON.parse(JSON.stringify({items:i.slice(0,a),...i.length>a?{next:i[a-1].id}:{},categories:Array.from(l,([c,d])=>({id:c,label:c,count:d}))}))},get:async(o,a)=>{Se(a.signal);const s=a.mode==="published"?r.get(o):t.get(o);return s?M.parseReportTemplate(s):void 0}}}function Se(e){if(!e?.aborted)return;const t=new Error("模板目录操作已取消");throw t.name="AbortError",t}function qt(e){return e.map(t=>t.map(r=>/[\t\r\n"]/.test(r)?`"${r.replace(/"/g,'""')}"`:r).join(" ")).join(`\r
7
+ `)}function Vt(e,t){const r=e[e.length-1];e.length>1&&r?.length===1&&r[0]===""&&/[\r\n]$/.test(t)&&e.pop()}function Gt(e,t=1e4){if(e.length>4*1024*1024)throw new Error("Clipboard text limit exceeded");const r=[[]];let n="",o=!1,a=!1,s=0;function i(){if(++s>t)throw new Error("Clipboard cell limit exceeded");r[r.length-1].push(n),n="",a=!1}for(let l=0;l<e.length;l++){const c=e[l];if(o){if(c!=='"'){n+=c;continue}if(e[l+1]==='"'){n+='"',l++;continue}o=!1,a=!0;continue}if(c==='"'&&!n&&!a){o=!0;continue}if(c===" "){i();continue}if(c==="\r"||c===`
8
+ `){i(),r.push([]),c==="\r"&&e[l+1]===`
9
+ `&&l++;continue}if(a)throw new Error("Invalid quoted clipboard value");n+=c}if(o)throw new Error("Unclosed clipboard quote");return i(),Vt(r,e),r}class ze extends Error{constructor(t,r,n){const o=typeof r.label=="string"?r.label:"单元格",a={definition:`${o}的编辑器配置无效`,type:`${o}的编辑器与数据类型不一致`,required:`${o}不能为空`,min:`${o}不能小于 ${n}`,max:`${o}不能大于 ${n}`,precision:`${o}最多保留 ${n} 位小数`,length:`${o}最多允许 ${n} 个字符`,choice:`${o}请选择有效选项`,date:`${o}请输入有效日期(YYYY-MM-DD)`};super(a[t]),this.code=t,this.field=r,this.expected=n,this.name="ReportCellFieldError"}}function v(e,t,r){throw new ze(t,e,r)}function We(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}$/.test(e)||e.startsWith("0000-"))return!1;const t=new Date(`${e}T00:00:00.000Z`);return Number.isFinite(t.getTime())&&t.toISOString().slice(0,10)===e}function Yt(e){const[t="",r="0"]=String(e).toLowerCase().split("e");return Math.max(0,(t.split(".")[1]?.length??0)-Number(r))}function Jt(e,t){e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max),e.precision!==void 0&&Yt(t)>e.precision&&v(e,"precision",e.precision)}function Kt(e,t){We(t)||v(e,"date"),e.min!==void 0&&t<e.min&&v(e,"min",e.min),e.max!==void 0&&t>e.max&&v(e,"max",e.max)}function Xt(e){[e.min,e.max].some(t=>t!==void 0&&!Number.isFinite(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition"),e.precision!==void 0&&(!Number.isInteger(e.precision)||e.precision<0||e.precision>15)&&v(e,"definition")}function Zt(e){[e.min,e.max].some(t=>t!==void 0&&!We(t))&&v(e,"definition"),e.min!==void 0&&e.max!==void 0&&e.min>e.max&&v(e,"definition")}function Qt(e,t){(!Array.isArray(t.options)||!t.options.length)&&v(t,"definition");const r=e.valueType==="text"?"string":e.valueType,n=new Set;for(const o of t.options)(!o||typeof o.value!==r||typeof o.value=="number"&&!Number.isFinite(o.value))&&v(t,"definition"),o.label!==void 0&&typeof o.label!="string"&&v(t,"definition"),n.has(o.value)&&v(t,"definition"),n.add(o.value)}function er(e){e.required!==void 0&&typeof e.required!="boolean"&&v(e,"definition"),[e.label,e.hint,e.unit].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition"),e.type==="boolean"&&[e.trueLabel,e.falseLabel].some(t=>t!==void 0&&typeof t!="string")&&v(e,"definition")}function je(e,t){(!t||typeof t!="object"||Array.isArray(t)||!["text","number","boolean","enum","date"].includes(t.type))&&v(t??{type:"text"},"definition"),er(t),(t.type==="number"||t.type==="boolean")&&e.valueType!==t.type&&v(t,"type"),(t.type==="text"||t.type==="date")&&e.valueType!=="text"&&v(t,"type"),t.type==="number"&&Xt(t),t.type==="text"&&t.maxLength!==void 0&&(!Number.isInteger(t.maxLength)||t.maxLength<0)&&v(t,"definition"),t.type==="date"&&Zt(t),t.type==="enum"&&Qt(e,t)}function tr(e,t,r){if(!e.editable)throw new f.ReportCellEditError("readonly");r&&je(e,r);const n=f.parseReportCellInput(e,t);return r?(r.required&&typeof n=="string"&&!n.trim()&&v(r,"required"),n===null||n===""?(r.required&&v(r,"required"),n):(r.type==="number"&&Jt(r,n),r.type==="date"&&Kt(r,n),r.type==="text"&&r.maxLength!==void 0&&[...String(n)].length>r.maxLength&&v(r,"length",r.maxLength),r.type==="enum"&&!r.options.some(o=>Object.is(o.value,n))&&v(r,"choice"),n)):n}class b extends Error{constructor(t){super(`Report calculation: ${t}`),this.code=t,this.name="ReportCalculationError"}}function J(e){if(!e?.aborted)return;const t=new Error("Calculation cancelled");throw t.name="AbortError",t}async function ne(e,t=1){const r=Math.floor(e.scanned/2048);if(e.scanned+=t,e.scanned>e.maxScanned)throw new b("limit");J(e.signal),Math.floor(e.scanned/2048)>r&&(await e.yieldToHost(),J(e.signal))}function ve(e){return e.table?.role==="header"?-Math.max(1,e.grid?.cells.length??1):e.table?.rowIndex??0}function Ce(e,t,r){if(![t.pageIndex,t.componentIndex,t.rowIndex,t.columnIndex].every(i=>Number.isSafeInteger(i)&&i>=0))throw new b("selection");const n=e.pages[t.pageIndex]?.components[t.componentIndex];if(!n?.grid||t.rowIndex>=n.grid.cells.length)throw new b("selection");const o=n.grid.colWidthsMm?.length??n.grid.cells.reduce((i,l)=>Math.max(i,l.length),1);if(t.columnIndex>=o)throw new b("selection");const a=n.table,s=e.pages[r.pageIndex]?.components[r.componentIndex]?.table;if(a&&s&&a.id===s.id){const i=s.columnKeys.indexOf(a.columnKeys[t.columnIndex]??"");if(i<0)throw new b("selection");return{grid:a.id,row:ve(n)+t.rowIndex,column:i}}return{grid:`${t.pageIndex}:${t.componentIndex}`,row:t.rowIndex,column:t.columnIndex}}function rr(e,t,r){const n=Ce(e,t.anchor,t.anchor),o=Ce(e,t.focus,t.anchor);if(n.grid!==o.grid)throw new b("selection");const a=(Math.abs(n.row-o.row)+1)*(Math.abs(n.column-o.column)+1);if(!Number.isSafeInteger(a)||a>r)throw new b("limit");return{grid:n.grid,rowStart:Math.min(n.row,o.row),rowEnd:Math.max(n.row,o.row),columnStart:Math.min(n.column,o.column),columnEnd:Math.max(n.column,o.column),origin:e.pages[t.anchor.pageIndex].components[t.anchor.componentIndex].table}}function nr(e){if(!e)return!1;const t=e.replace(/"[^"]*"|\\.|\[(?![hms]+\])[^\]]*\]/gi,"");return/[ymdhs]/i.test(t)}function or(e){if(e.valueType==="text"||e.valueType==="boolean"||nr(e.numberFormat))return null;const t=e.value;if(typeof t!="number"||!Number.isFinite(t))return null;if(Number.isInteger(t)&&!Number.isSafeInteger(t))throw new b("precision");return t}function ir(e,t,r){if(e.seen.has(r))return;e.seen.add(r),e.selected++;const n=t?or(t):null;n===null?e.excluded++:e.values.push(n)}function ar(e,t,r,n){return n.origin?e.table?.id===n.origin.id:`${t}:${r}`===n.grid}function sr(e,t,r){return r.origin?r.origin.columnKeys.indexOf(e.table.columnKeys[t]??""):t}function lr(e,t,r,n){const o=n.origin?ve(e)+t:t,a=sr(e,r,n);return o<n.rowStart||o>n.rowEnd||a<n.columnStart||a>n.columnEnd?null:`${n.grid}:${o}:${a}`}function cr(e,t){const r=t.origin?ve(e):0,n=Math.max(0,t.rowStart-r),o=Math.min(e.grid.cells.length,t.rowEnd-r+1);return o>n?o:0}async function dr(e,t,r,n,o){const a=e.grid;if(t>n.maxScanned)throw new b("limit");const s=a.colWidthsMm?.length??a.cells.reduce((l,c)=>Math.max(l,c.length),1);if(s>n.maxScanned)throw new b("limit");const i=new Map;for(let l=0;l<t;l++){l>0&&l%2048===0&&(await n.yieldToHost(),J(n.signal));let c=0;for(const d of a.cells[l]){for(await ne(n);c<s&&(i.get(c)??0)>l;)c++;if(c>=s)break;const m=Math.max(1,Math.min(d?.colSpan??1,s-c)),h=Math.min(a.cells.length,l+Math.max(1,d?.rowSpan??1));m>1&&await ne(n,m-1);for(let p=c;p<c+m;p++)i.set(p,h);const g=lr(e,l,c,r);g&&ir(o,d,g),c+=m}}}async function mr(e,t,r){const n={values:[],seen:new Set,excluded:0,selected:0};for(let o=0;o<e.pages.length;o++){await ne(r);const a=e.pages[o];for(let s=0;s<a.components.length;s++){await ne(r);const i=a.components[s];if(!i.grid||!ar(i,o,s,t)||i.table&&i.table.role!=="body")continue;const l=cr(i,t);l&&await dr(i,l,t,r,n)}}return n}function K(e){if(!Number.isFinite(e))throw new b("overflow");return e}function hr(e){let t=0,r=0;for(const n of e){const o=n-r,a=K(t+o);r=a-t-o,t=a}return t}async function Pe(e,t){let r=[...e],n=new Array(e.length);for(let a=1;a<e.length;a*=2){for(let s=0;s<e.length;s+=a*2){const i=Math.min(s+a,e.length),l=Math.min(s+a*2,e.length);let c=s,d=i;for(let m=s;m<l;m++)n[m]=d>=l||c<i&&r[c]<=r[d]?r[c++]:r[d++],m%2048===0&&(await t.yieldToHost(),J(t.signal))}[r,n]=[n,r]}const o=Math.floor(r.length/2);return r.length%2?r[o]:K(r[o-1]/2+r[o]/2)}function gr(e){const t=hr(e);let r=1/0,n=-1/0;for(const o of e)r=Math.min(r,o),n=Math.max(n,o);return{SUM:t,AVERAGE:t/e.length,AVG:t/e.length,MIN:r,MAX:n,COUNT:e.length}}function Ue(e,t){if(typeof e!="string"||e.length>256)throw new b("expression");const r=e.toUpperCase().match(/(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?|[A-Z_]+|[()+\-*/]|\S/g)??[];if(!r.length||r.length>64)throw new b("expression");let n=0;function o(i){if(i>16)throw new b("expression");const l=r[n++];if(l==="+"||l==="-")return(l==="-"?-1:1)*o(i+1);if(l==="("){const c=a(0,i+1);if(r[n++]!==")")throw new b("expression");return c}if(l&&/^(?:SUM|AVERAGE|AVG|MIN|MAX|COUNT|MEDIAN)$/.test(l)&&Object.prototype.hasOwnProperty.call(t,l))return K(t[l]);if(l&&/^(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/.test(l))return K(Number(l));throw new b("expression")}function a(i,l){let c=o(l);for(;n<r.length;){const d=r[n],m=d==="+"||d==="-"?1:d==="*"||d==="/"?2:0;if(!m||m<i)break;n++;const h=a(m+1,l+1);if(d==="/"&&h===0)throw new b("division");c=K(d==="+"?c+h:d==="-"?c-h:d==="*"?c*h:c/h)}return c}const s=a(1,0);if(n!==r.length)throw new b("expression");return s}function ur(e){const t=e.maxCells??1e5,r=e.maxScannedCells??2e5,n=e.precision??2;if(![t,r].every(o=>Number.isSafeInteger(o)&&o>=1&&o<=2e6))throw new b("limit");if(!Number.isInteger(n)||n<0||n>12)throw new b("precision");return{maxCells:t,maxScanned:r,precision:n}}async function pr(e,t,r={}){const n=ur(r),o={scanned:0,maxScanned:n.maxScanned,signal:r.signal,yieldToHost:r.yieldToHost??(()=>new Promise(l=>setTimeout(l,0)))};J(o.signal);const a=await mr(e,rr(e,t,n.maxCells),o),s=r.operation??"sum";if(!["sum","average","min","max","count","median","expression"].includes(s))throw new b("expression");let i=null;if(s==="count")i=a.values.length;else if(a.values.length)if(s==="median")i=await Pe(a.values,o);else{const l=gr(a.values);s==="expression"?(/\bMEDIAN\b/i.test(r.expression??"")&&(l.MEDIAN=await Pe(a.values,o)),i=Ue(r.expression??"",l)):i=l[s.toUpperCase()]}if(J(o.signal),i!==null&&Number.isInteger(i)&&!Number.isSafeInteger(i))throw new b("precision");return{value:i,formatted:i===null?"—":i.toFixed(n.precision),numericCells:a.values.length,excludedCells:a.excluded,selectedCells:a.selected,precision:n.precision}}class F extends Error{constructor(t,r){super(t),this.path=r,this.code="label-sheet",this.name="LabelSheetError"}}function te(e){if(e?.aborted){const t=new Error("标签拼版已取消");throw t.name="AbortError",t}}function q(e,t,r=!1){if(!Number.isFinite(e)||e<=0||r&&!Number.isSafeInteger(e))throw new F("应为正有限数字,数量应为安全整数",t);return e}function Ae(e,t){if(!Number.isFinite(e)||e<0)throw new F("应为非负有限数字",t);return e}function fr(e){const t=typeof e.marginMm=="object"?e.marginMm:{top:e.marginMm??0,left:e.marginMm??0,bottom:e.marginMm??0,right:e.marginMm??0},r=typeof e.gapMm=="object"?e.gapMm:{horizontal:e.gapMm??0,vertical:e.gapMm??0};for(const n of["top","left","bottom","right"])Ae(t?.[n],`$.marginMm.${n}`);for(const n of["horizontal","vertical"])Ae(r?.[n],`$.gapMm.${n}`);return{margin:t,gap:r}}function wr(e){const t=e.paper===void 0||e.paper==="a4"?{widthMm:210,heightMm:297}:e.paper;q(t.widthMm,"$.paper.widthMm"),q(t.heightMm,"$.paper.heightMm");const r=q(e.columns,"$.columns",!0),n=q(e.rows,"$.rows",!0),o=r*n;if(o>1e3)throw new F("每张纸不能超过 1000 个位置","$.columns");const{margin:a,gap:s}=fr(e),i=e.startSlot??0,l=e.offsetMm??{x:0,y:0};if(!Number.isSafeInteger(i)||i<0||i>=o)throw new F("起始位置应在首张纸的有效位置内","$.startSlot");if(!Number.isFinite(l.x)||!Number.isFinite(l.y))throw new F("校准偏移应为有限毫米值","$.offsetMm");return{paper:t,columns:r,rows:n,capacity:o,margin:a,gap:s,startSlot:i,offset:l}}function qe(e){return 1+(e.grid?.cells.reduce((t,r)=>t+r.length+1+r.reduce((n,o)=>n+(o?.children?.reduce((a,s)=>a+qe(s),0)??0),0),0)??0)}function vr(e,t,r){if(!X.validateRenderPlan(e).ok)throw new F("标签计划无效","$.plan");const n=e.pages[0];if(!n)return;const{paper:o,columns:a,rows:s,margin:i,gap:l,offset:c}=r;if(i.left+c.x<0||i.top+c.y<0||i.left+c.x+a*n.pageWidthMm+(a-1)*l.horizontal+i.right>o.widthMm+1e-6||i.top+c.y+s*n.pageHeightMm+(s-1)*l.vertical+i.bottom>o.heightMm+1e-6)throw new F("标签、间距、边距及校准偏移超过纸张尺寸;不会自动缩小标签","$.paper");let d=0;for(const[m,h]of e.pages.entries()){if(te(t.signal),h.layout==="wide"||h.pageWidthMm!==n.pageWidthMm||h.pageHeightMm!==n.pageHeightMm)throw new F("拼版需要尺寸相同的固定标签页面",`$.pages.${m}`);if(d+=h.components.reduce((g,p)=>g+qe(p),0),d>q(t.maxComponents??25e4,"$.maxComponents",!0))throw new F("拼版组件总量超过预算","$.maxComponents");for(const g of h.components)if(g.leftMm<0||g.topMm<0||g.leftMm+g.widthMm>h.pageWidthMm+1e-6||g.topMm+g.heightMm>h.pageHeightMm+1e-6)throw new F("标签内容超出标签边界",`$.pages.${m}.components`)}}function yr(e,t){te(t.signal);const r=wr(t),{paper:n,columns:o,capacity:a,margin:s,gap:i,startSlot:l,offset:c}=r,d=e.pages.length?Math.ceil((l+e.pages.length)/a):0;if(d>q(t.maxSheets??1e4,"$.maxSheets",!0))throw new F("拼版纸张数量超过预算","$.maxSheets");q(t.maxComponents??25e4,"$.maxComponents",!0),vr(e,t,r);const m=f.snapshotReportJson(e,{maxBytes:q(t.maxSnapshotBytes??64e6,"$.maxSnapshotBytes",!0),check:()=>te(t.signal),error:(g,p)=>new F(p,"$.maxSnapshotBytes")}),h=Array.from({length:d},()=>({pageWidthMm:n.widthMm,pageHeightMm:n.heightMm,components:[],meta:{labelSheet:{columns:o,rows:r.rows,slots:[]}}}));for(const[g,p]of m.pages.entries()){te(t.signal);const y=l+g,L=y%a,R=h[Math.floor(y/a)],x=s.left+c.x+L%o*(p.pageWidthMm+i.horizontal),I=s.top+c.y+Math.floor(L/o)*(p.pageHeightMm+i.vertical),V={sourcePageIndex:g,slotIndex:L,xMm:x,yMm:I,widthMm:p.pageWidthMm,heightMm:p.pageHeightMm,...p.meta?{sourceMeta:p.meta}:{}};R.meta.labelSheet.slots.push(V),R.components.push(...p.components.map(H=>({...H,leftMm:H.leftMm+x,topMm:H.topMm+I,meta:{...H.meta,labelSheet:V}})))}return{...m,pages:h}}exports.DEFAULT_BORDER_PT=$.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_FAMILY=$.DEFAULT_FONT_FAMILY;exports.DEFAULT_FONT_PT=$.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=$.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=$.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=$.LINE_HEIGHT;exports.SCHEMA_VERSION_MACH=$.SCHEMA_VERSION_MACH;exports.ReportBindingError=G.ReportBindingError;exports.evalStyleRule=G.evalStyleRule;exports.formatValue=G.formatValue;exports.parseDateLocal=G.parseDateLocal;exports.resolveComponentBinding=G.resolveComponentBinding;exports.toExcelNumberFormat=G.toExcelNumberFormat;exports.toNumber=G.toNumber;exports.CSS_DPI=u.CSS_DPI;exports.MM_PER_INCH=u.MM_PER_INCH;exports.PAPER_SIZES=u.PAPER_SIZES;exports.mergeComponentStyles=u.mergeComponentStyles;exports.mmToPx=u.mmToPx;exports.mmToPxFactor=u.mmToPxFactor;exports.ptToPx=u.ptToPx;exports.pxToMm=u.pxToMm;exports.resolveBoxBorders=u.resolveBoxBorders;exports.resolveFontSize=u.resolveFontSize;exports.resolveLineHeight=u.resolveLineHeight;exports.resolveStroke=u.resolveStroke;exports.resolveTextColor=u.resolveTextColor;exports.round=u.round;exports.RENDER_PLAN_SCHEMA_VERSION=U.RENDER_PLAN_SCHEMA_VERSION;exports.isImageBackedComponent=U.isImageBackedComponent;exports.isRichText=U.isRichText;exports.assertRenderPlan=X.assertRenderPlan;exports.validateComponent=X.validateComponent;exports.validatePage=X.validatePage;exports.validateRenderPlan=X.validateRenderPlan;exports.datasetJsonSchema=ce.datasetJsonSchema;exports.validateDatasetRows=ce.validateDatasetRows;exports.OutputAssetError=A.OutputAssetError;exports.charWidthEm=A.charWidthEm;exports.createCanvasMeasurer=A.createCanvasMeasurer;exports.createHeuristicMeasurer=A.createHeuristicMeasurer;exports.heuristicMeasurer=A.heuristicMeasurer;exports.measureTextMm=A.measureTextMm;exports.resolvePlanAssets=A.resolvePlanAssets;exports.wrapText=A.wrapText;exports.DEFAULT_LABEL_PAGE_LIMIT=f.DEFAULT_LABEL_PAGE_LIMIT;exports.PaginateCellLimitError=f.PaginateCellLimitError;exports.PaginatePageLimitError=f.PaginatePageLimitError;exports.ReportCellEditError=f.ReportCellEditError;exports.ReportSourceError=f.ReportSourceError;exports.applyReportCellEdit=f.applyReportCellEdit;exports.applyReportCellEditBatch=f.applyReportCellEditBatch;exports.applyReportEditResult=f.applyReportEditResult;exports.countTemplatePages=f.countTemplatePages;exports.createReportCellEdit=f.createReportCellEdit;exports.createReportCellEditBatch=f.createReportCellEditBatch;exports.createReportCellResolver=f.createReportCellResolver;exports.createReportEditSession=f.createReportEditSession;exports.createReportSource=f.createReportSource;exports.defineReport=f.defineReport;exports.diffReportTemplates=f.diffReportTemplates;exports.estimateListLayoutCells=f.estimateListLayoutCells;exports.formatReportCellEdit=f.formatReportCellEdit;exports.getReportCellContext=f.getReportCellContext;exports.getReportEditSession=f.getReportEditSession;exports.paginateTemplate=f.paginateTemplate;exports.paginateTemplatePages=f.paginateTemplatePages;exports.parseReportCellInput=f.parseReportCellInput;exports.projectListColumns=f.projectListColumns;exports.registerReportEditSession=f.registerReportEditSession;exports.relocateReportCellEdits=f.relocateReportCellEdits;exports.reportCellEditKey=f.reportCellEditKey;exports.reviewReportTemplate=f.reviewReportTemplate;exports.reviewReportTemplateAsync=f.reviewReportTemplateAsync;exports.summarizeReportCellEdits=f.summarizeReportCellEdits;exports.resolveGridLayout=de.resolveGridLayout;exports.OutputFidelityError=B.OutputFidelityError;exports.inspectOutputCapabilities=B.inspectOutputCapabilities;exports.reportOutputDiagnostics=B.reportOutputDiagnostics;exports.REPORT_TEMPLATE_DOCUMENT_VERSION=M.REPORT_TEMPLATE_DOCUMENT_VERSION;exports.ReportTemplateError=M.ReportTemplateError;exports.createTemplateRegistry=M.createTemplateRegistry;exports.defineReportTemplate=M.defineReportTemplate;exports.parseReportTemplate=M.parseReportTemplate;exports.serializeReportTemplate=M.serializeReportTemplate;exports.validateReportTemplate=M.validateReportTemplate;exports.validateReportTemplateDocument=M.validateReportTemplateDocument;exports.ReportParamValidationError=W.ReportParamValidationError;exports.assertReportParams=W.assertReportParams;exports.formatReportDateRange=W.formatReportDateRange;exports.isReportDate=W.isReportDate;exports.isReportMonth=W.isReportMonth;exports.isReportYear=W.isReportYear;exports.parseReportDateRange=W.parseReportDateRange;exports.reportParamsJsonSchema=W.reportParamsJsonSchema;exports.validateReportParamDefinitions=W.validateReportParamDefinitions;exports.validateReportParams=W.validateReportParams;exports.hasValidDataExplanation=me.hasValidDataExplanation;exports.isReportDataTarget=me.isReportDataTarget;exports.isReportValueState=me.isReportValueState;exports.collectTemplateOutline=he.collectTemplateOutline;exports.inspectTemplateFieldUsage=he.inspectTemplateFieldUsage;exports.templatePathLocation=he.templatePathLocation;exports.applyReportDocumentStyle=oe.applyReportDocumentStyle;exports.captureTemplateFragment=oe.captureTemplateFragment;exports.insertTemplateFragment=oe.insertTemplateFragment;exports.inspectTemplateFragmentBindings=oe.inspectTemplateFragmentBindings;exports.TreeRowLimitError=ge.TreeRowLimitError;exports.createTreeTable=ge.createTreeTable;exports.validateTreeOptions=ge.validateTreeOptions;exports.LabelSheetError=F;exports.PageBuilder=He;exports.ReportCalculationError=b;exports.ReportCellFieldError=ze;exports.ReportTemplateStoreError=O;exports.TemplateBuilder=Be;exports.calculateReportSelection=pr;exports.classOf=P;exports.cloneReportTemplate=jt;exports.columnsFromContract=Ct;exports.computePageWindow=Fe;exports.createCanvasPager=Rt;exports.createLabelTemplate=Nt;exports.createLocalTemplateCatalog=Ut;exports.createMemoryTemplateStore=zt;exports.createProviderReport=Bt;exports.createTableTemplate=Dt;exports.createTemplate=St;exports.createTemplateManager=Ht;exports.defineLabelReport=_t;exports.evaluateReportAggregateExpression=Ue;exports.formatReportClipboard=qt;exports.imposeLabelSheets=yr;exports.measurePageSizePx=ie;exports.parseReportCellFieldInput=tr;exports.parseReportClipboard=Gt;exports.planFontSizePx=ut;exports.renderComponent=ue;exports.renderPage=ke;exports.renderPlan=ct;exports.renderPlanToCanvas=Et;exports.renderPlanToCanvasAsync=xt;exports.renderPlanToImages=bt;exports.resolvePaper=we;exports.validateReportCellFieldDefinition=je;