Components

Blog Grid

The subdivision grid as an editorial layout. From left to right the areas halve — and with them the weight of each article. Far left the newest one at full height, far right the archive as a list of rows. A mono timeline runs underneath.

Default

The principle

Five columns of equal width, drawn 1, 2, 3, 6 and 6 — the lead card, two columns of cards with a text block, two of single lines. Each column stands for a period: the further right, the older and the terser the presentation. The layout explains how an archive works without a single word.

A column is a year, and the numbers above are how it draws, not how much it holds. On patterns/news.html the newest post is the lead and every post after it stands in the column of its own year; the last column takes every year older than the four that fit, which is why its tick is a range. A year that runs long is not paged away — the column scrolls. See The port.

ColumnClassArticlesPresentation
1 — current.cf-blog-col--11picture, large title, author, date, reading time
2 — this year.cf-blog-col--22picture, title, date, reading time
3 — last year.cf-blog-col--33picture, title, date, reading time
4 — before that.cf-blog-col--66title only, single line
5 — archive.cf-blog-col--66title only, single line

The counter in the section header names what stands in the grid, which is now the whole archive: nothing is held back on a second page for the counter to point at.

The port

.cf-blog-grid--port is the archive's own form of this grid: a fixed height of 36.5rem, and each column its own scroll. It is worn on patterns/news.html and the topic pages, and deliberately not on the Weiterlesen grid under an article — three cards have nothing to scroll and a port there is a fixed height with air under it.

The title picture

A post names one picture that stands for it — bild: in its file, the Titelbild property in Notion — and the card is drawn from it: .cf-blog-card--media on the card, an <img> with .cf-blog-card__image as its first child. scripts/build-news.py writes both, and the same call writes the Weiterlesen cards under an article, so the two cannot drift apart.

Behaviour

The timeline has no tracks of its own. The ruled grid and the axis under it are two .subdivide__row bands of one .subdivide, so the axis adopts the grid's columns through subgrid and cannot drift from them. They used to be siblings, each declaring five equal columns independently — which held only because both happened to say five. patterns/blog-artikel.html already runs the same grid at --subdivide-count:3; adding an axis there would have put five ticks under three columns. → foundations/layout.html

A tick stands on the leading rule of the column it names, which is where the application plate draws it. writing-mode: vertical-rl starts its text at the block-start edge — the right — so a stretched tick landed on the trailing rule and read as labelling the column next to it. justify-self: start is what puts it back.
The timeline is decorative. It is aria-hidden because the years already appear in each article's metadata. Without that, a screen reader announces “Aktuell 2026 2025 2024 2022–2023” with no context at all.