RistmarkStart free

Block

Repeater

Draws the same small design once for every record in your data — one copy per invoice line, per participant, per row.

What it is for

A repeater holds one design — its item template — and repeats it down the page, once per record in the list of data you point it at. Where a table gives you fixed columns, a repeater repeats whatever you put inside it: a couple of lines of text, a row of columns, a picture, a QR code, even another repeater. Typical uses: a ticket card per guest, a product card per item, an address label per recipient.

Choose something else when:

  • The records are tabular — invoice lines, one record per row in a shared grid. Use a Table with Repeating rows (see the Table article, "Designed cells"). That keeps one grid with shared column widths and a header that repeats on every page, and exports as ordinary Word table rows. A repeater holding rows gives you a separate little table per record instead: no repeating header, no shared grid lines.
  • You just want a bulleted or numbered list of one value per record — use a List bound to your data.
  • The content is the same every time — then you do not need one at all; use a Stack to group blocks.

Add and edit it

There is no Repeater tile in the block palette. There are two ways in:

  1. Repeat blocks you already have. Select the blocks (or one block) and choose Repeat for each record… — on the bar that appears over a multi-block selection, or in a block's ⋮ menu next to Wrap in Stack and Wrap in Row. The dialog asks the two things a repeat cannot guess: which list, and what each record is called. It says what the section will print before anything changes, and you can create a list right there — that list is only added when you press Repeat, and Cancel leaves your data untouched.
  2. Start from an empty one. Search for "repeating section": the Search button at the top of the block palette, or Search blocks… at the top of any + Add block menu — inside a Stack, a Row column or another repeater's design, for instance. It arrives with one line of sample text as its design and no list yet, so it prints nothing until you choose a list in the side panel.

The blocks become the item design exactly as they were: nothing inside them is rewritten, so they keep every binding they had. One thing does change meaning, and the dialog tells you when it applies: inside a repeat, {{ $data.name }} reads the record's own name when the records have one. If your selection uses a document field whose name a record also has (or the record name itself), the dialog lists those fields before you confirm. Repeat is one step to undo. The same rules as wrapping decide when it is greyed out (blocks in different places or not next to each other, anchored blocks, a header or footer, a Ruled form box, a page break). Blocks that sat in a Stack keep its spacing: two or more of them go into the item design inside a Stack with the same gap.

Edit the design: one copy changes every copy

One copy on the page IS the design — the first record's, unless you choose another (below) — and it carries an "Item design · record 1" label on its top-left corner, whatever is selected. Click into it and edit it like any other content — type in it, restyle it, drag blocks into it. Select anything inside it and the editor says so in two more places — an "Item design" chip on the block bar over the block, and the line "Editing item design — affects all records" at the top of the side panel — so you know before you type that the change reaches every record. Add a Text to the design with its + Add block and the caret is already in it, so you can type straight away (a repeater with no records in the sample draws no copy to type in, so there the new Text is only added).

The other copies are faded previews of the same design filled with the other records; clicking one selects the repeater rather than editing it, because there is only ever one design to edit, and hovering one says so: "Preview copy — editing the item design affects all records".

To go back from a block inside the design to the repeater, click the repeater in the breadcrumb trail at the top of the side panel.

Choosing which record shows the design

The first record is often the least telling one. The side panel's Sample record navigator picks which record's copy is the design: First, Previous, "Record 3 of 12", Next, Last, with that record shown on one line and a sentence saying what an edit reaches. Nothing moves when you choose: every copy stays where its record prints. It is a preview setting only — not saved, not an undo step, and it never changes your data or the document's output. The field suggestions as you type a binding, and the true/false result a condition shows, are worked out against the record you chose. Switch to a sample scenario with fewer records and the panel says so ("Record 5 is not in this sample, which has 2 records — showing record 1.") and switching back restores your choice. A repeater inside another repeater has no navigator: its records change with each outer record.

Settings

Setting What it does Default and limits
Data path The list in your data this repeats over: one copy of the design per record. Nothing repeats until it is set. The list chooser offers every list in your sample data by name with its number of records; anything it cannot offer (a calculated path) can be typed in the Path box under it. Not set — the panel says "Not bound to data yet".
Name for each record The name the current record answers to inside the design, so a field reads as {{ $data.guest.name }}. item.
Gap The vertical space between one repetition and the next. It does not change spacing inside the design itself. 2 mm. 0 or more.
Item template The blocks of the design. Shown as a count; edit them on the page or under Contents. One line of sample text.
Sample record Which record's copy is the editable design (preview only). First.
Sample data A read-only table of the first few sample records, so you can see what you are binding to. —

Like every block, a repeater also has the Box section and Visibility.

Gap between copies versus spacing inside

Gap is only the space between one copy and the next. Spacing inside the design — between its lines, around a picture — comes from the design's own blocks (a Stack's gap, a block's margin and padding). To make cards with air between lines and a bigger space between cards, set a Stack's gap inside the design and the repeater's Gap between copies.

Choosing the list

Pick a list and the panel shows the fields a record has and the first record, and says what the section will print: "This section will repeat 2 times, once per record". A list with no records says the section will not be printed at all; a field that is a single value rather than a list, or a path with nothing behind it, says the same.

No list yet? Create a list opens the same form as Manage data's Fields tab — a name, typed columns and two sample records — and uses the new list straight away. One Undo takes back both the list and the binding. Inside another repeater, the chooser also offers the lists inside the current record, for a repeat within a repeat.

Renaming "Name for each record" is safe

Change it, then move to another field — you will see a preview of every binding and condition inside this repeater that uses the old name, with its before-and-after value, before anything is written. Apply to rename them all together (one Undo restores all of it); Cancel and nothing changes. A record name reused by a repeater nested inside this one is left alone on purpose. An expression too unusual to check automatically is reported instead of guessed.

When there are no records, and the limits

If the sample has no records in the list, the repeater prints nothing — no copy of the design, not even an empty one. The canvas says exactly that on the repeater's box ("No records in this sample — prints nothing", or "Not repeating yet — choose a list; prints nothing") and the side panel says it too. The design is still there: Edit the design in the panel selects its first block, and the panel's Contents list reaches the rest. To see it on the canvas again, pick a sample scenario that has records, or add one in Manage data.

A repeater that runs long continues on the next page, breaking between records. It stops after 3000 records and says so on the page ("N row(s) omitted (cap 3000)") rather than silently dropping the rest.

Examples

Each example is a complete template stored with this documentation and checked automatically.

A ticket card per guest (Text + QR code)

The example is repeater-1: a Repeater over $data.guests, each record called guest, Gap 6 mm. The design is one Row: a wide column with the guest's name and "Table N", and a 28 mm column with a QR code whose Value is {{ $data.guest.ticketUrl }}. Sample data:

{ "guests": [
  { "name": "Anna Berzina",  "table": 4, "ticketUrl": "https://tickets.example.com/t/A-101" },
  { "name": "Janis Ozols",   "table": 7, "ticketUrl": "https://tickets.example.com/t/A-102" },
  { "name": "Maija Kalnina", "table": 4, "ticketUrl": "https://tickets.example.com/t/A-103" }
] }

Expected page: three cards one below the other, each with the name and table on the left and its own QR code on the right; the three codes differ. Add a fourth guest in the data and a fourth card appears. Change the layout of the first card once and all three change.

A product card with a picture

The example is repeater-2: a Repeater over $data.products (record product), Gap 8 mm. The design is a Stack with an Image whose Source is From data (product.photo, Cover, 60 × 40 mm), the name, and the price shown as currency ({{ format($data.product.price, 'currency') }}). Sample data: Oak table €480, Reading lamp €59.90 (both with a photo) and Gift card €25 (no photo). Expected page: three cards; the last one shows the "Picture unavailable" marker where its picture would be, because that record has no photo and there is no fallback. See the Image article for fallbacks.

A repeated address label

The example is repeater-3: a Repeater over $data.recipients (record recipient), Gap 10 mm. The design is a Stack with gap 0 and three lines: the name, the street, and "postcode city". Sample data:

{ "recipients": [
  { "name": "Acme Trading SIA",   "street": "Brivibas iela 1", "postcode": "LV-1010", "city": "Riga" },
  { "name": "Nordic Supplies OU", "street": "Pärnu mnt 12",    "postcode": "10148",   "city": "Tallinn" }
] }

Expected page: two labels one under the other, each three lines tight together, 10 mm apart. The Gap (between labels) and the Stack's gap (inside a label) are independent.

Output differences

  • PDF and HTML: each copy is drawn at its own position, breaking between records across pages.
  • Word (DOCX): the copies flow top to bottom as ordinary content in record order. It is a generated document, not a Word mail-merge template: there is no live repeating region inside the .docx. A repeater that holds rows gives separate small tables, not one table.

Troubleshooting

  • Nothing prints. No list is chosen ("Not bound to data yet"), or the list is empty in the data you are looking at. Choose a list in the panel; switch to a sample scenario that has records.
  • I changed one card and the others did not follow — or the other way round. There is only one design. The first (or the Sample record) copy is the editable one; the faded ones are previews and a click on them selects the repeater. Edit the design copy and every card changes.
  • A field shows {{ … }} or comes out empty. Check the field name against the record name: with "Name for each record" set to guest, the field is {{ $data.guest.name }}. The suggestion list offers the record's own fields as you type.
  • The cards are too close, or too far apart. Gap sets the space between cards. Space inside a card comes from the blocks in the design.
  • I want a table with a repeating header. Use a Table with Repeating rows instead of a repeater.
  • The page says "N row(s) omitted (cap 3000)". The list has more than 3000 records; only the first 3000 print.