Concept 04 · The Deal

"Cards, not tiles, all the way down."

Thesis

Cards are the interface. Every product, price tier, edition and colorway on the page is a card in the brand's real proportions, with a version of the real dotted-star border and real corner indices. The seven sweater colorways are a dealt hand you pick from; the bundle ladder is three hands of increasing size (one card; a card with racks and a bag; a spread of five); reviews sit on plain card faces with the Modern Edition suit art in the corner. The page never uses a rectangle it could have made a card. The comparison table and the footer are plainly not products and stay plain.

The card component

Fonts

Colour

The single motion moment

On load the hero hand deals in: all seven cards start stacked upright at the centre, faded out, and rotate into their fan positions. CSS keyframes only, 550ms per card with a 70ms stagger by distance from the centre, so the deal finishes in about 760ms. prefers-reduced-motion: reduce disables it and shows the static fan. When the last card lands, JS removes the deal class so the static transform rule owns the layout.

Nothing else animates on scroll. Button hover is a 120ms background change; the toast is a 150ms fade. Tapping a card reorders it instantly (no transition), by design.

Hero composition

Section decisions

  1. Announcement: two static messages on a blush band. Header: blue roundel plus "Play Away" in Unbounded; six nav items visible from 1100px; search, cart with a count, hamburger below 1100px. Announcement plus header is 99px at 375.
  2. Drawer: a native <dialog> opened with showModal() (focus trap, inert background and Escape come from the platform). "Shop the sweater" card at the top, six items at 48px.
  3. Category: four portrait cards (booth photo, Italy bar fan, kraft gift box, racks with bag).
  4. Colorway wall: seven deep-linked cards plus an eighth info card ("$95 from", sizes, one line). 2-up at 375, 4-up from 720, one dealt row of eight at 1200 with 1 to 2 degree tilts. One CTA below.
  5. Ladder: three tier cards. Cards only (one real render, text link "Start with the Beach deck"), Complete Set (real card, bag card and the racks-in-play photo front and centre; navy ring; "Most tables"; the only filled button, "Build my Complete Set"), Table Set (five-card spread with the gift box in front; $199.90 struck; "The gift"; text link). Hands are 112px cards at 375 and 124px at 900+. Prices are the big top-left indices. Stacked at 375, three columns at 900.
  6. Editions: five cards, Beach first, 76vw with a peek and scroll snap at 375, five across at 900. Index is the position number over the edition name. Open-tray photo inside the frame, edition roundel as a seal; Summit has no roundel so its seal is a CSS circle.
  7. Cards vs tiles: real card render next to a CSS-drawn grey tile silhouette, captioned as drawn. Five-row table. The three original benefits are h3 microcopy, no icons.
  8. Learn to play: two ringed cards, read time as the index.
  9. Table talk: plain cards, no ring. Aggregate card first (data-placeholder="aggregate"), six review cards (data-placeholder="review") with inline SVG stars and a tile SVG in the corner, three photo cards. 1-up at 375 with auto-height quote cards (full 300px measure) and 4:3 photo cards; 3-up portrait from 720, 5-up from 1100.
  10. Join the table: one landscape card, navy ring, "Oct 1 / drop day" index, labelled email field, "Deal me in", trust strip.
  11. Footer: Shop (six plus gift cards), Help, Company (Wholesale, Instagram), second newsletter form, payment methods as text, no raw URLs.

Interactions and Shopify stand-ins

Accessibility

Skip link, header/nav[aria-label]/main/footer, one h1, h2 per section, h3 children (tier names are visually hidden h3s). :focus-visible 3px accent outline. Labelled inputs. Icon buttons have aria-label. Hand cards are <button aria-pressed> with full-name labels; wall cards are links with full-name labels. Stars are role="img" with a text rating. Every image has alt (empty where the parent carries the name). No text sits over photography.

Assumptions

Photography gaps and how they were handled

Performance

Self-check

<h1 1 · uppercase 0 · carousel|autoplay 0 · fetchpriority="high" 1 · 7 unique variant ids · 63 unique image paths, all present on disk · 6 data-placeholder="review" · whole-word "hat" 0 · 50 <img>, 0 without alt or width/height, 6 without srcset (the SVG tiles), 2 without lazy (logo and front card, DOM positions 1 and 2) · document scrollWidth 375 at 375 and 1440 at 1440.

Checked visually with headless Chrome at a true 375px and 1440px through an iframe harness (desktop Chrome clamps windows to about 500px), including a simulated tap that moved Lavender/Purple to the front and rewrote the CTA.

Revision (after the critique)

Changed:

  1. Hero labels: back cards show the first colour word only, set vertically along the exposed edge; the front card carries the full name; rotation step reduced to 5.5 degrees at 1440 for a 70px strip. No label is clipped at 375 or 1440.
  2. Ladder: "Build my Complete Set" is the only filled button; Cards only and Table Set are accent text links. Hands enlarged to 112/124px cards; the racks-in-play photo leads the Complete Set hand.
  3. Palette: Summit ring to navy #17264A, Modern ring to baby blue #6BABFF.
  4. Density: the whole review section (aggregate, quotes, photos) lost its star ring and is plain white cards.
  5. Review measure: 1-up at 375 with auto-height quote cards; portrait grids resume at 720.
  6. H1 changed to "Pick your hand."; lede rewritten so it does not repeat it; h1 weight 600.
  7. Performance: non-blocking font stylesheet with noscript fallback; front card first in DOM with fetchpriority="high" and an image preload; six back cards lazy; -400 twins added everywhere (45 candidates) and used as the only source under 300px; fixed a desktop overflow (a 4:3 aspect ratio on photo cards inside the 5-column grid) found while re-verifying; h1 <br> and metric-adjusted fallbacks for CLS.
  8. Linter: tile SVGs carry width, height and alt; only two images are non-lazy and both are in the first viewport.

Not taken, with reasons: