Block reference

Blocks are typed units of content: { id, type, order, data }. The data shape is described by a JSON Schema and enforced on save by a server-side validate hook — an unknown type or an invalid payload is rejected, so a node can never reference something the renderer can’t handle. Below is every built-in block and its fields.

Structural & content

hero

A headline, subtitle and primary call to action.

  • title — string, required.

  • subtitle — string.

  • cta_text — string.

  • cta_url — string.

rich_text

Long-form prose as a ProseMirror document.

  • doc — object, required. Must be a ProseMirror doc: doc.type == "doc" with a content array.

cta

A focused prompt with a button.

  • title — string, required.

  • cta_text — string, required.

  • cta_url — string, required.

  • subtitle — string.

columns

A multi-column row of plain-text columns (at least two).

  • columns — array, required (≥2).

  • columns[].body — string, required.

code

A syntax-highlighted snippet.

  • code — string, required.

  • language — string.

  • filename — string.

Media

image

  • src — string, required.

  • alt — string.

  • caption — string.

gallery

A grid of images (at least one).

  • images — array, required.

  • images[].src — string, required.

  • images[].alt, images[].caption — string.

embed

  • url — string, required.

  • provider, title — string.

divider

  • style — enum solid | dashed | dotted. No required fields.

Marketing

These drive bespoke marketing pages from the CMS. They deliberately avoid nested objects and arrays-of-strings so the admin’s generic schema-driven editor can render them — which is why mkt_pricing.features is a newline-delimited string, not an array. Each (except mkt_ui) requires a non-empty key the renderer places by.

mkt_section

  • key — string, required.

  • eyebrow, title, body — string.

mkt_items

  • key — string, required.

  • kind — string (layout hint).

  • items[] — objects with label, title, body, meta (all strings).

mkt_pricing

  • key — string, required.

  • note — string.

  • tiers[] — objects: name, sub, price_m, price_a (prices are strings), per, access, cta, tag, features (one line per feature).

mkt_ui

Key/value chrome strings (nav, buttons, footer, modal…); the values are what get translated.

  • items[] — objects with key and value. No server-side validation.