/* ============================================================================
   glass.css — Maker Therapy's profile page. One sheet, deliberately.
   ----------------------------------------------------------------------------
   Quick Counseling's profile loads three sheets (tokens + base + profile)
   because seven page types share them. Maker's Glass theme currently dresses
   ONE route, so splitting it three ways would be three requests and three
   version bumps to serve one page. When the listing, state and home pages are
   brought over, split it then — and not before.

   Tokens are taken from the supplied design system (v3 "Glass", 2026): Mist and
   Depth surfaces, the aura wash, indigo as the single accent, the SF-first
   stack, the 4px spacing scale, concentric radii, the glass material recipe.

   THREE ADAPTATIONS, each because this is a public directory and not the app
   the system was written for:

   1. THEME SWITCHING IS `prefers-color-scheme` FIRST. The system switches on
      `data-theme`, which assumes an app that owns a setting. A visitor arriving
      from a search result has no setting, so the OS preference decides;
      `data-theme="light"` still overrides it where a caller sets one.
   2. INTER IS LOADED, NOT MERELY NAMED. The system is iOS-first, where SF Pro
      is free via `-apple-system`. Most of this site's traffic is not on Apple
      hardware, so the fallback has to be a real file. It is self-hosted at
      /fonts/ for the same reason the other theme's faces are — see
      tokens.css: a third party must not be able to hold up a page about a
      named clinician.
   3. GLASS IS NAVIGATION-LAYER ONLY, as the system requires, which on this page
      means exactly two elements: the floating nav capsule and the mobile action
      dock. Every content surface is solid `--bg-raised`. The one place that
      rule bit back is the mobile menu sheet — see `.nav-sheet`.
   ========================================================================== */

/* Self-hosted, so the render of a profile never waits on fonts.googleapis.com.
   `local()` first: a free hit for anyone who already has Inter installed.
   ⚠ The .woff2 below does not exist yet — same outstanding asset task as
   tokens.css. Until it lands the stack falls through to -apple-system and then
   to the system UI face, and layout is stable because every step is a
   grotesque of similar metrics. */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: local("Inter"), url("/fonts/inter-latin-variable.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
    U+2212, U+2215, U+FEFF, U+FFFD;
}

:root, [data-theme="light"] {
  color-scheme: light;

  /* Surfaces — "Mist" */
  --bg:        #F4F5FA;
  --bg-raised: #FFFFFF;
  --bg-inset:  #ECEEF6;

  --aura:
    radial-gradient(1100px 700px at 12% -8%, rgba(84,87,224,.13), transparent 62%),
    radial-gradient(900px 640px at 88% 4%, rgba(78,193,224,.11), transparent 58%),
    radial-gradient(800px 800px at 50% 110%, rgba(84,87,224,.07), transparent 60%);

  --ink:       #0E1226;
  --text-body: #3C4258;
  /* CHANGED from the design system's #6F7590. That value measures 4.17:1 on
     `--bg` and 3.92:1 on `--bg-inset` — under the 4.5:1 AA floor for small
     text, and this is the colour of every caption, eyebrow, count, breadcrumb,
     footnote and secondary label on the site.
     #63697F measures 5.00 / 5.44 / 4.70 on bg / bg-raised / bg-inset.
     This is the SAME correction tokens.css records making to Quick
     Counseling's `--ink-3` (4.18:1 → 5.37:1) — the design system was written
     for an iOS app where these labels sit on white at larger sizes, and a
     directory sets them at 11–13px on a tinted page. */
  --muted:     #63697F;

  --border:        rgba(16,19,42,.08);
  --border-strong: rgba(16,19,42,.16);

  --indigo:      #5457E0;
  --indigo-deep: #4346C8;
  --indigo-soft: rgba(84,87,224,.10);
  --on-indigo:   #FFFFFF;
  --cyan:        #4EC1E0;

  /* Semantic colours are used as CHIP TEXT on their own 14% tint, which is a
     much tighter pairing than the same colour on white. #2E9E6B measures
     2.89:1 there — the "Accepting new clients" chip, on every card on the site.
     #1E7048 measures 5.19:1 on the tint and 6.06:1 on white.
     `--success-solid` keeps the original for the live dot and the strip, where
     it is a filled shape and not text. */
  --success:       #1E7048;
  --success-solid: #2E9E6B;
  --warning: #8A5F0F;
  --danger:  #B93B3B;
  --info:    #3A63BC;

  --glass-bg:        rgba(255,255,255,.58);
  --glass-bg-strong: rgba(255,255,255,.80);
  --glass-edge:      rgba(16,19,42,.12);
  --glass-specular:  rgba(255,255,255,.90);
  --glass-blur:      20px;
  --glass-saturate:  1.8;

  --shadow-glass:
    0 1px 1px rgba(16,19,42,.03),
    0 8px 24px -6px rgba(16,19,42,.14),
    0 24px 56px -20px rgba(16,19,42,.16);
  --shadow-card:
    0 1px 2px rgba(16,19,42,.04),
    0 12px 32px -16px rgba(16,19,42,.10);

  --focus-ring: 0 0 0 4px rgba(84,87,224,.18);
}

/* "Depth" — applied by OS preference, or forced with data-theme="dark". */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --bg:        #0B0D1D;
    --bg-raised: #151830;
    --bg-inset:  #10122A;
    --aura:
      radial-gradient(1100px 700px at 12% -8%, rgba(125,130,245,.20), transparent 62%),
      radial-gradient(900px 640px at 88% 4%, rgba(86,200,232,.12), transparent 58%),
      radial-gradient(800px 800px at 50% 115%, rgba(125,130,245,.10), transparent 60%);
    --ink:       #F3F5FC;
    --text-body: #C6CBE0;
    --muted:     #8990A8;
    --border:        rgba(255,255,255,.09);
    --border-strong: rgba(255,255,255,.18);
    --indigo:      #7D82F5;
    --indigo-deep: #979BFF;
    --indigo-soft: rgba(125,130,245,.16);
    --on-indigo:   #0B0D1D;
    --cyan:        #56C8E8;
    --success:       #4CC28A;
    --success-solid: #4CC28A;
    --warning: #E8B04A;
    --danger:  #F07373;
    --info:    #6FA1F2;
    --glass-bg:        rgba(21,24,48,.55);
    --glass-bg-strong: rgba(21,24,48,.82);
    --glass-edge:      rgba(255,255,255,.14);
    --glass-specular:  rgba(255,255,255,.28);
    --shadow-glass:
      0 1px 2px rgba(0,0,0,.40),
      0 12px 32px -8px rgba(0,0,0,.55),
      0 28px 64px -24px rgba(0,0,0,.60);
    --shadow-card:
      0 1px 2px rgba(0,0,0,.30),
      0 12px 32px -16px rgba(0,0,0,.45);
    --focus-ring: 0 0 0 4px rgba(125,130,245,.28);
  }
}

:root {
  --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text",
               "Inter", "Helvetica Neue", sans-serif;

  /* Spacing — multiples of 4, per the system */
  --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;
  --sp-6: 24px; --sp-8: 32px; --sp-10: 40px; --sp-12: 48px; --sp-16: 64px;

  /* Concentric radii */
  --r-xs: 8px; --r-sm: 12px; --r-md: 16px; --r-lg: 20px; --r-xl: 28px; --r-pill: 999px;

  --ease-glass: cubic-bezier(0.32, 0.72, 0, 1);
  --ease-out:   cubic-bezier(0.4, 0, 0.2, 1);
  --dur-fast: 150ms; --dur-med: 300ms; --dur-slow: 450ms;

  /* Page frame */
  --page-max: 1160px;
  --gutter: 24px;
  --rail: 316px;
  --gap: 24px;
}
@media (max-width: 640px) { :root { --gutter: 16px; } }

/* ═══════════════════════════════════════════════════════════════════════════
   reset + base
   ═══════════════════════════════════════════════════════════════════════════ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  background: var(--aura), var(--bg);
  background-attachment: fixed;
  color: var(--text-body);
  font: 400 15px/22px var(--font-sans);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
a { color: inherit; text-decoration: none; }
ul, ol { list-style: none; }
img { max-width: 100%; display: block; }
h1, h2, h3 { color: var(--ink); text-wrap: balance; font-weight: 700; }
h3 { font-weight: 600; }
b, strong { font-weight: 600; color: var(--ink); }
select, input, button { font: inherit; color: inherit; }

/* Every number on this page. The design system's most-repeated rule, applied
   at the selectors that actually carry figures rather than globally — a
   tabular `1` inside running prose is a worse result than a proportional one. */
.num, .ref dd, .facts dd, .stat-v, .fee, time,
.hchip-n, .opt-n, .tmore, .results-count, .results-page, .pager-p,
.htile-n, .hway-n, .hstep-n, .pg-route-n, .mini-cap { font-variant-numeric: tabular-nums; }

.visually-hidden {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}
.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 90;
  height: 44px; padding: 0 20px; line-height: 44px;
  background: var(--indigo); color: var(--on-indigo);
  border-radius: var(--r-pill); font-weight: 600; font-size: 14px;
}
.skip-link:focus { left: 24px; top: 12px; }
a:focus-visible, summary:focus-visible, select:focus-visible,
button:focus-visible, input:focus-visible, .btn:focus-visible {
  outline: none; box-shadow: var(--focus-ring); border-radius: var(--r-xs);
}

/* The document frame. Every page type emits `.page` > header, crumbs, main. */
.page { max-width: var(--page-max); margin: 0 auto; padding: 0 var(--gutter); }

/* ── labels ───────────────────────────────────────────────────────────────
   The design system has exactly one uppercase style. `.eyebrow` is the shared
   renderers' name for the same thing `.caption` is called here, so they are
   one rule — anything else would give a Maker archive and a Maker profile two
   different label treatments. */
.caption, .eyebrow {
  display: inline-block;
  font: 500 11px/14px var(--font-sans);
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--muted);
}
.caption .n, .eyebrow .n { color: var(--indigo); }
.caption--accent { color: var(--indigo); }

/* ═══════════════════════════════════════════════════════════════════════════
   glass layer 1 — the site header, as a floating capsule
   ---------------------------------------------------------------------------
   Shared markup, restyled. `siteHeader` emits, in this DOM order:
     a.logo · details.navt > summary.navt-b · nav.site-nav
   The order is forwards-only because the mobile menu is `.navt[open] ~
   .site-nav`; `order` puts the nav back in second place on desktop. That is
   the shared header's own device (RENDER-NOTES §9) and it is reused verbatim.
   ═══════════════════════════════════════════════════════════════════════════ */
.site-header {
  position: sticky;
  top: 12px;
  z-index: 50;
  margin: 12px 0 0;
  height: 60px;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: 0 10px 0 16px;
  border-radius: var(--r-pill);
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
  border: 1px solid var(--glass-edge);
  box-shadow: inset 0 1px 0 var(--glass-specular), var(--shadow-glass);
}
.logo { display: inline-flex; align-items: center; gap: 10px; flex-shrink: 0; order: 1; }
.logo svg { display: block; border-radius: 9px; }
.logo-word {
  font: 400 17px/22px var(--font-sans);
  letter-spacing: -0.3px;
  color: var(--text-body);
  white-space: nowrap;
}
.logo-word b { font-weight: 700; color: var(--ink); }

/* The "Checked 15 Aug 2026" chip that used to sit here was removed from
   siteHeader() on 17 Aug 2026 and its rules went with it — see the matching
   note in base.css and the reasoning on siteHeader() in render/profile.js.
   Maker still shows the date where it means something: the profile's "read
   {date}" provenance line and the practitioner-record caption. */

.site-nav { order: 2; display: flex; gap: var(--sp-1); }
.site-nav a {
  display: inline-block;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  font: 500 14px/20px var(--font-sans);
  color: var(--text-body);
  transition: background var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.site-nav a:hover { background: var(--indigo-soft); color: var(--ink); }

/* The disclosure button. Hidden above the phone breakpoint — the links are
   already visible there and a menu button beside them is noise. */
.navt { order: 4; display: none; flex-shrink: 0; }
.navt-b {
  width: 40px; height: 40px;
  display: grid; place-items: center;
  border-radius: var(--r-pill);
  background: var(--indigo-soft); color: var(--indigo);
  cursor: pointer; list-style: none;
}
.navt-b::-webkit-details-marker { display: none; }
.navt-b::marker { content: ""; }
.navt-b svg { width: 20px; height: 20px; }
.navt-t { display: none; }

/* ── breadcrumbs ─────────────────────────────────────────────────────────── */
.crumbs { padding: var(--sp-6) 0 0; }
.crumbs ol { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }
.crumbs li { display: inline-flex; align-items: center; gap: var(--sp-2); }
.crumbs a, .crumbs span {
  font: 500 11px/14px var(--font-sans);
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--muted);
}
.crumbs a:hover { color: var(--indigo); }
.crumbs [aria-current] { color: var(--text-body); }
/* The shared breadcrumb interleaves a chevron SVG; sized down and muted so the
   trail reads as one label rather than as three links and two icons. */
.crumbs svg { width: 12px; height: 12px; color: var(--border-strong); flex-shrink: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
   shared components
   ═══════════════════════════════════════════════════════════════════════════ */

/* Solid content card. Glass is the navigation layer only — content never. */
.card {
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  padding: var(--sp-6);
  box-shadow: var(--shadow-card);
}
.rcard {
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-5);
  box-shadow: var(--shadow-card);
}
.box, .well { background: var(--bg-inset); border-radius: var(--r-md); }

.btn {
  height: 48px; padding: 0 22px;
  border-radius: var(--r-pill);
  background: var(--indigo); color: var(--on-indigo);
  font: 600 15px/22px var(--font-sans);
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
  border: 0; cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-glass);
}
.btn:hover { background: var(--indigo-deep); }
.btn:active { transform: scale(.985); }
.btn svg { width: 16px; height: 16px; flex-shrink: 0; }
.btn--sm { height: 38px; padding: 0 16px; font-size: 13.5px; }
.btn--sm svg { width: 14px; height: 14px; }
.btn--block { width: 100%; }
/* The glass button from the system's control set — for secondary actions that
   sit on the aura wash rather than inside a card. */
.btn--ghost {
  background: var(--glass-bg);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
  backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
  border: 1px solid var(--glass-edge);
  box-shadow: inset 0 1px 0 var(--glass-specular);
  color: var(--ink);
}
.btn--ghost:hover { background: var(--glass-bg-strong); }

.linkbtn {
  display: inline-flex; align-items: center; gap: 6px;
  font: 600 14px/20px var(--font-sans);
  color: var(--indigo);
}
.linkbtn:hover { text-decoration: underline; text-underline-offset: 3px; }
.linkbtn svg { width: 15px; height: 15px; }

/* Chips — the system's recipe: tint fill, full-colour text, 35% border. */
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  height: 26px; padding: 0 11px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--bg-inset);
  font: 500 12.5px/26px var(--font-sans);
  color: var(--text-body);
  white-space: nowrap;
}
.chip--sm { height: 22px; padding: 0 9px; font-size: 11.5px; line-height: 22px; }
.chip--ok      { background: rgba(46,158,107,.14); border-color: rgba(46,158,107,.35); color: var(--success); }
.chip--neutral { background: var(--indigo-soft);   border-color: rgba(84,87,224,.35);  color: var(--indigo); }
.chip--soft    { background: var(--bg-inset);      border-color: var(--border);        color: var(--text-body); }
.chip--muted, .chip--quiet { background: var(--bg-inset); border-color: var(--border); color: var(--muted); }
.chip--feat    { background: var(--indigo-soft);   border-color: rgba(84,87,224,.35);  color: var(--ink); }
.chip .led { width: 6px; height: 6px; border-radius: var(--r-pill); background: currentColor; flex-shrink: 0; }
/* ⚠ NOT `currentColor` ON THE ONE CHIP THAT MEANS "LIVE". `--success` was
   darkened to #1E7048 so the chip's TEXT clears 4.5:1, and the dot inherited
   that darkening because it painted itself in the text colour — leaving the
   same card carrying two green status dots in two different greens (this one
   dark, the avatar's vivid). A filled shape has no contrast floor to meet, so
   it takes the vivid value, exactly as the avatar dot does. */
.chip--ok .led { background: var(--success-solid); }
.chip svg { width: 12px; height: 12px; flex-shrink: 0; }
.chip--ok, .chip--neutral, .chip--feat { text-transform: none; letter-spacing: 0; }

.taglist { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.taglist--tight { gap: 6px; }

.sec-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-4); margin-bottom: var(--sp-3); }
.sec-head h2 { font: 700 22px/28px var(--font-sans); letter-spacing: -0.3px; }
.sec-head .eyebrow { margin-bottom: var(--sp-2); }
.sec-sub { margin-top: var(--sp-2); font: 400 14px/21px var(--font-sans); color: var(--muted); }
.lede { margin-top: var(--sp-3); font: 400 21px/30px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); text-wrap: pretty; }
.sub  { margin-top: var(--sp-4); font: 400 14px/21px var(--font-sans); color: var(--muted); text-wrap: pretty; max-width: 68ch; }
.note { margin-top: var(--sp-3); font: 400 12.5px/18px var(--font-sans); color: var(--muted); }
.empty { font: 400 14px/21px var(--font-sans); color: var(--muted); }
.ico-tile {
  width: 40px; height: 40px; flex-shrink: 0;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  background: var(--indigo-soft); color: var(--indigo);
}
.ico-tile svg { width: 19px; height: 19px; }
.ico--star { color: var(--indigo); display: inline-flex; }
.ico--star svg { width: 11px; height: 11px; }

/* The affiliate disclosure. Identical on every page type. */
.disc { padding: var(--sp-8) 0 0; }
.disc p, .disc .box {
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  background: var(--bg-raised);
  font: 400 13px/19px var(--font-sans);
  color: var(--muted);
  text-wrap: pretty;
}

/* ═══════════════════════════════════════════════════════════════════════════
   footer
   ═══════════════════════════════════════════════════════════════════════════ */
.site-footer { margin-top: var(--sp-10); border-top: 1px solid var(--border); }
.foot-main {
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(0, 2fr);
  gap: var(--sp-10);
  padding: var(--sp-10) 0;
}
.foot-brand { min-width: 0; }
.foot-mark { display: inline-flex; align-items: center; gap: 10px; }
.foot-mark svg { border-radius: 8px; }
.foot-name { font: 700 16px/22px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); }
.foot-note { margin-top: var(--sp-3); max-width: 44ch; font: 400 13px/19px var(--font-sans); color: var(--muted); text-wrap: pretty; }
.foot-nav { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--sp-8); }
.foot-col { min-width: 0; }
.foot-h { display: block; margin-bottom: var(--sp-4); }
.foot-l li + li { margin-top: var(--sp-2); }
.foot-l a { font: 400 14px/20px var(--font-sans); color: var(--text-body); }
.foot-l a:hover { color: var(--indigo); }
.foot-bot {
  display: flex; flex-wrap: wrap; gap: var(--sp-3) var(--sp-6);
  padding: var(--sp-4) 0 var(--sp-10);
  border-top: 1px solid var(--border);
}
.foot-c, .foot-bot .caption, .foot-bot .right {
  font: 500 11px/14px var(--font-sans);
  letter-spacing: 0.5px;
  text-transform: uppercase;
  color: var(--muted);
}
.foot-bot .right { margin-left: auto; }

/* ═══════════════════════════════════════════════════════════════════════════
   result cards — cards.js markup, Glass surfaces
   ---------------------------------------------------------------------------
   `.mini-strip` and `.mini-cap` are styled even though Maker never renders
   them: `site.enable.availability === false` removes the element (cards.js),
   and a stylesheet that silently depends on a config flag is a rule that
   breaks the day somebody flips it. Cheap insurance, ~15 lines.
   ═══════════════════════════════════════════════════════════════════════════ */
.rgrid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--sp-4);
}
.tcard {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  padding: var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
  transition: box-shadow var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.tcard:hover { border-color: rgba(84,87,224,.28); box-shadow: var(--shadow-glass); }
.tcard-head { display: flex; align-items: flex-start; gap: var(--sp-3); }
.tavatar {
  --size: 46px;
  position: relative;
  width: var(--size); height: var(--size);
  flex-shrink: 0;
  border-radius: var(--r-pill);
  /* ⚠ `overflow: visible`, AND THE CLIP MOVED ONTO THE PHOTO. This used to be
     `overflow: hidden` — the obvious way to crop a square JPEG into a round
     frame — and it was quietly destroying the "accepting new clients" dot.

     The dot is positioned at the bottom-right of the avatar's BOX. On a
     rounded-square avatar (Quick Counseling's) that corner is empty space and
     the dot sits proudly outside it. On a CIRCLE the corner is outside the
     circle, so a round clip on the container sliced the dot into a crescent and
     ate its 2px separator ring completely. It read as a green leaf stuck to the
     side of the portrait rather than a status light.

     The container's own `background` and inset `box-shadow` still follow
     `border-radius` with no clip at all, and `.ini` is text on that background,
     so the ONLY thing that needed clipping was the photo — which now rounds
     itself. Same arrangement archive.css already uses (`border-radius:
     inherit` on `.tavatar .photo`). */
  overflow: visible;
  background: var(--indigo-soft);
  box-shadow: inset 0 0 0 1px var(--border);
}
.tavatar .ini {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  font: 600 15px/1 var(--font-sans);
  letter-spacing: -0.3px;
  color: var(--indigo);
}
/* position + z-index are BOTH required — see the long note on the profile's
   `.portrait .photo`. Without them the monogram paints over the face. */
.tavatar .photo {
  position: absolute; inset: 0; z-index: 1;
  width: 100%; height: 100%;
  object-fit: cover; background: transparent; border: 0;
  /* The round frame, now that the container no longer clips (see `.tavatar`).
     `inherit`, not a literal, so the avatar's shape is stated in one place. */
  border-radius: inherit;
}
.tavatar .live {
  position: absolute; z-index: 2;
  /* ON A CIRCLE, 0/0 IS THE 45° POINT, not the corner — a 46px circle's edge at
     four-o'clock passes through (39.3, 39.3), which for an 11px dot is its box
     sitting flush with the bottom-right of the avatar. So the dot lands ON the
     rim rather than floating off it, which is where a presence light belongs.
     Quick Counseling's rounded SQUARE uses -2px for the same visual result on a
     different shape; a shared value would be wrong on one of them. */
  right: 0; bottom: 0;
  width: 11px; height: 11px;
  border-radius: var(--r-pill);
  /* A filled dot, not text — the vivid value, which has no contrast floor to
     meet because nothing is read on top of it. */
  background: var(--success-solid);
  box-shadow: 0 0 0 2px var(--bg-raised);
}
.tcard-id { min-width: 0; flex: 1; }
.tname { font: 600 16px/21px var(--font-sans); letter-spacing: -0.2px; }
.tname a:hover { color: var(--indigo); }
.tname .cred { font-weight: 500; color: var(--muted); }
.tsub { margin-top: var(--sp-1); display: flex; flex-wrap: wrap; gap: 4px 10px; font: 400 12.5px/17px var(--font-sans); color: var(--muted); }
.tsub li { display: inline-flex; align-items: center; gap: 10px; }
.tsub li + li::before { content: ""; width: 3px; height: 3px; border-radius: 50%; background: var(--border-strong); }
.tsub .lic { font-variant-numeric: tabular-nums; }
.tcard-chips, .tcard-tags { margin: 0; }
.tmore { font: 500 12px/22px var(--font-sans); color: var(--muted); }
.tmeta { display: flex; flex-wrap: wrap; gap: 4px 14px; font: 400 12.5px/18px var(--font-sans); color: var(--muted); }
.tmeta li { display: inline-flex; align-items: center; gap: 14px; }
.tmeta li + li::before { content: ""; width: 3px; height: 3px; border-radius: 50%; background: var(--border-strong); }
.tcard-foot { margin-top: auto; padding-top: var(--sp-3); display: flex; align-items: center; gap: var(--sp-3); border-top: 1px solid var(--border); }
.tcard-more { font: 500 13px/20px var(--font-sans); color: var(--indigo); }
.tcard-more:hover { text-decoration: underline; text-underline-offset: 3px; }

/* Availability strip — Quick Counseling only. Kept so the flag is reversible. */
.mini { margin-top: 2px; }
.mini-strip { display: flex; gap: 2px; }
.mcell { flex: 1; height: 14px; min-width: 3px; border-radius: 2px; background: var(--bg-inset); }
.mcell.is-on { background: var(--success-solid); }   /* a filled cell, not text */
.mcell.is-none { background: transparent; box-shadow: inset 0 0 0 1px var(--border); }
.mcell.is-last { box-shadow: 0 0 0 1px var(--bg-raised), 0 0 0 2px var(--border-strong); }
.mcell.is-today { box-shadow: 0 0 0 1px var(--bg-raised), 0 0 0 2px var(--indigo); }
.mini-cap { margin-top: 6px; font: 400 11.5px/16px var(--font-sans); color: var(--muted); }
.mini-none { font: 400 12.5px/18px var(--font-sans); color: var(--muted); }

/* Zero results. Two different situations — see cards.js noResults(). */
.noresults {
  padding: var(--sp-10) var(--sp-6);
  text-align: center;
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
}
.noresults-t { font: 700 20px/26px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); }
.noresults-s { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--muted); text-wrap: pretty; }
.noresults-a { margin-top: var(--sp-5); display: inline-flex; }

/* ═══════════════════════════════════════════════════════════════════════════
   archive — listing, state pages
   ═══════════════════════════════════════════════════════════════════════════ */
.archive { padding-top: var(--sp-6); }
.archive-head { padding-bottom: var(--sp-6); }
.archive-head h1 { font: 700 40px/46px var(--font-sans); letter-spacing: -1.1px; margin-top: var(--sp-2); }
.archive-intro { margin-top: var(--sp-3); max-width: 70ch; font: 400 16px/25px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

/* Applied filters, above the results and above the rail. */
.activebar {
  margin-top: var(--sp-5);
  padding: var(--sp-4);
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
}
.activebar-t { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.activebar-l { display: flex; flex-wrap: wrap; gap: var(--sp-2); flex: 1; }
.activebar-clear { margin-left: auto; font: 600 13px/20px var(--font-sans); color: var(--indigo); }
.activebar-clear:hover { text-decoration: underline; text-underline-offset: 3px; }
.opt-x {
  display: inline-flex; align-items: center; gap: 7px;
  height: 30px; padding: 0 12px;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  border: 1px solid rgba(84,87,224,.35);
  font: 500 12.5px/30px var(--font-sans);
  color: var(--ink);
}
.opt-x:hover { background: rgba(84,87,224,.18); }
.opt-x-k { color: var(--muted); }
.opt-x-g { color: var(--indigo); font-weight: 600; }

.archive-layout {
  display: grid;
  grid-template-columns: var(--rail) minmax(0, 1fr);
  gap: var(--gap);
  align-items: start;
  padding-bottom: var(--sp-12);
}
.archive-layout.no-rail { grid-template-columns: minmax(0, 1fr); }

/* ── the filter rail ─────────────────────────────────────────────────────── */
.filters {
  position: sticky;
  top: 88px;
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
  padding: var(--sp-5);
  max-height: calc(100vh - 108px);
  overflow-y: auto;
}
.filters-head { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-4); }
.filters-title { font: 700 16px/22px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.filters-skip { margin-left: auto; font: 500 12px/18px var(--font-sans); color: var(--indigo); }
.filters-body { display: grid; gap: var(--sp-3); }

/* The sort control, which is a list of links like everything else here. */
.fsel { padding-bottom: var(--sp-3); border-bottom: 1px solid var(--border); }
.fsel-h { display: flex; align-items: baseline; gap: var(--sp-2); margin-bottom: var(--sp-2); }
.fsel-t { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.fsel-clear { margin-left: auto; font: 500 12px/18px var(--font-sans); color: var(--indigo); }
.fsel-l { display: flex; flex-wrap: wrap; gap: 6px; }

.fgroups { display: grid; gap: var(--sp-2); }
.fgroup { border-top: 1px solid var(--border); padding-top: var(--sp-3); }
.fgroup:first-child { border-top: 0; padding-top: 0; }
.fgroup-sum {
  display: flex; align-items: center; gap: var(--sp-2);
  min-height: 32px;
  cursor: pointer; list-style: none;
}
.fgroup-sum::-webkit-details-marker { display: none; }
.fgroup-sum::marker { content: ""; }
.fgroup-title { font: 600 13.5px/20px var(--font-sans); color: var(--ink); }
.fgroup-on {
  display: inline-flex; align-items: center;
  height: 20px; padding: 0 8px;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  font: 600 11px/20px var(--font-sans);
  color: var(--indigo);
}
.fgroup-chev { margin-left: auto; color: var(--muted); transition: transform var(--dur-fast) var(--ease-out); }
.fgroup-chev svg { width: 15px; height: 15px; display: block; }
.fgroup[open] .fgroup-chev { transform: rotate(180deg); }
.fopts { display: grid; gap: 1px; padding-top: var(--sp-2); }
.fopts--tail { padding-top: 0; }
.fopt-pin { order: -1; }

.fmore { margin-top: var(--sp-1); }
.fmore-sum {
  display: inline-flex; align-items: center; gap: 5px;
  min-height: 32px;
  font: 500 12.5px/18px var(--font-sans);
  color: var(--indigo);
  cursor: pointer; list-style: none;
}
.fmore-sum::-webkit-details-marker { display: none; }
.fmore-sum::marker { content: ""; }
.fmore-l { display: grid; gap: 1px; }

/* One option. An <a>, always — no checkbox, no select, no script. */
.opt {
  display: flex; align-items: flex-start; gap: var(--sp-2);
  min-height: 32px;
  padding: 4px 8px;
  margin: 0 -8px;
  border-radius: var(--r-xs);
  font: 400 13.5px/18px var(--font-sans);
  color: var(--text-body);
}
.opt:hover { background: var(--bg-inset); }
.opt-box {
  width: 15px; height: 15px; flex-shrink: 0; margin-top: 2px;
  border-radius: 4px;
  border: 1.5px solid var(--border-strong);
  display: grid; place-items: center;
}
.opt-box--one { border-radius: var(--r-pill); }
.opt.is-on { color: var(--ink); font-weight: 500; }
.opt.is-on .opt-box { background: var(--indigo); border-color: var(--indigo); }
.opt.is-on .opt-box::after {
  content: "";
  width: 7px; height: 4px;
  border-left: 1.5px solid var(--on-indigo);
  border-bottom: 1.5px solid var(--on-indigo);
  transform: rotate(-45deg) translate(1px, -1px);
}
.opt.is-on .opt-box--one::after {
  width: 5px; height: 5px; border: 0; border-radius: var(--r-pill);
  background: var(--on-indigo); transform: none;
}
.opt.is-off { color: var(--muted); }
/* `.opt-note` is nested INSIDE `.opt-l` ("Added in the last 30 days" +
   "First appeared in our roster"), so the label cannot be a single nowrap line
   — it ran the two strings together with no space. The label is a block, the
   note is a block under it, and the ellipsis moves to the first line only. */
.opt-l { min-width: 0; display: block; }
.opt-note { display: block; margin-top: 1px; color: var(--muted); font-size: 11.5px; line-height: 15px; }
.opt-n { margin-left: auto; padding-left: var(--sp-2); font: 400 12px/18px var(--font-sans); color: var(--muted); flex-shrink: 0; }
.opt-l > :first-child { overflow: hidden; text-overflow: ellipsis; }

/* Mobile filter disclosure — below 980px only. */
.ftoggle { display: none; }
.ftoggle-b {
  display: flex; align-items: center; gap: var(--sp-2);
  min-height: 48px; padding: 0 var(--sp-5);
  border-radius: var(--r-pill);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-card);
  font: 600 14px/20px var(--font-sans);
  color: var(--ink);
  cursor: pointer; list-style: none;
}
.ftoggle-b::-webkit-details-marker { display: none; }
.ftoggle-b::marker { content: ""; }
/* The word "Filters" itself. It had no rule here — archive.css pushes it with
   `margin-right: auto` inside its own mobile block and this sheet never did, so
   the count chip sat against the label instead of at the far end of the button.
   Found by the "every emitted class has a rule in a loaded sheet" check. */
.ftoggle-l { margin-right: auto; }
.ftoggle-n {
  display: inline-flex; align-items: center;
  height: 22px; padding: 0 9px;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  font: 600 11.5px/22px var(--font-sans);
  color: var(--indigo);
}

/* ── results ─────────────────────────────────────────────────────────────── */
.results { min-width: 0; }
.results-head { display: flex; align-items: baseline; gap: var(--sp-3); margin-bottom: var(--sp-4); flex-wrap: wrap; }
.results-count { font: 700 18px/24px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.results-page { margin-left: auto; font: 400 13px/18px var(--font-sans); color: var(--muted); }

.pager {
  margin-top: var(--sp-8);
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--sp-2);
}
.pager-step, .pager-p, .pager-plain {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-width: 44px; height: 44px; padding: 0 var(--sp-4);
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--bg-raised);
  font: 500 14px/44px var(--font-sans);
  color: var(--text-body);
}
.pager-step:hover, .pager-p:hover { border-color: rgba(84,87,224,.35); color: var(--ink); }
.pager-step.is-off, .pager-plain { opacity: .4; pointer-events: none; }
.pager-back { padding: 0 var(--sp-4); }
.pager-p.is-on { background: var(--indigo); border-color: var(--indigo); color: var(--on-indigo); font-weight: 600; }
.pager-n { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }
.pager-gap { color: var(--muted); padding: 0 4px; }

/* ═══════════════════════════════════════════════════════════════════════════
   homepage
   ═══════════════════════════════════════════════════════════════════════════ */
.home { padding-top: var(--sp-6); }

.hero { padding: var(--sp-12) 0 var(--sp-10); display: grid; grid-template-columns: minmax(0, 1fr) 400px; gap: var(--sp-16); align-items: center; }
.hero-copy { min-width: 0; }
.hero h1 { font: 700 56px/60px var(--font-sans); letter-spacing: -1.6px; margin-top: var(--sp-3); }
.hero-lede { margin-top: var(--sp-5); max-width: 52ch; font: 400 18px/28px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.hero-live {
  margin-top: var(--sp-5);
  display: inline-flex; align-items: center; gap: var(--sp-2);
  height: 30px; padding: 0 13px;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  font: 500 12.5px/30px var(--font-sans);
  color: var(--indigo);
}
.hero-live .led { width: 7px; height: 7px; border-radius: var(--r-pill); background: currentColor; }

/* ── The one form on the site ─────────────────────────────────────────────
   Markup, read off the render rather than assumed (the first pass guessed and
   styled the wrong three elements):

     form.hfind
       h2.hfind-t
       div.hfind-f      > label.hfind-l + div.hfind-sel > select.hfind-s
                                                        + span.hfind-chev
       label.hfind-c    > input[checkbox] + span
       button.btn.btn--block
       p.hfind-note

   `.hfind-sel` is the WRAPPER that draws the field; `.hfind-s` is the select
   inside it. Styling the wrapper rather than the control is what lets the
   chevron sit inside the box without a background-image, and it degrades to a
   plain native select if `appearance` is unsupported. */
.hfind {
  display: grid;
  gap: var(--sp-4);
  padding: var(--sp-6);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-glass);
}
.hfind-t { font: 700 19px/25px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); }
.hfind-f { display: grid; gap: 6px; }
.hfind-l { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.hfind-sel {
  position: relative;
  display: flex; align-items: center;
  height: 48px;
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--bg-inset);
  transition: border-color var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
}
.hfind-sel:focus-within { border-color: var(--indigo); box-shadow: var(--focus-ring); }
.hfind-s {
  appearance: none; -webkit-appearance: none;
  width: 100%; height: 100%;
  padding: 0 40px 0 16px;
  border: 0; background: transparent;
  border-radius: var(--r-md);
  font: 400 15px/48px var(--font-sans);
  color: var(--ink);
  cursor: pointer;
}
.hfind-s:focus { outline: none; }
/* The shared icon is a right-pointing chevron; a select wants a down one. */
.hfind-chev {
  position: absolute; right: 14px; top: 50%;
  transform: translateY(-50%) rotate(90deg);
  color: var(--muted); pointer-events: none;
  display: block;
}
.hfind-chev svg { width: 16px; height: 16px; display: block; }
/* The accepting-clients checkbox. `.hfind-c` is the LABEL, not a container. */
.hfind-c {
  display: flex; align-items: center; gap: var(--sp-3);
  min-height: 44px;
  font: 400 14.5px/21px var(--font-sans);
  color: var(--text-body);
  cursor: pointer;
}
.hfind-c input { width: 19px; height: 19px; flex-shrink: 0; accent-color: var(--indigo); cursor: pointer; }
.hfind-note { font: 400 12.5px/18px var(--font-sans); color: var(--muted); text-wrap: pretty; }

.hsec { padding: var(--sp-12) 0; border-top: 1px solid var(--border); }
.hsec--tint {
  padding: var(--sp-12) var(--sp-8);
  margin: var(--sp-12) 0;
  border: 1px solid var(--border);
  border-top: 1px solid var(--border);
  border-radius: var(--r-xl);
  background: var(--bg-raised);
  box-shadow: var(--shadow-card);
}
.hsec-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-4); margin-bottom: var(--sp-6); flex-wrap: wrap; }
.hsec-head h2 { font: 700 34px/40px var(--font-sans); letter-spacing: -0.9px; margin-top: var(--sp-2); }
.hsec-more { font: 600 14px/20px var(--font-sans); color: var(--indigo); white-space: nowrap; }
.hsec-more:hover { text-decoration: underline; text-underline-offset: 3px; }
.hsec-lede { margin-top: var(--sp-3); max-width: 68ch; font: 400 16px/25px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.hsec-foot { margin-top: var(--sp-6); display: flex; justify-content: center; }
.hsec-foot--quiet { font: 400 13px/19px var(--font-sans); color: var(--muted); justify-content: flex-start; }

.htiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-4); }
.htile {
  padding: var(--sp-6);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
}
.htile-i { margin-bottom: var(--sp-4); width: 44px; height: 44px; border-radius: 14px; background: var(--indigo-soft); color: var(--indigo); display: grid; place-items: center; }
.htile-i svg { width: 20px; height: 20px; }
.htile-n { font: 700 24px/30px var(--font-sans); letter-spacing: -0.5px; color: var(--ink); }
.htile-b { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

.hchips { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.hchips--wide .hchip, .hchips--lang .hchip { min-width: 0; }
.hchip {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  min-height: 40px; padding: 0 var(--sp-4);
  border-radius: var(--r-pill);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-card);
  font: 500 14px/40px var(--font-sans);
  color: var(--text-body);
  transition: border-color var(--dur-fast) var(--ease-out), background var(--dur-fast) var(--ease-out);
}
.hchip:hover { border-color: rgba(84,87,224,.35); background: var(--indigo-soft); color: var(--ink); }
.hchip-l { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hchip-n { font-size: 12.5px; color: var(--muted); }
.hmore { margin-top: var(--sp-4); }
.hmore-sum {
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 44px;
  font: 600 14px/20px var(--font-sans);
  color: var(--indigo);
  cursor: pointer; list-style: none;
}
.hmore-sum::-webkit-details-marker { display: none; }
.hmore-sum::marker { content: ""; }
.hmore-chev { transition: transform var(--dur-fast) var(--ease-out); }
.hmore-chev svg { width: 16px; height: 16px; display: block; }
.hmore[open] .hmore-chev { transform: rotate(180deg); }

.hways { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-3); }
.hway {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-4);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
}
.hway:hover { border-color: rgba(84,87,224,.35); }
.hway-i { width: 38px; height: 38px; flex-shrink: 0; border-radius: var(--r-sm); background: var(--indigo-soft); color: var(--indigo); display: grid; place-items: center; }
.hway-i svg { width: 18px; height: 18px; }
.hway-n { font: 600 15px/21px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.hway-l { font: 600 15px/21px var(--font-sans); color: var(--ink); }
.hway-s { margin-top: 2px; font: 400 12.5px/18px var(--font-sans); color: var(--muted); }

.hsteps { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-6); }
.hstep { position: relative; padding-top: var(--sp-6); border-top: 2px solid var(--indigo); }
.hstep-n { position: absolute; top: -13px; left: 0; display: inline-flex; align-items: center; height: 26px; padding: 0 11px; border-radius: var(--r-pill); background: var(--indigo); color: var(--on-indigo); font: 600 12px/26px var(--font-sans); }
.hstep h3 { font: 600 18px/24px var(--font-sans); letter-spacing: -0.2px; }
.hstep p { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.hstep-disc { margin-top: var(--sp-4); padding: var(--sp-4); font: 400 13px/19px var(--font-sans); color: var(--muted); }

.hprose { border-top: 1px solid var(--border); padding: var(--sp-12) 0; }
.hprose-body { max-width: 72ch; }
.hprose-body h3 { margin-top: var(--sp-8); font: 600 20px/26px var(--font-sans); letter-spacing: -0.3px; }
.hprose-body p { margin-top: var(--sp-3); font: 400 16px/26px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

.hposts { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--sp-4); }
.hpost { padding: var(--sp-5); background: var(--bg-raised); border: 1px solid var(--border); border-radius: var(--r-xl); box-shadow: var(--shadow-card); }
.hpost-t { font: 600 17px/23px var(--font-sans); letter-spacing: -0.2px; }
.hpost-x { margin-top: var(--sp-2); font: 400 14px/21px var(--font-sans); color: var(--muted); text-wrap: pretty; }

.hfaq { display: grid; gap: var(--sp-3); }
.hfaq-i { padding: var(--sp-5); background: var(--bg-raised); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow-card); }
.hfaq-q { font: 600 16px/23px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.hfaq-a { margin-top: var(--sp-2); font: 400 14.5px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

/* ═══════════════════════════════════════════════════════════════════════════
   the Maker homepage — its own document, its own widgets
   ---------------------------------------------------------------------------
   Prefixed `m*` throughout so nothing here can collide with the shared `h*`
   homepage rules that Quick Counseling uses. The two homepages are different
   documents; two sets of class names is the cheapest way to keep them from
   quietly inheriting each other's layout.
   ═══════════════════════════════════════════════════════════════════════════ */
.mhome { padding-top: var(--sp-6); }

/* ── hero ────────────────────────────────────────────────────────────────── */
.mhero { padding: var(--sp-12) 0 var(--sp-10); max-width: 100%; }
.mhero h1 {
  margin-top: var(--sp-3);
  max-width: 18ch;
  font: 700 62px/64px var(--font-sans);
  letter-spacing: -2px;
}
.mhero-lede { margin-top: var(--sp-5); max-width: 62ch; font: 400 18px/28px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.mhero-note { margin-top: var(--sp-4); font: 400 12.5px/18px var(--font-sans); color: var(--muted); text-wrap: pretty; }

/* The stat ribbon. Numbers are links wherever the number has a page. */
.mstats { margin-top: var(--sp-6); display: flex; flex-wrap: wrap; gap: var(--sp-3) var(--sp-8); }
.mstats a, .mstats span > span { color: inherit; }
.mstats li > * { display: inline-flex; align-items: baseline; gap: var(--sp-2); }
.mstats b { font: 700 26px/30px var(--font-sans); letter-spacing: -0.6px; color: var(--ink); font-variant-numeric: tabular-nums; }
.mstats span { font: 400 13.5px/20px var(--font-sans); color: var(--muted); }
.mstats a:hover b { color: var(--indigo); }
.mstats a:hover span { color: var(--text-body); }

/* ── the search BAR — horizontal, where Quick Counseling's is a tall card ── */
.mbar {
  margin-top: var(--sp-8);
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr)) auto;
  gap: var(--sp-3);
  align-items: end;
  padding: var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-glass);
}
.mfield { display: grid; gap: 6px; min-width: 0; }
.mfield-l { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.mfield-c {
  position: relative;
  display: flex; align-items: center;
  height: 52px;
  border-radius: var(--r-md);
  border: 1px solid var(--border);
  background: var(--bg-inset);
  transition: border-color var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out);
}
.mfield-c:focus-within { border-color: var(--indigo); box-shadow: var(--focus-ring); }
.mfield-s {
  appearance: none; -webkit-appearance: none;
  width: 100%; height: 100%;
  padding: 0 40px 0 16px;
  border: 0; background: transparent; border-radius: var(--r-md);
  font: 400 15px/52px var(--font-sans);
  color: var(--ink);
  cursor: pointer;
}
.mfield-s:focus { outline: none; }
/* The shared chevron points right; a select wants a down one. */
.mfield-chev {
  position: absolute; right: 14px; top: 50%;
  transform: translateY(-50%) rotate(90deg);
  color: var(--muted); pointer-events: none;
}
.mfield-chev svg { width: 16px; height: 16px; display: block; }
.mbar-go { height: 52px; white-space: nowrap; }

/* ── sections ────────────────────────────────────────────────────────────── */
.msec { padding: var(--sp-12) 0; border-top: 1px solid var(--border); }
.msec--panel { border-top: 0; }
.msec--tint {
  padding: var(--sp-10) var(--sp-8);
  margin: var(--sp-12) 0;
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  background: var(--bg-raised);
  box-shadow: var(--shadow-card);
}
.msec-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-6); margin-bottom: var(--sp-6); flex-wrap: wrap; }
.msec-head > div { min-width: 0; }
.msec-head h2 { margin-top: var(--sp-2); font: 700 36px/42px var(--font-sans); letter-spacing: -1px; }
.msec-lede { margin-top: var(--sp-3); max-width: 66ch; font: 400 16px/25px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.msec-more { display: inline-flex; align-items: center; gap: 4px; font: 600 14px/20px var(--font-sans); color: var(--indigo); white-space: nowrap; }
.msec-more:hover { text-decoration: underline; text-underline-offset: 3px; }
.msec-more svg { width: 15px; height: 15px; }
.msec-foot { margin-top: var(--sp-6); display: flex; justify-content: center; }

/* ── 01 · concern tiles ──────────────────────────────────────────────────── */
.mtiles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-3); }
.mtile {
  display: flex; flex-direction: column; height: 100%;
  padding: var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
  transition: border-color var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-glass);
}
.mtile:hover { border-color: rgba(84,87,224,.35); transform: translateY(-2px); }
.mtile-n { font: 700 15px/20px var(--font-sans); color: var(--indigo); font-variant-numeric: tabular-nums; }
.mtile-t { margin-top: var(--sp-1); font: 600 18px/24px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); }
.mtile-b { margin-top: var(--sp-2); font: 400 13.5px/20px var(--font-sans); color: var(--muted); text-wrap: pretty; }

/* ── 02 · what a profile contains ────────────────────────────────────────── */
.mpanels { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); }
.mpanel {
  padding: var(--sp-6);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-card);
}
.mpanel-i { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 14px; background: var(--indigo-soft); color: var(--indigo); margin-bottom: var(--sp-4); }
.mpanel-i svg { width: 20px; height: 20px; }
.mpanel-h { font: 600 19px/25px var(--font-sans); letter-spacing: -0.3px; }
.mpanel-p { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.mpanel-foot { margin-top: var(--sp-5); font: 400 13px/20px var(--font-sans); color: var(--muted); text-wrap: pretty; }

/* ── 04 · the state index — a columned A–Z, not a chip cloud ─────────────── */
.mindex {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 0 var(--sp-6);
  border-top: 1px solid var(--border);
}
.mindex a {
  display: flex; align-items: baseline; gap: var(--sp-3);
  min-height: 44px; padding: var(--sp-2) 0;
  border-bottom: 1px solid var(--border);
  font: 400 14.5px/22px var(--font-sans);
  color: var(--text-body);
}
.mindex a:hover { color: var(--indigo); }
.mindex-l { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mindex-n { margin-left: auto; font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }

/* ── 05 · languages ──────────────────────────────────────────────────────── */
.mlang { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--sp-2); }
.mlang a {
  display: flex; align-items: center; gap: var(--sp-3);
  min-height: 46px; padding: 0 var(--sp-4);
  border-radius: var(--r-md);
  background: var(--bg-inset);
  border: 1px solid transparent;
  font: 500 14.5px/22px var(--font-sans);
  color: var(--text-body);
}
.mlang a:hover { border-color: rgba(84,87,224,.35); color: var(--ink); }
.mlang-l { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mlang-n { margin-left: auto; font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }

/* ── 06 · other ways in ──────────────────────────────────────────────────── */
.mways { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--sp-3); }
.mway {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-4) var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
  font: 400 14px/21px var(--font-sans);
  color: var(--text-body);
}
.mway:hover { border-color: rgba(84,87,224,.35); }
.mway-i { display: grid; place-items: center; width: 36px; height: 36px; flex-shrink: 0; border-radius: var(--r-sm); background: var(--indigo-soft); color: var(--indigo); }
.mway-i svg { width: 17px; height: 17px; }
.mway-n { font: 700 17px/22px var(--font-sans); color: var(--ink); font-variant-numeric: tabular-nums; }
.mway-l { min-width: 0; }

/* ── 07 · how it works ───────────────────────────────────────────────────── */
.msteps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-6); }
.mstep { position: relative; padding-top: var(--sp-6); border-top: 2px solid var(--indigo); }
.mstep-n {
  position: absolute; top: -14px; left: 0;
  display: inline-flex; align-items: center;
  height: 28px; padding: 0 11px;
  border-radius: var(--r-pill);
  background: var(--indigo); color: var(--on-indigo);
  font: 600 12px/28px var(--font-sans); font-variant-numeric: tabular-nums;
}
.mstep-i { display: block; margin-bottom: var(--sp-3); color: var(--indigo); }
.mstep-i svg { width: 22px; height: 22px; }
.mstep h3 { font: 600 19px/25px var(--font-sans); letter-spacing: -0.3px; }
.mstep p { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.mstep-disc {
  margin-top: var(--sp-8);
  padding: var(--sp-4) var(--sp-5);
  border: 1px dashed var(--border-strong);
  border-radius: var(--r-md);
  font: 400 13px/20px var(--font-sans);
  color: var(--muted);
  text-wrap: pretty;
}

/* ── 08 · FAQ ────────────────────────────────────────────────────────────── */
.mfaq { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
.mfaq-i { padding: var(--sp-5); background: var(--bg-raised); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow-card); }
.mfaq-q { font: 600 16px/23px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.mfaq-a { margin-top: var(--sp-2); font: 400 14.5px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

@media (max-width: 1180px) {
  .mhero h1 { font: 700 50px/54px var(--font-sans); letter-spacing: -1.5px; }
  .mtiles { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 980px) {
  .mbar { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mbar-go { grid-column: 1 / -1; }
  .mtiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mpanels, .msteps { grid-template-columns: minmax(0, 1fr); }
  .mfaq { grid-template-columns: minmax(0, 1fr); }
  .msec-head h2 { font: 700 30px/36px var(--font-sans); letter-spacing: -0.8px; }
}
@media (max-width: 680px) {
  .mhero { padding: var(--sp-8) 0 var(--sp-6); }
  .mhero h1 { font: 700 34px/40px var(--font-sans); letter-spacing: -0.9px; max-width: none; }
  .mhero-lede { font: 400 16px/25px var(--font-sans); }
  .mstats { gap: var(--sp-3) var(--sp-5); }
  .mstats b { font-size: 21px; line-height: 26px; }
  .mbar { grid-template-columns: minmax(0, 1fr); padding: var(--sp-4); }
  .msec { padding: var(--sp-10) 0; }
  .msec--tint { padding: var(--sp-8) var(--sp-5); margin: var(--sp-8) 0; }
  .msec-head h2 { font: 700 25px/31px var(--font-sans); letter-spacing: -0.6px; }
  .mtiles { grid-template-columns: minmax(0, 1fr); }
  .mindex { grid-template-columns: minmax(0, 1fr); }
  .mlang { grid-template-columns: minmax(0, 1fr); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   the two designed pages — 404 and /contact/
   ═══════════════════════════════════════════════════════════════════════════ */
.pg { padding: var(--sp-10) 0 var(--sp-12); max-width: 82ch; }
/* The skip-link target. Focusable via tabindex="-1" (see page.js), so it must
   not draw a focus ring when the fragment is followed — the ring belongs on
   the thing a person tabbed to, not on a container the browser moved them to. */
.pg:focus { outline: none; }
.pg--404 { padding-top: var(--sp-16); }
.pg-head h1 { margin-top: var(--sp-3); font: 700 40px/46px var(--font-sans); letter-spacing: -1.1px; }
.pg-lede { margin-top: var(--sp-4); font: 400 18px/28px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.pg-path {
  display: inline-block;
  padding: 3px 9px;
  border-radius: var(--r-xs);
  background: var(--bg-inset);
  font: 400 13.5px/20px var(--font-sans);
  font-variant-numeric: tabular-nums;
  color: var(--ink);
  word-break: break-all;
}
.pg-note { margin-top: var(--sp-6); padding: var(--sp-5); font: 400 14.5px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.pg-tail { margin-top: var(--sp-6); font: 400 14px/21px var(--font-sans); color: var(--muted); }
.pg-tail a { color: var(--indigo); font-weight: 500; }
.pg-sec { margin-top: var(--sp-10); }
.pg-sec--tint { margin-top: var(--sp-10); padding: var(--sp-6); background: var(--bg-raised); border: 1px solid var(--border); border-radius: var(--r-xl); box-shadow: var(--shadow-card); }
.pg-h { font: 700 24px/30px var(--font-sans); letter-spacing: -0.4px; margin-bottom: var(--sp-5); }
/* `.pg-route` is an <a> with FOUR flat children — icon, count, label, blurb —
   and no wrapper around the text. A plain flex row therefore lines all four up
   side by side and the blurb ends up level with the heading. Grid instead:
   the icon spans both rows, the count sits above the label, the blurb runs
   under them. Read off the markup, not assumed. */
.pg-routes { display: grid; gap: var(--sp-3); }
.pg-route {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr);
  grid-template-areas: "icon count" "icon label" "icon blurb";
  column-gap: var(--sp-4);
  align-items: center;
  padding: var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
  transition: border-color var(--dur-fast) var(--ease-out);
}
.pg-route:hover { border-color: rgba(84,87,224,.35); }
.pg-route-i { grid-area: icon; align-self: start; width: 40px; height: 40px; border-radius: var(--r-sm); background: var(--indigo-soft); color: var(--indigo); display: grid; place-items: center; }
.pg-route-i svg { width: 19px; height: 19px; }
.pg-route-n { grid-area: count; font: 600 15px/20px var(--font-sans); color: var(--indigo); }
.pg-route-n small { font-weight: 400; font-size: 12.5px; color: var(--muted); }
.pg-route-l { grid-area: label; display: inline-flex; align-items: center; gap: 4px; margin-top: 2px; font: 600 17px/23px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.pg-route-l svg { width: 15px; height: 15px; color: var(--muted); }
.pg-route:hover .pg-route-l { color: var(--indigo); }
.pg-route-s { grid-area: blurb; margin-top: 4px; font: 400 13.5px/20px var(--font-sans); color: var(--muted); text-wrap: pretty; }
.pg-urgent {
  margin-top: var(--sp-6);
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background: rgba(222,82,82,.08);
  border: 1px solid rgba(222,82,82,.30);
  font: 400 14.5px/23px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
.pg-urgent b, .pg-urgent strong { color: var(--danger); }
.pg-two { margin-top: var(--sp-8); display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-4); }
.pg-card { padding: var(--sp-5); background: var(--bg-raised); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--shadow-card); }
.pg-card-t { margin-top: var(--sp-2); font: 600 16px/23px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.pg-card-t a { color: var(--indigo); }
.pg-card-s { margin-top: var(--sp-2); font: 400 13px/19px var(--font-sans); color: var(--muted); text-wrap: pretty; }
.pg-address { margin-top: var(--sp-2); font: 400 14.5px/22px var(--font-sans); color: var(--ink); }
.pg-split { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--sp-6); }
.pg-col { min-width: 0; }
.pg-col .eyebrow { display: block; margin-bottom: var(--sp-3); }
.pg-list { display: grid; gap: var(--sp-2); }
.pg-list li { position: relative; padding-left: 24px; font: 400 14.5px/22px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.pg-list li::before {
  content: ""; position: absolute; left: 4px; top: 8px;
  width: 7px; height: 4px;
  border-left: 1.5px solid var(--success);
  border-bottom: 1.5px solid var(--success);
  transform: rotate(-45deg);
}
.pg-list--no li::before {
  width: 9px; height: 0; border-left: 0; border-bottom: 1.5px solid var(--muted); transform: none; top: 11px;
}
.pg-body { font: 400 15px/24px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.pg-cta { margin-top: var(--sp-5); }

/* ═══════════════════════════════════════════════════════════════════════════
   the long-form documents — about, privacy, terms
   ---------------------------------------------------------------------------
   These are the only pages on either site somebody arrives at to LOOK SOMETHING
   UP rather than to read: "does it record my screen", "what happens to the
   click". So the layout is built for scanning first and reading second — a
   contents rail that stays put, numbered sections that survive being linked to
   mid-page, and tables where the source material is a table.

   THE READING COLUMN IS 68ch, not the 82ch `.pg` uses. `.pg` sets a lede at
   18px and then stops; these run to eleven screens at 16.5px, where the
   measure is the difference between a policy somebody reads and one they scroll
   past. The rail is narrower than `--rail` (316px) for the same reason: every
   pixel it gives back goes to the prose.
   ═══════════════════════════════════════════════════════════════════════════ */
.lg { padding: var(--sp-10) 0 var(--sp-16); }
/* Skip-link target — see legal.js. Same rule and same reason as `.pg:focus`. */
.lg:focus { outline: none; }

/* ⚠ THE MEASURE IS SET PER ELEMENT, NOT ON THE HEADER. Putting a 30ch cap on
   `.lg-head` clamped the lede and the date line with it — the date wrapped
   after "Maker" and the lede ran at 28 characters, which reads as a bug rather
   than a decision. A display heading wants a short measure; a lede does not. */
.lg-head h1 {
  max-width: 20ch;
  margin-top: var(--sp-3);
  font: 700 44px/50px var(--font-sans);
  letter-spacing: -1.3px;
  text-wrap: balance;
}
.lg-lede {
  max-width: 56ch;
  margin-top: var(--sp-4);
  font: 400 19px/29px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
/* The date is the single most-checked fact on a policy page — somebody wants to
   know whether it changed since they last agreed to it. Given its own line,
   in tabular figures so a column of them would align. */
.lg-updated {
  margin-top: var(--sp-5);
  font: 500 12.5px/18px var(--font-sans);
  color: var(--muted);
  font-variant-numeric: tabular-nums;
}
.lg-updated time { color: var(--ink); }

/* ── the short version ─────────────────────────────────────────────────────
   Raised, indigo-edged, and directly under the lede, because the honest thing
   to do with a document nobody finishes is to put the answer at the top. It is
   a SUMMARY, never a substitute: `.lg-summary-n` says so on the privacy page
   and the terms. */
.lg-summary {
  max-width: 78ch;
  margin-top: var(--sp-8);
  padding: var(--sp-6);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-left: 3px solid var(--indigo);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
}
.lg-summary-l { display: grid; gap: var(--sp-3); margin-top: var(--sp-4); }
.lg-summary-l li {
  position: relative;
  padding-left: 26px;
  font: 400 15px/23px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
.lg-summary-l li::before {
  content: "";
  position: absolute;
  left: 4px;
  top: 8px;
  width: 7px;
  height: 7px;
  border-radius: var(--r-pill);
  background: var(--indigo);
}
.lg-summary-n {
  margin-top: var(--sp-4);
  padding-top: var(--sp-4);
  border-top: 1px solid var(--border);
  font: 400 13px/20px var(--font-sans);
  color: var(--muted);
  text-wrap: pretty;
}

/* ── body: contents rail + prose ───────────────────────────────────────── */
.lg-body {
  display: grid;
  grid-template-columns: 244px minmax(0, 72ch);
  gap: var(--sp-12);
  margin-top: var(--sp-12);
  align-items: start;
}
.lg-main { min-width: 0; }

/* Sticky at the header's height plus a gutter, and capped so a fourteen-item
   list on a short laptop scrolls inside the rail rather than running off it. */
.lg-toc {
  position: sticky;
  top: var(--sp-10);
  max-height: calc(100vh - var(--sp-16));
  overflow-y: auto;
  overscroll-behavior: contain;
  padding-right: var(--sp-2);
}
.lg-toc-m { display: none; }
.lg-toc-l { display: grid; gap: 2px; margin-top: var(--sp-3); }
.lg-toc-l a {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr);
  gap: var(--sp-2);
  align-items: baseline;
  padding: 7px var(--sp-3) 7px var(--sp-2);
  border-radius: var(--r-xs);
  font: 500 13.5px/19px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
.lg-toc-l a:hover { background: var(--indigo-soft); color: var(--indigo); }
.lg-n {
  font: 600 11px/19px var(--font-sans);
  font-variant-numeric: tabular-nums;
  color: var(--muted);
  letter-spacing: 0.4px;
}
.lg-toc-l a:hover .lg-n { color: var(--indigo); }

/* Below the breakpoint the rail becomes a closed `<details>`. A fourteen-item
   list wedged above the first paragraph on a phone is worse than no list. */
.lg-toc-m > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  padding: var(--sp-4) var(--sp-5);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  box-shadow: var(--shadow-card);
  font: 600 14px/20px var(--font-sans);
  color: var(--ink);
  cursor: pointer;
  list-style: none;
}
.lg-toc-m > summary::-webkit-details-marker { display: none; }
.lg-toc-m[open] > summary { border-radius: var(--r-md) var(--r-md) 0 0; }
.lg-toc-n {
  min-width: 24px;
  padding: 0 8px;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  color: var(--indigo);
  font: 600 11.5px/22px var(--font-sans);
  font-variant-numeric: tabular-nums;
  text-align: center;
}
.lg-toc-m[open] > .lg-toc-l {
  margin-top: 0;
  padding: var(--sp-2);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-top: 0;
  border-radius: 0 0 var(--r-md) var(--r-md);
}

/* ── sections ──────────────────────────────────────────────────────────────
   `scroll-margin-top` is not decoration: every heading here is a link target,
   and without it the browser parks the anchor flush against the top of the
   viewport underneath the floating header capsule. */
.lg-sec { scroll-margin-top: var(--sp-16); }
.lg-sec + .lg-sec { margin-top: var(--sp-12); }
.lg-sec > h2 {
  display: grid;
  grid-template-columns: 34px minmax(0, 1fr);
  align-items: baseline;
  margin-bottom: var(--sp-4);
  padding-bottom: var(--sp-3);
  border-bottom: 1px solid var(--border);
  font: 700 24px/31px var(--font-sans);
  letter-spacing: -0.5px;
  color: var(--ink);
  text-wrap: balance;
}
.lg-sec > h2 .lg-n { font-size: 12px; line-height: 31px; }
.lg-sec h3 {
  margin-top: var(--sp-6);
  font: 600 16.5px/24px var(--font-sans);
  letter-spacing: -0.2px;
  color: var(--ink);
}
.lg-sec p, .lg-tail p {
  margin-top: var(--sp-4);
  font: 400 16.5px/27px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
.lg-sec h3 + p { margin-top: var(--sp-2); }
/* `anywhere` for the same reason Quick Counseling's `.post-body a` has it: a
   long unbreakable token in a link — a raw URL, a long support address — is a
   single box wider than a 320px phone, and one of those gives the whole
   document a sideways scroll. Maker's documents are written here rather than
   imported, so none has one today; this is what stops the next edit adding one
   without anybody noticing. See post.css for the version that was a live bug. */
.lg-sec a, .lg-tail a { color: var(--indigo); font-weight: 500; overflow-wrap: anywhere; }
.lg-sec strong, .lg-tail strong { color: var(--ink); font-weight: 600; }

.lg-list, .lg-ol { display: grid; gap: var(--sp-3); margin-top: var(--sp-4); }
.lg-list li, .lg-ol li {
  position: relative;
  padding-left: 26px;
  font: 400 16px/26px var(--font-sans);
  color: var(--text-body);
  text-wrap: pretty;
}
.lg-list li::before {
  content: "";
  position: absolute;
  left: 6px;
  top: 11px;
  width: 5px;
  height: 5px;
  border-radius: var(--r-pill);
  background: var(--border-strong);
}
.lg-ol { counter-reset: lg-ol; }
.lg-ol li { padding-left: 30px; counter-increment: lg-ol; }
.lg-ol li::before {
  content: counter(lg-ol) ".";
  position: absolute;
  left: 0;
  top: 0;
  font: 600 14px/26px var(--font-sans);
  font-variant-numeric: tabular-nums;
  color: var(--indigo);
}

/* An inset aside. Same weight as body text — a note that shouts is a note
   people learn to skip. */
.lg-note {
  margin-top: var(--sp-5) !important;
  padding: var(--sp-4) var(--sp-5);
  background: var(--bg-inset);
  border-radius: var(--r-md);
  font-size: 15px !important;
  line-height: 24px !important;
}
/* ⚠ THE ONE WARNING ON THE SITE — the emergency notice in the Terms. It is
   allowed to be loud precisely because nothing else is: if every caveat had a
   red rule, the one that matters at 3am would read as furniture. */
.lg-warn {
  margin-top: var(--sp-5);
  padding: var(--sp-5);
  background: rgba(185,59,59,.07);
  border: 1px solid rgba(185,59,59,.28);
  border-left: 3px solid var(--danger);
  border-radius: var(--r-md);
}
.lg-warn p { margin-top: 0; color: var(--ink); font-weight: 500; }

/* ── tables ────────────────────────────────────────────────────────────────
   What is collected, by whom, and for how long is genuinely tabular data, and
   prose about it is how a policy becomes unreadable. The wrapper scrolls
   horizontally on a phone; `tabindex="0"` is not set because the rows here are
   short enough to reflow — see the 680px rule below, where the header row is
   dropped and each cell is labelled instead. */
.lg-tablewrap {
  margin-top: var(--sp-5);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--bg-raised);
}
.lg-table { width: 100%; border-collapse: collapse; font: 400 14.5px/22px var(--font-sans); }
.lg-table thead th {
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-inset);
  border-bottom: 1px solid var(--border);
  text-align: left;
  font: 600 11px/16px var(--font-sans);
  letter-spacing: 0.6px;
  text-transform: uppercase;
  color: var(--muted);
}
.lg-table td, .lg-table tbody th {
  padding: var(--sp-4);
  border-top: 1px solid var(--border);
  color: var(--text-body);
  text-align: left;
  vertical-align: top;
  text-wrap: pretty;
}
.lg-table tbody tr:first-child td, .lg-table tbody tr:first-child th { border-top: 0; }
.lg-table tbody th { font-weight: 600; color: var(--ink); }

/* Definition rows — a term and what it means, which is most of what a terms
   page is actually doing when it defines "the Service" or "you". */
.lg-defs { display: grid; gap: var(--sp-4); margin-top: var(--sp-5); }
.lg-defs > div {
  display: grid;
  grid-template-columns: minmax(0, 13rem) minmax(0, 1fr);
  gap: var(--sp-4);
  padding-bottom: var(--sp-4);
  border-bottom: 1px solid var(--border);
}
.lg-defs > div:last-child { padding-bottom: 0; border-bottom: 0; }
.lg-defs dt { font: 600 15px/23px var(--font-sans); color: var(--ink); }
.lg-defs dd { font: 400 15px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

/* The closing block — how to reach a human. Raised, so it reads as the end of
   the document rather than a fifteenth section. */
.lg-tail {
  margin-top: var(--sp-12);
  padding: var(--sp-6);
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-card);
}
.lg-tail > h2 {
  font: 700 20px/27px var(--font-sans);
  letter-spacing: -0.3px;
  color: var(--ink);
}
.lg-tail > h2 + p { margin-top: var(--sp-3); }

/* ═══════════════════════════════════════════════════════════════════════════
   the profile — identity rail LEFT, document RIGHT
   ═══════════════════════════════════════════════════════════════════════════ */
/* ═══════════════════════════════════════════════════════════════════════════
   layout — identity rail LEFT, document RIGHT
   ═══════════════════════════════════════════════════════════════════════════ */
.record {
  display: grid;
  grid-template-columns: var(--rail) minmax(0, 1fr);
  gap: var(--gap);
  padding: var(--sp-5) 0 var(--sp-12);
  align-items: start;
}

/* Solid content card — never glass. */
.card {
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  padding: var(--sp-6);
  box-shadow: var(--shadow-card);
}

/* ── identity card ────────────────────────────────────────────────────── */
.ident { position: sticky; top: 88px; }

.portrait {
  --size: 76px;
  width: var(--size); height: var(--size);
  border-radius: var(--r-pill);
  position: relative;
  overflow: hidden;
  background: var(--indigo-soft);
  box-shadow: inset 0 0 0 1px var(--border);
}
.portrait .ini {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  font: 600 26px/1 var(--font-sans);
  letter-spacing: -0.5px;
  color: var(--indigo);
}
.portrait .photo {
  position: absolute; inset: 0; z-index: 1;
  width: 100%; height: 100%;
  object-fit: cover; background: transparent; border: 0;
}

.ident h1 {
  margin-top: var(--sp-4);
  font: 700 26px/32px var(--font-sans);
  letter-spacing: -0.5px;
}
.ident .role { margin-top: var(--sp-2); font: 400 14px/20px var(--font-sans); color: var(--text-body); }

.chips { margin-top: var(--sp-3); display: flex; flex-wrap: wrap; gap: var(--sp-2); }
/* Chips are defined once, in the shared components block above. A second
   definition lived here while this sheet dressed the profile only, and when the
   theme grew to the whole site it won on source order and set EVERY chip on
   every page in 11px uppercase — so a specialty tag read "TRAUMA AND ABUSE".
   Deleted rather than re-tuned: one component, one rule. */

.ref { margin-top: var(--sp-5); }
.ref > div {
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-3);
  padding: var(--sp-3) 0;
  border-top: 1px solid var(--border);
}
.ref dt { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); white-space: nowrap; }
.ref dd { font: 500 14px/20px var(--font-sans); color: var(--ink); text-align: right; }

.btn {
  height: 48px; padding: 0 22px;
  border-radius: var(--r-pill);
  font: 600 15px/22px var(--font-sans);
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
  border: 0; cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-glass);
}
.btn-primary { background: var(--indigo); color: var(--on-indigo); }
.btn-primary:hover { background: var(--indigo-deep); }
.btn-primary:active { transform: scale(.985); }
.btn svg { width: 16px; height: 16px; flex-shrink: 0; }
.ident .btn { margin-top: var(--sp-5); width: 100%; }

.ident .fine { margin-top: var(--sp-3); font: 400 12px/17px var(--font-sans); color: var(--muted); text-wrap: pretty; }
.ident .fine a { color: var(--indigo); }

/* ── document column ──────────────────────────────────────────────────── */
.doc { min-width: 0; display: flex; flex-direction: column; gap: var(--gap); }

.lede { margin-top: var(--sp-3); font: 400 21px/30px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); text-wrap: pretty; }
.sub  { margin-top: var(--sp-4); font: 400 14px/21px var(--font-sans); color: var(--muted); text-wrap: pretty; max-width: 68ch; }

/* The stat strip — the system's "evidence of life" rule, all tabular. */
.stats {
  margin-top: var(--sp-5);
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--sp-3);
}
.stats > div {
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-inset);
  border-radius: var(--r-sm);
}
.stat-v { display: block; font: 600 20px/26px var(--font-sans); letter-spacing: -0.3px; color: var(--ink); }
.stat-l { display: block; margin-top: 2px; font: 400 12px/16px var(--font-sans); color: var(--muted); }

.index { margin-top: var(--sp-5); display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.index a {
  display: inline-flex; align-items: center; gap: 6px;
  height: 30px; padding: 0 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--bg-raised);
  font: 500 12px/30px var(--font-sans);
  color: var(--text-body);
  transition: background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
}
.index a:hover { background: var(--indigo-soft); border-color: rgba(84,87,224,.35); color: var(--ink); }
.index a .n { color: var(--indigo); font-variant-numeric: tabular-nums; }

.sec { scroll-margin-top: 92px; }
.sec > h2 { margin-top: var(--sp-2); font: 700 24px/30px var(--font-sans); letter-spacing: -0.3px; }
.sec > .intro { margin-top: var(--sp-3); font: 400 15px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; max-width: 68ch; }

/* ── tags ─────────────────────────────────────────────────────────────── */
.split { margin-top: var(--sp-5); display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-6); }
.split > div + div { padding-left: var(--sp-6); border-left: 1px solid var(--border); }
.split .caption { display: block; margin-bottom: var(--sp-3); }
.tags { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.tag {
  display: inline-flex; align-items: center; gap: 6px;
  height: 30px; padding: 0 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--border);
  background: var(--bg-inset);
  font: 500 13px/30px var(--font-sans);
  color: var(--text-body);
}
.tag--lead { background: var(--indigo-soft); border-color: rgba(84,87,224,.35); color: var(--ink); }
.tag--lead .dot { width: 5px; height: 5px; border-radius: var(--r-pill); background: var(--indigo); }
.tag-note { margin-top: var(--sp-3); font: 400 12px/17px var(--font-sans); color: var(--muted); }
.tag-note .dot { display: inline-block; width: 5px; height: 5px; border-radius: var(--r-pill); background: var(--indigo); margin-right: 6px; vertical-align: 2px; }

/* ── the bio, in a solid inset well ───────────────────────────────────── */
.quoted {
  margin-top: var(--sp-5);
  padding: var(--sp-5);
  background: var(--bg-inset);
  border-radius: var(--r-md);
}
.quoted p { font: 400 16px/26px var(--font-sans); color: var(--ink); text-wrap: pretty; }
.quoted p + p { margin-top: var(--sp-3); }
/* Attribution is a footnote, not a caption: at this length the system's
   uppercase caption style shouts, and `footnote` is the style it provides for
   exactly this — secondary, sentence case, muted. */
.quoted .src {
  margin-top: var(--sp-4); padding-top: var(--sp-3);
  border-top: 1px solid var(--border);
  font: 400 13px/18px var(--font-sans);
  color: var(--muted);
}

/* ── glossary ─────────────────────────────────────────────────────────── */
.gloss { margin-top: var(--sp-5); display: grid; gap: var(--sp-3); }
.gloss > div {
  display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: var(--sp-5);
  padding: var(--sp-4);
  background: var(--bg-inset);
  border-radius: var(--r-sm);
}
.gloss dt { font: 600 15px/21px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
.gloss dt .abbr { display: block; margin-top: var(--sp-1); font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.gloss dd { font: 400 14px/21px var(--font-sans); color: var(--text-body); text-wrap: pretty; }

/* ── steps ────────────────────────────────────────────────────────────── */
.steps { margin-top: var(--sp-5); counter-reset: step; }
.steps > li { position: relative; padding: 0 0 var(--sp-6) 48px; counter-increment: step; }
.steps > li::before {
  content: counter(step);
  position: absolute; left: 0; top: 0;
  width: 30px; height: 30px;
  display: grid; place-items: center;
  border-radius: var(--r-pill);
  background: var(--indigo-soft);
  color: var(--indigo);
  font: 600 13px/1 var(--font-sans);
  font-variant-numeric: tabular-nums;
}
.steps > li::after {
  content: ""; position: absolute; left: 14.5px; top: 36px; bottom: 8px;
  width: 1px; background: var(--border);
}
.steps > li:last-child { padding-bottom: 0; }
.steps > li:last-child::after { display: none; }
.steps h3 { font: 600 16px/22px var(--font-sans); letter-spacing: -0.2px; }
.steps p { margin-top: var(--sp-1); font: 400 14px/21px var(--font-sans); color: var(--text-body); text-wrap: pretty; max-width: 60ch; }

/* ── questions ────────────────────────────────────────────────────────── */
.asks { margin-top: var(--sp-5); display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); }
.asks li { padding: var(--sp-4); background: var(--bg-inset); border-radius: var(--r-sm); }
.asks .q { font: 600 15px/22px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); text-wrap: pretty; }
.asks .why { margin-top: var(--sp-2); font: 400 13px/19px var(--font-sans); color: var(--muted); text-wrap: pretty; }

/* ── practical ────────────────────────────────────────────────────────── */
.facts { margin-top: var(--sp-5); }
.facts > div {
  display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: var(--sp-5);
  padding: var(--sp-3) 0;
  border-top: 1px solid var(--border);
  align-items: baseline;
}
.facts dt { font: 500 11px/14px var(--font-sans); letter-spacing: 0.5px; text-transform: uppercase; color: var(--muted); }
.facts dd { font: 400 15px/22px var(--font-sans); color: var(--ink); }
.facts dd .qual { color: var(--muted); font-size: 13px; }

.platform { margin-top: var(--sp-5); padding: var(--sp-5); background: var(--bg-inset); border-radius: var(--r-md); }
.platform .row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3) var(--sp-5); }
.fee { font: 700 26px/32px var(--font-sans); letter-spacing: -0.5px; color: var(--ink); }
.fee small { font: 400 13px/18px var(--font-sans); color: var(--muted); }
.modes { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-left: auto; }
.mode {
  display: inline-flex; align-items: center; gap: 6px;
  height: 30px; padding: 0 12px;
  border-radius: var(--r-pill);
  background: var(--bg-raised); border: 1px solid var(--border);
  font: 500 12.5px/30px var(--font-sans); color: var(--text-body);
}
.mode svg { width: 14px; height: 14px; color: var(--muted); }
.platform > p { margin-top: var(--sp-4); font: 400 13px/19px var(--font-sans); color: var(--muted); text-wrap: pretty; }


/* The approaches the glossary has no entry for. They are still the therapist's
   listed methods, so they are printed — as bare names, with no description.
   See approaches.js: silence is the correct output for "not written yet". */
.gloss-more { display: block; margin-top: var(--sp-5); margin-bottom: var(--sp-3); }

/* "Check this licence on the Colorado register" — the one outbound link in the
   content that is not the affiliate hop. */
.lookup { margin-top: var(--sp-4); font: 500 14px/20px var(--font-sans); }
.lookup a { color: var(--indigo); }
.lookup a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* A profile with no licence lookup, no fee and no formats ends §06 on the facts
   table, whose last row already draws a rule. Nothing to add. */

/* ── provenance ───────────────────────────────────────────────────────── */
.prov { margin-top: var(--sp-4); font: 400 14.5px/23px var(--font-sans); color: var(--text-body); text-wrap: pretty; max-width: 68ch; }
.prov + .prov { margin-top: var(--sp-3); }
.report { margin-top: var(--sp-5); padding-top: var(--sp-4); border-top: 1px solid var(--border); font: 400 13px/19px var(--font-sans); color: var(--muted); }
.report a { color: var(--indigo); font-weight: 500; }

/* ═══════════════════════════════════════════════════════════════════════════
   glass layer 2 — the mobile action dock (profile only, below 900px)
   ═══════════════════════════════════════════════════════════════════════════ */
.dock { display: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   1180 → the rail narrows before anything collapses
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 1180px) {
  .hero { grid-template-columns: minmax(0, 1fr) 340px; gap: var(--sp-10); }
  .hero h1 { font: 700 46px/52px var(--font-sans); letter-spacing: -1.2px; }
  .archive-head h1 { font: 700 34px/40px var(--font-sans); letter-spacing: -0.9px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   980 → the archive rail collapses behind a disclosure
   ---------------------------------------------------------------------------
   DOM ORDER IS UNCHANGED: the filters still precede the results, so the
   reading order and the tab order are the same as on desktop. What changes is
   that the rail is folded behind `.ftoggle` — and it deliberately does NOT
   arrive open on a filtered page, because the applied filters are already
   above the results as `.activebar` chips (RENDER-NOTES §9).
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 980px) {
  .archive-layout { grid-template-columns: minmax(0, 1fr); }
  .filters { position: static; max-height: none; overflow: visible; }
  .ftoggle { display: block; }

  /* ⚠ `.filters-body`, NOT `.filters` — THE OLD SELECTOR COULD NEVER MATCH.
     It read `.ftoggle:not([open]) + .filters`, i.e. "the .filters that FOLLOWS
     the toggle". `.filters` is the toggle's PARENT (`<aside class="filters">`
     contains `<details class="ftoggle">` then `<div class="filters-body">`), so
     a sibling combinator had nothing to select and the rule was dead CSS.

     Nothing looked broken: the toggle rendered, it opened and closed, and its
     chevron turned. It just never hid anything. Measured on a 390x844 phone,
     the panel stayed 839px tall with the toggle CLOSED and the first therapist
     card began at y=1258 — a screen and a half of filter rail before a single
     result, on the page whose entire job is showing results. Quick Counseling,
     whose sheet targets `.filters-body` correctly, put its first card at
     y=462.

     Same structure, same intent, one wrong selector — which is why the harness
     now asserts the collapsed height rather than the presence of the rule. */
  .filters-body { display: none; }
  .ftoggle[open] ~ .filters-body { display: grid; }

  /* Open, the panel is a card in its own right, hinged off the summary above
     it — the two rounded shapes have to read as one control, not as a button
     that happens to sit on a box. */
  .ftoggle[open] > .ftoggle-b {
    border-radius: var(--r-lg) var(--r-lg) 0 0;
    border-bottom-color: transparent;
    box-shadow: none;
  }
  .ftoggle[open] > .ftoggle-b .fgroup-chev { transform: rotate(180deg); }
  .ftoggle[open] ~ .filters-body {
    margin-top: 0;
    padding: var(--sp-2) var(--sp-5) var(--sp-5);
    background: var(--bg-raised);
    border: 1px solid var(--border);
    border-top: 0;
    border-radius: 0 0 var(--r-lg) var(--r-lg);
    box-shadow: var(--shadow-card);
  }

  /* ── the header row, and the way back to the results ────────────────────
     `.filters-skip` is a skip LINK, and the first version of this made it a
     full-width indigo button — which put the loudest element on the page at the
     TOP of the panel, next to the "Refine" caption, competing with the filters
     it was meant to skip. It reads as "the thing to press", and pressing it
     does nothing but scroll past the control you just opened.

     It is a quiet link on the right of the caption row, which is what it is.
     The real way back to the results on a phone is the flow the markup already
     has: every filter is a LINK, so tapping one navigates, the new page arrives
     with the toggle closed and the count updated, and the results are directly
     underneath. Nothing to submit and nothing to dismiss. */
  .filters-head { display: flex; align-items: center; gap: var(--sp-3); }
  .filters-skip {
    margin-left: auto;
    font: 600 13px/20px var(--font-sans);
    color: var(--indigo);
  }

  /* ⚠ THE ASIDE GIVES UP ITS CARD CHROME TO THE TOGGLE. On desktop `.filters`
     IS the card — a white rail beside the results. On a phone the toggle is its
     own pill and the open body is its own card, so leaving the aside's
     background and border in place drew a white card inside a white card with a
     pill floating in it. Same move archive.css already makes, and for the same
     reason. */
  .filters {
    background: none;
    border: 0;
    box-shadow: none;
    padding: 0;
  }
  .hero { grid-template-columns: minmax(0, 1fr); gap: var(--sp-8); }
  .hero { padding: var(--sp-10) 0 var(--sp-8); }
  .hfind { max-width: 520px; }
  .hsec--tint { padding: var(--sp-10) var(--sp-6); }
  /* The contents rail collapses into the `<details>` above the prose. Both
     lists render from the same array (legal.js `contents()`), so what is
     hidden here and what is shown cannot disagree. */
  .lg-body { grid-template-columns: minmax(0, 1fr); gap: var(--sp-8); margin-top: var(--sp-8); }
  .lg-toc { display: none; }
  .lg-toc-m { display: block; }
  .lg-head h1, .lg-lede, .lg-summary { max-width: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   900 → the profile identity card unpins and becomes a banner
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 900px) {
  .record { grid-template-columns: minmax(0, 1fr); }
  .ident {
    position: static;
    display: grid;
    grid-template-columns: 76px minmax(0, 1fr);
    grid-template-areas: "portrait id" "ref ref";
    column-gap: var(--sp-4);
    align-items: start;
  }
  .ident .portrait { grid-area: portrait; }
  .ident .idbox { grid-area: id; }
  .ident h1 { margin-top: 0; }
  .ident .ref { grid-area: ref; }
  .ident .btn, .ident .fine { display: none; }   /* the dock carries the action */
  .ident .ref > div:first-child { border-top: 1px solid var(--border); }
  .gloss > div, .facts > div { grid-template-columns: 170px minmax(0, 1fr); gap: var(--sp-4); }

  body { padding-bottom: 92px; }
  .dock {
    position: fixed; inset: auto 0 0 0; z-index: 60;
    display: block;
    padding: 0 var(--gutter) max(12px, env(safe-area-inset-bottom));
  }
  .dock-inner {
    max-width: var(--page-max);
    margin: 0 auto;
    display: flex; align-items: center; gap: var(--sp-4);
    padding: 10px 10px 10px 18px;
    border-radius: var(--r-pill);
    background: var(--glass-bg-strong);
    -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
    backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
    border: 1px solid var(--glass-edge);
    box-shadow: inset 0 1px 0 var(--glass-specular), var(--shadow-glass);
  }
  .dock .l { flex: 1; min-width: 0; }
  .dock .who { font: 600 14px/19px var(--font-sans); letter-spacing: -0.2px; color: var(--ink); }
  .dock .st { font: 400 12px/16px var(--font-sans); color: var(--muted); }
  .dock .btn { height: 44px; padding: 0 20px; font-size: 14px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   680 → the phone artboard
   ---------------------------------------------------------------------------
   The header's links fold behind the disclosure button. The nav is the
   button's SIBLING, not its child — `.navt[open] ~ .site-nav` — so a browser
   that has never heard of `::details-content` still shows the whole navigation
   on desktop, and with no CSS at all the links are simply visible. That is the
   shared header's device and the reason RENDER-NOTES §9 exists: both sites
   once shipped a phone nav that was `display: none` with nothing in its place.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 680px) {
  .site-header { height: 56px; gap: var(--sp-2); padding: 0 8px 0 14px; }
  .logo-word { font-size: 16px; }
  .navt { display: block; margin-left: auto; }
  .site-nav {
    display: none;
    position: absolute; top: calc(100% + 8px); right: 0; left: 0;
    flex-direction: column;
    padding: var(--sp-2);
    border-radius: var(--r-xl);
    /* SOLID, not frosted. Nesting one backdrop-filter inside another (the
       header already has one) resolves inconsistently, and the first render of
       it put the nav links straight over the therapist's name. The system's own
       rule decides it: text sits on solid or strong-frosted layers only. The
       glass EDGE and SHADOW stay, so it still reads as the navigation layer. */
    background: var(--bg-raised);
    border: 1px solid var(--glass-edge);
    box-shadow: inset 0 1px 0 var(--glass-specular), var(--shadow-glass);
  }
  .navt[open] ~ .site-nav { display: flex; }
  .site-nav a { min-height: 44px; padding: 12px 14px; border-radius: var(--r-md); font-size: 15px; color: var(--ink); }
  .site-header { position: sticky; }
  .page { position: relative; }

  .card { padding: var(--sp-5); border-radius: var(--r-lg); }
  .lede { font: 400 18px/26px var(--font-sans); }
  .sec > h2 { font: 700 21px/27px var(--font-sans); }
  .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .split { grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); }
  .split > div + div { padding-left: 0; padding-top: var(--sp-5); border-left: 0; border-top: 1px solid var(--border); }
  .gloss > div, .facts > div { grid-template-columns: minmax(0, 1fr); gap: var(--sp-1); }
  .asks { grid-template-columns: minmax(0, 1fr); }
  .modes { margin-left: 0; width: 100%; }
  .ident { grid-template-columns: 64px minmax(0, 1fr); }
  .portrait { --size: 64px; }
  .portrait .ini { font-size: 22px; }
  .ident h1 { font: 700 22px/28px var(--font-sans); }

  .hero { padding: var(--sp-8) 0 var(--sp-6); }
  .hero h1 { font: 700 34px/40px var(--font-sans); letter-spacing: -0.9px; }
  .hero-lede { font: 400 16px/25px var(--font-sans); }
  .hfind { padding: var(--sp-5); }
  .hsec { padding: var(--sp-10) 0; }
  .hsec--tint { padding: var(--sp-8) var(--sp-5); margin: var(--sp-8) 0; }
  .hsec-head h2 { font: 700 26px/32px var(--font-sans); letter-spacing: -0.6px; }
  .archive-head h1 { font: 700 28px/34px var(--font-sans); letter-spacing: -0.7px; }
  .pg-head h1 { font: 700 28px/34px var(--font-sans); letter-spacing: -0.7px; }
  .pg-h { font: 700 20px/26px var(--font-sans); }
  .rgrid { grid-template-columns: minmax(0, 1fr); }
  .foot-main { grid-template-columns: minmax(0, 1fr); gap: var(--sp-6); padding: var(--sp-8) 0; }
  .foot-bot { padding-bottom: var(--sp-8); }
  .foot-bot .right { margin-left: 0; }
  .activebar { flex-direction: column; align-items: flex-start; }
  .activebar-clear { margin-left: 0; }
  .results-page { margin-left: 0; width: 100%; }


  /* ── the long-form documents on a phone ──────────────────────────────────
     Type comes down a step, the section rule stays (it is the only thing
     separating eleven screens of prose), and the two grid shapes — the defs
     and the tables — stop being grids. */
  .lg { padding: var(--sp-8) 0 var(--sp-12); }
  .lg-head h1 { font: 700 31px/37px var(--font-sans); letter-spacing: -0.9px; }
  .lg-lede { font: 400 17px/26px var(--font-sans); }
  .lg-summary { padding: var(--sp-5); }
  .lg-sec > h2 { grid-template-columns: 28px minmax(0, 1fr); font: 700 20px/27px var(--font-sans); }
  .lg-sec > h2 .lg-n { line-height: 27px; }
  .lg-sec p, .lg-tail p { font: 400 16px/26px var(--font-sans); }
  .lg-defs > div { grid-template-columns: minmax(0, 1fr); gap: var(--sp-1); }
  .lg-tail { padding: var(--sp-5); }
  .lg-toc-l a { min-height: 44px; align-items: center; }

  /* ⚠ THE TABLE STOPS BEING A TABLE. A four-column "what is collected" grid at
     360px is either a horizontal scroll nobody discovers or four words per
     line. Each row becomes a card, the row header becomes its title, and every
     cell carries its column name from `data-label` — which is why block() in
     legal.js writes that attribute even though nothing above this width reads
     it. `role="presentation"` is NOT set: the caption-less flattening keeps the
     semantic row/cell relationship for a screen reader, which is still the
     correct model; only the visual grid is dropped. */
  .lg-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
  .lg-table, .lg-table tbody, .lg-table tr, .lg-table td, .lg-table th { display: block; }
  .lg-table tbody tr { padding: var(--sp-4); border-top: 1px solid var(--border); }
  .lg-table tbody tr:first-child { border-top: 0; }
  .lg-table tbody th {
    padding: 0 0 var(--sp-2);
    border-top: 0;
    font: 600 15.5px/23px var(--font-sans);
  }
  .lg-table td {
    padding: var(--sp-2) 0 0;
    border-top: 0;
    font: 400 14.5px/22px var(--font-sans);
  }
  .lg-table td[data-label]::before {
    content: attr(data-label);
    display: block;
    margin-bottom: 2px;
    font: 600 10.5px/15px var(--font-sans);
    letter-spacing: 0.6px;
    text-transform: uppercase;
    color: var(--muted);
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   44px minimum on every DISCRETE control — ON TOUCH, NOT ON NARROW
   ---------------------------------------------------------------------------
   ⚠ THIS USED TO LIVE INSIDE `@media (max-width: 680px)`, AND WIDTH WAS THE
   WRONG QUESTION. A sweep of every page type at 320/360/390/430/768 found the
   phone widths clean and 768 carrying 430 undersized controls — because an
   iPad in portrait is 768px, is unambiguously a finger, and sat one pixel the
   wrong side of a breakpoint. Every 810px and 834px tablet was in the same
   position, as was any phone held in landscape.

   `pointer: coarse` asks the question that actually matters: is the primary
   input a finger or a cursor? It catches the tablets and the landscape phones,
   and it correctly LEAVES ALONE a 400px-wide desktop browser window, where a
   44px minimum buys nothing and costs vertical space.

   `max-width: 680px` is kept as the second half of the query, not because it
   adds a device — it does not — but because it is the fallback for a touch
   device whose browser reports `pointer: fine` or does not report at all, and
   because it keeps the rules applying in a narrow desktop window during
   development, which is where they get looked at.

   WCAG 2.5.8 (AA) asks for 24x24 and exempts links inline in a sentence;
   RENDER-NOTES §9 set the bar at 44 for this site's mobile pass. `min-height`
   plus `inline-flex` rather than padding, so the hit area grows without moving
   the text off its baseline.

   NOT INCLUDED, deliberately: links inside running prose (`.prov a`,
   `.pg-tail a`, `.lg-sec a`, `.mpanel-p a`), and the `988lifeline.org` link in
   the crisis paragraph. Those are the inline case the exemption is written for;
   giving each one a 44px box either opens gaps mid-paragraph or makes its hit
   area overlap the line above. The rules below are for links that are the whole
   of the thing they label.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (pointer: coarse), (max-width: 680px) {
  .opt { min-height: 44px; }
  .fgroup-sum, .fmore-sum, .fsel-clear, .activebar-clear, .filters-skip,
  .tcard-more, .hsec-more, .msec-more, .linkbtn, .lookup a, .report a,
  .index a, .logo, .foot-mark, .foot-l a, .mlang a, .hchip,
  .tname a, .hpost-t a, .mfaq-q a, .mstats a, .pg-card-t a,
  .lg-toc-l a, .foot-h + ul a, .site-nav a, .pager a, .pager span {
    min-height: 44px;
    display: inline-flex;
    align-items: center;
  }
  .lg-toc-l a { display: grid; align-items: center; }
  /* ⚠ `column-gap` IS NOT COSMETIC — WITHOUT IT THE NAME LOSES ITS SPACE.
     The card title is `<a>Anna Phillips, <span class="cred">LICSW</span></a>`.
     Making that link an inline-flex box to give it a 44px hit area turns its
     text node and its span into FLEX ITEMS, and flex layout discards the
     whitespace between items — so the most-read line on the listing rendered
     "Anna Phillips,LICSW" on every phone and tablet while reading correctly on
     a desktop, which is exactly the kind of defect that survives review.

     `column-gap`, not `gap`: with `flex-wrap: wrap` a row-gap would open a
     space between the two lines of a name long enough to wrap. 0.25em is the
     width of a space in this stack. */
  .tname a { flex-wrap: wrap; column-gap: 0.25em; }
  /* The removable filter chip. It is a LINK that removes a filter — the only
     way back out of `?specialty=anxiety&accepting=1` without the browser's
     back button — and it was 36px. `.opt-x` is its ✕ glyph, which grows with
     it rather than staying pinned to the old height. */
  .activebar .chip, a.chip { min-height: 44px; }
  .opt-x { height: 36px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   capability + preference fallbacks — non-negotiable per the design system
   ═══════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-transparency: reduce) {
  .site-header, .dock-inner, .btn--ghost { background: var(--bg-raised); }
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .site-header, .dock-inner, .btn--ghost { background: var(--bg-raised); }
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; }
}
@media print {
  .site-header, .dock, .skip-link, .index, .filters, .ftoggle, .pager, .hfind { display: none; }
  body { background: #fff; }
  .card, .tcard, .rcard, .sec { box-shadow: none; break-inside: avoid; }

  /* A privacy policy and a set of terms are the two pages on this site somebody
     has an actual reason to print or save as a PDF — for a file, or to send to
     somebody else. The navigation rail goes (a sticky contents list prints as a
     column of dead links on page one), the reading measure goes, and nothing is
     allowed to break across a page in the middle of a clause. */
  .lg-toc, .lg-toc-m { display: none; }
  .lg-body { display: block; margin-top: var(--sp-6); }
  .lg-head h1, .lg-lede, .lg-summary { max-width: none; }
  .lg-summary, .lg-tail, .lg-warn, .lg-note, .lg-tablewrap { box-shadow: none; break-inside: avoid; }
  .lg-sec { break-inside: auto; }
  .lg-sec > h2 { break-after: avoid; }
  .lg-sec h3 { break-after: avoid; }
  .lg-sec p, .lg-list li, .lg-ol li, .lg-defs > div { break-inside: avoid; }
  /* The URL behind a link, once, next to it — a printed policy that says
     "tell us here" with no address is a dead end on paper. */
  .lg-sec a[href^="http"]::after, .lg-tail a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 11px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   "Report this listing" — the removal disclosure
   ---------------------------------------------------------------------------
   A <details>, not a modal, because both sites ship zero client JavaScript and
   <summary> is a real button in every browser for free.

   ⚠ COMPACT ON PURPOSE, AND IT WAS NOT AT FIRST. The panel opened with a
   heading, two paragraphs, three stacked radio rows, two text fields, a
   textarea and a checkbox — taller than a phone screen, on a page whose job is
   showing a therapist. It is now four controls: reason, name, email, submit.
   The radios became one <select> (three 44px rows collapse into one), the
   heading went because the summary already said it, and the free-text box went
   because nothing downstream read it.

   The trigger stays quiet — it competes with the BetterHelp CTA on the same
   screen and must lose that competition. The panel does not: the person using
   it is already annoyed and should not have to squint.
   ═══════════════════════════════════════════════════════════════════════════ */
.rep { margin-top: var(--sp-4); }
.rep-b {
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 44px;
  font: 500 13.5px/20px var(--font-sans);
  color: var(--muted);
  cursor: pointer; list-style: none;
  text-decoration: underline; text-underline-offset: 3px;
}
.rep-b::-webkit-details-marker { display: none; }
.rep-b::marker { content: ""; }
.rep-b:hover { color: var(--indigo); }

/* The ? variant — Maker Therapy, beside the BetterHelp CTA. A circle so it
   reads as an affordance rather than punctuation, with the words alongside:
   a bare ? next to a primary button reads as "help with this button". */
.rep-b--icon { text-decoration: none; }
.rep-b--icon > span:first-child {
  display: inline-grid; place-items: center;
  width: 22px; height: 22px;
  border-radius: 999px;
  border: 1px solid var(--border);
  font-size: 12px; font-weight: 600;
}
.rep-b--icon .rep-b-t { text-decoration: underline; text-underline-offset: 3px; }

.rep-panel {
  margin-top: 10px;
  padding: 16px;
  background: var(--bg-raised);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  max-width: 34rem;
}
.rep-p { font: 400 13.5px/20px var(--font-sans); color: var(--text-body); text-wrap: pretty; }
.rep-form { margin-top: 12px; display: grid; gap: 10px; }
/* Two columns as soon as there is room for them — the whole form is then three
   rows deep instead of five. */
.rep-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
.rep-f { display: grid; gap: 4px; min-width: 0; }
.rep-l { font: 600 12px/16px var(--font-sans); }
.rep-f input, .rep-f select {
  width: 100%; min-height: 44px; padding: 9px 11px;
  border: 1px solid var(--border); border-radius: 10px;
  background: var(--bg); color: inherit;
  font: 400 14.5px/20px var(--font-sans);
  /* The native arrow stays: a custom one is a background image, and this
     control is not worth a second asset or a second thing to keep in sync. */
}
.rep-submit { justify-self: start; margin-top: 2px; }
.rep-fine { font: 400 11.5px/16px var(--font-sans); color: var(--muted); text-wrap: pretty; }

/* ⚠ THE HONEYPOT. Hidden without `display:none`, which some bots check for and
   skip. Off-screen keeps it in the DOM, fillable, and unreachable by tab or
   pointer; `aria-hidden` on the wrapper keeps it away from screen readers, so
   nobody real is ever asked for their "website". */
.rep-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
