03 · One Thread — "The only color is the one you chose"

Thesis

A near-monochrome editorial page: ink (#2A2724) on warm white (#FBF8F3), drawn with hairlines (#D8D1C6) and large Fraunces headlines. The only chroma on the page is (1) the photography, (2) the navy CTA, and (3) a single 4px thread of yarn that starts at the sweater's collar in the hero and runs the full length of the page, weaving from gutter to gutter at section boundaries and ending in a small loop beside the email field ("join the table"). The thread is always the colorway the visitor last tapped. Default is Navy/White. Aesop's restraint, Baggu's colorway obsession.

The page reads as the game night spine from the concepts doc: Everything for the table, Dress for it, Set the table, Pick your deck, Cards, not tiles, Table talk, Join the table. Each section carries a small sentence-case label; there are no numerals and no eyebrow caps anywhere.

Fonts

Palette

The single motion moment

Tapping an unselected colorway tile (a) crossfades both large sweater figures (the wall's chest detail and, offscreen, the hero flat) to that colorway and (b) recolors the thread, the weave connectors, the hero thread and the end loop by transitioning --thread over 400ms. The image crossfade inserts the new <img> underneath and fades the old one out over the same 400ms, so the swap and the recolor happen together. Nothing else animates on scroll. There is no IntersectionObserver reveal choreography. Under prefers-reduced-motion: reduce, --thread-speed is 0ms and the JS removes the old image immediately: an instant swap.

Tile aria-current, the "Selected · tap to shop" line under it, the "Selected colorway" heading, the hero caption, the wall CTA label, and both sweater CTA hrefs update to the chosen variant. Button hover transitions are 120ms.

How the thread is built

Section decisions

Interactions and accessibility

Performance

Assumptions

Photography honesty

Revision (after CRITIQUE.md)

What changed, in the order of the coordinator's list:

  1. The colorway wall's seven disc chips are gone. The seven flats are now 4:5 tiles (.cw), 2-up at 375px and one row of seven at 1440px, each a real <a> to its variant deep link with the colorway name beneath. Tapping an unselected tile swaps the wall's detail figure and the hero flat and recolors the thread (still the only motion moment). Tapping the tile marked aria-current follows the link; the tile says "Selected · tap to shop" and the lede says "tap it again to shop it". The toast after a swap says the same.
  2. Mobile fold: the button pair moved above the hero image at 375px (.hero-actions{order:3}, .hero-visual{order:4}) and the lede was cut to one sentence. The primary button now sits at about 323 to 371px on a 375px screen.
  3. The two empty review frames in the critic's desktop capture could not be reproduced here (headless Chrome full-page captures at 1440 and 375 both rendered all three photos, before and after this pass), so the likely cause is a lazy-load race in a scrolling capture tool. As instructed, loading="lazy" was removed from the boat and floral photos; at the 400 twin they cost 11KB and 51KB. The kitchen-table photo stays lazy.
  4. The header roundel is back in its real pink and blue: filter:url(#ink) was removed from .brand img, leaving only mix-blend-mode: multiply so its white background sits on the warm white. The footer wordmark keeps the ink filter.
  5. The italic numerals 01 to 07 and the .kicker b rule were removed; the labels remain in sentence case.
  6. The hero now leads with Navy/White (file mahj-knit-sweater-navy-white-flat, 1600px), the default --thread is #17264A, and the drawer tile, preload, captions, CTA hrefs, aria-current tile and cur all start on navy. The wall no longer repeats the hero flat at full width: its figure is a 5:4 chest-detail crop at 1.6x (see Photography honesty). Pink/White was considered as the alternative lead because navy makes the default thread the same hex as the CTA; navy was taken because the coordinator asked for it and because 02 already leads navy only by the critic's account of a different composition. The overlap is documented under Palette.
  7. H1 changed from "Mahjong, made portable." (which belongs to 01) to "Game night, anywhere." The footer line changed to match. The wall keeps "The only color is the one you choose." as its H2.
  8. Performance: the Google Fonts stylesheet is non-blocking (preload-as-style with onload swap and a noscript fallback), Fraunces is requested at weight 400 only with the opsz and SOFT ranges the page actually uses, and Instrument Sans at 400 and 500 only (the 600 cart badge became 500). The hero preload was updated to the navy file with all three candidates and the same imagesizes as the <img>. Every srcset gained the 400w twin and small renders use it exclusively, taking the 375px image total from about 1.17MB to about 540KB.
  9. Accessibility: .announce carries role="region" aria-label="Announcements" so all content is inside a landmark. It stays outside <header> so the sticky header does not carry the announcement with it.

Critic points not taken, with the reason:

Verified after the pass: headless Chrome captures at 375px (via a 375px iframe) and 1440px show the new hero order and fold, the navy lead, the real-colour roundel, the tile wall with the navy tile outlined, all three review photos, and a tap on the green tile swapping the detail figure, recoloring the thread and moving aria-current. Greps: <h1 1, uppercase 0, carousel|autoplay 0, fetchpriority="high" 1, needlepoint 0, seven distinct variant ids, six data-placeholder="review", one aggregate, one sku, 25 images all with srcset, sizes, width, height and alt, 26 unique image paths all present on disk, 55.6KB.

Post-revision patch by the lead (17:50)

The Google Fonts link used the preload-as-style swap, which Lighthouse still modelled as render-blocking (FCP 3.4s, performance 82). Switched to <link rel="stylesheet" media="print" onload="this.media='all'"> with the same <noscript> fallback. Lighthouse mobile performance 99, LCP 2.3s. No visual change.