Build a grid with sized columns, an optional header, and a body that repeats one row per item in your data.
A table is a grid of columns with an optional header row and a body that repeats one row per element in an array from your data. Repeating table rows is the only loop in the template language — there are no other loops or conditionals.
The body’s forEach is a dotted path into data that must resolve to an array. Tipar renders the row template once per element, binding the current element to item:
item is only defined inside a table body. Referencing {{item.x}} anywhere else, or pointing forEach at something that isn’t an array, fails with 422.
Need a row that isn’t part of the loop — a totals line, a “no items” note? Put it outside the table, as a sibling node in the surrounding column. The table is strictly the repeating grid; static lines live next to it.
In v1 a cell border is a bottom rule only — enough for the horizontal lines that make up most tables. Top, left, and right borders aren’t supported yet.
Cell counts must match the column count. If columns has three entries, every header.row and body.row must have exactly three cells. A mismatch is a 422 structural error — and the response names the offending row so you can fix it.
You don’t manage pagination. When a table’s rows overflow the page, Tipar continues it on the next page automatically, re-drawing the header row at the top. Combine that with a page-number footer for long reports — see the report example.