/* Turnberry Open — design tokens and primitives.
   Rationale, measurements, and the reasoning behind every value: DESIGN.md
   Palette is measured from the artwork: python3 tools/palette.py */

@font-face {
  font-family: 'Anton';
  src: url('/assets/fonts/anton.woff2') format('woff2');
  font-weight: 400;
  font-display: swap;
}
@font-face {
  font-family: 'Karla';
  src: url('/assets/fonts/karla.woff2') format('woff2');
  font-weight: 300 800;
  font-display: swap;
}
@font-face {
  font-family: 'JetBrains Mono';
  src: url('/assets/fonts/jetbrains-mono.woff2') format('woff2');
  font-weight: 400 700;
  font-display: swap;
}
/* Oswald + Instrument Serif come from the Claude Design reframe. Self-hosted
   like the rest: the design loaded them from Google, which this site does not
   do. Latin subsets, verified for basic-latin coverage rather than assumed --
   the first woff2 Google's css2 returns is a non-Latin subset and grabbing it
   yields an 8KB file that renders nothing. */
@font-face {
  font-family: 'Oswald';
  src: url('/assets/fonts/oswald.woff2') format('woff2');
  font-weight: 200 700;
  font-display: swap;
}
@font-face {
  font-family: 'Instrument Serif';
  src: url('/assets/fonts/instrument-serif.woff2') format('woff2');
  font-weight: 400;
  font-display: swap;
}

:root {
  /* Measured. Do not hand-tune without re-running tools/palette.py. */
  --ground: #14140f;
  --ground-lift: #23231b;
  --ground-deep: #0e0e0a;
  --stock: #f4f1ea;
  --stock-warm: #fbfaf6;
  --ink: #14140f;
  --green: #1f6f4a;
  --orange: #e8622a;
  --mute-warm: #8a8778;
  --mute-cool: #cdc9bb;
  --gold: #e8c060;
  --ember: #c4562b;
  --sage: #a8b090;

  /* --gold is a DARK-GROUND accent: 7.6:1 on the teal, 1.41:1 on the cream.
     It shipped unflipped, so every year label, section link and price on the
     light theme was effectively invisible. --accent is the theme-aware one;
     --gold stays literal only where it is a BACKGROUND under ink text. */
  --brass: #1f6f4a;   /* design's green reads 5.8:1 on the warm white */

  --fg: var(--stock);
  --bg: var(--ground);
  --muted: color-mix(in srgb, var(--stock) 62%, var(--ground));
  --rule: color-mix(in srgb, var(--sage) 34%, transparent);
  --accent: var(--gold);

  --display: 'Oswald', 'Haettenschweiler', 'Arial Narrow', sans-serif;
  --body: 'Oswald', ui-sans-serif, system-ui, sans-serif;
  --serif: 'Instrument Serif', Georgia, 'Times New Roman', serif;
  --mono: 'JetBrains Mono', ui-monospace, 'SFMono-Regular', monospace;

  /* 1.25 major third from 16px; display steps set by hand so the condensed
     face keeps its proportion at size. */
  --t-xs: 0.8rem;
  --t-sm: 0.9rem;
  --t-base: 1rem;
  --t-md: 1.25rem;
  --t-lg: 1.563rem;
  --t-xl: 1.953rem;
  --t-2xl: 2.75rem;
  --t-3xl: 4rem;
  --t-4xl: clamp(3.5rem, 11vw, 8.5rem);

  --sp-1: 0.25rem;
  --sp-2: 0.5rem;
  --sp-3: 0.75rem;
  --sp-4: 1rem;
  --sp-6: 1.5rem;
  --sp-8: 2rem;
  --sp-12: 3rem;
  --sp-16: 4rem;
  --sp-24: 6rem;

  --measure: 62ch;
  --radius: 2px;
  --ease: cubic-bezier(0.2, 0.7, 0.2, 1);
}

/* Light mode inverts the same measured pair — paper as ground, teal as ink.
   Not a second palette, the same one the other way up. */
@media (prefers-color-scheme: light) {
  :root {
    --fg: var(--ink);
    --bg: var(--stock);
    --muted: color-mix(in srgb, var(--ink) 58%, var(--stock));
    --rule: color-mix(in srgb, var(--ground) 26%, transparent);
    --accent: var(--brass);
  }
}
:root[data-theme='dark'] {
  --fg: var(--stock);
  --bg: var(--ground);
  --muted: color-mix(in srgb, var(--stock) 62%, var(--ground));
  --rule: color-mix(in srgb, var(--sage) 34%, transparent);
  --accent: var(--gold);
}
:root[data-theme='light'] {
  --fg: var(--ink);
  --bg: var(--stock);
  --muted: color-mix(in srgb, var(--ink) 58%, var(--stock));
  --rule: color-mix(in srgb, var(--ground) 26%, transparent);
  --accent: var(--brass);
}

*,
*::before,
*::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--body);
  font-size: var(--t-base);
  line-height: 1.6;
  font-synthesis-weight: none;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3 {
  font-family: var(--display);
  font-weight: 400;
  line-height: 0.92;
  letter-spacing: 0.01em;
  text-transform: uppercase;
  margin: 0;
}

h1 { font-size: var(--t-4xl); }
h2 { font-size: var(--t-3xl); }
h3 { font-size: var(--t-xl); }

p { max-width: var(--measure); margin: 0 0 var(--sp-4); }

a { color: inherit; text-underline-offset: 0.2em; }
a:hover { text-decoration-color: var(--accent); }

/* The year is the ordering device, so it gets the utility face everywhere:
   eyebrow, label, anchor, URL. No invented 01/02/03 sequence. */
.year {
  font-family: var(--mono);
  font-size: var(--t-sm);
  letter-spacing: 0.08em;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}

.eyebrow {
  font-family: var(--mono);
  font-size: var(--t-xs);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
}

.rule { border: 0; border-top: 1px solid var(--rule); margin: var(--sp-12) 0; }

.wrap {
  width: min(100% - 2 * var(--sp-6), 78rem);
  margin-inline: auto;
}

/* --- The rack -----------------------------------------------------------
   The gallery is a print rack, not a card grid: posters stand in slots seen
   slightly edge-on, the way they sit in a shop. Scrolling moves along it.
   The 1965 -> 2026 span reads as physical distance, which a grid flattens. */

.rack {
  display: flex;
  gap: var(--sp-4);
  padding: var(--sp-12) var(--sp-6) var(--sp-16);
  overflow-x: auto;
  scroll-snap-type: x proximity;
  perspective: 1600px;
  scrollbar-color: var(--sage) transparent;
}

.slot {
  flex: 0 0 auto;
  scroll-snap-align: center;
  position: relative;
  background: var(--ground-lift);
  padding: var(--sp-3) var(--sp-3) var(--sp-6);
  border-radius: var(--radius);
  box-shadow: inset 0 1px 0 color-mix(in srgb, var(--stock) 12%, transparent);
}

.slot__poster {
  display: block;
  width: clamp(9rem, 22vw, 15rem);
  /* height:auto is load-bearing. The <img> carries width/height attributes as
     presentational hints; overriding only width left height pinned at 1536px,
     so aspect-ratio never drove the box and every poster rendered as a tall
     cropped strip. */
  height: auto;
  aspect-ratio: 2 / 3;      /* canonical. Matches the print master exactly. */
  object-fit: cover;
  background: var(--ground-deep);
  transform: rotateY(-9deg);
  transform-origin: left center;
  transition: transform 420ms var(--ease), box-shadow 420ms var(--ease);
  box-shadow: 0 12px 28px -12px var(--ground-deep);
}

.slot:hover .slot__poster,
.slot:focus-within .slot__poster {
  transform: rotateY(0deg) translateY(-10px);
  box-shadow: 0 26px 50px -18px var(--ground-deep);
}

.slot a:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; }

/* Founding pieces sit apart from the unbroken 1986-2026 run. The gap does the
   explaining, so no label has to. */
.slot--founding { margin-right: var(--sp-16); }
.slot--founding .year { color: var(--ember); }

/* One orchestrated moment: the rack settles left to right on load, so the first
   thing the page does is show its own shape. */
@keyframes settle {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}
.rack .slot {
  animation: settle 520ms var(--ease) both;
  animation-delay: calc(var(--i, 0) * 28ms);
}

.btn {
  display: inline-block;
  font-family: var(--mono);
  font-size: var(--t-sm);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  padding: var(--sp-3) var(--sp-6);
  color: var(--ink);
  background: var(--gold);
  border-radius: var(--radius);
  transition: transform 160ms var(--ease), background 160ms var(--ease);
}
.btn:hover { background: var(--stock-warm); transform: translateY(-2px); }
.btn:focus-visible { outline: 2px solid var(--stock); outline-offset: 3px; }

.sold { color: var(--ember); }

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  /* The rack must read with zero motion: flatten the slots rather than leaving
     them mid-rotation. */
  .slot__poster { transform: none; }
}

@media (max-width: 40rem) {
  .rack { padding-inline: var(--sp-4); }
  .slot__poster { transform: none; }
}

/* --- chrome ------------------------------------------------------------- */

.visually-hidden,
.skip:not(:focus) {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.skip:focus {
  position: fixed; inset: var(--sp-3) auto auto var(--sp-3);
  z-index: 10; padding: var(--sp-3) var(--sp-4);
  background: var(--gold); color: var(--ink); border-radius: var(--radius);
}

.masthead {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-6); padding-block: var(--sp-6);
}

/* Mask rather than <img> or cross-document <use>: keeps the wordmark on
   currentColor so it inverts with the theme, while staying one cached file. */
.logo {
  display: block;
  width: clamp(7rem, 14vw, 11rem);
  aspect-ratio: 375.55 / 200;
  background: currentColor;
  -webkit-mask: url('/assets/logo/turnberry-open.svg') center / contain no-repeat;
  mask: url('/assets/logo/turnberry-open.svg') center / contain no-repeat;
}

.masthead__nav {
  display: flex; align-items: center; gap: var(--sp-5);
  font-family: var(--mono); font-size: var(--t-sm);
  letter-spacing: 0.08em; text-transform: uppercase;
}
.masthead__nav a { text-decoration: none; }
/* 44px hit area without changing the type size — the nav shipped at 23px
   tall, which is a miss on a phone even when the label reads fine. */
.masthead__nav a { display: inline-flex; align-items: center; min-height: 44px; padding-inline: 2px; }
.masthead__nav a:hover { color: var(--accent); }
.masthead__nav a:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }

.footer {
  padding-block: var(--sp-16) var(--sp-12);
  border-top: 1px solid var(--rule);
  margin-top: var(--sp-24);
}
.footer__note { color: var(--muted); font-size: var(--t-sm); }

picture { display: contents; }

/* --- product ------------------------------------------------------------ */

.poster { display: grid; gap: var(--sp-12); padding-block: var(--sp-12); }
@media (min-width: 56rem) {
  .poster { grid-template-columns: 1.1fr 1fr; align-items: start; }
}
.poster__art img { width: 100%; height: auto; border-radius: var(--radius); }
.poster__title { font-size: var(--t-3xl); margin-block: var(--sp-2) var(--sp-4); }

.skus { list-style: none; padding: 0; margin: var(--sp-6) 0; }
.sku {
  display: flex; justify-content: space-between; gap: var(--sp-4);
  padding: var(--sp-3) 0; border-top: 1px solid var(--rule);
  font-family: var(--mono); font-size: var(--t-sm);
}
.sku:last-child { border-bottom: 1px solid var(--rule); }
.sku__price { color: var(--accent); font-variant-numeric: tabular-nums; }

.price {
  font-family: var(--mono); font-size: var(--t-lg);
  color: var(--accent); font-variant-numeric: tabular-nums;
  margin-block: var(--sp-4) var(--sp-6);
}

/* The shirt block leads with the back at full width. Every front is the same
   wordmark on a different colour — front-first makes 42 shirts look like one. */
.buy--tee {
  display: grid; gap: var(--sp-12);
  width: min(100% - 2 * var(--sp-6), 78rem); margin-inline: auto;
  padding-block: var(--sp-16); border-top: 1px solid var(--rule);
}
@media (min-width: 56rem) {
  .buy--tee { grid-template-columns: 1.2fr 1fr; align-items: center; }
}
.buy__art img { width: 100%; height: auto; border-radius: var(--radius); }

.pager {
  display: flex; justify-content: space-between; align-items: center;
  gap: var(--sp-6); padding-block: var(--sp-12);
  border-top: 1px solid var(--rule);
}
.pager a { text-decoration: none; display: grid; gap: var(--sp-1); }
.pager a:hover .year { color: var(--stock-warm); }

.chips { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-block: var(--sp-6); }
.chip {
  font-family: var(--mono); font-size: var(--t-xs); letter-spacing: 0.1em;
  text-transform: uppercase; text-decoration: none;
  padding: var(--sp-2) var(--sp-4); border: 1px solid var(--rule);
  border-radius: var(--radius);
}
.chip--on { background: var(--gold); color: var(--ink); border-color: var(--gold); }
.chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }

.hero { padding-block: var(--sp-24) var(--sp-12); }
.hero__lede { font-size: var(--t-md); color: var(--muted); margin-block: var(--sp-6); }

.feature { display: grid; gap: var(--sp-12); padding-block: var(--sp-12); }
@media (min-width: 56rem) { .feature { grid-template-columns: 1fr 1fr; align-items: center; } }
.feature__art img { width: 100%; height: auto; border-radius: var(--radius); }

.lore { padding-block: var(--sp-12) var(--sp-16); }
.lore__note { font-size: var(--t-sm); color: var(--muted); font-style: italic; }

/* --- browse grids -------------------------------------------------------
   The rack is right for a taste on the homepage and wrong for "show me all
   44" — a horizontal scroll means 44 swipes on a phone. Grids scan. */

.catalog-head { padding-block: var(--sp-16) var(--sp-6); }
.catalog-head h1 { margin-block: var(--sp-3); }
.catalog-head__lede { color: var(--muted); max-width: 46ch; }

.grid {
  display: grid;
  gap: var(--sp-8) var(--sp-6);
  grid-template-columns: repeat(2, 1fr);
  padding-block: var(--sp-6) var(--sp-24);
}
@media (min-width: 40rem) { .grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 64rem) { .grid { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 84rem) { .grid { grid-template-columns: repeat(5, 1fr); } }

.card { display: block; text-decoration: none; }
.card__art { overflow: hidden; border-radius: var(--radius); }
.card__art img {
  display: block; width: 100%; height: auto;
  transition: transform 380ms var(--ease);
}
/* Posters keep their true 2:3. Shirt mockups are near-square and keyed, so
   they need room to breathe rather than a crop. */
.card__art--print img { aspect-ratio: 2 / 3; object-fit: cover; }
/* Mockups come back near-square (~0.98) while poster cards are 2:3, so a
   shirt row rendered about half the height of a poster row and the $36.95
   product read as an afterthought next to the $24.95 one. Cropping to 4:5
   scales by height and trims the empty backdrop at the SIDES -- the garment
   is centred, so nothing of the shirt is cut. */
.card__art--tee { background: color-mix(in srgb, var(--stock) 7%, transparent); }
.card__art--tee img { aspect-ratio: 4 / 5; object-fit: cover; }

.card:hover .card__art img { transform: scale(1.03); }
.card:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; }

.card__meta {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: var(--sp-3); padding-top: var(--sp-3);
}
.card__price {
  font-family: var(--mono); font-size: var(--t-xs);
  color: var(--muted); font-variant-numeric: tabular-nums;
}
.card__sub {
  display: block; font-family: var(--mono); font-size: var(--t-xs);
  letter-spacing: 0.08em; text-transform: uppercase; color: var(--muted);
}

.btn--ghost {
  background: transparent; color: var(--fg);
  box-shadow: inset 0 0 0 1px var(--rule);
  margin-left: var(--sp-3);
}
.btn--ghost:hover { background: color-mix(in srgb, var(--gold) 18%, transparent); }

@media (max-width: 40rem) {
  .masthead { flex-wrap: wrap; gap: var(--sp-3); }
  .masthead__nav { gap: var(--sp-4); font-size: var(--t-xs); }
  .btn--ghost { margin-left: 0; margin-top: var(--sp-3); }
}

/* The collection sheet gets its own feature block — it is the only piece that
   shows the whole 1965-2026 span, which is the thing that makes this a
   collection rather than 44 separate posters. */
.feature--collection { padding-block: var(--sp-16); }
.feature--collection .feature__art { display: block; text-decoration: none; }
.feature--collection .feature__art img {
  width: 100%; height: auto; border-radius: var(--radius);
  box-shadow: 0 18px 44px -22px var(--ground-deep);
  transition: transform 380ms var(--ease);
}
.feature--collection .feature__art:hover img { transform: translateY(-4px); }
.feature--collection .feature__art:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; }


/* --- commerce homepage ---------------------------------------------------
   The previous homepage sold nothing above the fold: a headline, a paragraph,
   no product, no price, no shirts, and a rack that rendered as two posters on
   a phone. This leads with the goods and the price. */

.hero2 {
  display: grid;
  gap: var(--sp-8);
  padding-block: var(--sp-12) var(--sp-16);
  align-items: center;
}
@media (min-width: 56rem) {
  .hero2 { grid-template-columns: 1fr 1fr; gap: var(--sp-12); }
}
.hero2__copy { width: min(100% - 2 * var(--sp-6), 40rem); margin-inline: auto; }
@media (min-width: 56rem) {
  .hero2__copy { margin-inline: 0 auto; padding-left: max(var(--sp-6), calc((100vw - 78rem) / 2)); }
}
.hero2 h1 { font-size: clamp(2.75rem, 9vw, 5rem); margin-block: var(--sp-3) var(--sp-4); }
.hero2__lede { color: var(--muted); font-size: var(--t-md); margin-bottom: var(--sp-4); }
.hero2__price {
  display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-6);
  font-family: var(--mono); font-size: var(--t-sm);
  letter-spacing: 0.04em; color: var(--muted); margin-bottom: var(--sp-6);
}
.hero2__price strong { color: var(--accent); font-weight: 700; }
.hero2__cta { display: flex; flex-wrap: wrap; gap: var(--sp-3); }

/* A staggered spill of real posters — the catalogue as the hero image, rather
   than an empty column or a horizontally-scrolling rack showing two of 44. */
.hero2__art {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--sp-3);
  padding-inline: var(--sp-6);
}
@media (min-width: 56rem) { .hero2__art { padding-right: max(var(--sp-6), calc((100vw - 78rem) / 2)); padding-left: 0; } }
.hero2__tile img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 2 / 3; object-fit: cover;
  border-radius: var(--radius);
  box-shadow: 0 14px 34px -20px var(--ground-deep);
}
.hero2__tile--1, .hero2__tile--4 { transform: translateY(var(--sp-6)); }
.hero2__tile--2, .hero2__tile--5 { transform: translateY(calc(var(--sp-6) * 2)); }

/* Three columns is a contact sheet on a phone: six posters at ~100px each,
   where the hero's whole job is to show that the artwork is worth $24.95.
   Below the split, drop to a 2x2 of four posters at ~155px and flatten the
   stagger, which was tuned for the three-column rhythm. */
@media (max-width: 55.999rem) {
  .hero2__art { grid-template-columns: repeat(2, 1fr); gap: var(--sp-4); }
  .hero2__tile--4, .hero2__tile--5 { display: none; }
  .hero2__tile--1, .hero2__tile--2 { transform: none; }
  .hero2__tile--1, .hero2__tile--3 { transform: translateY(var(--sp-5)); }
}

/* Two product paths, side by side. Shirts were previously invisible on the
   homepage despite being half the catalogue. */
.paths { display: grid; gap: var(--sp-6); padding-block: var(--sp-8); }
@media (min-width: 48rem) { .paths { grid-template-columns: 1fr 1fr; gap: var(--sp-8); } }
/* Card surface derives from the CURRENT foreground, so it is always a subtle
   tint of the page rather than a fixed dark colour. The previous rule put a
   media query inside a selector list, which is invalid CSS and killed the whole
   block — the dark card background then applied on the cream page with ink
   text on top of it. Unreadable in exactly the theme most people are in. */
.path {
  display: block; text-decoration: none;
  background: color-mix(in srgb, var(--fg) 6%, transparent);
  border: 1px solid var(--rule);
  border-radius: var(--radius); overflow: hidden;
  transition: transform 260ms var(--ease), background 260ms var(--ease);
}
.path:hover { background: color-mix(in srgb, var(--fg) 10%, transparent); }
.path:hover { transform: translateY(-3px); }
.path:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
.path__art img { display: block; width: 100%; height: auto; }
.path__art--tee { background: color-mix(in srgb, var(--stock) 6%, transparent); }
.path__meta { padding: var(--sp-5) var(--sp-6) var(--sp-6); }
.path__meta h2 { font-size: var(--t-2xl); margin-bottom: var(--sp-2); }
.path__meta p { color: var(--muted); font-size: var(--t-sm); margin-bottom: var(--sp-3); }
.path__go {
  font-family: var(--mono); font-size: var(--t-sm);
  letter-spacing: 0.06em; color: var(--accent);
}

.sec-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--sp-4); padding-block: var(--sp-12) var(--sp-4);
  border-bottom: 1px solid var(--rule);
}
.sec-head h2 { font-size: var(--t-2xl); }
.sec-head__all {
  display: inline-flex; align-items: center; min-height: 44px;
  font-family: var(--mono); font-size: var(--t-sm);
  letter-spacing: 0.06em; text-decoration: none; color: var(--accent);
  white-space: nowrap;
}
.grid--home { padding-block: var(--sp-6) var(--sp-4); }

.lore { padding-block: var(--sp-16); }
.lore__line { color: var(--muted); max-width: 54ch; margin-top: var(--sp-3); }

/* The collection block was 1fr 1fr with short text, so half the row was empty
   cream on desktop. Give the art the room and let the text sit tight. */
@media (min-width: 56rem) {
  .feature--collection { grid-template-columns: minmax(0, 22rem) 1fr; align-items: center; }
}


/* Section heads carry a subline, so the grid below has context without a
   paragraph above it. */
.sec-head { flex-wrap: wrap; }
.sec-head__sub {
  flex: 1 1 100%; order: 3;
  font-family: var(--mono); font-size: var(--t-xs);
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--muted); margin: var(--sp-2) 0 0;
}

/* Card meta must never inherit a surface colour it cannot be read on — the
   Prints/Shirts cards shipped black-on-blue because the card background was a
   fixed dark value while the text stayed page-foreground. */
.path__meta h2, .path__meta p, .path__go { color: var(--fg); }
.path__go { color: var(--accent); }

/* ---------------------------------------------------------------------------
   Pro Shop (Claude Design reframe, option 1e)
   Two doors, a filter rail, price and size on every tile.
   --------------------------------------------------------------------------- */

.doors {
  display: grid; gap: 1px; background: var(--rule);
  border-block: 1px solid var(--rule);
}
@media (min-width: 48rem) { .doors { grid-template-columns: 1fr 1fr; } }
.door {
  display: flex; gap: var(--sp-5); align-items: center;
  padding: var(--sp-8) var(--sp-6);
  background: var(--bg); text-decoration: none; color: var(--fg);
  transition: background 240ms var(--ease);
}
.door:hover { background: color-mix(in srgb, var(--fg) 4%, var(--bg)); }
/* posterImg puts the class on the <img>, so the <picture> wrapper is what
   actually flexes — leaving it unstyled let the 1994 poster grow to fill the
   row and crush the shirt door next to it. Constrain the wrapper. */
.door > picture, .door > .door__art { display: block; width: 9rem; flex: none; }
.door > picture img, img.door__art { display: block; width: 100%; height: auto; }
.door h2 { font-size: var(--t-3xl); text-transform: uppercase; margin: var(--sp-2) 0; }
.door__eyebrow {
  font-family: var(--mono); font-size: var(--t-xs); letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--green); margin: 0;
}
/* Orange measures 3.00:1 on the warm white and 5.46:1 on the ink, so it is a
   DARK-ground accent only. On a light panel it gets the green instead. */
.door__eyebrow--warm { color: var(--green); }
.door__note { color: var(--muted); font-size: var(--t-sm); margin: 0 0 var(--sp-4); max-width: 34ch; }

.btn--green { background: var(--green); color: #fff; }
.btn--green:hover { background: var(--ink); }
.btn--ink { background: var(--ink); color: var(--stock); }
.btn--ink:hover { background: var(--green); }

.shop { display: grid; gap: 0; }
@media (min-width: 56rem) { .shop { grid-template-columns: 14rem 1fr; } }

.rail {
  padding: var(--sp-6);
  border-bottom: 1px solid var(--rule);
  display: grid; gap: var(--sp-6);
  align-content: start;
}
@media (min-width: 56rem) {
  .rail { border-bottom: 0; border-right: 1px solid var(--rule); position: sticky; top: 0; height: 100vh; overflow-y: auto; }
}
.rail__group { display: grid; gap: var(--sp-2); }
.rail__label {
  font-family: var(--mono); font-size: var(--t-xs); letter-spacing: 0.18em;
  text-transform: uppercase; color: var(--muted); margin: 0 0 var(--sp-1);
}
.chip {
  display: flex; justify-content: space-between; align-items: center;
  min-height: 44px; padding: 0 var(--sp-3);
  background: transparent; color: var(--fg);
  border: 1px solid var(--rule); border-radius: 2px;
  font-family: var(--display); font-size: var(--t-xs); font-weight: 500;
  letter-spacing: 0.12em; text-transform: uppercase; text-align: left;
  cursor: pointer; transition: background 160ms var(--ease), color 160ms var(--ease);
}
.chip:hover { border-color: var(--fg); }
.chip[aria-checked='true'] { background: var(--ink); color: var(--stock); border-color: var(--ink); }
.chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.chip__n { font-family: var(--mono); font-size: 0.65rem; opacity: 0.65; }

.shop__main { padding: var(--sp-6); }
.shop__head {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: var(--sp-4); margin-bottom: var(--sp-5);
}
.shop__head h2 { font-size: var(--t-2xl); text-transform: uppercase; }
.shop__count { font-family: var(--mono); font-size: var(--t-sm); color: var(--muted); margin: 0; }

.tiles { display: grid; gap: var(--sp-5); grid-template-columns: repeat(2, 1fr); }
@media (min-width: 40rem) { .tiles { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 72rem) { .tiles { grid-template-columns: repeat(4, 1fr); } }
.tiles__empty { font-family: var(--mono); font-size: var(--t-sm); color: var(--muted); }

.tile { border: 1px solid var(--rule); background: var(--bg); display: flex; flex-direction: column; }
.tile:hover { border-color: var(--fg); }
.tile[hidden] { display: none; }
.tile__art { display: block; overflow: hidden; background: color-mix(in srgb, var(--fg) 5%, transparent); }
.tile__art img { display: block; width: 100%; height: auto; }
.tile__art--print img { aspect-ratio: 2 / 3; object-fit: cover; }
/* Mockups come back near-square while posters are 2:3; cropping to 4:5 stops a
   shirt row rendering at half the height of a poster row. */
.tile__art--tee img { aspect-ratio: 4 / 5; object-fit: cover; }
.tile__meta { padding: var(--sp-3); display: flex; flex-direction: column; gap: var(--sp-2); flex: 1; }
.tile__row { display: flex; justify-content: space-between; align-items: baseline; }
.tile__year { font-family: var(--mono); font-size: var(--t-md); font-weight: 500; }
.tile__price { font-family: var(--mono); font-size: var(--t-sm); color: var(--muted); }
.tile__sub {
  font-family: var(--mono); font-size: var(--t-xs); letter-spacing: 0.1em;
  color: var(--muted); margin: 0;
}
.tile__opts { display: flex; gap: var(--sp-1); list-style: none; padding: 0; margin: 0 0 auto; }
.tile__opts li {
  flex: 1; text-align: center; border: 1px solid var(--rule);
  padding: var(--sp-1) 0; font-family: var(--mono); font-size: 0.62rem;
  color: var(--muted);
}
.tile__buy {
  display: block; text-align: center; min-height: 44px; line-height: 44px;
  background: var(--green); color: #fff; text-decoration: none;
  font-family: var(--display); font-size: var(--t-xs); font-weight: 500;
  letter-spacing: 0.14em; text-transform: uppercase;
}
.tile__buy:hover { background: var(--ink); }
.tile__buy:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.collection-strip {
  display: flex; align-items: center; gap: var(--sp-6); flex-wrap: wrap;
  padding-block: var(--sp-8); border-top: 1px solid var(--rule);
}
.collection-strip img { display: block; width: 9rem; height: auto; border: 1px solid var(--rule); }
.collection-strip > div { flex: 1 1 18rem; }
.collection-strip h2 { font-size: var(--t-2xl); text-transform: uppercase; }
.collection-strip p { color: var(--muted); margin: var(--sp-2) 0 0; font-family: var(--serif); font-size: var(--t-md); }
