MuninMunin
Sign inStart free
Home/Journal/The Journal component gallery
Engineering · 6 min read

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.

Abstract placeholder cover image for the component demo article
A placeholder lede image — proves cover_image + caption render.

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_identifiers inline.
  • Third point.
  1. Ordered one.
  2. Ordered two.
  3. 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.

A pull quote pulls a line out at display size to break up the column.The pull_quote block

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.

Side note

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.

Placeholder figure A
A single column-width figure with a caption.
Placeholder figure B
A full-bleed figure that breaks past the text column.
Placeholder figure APlaceholder figure B
A figure pair rendered side by side.
typescriptrender.ts
export function render(blocks: Block[]) {
  return blocks.map((b) => renderers[b.type]?.(b.props));
}
15
block types
99.9%
uptime
1h
preview token life

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.

15
block types
99.9%
uptime
1h
preview token life
2×2
four items, no orphan cell

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

  1. First footnote, with a link and some code.
  2. Second footnote to show ordered numbering.
— Generated fixture, dev only