Built with Chinaski

Blocks

A block is a reusable chunk of structured content that you embed in any page or post with a single shortcode: {{block:name}}. When the site is built, each shortcode is replaced by the block’s rendered HTML; edit the block once, and every page that embeds it changes.

How embedding works

In the body editor of any page or post, type:

{{block:my-block-name}}
  • The name must match a published block’s Internal Name, in the same language as the page.
  • An unpublished block is silently skipped: the placeholder is removed from the output rather than rendered.
  • The same block can be embedded multiple times in one body; every location renders it identically.
  • To find out where a block is used, open it in the admin and check its usage view, which lists every page and post whose body mentions it.

Simple block types

These types need no JSON, just flat fields:

Type Best for Key fields
cta Call-to-action section heading, subheading, button label, button URL
image Standalone image with caption image URL, alt text, caption
quote Pull quote quote text, attribution, label
hero Full-width banner heading, subheading, button label, button URL, image
testimonial Customer testimonial quote text, attribution, avatar, label
stat Single large statistic heading (the number), subheading (the label)
promo Image + text two-column image, heading, body copy, button
embed Iframe / third-party embed raw HTML body, caption
video Embedded video with poster embed URL, heading, caption, poster image
form Contact form heading, subheading, submit label, action URL
newsletter Email signup strip heading, subheading, button label
audio Embedded audio player heading, audio file URL
callout Note / warning / tip box heading, body copy, variant (info, warning, success, note)
code_block Syntax-highlighted code sample language, optional label, code text
divider Horizontal rule between sections none: styling only
heading Standalone section heading heading text, level (h1–h6), optional subheading
spacer Vertical space between blocks none: height set via the padding/margin appearance controls
text Freeform rich-text section heading, body copy

Structured block types

These repeat rows of data stored as JSON; each type’s admin form includes a row editor that writes the JSON for you:

Type Best for Data shape
accordion Collapsible FAQ / sections repeated rows of title + body, rendered natively (no JavaScript)
table Data table one header row plus rows of cell values
columns 2-, 3-, or 4-column feature grid repeated rows of heading, body, optional image
gallery Image grid repeated rows of image URL, alt text, optional caption
button_group Row of call-to-action buttons repeated rows of button label, URL, optional style; group style variant
citations Source / reference list repeated rows of citation text, optional URL, anchor id
faq FAQ section with SEO markup repeated rows of question + answer; auto-generates Schema.org FAQPage data
feature_grid Icon-led feature list repeated rows of icon (image or glyph), heading, body
grid Freeform custom-HTML grid layout repeated raw-HTML cells; column count and gap
logo_bar Partner / client logo strip repeated rows of logo image, alt text, optional link URL
page_list Auto-linked list of a page's children a parent-page reference: cards (title, URL, description) are generated from live page data at build time, no manual rows
pricing_table Plan / pricing comparison repeated tier rows: name, price, period, feature list, optional button, optional "featured" flag
team Team / staff roster repeated rows of photo, name, role, bio, optional links
timeline Chronological history or roadmap repeated rows of date, title, body
schedule Weekly recurring schedule (hours, service times) plus dated exceptions repeated weekly day/time/label rows, plus repeated dated-exception rows; auto-generates Schema.org Event data for upcoming exceptions

Text-safety conventions: rich HTML is accepted in a specific set of body fields: accordion and columns row bodies, embed bodies, callout body copy, faq answers, feature_grid item bodies, grid cells, text block body copy, and timeline event bodies. Every other field (titles, headings, image URLs, captions, button labels) is escaped automatically.

Appearance options for every block

Each block has shared styling controls applied as inline styles on its wrapper:

  • Background color: a hex, rgb, or hsl value. You can also put a utility class name here instead of a color: that string is attached as a CSS class to the wrapper instead of a background style.
  • Border: enable, set a width, and override the border color.
  • Text color: applied to heading and body elements for types that support it.
  • Padding and margin: CSS-style shorthand around the whole block.

Working with blocks in the admin

Blocks are managed from the Blocks screen, a paginated list grouped by type, with each entry’s name, language, published flag, and last-updated date.

  • New blocks start blank; errors during save are shown all at once.
  • Sample blocks: the list page can construct a starter set (hero, CTA, promo, stat, quote, and testimonial) pre-styled and in English; existing blocks of the same names are left alone.
  • Trash: deleting a block moves it to the trash with an undo link, so mistakes are recoverable.
  • Usage report shows where a block is referenced.
  • Bulk actions operate on up to 500 selected blocks: publish, unpublish, move to trash, duplicate as drafts, change the block type (only to currently registered types), and others. Any change globally triggers a site build.
  • Import: blocks (and snippets) can be brought in via JSON or CSV.

When you change a block, its shortcode containers rebuild automatically so the live site reflects the update.

Extending: adding a new block type

New block types are one registry entry plus two files: register the type slug on the Block Types screen (that table is the sole authority for valid types), then add a builder template and an admin form for the type. When writing the builder template, escape user-controlled fields as usual; the only expected raw-HTML fields are embed bodies and body rows inside accordion/columns content.

Stacks: reusable sequences of blocks

For larger sections that repeat across pages, stacks let you export/import, duplicate, view where each one is used, and diff revisions; all from the Stacks section next to Blocks.

Also in Blocks

The grid block lays out freeform cells in a CSS grid: its fields for columns, gap, and cell count, and how cell HTML is rendered.

Use the feature_grid block for repeating feature items with an optional icon, heading, and body, plus its fields and HTML safety rules.

Use the pricing_table block for plan comparisons: its heading and per-tier fields for name, price, period, features, button, and featured.

Add a team block: a grid of people with photo, name, role, short bio, and optional links, plus its fields and how members are added.

The timeline block: an ordered list of dated events with a date label, title, and body, plus its fields and how HTML is handled.

Use the faq block to render question-and-answer pairs with automatic FAQPage structured data: fields, raw HTML answers, appearance.

Add a numbered list of sources to the end of an article with the citations block: its heading, per-citation URL and text, and anchor IDs.

The form block embeds a form on a page or post: how it links to a Form record by form_id, its heading and button fields, and where it submits.

Use the page_list block to list a parent page's live children as cards that stay in sync at build time, plus its fields and HTML safety rules.

Use the embed block to place third-party embed code such as an iframe, map, or video in a page, with its fields and the unescaped-HTML warning.

Add a table block: a plain HTML data table from column headers and rows, with its fields, and when to use it instead of the pricing table block.

The schedule block: weekly recurring hours plus dated exceptions, with automatic Schema.org Event markup.

Read this site in