Skip to content

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.