@agile-team/mach-report 1.2.2 → 2.1.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 (88) hide show
  1. package/LICENSE +2 -4
  2. package/LICENSING.md +15 -0
  3. package/README.md +240 -92
  4. package/dist/ReportPreview-Dwdsyk9b.js +1558 -0
  5. package/dist/ReportPreview-VHAIfsz1.cjs +6 -0
  6. package/dist/index.cjs +5 -5
  7. package/dist/index.d.cts +738 -14
  8. package/dist/index.d.ts +738 -14
  9. package/dist/index.js +858 -805
  10. package/dist/pdf.cjs +47 -47
  11. package/dist/pdf.d.cts +155 -6
  12. package/dist/pdf.d.ts +155 -6
  13. package/dist/pdf.js +3542 -3466
  14. package/dist/plugin-Bl00j_CP.cjs +1 -0
  15. package/dist/plugin-DVScnZ4C.js +25 -0
  16. package/dist/report-params-BB85g7mg.js +10 -0
  17. package/dist/report-params-D1NeY-eR.cjs +1 -0
  18. package/dist/sql.cjs +65 -64
  19. package/dist/sql.d.cts +109 -5
  20. package/dist/sql.d.ts +109 -5
  21. package/dist/sql.js +7947 -7922
  22. package/dist/style-CFZ-HE2s.cjs +3 -0
  23. package/dist/{style-6ihHKVCM.js → style-DnmtG7Gl.js} +69 -81
  24. package/dist/style.css +1 -1
  25. package/dist/vue/async.d.cts +769 -335
  26. package/dist/vue/async.d.ts +769 -335
  27. package/dist/vue/index.d.cts +1321 -14
  28. package/dist/vue/index.d.ts +1321 -14
  29. package/dist/vue-async.cjs +1 -1
  30. package/dist/vue-async.js +11 -12
  31. package/dist/vue.cjs +1 -1
  32. package/dist/vue.js +130 -50
  33. package/dist/xlsx.cjs +20 -20
  34. package/dist/xlsx.d.cts +2292 -5
  35. package/dist/xlsx.d.ts +2292 -5
  36. package/dist/xlsx.js +5452 -5443
  37. package/package.json +7 -13
  38. package/dist/ReportPreview-CJLvkTVn.cjs +0 -6
  39. package/dist/ReportPreview-mZiGtf0L.js +0 -1231
  40. package/dist/builder/template-builder.d.ts +0 -69
  41. package/dist/compat/jh4j-template.d.ts +0 -12
  42. package/dist/defaults.d.ts +0 -27
  43. package/dist/format.d.ts +0 -48
  44. package/dist/layout/paginate.d.ts +0 -97
  45. package/dist/layout/textwrap.d.ts +0 -36
  46. package/dist/manager/api.d.ts +0 -45
  47. package/dist/manager/index.d.ts +0 -2
  48. package/dist/manager/types.d.ts +0 -50
  49. package/dist/manager.cjs +0 -1
  50. package/dist/manager.d.cts +0 -5
  51. package/dist/manager.d.ts +0 -5
  52. package/dist/manager.js +0 -104
  53. package/dist/pdf/font-loader.d.ts +0 -6
  54. package/dist/pdf/index.d.ts +0 -2
  55. package/dist/pdf/render-pdf.d.ts +0 -25
  56. package/dist/plugin-C4qpbdMJ.cjs +0 -1
  57. package/dist/plugin-DcmAPK_K.js +0 -85
  58. package/dist/render/canvas.d.ts +0 -76
  59. package/dist/render/dom.d.ts +0 -10
  60. package/dist/render/grid-geometry.d.ts +0 -41
  61. package/dist/render/style.d.ts +0 -33
  62. package/dist/render/window.d.ts +0 -23
  63. package/dist/schema/render-plan.d.ts +0 -96
  64. package/dist/schema/validate.d.ts +0 -15
  65. package/dist/sql/ast-check.d.ts +0 -14
  66. package/dist/sql/compile.d.ts +0 -31
  67. package/dist/sql/expr.d.ts +0 -21
  68. package/dist/sql/index.d.ts +0 -4
  69. package/dist/sql/tokenizer.d.ts +0 -25
  70. package/dist/style-Xq08-IsV.cjs +0 -3
  71. package/dist/units.d.ts +0 -11
  72. package/dist/vue/ReportParamPanel.d.ts +0 -19
  73. package/dist/vue/ReportPreview.d.ts +0 -209
  74. package/dist/vue/ReportToolbar.d.ts +0 -42
  75. package/dist/vue/adapters.d.ts +0 -40
  76. package/dist/vue/composables/useHighlight.d.ts +0 -8
  77. package/dist/vue/composables/usePageWindow.d.ts +0 -25
  78. package/dist/vue/composables/usePrintExport.d.ts +0 -40
  79. package/dist/vue/composables/useReportSearch.d.ts +0 -73
  80. package/dist/vue/composables/useZoom.d.ts +0 -15
  81. package/dist/vue/config.d.ts +0 -108
  82. package/dist/vue/controller.d.ts +0 -29
  83. package/dist/vue/errors.d.ts +0 -16
  84. package/dist/vue/injection-keys.d.ts +0 -14
  85. package/dist/vue/local-adapter.d.ts +0 -12
  86. package/dist/vue/pdf-exporter.d.ts +0 -13
  87. package/dist/vue/plugin.d.ts +0 -354
  88. package/dist/xlsx/render-xlsx.d.ts +0 -20
package/dist/index.d.ts CHANGED
@@ -1,14 +1,738 @@
1
- export * from './defaults';
2
- export * from './format';
3
- export * from './units';
4
- export * from './schema/render-plan';
5
- export * from './schema/validate';
6
- export * from './layout/textwrap';
7
- export * from './layout/paginate';
8
- export * from './render/grid-geometry';
9
- export * from './render/style';
10
- export * from './render/dom';
11
- export * from './render/canvas';
12
- export * from './render/window';
13
- export * from './compat/jh4j-template';
14
- export * from './builder/template-builder';
1
+ export declare function assertRenderPlan(input: unknown): PlanPage[];
2
+
3
+ /** 盒子边框语义:四边开关 + 内部网格线(四边全关则内线不画) */
4
+ export declare interface BoxBorders {
5
+ top: boolean;
6
+ right: boolean;
7
+ bottom: boolean;
8
+ left: boolean;
9
+ /** 网格内线(仅当任意外边开启) */
10
+ inner: boolean;
11
+ }
12
+
13
+ export declare interface CanvasPager {
14
+ /** 挂载到滚动容器(viewport,overflow:auto),接管其内容 */
15
+ attach(viewport: HTMLElement): void;
16
+ destroy(): void;
17
+ /** 当前实际渲染的页区间 */
18
+ window(): {
19
+ start: number;
20
+ end: number;
21
+ };
22
+ }
23
+
24
+ export declare interface CanvasPagerOptions extends CanvasRenderOptions {
25
+ /** 预渲染页数缓冲(窗口两侧各加 N 页),默认 1 */
26
+ overscan?: number;
27
+ /** 页间距 px,默认 18 */
28
+ gapPx?: number;
29
+ /** 每帧渲染页数上限(分帧,防长任务),默认 1 */
30
+ pagesPerFrame?: number;
31
+ }
32
+
33
+ export declare interface CanvasRenderOptions {
34
+ /** 设备像素比,默认取运行环境 devicePixelRatio */
35
+ dpr?: number;
36
+ dpi?: number;
37
+ /** 文本默认字体族 */
38
+ fontFamily?: string;
39
+ /** 文本测量器(默认启发式) */
40
+ measurer?: TextMeasurer;
41
+ /** 只渲染页区间(闭区间索引;缺省全渲染——仅小报表使用,大报表请用 createCanvasPager) */
42
+ start?: number;
43
+ end?: number;
44
+ }
45
+
46
+ export declare interface CanvasRenderResult {
47
+ canvases: HTMLCanvasElement[];
48
+ }
49
+
50
+ export declare function charWidthEm(ch: string): number;
51
+
52
+ export declare type ClassKey = "root" | "page" | "comp" | "text" | "lines" | "line" | "rich" | "paragraph" | "segment" | "image" | "shape" | "grid" | "row" | "cell" | "unknown";
53
+
54
+ export declare function classOf(key: ClassKey, options?: RenderOptions): string;
55
+
56
+ /**
57
+ * 列值格式化(声明式、JSON 可序列化)。
58
+ * 在 paginate 的 cellText 出口统一消费:格式化发生在进 RenderPlan 之前,
59
+ * 三后端(DOM/Canvas/PDF)零改动。
60
+ *
61
+ * 语义约定(v0.9 固化):
62
+ * - number.digits 显式给出 → 精确保留(12.5 + digits:2 → "12.50")
63
+ * - number.thousands 默认 false(千分位显式开启)
64
+ * - date 字符串按"本地时区的日历日"解析(YYYY-MM-DD / YYYY/MM/DD 直取年月日,
65
+ * 不经 Date 字符串构造——后者按 UTC 零点,负时区环境会少一天)
66
+ */
67
+ export declare type ColumnFormat = {
68
+ kind: "number";
69
+ thousands?: boolean;
70
+ digits?: number;
71
+ } | {
72
+ kind: "percent";
73
+ digits?: number;
74
+ } | {
75
+ kind: "date";
76
+ pattern?: string;
77
+ };
78
+
79
+ export declare type ComponentKind = "text" | "image" | "barcode" | "qrcode" | "chart" | "line" | "rect" | "ellipse";
80
+
81
+ export declare interface ComponentStyle {
82
+ fontSizePx?: number;
83
+ fontSize?: number;
84
+ fontFamily?: string;
85
+ bold?: boolean;
86
+ italic?: boolean;
87
+ underline?: boolean;
88
+ color?: string;
89
+ backgroundColor?: string;
90
+ align?: "left" | "center" | "right" | "justify";
91
+ verticalAlign?: "top" | "middle" | "bottom";
92
+ lineColor?: string;
93
+ borderColor?: string;
94
+ lineWidthPt?: number;
95
+ borderTop?: boolean;
96
+ borderRight?: boolean;
97
+ borderBottom?: boolean;
98
+ borderLeft?: boolean;
99
+ lineHeight?: number;
100
+ letterSpacing?: number;
101
+ opacity?: number;
102
+ rotateDeg?: number;
103
+ }
104
+
105
+ /**
106
+ * 页级视口虚拟化:给定每页高度与滚动位置,返回需要真实渲染的页区间
107
+ * 与上下占位高度。start/end 为闭区间索引。
108
+ *
109
+ * 布局模型:每页占据 height + gap(gap 为页间距,默认 0),
110
+ * padTop/padBottom 同口径累计,保证 占位+渲染页+间距 还原总滚动高度。
111
+ * 内部用前缀和 + 二分定位覆盖页与可见终点。
112
+ */
113
+ export declare function computePageWindow(input: PageWindowInput): PageWindow;
114
+
115
+ /**
116
+ * 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
117
+ * 无 2D 环境时自动回退启发式(Node/SSR 安全)。
118
+ */
119
+ export declare function createCanvasMeasurer(getCtx2d: () => CanvasRenderingContext2D | null): TextMeasurer;
120
+
121
+ /**
122
+ * Canvas 虚拟化分页器(大报表专用):
123
+ * - 视口窗口化:只绘制窗口内页(computePageWindow 与 DOM 后端共用)
124
+ * - 画布池:固定数量 canvas 复用重绘,滚动零新增位图
125
+ * - 分帧:每帧最多 pagesPerFrame 页,滚动期间不产生长任务
126
+ *
127
+ * 内存从 O(总页数) 降到 O(窗口+2×overscan)。
128
+ */
129
+ export declare function createCanvasPager(plan: RenderPlan, options?: CanvasPagerOptions): CanvasPager;
130
+
131
+ /** 兼容旧 API:默认启发式测量 */
132
+ export declare function createHeuristicMeasurer(): TextMeasurer;
133
+
134
+ /**
135
+ * 框架无关的报表数据源:注册一次模板与取数,包内完成分页、校验、按 ID 顺序合并。
136
+ * 不缓存业务结果、不推断接口包装、不自动重试;鉴权与完整数据范围由宿主决定。
137
+ */
138
+ export declare function createReportSource(reports: ReportRegistry, options?: {
139
+ onWarning?: (message: string) => void;
140
+ }): ReportSource;
141
+
142
+ /**
143
+ * 创建一页标准明细模板;分页与格式化继续由 paginateTemplate 处理。
144
+ * 固定列保持毫米宽度,自动列共享余量;全部固定列时表格宽度为列宽之和。
145
+ */
146
+ export declare function createTableTemplate(options: TableTemplateOptions): ReportTemplate;
147
+
148
+ export declare function createTemplate(): TemplateBuilder;
149
+
150
+ export declare const CSS_DPI = 96;
151
+
152
+ export declare type DatasetRows = Record<string, Record<string, unknown>[]>;
153
+
154
+ /** 默认边框线宽(pt) */
155
+ export declare const DEFAULT_BORDER_PT = 0.75;
156
+
157
+ /** 默认字号(pt) */
158
+ export declare const DEFAULT_FONT_PT = 10.5;
159
+
160
+ /** 默认描边色 */
161
+ export declare const DEFAULT_STROKE_COLOR = "#333333";
162
+
163
+ /** 默认文本色 */
164
+ export declare const DEFAULT_TEXT_COLOR = "#000000";
165
+
166
+ /** 类型推导业务接口的响应,包内完成字段映射后交给同一分页流程。 */
167
+ export declare function defineReport<TData>(definition: ReportDefinitionOptions<TData>): ReportDefinition;
168
+
169
+ export declare function defineReport(definition: ReportDefinition): ReportDefinition;
170
+
171
+ /**
172
+ * 规则求值语义:
173
+ * - 空值(null/undefined/"")永不命中(避免 Number("")===0 把空当 0 的隐式陷阱)
174
+ * - 数值比较:两侧均可数值化才比较;否则退化为字符串比较
175
+ */
176
+ export declare function evalStyleRule(row: Record<string, unknown>, when: StyleRule["when"]): boolean;
177
+
178
+ /**
179
+ * 应用格式化。非数值/无法解析时原样返回基础文本(降级不报错):
180
+ * - number:digits 小数位 + 可选千分位(12,345.60;thousands 默认 false)
181
+ * - percent:×100 + % 后缀(digits 默认 2)
182
+ * - date:Date/日历日字符串 → pattern(默认 YYYY-MM-DD);不可解析原样返回
183
+ */
184
+ export declare function formatValue(value: unknown, format?: ColumnFormat): string;
185
+
186
+ declare type Geometry = Partial<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>;
187
+
188
+ export declare interface GridCell {
189
+ text?: string;
190
+ rawText?: string;
191
+ children?: PlanComponent[];
192
+ colSpan?: number;
193
+ rowSpan?: number;
194
+ style?: ComponentStyle;
195
+ }
196
+
197
+ export declare interface GridCellBox {
198
+ ri: number;
199
+ ci: number;
200
+ cell: GridCell;
201
+ /** 相对组件左上角(mm,顶点原点) */
202
+ xMm: number;
203
+ yMm: number;
204
+ widthMm: number;
205
+ heightMm: number;
206
+ }
207
+
208
+ /** 网格线段:kind="h" 为水平线(pos=y,from/to=x 区间);"v" 为垂直线(pos=x,from/to=y 区间) */
209
+ export declare interface GridEdge {
210
+ kind: "h" | "v";
211
+ pos: number;
212
+ from: number;
213
+ to: number;
214
+ }
215
+
216
+ export declare interface GridLayout {
217
+ columns: {
218
+ pos: number;
219
+ size: number;
220
+ }[];
221
+ rows: {
222
+ pos: number;
223
+ size: number;
224
+ }[];
225
+ cells: GridCellBox[];
226
+ /** 内部网格线段(不含外框;已跳过被 colSpan/rowSpan 跨越的边界,相邻段已合并) */
227
+ edges: GridEdge[];
228
+ }
229
+
230
+ /** 启发式测量器:无 Canvas 时的默认宽度估算 */
231
+ export declare const heuristicMeasurer: TextMeasurer;
232
+
233
+ export declare interface ImageRenderOptions extends CanvasRenderOptions {
234
+ /** 图片格式(默认 png;jpeg 体积更小但无透明) */
235
+ format?: "png" | "jpeg";
236
+ /** jpeg 质量 0-1(默认 0.92,仅 jpeg 生效) */
237
+ quality?: number;
238
+ }
239
+
240
+ export declare interface ImageRenderResult {
241
+ blobs: Blob[];
242
+ }
243
+
244
+ export declare function isImageBackedComponent(comp: PlanComponent): boolean;
245
+
246
+ export declare function isRichText(comp: PlanComponent): boolean;
247
+
248
+ /** 默认行高倍数(基线距 = 字号 × 该系数) */
249
+ export declare const LINE_HEIGHT = 1.35;
250
+
251
+ export declare interface ListColumn {
252
+ header: string;
253
+ field: string;
254
+ widthMm: number;
255
+ style?: ComponentStyle;
256
+ /** 值格式化(声明式):千分位/小数位、百分比、日期 pattern */
257
+ format?: ColumnFormat;
258
+ /** 条件格式规则(声明式,命中合并进单元格样式;如负数红字) */
259
+ rules?: StyleRule[];
260
+ }
261
+
262
+ export declare interface ListComponent {
263
+ kind: "list";
264
+ id?: string;
265
+ leftMm: number;
266
+ topMm: number;
267
+ widthMm: number;
268
+ dataset: string;
269
+ columns: ListColumn[];
270
+ fontSizePt?: number;
271
+ headerBold?: boolean;
272
+ rowHeightMm?: number;
273
+ paddingMm?: number;
274
+ headerEveryPage?: boolean;
275
+ headerBackgroundColor?: string;
276
+ border?: boolean;
277
+ /** 分组小计(组头/组尾小计/组头防孤行) */
278
+ groupBy?: ListGroupBy;
279
+ /** 末尾总合计行(依赖 groupBy.subtotal 或显式 fields) */
280
+ grandTotal?: ListGrandTotal;
281
+ }
282
+
283
+ export declare type ListGrandTotal = boolean | {
284
+ label?: string;
285
+ style?: ComponentStyle;
286
+ /** 合计列(缺省沿用 groupBy.subtotal) */
287
+ fields?: string[];
288
+ };
289
+
290
+ /** 分组小计配置(声明式,见 ListComponent.groupBy) */
291
+ export declare interface ListGroupBy {
292
+ /** 分组字段(值变化即切组) */
293
+ field: string;
294
+ /** 组头文案模板,{value} 占位(默认 "{value}") */
295
+ headerTemplate?: string;
296
+ headerStyle?: ComponentStyle;
297
+ /** 需要小计的列字段(组尾输出合计行;数值列求和,其余输出首值/留空) */
298
+ subtotal?: string[];
299
+ subtotalStyle?: ComponentStyle;
300
+ subtotalLabel?: string;
301
+ /** 组头防孤行(默认 true:页尾放不下"组头+首行"时整体换页) */
302
+ keepWithNext?: boolean;
303
+ }
304
+
305
+ export declare function measurePageSizePx(page: Pick<PlanPage, "pageWidthMm" | "pageHeightMm">, dpi?: number): {
306
+ widthPx: number;
307
+ heightPx: number;
308
+ };
309
+
310
+ export declare function measureTextMm(text: string, options: TextMeasureOptions): number;
311
+
312
+ export declare const MM_PER_INCH = 25.4;
313
+
314
+ export declare function mmToPx(value: number, dpi?: number): number;
315
+
316
+ export declare function mmToPxFactor(dpi?: number): number;
317
+
318
+ export declare class PageBuilder {
319
+ private readonly parent;
320
+ private readonly page;
321
+ private components;
322
+ constructor(parent: TemplateBuilder, page: Omit<TemplatePage, "components">);
323
+ text(content: string, geometry?: Geometry, style?: ComponentStyle): this;
324
+ list(dataset: string, geometry: Partial<Pick<ListComponent, "leftMm" | "topMm" | "widthMm">>, columns: ListColumn[], options?: Partial<Omit<ListComponent, "kind" | "leftMm" | "topMm" | "widthMm" | "dataset" | "columns">>): this;
325
+ rect(geometry: Required<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>, style?: ComponentStyle): this;
326
+ line(leftMm: number, topMm: number, widthMm: number, style?: ComponentStyle): this;
327
+ barcode(content: string, geometry: Required<Geometry>): this;
328
+ qrcode(content: string, sizeMm: number, leftMm: number, topMm: number): this;
329
+ buildPage(): TemplatePage;
330
+ done(): TemplateBuilder;
331
+ build(): ReportTemplate;
332
+ }
333
+
334
+ declare type PageMargins = Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
335
+
336
+ export declare interface PageOptions {
337
+ /** 横向(宽高互换) */
338
+ landscape?: boolean;
339
+ margins?: Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
340
+ }
341
+
342
+ export declare interface PageWindow {
343
+ start: number;
344
+ end: number;
345
+ padTopPx: number;
346
+ padBottomPx: number;
347
+ }
348
+
349
+ export declare interface PageWindowInput {
350
+ pageHeightsPx: number[];
351
+ viewportHeightPx: number;
352
+ scrollTopPx: number;
353
+ overscan?: number;
354
+ /** 页间距(px)。占位高度按“每页高度+间距”累计,与 margin-bottom 布局一致;默认 0 */
355
+ gapPx?: number;
356
+ }
357
+
358
+ export declare interface PaginateOptions {
359
+ /** 每行额外占高(mm),压测专用钩子 */
360
+ mmPerRow?: number;
361
+ /** 文本测量器(默认启发式;浏览器端可注入 canvas 测量校准) */
362
+ measurer?: TextMeasurer;
363
+ }
364
+
365
+ export declare interface PaginateResult {
366
+ plan: RenderPlan;
367
+ warnings: string[];
368
+ }
369
+
370
+ export declare function paginateTemplate(template: ReportTemplate, datasets: DatasetRows, optionsOrMmPerRow?: number | PaginateOptions): PaginateResult;
371
+
372
+ export declare const PAPER_SIZES: Record<string, {
373
+ widthMm: number;
374
+ heightMm: number;
375
+ }>;
376
+
377
+ /** 纸张预设名(对齐 PAPER_SIZES 表) */
378
+ export declare type PaperName = keyof typeof PAPER_SIZES;
379
+
380
+ /** 日历日字符串 → 本地 Date(不含时间的纯日期,杜绝 UTC 偏移) */
381
+ export declare function parseDateLocal(input: string): Date | null;
382
+
383
+ export declare interface PlanComponent {
384
+ kind: ComponentKind;
385
+ leftMm: number;
386
+ topMm: number;
387
+ widthMm: number;
388
+ heightMm: number;
389
+ nid?: string;
390
+ rkey?: string;
391
+ text?: string;
392
+ rawText?: string;
393
+ lines?: string[];
394
+ richParagraphs?: RichParagraph[];
395
+ imageData?: string;
396
+ grid?: PlanGrid;
397
+ style?: ComponentStyle;
398
+ meta?: Record<string, unknown>;
399
+ /** MachReport 扩展字段:未知 kind 的兜底渲染标记 */
400
+ fallbackText?: string;
401
+ }
402
+
403
+ /** pt→px 换算(与 DOM 后端 units.ptToPx 同一真相源),供单测直接断言 */
404
+ export declare function planFontSizePx(style: {
405
+ fontSizePx?: number;
406
+ fontSize?: number;
407
+ } | undefined, dpi?: number): number;
408
+
409
+ export declare interface PlanGrid {
410
+ /** 行内允许 null 空位;渲染器按空单元格处理 */
411
+ cells: (GridCell | null)[][];
412
+ colWidthsMm?: number[];
413
+ rowHeightsMm?: number[];
414
+ gapMm?: number;
415
+ }
416
+
417
+ export declare interface PlanPage {
418
+ pageWidthMm: number;
419
+ pageHeightMm: number;
420
+ marginTopMm?: number;
421
+ marginBottomMm?: number;
422
+ marginLeftMm?: number;
423
+ marginRightMm?: number;
424
+ components: PlanComponent[];
425
+ }
426
+
427
+ export declare function ptToPx(pt: number, dpi?: number): number;
428
+
429
+ export declare function pxToMm(value: number, dpi?: number): number;
430
+
431
+ export declare const RENDER_PLAN_SCHEMA_VERSION = "1.0.0-mach";
432
+
433
+ export declare function renderComponent(comp: PlanComponent, dpi: number, options: RenderOptions, doc: Document): HTMLElement;
434
+
435
+ export declare interface RenderOptions {
436
+ dpi?: number;
437
+ classNames?: Partial<Record<ClassKey, string>>;
438
+ }
439
+
440
+ export declare function renderPage(page: PlanPage, dpi: number, options: RenderOptions, doc: Document): HTMLElement;
441
+
442
+ export declare interface RenderPlan {
443
+ schemaVersion: string;
444
+ pages: PlanPage[];
445
+ }
446
+
447
+ export declare function renderPlan(plan: RenderPlan, doc: Document, options?: RenderOptions): HTMLElement;
448
+
449
+ /**
450
+ * RenderPlan → Canvas 位图页(顶点原点坐标系,与 DOM/PDF 一致)。
451
+ *
452
+ * ⚠️ 内存模型:A4 @dpr2 ≈ 14MB/页,全量渲染 100 页 ≈ 1.4GB。
453
+ * 大报表必须使用 createCanvasPager(窗口化 + 画布池 + 分帧渲染),
454
+ * 本函数适合页数少或已指定 start/end 区间的场景。
455
+ */
456
+ export declare function renderPlanToCanvas(plan: RenderPlan, options?: CanvasRenderOptions): CanvasRenderResult;
457
+
458
+ /**
459
+ * RenderPlan → 每页一张图片 Blob(浏览器环境):
460
+ * 复用位图渲染管线(区间/dpr/字体/测量器均可配),再 toBlob 编码。
461
+ * 大报表建议配合 start/end 分批导出,避免一次性占用过多内存。
462
+ */
463
+ export declare function renderPlanToImages(plan: RenderPlan, options?: ImageRenderOptions): Promise<ImageRenderResult>;
464
+
465
+ export declare interface ReportDefinition {
466
+ template: ReportTemplate;
467
+ /** 静态数据;load 存在时优先使用 load 的结果。 */
468
+ datasets?: DatasetRows;
469
+ load?: (context: ReportLoadContext) => DatasetRows | Promise<DatasetRows>;
470
+ /** 覆盖模板参数定义,未提供时自动使用 template.params。 */
471
+ params?: ReportParamDef[];
472
+ pagination?: PaginateOptions;
473
+ }
474
+
475
+ export declare interface ReportDefinitionOptions<TData> extends Omit<ReportDefinition, "load" | "datasets"> {
476
+ load: (context: ReportLoadContext) => TData | Promise<TData>;
477
+ mapData: (data: TData, context: ReportLoadContext) => DatasetRows;
478
+ }
479
+
480
+ /** 保持 Promise<RenderPlan> 契约;元数据为可选,旧业务 fetcher 无需改造。 */
481
+ export declare interface ReportFetcher {
482
+ (input: ReportFetchInput): Promise<RenderPlan>;
483
+ getParamDefs?: (reportIds: string[]) => ReportParamDef[];
484
+ }
485
+
486
+ export declare interface ReportFetchInput {
487
+ reportIds: string[];
488
+ params: Record<string, string>;
489
+ signal?: AbortSignal;
490
+ /** 本次分页与计划告警;未提供时使用数据源配置的告警通道。 */
491
+ onWarning?: (message: string) => void;
492
+ }
493
+
494
+ /** 取数与排版共同使用的请求上下文;取消只影响本次调用。 */
495
+ export declare interface ReportLoadContext {
496
+ reportId: string;
497
+ params: Record<string, string>;
498
+ signal?: AbortSignal;
499
+ }
500
+
501
+ /** 报表参数定义(声明式,模板自描述参数面:渲染组件据此生成查询面板) */
502
+ export declare interface ReportParamDef {
503
+ /** 参数名(传入 params,与数据集 SQL #{field} 绑定对应) */
504
+ field: string;
505
+ /** 显示名(缺省用 field) */
506
+ label?: string;
507
+ type?: "text" | "number" | "date" | "select";
508
+ /** select 选项 */
509
+ options?: Array<{
510
+ label: string;
511
+ value: string;
512
+ }>;
513
+ defaultValue?: string;
514
+ required?: boolean;
515
+ placeholder?: string;
516
+ }
517
+
518
+ export declare type ReportRegistry = Record<string, ReportDefinition>;
519
+
520
+ export declare interface ReportSource extends ReportFetcher {
521
+ getParamDefs(reportIds: string[]): ReportParamDef[];
522
+ }
523
+
524
+ export declare class ReportSourceError extends Error {
525
+ readonly code: "config" | "fetch" | "validate";
526
+ readonly cause?: unknown;
527
+ constructor(code: ReportSourceError["code"], message: string, cause?: unknown);
528
+ }
529
+
530
+ export declare interface ReportTemplate {
531
+ schemaVersion?: string;
532
+ /** 参数定义(可选;宿主也可经 ReportPreview 的 paramDefs prop 提供,prop 优先) */
533
+ params?: ReportParamDef[];
534
+ pages: TemplatePage[];
535
+ }
536
+
537
+ /**
538
+ * 边框开关解析:
539
+ * - 未声明(undefined)→ 四边全开(与既有 rect 总有边框的行为兼容)
540
+ * - 显式 false → 对应边关闭
541
+ * - 四边全关(如 list border:false)→ 内线也不画
542
+ */
543
+ export declare function resolveBoxBorders(style: Pick<ComponentStyle, "borderTop" | "borderRight" | "borderBottom" | "borderLeft"> | undefined): BoxBorders;
544
+
545
+ /** 解析后的字号(px 值已按 dpi 换算;pt 值供 PDF 使用) */
546
+ export declare interface ResolvedFontSize {
547
+ fontSizePt: number;
548
+ fontSizePx: number;
549
+ }
550
+
551
+ /** 字号解析:fontSizePx 直通;否则 pt→px(与 units.ptToPx 同源) */
552
+ export declare function resolveFontSize(style: Pick<ComponentStyle, "fontSizePx" | "fontSize"> | undefined, dpi?: number, defaultPt?: number): ResolvedFontSize;
553
+
554
+ /**
555
+ * 网格几何统一解析(DOM/Canvas/PDF 三后端共用,单位真相源):
556
+ * - 列宽:优先 colWidthsMm(等比缩放至组件宽),否则按列数均分
557
+ * - 行高:优先 rowHeightsMm(等比缩放至组件高),否则按行数均分
558
+ * - colSpan/rowSpan:占位矩阵展开,跨度取起止行列差;越界收敛到网格内
559
+ * - 行内 null/undefined 单元格视为占 1 列的空单元格(与 DOM 表格行为一致)
560
+ * - edges:内部网格线段,跳过被 span 跨越的边界(合并单元格中间无线)
561
+ * 产出为组件左上角顶点原点的 mm 坐标,各后端自行换算 px/pt。
562
+ */
563
+ export declare function resolveGridLayout(grid: PlanGrid, compWidthMm: number, compHeightMm: number): GridLayout;
564
+
565
+ /** 行高解析(倍数,基线距 = 字号 × lineHeight) */
566
+ export declare function resolveLineHeight(style: Pick<ComponentStyle, "lineHeight"> | undefined): number;
567
+
568
+ /** 解析纸张参数:数字按宽高使用;字符串查 PAPER_SIZES 预设;缺省 A4 纵向 */
569
+ export declare function resolvePaper(paper: PaperName | {
570
+ widthMm: number;
571
+ heightMm: number;
572
+ } | number, heightArg?: number, landscape?: boolean): {
573
+ widthMm: number;
574
+ heightMm: number;
575
+ };
576
+
577
+ /** 描边解析:颜色 + 线宽(pt) */
578
+ export declare function resolveStroke(style: Pick<ComponentStyle, "borderColor" | "lineColor" | "lineWidthPt"> | undefined, fallbackColor?: string): {
579
+ color: string;
580
+ widthPt: number;
581
+ };
582
+
583
+ /** 文本颜色解析 */
584
+ export declare function resolveTextColor(style: Pick<ComponentStyle, "color"> | undefined, fallback?: string): string;
585
+
586
+ export declare interface RichParagraph {
587
+ segments: RichSegment[];
588
+ align?: ComponentStyle["align"];
589
+ lineHeight?: number;
590
+ spaceBeforeMm?: number;
591
+ spaceAfterMm?: number;
592
+ indentMm?: number;
593
+ }
594
+
595
+ export declare interface RichSegment {
596
+ kind?: "text" | "field";
597
+ text?: string;
598
+ field?: string;
599
+ style?: ComponentStyle;
600
+ }
601
+
602
+ export declare function round(value: number, digits: number): number;
603
+
604
+ /** RenderPlan 正式 schema 版本(core 分页引擎产出) */
605
+ export declare const SCHEMA_VERSION_MACH = "1.0.0-mach";
606
+
607
+ /** 条件格式规则求值(声明式,见 ListColumn.rules) */
608
+ export declare interface StyleRule {
609
+ when: {
610
+ field: string;
611
+ op: ">" | ">=" | "<" | "<=" | "==" | "!=";
612
+ value: number | string;
613
+ };
614
+ /** 命中时合并进单元格样式(color/bold/backgroundColor 等) */
615
+ style: Record<string, unknown>;
616
+ }
617
+
618
+ /** 标准明细列:显式 widthMm 优先;其余列按 flex 分配剩余可用宽度。 */
619
+ export declare type TableTemplateColumn = Omit<ListColumn, "widthMm"> & {
620
+ widthMm?: number;
621
+ /** 自动列的宽度权重,默认 1(有 widthMm 时不参与分配)。 */
622
+ flex?: number;
623
+ };
624
+
625
+ export declare type TableTemplateListOptions = Partial<Omit<ListComponent, "kind" | "leftMm" | "topMm" | "widthMm" | "dataset" | "columns">>;
626
+
627
+ export declare interface TableTemplateOptions extends PageOptions {
628
+ title?: string;
629
+ /** 标题占高,默认 10mm;没有标题时不占空间。 */
630
+ titleHeightMm?: number;
631
+ /** 标题与表格间距,默认 4mm。 */
632
+ titleGapMm?: number;
633
+ titleStyle?: ComponentStyle;
634
+ dataset?: string;
635
+ columns: readonly TableTemplateColumn[];
636
+ /** 默认 A4;页边距各默认 10mm。 */
637
+ paper?: PaperName | {
638
+ widthMm: number;
639
+ heightMm: number;
640
+ };
641
+ params?: ReportTemplate["params"];
642
+ /** 沿用列表的字号、行高、重复表头、分组、小计与总计配置。 */
643
+ listOptions?: TableTemplateListOptions;
644
+ }
645
+
646
+ export declare class TemplateBuilder {
647
+ readonly pages: TemplatePage[];
648
+ private pending;
649
+ private templateParams;
650
+ /**
651
+ * 声明报表参数(链式,可放在 .page() 前后任意位置):
652
+ * 渲染组件据此自动生成查询面板(也可由 paramDefs prop 提供,prop 优先)。
653
+ *
654
+ * ```ts
655
+ * createTemplate()
656
+ * .params([
657
+ * { field: "whCode", label: "仓库", type: "select", options: [...], required: true },
658
+ * { field: "date", label: "日期", type: "date", defaultValue: "2026-09-30" }
659
+ * ])
660
+ * .page("a4").text(...).list(...)
661
+ * .build();
662
+ * ```
663
+ */
664
+ params(defs: NonNullable<ReportTemplate["params"]>): this;
665
+ /**
666
+ * 新建页。纸张支持三种写法:
667
+ * - 预设名:.page("a4", { landscape: true, margins: {...} })
668
+ * - 数字:.page(210, 297)(第三参数兼容旧 margins 对象或新 options)
669
+ * - 对象:.page({ widthMm: 210, heightMm: 297 })
670
+ */
671
+ page(paper?: PaperName | {
672
+ widthMm: number;
673
+ heightMm: number;
674
+ } | number, optionsOrHeight?: number | PageOptions, maybeOptions?: PageOptions | PageMargins): PageBuilder;
675
+ collect(): void;
676
+ build(): ReportTemplate;
677
+ }
678
+
679
+ export declare type TemplateComponent = PlanComponent | ListComponent;
680
+
681
+ export declare interface TemplatePage {
682
+ widthMm: number;
683
+ heightMm: number;
684
+ marginTopMm?: number;
685
+ marginBottomMm?: number;
686
+ marginLeftMm?: number;
687
+ marginRightMm?: number;
688
+ components: TemplateComponent[];
689
+ }
690
+
691
+ /**
692
+ * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
693
+ *
694
+ * 测量模型可注入(TextMeasurer):
695
+ * - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
696
+ * - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
697
+ */
698
+ export declare interface TextMeasureOptions {
699
+ fontSizePt: number;
700
+ bold?: boolean;
701
+ letterSpacingPt?: number;
702
+ }
703
+
704
+ /** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
705
+ export declare interface TextMeasurer {
706
+ measureMm(text: string, options: TextMeasureOptions): number;
707
+ }
708
+
709
+ export declare function toNumber(value: unknown): number | null;
710
+
711
+ export declare function validateComponent(comp: unknown, path: string, errors: ValidationError[], warnings?: ValidationError[]): void;
712
+
713
+ export declare function validatePage(page: unknown, path: string, errors: ValidationError[], warnings?: ValidationError[]): void;
714
+
715
+ export declare function validateRenderPlan(input: unknown): ValidationResult;
716
+
717
+ export declare interface ValidationError {
718
+ path: string;
719
+ message: string;
720
+ }
721
+
722
+ export declare interface ValidationResult {
723
+ ok: boolean;
724
+ errors: ValidationError[];
725
+ warnings: ValidationError[];
726
+ }
727
+
728
+ /**
729
+ * 文本折行:
730
+ * - CJK 字符任意位置可断(与既有行为一致)
731
+ * - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
732
+ * 单词本身超宽时按字符硬拆(兜底,不无限溢出)
733
+ * - 换行符强制断行;行首不保留折行产生的空格
734
+ * - 可注入 TextMeasurer(默认启发式)
735
+ */
736
+ export declare function wrapText(text: string, maxWidthMm: number, options: TextMeasureOptions, measurer?: TextMeasurer): string[];
737
+
738
+ export { }