@agile-team/mach-report 2.4.1 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +119 -13
  2. package/dist/ReportPreview-Dk-28QAi.js +2946 -0
  3. package/dist/ReportPreview-FSvcBLjH.cjs +6 -0
  4. package/dist/_plugin-vue_export-helper-BHFhmbuH.cjs +1 -0
  5. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  6. package/dist/analytics.cjs +1 -0
  7. package/dist/analytics.d.cts +276 -0
  8. package/dist/analytics.d.ts +276 -0
  9. package/dist/analytics.js +223 -0
  10. package/dist/assets-66UBlhES.cjs +1 -0
  11. package/dist/assets-NVA_sftu.js +163 -0
  12. package/dist/capabilities-CNjIirfo.js +36 -0
  13. package/dist/capabilities-D4xeVYSR.cjs +1 -0
  14. package/dist/designer.cjs +1 -0
  15. package/dist/designer.d.cts +753 -0
  16. package/dist/designer.d.ts +753 -0
  17. package/dist/designer.js +372 -0
  18. package/dist/grid-geometry-BNptEcMm.js +65 -0
  19. package/dist/grid-geometry-CZ_cYB6O.cjs +1 -0
  20. package/dist/index.cjs +8 -5
  21. package/dist/index.d.cts +413 -8
  22. package/dist/index.d.ts +413 -8
  23. package/dist/index.js +1016 -1501
  24. package/dist/param-validation-BWNjLcN0.js +116 -0
  25. package/dist/param-validation-CiTxFeZ8.cjs +1 -0
  26. package/dist/pdf.cjs +48 -48
  27. package/dist/pdf.d.cts +111 -1
  28. package/dist/pdf.d.ts +111 -1
  29. package/dist/pdf.js +3931 -3868
  30. package/dist/{plugin-DwKr8oF6.cjs → plugin-BqBkn_kI.cjs} +1 -1
  31. package/dist/{plugin-CKnSVuVe.js → plugin-Ds10VnQO.js} +2 -2
  32. package/dist/render-plan-CckPEQyf.cjs +1 -0
  33. package/dist/{render-plan-CXBWRog4.js → render-plan-uzZYYSy1.js} +11 -10
  34. package/dist/report-params-B_VCihAh.js +12 -0
  35. package/dist/report-params-CjWrjPl6.cjs +1 -0
  36. package/dist/report-source-B9bENO0F.js +750 -0
  37. package/dist/report-source-BbNkkBDy.cjs +1 -0
  38. package/dist/server/node.d.cts +297 -0
  39. package/dist/server/node.d.ts +297 -0
  40. package/dist/server-node.cjs +1 -0
  41. package/dist/server-node.js +270 -0
  42. package/dist/server.cjs +1 -0
  43. package/dist/server.d.cts +643 -0
  44. package/dist/server.d.ts +643 -0
  45. package/dist/server.js +237 -0
  46. package/dist/style-CpwiOPyB.cjs +1 -0
  47. package/dist/style-Dv5o_x6b.js +67 -0
  48. package/dist/style.css +1 -1
  49. package/dist/template-registry-DWExx0gU.cjs +1 -0
  50. package/dist/template-registry-NpOakidD.js +354 -0
  51. package/dist/textwrap-CnGsEum6.cjs +4 -0
  52. package/dist/textwrap-DOl04hCQ.js +110 -0
  53. package/dist/validate-DfHPD8wX.cjs +1 -0
  54. package/dist/validate-S6CgIm5d.js +148 -0
  55. package/dist/vue/async.d.cts +694 -54
  56. package/dist/vue/async.d.ts +694 -54
  57. package/dist/vue/index.d.cts +1212 -111
  58. package/dist/vue/index.d.ts +1212 -111
  59. package/dist/vue-async.cjs +1 -1
  60. package/dist/vue-async.js +3 -3
  61. package/dist/vue.cjs +1 -1
  62. package/dist/vue.js +167 -80
  63. package/dist/worker.cjs +1 -0
  64. package/dist/worker.d.cts +302 -0
  65. package/dist/worker.d.ts +302 -0
  66. package/dist/worker.js +133 -0
  67. package/dist/xlsx/node.d.cts +47 -0
  68. package/dist/xlsx/node.d.ts +47 -0
  69. package/dist/xlsx-node.cjs +221 -0
  70. package/dist/xlsx-node.js +36409 -0
  71. package/dist/xlsx.cjs +20 -20
  72. package/dist/xlsx.d.cts +78 -1
  73. package/dist/xlsx.d.ts +78 -1
  74. package/dist/xlsx.js +5974 -5831
  75. package/package.json +62 -2
  76. package/dist/ReportPreview-BVTpw9Tb.cjs +0 -6
  77. package/dist/ReportPreview-XF8iSUG1.js +0 -1910
  78. package/dist/grid-geometry-BNIvw52m.cjs +0 -1
  79. package/dist/grid-geometry-C8hGoe9o.js +0 -130
  80. package/dist/render-plan-CCTL4F9v.cjs +0 -1
  81. package/dist/report-params-B3Fia6JO.js +0 -10
  82. package/dist/report-params-D1gZ1DME.cjs +0 -1
  83. package/dist/textwrap-nH0UYU6D.js +0 -108
  84. package/dist/textwrap-oD-t4b4B.cjs +0 -4
package/dist/server.js ADDED
@@ -0,0 +1,237 @@
1
+ import { d as q, R as $, c as k, P as z } from "./report-source-B9bENO0F.js";
2
+ import { g as I } from "./report-params-B_VCihAh.js";
3
+ import { b as L, r as J, R as V } from "./param-validation-BWNjLcN0.js";
4
+ import { c as _ } from "./validate-S6CgIm5d.js";
5
+ class p extends Error {
6
+ constructor(e, a, s) {
7
+ super(a), this.code = e, this.path = s, this.name = "ReportRuntimeError";
8
+ }
9
+ }
10
+ function x(r) {
11
+ if (!r?.aborted) return;
12
+ if (r.reason instanceof p) throw r.reason;
13
+ const e = new Error("报表执行已取消");
14
+ throw e.name = "AbortError", Object.defineProperty(e, "cause", { value: r.reason }), e;
15
+ }
16
+ function b(r, e, a) {
17
+ if (!Number.isFinite(a) || a < 0) throw new p("budget", `${e} 的执行统计无效`, `$.budget.${e}`);
18
+ const s = r[e];
19
+ if (s !== void 0 && a > s) throw new p("budget", `${e} 超出预算 ${s}(实际 ${a})`, `$.budget.${e}`);
20
+ }
21
+ function Q(r) {
22
+ for (const [e, a] of Object.entries(r)) {
23
+ if (a !== void 0 && (!Number.isFinite(a) || a <= 0)) throw new p("budget", `${e} 应为正有限数字`, `$.budget.${e}`);
24
+ if (e !== "maxDurationMs" && a !== void 0 && !Number.isSafeInteger(a)) throw new p("budget", `${e} 应为正安全整数`, `$.budget.${e}`);
25
+ if (e === "maxDurationMs" && a !== void 0 && a > 2147483647) throw new p("budget", "maxDurationMs 不能超过 2147483647", `$.budget.${e}`);
26
+ }
27
+ }
28
+ async function B(r, e, a) {
29
+ const s = new AbortController(), t = () => s.abort(r?.reason);
30
+ r?.addEventListener("abort", t, { once: !0 }), r?.aborted && t();
31
+ const n = Date.now(), l = e === void 0 ? void 0 : setTimeout(() => s.abort(new p("timeout", `报表执行超过 ${e}ms`)), e);
32
+ let o;
33
+ try {
34
+ x(s.signal);
35
+ const i = new Promise((w, f) => {
36
+ o = () => {
37
+ try {
38
+ x(s.signal);
39
+ } catch (v) {
40
+ f(v);
41
+ }
42
+ }, s.signal.addEventListener("abort", o, { once: !0 });
43
+ }), m = await Promise.race([a(s.signal), i]);
44
+ if (x(s.signal), e !== void 0 && Date.now() - n > e) throw new p("timeout", `报表执行超过 ${e}ms`);
45
+ return m;
46
+ } finally {
47
+ l !== void 0 && clearTimeout(l), o && s.signal.removeEventListener("abort", o), r?.removeEventListener("abort", t);
48
+ }
49
+ }
50
+ function F(r, e) {
51
+ if (e.length === 0) throw new $("config", "缺少报表 ID");
52
+ return e.map((a) => {
53
+ if (!Object.prototype.hasOwnProperty.call(r, a)) throw new $("config", `未注册报表 ${a}`);
54
+ return r[a];
55
+ });
56
+ }
57
+ function S(r) {
58
+ return r.grid?.cells.reduce((e, a) => e + a.reduce((s, t) => s + (t ? 1 + (t.children?.reduce((n, l) => n + S(l), 0) ?? 0) : 0), 0), 0) ?? 0;
59
+ }
60
+ function W(r, e) {
61
+ return r.pages.reduce((a, s) => a + s.components.reduce((t, n) => {
62
+ if (n.kind !== "list") return t + S(n);
63
+ const l = e[n.dataset]?.length ?? 0;
64
+ return t + n.columns.length * (l + (n.headerGrid?.cells.length ?? 1));
65
+ }, 0), 0);
66
+ }
67
+ function G(r, e = Object.keys(r)) {
68
+ return F(r, e).map((a, s) => {
69
+ const t = e[s], n = I(r, [t]);
70
+ return {
71
+ id: t,
72
+ params: JSON.parse(JSON.stringify(n)),
73
+ paramsSchema: J(n),
74
+ datasetsSchema: Object.fromEntries(Object.entries(a.dataSchema ?? {}).map(([l, o]) => [l, q(o)])),
75
+ capabilities: {
76
+ save: !!a.provider?.save,
77
+ export: !!a.provider?.export,
78
+ templates: !!a.provider?.templates
79
+ }
80
+ };
81
+ });
82
+ }
83
+ function A(r, e) {
84
+ F(r, e.reportIds);
85
+ const a = L(I(r, e.reportIds), e.params), s = e.reportIds.flatMap((n) => L(I(r, [n]), e.params).issues), t = new Map(s.map((n) => [JSON.stringify(n), n]));
86
+ return { ...a, ok: t.size === 0, issues: [...t.values()] };
87
+ }
88
+ function U(r, e) {
89
+ const a = _(r.plan);
90
+ if (!a.ok) throw new $("validate", `执行器返回无效计划:${a.errors[0]?.path}`);
91
+ const s = r.plan.pages.length, t = r.plan.pages.reduce((n, l) => n + l.components.reduce((o, i) => o + S(i), 0), 0);
92
+ return b(e, "maxRows", r.stats.rows), b(e, "maxPages", s), b(e, "maxCells", t), { ...r, stats: { ...r.stats, pages: s, cells: t } };
93
+ }
94
+ function N(r, e) {
95
+ const a = A(r.reports, e);
96
+ if (!a.ok) throw new V(a.issues);
97
+ }
98
+ function T(r = []) {
99
+ return r.map(({ code: e, message: a, severity: s, pageIndex: t, componentIndex: n }) => ({ code: e, message: a, severity: s, path: `$.pages.${t}.components.${n}` }));
100
+ }
101
+ function Z(r) {
102
+ const e = { maxRows: 1e5, maxPages: 1e4, maxCells: 2e6, maxOutputBytes: 1e8, maxDurationMs: 12e4, ...r.budget };
103
+ Q(e);
104
+ const a = async (t, n) => {
105
+ const l = Date.now();
106
+ let o = 0, i = 0;
107
+ const m = [], w = {}, f = Object.fromEntries(Object.entries(r.reports).map(([d, g]) => [d, {
108
+ ...g,
109
+ pagination: { ...r.pagination, ...g.pagination, ...n ? { measurer: n } : {} },
110
+ dataValidation: {
111
+ ...g.dataValidation,
112
+ maxRows: Math.min(e.maxRows ?? 1e5, g.dataValidation?.maxRows ?? 1 / 0),
113
+ maxCells: Math.min(e.maxCells ?? 2e6, g.dataValidation?.maxCells ?? 1 / 0)
114
+ }
115
+ }])), u = await k(f, { maxPages: e.maxPages, onDatasets: (d, g, P) => {
116
+ o += Object.values(g).reduce((R, O) => R + O.length, 0), b(e, "maxRows", o), i += W(P, g), b(e, "maxCells", i);
117
+ } })({ ...t, params: t.params ?? {}, onWarning: (d) => m.push({ code: "layout", message: d, severity: "warning" }), onQueryResult: (d, g) => {
118
+ Object.defineProperty(w, d, { value: { revision: g.revision, sourceToken: g.sourceToken }, enumerable: !0, writable: !0 }), m.push(...g.diagnostics ?? []);
119
+ } }).catch((d) => {
120
+ throw d instanceof $ && d.cause instanceof z ? new p("budget", d.cause.message, "$.budget.maxPages") : d;
121
+ });
122
+ x(t.signal);
123
+ const c = u.pages.reduce((d, g) => d + g.components.reduce((P, R) => P + S(R), 0), 0);
124
+ return b(e, "maxPages", u.pages.length), b(e, "maxCells", c), { plan: u, diagnostics: m, revisions: w, stats: { rows: o, pages: u.pages.length, cells: c, durationMs: Date.now() - l } };
125
+ }, s = async (t) => {
126
+ const n = Date.now();
127
+ if (t.format !== "pdf" && t.format !== "xlsx") throw new $("config", "不支持的报表导出格式");
128
+ const l = t.format === "pdf" ? await import("@agile-team/mach-report/pdf") : void 0;
129
+ x(t.signal);
130
+ const o = t.pdf?.customFontFaces ?? (t.pdf?.customFontBytes ? { regular: t.pdf.customFontBytes } : void 0), i = l && o ? l.createFontBytesMeasurer(o) : void 0, m = await a(t, i);
131
+ x(t.signal);
132
+ let w;
133
+ if (t.format === "pdf") {
134
+ x(t.signal);
135
+ const u = await l.renderPlanToPdf(m.plan, { ...t.pdf, ...i ? { measurer: i } : {} });
136
+ w = u.bytes, m.diagnostics.push(...T(u.diagnostics)), m.diagnostics.push(...u.fidelityWarnings.map((c) => ({ code: "pdf-fidelity", message: c, severity: "warning" })), ...u.pageErrors.map((c) => ({ code: "pdf-page", message: c, severity: "error" }))), u.unsupportedTextCount && m.diagnostics.push({ code: "pdf-font", message: `${u.unsupportedTextCount} 段文本包含当前字体不支持的字符`, severity: "warning" });
137
+ } else {
138
+ const { renderPlanToXlsx: u } = await import("@agile-team/mach-report/xlsx");
139
+ x(t.signal);
140
+ const c = await u(m.plan, t.xlsx);
141
+ w = new Uint8Array(c.buffer), m.diagnostics.push(...T(c.diagnostics)), m.diagnostics.push(...c.warnings.map((d) => ({ code: "xlsx-fidelity", message: d, severity: "warning" })));
142
+ }
143
+ x(t.signal), b(e, "maxOutputBytes", w.byteLength);
144
+ const { plan: f, ...v } = m;
145
+ return { ...v, bytes: w, format: t.format, contentType: t.format === "pdf" ? "application/pdf" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", stats: { ...v.stats, durationMs: Date.now() - n, outputBytes: w.byteLength } };
146
+ };
147
+ return {
148
+ describe: (t) => G(r.reports, t),
149
+ validate: (t) => A(r.reports, t),
150
+ prepare: (t) => B(t.signal, e.maxDurationMs, async (n) => {
151
+ const { signal: l, ...o } = t;
152
+ N(r, o);
153
+ const i = r.executor ? await r.executor.prepare(o, n) : await a({ ...o, signal: n });
154
+ return U(i, e);
155
+ }),
156
+ export: (t) => B(t.signal, e.maxDurationMs, async (n) => {
157
+ const { signal: l, ...o } = t;
158
+ if (N(r, o), o.format !== "pdf" && o.format !== "xlsx") throw new $("config", "不支持的报表导出格式");
159
+ const i = r.executor ? await r.executor.export(o, n) : await s({ ...o, signal: n });
160
+ return b(e, "maxRows", i.stats.rows), b(e, "maxPages", i.stats.pages), b(e, "maxCells", i.stats.cells), b(e, "maxOutputBytes", i.bytes.byteLength), { ...i, stats: { ...i.stats, outputBytes: i.bytes.byteLength } };
161
+ })
162
+ };
163
+ }
164
+ function ee(r = {}) {
165
+ const e = r.concurrency ?? 1, a = r.maxQueued ?? 20;
166
+ if (!Number.isSafeInteger(e) || e < 1 || !Number.isSafeInteger(a) || a < 0) throw new p("budget", "队列并发应为正整数,排队上限应为非负整数");
167
+ const s = [], t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
168
+ let l = !1, o = 0;
169
+ const i = () => {
170
+ for (; !l && t.size < e && s.length; ) s.shift().start();
171
+ };
172
+ return {
173
+ get active() {
174
+ return t.size;
175
+ },
176
+ get pending() {
177
+ return s.length;
178
+ },
179
+ enqueue: (w, f = {}) => {
180
+ if (l) throw new p("closed", "任务队列已关闭");
181
+ if (x(f.signal), t.size >= e && s.length >= a) throw new p("queue-full", "报表任务队列已满");
182
+ const v = f.id ?? `report-${++o}`;
183
+ if (n.has(v)) throw new p("queue-full", "任务 ID 正在执行或排队");
184
+ const u = new AbortController();
185
+ let c = "queued", d, g, P;
186
+ const R = new Promise((h, y) => {
187
+ g = h, P = y;
188
+ }), O = () => {
189
+ f.signal?.removeEventListener("abort", j), n.delete(v);
190
+ }, D = (h) => {
191
+ if (c !== "queued" && c !== "running") return;
192
+ const y = c === "queued";
193
+ c = "cancelled", u.abort(h);
194
+ try {
195
+ x(u.signal);
196
+ } catch (C) {
197
+ P(C);
198
+ }
199
+ if (y) {
200
+ const C = s.indexOf(E);
201
+ C >= 0 && s.splice(C, 1), O(), i();
202
+ }
203
+ }, j = () => D(f.signal?.reason), M = (h, y) => {
204
+ c === "running" && (!Number.isFinite(h) || h < 0 || y !== void 0 && (!Number.isFinite(y) || y < h) || (d = { completed: h, ...y === void 0 ? {} : { total: y } }));
205
+ }, E = {
206
+ cancel: D,
207
+ start: () => {
208
+ c === "queued" && (c = "running", t.add(E), Promise.resolve().then(() => (x(u.signal), w({ signal: u.signal, reportProgress: M }))).then(
209
+ (h) => {
210
+ c === "running" && (c = "completed", g(h));
211
+ },
212
+ (h) => {
213
+ c === "running" && (c = "failed", P(h));
214
+ }
215
+ ).finally(() => {
216
+ t.delete(E), O(), i();
217
+ }));
218
+ }
219
+ };
220
+ return n.add(v), f.signal?.addEventListener("abort", j, { once: !0 }), f.signal?.aborted ? D(f.signal.reason) : t.size < e ? E.start() : s.push(E), { id: v, get status() {
221
+ return c;
222
+ }, get progress() {
223
+ return d;
224
+ }, result: R, cancel: D };
225
+ },
226
+ close: (w = {}) => {
227
+ l = !0;
228
+ for (const f of [...s]) f.cancel(new p("closed", "任务队列已关闭"));
229
+ if (w.cancelRunning) for (const f of t) f.cancel(new p("closed", "任务队列已关闭"));
230
+ }
231
+ };
232
+ }
233
+ export {
234
+ p as ReportRuntimeError,
235
+ Z as createReportRuntime,
236
+ ee as createReportTaskQueue
237
+ };
@@ -0,0 +1 @@
1
+ "use strict";const r=require("./render-plan-CckPEQyf.cjs"),l=25.4,i=96;function f(o=i){return o/l}function S(o,t=i){return(o||0)*f(t)}function c(o,t=i){return o/f(t)}function P(o,t=i){return o*t/72}function m(o,t){const e=10**t;return Math.round(o*e)/e}const h={a3:{widthMm:297,heightMm:420},a4:{widthMm:210,heightMm:297},a5:{widthMm:148,heightMm:210},b4:{widthMm:250,heightMm:353},b5:{widthMm:176,heightMm:250}};function s(o,t=96,e=r.DEFAULT_FONT_PT){if(o?.fontSizePx!=null)return{fontSizePt:o.fontSizePx*72/t,fontSizePx:o.fontSizePx};const n=o?.fontSize??e;return{fontSizePt:n,fontSizePx:P(n,t)}}function T(o,t=r.DEFAULT_STROKE_COLOR){return{color:o?.borderColor??o?.lineColor??t,widthPt:o?.lineWidthPt??r.DEFAULT_BORDER_PT}}function x(o,t=r.DEFAULT_TEXT_COLOR){return o?.color??t}function M(o){return o?.lineHeight??r.LINE_HEIGHT}function _(o){const t=o?.borderTop!==!1,e=o?.borderRight!==!1,n=o?.borderBottom!==!1,u=o?.borderLeft!==!1;return{top:t,right:e,bottom:n,left:u,inner:t||e||n||u}}function d(o,t){const e={...o,...t};return t?.fontSize!=null&&t.fontSizePx==null&&delete e.fontSizePx,t?.fontSizePx!=null&&t.fontSize==null&&delete e.fontSize,e}exports.CSS_DPI=i;exports.MM_PER_INCH=l;exports.PAPER_SIZES=h;exports.mergeComponentStyles=d;exports.mmToPx=S;exports.mmToPxFactor=f;exports.ptToPx=P;exports.pxToMm=c;exports.resolveBoxBorders=_;exports.resolveFontSize=s;exports.resolveLineHeight=M;exports.resolveStroke=T;exports.resolveTextColor=x;exports.round=m;
@@ -0,0 +1,67 @@
1
+ import { d as s, e as a, a as u, L as c, c as h } from "./render-plan-uzZYYSy1.js";
2
+ const l = 25.4, r = 96;
3
+ function f(t = r) {
4
+ return t / l;
5
+ }
6
+ function S(t, n = r) {
7
+ return (t || 0) * f(n);
8
+ }
9
+ function T(t, n = r) {
10
+ return t / f(n);
11
+ }
12
+ function m(t, n = r) {
13
+ return t * n / 72;
14
+ }
15
+ function d(t, n) {
16
+ const o = 10 ** n;
17
+ return Math.round(t * o) / o;
18
+ }
19
+ const x = {
20
+ a3: { widthMm: 297, heightMm: 420 },
21
+ a4: { widthMm: 210, heightMm: 297 },
22
+ a5: { widthMm: 148, heightMm: 210 },
23
+ b4: { widthMm: 250, heightMm: 353 },
24
+ b5: { widthMm: 176, heightMm: 250 }
25
+ };
26
+ function z(t, n = 96, o = s) {
27
+ if (t?.fontSizePx != null)
28
+ return { fontSizePt: t.fontSizePx * 72 / n, fontSizePx: t.fontSizePx };
29
+ const e = t?.fontSize ?? o;
30
+ return { fontSizePt: e, fontSizePx: m(e, n) };
31
+ }
32
+ function M(t, n = a) {
33
+ return {
34
+ color: t?.borderColor ?? t?.lineColor ?? n,
35
+ widthPt: t?.lineWidthPt ?? h
36
+ };
37
+ }
38
+ function _(t, n = u) {
39
+ return t?.color ?? n;
40
+ }
41
+ function g(t) {
42
+ return t?.lineHeight ?? c;
43
+ }
44
+ function E(t) {
45
+ const n = t?.borderTop !== !1, o = t?.borderRight !== !1, e = t?.borderBottom !== !1, i = t?.borderLeft !== !1;
46
+ return { top: n, right: o, bottom: e, left: i, inner: n || o || e || i };
47
+ }
48
+ function L(t, n) {
49
+ const o = { ...t, ...n };
50
+ return n?.fontSize != null && n.fontSizePx == null && delete o.fontSizePx, n?.fontSizePx != null && n.fontSize == null && delete o.fontSize, o;
51
+ }
52
+ export {
53
+ r as C,
54
+ l as M,
55
+ x as P,
56
+ z as a,
57
+ g as b,
58
+ M as c,
59
+ E as d,
60
+ L as e,
61
+ _ as f,
62
+ f as g,
63
+ T as h,
64
+ S as m,
65
+ m as p,
66
+ d as r
67
+ };
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .mrp-toolbar[data-v-1c2568a7]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-1c2568a7]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-1c2568a7]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-1c2568a7]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-1c2568a7]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-1c2568a7]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-pageinfo[data-v-1c2568a7]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-1c2568a7]{flex:1}.mrp-search[data-v-1c2568a7]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-1c2568a7]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-1c2568a7]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-1c2568a7]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-params[data-v-aafce92d]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-aafce92d]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-aafce92d]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-aafce92d]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-aafce92d]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-aafce92d]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-aafce92d]{background:#22252a;color:#e8e8e8;border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-aafce92d]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-aafce92d]{border-color:#ff7b72}select.mrp-param-input option[data-v-aafce92d]{background:#22252a}.mrp-params-actions[data-v-aafce92d]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-aafce92d]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-aafce92d]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-aafce92d]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mach-report-preview[data-v-fa6fd3bb]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-fa6fd3bb]{display:flex;flex:1;min-height:0}.mrp-body[data-v-fa6fd3bb]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-fa6fd3bb]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-fa6fd3bb]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-fa6fd3bb]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--a2d6c888);flex:none}.mrp-wide-report .mrp-page-holder[data-v-fa6fd3bb]{box-shadow:none}.mrp-state[data-v-fa6fd3bb]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-fa6fd3bb]{color:#ff9d9d}.mrp-edit-hint[data-v-fa6fd3bb]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-export-notice[data-v-fa6fd3bb]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-fa6fd3bb]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-fa6fd3bb]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-fa6fd3bb]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-fa6fd3bb]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-fa6fd3bb] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-fa6fd3bb]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-fa6fd3bb]{cursor:pointer;text-align:center;flex:none;margin-bottom:8px}.mrp-thumb-spacer[data-v-fa6fd3bb]{flex:none}.mrp-thumb-box[data-v-fa6fd3bb]{box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-fa6fd3bb]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-fa6fd3bb]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-fa6fd3bb]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
1
+ .mr-designer[data-v-5c39594b]{display:flex;flex-direction:column;min-height:480px;height:100%;color:var(--mrp-toolbar-fg, #334155);background:var(--mrp-toolbar-bg, #fff);border:1px solid var(--mrp-toolbar-border, #e2e8f0);border-radius:10px;overflow:hidden;font:13px/1.5 sans-serif}.mr-designer-bar[data-v-5c39594b]{display:flex;flex-wrap:wrap;justify-content:space-between;gap:10px;padding:12px 16px;border-bottom:1px solid var(--mrp-toolbar-border, #e2e8f0)}.mr-designer-bar span[data-v-5c39594b]{display:block;font-size:11px;opacity:.7}.mr-designer-bar b[data-v-5c39594b]{font-weight:400}.mr-designer-body[data-v-5c39594b]{display:grid;grid-template-columns:minmax(230px,300px) minmax(0,1fr);flex:1;min-height:0}.mr-designer-panel[data-v-5c39594b]{overflow:auto;padding:14px;border-right:1px solid var(--mrp-toolbar-border, #e2e8f0)}.mr-designer label[data-v-5c39594b]{display:grid;grid-template-columns:90px minmax(0,1fr);align-items:center;gap:8px;margin:8px 0}.mr-designer input[data-v-5c39594b],.mr-designer select[data-v-5c39594b],.mr-designer textarea[data-v-5c39594b],.mr-designer button[data-v-5c39594b]{box-sizing:border-box;min-width:0;color:inherit;font:inherit;border:1px solid var(--mrp-toolbar-border, #cbd5e1);border-radius:5px;padding:5px 7px;background:var(--mrp-toolbar-bg, #fff)}.mr-designer input[data-v-5c39594b]:focus-visible,.mr-designer select[data-v-5c39594b]:focus-visible,.mr-designer textarea[data-v-5c39594b]:focus-visible,.mr-designer button[data-v-5c39594b]:focus-visible{outline:2px solid var(--mrp-btn-active-bg, #2563eb);outline-offset:2px}.mr-designer button[data-v-5c39594b]{cursor:pointer;margin-right:6px}.mr-designer[data-v-5c39594b] :disabled{cursor:default;opacity:.55}.mr-designer fieldset[data-v-5c39594b]{margin:12px 0;border:1px solid var(--mrp-toolbar-border, #e2e8f0);border-radius:7px}.mr-designer legend[data-v-5c39594b]{padding:0 6px;font-weight:600}.mr-designer .mr-designer-toggle[data-v-5c39594b]{display:flex;justify-content:space-between}.mr-designer-preview[data-v-5c39594b]{min-width:0;min-height:380px;display:flex;flex-direction:column}.mr-designer-preview[data-v-5c39594b] .mrp-root{flex:1}.mr-designer-note[data-v-5c39594b]{opacity:.7;font-size:11px}.mr-designer-error[data-v-5c39594b]{padding:10px 16px;color:#b91c1c;background:#fef2f2}.mr-designer-json[data-v-5c39594b]{width:100%;height:240px;font-family:monospace!important;margin:8px 0}@media(max-width:720px){.mr-designer-body[data-v-5c39594b]{grid-template-columns:1fr}.mr-designer-panel[data-v-5c39594b]{max-height:300px;border-right:0;border-bottom:1px solid var(--mrp-toolbar-border, #e2e8f0)}}.mrp-toolbar[data-v-249cf7b0]{display:flex;align-items:center;gap:8px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-title[data-v-249cf7b0]{font-size:13px;font-weight:600;margin-right:8px;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-nav[data-v-249cf7b0]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-249cf7b0]:hover:not(:disabled){background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-nav[data-v-249cf7b0]:disabled{opacity:.4;cursor:not-allowed}.mrp-active[data-v-249cf7b0]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-settings-toggle[data-v-249cf7b0]{display:inline-flex;align-items:center;gap:5px}.mrp-pageinfo[data-v-249cf7b0]{font-size:12px;min-width:56px;text-align:center;color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-spacer[data-v-249cf7b0]{flex:1}.mrp-search[data-v-249cf7b0]{display:flex;align-items:center;gap:4px}.mrp-search-input[data-v-249cf7b0]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:2px 8px;font-size:12px;width:150px;outline:none}.mrp-search-input[data-v-249cf7b0]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-search-count[data-v-249cf7b0]{font-size:12px;color:var(--mrp-toolbar-fg, #e8e8e8);min-width:42px;text-align:center}.mrp-settings-backdrop[data-v-b0efd4aa]{position:absolute;inset:0;z-index:30;background:#0f172a1f;display:flex;justify-content:flex-end;padding:10px}.mrp-settings-panel[data-v-b0efd4aa]{box-sizing:border-box;width:min(340px,100%);display:flex;flex-direction:column;min-height:0;border:1px solid var(--mrp-toolbar-border);border-radius:10px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);box-shadow:0 12px 40px #00000038;font-size:13px}.mrp-settings-header[data-v-b0efd4aa]{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 16px 10px}.mrp-settings-header strong[data-v-b0efd4aa]{font-size:15px}.mrp-settings-header p[data-v-b0efd4aa]{font-size:12px;opacity:.7;margin:7px 0 0;line-height:1.5}.mrp-settings-panel button[data-v-b0efd4aa]{cursor:pointer;color:inherit;border:1px solid var(--mrp-btn-border);background:transparent;border-radius:5px;padding:5px 10px}.mrp-settings-panel button[data-v-b0efd4aa]:hover{background:var(--mrp-btn-hover-bg)}.mrp-settings-close[data-v-b0efd4aa]{font-size:20px;line-height:18px}.mrp-settings-content[data-v-b0efd4aa]{overflow:auto;padding:0 16px 10px}.mrp-settings-content fieldset[data-v-b0efd4aa]{border:0;border-top:1px solid var(--mrp-toolbar-border);margin:12px 0 0;padding:7px 0 0;min-width:0}.mrp-settings-content legend[data-v-b0efd4aa]{font-weight:600;padding-right:10px}.mrp-settings-option[data-v-b0efd4aa]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 0;cursor:pointer}.mrp-settings-option input[data-v-b0efd4aa]{accent-color:var(--mrp-btn-active-bg);width:15px;height:15px;margin:0;flex:none}.mrp-settings-option input.mrp-frozen-count[data-v-b0efd4aa]{width:54px;height:24px;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px}.mrp-settings-option small[data-v-b0efd4aa]{display:block;font-size:11px;margin-top:3px;opacity:.75}.mrp-settings-unavailable[data-v-b0efd4aa]{opacity:.5;cursor:default}.mrp-settings-note[data-v-b0efd4aa]{font-size:11px;line-height:1.6;opacity:.75}.mrp-settings-panel footer[data-v-b0efd4aa]{border-top:1px solid var(--mrp-toolbar-border);padding:10px 16px}.mrp-empty[data-v-07e9cb82]{box-sizing:border-box;position:sticky;left:max(0px,calc((100% - 560px)/2));width:min(560px,100%);margin:22px auto;padding:20px 24px 26px;text-align:center;color:var(--mrp-toolbar-fg, #526078);border:1px dashed var(--mrp-toolbar-border, #dfe5ed);border-radius:12px;background:var(--mrp-toolbar-bg, #fff)}.mrp-empty-art[data-v-07e9cb82]{display:block;width:144px;height:101px;margin:0 auto 10px}.mrp-empty strong[data-v-07e9cb82]{display:block;font-size:14px;font-weight:600}.mrp-empty p[data-v-07e9cb82]{font-size:12px;line-height:1.7;opacity:.7;margin:8px 0 0;overflow-wrap:anywhere}.mrp-params[data-v-156737bc]{display:flex;align-items:flex-end;gap:12px;padding:6px 12px;background:var(--mrp-toolbar-bg, #323639);border-bottom:1px solid var(--mrp-toolbar-border, #22252a);flex:none;flex-wrap:wrap}.mrp-params-title[data-v-156737bc]{font-size:12px;font-weight:600;color:var(--mrp-toolbar-fg, #e8e8e8);padding-bottom:5px;white-space:nowrap}.mrp-params-grid[data-v-156737bc]{display:flex;flex-wrap:wrap;gap:8px 12px;flex:1}.mrp-param[data-v-156737bc]{display:flex;flex-direction:column;gap:2px}.mrp-param-label[data-v-156737bc]{font-size:11px;color:var(--mrp-toolbar-fg, #e8e8e8);opacity:.85}.mrp-param-star[data-v-156737bc]{color:#ff7b72;font-style:normal;margin-left:2px}.mrp-param-input[data-v-156737bc]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:3px 8px;font-size:12px;min-width:130px;outline:none}.mrp-param-input[data-v-156737bc]:focus{border-color:var(--mrp-btn-active-bg, #2d5fb8)}.mrp-param-missing .mrp-param-input[data-v-156737bc]{border-color:#ff7b72}select.mrp-param-input option[data-v-156737bc]{background:var(--mrp-toolbar-bg, #323639);color:var(--mrp-toolbar-fg, #e8e8e8)}.mrp-param-error[data-v-156737bc]{max-width:260px;color:var(--mrp-error-fg, #e35d59);font-size:11px}.mrp-params-actions[data-v-156737bc]{display:flex;gap:6px;padding-bottom:1px}.mrp-nav[data-v-156737bc]{background:transparent;color:var(--mrp-btn-fg, #cfcfcf);border:1px solid var(--mrp-btn-border, #4a4d52);border-radius:4px;padding:4px 14px;font-size:12px;cursor:pointer;white-space:nowrap}.mrp-nav[data-v-156737bc]:hover{background:var(--mrp-btn-hover-bg, #414549);color:var(--mrp-btn-hover-fg, #fff)}.mrp-param-query[data-v-156737bc]{background:var(--mrp-btn-active-bg, #2d5fb8);border-color:var(--mrp-btn-active-bg, #2d5fb8);color:#fff}.mrp-edit-bar[data-v-df1c7b86]{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px 12px;border-bottom:1px solid var(--mrp-toolbar-border);font-size:12px;color:var(--mrp-toolbar-fg);background:var(--mrp-toolbar-bg)}button[data-v-df1c7b86]{font:inherit;background:transparent;color:inherit;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:3px 8px;cursor:pointer}button[data-v-df1c7b86]:disabled{opacity:.45;cursor:default}summary[data-v-df1c7b86]{cursor:pointer;padding:3px 5px}.mrp-changes[data-v-df1c7b86]{position:relative}.mrp-changes section[data-v-df1c7b86]{position:absolute;z-index:15;top:28px;left:0;max-height:260px;overflow:auto;min-width:300px;max-width:min(480px,80vw);border:1px solid var(--mrp-btn-border);background:var(--mrp-toolbar-bg);padding:10px;box-shadow:0 5px 20px #0003;border-radius:6px}.mrp-changes ol[data-v-df1c7b86]{margin:0;padding-left:22px}.mrp-changes li[data-v-df1c7b86]{padding:5px 0}.mrp-changes li span[data-v-df1c7b86]{display:block;margin-top:5px;overflow-wrap:anywhere}s[data-v-df1c7b86]{opacity:.65}.mrp-conflicts[data-v-df1c7b86]{color:#b9382a;width:100%}.mrp-section-nav[data-v-ef8815ec]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:7px;padding:6px 12px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);font-size:12px;border-bottom:1px solid var(--mrp-toolbar-border)}.mrp-section-tabs[data-v-ef8815ec]{display:flex;gap:4px;overflow:auto;max-width:100%}button[data-v-ef8815ec],input[data-v-ef8815ec]{font:inherit;color:inherit;background:transparent;border:1px solid var(--mrp-btn-border);border-radius:4px;padding:4px 7px}button[data-v-ef8815ec]{cursor:pointer}.active[data-v-ef8815ec]{background:var(--mrp-btn-active-bg)}form[data-v-ef8815ec]{display:flex;gap:4px;margin-left:auto}input[data-v-ef8815ec]{width:min(220px,40vw)}input[data-v-ef8815ec]::placeholder{color:inherit;opacity:.6}.mrp-import-summary[data-v-54f275e8]{padding:8px 12px;font-size:12px;background:var(--mrp-toolbar-bg);color:var(--mrp-toolbar-fg);border-bottom:1px solid var(--mrp-toolbar-border);max-height:180px;overflow:auto}.mrp-import-summary summary[data-v-54f275e8]{cursor:pointer}.mrp-import-summary p[data-v-54f275e8]{opacity:.75}.mrp-import-summary li[data-v-54f275e8]{margin:4px 0}.mach-report-preview[data-v-dfdeb309]{--mrp-shell-bg: #525659;--mrp-shell-fg: #e8e8e8;--mrp-toolbar-bg: #323639;--mrp-toolbar-border: #22252a;--mrp-toolbar-fg: #e8e8e8;--mrp-btn-fg: #cfcfcf;--mrp-btn-border: #4a4d52;--mrp-btn-hover-bg: #414549;--mrp-btn-hover-fg: #ffffff;--mrp-btn-active-bg: #2d5fb8;position:relative;display:flex;flex-direction:column;background:var(--mrp-shell-bg);color:var(--mrp-shell-fg);overflow:hidden}.mrp-main[data-v-dfdeb309]{display:flex;flex:1;min-height:0}.mrp-body[data-v-dfdeb309]{flex:1;min-width:0;overflow:auto;padding:24px;outline:none}.mrp-scale[data-v-dfdeb309]{position:relative;margin:0 auto}.mrp-scale-inner[data-v-dfdeb309]{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center}.mrp-page-holder[data-v-dfdeb309]{background:#fff;box-shadow:0 2px 8px #00000059;margin-bottom:var(--v02f88d9f);flex:none}.mrp-wide-report .mrp-page-holder[data-v-dfdeb309]{box-shadow:none}.mrp-state[data-v-dfdeb309]{padding:40px;text-align:center;color:#bfbfbf;font-size:13px}.mrp-error[data-v-dfdeb309]{color:#ff9d9d}.mrp-edit-hint[data-v-dfdeb309]{padding:5px 12px;font-size:12px;color:var(--mrp-shell-fg)}.mrp-body[data-v-dfdeb309] .mrp-cell-selected{background-image:linear-gradient(#2563eb12,#2563eb12)}.mrp-body[data-v-dfdeb309] .mrp-cell-focus{outline:2px solid #2563eb;outline-offset:-2px;z-index:8!important}.mrp-body[data-v-dfdeb309] .mrp-cell-modified:after{content:"";position:absolute;right:0;top:0;border-top:6px solid #d58916;border-left:6px solid transparent}.mrp-body[data-v-dfdeb309] .mrp-cell-frozen{background-color:#fff;box-shadow:1px 0 #aeb8c6,0 1px #aeb8c6}.mrp-export-notice[data-v-dfdeb309]{padding:7px 12px;font-size:12px;background:#fff0c2;color:#613c00}.mrp-export-error[data-v-dfdeb309]{background:#ffe0df;color:#8e1f1f}.mrp-export-progress[data-v-dfdeb309]{background:#e7f0ff;color:#1a4d86}.mrp-retry[data-v-dfdeb309]{margin-left:12px;background:transparent;color:#8fb7ff;border:1px solid #5a7fbf;border-radius:4px;padding:1px 10px;cursor:pointer}.mrp-overlay[data-v-dfdeb309]{position:absolute;inset:0;pointer-events:none}.mrp-page-holder[data-v-dfdeb309] mark.mrp-hit{background:#ffe066;color:#7a5c00;border-radius:2px;padding:0 1px;scroll-margin:8px}.mrp-thumbs[data-v-dfdeb309]{width:140px;flex:none;overflow-y:auto;border-left:1px solid var(--mrp-toolbar-border);background:var(--mrp-toolbar-bg);padding:8px;display:flex;flex-direction:column}.mrp-thumb[data-v-dfdeb309]{cursor:pointer;text-align:center;flex:none;margin:0 0 8px;padding:0;border:0;background:transparent;font:inherit}.mrp-thumb[data-v-dfdeb309]:focus-visible{outline:2px solid var(--mrp-btn-active-bg);outline-offset:2px}.mrp-thumb-spacer[data-v-dfdeb309]{flex:none}.mrp-thumb-box[data-v-dfdeb309]{display:block;box-sizing:border-box;width:116px;background:#fff;box-shadow:0 1px 4px #0006;overflow:hidden;border:2px solid transparent}.mrp-thumb-active .mrp-thumb-box[data-v-dfdeb309]{border-color:var(--mrp-btn-active-bg)}.mrp-thumb-no[data-v-dfdeb309]{display:block;margin-top:4px;line-height:16px;font-size:11px;color:var(--mrp-toolbar-fg)}.mrp-debug[data-v-dfdeb309]{position:absolute;right:8px;bottom:8px;background:#000000c7;color:#7ee787;font:11px/1.6 ui-monospace,monospace;padding:6px 10px;border-radius:6px;pointer-events:none;white-space:pre}
@@ -0,0 +1 @@
1
+ "use strict";const L=require("./render-plan-CckPEQyf.cjs"),N=require("./validate-DfHPD8wX.cjs"),O=require("./param-validation-CiTxFeZ8.cjs"),E="1.0";class p extends Error{constructor(t){super(`模板校验失败:${t.slice(0,3).map(s=>`${s.path}: ${s.message}`).join("; ")}`),this.errors=t,this.name="ReportTemplateError"}}const P=new Set(["__proto__","prototype","constructor"]),x=new Set(["schemaVersion","id","name","revision","description","template"]),D=new Set(["left","center","right","justify"]),M=2e5,V=64,k=1e7;function r(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function J(e,t,s){const i=Object.getPrototypeOf(e),o=Array.isArray(e);if(o?i!==Array.prototype:i!==Object.prototype&&i!==null)return s.push({path:t,message:"模板对象必须使用普通 JSON 对象原型"}),!1;if(o){const n=Object.keys(e);if(n.length!==e.length||n.some(a=>!/^(0|[1-9]\d*)$/.test(a)||Number(a)>=e.length))return s.push({path:t,message:"模板数组不能包含空位或额外属性"}),!1}return Object.getOwnPropertySymbols(e).length>0?(s.push({path:t,message:"模板不能包含 Symbol 键"}),!1):!0}function I(e,t,s,i){return P.has(e)?(i.push({path:s,message:"模板不能包含可能污染原型的键"}),!1):t.get||t.set||!t.enumerable?(i.push({path:s,message:"模板不能包含访问器或不可枚举字段"}),!1):!0}function C(e){return e===null||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e)}function v(e,t){const s=new Set;let i=0,o=0,n=!1;const a=(f,h,m)=>{if(!n){if(++i>M){i===M+1&&t.push({path:h,message:"模板超过 JSON 节点安全上限"});return}if(m>V){t.push({path:h,message:"模板嵌套层级过深"});return}if(typeof f=="string"){o+=f.length,o>k&&(n=!0,t.push({path:h,message:"模板文本超过 1000 万字符的安全上限"}));return}if(!C(f)){if(!f||typeof f!="object"){t.push({path:h,message:"模板只允许 JSON 值,不允许函数、undefined 或非有限数字"});return}if(s.has(f)){t.push({path:h,message:"模板不能包含循环引用"});return}if(J(f,h,t)){s.add(f);for(const[u,g]of Object.entries(Object.getOwnPropertyDescriptors(f))){if(Array.isArray(f)&&u==="length")continue;const y=`${h}.${u}`;if(I(u,g,y,t)&&a(g.value,y,m+1),i>M||n)break}s.delete(f)}}}};a(e,"$",0)}function l(e,t,s,i,o=!1){const n=e[t];n===void 0&&!o||(typeof n!="string"||o&&!n.trim())&&i.push({path:`${s}.${t}`,message:o?"应为非空字符串":"应为字符串"})}function c(e,t,s,i,o=0,n=!1){const a=e[t];a===void 0&&!n||(typeof a!="number"||!Number.isFinite(a)||a<o)&&i.push({path:`${s}.${t}`,message:`应为大于等于 ${o} 的有限数字`})}function b(e,t,s,i){e[t]!==void 0&&typeof e[t]!="boolean"&&i.push({path:`${s}.${t}`,message:"应为布尔值"})}function $(e,t,s,i=!1){e!==void 0&&!D.has(e)&&!(i&&e==="auto")&&s.push({path:t,message:`未知对齐方式${i?"(支持 auto)":""}`})}function d(e,t,s){if(e!==void 0){if(!r(e)){s.push({path:t,message:"样式应为对象"});return}$(e.align,`${t}.align`,s),e.verticalAlign!==void 0&&!["top","middle","bottom"].includes(e.verticalAlign)&&s.push({path:`${t}.verticalAlign`,message:"未知垂直对齐方式"});for(const i of["fontSize","fontSizePx","lineWidthPt","lineHeight"])c(e,i,t,s);for(const i of["letterSpacing","rotateDeg"])c(e,i,t,s,-1/0);c(e,"opacity",t,s),typeof e.opacity=="number"&&e.opacity>1&&s.push({path:`${t}.opacity`,message:"透明度不能大于 1"});for(const i of["bold","italic","underline","borderTop","borderRight","borderBottom","borderLeft"])b(e,i,t,s);for(const i of["fontFamily","color","backgroundColor","lineColor","borderColor"])l(e,i,t,s)}}function F(e,t,s){if(e===void 0)return;if(!Array.isArray(e)){s.push({path:t,message:"参数定义应为数组"});return}const i=new Set,o=s.length;e.forEach((n,a)=>{const f=`${t}.${a}`;if(!r(n)){s.push({path:f,message:"参数定义应为对象"});return}l(n,"field",f,s,!0),typeof n.field=="string"&&(i.has(n.field)&&s.push({path:`${f}.field`,message:"参数名重复"}),i.add(n.field)),n.type!==void 0&&!["text","number","date","select"].includes(n.type)&&s.push({path:`${f}.type`,message:"未知参数类型"});for(const h of["label","defaultValue","placeholder"])l(n,h,f,s);b(n,"required",f,s);for(const h of["minLength","maxLength"]){const m=n[h];m!==void 0&&(typeof m!="number"||!Number.isSafeInteger(m)||m<0)&&s.push({path:`${f}.${h}`,message:"长度边界应为非负整数"})}j(n,f,s),n.options!==void 0&&(Array.isArray(n.options)?n.options.forEach((h,m)=>{const u=`${f}.options.${m}`;if(!r(h))s.push({path:u,message:"选项应为对象"});else for(const g of["label","value"])typeof h[g]!="string"&&s.push({path:`${u}.${g}`,message:"选项标签与值应为字符串(允许空白选项)"})}):s.push({path:`${f}.options`,message:"选项应为数组"}))}),s.length===o&&s.push(...O.validateReportParamDefinitions(e).map(n=>({path:n.path.replace("$.paramDefs",t),message:n.message})))}function j(e,t,s){for(const n of["min","max"]){const a=e[n];if(a===void 0)continue;(e.type==="date"?typeof a=="string"&&O.isReportDate(a):e.type==="number"&&typeof a=="number"&&Number.isFinite(a))||s.push({path:`${t}.${n}`,message:"number 使用有限数字边界,date 使用有效 YYYY-MM-DD 日期边界"})}const i=typeof e.min=="number"&&typeof e.max=="number"&&e.min>e.max,o=typeof e.min=="string"&&typeof e.max=="string"&&e.min>e.max;(i||o)&&s.push({path:t,message:"最小边界不能大于最大边界"}),typeof e.minLength=="number"&&typeof e.maxLength=="number"&&e.minLength>e.maxLength&&s.push({path:t,message:"最小长度不能大于最大长度"})}function H(e,t,s){if(!Array.isArray(e)||e.length===0){s.push({path:t,message:"列表至少需要一列"});return}e.forEach((i,o)=>{const n=`${t}.${o}`;if(!r(i)){s.push({path:n,message:"列应为对象"});return}if(N.validateEditableMetadata(i,n,s),typeof i.header!="string"&&s.push({path:`${n}.header`,message:"表头应为字符串(允许空白表头)"}),l(i,"field",n,s,!0),c(i,"widthMm",n,s,Number.MIN_VALUE,!0),d(i.style,`${n}.style`,s),d(i.headerStyle,`${n}.headerStyle`,s),$(i.align,`${n}.align`,s,!0),$(i.headerAlign,`${n}.headerAlign`,s),i.semanticRole!==void 0&&!["identifier","dimension","measure","date","text"].includes(i.semanticRole)&&s.push({path:`${n}.semanticRole`,message:"未知列语义"}),i.format!==void 0)if(!r(i.format)||!["number","percent","date"].includes(i.format.kind))s.push({path:`${n}.format`,message:"未知列格式"});else{const a=i.format.digits;a!==void 0&&(typeof a!="number"||!Number.isInteger(a)||a<0||a>100)&&s.push({path:`${n}.format.digits`,message:"小数位应为 0–100 的整数"}),b(i.format,"thousands",`${n}.format`,s),l(i.format,"pattern",`${n}.format`,s)}i.rules!==void 0&&(Array.isArray(i.rules)?i.rules.forEach((a,f)=>{const h=`${n}.rules.${f}`;if(!r(a)||!r(a.when)){s.push({path:h,message:"条件格式缺少 when 对象"});return}l(a.when,"field",`${h}.when`,s,!0),[">",">=","<","<=","==","!="].includes(a.when.op)||s.push({path:`${h}.when.op`,message:"未知条件运算符"}),typeof a.when.value!="number"&&typeof a.when.value!="string"&&s.push({path:`${h}.when.value`,message:"条件值应为数字或字符串"}),d(a.style,`${h}.style`,s)}):s.push({path:`${n}.rules`,message:"条件格式应为数组"}))})}function U(e,t,s){if(e!==void 0){if(!r(e)){s.push({path:t,message:"分组应为对象"});return}l(e,"field",t,s,!0);for(const i of["headerTemplate","subtotalLabel"])l(e,i,t,s);for(const i of["headerStyle","subtotalStyle"])d(e[i],`${t}.${i}`,s);b(e,"keepWithNext",t,s),e.subtotal!==void 0&&(!Array.isArray(e.subtotal)||e.subtotal.some(i=>typeof i!="string"))&&s.push({path:`${t}.subtotal`,message:"小计字段应为字符串数组"})}}function G(e,t,s){if(!(e===void 0||typeof e=="boolean")){if(!r(e)){s.push({path:t,message:"合计应为布尔值或对象"});return}l(e,"label",t,s),d(e.style,`${t}.style`,s),e.fields!==void 0&&(!Array.isArray(e.fields)||e.fields.some(i=>typeof i!="string"))&&s.push({path:`${t}.fields`,message:"合计字段应为字符串数组"})}}function W(e,t,s,i){const o={kind:"rect",leftMm:0,topMm:0,widthMm:1,heightMm:1,grid:e};if(N.validateComponent(o,s,i,[]),R(o,s,i),!r(e)||!Array.isArray(e.cells))return;const n=e.cells,a=Array.isArray(t)?t.length:0;if(n.length*a>M){i.push({path:s,message:"表头逻辑网格超过 20 万格安全上限"});return}e.cells.length||i.push({path:`${s}.cells`,message:"表头至少需要一行"}),Array.isArray(e.colWidthsMm)&&e.colWidthsMm.length!==a&&i.push({path:`${s}.colWidthsMm`,message:"表头列宽数量应与列表列数一致"}),Array.isArray(e.rowHeightsMm)&&e.rowHeightsMm.length!==e.cells.length&&i.push({path:`${s}.rowHeightsMm`,message:"表头行高数量应与行数一致"}),Y(n,a,s,i)}function Y(e,t,s,i){const o=new Set;e.forEach((n,a)=>{if(!Array.isArray(n))return;let f=0;n.forEach((h,m)=>{for(;o.has(`${a}:${f}`);)f++;const u=r(h)&&typeof h.colSpan=="number"?h.colSpan:1,g=r(h)&&typeof h.rowSpan=="number"?h.rowSpan:1;(f+u>t||a+g>e.length)&&i.push({path:`${s}.cells.${a}.${m}`,message:"表头合并区域超出表头边界"});for(let y=a;y<Math.min(e.length,a+g);y++)for(let A=f;A<Math.min(t,f+u);A++)o.has(`${y}:${A}`)&&i.push({path:`${s}.cells.${a}.${m}`,message:"表头合并区域重叠"}),o.add(`${y}:${A}`);f+=u})})}function z(e,t,s){for(const i of["leftMm","topMm"])c(e,i,t,s,-1/0,!0);c(e,"widthMm",t,s,Number.MIN_VALUE,!0),l(e,"dataset",t,s,!0),l(e,"title",t,s);for(const i of["rowKey","revisionField","sourceTokenField"])l(e,i,t,s,e[i]!==void 0);e.headerGrid!==void 0&&W(e.headerGrid,e.columns,`${t}.headerGrid`,s),e.layout!==void 0&&e.layout!=="page"&&e.layout!=="wide"&&s.push({path:`${t}.layout`,message:"布局应为 page 或 wide"}),H(e.columns,`${t}.columns`,s);for(const i of["fontSizePt","rowHeightMm"])c(e,i,t,s,Number.MIN_VALUE);c(e,"paddingMm",t,s);for(const i of["headerBold","headerEveryPage","border"])b(e,i,t,s);l(e,"headerBackgroundColor",t,s),$(e.align,`${t}.align`,s,!0),$(e.headerAlign,`${t}.headerAlign`,s),d(e.headerStyle,`${t}.headerStyle`,s),U(e.groupBy,`${t}.groupBy`,s),G(e.grandTotal,`${t}.grandTotal`,s)}function R(e,t,s){d(e.style,`${t}.style`,s);for(const o of["text","rawText","imageData","fallbackText","nid","rkey"])l(e,o,t,s);if(e.lines!==void 0&&(!Array.isArray(e.lines)||e.lines.some(o=>typeof o!="string"))&&s.push({path:`${t}.lines`,message:"文本行应为字符串数组"}),Array.isArray(e.richParagraphs)&&e.richParagraphs.forEach((o,n)=>{if(!r(o))return;const a=`${t}.richParagraphs.${n}`;$(o.align,`${a}.align`,s);for(const f of["lineHeight","spaceBeforeMm","spaceAfterMm","indentMm"])c(o,f,a,s);Array.isArray(o.segments)&&o.segments.forEach((f,h)=>{const m=`${a}.segments.${h}`;if(!r(f)){s.push({path:m,message:"富文本片段应为对象"});return}f.kind!==void 0&&f.kind!=="text"&&f.kind!=="field"&&s.push({path:`${m}.kind`,message:"未知富文本片段类型"});for(const u of["text","field"])l(f,u,m,s);d(f.style,`${m}.style`,s)})}),!r(e.grid))return;const i=e.grid;c(i,"gapMm",`${t}.grid`,s),c(i,"paddingMm",`${t}.grid`,s);for(const o of["colWidthsMm","rowHeightsMm"]){const n=i[o];n!==void 0&&(!Array.isArray(n)||n.some(a=>typeof a!="number"||!Number.isFinite(a)||a<0))&&s.push({path:`${t}.grid.${o}`,message:"网格尺寸应为有限非负数字数组"})}Array.isArray(i.cells)&&i.cells.forEach((o,n)=>{Array.isArray(o)&&o.forEach((a,f)=>{const h=`${t}.grid.cells.${n}.${f}`;if(a!==null){if(!r(a)){s.push({path:h,message:"网格单元格应为对象或 null"});return}for(const m of["text","rawText","numberFormat"])l(a,m,h,s);for(const m of["colSpan","rowSpan"]){const u=a[m];u!==void 0&&(typeof u!="number"||!Number.isInteger(u)||u<=0)&&s.push({path:`${h}.${m}`,message:"跨度应为正整数"})}a.value!==void 0&&a.value!==null&&!["string","number","boolean"].includes(typeof a.value)&&s.push({path:`${h}.value`,message:"Excel 原始值应为字符串、数字、布尔值或 null"}),d(a.style,`${h}.style`,s),a.children!==void 0&&(Array.isArray(a.children)?a.children.forEach((m,u)=>{r(m)&&R(m,`${h}.children.${u}`,s)}):s.push({path:`${h}.children`,message:"嵌套组件应为数组"}))}})})}function T(e){const t=[],s=[];return v(e,t),t.length?{ok:!1,errors:t,warnings:s}:(r(e)?(e.schemaVersion!==void 0&&e.schemaVersion!==L.RENDER_PLAN_SCHEMA_VERSION&&t.push({path:"$.schemaVersion",message:"不支持的模板 schemaVersion"}),F(e.params,"$.params",t),!Array.isArray(e.pages)||e.pages.length===0?t.push({path:"$.pages",message:"模板至少需要一页"}):e.pages.forEach((i,o)=>{const n=`$.pages.${o}`;if(!r(i)){t.push({path:n,message:"页应为对象"});return}c(i,"widthMm",n,t,Number.MIN_VALUE,!0),c(i,"heightMm",n,t,Number.MIN_VALUE,!0),i.layout!==void 0&&i.layout!=="page"&&i.layout!=="wide"&&t.push({path:`${n}.layout`,message:"布局应为 page 或 wide"}),typeof i.heightMm=="number"&&i.heightMm>=5e3&&t.push({path:`${n}.heightMm`,message:"页高应小于 5000mm"});for(const a of["marginTopMm","marginBottomMm","marginLeftMm","marginRightMm"])c(i,a,n,t);typeof i.widthMm=="number"&&Number(i.marginLeftMm??0)+Number(i.marginRightMm??0)>=i.widthMm&&t.push({path:n,message:"横向页边距占满页面"}),typeof i.heightMm=="number"&&Number(i.marginTopMm??0)+Number(i.marginBottomMm??0)>=i.heightMm&&t.push({path:n,message:"纵向页边距占满页面"}),Array.isArray(i.components)?i.components.forEach((a,f)=>{const h=`${n}.components.${f}`;r(a)&&a.kind==="list"?z(a,h,t):(N.validateComponent(a,h,t,s),r(a)&&R(a,h,t))}):t.push({path:`${n}.components`,message:"组件应为数组"})})):t.push({path:"$",message:"模板应为对象"}),{ok:t.length===0,errors:t,warnings:s})}function _(e){const t=[],s=[];if(v(e,t),t.length)return{ok:!1,errors:t,warnings:s};if(!r(e))t.push({path:"$",message:"模板文档应为对象"});else{for(const o of Object.keys(e))x.has(o)||t.push({path:`$.${o}`,message:"模板文档存在未知字段;只保存模板与描述,不保存取数或业务数据"});e.schemaVersion!==E&&t.push({path:"$.schemaVersion",message:"不支持的模板文档版本"});for(const o of["id","name"])l(e,o,"$",t,!0);for(const o of["revision","description"])l(e,o,"$",t);const i=T(e.template);t.push(...i.errors.map(o=>({...o,path:`$.template${o.path.slice(1)}`}))),s.push(...i.warnings.map(o=>({...o,path:`$.template${o.path.slice(1)}`})))}return{ok:t.length===0,errors:t,warnings:s}}function S(e){const t=_(e);if(!t.ok)throw new p(t.errors)}function K(e){const t=[];if(v(e,t),t.length)throw new p(t);const s={...e,schemaVersion:e.schemaVersion??E};return S(s),w(s)}function X(e){let t=e;if(typeof e=="string"){if(e.length>k)throw new p([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);try{t=JSON.parse(e)}catch{throw new p([{path:"$",message:"模板 JSON 语法无效"}])}}return S(t),w(t)}function q(e){S(e);const t=JSON.stringify(e,null,2);if(t.length>k)throw new p([{path:"$",message:"模板 JSON 超过 1000 万字符的导出/导入上限"}]);return t}function w(e){return JSON.parse(JSON.stringify(e))}function B(e=[]){const t=new Map,s={get:i=>{const o=t.get(i);return o?w(o):void 0},list:()=>Array.from(t.values(),({template:i,...o})=>({...o})),register:(i,o={})=>{if(S(i),t.has(i.id)&&!o.replace)throw new p([{path:"$.id",message:`模板 ID ${i.id} 已注册;更新需显式 replace:true`}]);t.set(i.id,w(i))},remove:i=>t.delete(i)};for(const i of e)s.register(i);return s}exports.REPORT_TEMPLATE_DOCUMENT_VERSION=E;exports.ReportTemplateError=p;exports.createTemplateRegistry=B;exports.defineReportTemplate=K;exports.parseReportTemplate=X;exports.serializeReportTemplate=q;exports.validateReportTemplate=T;exports.validateReportTemplateDocument=_;