Public entry point — the user never needs to touch RenderEngine/createBlock directly
createKapomReport({ columns, data, ... }).save('report.pdf') — zero-config layer 1;
column shorthand ({ key, header } without type) + group shorthand (a string key) + full
style/typography/font for layers 2/3, all converted through resolveReportConfig() into the same ReportNode tree;
the { blocks: [...] } variant is full layer 3 — pass a ReportNode tree directly
(multi-section/composite is possible) without ever touching jsPDF/RenderEngine/finalize yourself;
config.document (orientation/format/unit etc.) is passed straight into new jsPDF(options) —
omit it for jsPDF's own default (a4/portrait/mm);
universal: this file has no static node: import — it can be bundled for the browser (Node
I/O lives in node-io.ts, loaded via process.getBuiltinModule only when actually running on Node)
Public entry point — the user never needs to touch RenderEngine/createBlock directly
createKapomReport({ columns, data, ... }).save('report.pdf')— zero-config layer 1; column shorthand ({ key, header } withouttype) + group shorthand (a string key) + full style/typography/font for layers 2/3, all converted through resolveReportConfig() into the same ReportNode tree; the{ blocks: [...] }variant is full layer 3 — pass a ReportNode tree directly (multi-section/composite is possible) without ever touching jsPDF/RenderEngine/finalize yourself; config.document (orientation/format/unit etc.) is passed straight intonew jsPDF(options)— omit it for jsPDF's own default (a4/portrait/mm); universal: this file has no staticnode:import — it can be bundled for the browser (Node I/O lives in node-io.ts, loaded via process.getBuiltinModule only when actually running on Node)