A history read the way an archivist reads a sheet of negatives. Eight square photographs, four across, twice, each filed under a currentColor hairline with a year and three or four words. Core blocks only: core/group, core/columns, core/column, core/image, core/heading, core/paragraph.
The signature moment
Density contrast against an airy opening
The signature is that one section holds two densities. Above, the eyebrow, the heading and the lede are given a spacing-70 run of air and the lede is held to a 40rem measure, so the opening breathes like the top of an essay. Below, the sheet is packed: the gap between frames is clamp(0.5rem, 1.2vw, 0.75rem), the same value between the two rows as between the cells, captions are small, and eight dated frames sit hard against each other on one screen. The switch from one density to the other, in the same band and on the same ground, is what makes the archive read as an archive rather than as a gallery with dates on it.
Nothing here is at display size except the section heading, and that is the point. Every caption, the year and the title alike, sits at a clamp() floored at 0.9375rem. A contact sheet is not a place where any one frame is louder than the others; the moment a year is set at 3rem the sheet becomes a timeline with a favourite. The heading carries the whole of the section's scale so the sheet can stay flat.
How a cell is built
Each cell is a core/group holding an empty core/image at aspectRatio 1/1 with scale: cover, then a second group carrying a 1px currentColor border-top and the two caption lines. The rule belongs to the caption, not to the image, so it sits under the frame like the line on a filing card and follows your text colour wherever your theme puts it. It cannot resolve to nothing, which a preset colour rung could.
The year is uppercase at 0.18em tracking; the title is the same size with no tracking and a tighter line height. That is the only contrast inside a cell, and it is enough to tell a date from a description without a second colour, a second family or a bold weight fighting the heading.
What happens at 390, stated honestly
The four columns stack. Core sets flex-basis: 100% on a column below 782px and this pattern does not override it, because four across at 390 leaves about 88px a cell and a three-word title ladders into a ribbon at that width. So on a phone the sheet becomes a single column of eight dated frames, read top to bottom. It is a different reading than the sheet gives on a laptop, and it is still an archive: the rule, the year and the title arrive in the same order under every photograph. isStackedOnMobile: false was deliberately not set; the measured cost of forcing four across on a phone is worse than the loss of the grid.
What it inherits from your theme
- The typeface. No font family is stated anywhere.
- Your colours.
basefor the ground,contrastfor the type, both ending on a colour WordPress guarantees. Every rule iscurrentColor. - Your spacing scale. The air above the sheet and the gap between the frame and its rule are spacing presets, so a theme with a generous scale gets a more generous opening and the density contrast grows rather than shrinks.
- Your photographs. The image blocks ship empty, which is what the editor writes before a file is chosen. Point them at your own media library and the 1/1 crop is already set.
What it decides for itself
- Full bleed with a 1240px measure.
- The tight gap.
clamp(0.5rem, 1.2vw, 0.75rem), used for the gap between cells and between the two rows, so the sheet has one gutter and not two. - The square crop, and the portrait crop in the strip.
- The caption ramp. Both lines at the same size, separated by tracking and line height alone.
- Eight frames. Four across is a sheet; three would be a gallery and five would need a smaller caption than the floor allows.
What to change first
- The eight photographs. Select each one in the editor; the crop and the layout are already set.
- The captions. A year and three or four words in the sheet. The strip carries the year alone, and that is measured rather than stylistic: eight columns inside a 1240px band are about 133px at 1280 and about 90px at 820, and a three-word title laddered to nine characters a line there. A year cannot wrap, so the strip stays legible at every width the sheet does.
- The heading and lede. Written to say the section is a sheet of eight. If you add a row, say so there too.
- The number of frames. Duplicate a row for eight more. Keep the count a multiple of four so the sheet has no short last row, which is the one thing that makes a contact sheet read as unfinished.
- The shape. Ship the base where the section is a block on the page, and
archive-stripwhere it is a band that wants to be crossed rather than read.
Why it is a history and not a process112 words
Nothing is numbered, nothing is counted down, and no caption asks the reader to do anything. The years are real dates rather than positions in a sequence, and the entries are events in the life of a public lido: it opens, it is requisitioned, it is padlocked, it is fought for, it reopens.
It is also not the other two patterns in this section. timeline-rail is six open entries with a sentence each on one continuous hairline; timeline-decades is twenty single lines grouped under decade heads. Neither carries a photograph, and both are read as text. This one is read as pictures, and its captions are shorter than either pattern's shortest line.
The variation154 words
archive-stripmoves the composition and nothing else. The eight cells become onecore/columnsrow of eight narrow portrait frames at2/3running the full 1240px, captioned by the year alone. The sheet becomes a strip and the history is taken in left to right in one pass; the titles stay in the sheet, which is the version that has room for them. Colour and type are untouched: the ground, the chains, the caption ramp and the hairline are identical to the base. At 390 the eight columns stack exactly as the four do. Its wrapping group statescontentSize: 1240px. A nested constrained group with nocontentSizere-caps its children at the THEME's content width, not the band's, so the strip first shipped at about 620px with eight 67px columns and even the years broke across two lines. The base did not show it, because 620px still leaves a four-column sheet 134px a cell.
Notes55 words
- Core blocks only. No plugin, no script, no separator, no
core/gallery. - Grid layout on
core/groupwas deliberately not used: this catalogue's floor is WordPress 6.6 and the twocore/columnsrows are the shape that is certain there. - No photograph is shipped with the pattern. the preview substitutes ours for the renders only.
The markup
Core block markup and nothing else. Copy it, then paste it straight into the block editor: WordPress reads the delimiters and rebuilds the blocks.
Fetching the markup…
Variation: Archive strip
Fetching the markup…