/* ==========================================================================
   theme.css — homepage-derived theme overlay for the inner pages
   Loads AFTER site.css and restyles the inner pages to match the homepage:
   Coastal Calm V2 tokens, light airy header with the consultation button,
   generous section rhythm with full-bleed sand bands, homepage quote and
   button treatments, and the universal 9px corner radius.
   Provisional working styling (Q12/Q13 open). Hand-maintained.
   ========================================================================== */

:root {
  --t-blue: #294A52;
  --t-seaglass-dark: #4F7C78;
  --t-seaglass-text: #3B625E;   /* AA-safe Sea Glass for normal-size text (eyebrows/labels/small links): >=4.5:1 on tint/sand/cream. Buttons/borders/focus/icons/glyphs stay --t-seaglass-dark. */
  --t-seaglass-tint: #D3E6E3;
  --t-sand: #E8DED0;
  --t-cream: #FBF8F3;
  --t-terracotta: #B66F52;
  --t-terracotta-dark: #9C5A2B;  /* documented warm text derivative: 5.07 cream, 4.04 sand, 4.14 tint */
  --t-charcoal: #303738;
  --t-radius: 9px;

  /* Palette conformance (2026-08-30): the base sheet's card-shadow tokens were mixed
     from #22333A, which is not a Coastal Calm V2 board color. Re-declared here (theme.css
     loads after site.css, so these win) as Deep Coastal Blue at the same alphas — visually
     equivalent, and now an alpha variant of an approved color. The fingerprinted base
     sheet is never edited. */
  /* Card depth parity (Matt, 2026-09-01), Home's pair: one tight contact shadow, one wide soft
     ambient one, Deep Coastal Blue throughout (Comeau / Vercel: layered, one light source,
     tinted to the ink). The trailing transparent INSET layer gives every rest list the same
     shape as the pathway hover list, so the rust ring spreads in over the base sheet's 200ms
     shadow transition instead of snapping (lists with mismatched inset-ness fall back to a
     discrete change). --shadow-medium is the hover lift in the same shape. */
  --shadow-low: 0 1px 2px rgba(41, 74, 82, 0.05), 0 14px 32px -14px rgba(41, 74, 82, 0.18), inset 0 0 0 0 rgba(182, 111, 82, 0);
  --shadow-medium: 0 4px 14px rgba(41, 74, 82, 0.12), 0 14px 32px -14px rgba(41, 74, 82, 0.18), inset 0 0 0 0 rgba(182, 111, 82, 0);
  /* Quiet hover (Matt, 2026-09-01): links, dropdown items, the header button and card titles
     ease over 160ms on the standard curve; the base sheet's reduced-motion rule zeroes it. */
  --t-hover-duration: 240ms; /* softened from 160 (Matt, 2026-09-01 evening: gradual, not snapped) */
  /* Motion layer tokens (Matt, 2026-09-01), Home's values: NN/g's scroll-fade range is
     100-400ms and Material's medium band 250-400ms; the rise sits in the 8-16px band. */
  --t-motion-ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --t-reveal-duration: 650ms; /* softened from 400 (2026-09-01 evening) */
  --t-reveal-distance: 8px;   /* softened from 14: the fade carries the effect, not the movement */

  /* Link interaction states (2026-08-30, Matt): the base sheet mixed #17323a / #102830,
     hand-darkened near-blacks that are not board colors. Re-declared as the board's
     Sea Glass interactive role — links shift Deep Blue -> Sea Glass on hover (AA 6.41:1
     on cream) and return to Deep Blue on press. --action-primary is already on-palette. */
  --action-hover: #3B625E;
  --action-active: #294A52;

  /* Home chrome parity (Matt, 2026-08-30): the interior container was 66rem with a
     responsive gutter capping at 2rem (content 992px at 1440) while Home runs a fixed
     1200px container with 1.5rem padding (content 1152px) — visibly narrower interior
     margins. Both tokens pinned to Home's values, so header, breadcrumb, sections, card
     grids, CTA band (and its container-anchored rings), and footer all share Home's
     exact 144px side margins at 1440. Home's .final-cta__rings layer moved 62rem → 72rem
     in the same pass to track the new content width. Prose stays capped at the 68ch
     reading measure inside the wider column, as on Home. */
  --container-standard: 75rem;
  --gutter: 1.5rem;
}

/* --- Base ------------------------------------------------------------------ */
/* The decorative ring pseudos (hero crescents, CTA arcs) deliberately hang past the
   content edge; at mid viewports (~1024) they extended the scrollable area (57px of
   horizontal scroll, pre-existing — found in the 2026-08-30 chrome-parity pass, and
   present on Home too). Clip ink overflow instead of letting it scroll; `hidden` first
   as the fallback for engines without `clip`. Declared on BOTH html and body: in the
   verifying Chromium, root-level clip alone left the viewport programmatically
   scrollable (scrollX reached 72 at a 1024 viewport) while the body-level guard pinned
   scrollX to 0 — the propagation quirk is the reason for the pair. */
html, body { overflow-x: hidden; overflow-x: clip; }
/* Home renders with antialiased smoothing (its body sets it); without this the interior
   pages fall to macOS subpixel AA and the same DM Sans 500 reads visibly heavier — the
   header-font mismatch Matt flagged 2026-08-30. */
body { -webkit-font-smoothing: antialiased; }
/* No synthetic styles (identity rule): missing weights/styles fall back to the
   nearest real file instead of being faked by the browser. */
html { font-synthesis: none; }
/* Emphasis without faux italics: DM Sans has no italic file, so <em> renders as
   factual emphasis (Semibold), per the identity's emphasis rules. */
em { font-style: normal; font-weight: 600; }
body {
  background: var(--t-cream);
  color: var(--t-charcoal);
  font-size: 18px;
  line-height: 1.62;
}
/* Body copy is 18px site-wide (Matt, 2026-08-30 — P2 pass). The base sheet sizes running
   text directly on the elements (`p, li, dd, dt { font-size: var(--type-body) }`,
   site.css:218-223), so the body declaration above never reached it — interiors silently
   rendered 16px against Home's 18 for the life of the overlay (the build's widest
   specificity trap, audit finding 6). The correction lands on the same elements at equal
   (0,0,1) specificity, later in the cascade. Small-role sizes (footer links, breadcrumbs,
   card bodies, fact lists) are pinned at item level below so they no longer ride the
   element default. */
p, li, dd, dt { font-size: 1.125rem; }

/* Client-reference downloads and credentials (Matt, 2026-09-15). */
.form-download { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem 1rem; }
.form-download .button { white-space: normal; text-align: center; }
.form-download__detail { font-size: 0.875rem; color: var(--t-seaglass-text); }
.group-guidelines > li + li { margin-top: 1rem; }
.group-agreement { margin-top: clamp(2.5rem, 5vw, 4rem); }
.group-agreement > * + * { margin-top: var(--space-sm); }
.group-agreement > p,
.group-agreement > ul { max-width: var(--measure-default); }
.credential-feature {
  display: grid;
  grid-template-columns: 8.5rem minmax(0, 1fr);
  align-items: center;
  gap: 1.5rem;
  max-width: 46rem;
  margin-top: 2rem;
}
.credential-feature > img { width: 100%; height: auto; }
#about-why-personal .credential-feature { align-items: start; }
@media (min-width: 561px) {
  /* Offset the seal's transparent inset to align its visible top with the heading. */
  #about-why-personal .credential-feature > img { margin-top: -0.625rem; }
}
.credential-feature__title { margin: 0 0 0.5rem; }
.credential-feature p { margin: 0.5rem 0 0; font-size: 1rem; }
.credential-feature .credential-feature__date { color: var(--t-seaglass-text); font-size: 0.875rem; }
.psychology-today-badge { display: inline-block; max-width: 100%; }
.psychology-today-badge img { display: block; width: 186px; max-width: 100%; height: auto; }
/* About "Professional profiles" (2026-09-16): a light text-link list of Ashley's directory
   profiles — two unobtrusive columns on desktop, one on phones. Links keep the base sheet's
   standard content-link treatment so the group stays lighter than the consultation CTA. */
.profile-links { list-style: none; margin: 1.1rem 0 0; padding: 0; columns: 2; column-gap: 2.5rem; }
.profile-links li { margin: 0; padding: 0.28rem 0; break-inside: avoid; }
.profile-links li + li { margin-top: 0; }
.profile-links .psychology-today-badge { display: block; width: fit-content; margin-top: 0.75rem; }
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */ .profile-links { columns: 1; } }
/* On-demand certificate viewer: native modal focus, fit view and scrollable zoom. */
html.certificate-open,
html.certificate-open body { overflow: hidden; }
.certificate-viewer {
  width: min(72rem, calc(100% - 2rem));
  max-width: none;
  max-height: 94vh;
  max-height: 94dvh;
  margin: auto;
  padding: 0;
  border: 1px solid var(--t-seaglass-dark);
  border-radius: 0.75rem;
  color: var(--t-blue);
  background: var(--t-cream);
  box-shadow: 0 1rem 4rem rgb(0 0 0 / 25%);
}
.certificate-viewer::backdrop { background: rgb(24 43 48 / 78%); }
.certificate-viewer[open] { display: flex; flex-direction: column; }
.certificate-viewer [hidden] { display: none; }
.certificate-viewer__header { display: flex; align-items: center; gap: 1rem; padding: 1rem 1rem 0; }
.certificate-viewer__title { flex: 1; font-family: "Newsreader", Georgia, serif; font-size: clamp(1.25rem, 3vw, 1.75rem); line-height: 1.2; margin: 0; }
.certificate-viewer__toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 1rem; padding: 0.75rem 1rem; }
.certificate-viewer button,
.certificate-viewer__download { min-height: 44px; font: inherit; font-size: 0.9375rem; }
.certificate-viewer button { padding: 0.5rem 0.875rem; border: 1px solid var(--t-seaglass-text); border-radius: 0.4rem; color: var(--t-blue); background: var(--t-cream); cursor: pointer; }
.certificate-viewer button:hover { background: var(--t-seaglass-pale, #D3E6E3); }
.certificate-viewer__download { display: inline-flex; align-items: center; color: var(--t-blue); text-underline-offset: 0.2em; }
.certificate-viewer__viewport { min-height: 0; overflow: auto; overscroll-behavior: contain; background: #f5f6f8; }
.certificate-viewer__image { display: block; width: auto; height: auto; max-width: 100%; max-height: calc(94vh - 11rem); max-height: calc(94dvh - 11rem); margin: auto; }
.certificate-viewer.is-zoomed .certificate-viewer__image { width: 1600px; max-width: none; max-height: none; margin: 0; }
.certificate-viewer__error { margin: 0; padding: 1rem; }
@media (max-width: 560px) {
  .credential-feature { grid-template-columns: minmax(0, 1fr); gap: 1rem; }
  .credential-feature > img { width: 7rem; }
}

/* --- Header: light and airy, matching the homepage ------------------------- */
.site-header {
  background: var(--t-cream);
  border-bottom: 1px solid rgba(41, 74, 82, 0.12);
  box-shadow: none;
}
/* Centred header composition (Matt, 2026-08-30, site-wide): the brand block sits
   centred — "LCSW, PMH-C" centred beneath the name — with the menu row beneath it
   spanning the full content column, first item on the left margin and the CTA on the
   right. The base sheet's `.site-header__brand { margin-inline-end: auto }` (a row-
   layout device) is neutralised for the column layout. */
.site-header__inner {
  padding-top: 1.1rem;
  padding-bottom: 1.1rem;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.9rem;
}
.site-header__brand { margin-inline-end: 0; text-align: center; }
.site-nav { width: 100%; }
/* Sticky desktop header (Matt, 2026-08-30; round 19 unified with the centred/condense
   pass). Desktop-only per the round-19 rationale: at mobile the open disclosure menu
   lives inside the header, and a stuck header taller than the viewport would trap the
   menu's bottom rows. Gated on data-nav="enhanced" so a no-JS visitor never gets a
   full-height permanently-stuck bar (the condense toggle is JS too). Works with the
   round-17 overflow guard because `clip` (unlike `hidden`) creates no scroll container
   — verified by measurement. z-index 80: above content and the CTA/hero ring pseudos,
   below the skip link (100). scroll-padding 7.5rem (120px default; rem so it tracks
   the rem-sized bar at enlarged user fonts, 2026-09-08) clears the CONDENSED bar
   (~108px): interior anchor jumps land past the 12rem condense threshold, so the
   condensed height is the one that matters (the old 176px was sized for the full bar
   and would sum with any target-side scroll-margin — keep exactly one mechanism,
   this one). */
/* ≥66rem: below 1056px the one-line nav row (~946px + gutters) cannot fit, so the
   disclosure menu takes over (Matt, 2026-08-30 — "at ~1024 go into mobile view so the
   menu does not wrap"); sticky and condense belong to the desktop nav only. */
@media (min-width: 66rem) {
  .site-header[data-nav="enhanced"] { position: sticky; top: 0; z-index: 80; }
  html { scroll-padding-top: 7.5rem; }
}
/* Practice kicker above the name (Q12, 2026-09-06): "Healing Home Counseling" set in the
   credential font (Montserrat), so Ashley's name stays the prominent serif line. */
/* The kicker aligns to interior letters (Matt, 2026-09-06): H under the h in "asHley",
   G under the g in "morGan" — 78.1% of the name width, centered; font ~0.43x the name so the
   caps fit that span on one line, justify snaps the edges to the h and the g. */
.brand-specimen__practice {
  font-family: "Montserrat", Arial, sans-serif;
  font-weight: 600;
  font-size: clamp(0.65rem, 0.57rem + 0.85vw, calc(0.57rem + 7.6px));
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--t-blue);
  display: block;
  width: 78.1%;
  align-self: center;
  margin-bottom: 0.45rem;
  text-align: justify;
  text-align-last: justify;
}
.brand-specimen__name {
  font-family: "Vidaloka", Georgia, serif;
  font-size: clamp(1.55rem, 1.35rem + 2vw, calc(1.35rem + 18px));
  line-height: 1.1;
  font-weight: 400;
  color: var(--t-blue);
  letter-spacing: 0.01em;
  text-transform: none;
}
.brand-specimen__credential {
  font-family: "Montserrat", Arial, sans-serif;
  font-weight: 500;
  font-size: clamp(0.8rem, 0.74rem + 0.35vw, 0.92rem); /* enlarged from 0.75rem but kept below the kicker */
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--t-blue);
  display: block;
  margin-top: 0.3rem;
}
/* Kill the first-item stagger: center every item vertically in the row.
   Link padding matches Home (2026-08-30): NO horizontal padding, so hover/current
   underlines span the text, not a padded box. The row spans the full content column
   with space-between (Matt's centred-header composition); the gap is the wrap floor. */
.site-nav__list { align-items: center; gap: 1rem; width: 100%; justify-content: space-between; }
.site-nav__list > .site-nav__item { display: flex; align-items: center; margin: 0; padding: 0; height: auto; }
.site-nav__link {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem; /* §2.1 binding nav band + §2.4's 16px functional floor */
  font-weight: 500;
  color: var(--t-blue);
  text-transform: none;
  letter-spacing: normal;
  padding: 0.35rem 0; /* Home's link box (header parity, 2026-08-30); mobile re-pads later in the cascade */
  border-bottom: 2px solid transparent;
  text-decoration: none;
}
.site-nav__link:hover,
.site-nav__link:focus-visible { color: var(--t-blue); border-bottom-color: var(--t-seaglass-dark); background: transparent; }
.site-nav__link.is-current { color: var(--t-blue); border-bottom-color: var(--t-seaglass-dark); }
/* Current SECTION: a top-level parent (Therapy/Books/Resources) whose child page is showing.
   Same underline as the current page — both mark "where you are"; the exact page is also
   marked inside the open dropdown. */
.site-nav__link.is-current-section { color: var(--t-blue); border-bottom-color: var(--t-seaglass-dark); }
/* Current page inside a dropdown (visible when the menu opens, and in the flattened mobile menu) */
.site-nav__subnav a.is-current { background: var(--t-seaglass-tint); color: var(--t-blue); font-weight: 600; }
.site-nav__toggle {
  color: var(--t-blue);
  background: transparent;
  border: 1px solid rgba(41, 74, 82, 0.25);
  border-radius: var(--t-radius);
}
/* The consultation button added to the inner navs */
.site-nav__cta {
  display: inline-block;
  background: var(--t-seaglass-dark);
  color: #ffffff;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem; /* §2.1 button band */
  font-weight: 600;
  text-decoration: none;
  padding: 0.65rem 1.2rem;
  border-radius: var(--t-radius);
  transition: background-color var(--t-hover-duration) var(--motion-easing-standard); /* quiet hover 2026-09-01 */
}
.site-nav__cta:hover,
.site-nav__cta:focus-visible { background: var(--t-blue); color: #ffffff; }

/* --- Dropdown menus (Therapy, Books): hover + keyboard focus ------------------- */
.site-nav__item--has-sub { position: relative; }
.site-nav__item--has-sub > .site-nav__link::after { content: " \25BE"; font-size: 0.86em; opacity: 0.7; } /* indicator raised twice by Matt (2026-08-30): 0.65em -> 0.78em (+2px) -> 0.86em (+3px more; 15.48px at the 18px desktop link) */
.site-nav__subnav {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 60;
  min-width: 17rem;
  background: #ffffff;
  border: 1px solid rgba(41, 74, 82, 0.14);
  border-radius: var(--t-radius);
  box-shadow: 0 2px 6px rgba(41, 74, 82, 0.06), 0 18px 40px -12px rgba(41, 74, 82, 0.22); /* layered tinted pair (2026-09-01), matching Home */
  padding: 0.5rem;
  margin: 0;
  list-style: none;
  display: none;
}
.site-nav__subnav::before { content: ""; position: absolute; top: -0.55rem; left: 0; right: 0; height: 0.6rem; }
/* .is-dismissed (theme.js, 2026-10-20 audit U4): Escape hides the open dropdown while the pointer or
   focus stays put; the class clears on a fresh entry. The phone menu's static rule below still shows it. */
.site-nav__item--has-sub:not(.is-dismissed):hover > .site-nav__subnav,
.site-nav__item--has-sub:not(.is-dismissed):focus-within > .site-nav__subnav { display: block; }
.site-nav__subnav li { display: block; margin: 0; }
.site-nav__subnav a {
  display: block;
  padding: 0.5rem 0.7rem;
  border: 0;
  border-radius: 6px;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem; /* §2.1 nav band */
  font-weight: 500;
  color: var(--t-blue);
  text-decoration: none;
  transition: background-color var(--t-hover-duration) var(--motion-easing-standard); /* quiet hover 2026-09-01 */
}
.site-nav__subnav a:hover,
.site-nav__subnav a:focus-visible { background: var(--t-seaglass-tint); color: var(--t-blue); }
/* Desktop menu type +2px (Matt, 2026-08-30): links, dropdown items, and the header
   button run 18px in the desktop bar; the disclosure band keeps the 1rem nav band.
   MUST sit after every `font-size: 1rem` nav declaration above — the first placement
   (inside the earlier sticky block) silently lost the cascade at equal specificity. */
@media (min-width: 66rem) {
  .site-nav__link,
  .site-nav__subnav a,
  .site-nav__cta { font-size: 1.125rem; }
}
@media (max-width: 65.999rem) {
  /* Raised from 47.999rem (Matt, 2026-08-30): the whole band below the 66rem nav-fit
     line uses the disclosure menu. The base sheet's toggle/list display rules stop at
     47.999rem and its ≥48rem block forces a row list, so the 48–66 band restates the
     disclosure display and the column geometry here. */
  .site-header[data-nav="enhanced"] .site-nav__toggle { display: inline-flex; }
  .site-header[data-nav="enhanced"] .site-nav__list { display: none; }
  .site-header[data-nav="enhanced"] .site-nav__list.is-open { display: flex; }
  .site-nav, .site-nav__list { width: 100%; }
  .site-nav__list { flex-direction: column; flex-wrap: nowrap; }
  /* Inside the mobile Menu overlay: flatten the dropdowns, always visible */
  .site-nav__subnav { position: static; display: block; border: 0; box-shadow: none; background: transparent; padding: 0 0 0 1rem; min-width: 0; }
  .site-nav__subnav::before { display: none; }
  .site-nav__item--has-sub > .site-nav__link::after { content: ""; }
  /* Mobile menu legibility redesign (Matt, 2026-08-30). Root cause of the old jumble:
     the two desktop rules above (`.site-nav__list { align-items: center }` and
     `> .site-nav__item { display: flex }`, written to kill the desktop row's first-item
     stagger) leaked into the flex-COLUMN mobile list — childless items floated centred
     at ragged x positions, and each dropdown parent sat in a flex ROW beside its own
     flattened children, vertically centred against them. Re-scope both, then give the
     column real structure: full-width left-aligned rows, weight-differentiated levels,
     hairlines between groups, a guide rail on children, and the CTA as a block button. */
  .site-nav__list { align-items: stretch; gap: 0; }
  .site-nav__list.is-open { margin-top: 0.85rem; border-top: 1px solid rgba(41, 74, 82, 0.14); padding-top: 0.35rem; }
  .site-nav__list > .site-nav__item { display: block; border-bottom: 1px solid rgba(41, 74, 82, 0.09); }
  .site-nav__list > .site-nav__item:last-child { border-bottom: 0; }
  .site-nav__link { display: block; width: 100%; padding: 0.75rem 0.25rem; font-weight: 600; border-bottom: 0; }
  /* "You are here" at mobile: the tint chip the dropdowns already use, not the desktop
     underline (a full-width border here reads as another separator, not a marker) */
  .site-nav__link.is-current,
  .site-nav__link.is-current-section { background: var(--t-seaglass-tint); border-radius: 6px; text-decoration: none; }
  .site-nav__subnav { margin: -0.15rem 0 0.6rem 0.35rem; padding: 0 0 0 0.85rem; border-left: 2px solid rgba(79, 124, 120, 0.45); } /* --t-seaglass-dark rail at 45% */
  .site-nav__subnav a { padding: 0.55rem 0.6rem; }
  .site-nav__cta { display: block; text-align: center; margin: 0.9rem 0 0.75rem; padding: 0.75rem 1.2rem; } /* bottom 0.35rem -> 0.75rem (~12px) for separation, Matt 2026-09-07 */
}

/* --- Sticky condensed state (theme.js toggles .is-condensed on scroll with rem-scaled
   hysteresis: condense past 12rem, expand back above 1rem — the 11rem dead band stays
   ≈1.9× the ~93px-at-default condensed height change at every user font size, so
   scroll anchoring can't flicker-loop the toggle; 2026-09-08) --------
   Matt, 2026-08-30: when scrolled, the centred two-line brand collapses to the
   one-line lockup "Ashley Hanna-Morgan, LCSW, PMH-C" (the comma comes from the name's
   ::after, the credential keeps its Montserrat caps) and spacing tightens so the pinned
   header takes as little page real estate as possible. Desktop-scoped like the sticky
   rule itself — at mobile the header is not sticky and keeps its full form. */
@media (min-width: 66rem) {
  .site-header.is-condensed { box-shadow: 0 2px 14px rgba(41, 74, 82, 0.10); }
  .site-header.is-condensed .site-header__inner { padding-top: 0.55rem; padding-bottom: 0.55rem; gap: 0.45rem; }
  /* Scrolled: drop the practice kicker, show just "Ashley Hanna-Morgan, LCSW, PMH-C". */
  .site-header.is-condensed .brand-specimen__practice { display: none; }
  .site-header.is-condensed .brand-specimen__name { font-size: 1.35rem; }
  .site-header.is-condensed .brand-specimen__name::after { content: ", "; }
  .site-header.is-condensed .brand-specimen__credential { font-size: 0.8rem; }
  /* The base sheet's .brand-specimen is inline-flex COLUMN, which blockifies the two
     spans — `display: inline` on the credential computes back to block and cannot join
     the line. Flip the wrapper itself to a baseline row instead. */
  .site-header.is-condensed .brand-specimen { flex-direction: row; align-items: baseline; gap: 0.35rem; }
}
@media (prefers-reduced-motion: no-preference) {
  .site-header__inner { transition: padding 0.18s ease, gap 0.18s ease; }
  .brand-specimen__name { transition: font-size 0.18s ease; }
}

/* --- At-a-glance trust chips (hero) -------------------------------------------- */
.chips { list-style: none; display: flex; flex-wrap: wrap; align-items: stretch; gap: 0.6rem; margin: 1.5rem 0 0; padding: 0; }
.chips li {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.82rem;
  font-weight: 600;
  color: var(--t-blue);
  background: rgba(255, 255, 255, 0.55);
  border: 1px solid rgba(41, 74, 82, 0.14);
  border-radius: var(--t-radius);
  padding: 0.45rem 0.8rem;
  /* Equal-height chips. The base sheet puts a 4px top margin on list items after the
     first; inside this stretch-aligned flex row that made every chip EXCEPT the first
     stretch to 4px less than the line height, so they shared a bottom edge while the
     credential chip started 4px higher and read as taller/thicker. (Same first-item
     flex quirk already fixed in the nav, breadcrumbs, and the footer Elsewhere row.)
     Zeroing the margin makes every chip the same height; the inline-flex box with an
     explicit line-height keeps the label optically centred in it. */
  margin: 0;
  display: inline-flex;
  align-items: center;
  line-height: 1.25;
}
/* Forces a flex line break so the chips read 2 + 2 rather than wrapping 3 + 1.
   Presentational only: it carries no text and is removed from the list semantics. */
.chips .chips__break {
  flex-basis: 100%;
  height: 0;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
}
@media (max-width: 560px) {
  /* Too narrow for two per row: let the chips wrap naturally instead. */
  .chips .chips__break { display: none; }
}

/* --- Pathway icons (shared with the homepage set) -------------------------------- */
/* Terracotta pathway icons — see the note on the homepage rule. Non-text decoration on
   the cream card surface (3.68 against the 3:1 floor); cards stay cream on sand bands. */
.path-icon { width: 26px; height: 26px; stroke: var(--t-terracotta); fill: none; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; display: block; margin-bottom: 0.65rem; }

/* --- Books hub: small cover thumbnails --------------------------------------------- */
.book-thumb {
  float: right;
  width: min(30%, 9.75rem);
  border: 1px solid transparent; /* object shadow instead of the hairline (2026-09-01): the same Deep-Blue pair the cards carry */
  box-shadow: var(--shadow-low);
  margin: 0.5rem 0 1rem 1.5rem; /* small top offset drops the cover to the heading's cap line (Matt, 2026-09-04) */
}
.book-thumb img { display: block; width: 100%; height: auto; } /* the cover's native ~2:3 ratio sets the height; square corners, full cover shown (Matt, 2026-09-04) */

/* Books hub: intro paragraph and the three covers side by side, half and half (Matt,
   2026-09-04). The trio is the three de-bordered covers in a row — no baked frame or gaps.
   Top-aligned; stacks on narrow screens. */
#books-intro .section__inner {
  display: grid;
  grid-template-columns: 1fr 1.2fr; /* trio ~9% larger than an even split (Matt, 2026-09-04) */
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
#books-intro .section__inner > * { margin: 0; } /* grid gap owns the spacing; drop the base owl margins */
.books-trio { display: flex; gap: 0.6rem; align-items: flex-start; padding-top: 0.4rem; } /* drop the cover tops to the paragraph's first-line top — even tops (Matt, 2026-09-04) */
.books-trio picture { flex: 1 1 0; min-width: 0; display: block; }
.books-trio img { display: block; width: 100%; height: auto; box-shadow: var(--shadow-low); } /* square corners, full cover shown (Matt, 2026-09-04) */
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */
  #books-intro .section__inner { grid-template-columns: minmax(0, 1fr); gap: var(--space-lg); } /* stack: paragraph then trio */
  .books-trio { padding-top: 0; } /* no top nudge once stacked */
}
/* Ground-aware thumb fill (2026-08-30): this rule keyed on nth-of-type parity until the
   banding rollout made the ground a class decision — parity no longer predicts sand. Sand
   thumbs (default, above) read on cream --plain sections; a --band section gets the cream
   thumb so it reads on the sand band. */
.section--band .book-thumb { background: var(--t-cream); }
@media (max-width: 560px) { .book-thumb { float: none; width: 9.75rem; max-width: 100%; margin: 0 0 1.1rem; } } /* max-width (2026-10-20): 9.75rem is 312px at a 32px text size, wider than a 320px phone's column */

/* --- Books: retailer links (Matt, 2026-09-02) ---------------------------------------
   Detail pages carry the two standard buttons (Amazon primary, Barnes & Noble secondary)
   under the "Get the book" sentence; the hub carries a small quick-link stack beneath each
   cover thumb, riding the same float column (clear: right) so the prose keeps wrapping
   around one object. The URLs are plain, non-affiliate retailer pages (Ashley confirmed
   the legacy links were not affiliate links; no disclosure is owed). Neutral bag line
   icons in the .path-icon language rather than retailer logos, whose trademark guidelines
   restrict use to approved partners. Opens in a new tab like the Resources directory.
   Bookshop.org joins as the third link (Ashley, 2026-10-06), after Amazon and Barnes &
   Noble, which she keeps first for reviews. All three are the links from PSI's own
   Bookshop.org lists, carrying PSI's affiliate ID (aid=112212), so sales benefit Postpartum
   Support International: they are rel="sponsored" and a visible line says so
   (aria-describedby on the hub link). */
.retailer-links { list-style: none; margin: 1.35rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.75rem; }
.retailer-links li { margin: 0; max-width: 100%; } /* max-width (2026-10-20): the playlist buttons ran past a phone screen at 200% text */
.retailer-links__note { margin: 0.85rem 0 0; font-size: 0.875rem; line-height: 1.5; color: var(--t-blue); opacity: 0.85; } /* §2.1 caption band */
.book-thumb:has(+ .book-thumb__buy) { margin-bottom: 0.65rem; }
.section__inner:has(> .book-thumb) { display: flow-root; } /* contain the float column: the hub sections are short, and the thumb + quick links (284px at 1440) otherwise ran past the section into its neighbour (measured 2026-09-02: 5px on poetry, 44px on the curriculum) */
.section__inner:has(> .book-thumb) > .section__heading { margin-top: 0; } /* the thumb now precedes the heading in source order (covers reach the heading top, Matt 2026-09-04); drop the heading's sibling margin so it sits level with the floated cover */
.book-thumb__buy { float: right; clear: right; width: min(30%, 9.75rem); margin: 0 0 1rem 1.5rem; display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.875rem; line-height: 1.45; }
.book-thumb__buy-label { font-weight: 600; color: var(--t-blue); opacity: 0.85; }
.book-thumb__link { display: inline-flex; align-items: center; gap: 0.45rem; width: max-content; max-width: 100%; padding: 0.15rem 0; } /* 20px text → ~25px tap target (2.5.8) */
.book-thumb__link .path-icon { width: 1.1rem; height: 1.1rem; margin: 0; flex: none; stroke: var(--t-terracotta-dark); } /* 4.04:1 on sand, higher on cream */
.book-thumb__buy-note { margin-top: 0.15rem; color: var(--t-blue); opacity: 0.85; } /* the PSI line under the Bookshop.org link, in the label's caption treatment */
@media (max-width: 560px) {
  .book-thumb__buy { float: none; width: auto; margin: -0.4rem 0 1.1rem; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 0.35rem 1rem; }
  .book-thumb__buy-label, .book-thumb__buy-note { flex-basis: 100%; }
}

/* --- Related-support cross-links ---------------------------------------------------- */
.related-eyebrow {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  margin: 0 0 0.9rem;
}

/* --- Breadcrumb: quieter, and vertically aligned ----------------------------- */
.breadcrumb { font-size: 0.85rem; opacity: 0.85; }
.breadcrumb a { transition: color var(--t-hover-duration) var(--motion-easing-standard); } /* quiet hover 2026-09-01: the breadcrumb sits outside .page__body */
.breadcrumb__list { align-items: center; }
.breadcrumb__item { display: inline-flex; align-items: center; margin: 0; padding: 0; font-size: 0.85rem; /* the container's 0.85rem never reached the li (finding 6) */ }

/* --- Page hero: full-bleed tinted split band with image placeholder ---------- */
.page-hero {
  position: relative;
  background: var(--t-seaglass-tint);
  box-shadow: 0 0 0 100vmax var(--t-seaglass-tint);
  clip-path: inset(0 -100vmax);
  /* Same rhythm as every other band edge (2026-08-30): the hero is a colour band, so its
     content should sit the same 72px from its edge that a section's does. */
  padding-top: clamp(2.75rem, 6vw, 4.5rem);
  padding-bottom: clamp(2.75rem, 6vw, 4.5rem);
}
/* Short heroes (Matt, 2026-08-30): on pages without a chips row the band is shallow
   enough that the top-anchored outer ring's arc touched the bottom edge (measured 1px
   clearance on Support Groups). +15px of bottom padding on every chipless hero — the
   listed short-title pages, the legal stubs, and any future short page — restores the
   clearance; chips pages are untouched. */
.page-hero:not(:has(.chips)) {
  padding-bottom: calc(clamp(2.75rem, 6vw, 4.5rem) + 15px);
  margin: 0;
  display: grid;
  grid-template-columns: 1.6fr minmax(0, min(20rem, 320px)); /* see the reflow note below */
  gap: clamp(1.5rem, 4vw, 3rem);
  align-items: center;
}
.page-hero--plain { grid-template-columns: minmax(0, 1fr); }
/* Ring motif, opening bookend: same two-circle geometry as the closing CTA band,
   tone-inverted (seaglass-dark on tint) and mirrored to hang off the top right. */
.page-hero::after {
  content: "";
  display: block;
  position: absolute;
  right: -6rem;
  top: -14rem;
  width: 30rem;
  height: 30rem;
  background: transparent; /* the base sheet's accent-bar ::after sets a terracotta fill */
  margin-top: 0;
  border: 2px solid rgba(79, 124, 120, 0.20);
  border-radius: 50%;
  pointer-events: none;
}
.page-hero::before {
  content: "";
  position: absolute;
  right: -1rem;
  top: -9rem;
  width: 19rem;
  height: 19rem;
  border: 2px solid rgba(79, 124, 120, 0.14);
  border-radius: 50%;
  pointer-events: none;
}
.page-hero__text, .page-hero__media { position: relative; z-index: 1; }
/* Reflow (2026-10-20 audit U2). Stacked on phones the hero is one minmax(0, 1fr) track, so one
   long word ("Recommendations" at 320px, a title word at 200% text) can no longer widen it past the
   screen, where the root's overflow-x clip cut it off; a word that cannot fit a line on its own
   breaks instead (break-word, which leaves intrinsic sizes alone). Side by side, the title track
   keeps its automatic minimum, so its words stay whole, and the second track, empty on every page
   (no hero has .page-hero__media, and the (0,2,0) chipless rule also outranks .page-hero--plain),
   gives way first: it now starts at 0 and stops at its default 320px, so enlarged text cannot
   grow it into the title. The stacking breakpoint below is 48.75rem (780px at the default size),
   so a larger browser text setting stacks the hero sooner. At 16px nothing moves. */
.page-hero__text { overflow-wrap: break-word; }
/* A long title word that may break only when it cannot fit a line at all: an inline-block keeps it
   whole on its own line wherever it fits, and its soft hyphens apply only below that (Book
   Recommendations under about 378px: a hyphenated break such as "Recom-" / "mendations" instead of
   an orphaned "s"). Side by side it never breaks, so the title track's automatic minimum holds the
   whole word even when only the root font size is enlarged. */
.page-hero__word { display: inline-block; max-width: 100%; }
@media (min-width: 48.75rem) { .page-hero__word { white-space: nowrap; } }
/* (no rule under the hero title: the eyebrow above carries the structure) */
.page-hero__eyebrow {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  margin: 0 0 0.9rem;
}
.page-hero__title,
.error-page__title {
  font-family: "Vidaloka", Georgia, serif;
  font-weight: 400;
  color: var(--t-blue);
  /* §2.1 BINDING (Matt, 2026-08-30): interior H1 band 42-50 mobile / 56-72 desktop.
     One continuous clamp hits both anchors (42px at 375, 68px at 1440) with no media
     step — which also retires the P2 mobile-ramp block: Home's raised clamp is larger
     at every width, so the old inversion cannot recur. */
  font-size: clamp(2.625rem, 5vw, 4.25rem);
  line-height: 1.12;
  letter-spacing: -0.01em;
  text-wrap: balance;
  margin: 0;
}
/* Long-title variant: SIZE-ONLY since Matt's 2026-08-30 consistency ruling. The old
   "identity exception" also switched long H1s to Newsreader 500, and browsing sibling
   pages the family change read as inconsistency (his screenshot: the therapy children) —
   a long headline may size down and gain leading, but it stays Vidaloka like every H1. */
.page-hero__title.page-hero__title--long {
  /* Doubled class (0,2,0): the base sheet's `.has-longtitle-h1 .page-hero__title` is
     (0,2,0) and silently beat the old single-class form — the two long-title pages were
     rendering base-sheet sizes, not this rule (finding 38; the build's ninth specificity
     trap). Same-specificity, later in the cascade, so this now wins. */
  font-family: "Vidaloka", Georgia, serif; /* MUST stay declared: the base sheet's (0,2,0) long-title rule sets Newsreader 500 and wins for any property this rule omits */
  font-weight: 400;
  font-size: clamp(2.375rem, 4.4vw, 3.75rem); /* stays below the plain H1 at every width */
  line-height: 1.2;
  letter-spacing: -0.01em; /* match the plain H1 */
}
.page-hero__media {
  aspect-ratio: 4 / 3;
  background: rgba(255, 255, 255, 0.55);
  /* Placeholder frames (P1, 2026-08-30): the faint blue-alpha borders composited below
     1.3:1 wherever a tint-filled placeholder met tint or sand (1.03:1 on About's band).
     Solid Dark Sea Glass reads 3.6 on tint, 3.5 on sand, 4.4 on cream — the whole
     placeholder family (.page-hero__media, .section-media, .profile-card__media,
     .portrait-ph) uses it until real imagery lands. */
  border: 1px solid var(--t-seaglass-dark);
  border-radius: var(--t-radius);
  display: flex;
  align-items: flex-end;
  padding: 1rem;
}
.page-hero__media p { margin: 0; font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */ line-height: 1.5; color: var(--t-blue); opacity: 0.85; }
@media (max-width: 48.75rem) { /* 780px at the default text size; rem so enlarged text stacks the hero */
  .page-hero { grid-template-columns: minmax(0, 1fr); }
  /* Chipless heroes on phones (found 2026-09-02 while measuring the article pages): the
     short-hero rule above is (0,2,0) and carries the two-column grid, so the (0,1,0) stack
     rule on this line never won on chipless pages — About's title column measured 229px
     at 375, Support Groups' 96px. Same specificity here, later in the cascade, so every
     hero stacks on phones; desktop is untouched. */
  .page-hero:not(:has(.chips)) { grid-template-columns: minmax(0, 1fr); }
  .page-hero__media { max-width: 22rem; }
  /* Narrow screens: one corner crescent instead of the full ring sweep */
  .page-hero::after { display: none; }
  .page-hero::before { width: 13rem; height: 13rem; right: -5rem; top: -6rem; }
}

/* --- Section rhythm: airy, with full-bleed sand bands ------------------------ */
.page__body > .section {
  margin-top: 0;
  margin-bottom: 0;
}
/* No horizontal inset on any band, so every section's content sits on the same left/right
   edge as the hero, breadcrumb, and footer; horizontal breathing room comes from
   `.page.container`. The base sheet still carries
   `.page__body > .section:nth-of-type(2n) { padding: var(--space-lg) }` — a leftover from
   the earlier inset-CARD treatment, from before these sections became full-bleed bands.
   Its top/bottom were replaced above, but its 36px left/right survived and indented every
   alternating (sand) band while the cream ones sat flush.
   `:nth-of-type(n)` matches every section AND matches that rule's specificity (0,3,0),
   which a plain `.page__body > .section` (0,2,0) cannot — so this needs the pseudo-class
   to win, not just a later position in the cascade. */
.page__body > .section:nth-of-type(n) {
  /* THE canonical section geometry — all four sides, one rule (Matt, 2026-08-30).
     (0,3,0) via :nth-of-type(n), which matches every section while tying the base
     sheet's `:nth-of-type(2n) { padding: var(--space-lg) }`. A plain
     `.page__body > .section` is (0,2,0) and loses to it regardless of order, which is
     why the vertical rhythm silently never applied to even-numbered sections and the
     bands sat at 36px against their neighbours' 68px.
     Matt's call: keep the tighter feel and make it even, rather than loosening the
     bands — so every section now carries the tight value and every boundary is a
     uniform 72px. Anything that needs to deviate declares LATER at (0,3,0) or higher. */
  padding-top: clamp(2.75rem, 6vw, 4.5rem);
  padding-bottom: clamp(2.75rem, 6vw, 4.5rem);
  padding-left: 0;
  padding-right: 0;
  /* No corner radius on a full-bleed band. The same leftover inset-card rule that
     carried the 36px padding (§5ab) also sets `border-radius: var(--radius-lg)` (16px).
     A band is painted with `box-shadow: 0 0 0 100vmax`, which spreads outward from the
     element's ROUNDED rectangle — so each corner left a small curved notch of page
     background showing through. A radius has no meaning on an edge-to-edge element. */
  border-radius: 0;
}
/* With one even rhythm, the only thing left that can skew a boundary is a trailing
   margin on a section's last element — a closing .prose-quote carries 1.5rem, which
   turned a 72px boundary into 96px. Normalise it so the section's padding is the whole
   story. (0,2,0), beating the component's own (0,1,0) margin. */
.section__inner > :last-child { margin-bottom: 0; }
.page__body > .section + .section { margin-top: 0; }
/* Full-bleed band without 100vw scrollbar issues: paint outward with a huge
   box-shadow and clip it. Even sections get the warm sand band. */
.page__body > .section:nth-of-type(even) {
  background: var(--t-sand);
  box-shadow: 0 0 0 100vmax var(--t-sand);
  clip-path: inset(0 -100vmax);
}
/* --- Chapter banding (2026-08-30) ------------------------------------------
   The automatic nth-of-type alternation makes every section boundary a colour
   change, so a page with six sections gets six stripes whether or not it has six
   ideas. These two classes let a band mark a CHAPTER instead: --band paints sand,
   --plain opts out, and whitespace does the separating in between (the Bunny Hive
   principle). Same (0,3,0) specificity as the alternation rule and declared after
   it, so either wins; both sit above the :has(.cta) rule so the signature closing
   band always beats them. Piloted on About; not yet applied site-wide. */
.page__body > .section.section--plain {
  background: transparent;
  box-shadow: none;
  clip-path: none;
}
.page__body > .section.section--band {
  background: var(--t-sand);
  box-shadow: 0 0 0 100vmax var(--t-sand);
  clip-path: inset(0 -100vmax);
}

/* Consecutive sections on the SAME ground are separated by whitespace alone, so the
   full band padding on both sides of the boundary doubles into a gulf — up to 8.5rem
   of nothing between two headings that belong together. Halve each side, but only at
   same-ground boundaries: a boundary where the colour actually changes keeps its full
   padding, because there the band needs room to read as a band.
   (0,3,0) on both, matching the rules they override — see §5ab/§5ao on this overlay's
   specificity traps.) */

/* The section immediately before the closing CTA is always cream (Matt, 2026-08-30).
   Warm Sand against the Dark Sea Glass CTA puts two mid-tones together and muddies the
   band; cream gives the signature band a clean edge to land on.

   Expressed positionally, NOT as `:has(+ .section:has(.cta))` — **`:has()` cannot be
   nested inside `:has()`**, so that selector is invalid and is dropped silently (the
   first attempt was, and measured unchanged). The CTA is verified to be the last section
   on every page that has one, so the pre-CTA section is `:nth-last-of-type(2)`, and
   `.page__body:has(.cta)` scopes the whole thing to CTA-bearing pages so the book and
   placeholder pages are untouched. (0,4,0) — beats the alternation and an explicit
   --band, deliberately: this is a policy about one boundary, not a default. */
.page__body:has(.cta) > .section:nth-last-of-type(2) {
  background: transparent;
  box-shadow: none;
  clip-path: none;
}
/* Where that section WAS the sand band (even-numbered), its predecessor is cream, so the
   boundary between them no longer has a colour change and should not carry the doubled
   band padding. If the pre-CTA section is even then its predecessor is odd, which is why
   the second rule can be positional too. Matches the same-ground rhythm set on About. */
/* Two-tier rhythm (Matt, 2026-08-30). A colour edge TERMINATES the eye, so at a band
   boundary each side reads only its own padding — 36px, against the 72px of continuous
   cream between two same-ground sections. Matt: make the band edges match the sections.
   So the default padding above is the full 72px (what the eye should read on either side
   of an edge), and a boundary WITHOUT a colour change is halved, so its two paddings add
   back up to the same 72px. Result: every perceived gap on the page is 72px. */
.page__body > .section--plain + .section--plain { padding-top: clamp(1.375rem, 3vw, 2.25rem); }
.page__body > .section--plain:has(+ .section--plain) { padding-bottom: clamp(1.375rem, 3vw, 2.25rem); }
/* The positional pre-CTA halving fallbacks that lived here (nth-of-type parity crossed
   with nth-last-of-type) served pages WITHOUT chapter classes. Retired 2026-08-30 with
   the banding rollout: every multi-section page now carries explicit --band/--plain tags,
   so the --plain + --plain rules above own all same-ground halving. They could not simply
   stay: at (0,5,0) the positional forms outranked the (0,3,0) class rules and would have
   mis-halved any colour-change boundary above a pre-CTA section whose predecessor is a
   --band (a boundary that must keep its full padding). */

/* --- Portrait split: image beside its supporting text ----------------------
   Heading spans both columns, portrait sits left at column width (smaller than the
   old full-width 3:2 block, which left a dead gutter), supporting text sits right,
   and the voice quote spans the full measure beneath. Columns are assigned
   explicitly so any number of children stays predictable. */
.section .section__inner--portrait-split {
  display: grid;
  grid-template-columns: minmax(0, 1.35fr) minmax(13rem, 1fr);
  column-gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
.section__inner--portrait-split > * { grid-column: 1 / -1; }
/* Restore the site's standard content rhythm inside the grid. The base sheet spaces
   adjacent section children with `.section__inner > * + * { margin-top: var(--space-sm) }`
   (16px) — but .portrait-ph zeroes its own top margin, and a grid row-gap defaults to 0,
   so the heading sat flush against the image while every other heading on the site has
   16px under it. Both gaps below use the same token, so they track the base scale. */
.section__inner--portrait-split > .section__heading { grid-row: 1; margin-bottom: var(--space-sm); }
.section__inner--portrait-split > .portrait-ph { grid-column: 1; grid-row: 2; max-width: none; margin-bottom: 0; }
/* The credentials paragraph sits UNDER the image in the left column; the lists span
   both of those rows on the right, so the two columns finish at similar depths
   instead of the text column overshooting the image. */
.section__inner--portrait-split > .portrait-bio { grid-column: 1; grid-row: 3; margin: var(--space-sm) 0 0; }
.section__inner--portrait-split > .portrait-aside { grid-column: 2; grid-row: 2 / span 2; }
.section__inner--portrait-split > .prose-quote { grid-row: 4; margin-top: clamp(1.6rem, 3vw, 2.4rem); }
/* First label in the aside must not push the column below the image top. */
.portrait-aside > :first-child { margin-top: 0; }
/* Zero the base sheet's inherited 16px top margin so the text column starts on the
   same line as the image, matching --with-profile and --with-media. */
.portrait-aside { margin: 0; }
/* Micro-label + fact list inside the portrait aside. Sea-glass text on the sand band
   is 5.10:1; body charcoal on sand is 9.13:1. */
.portrait-aside__label {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  /* Clear break above a group label: well beyond the 0.5rem between list items,
     so 'Selected training' reads as a new group rather than another item. */
  margin: 1.75rem 0 0.7rem;
}
.portrait-aside__list {
  list-style: none;
  margin: 0;
  padding: 0;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.92rem;
  line-height: 1.55;
}
.portrait-aside__list li { margin: 0 0 0.5rem; padding: 0; font-size: 0.92rem; /* item-level, per finding 6 */ }
.portrait-aside__list li:last-child { margin-bottom: 0; }
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */
  /* Every placed child must be reset by name: the desktop rules above are more
     specific than a bare `> *`, so an unlisted child keeps its explicit grid-row and
     jumps out of source order (the quote did exactly that, landing above the aside). */
  .section .section__inner--portrait-split { grid-template-columns: minmax(0, 1fr); }
  .section__inner--portrait-split > *,
  .section__inner--portrait-split > .section__heading,
  .section__inner--portrait-split > .portrait-ph,
  .section__inner--portrait-split > .portrait-bio,
  .section__inner--portrait-split > .portrait-aside,
  .section__inner--portrait-split > .prose-quote { grid-column: 1; grid-row: auto; }
  .section__inner--portrait-split > .portrait-ph { margin-bottom: 1.4rem; }
  .section__inner--portrait-split > .prose-quote { margin-top: 1.6rem; }
}

/* The closing CTA: the signature band — button-color surface, white type,
   inverted white primary, faint concentric rings (the Oula line-graphic move). */
.page__body > .section:has(.cta) {
  position: relative;
  background: var(--t-seaglass-dark);
  box-shadow: 0 0 0 100vmax var(--t-seaglass-dark);
  clip-path: inset(0 -100vmax);
  color: #ffffff;
  text-align: center;
}
/* The signature ring sweep on the CTA band — two large concentric circles anchored off
   the bottom-right, the Oula closing-line-graphic move (§5t). Briefly removed 2026-08-30
   on a misread of Matt's note; he wanted the LARGE arcs kept and the small corner
   artifacts gone instead. Restored. */
.page__body > .section:has(.cta)::after {
  content: "";
  position: absolute;
  right: -6rem;
  bottom: -14rem;
  width: 30rem;
  height: 30rem;
  border: 2px solid rgba(255, 255, 255, 0.12);
  border-radius: 50%;
  pointer-events: none;
}
.page__body > .section:has(.cta)::before {
  content: "";
  position: absolute;
  right: -1rem;
  bottom: -9rem;
  width: 19rem;
  height: 19rem;
  border: 2px solid rgba(255, 255, 255, 0.09);
  border-radius: 50%;
  pointer-events: none;
}
.page__body > .section:has(.cta) .section__inner { position: relative; z-index: 1; }
.page__body > .section:has(.cta) .section__heading,
.page__body > .section:has(.cta) p { color: #ffffff; }
.page__body > .section:has(.cta) p { margin-left: auto; margin-right: auto; }
.page__body > .section:has(.cta) a { color: #ffffff; }
.page__body > .section:has(.cta) .cta__action { display: inline-block; margin: 0.35rem 0.4rem; }
/* Enlarged text (2026-10-20 audit U2): at 200% text on a phone "Request a free consultation" ran past
   the screen. The CTA is a size container; below 16rem, which happens with enlarged text or on
   screens narrower than about 305px (a 320px phone's CTA is 17rem at the default size), the pill
   drops its side margins, is capped at its column and its side padding tightens, so the label fits
   or, at the extreme, hyphenates ("consulta-tion") instead of running off. It hyphenates only where
   "consultation", the longest label word (6.07rem), cannot fit the pill: the column less 1.5rem of
   padding and 2px of border. Firefox and Safari otherwise split it where it would fit whole. */
.page__body > .section:has(.cta) .cta { container: cta / inline-size; }
@container cta (max-width: 16rem) {
  .page__body > .section:has(.cta) .cta__action { margin-left: 0; margin-right: 0; max-width: 100%; }
  .page__body > .section:has(.cta) .cta__action .button { padding-left: 0.75rem; padding-right: 0.75rem; }
}
@container cta (max-width: calc(7.57rem + 2px)) {
  .page__body > .section:has(.cta) .cta__action .button { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 10 4 4; }
}
.page__body > .section:has(.cta) .button--primary,
.page__body > .section:has(.cta) .cta .button--primary { background: #ffffff; color: var(--t-blue); }
.page__body > .section:has(.cta) .button--primary:hover,
.page__body > .section:has(.cta) .button--primary:focus-visible { background: var(--t-cream); color: var(--t-blue); }
.page__body > .section:has(.cta) .button--secondary,
.page__body > .section:has(.cta) .cta .button--secondary { color: #ffffff; border-color: rgba(255, 255, 255, 0.75); background: transparent; } /* 2.77:1 -> 3.34:1 on the band (P1) */
/* The hover fill is removed, not reduced: white label on the band measures 4.68:1 against
   a 4.5 floor, so even a 2% white fill drops it to 4.48 and fails. The solid-white border
   carries the hover signal; the lift carries the rest. Home's .final-cta matches. */
.page__body > .section:has(.cta) .button--secondary:hover,
.page__body > .section:has(.cta) .button--secondary:focus-visible { border-color: #ffffff; background: transparent; color: #ffffff; }
/* A blue shadow vanishes on the dark band; it needs its own deeper value. */
.page__body > .section:has(.cta) .button:hover,
.page__body > .section:has(.cta) .button:focus-visible { box-shadow: 0 6px 16px rgba(14, 32, 36, 0.30); }
.page__body > .section:has(.cta) .button:active { box-shadow: 0 3px 8px rgba(14, 32, 36, 0.26); }
.cta__facts { margin-top: 1.2rem; font-size: 0.9rem; color: #ffffff; }
/* The CTA band runs flush to the footer: no stray cream gap beneath it */
.page { padding-bottom: 0; }
.page__main { padding-bottom: 0; margin-bottom: 0; }
.page__body > .section:last-of-type { margin-bottom: 0; }
/* Closing ring bookend for content pages that have no signature CTA band (the four
   book pages; Contact has since gained a CTA): echoes the opening hero rings, tone-matched (seaglass on the
   light closing section) and mirrored to hang off the lower-right, so the page is
   bracketed open + close. clip-path contains the rings to the section (like the hero). */
.page__body > .section.closing-bookend { position: relative; clip-path: inset(0 -100vmax); }
.page__body > .section.closing-bookend::after {
  content: ""; position: absolute; right: -6rem; bottom: -14rem;
  width: 30rem; height: 30rem;
  border: 2px solid rgba(79, 124, 120, 0.20); border-radius: 50%; pointer-events: none;
}
.page__body > .section.closing-bookend::before {
  content: ""; position: absolute; right: -1rem; bottom: -9rem;
  width: 19rem; height: 19rem;
  border: 2px solid rgba(79, 124, 120, 0.14); border-radius: 50%; pointer-events: none;
}
.page__body > .section.closing-bookend .section__inner { position: relative; z-index: 1; }
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */
  .page__body > .section.closing-bookend::after { display: none; }
  .page__body > .section.closing-bookend::before { width: 13rem; height: 13rem; right: -5rem; bottom: -6rem; }
}
.section__heading,
.error-page__suggest-heading {
  font-family: "Newsreader", Georgia, serif;
  font-weight: 500;
  color: var(--t-blue);
  /* §2.1 BINDING: H2 band 34-40 mobile / 42-56 desktop — 34px at 375, 56px at 1440. */
  font-size: clamp(2.125rem, 3.9vw, 3.5rem);
  line-height: 1.22;
  text-wrap: balance;
}
/* Headings stand alone: hierarchy comes from type and the band rhythm (no accent bars) */

/* Oura principle: one memorable thought per viewport. The opening editorial statement
   is CLASS-APPLIED as of 2026-08-30 (P2): the old positional selector
   (`.section:first-of-type .section__inner > p:first-child`) silently fired on only 7 of
   24 pages — whichever happened to open with a bare <p> — while the ledger recorded the
   role as site-wide (finding 7). The seven pages that rendered the role now carry
   class="lead" explicitly; a page opening with a heading, quote, or cover gets no lede
   unless one is deliberately added. */
.section .lead {
  font-family: "Newsreader", Georgia, serif;
  font-weight: 500;
  font-style: normal;
  font-size: clamp(1.35rem, 2.2vw, 1.8rem);
  line-height: 1.45;
  color: var(--t-blue);
  max-width: 34ch;
}

/* --- Quotes: large serif quotation glyph, no bars ----------------------------- */
.prose-quote {
  margin: 0 0 1.5rem;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 0;
  font-family: "Newsreader", Georgia, serif;
  font-style: italic;
  font-weight: 400;
  font-size: clamp(1.25rem, 1.8vw, 1.5rem); /* voice-quote presence bump, both systems (2026-08-30) */
  line-height: 1.5;
  color: var(--t-blue);
}
.prose-quote::before {
  content: "\201C";
  display: block;
  font-family: "Newsreader", Georgia, serif;
  font-style: normal;
  font-weight: 500;
  font-size: 3rem;
  line-height: 0.6;
  /* The voice mark is warm (2026-08-30). Per §5p this glyph means Ashley's first-person
     voice or a quoted record — the one element with a precise semantic rule — but it was
     painted the same Dark Sea Glass as buttons, borders, focus rings and icons, so the
     rule was invisible. Sea glass stays the interaction layer; terracotta is the human
     one. #9C5A2B not #B66F52 because the glyph lands on sand bands too, where base
     terracotta is 2.93 (below even the non-text floor). At 48px the 3:1 large-text bar
     applies and this clears everywhere — and it beats the old colour on every ground
     (5.07 vs 4.42 cream, 4.04 vs 3.52 sand), so it is also a contrast improvement. */
  color: var(--t-terracotta-dark);
  /* Bottom margin is NEGATIVE by design (Matt, 2026-09-02: halve the gap to the quote).
     Measured ink-to-ink on /books/, /about/ and /therapy/trauma-emdr/, the gap was 39.4px
     and margin was only 22% of it. The dominant term is 23.6px of empty slack BELOW the
     glyph's ink but inside its own line box — line-height 0.6 on a 48px face whose ink sits
     high — plus 6.9px of the paragraph's own half-leading. Zeroing the margin would still
     have left 30.5px, so closing to ~19px has to eat into that slack. A tighter line-height
     would instead push the ink further above the box top and crowd whatever precedes the
     quote. Home's .pull-quote::before carries the identical value; the two were measured
     separately and came out the same (39.3 vs 39.4) because the quote type matches. */
  margin: 0.4rem 0 -0.7rem;
}
.prose-quote p { font-size: inherit; color: inherit; font-family: inherit; font-style: inherit; line-height: inherit; }
/* First-in-section quotes (2026-08-30): the glyph's 0.4rem top margin collapses out
   through the quote and the inner (neither has top padding/border), adding 6.4px above
   the section's padding wherever a .prose-quote is the inner's FIRST flow child —
   surfaced by the banding rollout when a halved 36px boundary measured 42. Mid-section
   quotes are unaffected (the 16px sibling margin wins the collapse), and the :not()
   excludes the modifier-grid inners (--with-media etc.), where grid items do not
   collapse margins and zeroing would instead shift the glyph inside its cell. */
.section__inner:not([class*="section__inner--"]) > .prose-quote:first-child::before { margin-top: 0; }

/* --- Buttons: homepage button system ----------------------------------------- */
.button {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem; /* §2.1 button band + §2.4 floor */
  font-weight: 600;
  letter-spacing: normal;
  text-transform: none;
  padding: 0.9rem 1.6rem;
  border: 1px solid transparent;
  border-radius: var(--t-radius);
  text-decoration: none;
  transition: background-color 180ms ease, color 180ms ease, border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease;
}
.button--primary,
.cta .button--primary { background: var(--t-seaglass-dark); color: #ffffff; }
.button--primary:hover,
.button--primary:focus-visible,
.cta .button--primary:hover,
.cta .button--primary:focus-visible { background: var(--t-blue); color: #ffffff; }
/* Outline-button boundary raised to the 3:1 non-text floor (2026-08-30, P1 pass):
   0.35 blue composited to 1.85:1 on cream; 0.65 reads 3.58 on cream / 3.52 on sand.
   Home's .btn--ghost carries the same change — the two systems move together. */
.button--secondary,
.cta .button--secondary { background: transparent; color: var(--t-blue); border-color: rgba(41, 74, 82, 0.65); }
.button--secondary:hover,
.button--secondary:focus-visible,
.cta .button--secondary:hover,
.cta .button--secondary:focus-visible { border-color: var(--t-blue); background: rgba(41, 74, 82, 0.06); color: var(--t-blue); }
/* Per-button revision (Matt, 2026-09-16): the Walk-and-Talk button on california-nevada's
   sand band gets a cream fill so it lifts off the band instead of taking its colour. Blue
   text and the 0.65 border are unchanged; the border still carries the 3:1 boundary.
   Page-scoped by section id so no other button is affected. */
#availability-san-diego .button--secondary,
#availability-san-diego .button--secondary:hover,
#availability-san-diego .button--secondary:focus-visible { background: var(--t-cream); }

/* Hover affordance (Matt, 2026-09-01) — Home's .btn block carries the same treatment;
   the two systems move together. The base sheet already lifted .button--primary 1px
   ("gentle hover rise"); this takes both roles to 2px, adds the shadow, and gates the
   motion, which the base rule was not. */
.button:hover, .button:focus-visible { box-shadow: 0 4px 12px rgba(41, 74, 82, 0.18); }
.button:active { box-shadow: 0 2px 6px rgba(41, 74, 82, 0.16); }
@media (prefers-reduced-motion: no-preference) {
  .button:hover, .button:focus-visible { transform: translateY(-2px); }
  .button:active { transform: translateY(0); }
}
/* The base sheet's 1px rise is ungated, so it would still shift under reduced motion. */
@media (prefers-reduced-motion: reduce) {
  .button--primary:hover, .button--primary:focus-visible { transform: none; }
}

/* --- Cards: homepage card treatment ------------------------------------------ */
.card {
  background: var(--t-cream);
  border: 1px solid transparent; /* card depth parity with Home (2026-09-01): the elevation pair in --shadow-low carries the edge; the border stays in the box model so nothing moves */
  border-radius: var(--t-radius);
}
/* Ground-aware card fill (2026-08-30, P1 pass). On cream --plain sections cream cards had
   no visible boundary (1.00:1 fill, 1.17:1 border) — the five specialty pages' related-
   support grids all sit in the forced-cream pre-CTA slot. Sand fill follows the book-thumb
   precedent (sand surface on cream ground); cards on --band sand stay cream via the default
   above. The old `.section:nth-of-type(even) .card` parity rule that lived here was removed
   in the same change: audit finding 51 verified it redundant (it duplicated the cream
   default), and at equal (0,2,0) specificity declared later it would have defeated this
   rule on even-numbered --plain sections (perinatal's related grid is section 8). */
.section--plain .card { background: var(--t-sand); }
/* Card typography (P2, 2026-08-30): theme.css never styled .card__title, so interior card
   titles fell through to the base sheet's neutral --type-h3 (19.2-23.2px at 1.18) against
   Home's 17.92px/1.3 nav-card role (finding 9); .card__body rode the body default. Pinned
   to the Home role values so the same component reads the same in both systems. */
.card__title { font-size: 1.2rem; line-height: 1.3; } /* harmonized card-title role, both systems (2026-08-30) */
.card__body { font-size: 0.96rem; }
.card__link { color: var(--t-blue); }
/* Quiet hover (2026-09-01): the title underline is reserved but transparent at rest, so the
   base sheet's hover underline (a shorthand, which resets the colour to currentcolor) fades in
   over 160ms instead of popping; the colour shift eases on the same curve. */
.card__title a, .card__link { text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; transition: color var(--t-hover-duration) var(--motion-easing-standard), text-decoration-color var(--t-hover-duration) var(--motion-easing-standard); }
.card__link:hover, .card__link:focus-visible { color: var(--t-seaglass-text); }
/* Even-count grid modifier (2026-08-30, Therapy review): the base sheet's 40rem auto-fit
   makes 3 tracks in the prose column, so a 4-card grid orphans as 3+1. Two balanced rows
   at the same card width auto-fit already gives the 2-card related pairs. Doubled class
   (0,2,0) outranks the base rule; media-scoped so mobile keeps the base single column. */
@media (min-width: 40rem) {
  .card-grid.card-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* Shrinkable card tracks (2026-10-20 audit U2): the base sheet's phone rule is a bare 1fr, and with
   200% text a card's longest word widened it past the screen (In Her Own Backyard's pathway cards
   reached 437px on a 390px phone). minmax(0, …) here and in the 2- and 3-up rules; cards keep
   their default widths wherever their words fit. */
@media (max-width: 39.999rem) {
  .card-grid { grid-template-columns: minmax(0, 1fr); }
}
/* ...and below 16rem of grid width (enlarged text, or a screen narrower than about 305px: a 320px
   phone's grid is 17rem at the default size) the cards' padding tightens from 1.5rem to 0.625rem, so
   a long title word ("recommendations" at Chrome's Very large text on a 360px phone) stays whole. */
.card-grid { container: card-grid / inline-size; }
@container card-grid (max-width: 16rem) {
  .card-grid > .card { padding: 0.625rem; }
}
/* A title word too long for its card hyphenates instead of splitting anywhere, but only in a card
   narrower than that word. Each card is a size container, so the narrow cards of a multi-column grid
   count too. The limit is "reproductive", the longest title word that can hyphenate in most grids
   (7.51rem), or "recommendations" (10.63rem) in the grids marked .card-grid--long-words (In Her Own
   Backyard). Chrome and Firefox hyphenate only words of 10 letters or more, 4 each side of the break,
   and never a capitalised word, so a title-case word still splits where it cannot fit. Those grids'
   one lowercase 9-letter word, "questions" (5.72rem), may hyphenate too in a card narrower than it. Safari has
   no letter limit and hyphenates capitalised words, so its limit is the longest capitalised title
   word, "Psychologically" (8.88rem). Inside these widths a shorter word can still hyphenate where it
   would fit a line of its own (October 20: "depression" with 32px text at 346-356px, and in Safari
   6- to 10-letter words in narrow multi-column cards). */
.card-grid > .card { container: card / inline-size; }
@container card (max-width: 7.53rem) {
  .card-grid > .card .card__title { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 10 4 4; }
}
@supports (-webkit-hyphenate-limit-before: 1) {
  @container card (max-width: 8.9rem) {
    .card-grid > .card .card__title { -webkit-hyphens: auto; hyphens: auto; }
  }
}
@container card (max-width: 10.65rem) {
  .card-grid--long-words > .card .card__title { -webkit-hyphens: auto; hyphens: auto; hyphenate-limit-chars: 10 4 4; }
}
@container card (max-width: 5.72rem) {
  .card-grid--long-words > .card .card__title { hyphenate-limit-chars: 9 4 4; }
}
/* The base sheet's global `li + li { margin-top: var(--space-3xs) }` list rhythm leaks
   into card grids: every card after the first starts 4px lower inside its stretched grid
   cell (bottoms align, tops and title baselines stagger — measured on perinatal row 1,
   2540.15 vs 2544.15). (0,1,1) outranks the (0,0,2) base rule. */
.card-grid > li { margin-top: 0; }
/* Card grids fill the section's full content column (Matt, 2026-08-30, matching Home's
   dispersed/centred card band): the base sheet's `.section__inner > ul { max-width:
   var(--measure-default) }` is a 68ch READING-measure cap meant for prose lists, and card
   grids are <ul>s, so they clung to the left ~836px of the ~992px centred column with a
   dead right margin. (0,2,1) outranks the (0,1,1) prose cap. Auto-fit then makes the hub's
   six cards 3-up at ~315px and lets pairs/2×2 grids expand to ~484px halves — all edges
   symmetric inside the centred container. */
.section__inner > ul.card-grid { max-width: none; }
/* In the 72rem content column the base auto-fit would make FOUR 16rem tracks, turning the
   hub's six cards into a ragged 4+2. Pin plain pathway grids to Home's 3-up at desktop
   widths; pairs and 2×2 grids carry .card-grid--2 and keep their two halves. */
@media (min-width: 64rem) {
  .section__inner > ul.card-grid:not(.card-grid--2) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* Equal-height rows (2026-10-19, the novel page's "Step into the backyard"): a grid that mixes
   pathway cards with a taller button card ("Listen to the playlist") otherwise gets one short
   row and one tall row. 1fr auto rows give every row the tallest card's height in the 3-up
   desktop grid only: in the 2-up tablet grid the button card's buttons wrap and would stretch
   all six cards to ~300px, and phones keep their natural single-column heights. */
@media (min-width: 64rem) {
  .card-grid.card-grid--even-rows { grid-auto-rows: 1fr; }
}
/* Pathway cards (Matt, 2026-08-30): navigation cards whose whole surface is the link.
   The title anchor stretches over the card via its ::after overlay; the "Learn more"
   line is a visual cue only (aria-hidden — the accessible name stays the title), pinned
   to a uniform bottom row so unequal copy lengths stop leaving ragged card bottoms.
   Keyboard: the card draws its own focus ring via :focus-within; the inner link ring is
   suppressed only where :has() is supported, so older browsers keep the default ring. */
.card--pathway { position: relative; display: flex; flex-direction: column; }
.card--pathway .card__link::after { content: ""; position: absolute; inset: 0; border-radius: var(--t-radius); }
.card--pathway .card__more {
  margin: 0;
  margin-top: auto;
  padding-top: 1rem;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--t-seaglass-text);
}
.card--pathway .card__more::after { content: " \2192"; }
.card--pathway:focus-within { outline: 2px solid var(--t-seaglass-dark); outline-offset: 2px; }
.card--pathway:has(.card__link:focus-visible) .card__link { outline: none; }
/* Hover/active ring (Matt, 2026-08-30): a 2px rust ring says "clickable" on hover and
   turns Sea Glass while pressed. Drawn as an INSET shadow layered over the base sheet's
   elevation hover (a border-width change would shift layout 1px), and ground-aware like
   the icons: sand-surfaced cards (--plain sections) take the dark derivative. */
.card--pathway:hover { box-shadow: var(--shadow-medium), inset 0 0 0 2px var(--t-terracotta); }
.section--plain .card--pathway:hover { box-shadow: var(--shadow-medium), inset 0 0 0 2px var(--t-terracotta-dark); }
.card--pathway:active { box-shadow: var(--shadow-medium), inset 0 0 0 2px var(--t-seaglass-dark); }

/* --- Resources directory (round 24, 2026-08-30) -------------------------------
   Two-column masonry of preserved legacy resource groups: CSS columns pack the very
   unequal card heights (13 books vs 2 links) without grid holes, reading down the left
   column then the right — Matt's left/right split. One column in the disclosure band. */
.resource-masonry { columns: 2; column-gap: 1.5rem; margin-top: 2rem; }
@media (max-width: 47.999rem) { .resource-masonry { columns: 1; } }
.resource-group {
  break-inside: avoid;
  background: var(--t-sand);
  border: 1px solid transparent; /* same depth pair as the cards (2026-09-01) */
  box-shadow: var(--shadow-low);
  border-radius: var(--t-radius);
  padding: 1.4rem 1.5rem;
  margin: 0 0 1.5rem;
}
.resource-group__title { font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; font-size: 1.2rem; line-height: 1.3; font-weight: 600; color: var(--t-blue); margin: 0 0 0.75rem; }
/* Group icons ride the homepage .path-icon language, but these containers are SAND:
   plain terracotta is below the 3:1 non-text floor there, so the documented dark
   derivative carries them (4.04:1 on sand). */
.resource-group .path-icon { stroke: var(--t-terracotta-dark); }
/* Card icons (Matt, 2026-08-30: every small card container carries its rust icon).
   Ground-aware like the card fill itself: cards on --plain sections are SAND, where
   base terracotta is 2.93:1 — below even the non-text floor — so those icons take the
   dark derivative; cream cards on bands keep base terracotta (3.68:1), as on the hub. */
.section--plain .card .path-icon { stroke: var(--t-terracotta-dark); }
/* Two-column list for long flat enumerations (Providers training record).
   Round-36 polish (Matt): wider 4rem gutter, a wider overall measure so items wrap
   less, rust markers tying the bullets to the icon language (dark terracotta — the
   list sits on sand), and more air between items. A column-rule divider was considered
   and declined per the no-decorative-line-devices rule; whitespace separates. */
.split-list { columns: 2; column-gap: 4rem; }
.section__inner > ul.split-list { max-width: 60rem; } /* (0,2,1): the base sheet's `.section__inner > ul` 68ch measure outranks a bare class */
.split-list li { break-inside: avoid; margin: 0 0 0.7rem; }
.split-list li::marker { color: var(--t-terracotta-dark); }
@media (max-width: 47.999rem) { .split-list { columns: 1; } }
.resource-group__list { list-style: none; margin: 0; padding: 0; }
.resource-group__list li { margin: 0 0 0.55rem; }
.resource-group__list li:last-child { margin-bottom: 0; }
.resource-group__list a { color: var(--t-blue); overflow-wrap: anywhere; transition: color var(--t-hover-duration) var(--motion-easing-standard); } /* quiet hover 2026-09-01; overflow-wrap (2026-09-24): the two bare PubMed addresses are single unbreakable words that ran out of the card and past the edge of a 320px screen (WCAG 1.4.10 reflow) */
.resource-group__list a:hover, .resource-group__list a:focus-visible { color: var(--t-seaglass-text); }
/* The Domestic Violence Hotline's number (the lists' one <strong>, 9.04rem in Chrome and Firefox, 9.17rem
   in Safari) wrapped inside itself on phones at the default size ("1-800-" / "799-7233" at 320px, "1-" /
   "800-799-7233" at other widths; 2026-10-20 verification). In a list at least 9.2rem wide (a little over
   Safari's width) it is a box at most the width of the line, so it moves whole to the next line wherever
   it fits one; in a narrower list it wraps as before. Wrapping is the default and the box is what the
   query adds (2026-10-21 verification): round 9's box at every width left "Hotline:" on a line of its own
   where the number could not fit, and round 10's nowrap ran it past the card under a browser's minimum
   font size (rem lengths, and so the query, ignore that minimum) and lost its last digits in Firefox's
   print layout, which did not apply the query. The box instead wraps inside itself when a minimum font
   size makes it wider than the line, and the web fonts failing to load leaves it a little wider (9.27rem
   in Safari's fallback) only in a 0.07rem band where it wraps the same way. The query applies on screen
   only: Firefox prints nothing of an element whose display a container query changes, so printed (and
   in a browser without container queries) the number is that box at every width (2026-10-21
   verification). */
.resource-group__list { container: resource-list / inline-size; }
@media not print { @container resource-list (min-width: 9.2rem) { .resource-group__list li > strong { display: inline-block; max-width: 100%; } } }
.resource-group__note { font-size: 0.875rem; color: var(--t-seaglass-text); margin: 0.75rem 0 0; }
/* Speaking & Media's podcast list (Ashley's article review, 2026-10-14): one standalone box. */
.section__inner > .resource-group--podcasts { max-width: 40rem; margin: 1.5rem 0 0; }
.resource-upkeep { font-size: 0.875rem; color: var(--t-seaglass-text); margin-top: 0.5rem; }
/* Crisis panel lines: scannable, phone numbers weighted */
.crisis-lines { list-style: none; margin: 0; padding: 0; }
.crisis-lines .crisis-line { font-size: 1.1875rem; margin: 0 0 0.6rem; }
/* The two long numbers (.crisis-line__number; 1-800-944-4773 is 9.82rem in all three engines,
   1-833-852-6262 9.58rem) are each a box at most the width of the line in a list at least 9.85rem wide,
   just over the longer one, so there each moves whole to the next line when it does not fit after the
   words before it (with the web fonts failing to load, 1-800-944-4773 is 9.95rem and wraps inside its box
   in the 0.1rem band above the query). In a narrower list, as with 200% text on a
   320px phone, they wrap like the rest of the text (nowrap ran the last digits off the screen there;
   2026-10-20 verification): after a hyphen in Chrome and Safari, between digits in Firefox, which never
   breaks between a hyphen and a digit. Wrapping is the default and the box is what the query adds, as
   for the hotline in the resource lists above (2026-10-21 verification: round 7's box applied below the
   query, where it always began a line of its own; round 10's nowrap split a number that fit in a
   9.82-10rem band and lost digits in Firefox's print layout). <wbr> marks were tried and removed: they
   split each number into separate text pieces for screen readers. 911 and 988 never need to wrap.
   Printed, and in a browser without container queries, each is that box at every width, as the hotline
   above is. Containment keeps the last item's margin inside the list, so it is zeroed there and the gap
   to the next paragraph stays 16px. */
.crisis-lines { container: crisis-lines / inline-size; }
.crisis-lines > .crisis-line:last-child { margin-bottom: 0; }
@media not print { @container crisis-lines (min-width: 9.85rem) { .crisis-lines .crisis-line .crisis-line__number { display: inline-block; max-width: 100%; } } }
@media print { .resource-group__list li > strong, .crisis-lines .crisis-line .crisis-line__number { display: inline-block; max-width: 100%; } }
@supports not (container-type: inline-size) { .resource-group__list li > strong, .crisis-lines .crisis-line .crisis-line__number { display: inline-block; max-width: 100%; } }
.crisis-note { margin-top: 1rem; }

/* --- CTA aside: calm, unboxed ------------------------------------------------- */
.cta {
  background: transparent;
  border: 0;
  border-radius: var(--t-radius);
  padding: 0;
}

/* --- Book pages: descriptive text left, cover (and any quote) right, tops level ---
   One consistent 2-column layout across all three book pages (Matt, 2026-09-04). The cover
   column top-aligns with the heading; the descriptive text fills the left column. Column-gap
   only, so the base sheet's sibling margins own the vertical rhythm (same as --with-media). */
.book-intro .section__inner {
  display: grid;
  grid-template-columns: 1fr minmax(12rem, 17rem);
  column-gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
.book-intro .section__inner > * { grid-column: 1; }
.book-intro .section__inner > .book-intro__aside { grid-column: 2; grid-row: 1 / span 99; margin: 0; }
.book-intro__aside { display: flex; flex-direction: column; gap: 1.25rem; padding-top: 0.5rem; } /* padding aligns the cover top to the heading's cap line */
.book-intro__aside .cover-ph { margin: 0; }
.book-intro__aside .cover-ph img { display: block; width: 100%; height: auto; box-shadow: var(--shadow-low); } /* square corners, no radius (Matt, 2026-09-04) */
.book-intro__aside .prose-quote { margin: 0; }
@media (max-width: 40rem) { /* 640px at the default text size (rem since 2026-10-20) */
  .book-intro .section__inner { grid-template-columns: minmax(0, 1fr); }
  .book-intro .section__inner > .book-intro__aside { grid-column: 1; grid-row: auto; margin-top: var(--space-md); max-width: 17rem; padding-top: 0; }
}

/* --- Section media: the image card moved out of the hero (2026-08-30) --------------
   The hero's image card used to sit in the top-right, exactly where the ring-bookend
   motif lives, so the two collided. The card now rides in the first content section
   instead, keeping the same top-right position one band lower and leaving the rings
   their own space. Unlike .section__inner--with-profile (which has exactly two
   children), these sections carry several, so columns are assigned explicitly rather
   than by source order — that also keeps the statement-lead selector
   (.section__inner > p:first-child) intact. */
.section .section__inner--with-media {
  display: grid;
  /* Text/image balance (2026-09-08): the left column is a fixed ~72ch reading measure
     and its prose is allowed to fill it (see the > p rule below), so text no longer
     stops at the 68ch cap and strands ~170px of dead space beside a small 20rem image.
     The image column takes the reclaimed width and sits flush to the content edge — a
     small, consistent gap across every interior with-media page. (rem, not ch: a ch
     track resolves against the container font, not the prose font, and ballooned the
     column.) */
  grid-template-columns: minmax(0, 37rem) minmax(18rem, 1fr);
  /* column-gap only (2026-08-30): a row-gap here stacked on the base sheet's 16px sibling
     margins, and the unassigned rows stranded the heading beside the 240px media on the
     one three-child page (finding 12). Vertical rhythm comes from the margins alone. */
  column-gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
.section__inner--with-media > * { grid-column: 1; }
.section__inner--with-media > .section-media { grid-column: 2; grid-row: 1 / span 99; } /* spans every text row (finding 12) */
/* The text column IS the reading measure now (37rem), so prose fills it instead of
   stopping at the base sheet's 68ch cap and leaving dead space before the image.
   Specificity (0,2,1) to clear the base sheet's `.section__inner > p` measure. */
.section .section__inner--with-media > p { max-width: none; }
.section-media {
  aspect-ratio: 4 / 3;
  background: var(--t-seaglass-tint);
  border: 1px solid var(--t-seaglass-dark); /* placeholder-frame standard (P1) */
  border-radius: var(--t-radius);
  display: flex;
  align-items: flex-end;
  padding: 1rem;
  margin: 0;
}
.section-media p { margin: 0; font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */ line-height: 1.5; color: var(--t-blue); opacity: 0.85; }
/* Real photo in a section-media slot (2026-09-07): drop the placeholder frame; the image shows at its own ratio with rounded corners and the site's object shadow. */
.section-media:has(img) { aspect-ratio: auto; background: none; border: 0; padding: 0; display: block; }
.section-media img { display: block; width: 100%; height: auto; border-radius: var(--t-radius); box-shadow: var(--shadow-low); }
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */
  /* Stack: the text reads first, the image follows (it is last in source order). */
  .section .section__inner--with-media { grid-template-columns: minmax(0, 1fr); }
  .section__inner--with-media > *,
  .section__inner--with-media > .section-media { grid-column: 1; grid-row: auto; }
  .section-media { max-width: 22rem; }
}

/* --- About: horizontal image placeholder in the text flow --------------------------- */
/* --- Profile card (About intro): 5:4 portrait + licenses + social + connect -- */
.section .section__inner--with-profile {
  display: grid;
  /* Same columns and gap as .section__inner--with-media (Matt, 2026-10-14: the About photo
     looked smaller than the Articles photo), so the card and its 5:4 photo are exactly as
     wide as the photo on every other with-media page (512px at 1440). The card was capped
     at 24rem before. The 23.5rem floor keeps the longest licence line, "Certified in
     Perinatal Mental Health (PMH-C)" (~367px), on one line, so below ~1,060px the card
     holds 376px while the other pages' photos narrow further. The lead keeps its 34ch
     measure, which fits the 37rem column. */
  grid-template-columns: minmax(0, 37rem) minmax(23.5rem, 1fr);
  column-gap: clamp(1.5rem, 4vw, 3rem);
  align-items: start;
}
.profile-card { margin: 0; }

/* --- Author lockup (Q12 author-facing mark, in-page) --------------------------
   The author version of the wordmark, for author-context pages (About, Speaking,
   Books, Articles): the name in the display serif over "Founder, Healing Home
   Counseling" in the credential caps. A quiet signature, not a second masthead. */
.author-lockup { margin: 0 0 var(--space-sm, 1rem); }
.author-lockup__name {
  display: block;
  font-family: "Vidaloka", Georgia, serif;
  font-size: clamp(1.35rem, 1.2rem + 0.7vw, 1.6rem);
  line-height: 1.15;
  color: var(--t-blue);
  letter-spacing: 0.01em;
}
.author-lockup__role {
  display: block;
  font-family: "Montserrat", Arial, sans-serif;
  font-weight: 600;
  font-size: 0.78rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  margin-top: 0.3rem;
}
.profile-card .author-lockup { margin-bottom: 1.1rem; }
/* End-of-article signature variant: a "Written by" label above the author mark,
   set off from the body by a hairline (Deep Coastal Blue at low alpha). */
.author-lockup--article { margin-top: var(--space-md, 2rem); padding-top: var(--space-md, 2rem); border-top: 1px solid rgba(41, 74, 82, 0.15); }
.author-lockup__by { display: block; font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; font-weight: 600; font-size: 0.8rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--t-seaglass-text); margin-bottom: 0.4rem; }

.profile-card__media {
  aspect-ratio: 5 / 4;
  background: var(--t-seaglass-tint);
  border: 1px solid var(--t-seaglass-dark); /* placeholder-frame standard (P1) */
  border-radius: var(--t-radius);
  display: flex;
  align-items: flex-end;
  padding: 1rem;
  margin: 0 0 1.1rem;
}
.profile-card__media p { margin: 0; font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */ line-height: 1.5; color: var(--t-blue); opacity: 0.85; }
/* Real photo in the profile card (2026-10-13, mirrors .section-media): drop the placeholder frame; the image shows at its own ratio with rounded corners and the object shadow. */
.profile-card__media:has(img) { aspect-ratio: auto; background: none; border: 0; padding: 0; display: block; }
.profile-card__media img { display: block; width: 100%; height: auto; border-radius: var(--t-radius); box-shadow: var(--shadow-low); }
.profile-card__facts {
  list-style: none;
  margin: 0 0 0.9rem;
  padding: 0;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.88rem;
  line-height: 1.55;
  color: var(--t-charcoal);
}
.profile-card__facts li { margin: 0 0 0.2rem; padding: 0; font-size: 0.88rem; /* item-level, per finding 6 */ }
.section .profile-card__social {
  margin: 0 0 1.1rem;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.88rem;
  /* Row of three live links (LinkedIn, Substack, Instagram). The Substack and Instagram
     items were plain-text placeholders until Ashley supplied the URLs (activated
     2026-09-16, here and in the footer Elsewhere row). */
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 1.1rem;
}
.profile-card__social a {
  color: var(--t-seaglass-text);
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgba(79, 124, 120, 0.4);
  text-underline-offset: 3px;
}
/* On the light About card the glyphs read in Deep Coastal Blue (not the footer's cream),
   uniform across the row and sized to the smaller card text (Matt, 2026-09-06). */
.profile-card__social .social-icon { color: var(--t-blue); width: 1rem; height: 1rem; margin-right: 0.35rem; vertical-align: -0.18em; }
.section .profile-card__cta { margin: 0; }
/* The card now ends on the social row (the Connect button was removed), so the last
   child must not leave a trailing margin. */
.section .profile-card > :last-child { margin-bottom: 0; }
@media (max-width: 48.75rem) { /* 780px at the default text size (rem since 2026-10-20) */
  .section .section__inner--with-profile { grid-template-columns: minmax(0, 1fr); }
  .profile-card { max-width: 24rem; }
}

.portrait-ph {
  width: 100%;
  max-width: 42rem;
  aspect-ratio: 3 / 2;
  background: var(--t-seaglass-tint);
  border: 1px solid var(--t-seaglass-dark); /* placeholder-frame standard (P1) */
  border-radius: var(--t-radius);
  margin: 0 0 1.6rem;
  display: flex;
  align-items: flex-end;
  padding: 0.9rem;
}
.portrait-ph p { margin: 0; font-size: 0.875rem; /* §2.1 binding: eyebrow 13-15 / caption 14-15 */ line-height: 1.5; color: var(--t-blue); opacity: 0.85; }
/* Real photo in a portrait slot (mirrors .section-media): drop the placeholder frame; the image shows at its own ratio with rounded corners and the object shadow. */
.portrait-ph:has(img) { aspect-ratio: auto; background: none; border: 0; padding: 0; display: block; }
.portrait-ph img { display: block; width: 100%; height: auto; border-radius: var(--t-radius); box-shadow: var(--shadow-low); }

/* --- Notes -------------------------------------------------------------------- */
/* A note reads quieter by its size alone. It used to carry `opacity: 0.9`, but group opacity
   fades the note's links too and a child cannot undo it: the closing band's white note text
   and links composited to 4.14:1 at rest, on hover and on focus, and a cream note's rust
   hover to 4.19, both under the 4.5 text floor (2026-09-24 hover/focus verification). */
.slice-note { font-size: 0.95rem; }

/* --- Footer: homepage footer treatment ----------------------------------------- */
.site-footer { background: var(--t-blue); color: var(--t-cream); margin-top: 0; }
.site-footer a { color: var(--t-cream); text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 3px; }
.site-footer a:hover, .site-footer a:focus-visible { color: var(--t-cream); text-decoration-color: var(--t-cream); } /* Home's treatment (2026-10-19): the reserved underline fades in; the colour stays cream */
.site-footer__heading {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-weight: 600;
  font-size: 1.18rem;
  letter-spacing: normal;
  text-transform: none;
  color: #ffffff;
  margin-bottom: 0.9rem;
  line-height: 1.22; /* Home's footer heading line box (23px), so the columns start their lists at the same height */
}
.site-footer__list, .site-footer__list li { font-size: 0.93rem; } /* item-level too: restores the ledger's verified 0.93rem footer links and Home parity (finding 6) */
.site-footer__note {
  border-top: 1px solid rgba(251, 248, 243, 0.18);
  margin-top: 1.75rem;
  padding-top: 1.25rem;
  font-size: 0.88rem;
  opacity: 0.92;
  background: transparent;
}
.site-footer__copyright { font-size: 0.82rem; opacity: 0.8; margin-top: 0.8rem; } /* Home's 0.8rem, not the base sheet's --space-md */
/* Site credit (Matt, 2026-10-22): the last line, set like the legal-entity line above it. The base sheet styles only
   __copyright, so its colour and face are restated here. Its link sits inside a sentence, so it keeps a faint underline
   at rest (WCAG 1.4.1); hover and focus make it solid cream as on every footer link. Home carries the same pair. */
.site-footer__credit { color: var(--text-muted-on-inverse); font-family: var(--font-functional); font-size: 0.82rem; opacity: 0.8; margin-top: 0.8rem; }
.site-footer__credit a { text-decoration-color: rgba(251, 248, 243, 0.6); }
/* Footer identical to Home's (Matt, 2026-10-19): Therapy · Explore · Elsewhere · Legal as four columns sized to their
   links and spread edge to edge with equal gaps; two by two below 64rem (1024px); one column below 37.5rem (600px).
   Home's embedded sheet carries the same grid in px. "Elsewhere" moved from a block under the columns into the third
   column, so the old outbound rules are gone. Padding and list rhythm match Home to the pixel: 56px top/bottom at
   desktop (Home's clamp), lists flush under their headings, 0.45rem between links. */
.site-footer { padding-block: 0; }
.site-footer__inner { padding-block: clamp(2.5rem, 5vw, 3.5rem); }
.site-footer__columns { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1.5rem; }
@media (min-width: 37.5rem) { .site-footer__columns { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem; } }
@media (min-width: 64rem) { .site-footer__columns { grid-template-columns: repeat(4, auto); justify-content: space-between; } }
.site-footer__list { display: block; margin: 0; }
.site-footer__list li { margin: 0 0 0.45rem; opacity: 0.92; }
/* Social glyphs: monochrome, inherit the footer's cream link colour (currentColor), all cream. */
.social-icon { display: inline-block; width: 1.2rem; height: 1.2rem; flex: none; vertical-align: -0.22em; margin-right: 0.5rem; } /* inline beside its label, as on Home: the base sheet makes svg a block */

/* The P2 mobile H1 ramp that lived here was retired the same day it landed: the §2.1
   binding raise (Matt, 2026-08-30) moved both systems to continuous clamps whose bands
   never cross — Home 48-88px, interiors 42-68px — so no media step is needed and the
   sub-490px inversion (finding 8) cannot recur. Home's own 768px step-down went with it. */

/* --- Reflow safety net (2026-10-20 audit U2) ------------------------------------------------
   A word that cannot fit a line on its own may now break instead of running past the screen,
   where the root's overflow-x clip cut it off: an email address in a 305px screen (the
   Accessibility statement's measured 316px), "Recommendations" at 320px, and, with the visitor's
   text at 200% on a phone, long words in headings, card titles, buttons and lists. break-word, not
   anywhere: it leaves intrinsic sizes alone, so grid and flex tracks still size to their longest
   word and nothing is squeezed (anywhere stacked the Articles topic counts as "1" over "0"). The
   phone stacks that grew past the screen are minmax(0, 1fr) instead. A word that fits is never
   broken; text sizes and wording never change. */
.page, .site-footer { overflow-wrap: break-word; }
.page .button { max-width: 100%; }

/* --- Focus visibility ----------------------------------------------------------- */
a:focus-visible,
button:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 3px; }
.site-footer a:focus-visible { outline-color: var(--t-cream); }
/* Focus on the Dark Sea Glass CTA band (2026-08-30): the global seaglass-dark ring is its
   own colour there (1.00:1 — invisible), and the white primary button's focus fill shift
   (white -> cream) is 1.03:1, so the band's controls had no perceivable focus indicator
   (WCAG 2.4.7). White reads 4.6:1 against the band and matches its type. Home carried the
   same defect in its own system (a dead .section--blue override); Matt green-lit that fix
   later the same day, so index.html now carries the matching pair. */
.page__body > .section:has(.cta) a:focus-visible,
.page__body > .section:has(.cta) button:focus-visible { outline-color: #ffffff; }

/* ── Contact reasons (2026-08-31) ──────────────────────────────────────────
   Six distinct audiences funnel into /contact/ (consultation, group sign-up,
   speaking, referrals, curriculum training, fees). Q9: Ashley rejected a form
   as a GATE BEFORE SCHEDULING but asked the consultation to "link to the email
   form" — so a subject-tagged mailto gives her inbox triage with no endpoint,
   no storage and no PHI crossing our server. Phase 3A excludes form endpoints,
   so this is the compliant interim.
   ACTIVATION: when the verified public email lands, swap each .contact-reason__label
   span for <a href="mailto:ADDRESS?subject=..."> and delete .contact-note.
   `> ol` at (0,2,1) clears the base sheet's 68ch `.section__inner > ol` measure. */
.section__inner > ol.contact-reasons { max-width: none; list-style: none; padding-left: 0; }
.contact-reasons > li { margin-top: var(--space-sm); padding-left: 0; }
.contact-reasons > li:first-child { margin-top: 0; }
.contact-reason__label { font-weight: 600; color: var(--t-blue, #294A52); }
.contact-reason__label::after { content: " —"; }
.contact-note { color: #3B625E; font-size: 0.95rem; }

/* ── Contact form (2026-08-31) ─────────────────────────────────────────────
   Phase 3A boundary crossed by Matt's explicit authorization; discovery and the
   data-flow record are in docs/04-architecture/contact-form-discovery.md.
   Lives on a SAND band, so every control is painted on cream for contrast and
   every border clears the 3:1 non-text floor. Error state uses Dark Terracotta
   (4.04:1 on sand) and is ALWAYS paired with text — never colour alone (WCAG 1.4.1).
   Touch targets meet the 44px floor. Honeypot is positioned off-screen, never
   display:none, which bots skip. */
.contact-form { margin-top: var(--space-sm); }
.contact-form .field { margin-top: var(--space-sm); }
.contact-form .field:first-child { margin-top: 0; }

.contact-form label,
.contact-form .field__legend {
  display: block; font-weight: 600; font-size: 1rem; line-height: 1.4;
  color: var(--t-blue); margin-bottom: 0.35rem;
}
.contact-form .field__opt { font-weight: 400; color: var(--t-seaglass-text); }
.contact-form .field__help { font-size: 0.9rem; color: var(--t-seaglass-text); margin: 0 0 0.4rem; }

.contact-form input[type="text"],
.contact-form input[type="email"],
.contact-form input[type="tel"],
.contact-form select,
.contact-form textarea {
  display: block; width: 100%; max-width: 34rem; box-sizing: border-box;
  min-height: 44px; padding: 0.6rem 0.7rem;
  font: inherit; font-size: 1rem; line-height: 1.4; color: var(--t-charcoal);
  background: var(--t-cream); border: 1px solid var(--t-seaglass-dark);
  border-radius: var(--t-radius); appearance: none;
}
.contact-form textarea { min-height: 8rem; resize: vertical; }
.contact-form select { background-image: none; }
/* Highlighted fields turn rust (Matt, 2026-08-31). Dark Terracotta is the only rust that
   clears the 3:1 non-text floor on EVERY ground (4.04 sand / 5.07 cream / 4.14 tint); base
   terracotta is 2.93 on sand and must never touch it. Rings and borders are non-text, so this
   is safe; rust as link TEXT is ground-limited — see the link rule below. */
/* Matt, 2026-08-31: the offset ring plus the thickened border read as a DOUBLE border.
   The field's own border is now the whole focus indicator — it turns rust, and an inset
   1px shadow doubles its apparent weight WITHOUT the reflow a border-width change causes.
   Still WCAG-conformant: the indicator is >=2px effective and clears 3:1 on both sides
   (rust 5.07 on the cream fill, 4.04 on the sand band). The transparent outline is kept
   solely so Windows High Contrast Mode, which discards backgrounds and shadows, still
   paints a focus ring. */
.contact-form :is(input, select, textarea):focus-visible {
  outline: 2px solid transparent; outline-offset: 0;
  border-color: var(--t-terracotta-dark);
  box-shadow: inset 0 0 0 1px var(--t-terracotta-dark);
}
.contact-form .choice input:focus-visible { outline: 2px solid var(--t-terracotta-dark); outline-offset: 2px; }

/* radio + checkbox rows: 44px hit area via padding on the label, not the control */
/* fieldset carries a browser-default border/padding that boxed the radio group
   out of keeping with the other fields — reset it and let the legend behave as a label */
.contact-form fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.contact-form fieldset > legend { padding: 0; }
.contact-form .field__choices { display: flex; flex-wrap: wrap; gap: 0.25rem 1.5rem; }
.contact-form .choice { display: flex; align-items: center; gap: 0.5rem; min-height: 44px; }
.contact-form .choice label { margin: 0; font-weight: 400; color: var(--t-charcoal); }
.contact-form .choice input { width: 1.15rem; height: 1.15rem; accent-color: var(--t-seaglass-dark); flex: none; }
.contact-form .choice--ack { align-items: flex-start; gap: 0.6rem; padding-top: 0.4rem; }
.contact-form .choice--ack label { line-height: 1.5; }

/* Error state. Dark Terracotta is 4.04:1 on sand — fine for the NON-TEXT floor (3:1) it was
   documented for (quote glyph, step numerals, FAQ toggles) but BELOW the 4.5:1 normal-text floor,
   which a ~15px error message needs. Caught by the contrast gate 2026-08-31. So the alarm is split:
   the rust 2px border carries the non-text signal (4.04 ≥ 3), the message text uses Deep Blue
   (7.19:1 on sand), and the words themselves state the problem — colour is never the only cue. */
.contact-form .field__error { margin: 0.35rem 0 0; font-size: 0.95rem; color: var(--t-blue); font-weight: 600; }
.contact-form .field--invalid :is(input, select, textarea) { border-color: var(--t-terracotta-dark); border-width: 2px; }

.contact-form .form-status { margin: 0 0 var(--space-sm); font-weight: 600; color: var(--t-blue); }
.contact-form .form-status:empty { display: none; }
/* Status hues, all AA-safe text tokens (terracotta fails as text on sand, so errors stay Deep Blue,
   matching .field__error); the wording is the primary cue, colour is secondary. */
.contact-form .form-status--success { color: var(--t-seaglass-text); }
.contact-form .form-status--error { color: var(--t-blue); }
.contact-form .form-status--pending { color: var(--t-seaglass-text); font-weight: 500; }
.contact-form .cf-turnstile-field { margin-top: var(--space-sm); }
.contact-form .form-noscript { margin: var(--space-sm) 0 0; color: var(--t-blue); font-weight: 600; }

/* honeypot: off-screen, NOT display:none (bots skip display:none and beat the trap) */
.contact-form .hp-field { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.contact-form .form-actions { margin-top: var(--space-sm); }
.contact-form button[type="submit"] { min-height: 44px; }
.contact-form button[type="submit"][disabled] { opacity: 0.55; cursor: not-allowed; }

@media (min-width: 40rem) {
  .contact-form .field-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-sm); }
  .contact-form .field-row > .field { margin-top: 0; }
  .contact-form .field-row :is(input, select) { max-width: none; }
}

/* Direct-contact card (Other ways to reach Ashley) */
.contact-card { margin-top: var(--space-sm); }
.contact-card__list { list-style: none; padding-left: 0; margin: 0; }
.contact-card__list > li { margin-top: 0.55rem; }
.contact-card__list > li:first-child { margin-top: 0; }
.contact-card__label { font-weight: 600; color: var(--t-blue); }
.contact-card__label::after { content: " —"; }
.contact-card__pending { color: var(--t-seaglass-text); font-style: italic; }

/* ── Connect block: direct details 1/3 left, form 2/3 right (2026-08-31) ────
   Matt's layout direction from a prior BN project, mirrored — contact details on
   the LEFT, form on the RIGHT. Grid replaces normal flow, so it RESTATES the 16px
   content rhythm and assigns columns explicitly (interior-standard §3 grid caution).
   Stacks in source order below 52rem: details first, then the form. */
.connect { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--space-lg, 2.5rem); margin-top: var(--space-sm); }
.connect > * + * { margin-top: 0; }
/* Reflow (2026-10-20 audit U1): the stacked track was a bare 1fr, so its automatic minimum let
   the longest unbreakable item (the email address at 200% text; Turnstile's 300px widget at a
   320px screen) widen both columns past the screen. The tracks and columns now shrink, and a word
   longer than the column (the address) breaks only when it must. theme.js asks Turnstile for its
   compact size where the column is narrower than the normal widget. */
.connect__col { min-width: 0; overflow-wrap: break-word; }
@media (min-width: 52rem) {
  .connect { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 3rem; align-items: start; }
}
/* Left column (lockup + licences + direct contact) stays in view while the form scrolls.
   Gated to >=66rem to match the sticky+condensed header rule above (below that the header is
   not sticky and the nav is the disclosure menu); top = the 120px condensed-header clearance. */
@media (min-width: 66rem) {
  .connect__direct { position: sticky; top: 7.5rem; align-self: start; }
}
.connect__col > * + * { margin-top: var(--space-sm); }
.connect__title {
  font-family: "Newsreader", Georgia, serif; font-weight: 500;
  font-size: clamp(1.5rem, 2.2vw, 1.9rem); line-height: 1.25;
  color: var(--t-blue); margin: 0 0 var(--space-sm);
}

/* left column */
.connect__direct .contact-card__list > li { margin-top: 0.9rem; }
.connect__direct .contact-card__label { display: block; font-size: 0.95rem; font-weight: 700;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--t-seaglass-text); margin-bottom: 0.2rem; }
.connect__direct .contact-card__label::after { content: none; }
/* The left column is narrow (~304px), so the inline "CA · NV" license line breaks
   mid-number. Stack the two licenses on their own lines and drop the decorative middot. */
.connect__direct .licensing-disclosure__numbers > span { display: block; }
.connect__direct .licensing-disclosure__numbers > span[aria-hidden="true"] { display: none; }
/* The Client Notices link follows the stacked numbers on its own line; give it a little space. */
.connect__direct .licensing-disclosure a { display: inline-block; margin-top: 0.45rem; }
.connect__wordmark { margin-top: 0; }
/* the header lockup, scaled up — base .brand-specimen is inline-flex column */
.connect__wordmark .brand-specimen__name { font-size: clamp(1.6rem, 2.6vw, 2.05rem); }
.connect__wordmark .brand-specimen__practice { font-size: clamp(0.69rem, 1.12vw, 0.88rem); margin-bottom: 0.5rem; }
.connect__wordmark .brand-specimen__credential { margin-top: 0.3rem; text-align: center; }
.connect__licences { font-size: 0.9rem; color: var(--t-seaglass-text); margin-top: var(--space-sm); }
/* Definitive break between the identity/credentials block and the contact block.
   Only the "Reach Ashley directly" title that directly follows the licences is affected;
   the right column's "Send an inquiry" title keeps its normal rhythm. */
.connect__licences + .connect__title { margin-top: var(--space-xl); margin-bottom: 0.4rem; }
/* Keep that title tight to its intro sentence so the two read as one unit. */
.connect__licences + .connect__title + p { margin-top: 0.4rem; }

/* form column: grouped like the reference (YOUR DETAILS / YOUR MESSAGE) */
.field-group { margin-top: var(--space-lg, 2.5rem); }
.field-group:first-of-type { margin-top: var(--space-sm); }
.field-group__label {
  font-size: 0.875rem; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--t-seaglass-text); margin: 0 0 0.75rem; padding-bottom: 0.5rem;
  border-bottom: 1px solid rgba(41, 74, 82, 0.18);
}
.form-required-note { font-size: 0.9rem; color: var(--t-seaglass-text); margin: 0; }
/* Required marks in Deep Blue (2026-10-20 audit U6): Dark Terracotta measured 4.04:1 on the sand
   band, under the 4.5:1 a small text symbol needs; Deep Blue is 7.19:1. The rust stays on the
   invalid border, where the 3:1 non-text floor applies. */
.req { color: var(--t-blue); font-weight: 700; }


/* ── Rust link interaction (2026-08-31; grounds declared by custom property 2026-09-24) ─────
   Matt: highlighted fields and links turn rust. Measured constraint: Dark Terracotta
   is 5.07 on cream (clears the 4.5 TEXT floor) but only 4.04 on sand, 4.14 on tint,
   1.15 on the Dark Sea Glass closing band and 1.78 on Deep Blue. So the treatment is
   ground-aware, matching the card-ring precedent:
     · cream ground  → the link text itself goes rust
     · sand / tint   → text stays compliant, the UNDERLINE carries the rust (non-text, 4.04 ≥ 3)
     · dark grounds  → text and underline stay white (rust fails even as a non-text cue there)
   Each non-cream surface declares its links' hover ink in two inherited custom properties,
   so a link anywhere inside it follows its ground with no specificity contest. The earlier
   per-surface overrides (0,2,1 on the hero) lost to this rule's 0,5,1, and sand panels inside
   plain sections, the legal pages' alternating sand, the editorial notes, the Resources
   groups, the closing band and video facades were never covered: 162 links failed on hover or
   focus in the 2026-09-24 site audit. A new sand, tint or dark surface that holds links
   declares its ink below. Interior pages only; Home has its own stylesheet. */
.page__body a:not(.button):not(.card__link):not(.arrow-link):hover,
.page__body a:not(.button):not(.card__link):not(.arrow-link):focus-visible {
  color: var(--link-hover-ink, var(--t-terracotta-dark));
  text-decoration-color: var(--link-hover-rule, var(--t-terracotta-dark));
  text-decoration-thickness: 2px;
}
/* Section grounds mirror the chapter-banding rules exactly (same selectors, specificity and
   order), so the ink always follows the colour the section actually paints: even sections
   sand, --plain back to cream, --band sand, the section before the closing band forced cream
   (0,4,0, which beats an even or --band section as its background rule does), and the
   closing band last and dark. */
.page__body > .section:nth-of-type(even) { --link-hover-ink: var(--t-blue); }
.page__body > .section.section--plain { --link-hover-ink: initial; }
.page__body > .section.section--band { --link-hover-ink: var(--t-blue); }
.page__body:has(.cta) > .section:nth-last-of-type(2) { --link-hover-ink: initial; }
.page__body > .section:has(.cta) { --link-hover-ink: #ffffff; --link-hover-rule: #ffffff; }
/* Sand and tint panels, on whatever section they sit in. */
.page-hero,
.section--plain .card,
.resource-group,
.editorial-note,
.article__body blockquote { --link-hover-ink: var(--t-blue); }
/* Links that paint their own dark ground. */
.video-embed__link { --link-hover-ink: #ffffff; --link-hover-rule: #ffffff; }

/* Quiet hover (2026-09-01): every body link eases its colour, underline colour and underline
   thickness over 160ms; buttons keep their own five-property transition. */
.page__body a:not(.button) { transition: color var(--t-hover-duration) var(--motion-easing-standard), text-decoration-color var(--t-hover-duration) var(--motion-easing-standard), text-decoration-thickness var(--t-hover-duration) var(--motion-easing-standard); }

/* Connect: centred heading + intro, columns stay left-aligned */
#contact-connect > .section__inner > .section__heading,
#contact-connect > .section__inner > p { text-align: center; }
#contact-connect > .section__inner > p { max-width: 46rem; margin-inline: auto; }

/* Ashley's closing sign-off reads as a signature, not fine print: +6px over the
   default 14px cite size (Matt, 2026-09-08). Scoped to the contact greeting quote. */
#contact-greeting .prose-quote__cite { font-size: calc(var(--type-small) + 6px); }

/* --- Fees & Insurance (2026-09-01): rate rows and reimbursement steps ------------------ */
/* Rate list: one row per service on the sand band. Her label is an h3 (heading structure for
   scanning and for search), an optional note sits beneath it, and the price stands on the
   right in Newsreader at a statement size with tabular numerals. Ink hairlines between rows
   (rules contrast against their own ground: ink on sand, per the Home doctrine). Capped at
   48rem so label and price stay close enough to read as one line; stacks below 40rem. */
.rate-list { list-style: none; margin: 0; padding: 0; }
.section__inner > ul.rate-list { max-width: 48rem; } /* (0,2,1): beats the base sheet's 68ch `.section__inner > ul` */
.rate-list__row { display: flex; align-items: baseline; justify-content: space-between; gap: 0.5rem 2rem; padding: 0.9rem 0; margin: 0; border-top: 1px solid rgba(41, 74, 82, 0.16); }
.rate-list > li + li { margin-top: 0; } /* the row padding is the rhythm; neutralise the base sheet's li + li spacing */
.rate-list__row:last-child { border-bottom: 1px solid rgba(41, 74, 82, 0.16); }
.rate-list__label { min-width: 0; }
.rate-list__label h3 { margin: 0; font-size: 1.25rem; line-height: 1.3; }
.rate-list__note { margin: 0.2rem 0 0; font-size: 0.95rem; color: var(--t-seaglass-text); } /* 5.10:1 on sand */
.rate-list__price { margin: 0; font-family: "Newsreader", Georgia, serif; font-weight: 500; font-size: 1.75rem; line-height: 1.1; color: var(--t-blue); font-variant-numeric: tabular-nums; white-space: nowrap; } /* 7.19:1 on sand */
@media (max-width: 39.999rem) {
  .rate-list__row { flex-direction: column; align-items: flex-start; gap: 0.25rem; }
}
/* Reimbursement steps: a numbered list with the Dark Terracotta leading-zero numeral the Home
   steps use (5.07:1 on cream); no cards, no icons. */
.steps-list { list-style: none; counter-reset: step; margin: 0; padding: 0; }
.section__inner > ol.steps-list { max-width: 48rem; }
.steps-list > li { position: relative; padding-left: 3.25rem; counter-increment: step; margin: 0; }
.steps-list > li + li { margin-top: var(--space-sm, 1rem); }
.steps-list > li::before { content: counter(step, decimal-leading-zero); position: absolute; left: 0; top: 0.35rem; font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; font-weight: 600; font-size: 0.95rem; line-height: 1; letter-spacing: 0.06em; color: var(--t-terracotta-dark); }
.steps-list h3 { margin: 0 0 0.25rem; font-size: 1.25rem; line-height: 1.3; }
.steps-list p { margin: 0; }
/* A prose-quote directly after an h3 (Fees: "Why out-of-network") gets the 16px content rhythm the
   section gives its other children; both elements otherwise carry 0 margin at that seam. */
.section__inner > h3 + .prose-quote { margin-top: var(--space-sm, 1rem); }

/* Quiet hover (2026-09-01; 2026-10-19 matches Home): footer links ease their underline in, not a colour shift. */
.site-footer a { transition: text-decoration-color var(--t-hover-duration) var(--motion-easing-standard); }

/* --- Motion layer (Matt, 2026-09-01): scroll reveals and the hero entrance -------------
   The Home motion layer, carried to every interior page so anything built to this standard
   inherits it (interior-page-standard.md §9). theme.js tags reveal targets below the fold
   with data-reveal; the hidden state exists only under that attribute, so nothing is hidden
   without JavaScript and nothing already in view moves. Desktop only (NN/g: avoid scroll
   fading on mobile) and only when motion is welcome; the base sheet's reduced-motion rule
   zeroes every animation and transition anyway. Opacity and transform only: no layout, no
   CLS. --reveal-delay is set per batch by theme.js: an element scrolling in alone appears at
   once; a row arriving together fans out 80ms apart, capped at 400ms. */
@media (prefers-reduced-motion: no-preference) and (min-width: 769px) {
  [data-reveal] { opacity: 0; transform: translateY(var(--t-reveal-distance)); }
  [data-reveal].is-revealed {
    opacity: 1;
    transform: none;
    /* box-shadow rides along: this (0,2,0) rule replaces a revealed card's own transition
       list, which would otherwise leave its hover ring snapping (learned on Home). Same
       200ms the base sheet gives every card. */
    transition: opacity var(--t-reveal-duration) var(--t-motion-ease-out) var(--reveal-delay, 0ms),
                transform var(--t-reveal-duration) var(--t-motion-ease-out) var(--reveal-delay, 0ms),
                box-shadow var(--t-hover-duration) var(--motion-easing-standard);
  }
  /* The base sheet's 200ms card shadow transition joins the softened hover duration. */
  .card { transition: box-shadow var(--t-hover-duration) var(--motion-easing-standard); }
  /* Hero entrance in beats (eyebrow, title, chips, image card) — Home's idiom — replacing the
     base sheet's one-beat 420ms settle of the whole band, so the ring crescents no longer fade
     in with the copy. Same specificity, later in the cascade. */
  .page-hero { animation: none; }
  .page-hero__text > *, .page-hero__media { animation: t-hero-settle 800ms var(--t-motion-ease-out) both; } /* 560 -> 800, beats 80 -> 110 (softening, 2026-09-01 evening) */
  .page-hero__text > :nth-child(2) { animation-delay: 110ms; }
  .page-hero__text > :nth-child(3) { animation-delay: 220ms; }
  .page-hero__media { animation-delay: 330ms; }
  @keyframes t-hero-settle {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: none; }
  }
}

/* --- Page fade (Matt, 2026-09-01) ------------------------------------------------------------
   Cross-document view transition: Chrome/Edge 126+ and Safari 18.2+ cross-fade between pages;
   every other browser navigates exactly as before. Home's embedded sheet carries the same opt-in
   (both documents must declare it). Off under reduced motion. Part of the Home motion layer
   adopted the same day; the interior pages take no scroll reveals — only this fade. */
@view-transition { navigation: auto; }
::view-transition-old(root) { animation-duration: 220ms; }
::view-transition-new(root) { animation-duration: 320ms; }
/* The header keeps its place while the page cross-fades beneath it (2026-09-01 evening): a named
   element is matched across the two documents, so the chrome reads as fixed and only the content
   changes. Home's sheet names its header identically. */
.site-header { view-transition-name: site-header; }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*), ::view-transition-old(*), ::view-transition-new(*) { animation: none !important; }
}

/* --- Articles (Wave 0, 2026-09-02) ----------------------------------------------------
   The legacy Blog's successor, generated from src/content/articles/ by build-articles
   (articles-migration-plan.md). Cards are the site's pathway cards; the pieces below are
   the few article-specific parts: the meta line under an article title, the topic label
   and date line on a card, the topic jump chips in the index hero, the topic eyebrow with
   its line icon, the dated editorial note that sits OUTSIDE a verbatim body, the body's
   own figures/tables/quotes, and the compact dated archive list. Body copy stays on the
   site's 18px DM Sans scale and the site's default 68ch prose measure (Matt, 2026-09-02:
   whatever is closest to what the site has). */
/* Byline under an article title. Named .article-byline, NOT .article-meta: the base sheet
   owns .article-meta as a padded grid box (the Phase 3A.3 component) and would break the
   line into indented rows. */
.article-byline {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.95rem;
  line-height: 1.5;
  color: var(--t-seaglass-text);
  margin: 1rem 0 0;
}
.article-byline time { font-variant-numeric: tabular-nums; }
.article-card__topic {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  margin: 0 0 0.6rem;
}
.article-card__meta {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.85rem;
  color: var(--t-seaglass-text);
  margin: 0.75rem 0 0;
}
.article-card__meta time { font-variant-numeric: tabular-nums; }
/* Browse-by-topic index (Matt, 2026-09-02): the topic navigation left the hero, where it
   wore the trust-chip surface and so looked like the facts on the therapy pages. Pills stay
   facts everywhere; navigation reads as navigation — Deep Blue links with the topic's rust
   line icon (the same icon its section eyebrow carries) and a count, underline on hover via
   the site's rust link rule. A row on desktop, a short list on phones. */
.topic-index { margin: 0; }
/* A breath between the intro copy and the index, and a title that reads as a title (Matt,
   2026-09-02: "a bit of separation… make it stand out slightly more"): twice the content
   rhythm above the block, and the label in the card-title role — DM Sans 600, Deep Blue,
   sentence case — instead of the small sea-glass eyebrow. (0,2,0) outranks the (0,1,0)
   `.section__inner > * + *` rhythm rule; a recorded exception, not a new default. */
.section__inner > .topic-index { margin-top: 2rem; }
/* With Ashley's author photo beside the Articles intro (2026-10-14), the index keeps its full
   width: it spans both columns and is placed after the photo's row span, so it starts below
   whichever is taller, the intro text or the photo. (0,2,0) outranks `.section__inner--with-media > *`. */
.section__inner--with-media > .topic-index { grid-column: 1 / -1; }
.topic-index__title {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1.125rem;
  line-height: 1.3;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  color: var(--t-blue);
  margin: 0 0 0.9rem;
}
/* "View all" shortcut (Matt, 2026-09-02, revised the same day on his UX question): a text
   link in the topic-link typography — no icon, no count, an arrow cue — left-aligned under
   the list with a touch more air than the row gap, so it reads as the coda of the index:
   not a seventh topic, and not a button (buttons stay for actions: book, contact, buy). Home's
   .arrow-link treatment, ported for interior pages. The same order at every width. */
.arrow-link { font-weight: 600; text-decoration: none; color: var(--t-blue); transition: color var(--t-hover-duration) var(--motion-easing-standard); }
.arrow-link::after { content: " \2192"; }
.arrow-link:hover, .arrow-link:focus-visible { color: var(--t-terracotta-dark); }
.topic-index__all { margin: 1.25rem 0 0; font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; font-size: 1.05rem; line-height: 1.3; }
.topic-index__list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.75rem 2.25rem; }
.topic-index__list li { margin: 0; max-width: 100%; } /* max-width and the label's min-width (2026-10-20): at 200% text on a phone the labels and counts ran past the screen */
.topic-index__link {
  display: inline-flex;
  max-width: 100%;
  align-items: center;
  gap: 0.55rem;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1.05rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--t-blue);
  text-decoration: underline;
  text-decoration-color: transparent;
  text-underline-offset: 4px;
  transition: color var(--t-hover-duration) var(--motion-easing-standard), text-decoration-color var(--t-hover-duration) var(--motion-easing-standard);
}
.topic-index__link .path-icon { width: 1.35rem; height: 1.35rem; margin: 0; flex: none; }
.topic-index__label { min-width: 0; }
.topic-index__count {
  font-size: 0.85rem;
  font-weight: 500;
  color: var(--t-seaglass-text);
  font-variant-numeric: tabular-nums;
}
@media (max-width: 47.999rem) { .topic-index__list { flex-direction: column; gap: 0.7rem; } }
/* Topic eyebrow: the section label carries its topic's rust line icon, as the cards do. */
.topic-eyebrow { display: flex; align-items: center; gap: 0.55rem; }
.topic-eyebrow .path-icon { width: 1.35rem; height: 1.35rem; margin: 0; flex: none; }
.topic-eyebrow > :not(.path-icon) { min-width: 0; } /* 2026-10-20: with 200% text the topic name could not shrink beside its icon and ran past a phone screen */
/* Editorial note (fidelity policy §2): visibly and semantically separate from the body
   it precedes — a sand panel with a dated label, never inside .article__body. */
.editorial-note {
  max-width: var(--measure-narrow);
  background: var(--t-sand);
  border-radius: var(--t-radius);
  padding: 1.1rem 1.35rem 1.15rem;
}
.editorial-note__label {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--t-seaglass-text);
  margin: 0 0 0.45rem;
}
.editorial-note p { font-size: 0.98rem; line-height: 1.55; margin: 0; }
.editorial-note p + p { margin-top: 0.55rem; }
/* The verbatim body: only the structural niceties the legacy markup lacked. */
/* Legacy URLs and adjacent hashtags must remain readable within the prose column.
   Allow wrapping without changing Ashley's preserved wording or link destinations. */
.article__body { overflow-wrap: anywhere; }
.article__body img { max-width: 100%; height: auto; border-radius: var(--t-radius); display: block; }
.article__body figure { margin-left: 0; margin-right: 0; margin-bottom: 0; } /* top margin stays with the base sheet's flow rule (fixed 2026-09-02: `margin: 0` here beat it and left figures flush against the paragraph above) */
.article__body figcaption { font-size: 0.875rem; color: var(--t-seaglass-text); margin-top: 0.5rem; }
.article__body blockquote {
  margin: 0;
  padding: 1rem 1.35rem;
  background: var(--t-sand);
  border-radius: var(--t-radius);
  font-family: "Newsreader", Georgia, serif;
  font-style: italic;
  color: var(--t-blue);
}
.article__body table { border-collapse: collapse; width: 100%; font-size: 0.96rem; }
.article__body th, .article__body td { padding: 0.5rem 0.65rem; vertical-align: top; text-align: left; border-bottom: 1px solid rgba(41, 74, 82, 0.14); }
.article__body th { font-weight: 600; color: var(--t-blue); }
/* Ashley's review sheet (2026-10-14). Quotations in the bold teal serif she liked where a quote
   was set as a heading (posts 29, 31), at reading size and with no panel (posts 32, 37). */
.article__body blockquote.article__quote {
  margin: 1.5rem 0 0; /* the generic blockquote reset above zeroes the flow rhythm */
  padding: 0;
  background: none;
  border-radius: 0;
  font-style: normal;
  font-weight: 500;
  font-size: 1.3rem;
  line-height: 1.55;
  color: var(--t-blue);
}
.article__body .article__quote p { font-family: "Newsreader", Georgia, serif; font-size: inherit; line-height: inherit; } /* the base sheet sets p's family and size directly */
.article__body .article__quote > p + p { margin-top: 1rem; }
.article__body .article__quote .article__quote-cite { font-family: "DM Sans", system-ui, sans-serif; font-size: 0.95rem; font-weight: 400; line-height: 1.6; color: var(--t-seaglass-text); }
.article__body .article__citation { margin-top: 2rem; font-size: 0.9rem; }
/* Her worksheet table (post 4): an empty tick box in each Yes/No cell, as on the printed handout. */
.article__body .article__table { overflow-x: auto; }
.article__body .article__checklist th:not(:first-child), .article__body .article__checklist .article__tick { width: 3.5rem; text-align: center; }
.article__body .article__tick::before { content: ""; display: inline-block; width: 1.1rem; height: 1.1rem; border: 1.5px solid var(--t-seaglass-dark); border-radius: 4px; vertical-align: middle; }
/* An interview with every line in bold (post 51): numbered questions, answers inset in regular weight.
   The body alternates question/answer paragraphs; the closing paragraph is the source link. */
.article__body--qa { counter-reset: qa; }
.article__body--qa > p:nth-of-type(odd):not(:last-of-type) { counter-increment: qa; position: relative; padding-left: 2.25rem; margin-top: 2rem; }
.article__body--qa > p:nth-of-type(odd):not(:last-of-type)::before { content: counter(qa) "."; position: absolute; left: 0; top: -0.1em; font-family: "Newsreader", Georgia, serif; font-weight: 500; font-size: 1.25rem; color: var(--t-blue); }
.article__body--qa > p:nth-of-type(even) { margin-left: 2.25rem; padding: 0.9rem 1.15rem; background: color-mix(in srgb, var(--t-seaglass-tint) 45%, transparent); border-radius: var(--t-radius); }
.article__body--qa > p:nth-of-type(even) strong { font-weight: inherit; }
@media (max-width: 40rem) {
  .article__body--qa > p:nth-of-type(even) { margin-left: 0; }
}
/* A book announcement (post 46): the back-cover text inset and centred, the cover smaller at the end. */
.article__body .article__blurb { margin-top: 2rem; padding: clamp(1.25rem, 3vw, 2rem) clamp(1.1rem, 4vw, 2.5rem); background: var(--t-sand); border-radius: var(--t-radius); text-align: center; }
.article__body .article__blurb > p { max-width: 36rem; margin-left: auto; margin-right: auto; }
.article__body .article__blurb > p + p { margin-top: 0.85rem; }
.article__body .article__blurb > p:first-child strong { font-family: "Newsreader", Georgia, serif; font-weight: 500; font-size: 1.5rem; color: var(--t-blue); }
.article__body .article__figure.article__figure--cover { max-width: 15rem; margin-left: auto; margin-right: auto; } /* 0,3,0: beats the later figure margin reset */
.article-next { font-size: 1.05rem; }
/* Compact dated archive list, grouped by year; whitespace separates rows (no line devices). */
.archive-list, .archive-list__items { list-style: none; margin: 0; padding: 0; }
.archive-list__year { margin: 0; }
.archive-list__year + .archive-list__year { margin-top: 1.25rem; }
.archive-list__heading {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem;
  font-weight: 600;
  color: var(--t-blue);
  margin: 0 0 0.35rem;
}
.archive-list__items li { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.15rem 0.9rem; margin: 0; padding: 0.4rem 0; }
.archive-list__items time { font-size: 0.875rem; color: var(--t-seaglass-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
/* "View all" tool (Matt, 2026-09-02): the complete list with sort and topic controls. The
   list is server-rendered newest first (complete without JavaScript); theme.js reveals the
   controls and reorders or narrows the rows in place. Two columns of rows on desktop, one in
   the disclosure band; whitespace separates rows. */
.articles-controls {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 0.75rem 1.5rem;
  margin: 0;
}
.articles-controls__field {
  display: inline-flex;
  flex-direction: column;
  flex: 1 1 14rem; /* two fields share a desktop row; each takes the full width of a phone column */
  min-width: 0;
  max-width: 100%;
  gap: 0.35rem;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--t-seaglass-text);
}
.articles-controls select {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem;
  color: var(--t-blue);
  background: #ffffff;
  border: 1px solid var(--t-seaglass-dark);
  border-radius: var(--t-radius);
  padding: 0.5rem 2.2rem 0.5rem 0.8rem;
  width: 100%;
  min-width: 0; /* the longest topic option would otherwise size the select past a phone column */
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%234F7C78' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 0.85rem center;
  background-size: 0.7rem;
  transition: border-color var(--t-hover-duration) var(--motion-easing-standard), box-shadow var(--t-hover-duration) var(--motion-easing-standard);
}
.articles-controls select:hover { border-color: var(--t-blue); }
.articles-controls select:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 2px; }
.articles-controls { max-width: 40rem; }
.articles-controls__status {
  flex-basis: 100%;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.875rem;
  color: var(--t-seaglass-text);
  margin: 0;
}
/* Keyword search (Matt, 2026-10-17): one full-width row above the two selects, in the same box
   as a select (white fill, Sea Glass border, 9px corners, Deep Blue text, same padding and
   focus ring), with a clear button inside its right end that theme.js shows only while there
   is text. The browser's own search decorations are removed so there is one clear control.
   When nothing matches, the status line steps up to the form's message weight (the
   contact form's .field__error pattern: wording first, colour second). */
.articles-controls__field--search { flex-basis: 100%; }
.articles-controls__field--search label { cursor: default; }
.articles-controls__searchbox { position: relative; }
.articles-controls input[type="search"] {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem;
  font-weight: 400;
  letter-spacing: normal;
  color: var(--t-blue);
  background: #ffffff;
  border: 1px solid var(--t-seaglass-dark);
  border-radius: var(--t-radius);
  padding: 0.5rem 2.9rem 0.5rem 0.8rem;
  width: 100%;
  min-width: 0;
  box-sizing: border-box;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color var(--t-hover-duration) var(--motion-easing-standard), box-shadow var(--t-hover-duration) var(--motion-easing-standard);
}
.articles-controls input[type="search"]::-webkit-search-decoration,
.articles-controls input[type="search"]::-webkit-search-cancel-button,
.articles-controls input[type="search"]::-webkit-search-results-button,
.articles-controls input[type="search"]::-webkit-search-results-decoration { -webkit-appearance: none; appearance: none; display: none; }
.articles-controls input[type="search"]::placeholder { color: var(--t-seaglass-text); opacity: 1; }
.articles-controls input[type="search"]:hover { border-color: var(--t-blue); }
.articles-controls input[type="search"]:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 2px; }
.articles-controls__clear {
  position: absolute;
  top: 50%;
  right: 0.3rem;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.25rem;
  height: 2.25rem;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: var(--t-radius);
  background: transparent;
  color: var(--t-seaglass-dark);
  cursor: pointer;
  transition: color var(--t-hover-duration) var(--motion-easing-standard), background-color var(--t-hover-duration) var(--motion-easing-standard);
}
.articles-controls__clear[hidden] { display: none; }
.articles-controls__clear:hover { color: var(--t-blue); background: var(--t-seaglass-tint); }
.articles-controls__clear:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 0; }
.articles-controls__clear svg { width: 0.85rem; height: 0.85rem; }
.articles-controls__status--empty { font-size: 1rem; font-weight: 600; color: var(--t-blue); }
.section__inner > ul.all-articles { max-width: none; } /* (0,2,1): un-cap the 68ch prose measure like the card grids */
.all-articles { list-style: none; margin: 0; padding: 0; columns: 2; column-gap: 3rem; }
@media (max-width: 47.999rem) { .all-articles { columns: 1; } }
.all-articles > li { break-inside: avoid; margin: 0; padding: 0.55rem 0; }
.all-articles > li[hidden] { display: none; }
.all-articles__title {
  display: block;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1.05rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--t-blue);
  text-decoration: underline;
  text-decoration-color: transparent;
  text-underline-offset: 3px;
  transition: color var(--t-hover-duration) var(--motion-easing-standard), text-decoration-color var(--t-hover-duration) var(--motion-easing-standard);
}
.all-articles__title:hover, .all-articles__title:focus-visible { color: var(--t-seaglass-text); text-decoration-color: currentColor; }
.all-articles__meta {
  display: block;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.85rem;
  color: var(--t-seaglass-text);
  margin-top: 0.2rem;
}
.all-articles__meta time { font-variant-numeric: tabular-nums; }
/* Legacy media carried over (Matt, 2026-09-02): article figures with intrinsic sizes, the
   click-to-play video facade, and the listening-links card. The facade shows a still (or a
   Deep Blue ground) with a play button in the video's place; theme.js swaps in the
   privacy-enhanced YouTube player on click, so nothing from Google loads until the visitor
   chooses to watch; without JavaScript it is a link to the video. */
/* Only the side and bottom margins are zeroed: the base sheet's `.article__body > * + *`
   flow rule (same 0,1,0 specificity, earlier in the cascade) must keep supplying the 16px
   content rhythm above each figure, facade and card. `margin: 0` here won that fight and
   left the media flush against the paragraph above (found in the 2026-09-02 captures). */
.article__body .article__figure, .article__body .video-embed, .article__body .listen-card { margin-left: 0; margin-right: 0; margin-bottom: 0; }
.article__body .article__figure img { max-width: 100%; height: auto; } /* the width/height attributes reserve the space before the lazy image loads; a CSS width:auto would throw that away */
.video-embed__link {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  background: var(--t-blue);
  border-radius: var(--t-radius);
  overflow: hidden;
  color: #ffffff;
  text-decoration: none;
  box-shadow: var(--shadow-low);
}
.video-embed__poster { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
/* With a still behind it, a soft Deep-Blue scrim over the lower third keeps the label legible
   (white on the darkest part of the gradient clears 4.5:1); the play button and label sit above it. */
.video-embed--poster .video-embed__link::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 48%; background: linear-gradient(to top, rgba(14, 32, 36, 0.78), rgba(14, 32, 36, 0)); z-index: 0; }
.video-embed__play, .video-embed__label { z-index: 1; }
.video-embed__play {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 4.75rem;
  height: 4.75rem;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.94);
  color: var(--t-blue);
  display: grid;
  place-items: center;
  box-shadow: 0 6px 18px rgba(14, 32, 36, 0.28);
  transition: background var(--t-hover-duration) var(--motion-easing-standard), transform var(--t-hover-duration) var(--motion-easing-standard);
}
.video-embed__play svg { width: 2rem; height: 2rem; fill: currentColor; margin-left: 0.2rem; }
.video-embed__link:hover .video-embed__play, .video-embed__link:focus-visible .video-embed__play { background: #ffffff; transform: translate(-50%, -50%) scale(1.05); }
.video-embed__link:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 3px; }
.video-embed__label {
  position: absolute;
  left: 1.1rem;
  right: 1.1rem;
  bottom: 1rem;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.35;
  color: #ffffff;
  text-shadow: 0 1px 2px rgba(14, 32, 36, 0.45);
}
.video-embed__hint { display: block; font-size: 0.85rem; font-weight: 500; opacity: 0.9; }
.video-embed iframe { display: block; width: 100%; aspect-ratio: 16 / 9; border: 0; border-radius: var(--t-radius); background: #000; }
/* Phones: a 16:9 frame is too short for the centred play disc and a three- to five-line label.
   Measured 2026-09-24: from 430px down, one to five label lines ran across the white disc
   (white on white, about 1:1), and up to 540px the top line sat on the thin end of the scrim.
   So below 40rem the label moves under the still, onto the link's own Deep Blue (9.56:1), and
   the disc centres on the still alone. The top padding reserves the 16:9 stage (a percentage
   padding is a share of the width), and so does the disc's margin: an absolutely placed box's
   percentage margin is also a share of the width, so 28.125% (9/32) puts its centre at the
   middle of the stage and the shared translate/scale hover transform still applies. On click
   the player replaces the whole link at 16:9, so the caption band goes with it. */
@media (max-width: 39.999rem) {
  .video-embed__link { aspect-ratio: auto; padding-top: 56.25%; }
  .video-embed .video-embed__poster { bottom: auto; height: auto; aspect-ratio: 16 / 9; border-radius: 0; } /* the link's own rounded clip shapes the outer corners; the still meets the caption band square (0,2,0 beats .article__body img) */
  .video-embed--poster .video-embed__link::after { display: none; }
  .video-embed__play { top: 0; margin-top: 28.125%; }
  .video-embed__label { position: static; display: block; padding: 0.75rem 1.1rem 0.9rem; text-shadow: none; }
}
.listen-card {
  background: var(--t-sand);
  border-radius: var(--t-radius);
  padding: 1.1rem 1.35rem 1.2rem;
  max-width: var(--measure-default);
}
.listen-card__title {
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--t-blue);
  margin: 0 0 0.7rem;
}
.listen-card__list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.6rem; }
.listen-card__list li { margin: 0; }
.listen-card__link {
  display: inline-block;
  font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--t-blue);
  background: #ffffff;
  border: 1px solid rgba(41, 74, 82, 0.35);
  border-radius: var(--t-radius);
  padding: 0.5rem 0.95rem;
  text-decoration: none;
  transition: border-color var(--t-hover-duration) var(--motion-easing-standard), color var(--t-hover-duration) var(--motion-easing-standard);
}
.listen-card__link:hover, .listen-card__link:focus-visible { border-color: var(--t-blue); color: var(--t-blue); text-decoration: underline; text-underline-offset: 3px; }

/* --- Emotional Energy Centers invitation (Matt, 2026-09-11) --------------------------------
   The entry card on Trauma & EMDR (Home carries the same component in its own sheet): the
   full-figure preview illustration on a cream card beside a short invitation and the secondary
   button that opens /therapy/trauma-emdr/explore/. Sits in a --plain section, so the cream
   card needs the sand-on-cream treatment of the page's other objects: a sand surface. */
.emdr-invite { display: grid; grid-template-columns: minmax(9rem, 11rem) minmax(0, 1fr); column-gap: clamp(1.5rem, 4vw, 3.5rem); align-items: center; }
.emdr-invite__figure { margin: 0; background: var(--t-sand); border-radius: var(--t-radius); padding: 1.1rem 1.4rem; box-shadow: var(--shadow-low); }
.emdr-invite__figure img { display: block; width: 100%; height: auto; border-radius: 0; box-shadow: none; }
.emdr-invite__text > * + * { margin-top: var(--space-sm, 1rem); }
.emdr-invite__text > p { max-width: 68ch; }
.emdr-invite__action { margin-top: 1.25rem; }
@media (max-width: 700px) { .emdr-invite { grid-template-columns: minmax(0, 1fr); row-gap: 1.5rem; } .emdr-invite__figure { max-width: 9rem; } }

/* --- The novel's extras pages (2026-10-19): book club questions, recipes, reading list -------
   Built from existing parts (plain hero, sections, editorial note, split list, cards); these
   rules add only what those pages need that the site lacked. */
/* Book club questions: a numbered list with room to read aloud or print. Terracotta-dark
   numerals on the cream ground (5.07:1). */
.question-list__intro { margin-top: 1.75rem; }
.section__inner > ol.question-list { list-style: none; counter-reset: question; margin: 1.25rem 0 0; padding: 0; max-width: var(--measure-default, 68ch); }
.question-list > li { counter-increment: question; position: relative; padding-left: 2.75rem; margin: 0 0 1.35rem; }
.question-list > li::before { content: counter(question); position: absolute; left: 0; top: 0; width: 2rem; text-align: right; font-family: "Vidaloka", Georgia, serif; font-size: 1.3rem; line-height: 1.35; color: var(--t-terracotta-dark); }
/* Recipes: facts as small chips, then ingredients beside directions from 48rem. Chips are sand
   on cream and cream on a sand band, like the cards. */
.recipe-index { margin-top: 0.75rem; }
.section__inner > ul.recipe__facts { list-style: none; display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 1.25rem 0 0; padding: 0; max-width: none; }
.recipe__facts li { margin: 0; padding: 0.35rem 0.85rem; border-radius: 999px; background: var(--t-sand); font-size: 0.9rem; line-height: 1.4; }
.section--band .recipe__facts li { background: var(--t-cream); }
.recipe__fact-label { font-weight: 600; color: var(--t-blue); }
.recipe__fact-label::after { content: ":"; }
.recipe__body { display: grid; grid-template-columns: minmax(0, 1fr); gap: 1.5rem 3rem; max-width: 64rem; margin-top: 2rem; } /* minmax(0, 1fr) (2026-10-20): the implicit phone column grew past the screen with 200% text */
@media (min-width: 48rem) { .recipe__body { grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); } }
.recipe__body h3 { margin: 0 0 0.75rem; }
.recipe__body h4 { font-size: 1rem; margin: 1.1rem 0 0.4rem; }
.recipe__body h3 + h4 { margin-top: 0; }
.recipe__body ul, .recipe__body ol { margin: 0; padding-left: 1.25rem; }
.recipe__body li { margin: 0 0 0.45rem; }
.recipe__directions li { margin-bottom: 0.85rem; }
.recipe__directions li::marker { color: var(--t-terracotta-dark); font-weight: 600; }
.recipe__part { margin-top: 2.5rem; padding-top: 2rem; border-top: 1px solid rgba(41, 74, 82, 0.16); }
.recipe__part-title { margin: 0; }
.recipe__part > .recipe__facts { list-style: none; display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 1rem 0 0; padding: 0; }
/* Reading list: titles in Deep Blue so a long list scans by title. */
.book-list__title { color: var(--t-blue); font-weight: 600; }
.section__inner > .book-list__heading { margin: 2.25rem 0 0; } /* Books, then Poems (2026-10-19) */
.section__inner > p + .book-list__heading { margin-top: 1.5rem; }
.section__inner > .book-list__heading + .book-list { margin-top: 0.85rem; }
/* Print button: shown by theme.js only where printing works. */
.print-action { margin: 1.5rem 0 0; }
/* Every page, printed: no entrance motion. At paper width the 769px motion override no longer
   applies, so the base hero settle restarts and would print the hero blank (seen 2026-10-19). */
@media print {
  .page-hero, .page-hero__text > *, .page-hero__media, [data-reveal] { animation: none !important; opacity: 1 !important; transform: none !important; }
}
/* Every page, printed: the colour bands become plain paper (2026-10-21). On screen the hero, the even and
   --band sections, the closing CTA and the closing bookend paint a full-bleed band with a 100vmax box-shadow
   trimmed by clip-path, and the clip also holds their ring pseudos. On paper this misprinted: Firefox prints
   blank whatever follows a page break inside a clipped section (28 of 88 pages lost text on Letter at the
   default size), and with background graphics off, every browser's default, the shadows still printed as
   coloured rails down the page edges. Printed, a band has no fill, shadow, clip or rings, as on the
   print-button pages and the legal notices already, and the CTA's white type takes the page's ink. */
@media print {
  .page-hero, .page__body > .section { background: none !important; box-shadow: none !important; clip-path: none !important; }
  .page-hero::before, .page-hero::after,
  .page__body > .section:has(.cta)::before, .page__body > .section:has(.cta)::after,
  .page__body > .section.closing-bookend::before, .page__body > .section.closing-bookend::after { display: none !important; }
  .page__body > .section:has(.cta), .page__body > .section:has(.cta) :is(.cta, p, a) { color: inherit !important; }
  .page__body > .section:has(.cta) .section__heading { color: var(--t-blue) !important; }
}
/* Printing a page that offers a print button: just the content, in black on white. */
@media print {
  body:has([data-print]) .site-header,
  body:has([data-print]) .breadcrumb,
  body:has([data-print]) .site-footer,
  body:has([data-print]) .skip-link,
  body:has([data-print]) .print-action,
  body:has([data-print]) #backyard-more,
  body:has([data-print]) #backyard-cta,
  body:has([data-print]) .ahm-consent { display: none !important; }
  body:has([data-print]) { background: #ffffff; color: #000000; }
  body:has([data-print]) .section,
  body:has([data-print]) .page-hero { background: none !important; padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; box-shadow: none !important; }
  body:has([data-print]) a { color: inherit; text-decoration: none; }
  body:has([data-print]) .question-list > li,
  body:has([data-print]) .recipe__body li { break-inside: avoid; }
  body:has([data-print]) .recipe + .recipe { break-before: page; } /* each later recipe starts a fresh page */
  body:has([data-print]) .recipe__facts li { background: none; border: 1px solid #999999; }
  body:has([data-print]) .editorial-note { background: none; border: 1px solid #999999; }
}
/* In Her Own Backyard, Get the book: one row per format (Matt, 2026-10-19), each a small matted
   cover (square corners, like every book cover; the mat is in the image) beside its title, line and
   actions, so the eye reads straight down and a future "Listen on Audible" button lands where the
   retailer buttons sit. On a phone the cover sits beside the title and the buttons and caption run
   full width beneath; from 40rem everything sits in the text column. */
.book-formats { display: grid; gap: 2.5rem; margin-top: 1.75rem; max-width: 56rem; }
.book-format { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: 0 1.25rem; align-items: start; }
.book-format__cover { display: block; grid-row: 1 / span 2; }
.book-format__cover img { display: block; width: 100%; height: auto; box-shadow: var(--shadow-low); }
.book-format__cover--rounded img { border-radius: var(--t-radius); } /* previews that are not book covers (Speaking page downloads) take the site's rounded image corners */
/* Download previews (Matt, 2026-10-19): the thumbnail opens the certificate viewer with a large
   copy (theme.js), cued by a small "Preview" label; without the dialog it links to the file. */
.book-format__cover--preview { position: relative; color: inherit; text-decoration: none; cursor: zoom-in; border-radius: var(--t-radius); }
/* Centered by auto margins with an explicit max-content width: left: 50% left the pill's width to
   shrink-to-fit in the 60px beside the center, and Safari drew it that narrow with "Preview" spilling out
   (Matt, 2026-10-19). */
.book-format__preview-cue {
  position: absolute; left: 0; right: 0; bottom: 0.4rem; width: max-content; margin: 0 auto;
  display: flex; align-items: center; gap: 0.25rem; white-space: nowrap;
  padding: 0.15rem 0.5rem 0.15rem 0.4rem; border-radius: 999px;
  background: rgba(41, 74, 82, 0.9); color: #ffffff;
  font-size: 0.75rem; font-weight: 600; line-height: 1.4;
}
.book-format__preview-icon { width: 0.85rem; height: 0.85rem; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; flex: none; }
@media (prefers-reduced-motion: no-preference) {
  .book-format__cover--preview img { transition: box-shadow var(--t-hover-duration) var(--motion-easing-standard); }
}
@media (hover: hover) {
  .book-format__cover--preview:hover img { box-shadow: var(--shadow-medium); }
  .book-format__cover--preview:hover .book-format__preview-cue { background: var(--t-blue); }
}
.book-format__cover--preview:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 3px; }
/* Download cards (Speaking & Media's event-planner downloads, Matt 2026-10-19): two equal cream cards
   on the band, side by side from 48rem and stacked below. Each opens with a shaded panel holding a
   17.5rem-tall preview, the same height for both, so the titles and buttons line up across the cards,
   with the "Preview" pill under the image rather than over it. The download row sits at the card foot. */
.book-formats--cards { grid-template-columns: minmax(0, 1fr); gap: 1.5rem; max-width: 58rem; margin-top: 2rem; }
@media (min-width: 48rem) { .book-formats--cards { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2rem; } }
.book-formats--cards .book-format { display: flex; flex-direction: column; background: var(--t-cream); border-radius: var(--t-radius); box-shadow: var(--shadow-low); overflow: hidden; }
.book-formats--cards .book-format__cover { grid-row: auto; align-self: stretch; display: flex; flex-direction: column; align-items: center; gap: 0.9rem; padding: 2rem 1.5rem 1.25rem; background: rgba(232, 222, 208, 0.55); border-radius: 0; }
.book-formats--cards .book-format__cover img { width: auto; max-width: 100%; height: 17.5rem; box-shadow: 0 10px 26px rgba(41, 74, 82, 0.22); }
.book-formats--cards .book-format__preview-cue { position: static; margin: 0; font-size: 0.875rem; padding: 0.3rem 0.8rem 0.3rem 0.65rem; }
.book-formats--cards .book-format__cover--preview:focus-visible { outline-offset: -4px; } /* inside the card, which clips anything outside it */
.book-formats--cards .book-format__text { display: flex; flex-direction: column; flex: 1 1 auto; padding: 1.4rem 1.75rem 1.75rem; }
.book-formats--cards .book-format__text > * { margin: 0; }
.book-formats--cards .book-format__text > * + * { margin-top: 0.6rem; }
.book-formats--cards .book-format__text > .form-download { margin-top: auto; padding-top: 1.25rem; flex-direction: column; align-items: flex-start; gap: 0.5rem; } /* details under the button in both cards, so the buttons stay level at every width */
@media (hover: hover) {
  .book-formats--cards .book-format__cover--preview:hover img { box-shadow: 0 14px 34px rgba(41, 74, 82, 0.3); }
}
/* Press & event kit (Speaking & Media, 2026-10-20): the full-kit download under the intro; after the
   two cards, a grid of the other sizes (each a small cream card with its preview on a fixed-height
   sand panel, its size and a download link), then the copy-and-paste text, each block with a Copy
   button that theme.js reveals only where the clipboard works. */
.kit-download { margin-top: 1.25rem; }
.section__inner > .kit-heading { margin: 3rem 0 0; font-family: "Newsreader", Georgia, serif; font-weight: 500; font-size: 1.6rem; line-height: 1.25; color: var(--t-blue); }
.section__inner > .kit-note { margin-top: 0.5rem; color: var(--t-seaglass-text); }
.section__inner > ul.kit-files { list-style: none; margin: 1.25rem 0 0; padding: 0; max-width: 58rem; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
@media (min-width: 40rem) { .section__inner > ul.kit-files { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 64rem) { .section__inner > ul.kit-files { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.kit-file { margin: 0; display: flex; flex-direction: column; background: var(--t-cream); border-radius: var(--t-radius); box-shadow: var(--shadow-low); overflow: hidden; }
.kit-file__thumb { display: flex; align-items: center; justify-content: center; height: 8.5rem; padding: 0.85rem; background: rgba(232, 222, 208, 0.55); }
.kit-file__thumb img { display: block; max-width: 100%; max-height: 100%; width: auto; height: auto; border-radius: 4px; box-shadow: 0 4px 12px rgba(41, 74, 82, 0.18); }
.kit-file__title { margin: 0.85rem 1rem 0; font-weight: 600; line-height: 1.3; color: var(--t-blue); }
.kit-file__size { margin: 0.3rem 1rem 0; font-size: 0.875rem; line-height: 1.45; color: var(--t-seaglass-text); }
.kit-file__link { margin: auto 1rem 1rem; padding-top: 0.75rem; font-size: 0.9375rem; font-weight: 600; }
.section__inner > .kit-copies { margin-top: 1.25rem; max-width: 58rem; display: grid; gap: 1rem; }
.kit-copy { background: var(--t-cream); border-radius: var(--t-radius); box-shadow: var(--shadow-low); padding: 1.25rem 1.5rem 1.4rem; }
.kit-copy__head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.kit-copy__title { margin: 0; font-size: 1.05rem; font-weight: 600; line-height: 1.3; color: var(--t-blue); }
.kit-copy__button { flex: none; min-height: 2.25rem; padding: 0.35rem 1rem; border: 1px solid var(--t-seaglass-dark); border-radius: 999px; background: transparent; color: var(--t-blue); font: inherit; font-size: 0.9rem; font-weight: 600; cursor: pointer; }
.kit-copy__button[hidden] { display: none; }
.kit-copy__button.is-copied { background: var(--t-seaglass-tint); }
@media (hover: hover) { .kit-copy__button:hover { background: var(--t-seaglass-tint); } }
.kit-copy__button:focus-visible { outline: 2px solid var(--t-seaglass-dark); outline-offset: 2px; }
.kit-copy__text { margin-top: 0.75rem; }
/* Reflow with enlarged text (2026-10-20 audit U2: at 200% text on a phone the kit blocks reached
   443px and the Copy buttons 395px of a 375px screen; the download cards clipped their text and
   buttons). The copy blocks' implicit auto track and the cards' start-aligned text column took their
   width from their widest unbreakable content; both now take the column's width and shrink, the Copy
   button drops under its title when they cannot share a line, and a word longer than its card breaks
   only when it must. The column and cards are named size containers whose thresholds are in rem, so
   they are met only with enlarged text (at the default size a 320px phone's copy column and download
   card are 17rem and its small file cards 8rem); then the padding tightens and keeps a readable
   measure, and the Copy button moves under its title. Default layouts are unchanged. */
.section__inner > .kit-copies { grid-template-columns: minmax(0, 1fr); container: kit-copies / inline-size; }
.book-formats--cards .book-format { container: download-card / inline-size; }
.kit-file { container: kit-file / inline-size; }
.kit-copy, .kit-file, .book-formats--cards .book-format { min-width: 0; overflow-wrap: break-word; }
.kit-copy__title { min-width: 0; }
.book-formats--cards .book-format__text { align-self: stretch; min-width: 0; }
.book-formats--cards .form-download .button { max-width: 100%; }
@container kit-copies (max-width: 16rem) {
  .kit-copy { padding: 1rem; }
  .kit-copy__head { flex-wrap: wrap; }
}
@container download-card (max-width: 16rem) {
  .book-formats--cards .book-format__text { padding: 1rem; }
  .book-formats--cards .form-download .button { padding-left: 1rem; padding-right: 1rem; }
}
@container kit-file (max-width: 7.5rem) {
  .kit-file__title, .kit-file__size, .kit-file__link { margin-left: 0.6rem; margin-right: 0.6rem; }
}
.kit-copy__text p { margin: 0; font-size: 0.95rem; line-height: 1.6; overflow-wrap: anywhere; }
.kit-copy__text p + p { margin-top: 0.6rem; }
/* Outline buttons on a sand band take a cream fill, like the Walk-and-Talk button (2026-09-16). */
.section--band .form-download .button--secondary,
.section--band .form-download .button--secondary:hover,
.section--band .form-download .button--secondary:focus-visible { background: var(--t-cream); }
.book-format__text { display: contents; }
.book-format__text > * { grid-column: 2; margin: 0; }
.book-format__text > * + * { margin-top: 0.6rem; }
.book-format__text > .retailer-links,
.book-format__text > .retailer-links__note,
.book-format__text > .form-download { grid-column: 1 / -1; } /* .form-download: the Speaking page's downloads (2026-10-19) */
.book-format__text > .retailer-links,
.book-format__text > .form-download { margin-top: 1.25rem; }
.book-format__text > .retailer-links__note { margin-top: 0.85rem; }
@media (min-width: 40rem) {
  .book-format { grid-template-columns: 7.5rem minmax(0, 1fr); gap: 0 1.75rem; }
  .book-format__cover { grid-row: auto; }
  .book-format__text { display: block; }
  .book-format__text > .retailer-links,
  .book-format__text > .form-download { margin-top: 1rem; }
}
