Page body

The body of a deep page, demo or article: the prose column, with On this page beside it when the page is long.

Template · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Do and don't

Do: A public rubric area

Rendered by prose-section.ts

Open example: Page body · Do: A public rubric area Use the full-page example to follow page links.

The public standard keeps its source and accessible section names.

Do: A deep page

Rendered by prose-section.ts

Open example: Page body · Do: A deep page Use the full-page example to follow page links.

The reading column.

Do: A demo page

Rendered by prose-section.ts

Open example: Page body · Do: A demo page Use the full-page example to follow page links.

Full width for the showcase.

Don't: A dye background

Rendered by prose-section.ts

Open example: Page body · Don't: A dye background Use the full-page example to follow page links.

The body is always cotton.

Don't: Two columns of prose

Rendered by prose-section.ts

Open example: Page body · Don't: Two columns of prose Use the full-page example to follow page links.

One reading column.

Rules

RuleWhyCheck
The page body stands on cotton.Long reading needs the calm ground; colour marks structure, not text.Automated: scripts/site/system/check-pages.ts (page sequence)

API

PropTypeRequiredDefaultWhat it does
htmlhtmlYesThe rendered page body.
headingslistNoThe page's headings, for Contents.
langen | jaNo"en"Language.
widebooleanNofalseA wider column for tables (What runs today).
beforehtmlNoA notice before the body (a demo's Coming next callout).
extraClassstringNodemo-page on demo pages.
rubricAreaslistNoPublic rubric entries: id, title, description and good. Uses the compact article wrapper with html appended as its source note; no contents grid.
plainbooleanNofalseNo grid: a demo page's showcase spans the wrap.

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idprose-section
LayerTemplates
Categorysection
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/templates/prose-section.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26Page body as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • Every page's body below the page head. Why: One reading column for all long-form text.

Do not use when

  • On the landing. Why: The landing is made of section templates.

Anatomy

PartWhat it is
rootdiv.wrap.page-body (+ demo-page)
griddiv.page-grid (+ has-toc)
contentsContents organism
articlearticle.prose (+ prose-wide)
rubricOptional named rubric sections with h2, description and what good looks like, read from the public rubric data

Made of: contents, text, callout.

Used in: page-article, page-deep, page-demo, page-hub, page-status, page-runs-on-loom.

Variants

VariantWhenWhy
public rubricThe source-backed eight-area standard.Each area has a labelled section and its own definition, within the same reading column.
with contentsThree or more sections.A map beside the text.
plainDemo pages.The showcase needs the full width.
wideThe status table.Tables need room.

States

StateRendered or not applicable
defaultdefault
hoverNot applicable: The page body is not interactive, so it has no hover state.
focus-visibleNot applicable: The page body does not take focus; links and buttons inside it carry their own focus ring.
activeNot applicable: The page body cannot be pressed.
disabledNot applicable: The page body has nothing to disable.
loadingNot applicable: The page body is rendered at build time and is complete when the page loads.
emptyNot applicable: The page body is not rendered without content; the builder skips it.
errorNot applicable: The page body shows no data that can fail.
currentNot applicable: The page body has no current item.
visitedNot applicable: The page body is not a link.
expandedNot applicable: The page body does not open or close.

Tokens

PartToken
article.measure--measure (68ch)
article.font--type-body

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingProse wraps; tables and code scroll in their own focusable region.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.
max68 characters per line in prose

Spacing and rhythm

AspectValue
internalOne padding: --space-section-sm above and below (D-SITE-005).
externalBetween the page head (or persona strip) and Related.
rhythmCotton.

Motion

AspectValue
NoneNo intrinsic element animation. The optional claude-entrance consumer profile may translate below-fold structure once (20px, --dur-weave, --ease-enter, --stagger); reduced motion disables it. This preserved baseline entrance is separate from element playback.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
roleregion (section) named by its heading
nameIts h2, by aria-labelledby
keyboardLinks and buttons inside, in reading order.
focusThe --focus ring on every link and button inside.
screenReaderRead in source order; decorative weaving is aria-hidden.
contrastInk on cotton 14:1; text on every dye field 4.5:1 or better (checked by check-brand).
targetLinks and buttons are 44 px tall.

Content

SlotLengthVoice
htmlThe pagevoice.md

Good: “Short sentences, real numbers with their source.”

Bad: “Next-generation”

Japanese: Japanese pages render their own Markdown; review banner at the top.

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

Usage

126 uses across the built pages (measured by npm run site:system).

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.