Optionalfontalways registered before the first block renders (VFS timing) — also becomes the doc's default font
OptionalmarginsOptionalnumericOptionalpagepage footer repeated on every page — reserves space at the bottom; drawn at finalize()
Optionalpagepage header repeated on every page — reserves space at the top (subtracted from the content area); drawn at finalize(). A raw render callback (PageBand) or a resolved block tree (BlockBand)
Optionalpagea lightweight page-number annotation drawn inside the existing page margin — unlike
pageHeader/pageFooter, this never reserves content-area space; true for the default
(bottom-left, '{pageNumber} / {totalPages}'), a position string shorthand, or a full object
Optionalthemeready-made colour scheme (preset name or a Theme object) — drives every table fill; omit = the default blue/grey look
Optionaltypographyfont token per row-type (columnHeader/detailRow/groupHeader/...) — merges over DEFAULT_TYPOGRAPHY one token at a time
Optionalwatermarkwatermark repeated on every page — doesn't reserve content-area space (unlike page header/footer); drawn at finalize() before the bands
accepts a preset { text: 'DRAFT', ... } or a full render callback (escape hatch)
Advanced / low-level API —
import { ... } from 'kapom-report/advanced'.These are the building blocks the public facade sits on: the render engine + cursor, the block classes, the pure table pipeline (group tree / aggregate / column widths), the config resolvers, and plugin authoring (
registerBlockType+MeasurableBlock/RenderContextfor custom blocks). They're supported, but they're the internal seams of the library and change more freely than the public surface — reach here only when the facade can't express what you need.