A contact section for one address a visitor can actually walk to. A 3:2 frame runs off the page edge on one side, and opposite it the facts hold a short measure: the place name at display size, three lines of address, one hairline, then a paragraph of hours and directions and a single action.
It is the first pattern in the contact section with a picture in it, and it is deliberately not the section's third ledger.
The signature moment
The frame breaks the page, the facts do not
The picture runs off the left edge of the viewport at every width, with no padding and no gap between it and the text column, while the facts beside it are held to a 24rem measure inside a column that is nearly twice that wide. One side of the section has no margin at all and the other has a deliberately generous one, so the composition is lopsided on purpose: the eye enters at the picture, which has no left edge to find, and stops at a short column of type with air around it. Take the palette away and that asymmetry is still the whole design, which is what makes it survive colourlessness.
The caption under the frame is the second half of the move. It is set at 15 to 16px, uppercase and tracked, and it sits inside the picture's column with its own padding, so it is the only thing on that side of the section that is inset. It reads as a note written on the photograph rather than as a heading over it.
What it inherits from your theme
- The typeface. No font family is stated anywhere, in the base or the variation. The place name, the caption and the address are all set in yours.
- Your colours. The ground asks for
baseand everything on it asks forcontrast, the two slugs every stock block theme defines, each written as a fallback chain ending on a colour WordPress itself guarantees. No accent slug appears in any rung, and no text sits on the photograph. - The hairline. It is a 1px
currentColortop border on the group holding the directions, so it follows your type wherever your theme puts it and cannot resolve to nothing. - Your spacing scale. The band's air, the gap under the frame and the space between the facts are spacing presets, so a theme with a generous scale gets a taller section without you editing anything.
- Your button styling. The action is a core button taking your theme's button element styles on hover and focus. It carries no typography of its own, because a button carrying typography is valid in WordPress 7.0 and invalid at this catalogue's 6.6 floor.
What it decides for itself
- The bleed. The band is
align: fullwithpadding-left: 0and a right padding ofclamp(1.25rem, 6vw, 8rem), and the columns carry no gap between them. The picture therefore touches the viewport's left edge at 1400 and at 390 alike, and the band's air is all on the other side. - The 52/48 split. The picture is the larger half by a little, not by a lot; the point is the missing margin, not the size.
- The short measure. The facts are wrapped in a constrained group at 24rem justified left, which is the mechanism this catalogue uses for a measure inside a wider band. A
padding-righton the block would give the right width and the wrong position. - The picture's proportion. 3:2 with
scale: cover, so whatever you upload is cropped to the shape the composition needs rather than changing the height of the section. - Proportion of type. The eyebrow at 13 to 14px, uppercase, 0.2em tracked; the place name at
clamp(2.25rem, 4.4vw, 3.5rem), weight 700, tracking -0.03em on a line height of 1.03; the address at 17 to 19px on 1.5; the caption and the directions at 15 to 16px. Nothing sits between the place name and the address, which is where the scale collision comes from. - Its own ground and its own air. The section states its ground and a full spacing preset 80 above and below, so it does not depend on the section above or below it for colour or for air.
- The action's colours. The button inverts against the band, so it is your
contrastground with yourbasetype: the same pair your page body already uses, in reverse. It cannot vanish in any theme, because the two chains are each other's opposites.
What to change first
- The photograph. The frame ships empty, which is what WordPress's own editor writes before a file is chosen: click it and pick from your media library. Use the door, the street or the building, not a portrait and not a stock office; the caption is written as if the reader is standing outside.
- The place name. "Tanners Yard" is two words on purpose. This ramp is built for one to three words; a long name will take three lines and outweigh the picture.
- The three address lines. They are one paragraph with
<br>between them, so they stay locked together as a block of facts rather than drifting apart on your theme's paragraph spacing. - The directions paragraph. Hours, the nearest station, the bus, and how someone gets in without stairs. This is the sentence a visitor screenshots, so write it for them.
- The action's link. The button ships without a URL, like every link in this catalogue. Point it at your map listing, or delete the button and let the caption do the work.
How this avoids being a third ruled label/value ledger131 words
contact-ledger and contact-split already share one idiom: a small tracked label in a narrow column against its value in a wide one, repeated down the section. A third would make it three, and at thumbnail size the section page would show the same card three times.
So there are no labels here at all. The address is one paragraph of three lines and nothing names it "Studio"; the hours and the directions are one running paragraph of prose and nothing names them "Hours". There is exactly one hairline in the section, and its job is to separate the address from the directions, not to rule a row. The relationship between the frame and the facts, not the relationship between a label and its value, is what the pattern is made of.
What this pattern cannot be, and says so plainly117 words
- There is no form. WordPress core ships no form block, so an enquiry form is not a pattern nobody has authored yet, it is one that cannot be authored under a core-only rule. It belongs to the companion plugin. The action here is a link.
- There is no live map. A map is an
<iframe>with no core block behind it, so this pattern can only ever be typeset facts plus an empty frame you fill with a still: a photograph of the door, the street, or a screenshot of the map you would have embedded. If you want a live map, add your map plugin's block under the address; the picture column is unaffected.
Notes252 words
- Core blocks only: group, columns, column, image, heading, paragraph, buttons, button. No separator block is used; the one rule is a group border, because a
core/separatorwithoutis-style-widerenders as a centred stub in Twenty Twenty-Four. No plugin, nothing to keep updated. - No promise axis is declared: colour, type and motion are all the default, so this pattern inherits your palette and your typeface and carries no CSS and no JavaScript of its own.
- Mirrored place is the one variation. It is a complete file you copy instead of the base and it moves the composition, not the palette: the facts come first at the left, and the frame runs off the RIGHT edge, so the section closes on the picture rather than opening on it. Use it when the pattern above it already leans left, or when the section sits directly under a left-aligned heading. Copy, sizes and colours are identical.
- Below 782px the columns stack, so the section reads picture, caption, then facts. The picture still bleeds off one edge on a phone and the facts keep their 1.25rem inset, so the asymmetry survives the stack.
- Every pair is your
contraston yourbase, or the reverse on the button: the pair your theme already sets body copy on. The place name is large text and is claimed at 3:1; the eyebrow, the caption, the address and the directions are held to 4.5:1. Measured per host theme against the resolved values, not the authored chains.
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: Mirrored place
Fetching the markup…