The Journal component gallery
A single article that exercises every typed block the journal renderer supports — lead, prose, callouts, quotes, editorial lists, definitions, figures, stats, takeaways and more. Use it on dev to eyeball rendering after a change.

This is the lead block. It sets the tone in slightly larger type, and it supports inline emphasis and links back into the journal via references.
Prose block
The prose block is plain markdown. It renders headings, emphasis, inline code, external links, and lists:
- First point, with some length to it so wrapping is visible.
- Second point mentioning
snake_case_identifiersinline. - Third point.
- Ordered one.
- Ordered two.
- Ordered three.
A second paragraph follows so paragraph spacing is visible.
Note callout
The note tone uses the info icon. Body is markdown, so code and links work here too.
Tip callout
The tip tone uses the lightbulb icon.
Warning callout
The warn tone uses the triangle-alert icon. Good for gotchas.
The attributed quote renders an avatar with initials and the attribution line beneath.
ALAda Lovelace · Engineer
Dark aside
The aside block is a dark, boxed note with an optional kicker and attribution — visually distinct from callouts.
Two key/value lists
editorial_list and definitions are both key/value rows. They differ in how much weight the key can carry. Read the key out loud: a word or a number is an editorial list, a phrase is a definition list. If the values run past four lines, use neither — h3 subheads with paragraphs, or a real table.
The editorial list comes first: a narrow column of letterspaced mono, single-word keys, one or two lines of value. The key is chrome, not content.
- TypedEvery block is schema-validated before it renders.
- HeadlessContent is fetched from the delivery API at build time.
- PortableThe same blocks render on marketing and in preview.
Now the same shape with a phrase for a key. The 196px column gives it room, the key is set in semibold sentence case, and each value can run to a short paragraph. This is a taxonomy — named categories the reader compares down the column.
- Per actionSalesforce. Flex Credits meter the agent's effort — 20 credits for an Agentforce action, 30 for Voice. Honest about what costs the vendor money, and a loop that retries twice bills you three times.
- Per verified resolutionZendesk, at a published $1.50. Two of the three tiers are free — only a verified resolution draws down. The most engineering anyone has put into defining the thing they bill for.
- Per outcomeIntercom, at $0.99, charged at most once per conversation. Attempts aren't billed, and a resolution is deducted if the customer comes back.
Two kinds of emphasis live inside a definition value. **Double asterisks** render as .term — ink italic, for a term being defined. *Single asterisks* render as <em> in cobalt serif, reserved for the one phrase per entry that carries the argument. The cobalt index above each key is a CSS counter, so never number the keys by hand.




export function render(blocks: Block[]) {
return blocks.map((b) => renderers[b.type]?.(b.props));
}The stat grid is a wrapping flex row, so a short trailing row stretches to fill the width instead of leaving dead cells. Four items lay out as 2×2 rather than 3 + 1; five give three then two half-width; seven give three, three, then one full-width.
Key takeaways
- Every typed block has a matching renderer.
- Inline markdown works inside most blocks.
- Figures resolve asset ids to public URLs via the delivery API.
Notes
- First footnote, with a link and some
code. - Second footnote to show ordered numbering.