/* Grainpress — Templates. Template-specific layout: homepage, article, section, search, membership. Implementation: Phase 3. */

/* ============================================================
   HOMEPAGE — home.hbs
   Composition-specific layout only.
   Shared component rules live in components.css.
   ============================================================ */

/* The 1200px content zone is owned by the global .container primitive in
   layout.css and derived from the locked --container / --page-margin tokens.
   Templates no longer reconstruct it. */

/* ----------------------------------------
   Section header
   Shared across all homepage sections:
   title + 2px rule + optional subtitle
---------------------------------------- */

.home-section-header {
  border-bottom: 2px solid var(--gp-text);
  padding-bottom: var(--space-2);
  margin-bottom: var(--space-6);
}

.home-section-header__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 28px;
  line-height: 1.5;
  letter-spacing: -0.24px;
  color: var(--gp-text);
  text-transform: uppercase;
  margin: 0;
}

.home-section-header__sub {
  margin: var(--space-2) 0 0 0;
}

/* ----------------------------------------
   Hero
   Full-bleed lead story with dark image overlay,
   section label at top, title/deck/meta at bottom
---------------------------------------- */

/* The hero is the homepage's own opening composition, not part of the shared
   masthead family. Three corrections, all fluid so it needs no breakpoint:
   width now tracks the responsive page inset instead of running full-bleed
   below 1200 purely because max-width stopped binding; height eases off the
   fixed 772px, which at 360 left only 15px of slack over its own content; and
   the inner padding relaxes so the text is not squeezed into a 184px column
   on a phone. At 1440 all three resolve to their approved values. */
.home-hero {
  position: relative;
  height: clamp(520px, 53.6vw, 772px);
  overflow: hidden;
  width: min(var(--canvas-width), calc(100% - 2 * var(--canvas-margin)));
  margin: 43px auto 0;
}

.home-hero__image-wrap {
  position: absolute;
  inset: 0;
}

.home-hero__image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.home-hero__overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 0.2) 0%,
    rgba(0, 0, 0, 0.5) 50%,
    rgba(0, 0, 0, 0.95) 100%
  );
}

.home-hero__inner {
  position: absolute;
  inset: 0;
  padding: clamp(24px, 5vw, 64px);
  display: flex;
  flex-direction: column;
}

.home-hero__label {
  display: inline-block;
  align-self: flex-start;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1;
  letter-spacing: 1.68px;
  color: white;
  text-transform: uppercase;
  text-decoration: none;
  padding: 8px 12px;
  background-color: rgba(255, 255, 255, 0.1);
  border: 1px solid rgba(255, 255, 255, 0.2);
}

.home-hero__body {
  margin-top: auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  max-width: 832px;
}

/* Homepage-specific display type, deliberately separate from the shared
   masthead scale. Holds 80px to ~900, then scales for fit to a 40px floor
   that keeps the hero a substantial opening statement. -0.025em is exactly
   -2px at 80px, so desktop tracking is unchanged. */
.home-hero__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(36px, 8.1vw, 73px);
  line-height: 0.92;
  letter-spacing: -0.025em;
  color: white;
  margin: 0;
}

.home-hero__title a {
  color: inherit;
  text-decoration: none;
}

.home-hero__title a:hover {
  opacity: 0.9;
}

.home-hero__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 23px;
  line-height: 1.5;
  color: rgba(255, 255, 255, 0.95);
  margin: 0;
  padding: 24px 28px;
  background-color: rgba(0, 0, 0, 0.3);
  border-left: 4px solid var(--gp-zones);
  max-width: 680px;
}

.home-hero__meta {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.4;
  letter-spacing: 0.7px;
  color: rgba(255, 255, 255, 0.8);
  text-transform: uppercase;
  margin: 0;
}

.home-hero__sep {
  color: rgba(255, 255, 255, 0.5);
}

/* ----------------------------------------
   Highlights
   Two-column layout: primary feature card (left)
   and up to three compact secondary items (right)
---------------------------------------- */

.home-highlights__grid {
  display: grid;
  grid-template-columns: 589px 1fr;
  gap: 0 var(--space-6);
  align-items: start;
}

.home-highlights__secondary {
  border-left: 1px solid var(--gp-text);
  padding-left: var(--space-5);
  display: flex;
  flex-direction: column;
}

/* Card-feature byline — not in Phase 2 base component */
.card-feature__byline {
  margin: 0;
}

/* ----------------------------------------
   Highlight item
   Compact secondary story: small square thumbnail + label + title + author
---------------------------------------- */

.home-highlight-item {
  display: flex;
  gap: var(--space-5);
  padding: var(--space-5) 0;
}

.home-highlight-item + .home-highlight-item {
  border-top: 1px solid rgba(26, 24, 22, 0.12);
}

.home-highlight-item__thumb {
  flex-shrink: 0;
  width: 135px;
  height: 115px;
  overflow: hidden;
  display: block;
}

.home-highlight-item__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.home-highlight-item__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  justify-content: center;
}

.home-highlight-item__label {
  display: block;
}

.home-highlight-item__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 21px;
  line-height: 1.3;
  letter-spacing: -0.16px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.home-highlight-item__title:hover {
  opacity: 0.75;
}

.home-highlight-item__author {
  margin: 0;
}

/* ----------------------------------------
   Homepage secondary inset grid
   Latest, Materials & Tools + Practice, and Selected Work sit on a working
   axis stepped inward from the outer editorial canvas. Figma BUILD 1440 —
   Home v3 (529:686) places that axis at x=196.5 / 197 / 198 with right edges
   at ~1254 / ~1249 / 1242, i.e. ~76px inside each side of the 1200 canvas.
   One shared value, so the three sections cannot drift apart; Highlights and
   the hero deliberately stay on the full canvas.

   76px at 1440 is 6.3333% of the canvas, and above 1440 the canvas is
   83.3333vw, so holding that proportion is exactly 5.2778vw — the inset keeps
   growing with the canvas instead of letting these sections fall back to
   full-canvas width. Below 1440 the first term governs and eases the inset
   out linearly, reaching 0 at 1040 where the existing responsive layout
   starts genuinely needing the width (Selected Work drops to two across
   there). The two terms cross at exactly 1440, so this is continuous at every
   width and adds no breakpoint of its own:
     1040 -> 0    1280 -> 45.6    1440 -> 76    1600 -> 84.4    1920 -> 101.3
---------------------------------------- */

:root {
  --home-inset: max(0px, min(19vw - 197.6px, 5.2778vw));
}

.home-inset {
  padding-left: var(--home-inset);
  padding-right: var(--home-inset);
}

/* ----------------------------------------
   Latest
   Full-width news band; 2px borders top and bottom;
   two-column grid of compact news items
---------------------------------------- */

.home-latest {
  padding: 0;
}

.home-latest .container {
  border-top: 2px solid var(--gp-text);
  border-bottom: 2px solid var(--gp-text);
  padding-top: var(--space-8);
  padding-bottom: var(--space-8);
}

.home-latest__grid {
  columns: 2;
  column-gap: var(--space-8);
}

/* ----------------------------------------
   News item
   Compact headline + date row with bottom rule
---------------------------------------- */

.home-news-item {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-5) var(--space-4);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
  break-inside: avoid;
}

.home-news-item:last-child {
  border-bottom: none;
}

.home-news-item__title {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 22px;
  line-height: 1.3;
  letter-spacing: -0.17px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.home-news-item__title:hover {
  opacity: 0.75;
}

.home-news-item__date {
  display: block;
}

/* ----------------------------------------
   Materials & Tools + Practice
   Two-column editorial block: materials left (wider),
   practice + zones right (narrower)
---------------------------------------- */

.home-editorial__layout {
  display: grid;
  /* Proportional, not fixed 551px/415px: the pair now fills the inset grid,
     so it tracks the canvas above 1440 instead of freezing at 1046px and
     drifting off the shared axis. At 1440 this resolves to 552/416, which is
     the approved composition to within a pixel. */
  grid-template-columns: minmax(0, 551fr) minmax(0, 415fr);
  gap: 0 var(--space-9);
  align-items: start;
}

.home-features-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-8);
}

/* Homepage features: 28px SemiBold headline (Figma: 28px) */
.home-editorial__features .card-feature__title {
  font-size: 32px;
  font-weight: 600;
  letter-spacing: -0.28px;
}

/* ----------------------------------------
   Practice panel
   Soft-tinted container for 3 practice items
---------------------------------------- */

/* Between the width the editorial pair stops fitting comfortably and the width
   it stacks, Technique runs longer than the image-led Materials column beside
   it, leaving a ragged block of white space against Have a Look -- clearly
   visible on an iPad around 1230px. Dropping Technique to two items shortens
   that column towards its neighbour rather than moving the imbalance somewhere
   else. Desktop keeps all three, and below 901px the columns stack full width
   where a third item costs nothing. */
@media (min-width: 901px) and (max-width: 1280px) {
  .home-practice-panel .home-practice-item:nth-child(3) {
    display: none;
  }

  /* The rule belongs between items. With the third hidden the second is last,
     so its divider would trail under the panel with nothing beneath it. */
  .home-practice-panel .home-practice-item:nth-child(2) {
    padding-bottom: 0;
    border-bottom: 0;
  }
}

.home-practice-panel {
  background-color: rgba(230, 227, 223, 0.3);
  border: 1px solid rgba(26, 24, 22, 0.12);
  padding: 33px;
  margin-bottom: var(--space-5);
}

.home-practice-item {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding-top: var(--space-5);
}

.home-practice-item:first-child {
  padding-top: 0;
}

.home-practice-item--ruled {
  padding-bottom: var(--space-5);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.home-practice-item__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 24px;
  line-height: 1.2;
  letter-spacing: -0.2px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.home-practice-item__title:hover {
  opacity: 0.75;
}

.home-practice-item__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.7);
  margin: 0;
}

/* Chip variant with soft olive bg (practice panel context) */
.chip--soft {
  background-color: rgba(107, 112, 87, 0.15);
  border-color: rgba(107, 112, 87, 0.3);
  align-self: flex-start;
}

/* ----------------------------------------
   Zones teaser
   Dark product module for the Zones iOS app
---------------------------------------- */

.home-zones-teaser__header {
  background-color: var(--gp-text);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 24px;
}

.home-zones-teaser__wordmark {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 19px;
  line-height: 1;
  letter-spacing: -0.16px;
  color: var(--gp-bg);
  text-transform: uppercase;
}

.home-zones-teaser__buy {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 13px;
  line-height: 1;
  letter-spacing: 0.96px;
  color: var(--gp-text);
  background-color: var(--gp-zones);
  text-decoration: none;
  text-transform: uppercase;
  padding: 4px 8px;
  display: inline-block;
}

.home-zones-teaser__buy:hover {
  opacity: 0.85;
}

.home-zones-teaser__body {
  padding: 24px;
  background-color: rgba(230, 227, 223, 0.1);
  border: 1px solid rgba(26, 24, 22, 0.12);
  border-top: none;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}

.home-zones-teaser__desc {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.75);
  margin: 0;
}

.home-zones-teaser__app-btn {
  display: block;
  background-color: var(--gp-accent);
  color: var(--gp-bg);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 14px;
  line-height: 1;
  letter-spacing: 1.34px;
  text-transform: uppercase;
  text-decoration: none;
  text-align: center;
  padding: 13px 24px;
  border-radius: 2px;
}

.home-zones-teaser__app-btn:hover {
  opacity: 0.85;
}

/* ----------------------------------------
   Homepage composition — responsive states
   The three fixed desktop compositions, each moved at its own measured strain
   point rather than forced onto one breakpoint. Every threshold used here is
   one the theme already defines; none is new.

   Editorial split (551 + 415 + 80 = 1046 intrinsic) exceeds the content area
   at 1280 and overflowed the viewport below 1046. It becomes proportional at
   1280, keeping the approved 551:415 emphasis, and stacks at 900 where the
   practice column reaches ~276px.

   Highlights (589 + flexible) starved its secondary column: it floored at
   273px from 1120, leaving only 89px of text beside the fixed 135px thumb.
   It becomes two equal columns at 1140 — the large feature card still reads
   as primary against the compact list — and stacks at 900.

   Selected Work (4 x 233 + 3 x 37 = 1043 intrinsic) exceeds the content area
   at 1283. Its tracks become proportional at 1280 and drop to two across at
   1040, where four would fall below ~180px. It stays a teaser module with its
   approved portrait crop; the dedicated Member Work rules are not applied.
---------------------------------------- */

@media (max-width: 1140px) {
  .home-highlights__grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  }
}

@media (max-width: 900px) {
  .home-editorial__layout {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-8) 0;
  }

  .home-highlights__grid {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-7) 0;
  }

  /* Stacked, the secondary list no longer sits beside the feature card, so
     its dividing rule becomes an indent with nothing to divide. */
  .home-highlights__secondary {
    border-left: 0;
    padding-left: 0;
  }
}

/* ----------------------------------------
   Selected Work
   Four-column portrait-orientation member photography grid
---------------------------------------- */

.home-selected-work__grid {
  display: grid;
  /* Proportional rather than fixed 4 x 233 tracks centred in the container:
     the four photographs now fill the inset grid, which reproduces ~233px at
     1440 and keeps them on the shared axis as the canvas grows. The former
     1280 rule that swapped fixed tracks for proportional ones is folded in
     here, since the base is now proportional at every width. Teaser module:
     the approved portrait crop and the equal standing of the four photographs
     are unchanged, and the dedicated Member Work rules are not applied. */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 37px;
}

/* Two across at 1040, where four would fall below ~180px. */
@media (max-width: 1040px) {
  .home-selected-work__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.home-selected-work__img {
  aspect-ratio: 3 / 4;
}

.card-selected-work__gear {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.6);
  margin: 0;
  text-decoration: none;
}

/* ----------------------------------------
   Subscribe / Contact Sheet CTA
   Sage-tinted band; centered heading, body, and three links
---------------------------------------- */

.home-subscribe {
  background-color: #d7dcc4;
  padding: var(--space-10) 0;
  text-align: center;
}

.home-subscribe .container {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.home-subscribe__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 48px;
  line-height: 1.1;
  letter-spacing: -1.1px;
  color: var(--gp-text);
  margin: 0 0 var(--space-5) 0;
}

.home-subscribe__body {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 22px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
  max-width: 695px;
  margin: 0 0 var(--space-7) 0;
}

/* Rendered on every surface through signup-block in default.hbs, so this is a
   shared component despite the home- prefix. The row is four fixed-width
   actions with a 64px gap (~474px intrinsic) and no wrap, which overflowed at
   phone widths. Wrapping is unconditional: at 1440 the row still fits on one
   line, so desktop is unchanged. */
.home-subscribe__links {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: var(--space-5) var(--space-8);
  list-style: none;
  margin: 0;
  padding: 0;
}

.home-subscribe__link {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 16px;
  line-height: 1.48;
  letter-spacing: 1.28px;
  color: var(--gp-accent);
  text-decoration: none;
  text-transform: uppercase;
  border-bottom: 2px solid var(--gp-accent);
  padding-bottom: 4px;
}

.home-subscribe__link:hover {
  opacity: 0.8;
}

/* ============================================================
   ARTICLE TEMPLATE — post.hbs
   ============================================================ */

/* ----------------------------------------
   Article header
   Reading-column inner container
---------------------------------------- */

.article-header {
  /* Vertical rhythm unchanged. The horizontal inset is the shared outer
     margin: this header is not inside .container, so without it the title
     ran to the viewport edge below 720px. At 1440 the 720px inner is still
     centred in 1200px of available width, so desktop is unaffected. */
  padding: var(--space-7) var(--canvas-margin);
}

.article-header__inner {
  max-width: var(--reading-width);
  margin: 0 auto;
}

.article-header__kicker {
  font-size: 15px;
  letter-spacing: 1.68px;
  color: var(--gp-accent);
  margin-bottom: var(--space-4);
  display: block;
}

.article-header__title {
  font-family: var(--font-display);
  font-weight: 700;
  /* CORRECTION PASS: 64px -> 58px, and the flat size becomes a clamp in the
     same idiom the section/home mastheads already use. The cap holds 58px at
     390 and up, so every accepted composition from phone to 1920 is the plain
     58px. The ramp was reaching that cap by 390, so a phone still carried the
     full desktop title; it now climbs across the phone/small-tablet range
     instead -- ~44px at 390, ~50px at 540, reaching the 58px cap at ~768 and
     holding it from tablet up. That also clears the pre-existing narrow-width
     defect where a long title word ran past the viewport (56px of document
     overflow at the accepted 64px, 23px at a flat 58px, none now).
     Tracking is in em so it stays proportional at every size. */
  font-size: clamp(44px, 3.7vw + 29.6px, 58px);
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--gp-text);
  margin: 0 0 var(--space-5) 0;
}

/* CORRECTION PASS: down from 26px. It stays above the 22px body and keeps
   its tighter 1.5 leading and muted colour, so it still reads as a standfirst
   without competing with the article title. */
.article-header__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 24px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.85);
  margin: 0 0 var(--space-5) 0;
}

.article-header__byline {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding-bottom: var(--space-5);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.article-byline__author {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 17px;
  line-height: 1.4;
  letter-spacing: 1.12px;
  color: var(--gp-text);
  text-transform: uppercase;
}

.article-byline__date,
.article-byline__reading-time {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.4;
  color: rgba(26, 24, 22, 0.6);
}

.article-byline__sep {
  font-family: var(--font-mono);
  font-size: 17px;
  line-height: 1.4;
  color: rgba(26, 24, 22, 0.4);
}

/* ----------------------------------------
   Lead image
   The 1200px content zone — outside and wider than the reading column.
   Matches the 1200px width its srcset declares.
---------------------------------------- */

.article-lead-image {
  max-width: calc(var(--canvas-width) + 2 * var(--canvas-margin));
  margin: 0 auto var(--space-3);
  padding: 0 var(--canvas-margin);
}

.article-lead-image img {
  width: 100%;
  height: auto;
  display: block;
}

.article-lead-image__caption {
  max-width: var(--reading-width);
  margin: var(--space-3) auto 0;
  border-left: 2px solid rgba(26, 24, 22, 0.12);
  padding-left: 18px;
  color: rgba(26, 24, 22, 0.6);
}

/* ----------------------------------------
   Article body
   720px reading column; Ghost content cards below
---------------------------------------- */

.article-body {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  column-gap: var(--content-gutter);
  width: min(var(--canvas-width), calc(100% - (2 * var(--canvas-margin))));
  max-width: var(--canvas-width);
  margin: 0 auto;
  padding-top: var(--space-7);
  padding-bottom: var(--space-10);
}

/* The 8-of-12 allocation decides where prose sits and --reading-measure caps
   how wide it gets, and the two now agree: the allocation is 792px and the cap
   is the 790px masthead axis, so the cap takes a pixel off each side rather
   than pulling the column in off its own grid. The canvas keeps growing past
   both. Centring uses justify-self rather than auto margins because the
   heading rules below set the margin shorthand, which would silently reset
   margin-inline and leave headings off the prose axis. */
.article-body > * {
  grid-column: 1 / -1;
  min-width: 0;
  width: 100%;
  max-width: var(--reading-measure);
  justify-self: center;
}

.article-body h2 {
  font-size: 36px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.32px;
  /* margin: var(--space-8) 0 var(--space-5) 0; */
  margin: var(--space-8) 0 0;
}

.article-body h3 {
  font-size: 30px;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.26px;
  margin: var(--space-7) 0 var(--space-4) 0;
}

.page-zones .article-body h3 {
  margin: var(--space-0) 0 var(--space-4) 0;
}

.article-body h3.header-zones {
  margin: var(--space-8) 0 var(--space-4) 0;
}

.article-body h4 {
  font-size: 25px;
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: -0.21px;
  margin: var(--space-6) 0 var(--space-3) 0;
}

/* Article heading spacing — h2 through h6.
   A heading belongs to the text it introduces, so the space below it stays
   tighter than the space above it. Both are set against the pull quote, which
   is the other interruption in the prose column, so the two read as one rhythm
   rather than two.

   The quote's box opens 72px of clear air above it: the preceding paragraph's
   own 24px bottom margin plus the quote's 48px top margin. A heading's top
   margin is that same 48px, so a heading and a quote break the column with the
   same gap. Beneath, a heading takes 16px — half the paragraph rhythm, enough
   to separate it from its text without letting it float free of it.

   Scoped to the post article (post.hbs wraps the body in `.article`) so
   standard Pages keep the 64px section top margin their composed layouts rely
   on — see `.page-content .article-body h2` and its first-child reset below.

   Both values are custom properties: the pull quote steps down at 760px, and
   headings step with it just below. */
.article .article-body {
  --heading-space-above: var(--space-7);
  --heading-space-below: var(--space-4);
}

.article .article-body h2,
.article .article-body h3,
.article .article-body h4,
.article .article-body h5,
.article .article-body h6 {
  margin: var(--heading-space-above) 0 var(--heading-space-below) 0;
}

/* The pull quote takes its own step down here — 48px/80px margins become
   40px/56px — so the heading gap follows it by the same proportion (48 -> 40,
   x0.833) rather than standing at full desktop height beside a quote that has
   contracted. 16px -> 12px keeps the tighter side on the token scale. */
@media (max-width: 760px) {
  .article .article-body {
    --heading-space-above: 40px;
    --heading-space-below: var(--space-3);
  }
}

.article-body ul,
.article-body ol {
  padding-left: var(--space-5);
  margin-bottom: var(--space-5);
}

.article-body li {
  margin-bottom: var(--space-2);
  line-height: var(--article-body-line);
}

.article-body blockquote:not(.kg-blockquote-alt) {
  border-left: 4px solid var(--gp-panel);
  padding-left: var(--space-5);
  margin: var(--space-6) 0;
  color: rgba(26, 24, 22, 0.8);
}

/* Pull quote — kg-blockquote-alt rendered by Ghost editor */
.article-body .kg-blockquote-alt {
  border-left: 4px solid var(--gp-zones);
  padding-left: var(--space-6);
  margin: var(--space-8) 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 27px;
  line-height: 1.4;
  letter-spacing: -0.28px;
  color: var(--gp-text);
}

.article-body figure.kg-image-card {
  margin: var(--space-7) 0;
}

.article-body .kg-image {
  width: 100%;
  height: auto;
  display: block;
}

/* Audio card — add breathing room below the player */
.article-body .kg-audio-card {
  margin-bottom: var(--space-7);
}

/* Figcaption border treatment within article body */
.article-body figcaption {
  border-left: 2px solid rgba(26, 24, 22, 0.12);
  padding-left: 18px;
  margin-top: var(--space-3);
  color: rgba(26, 24, 22, 0.6);
}

/* Wide image — spans 10 columns on the standard page grid. */
.article-body .kg-width-wide {
  grid-column: 2 / span 10;
  width: 100%;
  max-width: none;
  justify-self: stretch;
}

/* Full-width media — breaks out of the 12-column grid to the page edge.
   The viewport-escape in base.css (width:100vw + negative 50vw margins) is the
   standard Ghost technique for normal block flow, but it does not work on a
   grid item: the offsets resolve against the item's own grid area, which lands
   the card off-axis and pushes the page into horizontal overflow.
   Spanning the full grid and pulling out by exactly one page margin is exact at
   every width and uses no vw, so scrollbar width can never overflow the page.
   Below 1440 this resolves to the full viewport; at and above 1440 it resolves
   to the locked 1440 site frame. */
.article-body .kg-width-full,
.article-body figure.kg-width-full {
  grid-column: 1 / -1;
  position: static;
  left: auto;
  right: auto;
  width: auto;
  max-width: none;
  justify-self: stretch;
  /* The figure selector is carried on this rule so the horizontal pull-out
     also outranks `.article-body figure.kg-image-card`, whose margin shorthand
     would otherwise reset it to 0 and leave the card at plain grid width.
     Vertical rhythm is deliberately left to that rule. */
  margin-left: calc(-1 * var(--canvas-margin));
  margin-right: calc(-1 * var(--canvas-margin));
}

/* ----------------------------------------
   Responsive reading measure
   The desktop composition places body content in 8 of the 12 columns and
   wide media in 10. Below the desktop band those fixed allocations spend a
   growing share of the grid on side gutters: measured with the old fixed
   margins the measure fell to 344px / 36ch at 768 before the 760 rule
   snapped it back to 652px, a ~308px discontinuity.

   Widening the allocation in two steps keeps the measure between roughly
   62ch and 79ch across the whole intermediate range and halves each step.
   Thresholds are the measured points at which each allocation drops to
   ~60ch, and 1140 is also where --page-margin-fluid begins relaxing, so the
   two foundations move together. Placement stays a grid concern, so the
   gp-span / gp-grid-span utilities and every existing margin rule inside the
   article are untouched.
---------------------------------------- */

@media (max-width: 1140px) {
  .article-body .kg-width-wide,
  .article-body figure.kg-width-wide {
    grid-column: 1 / -1;
  }
}

/* ----------------------------------------
   Related Reading
   Three article links below the body
---------------------------------------- */

/* This aside is a direct child of .article with no padded ancestor, so
   max-width alone gave it no responsive frame: it only ever produced the
   incidental centring margin (viewport - measure) / 2, which is not the page
   margin, and collapsed to zero the moment the viewport was narrower than the
   measure -- leaving the heading, labels, titles and bylines flush at x=0 on
   every phone width. The fix is the same width idiom .article-body already
   uses, so the block is bounded by the shared --canvas-margin instead of a
   Related Reading value of its own: the reading measure where there is room
   for it, the page frame where there is not. The border-top belongs to this
   content frame and now aligns with it. Desktop is unchanged -- the measure
   still wins down to ~830px. */
.article-related {
  width: min(var(--reading-width), calc(100% - 2 * var(--canvas-margin)));
  margin: 0 auto;
  padding-top: var(--space-7);
  padding-bottom: var(--space-10);
  border-top: 2px solid rgba(26, 24, 22, 0.2);
}

.article-related__heading {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 19px;
  line-height: 1.5;
  letter-spacing: -0.16px;
  color: var(--gp-text);
  text-transform: uppercase;
  margin: 0 0 var(--space-6) 0;
}

.article-related__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

.article-related-item {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  text-decoration: none;
}

.article-related-item:hover .article-related-item__title {
  opacity: 0.75;
}

.article-related-item__label {
  font-size: 13px;
  letter-spacing: 1.56px;
  color: var(--gp-accent);
  display: block;
}

.article-related-item__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 25px;
  line-height: 1.25;
  letter-spacing: -0.22px;
  color: var(--gp-text);
  display: block;
  transition: opacity 0.15s;
}

.article-related-item__author {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.4;
  letter-spacing: 0.7px;
  color: rgba(26, 24, 22, 0.6);
  text-transform: uppercase;
  display: block;
}

/* ----------------------------------------
   Article body paragraph spacing
---------------------------------------- */

.article-body p {
  margin-bottom: var(--space-5);
}

.article-body p:last-child {
  margin-bottom: 0;
}

/* ----------------------------------------
   Article drop cap
---------------------------------------- */

/* The drop cap is theme furniture, in the same class as the eyebrow, byline,
   read time and the GP end mark: nothing is written into a manuscript and
   nothing changes in the publisher. It is simply the first letter of the first
   paragraph of the rendered body, so it appears on every article — existing
   ones included — without any content being touched.

   `p:first-of-type` rather than `:first-child` so an article that opens with a
   lead image, a pull quote or a heading still caps its first paragraph of prose.

   Sized in em against the article body, which is 22px at every viewport with no
   mobile step-down (see --article-body-size in tokens.css), so the cap tracks
   the prose at every breakpoint and needs no responsive rule of its own.

   Three lines deep: the body stacks 1.6em per line, so a 3-line cap clears
   4.8em. Newsreader's cap height is about 0.70em, hence a 6.86em face held to a
   0.70 line-height — that keeps the floated box exactly three lines tall while
   the glyph itself reads three lines tall. Both are custom properties because
   the last of that is an optical judgement, not an arithmetic one.

   No colour is declared: ::first-letter inherits it, so the cap follows the
   prose into dark mode with no second declaration here. */
.article .article-body {
  --dropcap-size: 6.86em;
  --dropcap-height: 0.7;
  --dropcap-gap: 0.06em;
  --dropcap-shift: -0.02em;
}

/* Grid items already establish an independent formatting context, so the float
   is contained by its paragraph rather than leaking into the next one. This
   states it explicitly, so the drop cap stays contained if .article-body ever
   stops being a grid. A short opening paragraph therefore grows to hold the
   letter instead of letting the following paragraph wrap around it. */
.article .article-body > p:first-of-type {
  display: flow-root;
}

.article .article-body > p:first-of-type::first-letter {
  float: left;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: var(--dropcap-size);
  line-height: var(--dropcap-height);
  padding-right: var(--dropcap-gap);
  margin-top: var(--dropcap-shift);
}

/* Caption credit — injected by main.js when caption contains " By " */
.caption-credit {
  display: block;
  font-family: var(--font-mono);
  font-style: normal;
  font-size: 15px;
  line-height: 1.4;
  letter-spacing: 0.3px;
  text-transform: uppercase;
  margin-top: 4px;
}

/* ----------------------------------------
   Pull quote — HTML card convention
   Editor enters in Ghost HTML card:

   <aside class="pull-quote">
     <p>Quote text here.</p>
     <cite>Name, Role</cite>
   </aside>

   The native kg-blockquote-alt (Ghost pull quote card) is
   also supported but without a separate cite element.
---------------------------------------- */

.article-body .pull-quote {
  border-left: 4px solid var(--gp-zones);
  padding: var(--space-5) 0 var(--space-5) 32px;
  margin: var(--space-8) auto;
  max-width: 580px;
}

.article-body .pull-quote p {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 27px;
  line-height: 1.4;
  letter-spacing: -0.28px;
  color: var(--gp-text);
  margin: 0 0 var(--space-4) 0;
}

.article-body .pull-quote p:last-child {
  margin-bottom: 0;
}

.article-body .pull-quote cite {
  font-family: var(--font-mono);
  font-weight: 400;
  font-style: normal;
  font-size: 16px;
  line-height: 1.4;
  letter-spacing: 1.12px;
  color: rgba(26, 24, 22, 0.7);
  text-transform: uppercase;
  display: block;
}

/* ----------------------------------------
   Technical Details box — HTML card convention
   Editor enters in Ghost HTML card:

   <div class="technical-details">
     <dl>
       <div><dt>Camera</dt><dd>Leica M6</dd></div>
       <div><dt>Lens</dt><dd>Summicron 35mm f/2</dd></div>
       <div><dt>Film</dt><dd>Kodak Tri-X 400</dd></div>
       <div><dt>Lab</dt><dd>Self-processed in D-76</dd></div>
     </dl>
   </div>

   "Technical Details" heading is injected via ::before to avoid
   editor repetition. Number of rows is unrestricted.
---------------------------------------- */

.article-body .technical-details {
  background-color: rgba(230, 227, 223, 0.2);
  border: 1px solid rgba(26, 24, 22, 0.12);
  padding: 25px;
  margin: var(--space-8) 0;
}

.article-body .technical-details::before {
  content: "Technical Details";
  display: block;
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 14px;
  line-height: 1.75;
  letter-spacing: 1.344px;
  color: rgba(26, 24, 22, 0.7);
  text-transform: uppercase;
  margin-bottom: var(--space-4);
}

.article-body .technical-details dl {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
}

.article-body .technical-details dl > div {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 8px 0 9px;
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.article-body .technical-details dl > div:last-child {
  border-bottom: none;
  padding-bottom: 8px;
}

.article-body .technical-details dt {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.42;
  color: rgba(26, 24, 22, 0.6);
}

.article-body .technical-details dd {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.42;
  color: var(--gp-text);
  margin: 0;
  text-align: right;
}

/* Markdown tables, published as an HTML card. The treatment follows the
   Technical Details card beside it -- tinted panel, hairline rows, mono type at
   the same size -- because both are specification rather than prose, and two
   different table looks in one article would read as two systems. The wrapper
   scrolls rather than the page, so a wide table on a phone stays inside the
   reading column instead of pushing the whole document sideways. */
.article-body .gp-table {
  background-color: rgba(230, 227, 223, 0.2);
  border: 1px solid rgba(26, 24, 22, 0.12);
  padding: 25px;
  /* A table sits in the flow of the argument rather than interrupting it, so
     the space around it is a paragraph break, not a card's. Grid items do not
     collapse margins, so the top is left to the preceding paragraph's own 24px
     and only the bottom is declared -- otherwise the two would stack to 48px
     above and read as double-spaced. */
  margin: 0 0 var(--space-5);
  overflow-x: auto;
}

.article-body .gp-table table {
  width: 100%;
  border-collapse: collapse;
}

.article-body .gp-table th,
.article-body .gp-table td {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.42;
  text-align: left;
  padding: 8px var(--space-5) 9px 0;
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
  vertical-align: baseline;
}

.article-body .gp-table th:last-child,
.article-body .gp-table td:last-child {
  padding-right: 0;
}

/* The header names the columns, so it takes the muted weight the Technical
   Details labels carry, with the rule beneath it doing the separating. */
.article-body .gp-table th {
  color: rgba(26, 24, 22, 0.6);
  text-transform: uppercase;
  letter-spacing: 1.344px;
  font-size: 14px;
  font-weight: 600;
}

.article-body .gp-table td {
  color: var(--gp-text);
}

.article-body .gp-table tbody tr:last-child td {
  border-bottom: none;
  padding-bottom: 8px;
}

.article-body .gp-table__cell--center {
  text-align: center;
}

.article-body .gp-table__cell--right {
  text-align: right;
}

/* ----------------------------------------
   Article end mark — GP
   Injected automatically by post.hbs after {{content}}.
   Renders as a final inline typographic mark below the last paragraph.
---------------------------------------- */

.article-end-mark {
  display: inline;
  font-family: var(--font-body);
  font-weight: 800;
  font-size: 22px;
  line-height: inherit;
  text-transform: uppercase;
  color: var(--gp-text);
  margin-left: var(--space-2);
}

/* ============================================================
   SECTION / ARCHIVE TEMPLATE — tag.hbs
   ============================================================ */

/* ----------------------------------------
   Section hero
   Full-width header with kicker, large title, description
   and 2px rule beneath. Matches Figma Version 3 section pages.
---------------------------------------- */

.section-hero {
  border-bottom: 2px solid var(--gp-text);
  /* Top padding matches .issue-hero (Podcast family) so Department and
     Member Work mastheads start on the same vertical axis as Podcast. */
  padding: var(--space-6) 0 var(--space-7);
}

/* ----------------------------------------
   Shared centred masthead family
   Confluence defines .section-hero (Department/tag, Film & Formats, author,
   Member Work) and .issue-hero (standard Pages, Current Issue, Archive,
   Topics, Search, Podcast) as ONE centred editorial family. The geometry and
   typography they genuinely share are declared once here; each family keeps
   only what actually differs, below. Member Work's wide hero and the Zones
   hero remain approved variants that opt out of the centred inner.
---------------------------------------- */

.section-hero__inner,
.issue-hero__inner {
  max-width: 790px;
  margin-left: auto;
  margin-right: auto;
}

/* Masthead title: holds its desktop size to ~900px, then scales for fit
   rather than miniaturisation, with a floor that keeps the opening statement
   substantial on a phone and clears the measured clipping at 430. Tracking is
   in em so it stays proportional at every size.
   CORRECTION PASS: the whole clamp comes down ~9% (72->66, 8vw->7.3vw,
   38->35) so the masthead sits calmly over the larger body scale. The
   three-part responsive relationship is scaled, not replaced. */
.section-hero__title,
.issue-hero__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(35px, 7.3vw, 66px);
  line-height: 0.95;
  letter-spacing: -0.025em;
  color: var(--gp-text);
  margin: 0;
}

.section-hero__kicker,
.issue-hero__kicker {
  display: block;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  text-transform: uppercase;
  margin: 0 0 var(--space-5) 0;
}

/* Masthead deck: holds 22px to ~956px, where the measurement pass showed
   line count starting to climb (3 -> 4 -> 6 lines by 670px), then eases to a
   17px floor. Combined with the wider content the responsive margin returns,
   this keeps the deck from degrading into a paragraph block. */
.section-hero__desc,
.issue-hero__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: clamp(19px, 2.1vw, 24px);
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.85);
}

/* Family-specific: kicker tracking/colour and deck rhythm differ between the
   two mastheads in the approved desktop design. */

.section-hero__kicker {
  letter-spacing: 1.5px;
  color: rgba(26, 24, 22, 0.5);
}

.section-hero__desc {
  margin: var(--space-5) 0 0 0;
  max-width: 680px;
}

/* ----------------------------------------
   Member Work hero
   A centred masthead with a rail attached to its right. The editorial
   column is anchored to the same 790px axis .section-hero__inner and
   .issue-hero__inner (Podcast) centre on, so Member Work opens on the
   identical x-position as every other masthead; the rail then hangs off
   to its right rather than defining a wider frame of its own.
   Columns: 540 editorial + 48 + 1px rule + 48 + 340 rail = 977.
   At 1440 that runs x=325 → 1302.
   Only /member-work/ opts in — the rail and the anchor are scoped here,
   while typography and vertical rhythm come from the shared .section-hero
   family, which is what keeps the two consistent.
---------------------------------------- */

.member-work-hero {
  /* Derived from the 790px masthead block rather than hardcoded, so the
     editorial column tracks .section-hero__inner automatically if that
     width ever changes. Reset to 0 in the 1080px query below. */
  padding-left: calc((100% - 790px) / 2);
  display: grid;
  grid-template-columns: minmax(0, 540px) 1px 340px;
  gap: 0 var(--space-7);
  align-items: start;
}

.member-work-hero__main .section-hero__desc {
  max-width: 540px;
}

.member-work-hero__divider {
  align-self: stretch;
  background-color: rgba(26, 24, 22, 0.12);
}

/* ----------------------------------------
   Next Theme rail
   Editorial callout for the open submission Theme.
   Content is editable in Ghost: title and description from the
   /member-photo/ Page, deadline from @custom.next_theme_deadline.
---------------------------------------- */

.next-theme {
  background-color: rgba(107, 112, 87, 0.08);
  border: 1px solid rgba(107, 112, 87, 0.3);
  padding: 40px;
}

.next-theme__eyebrow {
  display: block;
  font-size: 14px;
  letter-spacing: 1.5px;
  border-bottom: 1px solid rgba(107, 112, 87, 0.3);
  padding-bottom: var(--space-3);
  margin-bottom: var(--space-5);
}

.next-theme__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 32px;
  line-height: 1.2;
  letter-spacing: -0.28px;
  color: var(--gp-text);
  margin: 0;
}

.next-theme__desc {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
  margin: var(--space-4) 0 0 0;
}

.next-theme__deadline {
  display: block;
  font-size: 14px;
  letter-spacing: 1.5px;
  margin: var(--space-6) 0 0 0;
}

.next-theme__cta {
  display: inline-block;
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 14px;
  line-height: 1;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-accent);
  padding-bottom: var(--space-2);
  margin-top: var(--space-5);
}

.next-theme__cta:hover {
  opacity: 0.75;
}

.next-theme__cta:focus-visible {
  outline: 2px solid var(--gp-text);
  outline-offset: 3px;
}

/* Stack the rail below the editorial column at the existing 1080px
   breakpoint, where the two-column hero stops fitting cleanly. */
@media (max-width: 1080px) {
  .gp-accent-card-grid--4 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .member-work-hero {
    padding-left: 0;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--space-7) 0;
  }
  .member-work-hero__divider {
    display: none;
  }
  .next-theme {
    width: 100%;
    max-width: 340px;
  }
}

/* ----------------------------------------
   Section archive wrapper
   Vertical padding around all post layouts
---------------------------------------- */

.section-archive {
  padding: var(--space-8) 0 var(--space-10);
}

.section-archive__empty {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 21px;
  color: rgba(26, 24, 22, 0.55);
  padding: var(--space-9) 0;
  margin: 0;
}

/* ----------------------------------------
   Section lead — image-led (culture / reviews / practice)
   Side-by-side image + text on desktop; stacks on mobile
---------------------------------------- */

.section-lead {
  display: flex;
  gap: var(--space-6);
  align-items: flex-start;
  padding-bottom: var(--space-8);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
  margin-bottom: var(--space-7);
}

.section-lead--text-only {
  display: block;
}

.section-lead__image {
  flex: 0 0 58%;
  max-width: 58%;
}

.section-lead__body {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding-top: var(--space-2);
}

.section-lead__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.section-lead__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 52px;
  line-height: 1.05;
  letter-spacing: -0.96px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.section-lead__title:hover {
  opacity: 0.75;
}

.section-lead__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 23px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.85);
  margin: 0;
}

.section-lead__meta {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.section-lead__sep {
  color: rgba(26, 24, 22, 0.35);
}

/* ----------------------------------------
   Section secondary — 3-across cards
   Olive left border; image above, meta below
---------------------------------------- */

.section-secondary {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-6);
  margin-bottom: var(--space-8);
}

.section-secondary:empty {
  display: none;
}

.section-secondary__item {
  display: flex;
  flex-direction: column;
}

.section-secondary__image {
  display: block;
}

.section-secondary__body {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-4);
  border-left: 4px solid rgba(107, 112, 87, 0.7);
  background: rgba(230, 227, 223, 0.08);
}

.section-secondary__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.section-secondary__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 30px;
  line-height: 1.3;
  letter-spacing: -0.26px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.section-secondary__title:hover {
  opacity: 0.75;
}

.section-secondary__date {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.55);
  margin-top: auto;
}

/* ----------------------------------------
   Shared archive card family — responsive
   .section-lead and .section-secondary are the reusable archive composition
   used by Department/tag, Film & Formats, author and the Member Work
   selections partial. Both keep their approved desktop hierarchy; only the
   track count and the lead's axis change, at the widths the measurement pass
   showed each becoming implausible.

   Secondary cards: three across hold usable width down to ~900, where they
   fall below 200px; two across then hold to ~540. Deliberately plain,
   unscoped rules, so the later Member Work stage can override the phone
   presentation with a scoped selector without fighting specificity here.

   Lead story: the image is a fixed 58% of the row, so the editorial column is
   what fails first. It stacks at the top of the measured single-column band
   rather than being carried down to the point where the text column is
   unreadable. Image prominence is preserved by giving it the full width.
---------------------------------------- */

@media (max-width: 900px) {
  .section-secondary {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 768px) {
  .section-lead {
    display: block;
  }

  .section-lead__image {
    max-width: none;
    margin-bottom: var(--space-5);
  }
}

@media (max-width: 540px) {
  .section-secondary {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* ----------------------------------------
   Member Work selected photographs — narrow presentation
   Scoped to .member-work-selections, which member-work.hbs and
   member-work-theme.hbs put on the shared selections wrapper. Ghost's
   body_class cannot carry this: it is empty on /member-work/themes/ and on
   /member-work/ it depends on the current Theme tag, so a stable hook has to
   come from the templates.

   The shared card system collapses .section-secondary to one column at 540,
   which for Member Work would render the primary photograph and every
   remaining selection at identical full-container width and destroy the
   primary/secondary hierarchy the Theme pages are required to keep. 540 is
   therefore the width at which Member Work has to diverge, and the locked
   phone treatment is what restores the hierarchy: the primary goes to full
   viewport width at its complete aspect ratio, and the remaining selections
   stay two across.

   Complete aspect matters here in particular. Three of the four live
   selections are portrait (0.67 to 0.99), so the 3:2 card box shows as little
   as 45% of the frame; on a dedicated Theme page the photograph is the
   content, not a card thumbnail.

   The pull-out uses the page margin rather than a viewport unit, so it lands
   exactly on the viewport edge and cannot add document width.
---------------------------------------- */

@media (max-width: 540px) {
  .member-work-selections .section-lead__image {
    /* Complete frame: drop the 3:2 box and let the image set its own height. */
    aspect-ratio: auto;
    /* Full viewport width: deliberate, not accidental overflow. */
    width: auto;
    max-width: none;
    margin-left: calc(-1 * var(--page-margin-fluid));
    margin-right: calc(-1 * var(--page-margin-fluid));
  }

  .member-work-selections .section-lead__image img {
    height: auto;
    object-fit: fill;
  }

  /* Locked: the remaining selections stay two across on phone rather than
     following the shared collapse to one. */
  .member-work-selections .section-secondary {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: var(--space-5);
  }

  /* Two across at 360 leaves a 144px card, and the desktop 26px title with
     16px of padding left only ~108px of text — three lines for a short title.
     The photographs are the locked part of this rule, so the metadata around
     them is what gives: the smallest adjustment that keeps the caption
     readable without touching the grid. */
  .member-work-selections .section-secondary__body {
    padding: var(--space-3);
  }

  .member-work-selections .section-secondary__title {
    font-size: 24px;
    line-height: 1.25;
  }
}

/* The shared Member Work selection presentation walks positions 01-20 and asks
   the collection for each one, so it cannot know in advance which positions a
   Theme filled. Both group containers are therefore emitted unconditionally and
   an unused one collapses: .section-secondary through the existing :empty rule,
   and the More list here, because its own "More" heading is a child and would
   otherwise keep the container non-empty. Scoped to Member Work — the shared
   card system and the homepage are untouched. */
.member-work-selections .section-list:not(:has(.news-row)) {
  display: none;
}

/* ----------------------------------------
   Section list — compact grid below secondary
   "More" heading + archive rows
---------------------------------------- */

.section-list {
  display: flex;
  flex-direction: column;
}

.section-list:empty {
  display: none;
}

.section-list__heading {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.45);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
  padding-bottom: var(--space-3);
  margin: 0 0 0 0;
}

/* ----------------------------------------
   Section news lead panel — news / podcast
   Accent-tinted card for the top story
---------------------------------------- */

.section-news-lead {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  background: rgba(230, 227, 223, 0.18);
  border-left: 4px solid var(--gp-accent);
  padding: var(--space-7) var(--space-7) var(--space-7) var(--space-10);
  margin-bottom: var(--space-8);
}

.section-news-lead__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.section-news-lead__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 64px;
  line-height: 1;
  letter-spacing: -1.2px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.section-news-lead__title:hover {
  opacity: 0.75;
}

.section-news-lead__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 22px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.85);
  margin: 0;
  max-width: var(--reading-measure);
}

.section-news-lead__meta {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.section-news-lead__sep {
  color: rgba(26, 24, 22, 0.35);
}

/* ----------------------------------------
   Section news list
   Archive row list with deck visible
---------------------------------------- */

.section-news-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}

.section-news-list .news-row__deck {
  display: block;
}

/* ----------------------------------------
   Pagination
   Page nav below post lists
---------------------------------------- */

.pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
  padding: var(--space-6) var(--canvas-margin);
}

.pagination-prev,
.pagination-next {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 16px;
  line-height: 1.48;
  letter-spacing: 0.8px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
}

.pagination-prev:hover,
.pagination-next:hover {
  opacity: 0.75;
}

.pagination-info {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 16px;
  line-height: 1.48;
  color: rgba(26, 24, 22, 0.5);
}

/* ============================================================
   CURRENT ISSUE TEMPLATE — custom-current-issue.hbs
   ============================================================ */

/* ----------------------------------------
   Issue page grid
   1200px content width (120px margins at 1440px) — same as homepage grid.
   Applied to both the hero and content containers.
---------------------------------------- */

/* ----------------------------------------
   Issue hero
   Kicker + title + deck, 2px rule beneath.
   Kicker sourced from page Meta Title field in Ghost Admin.
---------------------------------------- */

.issue-hero {
  padding: var(--space-6) 0 var(--space-5);
}

/* Issue-family specifics; shared geometry/typography is in the centred
   masthead family block above. */

.issue-hero__inner {
  border-bottom: 2px solid var(--gp-text);
  padding-bottom: var(--space-7);
}

.issue-hero__kicker {
  letter-spacing: 1.68px;
  color: var(--gp-text-muted);
}

.issue-hero__deck {
  margin: var(--space-6) 0 0 0;
}

.issue-hero__actions {
  margin-top: var(--space-7);
}

/* ----------------------------------------
   Issue contents wrapper
---------------------------------------- */

.issue-contents {
  padding: var(--space-6) 0 var(--space-10);
}

/* ----------------------------------------
   Shared label link styling
   Public tag labels link to their archives.
---------------------------------------- */

.issue-label-link {
  color: inherit;
  text-decoration: none;
}

.issue-label-link:hover {
  text-decoration: underline;
}

/* ----------------------------------------
   Lead story card (post 1)
   Image left 55%, body right 45%.
   White bg with panel border.
---------------------------------------- */

.issue-lead {
  display: flex;
  flex-direction: row;
  background: #fff;
  border: 1px solid var(--gp-panel);
  min-height: 480px;
  margin-bottom: var(--space-8);
}

.issue-lead__image {
  flex: 0 0 55%;
  width: 55%;
}

.issue-lead--text-only .issue-lead__body {
  padding: var(--space-8);
}

.issue-lead__body {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: var(--space-8) 56px;
  gap: var(--space-3);
}

.issue-lead__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.issue-lead__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-lead__review {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-lead__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.9px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.issue-lead__title:hover {
  opacity: 0.75;
}

.issue-lead__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 20px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-lead__meta {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 16px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-lead__sep {
  color: rgba(26, 24, 22, 0.3);
}

/* ----------------------------------------
   "In This Issue" section heading
---------------------------------------- */

.issue-section-heading {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 36px;
  line-height: 1.5;
  letter-spacing: -0.8px;
  color: var(--gp-text);
  margin: 0 0 var(--space-7) 0;
}

/* ----------------------------------------
   2-across image grid (posts 2–3)
---------------------------------------- */

.issue-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-6);
  margin-bottom: var(--space-6);
}

/* Two across held usable tracks down to 296px at 768; below the shared 760
   threshold they fall to 249px and the card title runs to four lines and
   beyond, so the approved image/title/deck/meta hierarchy stops holding.
   Ordering and content model are untouched. */
@media (max-width: 760px) {
  .issue-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* The other two Current Issue compositions are fixed-percentage flex rows
   with heavy fixed padding, and both overflowed <main> before the shared
   system could help: the landscape row (38/31/31 with 40px padding each) is
   down to ~144px of text per column at 900, and the lead row (55/45 with
   112px of horizontal padding) to ~213px. They stack at the widths their own
   geometry fails, which are different from each other.

   Both images sit in a bare .img-wrap and take their height from flex
   stretch, so each needs an explicit ratio once stacked or it collapses to
   nothing. 3 / 2 is the editorial ratio the shared lead and secondary cards
   already use, so stacked Current Issue media matches the rest of the theme. */
@media (max-width: 900px) {
  .issue-lead {
    flex-direction: column;
  }

  .issue-lead__image {
    flex: 0 0 auto;
    width: 100%;
    aspect-ratio: 3 / 2;
  }

  .issue-lead__body {
    padding: var(--space-7) var(--space-6);
  }
}

.issue-grid__item {
  display: flex;
  flex-direction: column;
}

.issue-grid__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-6) 0 0 0;
}

.issue-grid__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.issue-grid__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-grid__review {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-grid__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 28px;
  line-height: 1.2;
  letter-spacing: -0.6px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.issue-grid__title:hover {
  opacity: 0.75;
}

.issue-grid__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-grid__meta {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 15px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-grid__sep {
  color: rgba(26, 24, 22, 0.3);
}

/* ----------------------------------------
   Landscape card (post 4)
   Image left ~38%, body right ~62%.
---------------------------------------- */

.issue-landscape {
  display: flex;
  flex-direction: row;
  border-top: 1px solid var(--gp-panel);
  border-bottom: 1px solid var(--gp-panel);
  min-height: 360px;
  margin-bottom: var(--space-6);
}

.issue-landscape__image {
  flex: 0 0 38%;
  width: 38%;
}

.issue-landscape__body {
  flex: 0 0 31%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 40px;
  gap: var(--space-3);
}

.issue-landscape--text-only .issue-landscape__body {
  flex: 1;
}

.issue-landscape__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.issue-landscape__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-landscape__review {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-landscape__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 32px;
  line-height: 1.2;
  letter-spacing: -0.7px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.issue-landscape__title:hover {
  opacity: 0.75;
}

.issue-landscape__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-landscape__meta {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 16px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-landscape__sep {
  color: rgba(26, 24, 22, 0.3);
}

/* ----------------------------------------
   Landscape news panel (3rd column)
---------------------------------------- */

.issue-landscape__news {
  flex: 1;
  display: flex;
  flex-direction: column;
  border-left: 1px solid var(--gp-panel);
  padding: 40px;
}

/* Declared after the landscape rules so source order carries it. The 38/31/31
   row with 40px padding per column is down to ~144px of text per column at
   900 and overflowed <main> from 640, so it stacks at 1040. The image takes
   its height from flex stretch in the row, so it needs an explicit ratio once
   stacked; 3 / 2 is the editorial ratio the shared cards already use. */
@media (max-width: 1040px) {
  .issue-landscape {
    flex-direction: column;
  }

  .issue-landscape__image {
    flex: 0 0 auto;
    width: 100%;
    aspect-ratio: 3 / 2;
  }

  .issue-landscape__body,
  .issue-landscape__news {
    flex: 0 0 auto;
    padding: var(--space-6);
  }

  .issue-landscape__news {
    border-left: 0;
    border-top: 1px solid var(--gp-panel);
  }
}

.issue-landscape-news__item {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding-bottom: var(--space-5);
}

.issue-landscape-news__item--ruled {
  border-top: 1px solid var(--gp-panel);
  padding-top: var(--space-5);
}

.issue-landscape-news__header {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-3);
}

.issue-landscape-news__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-landscape-news__date {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  white-space: nowrap;
}

.issue-landscape-news__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 24px;
  line-height: 1.3;
  letter-spacing: -0.3px;
  color: var(--gp-text);
  text-decoration: none;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.issue-landscape-news__title:hover {
  opacity: 0.75;
}

.issue-landscape-news__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.issue-landscape-news__more {
  margin-top: auto;
  align-self: flex-end;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 16px;
  color: var(--gp-text-muted);
  text-decoration: none;
}

.issue-landscape-news__more:hover {
  opacity: 0.75;
}

/* ----------------------------------------
   4-across image+text cards (slots 05–08)
---------------------------------------- */

.issue-four-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-5);
  margin-bottom: var(--space-6);
}

.issue-four-grid__item {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--gp-panel);
  overflow: hidden;
}

.issue-four-grid__image {
  aspect-ratio: 5 / 4;
}

.issue-four-grid__body {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-6);
  flex: 1;
}

.issue-four-grid__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.issue-four-grid__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-four-grid__review {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-four-grid__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 24px;
  line-height: 1.2;
  letter-spacing: -0.5px;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.issue-four-grid__title:hover {
  opacity: 0.75;
}

.issue-four-grid__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 18px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-four-grid__meta {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 15px;
  color: rgba(26, 24, 22, 0.55);
  margin: var(--space-1) 0 0 0;
}

/* Four across with 1fr tracks: 1fr floors at min-content, so below ~430 the
   card label alone pushed the row past the container. Two across at 1040 —
   the same point the homepage four-across teaser turns over — and one at 540,
   the threshold the shared secondary cards already use. Both are existing
   thresholds; ordering and content model are untouched. */
@media (max-width: 1040px) {
  .issue-four-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 540px) {
  .issue-four-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.issue-four-grid__sep {
  color: rgba(26, 24, 22, 0.3);
}

/* ----------------------------------------
   2-column thumbnail strip (posts 8+)
---------------------------------------- */

.issue-strip-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--space-6);
  border-top: 1px solid var(--gp-panel);
  margin-bottom: var(--space-6);
}

.issue-strip-grid__row {
  display: flex;
  align-items: flex-start;
  gap: var(--space-6);
  padding: var(--space-5) 0;
  border-bottom: 1px solid var(--gp-panel);
}

.issue-strip-grid__thumb {
  display: block;
  flex-shrink: 0;
  width: 125px;
  height: 125px;
  background: #fff;
  border: 1px solid var(--gp-panel);
  overflow: hidden;
}

.issue-strip-grid__thumb--empty {
  background: var(--gp-panel);
}

.issue-strip-grid__thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.issue-strip-grid__info {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

.issue-strip-grid__eyebrow {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

.issue-strip-grid__label {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-strip-grid__review {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.issue-strip-grid__title {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 22px;
  line-height: 1.5;
  color: var(--gp-text);
  text-decoration: none;
  display: block;
}

.issue-strip-grid__title:hover {
  opacity: 0.75;
}

.issue-strip-grid__meta {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 15px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0;
}

.issue-strip-grid__sep {
  color: rgba(26, 24, 22, 0.3);
}

/* Each strip cell needs 125px of thumbnail plus a 32px row gap before any
   text width exists, and the base track is 1fr, i.e. minmax(auto, 1fr), so it
   floors at min-content — measured at 260px once the longest unbreakable
   title word is included. Two tracks plus the 32px column gap therefore hold
   at 552px against a 312px container at 360, a 240px breach. The two-column
   state is guaranteed to fail once slot-09+ content exists, independent of
   title length. minmax(0, 1fr) rather than 1fr so the single track can shrink
   instead of flooring in turn. It joins the same 760 threshold the rest of
   Current Issue already uses; the block sits here rather than in the earlier
   760 band because that band precedes the .issue-strip-grid base rule and
   would be overridden by it. */
@media (max-width: 760px) {
  .issue-strip-grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* ----------------------------------------
   Issue empty state
---------------------------------------- */

.issue-empty {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 21px;
  color: rgba(26, 24, 22, 0.55);
  padding: var(--space-9) 0;
  margin: 0;
}

/* ============================================================
   ARCHIVE TEMPLATE — custom-archive.hbs
   ============================================================ */

/* ----------------------------------------
   Archive body wrapper
   Vertical padding around featured card + grid.
---------------------------------------- */

.archive-body {
  padding: var(--space-7) 0 var(--space-10);
}

/* ----------------------------------------
   Image placeholder
   Neutral warm fill for issue cards without imagery.
---------------------------------------- */

.archive-img-placeholder {
  position: absolute;
  inset: 0;
  background-color: var(--gp-panel);
}

/* ----------------------------------------
   Featured issue card — Issue 01
   Grid: image left, editorial body right.
   Top rule anchors the archive grid visually.
---------------------------------------- */

.archive-featured {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-7);
  border-top: 2px solid var(--gp-text);
  padding-top: var(--space-6);
  margin-bottom: var(--space-8);
}

.archive-featured__body {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: var(--space-5) 0;
}

.archive-featured__label {
  display: block;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.68px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin-bottom: var(--space-3);
}

.archive-featured__title {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 40px;
  line-height: 1.05;
  letter-spacing: -0.6px;
  color: var(--gp-text);
  text-decoration: none;
  margin: 0 0 var(--space-3) 0;
}

.archive-featured__title:hover {
  color: var(--gp-accent);
}

.archive-featured__meta {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin: 0 0 var(--space-4) 0;
}

.archive-featured__deck {
  font-family: var(--font-body);
  font-size: 21px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.8);
  margin: 0 0 var(--space-6) 0;
}

.archive-featured__cta {
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 15px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border-bottom: 2px solid var(--gp-accent);
  padding-bottom: 3px;
  align-self: flex-start;
}

.archive-featured__cta:hover {
  opacity: 0.75;
}

/* ----------------------------------------
   Past issues grid — 3 columns at desktop.
   Placeholder cards for Issues 02–06.
---------------------------------------- */

.archive-grid {
  border-top: 1px solid var(--gp-panel);
  padding-top: var(--space-6);
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-7) var(--space-6);
}

.archive-card__image-wrap {
  margin-bottom: var(--space-4);
}

.archive-card__label {
  display: block;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin-bottom: var(--space-2);
}

.archive-card__title {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 26px;
  line-height: 1.1;
  letter-spacing: -0.3px;
  color: var(--gp-text);
  margin: 0 0 var(--space-2) 0;
}

.archive-card__meta {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 0.8px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin: 0 0 var(--space-3) 0;
}

.archive-card__deck {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.75);
  margin: 0 0 var(--space-4) 0;
}

.archive-card__cta {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-panel);
  padding-bottom: 2px;
}

.archive-card__cta[aria-disabled="true"] {
  opacity: 0.5;
  cursor: default;
  pointer-events: none;
}

/* ----------------------------------------
   Archive browse strip
   Quiet secondary surface for individual story discovery.
   Centered; should not compete with the issue grid.
---------------------------------------- */

.archive-browse {
  border-top: 1px solid var(--gp-panel);
  padding: var(--space-8) 0 0;
  margin-top: var(--space-7);
  text-align: center;
}

.archive-browse__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 24px;
  line-height: 1.2;
  letter-spacing: -0.2px;
  color: var(--gp-text);
  margin: 0 0 var(--space-3) 0;
}

.archive-browse__body {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.65);
  margin: 0 0 var(--space-5) 0;
}

.archive-browse__links {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-7);
}

.archive-browse__link {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-accent);
  padding-bottom: 2px;
}

.archive-browse__link:hover {
  opacity: 0.75;
}

/* ============================================================
   TOPICS TEMPLATE — custom-topics.hbs
   ============================================================ */

.topics-body {
  padding: var(--space-7) 0 var(--space-10);
}

/* ----------------------------------------
   Topic group — one per editorial subject cluster.
   Strong top rule separates each group; body area
   contains the 3-post card row and the topic link strip.
---------------------------------------- */

.topics-group {
  border-top: 2px solid var(--gp-text);
  padding-top: var(--space-6);
  margin-bottom: var(--space-10);
}

.topics-group__header {
  margin-bottom: var(--space-6);
}

.topics-group__heading {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 28px;
  line-height: 1.5;
  letter-spacing: -0.24px;
  color: var(--gp-text);
  text-transform: uppercase;
  margin: 0 0 var(--space-2) 0;
}

.topics-group__desc {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.65);
  margin: 0;
}

.topics-group__cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-7) var(--space-6);
  margin-bottom: var(--space-6);
}

/* ----------------------------------------
   Topic link strip — horizontal tag archive links
   below each group's card sample.
---------------------------------------- */

.topics-group__links {
  display: flex;
  align-items: center;
  gap: var(--space-5);
  flex-wrap: wrap;
  border-top: 1px solid var(--gp-panel);
  padding-top: var(--space-4);
}

.topics-group__links-label {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 0.8px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin-right: var(--space-2);
}

.topics-group__link {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-accent);
  padding-bottom: 2px;
}

.topics-group__link:hover {
  opacity: 0.75;
}

/* ============================================================
   TAG ARCHIVE TEMPLATE — tag.hbs
   ============================================================ */

/* ----------------------------------------
   Internal tag fallback
   Quiet centered message shown when Ghost exposes visibility="internal".
   Prevents internal operational tag pages from looking like public editorial.
---------------------------------------- */

.tag-fallback {
  padding: var(--space-11) 0 var(--space-10);
  text-align: center;
}

.tag-fallback__message {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 21px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0 0 var(--space-6) 0;
}

.tag-fallback__links {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-7);
  flex-wrap: wrap;
}

.tag-fallback__link {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-accent);
  padding-bottom: 2px;
}

.tag-fallback__link:hover {
  opacity: 0.75;
}

/* ----------------------------------------
   Empty state
   Shown when a tag has no published posts yet.
   Includes navigation links so the reader is not stranded.
---------------------------------------- */

.tag-empty {
  padding: var(--space-9) 0 var(--space-8);
  text-align: center;
}

.tag-empty__message {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 21px;
  color: rgba(26, 24, 22, 0.55);
  margin: 0 0 var(--space-6) 0;
}

.tag-empty__links {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-7);
  flex-wrap: wrap;
}

.tag-empty__link {
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-accent);
  padding-bottom: 2px;
}

.tag-empty__link:hover {
  opacity: 0.75;
}

/* ============================================================
   MEMBER WORK — PREVIOUS THEMES — member-work-themes.hbs
   Cards for completed Themes at /member-work/themes/. Each card is one
   internal Theme tag: its Lead photograph, its reader-facing title, and a
   link built from its reader slug. Three across at desktop, matching the
   Archive issue grid so the two back-catalogue surfaces read as a family.
   The masthead comes from the shared .section-hero family; the historical
   Theme route reuses that masthead and the standard selection layout, so
   neither needs styles of its own here.
   ============================================================ */

.theme-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-7) var(--space-6);
}

.theme-card__image {
  display: block;
  margin-bottom: var(--space-4);
}

.theme-card__label {
  display: block;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  margin-bottom: var(--space-2);
}

.theme-card__title {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 26px;
  line-height: 1.1;
  letter-spacing: -0.3px;
  color: var(--gp-text);
  text-decoration: none;
  margin: 0 0 var(--space-2) 0;
}

.theme-card__title:hover {
  opacity: 0.75;
}

.theme-card__deck {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  color: rgba(26, 24, 22, 0.75);
  margin: 0 0 var(--space-3) 0;
}

.theme-card__cta {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  border-bottom: 1px solid var(--gp-panel);
  padding-bottom: 2px;
}

@media (max-width: 1080px) {
  .theme-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* ============================================================
   SEARCH TEMPLATE — custom-search.hbs
   ============================================================ */

.search-body {
  padding: var(--space-7) 0 var(--space-8);
}

/* ----------------------------------------
   Search form
   Bottom-ruled input + mono submit button
---------------------------------------- */

.search-form {
  margin-bottom: var(--space-8);
}

.search-form__label {
  display: block;
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 1.5;
  letter-spacing: 1.5px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.75);
  margin-bottom: var(--space-4);
}

.search-form__row {
  display: flex;
  gap: var(--space-4);
  align-items: stretch;
}

.search-form__input {
  flex: 1;
  /* `flex: 1` is `1 1 0%`, so the basis is already zero -- but a flex item's
     min-width defaults to `auto`, which for an <input> resolves to its
     intrinsic width: the browser default `size=20`, i.e. 20 characters. At
     the 24px scale that is a hard 250px floor, so the row demanded
     250 + 16 + 121.6 = 387.6px however narrow the viewport got, pinning the
     document at 412px and overflowing every phone width. Releasing the
     automatic minimum lets the input take the space that is actually left
     while the button keeps its intended size via its own flex-shrink: 0.
     Scoped to the search input: global input and button sizing are untouched,
     and no type size or page margin changes. */
  min-width: 0;
  font-family: var(--font-body);
  font-size: 24px;
  line-height: 1.5;
  color: var(--gp-text);
  background: transparent;
  border: none;
  border-bottom: 2px solid var(--gp-text);
  padding: var(--space-3) 0;
  outline: none;
  -webkit-appearance: none;
  appearance: none;
}

.search-form__input::placeholder {
  color: rgba(26, 24, 22, 0.35);
}

.search-form__input:focus {
  border-bottom-color: var(--gp-accent);
}

.search-form__input::-webkit-search-cancel-button {
  -webkit-appearance: none;
}

.search-form__button {
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 500;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-bg);
  background: var(--gp-text);
  border: none;
  padding: var(--space-3) var(--space-6);
  cursor: pointer;
  flex-shrink: 0;
  transition: opacity 0.15s;
}

.search-form__button:hover {
  opacity: 0.75;
}

/* ----------------------------------------
   Search results and states
---------------------------------------- */

.search-results {
  min-height: var(--space-9);
}

.search-state {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 21px;
  color: rgba(26, 24, 22, 0.55);
  padding: var(--space-8) 0;
  margin: 0;
}

.search-state--error {
  color: rgba(26, 24, 22, 0.4);
}

.search-list {
  display: flex;
  flex-direction: column;
}

.search-list .news-row__deck {
  display: block;
}

/* Result-type label. The only addition to the result row: the existing header is
   still a left group and a right date, so the Story presentation is unchanged
   apart from the label joining the taxonomy label on the left. Topic and Author
   results reuse the same row with the type label alone. */
.search-result__meta {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
}

.search-result__type {
  color: rgba(26, 24, 22, 0.45);
}

/* ----------------------------------------
   Search initial state
   Shown before any search is run; hidden via HTML `hidden` attribute by JS.
---------------------------------------- */

.search-initial[hidden] {
  display: none;
}

/* Browse by section */

.search-section-browse {
  padding: var(--space-8) 0;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
}

.search-section-browse__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 36px;
  line-height: 1.15;
  letter-spacing: -0.5px;
  color: var(--gp-text);
  margin: 0 0 var(--space-7) 0;
}

.search-section-browse__grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-6);
}

/* The browse grid carries 84px of horizontal padding and border inside each
   track, so its readable width runs well ahead of the track width. Measured
   across the six live cards, every description holds one line down to 960;
   the first wraps at ~940, three of six by 840 and five of six by 800. It
   therefore collapses at 900 — comfortably before the composition reads as
   cramped, and reusing the threshold .section-secondary already claims rather
   than introducing a Search-only breakpoint. The empty state is deliberately
   not moved with it: its chips hold a constant 80px height down to 540, so
   its geometry is under no comparable pressure. */
@media (max-width: 900px) {
  .search-section-browse__grid {
    grid-template-columns: minmax(0, 1fr);
  }
}

.search-section-card {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding: var(--space-6) var(--space-6) var(--space-6) var(--space-7);
  border-left: 4px solid rgba(107, 112, 87, 0.7);
  background: rgba(230, 227, 223, 0.08);
  text-decoration: none;
}

.search-section-card:hover {
  background: rgba(230, 227, 223, 0.16);
}

.search-section-card__name {
  display: block;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 28px;
  line-height: 1.3;
  letter-spacing: -0.3px;
  color: rgba(26, 24, 22, 0.9);
}

.search-section-card__desc {
  display: block;
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
}

/* Browse by topic */

.search-topic-browse {
  padding: var(--space-8) 0;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
}

.search-topic-browse__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 36px;
  line-height: 1.15;
  letter-spacing: -0.5px;
  color: var(--gp-text);
  margin: 0 0 var(--space-7) 0;
}

.search-topic-tags {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
}

.search-topic-tag {
  display: inline-flex;
  align-items: center;
  height: 48px;
  padding: 0 var(--space-6);
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 1;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--gp-accent);
  text-decoration: none;
  border: 1px solid rgba(107, 112, 87, 0.7);
}

.search-topic-tag:hover {
  background: rgba(107, 112, 87, 0.08);
}

/* Recent archive */

.search-recent {
  padding: var(--space-8) 0;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
}

.search-recent__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 36px;
  line-height: 1.15;
  letter-spacing: -0.5px;
  color: var(--gp-text);
  margin: 0 0 var(--space-7) 0;
}

.search-recent__list {
  display: flex;
  flex-direction: column;
}

.search-recent__list .news-row__deck {
  display: block;
}

/* ----------------------------------------
   Search no-results empty state
   Rendered by JS into [data-search-results]
   when a query returns no posts.
---------------------------------------- */

.search-empty {
  padding: var(--space-8) 0;
}

.search-empty__hero {
  text-align: center;
  padding-bottom: var(--space-9);
  border-bottom: 2px solid rgba(26, 24, 22, 0.12);
  margin-bottom: var(--space-9);
}

.search-empty__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 56px;
  line-height: 1.1;
  letter-spacing: -1.3px;
  color: var(--gp-text);
  margin: 0 0 var(--space-5) 0;
}

.search-empty__desc {
  font-family: var(--font-body);
  font-size: 22px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.8);
  margin: 0 0 var(--space-7) 0;
}

/* The box is inline-flex, so it is shrink-to-fit — but shrink-to-fit can
   never go below its own min-content, and with no max-width nothing capped
   the result against the container. min-content here is the query's widest
   unbreakable token, and the 48px side padding plus the 4px rule add a fixed
   100px on top of it. Any token beyond ~15 characters therefore pushed the
   box past the 272px available at 320 (measured: 316.6px for a 17-character
   token, 339.4px for 19, 601.6px for 42 — the last overflowing even at 390).
   Multi-word queries were never affected: they break at spaces and the box
   already collapsed correctly.

   max-width caps the box against the container, and overflow-wrap on the
   echoed query lets a long token break so the text fits inside that cap. The
   query is user content, so both halves are needed. `anywhere` rather than
   `break-word` is deliberate: only `anywhere` reduces min-content, which is
   the measurement the shrink-to-fit box is sized from — `break-word` would
   wrap the glyphs but leave the box computing its width from the unbroken
   token. Padding, rule, tint, centring and type are untouched. */
.search-empty__query-box {
  display: inline-flex;
  max-width: 100%;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-4) var(--space-7);
  border-left: 4px solid rgba(107, 112, 87, 0.7);
  background: rgba(230, 227, 223, 0.18);
  text-align: center;
  margin-bottom: var(--space-6);
}

.search-empty__query-label {
  font-family: var(--font-mono);
  font-size: 14px;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.65);
}

.search-empty__query-text {
  overflow-wrap: anywhere;
  font-family: var(--font-mono);
  font-size: 19px;
  color: rgba(26, 24, 22, 0.9);
  margin: 0;
}

.search-empty__hint {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.65);
  margin: 0;
}

.search-empty__actions {
  margin-bottom: var(--space-8);
}

.search-empty__actions-heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 32px;
  line-height: 1.2;
  letter-spacing: -0.4px;
  color: var(--gp-text);
  text-align: center;
  margin: 0 0 var(--space-7) 0;
}

.search-empty__actions-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4);
}

.search-empty__action {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 80px;
  padding: var(--space-5) var(--space-6);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 21px;
  line-height: 1.3;
  letter-spacing: -0.2px;
  color: rgba(26, 24, 22, 0.85);
  text-align: center;
  text-decoration: none;
  background: rgba(230, 227, 223, 0.12);
  border-left: 4px solid rgba(107, 112, 87, 0.7);
}

.search-empty__action:hover {
  background: rgba(230, 227, 223, 0.22);
}

/* Continue exploring Grainpress */

.search-empty__pathways {
  margin-bottom: var(--space-8);
}

.search-empty__pathways-heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 32px;
  line-height: 1.2;
  letter-spacing: -0.4px;
  color: var(--gp-text);
  margin: 0 0 var(--space-5) 0;
}

.search-empty__pathways-desc {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
  margin: 0 0 var(--space-7) 0;
}

.search-empty__pathways-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-4);
}

.search-empty__pathway {
  display: flex;
  align-items: center;
  min-height: 80px;
  padding: var(--space-5) var(--space-6) var(--space-5) var(--space-7);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 22px;
  line-height: 1.4;
  letter-spacing: -0.2px;
  color: rgba(26, 24, 22, 0.85);
  text-decoration: none;
  background: rgba(230, 227, 223, 0.08);
  border-left: 4px solid rgba(107, 112, 87, 0.6);
}

.search-empty__pathway:hover {
  background: rgba(230, 227, 223, 0.16);
}

/* ============================================================
   AUTHOR ARCHIVE TEMPLATE — author.hbs
   ============================================================ */

/* ----------------------------------------
   Author profile image
   Circular avatar above the section-hero kicker.
   Only present in author.hbs; does not affect tag.hbs.
---------------------------------------- */

.author-hero__image {
  display: block;
  width: 64px;
  height: 64px;
  border-radius: 50%;
  object-fit: cover;
  margin-bottom: var(--space-4);
  border: 2px solid var(--gp-panel);
}

/* ============================================================
   EDITOR SNIPPETS AND PAGE SPANS
   Reusable Ghost editor HTML-card snippets. Name snippets by
   component type, not by the page where they first appear.
   ============================================================ */

:root {
  --gp-page-span-xl: 936px;
  --gp-page-span-lg: 780px;
  --gp-page-span-md: 700px;
  --gp-page-span-sm: 640px;
}

.gp-span-xl,
.gp-span-lg,
.gp-span-md,
.gp-span-sm {
  width: 100%;
  margin-left: auto;
  margin-right: auto;
}

.gp-span-xl {
  max-width: var(--gp-page-span-xl);
}

.gp-span-lg {
  max-width: var(--gp-page-span-lg);
}

.gp-span-md {
  max-width: var(--gp-page-span-md);
}

.gp-span-sm {
  max-width: var(--gp-page-span-sm);
}

.gp-grid-span-8 {
  grid-column: 3 / span 8;
}

.gp-grid-span-10 {
  grid-column: 2 / span 10;
  max-width: none;
}

.gp-grid-span-12 {
  grid-column: 1 / span 12;
  max-width: none;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body {
  padding-top: 104px;
  padding-bottom: 128px;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card {
  width: 100%;
  max-width: none;
  position: static;
  left: auto;
  margin: 0 auto 64px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
  color: var(--gp-text);
  text-align: left;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-content {
  display: block;
  width: 100%;
  max-width: none;
  margin: 0 auto;
  padding: 0;
  background: #f9f7f4;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-heading,
.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-subheading,
.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-disclaimer {
  display: none;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-text {
  margin: 0;
  padding: 0;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-form {
  display: block;
  width: 100%;
  max-width: var(--gp-page-span-sm);
  margin-left: auto;
  margin-right: auto;
  align-self: center;
  justify-self: center;
  margin-top: 0;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-form::before {
  content: "Email Address";
  display: block;
  margin: 0 0 12px;
  font-family: var(--font-mono);
  font-size: 17px;
  font-weight: 500;
  line-height: 24px;
  letter-spacing: 1.12px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-fields {
  display: grid;
  width: 100%;
  gap: 16px;
  margin: 0;
  background: none;
  border: none;
  max-width: none;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-input {
  display: block;
  width: 100%;
  height: 68px;
  min-height: 68px;
  margin: 0;
  padding: 0 24px;
  border: 2px solid var(--gp-text);
  border-radius: 0;
  background: transparent;
  color: var(--gp-text);
  font-family: var(--font-mono);
  font-size: 19px;
  font-weight: 400;
  line-height: 68px;
  letter-spacing: 0;
  box-shadow: none;
  outline-offset: 3px;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-input::placeholder {
  color: rgba(26, 24, 22, 0.48);
  opacity: 1;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-button {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 64px;
  min-height: 64px;
  margin: 0;
  padding: 0 24px;
  border: 0;
  border-radius: 0;
  background: var(--gp-text);
  color: var(--gp-bg);
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 600;
  line-height: 24px;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  box-shadow: none;
  cursor: pointer;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-button:hover {
  opacity: 0.86;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-button-loading {
  display: none;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-success,
.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-error {
  margin: 16px 0 0;
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-success {
  color: var(--gp-accent);
}

.page-content[data-page-slug="contact-sheet"]:has(.kg-signup-card)
  .article-body
  .kg-signup-card-error {
  color: #8f2f2a;
}

.gp-editor-copy {
  margin-top: 0;
  margin-bottom: 48px;
  font-family: var(--font-body);
  color: rgba(26, 24, 22, 0.8);
}

.gp-editor-copy--lead {
  font-size: 23px;
  line-height: 1.55;
}

.gp-editor-copy--small {
  font-size: 18px;
  line-height: 1.65;
  color: rgba(26, 24, 22, 0.65);
}

.gp-editor-copy--center {
  text-align: center;
}

.gp-editor-copy p {
  margin: 0;
}

.gp-text-card-grid {
  display: grid;
  margin-top: 48px;
}

.gp-text-card-grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 48px;
  row-gap: 32px;
}

/* Coverage-style 2-col grid with a 1px bottom rule under each item.
   Matches the "What Grainpress covers" treatment in the About v3 Figma frame:
   2-col, ~24px column gap, 40px row gap, hairline divider between rows. */
.gp-text-card-grid--ruled {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 24px;
  row-gap: 40px;
}

.gp-text-card-grid--ruled .gp-text-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding-bottom: 16px;
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.gp-text-card-grid--ruled .gp-text-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 25px;
  line-height: 1.2;
  letter-spacing: -0.01em;
  text-transform: uppercase;
  color: var(--gp-text);
}

.gp-text-card-grid--ruled .gp-text-card__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
}

.gp-text-card {
  border-top: 0;
  padding-top: 0;
}

.gp-text-card__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 23px;
  line-height: 1.2;
  letter-spacing: 0;
  color: var(--gp-text);
  margin: 0 0 10px;
}
h3.gp-text-card__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 23px;
  line-height: 1.2;
  letter-spacing: 0;
  color: var(--gp-text);
  margin: 0 0 10px;
}

.gp-text-card__body {
  font-family: var(--font-body);
  font-size: 18px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.7);
  margin: 0;
}

.gp-note {
  margin: 96px auto 96px;
  padding: 28px 40px 28px 44px;
  border-left: 4px solid var(--gp-accent);
  background: rgba(230, 227, 223, 0.2);
}

.gp-note strong {
  color: var(--gp-accent);
  font-family: var(--font-display);
  font-weight: 600;
}

.gp-note__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.8);
}

/* Heading for a standalone .gp-note. The only existing rule for this element
   is scoped to .gp-split-section, so a note used on its own — as an editorial
   callout in page content — had no heading treatment available. Sentence case
   here; the scoped rule keeps its uppercase treatment inside split sections,
   where it still wins on specificity. */
.gp-note__title {
  margin: 0 0 20px;
  color: var(--gp-accent);
  font-family: var(--font-display);
  font-size: 38px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.gp-note + .gp-editor-copy {
  margin: 56px auto 0;
}

.gp-text-link {
  color: var(--gp-accent);
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  text-decoration: none;
}

.gp-text-link--center {
  display: block;
  width: max-content;
  margin: 22px auto 0;
  border-bottom: 1px solid var(--gp-accent);
}

.gp-kicker-badge {
  display: inline-flex;
  align-items: center;
  min-height: 30px;
  padding: 5px 10px 4px;
  border: 1px solid rgba(101, 110, 82, 0.65);
  color: var(--gp-accent);
  font-family: var(--font-mono);
  font-size: 14px;
  font-weight: 500;
  line-height: 20px;
  letter-spacing: 1.76px;
  text-transform: uppercase;
}

.gp-button-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 18px 28px;
  margin-top: 36px;
}

.gp-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding: 0 22px;
  border: 1px solid var(--gp-text);
  color: var(--gp-bg);
  background: var(--gp-text);
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 600;
  line-height: 22px;
  letter-spacing: 1.12px;
  text-transform: uppercase;
  text-decoration: none;
}

.gp-button--secondary {
  color: var(--gp-text);
  background: transparent;
}

.gp-text-cta {
  color: var(--gp-accent);
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  line-height: 22px;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}

.gp-editor-statement {
  width: 100%;
  max-width: var(--gp-page-span-xl);
  margin: 0 auto 96px;
}

.gp-editor-statement__title {
  max-width: 720px;
  margin: 0 0 22px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: clamp(42px, 5vw, 64px);
  font-weight: 700;
  line-height: 0.96;
  letter-spacing: -0.03em;
}

.gp-editor-statement__body {
  max-width: var(--gp-page-span-lg);
  margin: 0;
  color: rgba(26, 24, 22, 0.76);
  font-family: var(--font-body);
  font-size: 23px;
  line-height: 1.5;
}

/* ---- Zones hero: wide masthead variant ---------------------------------
   Same structural idea as the Member Work hero: the editorial column is
   anchored to the 790px masthead axis that .issue-hero__inner centres on, and
   a secondary visual element extends to its right, so the composition stays in
   the shared masthead family instead of forming a second hero system.
   Scoped to .issue-hero--zones, which page-body.hbs applies only for the zones
   slug — the default centred masthead is untouched for every other Page. */
.issue-hero--zones .container {
  display: grid;
  /* Leading spacer resolves against the container's own content box, placing the
     copy on exactly the axis .issue-hero__inner centres on for every other Page. */
  grid-template-columns: calc((100% - 790px) / 2) minmax(0, 1fr) 340px;
  column-gap: 0;
  align-items: start;
}

.issue-hero--zones .issue-hero__inner {
  grid-column: 2;
  max-width: none;
  margin-left: 0;
  margin-right: 0;
  padding-right: var(--space-9);
}

.issue-hero--zones .issue-hero__media {
  grid-column: 3;
}

/* Zones hero carries no closing rule: the support line ends the column, as in
   the approved frame. The shared rule stays on every other Page. */
.issue-hero--zones .issue-hero__inner {
  border-bottom: 0;
  padding-bottom: 0;
}

/* Mono support line under the hero CTAs. Not .meta — that uppercases, and this
   line is sentence case in the approved frame. */
.issue-hero__support {
  margin: var(--space-6) 0 0;
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 1.6;
  letter-spacing: 0.24px;
  color: rgba(26, 24, 22, 0.55);
  max-width: 680px;
}

.issue-hero__media {
  width: 100%;
}

/* Stack at the existing 1080px breakpoint, device centred and fluid.
   .gp-media-slot--device keeps the 1:2 ratio and its own max-width. */
@media (max-width: 1080px) {
  .issue-hero--zones .container {
    grid-template-columns: minmax(0, 1fr);
    row-gap: var(--space-7);
  }

  .issue-hero--zones .issue-hero__inner {
    grid-column: 1;
    padding-right: 0;
  }

  .issue-hero--zones .issue-hero__media {
    grid-column: 1;
  }
}

/* ---- Generic media slot -------------------------------------------------
   Reserves the exact space a future image will occupy and renders a restrained
   empty frame until one exists. Nothing existing does this: .img-wrap and
   .article-lead-image both assume an <img> is already present, so an absent
   image collapses the layout. Ratios are named by shape, not by page.
   To fill a slot later, drop <img class="gp-media-slot__image"> inside the
   slot element and remove aria-hidden — no layout CSS changes required. */
.gp-media-slot {
  display: block;
  width: 100%;
  margin: 0;
  overflow: hidden;
  background: rgba(230, 227, 223, 0.28);
  border: 1px solid rgba(26, 24, 22, 0.12);
}

.gp-media-slot--device {
  aspect-ratio: 1 / 2;
  max-width: 340px;
  margin-inline: auto;
}

.gp-media-slot--device-lg {
  aspect-ratio: 1 / 2;
  max-width: 360px;
  margin-inline: auto;
}

.gp-media-slot--landscape {
  aspect-ratio: 520 / 340;
}

.gp-media-slot--panel {
  aspect-ratio: 526 / 520;
}

.gp-media-slot__image {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.gp-media-figure {
  margin: 0;
}

/* Element-qualified so it outranks .article-body figcaption, which adds a
   left rule, padding and italics intended for editorial image captions. */
figcaption.gp-media-figure__caption {
  margin: 16px 0 0;
  padding-left: 0;
  border-left: 0;
  font-family: var(--font-mono);
  font-size: 15px;
  font-style: normal;
  line-height: 1.5;
  letter-spacing: 0.96px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  text-align: center;
}

/* ---- Numbered step sequence --------------------------------------------
   No existing component renders an ordered sequence with a figure, a display
   heading and body copy; .gp-dash-list is an unnumbered bulleted list with no
   headings. Step figures use the Zones ochre where the product accent applies. */
.gp-step-list {
  display: grid;
  gap: 56px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.page-zones .gp-step-list {
  gap: 80px;
  padding-bottom: 32px;
}

.gp-step {
  display: grid;
  grid-template-columns: 100px minmax(0, 1fr);
  gap: 0 48px;
  align-items: start;
}

.gp-step__number {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 36px;
  font-weight: 400;
  line-height: 1.1;
  letter-spacing: 0.64px;
  color: var(--gp-zones);
}

.gp-step__title {
  margin: 0 0 12px;
  font-family: var(--font-display);
  font-size: 32px;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.28px;
  color: var(--gp-text);
}

.gp-step__body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 21px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
}

/* Product-accent variant of the note, mirroring the existing --zones
   accent-card convention. The base .gp-note uses the olive editorial accent. */
.gp-note--zones {
  border-left-color: var(--gp-zones);
}

.gp-note--zones .gp-note__title {
  color: var(--gp-zones);
}

/* Reversed split row, so media/text rows can alternate sides. */
.gp-split-section--reverse > *:first-child {
  order: 2;
}

/* Product-accent button. .gp-button is dark and --secondary transparent;
   neither carries the Zones ochre, which the --zones accent-card convention
   already establishes for this product. */
.gp-button--zones {
  border-color: var(--gp-zones);
  background: var(--gp-zones);
  color: var(--gp-text);
}

/* Pre-launch CTA: correct visual state, no destination yet. Rendered on a
   <span>, so it is neither focusable nor clickable. */
.gp-button--pending {
  cursor: default;
}

.gp-list-card-grid {
  display: grid;
  width: 100%;
  max-width: var(--gp-page-span-xl);
  margin: 0 auto 48px;
  gap: 28px;
}

.gp-list-card-grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}

.gp-list-card-grid--wide {
  grid-column: 2 / span 10;
  max-width: none;
}

.gp-list-card {
  padding: 30px 32px 34px;
  border-top: 2px solid var(--gp-text);
  background: rgba(230, 227, 223, 0.18);
}
.gp-list-card.highlight {
  background-color: rgba(106, 116, 85, 0.3);
}

.gp-list-card__title {
  margin: 0 0 18px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: 30px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.01em;
}

.gp-dash-list {
  display: grid;
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.gp-dash-list__item {
  position: relative;
  margin: 0;
  padding-left: 18px;
  color: rgba(26, 24, 22, 0.74);
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
}

.gp-dash-list__item::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.78em;
  width: 8px;
  height: 1px;
  background: var(--gp-accent);
}

.gp-section-heading {
  width: 100%;
  grid-column: 2 / span 10;
  max-width: none;
  margin: 0 0 36px;
  padding-bottom: 14px;
  border-bottom: 2px solid var(--gp-text);
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: 38px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.02em;
}

.gp-split-section {
  display: grid;
  grid-column: 2 / span 10;
  width: 100%;
  max-width: none;
  margin: 0 0 104px;
  padding-top: 48px;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
  align-items: start;
  gap: 76px;
}

.gp-split-section--2 {
  grid-template-columns: minmax(0, 1fr) minmax(360px, 1fr);
}

.gp-split-section .gp-split-section__title {
  margin: 0 0 28px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: clamp(38px, 3.6vw, 44px);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.03em;
}

.gp-split-section .gp-split-section__body {
  margin: 0;
  color: rgba(26, 24, 22, 0.76);
  font-family: var(--font-body);
  font-size: 22px;
  line-height: 1.5;
}

.gp-split-section .gp-note {
  margin: 0;
  padding: 36px 40px 32px;
  border-left: 4px solid var(--gp-accent);
  background: rgba(230, 227, 223, 0.32);
}

.gp-split-section .gp-note__title {
  margin: 0 0 14px;
  color: #6b7057;
  font-family: var(--font-display);
  font-size: 28px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.24px;
  text-transform: uppercase;
}

.gp-split-section .gp-note__body {
  margin: 0;
  color: rgba(26, 24, 22, 0.8);
  font-family: var(--font-body);
  font-size: 20px;
  font-weight: 400;
  line-height: 1.55;
}

.gp-split-section .gp-note__link {
  display: inline-block;
  margin-top: 28px;
  color: #6b7057;
  font-family: var(--font-mono);
  font-size: 17px;
  font-weight: 500;
  line-height: 24px;
  letter-spacing: 1.12px;
  text-transform: uppercase;
  text-decoration: none;
  border-bottom: 2px solid #6b7057;
}

.gp-plan-card {
  padding: 56px;
  border: 2px solid #6b7057;
  background: transparent;
}

.gp-plan-card__eyebrow {
  display: inline-flex;
  margin: 0 0 34px;
  padding: 10px 12px;
  border: 1px solid rgba(107, 112, 87, 0.4);
  background: rgba(107, 112, 87, 0.08);
  color: #6b7057;
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 600;
  line-height: 19px;
  letter-spacing: 1.248px;
  text-transform: uppercase;
}

.gp-plan-card__title {
  margin: 0 0 24px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: 40px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -0.36px;
  text-transform: uppercase;
}

.gp-plan-card__body {
  max-width: 604px;
  margin: 0 0 54px;
  color: rgba(26, 24, 22, 0.8);
  font-family: var(--font-body);
  font-size: 21px;
  line-height: 1.55;
}

.gp-plan-card__price {
  margin: 0 0 8px;
  color: var(--gp-text);
  font-family: var(--font-mono);
  font-weight: 700;
  letter-spacing: -1.6px;
}

.gp-plan-card__price-main {
  font-size: 64px;
  line-height: 1;
}

.gp-plan-card__price-unit {
  color: rgba(26, 24, 22, 0.6);
  font-size: 30px;
  line-height: 1;
  letter-spacing: -0.7px;
}

.gp-plan-card__billing {
  margin: 0 0 36px;
  color: rgba(26, 24, 22, 0.6);
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 22px;
  letter-spacing: 1.2px;
  text-transform: uppercase;
}

.gp-plan-card__rule {
  width: 100%;
  max-width: 604px;
  height: 1px;
  margin: 0 0 40px;
  background: rgba(107, 112, 87, 0.2);
}

.gp-plan-card__button {
  width: 100%;
  max-width: 604px;
  min-height: 64px;
  background: #6b7057;
}

.gp-plan-card__note {
  max-width: 604px;
  margin: 20px 0 0;
  color: rgba(26, 24, 22, 0.65);
  font-family: var(--font-body);
  font-size: 17px;
  font-style: italic;
  line-height: 1.5;
  text-align: center;
}

/* GP-136 launch-period paid-Membership treatment — temporary.
   The approved paid price is $8/mo, $75/year, but paid Membership is not
   active yet, so the plan card shows that price struck through and its CTA
   grayed out. The markup lives in the Membership Page's plan-card HTML card in
   the Ghost editor, which is where page body content belongs: the price and
   billing lines take the --inactive modifiers, the CTA becomes a
   <span class="gp-plan-card__button gp-button gp-button--inactive"
   role="button" aria-disabled="true"> carrying no href, so Ghost Portal has
   nothing to bind to, and the launch-period sentence sits directly beneath it
   as a .gp-plan-card__status paragraph.

   To activate paid Membership: delete this block, drop the --inactive
   modifiers and the __status paragraph from the editor card, and point the CTA
   back at an <a> for the approved paid Ghost flow. */

.gp-plan-card__price--inactive,
.gp-plan-card__price--inactive .gp-plan-card__price-unit,
.gp-plan-card__billing--inactive {
  color: rgba(26, 24, 22, 0.55);
}

/* Each strike is declared on the text it actually crosses. A line-through is
   positioned from the metrics of the element that declares it, so one set on
   the price wrapper — which inherits 22px body type — lands near the top of
   the 64px figure rather than through it. The unit is dimmed alongside instead
   of struck, which keeps each stroke on a single type size. */
.gp-plan-card__price--inactive .gp-plan-card__price-main,
.gp-plan-card__billing--inactive {
  text-decoration: line-through;
}

/* The grayed sibling of --pending: --pending is a CTA whose destination does
   not exist yet, this is one deliberately shown as unavailable. It follows
   .gp-plan-card__button so it overrides that rule's olive fill. */
.gp-button--inactive {
  border-color: rgba(26, 24, 22, 0.18);
  background: rgba(26, 24, 22, 0.1);
  color: rgba(26, 24, 22, 0.55);
  cursor: not-allowed;
}

/* Secondary to the CTA and to the plan copy, and on the same 604px measure and
   centre axis as the button and __note it sits between. Upright rather than
   italic: this is the card's operative status, not an aside like __note. */
.gp-plan-card__status {
  max-width: 604px;
  margin: 18px 0 0;
  color: rgba(26, 24, 22, 0.7);
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.5;
  text-align: center;
}

.gp-faq-heading {
  width: 100%;
  padding-bottom: 14px;
  border-bottom: 2px solid var(--gp-text);
}

.gp-faq-list {
  display: grid;
  width: 100%;
  max-width: var(--gp-page-span-lg);
  margin: 0 auto 104px;
  border-top: 1px solid rgba(26, 24, 22, 0.24);
}

.gp-faq-item {
  padding: 24px 0;
  border-bottom: 1px solid rgba(26, 24, 22, 0.24);
}

.gp-faq-item__question {
  margin: 0 0 10px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-size: 25px;
  font-weight: 700;
  line-height: 1.12;
}

.gp-faq-item__answer {
  margin: 0;
  color: rgba(26, 24, 22, 0.72);
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.58;
}

/* Pull-quote / editorial argument block — matches the About v3 Figma frame.
   Olive accent rule, olive display heading, larger body. For a single-paragraph
   quote, omit the heading element. Heading color matches the rule. */
.gp-pull-quote {
  width: 100%;
  /* Was 793px, hand-fitted to the 792px prose column. Follows the reading
     measure instead of restating a width of its own, which is what kept it on
     the prose axis while that measure narrowed and again now it has returned
     to 790px — within a pixel of the figure it was originally fitted to. */
  max-width: var(--reading-measure);
  margin: 48px auto 80px;
  padding: 40px 0 32px 48px;
  border-left: 4px solid var(--gp-accent);
}

/* CORRECTION PASS: heading 48px -> 32px, body 26px -> 24px. At 48px this was
   reading as a second page title; the olive rule, olive heading and indent
   already carry the interruption, so size no longer has to. */
.gp-pull-quote__heading {
  margin: 0 0 24px;
  color: var(--gp-accent);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 32px;
  line-height: 1.1;
  letter-spacing: -0.88px;
}

.gp-pull-quote__body {
  margin: 0;
  max-width: 735px;
  color: rgba(26, 24, 22, 0.85);
  font-family: var(--font-body);
  font-size: 24px;
  line-height: 1.55;
}

/* Optional attribution. Quieter than the body it follows -- a source line, not
   a second voice -- so it takes the body face in italic at a reduced size and
   the muted text colour, rather than the olive the heading and rule carry. */
.gp-pull-quote__attribution {
  margin: var(--space-4) 0 0;
  max-width: 735px;
  color: var(--gp-text-muted);
  font-family: var(--font-body);
  font-style: italic;
  font-size: 19px;
  line-height: 1.5;
}

/* Standard-page heading scale — bumps the editor h2 to the 36px Figma scale
   without affecting article (post.hbs) h2s. Keeps existing section top margin. */
/* An editor <hr> on a Page separates full-width composed sections, so it
   follows the wide section axis. Left alone it inherits the reading-measure
   cap and, once the canvas grows, reads as a stray short rule crossing under
   the section grids. Scoped to .page-content so an <hr> inside a post's prose
   keeps the reading axis, which is correct there. */
.page-content .article-body > hr {
  grid-column: 2 / span 10;
  max-width: none;
}

.page-content .article-body h2 {
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.72px;
  margin-bottom: 24px;
}

/* 3-column accent-bordered module grid — for editorial cross-link / ecosystem
   sections. Matches "The Grainpress ecosystem" row in the About v3 Figma frame.
   Olive left rule by default; --zones modifier swaps to ochre for Zones cards. */
.gp-accent-card-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  column-gap: 29px;
  row-gap: 32px;
  margin-top: 48px;
}

.gp-accent-card {
  padding: 32px 24px 32px 44px;
  background: rgba(230, 227, 223, 0.15);
  border-left: 4px solid var(--gp-accent);
}

.gp-accent-card__title {
  margin: 0 0 16px;
  color: var(--gp-accent);
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 30px;
  line-height: 1.05;
  letter-spacing: -0.015em;
  text-transform: uppercase;
}

.gp-accent-card__body {
  margin: 0;
  color: rgba(26, 24, 22, 0.75);
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
}

.gp-accent-card--zones {
  border-left-color: var(--gp-zones);
}

.gp-accent-card--zones .gp-accent-card__title {
  color: var(--gp-zones);
}

/* When .gp-accent-card is rendered as an <a>, suppress default link styling
   and add a subtle hover/focus affordance for whole-card click targets. */
a.gp-accent-card {
  display: block;
  color: inherit;
  text-decoration: none;
  transition: background-color 0.15s ease;
}

a.gp-accent-card:hover {
  background: rgba(230, 227, 223, 0.32);
}

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

a.gp-accent-card--zones:focus-visible {
  outline-color: var(--gp-zones);
}

/* 2-column variant of the accent-card grid — for the Advertise
   "Advertising and sponsorship opportunities" section. Tighter heading scale,
   wider column gap, slightly darker body color than the 3-col ecosystem variant. */
.gp-accent-card-grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: 40px;
  row-gap: 40px;
  margin-top: 32px;
}

.gp-accent-card-grid--2 .gp-accent-card {
  padding: 32px 32px 32px 36px;
}

.gp-accent-card-grid--2 .gp-accent-card__title {
  font-size: 26px;
  line-height: 1.5;
  letter-spacing: -0.336px;
}

.gp-accent-card-grid--2 .gp-accent-card__body {
  color: rgba(26, 24, 22, 0.8);
}

/* 4-across variant of the accent-card grid, mirroring the existing --2. */
.gp-accent-card-grid--4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  column-gap: 32px;
  row-gap: 32px;
}

/* Standard-page first content block sits closer to the hero rule —
   prevents the double gap from article-body padding-top + h2 first-child margin. */
.page-content .article-body > *:first-child {
  margin-top: 0;
}

/* Padded variant of .gp-note — for full-width information panels with a
   substantial inset (e.g. the Submit page Submission guidelines panel). */
.gp-note--padded {
  margin: 0;
  padding: 48px 48px 48px 52px;
  background: rgba(230, 227, 223, 0.12);
}

/* Centered CTA panel — olive top rule, light panel tint, centered content.
   Used by the Submit page final "Submit work" call-to-action and similar
   editorial close-out blocks. */
.gp-cta-panel {
  width: 100%;
  max-width: 786px;
  margin: 64px auto;
  padding: 68px 48px;
  background: rgba(230, 227, 223, 0.12);
  border-top: 4px solid var(--gp-accent);
  text-align: center;
}

.gp-cta-panel > * + * {
  margin-top: 32px;
}

.gp-cta-panel__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 48px;
  line-height: 1.1;
  letter-spacing: -1.14px;
  color: var(--gp-text);
}

.gp-cta-panel__deck {
  margin: 0 auto;
  max-width: 640px;
  font-family: var(--font-body);
  font-size: 23px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.85);
}

.gp-cta-panel__body {
  margin: 0 auto;
  max-width: 640px;
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
}

.gp-cta-panel__label {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: 1.68px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.65);
}

.gp-cta-panel__placeholder {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 1.5;
  letter-spacing: 0.6px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.5);
  font-style: normal;
}

/* Suppress empty archive-card label spans. When the contextual label resolver
   intentionally emits nothing (e.g. label_mode="member_work" on /member-work/
   cards where no public taxonomy label exists), the wrapping <span> would
   otherwise occupy meta-line whitespace from its kicker styling. */
.section-lead__label:empty,
.section-secondary__label:empty,
.section-news-lead__label:empty,
.news-row__label:empty,
.card-feature__label:empty,
.card-sub-feature__label:empty,
.home-highlight-item__label:empty,
.home-hero__label:empty,
.article-related-item__label:empty,
.article-header__kicker:empty {
  display: none;
}

/* Centered editorial close-out block (heading + short paragraph), used
   below the Submit page CTA panel and for similar centered closing notes. */
.gp-centered-block {
  width: 100%;
  max-width: var(--reading-measure);
  margin: 48px auto 0;
  text-align: center;
}

/* Detail table — light tint box with mono key/value rows. Generalized
   from the existing .article-body .technical-details box so the heading
   can be customised per use case (e.g. "Submission Details" on the Member
   Photo page, "Technical Details" on photography articles). */
.gp-detail-table {
  margin: var(--space-8) 0;
  padding: 25px;
  background-color: rgba(230, 227, 223, 0.2);
  border: 1px solid rgba(26, 24, 22, 0.12);
}

.gp-detail-table__title {
  display: block;
  margin: 0 0 var(--space-4);
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 14px;
  line-height: 1.75;
  letter-spacing: 1.344px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.7);
}

.gp-detail-table dl {
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 0;
}

.gp-detail-table dl > div {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  padding: 8px 0 9px;
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.gp-detail-table dl > div:last-child {
  border-bottom: none;
  padding-bottom: 8px;
}

.gp-detail-table dt {
  flex-shrink: 0;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.42;
  color: rgba(26, 24, 22, 0.6);
}

.gp-detail-table dd {
  margin: 0;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.42;
  text-align: right;
  color: var(--gp-text);
}

/* Placeholder link — non-functional treatment that looks like a mono email
   link with an olive underline but is intentionally not clickable. Used
   inside .gp-accent-card for contact routes whose final email address has
   not been confirmed for launch. Swap each instance for a real <a> when
   the address is approved. */
.gp-placeholder-link {
  display: inline-block;
  padding-bottom: 5px;
  border-bottom: 1px solid var(--gp-accent);
  color: var(--gp-accent);
  font-family: var(--font-mono);
  font-weight: 500;
  font-size: 18px;
  line-height: 1.5;
  cursor: default;
  user-select: text;
}

.gp-accent-card .gp-placeholder-link {
  margin-top: 28px;
}

/* Contact form panel — olive top rule, light panel tint, heading + intro
   + accessible form fields with a temporary disabled submit. Reuses the
   chrome of .gp-cta-panel but left-aligned and with form-specific children. */
.gp-contact-form {
  width: 100%;
  max-width: 840px;
  margin: 64px auto;
  padding: 72px 80px;
  background: rgba(230, 227, 223, 0.12);
  border-top: 4px solid var(--gp-accent);
}

.gp-contact-form__title {
  margin: 0 0 24px;
  color: var(--gp-text);
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 48px;
  line-height: 1.1;
  letter-spacing: -1.14px;
}

.gp-contact-form__intro {
  margin: 0 0 48px;
  max-width: var(--reading-measure);
  color: rgba(26, 24, 22, 0.85);
  font-family: var(--font-body);
  font-size: 22px;
  line-height: 1.55;
}

.gp-contact-form__form {
  display: grid;
  gap: 28px;
}

.gp-contact-form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 28px;
}

.gp-contact-form__field {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}

.gp-contact-form__label {
  margin: 0;
  font-family: var(--font-mono);
  font-size: 15px;
  line-height: 1.5;
  letter-spacing: 1.44px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.7);
}

.gp-contact-form__input,
.gp-contact-form__textarea {
  width: 100%;
  padding: 14px 16px;
  background: #f3f1ed;
  border: 1px solid rgba(26, 24, 22, 0.12);
  color: var(--gp-text);
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.5;
  border-radius: 0;
  transition: border-color 0.15s ease;
}

.gp-contact-form__input {
  height: 54px;
}

.gp-contact-form__textarea {
  min-height: 198px;
  resize: vertical;
}

.gp-contact-form__input:focus,
.gp-contact-form__textarea:focus {
  outline: none;
  border-color: var(--gp-accent);
}

.gp-contact-form__input:disabled,
.gp-contact-form__textarea:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

.gp-contact-form__actions {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
  margin-top: 24px;
}

.gp-contact-form__submit {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 230px;
  min-height: 52px;
  padding: 0 24px;
  background: var(--gp-accent);
  color: var(--gp-bg);
  font-family: var(--font-mono);
  font-size: 16px;
  font-weight: 500;
  letter-spacing: 1.36px;
  line-height: 1;
  text-transform: uppercase;
  border: none;
  cursor: pointer;
  transition: background 0.15s ease;
}

.gp-contact-form__submit:hover:not([disabled]):not([aria-disabled="true"]) {
  background: var(--gp-text);
}

.gp-contact-form__submit:focus-visible {
  outline: 2px solid var(--gp-accent);
  outline-offset: 2px;
}

.gp-contact-form__submit[disabled],
.gp-contact-form__submit[aria-disabled="true"] {
  opacity: 0.5;
  cursor: not-allowed;
}

.gp-contact-form__notice {
  margin: 0;
  color: rgba(26, 24, 22, 0.65);
  font-family: var(--font-body);
  font-size: 17px;
  font-style: italic;
  line-height: 1.5;
}

@media (max-width: 760px) {
  /* The .article-body block-flow override that used to live here is removed:
     the responsive reading-measure bands above reach full-grid width at 880px,
     so this rule fired 120px late and then double-inset the text inside the
     page margin. Every other declaration in this query is unchanged. */

  .gp-button-row {
    align-items: stretch;
    flex-direction: column;
  }

  .gp-button,
  .gp-text-cta {
    width: 100%;
  }

  .gp-list-card-grid--2,
  .gp-step {
    grid-template-columns: 1fr;
    gap: 8px 0;
  }

  .gp-split-section--reverse > *:first-child {
    order: 0;
  }

  .gp-split-section--2 {
    grid-template-columns: 1fr;
  }

  /* --2 was the one two-column gp-* grid missing from this block, so Contact
     Sheet and Membership kept two ~132px columns down to phone widths. It
     collapses with the rest of the family rather than by page-specific rule. */
  .gp-text-card-grid--2 {
    grid-template-columns: minmax(0, 1fr);
    column-gap: 0;
  }

  .gp-text-card-grid--ruled {
    grid-template-columns: 1fr;
    column-gap: 0;
    row-gap: 24px;
  }

  .gp-text-card-grid--ruled .gp-text-card__title {
    font-size: 23px;
  }

  .gp-accent-card-grid {
    grid-template-columns: 1fr;
    column-gap: 0;
    row-gap: 20px;
  }

  .gp-accent-card-grid--2 {
    row-gap: 16px;
  }

  .gp-accent-card {
    padding: 24px 20px 24px 28px;
  }

  .gp-accent-card-grid--2 .gp-accent-card {
    padding: 24px 20px 24px 28px;
  }

  .gp-accent-card__title {
    font-size: 26px;
  }

  .gp-accent-card-grid--2 .gp-accent-card__title {
    font-size: 24px;
  }

  .gp-note--padded {
    padding: 28px 24px 28px 28px;
  }

  .gp-cta-panel {
    padding: 48px 24px;
    margin: 48px auto;
  }

  .gp-cta-panel__title {
    font-size: 36px;
    letter-spacing: -0.64px;
  }

  .gp-cta-panel__deck {
    font-size: 22px;
  }

  .gp-cta-panel__body {
    font-size: 18px;
  }

  .gp-centered-block {
    margin: 32px auto 0;
  }

  .gp-placeholder-link {
    font-size: 17px;
    word-break: break-all;
  }

  .gp-contact-form {
    padding: 40px 24px;
    margin: 48px auto;
  }

  .gp-contact-form__title {
    font-size: 36px;
    letter-spacing: -0.64px;
  }

  .gp-contact-form__intro {
    font-size: 20px;
  }

  .gp-contact-form__row {
    grid-template-columns: 1fr;
    gap: 20px;
  }

  .gp-contact-form__submit {
    width: 100%;
    min-width: 0;
  }

  .gp-pull-quote {
    margin: 40px auto 56px;
    padding: 28px 0 24px 24px;
  }

  .gp-pull-quote__heading {
    font-size: 26px;
    line-height: 1.1;
    letter-spacing: -0.6px;
  }

  .gp-pull-quote__body {
    font-size: 22px;
  }

  .gp-pull-quote__attribution {
    font-size: 17px;
  }

  .page-content .article-body h2 {
    font-size: 32px;
    letter-spacing: -0.56px;
  }

  .gp-list-card,
  .gp-plan-card {
    padding: 26px 24px 30px;
  }

  /* .search-section-browse__grid is handled by the 900px family transition
     above; a second declaration here would be a duplicate rule. */

  .search-empty__actions-grid {
    grid-template-columns: 1fr 1fr;
  }

  .search-empty__title {
    font-size: 40px;
  }

  .search-empty__pathways-grid {
    grid-template-columns: 1fr;
  }
}

/* ========================================
   PODCAST TEMPLATE — custom-podcast.hbs
   Route: /podcast/
   Implements Podcast v2 design.
======================================== */

/* Podcast CTA — olive fill button */
.podcast-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding: 0 24px;
  background: var(--gp-text-muted);
  color: var(--gp-bg);
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 1.2px;
  line-height: 1;
  text-transform: uppercase;
  text-decoration: none;
  border: none;
}

.podcast-cta:hover {
  background: var(--gp-text);
  color: var(--gp-bg);
}

/* View show notes text link */
.podcast-notes {
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-text-muted);
  line-height: 1.6;
}

.podcast-notes:hover {
  color: var(--gp-text);
  border-color: var(--gp-text);
}

/* ----------------------------------------
   Talking pictures intro
---------------------------------------- */

.podcast-intro {
  padding: var(--space-8) 0;
}

.podcast-intro__inner {
  max-width: 790px;
  margin-left: auto;
  margin-right: auto;
}

.podcast-intro__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.72px;
  color: var(--gp-text);
  margin: 0 0 var(--space-5);
}

.podcast-intro__body {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 22px;
  line-height: 1.6;
  color: rgba(26, 24, 22, 0.8);
  margin: 0;
}

/* ----------------------------------------
   Featured episode card
---------------------------------------- */

.podcast-featured {
  padding: 0 0 var(--space-7);
}

.podcast-featured__card {
  max-width: 1040px;
  margin: 0 auto;
  padding: var(--space-8) var(--space-9);
  border-left: 4px solid var(--gp-text-muted);
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
  background: rgba(230, 227, 223, 0.15);
}

.podcast-featured__kicker {
  display: block;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 14px;
  letter-spacing: 1.68px;
  text-transform: uppercase;
  color: rgba(26, 24, 22, 0.65);
  margin-bottom: var(--space-5);
}

.podcast-featured__title {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 56px;
  line-height: 1.05;
  letter-spacing: -1.56px;
  color: var(--gp-text);
  text-decoration: none;
  margin-bottom: var(--space-5);
}

.podcast-featured__title:hover {
  color: var(--gp-text-muted);
}

.podcast-featured__deck {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 24px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.85);
  margin: 0 0 var(--space-5);
}

.podcast-featured__meta {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 16px;
  letter-spacing: 1.04px;
  color: rgba(26, 24, 22, 0.7);
  margin: 0 0 var(--space-7);
}

.podcast-featured__actions {
  display: flex;
  align-items: center;
  gap: 32px;
  flex-wrap: wrap;
}

/* ----------------------------------------
   Recent episodes list
---------------------------------------- */

.podcast-list {
  padding: var(--space-7) 0;
}

.podcast-list__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.72px;
  color: var(--gp-text);
  max-width: 1040px;
  margin: 0 auto var(--space-6);
}

.podcast-list__items {
  max-width: 1040px;
  margin: 0 auto;
  border-top: 1px solid rgba(26, 24, 22, 0.12);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  padding-top: var(--space-3);
}

/* Individual episode row */
.podcast-episode {
  padding: var(--space-5) var(--space-5) var(--space-5) var(--space-6);
  border-left: 3px solid rgba(107, 112, 87, 0.6);
  border-bottom: 1px solid rgba(26, 24, 22, 0.08);
}

.podcast-episode__header {
  margin-bottom: var(--space-3);
}

.podcast-episode__date {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 15px;
  letter-spacing: 0.96px;
  color: rgba(26, 24, 22, 0.7);
}

.podcast-episode__title {
  display: block;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 26px;
  line-height: 1.3;
  letter-spacing: -0.33px;
  color: rgba(26, 24, 22, 0.9);
  text-decoration: none;
  margin-bottom: var(--space-3);
}

.podcast-episode__title:hover {
  color: var(--gp-text-muted);
}

.podcast-episode__play {
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-text-muted);
  line-height: 1.6;
}

.podcast-episode__play:hover {
  color: var(--gp-text);
  border-color: var(--gp-text);
}

/* ----------------------------------------
   Empty state — no episodes yet
---------------------------------------- */

.podcast-empty {
  padding: var(--space-9) 0;
}

.podcast-empty__message {
  font-family: var(--font-body);
  font-size: 21px;
  color: rgba(26, 24, 22, 0.65);
  margin: 0 0 var(--space-6);
}

.podcast-empty__links {
  display: flex;
  gap: var(--space-5);
  flex-wrap: wrap;
}

.podcast-empty__link {
  font-family: var(--font-mono);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--gp-text-muted);
  text-decoration: none;
  border-bottom: 1px solid var(--gp-text-muted);
  line-height: 1.6;
}

.podcast-empty__link:hover {
  color: var(--gp-text);
  border-color: var(--gp-text);
}

/* ----------------------------------------
   What you can expect — 2×2 grid
---------------------------------------- */

.podcast-coverage {
  padding: var(--space-9) 0 var(--space-10);
}

.podcast-coverage__heading {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.72px;
  color: var(--gp-text);
  max-width: 1040px;
  margin: 0 auto var(--space-7);
}

.podcast-coverage__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 var(--space-8);
  max-width: 1040px;
  margin: 0 auto;
}

.podcast-coverage__item {
  padding: var(--space-5) 0;
  border-bottom: 1px solid rgba(26, 24, 22, 0.12);
}

.podcast-coverage__name {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 22px;
  line-height: 1.3;
  letter-spacing: -0.17px;
  text-transform: uppercase;
  color: var(--gp-text);
  margin: 0 0 var(--space-3);
}

.podcast-coverage__desc {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
  margin: 0;
}

@media (max-width: 760px) {
  .podcast-featured__title {
    font-size: 36px;
    letter-spacing: -0.96px;
  }

  .podcast-featured__deck {
    font-size: 22px;
  }

  .podcast-featured__card {
    padding: var(--space-6) var(--space-5) var(--space-6) var(--space-5);
  }

  .podcast-featured__actions {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-5);
  }

  .podcast-coverage__grid {
    grid-template-columns: 1fr;
  }

  .podcast-intro__heading,
  .podcast-list__heading,
  .podcast-coverage__heading {
    font-size: 32px;
  }
}

/* ============================================================
   MONTHLY MEMBER PHOTO — SUBMISSION FORM (GP-133)
   Rendered by partials/member-photo-form.hbs from page-body.hbs
   for the /member-photo/ Page only. Composition and page-level
   layout live here; the field, file, hint, error, and status
   primitives are shared components in components.css.

   The measure is the existing .gp-span-lg editor span (780px),
   which sits within a dozen pixels of the 8-column article
   reading measure above it, so the form reads as a continuation
   of the participation brief rather than a separate width
   vocabulary. Breakpoints are the file's existing 760 and 540
   steps; no site-wide responsive rule is altered.
   ============================================================ */

.member-photo-submit {
  border-top: 1px solid rgba(26, 24, 22, 0.12);
  padding-top: var(--space-9);
  padding-bottom: var(--space-10);
  scroll-margin-top: var(--space-7);
}

.member-photo-submit__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 36px;
  line-height: 1.15;
  letter-spacing: -0.32px;
  color: var(--gp-text);
  margin: 0 0 var(--space-4);
}

.member-photo-submit__deck {
  font-family: var(--font-body);
  font-size: 20px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.75);
  margin: 0 0 var(--space-8);
}

/* ---- Fields -------------------------------------------------------------
   Two across at desktop for the short factual fields; Location, About, and
   the file control span the full measure because they need the room. */

.member-photo-form__account {
  margin-bottom: var(--space-7);
}

.member-photo-form__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  column-gap: var(--space-6);
  row-gap: var(--space-6);
}

.form-field--full {
  grid-column: 1 / -1;
}

/* ---- Actions and transport state ---------------------------------------- */

.member-photo-form__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-4) var(--space-6);
  margin-top: var(--space-8);
}

.member-photo-form__submit[aria-disabled="true"] {
  opacity: 0.55;
  cursor: progress;
}

/* ---- Success ------------------------------------------------------------
   Replaces the form in place, so a successful submission never leaves
   /member-photo/. */

.member-photo-submit__success {
  border-left: 4px solid var(--gp-accent);
  background: rgba(230, 227, 223, 0.2);
  padding: var(--space-6) var(--space-7);
}

.member-photo-submit__success:focus {
  outline: 2px solid var(--gp-accent);
  outline-offset: 4px;
}

.member-photo-submit__success-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 30px;
  line-height: 1.2;
  letter-spacing: -0.26px;
  color: var(--gp-accent);
  margin: 0 0 var(--space-4);
}

.member-photo-submit__success-body {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.8);
  margin: 0 0 var(--space-3);
}

.member-photo-submit__success-body:last-child {
  margin-bottom: 0;
}

/* ---- Logged-out gate ----------------------------------------------------
   The participation brief above stays public; this replaces the form only. */

.member-photo-submit__gate {
  border-left: 4px solid var(--gp-accent);
  background: rgba(230, 227, 223, 0.2);
  padding: var(--space-6) var(--space-7);
}

.member-photo-submit__gate-title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 30px;
  line-height: 1.2;
  letter-spacing: -0.26px;
  color: var(--gp-text);
  margin: 0 0 var(--space-4);
}

.member-photo-submit__gate-body {
  font-family: var(--font-body);
  font-size: 19px;
  line-height: 1.55;
  color: rgba(26, 24, 22, 0.8);
  margin: 0 0 var(--space-3);
}

.member-photo-submit__gate .gp-button-row {
  margin-top: var(--space-6);
}

/* ---- Tablet / intermediate ----------------------------------------------
   One column below the file's existing 760 step: at this measure the paired
   fields stop holding a comfortable input width. */

@media (max-width: 760px) {
  .member-photo-submit {
    padding-top: var(--space-8);
    padding-bottom: var(--space-9);
  }

  .member-photo-submit__title {
    font-size: 32px;
  }

  .member-photo-form__grid {
    grid-template-columns: minmax(0, 1fr);
    row-gap: var(--space-5);
  }
}

/* ---- Phone --------------------------------------------------------------
   Full-width submit so the primary action is reachable one-handed, and the
   panel padding drops to the fluid page margin. */

@media (max-width: 540px) {
  .member-photo-submit__title {
    font-size: 30px;
  }

  .member-photo-submit__deck {
    font-size: 19px;
    margin-bottom: var(--space-7);
  }

  .member-photo-form__actions {
    flex-direction: column;
    align-items: stretch;
  }

  .member-photo-form__submit {
    width: 100%;
  }

  .member-photo-submit__success,
  .member-photo-submit__gate {
    padding: var(--space-5) var(--space-5);
  }

  .member-photo-submit__gate .gp-button-row {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-4);
  }

  .form-file::file-selector-button {
    display: block;
    margin: 0 0 var(--space-3);
  }
}
