Tables
The Table block binds rows to a list and configures columns visually.
Columns
Each column has a heading (may contain {{ tokens }}), a value expression evaluated per row (row.value | currency:"GBP":0), alignment, an optional width in percent (unset columns share the remainder), bold, wrap, and a total: sum, average, count, min or max. Totals aggregate the numeric value before formatting and reuse the column's formatter, or a totalFormat you specify. A custom total expression can reference rows.
Appearance
Header row, zebra rows, compact rows, borders (document default, horizontal, full grid, outer, none), header colours, font size and the totals label. Document-wide table styling lives in Document → Tables & cards so every table matches the brand; the theme provides $table.headerBackground, $table.zebraBackground and $table.borderColor.
Conditional formatting
Rules are evaluated per row: row.gain < 0 → red text; row.priority == "High" on column * → bold row. Colours accept theme tokens.
Sorting and limits
Sort by a field ascending or descending and cap the number of rows. Sorting happens after the data is bound, so the same template can present the same list differently in two tables.
Across pages
This is where BroadPaper is deliberately better than the average:
- Row-level splitting. Tables split only between rows, never through one.
- Repeated headers. The header row is repeated at the top of every continuation page, positioned exactly where the table sits.
- No orphan rows. At least two body rows stay together on each side of a break (configurable via Page flow), and the totals row never appears alone.
- Windowed rendering. A 1,000-row table renders only the rows visible on each page, so long tables stay fast in the editor and in the PDF service.
The repository's PDF tests render a 1,000-row table across 25 pages and assert the header appears on every one.
Design mode
Tables show three sample rows (configurable) with a badge naming the source and the real row count. Totals are computed over the full sample data, not just the visible rows.