/* ============================================================
   FONTS
   The @font-face declarations for Poffy (display) and Casual Human
   (handwriting) live in default.hbs <head>, so their URLs use the
   {{asset}} helper (cache-busting) and Poffy's preload can share the
   exact same URL. This file just references the families by name.
   ============================================================ */

/* ============================================================
   TOKENS
   7 colors. 2 type families. 5 sizes. 5 spacing steps.
   1 container. 1 reading column. 1 radius. 6 breakpoints.
   ============================================================ */
:root {
  /* COLOR (7) */
  --c-cream:     #FBFAFF;
  --c-cream-2:   #E9E9EE;
  --c-ink:       #1F1F23;
  --c-ink-mid:   #6B6B75;
  --c-purple:    #8B3DFF;
  --c-purple-2:  #5E4CA9;
  --c-lavender:  #D8CBF0;
  --c-haze:      #EFE9FB;

  /* TYPE FAMILIES (2) */
  --f-display: 'Poffy', 'Arial Black', system-ui, sans-serif;
  --f-body:    'Public Sans', system-ui, -apple-system, sans-serif;

  /* TYPE SCALE (5) — fluid */
  --t-mega:    clamp(2.5rem, 5vw, 5rem);
  --t-display: clamp(1.5rem, 3vw, 2.75rem);
  --t-h3:      clamp(1.125rem, 1.4vw, 1.5rem);
  --t-body:    clamp(1rem, 0.35vw + 0.85rem, 1.1875rem);
  --t-small:   0.78125rem;

  /* SPACING SCALE (5) — fluid */
  --s-1: 0.5rem;
  --s-2: 1rem;
  --s-3: clamp(1.5rem, 2vw, 2.25rem);
  --s-4: clamp(2.5rem, 4vw, 4.5rem);
  --s-5: clamp(4rem, 7vw, 7.5rem);

  /* LAYOUT */
  --container:  min(96rem, 100% - 2.5rem);
  --reading:    62ch;
  --r:          0;

  /* BREAKPOINTS — declared for reference */
  --bp-sm:    640px;
  --bp-md:    768px;
  --bp-lg:    1024px;
  --bp-xl:    1280px;
  --bp-2xl:   1536px;
  --bp-ultra: 2048px;
}

@media (min-width: 2048px) {
  :root {
    --container: min(120rem, 100% - 5rem);
    --t-mega:    clamp(2.5rem, 5vw, 7.5rem);
    --t-display: clamp(1.75rem, 3vw, 4rem);
  }
}

/* Small phones (<=360px): trim the display scale a touch so a long single-word
   second line (e.g. "CATALOGUE.") fits instead of clipping at the edge. Still
   larger than the pre-bump size — just not the full 40px on tiny screens. */
@media (max-width: 360px) {
  :root { --t-mega: clamp(2.15rem, 5.5vw, 5rem); }
}

/* ============================================================
   RESET
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
/* Stop horizontal scroll from the intentional edge-bleed of the photo cutouts and
   the absolutely-positioned hint tooltip. Needs both: html clips the viewport
   scroll, body `clip` constrains the content without becoming a scroll container
   (so the sticky nav keeps working). */
html { overflow-x: hidden; }
body { overflow-x: clip; }
html, body { margin: 0; padding: 0; }
body {
  background: var(--c-cream);
  color: var(--c-ink);
  font-family: var(--f-body);
  font-size: var(--t-body);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img, svg { max-width: 100%; display: block; }
/* Ghost's editor writes width/height attributes onto content images, and those act as
   presentational hints for the CSS width/height properties. max-width caps the width,
   but without height:auto the height attribute becomes a fixed pixel height and the
   image stretches. Themed images (hero, cutouts, logos) set their height via
   class-based rules, which beat this element selector, so they're unaffected. */
img { height: auto; }
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; }
hr { border: 0; height: 1px; background: var(--c-ink); margin: 0; }

::selection { background: var(--c-purple); color: var(--c-cream); }

.container { width: var(--container); margin-inline: auto; }

/* ============================================================
   DISPLAY TYPE (Poffy)
   Uppercase source. Ligatures only.
   ============================================================ */
.brk {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-weight: 400;
  font-size: var(--t-mega);
  line-height: 0.85;
  letter-spacing: -0.005em;
  margin: 0;
  overflow-wrap: break-word;   /* safety net: a long word breaks rather than overflowing */
}
.brk > span { display: block; }
.brk > span.indent { padding-left: 1.5em; }
.brk > span.indent-2 { padding-left: 3em; }
/* On small phones the bigger heading font + the indent can push a long second-line
   word (e.g. "CATALOGUE.") off the edge — tame the indent so it wraps in bounds. */
@media (max-width: 480px) {
  .brk > span.indent   { padding-left: 0.6em; }
  .brk > span.indent-2 { padding-left: 1.2em; }
}

/* Highlight rectangle BEHIND a chunk of display text.
   Extends past the word into the gutter for a pasted-on feel. */
.hl {
  position: relative;
  display: inline-block;
  isolation: isolate;
  padding: 0 0.1em;
}
.hl::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-purple);
  z-index: -1;
}
.hl--lavender::before { background: var(--c-lavender); }
.hl--mute::before     { background: var(--c-purple-2); }
.hl--ink::before      { background: var(--c-ink); }
.hl--cream::before    { background: var(--c-cream); }

/* Flat colour block sitting BEHIND + slightly ABOVE a heading.
   Reusable across sections — tune via the --hb-* custom props.
   Add the class to any heading element. */
.head-box {
  position: relative;
  isolation: isolate;
}
.head-box::before {
  content: "";
  position: absolute;
  z-index: -1;
  top: var(--hb-top, -0.32em);
  left: var(--hb-left, -0.28em);
  width: var(--hb-w, 4.6em);
  height: var(--hb-h, 0.82em);
  background: var(--hb-color, var(--c-lavender));
}

/* small caps eyebrow */
.eye {
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  font-size: var(--t-small);
  font-weight: 500;
  margin: 0;
  color: var(--c-ink);
}
.eye--mute { color: var(--c-ink-mid); }

/* small caption tag — pasted-on rectangle */
.tag {
  display: inline-block;
  background: var(--c-purple);
  color: var(--c-cream);
  padding: 0.4rem 0.6rem 0.45rem;
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  font-size: var(--t-small);
  font-weight: 500;
  line-height: 1;
}
.tag--ink      { background: var(--c-ink); }
.tag--lavender { background: var(--c-lavender); color: var(--c-ink); }
.tag--cream    { background: var(--c-cream); color: var(--c-ink); }

/* editorial drop cap (versal) — large initial on a body paragraph */
.dropcap::first-letter {
  float: left;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-style: normal;          /* upright even when the paragraph is italic */
  font-size: 3.4em;
  line-height: 0.62;
  padding: 0.05em 0.14em 0 0;
  color: var(--c-purple);
}

/* magazine pull-quote — a pulled line set large with a spot rule */
.pullquote {
  position: relative;
  z-index: 1;               /* sit above the comp-c block that spills under it */
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.5rem, 2.2vw, 2.25rem);
  line-height: 1.02;
  margin: var(--s-3) 0 0;
  padding-left: 0.7rem;
  border-left: 3px solid var(--c-purple);
  max-width: 22ch;
}


/* ============================================================
   SPINE — magazine edge label + connecting rule.
   A vertical label stacked with a 1px tick. Anchored to the
   container (.spread__inner) so it tucks against the content
   column rather than floating in the outer margin.
   Top-left by default; --br mirrors it to the bottom-right.
   ============================================================ */
.spine {
  position: absolute;
  top: 0.25rem;
  left: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.9rem;
  z-index: 2;
}
.spine__label {
  writing-mode: vertical-rl;
  transform: rotate(180deg);   /* left edge reads bottom-to-top */
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.32em;
  font-size: var(--t-small);
  font-weight: 500;
  color: var(--c-ink-mid);
  white-space: nowrap;
  margin: 0;
}
.spine__line {
  width: 1px;
  height: clamp(3rem, 9vw, 7rem);
  background: var(--c-ink);
}
/* Apostrophes in the tracked-out vertical labels get equal space on both sides,
   so they float mid-gap. main.js wraps each apostrophe in .apos; killing its own
   trailing letter-spacing and pulling it toward the previous glyph closes the gap. */
.spine__label .apos { letter-spacing: 0; margin-inline-start: -0.18em; }

/* bottom-right mirror — line above, label below, reads top-to-bottom */
.spine--br {
  top: auto;
  left: auto;
  bottom: 0.25rem;
  right: 0;
  flex-direction: column-reverse;
}
.spine--br .spine__label { transform: none; }

/* light variant for dark (purple) sections */
.spine--light .spine__label { color: rgba(251,250,255,0.75); }
.spine--light .spine__line  { background: rgba(251,250,255,0.55); }

/* Mobile: drop the spine labels entirely (they crowd the narrow gutter) and
   reclaim that space by tightening the spread's side padding. */
@media (max-width: 768px) {
  .spine { display: none; }
  .spread__inner { padding-inline: 1.25rem; }
}

/* base spread — relative so float fragments anchor here */
.spread {
  position: relative;
}
.spread__inner {
  position: relative;   /* containing block for the spine */
  padding-inline: clamp(2.5rem, 5vw, 5.5rem);
}

/* ============================================================
   BTN-STAMP — the FUN brutalist button.
   Cream rectangle, chunky offset coloured block behind it,
   arrow that nudges right on hover.
   ============================================================ */
.btn-stamp {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 0.7em;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1rem, 1.2vw, 1.375rem);
  line-height: 1;
  padding: 1.1rem 1.5rem 1.1rem;
  color: var(--c-ink);
  background: var(--c-cream);
  border: 2px solid var(--c-ink);
  text-decoration: none;
  box-shadow: 0.55rem 0.55rem 0 var(--c-purple);
  transition:
    transform 0.18s cubic-bezier(.2,.7,.3,1),
    box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.btn-stamp:hover {
  transform: translate(-4px, -4px);
  box-shadow: 0.85rem 0.85rem 0 var(--c-purple);
}
.btn-stamp:active {
  transform: translate(3px, 3px);
  box-shadow: 0.2rem 0.2rem 0 var(--c-purple);
}
.btn-stamp .arr {
  font-family: var(--f-body);
  font-weight: 800;
  font-size: 1.3em;
  display: inline-block;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1);
}
.btn-stamp:hover .arr { transform: translateX(4px); }

.btn-stamp--lavender { box-shadow: 0.55rem 0.55rem 0 var(--c-lavender); }
.btn-stamp--lavender:hover { box-shadow: 0.85rem 0.85rem 0 var(--c-lavender); }
.btn-stamp--lavender:active { box-shadow: 0.2rem 0.2rem 0 var(--c-lavender); }

.btn-stamp--ink { box-shadow: 0.55rem 0.55rem 0 var(--c-ink); }
.btn-stamp--ink:hover { box-shadow: 0.85rem 0.85rem 0 var(--c-ink); }
.btn-stamp--ink:active { box-shadow: 0.2rem 0.2rem 0 var(--c-ink); }

.btn-stamp--mute { box-shadow: 0.55rem 0.55rem 0 var(--c-lavender); }
.btn-stamp--mute:hover { box-shadow: 0.85rem 0.85rem 0 var(--c-lavender); }
.btn-stamp--mute:active { box-shadow: 0.2rem 0.2rem 0 var(--c-lavender); }

/* compact stamp — for the nav CTA */
.btn-stamp--sm {
  font-size: clamp(0.8rem, 0.9vw, 0.95rem);
  padding: 0.5rem 0.85rem;
  gap: 0.5em;
  box-shadow: 0.3rem 0.3rem 0 var(--c-purple);
}
.btn-stamp--sm:hover { transform: translate(-2px, -2px); box-shadow: 0.5rem 0.5rem 0 var(--c-purple); }
.btn-stamp--sm:active { transform: translate(2px, 2px); box-shadow: 0.12rem 0.12rem 0 var(--c-purple); }

/* ============================================================
   MEMBERS PAYWALL CTA
   Ghost injects <aside class="gh-post-upgrade-cta"> on gated posts for non-
   members and styles it (rounded purple box, dim sign-in text) AFTER our
   stylesheet loads. We scope every rule under .post-single__body so it beats
   Ghost's single-class selectors on specificity. Ghost sets the box background
   and the button text colour INLINE, so the box keeps its purple (correct) and
   the button text is forced to ink with !important (the only one needed).
   Re-skins to match the theme: squared, offset ink shadow, stamp button,
   legible cream text.
   ============================================================ */
.post-single__body .gh-post-upgrade-cta { margin: var(--s-5) 0; }
.post-single__body .gh-post-upgrade-cta-content {
  border: 2px solid var(--c-ink);
  border-radius: 0;                            /* squared */
  box-shadow: 0.7rem 0.7rem 0 var(--c-ink);    /* theme offset shadow */
  padding: clamp(2rem, 4vw, 3.25rem);
  text-align: center;
  color: var(--c-cream);
}
.post-single__body .gh-post-upgrade-cta h2 {
  font-family: var(--f-display);
  color: var(--c-cream);
  margin: 0 0 var(--s-3);
}
/* "Already have an account? Sign in" — was dark-on-purple, now legible cream */
.post-single__body .gh-post-upgrade-cta p,
.post-single__body .gh-post-upgrade-cta small { color: var(--c-cream); }
.post-single__body .gh-post-upgrade-cta a:not(.gh-btn) {
  color: var(--c-cream);
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* Subscribe button -> cream stamp with ink offset shadow */
.post-single__body .gh-post-upgrade-cta a.gh-btn {
  display: inline-flex;
  align-items: center;
  font-family: var(--f-display);
  font-size: clamp(1rem, 1.2vw, 1.375rem);
  line-height: 1;
  padding: 1.1rem 1.5rem;
  margin: 0 0 var(--s-3);
  color: var(--c-ink) !important;              /* override Ghost's inline purple */
  background: var(--c-cream);
  border: 2px solid var(--c-ink);
  border-radius: 0;
  box-shadow: 0.55rem 0.55rem 0 var(--c-ink);
  transition: transform .18s cubic-bezier(.2,.7,.3,1), box-shadow .18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .gh-post-upgrade-cta a.gh-btn:hover {
  transform: translate(-4px, -4px);
  box-shadow: 0.85rem 0.85rem 0 var(--c-ink);
}
.post-single__body .gh-post-upgrade-cta a.gh-btn:active {
  transform: translate(3px, 3px);
  box-shadow: 0.2rem 0.2rem 0 var(--c-ink);
}

/* ============================================================
   NAV
   ============================================================ */
.nav {
  position: sticky; top: 0;
  background: var(--c-cream);
  border-bottom: 1px solid var(--c-ink);
  z-index: 50;
}
.nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 64px;
  gap: var(--s-3);
  width: var(--container);
  margin-inline: auto;
  padding-inline: clamp(2.5rem, 5vw, 5.5rem);   /* align with section content */
}
.nav__mark {
  display: flex;
  align-items: center;
}
.nav__mark img {
  height: clamp(26px, 3.2vw, 36px);
  width: auto;
}
/* Contents toggle — the only nav control, at every width. Opens the
   full-screen contents menu below. */
.nav__toggle {
  display: inline-flex;
  align-items: center;
  gap: 0.7rem;
  background: none;
  border: 0;
  padding: 0.4rem 0;
  color: var(--c-ink);
}
.nav__toggle-text {
  text-transform: uppercase;
  letter-spacing: 0.24em;
  font-size: var(--t-small);
  font-weight: 700;
}
/* SVG burger: the three lines share one rasterised glyph, so they're always
   identical thickness — no per-bar sub-pixel rounding at fractional display
   scaling (125%/150% on Windows). crispEdges keeps the strokes sharp. */
.nav__burger {
  display: block;
  width: 26px;
  height: 16px;
  color: var(--c-ink);
  shape-rendering: crispEdges;
}
.nav__toggle:hover { color: var(--c-purple); }
.nav__actions { display: inline-flex; align-items: center; gap: clamp(1rem, 2vw, 1.75rem); }
.nav__link { text-transform: uppercase; letter-spacing: 0.14em; font-size: var(--t-small); font-weight: 700; color: var(--c-ink); text-decoration: none; border: 1.5px solid var(--c-ink); padding: 0.45em 0.9em; transition: background 0.15s, color 0.15s; }
.nav__link:hover { background: var(--c-ink); color: var(--c-cream); }

/* ============================================================
   CONTENTS MENU — full-screen magazine "contents page".
   Toggled by the nav burger; slides in from the right. Masthead
   spread on the left, numbered table of contents on the right.
   ============================================================ */
.menu {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: var(--c-cream);
  color: var(--c-ink);
  overflow-y: auto;
  transform: translateX(100%);
  visibility: hidden;
  transition: transform 0.5s cubic-bezier(.2,.7,.3,1), visibility 0s linear 0.5s;
}
body.menu-open { overflow: hidden; }
body.menu-open .menu {
  transform: translateX(0);
  visibility: visible;
  transition: transform 0.5s cubic-bezier(.2,.7,.3,1), visibility 0s;
}
.menu__inner {
  min-height: calc(100% - 64px);   /* fill the area below the full-width top bar */
  width: var(--container);
  margin-inline: auto;
  padding: var(--s-4) clamp(2.5rem, 5vw, 5.5rem) var(--s-4);
  display: flex;
  flex-direction: column;
}
/* full-width top bar — the hairline spans the whole screen, exactly like .nav */
.menu__top {
  border-bottom: 1px solid var(--c-ink);
}
/* logo + close aligned exactly like .nav__inner (same width, margin, padding) */
.menu__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 64px;
  width: var(--container);
  margin-inline: auto;
  padding-inline: clamp(2.5rem, 5vw, 5.5rem);
}
.menu__mark { display: flex; align-items: center; }
.menu__mark img { height: clamp(26px, 3.2vw, 36px); width: auto; }
.menu__close {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  background: none;
  border: 0;
  color: var(--c-ink);
  text-transform: uppercase;
  letter-spacing: 0.24em;
  font-size: var(--t-small);
  font-weight: 700;
}
.menu__close:hover { color: var(--c-purple); }
.menu__close .x { font-size: 1.5em; line-height: 0; }

/* spread — single column on mobile, masthead + list on desktop */
.menu__spread {
  flex: 1;
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
  align-content: start;
  padding-bottom: var(--s-4);
}
@media (min-width: 900px) {
  .menu__spread {
    grid-template-columns: 0.9fr 1.1fr;
    gap: clamp(2rem, 5vw, 5rem);
  }
}
.menu__aside { display: flex; flex-direction: column; }
.menu__title { margin: var(--s-2) 0 var(--s-3); }
.menu__issue {
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  font-size: var(--t-small);
  font-weight: 500;
  color: var(--c-ink-mid);
  margin: 0 0 var(--s-3);
}
.menu__blurb {
  font-style: italic;
  font-size: clamp(1.0625rem, 0.5vw + 0.9rem, 1.3rem);
  line-height: 1.45;
  max-width: 30ch;
  margin: 0;
}
.menu__meta {
  margin: var(--s-4) 0 0;
  font-size: var(--t-small);
  letter-spacing: 0.04em;
  line-height: 1.7;
  color: var(--c-ink-mid);
}
@media (min-width: 900px) { .menu__meta { margin-top: auto; padding-top: var(--s-4); } }
.menu__meta a:hover { color: var(--c-purple); }
.menu__meta strong { color: var(--c-ink); font-weight: 700; }

/* the table of contents */
.menu__list { display: flex; flex-direction: column; }
.menu__row {
  display: grid;
  grid-template-columns: 2.5rem 1fr auto;
  align-items: center;
  gap: var(--s-1) var(--s-3);
  padding: var(--s-3) 0;
  border-top: 1px solid var(--c-ink);
}
.menu__row:first-child { border-top: 0; }
.menu__no {
  font-family: var(--f-body);
  font-size: var(--t-small);
  letter-spacing: 0.18em;
  font-weight: 700;
  color: var(--c-ink-mid);
  align-self: start;
  padding-top: 0.55rem;
}
.menu__text { min-width: 0; }
.menu__name {
  display: block;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  text-transform: uppercase;
  font-size: clamp(2.25rem, 5vw, 3.75rem);
  line-height: 0.9;
  letter-spacing: -0.01em;
}
.menu__desc {
  display: block;
  margin-top: 0.35rem;
  font-size: 1rem;
  color: var(--c-ink-mid);
}
.menu__row:hover .menu__name,
.menu__row:focus-visible .menu__name { color: var(--c-purple); }
.menu__soon { align-self: center; }
.menu__cta { margin-top: var(--s-4); align-self: start; }

/* staggered reveal once the panel is open */
.menu__title,
.menu__issue,
.menu__blurb,
.menu__meta,
.menu__row {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity 0.45s ease, transform 0.45s cubic-bezier(.2,.7,.3,1);
}
body.menu-open .menu__title,
body.menu-open .menu__issue,
body.menu-open .menu__blurb,
body.menu-open .menu__meta,
body.menu-open .menu__row {
  opacity: 1;
  transform: none;
}
/* the stamp only fades in, keeping its own transform/shadow free for hover */
.menu__cta {
  opacity: 0;
  transition: opacity 0.45s ease,
              transform 0.18s cubic-bezier(.2,.7,.3,1),
              box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
body.menu-open .menu__cta { opacity: 1; transition-delay: 0.46s, 0s, 0s; }

body.menu-open .menu__title { transition-delay: 0.10s; }
body.menu-open .menu__issue { transition-delay: 0.16s; }
body.menu-open .menu__blurb { transition-delay: 0.22s; }
body.menu-open .menu__row:nth-of-type(1) { transition-delay: 0.16s; }
body.menu-open .menu__row:nth-of-type(2) { transition-delay: 0.22s; }
body.menu-open .menu__row:nth-of-type(3) { transition-delay: 0.28s; }
body.menu-open .menu__row:nth-of-type(4) { transition-delay: 0.34s; }
body.menu-open .menu__row:nth-of-type(5) { transition-delay: 0.40s; }
body.menu-open .menu__meta { transition-delay: 0.50s; }

/* ============================================================
   CUTOUT — transparent-PNG figure on an offset colour block.
   The figure spills past the block (head over the top, limbs
   past the sides) for a pasted-on, sticker feel. Full colour,
   in deliberate contrast to the grayscale framed photos.
   Per-instance tuning lives in the --co-* custom properties.
   ============================================================ */
.cutout {
  position: relative;
  width: 100%;
  isolation: isolate;
}
.cutout__block {
  position: absolute;
  z-index: 0;
  background: var(--co-color, var(--c-purple));
  top:    var(--co-top, 26%);
  right:  var(--co-right, -6%);
  bottom: var(--co-bottom, -5%);
  left:   var(--co-left, 12%);
}
.cutout__img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
  /* silhouette shadow lifts the figure off the block */
  filter: drop-shadow(0 1.1rem 1.4rem rgba(31,31,35,0.22));
}

/* hero — the source figure is very tall (approx 1:2), so crop it to a 4:5
   window that fills the column width and trims the lower legs. The block
   still shows through the transparent silhouette and peeks at the edges. */
.cutout--hero { aspect-ratio: 5 / 7; }
.cutout--hero .cutout__img {
  height: 100%;
  object-fit: cover;
  object-position: center top;   /* anchor head to the top; crop only the legs */
}
/* block starts halfway up the figure and runs flush to its base, where the
   photo meets the next section — sits past the side edges for the sticker feel */
.cutout--hero .cutout__block {
  --co-top: 50%; --co-right: -7%; --co-bottom: 0%; --co-left: 12%;
  --co-color: var(--c-purple);
}

/* brief — thinking-with-pen bust on lavender. Peek LEFT + down only, so
   the block never crowds the body copy in the right-hand column. */
.cutout--brief .cutout__block {
  --co-top: 28%; --co-right: 8%; --co-bottom: -2%; --co-left: -6%;
  --co-color: var(--c-lavender);
}

/* services — standing figure on the lavender section. In the two-column layout it
   sits under the lede, so crop the lower body to a portrait window that keeps the
   left column balanced against the two services on the right. */
.cutout--svc {
  max-width: 26rem;
  margin-inline: 0;    /* left-aligned in the left column */
  /* no aspect-ratio/crop: the base .cutout__img (width:100%, height:auto) shows the
     full portrait, so nothing is cut off the sides. It just runs taller. */
}

/* service-page hero: the 1:1 uses a landscape shot, so crop it to a square window */
.svc-opener .cutout--brief { aspect-ratio: 1 / 1; }
.svc-opener .cutout--brief .cutout__img { height: 100%; object-fit: cover; object-position: center top; }
/* block reads as a pedestal grounding the lower ~60% of the figure: flush with the
   image's LEFT edge and BOTTOM edge, ~60% of the image's height, with a subtle peek
   to the right so the figure looks planted on the block rather than cropped by it */
.cutout--svc .cutout__block {
  --co-top: 40%; --co-right: -6%; --co-bottom: 0%; --co-left: 0%;
  --co-color: var(--c-purple);
}

/* ============================================================
   COVER (Hero)
   ============================================================ */
.cover {
  padding-block: var(--s-4) 0;   /* no bottom padding: the photo runs flush to the next section at every width */
}
.cover__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
  align-items: end;
}
.cover__heading-wrap {
  position: relative;
}
/* grouped intro block. the intro paragraphs come from the page body inside
   .cover__content; the CTA + note live in .cover__cta-group. The measure is set
   on .cover__content (base font) so it matches the old .cover__intro exactly;
   the h1 breaks out of that measure (see .cover__content h1 width below). */
.cover__content {
  max-width: 52ch;
}
.cover__cta-group {
  max-width: 52ch;
}
/* Cover section: headline lives in the page body as <h1>...<strong>...</strong></h1>.
   h1 = display .brk styling; strong = boxed word (hugs text, never full-width),
   reusing the manifesto box pattern (.man__content h2 strong). */
.cover__content h1 {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-weight: 400;
  font-size: var(--t-mega);
  line-height: 0.85;
  letter-spacing: -0.005em;
  /* Mobile: wrap normally so a long headline (e.g. "MAKE MARKETING") never forces the
     hero column wider than the screen. Desktop re-enables max-content below, where the
     headline breaks out of the intro measure and overlaps the photo. */
  width: auto;
  max-width: 100%;
  overflow-wrap: break-word;
  /* recreate the old headline-to-intro gap that .cover__intro margin-top gave,
     now that the h1 lives inside .cover__content with the intro paragraphs. */
  margin: 0 0 var(--s-3);
}
@media (min-width: 900px) {
  .cover__content h1 { width: max-content; max-width: none; margin-bottom: clamp(2rem, 2.4vw, 2.75rem); }
}
.cover__content h1 strong {
  display: block;
  width: fit-content;
  margin-left: 1.5em;   /* matches the old .brk > span.indent on line 2 */
  font-size: inherit;
  font-weight: inherit;
  font-style: normal;
  line-height: inherit;
  position: relative;
  isolation: isolate;
  padding: 0 0.1em;
}
.cover__content h1 strong::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-purple);
  z-index: -1;
}

.cover__sub,
.cover__content > p:first-of-type {
  margin: 0 0 1.25rem;   /* heading to intro text: a touch more air */
  font-style: normal;
  font-weight: 700;
  font-size: clamp(1.25rem, 0.85vw + 1.05rem, 1.75rem);
  line-height: 1.3;
}
.cover__sub--small,
.cover__content > p:nth-of-type(n+2) {
  font-size: clamp(1.0625rem, 0.45vw + 0.95rem, 1.25rem);
  color: var(--c-ink-mid);
  margin: 0 0 0.7em;          /* tight breathing room between the small intro lines */
}
/* the last small line carries the full gap down to the CTA */
.cover__sub--small:last-of-type,
.cover__content > p:last-of-type { margin-bottom: clamp(3.25rem, 5vw, 5.5rem); }   /* intro text to CTA: extra air above the button */
/* reassurance line directly under the CTA — small, italic */
.cover__note {
  margin: 1.25rem 0 0;   /* CTA to after text: a touch more air */
  font-style: italic;
  font-size: var(--t-small);
  letter-spacing: 0.02em;
  color: var(--c-ink-mid);
  max-width: 40ch;
}
.cover__photo-wrap {
  justify-self: end;
  width: 100%;
  position: relative;
}

@media (min-width: 900px) {
  /* Heading and photo are LAYERED in one grid cell. The photo is pinned to
     the right and dropped to the bottom (touching the next section); the
     heading + intro pin to the top, the intro drops to the bottom of its
     column. The cover gets a tall, magazine-cover height (capped on very
     large screens) and the grid stretches to fill it. */
  .cover {
    min-height: min(100svh - 4rem, 60rem);   /* fill the viewport minus the sticky nav */
    padding-block: var(--s-3) 0;              /* tighter top so the hero fits the viewport */
    display: flex;
    flex-direction: column;
  }
  .cover .spread__inner { flex: 1; display: flex; flex-direction: column; }
  .cover__grid { flex: 1; grid-template-columns: 1fr; align-items: end; }
  .cover__photo-wrap {
    grid-area: 1 / 1;
    justify-self: end;
    align-self: end;               /* drop the photo to the bottom edge */
    height: min(78vh, 40rem);      /* size by HEIGHT so the cover never outgrows the viewport */
    width: auto;
    aspect-ratio: 5 / 7;
    z-index: 0;
  }
  .cover__heading-wrap {
    grid-area: 1 / 1;
    align-self: stretch;           /* fill the tall cell so the group can drop */
    display: flex;
    flex-direction: column;
    justify-content: flex-end;     /* keep headline + intro together, low in the cell, with breathing room above */
    z-index: 2;   /* headline sits over the photo where they overlap */
    /* This full-cell layer sits over the photo column (and the sticky notes
       that live in it). Let clicks fall through its empty areas to the notes
       beneath, while keeping its own links/CTA clickable. */
    pointer-events: none;
  }
  /* Re-enable pointer events on the actual text (and links/CTA) so the
     headline and copy can be hovered and selected; the empty gaps in this
     layer stay click-through to the notes beneath.
     NOTE: anything interactive added to this hero must be added to this list, or
     it inherits pointer-events:none and silently refuses clicks above 900px. An
     <input> is NOT covered by the selectors below. */
  .cover__heading-wrap a,
  .cover__heading-wrap button,
  .cover__heading-wrap h1,
  .cover__heading-wrap p { pointer-events: auto; }
  /* headline + intro sit together near the bottom of the cell (see the
     heading-wrap's justify-content); the headline keeps a normal gap below it
     (via .cover__content h1 margin-bottom) and the group is held clear of the
     next section by the CTA group's bottom padding. */
  .cover__content,
  .cover__cta-group {
    max-width: 34ch;               /* tablet default; widened on real desktop below */
  }
  .cover__cta-group {
    padding-bottom: var(--s-4);    /* lift the whole group up off the bottom edge */
  }
  /* tablet: keep the (legacy) headline inside the left zone */
  .cover .brk { max-width: 52%; }
}

/* greater than 1200px: enough room to let the photo and intro breathe at full size and
   the headline overlap the image, magazine-style */
@media (min-width: 1200px) {
  .cover__photo-wrap { height: min(82vh, 46rem); }
  .cover__content,
  .cover__cta-group { max-width: 52ch; }
  .cover .brk { max-width: 70%; }
}

/* tablet / small-laptop band: shrink the heading stack so the whole hero —
   including the notes and the scroll cue — fits above the fold on short screens */
@media (min-width: 900px) and (max-width: 1199px) {
  .cover .brk,
  .cover__content h1 { font-size: clamp(2rem, 4.6vw, 3rem); }
  .cover__sub,
  .cover__content > p:first-of-type { font-size: clamp(1.1rem, 1.6vw, 1.35rem); margin-bottom: var(--s-1); }
  .cover__sub--small,
  .cover__content > p:nth-of-type(n+2) { font-size: clamp(0.95rem, 1.1vw, 1.05rem); margin-bottom: 0.6em; }
  .cover__sub--small:last-of-type,
  .cover__content > p:last-of-type { margin-bottom: var(--s-2); }
}

/* ============================================================
   OVERVIEW  — the core "specific-design" pattern
   One-word broken heading + colour band through it + large image
   right + white-bordered inset overlapping + content box under
   inset + lined vertical spine.
   ============================================================ */
.over {
  padding-block: var(--s-5);
  background: var(--c-cream);
  position: relative;
  overflow-x: clip;   /* trim the full-bleed band at the viewport edge */
}
.over__layout { position: relative; }

/* (1) one-word broken heading */
.over__title {
  position: relative;
  z-index: 2;
  margin: 0;
  width: max-content;
  max-width: 100%;
}

/* (2) colour band — starts partway through the heading, runs right */
.over__band {
  background: var(--c-purple);
  color: var(--c-cream);
  margin-top: -1rem;   /* pull the band up so the heading overlaps it slightly (mobile/stacked layout) */
  padding: var(--s-3);
}
.over__band-text {
  margin: 0;
  font-size: clamp(1.15rem, 0.6vw + 1rem, 1.6rem);
  font-weight: 500;
  line-height: 1.3;
  max-width: 38ch;
}
.over__band-text strong { font-weight: 700; }

/* image area + content box — stacked by default (mobile) */
.over__lower { margin-top: var(--s-4); }
.over__img-large {
  width: 100%;
  height: auto;                  /* let aspect-ratio set the height, not the width/height attrs */
  aspect-ratio: 5 / 4;
  object-fit: cover;
  object-position: center top;   /* crop the bottom, keep the top */
  filter: grayscale(1) contrast(1.08);
  display: block;
}
.over__inset {
  margin: calc(-1 * var(--s-4)) 0 0 0;
  width: 68%;
  border: 0.55rem solid var(--c-cream);
  background: var(--c-lavender);
  position: relative;
  z-index: 3;
}
.over__inset img {
  display: block;
  width: 100%;
  height: auto;                 /* let aspect-ratio set the height, not the width/height attrs */
  aspect-ratio: 1;              /* square inset */
  object-fit: cover;
  object-position: center top;
  filter: grayscale(1) contrast(1.08);
}
.over__box {
  margin-top: var(--s-3);
  padding: var(--s-3);   /* even padding on all sides */
}
.over__box h3 {
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: var(--t-small);
  font-weight: 700;
  margin: 0 0 0.6rem;
}
.over__box p {
  margin: 0;
  font-size: clamp(1.0625rem, 0.4vw + 0.95rem, 1.25rem);
  line-height: 1.55;
}
/* secondary CTA link — matches the service links in The 3 P's.
   Scoped under .over__box so it outranks `.over__box p { margin: 0 }`. */
.over__box .over__cta { margin: var(--s-2) 0 0; }
.over__cta a {
  font-family: var(--f-body);
  font-weight: 700;
  border-bottom: 2px solid var(--c-purple);
  padding-bottom: 2px;
}
.over__cta a:hover { color: var(--c-purple); }

/* desktop composition — overlaps + band-through-heading */
@media (min-width: 900px) {
  /* (2) band sits behind the heading, begins ~32% across,
     bleeds to the container's right edge, subheading text mid-band */
  /* heading + band share one grid cell, so the cell reserves the height
     of whichever is taller. Images flow AFTER it — never under the band. */
  .over__head {
    display: grid;
    position: relative;
  }
  .over__title {
    grid-area: 1 / 1;
    align-self: start;
  }
  .over__band {
    grid-area: 1 / 1;
    align-self: start;
    z-index: 0;
    /* offsets scale with the heading size, so the band always starts
       partway through the word and sits behind its lower portion */
    margin-top: calc(var(--t-mega) * 0.5);
    margin-left: calc(var(--t-mega) * 1.1);
    margin-right: calc(50% - 50vw);   /* over-bleed right; .over clips it at the viewport edge */
    /* text lives in the right half of the band — a real column, not a margin */
    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: center;
    min-height: 6.5rem;
  }
  .over__band-text {
    grid-column: 2;
    max-width: 34ch;
    padding-right: 4rem;
  }

  /* (3)(4)(5) two-row grid:
     row 1 = large image (right, dominant) + inset (left, overlapping)
     row 2 = compressed content box under the inset */
  .over__lower {
    position: relative;
    margin-top: var(--s-5);
    display: grid;
    grid-template-columns: minmax(0, 0.5fr) minmax(0, 1.2fr);
    column-gap: 0;
    align-items: stretch;
  }
  /* right column — the tall feature image */
  .over__img-large {
    grid-column: 2;
    grid-row: 1;
    align-self: start;
    width: 100%;
    aspect-ratio: 1 / 1;       /* taller than before — the main feature */
    height: auto;
    z-index: 1;
  }
  /* left column — inset stacked above box, both pinned to the bottom */
  .over__left {
    grid-column: 1;
    grid-row: 1;
    min-width: 0;              /* allow the column to stay narrow so the inset can spill over the image */
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    gap: var(--s-3);
    z-index: 2;
  }
  .over__inset {
    align-self: flex-start;
    margin: 0;
    width: 128%;               /* extend right to overlap the large image */
    z-index: 3;
  }
  .over__box {
    margin-top: 0;             /* spacing handled by the flex gap */
  }
}

/* ============================================================
   THE 3 P's
   Fragmented grid — title TL, lede TR, photo BL, list BR.
   ============================================================ */
.threes {
  padding-block: var(--s-5);
  background: var(--c-lavender);
  position: relative;
}
.threes__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
}
@media (min-width: 900px) {
  .threes__grid {
    grid-template-columns: 1fr 1.2fr;   /* left: lede + photo · right: the two services */
    column-gap: clamp(2rem, 5vw, 5rem);
    row-gap: var(--s-4);
    align-items: start;
  }
  .threes__title { grid-column: 1 / -1; }
  .threes__left  { grid-column: 1; }
  .threes__list  { grid-column: 2; }
}
/* left column: lede sitting above the photo */
.threes__left { display: flex; flex-direction: column; gap: var(--s-1); }
.threes__title {
  margin: 0;
  --hb-color: var(--c-purple);
  --hb-w: 3.2em;
}
.threes__lede {
  font-size: clamp(1.0625rem, 0.5vw + 0.9rem, 1.3rem);
  line-height: 1.45;
  max-width: 34ch;
  margin: 0;
}
.threes__lede p { margin: 0 0 var(--s-2); }
.threes__lede p:last-child { margin-bottom: 0; }
.threes__list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.threes__row {
  display: grid;
  grid-template-columns: 3rem 1fr;
  gap: var(--s-2);
  border-top: 1px solid var(--c-ink);
  padding-block: var(--s-3);
}
.threes__row:last-child { border-bottom: 1px solid var(--c-ink); }
.threes__no {
  font-family: var(--f-body);
  font-size: var(--t-small);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--c-ink-mid);
  padding-top: 0.4rem;
}
.threes__name {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.75rem, 3.5vw, 3rem);
  line-height: 0.9;
  margin: 0 0 0.4em;
  letter-spacing: -0.005em;
}
.threes__name .indent { display: inline-block; padding-left: 1em; }
.threes__body {
  font-size: 1rem;
  line-height: 1.55;
  max-width: 52ch;
  margin: 0;
}
/* service CTA — minimal affordance; full styling TBD */
.threes__cta {
  margin: var(--s-2) 0 0;
}
.threes__cta a {
  font-family: var(--f-body);
  font-weight: 700;
  border-bottom: 2px solid var(--c-purple);
  padding-bottom: 2px;
}
.threes__cta a:hover { color: var(--c-purple); }

/* ============================================================
   MANIFESTO
   ============================================================ */
/* Full-ink "chapter break" page — the dramatic dark spread. */
.man {
  padding-block: var(--s-5);
  background: var(--c-ink);
  color: var(--c-cream);
}
/* Editorial manifesto: setup line (TL), giant statement (full),
   support + payoff offset to the right. A pull-quote, not a wall. */
.man__layout {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
}
.man__setup {
  margin: 0;
  font-style: italic;
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.375rem);
  line-height: 1.45;
  max-width: 46ch;
  color: rgba(251,250,255,0.7);
}
/* Bridge: setup paragraph rendered via Ghost {{content}} loses the element-level class.
   .man__setup--content wraps rendered p tags so they inherit the same styles. */
.man__setup--content p {
  margin: 0;
  font-style: italic;
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.375rem);
  line-height: 1.45;
  max-width: 46ch;
  color: rgba(251,250,255,0.7);
}
.man__statement {
  margin: 0;
  font-size: clamp(2.75rem, 11vw, 9rem);
  line-height: 0.82;
}
/* setup line sits small above the oversized payoff line */
.man__statement-sm {
  font-size: 0.4em;
  line-height: 0.95;
  margin-bottom: 0.08em;
}
.man__support {
  max-width: 52ch;
  font-size: clamp(1.0625rem, 0.4vw + 0.95rem, 1.25rem);
  line-height: 1.55;
}
@media (min-width: 900px) {
  .man__support { margin-left: auto; }   /* push the resolution to the right */
}
.man__support p { margin: 0 0 var(--s-2); }
.man__payoff {
  margin: var(--s-3) 0 0;
  font-weight: 700;
  font-size: clamp(1.25rem, 1.2vw + 1rem, 1.75rem);
  line-height: 1.25;
}

/* Bridge: full-body manifesto rendered via Ghost {{content}}.
   .man__content is a sub-grid container holding all elements in order:
     p:has(~h2)  = setup paragraph (dropcap italic), styled like .man__setup
     h2          = headline container; text node = small line, strong = big boxed line
     h2 text     = "WRITE LIKE YOU" - h2 is set to the small size so plain text is small
     h2 strong   = "MEAN IT" - overridden to display size + .hl rectangle
     h2~p        = support paragraphs, styled like .man__support
     last h2~p   = payoff line, styled like .man__payoff
     p strong    = inline .hl box for payoff word (e.g. "difference.") */
.man__content {
  display: block;
}
.man__content p:has(~ h2) {
  margin: 0 0 var(--s-4);
  font-style: italic;
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.375rem);
  line-height: 1.45;
  max-width: 46ch;
  color: rgba(251,250,255,0.7);
}
.man__content p:has(~ h2):first-child::first-letter {
  float: left;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-style: normal;
  font-size: 3.4em;
  line-height: 0.62;
  padding: 0.05em 0.14em 0 0;
  color: var(--c-purple);
}
/* h2 base size = the small "setup" line (plain text "WRITE LIKE YOU") */
.man__content h2 {
  margin: 0 0 var(--s-4);
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-weight: 400;
  font-size: clamp(1.1rem, 4.4vw, 3.6rem);
  line-height: 0.95;
}
/* strong = the big boxed line ("MEAN IT"): own line, box hugs the words */
.man__content h2 strong {
  display: block;
  width: fit-content;
  font-size: clamp(2.75rem, 11vw, 9rem);
  line-height: 0.82;
  margin: 0.08em 0 0 0.6em;
  font-weight: 400;
  font-style: normal;
  position: relative;
  isolation: isolate;
  padding: 0 0.1em;
}
.man__content h2 strong::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-purple);
  z-index: -1;
}
/* Support paragraphs after the h2 */
.man__content h2 ~ p {
  max-width: 52ch;
  font-size: clamp(1.0625rem, 0.4vw + 0.95rem, 1.25rem);
  line-height: 1.55;
  margin: 0 0 var(--s-2);
}
/* Last support paragraph = payoff sizing. Its font is larger than the support
   paragraphs, so 52ch would render wider than the column above — cap it tighter
   (in its own ch) so it fits that column and the sentence wraps. */
.man__content h2 ~ p:last-child {
  font-weight: 700;
  font-size: clamp(1.25rem, 1.2vw + 1rem, 1.75rem);
  line-height: 1.25;
  margin: var(--s-3) 0 0;
  max-width: 35ch;
}
@media (min-width: 900px) {
  .man__content h2 ~ p { margin-left: auto; }
  .man__content h2 ~ p:last-child { margin-left: auto; text-align: right; }
}
/* Inline payoff box: <strong> inside any support paragraph (e.g. "difference.") */
.man__content h2 ~ p strong {
  position: relative;
  display: inline-block;
  isolation: isolate;
  padding: 0 0.1em;
  font-weight: inherit;
}
.man__content h2 ~ p strong::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-purple);
  z-index: -1;
}

/* Bridge: .threes__name and .threes__body from Ghost page content.
   Ghost wraps page title in plain text; body wraps in a <p>.
   These selectors strip the default Ghost .kg-* card margins. */
.threes__name--content {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(2rem, 5.5vw, 3.75rem);
  line-height: 0.88;
  letter-spacing: -0.005em;
  margin: 0 0 var(--s-2);
}
.threes__body--content {
  font-size: 1rem;
  line-height: 1.55;
  margin: 0 0 var(--s-2);
}
.threes__body--content p { margin: 0; }
/* Card name lives in the page body as <h3>DONE<br>FOR YOU</h3>.
   Mirrors .threes__name exactly; the <br> gives the two-line break. */
.threes__body--content h3 {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.75rem, 3.5vw, 3rem);
  line-height: 0.9;
  margin: 0 0 0.4em;
  letter-spacing: -0.005em;
}
.threes__lede p { margin: 0 0 var(--s-2); }
.threes__lede p:last-child { margin-bottom: 0; }

/* ============================================================
   THE BRIEF
   ============================================================ */
.brief {
  padding-block: var(--s-5);
}
.brief__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
  align-items: start;
}
@media (min-width: 900px) {
  .brief__grid { grid-template-columns: 5fr 7fr; gap: clamp(2rem, 3vw, 3.5rem); }
}
.brief__photo-wrap { position: relative; }
.brief__title { margin: 0 0 var(--s-3); }
/* smaller setup line above the oversized highlighted payoff line */
.brief__title-sm {
  font-size: 0.5em;
  line-height: 0.95;
  margin-bottom: 0.1em;
}
.brief__lede {
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.3rem);
  line-height: 1.45;
  max-width: 42ch;
  margin: 0 0 var(--s-3);
}
.brief__list {
  list-style: none;
  padding: 0;
  margin: 0 0 var(--s-4);
  max-width: 56ch;
}
.brief__list li {
  display: grid;
  grid-template-columns: 2.5rem 1fr;
  column-gap: var(--s-2);
  border-top: 1px solid var(--c-ink);
  padding-block: var(--s-2);
  align-items: baseline;
}
.brief__list li:last-child { border-bottom: 1px solid var(--c-ink); }
.brief__list small {
  font-size: var(--t-small);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--c-ink-mid);
}

/* ============================================================
   STYLING BRIDGE — Ghost page {{content}} inside brief/about
   Maps generic <p>/<ul>/<li> to the design's bespoke classes.
   ============================================================ */

/* Brief section: headline lives in the page body as
   <h2>MAKE MARKETING<br><strong>MAKE SENSE</strong></h2>.
   Base h2 = the small setup line (matches old .brief__title-sm = 0.5em of mega);
   strong = the oversized boxed payoff line (matches old .brief__title line 2 + .hl). */
.brief__content h2 {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-weight: 400;
  font-size: calc(var(--t-mega) * 0.5);
  line-height: 0.95;
  letter-spacing: -0.005em;
  margin: 0 0 var(--s-3);
}
.brief__content h2 strong {
  display: inline-block;
  width: fit-content;
  font-size: var(--t-mega);
  line-height: 0.85;
  font-weight: 400;
  font-style: normal;
  margin-top: 0.1em;
  position: relative;
  isolation: isolate;
  padding: 0 0.1em;
}
.brief__content h2 strong::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-purple);
  z-index: -1;
}

/* Brief section: first <p> styled like .brief__lede */
.brief__content p {
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.3rem);
  line-height: 1.45;
  max-width: 42ch;
  margin: 0 0 var(--s-3);
}

/* Brief section: editable ordered list styled like .brief__list.
   Numbers (01, 02, ...) are generated via a CSS counter so the page
   stays editable in Ghost (Cass can reorder; numbers re-flow). */
.brief__content ol {
  list-style: none;
  padding: 0;
  margin: 0 0 var(--s-4);
  max-width: 56ch;
  counter-reset: brief;
}
.brief__content ol li {
  display: grid;
  grid-template-columns: 2.5rem 1fr;
  column-gap: var(--s-2);
  border-top: 1px solid var(--c-ink);
  padding-block: var(--s-2);
  align-items: baseline;
  counter-increment: brief;
}
.brief__content ol li:last-child { border-bottom: 1px solid var(--c-ink); }
.brief__content ol li::before {
  content: counter(brief, decimal-leading-zero);
  font-size: var(--t-small);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--c-ink-mid);
}

/* About section: .over__content prose inside .over__box */
.over__content p {
  margin: 0 0 var(--s-2);
  font-size: clamp(0.9375rem, 0.3vw + 0.875rem, 1.0625rem);
  line-height: 1.55;
}
.over__content p:last-child { margin-bottom: 0; }

/* ============================================================
   NEWSLETTER (full-bleed purple)
   ============================================================ */
.news {
  background: var(--c-purple);
  color: var(--c-cream);
  padding-block: var(--s-5);
  position: relative;
}
.news .eye { color: rgba(251,250,255,0.85); }
.news .eye--mute { color: rgba(251,250,255,0.65); }
.news__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
}
@media (min-width: 900px) {
  .news__grid { grid-template-columns: 6fr 6fr; gap: clamp(2rem, 3vw, 3.5rem); align-items: baseline; }
}
.news__title { margin: 0; color: var(--c-cream); }
.news__title .hl::before { background: var(--c-ink); }

/* Newsletter: headline lives in the page body as
   <h2>GET MY<br><strong>EMAILS.</strong></h2>.
   Base h2 = display .brk size in cream; strong = boxed line (ink background),
   indented to match the old .brk > span.indent on line 2. */
.news__content h2 {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-weight: 400;
  font-size: var(--t-mega);
  line-height: 0.85;
  letter-spacing: -0.005em;
  margin: 0;
  color: var(--c-cream);
}
.news__content h2 strong {
  display: block;
  width: fit-content;
  margin-left: 1.5em;   /* matches old .brk > span.indent on line 2 */
  font-size: inherit;
  font-weight: inherit;
  font-style: normal;
  line-height: inherit;
  position: relative;
  isolation: isolate;
  padding: 0 0.1em;
}
.news__content h2 strong::before {
  content: "";
  position: absolute;
  inset: 14% -0.35em 2% -0.15em;
  background: var(--c-ink);
  z-index: -1;
}
/* P.S. blurb paragraph(s) in the body: mirror the old .news__ps styling. */
.news__content p {
  margin-top: var(--s-3);
  font-style: italic;
  font-size: clamp(0.875rem, 0.3vw + 0.78rem, 1.0625rem);
  color: var(--c-cream);
  opacity: 0.9;
  max-width: 56ch;
  line-height: 1.4;
}
.news__form-wrap { position: relative; }

.news__form {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-2);
  background: transparent;
}
.news__field {
  position: relative;
  border: 2px solid var(--c-cream);
}
.news__field label {
  position: absolute;
  top: 0.7rem;
  left: 1.1rem;
  font-size: var(--t-small);
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--c-cream);
  opacity: 0.85;
  pointer-events: none;
}
.news__field input {
  width: 100%;
  background: transparent;
  border: 0;
  font-family: var(--f-body);
  font-size: 1.125rem;
  padding: 2rem 1.1rem 1rem;
  color: var(--c-cream);
}
.news__field input::placeholder { color: rgba(251,250,255,0.55); }
.news__field input:focus { outline: 2px solid var(--c-cream); outline-offset: -5px; }
.news__submit-wrap {
  margin-top: 0;
  display: flex;
  align-items: center;
  gap: var(--s-3);
  flex-wrap: wrap;
}
.news__fine {
  margin-top: var(--s-3);
  font-size: var(--t-small);
  font-style: italic;
  letter-spacing: 0.04em;
  max-width: 56ch;
  color: var(--c-cream);
  opacity: 0.9;
  line-height: 1.55;
}
.news__ps {
  margin-top: var(--s-3);
  font-style: italic;
  font-size: clamp(0.875rem, 0.3vw + 0.78rem, 1.0625rem);
  color: var(--c-cream);
  opacity: 0.9;
  max-width: 26ch;
  line-height: 1.4;
}

/* ============================================================
   THE SEALED SECTION — Letters to the editor.
   Dark spread. Eyebrow + heading + intro top-left, a single
   STAR LETTER boxed top-right, then the rest of the mail flowing
   in balanced magazine columns below with hairline column rules.
   ============================================================ */
.mail {
  background: var(--c-ink);
  color: var(--c-cream);
  padding-block: var(--s-5);
  position: relative;
}
.mail .eye      { color: rgba(251,250,255,0.85); }
.mail .eye--mute { color: rgba(251,250,255,0.55); }

/* head — heading/intro left, star letter right */
.mail__head {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
  margin-bottom: var(--s-5);
}
@media (min-width: 900px) {
  .mail__head {
    grid-template-columns: 1.05fr 1fr;
    column-gap: clamp(2rem, 5vw, 5rem);
    align-items: start;
  }
}
.mail__title {
  margin: var(--s-2) 0 var(--s-3);
  color: var(--c-cream);
}
.mail__title .hl::before { background: var(--c-purple); }
.mail__intro {
  font-size: clamp(1.0625rem, 0.5vw + 0.9rem, 1.3rem);
  line-height: 1.5;
  max-width: 42ch;
  margin: 0;
  color: rgba(251,250,255,0.82);
}
.mail__intro em { color: var(--c-cream); }

/* STAR LETTER — the one featured, boxed testimonial */
.mail__star {
  position: relative;
  margin: var(--s-2) 0 0;
  background: var(--c-purple);
  color: var(--c-cream);
  border: 2px solid var(--c-cream);
  padding: clamp(1.9rem, 3vw, 2.75rem) clamp(1.5rem, 2.5vw, 2.25rem) clamp(1.5rem, 2.5vw, 2.25rem);
  box-shadow: 0.7rem 0.7rem 0 var(--c-lavender);
}
.mail__star-tag {
  position: absolute;
  top: 0;
  left: clamp(1.5rem, 2.5vw, 2.25rem);
  transform: translateY(-50%);
}
.mail__star-quote {
  margin: 0 0 var(--s-3);
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.4rem);
  line-height: 1.42;
  font-weight: 500;
}
.mail__cite,
.mail__sign {
  display: block;
  font-family: var(--f-body);
  font-style: normal;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  font-size: var(--t-small);
  font-weight: 700;
}
.mail__cite { color: var(--c-cream); }

/* a small labelled rule introducing the columns */
.mail__rule {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  margin-bottom: var(--s-3);
}
.mail__rule::after {
  content: "";
  flex: 1;
  height: 1px;
  background: rgba(251,250,255,0.25);
}

/* the mailbag — true magazine columns with hairline rules */
.mail__columns {
  columns: 1;
  column-gap: clamp(1.5rem, 3vw, 3rem);
  column-rule: 1px solid rgba(251,250,255,0.18);
}
@media (min-width: 640px)  { .mail__columns { columns: 2; } }
@media (min-width: 1024px) { .mail__columns { columns: 3; } }
@media (min-width: 1536px) { .mail__columns { columns: 4; } }

.mail__letter {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
  margin: 0 0 var(--s-3);
  padding-bottom: var(--s-3);
  border-bottom: 1px solid rgba(251,250,255,0.18);
}
.mail__kicker {
  display: block;
  font-family: var(--f-body);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  font-size: var(--t-small);
  font-weight: 700;
  color: var(--c-lavender);
  margin: 0 0 0.55rem;
}
/* every third kicker gets the emphasis treatment: instead of low-contrast
   purple TEXT on the dark ground, it becomes a pasted-on purple chip with
   cream text — readable, and echoes the .hl / .tag highlight motif. */
.mail__letter:nth-of-type(3n) .mail__kicker {
  display: inline-block;
  color: var(--c-cream);
  background: var(--c-purple);
  padding: 0.25rem 0.5rem;
}
.mail__quote {
  margin: 0 0 0.7rem;
  font-size: 1rem;
  line-height: 1.55;
  color: rgba(251,250,255,0.9);
}
.mail__sign { color: var(--c-cream); }

/* purple versal on the lead letter — editorial flourish */
.mail__letter--lead .mail__quote::first-letter {
  float: left;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: 3.2em;
  line-height: 0.62;
  padding: 0.05em 0.12em 0 0;
  color: var(--c-purple);
}

/* loud one-liners blown up in display type — pull-quotes in the flow */
.mail__letter--loud .mail__quote {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.5rem, 2.4vw, 2.1rem);
  line-height: 1.04;
  color: var(--c-cream);
}

/* ============================================================
   SINGLE POST
   ============================================================ */
.post-single {
  padding-block: var(--s-4);
}
.post-single__article {
  max-width: 100%;
}
.post-single__header {
  padding-block: var(--s-3) var(--s-3);
  border-bottom: 1.5px solid rgba(20,15,40,0.15);
}
.post-single__meta {
  display: flex;
  gap: var(--s-2);
  align-items: center;
  font-family: var(--f-body);
  font-size: var(--t-small);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(20,15,40,0.55);
  margin-bottom: var(--s-2);
}
.post-single__tag {
  background: var(--c-purple);
  color: var(--c-cream);
  padding: 0.2rem 0.6rem;
  font-weight: 700;
}
.post-single__title {
  font-family: var(--f-display);
  font-size: clamp(2.2rem, 5vw + 1rem, 5rem);
  line-height: 1.04;
  margin: 0 0 var(--s-2);
}
.post-single__excerpt {
  font-size: clamp(1.0625rem, 0.5vw + 0.95rem, 1.35rem);
  line-height: 1.5;
  color: rgba(20,15,40,0.7);
  max-width: 72ch;
  font-weight: 700;
}
.post-single__hero {
  width: var(--container);
  margin: 0 auto var(--s-4);
  max-height: 56vh;
  overflow: hidden;
}
.post-single__col {
  max-width: 46rem;
  margin-inline: auto;
  padding-inline: clamp(1.5rem, 5vw, 2rem);
}
.post-single__hero img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.post-single__body {
  padding-block: var(--s-3);
}
.post-single__body p {
  max-width: 72ch;
  line-height: 1.7;
  margin-bottom: var(--s-2);
}
/* purple versal on the first paragraph of the post */
.post-single__body > p:first-of-type::first-letter {
  float: left;
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: 3.4em;
  line-height: 0.62;
  padding: 0.05em 0.14em 0 0;
  color: var(--c-purple);
}
/* a touch more breathing room between list items (gap, not line-height) */
.post-single__body ol,
.post-single__body ul {
  max-width: 72ch;
  padding-left: 1.4em;
  margin: 0 0 var(--s-2);
}
.post-single__body li { margin-bottom: 0.5em; line-height: 1.6; }
.post-single__body li:last-child { margin-bottom: 0; }
/* links stand out */
.post-single__body a {
  color: var(--c-purple);
  text-decoration: underline;
  text-underline-offset: 0.15em;
}
.post-single__body a:hover { text-decoration-thickness: 2px; }
/* horizontal rule — generous space above and below by default */
.post-single__body hr { margin-block: var(--s-4); background: rgba(20,15,40,0.18); }
/* embeds (video etc.) should own the column, not sit tiny */
.post-single__body .kg-embed-card { margin-block: var(--s-4); }
.post-single__body .kg-embed-card iframe { width: 100% !important; max-width: 100%; }
.post-single__body iframe[src*="youtube"],
.post-single__body iframe[src*="youtu.be"],
.post-single__body iframe[src*="vimeo"],
.post-single__body iframe[src*="player"] { aspect-ratio: 16 / 9; height: auto !important; }
/* captions read as small print */
.post-single__body figcaption {
  font-size: var(--t-small);
  line-height: 1.4;
  color: var(--c-ink-mid);
  text-align: center;
  margin-top: 0.6rem;
}
/* Ghost "call to action" card, rebranded to match the site: a squared card with
   the same offset-shadow treatment as the Brief checklist, a stamp-style button,
   and generous top/bottom padding. !important overrides Ghost's inline colours. */
.post-single__body .kg-cta-card {
  border: 2px solid var(--c-ink) !important;
  background: var(--c-purple) !important;
  box-shadow: 0.6rem 0.6rem 0 var(--c-ink);
  border-radius: 0 !important;
  padding: var(--s-4) clamp(1.4rem, 3.5vw, 2.4rem) !important;
  margin-block: var(--s-4);
}
.post-single__body .kg-cta-card .kg-cta-content,
.post-single__body .kg-cta-card .kg-cta-content-inner {
  background: transparent !important;
  padding: 0 !important;
  border-radius: 0 !important;
}
.post-single__body .kg-cta-sponsor-label {
  font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.14em;
  font-size: var(--t-small); font-weight: 700; color: rgba(251,250,255,0.85) !important;
  border-color: rgba(251,250,255,0.5) !important; margin-bottom: var(--s-2);
}
.post-single__body .kg-cta-text { font-size: var(--t-body); line-height: 1.6; color: var(--c-cream) !important; }
.post-single__body .kg-cta-text a { color: var(--c-cream); text-decoration: underline; text-underline-offset: 0.15em; }
/* white stamp button with a black (ink) shadow */
.post-single__body .kg-cta-button {
  display: inline-flex !important; align-items: center; gap: 0.5em;
  font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(0.95rem, 1.1vw, 1.2rem); line-height: 1;
  color: var(--c-ink) !important; background: var(--c-cream) !important;
  border: 2px solid var(--c-ink) !important; border-radius: 0 !important;
  box-shadow: 0.45rem 0.45rem 0 var(--c-ink);
  padding: 0.85rem 1.3rem !important; height: auto !important; min-height: 0 !important;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .kg-cta-button-text { color: var(--c-ink) !important; font-family: var(--f-display); }
.post-single__body .kg-cta-button:hover { transform: translate(-3px,-3px); box-shadow: 0.7rem 0.7rem 0 var(--c-ink); }

/* Ghost "product" card (/product) — the cream stamped card the CTA used to be:
   ink border, lavender offset shadow, squared, with a cream stamp button. */
.post-single__body .kg-product-card { margin-block: var(--s-4); }
.post-single__body .kg-product-card-container {
  border: 1.5px solid var(--c-ink) !important;
  background: var(--c-cream) !important;
  box-shadow: 0.6rem 0.6rem 0 var(--c-lavender);
  border-radius: 0 !important;
  padding: var(--s-4) clamp(1.4rem, 3.5vw, 2.4rem) !important;
}
.post-single__body .kg-product-card-title {
  font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.4rem, 2.2vw, 2rem); line-height: 1; color: var(--c-ink); margin: 0 0 var(--s-2);
}
.post-single__body .kg-product-card-description { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; }
.post-single__body .kg-product-card-description a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }
.post-single__body .kg-product-card-button {
  display: inline-flex !important; align-items: center; gap: 0.5em; margin-top: var(--s-2);
  font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(0.95rem, 1.1vw, 1.2rem); line-height: 1;
  color: var(--c-ink) !important; background: var(--c-cream) !important;
  border: 2px solid var(--c-ink) !important; border-radius: 0 !important;
  box-shadow: 0.45rem 0.45rem 0 var(--c-purple);
  padding: 0.85rem 1.3rem !important; height: auto !important; min-height: 0 !important;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .kg-product-card-button:hover { transform: translate(-3px,-3px); box-shadow: 0.7rem 0.7rem 0 var(--c-purple); }

/* Ghost SIGNUP CARD (kg-signup-card) — the in-post newsletter CTA. Re-skin to
   match the CTA card + homepage newsletter: purple block, offset ink shadow,
   squared, display heading, cream stamp button. Ghost sets the bg + text colours
   inline (and the button uses .kg-style-accent), so we !important and scope the
   button under .kg-signup-card to win. We NEVER touch `display` — Ghost's members
   JS toggles that to hide the card from existing members. */
.post-single__body .kg-signup-card {
  border: 2px solid var(--c-ink) !important;
  background-color: var(--c-purple) !important;   /* was inline grey */
  box-shadow: 0.6rem 0.6rem 0 var(--c-ink);
  border-radius: 0 !important;
  padding: var(--s-4) clamp(1.4rem, 3.5vw, 2.4rem) !important;
  margin-block: var(--s-4);
}
/* Ghost's default inner padding on the content/text is ~5rem all round, which
   stacked on top of the card padding and made the block absurdly tall. Zero it. */
.post-single__body .kg-signup-card-content,
.post-single__body .kg-signup-card-text {
  padding: 0 !important;
  max-width: none !important;
}
.post-single__body .kg-signup-card-heading {
  font-family: var(--f-display) !important;
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  color: var(--c-cream) !important;
  font-size: clamp(1.8rem, 4vw, 3rem) !important;
  line-height: 0.95 !important;
  margin: 0 0 var(--s-2) !important;
}
.post-single__body .kg-signup-card-subheading {
  color: var(--c-cream) !important;
  font-size: var(--t-body);
  line-height: 1.5;
  margin: 0 0 var(--s-3) !important;
}
/* Ghost wraps the input + button in a white pill (bg + border + radius on
   .kg-signup-card-fields) — strip it so the cream input and stamp button sit
   straight on the purple with a gap between them. */
.post-single__body .kg-signup-card-fields {
  gap: var(--s-2);
  background: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  padding: 0 !important;
}
.post-single__body .kg-signup-card-input {
  background: var(--c-cream) !important;
  color: var(--c-ink) !important;
  border: 2px solid var(--c-ink) !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  padding: 0.85rem 1rem !important;
  margin: 0 !important;
}
.post-single__body .kg-signup-card-input::placeholder { color: var(--c-ink-mid); }
/* cream stamp button with an ink shadow (matches the CTA card button) */
.post-single__body .kg-signup-card .kg-signup-card-button {
  font-family: var(--f-display) !important;
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  color: var(--c-ink) !important;
  background: var(--c-cream) !important;
  background-color: var(--c-cream) !important;
  border: 2px solid var(--c-ink) !important;
  border-radius: 0 !important;
  box-shadow: 0.45rem 0.45rem 0 var(--c-ink);
  padding: 0.85rem 1.3rem !important;
  height: auto !important; min-height: 0 !important;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .kg-signup-card .kg-signup-card-button:hover {
  transform: translate(-3px,-3px);
  box-shadow: 0.7rem 0.7rem 0 var(--c-ink);
}
.post-single__body .kg-signup-card-button-default,
.post-single__body .kg-signup-card-button-loading { color: var(--c-ink) !important; }
/* disclaimer + success/error legible on the purple */
.post-single__body .kg-signup-card-disclaimer,
.post-single__body .kg-signup-card-success,
.post-single__body .kg-signup-card-error { color: var(--c-cream) !important; }

/* ---- Ghost content cards, re-skinned to the design system ------------------
   Callout, toggle (FAQ), bookmark. Squared corners, 2px ink border, and a
   subtle lavender offset shadow to match the product/CTA cards. Scoped under
   .post-single__body to beat Ghost's injected card CSS on specificity. */

/* CALLOUT — keep the editor's colour choice as the fill; add the stamped frame */
.post-single__body .kg-callout-card {
  border: 2px solid var(--c-ink);
  border-radius: 0;
  box-shadow: 0.35rem 0.35rem 0 var(--c-lavender);
  padding: var(--s-3) clamp(1rem, 2.5vw, 1.4rem);
  margin-block: var(--s-4);
}

/* TOGGLE (FAQ accordion) — question in the display face, stamped frame */
.post-single__body .kg-toggle-card {
  border: 2px solid var(--c-ink);
  border-radius: 0;
  box-shadow: 0.35rem 0.35rem 0 var(--c-lavender);
  padding: var(--s-3) clamp(1rem, 2.5vw, 1.4rem);
  margin-block: var(--s-3);
}
.post-single__body .kg-toggle-card h4.kg-toggle-heading-text {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.1rem, 1.7vw, 1.4rem);
  line-height: 1.05;
  color: var(--c-ink);
}
.post-single__body .kg-toggle-card-icon { color: var(--c-ink); }

/* BOOKMARK (link preview) — cream stamped card that lifts on hover */
.post-single__body .kg-bookmark-card a.kg-bookmark-container {
  background: var(--c-cream);
  border: 2px solid var(--c-ink);
  border-radius: 0;
  box-shadow: 0.4rem 0.4rem 0 var(--c-lavender);
  color: var(--c-ink);
  transition: transform .18s cubic-bezier(.2,.7,.3,1), box-shadow .18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .kg-bookmark-card a.kg-bookmark-container:hover {
  transform: translate(-3px, -3px);
  box-shadow: 0.6rem 0.6rem 0 var(--c-lavender);
}
.post-single__body .kg-bookmark-content { font-family: var(--f-body) !important; }
.post-single__body .kg-bookmark-title { font-family: var(--f-body); font-weight: 700; color: var(--c-ink); }
.post-single__body .kg-bookmark-description { color: var(--c-ink-mid); }
.post-single__body h1,
.post-single__body h2,
.post-single__body h3 {
  margin-top: var(--s-3);
  margin-bottom: var(--s-1);
  /* The nav is sticky, so an anchor jump (the Brief table of contents links to
     these by id) would otherwise land the heading at viewport top — underneath
     the nav, invisible, with the reader dropped into the middle of the section.
     Clears the nav plus a little breathing room. */
  scroll-margin-top: clamp(5.5rem, 9vh, 7rem);
}
/* H1 = the section headings Cass marks up inside a post body (they're what the
   Brief table of contents is built from). Display face, uppercased here so she
   keeps writing them in sentence case and they still match the site's headline
   treatment. The post's own title is deliberately NOT uppercased — it stays as
   written. */
.post-single__body h1 {
  font-family: var(--f-display);
  font-size: clamp(1.9rem, 3.2vw, 2.7rem);
  line-height: 1.05;
  text-transform: uppercase;
  /* Poffy ligates uppercase double letters into a single glyph, so SOON renders
     as "SØN", BOOK as "BØK", TOO as "TØ" — a letter visibly disappears. That's
     tolerable on hand-set marketing headlines where the words are chosen and
     checked, but these headings are written freely and must never mangle a word.
     font-feature-settings: "liga" 0 does NOT suppress them; only this does. */
  font-variant-ligatures: none;
}
/* H2/H3 = sub-headings within a section. Body face so they sit closer to the
   prose and don't compete with the H1s. Poffy carries its weight in the letter-
   forms; Public Sans has to be asked for it, hence the explicit weight and the
   looser line-height (1.05 is a display value and would collide here). */
.post-single__body h2,
.post-single__body h3 {
  font-family: var(--f-body);
  font-weight: 800;
  line-height: 1.25;
  letter-spacing: -0.01em;
}
.post-single__body h2 { font-size: clamp(1.35rem, 1.9vw, 1.7rem); }
/* Floor sits above the body size (--t-body tops out at 1.1875rem): a heading
   set smaller than the prose it introduces inverts the hierarchy, and weight
   alone doesn't rescue it. */
.post-single__body h3 { font-size: clamp(1.25rem, 1.5vw, 1.45rem); }
/* Standard block quote — body font with a purple left rule (the classic quote frame). */
.post-single__body blockquote {
  border-left: 3px solid var(--c-purple);
  padding-left: var(--s-3);
  margin: var(--s-3) 0;
  max-width: 72ch;
  color: var(--c-ink);
}
/* Alt block quote (the editor's "alternative" quote style, .kg-blockquote-alt) in the
   handwriting font — reads like a margin note in Cass's hand, with no left rule. */
.post-single__body .kg-blockquote-alt {
  font-family: 'Casual Human', cursive;
  font-size: clamp(1.5rem, 1.1vw + 1.2rem, 2.1rem);
  line-height: 1.35;
  color: var(--c-ink);
  border-left: 0;
  padding-left: 0;
  margin: var(--s-3) 0;
  max-width: 72ch;
}
.post-single__body .kg-blockquote-alt p {
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
  max-width: none;
  margin-bottom: 0.4em;
}
.post-single__body .kg-blockquote-alt p:last-child { margin-bottom: 0; }
.post-single__foot {
  padding-bottom: var(--s-4);
  border-top: 1px solid rgba(20,15,40,0.12);
  padding-top: var(--s-2);
}
.post-single__back {
  font-family: var(--f-body);
  font-size: var(--t-small);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--c-ink);
  transition: color 0.15s;
}
.post-single__back:hover { color: var(--c-purple); }

/* ============================================================
   FOOTER
   ============================================================ */
.foot {
  background: var(--c-ink);
  color: var(--c-cream);
  padding-block: var(--s-4) var(--s-3);
  position: relative;
}
.foot__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-3);
  align-items: end;
}
@media (min-width: 768px) {
  .foot__grid { grid-template-columns: 1.3fr 1fr 1fr 1fr; }
}
.foot__mark { margin: 0; }
.foot__mark img {
  width: clamp(13rem, 28vw, 24rem);
  height: auto;
}
.foot__col { font-size: var(--t-small); letter-spacing: 0.04em; line-height: 1.6; }
.foot__col p { margin: 0 0 0.2rem; }
.foot__col a:hover { color: var(--c-lavender); }
.foot__line {
  margin-top: var(--s-3);
  padding-top: var(--s-2);
  border-top: 1px solid rgba(251,250,255,0.25);
  display: flex;
  justify-content: space-between;
  gap: var(--s-2);
  font-size: var(--t-small);
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: rgba(251,250,255,0.6);
  flex-wrap: wrap;
}
/* credit link — bold, brighter than the line, lavender on hover */
.foot__cred {
  font-weight: 700;
  color: var(--c-cream);
}
.foot__cred:hover { color: var(--c-lavender); }

/* ============================================================
   STICKY NOTES — peelable stack in the hero, layered over a
   plain "Scroll" cue. A tall stack of purple notes; tapping the
   top one peels it (corner curl) to reveal the next. Once every
   note is peeled, the "Scroll" text beneath is uncovered.
   Each note's colour, tilt, and stacking z are set inline by the
   builder in partials/home/sticky-notes.hbs (count-agnostic); the
   three tints below are cycled across the stack.
   ============================================================ */
.notes {
  /* two LIGHT lilac tints, mixed in a random-looking order across the stack
     (order is set by the builder in partials/home/sticky-notes.hbs) */
  --note-c1: #C7B4EA;           /* purple */
  --note-c2: #EBE4FB;           /* lighter */

  position: absolute;
  bottom: clamp(1rem, 5vw, 2rem);
  left: 0;
  transform: translateX(-14%);          /* mobile: kiss the photo's left edge */
  width: clamp(10.5rem, 40vw, 13rem);
  aspect-ratio: 1 / 1;
  z-index: 3;
}

/* desktop: there's a real gutter to the left of the photo — sit the stack in
   it (on cream, off the purple block) so the notes pop, just overlapping the
   photo's left edge. */
@media (min-width: 900px) {
  .notes {
    left: 8%;                              /* sit ON the photo (lower-left), clear of the copy column */
    right: auto;
    transform: none;
    width: clamp(8.5rem, 12vw, 12.5rem);   /* smaller, and scales down with the screen */
    bottom: clamp(1.5rem, 4vh, 3rem);
  }
}

/* large screens (1400px+): the gutter to the LEFT of the photo is wide
   enough, so restore the original position out there (on cream), a touch bigger.
   Set to 1400 (not 1440) so a 1440-wide screen — whose usable viewport is a bit
   narrower once the scrollbar is subtracted — still moves the stack beside the image. */
@media (min-width: 1400px) {
  .notes {
    left: 0;
    transform: translateX(-95%);
    width: clamp(11rem, 12vw, 14rem);
  }
}

/* plain scroll cue beneath the stack — NOT a card */
.notes__base {
  position: absolute;
  inset: 0;
  margin: 0;
  display: flex;
  align-items: flex-end;        /* sit the cue near the bottom of the notes spot */
  justify-content: center;
  padding-bottom: 0.5rem;
}
.notes__scroll {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.05em;
  font-family: 'Casual Human', cursive;
  font-size: clamp(1.5rem, 2vw, 2.1rem);
  line-height: 1;
  color: var(--c-ink);
  text-align: center;
}
.notes__scroll:hover { color: var(--c-purple); }
.notes__scroll-txt { display: block; }
/* hand-drawn down arrow (inline SVG), bobbing to draw the eye downward */
.notes__arrow {
  display: block;
  animation: note-bob 1.6s ease-in-out infinite;
}
.notes__arrow svg {
  display: block;
  width: 0.95em;
  height: 1.6em;
}
@keyframes note-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(0.28em); }
}

/* the stack of notes — the whole pile is tilted slightly for a stuck-on feel */
.notes__stack { position: absolute; inset: 0; transform: rotate(-4deg); }

/* --peel drives the whole effect: 0 = flat, 1 = fully peeled. Hover nudges it,
   clicking drives it to 1, then the note is removed. Registered so it animates. */
@property --peel {
  syntax: "<number>";
  inherits: true;          /* children (.note__sheet / .note__curl) read this */
  initial-value: 0;
}

.note {
  position: absolute;
  inset: 0;
  border: 0;
  padding: 0;
  background: none;
  --peel: 0;
  transform: rotate(var(--rot, 0deg));
  transform-origin: center;
  pointer-events: none;                 /* only the current top note is clickable */
  cursor: default;
  z-index: var(--z, 1);
  transition: --peel 0.7s cubic-bezier(.4, 0, .2, 1);
}

/* per-card shadow that RECEDES with the peel — its height tracks the still-flat
   part, so the shadow rises with the fold and is gone at full peel (the
   uncovered area below the fold gets no shadow). Bottom-weighted: stuck at the
   top, lifting at the bottom. */
.note::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  height: calc((1 - var(--peel)) * 100%);
  z-index: -1;                          /* behind this note's face, above the note beneath */
  pointer-events: none;
  /* shadow is applied only to the active note (below), not every note — a tall
     stack would otherwise pile 20+ identical shadows into one dark halo. */
}

/* Only the top few notes cast a shadow (main.js keeps `.note--shadow` on them),
   not all 20+ — otherwise a tall stack piles every shadow into one dark halo.
   Shadowing several (not just the top one) means the note promoted on each peel
   already carries its shadow, so nothing "pops in": the only note that newly
   gains a shadow is buried deep enough to hide it. Each shadow still recedes as
   its note peels (height tracks the still-flat part above). */
.note--shadow::after {
  box-shadow: 0 0.2rem 0.45rem rgba(31, 31, 35, 0.10),
              0 0.85rem 1.2rem -0.45rem rgba(31, 31, 35, 0.42);
}

/* per-note colour (--note-bg), stacking order (--z), and hand-stuck tilt (--rot)
   are set inline by the builder script; see partials/home/sticky-notes.hbs. */

/* the painted face of the note — this is the layer that clips away as it peels */
.note__sheet {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  text-align: center;
  padding: 1.15rem 1.25rem;
  font-family: 'Casual Human', var(--f-body);
  font-weight: 400;
  font-size: clamp(1.05rem, 1.5vw, 1.55rem);
  line-height: 1.15;
  color: var(--note-fg, var(--c-ink));
  background: var(--note-bg, var(--note-c1));
  /* the flat, still-stuck part: clips back from the bottom as the fold travels up */
  clip-path: inset(0 0 calc(var(--peel) * 100%) 0);
}

/* top crease — a band of shadow just below the adhesive edge, with a light
   catch on the lip above it */
.note__sheet::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 16%;
  background: linear-gradient(to bottom,
    rgba(255, 255, 255, 0.22) 0%,
    rgba(255, 255, 255, 0.05) 22%,
    rgba(31, 31, 35, 0.12) 62%,
    rgba(31, 31, 35, 0) 100%);
  pointer-events: none;
}

/* the peeled flap — the paper's lighter UNDERSIDE, folded up over the flat part.
   It grows up from the fold line as --peel increases; lit at the lifted (top)
   edge, shadowed where it meets the fold, and casts a shadow on the reveal. */
.note__curl {
  position: absolute;
  left: 0;
  right: 0;
  top: calc((1 - 2 * var(--peel)) * 100%);   /* bottom edge sits on the fold line */
  height: calc(var(--peel) * 100%);
  z-index: 2;                                 /* folded over the flat face */
  opacity: clamp(0, calc((1 - var(--peel)) / 0.2), 1);   /* fade out over the last 20% */
  pointer-events: none;
  background:
    linear-gradient(to top,
      rgba(31, 31, 35, 0.14) 0%,        /* shadow where it meets the fold (bottom) */
      rgba(31, 31, 35, 0) 20%,
      rgba(255, 255, 255, 0.28) 100%),  /* lit, lifted free edge (top) */
    color-mix(in srgb, var(--note-bg) 55%, white);   /* the paper's lighter underside */
  box-shadow: 0 0.4rem 0.6rem rgba(31, 31, 35, 0.26);
}

/* the current top note — only difference is that it's interactive */
.note.is-top {
  pointer-events: auto;
  cursor: pointer;
}

/* HOVER — nudge the peel so the bottom starts to lift; clicking carries the
   same motion through to a full peel (no jump). */
.note.is-top:hover { --peel: 0.1; }

/* peeled notes are removed from view entirely */
.note.peeled { display: none; }

/* PEEL — drive --peel to 1; the flat face clips back and the underside flap
   grows over it (a real peel, not a curl). The note is removed on completion. */
.note.peeling {
  --peel: 1;
  pointer-events: none;
  z-index: 999;               /* peel over every note still in the stack */
}

/* ============================================================
   MOBILE REFINEMENTS (640px and below)
   Scoped tweaks layered on top of the fluid base — kept in one
   place so the small-screen overrides are easy to find.
   ============================================================ */
@media (max-width: 640px) {
  /* (1) Nav runs edge-to-edge: logo hard left, CTA hard right. */
  .nav__inner {
    width: 100%;
    padding-inline: 1rem;
  }

  /* (2) Problem-section statement: a touch smaller and pulled left
     so the indented line can't run off the side of the device. */
  .man__statement { font-size: clamp(2.25rem, 9.5vw, 9rem); }
  .man .man__statement .indent { padding-left: 0.5em; }
  .man__content h2 strong { font-size: clamp(2.25rem, 9.5vw, 9rem); }

  /* (3) Brief: shrink the pull-quote so it stops competing with
     the heading, and give the heading a small bump. */
  .pullquote { font-size: clamp(1.2rem, 4.5vw, 1.5rem); }
  .brief__title { font-size: clamp(2.25rem, 8.5vw, 5rem); }
  /* body-driven brief heading shrinks identically: base = small line,
     strong = the boxed payoff line at the same mobile size as .brief__title */
  .brief__content h2 { font-size: calc(clamp(2.25rem, 8.5vw, 5rem) * 0.5); }
  .brief__content h2 strong { font-size: clamp(2.25rem, 8.5vw, 5rem); }

  /* (4) Tighten the number to content gap in the numbered lists.
     Work With Me was the worst offender, so it goes tightest. */
  .brief__list li { grid-template-columns: 2rem 1fr; column-gap: var(--s-1); }
  .threes__row    { grid-template-columns: 1.75rem 1fr; column-gap: var(--s-1); }

  /* (5) Reclaim content width: pull the container and section padding toward the
     edges. Spines are hidden on mobile now, so the section padding is just a clean
     reading gutter (no spine to clear). */
  .container { width: min(96rem, 100% - 1rem); }
  .spread__inner { padding-inline: 1.25rem; }

  /* (6) Contents menu: bar and content run edge-to-edge with 1rem padding,
     exactly like the nav on mobile. */
  .menu__bar { width: 100%; padding-inline: 1rem; }
  .menu__inner { width: 100%; padding: var(--s-3) 1rem var(--s-3); }

  /* (7) Contents menu: the masthead heading scales by viewport so "CON-TENTS"
     fills the width instead of reading half-empty; trim the indent so the
     second line can't run off the edge at the larger size. */
  .menu__title { font-size: clamp(3.5rem, 17vw, 6rem); }
  .menu__title .indent { padding-left: 0.8em; }
}

/* ============================================================
   REDUCED MOTION
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition: none !important;
    animation: none !important;
  }
  .btn-stamp:hover { transform: none; box-shadow: 0.55rem 0.55rem 0 var(--c-purple); }
}

/* ============================================================
   KOENIG CONTENT WIDTHS — required by GScan
   ============================================================ */
.kg-width-wide {
  width: min(var(--container), 100%);
  max-width: min(96rem, 100vw - 2.5rem);
  margin-inline: auto;
}

.kg-width-full {
  width: 100vw;
  max-width: 100vw;
  margin-inline: calc(50% - 50vw);
}

/* ============================================================
   ERROR 404 — full-screen takeover (no nav/footer). Left: a grey
   #f7f7f7 "binding" band carrying the vertical spine; then a torn
   paper seam; then the pure-white page Cass has marked up by hand.
   Hand-drawn font throughout. Transform-only settle (stays visible).
   ============================================================ */
/* handwriting font 'Casual Human' is loaded globally via @font-face above */
body.err404-body { background: #fff; }

.err404 {
  --gutter-w: clamp(3.25rem, 5vw, 5rem);
  --tear-w: clamp(3.5rem, 7vw, 7rem);
  position: relative;
  display: flex;
  min-height: 100svh;
  background: #fff;
  overflow: hidden;
}

/* gutter column — #f7f7f7, carries the homepage spine (same markup) */
.err404__bind {
  position: relative;
  flex: 0 0 var(--gutter-w);
  background: #f7f7f7;
}
.err404__bind .spine {
  left: clamp(0.6rem, 1.2vw, 1rem);
  top: clamp(1.5rem, 5vh, 3rem);
}

/* white page column — faintly ruled, like writing paper */
.err404__page {
  position: relative;
  flex: 1;
  display: flex;
  align-items: center;
  background-color: #fff;
  background-image: repeating-linear-gradient(
    to bottom,
    transparent 0,
    transparent calc(2.25rem - 1px),
    rgba(86, 92, 140, 0.10) calc(2.25rem - 1px),
    rgba(86, 92, 140, 0.10) 2.25rem
  );
  padding: var(--s-4) clamp(2rem, 6vw, 6rem)
           var(--s-4) calc(var(--tear-w) + clamp(1.5rem, 4vw, 4rem));
}

/* torn-paper edge — full-height layer pinned to the white column's left,
   sitting on top of the white; grey back meets the gutter, the torn
   edge faces into the content. */
.err404__tear {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: var(--tear-w);
  background: url('/assets/images/torn-paper-edge.png') left center / 100% 100% no-repeat;
  z-index: 1;
  pointer-events: none;
}

.err404__note {
  position: relative;
  z-index: 2;
  max-width: 54rem;
  animation: err-settle 0.9s cubic-bezier(0.2, 0.8, 0.3, 1) both;
  transform-origin: left center;
}
@keyframes err-settle {
  0%   { transform: translateY(-16px) rotate(-1.2deg); }
  55%  { transform: translateY(4px) rotate(0.4deg); }
  100% { transform: translateY(0) rotate(0deg); }
}
@media (prefers-reduced-motion: reduce) {
  .err404__note { animation: none; }
}

.err404__head {
  font-family: 'Casual Human', cursive;
  font-weight: 700;
  font-size: clamp(2.5rem, 9vw, 8rem);
  line-height: 1.02;
  color: var(--c-ink);
  margin: 0;
  max-width: 15ch;
}
.err404__sub {
  font-family: 'Casual Human', cursive;
  font-weight: 600;
  font-size: clamp(1.6rem, 3.6vw, 3.4rem);
  color: var(--c-ink-mid);
  margin: 1.6rem 0 3.4rem;
}

.err404__btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  font-family: 'Casual Human', cursive;
  font-weight: 600;
  font-size: clamp(1.7rem, 3vw, 3rem);
  line-height: 1;
  color: var(--c-ink);
  padding: 1.05rem 2.5rem;
  text-decoration: none;
  transition: transform 0.18s cubic-bezier(0.2, 0.7, 0.3, 1);
}
.err404__btn-box {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
  color: var(--c-ink);
}
.err404__btn-box path {
  stroke: currentColor;
  transition: stroke 0.18s;
}
.err404__btn:hover { transform: translate(-2px, -2px); }
.err404__btn:hover .err404__btn-box { color: var(--c-purple); }

.err404__links {
  font-family: 'Casual Human', cursive;
  font-weight: 600;
  font-size: clamp(1.35rem, 2.1vw, 2.1rem);
  color: var(--c-ink-mid);
  margin: 3rem 0 0;
}
.err404__links a {
  color: var(--c-purple);
  text-decoration: none;
  border-bottom: 2px solid var(--c-lavender);
  padding-bottom: 1px;
  transition: border-color 0.18s;
}
.err404__links a:hover { border-bottom-color: var(--c-purple); }
.err404__sep { color: var(--c-lavender); margin: 0 0.45em; }

@media (max-width: 768px) {
  .err404 { --gutter-w: clamp(2.75rem, 11vw, 4rem); --tear-w: clamp(2.75rem, 9vw, 4rem); }
  .err404__page { padding-right: 1.25rem; }
  .err404__head { font-size: clamp(2rem, 8.5vw, 3.25rem); }
}

/* ============================================================
   SERVICE PAGES — a magazine feature, not a stack of boxes.
   Each section is its own spread (dual spines, varied layout,
   a distinct device). Reuses .spread/.spine/.brk/.hl/.cutout/
   .man/.mail/.pullquote/.dropcap. Reusable for any service.
   ============================================================ */
.svc-opener, .svc-promise, .svc-steps, .svc-rate, .svc-faq, .svc-cta { padding-block: var(--s-5); }

/* OPENER — feature title spread: big headline + bleeding photo */
.svc-opener { padding-top: var(--s-4); }
.svc-opener__grid { display: grid; grid-template-columns: 1fr; gap: var(--s-4); align-items: center; }
@media (min-width: 900px) { .svc-opener__grid { grid-template-columns: 1.05fr 0.95fr; gap: var(--s-5); } }
.svc-opener__title { margin: 0 0 var(--s-3); }
.svc-opener__sub { font-family: var(--f-body); font-weight: 700; font-size: clamp(1.25rem, 0.8vw + 1.1rem, 1.85rem); line-height: 1.32; max-width: 22ch; margin: 0 0 var(--s-4); }
.svc-opener__cta { display: flex; flex-direction: column; align-items: flex-start; gap: var(--s-3); }
.svc-opener__lead { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; max-width: 42ch; margin: 0 0 var(--s-4); }
.svc-opener__note { font-style: italic; color: var(--c-ink-mid); font-size: var(--t-small); max-width: 36ch; margin: 0; }
.svc-opener__photo { position: relative; z-index: 1; justify-self: end; width: 100%; }
.svc-opener__cap { position: absolute; left: -0.6rem; bottom: 1.4rem; transform: rotate(-4deg); z-index: 3; }
/* large screens: let the headline keep its line and bleed over the image */
@media (min-width: 1200px) {
  .svc-opener__title { position: relative; z-index: 2; }
  .svc-opener__title > span { white-space: nowrap; }
}

/* PROMISE — full-bleed purple pull-quote spread */
.svc-promise { background: var(--c-purple); color: var(--c-cream); }
.svc-promise__grid { display: grid; gap: var(--s-4); }
@media (min-width: 900px) { .svc-promise__grid { grid-template-columns: 1.3fr 0.7fr; align-items: center; gap: var(--s-5); } }
.svc-promise__quote { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(2.1rem, 4.6vw, 4.25rem); line-height: 0.98; letter-spacing: -0.01em; margin: 0; color: var(--c-cream); }
.svc-promise__quote .u { color: var(--c-purple); background: var(--c-cream); padding: 0 0.1em; box-decoration-break: clone; -webkit-box-decoration-break: clone; }
.svc-promise__body { font-size: var(--t-body); line-height: 1.6; color: rgba(251, 250, 255, 0.9); max-width: 42ch; }
.svc-promise__body strong { color: var(--c-cream); }

/* STEPS — oversized numerals, editorial rows */
.svc-steps__head { margin: 0 0 var(--s-3); }
.svc-steps__intro { max-width: 48ch; margin: var(--s-2) 0 0; color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; }
.svc-steps__cta { margin: var(--s-4) 0 0; }
.svc-steps__list { list-style: none; margin: var(--s-4) 0 0; padding: 0; }
.svc-step { display: grid; grid-template-columns: auto 1fr; gap: clamp(1.25rem, 3vw, 3rem); align-items: start; padding: var(--s-3) 0; border-top: 2px solid var(--c-ink); }
.svc-step:first-child { border-top: 0; }   /* dividers between items only, none top/bottom */
.svc-step__no { font-family: var(--f-display); font-size: clamp(3rem, 7vw, 6rem); line-height: 0.78; color: var(--c-purple); }
.svc-step__t { font-family: var(--f-display); font-size: clamp(1.4rem, 2.2vw, 2.1rem); line-height: 1; margin: 0.1em 0 0.4rem; }
.svc-step__d { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.5; max-width: 48ch; margin: 0; }

/* RATE CARD — a bordered, stamped rate card */
.svc-rate__head { margin: 0; }
.svc-rate__grid { display: grid; gap: var(--s-4); align-items: center; margin-top: var(--s-4); }
@media (min-width: 900px) { .svc-rate__grid { grid-template-columns: 0.85fr 1.15fr; gap: var(--s-5); } }
.svc-rate__intro { max-width: 48ch; font-size: var(--t-body); line-height: 1.6; color: var(--c-ink-mid); margin: var(--s-3) 0 0; }
.svc-rate__card { position: relative; margin: 0; border: 2px solid var(--c-ink); background: var(--c-cream); padding: clamp(1.5rem, 3.5vw, 3rem) clamp(1.5rem, 3vw, 2.75rem); box-shadow: 0.7rem 0.7rem 0 var(--c-lavender); }
.svc-rate__stamp { position: absolute; top: -1rem; right: 1.5rem; transform: rotate(4deg); }
.svc-rate__row { display: flex; align-items: baseline; gap: 1rem; padding: var(--s-2) 0; border-bottom: 1.5px dashed var(--c-ink-mid); }
.svc-rate__row:last-of-type { border-bottom: 0; }
.svc-rate__name { font-family: var(--f-display); font-size: clamp(1.25rem, 1.9vw, 1.8rem); }
.svc-rate__amt { font-family: var(--f-display); font-size: clamp(1.5rem, 2.4vw, 2.25rem); margin-left: auto; white-space: nowrap; }
.svc-rate__pre { font-family: var(--f-body); font-weight: 400; font-size: 0.5em; color: var(--c-ink-mid); text-transform: lowercase; letter-spacing: 0.04em; margin-right: 0.2em; vertical-align: 0.18em; }

/* ONE TO ONE — single fixed-price callout (reuses the rate-card shell) */
.svc-one__price { font-family: var(--f-display); font-size: clamp(3rem, 7vw, 5.5rem); line-height: 0.9; margin: 0; }
.svc-one__unit { display: block; font-family: var(--f-body); font-size: var(--t-body); color: var(--c-ink-mid); margin-top: 0.5rem; }
.svc-one__list { list-style: none; margin: var(--s-3) 0 0; padding: var(--s-3) 0 0; display: grid; gap: 0.65rem; border-top: 1.5px dashed var(--c-ink-mid); }
.svc-one__list li { position: relative; padding-left: 1.6em; font-size: var(--t-body); line-height: 1.45; }
.svc-one__list li::before { content: "\2192"; position: absolute; left: 0; top: 0; color: var(--c-purple); font-weight: 800; font-family: var(--f-body); }
.svc-one__tax { font-size: var(--t-small); color: var(--c-ink-mid); margin: var(--s-2) 0 0; }
/* in-card CTA (Get a quote / Book now) — sits under the prices in the rate card */
.svc-rate__card .svc-rate__cta { margin-top: var(--s-3); }

/* ============================================================
   THE BRIEF — publication sales page: issue-cover masthead,
   catalogue of previewable issues, subscribe card + launch offer.
   ============================================================ */
.brief-cat-sec, .brief-sub { padding-block: var(--s-5); }
.brief-cat-sec { background: var(--c-cream); }
/* Archive can be short (few issues) — fill the viewport so the footer isn't
   stranded halfway up with empty space beneath it. */
.brief-archive { min-height: calc(100svh - 7rem); }
/* no divider under the final row on the archive pages (catalogue + newsletter) */
.brief-archive .brief-cat__item:last-child { border-bottom: 0; }
.brief-sub { background: var(--c-haze); }
/* Brief-page FAQ on haze (template-scoped so other pages' svc-faq is unaffected),
   keeping the section rhythm alternating after the reorder. */
.brief-faq { background: var(--c-haze); }

/* issue cover (masthead visual) */
.brief-cover { position: relative; width: min(100%, 23rem); aspect-ratio: 5 / 7; margin-inline: auto; background: var(--c-cream); border: 2px solid var(--c-ink); box-shadow: 0.7rem 0.7rem 0 var(--c-purple); padding: clamp(1.25rem, 2.5vw, 2rem); display: flex; flex-direction: column; }
.brief-cover__top { font-family: var(--f-display); font-size: clamp(1.7rem, 2.6vw, 2.6rem); line-height: 0.82; }
.brief-cover__meta { display: flex; justify-content: space-between; gap: 0.5rem; font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.16em; font-size: var(--t-small); font-weight: 500; color: var(--c-ink-mid); margin-top: 0.6rem; border-top: 1.5px solid var(--c-ink); padding-top: 0.55rem; }
.brief-cover__line { margin-top: auto; font-family: var(--f-display); font-size: clamp(1.7rem, 2.9vw, 2.6rem); line-height: 0.92; }
.brief-cover__foot { margin: 0.8rem 0 0; font-style: italic; font-size: var(--t-small); color: var(--c-ink-mid); }

/* latest-edition card — overlaps the hero image like the cover sticky notes */
.brief-edition {
  position: absolute;
  left: clamp(-3rem, -3vw, -1rem);
  bottom: clamp(1.5rem, 5vw, 3.5rem);
  width: min(20rem, 80%);
  background: var(--c-cream);
  border: 2px solid var(--c-ink);
  box-shadow: 0.55rem 0.55rem 0 var(--c-purple);
  padding: clamp(1rem, 1.6vw, 1.45rem) clamp(1.1rem, 1.8vw, 1.5rem);
  transform: rotate(-3deg);
  z-index: 3;
}
.brief-edition__no { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.16em; font-size: var(--t-small); font-weight: 700; color: var(--c-ink-mid); margin: 0 0 0.45rem; }
.brief-edition__topic { font-family: var(--f-display); font-size: clamp(1.3rem, 1.9vw, 1.75rem); line-height: 0.95; margin: 0 0 0.7rem; }
.brief-edition__link { display: inline-block; font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; font-size: var(--t-small); color: var(--c-purple); transition: color 0.15s; }
.brief-edition__link:hover { color: var(--c-ink); }
@media (max-width: 600px) {
  .brief-edition { left: auto; right: 0.5rem; width: min(18rem, 88%); }
}

/* The Brief hero clones the homepage .cover; the edition card replaces
   the sticky notes inside .cover__photo-wrap. The cover has no bottom-right
   spine, so lift ours clear of the next section. */
.brief-hero .spine--br { bottom: clamp(2rem, 4vh, 3.5rem); }

/* ============================================================
   THANK YOU — short, warm confirmation page.
   ============================================================ */
.thanks { min-height: min(100svh - 9rem, 42rem); display: flex; align-items: center; padding-block: var(--s-5); }
.thanks__title { margin: 0 0 var(--s-3); max-width: 16ch; }
.thanks__msg { font-size: clamp(1.15rem, 0.6vw + 1rem, 1.45rem); line-height: 1.5; max-width: 46ch; margin: 0 0 var(--s-4); }
.thanks__cta { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-3); }
.thanks__note { font-style: italic; color: var(--c-ink-mid); font-size: var(--t-small); max-width: 28ch; margin: 0; }

/* Reusable thank-you PAGE (content-driven via the custom-thanks template). Top-aligned
   rather than vertically centred, filling the viewport so the footer isn't stranded. */
.thanks.thanks--page { display: block; min-height: calc(100svh - 7rem); }
.thanks--page .thanks__title { max-width: 20ch; }
.thanks__body { max-width: var(--reading); margin-top: var(--s-4); font-size: var(--t-body); }
.thanks__body > p:first-of-type { font-size: clamp(1.15rem, 0.6vw + 1rem, 1.45rem); line-height: 1.5; color: var(--c-ink); }
.thanks__body p { margin: 0 0 1em; line-height: 1.6; color: var(--c-ink-mid); }
.thanks__body h2, .thanks__body h3 { font-family: var(--f-display); line-height: 1; margin: var(--s-4) 0 var(--s-2); }
.thanks__body h2 { font-size: clamp(1.4rem, 2vw, 1.9rem); }
.thanks__body h3 { font-size: clamp(1.2rem, 1.6vw, 1.5rem); }
.thanks__body ul, .thanks__body ol { margin: 0 0 1.2em; padding-left: 1.3em; }
.thanks__body li { margin: 0 0 0.5em; line-height: 1.5; color: var(--c-ink-mid); }
.thanks__body a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }
.thanks__body a:hover { color: var(--c-ink); }
.thanks__body hr { margin-block: var(--s-4); background: rgba(20, 15, 40, 0.15); }
/* Ghost button card, restyled as the site's stamp in every content area. !important
   overrides Ghost's injected card CSS (loaded after screen.css via {{ghost_head}}),
   which otherwise sets a system font, accent fill and near-zero vertical padding. */
.post-single__body .kg-button-card,
.thanks__body .kg-button-card,
.legal__body .kg-button-card { margin: var(--s-3) 0; }
.post-single__body .kg-btn,
.thanks__body .kg-btn,
.legal__body .kg-btn {
  display: inline-flex; align-items: center; justify-content: center;
  font-family: var(--f-display) !important; font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1rem, 1.2vw, 1.3rem) !important; line-height: 1 !important;
  color: var(--c-ink) !important; background: var(--c-cream) !important;
  border: 2px solid var(--c-ink) !important; border-radius: 0 !important;
  box-shadow: 0.5rem 0.5rem 0 var(--c-purple);
  padding: 0.85rem 1.3rem !important; min-height: 0 !important; height: auto !important;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.post-single__body .kg-btn:hover,
.thanks__body .kg-btn:hover,
.legal__body .kg-btn:hover { transform: translate(-3px, -3px); box-shadow: 0.75rem 0.75rem 0 var(--c-purple); }

/* Small print in body content — use a Markdown card with <small>…</small> in Ghost. */
.post-single__body small,
.thanks__body small,
.legal__body small { font-size: var(--t-small); line-height: 1.5; color: var(--c-ink-mid); }

/* ============================================================
   LEGAL — clean reading-column prose (privacy, terms).
   ============================================================ */
.legal { padding-block: var(--s-5); }
.legal__head { margin: 0 0 var(--s-2); text-transform: uppercase; }
.legal__updated { color: var(--c-ink-mid); font-size: var(--t-small); text-transform: uppercase; letter-spacing: 0.14em; margin: 0 0 var(--s-4); }
.legal__body { max-width: var(--reading); font-size: var(--t-body); }
.legal__body > p:first-of-type { font-size: clamp(1.1rem, 0.5vw + 1rem, 1.3rem); line-height: 1.5; color: var(--c-ink); }
.legal__body h2 { font-family: var(--f-display); font-size: clamp(1.4rem, 2vw, 1.9rem); line-height: 1; margin: var(--s-4) 0 var(--s-2); }
.legal__body p { margin: 0 0 1em; line-height: 1.6; color: var(--c-ink-mid); }
.legal__body ul { margin: 0 0 1.2em; padding-left: 1.2em; }
.legal__body li { margin: 0 0 0.5em; line-height: 1.5; color: var(--c-ink-mid); }
.legal__body a { color: var(--c-purple); text-decoration: underline; }
.legal__body a:hover { color: var(--c-ink); }

/* catalogue */
.brief-cat__intro { max-width: 54ch; font-size: var(--t-body); line-height: 1.6; color: var(--c-ink-mid); margin: var(--s-3) 0 0; }
.brief-cat__list { margin: var(--s-4) 0 0; }
/* auto-numbered catalogue: issues are output oldest-first (so @number = issue no.),
   displayed newest-first via reverse so the latest issue sits on top. */
.brief-cat__list--reverse { display: flex; flex-direction: column-reverse; }

/* The Brief issue "index" — magazine contents panel on #the-brief posts */
/* Styled like the marked-up "to-do list" checklist in the Brief's problem section:
   a bordered card with a hand-tilted checkbox against each item. Body font (the
   display face reads badly at this size). */
.brief-toc { margin: var(--s-4) 0 var(--s-5); padding: clamp(1.5rem, 2.6vw, 2.1rem) clamp(1.6rem, 3vw, 2.3rem); border: 1.5px solid var(--c-ink); background: var(--c-cream); box-shadow: 0.5rem 0.5rem 0 var(--c-lavender); }
.brief-toc__eye { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.14em; font-size: var(--t-small); font-weight: 700; color: var(--c-ink-mid); margin: 0 0 var(--s-2); padding-bottom: 0.6rem; border-bottom: 2px solid var(--c-ink); }
.brief-toc__list { list-style: none; margin: 0; padding: 0; counter-reset: none; }
.brief-toc__item a { display: flex; align-items: baseline; gap: 0.7rem; padding: 0.6rem 0; text-decoration: none; color: var(--c-ink); transition: color 0.15s ease; }
.brief-toc__item a:hover, .brief-toc__item a:focus-visible { color: var(--c-purple); }
.brief-toc__box { flex: none; width: 1.05rem; height: 1.05rem; align-self: flex-start; margin-top: 0.32rem; border: 2px solid var(--c-ink); border-radius: 0.18rem; transform: rotate(-4deg); transition: background 0.15s ease, border-color 0.15s ease; }
.brief-toc__item a:hover .brief-toc__box, .brief-toc__item a:focus-visible .brief-toc__box { background: var(--c-purple); border-color: var(--c-purple); }
.brief-toc__label { font-family: var(--f-body); font-size: clamp(1.05rem, 0.4vw + 0.95rem, 1.2rem); line-height: 1.35; }

/* Desktop: float the contents list in the left margin, sticky as you read.
   Only when the TOC is actually present + revealed (brief posts with h2s), so
   ordinary posts keep their centred single column. Mobile keeps it inline first. */
@media (min-width: 1080px) {
  .post-single__col:has([data-brief-toc]:not([hidden])) {
    max-width: none;
    width: 100%;
    display: grid;
    /* body sits in the centre track (so the article is centred in the viewport); the left
       gutter holds the TOC and the right gutter mirrors it — the article stays centred,
       not the TOC+article group. */
    grid-template-columns: minmax(0, 1fr) min(40rem, 100%) minmax(0, 1fr);
    grid-template-areas: ". head ." "toc body .";
    column-gap: clamp(1.5rem, 3vw, 3rem);
    align-items: start;
  }
  /* Default EVERY child into the article column. Only header/body/toc get named
     areas, so anything else — the post outro today, anything added later — was
     auto-flowing into the first empty cell, which is the top-left gutter. That
     put "Back to the full catalogue" above the headline on Brief issues. */
  .post-single__col:has([data-brief-toc]:not([hidden])) > * { grid-column: body-start / body-end; }
  .post-single__col:has([data-brief-toc]:not([hidden])) .post-single__header { grid-area: head; }
  .post-single__col:has([data-brief-toc]:not([hidden])) .post-single__body { grid-area: body; }
  .post-single__col:has([data-brief-toc]:not([hidden])) .brief-toc {
    grid-area: toc;
    justify-self: end;   /* hug the article's left edge */
    width: 100%;
    max-width: 22rem;
    position: sticky;
    top: clamp(4.5rem, 8vh, 6rem);
    margin: 0;
    align-self: start;
  }
}
/* whole row is the link; the preview affordance rides at the RIGHT of the content
   column (capped width) rather than the far container edge */
/* three tracks: [no] [content ~2/3] [preview zone ~1/3]; preview sits at the START
   of the back third, so it's off in the right third but not jammed to the edge */
.brief-cat__item { display: grid; grid-template-columns: auto minmax(0, 2fr) minmax(0, 1fr); gap: clamp(0.9rem, 2.5vw, 2.5rem); align-items: baseline; padding: var(--s-3) 0; border-bottom: 1px solid var(--c-cream-2); color: inherit; text-decoration: none; }
.brief-cat__no { font-family: var(--f-display); font-size: clamp(1.3rem, 1.9vw, 1.9rem); color: var(--c-purple); line-height: 1; }
/* newsletter archive rows are keyed on date, not issue number */
.brief-cat__date { align-self: baseline; font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; font-size: var(--t-small); color: var(--c-purple); line-height: 1.2; white-space: nowrap; }
.brief-cat__body { min-width: 0; }
.brief-cat__title { font-family: var(--f-display); font-size: clamp(1.3rem, 1.8vw, 1.7rem); line-height: 1.05; margin: 0 0 0.25rem; }
.brief-cat__teaser { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.4; margin: 0; max-width: 58ch; }
.brief-cat__preview { justify-self: start; align-self: baseline; font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; font-size: var(--t-small); color: var(--c-ink-mid); white-space: nowrap; transition: color 0.15s; }
.brief-cat__arr { display: inline-block; transition: transform 0.15s; }
.brief-cat__item:hover .brief-cat__title,
.brief-cat__item:focus-visible .brief-cat__title,
.brief-cat__item:hover .brief-cat__preview,
.brief-cat__item:focus-visible .brief-cat__preview { color: var(--c-purple); }
.brief-cat__item:hover .brief-cat__arr,
.brief-cat__item:focus-visible .brief-cat__arr { transform: translateX(3px); }
.brief-cat__item:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 4px; }
.brief-cat__more { margin: var(--s-3) 0 0; font-style: italic; color: var(--c-ink-mid); }
/* empty state — no issues published yet (launch day, or before the first Brief goes out) */
.brief-cat__empty { max-width: 54ch; font-size: var(--t-body); line-height: 1.6; color: var(--c-ink-mid); margin: var(--s-4) 0 0; }
.brief-cat__empty a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 2px; }
/* archive pager */
.brief-pager { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); margin: var(--s-4) 0 0; padding-top: var(--s-2); border-top: 1px solid var(--c-cream-2); }
.brief-pager__link { display: inline-flex; align-items: center; gap: 0.4em; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; font-size: 0.8rem; color: var(--c-ink); text-decoration: none; }
.brief-pager__link:hover { color: var(--c-purple); }
.brief-pager__link:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 4px; }
.brief-pager__link--off { visibility: hidden; }
.brief-pager__count { font-size: 0.8rem; letter-spacing: 0.02em; text-transform: uppercase; color: var(--c-ink-mid); }
/* mobile: no room for a third column — drop the preview under the content */
@media (max-width: 760px) {
  .brief-cat__item { grid-template-columns: auto 1fr; }
  .brief-cat__preview { grid-column: 2; margin-top: 0.5rem; }
}

/* subscribe card extras (launch offer) */
.brief-sub__tag { display: inline-block; margin-bottom: var(--s-2); }
.brief-sub__was { font-family: var(--f-display); font-size: 0.45em; color: var(--c-ink-mid); text-decoration: line-through; margin-right: 0.35em; vertical-align: 0.35em; }
.brief-sub__tcs { margin: var(--s-3) 0 0; font-size: var(--t-small); color: var(--c-ink-mid); }
.brief-sub__tcs a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }
.brief-sub__card .btn-stamp { margin-top: var(--s-3); }
.svc-rate__note { color: var(--c-ink-mid); font-size: var(--t-small); margin: var(--s-3) 0 0; max-width: 44ch; }

/* FAQ — a Q&A interview */
.svc-faq__head { margin: 0 0 var(--s-3); }
/* "Ask Cass" advice column — reader letters + her replies */
.svc-ask__list { margin: var(--s-4) 0 0; max-width: 56rem; }
.svc-ask__item { border-top: 1px solid var(--c-ink); }
.svc-ask__item:last-child { border-bottom: 1px solid var(--c-ink); }
.svc-ask__q { position: relative; cursor: pointer; list-style: none; display: grid; gap: 0.45rem; padding: var(--s-3) clamp(2rem, 5vw, 3.5rem) var(--s-3) 0; }
.svc-ask__q::-webkit-details-marker { display: none; }
.svc-ask__q::after { content: "+"; position: absolute; top: var(--s-3); right: 0; font-family: var(--f-display); color: var(--c-purple); font-size: 1.7rem; line-height: 1; }
.svc-ask__item[open] .svc-ask__q::after { content: "\2013"; }
.svc-ask__greet { font-family: var(--f-display); font-size: clamp(1.05rem, 1.4vw, 1.4rem); color: var(--c-purple); }
.svc-ask__question { font-style: italic; font-size: clamp(1.2rem, 1.7vw, 1.6rem); line-height: 1.3; max-width: 42ch; }
.svc-ask__sign { font-style: italic; color: var(--c-ink-mid); font-size: var(--t-small); }
.svc-ask__a { padding: 0 0 var(--s-3) clamp(1rem, 4vw, 3rem); margin-left: 0.1rem; border-left: 3px solid var(--c-purple); }
.svc-ask__from { display: block; font-family: var(--f-display); color: var(--c-ink); font-size: clamp(1.05rem, 1.4vw, 1.4rem); margin-bottom: 0.25rem; }
.svc-ask__a p { margin: 0; max-width: var(--reading); color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; }
.svc-ask__a p + p { margin-top: var(--s-2); }
.svc-ask__a a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }
.svc-ask__a a:hover { text-decoration-thickness: 2px; }
.svc-ask__a ul { margin: var(--s-2) 0 0; padding-left: 1.2em; max-width: var(--reading); color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; }
.svc-ask__a li { margin: 0.35rem 0; }
.svc-ask__item { transition: background 0.16s ease; }
.svc-ask__item:hover { background: rgba(139, 61, 255, 0.05); }
.svc-ask__q { transition: color 0.15s ease; }
.svc-ask__q::after { transition: transform 0.2s cubic-bezier(0.2, 0.7, 0.3, 1); }
.svc-ask__q:hover .svc-ask__greet { color: var(--c-purple-2); }
.svc-ask__q:hover .svc-ask__question { color: var(--c-purple); }
.svc-ask__q:hover::after { transform: rotate(90deg); }
.svc-ask__item[open] .svc-ask__q:hover::after { transform: rotate(0deg); }

/* CLOSING CTA — full-bleed purple */
.svc-cta { background: var(--c-purple); color: var(--c-cream); }
.svc-cta__title { color: var(--c-cream); margin: 0 0 var(--s-3); }
.svc-cta__title .hl { color: var(--c-ink); }
.svc-cta__sub { color: rgba(251, 250, 255, 0.9); max-width: 40ch; font-size: clamp(1.15rem, 0.6vw + 1rem, 1.5rem); line-height: 1.4; margin: 0 0 var(--s-4); }

@media (max-width: 700px) {
  .svc-step { grid-template-columns: 1fr; gap: 0.25rem; }
  .svc-rate__card { box-shadow: 0.4rem 0.4rem 0 var(--c-lavender); }
}

/* PROBLEM — drop-cap lead, big statement, payoff line (manifesto energy) */
.svc-problem { padding-block: var(--s-5); }
.svc-problem__lead { font-size: clamp(1.2rem, 1vw + 1rem, 1.65rem); line-height: 1.4; max-width: 32ch; margin: 0 0 var(--s-4); }
.svc-problem__lead--wide { max-width: 46ch; }
.svc-problem__body { max-width: 54ch; font-size: var(--t-body); line-height: 1.6; color: var(--c-ink-mid); margin: 0; }
.svc-problem__statement { margin: 0 0 var(--s-4); }
.svc-problem__payoff { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(1.5rem, 2.6vw, 2.4rem); line-height: 1.05; max-width: 26ch; margin: var(--s-3) 0 0 auto; text-align: right; }
.svc-problem__payoff .u { color: var(--c-purple); }

/* Brief 2nd section ("The Only Brief"): mirrors the homepage manifesto. The
   drop-cap lead sits top-left; the argument body + closer sit on the RIGHT; the
   middle (where the manifesto's big headline goes) is reserved for a new element. */
.brief-problem__body { max-width: 52ch; margin: var(--s-3) 0 0; }
.brief-problem__body p { font-size: clamp(1.0625rem, 0.4vw + 0.95rem, 1.25rem); line-height: 1.55; color: var(--c-ink-mid); margin: 0 0 var(--s-2); }
.brief-problem__body p:last-child { margin-bottom: 0; }
/* the punch line — display font, dark ink, sitting inside the body flow */
.brief-problem__body .brief-problem__punch {
  font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-weight: 400;
  color: var(--c-ink); font-size: clamp(1.5rem, 2.3vw, 2rem); line-height: 1.05;
  margin: var(--s-1) 0 var(--s-2);
}
/* Payoff: a normal lead-in, a big display punch line, then a normal close with the
   final phrase bold + highlighted. */
.brief-problem__payoff { display: flex; flex-direction: column; gap: var(--s-2); margin: var(--s-3) 0 0; }
/* normal lines match the section's intro (drop-cap lead) sizing */
.brief-problem__payoff-normal { display: block; font-family: var(--f-body); font-size: clamp(1.2rem, 1vw + 1rem, 1.65rem); line-height: 1.4; color: var(--c-ink); }
.brief-problem__payoff-big { display: block; font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(1.7rem, 3vw, 2.9rem); line-height: 1.05; margin: 0.22em 0; color: var(--c-ink); }
.brief-problem__hl { font-weight: 700; color: var(--c-cream); background: var(--c-purple); padding: 0 0.12em; box-decoration-break: clone; -webkit-box-decoration-break: clone; }

/* Inline "hint" — a dashed-underline term with a small help bubble on hover/focus
   (the classic glossary-tooltip pattern, styled to match the sheet). */
.hint {
  position: relative; cursor: help; color: inherit;
  text-decoration: underline dashed; text-decoration-color: var(--c-purple);
  text-decoration-thickness: 1.5px; text-underline-offset: 0.22em;
}
.hint:focus-visible { outline: none; }
.hint::after {
  content: attr(data-tip);
  position: absolute; left: 0; bottom: calc(100% + 0.7rem);
  background: var(--c-ink); color: var(--c-cream);
  font-family: var(--f-body); font-weight: 500; font-size: 0.92rem; line-height: 1.25;
  width: max-content; max-width: min(16rem, 62vw); padding: 0.5rem 0.72rem; border-radius: 0.55rem;
  box-shadow: 0.25rem 0.35rem 0 rgba(139, 61, 255, 0.3);
  opacity: 0; transform: translateY(0.35rem) rotate(-1.2deg); transform-origin: bottom left;
  pointer-events: none; transition: opacity 0.16s ease, transform 0.16s ease; z-index: 6;
}
.hint::before {
  content: ""; position: absolute; left: 1.5rem; bottom: calc(100% + 0.42rem);
  width: 0.62rem; height: 0.62rem; background: var(--c-ink); transform: rotate(45deg);
  opacity: 0; pointer-events: none; transition: opacity 0.16s ease; z-index: 6;
}
.hint:hover::after, .hint:focus-visible::after { opacity: 1; transform: translateY(0) rotate(-1.2deg); }
.hint:hover::before, .hint:focus-visible::before { opacity: 1; }

@media (min-width: 900px) {
  /* Two columns: the copy (intro, argument, closer) on the left; the marked-up
     to-do list on the right. */
  .brief-problem .spread__inner {
    display: grid;
    grid-template-columns: 0.8fr 1.2fr;
    column-gap: clamp(2.5rem, 5vw, 5.5rem);
    align-items: center;
  }
  .brief-problem__col { grid-column: 1; }
  .brief-problem .svc-problem__lead { max-width: 42ch; margin-bottom: 0; }
  .brief-problem__out { margin: var(--s-3) 0 0; max-width: none; }
  .brief-problem__out .brief-problem__body { max-width: none; }
  .redpen { grid-column: 2; margin: 0; max-width: none; }
}

/* The "noise" cloud: the wall of contradictory advice. Each word's font, size,
   tilt and colour are set inline by main.js (random within the brand set); the
   flood-in and jitter are driven by the .is-on / .is-live classes it toggles. */
.brief-noise {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center;
  gap: 0.35em 0.85em;
  margin: var(--s-4) auto;
  /* base unit — word sizes are em multiples of this, so the words scale down on
     narrow screens instead of overflowing */
  font-size: clamp(0.72rem, 1.25vw, 1.15rem);
}
.brief-noise__word {
  display: inline-block; white-space: nowrap; line-height: 1.05;
  font-family: var(--word-font, var(--f-body));
  font-weight: 500;
  font-size: var(--word-size, 2.5em);
  color: var(--word-col, var(--c-ink-mid));
  transform: rotate(var(--rot, 0deg)) translateY(calc(0.4em + var(--shift, 0em))) scale(0.92);
  opacity: 0;
  transition: opacity 0.5s ease, transform 0.55s cubic-bezier(0.2, 0.7, 0.3, 1);
}
.brief-noise__word.is-on { opacity: 1; transform: rotate(var(--rot, 0deg)) translateY(var(--shift, 0em)) scale(1); }

/* Guru soundbites — the advice styled like the platforms it actually comes from:
   a tweet, a LinkedIn post, a push notification, an iMessage. main.js tilts each
   card and floods them in on scroll. The set breaks out wider than the copy column
   so it spreads across rather than stacking tall. */
.gurus {
  display: flex; flex-wrap: wrap; justify-content: center; align-items: flex-start;
  gap: 0.9rem 1.1rem;
  width: min(95vw, 100rem);
  margin-block: var(--s-4) var(--s-3);
  margin-left: 50%;
  transform: translateX(-50%);
}
.guru {
  font-family: var(--f-body);
  opacity: 0;
  transform: rotate(var(--rot, 0deg)) translateY(0.8rem) scale(0.9);
  transition: opacity 0.4s ease, transform 0.45s cubic-bezier(0.2, 0.8, 0.3, 1);
}
.guru.is-on { opacity: 1; transform: rotate(var(--rot, 0deg)) translateY(0) scale(1); }
.guru__body { display: flex; flex-direction: column; min-width: 0; }
.guru__text { margin: 0.2rem 0 0; }

/* --- Tweet (X) --- */
.guru--x { display: flex; gap: 0.65rem; align-items: flex-start; width: 17rem; background: #fff; border: 1px solid #cfd9de; border-radius: 1rem; padding: 0.8rem 0.95rem; box-shadow: 0 1px 4px rgba(0,0,0,0.07); }
.guru--x .guru__av { width: 2.4rem; height: 2.4rem; border-radius: 50%; background: #e7ecf0; display: grid; place-items: center; font-size: 1.3rem; flex: none; }
.guru--x .guru__body { flex: 1 1 auto; }
.guru--x .guru__hd { display: flex; align-items: center; gap: 0.25rem; flex-wrap: wrap; }
.guru--x .guru__name { font-weight: 800; font-size: 0.92rem; color: #0f1419; }
.guru--x .guru__name::after { content: "\2713"; display: inline-grid; place-items: center; width: 0.95rem; height: 0.95rem; margin-left: 0.15rem; background: #1d9bf0; color: #fff; border-radius: 50%; font-size: 0.62rem; font-weight: 700; vertical-align: 0.06em; }
.guru--x .guru__handle { color: #536471; font-weight: 400; font-size: 0.85rem; }
.guru--x .guru__handle::after { content: " \00b7 2h"; }
.guru--x .guru__text { color: #0f1419; font-weight: 400; font-size: 1.05rem; line-height: 1.3; }
.guru--x .guru__stats { color: #536471; font-size: 0.82rem; margin-top: 0.5rem; }

/* --- LinkedIn --- */
.guru--li { display: flex; gap: 0.55rem; align-items: flex-start; width: 17.5rem; background: #fff; border: 1px solid #e2e2e2; border-radius: 0.6rem; padding: 0.8rem 0.9rem; box-shadow: 0 2px 8px rgba(0,0,0,0.09); }
.guru--li .guru__av { width: 2.7rem; height: 2.7rem; border-radius: 50%; background: #eef3f8; display: grid; place-items: center; font-size: 1.4rem; flex: none; }
.guru--li .guru__body { flex: 1 1 auto; }
.guru--li .guru__name { font-weight: 600; font-size: 0.9rem; color: rgba(0,0,0,0.9); }
.guru--li .guru__name::after { content: " \00b7 1st"; color: rgba(0,0,0,0.55); font-weight: 400; font-size: 0.78rem; }
.guru--li .guru__role { font-size: 0.74rem; color: rgba(0,0,0,0.6); }
.guru--li .guru__role::after { content: " \00b7 3d \00b7 \1F310"; }
.guru--li .guru__text { color: rgba(0,0,0,0.9); font-weight: 400; font-size: 1rem; line-height: 1.3; }
.guru--li .guru__stats { color: rgba(0,0,0,0.55); font-size: 0.76rem; border-top: 1px solid #e8e8e8; margin-top: 0.5rem; padding-top: 0.4rem; }

/* --- Notification (iOS push) --- */
.guru--notif { display: flex; gap: 0.6rem; align-items: center; width: 16rem; background: rgba(249,248,251,0.92); border: 1px solid rgba(0,0,0,0.05); border-radius: 1.4rem; padding: 0.65rem 0.85rem; box-shadow: 0 6px 16px rgba(60,40,100,0.13); }
.guru--notif .guru__av { width: 2.4rem; height: 2.4rem; border-radius: 0.62rem; background: linear-gradient(140deg, #a78bfa, #7c3aed); display: grid; place-items: center; font-size: 1.2rem; flex: none; }
.guru--notif .guru__body { flex: 1 1 auto; }
.guru--notif .guru__hd { display: flex; justify-content: space-between; align-items: baseline; }
.guru--notif .guru__name { font-size: 0.68rem; letter-spacing: 0.05em; text-transform: uppercase; color: rgba(0,0,0,0.5); font-weight: 600; }
.guru--notif .guru__time { font-size: 0.68rem; color: rgba(0,0,0,0.38); }
.guru--notif .guru__text { color: #000; font-weight: 600; font-size: 1rem; line-height: 1.25; margin: 0.1rem 0 0; }

/* --- DM (iMessage) --- */
.guru--dm { display: flex; max-width: 17rem; }
.guru--dm .guru__av { display: none; }
.guru--dm .guru__body { align-items: flex-start; }
.guru--dm .guru__handle { font-size: 0.7rem; color: rgba(0,0,0,0.45); margin: 0 0 0.28rem 0.95rem; font-weight: 500; }
.guru--dm .guru__text { background: #e4e4e8; color: #000; font-weight: 400; font-size: 1.02rem; line-height: 1.3; border-radius: 1.25rem; padding: 0.55rem 0.95rem; margin: 0; box-shadow: 0 2px 8px rgba(60,40,100,0.1); }

@media (prefers-reduced-motion: reduce) { .guru { transition: none; } }

/* The "noise" as a marked-up marketing to-do list — printed on a cream sheet and
   savaged with a purple pen: hand-drawn strikes, a circle, handwritten margin notes.
   Strikes/circle use inline SVG so they read as pen, not clean CSS rules. */
.redpen {
  max-width: 52rem;
  margin: var(--s-4) auto;
  background: var(--c-cream);
  border: 1.5px solid var(--c-ink);
  box-shadow: 0.55rem 0.55rem 0 var(--c-lavender);
  padding: clamp(1.1rem, 2.2vw, 1.6rem) clamp(1.5rem, 4vw, 3rem);
  transform: rotate(-1deg);
}
.redpen__head {
  font-family: var(--f-body); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.12em; font-size: var(--t-small); color: var(--c-ink-mid);
  margin: 0 0 var(--s-3); padding-bottom: 0.7rem; border-bottom: 2px solid var(--c-ink);
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
}
.redpen__scrawl {
  font-family: 'Casual Human', cursive; text-transform: none; letter-spacing: 0;
  color: var(--c-purple); font-size: 1.5rem; transform: rotate(-3deg);
}
.redpen__cols { display: grid; grid-template-columns: 1fr; column-gap: 2.4rem; }
@media (min-width: 560px) { .redpen__cols { grid-template-columns: 1fr 1fr; } }
.redpen__list { list-style: none; margin: 0; padding: 0; }
.rp {
  display: flex; align-items: baseline; gap: 0.65rem;
  padding: 0.42rem 0;
  font-family: var(--f-body); font-size: clamp(1.05rem, 0.4vw + 0.95rem, 1.25rem); color: var(--c-ink);
}
.rp__box { flex: none; width: 1.05rem; height: 1.05rem; align-self: flex-start; margin-top: 0.3rem; border: 2px solid var(--c-ink); border-radius: 0.18rem; transform: rotate(-4deg); }
.rp__t { position: relative; }
.rp__note {
  font-family: 'Casual Human', cursive; color: var(--c-purple);
  font-size: 1.35rem; line-height: 1; margin-left: 0.5rem;
  transform: rotate(-4deg); display: inline-block; white-space: nowrap;
}

/* Linked pair: two rows joined by a right-side curved brace + margin note. */
.rp--pair { display: flex; align-items: center; gap: 0.5rem; padding: 0.42rem 0; }
.rp__stack { position: relative; display: flex; flex-direction: column; }
.rp__row { display: flex; align-items: baseline; gap: 0.65rem; padding: 0.26rem 0; }
.rp__brace { display: flex; align-items: center; gap: 0.3rem; align-self: stretch; }
.rp__brace .rp__note { margin-left: 0; }

/* Hand-drawn marks — inline SVG so they can "draw" themselves in on scroll. */
.mark { position: absolute; pointer-events: none; overflow: visible; }
.mark path {
  fill: none; stroke: var(--c-purple); stroke-width: 2.6;
  stroke-linecap: round; stroke-linejoin: round;
  vector-effect: non-scaling-stroke; stroke-dasharray: 1;
}
.mark--strike { left: -0.15em; top: 34%; width: calc(100% + 0.3em); height: 0.6em; }
.mark--circle { left: -0.28em; top: -0.2em; width: calc(100% + 0.56em); height: calc(100% + 0.4em); }
.mark--circle2 { left: -0.5rem; top: -0.2rem; width: calc(100% + 1rem); height: calc(100% + 0.4rem); }
.mark--brace { position: relative; flex: none; width: 1.5rem; min-height: 3.1rem; align-self: stretch; }

/* Draw-in: only when JS arms it (adds .is-armed) and motion is allowed. */
@media (prefers-reduced-motion: no-preference) {
  .is-armed .mark path { stroke-dashoffset: 1; transition: stroke-dashoffset 0.4s ease var(--d, 0s); }
  .is-armed.is-marking .mark path { stroke-dashoffset: 0; }
  .is-armed .rp__note { opacity: 0; transform: rotate(-4deg) scale(0.5); transition: opacity 0.24s ease var(--d, 0s), transform 0.24s ease var(--d, 0s); }
  .is-armed.is-marking .rp__note { opacity: 1; transform: rotate(-4deg) scale(1); }
}

/* ============================================================
   WHO IT'S FOR / NOT FOR — the Hot List vs the Not List.
   Asymmetric magazine collage: a badge-sealed hero box (for) and a
   smaller, greyed, tossed-aside slip (not for). Deliberately NOT a
   matched pair — different size, tilt, offset, border and weight.
   ============================================================ */
.whofor { background: var(--c-lavender); padding-block: var(--s-5); }
.hotnot { display: grid; gap: clamp(2rem, 4.5vw, 4rem); align-items: start; }
@media (min-width: 860px) {
  .hotnot { grid-template-columns: 1.12fr 0.88fr; }
  .notlist { margin-top: var(--s-4); }   /* drop it down for asymmetry */
}

/* THE HOT LIST — the hero: chunky purple border, tilt, starburst seal */
.hotlist {
  position: relative;
  background: var(--c-cream);
  border: 3px solid var(--c-purple);
  box-shadow: 0.7rem 0.7rem 0 var(--c-ink);
  padding: clamp(1.9rem, 3.5vw, 2.9rem) clamp(1.6rem, 3vw, 2.5rem);
  transform: rotate(-1.2deg);
}
.hotlist__seal {
  position: absolute; top: -2.7rem; right: -2rem; width: 7.6rem; height: 7.6rem;
  display: grid; place-items: center; text-align: center;
  background: var(--c-purple); color: var(--c-cream);
  clip-path: polygon(50% 0%,60% 18%,83% 12%,78% 33%,100% 38%,84% 52%,100% 68%,76% 68%,82% 92%,60% 79%,50% 100%,40% 79%,18% 92%,24% 68%,0% 68%,16% 52%,0% 38%,22% 33%,17% 12%,40% 18%);
  transform: rotate(-13deg); z-index: 3;
}
.hotlist__seal-txt {
  font-family: var(--f-display); font-feature-settings: "liga" 1,"dlig" 1,"calt" 1;
  font-size: 1.2rem; line-height: 0.92; text-transform: uppercase; letter-spacing: 0.02em;
}
.hotlist__head {
  font-family: var(--f-display); font-feature-settings: "liga" 1,"dlig" 1,"calt" 1; font-weight: 400;
  font-size: clamp(1.6rem, 3vw, 2.4rem); line-height: 1; margin: 0 0 var(--s-2); color: var(--c-ink);
  max-width: 14ch;
}
/* highlighter swipe behind the heading — a subtle translucent marker through the
   lower third of the text (its own class, NOT the site's solid .hl box) */
.hotlist__hl {
  -webkit-box-decoration-break: clone; box-decoration-break: clone;
  padding: 0 0.05em;
  background-image: linear-gradient(101deg, rgba(139,61,255,0) 1%, rgba(139,61,255,0.22) 3%, rgba(139,61,255,0.22) 97%, rgba(139,61,255,0) 99%);
  background-repeat: no-repeat; background-position: 0 87%; background-size: 100% 36%;
}
.hotlist__items { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--s-2); }
.hotlist__items li {
  display: flex; align-items: flex-start; gap: 0.6rem;
  font-size: clamp(1rem, 0.4vw + 0.9rem, 1.15rem); line-height: 1.4; color: var(--c-ink);
}
.hotlist__star { flex: none; color: var(--c-purple); font-size: 1.05rem; line-height: 1.32; }

/* THE NOT LIST — lesser: greyed, dashed, tilted the other way, tossed down */
.notlist {
  position: relative;
  background: var(--c-cream-2);
  border: 1.5px dashed var(--c-ink-mid);
  padding: clamp(1.5rem, 3vw, 2.25rem) clamp(1.4rem, 2.6vw, 2rem);
  transform: rotate(1.5deg);
}
.notlist__stamp {
  display: inline-block; font-family: var(--f-display); font-feature-settings: "liga" 1,"dlig" 1,"calt" 1;
  font-size: 1.05rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--c-ink-mid);
  border: 2px solid var(--c-ink-mid); border-radius: 0.3rem; padding: 0.12em 0.5em;
  transform: rotate(-3deg); margin-bottom: var(--s-2);
}
.notlist__head {
  font-family: var(--f-display); font-feature-settings: "liga" 1,"dlig" 1,"calt" 1; font-weight: 400;
  font-size: clamp(1.35rem, 2.3vw, 1.85rem); line-height: 1; margin: 0 0 var(--s-2); color: var(--c-ink-mid);
}
.notlist__items { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--s-2); }
.notlist__items li {
  display: flex; align-items: flex-start; gap: 0.55rem;
  font-size: clamp(0.95rem, 0.35vw + 0.86rem, 1.05rem); line-height: 1.4; color: var(--c-ink-mid);
}
.notlist__x { flex: none; color: var(--c-ink-mid); font-size: 0.85rem; line-height: 1.5; }

/* mobile: no tilts, shrink the seal, keep it on-card */
@media (max-width: 859px) {
  .hotlist, .notlist { transform: none; }
  .hotlist__seal { width: 5.6rem; height: 5.6rem; top: -1.8rem; right: -0.6rem; }
  .hotlist__seal-txt { font-size: 0.9rem; }
}

/* Motion — armed by JS (.is-armed) then revealed on scroll (.is-marking):
   hot box slides up, seal stamps in, not-list drops in, highlighter swipes.
   Only when motion is allowed; otherwise everything is shown as-is. */
@media (prefers-reduced-motion: no-preference) {
  .hotnot.is-armed .hotlist { opacity: 0; transform: translateY(1.7rem) rotate(-1.2deg); }
  .hotnot.is-armed.is-marking .hotlist {
    opacity: 1; transform: translateY(0) rotate(-1.2deg);
    transition: opacity 0.5s ease, transform 0.5s cubic-bezier(0.2,0.7,0.3,1);
  }
  /* mobile has no tilt, so land flat */
  @media (max-width: 859px) {
    .hotnot.is-armed .hotlist { transform: translateY(1.7rem); }
    .hotnot.is-armed.is-marking .hotlist { transform: translateY(0); }
  }

  .hotnot.is-armed .hotlist__seal { opacity: 0; transform: scale(2) rotate(-48deg); }
  .hotnot.is-armed.is-marking .hotlist__seal {
    opacity: 1; transform: scale(1) rotate(-13deg);
    transition: opacity 0.26s ease 0.32s, transform 0.4s cubic-bezier(0.2,1.55,0.35,1) 0.32s;
  }

  .hotnot.is-armed .notlist { opacity: 0; transform: translateY(2.4rem) rotate(3.5deg); }
  .hotnot.is-armed.is-marking .notlist {
    opacity: 1; transform: translateY(0) rotate(1.5deg);
    transition: opacity 0.5s ease 0.16s, transform 0.55s cubic-bezier(0.2,0.7,0.3,1) 0.16s;
  }
  @media (max-width: 859px) {
    .hotnot.is-armed .notlist { transform: translateY(2.4rem); }
    .hotnot.is-armed.is-marking .notlist { transform: translateY(0); }
  }

  .hotnot.is-armed .hotlist__hl { background-size: 0% 36%; }
  .hotnot.is-armed.is-marking .hotlist__hl {
    background-size: 100% 36%; transition: background-size 0.55s ease 0.5s;
  }
}
/* the words flood in, then hold static (no jitter). Reduced motion is handled by
   the global `*` transition reset, so they just appear. */

/* round-2: rhythm (no two whites touching), balanced promise, two-col CTA */
.svc-problem { background: var(--c-haze); }
.svc-rate { background: var(--c-haze); }
.svc-promise__head { color: var(--c-cream); margin: 0; }
.svc-promise__head .hl { color: var(--c-ink); }
.svc-promise__points { list-style: none; margin: var(--s-5) 0 0; padding: 0; display: grid; gap: var(--s-3); }
@media (min-width: 760px) { .svc-promise__points { grid-template-columns: repeat(3, 1fr); gap: var(--s-4); } }
.svc-promise__points li { padding-top: var(--s-2); border-top: 2px solid rgba(251, 250, 255, 0.45); font-size: var(--t-body); line-height: 1.5; color: rgba(251, 250, 255, 0.9); }
.svc-promise__points strong { display: block; font-family: var(--f-display); font-weight: 400; font-size: clamp(1.15rem, 1.6vw, 1.5rem); color: var(--c-cream); margin-bottom: 0.35rem; }
.svc-cta__grid { display: grid; gap: var(--s-4); align-items: center; }
@media (min-width: 900px) { .svc-cta__grid { grid-template-columns: 1.2fr 0.8fr; gap: var(--s-5); } }
.svc-cta__right { display: flex; flex-direction: column; gap: var(--s-3); align-items: flex-start; }
@media (min-width: 900px) { .svc-cta__right { padding-left: clamp(0rem, 5vw, 6rem); } }
.svc-cta__right .svc-cta__sub { margin: 0; max-width: 40ch; }
.svc-cta__ps { font-style: italic; color: rgba(251, 250, 255, 0.85); font-size: var(--t-small); max-width: 32ch; margin: 0; }

/* ============================================================= */
/* ABOUT / RESUME                                                */
/* A typeset resume presented as a printed sheet. Mobile-first:  */
/* base = single-column stacked pages; >=768px = two-column      */
/* sidebar layout on a tilted sheet.                             */
/* ============================================================= */
.resume__desk {
  /* subtle grayscale paper grain, reused by the sheet and the mobile deck pages */
  --paper-grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23p)' opacity='0.35'/%3E%3C/svg%3E");
  background: var(--c-haze);
  padding: var(--s-4) var(--s-2);
  display: flex;
  justify-content: center;
  overflow-x: clip;
}
.resume__sheet {
  position: relative;
  width: min(64rem, 100%);
  background-color: var(--c-cream);
  background-image: var(--paper-grain);
  background-blend-mode: multiply;
  color: var(--c-ink);
  box-shadow: 0 1.25rem 2.75rem rgba(31, 31, 35, 0.14);
  padding: clamp(1.5rem, 5vw, 4.5rem);
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
}
.resume__masthead { display: flex; gap: var(--s-3); align-items: flex-start; border-bottom: 2px solid var(--c-ink); padding-bottom: var(--s-3); }
.resume__photo { flex: 0 0 auto; width: clamp(5rem, 22vw, 7rem); height: auto; aspect-ratio: 3 / 4; object-fit: cover; object-position: center top; border: 2px solid var(--c-ink); }
.resume__intro { flex: 1 1 auto; min-width: 0; }
.resume__title { font-family: var(--f-display); font-size: clamp(1.6rem, 3.6vw, 2.9rem); line-height: 0.95; margin: 0 0 var(--s-2); }
.resume__opener { font-family: var(--f-body); font-size: var(--t-body); line-height: 1.5; max-width: 58ch; color: var(--c-ink-mid); margin: 0; }
/* section headings: purple chip labels (a pop of colour, not just rules) */
.resume__h {
  display: inline-block; font-family: var(--f-body); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.12em; font-size: var(--t-small); color: var(--c-cream);
  background: var(--c-purple); padding: 0.3em 0.6em; margin: 0 0 var(--s-2);
}

.resume__body { display: flex; flex-direction: column; gap: var(--s-4); }
.resume__main, .resume__rail { display: flex; flex-direction: column; gap: var(--s-4); }

/* deck page identity comes from each section's own heading + the deck counter,
   so the per-section label span is not shown (kept in DOM as a harmless hook). */
.resume-page__label { display: none; }

.resume__contact, .resume__values, .resume__skills, .resume__hobbies {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--s-1);
  font-size: var(--t-body); line-height: 1.4;
}
.resume__values li, .resume__skills li, .resume__hobbies li { position: relative; padding-left: 1.1em; }
.resume__values li::before, .resume__skills li::before, .resume__hobbies li::before {
  content: ""; position: absolute; left: 0; top: 0.55em; width: 6px; height: 6px; background: var(--c-purple);
}
.resume__contact a { color: var(--c-ink); text-decoration: none; border-bottom: 1.5px solid var(--c-purple); }
.resume__contact a:hover { color: var(--c-purple); }

.resume__roles { list-style: none; margin: 0; padding: 0; }
.resume-role { position: relative; padding: 0 0 var(--s-4) var(--s-3); border-left: 2px solid var(--c-ink); }
.resume-role::before { content: ""; position: absolute; left: -6px; top: 0.4rem; width: 10px; height: 10px; background: var(--c-purple); }
.resume-role__head { display: block; }
.resume-role__title { font-family: var(--f-body); font-weight: 700; font-size: var(--t-body); line-height: 1.2; margin: 0; }
.resume-role__co { display: block; font-family: var(--f-body); font-weight: 600; color: var(--c-purple-2); margin: 0.05rem 0 0; font-size: var(--t-body); }
.resume-role__dates {
  display: block; font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.12em;
  font-size: var(--t-small); color: var(--c-ink-mid); margin: 0.2rem 0 var(--s-1);
}
.resume-role__list { list-style: none; margin: 0; padding: 0; font-size: var(--t-body); line-height: 1.45; }
.resume-role__list li { position: relative; padding-left: 1.1em; margin-bottom: 0.35rem; }
.resume-role__list li::before {
  content: ""; position: absolute; left: 0; top: 0.5em; width: 6px; height: 6px; background: var(--c-purple);
}
/* references: a plain bold text line that links home */
.resume__stamp {
  display: inline-block; margin-top: var(--s-2); font-family: var(--f-body); font-weight: 700;
  font-size: var(--t-body); color: var(--c-ink); text-decoration: none;
}
.resume__stamp:hover { color: var(--c-purple); text-decoration: underline; }

@media (min-width: 768px) {
  .resume__desk { padding: var(--s-2) var(--s-3) var(--s-5); }
  /* subtle tilt + a deeper shadow weighted to the bottom-right, so that corner
     reads as lifted a touch more off the desk than the rest of the sheet */
  .resume__sheet {
    transform: rotate(-1deg);
    box-shadow: 0 1rem 2rem rgba(31, 31, 35, 0.1), 1.5rem 2.5rem 3rem -0.75rem rgba(31, 31, 35, 0.22);
  }
  .resume__masthead { align-items: flex-start; gap: var(--s-4); }
  .resume__photo { width: clamp(8.5rem, 15vw, 12rem); aspect-ratio: 3 / 4; height: auto; }
  .resume__body { display: grid; grid-template-columns: 18rem 1fr; column-gap: var(--s-5); align-items: start; }
  .resume__rail { grid-column: 1; grid-row: 1; }
  .resume__main { grid-column: 2; grid-row: 1; gap: 0; }
  .resume-page__label { display: none; }
}

/* ---- Mobile: a long, single-column printed page. Everything stacks in DOM
   order (masthead, contact, values, skills, hobbies, work history, references). ---- */
@media (max-width: 767px) {
  .resume__desk { padding: var(--s-2) var(--s-2) var(--s-4); }
  .resume__sheet { width: min(32rem, 100%); padding: var(--s-4) clamp(1.25rem, 6vw, 2rem); }
  /* masthead stacks: photo above the heading, both full width */
  .resume__masthead { flex-direction: column; align-items: stretch; gap: var(--s-3); }
  .resume__photo { width: 100%; height: auto; aspect-ratio: 3 / 2; object-position: center; }
}

/* ---- Download PDF toolbar (outside the printed sheet) ---- */
.resume__toolbar { background: var(--c-haze); display: flex; justify-content: center; padding: var(--s-4) var(--s-3) var(--s-2); }
.resume__toolbar-inner { width: min(64rem, 100%); display: flex; justify-content: flex-end; }
.resume__download {
  display: inline-flex; align-items: center; gap: 0.4rem;
  font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
  font-size: 0.7rem; color: var(--c-ink-mid); background: none; text-decoration: none;
  border: 1.5px solid var(--c-ink-mid); padding: 0.35rem 0.65rem; cursor: pointer;
  transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.resume__download:hover { background: var(--c-ink); border-color: var(--c-ink); color: var(--c-cream); }
.resume__download svg { display: block; }
.resume__download:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 3px; }

/* ---- Print: a purpose-built 2-page resume.
   Page 1 = masthead + the non-work info in two columns (contact/values/skills | hobbies).
   Page 2 = work history in two columns (roles 1-3 | roles 4-6 + references).
   White sheet (no cream/inset look); grain/tilt/shadow dropped. ---- */
@media print {
  .nav, .foot, #contents, dialog, .menu-dialog, .resume__toolbar { display: none !important; }
  .resume__h, .resume__photo { -webkit-print-color-adjust: exact; print-color-adjust: exact; }

  /* the theme's body is cream; force white so nothing shows below the sheet */
  html, body, .resume { background: #fff !important; }
  .resume__desk { padding: 0 !important; background: #fff !important; }
  .resume__sheet {
    display: block !important; background: #fff !important; background-image: none !important;
    transform: none !important; box-shadow: none !important;
    width: 100% !important; min-height: 0 !important; height: auto !important; max-height: none !important;
    padding: 0 !important;
  }
  .resume-page { border-top: 0 !important; padding-top: 0 !important; }

  /* masthead: smaller intro so it balances the photo */
  .resume__masthead { flex-direction: row !important; align-items: center !important; gap: 1.5rem !important; margin-bottom: 1.5rem !important; }
  .resume__photo { width: 8rem !important; height: 8rem !important; aspect-ratio: auto !important; }
  .resume__opener { font-size: 0.8rem !important; line-height: 1.4 !important; max-width: none !important; }

  /* PAGE 1 — non-work info, two columns: contact/values/skills | hobbies */
  .resume__body { display: block !important; }
  .resume__rail { display: block !important; columns: 2 !important; column-gap: 1.75rem !important; }
  .resume__rail > .resume-page { -webkit-column-break-inside: avoid; break-inside: avoid !important; margin: 0 0 1rem !important; }
  .resume-page--hobbies { -webkit-column-break-before: always; break-before: column !important; }

  /* PAGE 2 — work history on its own page, two balanced columns. Roles flow and
     balance across the two columns (all six + refs now fit on the one page). */
  .resume__main { break-before: page !important; page-break-before: always !important; display: block !important; padding-top: 0.2rem !important; }
  .resume__main > .resume-page--work { break-before: avoid !important; }
  /* small left inset so the timeline node squares (which overhang left of the
     role border) aren't clipped at the left column's page edge */
  .resume__work-flow { columns: 2 !important; column-gap: 1.75rem !important; padding-left: 7px !important; }
  .resume__roles { margin: 0 !important; }
  .resume-role { -webkit-column-break-inside: avoid; break-inside: avoid !important; padding-bottom: 0.7rem !important; }
  .resume-role:last-child { padding-bottom: 0 !important; }
  .resume-role__list li { margin-bottom: 0.12rem !important; }
  .resume__stamp { -webkit-column-break-inside: avoid; break-inside: avoid !important; margin-top: 0.7rem !important; }

  @page { margin: 1cm; }
}

/* ============================================================= */
/* NEWSLETTER — native members form states + modal                */
/* ============================================================= */
/* success / error states (Ghost toggles .success/.error on the form) */
.news__error { margin: var(--s-2) 0 0; font-size: var(--t-small); color: var(--c-cream); }
.news__error:empty { display: none; }
.news__success { display: none; margin: var(--s-2) 0 0; font-size: var(--t-small); font-weight: 700; color: var(--c-cream); }
.news__form.success .news__field,
.news__form.success .news__submit-wrap { display: none; }
.news__form.success .news__success { display: block; }
.news__form.loading .btn-stamp { opacity: 0.6; pointer-events: none; }

.nl-modal { border: 0; padding: 0; background: transparent; width: calc(100% - 2.5rem); max-width: 30rem; color: var(--c-ink); }
.nl-modal::backdrop { background: rgba(31, 31, 35, 0.55); }
.nl-modal__inner { position: relative; background: var(--c-cream); border: 2px solid var(--c-ink); box-shadow: 0 1.5rem 3.5rem rgba(31, 31, 35, 0.28); padding: clamp(1.75rem, 5vw, 2.75rem); }
.nl-modal__close { position: absolute; top: 0.35rem; right: 0.55rem; background: none; border: 0; line-height: 1; font-size: 1.9rem; color: var(--c-ink); cursor: pointer; padding: 0.1rem 0.45rem; }
.nl-modal__close:hover { color: var(--c-purple); }
.nl-modal__title { font-family: var(--f-display); font-size: clamp(1.9rem, 6vw, 2.6rem); line-height: 0.95; margin: 0 0 var(--s-2); }
.nl-modal__title strong { color: var(--c-purple); }
.nl-modal__blurb { font-family: var(--f-body); font-size: var(--t-body); line-height: 1.4; color: var(--c-ink-mid); margin: 0 0 var(--s-3); max-width: 34ch; }
.nl-modal__fine { font-family: var(--f-body); font-size: var(--t-small); font-style: italic; color: var(--c-ink-mid); margin: var(--s-2) 0 0; }
/* form sits on the cream modal, so recolour it from cream (purple section) to ink */
.nl-modal .news__field { border-color: var(--c-ink); }
.nl-modal .news__field label { color: var(--c-ink-mid); }
.nl-modal .news__field input { color: var(--c-ink); }
.nl-modal .news__field input::placeholder { color: var(--c-ink-mid); }
.nl-modal .news__field input:focus { outline-color: var(--c-purple); }
.nl-modal .news__error { color: var(--c-ink); }
.nl-modal .news__success { color: var(--c-ink); }
.nl-modal .news__submit-wrap { margin-top: var(--s-2); }

/* account / sign-in modal extras */
.nl-modal__actions { margin: var(--s-2) 0 var(--s-3); }
.nl-modal__switch { background: none; border: 0; padding: 0; font: inherit; color: var(--c-purple); text-decoration: underline; cursor: pointer; }
.nl-modal__switch:hover { color: var(--c-ink); }
.nl-modal__fine a { color: var(--c-purple); }
.nl-modal__fine a:hover { color: var(--c-ink); }

/* contents-menu action buttons (newsletter + sign-in/account).
   Desktop: shown in the aside under the description. Mobile: shown at the foot of the list. */
.menu__actions { display: flex; flex-direction: column; align-items: start; gap: var(--s-3); margin-top: var(--s-4); }
.menu__actions .menu__cta { margin-top: 0; }
.menu__actions--aside { display: none; }
@media (min-width: 900px) {
  .menu__actions--aside { display: flex; }
  .menu__actions--list { display: none; }
}
.menu__signin {
  text-transform: uppercase; letter-spacing: 0.18em; font-size: var(--t-small); font-weight: 700;
  color: var(--c-ink); border-bottom: 1.5px solid var(--c-purple); padding-bottom: 0.15em;
}
.menu__signin:hover { color: var(--c-purple); }

/* ============================================================
   DFY QUOTE CALCULATOR (/dfy-quote/)
   A multi-step form styled to the system: stamp buttons, bordered
   selectable cards with a hand-tilted checkbox, cream inputs.
   ============================================================ */
.calc { padding-block: var(--s-5); }
.calc__wrap { width: min(48rem, 100% - 2.5rem); margin-inline: auto; }
/* Desktop: the intro + currency sit sticky on the left, the steps run down the right —
   so advancing a step never scrolls you back past the intro, and the currency toggle
   stays in reach. The steps + foot are direct children, grid-placed into column 2. */
@media (min-width: 900px) {
  .calc__wrap {
    width: min(64rem, 100% - 2.5rem);
    display: grid;
    grid-template-columns: 20rem minmax(0, 1fr);
    column-gap: clamp(2rem, 4vw, 4rem);
    row-gap: var(--s-4);
    align-items: start;
  }
  .calc__masthead { grid-column: 1 / -1; margin: 0; }   /* headline spans the full width up top */
  .calc__aside { grid-column: 1; position: sticky; top: clamp(4.5rem, 8vh, 6rem); margin: 0; }
  .calc__wrap > :not(.calc__masthead):not(.calc__aside) { grid-column: 2; }
  .calc__wrap > .step { margin-top: 0; border-top: 0; padding-top: 0; }
}
.calc .step[hidden] { display: none; }

.calc__masthead { margin-bottom: var(--s-3); }
.calc__aside { margin-bottom: var(--s-4); }
.calc__kicker { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.16em; font-size: var(--t-small); font-weight: 700; color: var(--c-purple); margin: 0 0 var(--s-2); }
.calc__title { margin: 0 0 var(--s-3); }
.calc__intro p { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; margin: 0 0 var(--s-2); max-width: 46ch; }
.calc__currency { display: inline-flex; border: 2px solid var(--c-ink); margin-top: var(--s-2); }
.calc__cur { font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: var(--t-small); padding: 0.55rem 1.2rem; background: var(--c-cream); color: var(--c-ink); border: 0; cursor: pointer; }
.calc__cur + .calc__cur { border-left: 2px solid var(--c-ink); }
.calc__cur.active { background: var(--c-ink); color: var(--c-cream); }

/* steps */
.calc__step { margin-top: var(--s-4); border-top: 2px solid var(--c-ink); padding-top: var(--s-4); }
.calc__stepno { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.14em; font-size: var(--t-small); font-weight: 700; color: var(--c-purple); margin: 0 0 var(--s-1); }
.calc__q { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(1.9rem, 3.6vw, 2.9rem); line-height: 1; margin: 0 0 var(--s-2); }
.calc__subhead { font-family: var(--f-display); font-size: clamp(1.4rem, 2.2vw, 2rem); line-height: 1; margin: var(--s-3) 0 var(--s-2); }
.calc__lead { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; max-width: 54ch; margin: 0 0 var(--s-3); }
.calc__fine { color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.5; max-width: 60ch; margin: var(--s-2) 0 0; }
.calc__fine a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }
.calc__hint { color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.4; margin: 0 0 0.4rem; }

/* fields */
.calc__field { margin: 0 0 var(--s-3); }
.calc__grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-2); }
@media (max-width: 560px) { .calc__grid2 { grid-template-columns: 1fr; gap: 0; } }
.calc__label { display: block; font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: var(--t-small); color: var(--c-ink); margin: 0 0 0.4rem; }
.calc__input {
  width: 100%; font-family: var(--f-body); font-size: var(--t-body); color: var(--c-ink);
  background: var(--c-cream); border: 2px solid var(--c-ink); border-radius: 0; padding: 0.7rem 0.85rem;
}
textarea.calc__input { resize: vertical; line-height: 1.5; }
.calc__input:focus { outline: 2px solid var(--c-purple); outline-offset: 1px; }
.calc__input::placeholder { color: var(--c-ink-mid); opacity: 0.7; }

/* selectable option cards */
.calc__cards { margin: 0 0 var(--s-2); }
.calc .option-card {
  display: grid; grid-template-columns: auto 1fr; gap: 0.85rem; align-items: start;
  border: 2px solid var(--c-ink); background: var(--c-cream); padding: 0.9rem 1.1rem;
  margin: 0 0 var(--s-2); cursor: pointer; transition: background 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.calc .option-card:hover { background: var(--c-haze); }
.calc .option-card:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 2px; }
.calc .option-card__tick { flex: none; width: 1.35rem; height: 1.35rem; margin-top: 0.15rem; border: 2px solid var(--c-ink); border-radius: 0.2rem; background: var(--c-cream); position: relative; transform: rotate(-4deg); transition: background 0.15s ease, border-color 0.15s ease; }
.calc .option-card.selected { border-color: var(--c-purple); background: var(--c-haze); box-shadow: 0.35rem 0.35rem 0 var(--c-lavender); }
.calc .option-card.selected .option-card__tick { background: var(--c-purple); border-color: var(--c-purple); }
.calc .option-card.selected .option-card__tick::after { content: ""; position: absolute; left: 0.4rem; top: 0.1rem; width: 0.32rem; height: 0.62rem; border: solid var(--c-cream); border-width: 0 2.5px 2.5px 0; transform: rotate(45deg); }
.calc .option-card__name { display: block; font-family: var(--f-body); font-weight: 700; font-size: var(--t-body); line-height: 1.3; }
.calc .option-card__desc { display: block; color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.4; margin-top: 0.15rem; }

/* volume blocks */
.calc .volume-block { margin: 0 0 var(--s-3); }
.calc .volume-block-title { font-family: var(--f-display); font-size: clamp(1.2rem, 1.8vw, 1.55rem); line-height: 1; margin-bottom: 0.6rem; }
.calc .volume-row { display: flex; align-items: flex-end; gap: var(--s-2); flex-wrap: wrap; }
.calc .volume-row label { flex: 1 1 55%; text-transform: none; letter-spacing: 0; font-size: var(--t-body); }
.calc .volume-row label span { display: block; font-weight: 400; color: var(--c-ink-mid); font-size: var(--t-small); margin-top: 0.25rem; }
.calc .volume-row input { flex: 0 0 6.5rem; }

/* quote readout */
.calc__quote { border: 2px solid var(--c-ink); background: var(--c-cream); box-shadow: 0.6rem 0.6rem 0 var(--c-lavender); padding: var(--s-3) var(--s-4); margin: var(--s-2) 0 var(--s-3); }
.calc__quote-label { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.12em; font-size: var(--t-small); font-weight: 700; color: var(--c-ink-mid); }
.calc__quote-total { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(3rem, 8vw, 5rem); line-height: 0.9; margin: 0.15em 0; color: var(--c-ink); }
.calc__quote-note { color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.5; max-width: 48ch; }

/* consult off-ramp */
.calc__consult { border: 2px solid var(--c-ink); background: var(--c-purple); color: var(--c-cream); padding: var(--s-4); box-shadow: 0.6rem 0.6rem 0 var(--c-ink); }
.calc__consult-title { font-family: var(--f-display); font-size: clamp(1.6rem, 2.6vw, 2.3rem); line-height: 1; margin: 0 0 var(--s-2); color: var(--c-cream); }
.calc__consult p { color: rgba(251, 250, 255, 0.9); line-height: 1.55; margin: 0 0 var(--s-2); max-width: 48ch; }
.calc__consult-btn {
  display: inline-flex; align-items: center; gap: 0.5em; margin-top: var(--s-2);
  font-family: var(--f-display); font-size: clamp(1rem, 1.2vw, 1.25rem);
  color: var(--c-ink); background: var(--c-cream); border: 2px solid var(--c-ink);
  box-shadow: 0.45rem 0.45rem 0 var(--c-ink); padding: 0.8rem 1.2rem;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.calc__consult-btn:hover { transform: translate(-3px, -3px); box-shadow: 0.7rem 0.7rem 0 var(--c-ink); }

/* buttons */
.calc__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin-top: var(--s-3); }
.calc .btn-primary {
  position: relative; display: inline-flex; align-items: center; gap: 0.5em;
  font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1rem, 1.2vw, 1.3rem); line-height: 1;
  padding: 0.95rem 1.4rem; color: var(--c-ink); background: var(--c-cream);
  border: 2px solid var(--c-ink); border-radius: 0; box-shadow: 0.5rem 0.5rem 0 var(--c-purple);
  cursor: pointer; transition: transform 0.18s cubic-bezier(.2,.7,.3,1), box-shadow 0.18s cubic-bezier(.2,.7,.3,1);
}
.calc .btn-primary:hover { transform: translate(-3px, -3px); box-shadow: 0.75rem 0.75rem 0 var(--c-purple); }
.calc .btn-primary:active { transform: translate(2px, 2px); box-shadow: 0.2rem 0.2rem 0 var(--c-purple); }
.calc .btn-primary:disabled { opacity: 0.55; pointer-events: none; }
.calc .btn-secondary {
  display: inline-flex; align-items: center; gap: 0.4em; font-family: var(--f-body); font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.08em; font-size: var(--t-small); color: var(--c-ink-mid);
  background: none; border: 0; padding: 0.5rem 0.2rem; cursor: pointer; transition: color 0.15s ease;
}
.calc .btn-secondary:hover { color: var(--c-purple); }

.calc hr { margin-block: var(--s-3); background: rgba(20, 15, 40, 0.15); }
.calc__foot { margin-top: var(--s-5); padding-top: var(--s-3); border-top: 1px solid rgba(20, 15, 40, 0.12); color: var(--c-ink-mid); font-size: var(--t-small); }
.calc__foot a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; }

/* inline validation / load errors */
.calc-error {
  margin: var(--s-2) 0 0; padding: 0.7rem 0.95rem; font-size: var(--t-body); line-height: 1.5;
  color: #8A1C13; background: #FBEAE8; border-left: 3px solid #B3261E;
}
.calc-error[hidden] { display: none; }
.calc-error a { color: #8A1C13; text-decoration: underline; }

/* ============================================================
   ACCESSIBILITY — contrast + tap-target fixes (axe / PageSpeed)
   Placed last so these win by source order. Colours chosen to clear WCAG AA
   (4.5:1) on the section backgrounds they actually sit on, without changing
   the design language.
   ============================================================ */
/* Services section sits on lavender, so the ink-mid spine labels and section
   numbers were only 3.44:1. Darken to a muted slate that clears 4.5:1. */
.spine__label { color: #4A4A56; }
.threes__no   { color: #4A4A56; }
/* News section sits on purple; its light text used reduced alpha, dropping
   below 4.5:1. Solid white clears it and reads identical to cream on purple. */
.spine--light .spine__label { color: #FFFFFF; }
.news__content p,
.news__fine,
.news__form label,
.news .eye { color: #FFFFFF; }
.news .eye--mute { color: rgba(255,255,255,0.92); }
/* Footer links were ~15px-tall tap targets; pad them past the 24px minimum. */
.foot__col a { display: inline-block; padding-block: 0.4rem; }

/* ============================================================
   POST OUTRO — "back to archive" link at the end of a read.
   Understated text link, separated by a rule, with the arrow easing left on hover.
   ============================================================ */
.post-outro {
  margin-top: var(--s-4);
  padding-top: var(--s-3);
  border-top: 2px solid var(--c-ink);
}
.post-backlink {
  display: inline-flex;
  align-items: baseline;
  gap: 0.45em;
  font-family: var(--f-body);
  font-weight: 600;
  font-size: var(--t-body);
  color: var(--c-ink);
  text-decoration: none;
  transition: color 0.18s ease;
}
.post-backlink__arrow {
  font-weight: 800;
  transition: transform 0.18s cubic-bezier(.2,.7,.3,1);
}
.post-backlink:hover { color: var(--c-purple); }
.post-backlink:hover .post-backlink__arrow { transform: translateX(-4px); }
.post-backlink:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 3px; }

/* ============================================================
   ONE TO ONE PRE-CALL QUESTIONNAIRE (/121-booked-questionnaire/)
   Same system as the DFY quote calculator: sticky intro beside the
   steps, bordered choice rows with a hand-tilted tick, cream inputs.
   Differs from .calc in one respect — the choices here are real
   checkbox/radio inputs (the Worker reads them by name), so the tick
   is the input itself rather than a decorative span.
   ============================================================ */
.q121 { padding-block: var(--s-5); }
.q121__wrap { width: min(48rem, 100% - 2.5rem); margin-inline: auto; }
.q121 [hidden] { display: none !important; }

@media (min-width: 900px) {
  .q121__wrap {
    width: min(64rem, 100% - 2.5rem);
    display: grid;
    grid-template-columns: 20rem minmax(0, 1fr);
    column-gap: clamp(2rem, 4vw, 4rem);
    row-gap: var(--s-2);
    align-items: start;
  }
  .q121__masthead { grid-column: 1 / -1; margin: 0; }
  /* Two cells on one row: the intro sticks in column 1 while the whole form
     scrolls past in column 2. A sticky item can only travel inside its own grid
     area, which is why the form is wrapped rather than left as loose children. */
  .q121__aside { grid-column: 1; grid-row: 2; align-self: start; position: sticky; top: clamp(4.5rem, 8vh, 6rem); margin: 0; }
  .q121__main { grid-column: 2; grid-row: 2; min-width: 0; }
}

/* masthead + intro */
.q121__masthead { margin-bottom: var(--s-3); }
.q121__aside { margin-bottom: var(--s-4); }
.q121__kicker { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.16em; font-size: var(--t-small); font-weight: 700; color: var(--c-purple); margin: 0 0 var(--s-2); }
/* Plain text node — the script rewrites it with the client's name, so no inner markup. */
.q121__title { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(2.1rem, 5vw, 3.6rem); line-height: 0.98; margin: 0; }
.q121__intro p { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; margin: 0 0 var(--s-2); max-width: 46ch; }
.q121__fine { color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.5; }
/* inline-block + padding lifts these past the 24px minimum tap target */
.q121__fine a, .q121__intro a { color: var(--c-purple); text-decoration: underline; text-underline-offset: 0.15em; display: inline-block; padding-block: 0.25rem; }

/* connection + step status. This element also carries the failure message ("this
   link is missing its booking details"), so it's body size, not small print — and
   ink-mid on haze is only 4.45:1, under AA, hence the darker slate the theme already
   uses elsewhere for text on lavender. */
.q121__status { font-family: var(--f-body); font-size: var(--t-body); line-height: 1.5; color: #4A4A56; background: var(--c-haze); border-left: 3px solid var(--c-purple); padding: 0.7rem 0.95rem; margin: 0 0 var(--s-2); }
/* Connection failed / link missing its booking. Matches .calc-error so every failure
   on the site reads the same way. */
.q121__status--error { color: #8A1C13; background: #FBEAE8; border-left-color: #B3261E; }
.q121__stepno { font-family: var(--f-body); text-transform: uppercase; letter-spacing: 0.14em; font-size: var(--t-small); font-weight: 700; color: var(--c-purple); margin: 0 0 var(--s-1); }

/* steps */
.q121__step { margin-top: var(--s-3); border-top: 2px solid var(--c-ink); padding-top: var(--s-3); }
.q121__q { font-family: var(--f-display); font-feature-settings: "liga" 1, "dlig" 1, "calt" 1; font-size: clamp(1.9rem, 3.6vw, 2.9rem); line-height: 1; margin: 0 0 var(--s-2); }
.q121__q:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 4px; }
.q121__subhead { font-family: var(--f-display); font-size: clamp(1.3rem, 2.2vw, 1.9rem); line-height: 1; margin: var(--s-3) 0 var(--s-2); }
/* The branch name is a category tag under the step heading, not a second heading —
   two display faces stacked read as a title fighting a subtitle. */
.q121__branch { margin-top: var(--s-3); }
.q121__branchlabel {
  font-family: var(--f-body); font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.14em; font-size: var(--t-small); color: var(--c-purple);
  margin: 0 0 var(--s-2); padding-bottom: 0.6rem; border-bottom: 2px solid var(--c-ink);
}
.q121__lead { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; max-width: 54ch; margin: 0 0 var(--s-3); }
/* Only one step is ever visible, so the rule reads as a divider under the step
   label rather than a separator between steps. */
.q121__step:first-of-type { margin-top: var(--s-2); }

/* fields */
.q121__fieldset { border: 0; padding: 0; margin: 0 0 var(--s-3); min-width: 0; }
.q121__legend { padding: 0; font-family: var(--f-body); font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: var(--t-small); color: var(--c-ink); margin-bottom: 0.5rem; }
.q121__field { margin: 0 0 var(--s-3); }
.q121__label { display: block; font-family: var(--f-body); font-weight: 700; font-size: var(--t-body); line-height: 1.35; color: var(--c-ink); margin: 0 0 0.35rem; }
.q121__hint { color: var(--c-ink-mid); font-size: var(--t-small); line-height: 1.45; margin: 0 0 0.55rem; max-width: 58ch; }
.q121__input {
  width: 100%; font-family: var(--f-body); font-size: var(--t-body); color: var(--c-ink);
  background: var(--c-cream); border: 2px solid var(--c-ink); border-radius: 0; padding: 0.7rem 0.85rem;
}
textarea.q121__input { resize: vertical; line-height: 1.5; }
.q121__input:focus { outline: 2px solid var(--c-purple); outline-offset: 1px; }
.q121__input.is-invalid { border-color: #B3261E; background: #FDF6F5; }
.q121__input.is-invalid:focus { outline-color: #B3261E; }

/* choices — real inputs, styled as bordered rows. Used by the static topic
   checkboxes and by the main-event radios the script builds. */
.q121__choicelist { display: grid; gap: 0.55rem; }
.q121__choicelist br { display: none; }
.q121__choicelist label {
  display: flex; gap: 0.75rem; align-items: flex-start;
  border: 2px solid var(--c-ink); background: var(--c-cream);
  padding: 0.8rem 0.95rem; cursor: pointer;
  font-size: var(--t-body); line-height: 1.35;
  transition: background 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease;
}
.q121__choicelist label:hover { background: var(--c-haze); }
.q121__choicelist label:has(input:checked) { border-color: var(--c-purple); background: var(--c-haze); box-shadow: 0.35rem 0.35rem 0 var(--c-lavender); }
.q121__choicelist input {
  appearance: none; -webkit-appearance: none;
  flex: none; width: 1.35rem; height: 1.35rem; margin: 0.05rem 0 0;
  border: 2px solid var(--c-ink); background: var(--c-cream);
  position: relative; cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease;
}
.q121__choicelist input[type="checkbox"] { border-radius: 0.2rem; transform: rotate(-4deg); }
.q121__choicelist input[type="radio"] { border-radius: 50%; }
.q121__choicelist input:checked { background: var(--c-purple); border-color: var(--c-purple); }
.q121__choicelist input[type="checkbox"]:checked::after {
  content: ""; position: absolute; left: 0.38rem; top: 0.08rem;
  width: 0.3rem; height: 0.6rem; border: solid var(--c-cream); border-width: 0 2.5px 2.5px 0;
  transform: rotate(45deg);
}
.q121__choicelist input[type="radio"]:checked::after { content: ""; position: absolute; inset: 0.28rem; border-radius: 50%; background: var(--c-cream); }
.q121__choicelist input:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 2px; }

/* sign-off + actions */
.q121__signoff { margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid rgba(20, 15, 40, 0.12); }
.q121__signoff p { color: var(--c-ink-mid); font-size: var(--t-body); line-height: 1.6; max-width: 54ch; margin: 0 0 var(--s-2); }
.q121__savestatus { font-family: var(--f-body); font-size: var(--t-small); color: var(--c-ink-mid); margin: var(--s-2) 0 0; min-height: 1.2em; }
.q121__savestatus:empty { margin-top: 0; }
.q121__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin-top: var(--s-3); }
.q121__back {
  font-family: var(--f-body); font-weight: 700; font-size: var(--t-body);
  background: none; border: 0; padding: 0.4rem 0; color: var(--c-ink-mid);
  text-decoration: underline; text-underline-offset: 0.2em; cursor: pointer;
}
.q121__back:hover { color: var(--c-purple); }
.q121__back:focus-visible { outline: 2px solid var(--c-purple); outline-offset: 3px; }
.q121 .btn-stamp:disabled { opacity: 0.55; pointer-events: none; }

/* resume-link dialog reuses .nl-modal; the input just needs room to breathe */
#save-dialog .q121__field { margin-bottom: var(--s-2); }
#save-dialog .q121__input { font-size: var(--t-small); }

/* ============================================================
   END-OF-POST SUBSCRIBE
   Reuses partials/newsletter-signup.hbs. The shared .news__* styles are
   built cream-on-purple for the homepage section, so this block keeps
   them as-is by sitting on purple too.
   ============================================================ */

/* --- end of post (purple block, form styles used as-is) --- */
.post-subscribe {
  margin-top: var(--s-4);
  background: var(--c-purple);
  color: var(--c-cream);
  border: 2px solid var(--c-ink);
  box-shadow: 0.6rem 0.6rem 0 var(--c-ink);
  padding: clamp(1.75rem, 5vw, 2.75rem);
}
.post-subscribe__title {
  font-family: var(--f-display);
  font-feature-settings: "liga" 1, "dlig" 1, "calt" 1;
  font-size: clamp(1.8rem, 4vw, 2.6rem);
  line-height: 0.98;
  margin: 0 0 var(--s-2);
  color: var(--c-cream);
}
/* "SEE" crossed out with the shared hand-drawn .mark--strike (see the red-pen
   block above). Only two things need overriding for this context: */
.post-subscribe__swap { white-space: nowrap; }
/* inline-block, not plain inline: an abspos child of an *inline* positioned
   ancestor resolves percentage width against an odd basis (~65px here, not the
   81px word), so calc(100% + Xem) silently came out short. inline-block gives
   the mark a containing block that matches the word. */
.post-subscribe__title s { text-decoration: none; position: relative; display: inline-block; }
/* 1. the pen is ink, not the red-pen's purple — purple on purple would vanish,
      and ink ties the mark to this block's border and drop shadow.
   2. heavier stroke: 2.6px is judged against ~18px list text, and would read as
      a hairline against 42px display type. */
.post-subscribe .mark path { stroke: var(--c-ink); stroke-width: 6; }
/* The shared .mark--strike box is 0.6em tall, judged against ~18px list text.
   Against 42px display type the same 12-unit path stretches about twice as far
   vertically and the pen wobble turns into a squiggle, so the box is flattened
   to restore the original amplitude. `top` is deliberately NOT overridden: the
   shared 34% is already dead-centre on the glyph ink once the height is right
   (measured ink centre wants 34.4%).
   The strike runs a little past the word on both sides so it reads as a pen
   overshoot rather than a fitted underline. There is only 10.3px between "SEE"
   and "READ?", so the right-hand overshoot is capped to keep them clear. */
.post-subscribe .mark--strike {
  height: 0.28em;
  /* Poffy's cap ink centres at 38% of this box (measured, not guessed — the
     glyphs sit high, so the box centre is well below the visual centre). Back
     off half the mark's own height to sit the stroke on that line. */
  top: calc(38% - 0.14em);
  left: -0.2em;
  width: calc(100% + 0.38em);
  /* the global `img, svg { max-width: 100% }` reset (top of this file) clamps
     that calc straight back to 100% and silently kills the overshoot */
  max-width: none;
}
.post-subscribe__blurb {
  font-family: var(--f-body);
  font-size: var(--t-body);
  line-height: 1.55;
  color: #FFFFFF;
  margin: 0 0 var(--s-3);
  max-width: 44ch;
}
.post-subscribe__fine {
  font-family: var(--f-body);
  font-size: var(--t-small);
  font-style: italic;
  color: #FFFFFF;
  margin: var(--s-2) 0 0;
}
