All data views read a binding's rows and format values through the
field-renderer chain — chips, currency, ratings and dates
look the same in every block.
Block
What it does
Table
Columns with per-column renderer overrides; auto-columns when unconfigured.
Cards
Responsive card grid — image, title, subtitle, meta fields. A link pattern like /data/collection/movies?record={{$record.id}} makes each card clickable.
Kanban
Records grouped into lanes by a field value. Turn on Drag cards between lanes to let users move records — a drop writes the lane field through the records API, so permissions still apply.
Timeline
A vertical chronology by a date field, optionally grouped by year.
Calendar
A month grid plotting records by a date field. Set the month to {{$url.month}} and the page URL drives it (?month=2026-07).
Chart
Chart.js charts fed by a binding.
Map
An interactive MapLibre map over a geo field, with popups and clustering.
Stat / Progress
Single-number cards and progress bars; stats can read a record field or an expression.
Record / Field
A record's fields as a definition list, or one field's value — the building blocks of record pages.
Repeater
Renders its child blocks once per row — for fully custom per-record layouts. {{$record.field}} is row-scoped inside.
Prefer field Display defaults over per-column renderer overrides: set the renderer
once on the field (Schema → Display) and every table, card, and record view agrees.
Blocks that take a binding show sample data in the designer immediately — bind first,
then configure.
The render budget guards page weight (block count, depth, binding count); very large
pages should paginate their bindings with limit.