Guidelines

Layout

One grid for the whole hub: a 200px rail for the category nav, then four columns with an 8px gutter. Tight gutters make the photographs read as one wall; wide rows between them let each story breathe.

Desktop anatomy

Measured from the design at 1440 wide. Rows are top aligned, so mixed crops make a ragged edge along the bottom of each row. That edge is the look.
1440px: margin, rail, gap, content, margin

Mobile

Below 1024px the rail becomes a scrolling row of tabs above the grid, and the grid drops to two columns. The first story, wide stories and text cards take both columns; dense packing fills the holes they would leave.
RuleValue
Page margin16px
Gutter8px, both axes of the card grid
Columns2
Full widthFirst story, two-column stories, text cards
Card contentImage, category, title. Excerpts hidden.
Category navHorizontal, scrolls under the margin to the screen edge

Hero

The lead story spans the page less one column; the rail beside it holds two stories at the grid's column width, so the hero and the grid line up on the right.

lg:grid-cols-[minmax(0,3.85fr)_minmax(0,1fr)], 16:10 on desktop, 4:5 on mobile with the rail wrapping underneath in two columns.

Values

Read from the tokens where they are tokens.
Token or classValueWhere
--page-margin16px, 24px from lgEvery edge of the page
--grid-gutter8pxBetween cards, both ways within a band
--spacing-rail200pxCategory nav column
gap-x-832pxRail to content
gap-y-10 lg:gap-y-1240px, 48pxBetween rows of stories
py-14 lg:py-2056px, 80pxInside a paper band
lg1024pxThe one layout breakpoint
The grid, in code
<RailLayout
  intro={<SectionIntro title="Explore the world of Coach" />}
  rail={<CategoryNav categories={categories} active={active} />}
>
  <StoryGrid items={exploreGrid} />
</RailLayout>