/* ══════════════════════════════════════════════════════════════════════════════
   geo-2026.css - THE SKIN. Loaded after Tailwind and geo-ui.css, before nothing.

   WHY IT EXISTS (Edward, 22 Sep): a competitor's entry is "clean and had amazing
   effects"; "we have to be 2026 design"; "some colours don't flow and some buttons
   are not in line"; "some backgrounds don't match"; "we need full harmony".

   WHERE EVERY VALUE COMES FROM - three sources, measured, never picked by eye:
     1. OUR NAVIGATION CANVAS (claude.ai/artifact/3H2mzG6Xdy4Lcfkjkc6WZm)
        the system font stack, 40px controls, 10px corners, primary = green-on-dark-ink
     2. geophii.com, read off the live page
        the ground people arrive from: near-black, body text rgb(156,163,175),
        the lavender rgb(179,161,199) with rgb(113,94,139) as its deeper partner
     3. THE REFERENCE TEMPLATE Edward sent (Requests & Approvals, src/index.css)
        a card is the ground plus a HAIRLINE (0 0% 14%), brightening to 0 1% 28%
        under the pointer; muted surface 0 0% 12%; text 98% over 55%; calm status
        colours; a dot grid at 5%; press 0.98; fade-up staggered 50ms
   And one decision of Edward's own: the BUTTON is the logo's teal #00B8B5, with
   dark ink - measured 6.9:1, where the same teal under white text is 2.46:1.

   THE RULES THIS FILE KEEPS
     surfaces  the ground, a hairline, one muted step. Nothing else.
     teal      the one action on a screen. Never decoration.
     lavender  the second voice: a link, a mark, the second line on a chart.
     green     a good score. Not a button.
     red       destroying something, and a failed state. Nothing else.
     every control is 40px on a laptop, 44 on a phone.

   HOW IT IS SAFE: the app is built from Tailwind's grey and accent utilities.
   This file redefines what those utilities PAINT, one level more specific
   (html[data-theme=...] .class), so the cascade settles it whichever order the
   stylesheets load in, and no page markup has to change.
   ══════════════════════════════════════════════════════════════════════════════ */

:root {
  --geo-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  /* Headings (Edward, 26 Sep: "the bold font is a bit bulky ... a better font for our
     header"). Inter, self-hosted: the system face at 700-800 is heavy, and it's a different
     face on every device. Change this one line to try another. */
  --geo-font-head: "Inter", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

  /* Light, taken from the reference template's own light theme (Edward, 23 Sep:
     "the light mode needs that feel - we have the styling from Lovable"), its HSL
     values converted: background 210 20% 98%, card 100%, muted 210 15% 93%,
     border 210 15% 88%, border-hover 210 15% 70%, foreground 220 20% 15%,
     muted-foreground 220 10% 45%. Cooler and cleaner than the warm greys I had,
     and structurally identical to the dark side. */
  --geo-bg:       #f7f9fb;
  --geo-panel:    #ffffff;
  --geo-surface:  #ffffff;
  --geo-surface2: #e9edf1;
  --geo-border:   #dde2e8;
  --geo-border2:  #adb6c2;
  --geo-text:     #1f242e;
  --geo-text2:    #3d4452;
  --geo-muted:    #5b6472;   /* 4.11:1 measured at #6a7180 on white */
  --geo-accent:   #00696a;          /* the logo teal, deep enough to read ON white: #00807e measured 3.7:1 */
  --geo-accent-ink: #ffffff;
  /* The accent at low alpha, for a chosen chip or a quiet highlight. It must be built from
     THIS theme's accent: the roast CSS used a bright-teal tint in both, which is the dark
     theme's colour sitting on a white card. */
  --geo-accent-soft: rgba(0, 105, 106, .10);
  /* Not a colour, so it is the same in both themes - but it was used with var() and never
     defined, which is how a font stack silently becomes the browser default. */
  --geo-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  --geo-good:     #15803d;
  --geo-warn:     #b45309;
  --geo-bad:      #b91c1c;
  --geo-good-ink: #14532d;
  --geo-warn-ink: #7c2d12;
  --geo-bad-ink:  #7f1d1d;
  --geo-second-ink: #4b3e5c;
  --geo-second:   #715e8b;          /* the site's lavender, deep step: 5.6:1 on light */
  --geo-second-deep: #4b3e5c;
  --geo-info:     #715e8b;

  --geo-r-card: 14px;
  --geo-r-ctrl: 8px;                /* 10 -> 8 with the flat buttons (26 Sep) */
  --geo-ctrl-h: 40px;
  /* Buttons (26 Sep, Edward: "more like high quality saas button"): flat, a hairline edge a
     shade darker than the fill and a one-pixel top highlight, instead of a glow underneath. */
  --geo-btn-edge:    color-mix(in oklab, var(--geo-accent) 78%, #000);
  --geo-btn-lift:    inset 0 1px 0 rgba(255, 255, 255, .18), 0 1px 2px rgba(16, 24, 40, .12);
  --geo-btn-quiet:   0 1px 2px rgba(16, 24, 40, .06);
  --geo-btn-hover:   color-mix(in oklab, var(--geo-accent) 90%, #fff);
  --geo-dur:    .18s;
  --geo-ease:   cubic-bezier(.2, .8, .2, 1);
  --geo-nav-w:  260px;
}

html[data-theme="dark"] {
  --geo-btn-lift:  inset 0 1px 0 rgba(255, 255, 255, .22), 0 1px 2px rgba(0, 0, 0, .35);
  --geo-btn-quiet: inset 0 1px 0 rgba(255, 255, 255, .04), 0 1px 2px rgba(0, 0, 0, .3);
  --geo-bg:       #030303;
  --geo-panel:    #000000;
  --geo-surface:  #0a0a0a;
  --geo-surface2: #1f1f1f;
  --geo-border:   #242424;
  --geo-border2:  #474747;
  --geo-text:     #fafafa;
  --geo-text2:    #d9d9d9;
  --geo-muted:    #9a9a9a;   /* measured: #8c8c8c on the muted surface was 4.37:1 */
  --geo-accent:   #00b8b5;
  --geo-accent-ink: #04201f;
  --geo-accent-soft: rgba(0, 184, 181, .13);
  --geo-good:     #33cc99;
  --geo-warn:     #eaa61a;
  --geo-bad:      #d94f4f;
  /* Ink for text sitting ON a 16% tint of its own colour: the status colours
     themselves measured 3.62:1 there, so the pill gets a lighter step. */
  --geo-good-ink: #5fe3b2;
  --geo-warn-ink: #f2c14e;
  --geo-bad-ink:  #f5a3a3;   /* one step lighter: a red label measured 4.07:1 live */
  --geo-second-ink: #cbbcdb;
  --geo-second:   #b3a1c7;
  --geo-second-deep: #715e8b;
  --geo-info:     #b3a1c7;
}

/* ── The face ────────────────────────────────────────────────────────────────
   The system stack: it is already on the person's device, so the first paint is
   the real one - no flash of a different typeface while a web font downloads. */
body, .font-sans, button, input, select, textarea { font-family: var(--geo-font); }
body { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }
h1, h2, h3 { letter-spacing: -.011em; }
.main-content .text-2xl, .main-content .text-3xl, .main-content .text-4xl { letter-spacing: -.02em; font-weight: 700; }

/* The heading face. Self-hosted (one 48KB variable file, Latin), swap so text shows at once in
   the system face and settles into Inter; nothing blocks the first paint. Headings take it and
   come down a step in weight: Inter at 650 reads as firmly as the system face at 800, without
   the bulk. Body text keeps the system face. */
@font-face {
  font-family: "Inter"; font-style: normal; font-weight: 400 800; font-display: swap;
  src: url("/fonts/inter-latin-var.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;
}
h1, h2, h3, h4 { font-family: var(--geo-font-head); }
h1, h2 { font-weight: 650; }
h3, h4 { font-weight: 600; }
:is(h1, h2, h3, h4):is(.font-extrabold, .font-black) { font-weight: 700; }
:is(h1, h2, h3, h4).font-bold { font-weight: 650; }
:is(h1, h2, h3, h4).font-semibold { font-weight: 600; }
.main-content :is(h1, h2, h3).text-2xl, .main-content :is(h1, h2, h3).text-3xl, .main-content :is(h1, h2, h3).text-4xl { font-weight: 650; }

/* ── The ground, with texture ─────────────────────────────────────────────────
   A dot grid at 5%, 10px pitch (the reference template's). It gives the page
   substance from across the room and disappears at reading distance. */
html[data-theme="dark"] body {
  background-color: var(--geo-bg);
  background-image: radial-gradient(circle at center, rgba(255,255,255,.05) 1px, transparent 1px);
  background-size: 10px 10px;
  background-attachment: fixed;
}
html:not([data-theme="dark"]) body {
  background-color: var(--geo-bg);
  background-image: radial-gradient(circle at center, rgba(0,0,0,.04) 1px, transparent 1px);
  background-size: 10px 10px;
  background-attachment: fixed;
}

/* ── Surfaces: ground · card · one muted step ───────────────────────────────── */
/* Transparent ONLY inside the page, never on the page itself: a transparent
   wrapper on a page that never got a theme shows the browser's white body through
   it - which is exactly what "the background on many pages is still white" looked
   like (Edward, 23 Sep). The ground is always painted explicitly, below. */
html[data-theme="dark"] #main-content .bg-gray-900,
html[data-theme="dark"] #main-content.main-content { background-color: transparent; }
html[data-theme="dark"] body, html[data-theme="dark"] html { background-color: var(--geo-bg); }
html[data-theme="dark"] .bg-gray-950   { background-color: var(--geo-panel); }
html[data-theme="dark"] .bg-gray-800   { background-color: var(--geo-surface); }
html[data-theme="dark"] .bg-gray-700   { background-color: var(--geo-surface2); }
html[data-theme="dark"] .bg-gray-800\/50,
html[data-theme="dark"] .bg-gray-900\/50 { background-color: var(--geo-surface); }
html[data-theme="dark"] .border-gray-600,
html[data-theme="dark"] .border-gray-700,
html[data-theme="dark"] .border-gray-800,
html[data-theme="dark"] .divide-gray-700 > * + * { border-color: var(--geo-border); }
html[data-theme="dark"] .text-gray-100,
html[data-theme="dark"] .text-gray-200 { color: var(--geo-text); }
html[data-theme="dark"] .text-gray-300,
html[data-theme="dark"] .text-gray-400 { color: var(--geo-text2); }
html[data-theme="dark"] .text-gray-500 { color: var(--geo-muted); }
html[data-theme="dark"] .sidebar       { background-color: var(--geo-panel); border-color: var(--geo-border); }

html:not([data-theme="dark"]) .main-content  { background-color: transparent; }
html:not([data-theme="dark"]) .bg-white      { background-color: var(--geo-surface); }
html:not([data-theme="dark"]) .bg-gray-50,
html:not([data-theme="dark"]) .bg-gray-100   { background-color: var(--geo-surface2); }
html:not([data-theme="dark"]) .border-gray-100,
html:not([data-theme="dark"]) .border-gray-200,
html:not([data-theme="dark"]) .border-gray-300 { border-color: var(--geo-border); }
html:not([data-theme="dark"]) .text-gray-500 { color: var(--geo-muted); }
html:not([data-theme="dark"]) .text-gray-600,
html:not([data-theme="dark"]) .text-gray-700 { color: var(--geo-text2); }
html:not([data-theme="dark"]) .sidebar { background-color: var(--geo-surface); border-color: var(--geo-border); }
/* A dark card marooned in a light menu (the credits box) had its own palette. */
html:not([data-theme="dark"]) .sidebar [class*="bg-gray-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .sidebar [class*="bg-gray-9"]:not([style*="width:"]){ background-color: var(--geo-surface2) !important; }
html:not([data-theme="dark"]) .sidebar [class*="bg-gray-8"] *,
html:not([data-theme="dark"]) .sidebar [class*="bg-gray-9"] * { color: var(--geo-text2) !important; }

/* A card is the ground plus a hairline, and the hairline answers the pointer. */
html[data-theme="dark"] .main-content .bg-gray-800,
html[data-theme="dark"] .main-content .bg-white { border: 1px solid var(--geo-border); }
@media (hover: hover) {
  html[data-theme="dark"] .main-content .bg-gray-800:hover,
  html[data-theme="dark"] .main-content .bg-white:hover,
  html:not([data-theme="dark"]) .main-content .bg-white:hover { border-color: var(--geo-border2); }
}
.rounded-xl, .rounded-2xl { border-radius: var(--geo-r-card); }
.rounded-lg { border-radius: var(--geo-r-ctrl); }
html[data-theme="dark"] .shadow-sm, html[data-theme="dark"] .shadow,
html[data-theme="dark"] .shadow-md, html[data-theme="dark"] .shadow-lg { box-shadow: none; }

/* ── One accent, not five ─────────────────────────────────────────────────────
   Purple and indigo were decoration - an icon tile, a counter, a gradient behind
   a set of initials - competing with the one thing to press. They go quiet. The
   brand's own green-to-blue gradient is left alone: it means "Geophii". */
html[data-theme="dark"] .main-content [class*="bg-purple-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-indigo-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-violet-"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-purple-5"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-indigo-5"]:not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
}
html[data-theme="dark"] .main-content [class*="text-purple-"],
html[data-theme="dark"] .main-content [class*="text-indigo-"],
html[data-theme="dark"] .main-content [class*="text-violet-"],
html[data-theme="dark"] .main-content [class*="text-pink-"] { color: var(--geo-text2) !important; }
html[data-theme="dark"] body [class*="from-indigo-"], html[data-theme="dark"] body [class*="from-purple-"],
html[data-theme="dark"] body [class*="from-violet-"], html[data-theme="dark"] body [class*="via-purple-"],
html[data-theme="dark"] body [class*="to-purple-"],   html[data-theme="dark"] body [class*="to-indigo-"],
html:not([data-theme="dark"]) body [class*="from-indigo-"], html:not([data-theme="dark"]) body [class*="to-purple-"],
html[data-theme="dark"] .site-head-avatar {
  background-image: none !important;
  background-color: var(--geo-surface2) !important;
  color: var(--geo-text) !important;
}
/* ...but a bar that MEASURES something keeps a colour, or it says nothing. */
html[data-theme="dark"] body [class*="from-indigo-"][class*="h-2"],
html[data-theme="dark"] body [class*="from-indigo-"][class*="h-full"] { background-color: var(--geo-accent) !important; }
/* The freshness ring draws its gap in the page's own colour. */
.site-head-avatar { box-shadow: 0 0 0 2px var(--geo-bg) !important; }

/* ══ BUTTONS - exactly two, and one for destroying ════════════════════════════
   PRIMARY    filled teal, dark ink, weight 700. One per area of a screen.
   SILVER     transparent with a hairline. Everything else - including the solid
              blues that used to shout as loudly as the primary.
   DESTRUCTIVE red, and only for removing something.
   40px tall, 44 on a phone, 10px corners, and a press you can feel. */
.geo-btn, button, .btn,
a[class*="bg-green-"]:not([style*="width:"]), a[class*="bg-blue-"]:not([style*="width:"]), a[class*="bg-emerald-"]:not([style*="width:"]), a[class*="bg-teal-"]:not([style*="width:"]),
button[class*="bg-green-"]:not([style*="width:"]), button[class*="bg-blue-"]:not([style*="width:"]), button[class*="bg-emerald-"]:not([style*="width:"]){
  border-radius: var(--geo-r-ctrl);
  transition: transform .06s var(--geo-ease), filter var(--geo-dur) var(--geo-ease),
              background-color var(--geo-dur) var(--geo-ease), border-color var(--geo-dur) var(--geo-ease),
              color var(--geo-dur) var(--geo-ease);
}
a[class*="bg-green-5"]:not([style*="width:"]), a[class*="bg-green-6"]:not([style*="width:"]), a[class*="bg-emerald-6"]:not([style*="width:"]), a[class*="bg-teal-6"]:not([style*="width:"]),
button[class*="bg-green-5"]:not([style*="width:"]), button[class*="bg-green-6"]:not([style*="width:"]), button[class*="bg-emerald-6"]:not([style*="width:"]),
input[type="submit"][class*="bg-green-"]:not([style*="width:"]), .geo-btn-primary {
  background-color: var(--geo-accent) !important;
  color: var(--geo-accent-ink) !important;
  border: 0 !important;
  font-weight: 700;
  box-shadow: none !important;
}
a[class*="bg-green-5"]:hover, button[class*="bg-green-5"]:hover,
a[class*="bg-green-6"]:hover, button[class*="bg-green-6"]:hover, .geo-btn-primary:hover { filter: brightness(1.08); }

/* A SOLID blue button was this app's primary action long before the teal existed
   ("+ Add Task", "Save", "Apply"). Turning every blue into the silver outline
   demoted them below the grey secondaries beside them - seen on the task board,
   23 Sep. A solid blue is a primary now; only the TINTED blues stay quiet. */
a[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]){
  background-color: var(--geo-accent) !important;
  color: var(--geo-accent-ink) !important;
  border: 0 !important;
  font-weight: 700;
}
a[class*="bg-blue-5"]:not([style*="width:"]), a[class*="bg-blue-6"][class*="/"]:not([style*="width:"]), button[class*="bg-blue-5"]:not([style*="width:"]), button[class*="bg-blue-6"][class*="/"]:not([style*="width:"]),
button[class*="bg-gray-7"]:not([style*="width:"]), a[class*="bg-gray-7"]:not([style*="width:"]), input[type="submit"][class*="bg-blue-"]:not([style*="width:"]),
.geo-btn-silver, .geo-tt-btn, .btn-sm.secondary {
  background-color: transparent !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
  box-shadow: none !important;
}
a[class*="bg-blue-6"]:hover, button[class*="bg-blue-6"]:hover, .geo-btn-silver:hover, .geo-tt-btn:hover {
  border-color: var(--geo-accent) !important;
}
button[class*="bg-red-6"]:not([style*="width:"]), a[class*="bg-red-6"]:not([style*="width:"]), .btn-sm.danger, .geo-btn-danger {
  background-color: var(--geo-bad) !important; color: #fff !important; border: 0 !important; font-weight: 600;
}
button:active, .btn:active, a[class*="bg-green-"]:active, a[class*="bg-blue-"]:active { transform: scale(.98); }

/* Heights. A finger is not a pointer. */
.geo-btn, .btn-sm, .geo-tt-btn, .rec-tab,
a[class*="bg-green-5"], button[class*="bg-green-5"], a[class*="bg-blue-6"], button[class*="bg-blue-6"] { min-height: 36px; }
@media (max-width: 767px) {
  .main-content button, .main-content a[class*="bg-"], .geo-btn, .btn-sm, .geo-tt-btn, .rec-tab { min-height: 44px; }
}
/* A row action is never the page's primary colour. */
td a[class*="bg-green-"]:not([style*="width:"]), td button[class*="bg-green-"]:not([style*="width:"]), td a[class*="bg-blue-"]:not([style*="width:"]), td button[class*="bg-blue-"]:not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important;
  font-weight: 600;
}
td a[class*="bg-green-"]:hover, td button[class*="bg-green-"]:hover { border-color: var(--geo-accent) !important; }
/* A tab or a chip is not a button. */
.site-tab-btn, .geo-pill, [role="tab"] { border-radius: 999px; }

/* ── The chip, from the reference template ───────────────────────────────────
   A 40px chip whose ACTIVE state is a brighter border, not a coloured slab.
   Ready for the filters on the work lists (Type · Impact · Effort). */
.geo-chip {
  height: 40px; display: inline-flex; align-items: center; gap: 6px;
  padding: 0 16px; font-size: 14px; font-weight: 500;
  background: var(--geo-surface); color: var(--geo-muted);
  border: 1px solid var(--geo-border); border-radius: 999px;
  transition: border-color var(--geo-dur) var(--geo-ease), color var(--geo-dur) var(--geo-ease);
}
.geo-chip:hover { border-color: var(--geo-border2); color: var(--geo-text); }
.geo-chip[aria-pressed="true"], .geo-chip.is-on { border-color: var(--geo-text); color: var(--geo-text); }
@media (max-width: 767px) { .geo-chip { height: 44px; } }

/* ── Status: a tint of its own colour, with that colour as the ink ────────────
   Edward, 22 Sep: "keep the different colour of bubbles, it helps break the
   site - change them slightly to harmonise". So they stay, as soft pills. */
html[data-theme="dark"] .main-content [class*="bg-green-1"]:not([style*="width:"]), html[data-theme="dark"] .main-content [class*="bg-emerald-1"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-green-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-good) 16%, var(--geo-bg)) !important; color: var(--geo-good-ink) !important;
}
html[data-theme="dark"] .main-content [class*="bg-yellow-1"]:not([style*="width:"]), html[data-theme="dark"] .main-content [class*="bg-amber-1"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-amber-5"][class*="/"]:not([style*="width:"]), html[data-theme="dark"] .main-content [class*="bg-yellow-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-warn) 16%, var(--geo-bg)) !important; color: var(--geo-warn-ink) !important;
}
html[data-theme="dark"] .main-content [class*="bg-red-1"]:not([style*="width:"]), html[data-theme="dark"] .main-content [class*="bg-rose-1"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-red-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-bad) 16%, var(--geo-bg)) !important; color: var(--geo-bad-ink) !important;
}
html[data-theme="dark"] .main-content [class*="bg-blue-1"]:not([style*="width:"]), html[data-theme="dark"] .main-content [class*="bg-blue-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-second) 16%, var(--geo-bg)) !important; color: var(--geo-second-ink) !important;
}
html[data-theme="dark"] .main-content [class*="text-green-"], html[data-theme="dark"] .main-content [class*="text-emerald-"] { color: var(--geo-good) !important; }
html[data-theme="dark"] .main-content [class*="text-red-"], html[data-theme="dark"] .main-content [class*="text-rose-"] { color: var(--geo-bad) !important; }
html[data-theme="dark"] .main-content [class*="text-yellow-"], html[data-theme="dark"] .main-content [class*="text-amber-"] { color: var(--geo-warn) !important; }
/* A tinted button (bg-green-600/20, bg-indigo-600/20 and friends) measured 1.20:1 -
   its ink was nearly its own fill. A button is one of the two shapes; a tint is for
   a STATE, never for something you press. */
html .main-content button[class*="/20"], html .main-content a[class*="/20"],
html .main-content button[class*="/10"], html .main-content a[class*="/10"],
html .main-content button[class*="/15"], html .main-content a[class*="/15"],
html .main-content button[class*="/30"], html .main-content a[class*="/30"] {
  background-color: transparent !important;
  background-image: none !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
  border-radius: var(--geo-r-ctrl) !important;
}
html:not([data-theme="dark"]) .main-content button[class*="/20"], html:not([data-theme="dark"]) .main-content a[class*="/20"],
html:not([data-theme="dark"]) .main-content button[class*="/10"], html:not([data-theme="dark"]) .main-content a[class*="/10"],
html:not([data-theme="dark"]) .main-content button[class*="/15"], html:not([data-theme="dark"]) .main-content a[class*="/15"],
html:not([data-theme="dark"]) .main-content button[class*="/30"], html:not([data-theme="dark"]) .main-content a[class*="/30"] {
  background-color: var(--geo-surface) !important;
  border-color: var(--geo-border) !important;
}
html .main-content button[class*="/20"]:hover, html .main-content a[class*="/20"]:hover,
html .main-content button[class*="/10"]:hover, html .main-content a[class*="/10"]:hover {
  border-color: var(--geo-accent) !important;
}
/* Anything else still wearing a leftover slab grey takes the card surface. */
html[data-theme="dark"] .main-content [class*="bg-gray-8"]:not(.bg-gray-800):not([style*="width:"]){ background-color: var(--geo-surface) !important; }

/* A grey chip still has to be readable ("Not set" measured 2.11:1). */
html[data-theme="dark"] .main-content [class*="bg-gray-1"], html[data-theme="dark"] .main-content [class*="bg-gray-2"] { color: var(--geo-text) !important; }

/* ── The second voice ─────────────────────────────────────────────────────────
   A link is the site's lavender. Measured: 8.2:1 on the dark ground, and the
   deeper step at 5.6:1 on the light one. Teal and lavender sit at almost the
   same lightness (1.04:1), so they never appear as two flat blocks side by side. */
.main-content a:not([class*="bg-"]):not(.site-tab-btn):not([class*="text-gray"]):not([class*="text-green"]):not([class*="text-red"]) { color: var(--geo-second); }

/* ── The menu ─────────────────────────────────────────────────────────────────
   The row you are on is the accent on a whisper of the accent. */
html[data-theme="dark"] .sidebar a.bg-gray-700, html[data-theme="dark"] .sidebar a[aria-current="page"], html[data-theme="dark"] .sidebar .bg-gray-700 {
  background-color: color-mix(in oklab, var(--geo-accent) 12%, transparent) !important;
  color: var(--geo-accent) !important;
}
html[data-theme="dark"] .sidebar a:hover { background-color: var(--geo-surface2) !important; }
/* A menu row is a row, not a card: no outline until it is the one you are on. */
html[data-theme="dark"] .sidebar a, html[data-theme="dark"] .sidebar summary,
html:not([data-theme="dark"]) .sidebar a, html:not([data-theme="dark"]) .sidebar summary { border-color: transparent !important; }

/* A gradient BUTTON is still a button: it takes the one action colour. The
   brand's green-to-blue gradient stays where it is decoration, not an action. */
a[class*="bg-gradient"][class*="from-green-"]:not([style*="width:"]), button[class*="bg-gradient"][class*="from-green-"]:not([style*="width:"]),
a[class*="bg-gradient"][class*="from-emerald-"]:not([style*="width:"]), button[class*="bg-gradient"][class*="from-emerald-"]:not([style*="width:"]),
.ob-grad {
  background-image: none !important;
  background-color: var(--geo-accent) !important;
  color: var(--geo-accent-ink) !important;
  font-weight: 700;
}
/* The welcome card's wash: the brand's two colours, at a whisper. */
#ob-card .ob-hero, html[data-theme="dark"] #ob-card .ob-hero {
  background: linear-gradient(92deg, rgba(179,161,199,.12), rgba(0,184,181,.09)) !important;
}

/* ══ THE MENU THAT FOLDS AWAY ═════════════════════════════════════════════════
   Edward, on the reference: "great style, even how it hides the sidebar". On a
   laptop the menu is 260px of permanent furniture; a work list wants that space.
   One button folds it to a 68px rail of icons and gives the page 192px back, and
   the choice is remembered. A rail, not a disappearance: every door stays on
   screen, one tap wide, and says its name on hover. */
@media (min-width: 768px) {
  .sidebar, .main-content { transition: width .22s var(--geo-ease), margin-left .22s var(--geo-ease); }
  body.geo-rail .sidebar { width: 68px; overflow-x: hidden; }
  body.geo-rail .main-content { margin-left: 68px; }

  /* The labels are plain text inside each row - not spans - so hiding spans left
     them rendering and clipped (browser check, 22 Sep). Zeroing the row's font
     size removes the words and keeps the icon, which is sized back explicitly. */
  body.geo-rail .sidebar a,
  body.geo-rail .sidebar summary,
  body.geo-rail .sidebar button {
    font-size: 0 !important;
    justify-content: center !important;
    gap: 0 !important;
    padding-left: 0 !important; padding-right: 0 !important;
    position: relative;
  }
  body.geo-rail .sidebar a svg, body.geo-rail .sidebar summary svg, body.geo-rail .sidebar button svg {
    width: 20px !important; height: 20px !important; flex: none; margin: 0 !important;
  }
  /* The wordmark and any label with its own size: zeroed too, or they spill past
     the rail (browser check, 22 Sep). */
  body.geo-rail .sidebar a span, body.geo-rail .sidebar a div,
  body.geo-rail .sidebar summary span { font-size: 0 !important; }
  /* Anything in the menu pinned at 260px - the account bar at the foot - follows
     the rail's width rather than hanging out of it. */
  body.geo-rail .sidebar > *, body.geo-rail .sidebar [style*="width: 260"] { max-width: 68px !important; overflow: hidden; }

  /* The logo keeps its mark in the rail, at icon size. */
  body.geo-rail .sidebar img { width: 28px !important; height: auto !important; object-fit: contain; }

  /* Group headings, the account line and any summary text step aside entirely. */
  body.geo-rail .sidebar p,
  body.geo-rail .sidebar .text-xs.uppercase,
  body.geo-rail .sidebar summary > svg:last-child { display: none !important; }
  /* A count becomes a dot in the corner of its own icon. */
  body.geo-rail .sidebar [class*="rounded-full"] {
    position: absolute; top: 6px; right: 12px;
    width: 8px !important; height: 8px !important; min-width: 0 !important;
    padding: 0 !important; font-size: 0 !important; line-height: 0; overflow: hidden;
  }
  /* And the row says its name when the pointer rests on it. */
  body.geo-rail .sidebar a[data-geo-name]:hover::after {
    content: attr(data-geo-name);
    position: absolute; left: calc(100% + 8px); top: 50%; transform: translateY(-50%);
    background: var(--geo-surface2); color: var(--geo-text); border: 1px solid var(--geo-border2);
    border-radius: 8px; padding: 6px 10px; font-size: 13px; white-space: nowrap; z-index: 60;
  }
}
#geo-rail-bar { display: none; position: relative; z-index: 3; }
@media (min-width: 768px) { #geo-rail-bar { display: flex; justify-content: flex-end; padding: 10px 12px 0; } }
body.geo-rail #geo-rail-bar { justify-content: center; padding: 10px 0 0; }
#geo-rail-btn {
  width: 36px; height: 36px; display: inline-flex; align-items: center; justify-content: center;
  background: var(--geo-surface); color: var(--geo-muted);
  border: 1px solid var(--geo-border); border-radius: var(--geo-r-ctrl);
  transition: color var(--geo-dur) var(--geo-ease), border-color var(--geo-dur) var(--geo-ease);
}
#geo-rail-btn:hover { color: var(--geo-text); border-color: var(--geo-border2); }

/* ── Dropdowns and fields ─────────────────────────────────────────────────────
   A browser's own select is the one control that still looks like 2009 in a
   screenshot. Same height, corner and hairline as a silver button. */
select {
  -webkit-appearance: none; -moz-appearance: none; appearance: none;
  min-height: var(--geo-ctrl-h);
  padding: 8px 38px 8px 12px;
  border-radius: var(--geo-r-ctrl);
  background-color: var(--geo-surface);
  color: var(--geo-text);
  border: 1px solid var(--geo-border2);
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' stroke='%238c8c8c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  transition: border-color var(--geo-dur) var(--geo-ease);
}
select:hover, input:hover, textarea:hover { border-color: var(--geo-accent); }
input[type="text"], input[type="email"], input[type="url"], input[type="search"],
input[type="number"], input[type="password"], input:not([type]), textarea {
  border-radius: var(--geo-r-ctrl);
  transition: border-color var(--geo-dur) var(--geo-ease);
}
html[data-theme="dark"] input[type="text"], html[data-theme="dark"] input[type="email"],
html[data-theme="dark"] input[type="url"], html[data-theme="dark"] input[type="search"],
html[data-theme="dark"] input[type="number"], html[data-theme="dark"] input[type="password"],
html[data-theme="dark"] input:not([type]), html[data-theme="dark"] textarea {
  /* A step lighter than the card with an edge you can see (30 Sep, Edward: text boxes were "just
     dark"; --geo-surface2 is within a shade of the navy card). Mixed from the text colour, so it
     sits above whatever surface the skin uses. */
  background-color: color-mix(in srgb, var(--geo-text) 8%, var(--geo-surface)) !important;
  border-color: color-mix(in srgb, var(--geo-text) 22%, var(--geo-surface)) !important;
  color: var(--geo-text) !important;
}
html[data-theme="dark"] input[type="text"]:focus, html[data-theme="dark"] input[type="email"]:focus,
html[data-theme="dark"] input[type="url"]:focus, html[data-theme="dark"] input[type="search"]:focus,
html[data-theme="dark"] input[type="number"]:focus, html[data-theme="dark"] input[type="password"]:focus,
html[data-theme="dark"] input:not([type]):focus, html[data-theme="dark"] textarea:focus {
  border-color: var(--geo-accent) !important;
}
input::placeholder, textarea::placeholder { color: var(--geo-muted); }
/* Native controls follow the theme (26 Sep, Edward: the calendar icon was black on the dark
   page). Without color-scheme the browser draws date pickers, their pop-up calendar, time and
   number spinners and scrollbars in its light style whatever the page's theme. */
html { color-scheme: light; }
html[data-theme="dark"] { color-scheme: dark; }
/* The calendar icon in the app's colours, not the browser's: the muted text colour at rest,
   the accent on hover and focus, drawn from one mask so both themes get it. (Firefox draws its
   own icon, which color-scheme above already makes light on dark.) */
input::-webkit-calendar-picker-indicator {
  cursor: pointer; opacity: 1; width: 16px; height: 16px; padding: 2px; border-radius: 4px;
  background: var(--geo-muted);
  -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M16 3v4M8 3v4M3 10h18'/%3E%3C/svg%3E") center / 16px 16px no-repeat;
          mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M16 3v4M8 3v4M3 10h18'/%3E%3C/svg%3E") center / 16px 16px no-repeat;
}
input:is(:hover, :focus)::-webkit-calendar-picker-indicator { background: var(--geo-accent); }
@media (max-width: 767px) { select, input, textarea { min-height: 44px; } }

/* ── A page that ships its own light-only stylesheet ─────────────────────────
   Integrations was written light-only: in dark mode its text measured 1.10:1.
   Its own file now uses these tokens; this is the safety net for anything else. */
html[data-theme="dark"] .main-content pre,
html[data-theme="dark"] .main-content code { background-color: var(--geo-panel) !important; color: var(--geo-text) !important; }
html[data-theme="dark"] .main-content summary,
html[data-theme="dark"] .main-content .muted { color: var(--geo-text2) !important; }
html[data-theme="dark"] .main-content th { color: var(--geo-text2) !important; }

/* ── Motion ───────────────────────────────────────────────────────────────────
   Blocks arrive once, staggered; a press answers in 60ms; a wait has a shape.
   Every rule is inside a reduced-motion guard, and the arrival only runs with
   JavaScript on (html.geo-anim), so a stylesheet can never leave a page blank. */
@media (prefers-reduced-motion: no-preference) {
  /* backwards, not both: a fill that outlives the animation keeps a transform on the page, and
     every position:fixed popup inside it then opens against the page, off screen (29 Sep). */
  html.geo-anim #main-content > * { animation: geoUp .34s var(--geo-ease) backwards; }
  html.geo-anim #main-content > *:nth-child(2) { animation-delay: .05s; }
  html.geo-anim #main-content > *:nth-child(3) { animation-delay: .1s; }
  html.geo-anim #main-content > *:nth-child(n+4) { animation-delay: .15s; }
}
@keyframes geoUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.geo-skel {
  background: linear-gradient(90deg, var(--geo-surface2) 25%, var(--geo-border2) 37%, var(--geo-surface2) 63%);
  background-size: 400% 100%; border-radius: 8px; color: transparent !important;
}
@media (prefers-reduced-motion: no-preference) { .geo-skel { animation: geoSkel 1.4s ease infinite; } }
@keyframes geoSkel { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }
.geo-lift { transition: transform var(--geo-dur) var(--geo-ease), border-color var(--geo-dur) var(--geo-ease); }
@media (hover: hover) { .geo-lift:hover { transform: translateY(-2px); border-color: var(--geo-border2); } }
:focus-visible { outline: 2px solid color-mix(in oklab, var(--geo-accent) 65%, transparent); outline-offset: 2px; border-radius: 6px; }
.geo-num, [data-geo-count], td, .tabular { font-variant-numeric: tabular-nums; }
@media (min-width: 768px) { * { scrollbar-width: thin; scrollbar-color: var(--geo-border2) transparent; } }

/* ── One corner ───────────────────────────────────────────────────────────────
   Two pills in the same corner covered the page's own content. Help moves into
   the same dock as a quiet round icon, clear of the phone bar. */
#geo-dock {
  position: fixed; right: 16px; bottom: calc(16px + env(safe-area-inset-bottom, 0px));
  z-index: 9969; display: flex; align-items: center; gap: 8px;
}
@media (max-width: 767px) { #geo-dock { bottom: calc(84px + env(safe-area-inset-bottom, 0px)); } }
#geo-dock > * { position: static !important; inset: auto !important; margin: 0 !important; }
#geo-dock .geo-dock-help {
  width: 40px !important; height: 40px !important; padding: 0 !important;
  border-radius: 999px !important; display: inline-flex !important; align-items: center; justify-content: center;
  background: var(--geo-surface) !important; color: var(--geo-text2) !important;
  border: 1px solid var(--geo-border2) !important; box-shadow: none !important; font-size: 0 !important;
}
#geo-dock .geo-dock-help:hover { color: var(--geo-text) !important; border-color: var(--geo-accent) !important; }
#geo-dock .geo-dock-help svg { width: 18px !important; height: 18px !important; }
body:has(.sidebar.open) #geo-dock, body:has(.site-sections-m[open]) #geo-dock, body.gfd-panel-open #geo-dock { display: none !important; }
/* The chat launcher and the phone bar's Ask are the same one action as every
   other primary button, so they wear the same colour. */
#gfd-launch { background: var(--geo-accent) !important; color: var(--geo-accent-ink) !important; }
/* Phones without the phone bar (client logins, 27 Sep): two floating pills sat on top of every
   page's own content. The chat button becomes a round ✦ in the corner (its words stay for screen
   readers); "Need help?" is in the menu's ? (the same form); pages leave room at the bottom. Up to
   767px, where the dock rule above assumes a phone bar clients don't have. Pages WITH the phone
   bar (agency) are untouched: their launcher is hidden and "Need help?" stays (27 Sep review). */
@media (max-width: 767px) {
  body:not(:has(#geo-phonebar)) #geo-dock { bottom: calc(16px + env(safe-area-inset-bottom, 0px)); }
  body:not(:has(#geo-phonebar)) #geo-dock #gfd-launch { width: 56px; height: 56px; padding: 0; justify-content: center; font-size: 22px; position: relative !important; }
  body:not(:has(#geo-phonebar)) #geo-dock #gfd-launch > span:nth-child(2) { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  body:not(:has(#geo-phonebar)) #geo-dock #gfd-launch #gfd-badge { position: absolute !important; top: -2px; right: -2px; }
  body:not(:has(#geo-phonebar)) #geo-dock:has(#gfd-launch) #support-fab { display: none !important; }
  body:has(#gfd-launch):not(:has(#geo-phonebar)) main { padding-bottom: 96px; }
}
#geo-phonebar .geo-pb-ask { background: var(--geo-fill, var(--geo-accent)) !important; }
#geo-phonebar .geo-pb-ask svg { stroke: var(--geo-fill-ink, var(--geo-accent-ink)) !important; }

/* ── The menu's own chips ─────────────────────────────────────────────────────
   Edward, 22 Sep, pointing at a mustard "SOON" beside White-Label: "see the
   yellow". The counts and the state chips in the menu keep their meaning, in the
   same tints and inks as every other status on the app - not Tailwind's raw
   yellow-300 on a near-black rail. */
.sidebar [class*="bg-yellow-"]:not([style*="width:"]), .sidebar [class*="bg-amber-"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-warn) 20%, var(--geo-bg)) !important;
  color: var(--geo-warn-ink) !important;
}
.sidebar [class*="bg-blue-"]:not([style*="width:"]), .sidebar [class*="bg-violet-"]:not([style*="width:"]), .sidebar [class*="bg-indigo-"]:not([style*="width:"]), .sidebar [class*="bg-purple-"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-second) 22%, var(--geo-bg)) !important;
  color: var(--geo-second-ink) !important;
}
.sidebar [class*="bg-green-"]:not([style*="width:"]), .sidebar [class*="bg-emerald-"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-good) 20%, var(--geo-bg)) !important;
  color: var(--geo-good-ink) !important;
}
.sidebar [class*="bg-orange-"]:not([style*="width:"]), .sidebar [class*="bg-red-"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-bad) 20%, var(--geo-bg)) !important;
  color: var(--geo-bad-ink) !important;
}

/* The light page keeps its own ground under the cards (it was taking a utility's
   grey and matching them exactly). */
html:not([data-theme="dark"]) body { background-color: var(--geo-bg) !important; }

/* ══ THE SITE SWITCHER ════════════════════════════════════════════════════════
   One control at the top of the menu: the website you are on, and two taps to
   another. The shape is the navigation canvas's; the list behind it is decided by
   the server, per role. ⌘K opens it from anywhere. */
#geo-switch { padding: 10px 12px 6px; }
#geo-switch-btn {
  width: 100%; display: flex; align-items: center; gap: 10px;
  min-height: 52px; padding: 8px 10px; text-align: left;
  background: var(--geo-surface); color: var(--geo-text);
  border: 1px solid var(--geo-border); border-radius: 12px;
  transition: border-color var(--geo-dur) var(--geo-ease);
}
#geo-switch-btn:hover { border-color: var(--geo-accent); }
.geo-switch-mark {
  width: 30px; height: 30px; flex: none; border-radius: 9px;
  display: inline-flex; align-items: center; justify-content: center;
  background: color-mix(in oklab, var(--geo-accent) 18%, var(--geo-surface));
  color: var(--geo-accent); font-size: 12px; font-weight: 700;
}
.geo-switch-words { flex: 1 1 auto; min-width: 0; display: block; }
.geo-switch-domain { display: block; font-size: 14px; font-weight: 600; color: var(--geo-text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.geo-switch-sub { display: block; font-size: 12px; color: var(--geo-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.geo-switch-chev { flex: none; color: var(--geo-muted); }

/* In the rail it is the mark alone - still the first thing, still one tap. */
@media (min-width: 768px) {
  body.geo-rail #geo-switch { padding: 10px 0 6px; }
  body.geo-rail #geo-switch-btn { justify-content: center; padding: 8px 0; min-height: 44px; }
  body.geo-rail .geo-switch-words, body.geo-rail .geo-switch-chev { display: none !important; }
  body.geo-rail .geo-switch-mark { font-size: 12px !important; }
}

/* The panel: a sheet from the top on a laptop, the whole screen on a phone. */
#geo-switch-panel {
  position: fixed; inset: 0; z-index: 9975;
  background: rgba(0, 0, 0, .55);
  display: flex; align-items: flex-start; justify-content: center;
  padding: 10vh 16px 16px;
}
#geo-switch-panel[hidden] { display: none; }
#geo-switch-card {
  width: 100%; max-width: 560px; max-height: 70vh; display: flex; flex-direction: column;
  background: var(--geo-surface); border: 1px solid var(--geo-border2); border-radius: var(--geo-r-card);
  overflow: hidden;
}
@media (prefers-reduced-motion: no-preference) {
  #geo-switch-card { animation: geoUp .18s var(--geo-ease) both; }
}
#geo-switch-head { padding: 14px 14px 10px; border-bottom: 1px solid var(--geo-border); }
#geo-switch-title { display: block; font-size: 12px; font-weight: 600; color: var(--geo-muted);
  text-transform: uppercase; letter-spacing: .08em; margin-bottom: 8px; }
#geo-switch-q {
  width: 100%; min-height: 44px; padding: 10px 12px;
  background: var(--geo-surface2); color: var(--geo-text);
  border: 1px solid var(--geo-border); border-radius: var(--geo-r-ctrl); font-size: 15px;
}
.geo-switch-scope { margin: 8px 2px 0; font-size: 12px; color: var(--geo-muted); }
#geo-switch-list { overflow-y: auto; padding: 6px; margin: 0; list-style: none; }
#geo-switch-list .geo-switch-group {
  padding: 10px 10px 4px; font-size: 11px; font-weight: 600; letter-spacing: .07em;
  text-transform: uppercase; color: var(--geo-muted);
}
#geo-switch-list li[role="option"] a {
  display: flex; align-items: center; gap: 10px; min-height: 48px; padding: 6px 10px;
  border-radius: var(--geo-r-ctrl); color: var(--geo-text); text-decoration: none;
}
#geo-switch-list li[aria-selected="true"] a,
#geo-switch-list li[role="option"] a:hover { background: var(--geo-surface2); }
#geo-switch-empty { padding: 16px; margin: 0; color: var(--geo-muted); font-size: 14px; }

/* On a phone the switcher rides in the top bar: the website you are in IS the
   title (the navigation canvas's shape). In the drawer it would be two taps deep
   and behind an overlay - measured, 22 Sep. */
#geo-switch[data-in-header] { flex: 1 1 auto; min-width: 0; padding: 0 0 0 10px; }
#geo-switch[data-in-header] #geo-switch-btn {
  min-height: 44px; padding: 4px 8px; border-color: transparent; background: transparent;
}
#geo-switch[data-in-header] #geo-switch-btn:hover { border-color: var(--geo-border); }
#geo-switch[data-in-header] .geo-switch-sub { display: none; }
@media (max-width: 767px) { #geo-switch-panel { padding: 8px; align-items: flex-start; } #geo-switch-card { max-height: 86vh; } }
/* ── A full-height wrapper is the GROUND, not a card ──────────────────────────
   Measured live, 22 Sep, across 13 pages: /, /notifications, /leads and /widgets
   wrap everything in <div class="min-h-screen bg-gray-50 py-8">. In dark mode that
   utility became the muted surface, so those pages showed a big lighter slab where
   every other page showed the ground - Edward: "that white background and the dark
   bg seem a different css... many pages odd like that". A wrapper that tall is the
   page itself, so it takes no fill at all. */
html[data-theme="dark"] .main-content [class*="min-h-screen"][class*="bg-gray-5"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="min-h-screen"][class*="bg-gray-1"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="min-h-"][class*="bg-white"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="min-h-screen"][class*="bg-gray-5"]:not([style*="width:"]){
  background-color: transparent !important;
}
/* The same for a wash behind a whole section (analytics' purple-to-blue). */
html[data-theme="dark"] .main-content [class*="bg-gradient"][class*="/5"]:not([style*="width:"]){
  background-image: none !important; background-color: transparent !important;
}

/* ── The brand row: logo and the fold button on ONE line ──────────────────────
   Edward, 22 Sep: "the logo needs to be top, next to the icon that opens and
   closes the menu". */
#geo-brandrow { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px 2px; }
#geo-brandrow > a { flex: 1 1 auto; min-width: 0; }
body.geo-rail #geo-brandrow { flex-direction: column; gap: 6px; padding: 10px 0 2px; }
/* ══ WHAT THE LIVE SWEEP MEASURED, 22 Sep (design_sweep.cjs, 22 pages) ════════
   Each rule answers a measured number, not an impression. */

/* 1. The initials tile on /clients and /tasks: white on bg-gray-600 was 3.18:1. */
html[data-theme="dark"] .main-content [class*="bg-gray-6"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-gray-5"]:not([class*="min-h"]):not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
  color: var(--geo-text) !important;
}

/* 2. Amber and yellow BUTTONS ("Mark as client" measured 1.02:1, "Change
      Password" was pure yellow). Amber is a state; a button is one of the two
      shapes. */
html[data-theme="dark"] button[class*="bg-amber-5"]:not([style*="width:"]), html[data-theme="dark"] a[class*="bg-amber-5"]:not([style*="width:"]),
html[data-theme="dark"] button[class*="bg-yellow-5"]:not([style*="width:"]), html[data-theme="dark"] a[class*="bg-yellow-5"]:not([style*="width:"]),
html[data-theme="dark"] button[class*="bg-orange-5"]:not([style*="width:"]), html[data-theme="dark"] a[class*="bg-orange-5"]:not([style*="width:"]){
  background-color: transparent !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
}
html[data-theme="dark"] button[class*="bg-amber-5"]:hover, html[data-theme="dark"] button[class*="bg-yellow-5"]:hover {
  border-color: var(--geo-accent) !important;
}

/* 3. Small chips that were unreadable on their own fill ("Premium unlock" 1.60:1,
      "No Permission" 2.98:1): a chip takes the page's ink unless it is a status,
      and a status takes its own lighter ink (set further up). */
/* A chip takes the page ink - unless its fill is bright, where the ink must stay
   dark. This rule is more specific than the bright-chip rule below it, so without
   these exclusions it won: "Premium unlock" measured 1.60:1 live, 22 Sep. */
html[data-theme="dark"] .main-content span[class*="px-2"][class*="text-xs"]:not([class*="text-green"]):not([class*="text-red"]):not([class*="text-yellow"]):not([class*="text-amber"]):not([class*="bg-amber-4"]):not([class*="bg-amber-3"]):not([class*="bg-yellow-4"]):not([class*="bg-yellow-3"]):not([class*="bg-lime-4"]):not([class*="bg-green-4"]) {
  color: var(--geo-text) !important;
}

/* 4. Buttons the sweep measured at 24 and 30px tall. */
.work-buy, .kit-copy-btn, .main-content button[class*="py-0.5"], .main-content button[class*="py-1 "] { min-height: 36px; }
@media (max-width: 767px) { .work-buy, .kit-copy-btn { min-height: 44px; } }

/* 5. A bold run inside a tinted note kept its own dark ink from the note's light
      original (integrations, 2.18:1). Inside the app's own surfaces it inherits. */
html[data-theme="dark"] .main-content [style*="color-mix"] strong,
html[data-theme="dark"] .main-content [style*="var(--geo"] strong { color: inherit !important; }
/* ══ NEXT ACTIONS ═════════════════════════════════════════════════════════════
   The work list on a site's Fixes tab. Borrowed shapes from the competitor screen
   Edward sent (states with counts, impact and effort as three bars, one progress
   number, an export); our colours, and our "Solve it". */
.geo-na-dot { width: 8px; height: 8px; border-radius: 999px; background: var(--geo-muted); display: inline-block; }
.geo-na-dot--todo { background: var(--geo-warn); }
.geo-na-dot--done { background: var(--geo-good); }
.geo-na-dot--ignored { background: var(--geo-muted); }
.geo-na-count { font-variant-numeric: tabular-nums; color: var(--geo-muted); }
.geo-chip[aria-pressed="true"] .geo-na-count { color: var(--geo-text); }

.geo-na-progress { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--geo-muted); }
.geo-na-progress-track { width: 90px; height: 6px; border-radius: 999px; background: var(--geo-surface2); overflow: hidden; }
.geo-na-progress-fill { display: block; height: 100%; background: var(--geo-accent); transition: width .3s var(--geo-ease); }
.geo-na-showing { font-size: 12px; color: var(--geo-muted); }

/* Impact and effort: three bars AND the word, because colour alone is not a label. */
.geo-na-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 10px; }
.geo-na-pair { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; }
.geo-na-key { color: var(--geo-muted); }
.geo-na-bars { display: inline-flex; align-items: flex-end; gap: 2px; height: 12px; }
.geo-na-bars i { width: 3px; height: 6px; border-radius: 1px; background: var(--geo-border2); display: block; }
.geo-na-bars i:nth-child(2) { height: 9px; }
.geo-na-bars i:nth-child(3) { height: 12px; }
.geo-na-bar--high i.on { background: var(--geo-good); }
.geo-na-bar--mid  i.on { background: var(--geo-warn); }
.geo-na-bar--low  i.on { background: var(--geo-muted); }
.geo-na-level { font-size: 12px; color: var(--geo-text2); }
.geo-na-quickwin {
  display: inline-flex; align-items: center; gap: 4px; font-size: 11px; font-weight: 600;
  padding: 2px 8px; border-radius: 999px;
  background: color-mix(in oklab, var(--geo-accent) 16%, var(--geo-bg)); color: var(--geo-accent);
}
[data-na-row][hidden], [data-na-group][hidden] { display: none !important; }
@media (max-width: 767px) { #geo-actions-bar select { width: 100%; } }
/* ── Tip banners ──────────────────────────────────────────────────────────────
   Measured live, 22 Sep: the "Getting started" banner was bg-blue-950/40 -
   rgba(23,37,84,.4), a blue slab on a neutral page (Edward: "so many
   inconsistencies in style"). A tip is a quiet note, not a colour event. */
html[data-theme="dark"] .main-content .bp-banner,
html[data-theme="dark"] .main-content [class*="bg-blue-9"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-indigo-9"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-slate-9"]:not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-color: var(--geo-border) !important;
  color: var(--geo-text2) !important;
}
html[data-theme="dark"] .main-content .bp-banner strong,
html[data-theme="dark"] .main-content .bp-banner b { color: var(--geo-text) !important; }
html[data-theme="dark"] .main-content .bp-banner a { color: var(--geo-second) !important; }
/* ── Every grey, including the ones with an opacity suffix ────────────────────
   The sweep (widened to catch hue 200-230 on 22 Sep) found Tailwind's blue-tinted
   greys still painting inputs, table heads and panels: bg-gray-700/50 rgb(55,65,81),
   bg-gray-900 rgb(17,24,39), bg-gray-950 rgb(3,7,18). Those are a different
   temperature from our neutrals, which is exactly what "some backgrounds don't
   match" looks like. One mapping, every variant. */
html[data-theme="dark"] .main-content [class*="bg-gray-7"]:not([style*="width:"]){ background-color: var(--geo-surface2) !important; }
html[data-theme="dark"] .main-content [class*="bg-gray-8"]:not([style*="width:"]){ background-color: var(--geo-surface) !important; }
html[data-theme="dark"] .main-content [class*="bg-gray-9"]:not([style*="width:"]){ background-color: var(--geo-panel) !important; }
html[data-theme="dark"] .main-content [class*="min-h-screen"][class*="bg-gray-9"]:not([style*="width:"]){ background-color: transparent !important; }
html[data-theme="dark"] .main-content input[class*="bg-gray-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content select[class*="bg-gray-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content textarea[class*="bg-gray-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content select, html[data-theme="dark"] .main-content input:not([type="checkbox"]):not([type="radio"]) {
  /* The same lift as the base dark rule (30 Sep): a step lighter than the card, a visible edge. */
  background-color: color-mix(in srgb, var(--geo-text) 8%, var(--geo-surface)) !important;
  border-color: color-mix(in srgb, var(--geo-text) 22%, var(--geo-surface)) !important;
  color: var(--geo-text) !important;
}
html[data-theme="dark"] .main-content select:focus, html[data-theme="dark"] .main-content input:not([type="checkbox"]):not([type="radio"]):focus,
html[data-theme="dark"] .main-content textarea:focus { border-color: var(--geo-accent) !important; }
html[data-theme="dark"] .main-content thead, html[data-theme="dark"] .main-content th { background-color: transparent !important; }
/* An icon tile in a solid brand blue or pink is decoration, not a state. */
html[data-theme="dark"] .main-content [class*="bg-blue-6"]:not(a):not(button):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-pink-6"]:not(a):not(button):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-cyan-6"]:not(a):not(button):not([style*="width:"]){
  background-color: var(--geo-surface2) !important; color: var(--geo-text) !important;
}
/* ── The last thirteen, each one measured ─────────────────────────────────────
   Dashboard quick links still carried a teal-black and a pink-black tint
   (rgb(12,42,46) and rgb(42,15,30)); "Watch client tutorial video" wore the pink
   one too; the site's sandwich button kept a blue-grey (rgb(31,41,55)); "Reset"
   was 34px with 4px corners; and the workspace buttons were 36px on a phone. */
html[data-theme="dark"] .main-content a[class*="bg-teal-9"]:not([style*="width:"]), html[data-theme="dark"] .main-content a[class*="bg-pink-9"]:not([style*="width:"]),
html[data-theme="dark"] .main-content a[class*="bg-cyan-9"]:not([style*="width:"]), html[data-theme="dark"] .main-content a[class*="bg-fuchsia-9"]:not([style*="width:"]),
html[data-theme="dark"] .main-content button[class*="bg-pink-9"]:not([style*="width:"]), html[data-theme="dark"] .main-content button[class*="bg-teal-9"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-rose-9"]:not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important;
}
html[data-theme="dark"] .site-sections-m > summary,
html[data-theme="dark"] .site-sections-m { background-color: var(--geo-surface) !important; border-color: var(--geo-border) !important; }
.main-content button, .main-content a[class*="bg-"], .geo-btn { border-radius: var(--geo-r-ctrl); }
.main-content button[class*="py-1.5"], .main-content button[class*="py-1 "] { min-height: 36px; }
@media (max-width: 767px) { .work-buy, .main-content button[class*="py-1.5"] { min-height: 44px !important; } }
/* The GHL mark measured 4.32:1 - one step brighter clears 4.5. */
html[data-theme="dark"] .int-card .ghl-mark, html[data-theme="dark"] .int-card.featured h3 .ghl-mark,
html[data-theme="dark"] .ghl-mark { color: var(--geo-text) !important; background: var(--geo-surface2) !important; }
/* ── A bright chip keeps its dark ink ─────────────────────────────────────────
   "Premium unlock" is bg-amber-400 with text-gray-900: a light-mode chip, dark ink
   on a bright fill. The dark theme flipped that ink to near-white and it measured
   1.60:1 live. On a bright fill the ink stays dark, whatever the theme. */
html[data-theme="dark"] .main-content span[class*="bg-amber-4"],
html[data-theme="dark"] .main-content span[class*="bg-yellow-4"],
html[data-theme="dark"] .main-content span[class*="bg-lime-4"],
html[data-theme="dark"] .main-content span[class*="bg-green-4"],
html[data-theme="dark"] .main-content span[class*="bg-amber-3"],
html[data-theme="dark"] .main-content span[class*="bg-yellow-3"],
html[data-theme="dark"] .main-content div[class*="bg-amber-4"] { color: #1a1305 !important; }
/* ...but a BUTTON in those classes has had its fill removed (it is the silver
   outline now), so it takes the page ink. Two of my own rules were fighting and
   the result measured 1.14:1 live, 22 Sep. */
html[data-theme="dark"] .main-content button[class*="bg-amber-"],
html[data-theme="dark"] .main-content button[class*="bg-yellow-"],
html[data-theme="dark"] .main-content a[class*="bg-amber-"],
html[data-theme="dark"] .main-content button[class*="text-amber-9"] { color: var(--geo-text) !important; }
/* A red text-only label ("Delete") measured 4.07:1: the mapped ink was still one
   step too dark for 12px. Text-only reds take the lighter step. */
html[data-theme="dark"] .main-content button[class*="text-red-"]:not([class*="bg-"]),
html[data-theme="dark"] .main-content a[class*="text-red-"]:not([class*="bg-"]) { color: #ffb4b4 !important; }
/* ══ A STATE IS AN EDGE AND A CHIP, NEVER A WASH ══════════════════════════
   Edward, 23 Sep, on /actions: "even here has worn colours", and "the styling for
   every page needs to be universal". He is right on both counts. Cards carrying a
   status tint (bg-amber-50, bg-red-50 and friends) washed the WHOLE card in that
   colour, so a list of notices read as a row of muddy brown slabs.

   The rule, for every page at once: a card is always the card surface. Its state
   shows as a 3px edge on the left and the chip it already carries. Nothing else
   changes - the chips, the icons and the words keep their meaning.

   WHO THIS REACHES, and why it is written this way (rewritten 23 Sep). It used to say
   [class*="rounded-"][class*="bg-blue-5"]:not([style*="width:"]), which is not a description of a card:

     - [class*="rounded-"] also matches rounded-full, so the FILLED part of the
       "Checks Passing" progress bar was treated as a status card and painted the card
       surface. The surface is the page colour, so an 8/10 bar drew as almost empty.
       The number on screen was wrong, not just the styling.
     - [class*="bg-blue-5"] also matches the SOLID bg-blue-500. A solid 500 is a filled
       element - a bar:not([style*="width:"]), a dot, a badge - not a pale wash, so it never belonged here.

   Both are named now: [class~="..."] matches a whole token in the class list, and the
   see-through forms are matched by the trailing SLASH (bg-blue-500/), which the solid
   class does not have. A round-ended element is a pill, a dot or a bar, and is excluded
   outright - it is never a status card. Third time a [class*=] substring has done real
   damage, so this family is now named, not guessed. */
/* dark */
html[data-theme="dark"] .main-content [class~="bg-amber-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-amber-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-amber-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-amber-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-amber-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class~="bg-yellow-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-yellow-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-yellow-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-yellow-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-yellow-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class~="bg-orange-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-orange-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-orange-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-orange-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-orange-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-warn) !important;
}
html[data-theme="dark"] .main-content [class~="bg-red-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-red-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-red-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-red-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-red-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class~="bg-rose-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-rose-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-rose-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-rose-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-rose-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-bad) !important;
}
html[data-theme="dark"] .main-content [class~="bg-green-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-green-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-green-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-green-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-green-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class~="bg-emerald-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-emerald-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-emerald-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-emerald-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-emerald-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-good) !important;
}
html[data-theme="dark"] .main-content [class~="bg-blue-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-blue-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-blue-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-blue-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-blue-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class~="bg-indigo-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class~="bg-indigo-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html[data-theme="dark"] .main-content [class*="bg-indigo-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-indigo-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="bg-indigo-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-second) !important;
}
/* the same in light mode, where the wash was a pastel slab */
html:not([data-theme="dark"]) .main-content [class~="bg-amber-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-amber-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-amber-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-amber-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-amber-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class~="bg-yellow-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-yellow-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-yellow-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-yellow-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-yellow-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class~="bg-orange-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-orange-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-orange-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-orange-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-orange-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-warn) !important;
}
html:not([data-theme="dark"]) .main-content [class~="bg-red-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-red-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-red-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-red-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-red-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class~="bg-rose-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-rose-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-rose-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-rose-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-rose-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-bad) !important;
}
html:not([data-theme="dark"]) .main-content [class~="bg-green-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-green-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-green-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-green-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-green-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class~="bg-emerald-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-emerald-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-emerald-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-emerald-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-emerald-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-good) !important;
}
html:not([data-theme="dark"]) .main-content [class~="bg-blue-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-blue-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class~="bg-indigo-50"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class~="bg-indigo-100"]:not(span):not(button):not(a):not([class~="rounded-full"]),
html:not([data-theme="dark"]) .main-content [class*="bg-indigo-400/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-indigo-500/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-indigo-600/"]:not(span):not(button):not(a):not([class~="rounded-full"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  border-left: 3px solid var(--geo-second) !important;
}


/* ── A page that never sets a theme ───────────────────────────────────────────
   The sign-in, apply, partner and public pages render their own <html> without a
   data-theme, so every rule above skipped them: they kept the old blue-grey and,
   wherever a wrapper was transparent, the browser's white body showed through.
   They are dark by design, so they take the dark ground and ink directly. */
html:not([data-theme]) body {
  background-color: #030303;
  color: #fafafa;
  font-family: var(--geo-font);
}
html:not([data-theme]) .bg-gray-900, html:not([data-theme]) .bg-gray-950 { background-color: #030303 !important; }
html:not([data-theme]) .bg-gray-800 { background-color: #0a0a0a !important; }
html:not([data-theme]) .bg-gray-700 { background-color: #1f1f1f !important; }
html:not([data-theme]) .border-gray-700, html:not([data-theme]) .border-gray-800 { border-color: #242424 !important; }
html:not([data-theme]) .text-gray-300, html:not([data-theme]) .text-gray-400 { color: #d9d9d9 !important; }
html:not([data-theme]) .text-gray-500 { color: #9a9a9a !important; }
html:not([data-theme]) a[class*="bg-green-5"]:not([style*="width:"]), html:not([data-theme]) button[class*="bg-green-5"]:not([style*="width:"]),
html:not([data-theme]) a[class*="bg-blue-6"]:not([style*="width:"]), html:not([data-theme]) button[class*="bg-blue-6"]:not([style*="width:"]),
html:not([data-theme]) button[type="submit"][class*="bg-"]:not([style*="width:"]){
  background-image: none !important;
  background-color: #00b8b5 !important;
  color: #04201f !important;
  font-weight: 700;
}

/* ══ THE COMPONENT LAYER ══════════════════════════════════════════════════════
   Edward, 23 Sep: "many inconsistency, let's get it right", "the links white too -
   we need this universal to the style we have". These are the shapes that repeat
   on every page, so they are settled once, here, rather than page by page. */

/* 1. A LINK looks like a link. Anywhere in the page, a link that is not a button,
      a tab or a status carries the second voice - the site's lavender. Underline
      only on hover, so a list of links does not become a fence. */
.main-content a:not([class*="bg-"]):not(.site-tab-btn):not([role="tab"]):not([class*="text-green"]):not([class*="text-red"]):not([class*="text-amber"]):not([class*="text-yellow"]):not(.geo-chip):not([data-na-solve]) {
  color: var(--geo-second);
  text-decoration: none;
}
.main-content a:not([class*="bg-"]):not(.site-tab-btn):hover { text-decoration: underline; text-underline-offset: 3px; }
/* ...but a link that IS the row's title stays ink, with the lavender on hover, so
   a table does not read as a wall of coloured text. */
.main-content td a:not([class*="bg-"]), .main-content th a:not([class*="bg-"]),
.main-content h1 a, .main-content h2 a, .main-content h3 a { color: var(--geo-text); }
.main-content td a:not([class*="bg-"]):hover { color: var(--geo-second); }

/* 2. A ROW OF BUTTONS is one height and one shape. Three buttons side by side at
      36, 40 and 44px (View Results · View Site · Run Audit, 23 Sep) reads as three
      unrelated things. */
/* NOT a link that is itself a row. A whole-row link (Home's Client Health, list rows) carries
   a background and its own `flex`/`grid`/`block` layout; made inline-flex it sized to its
   content, and one long client name pushed the page 499px wide on a 390px phone (25 Sep).
   Nor a CARD that is a link (padding on every side, p-5): its title, number and "View
   billing" were laid out side by side in one row. */
.main-content button:not(.geo-chip):not(.geo-own-colour):not([class*="rounded-full"]),
.main-content a[class*="bg-"]:not(.geo-chip):not([class*="rounded-full"]):not(.flex):not(.grid):not(.block):not([class^="p-"]):not([class*=" p-"]),
.main-content input[type="submit"] {
  min-height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  border-radius: var(--geo-r-ctrl);
  font-size: 14px;
}
@media (max-width: 767px) {
  .main-content button:not(.geo-chip):not(.geo-own-colour), .main-content a[class*="bg-"]:not(.geo-chip):not(.geo-own-colour) { min-height: 44px; }
}

/* 3. A STATUS PILL keeps its words on one line, with the date beside it rather
      than wrapped inside it ("Active (Sep 7, 2026)" was three lines, 23 Sep). */
.main-content [class*="rounded-full"][class*="px-"],
.main-content .geo-pill {
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  line-height: 1.2;
}
.main-content [class*="rounded-full"] small,
.main-content [class*="rounded-full"] .geo-pill-when { color: var(--geo-muted); font-size: 11px; }

/* 4. THE SUPPORT BUTTON says what it is. An unlabelled circle in a corner is a
      guess; a word above it is an invitation (Edward: "the support icon needs the
      text above where it says here to help"). */
#geo-dock { flex-direction: column; align-items: flex-end; gap: 10px; }
#geo-dock .geo-dock-help { position: relative; }
#geo-dock .geo-dock-label {
  display: block;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--geo-muted);
  background: var(--geo-surface);
  border: 1px solid var(--geo-border);
  border-radius: 999px;
  padding: 3px 10px;
  margin-bottom: 2px;
  white-space: nowrap;
}
@media (hover: hover) { #geo-dock:hover .geo-dock-label { color: var(--geo-text); border-color: var(--geo-border2); } }

/* ══ LIGHT MODE, THE SAME RULES ═══════════════════════════════════════════════
   Edward, 23 Sep: "this light mode looks bad", on the services marketplace - a
   mid-grey slab behind the price, and four buttons in four different colours
   (teal, amber, grey, red) on one card. The rules are the dark ones, applied. */

/* A block behind a figure is the quiet surface, not a grey slab. */
html:not([data-theme="dark"]) .main-content [class*="bg-gray-4"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-5"]:not([class*="min-h"]):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-6"]:not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
  color: var(--geo-text) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-gray-4"] [class*="text-gray-"],
html:not([data-theme="dark"]) .main-content [class*="bg-gray-5"] [class*="text-gray-"] { color: var(--geo-text2) !important; }

/* Buttons: one primary, the rest silver, and destroying is an OUTLINE - a filled
   red block beside three other colours is the loudest thing on a calm card. */
html:not([data-theme="dark"]) button[class*="bg-amber-"]:not([style*="width:"]), html:not([data-theme="dark"]) a[class*="bg-amber-"]:not([style*="width:"]),
html:not([data-theme="dark"]) button[class*="bg-yellow-"]:not([style*="width:"]), html:not([data-theme="dark"]) a[class*="bg-yellow-"]:not([style*="width:"]),
html:not([data-theme="dark"]) button[class*="bg-gray-2"]:not([style*="width:"]), html:not([data-theme="dark"]) button[class*="bg-gray-3"]:not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
}
button[class*="bg-red-5"]:not([style*="width:"]), button[class*="bg-red-6"]:not([style*="width:"]), a[class*="bg-red-5"]:not([style*="width:"]), a[class*="bg-red-6"]:not([style*="width:"]),
button[class*="bg-rose-5"]:not([style*="width:"]), button[class*="bg-rose-6"]:not([style*="width:"]){
  background-color: transparent !important;
  color: var(--geo-bad) !important;
  border: 1px solid color-mix(in oklab, var(--geo-bad) 45%, var(--geo-border)) !important;
  font-weight: 600;
}
button[class*="bg-red-5"]:hover:not([style*="width:"]), button[class*="bg-red-6"]:hover:not([style*="width:"]), a[class*="bg-red-6"]:hover:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-bad) 14%, transparent) !important;
}
/* A "featured" state is a star and a quiet mark, never a filled amber button. */
html:not([data-theme="dark"]) .main-content [class*="text-amber-"],
html:not([data-theme="dark"]) .main-content [class*="text-yellow-"] { color: var(--geo-warn) !important; }

/* A card's top edge in light mode follows the same rule as dark: a hairline, and
   the state on the left edge only. */
html:not([data-theme="dark"]) .main-content [class*="border-t-4"],
html:not([data-theme="dark"]) .main-content [class*="border-t-2"] { border-top-width: 1px !important; border-top-color: var(--geo-border) !important; }


/* ── Light mode: the same shapes as dark ──────────────────────────────────────
   Edward's screens, 23 Sep: a "Run Audit" button so faint it read as disabled,
   and a row of buttons at three weights. In light, a secondary button is a white
   surface with a visible hairline and full-strength ink - never grey-on-grey. */
/* ...but never an accent button: this rule was stealing the ink off the teal
   ("Add the business details" measured 2.73:1 in light, 23 Sep). */
/* ...and only on something DRAWN as a button (it has a fill or a border). A bare <button> is
   a row, a tab or a disclosure - the Start here steps, list items, "Show more" - and got a white
   box with a grey border in light only, so every accordion looked like a stack of cards and the
   open step split in two (Edward, 26 Sep: "the light mode seems off"). Dark never boxed them. */
html:not([data-theme="dark"]) .main-content button:is([class*="bg-"], [class*=" border"], [class^="border"]):not([class*="bg-green"]):not([class*="bg-blue-6"]):not([class*="bg-teal"]):not([class*="bg-emerald"]):not([class*="bg-transparent"]):not([class*="border-transparent"]):not(.ob-grad):not(.geo-btn-primary):not(.geo-chip):not(.geo-own-colour):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content a[class*="bg-gray-"]:not(.ob-grad):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content a[class*="bg-white"]:not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
}
html:not([data-theme="dark"]) .main-content button:is([class*="bg-"], [class*=" border"], [class^="border"]):hover:not([class*="bg-green"]):not([class*="bg-blue-6"]):not([class*="bg-transparent"]):not([class*="border-transparent"]) {
  border-color: var(--geo-accent) !important;
}
/* A link-styled action ("View Site") keeps the second voice rather than fading. */
html:not([data-theme="dark"]) .main-content a:not([class*="bg-"]):not(.site-tab-btn) { color: var(--geo-second); }

/* The logo mark is drawn for a dark ground; on a light one it needs its own
   contrast rather than sitting in a teal square that vanishes (Edward: "check
   light mode logo too"). */
html:not([data-theme="dark"]) .sidebar img[src*="logo"],
html:not([data-theme="dark"]) #geo-brandrow img { filter: none; }
html:not([data-theme="dark"]) #geo-brandrow, html:not([data-theme="dark"]) .sidebar a[href="/"] { color: var(--geo-text); }

/* ── A progress bar is the accent on the quiet surface ────────────────────────
   Edward, 23 Sep, quoting the markup: a bar drawn as bg-blue-600 inside a
   bg-gray-700 track. A bar that MEASURES something takes the accent; its track is
   the muted surface. (The tinted-blue rule above leaves it alone because a bar is
   neither a button nor a link.) */
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-blue-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-indigo-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-purple-"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="rounded-full"] > [class*="bg-blue-"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="rounded-full"] > [class*="bg-indigo-"]:not([style*="width:"]){
  background-color: var(--geo-accent) !important;
}
html[data-theme="dark"] .main-content [class*="rounded-full"][class*="bg-gray-7"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="rounded-full"][class*="bg-gray-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="rounded-full"][class*="bg-gray-2"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="rounded-full"][class*="bg-gray-3"]:not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
}
/* A bar that reports a STATE keeps that state's colour. */
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-green-"]:not([style*="width:"]){ background-color: var(--geo-good) !important; }
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-red-"]:not([style*="width:"]){ background-color: var(--geo-bad) !important; }
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-amber-"]:not([style*="width:"]),
html[data-theme="dark"] .main-content [class*="rounded-full"] > [class*="bg-yellow-"]:not([style*="width:"]){ background-color: var(--geo-warn) !important; }


/* ── The same mappings, on the light side ─────────────────────────────────────
   The status, link and decoration rules above were written under
   html[data-theme="dark"], so on the light side none of them ran: the sweep in
   light mode reported 343 findings against 0 in dark (23 Sep). These are the same
   rules, in light values. */
html:not([data-theme="dark"]) .main-content [class*="text-green-"],
html:not([data-theme="dark"]) .main-content [class*="text-emerald-"] { color: var(--geo-good-ink) !important; }
html:not([data-theme="dark"]) .main-content [class*="text-red-"],
html:not([data-theme="dark"]) .main-content [class*="text-rose-"] { color: var(--geo-bad-ink) !important; }
html:not([data-theme="dark"]) .main-content [class*="text-yellow-"],
html:not([data-theme="dark"]) .main-content [class*="text-amber-"],
html:not([data-theme="dark"]) .main-content [class*="text-orange-"] { color: var(--geo-warn-ink) !important; }
html:not([data-theme="dark"]) .main-content [class*="text-blue-"],
html:not([data-theme="dark"]) .main-content [class*="text-indigo-"],
html:not([data-theme="dark"]) .main-content [class*="text-purple-"],
html:not([data-theme="dark"]) .main-content [class*="text-violet-"],
html:not([data-theme="dark"]) .main-content [class*="text-pink-"] { color: var(--geo-second) !important; }
html:not([data-theme="dark"]) .main-content [class*="bg-indigo-"]:not(button):not(a):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-purple-"]:not(button):not(a):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-violet-"]:not(button):not(a):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-pink-"]:not(button):not(a):not([style*="width:"]){
  background-color: var(--geo-surface2) !important; color: var(--geo-text) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-green-1"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-green-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-good) 14%, #fff) !important; color: var(--geo-good-ink) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-amber-1"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-yellow-1"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-warn) 14%, #fff) !important; color: var(--geo-warn-ink) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-red-1"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-rose-1"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-bad) 14%, #fff) !important; color: var(--geo-bad-ink) !important;
}
html:not([data-theme="dark"]) .main-content .text-gray-400,
html:not([data-theme="dark"]) .main-content .text-gray-500 { color: var(--geo-muted) !important; }
html:not([data-theme="dark"]) .main-content pre,
html:not([data-theme="dark"]) .main-content code { background-color: var(--geo-surface2) !important; color: var(--geo-text) !important; }

/* Every control is 44px on a phone, in both themes - some rules were losing to a
   later one and the sweep measured 40px. */
@media (max-width: 767px) {
  .main-content button:not(.geo-chip):not(.geo-own-colour), .main-content a[class*="bg-"]:not(.geo-chip):not(.geo-own-colour),
  .main-content input[type="submit"], .geo-btn, .btn-sm, .geo-tt-btn { min-height: 44px !important; }
}


/* The one action keeps its own ink in BOTH themes, whatever else a page's classes
   say. Written last so nothing later can take it back. */
.ob-grad, .geo-btn-primary,
a[class*="bg-green-5"]:not([class*="/"]):not([style*="width:"]), a[class*="bg-green-6"]:not([class*="/"]):not([style*="width:"]),
button[class*="bg-green-5"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-green-6"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-teal-5"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-teal-5"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-emerald-6"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-emerald-6"]:not([class*="/"]):not([style*="width:"]){
  background-color: var(--geo-accent) !important;
  background-image: none !important;
  color: var(--geo-accent-ink) !important;
  border: 0 !important;
}


/* ══ LIGHT MODE: the dark slabs, and the blue that is not our blue ════════════
   The light sweep on the live site, 23 Sep, still reported 393 findings against 0
   in dark, and they were two shapes repeated:

     1. A DARK SLAB SURVIVED INTO LIGHT. bg-gray-700/800/900/950 had a dark-mode
        rule and no light one, so panels came through as near-black rgb(3,7,18)
        and rgb(17,24,39) on a white page - Edward: "also see that white background
        and the dark bg seems a different css, you missed many pages odd like that".
        Their white and pale-grey children have to come with them, or the fix
        writes white text onto a white card.
     2. TAILWIND BLUE. Dots, avatars, bars and /20 chips are mapped in dark and
        nowhere in light. Our blue is the accent.

   Written once for light, mirroring rules that already exist for dark. */
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-slate-7"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-slate-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-slate-9"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-zinc-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-zinc-9"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-neutral-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-neutral-9"]:not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border-color: var(--geo-border) !important;
}
/* One step down for a panel nested inside another - otherwise two white cards
   share an edge and the inner one disappears. */
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"] [class*="bg-gray-9"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"] [class*="bg-gray-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"] [class*="bg-gray-9"]:not([style*="width:"]){
  background-color: var(--geo-surface2) !important;
}
/* The ink that used to sit on those slabs - but NOT a button or a painted thing
   inside one. This rule reached "Copy message" (a teal action inside a bg-gray-800
   card) and put the card's ink on the teal: 2.39:1, measured 23 Sep. A descendant
   that paints itself decides its own ink. */
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-slate-8"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-slate-9"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"][class*="text-white"]:not(button):not(a),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"][class*="text-white"]:not(button):not(a),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"][class*="text-white"]:not(button):not(a) {
  color: var(--geo-text) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"] [class*="text-gray-3"]:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"] [class*="text-gray-3"]:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"] [class*="text-gray-3"]:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"] [class*="text-gray-2"]:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-8"] [class*="text-gray-2"]:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"] [class*="text-gray-2"]:not(button):not(a):not([class*="bg-"]) {
  color: var(--geo-text2) !important;
}

/* Blue is the accent, at every weight. A flat blue block becomes the accent; a
   pale blue becomes a lighter step of it; a /10-/30 chip becomes a tint. */
/* A small MARK - a dot, an avatar tile, a bar - keeps the accent. Written for BOTH
   themes: the accent and its ink flip on their own, and a Tailwind blue dot was just
   as wrong on the dark side (the sweep only stopped hiding it on 23 Sep). */
html .main-content [class*="rounded-full"][class*="bg-blue-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="rounded-sm"][class*="bg-blue-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="rounded-lg"][class*="bg-blue-6"][class*="w-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="rounded-full"][class*="bg-cyan-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="rounded-full"][class*="bg-indigo-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="rounded-full"][class*="bg-sky-"]:not([class*="/"]):not(button):not(a):not([style*="width:"]){
  background-color: var(--geo-accent) !important;
  color: var(--geo-accent-ink) !important;
}
/* A PANEL is a tint of the accent, and its words stay page ink. */
html .main-content [class*="bg-blue-"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="w-"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-cyan-"]:not([class*="rounded-full"]):not([class*="w-"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-sky-"]:not([class*="rounded-full"]):not([class*="w-"]):not(button):not(a):not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-accent) 11%, var(--geo-bg)) !important;
  color: var(--geo-text) !important;
  border-color: color-mix(in oklab, var(--geo-accent) 30%, var(--geo-border)) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-blue-2"]:not(button):not(a):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-3"]:not(button):not(a):not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-4"]:not(button):not(a):not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-accent) 45%, var(--geo-surface)) !important;
}
html:not([data-theme="dark"]) .main-content [class*="bg-blue-1"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-5"][class*="/"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-blue-6"][class*="/"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-cyan-5"][class*="/"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content [class*="bg-sky-5"][class*="/"]:not([style*="width:"]){
  background-color: color-mix(in oklab, var(--geo-accent) 14%, #fff) !important;
  color: var(--geo-accent) !important;
}
/* Cyan and sky text follow the accent too (they were only mapped in dark). */
html:not([data-theme="dark"]) .main-content [class*="text-cyan-"],
html:not([data-theme="dark"]) .main-content [class*="text-sky-"],
html:not([data-theme="dark"]) .main-content [class*="text-teal-"] { color: var(--geo-accent) !important; }
/* A purple button is not one of the two shapes (teal or silver), and a filled
   lavender takes different ink in each theme - so it becomes the silver one.
   Measured 1.18:1 in light before this. */
html .main-content a[class*="bg-purple-"]:not([class*="/"]):not([style*="width:"]), html .main-content button[class*="bg-purple-"]:not([class*="/"]):not([style*="width:"]),
html .main-content a[class*="bg-violet-"]:not([class*="/"]):not([style*="width:"]), html .main-content button[class*="bg-violet-"]:not([class*="/"]):not([style*="width:"]),
html .main-content a[class*="bg-fuchsia-"]:not([class*="/"]):not([style*="width:"]), html .main-content button[class*="bg-fuchsia-"]:not([class*="/"]):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  background-image: none !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border2) !important;
}
html .main-content a[class*="bg-purple-"]:hover, html .main-content button[class*="bg-purple-"]:hover {
  border-color: var(--geo-accent) !important;
}

/* ══ LIGHT MODE: the dark-native classes, in tokens ═══════════════════════════
   These rules used to live in a <style> block inside app/views/layouts/main.php,
   written as raw Tailwind hexes with !important. Because that block loads after the
   stylesheets, it beat everything here - which is why light mode kept measuring the
   same wrong inks however many token rules were added (23 Sep 2026). They now live
   with the rest of the palette, and say the same thing in tokens.

   Many views are written dark-native (bg-gray-800 cards, text-gray-400 captions).
   The mapping mirrors what those classes MEAN in dark:
       gray-900/950  the page ground      gray-800  a card
       gray-700/600  the muted step       white/100 primary ink
       gray-200/300  secondary ink        gray-400/500  quiet ink              */
html:not([data-theme="dark"]) .main-content .bg-gray-900,
html:not([data-theme="dark"]) .main-content .bg-gray-950,
html:not([data-theme="dark"]) .main-content [class*="bg-gray-9"][class*="/"]:not([style*="width:"]){ background-color: var(--geo-bg) !important; }
html:not([data-theme="dark"]) .main-content .bg-gray-800 {
  background-color: var(--geo-surface) !important;
  box-shadow: 0 1px 2px rgba(0, 0, 0, .05) !important;
}
html:not([data-theme="dark"]) .main-content .bg-gray-700,
html:not([data-theme="dark"]) .main-content .bg-gray-600,
html:not([data-theme="dark"]) .main-content [class*="bg-gray-7"][class*="/"]:not([style*="width:"]){ background-color: var(--geo-surface2) !important; }
/* Borders and dividers */
html:not([data-theme="dark"]) .main-content [class*="border-gray-7"],
html:not([data-theme="dark"]) .main-content [class*="border-gray-8"],
html:not([data-theme="dark"]) .main-content [class*="border-gray-9"] { border-color: var(--geo-border) !important; }
html:not([data-theme="dark"]) .main-content [class*="border-gray-6"],
html:not([data-theme="dark"]) .main-content [class*="border-gray-5"] { border-color: var(--geo-border2) !important; }
html:not([data-theme="dark"]) .main-content [class*="divide-gray-7"] > * + *,
html:not([data-theme="dark"]) .main-content [class*="divide-gray-8"] > * + * { border-color: var(--geo-border) !important; }
html:not([data-theme="dark"]) .main-content [class*="border-blue-8"],
html:not([data-theme="dark"]) .main-content [class*="border-teal-8"],
html:not([data-theme="dark"]) .main-content [class*="border-cyan-8"] { border-color: color-mix(in oklab, var(--geo-accent) 34%, var(--geo-border)) !important; }
html:not([data-theme="dark"]) .main-content [class*="border-purple-8"],
html:not([data-theme="dark"]) .main-content [class*="border-indigo-8"] { border-color: color-mix(in oklab, var(--geo-second) 34%, var(--geo-border)) !important; }
/* Ink. Named utilities, not [class*=...]: the substring form also matches
   group-hover:text-gray-300, which is how a text-gray-500 caption ended up
   wearing the secondary ink (23 Sep). A button or a painted element is left
   OUT - its own rule decides its ink. */
html:not([data-theme="dark"]) .main-content .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content .text-gray-50:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content .text-gray-100:not(button):not(a):not([class*="bg-"]) { color: var(--geo-text) !important; }
html:not([data-theme="dark"]) .main-content .text-gray-200:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content .text-gray-300:not(button):not(a):not([class*="bg-"]) { color: var(--geo-text2) !important; }
html:not([data-theme="dark"]) .main-content .text-gray-400:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content .text-gray-500:not(button):not(a):not([class*="bg-"]) { color: var(--geo-muted) !important; }
/* ...but ink sitting ON something painted follows that thing, or a label turns
   page-coloured on its own fill. White on a COLOURED block stays white (in light the
   accent's own ink is white too); inside a button or a link-button it follows the
   button, which may have become the silver or the outline shape. */
html:not([data-theme="dark"]) .main-content [class*="bg-"]:not([class*="bg-gray-"]):not([class*="bg-white"]):not([class*="bg-transparent"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]) { color: #fff !important; }
html:not([data-theme="dark"]) .main-content button [class*="text-gray-"],
html:not([data-theme="dark"]) .main-content button .text-white,
html:not([data-theme="dark"]) .main-content a[class*="bg-"] .text-white { color: inherit !important; }
/* Hovers that were written for a dark ground */
html:not([data-theme="dark"]) .main-content [class*="hover:bg-gray-7"]:hover,
html:not([data-theme="dark"]) .main-content [class*="hover:bg-gray-6"]:hover { background-color: var(--geo-surface2) !important; }
html:not([data-theme="dark"]) .main-content [class*="hover:text-white"]:hover { color: var(--geo-text) !important; }
html:not([data-theme="dark"]) .main-content [class*="hover:border-gray-4"]:hover { border-color: var(--geo-accent) !important; }
/* A select written for a dark card */
html:not([data-theme="dark"]) .main-content select[class*="bg-gray-7"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content select[class*="bg-gray-8"]:not([style*="width:"]){
  background-color: var(--geo-panel) !important;
  border-color: var(--geo-border2) !important;
  color: var(--geo-text) !important;
}
/* The sidebar's own bottom panel */
html:not([data-theme="dark"]) .sidebar .fixed.bottom-0 {
  background-color: var(--geo-panel) !important;
  border-color: var(--geo-border) !important;
}

/* The words on a tinted blue panel are page ink - written last so the
   "white stays white on a coloured fill" rule above cannot reach them. */
html:not([data-theme="dark"]) .main-content [class*="bg-blue-"]:not([class*="rounded-full"]):not([class*="w-"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-cyan-"]:not([class*="rounded-full"]):not([class*="w-"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="bg-sky-"]:not([class*="rounded-full"]):not([class*="w-"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]) {
  color: var(--geo-text) !important;
}

/* White ink on a TINT is white on a pale ground in light (measured 1.28:1 on a
   chip, 23 Sep). A tint is a state; its words are page ink. */
html:not([data-theme="dark"]) .main-content [class*="/10"].text-white,
html:not([data-theme="dark"]) .main-content [class*="/15"].text-white,
html:not([data-theme="dark"]) .main-content [class*="/20"].text-white,
html:not([data-theme="dark"]) .main-content [class*="/30"].text-white,
html:not([data-theme="dark"]) .main-content [class*="/10"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="/15"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="/20"] .text-white:not(button):not(a):not([class*="bg-"]),
html:not([data-theme="dark"]) .main-content [class*="/30"] .text-white:not(button):not(a):not([class*="bg-"]) {
  color: var(--geo-text) !important;
}

/* ══ LAST WORD: the ink on the one action ═════════════════════════════════════
   Written at the very end of the file because three later blocks were reaching it
   and putting the page's ink on the teal: "Write this for me" measured 2.39:1 in
   light. A filled action carries its own ink, and nothing after this can say
   otherwise.

   NAMED CLASSES, not [class*="bg-blue-5"]: that substring also matches bg-blue-50:not([style*="width:"]),
   and the dashboard's "Add Client" quick-action - a pale bg-blue-50 CARD with grey
   words inside - was turned into a solid teal block with grey ink on it, 1.50:1
   (found in the light sweep, 23 Sep). An exact class token also excludes the
   alpha forms (bg-green-600/20) on its own, because a class list is tokens. */
.main-content a.bg-green-500, .main-content button.bg-green-500,
.main-content a.bg-green-600, .main-content button.bg-green-600,
.main-content a.bg-green-700, .main-content button.bg-green-700,
.main-content a.bg-emerald-500, .main-content button.bg-emerald-500,
.main-content a.bg-emerald-600, .main-content button.bg-emerald-600,
.main-content a.bg-teal-500, .main-content button.bg-teal-500,
.main-content a.bg-teal-600, .main-content button.bg-teal-600,
.main-content a.bg-blue-500, .main-content button.bg-blue-500,
.main-content a.bg-blue-600, .main-content button.bg-blue-600,
.main-content a.bg-blue-700, .main-content button.bg-blue-700,
.main-content .ob-grad, .main-content .geo-btn-primary, .main-content .work-buy {
  background-color: var(--geo-accent) !important;
  background-image: none !important;
  border: 0 !important;
  color: var(--geo-accent-ink) !important;
}
.main-content a.bg-green-500 *, .main-content button.bg-green-500 *,
.main-content a.bg-green-600 *, .main-content button.bg-green-600 *,
.main-content a.bg-emerald-600 *, .main-content button.bg-emerald-600 *,
.main-content a.bg-teal-500 *, .main-content button.bg-teal-500 *,
.main-content a.bg-blue-500 *, .main-content button.bg-blue-500 *,
.main-content a.bg-blue-600 *, .main-content button.bg-blue-600 *,
.main-content a.bg-blue-700 *, .main-content button.bg-blue-700 *,
.main-content .ob-grad *, .main-content .geo-btn-primary *, .main-content .work-buy * {
  color: var(--geo-accent-ink) !important;
}

/* ══ "What this page is for" ══════════════════════════════════════════════════
   One strip at the top of a tool page, rendered by app/views/partials/tool_intro.php.
   Edward, 23 Sep: "so many good things but seems like users won't even know ... make
   sure it's easy to understand how to use". Open the first time, folded after, and
   remembered per person. Tokens only, so it is the same strip on every page. */
.geo-intro {
  margin: 0 0 16px; border: 1px solid var(--geo-border); border-radius: var(--geo-r-card);
  background: var(--geo-surface); overflow: hidden;
}
.geo-intro > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; gap: 10px;
  min-height: var(--geo-ctrl-h); padding: 12px 18px; color: var(--geo-text);
}
.geo-intro > summary::-webkit-details-marker { display: none; }
.geo-intro > summary::after {
  content: "\25be"; margin-left: auto; flex: 0 0 auto; color: var(--geo-muted); font-size: 12px;
  transition: transform var(--geo-dur) var(--geo-ease);
}
.geo-intro[open] > summary::after { transform: rotate(180deg); }
.geo-intro-title { font-size: 14px; font-weight: 600; }
.geo-intro-lede { font-size: 12.5px; color: var(--geo-muted); }
.geo-intro[open] .geo-intro-lede { display: none; }
.geo-intro-steps { list-style: none; margin: 0; padding: 0 18px 16px; display: grid; gap: 9px; }
.geo-intro-steps li { display: flex; gap: 11px; align-items: flex-start; font-size: 13.5px; color: var(--geo-text2); line-height: 1.58; }
.geo-intro-steps li > b:first-child {
  flex: 0 0 auto; width: 21px; height: 21px; margin-top: 1px; border-radius: 7px;
  display: inline-flex; align-items: center; justify-content: center;
  background: color-mix(in oklab, var(--geo-accent) 16%, var(--geo-bg));
  color: var(--geo-accent); font-size: 11px; font-weight: 700;
}
@media (max-width: 767px) {
  .geo-intro > summary { min-height: 44px; padding: 12px 14px; flex-wrap: wrap; }
  .geo-intro-steps { padding: 0 14px 14px; }
}

/* ══ A FLAT COLOURED SLAB IS NOT A STAT TILE ══════════════════════════════════
   The Leads page, 23 Sep: four tiles in four flat colours on one row - green,
   blue, grey, orange - with their labels almost lost in the fill ("Total Revenue"
   measured under 3:1 on its own green). Edward has said this twice, about the
   services marketplace and the celebration banner: a state is an EDGE and a chip,
   never a wash.

   So a painted BLOCK (not a button, not a small round mark, not a /10-/30 tint)
   takes the card surface, page ink, and its own colour as a left edge. The number
   inside keeps the colour, which is where it was doing useful work all along. */
html .main-content [class*="bg-green-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-green-6"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-emerald-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-emerald-6"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  background-image: none !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important;
  border-left: 3px solid var(--geo-good) !important;
}
html .main-content [class*="bg-orange-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-orange-6"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-amber-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-yellow-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  background-image: none !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important;
  border-left: 3px solid var(--geo-warn) !important;
}
html .main-content [class*="bg-red-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-red-6"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]),
html .main-content [class*="bg-rose-5"]:not([class*="rounded-full"]):not([class*="rounded-sm"]):not([class*="/"]):not(button):not(a):not([style*="width:"]){
  background-color: var(--geo-surface) !important;
  background-image: none !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important;
  border-left: 3px solid var(--geo-bad) !important;
}
/* Their words come with them - white ink on a card is not ink. */
html .main-content [class*="bg-green-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-green-6"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-emerald-6"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-orange-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-amber-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-red-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="bg-red-6"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]) {
  color: var(--geo-text) !important;
}
/* ...and their quieter labels, which were white at 80% on the fill. */
html .main-content [class*="bg-green-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) [class*="text-green-"],
html .main-content [class*="bg-green-6"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) [class*="text-green-"],
html .main-content [class*="bg-orange-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) [class*="text-orange-"],
html .main-content [class*="bg-red-5"]:not([class*="rounded-full"]):not([class*="/"]):not(button):not(a) [class*="text-red-"] {
  color: var(--geo-text2) !important;
}

/* ══ A GRADIENT SLAB IS STILL A SLAB ══════════════════════════════════════════
   The four Leads tiles are gradients (bg-gradient-to-br from-green-500 ...), so
   the rule above - which reads bg-<hue>- - never touched them. Same decision,
   keyed on the gradient's own class. */
html .main-content [class*="from-green-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-emerald-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-teal-"]:not([class*="rounded-full"]):not(button):not(a) {
  background-image: none !important; background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important; border-left: 3px solid var(--geo-good) !important;
}
html .main-content [class*="from-blue-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-sky-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-cyan-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-indigo-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-purple-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-violet-"]:not([class*="rounded-full"]):not(button):not(a) {
  background-image: none !important; background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important; border-left: 3px solid var(--geo-accent) !important;
}
html .main-content [class*="from-orange-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-amber-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-yellow-"]:not([class*="rounded-full"]):not(button):not(a) {
  background-image: none !important; background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important; border-left: 3px solid var(--geo-warn) !important;
}
html .main-content [class*="from-red-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-rose-"]:not([class*="rounded-full"]):not(button):not(a),
html .main-content [class*="from-pink-"]:not([class*="rounded-full"]):not(button):not(a) {
  background-image: none !important; background-color: var(--geo-surface) !important;
  color: var(--geo-text) !important;
  border: 1px solid var(--geo-border) !important; border-left: 3px solid var(--geo-bad) !important;
}
/* The words on a slab that is now a card. A label written as text-<hue>-100 was
   picked to sit on a saturated fill; on the card it is the quiet ink. */
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) .text-white:not(button):not(a):not([class*="bg-"]),
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-green-1"],
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-blue-1"],
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-orange-1"],
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-red-1"],
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-purple-1"],
html .main-content [class*="from-"]:not([class*="rounded-full"]):not(button):not(a) [class*="text-indigo-1"] {
  color: var(--geo-text2) !important;
}

/* ══ THE LOGO IN LIGHT MODE ═══════════════════════════════════════════════════
   There is one logo file and it is white (public/images/geophiiwhite.png), so on a
   light sidebar the wordmark disappeared and only the mark showed - Edward, 23 Sep:
   "in light mode check the logo too". Until there is a dark version of the artwork
   it sits on a dark plate, which is how a white lockup is normally used on light. */
html:not([data-theme="dark"]) .sidebar img[src*="geophii"],
html:not([data-theme="dark"]) #mobile-header img[src*="geophii"],
html:not([data-theme="dark"]) #geo-brandrow img[src*="geophii"] {
  background-color: var(--geo-text);
  padding: 7px 11px;
  border-radius: var(--geo-r-ctrl);
  box-sizing: content-box;
}

/* ══ CONVERSION TAB ═══════════════════════════════════════════════════════════
   UX_WIN_PLAN item 4. Tokens only, both themes. Worst finding first, because the
   point of the page is what to change - a wall of green is not a report. */
.cv { max-width: 920px; font-family: var(--geo-font); color: var(--geo-text); }
.cv-eyebrow { margin: 0 0 4px; font-size: 11px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; color: var(--geo-accent); }
.cv-head h2 { margin: 0 0 8px; font-size: 22px; font-weight: 700; line-height: 1.22; letter-spacing: -.01em; text-wrap: balance; }
.cv-lede { margin: 0; color: var(--geo-text2); font-size: 14.5px; line-height: 1.62; max-width: 62ch; }

.cv-form { margin: 22px 0 0; padding: 18px; border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cv-form label { display: block; font-size: 13px; font-weight: 600; margin-bottom: 7px; }
.cv-row { display: flex; gap: 10px; flex-wrap: wrap; }
.cv-row input {
  flex: 1 1 320px; min-width: 0; min-height: var(--geo-ctrl-h); padding: 10px 13px;
  font: inherit; font-size: 15px; color: var(--geo-text); background: var(--geo-panel);
  border: 1px solid var(--geo-border2); border-radius: var(--geo-r-ctrl);
}
.cv-row input:focus { outline: 0; border-color: var(--geo-accent); box-shadow: 0 0 0 3px color-mix(in oklab, var(--geo-accent) 22%, transparent); }
.cv-go {
  min-height: var(--geo-ctrl-h); padding: 0 20px; border: 0; border-radius: var(--geo-r-ctrl);
  background: var(--geo-accent); color: var(--geo-accent-ink); font: inherit; font-weight: 600; cursor: pointer;
  box-shadow: 0 10px 24px -14px color-mix(in oklab, var(--geo-accent) 85%, transparent);
}
.cv-go:disabled { opacity: .6; cursor: progress; box-shadow: none; }
.cv-hint { margin: 10px 0 0; font-size: 12.5px; color: var(--geo-muted); line-height: 1.55; }

.cv-out { margin-top: 20px; display: grid; gap: 12px; }
.cv-wait { margin: 0; color: var(--geo-muted); font-size: 14px; }
.cv-note { margin: 0; padding: 12px 16px; border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border); border-left: 3px solid var(--geo-warn); background: var(--geo-surface); font-size: 13px; color: var(--geo-text2); }
.cv-error { padding: 16px 18px; border: 1px solid color-mix(in oklab, var(--geo-bad) 40%, var(--geo-border)); border-left: 3px solid var(--geo-bad); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cv-error p { margin: 0; font-size: 14px; }
.cv-quiet { margin-top: 6px !important; color: var(--geo-muted); font-size: 12.5px; }

.cv-score { display: flex; align-items: center; gap: 20px; padding: 20px 22px; border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cv-ring {
  flex: 0 0 auto; width: 88px; height: 88px; border-radius: 50%;
  display: inline-flex; align-items: baseline; justify-content: center; gap: 1px; padding-top: 28px;
  background: color-mix(in oklab, var(--geo-accent) 14%, var(--geo-bg));
  border: 2px solid color-mix(in oklab, var(--geo-accent) 45%, transparent);
}
.cv-num { font-size: 30px; font-weight: 700; line-height: 1; color: var(--geo-accent); }
.cv-pct { font-size: 12px; color: var(--geo-muted); }
.cv-band { margin: 0; font-size: 18px; font-weight: 700; }
.cv-url { margin: 4px 0 0; font-size: 12.5px; color: var(--geo-muted); overflow-wrap: anywhere; }
.cv-tally { margin: 8px 0 0; font-size: 13px; color: var(--geo-text2); }
.cv-band-losing-people .cv-ring, .cv-band-leaking .cv-ring {
  background: color-mix(in oklab, var(--geo-bad) 14%, var(--geo-bg));
  border-color: color-mix(in oklab, var(--geo-bad) 45%, transparent);
}
.cv-band-losing-people .cv-num, .cv-band-leaking .cv-num { color: var(--geo-bad); }

.cv-card { padding: 16px 18px; border: 1px solid var(--geo-border); border-left: 3px solid var(--geo-border2); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cv-card.cv-good { border-left-color: var(--geo-good); }
.cv-card.cv-warn { border-left-color: var(--geo-warn); }
.cv-card.cv-bad  { border-left-color: var(--geo-bad); }
.cv-card-head { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.cv-card-head h3 { margin: 0; font-size: 15px; font-weight: 650; }
.cv-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; background: var(--geo-border2); }
.cv-good .cv-dot { background: var(--geo-good); }
.cv-warn .cv-dot { background: var(--geo-warn); }
.cv-bad .cv-dot  { background: var(--geo-bad); }
.cv-state { margin-left: auto; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; padding: 3px 9px; border-radius: 999px; }
.cv-good .cv-state { background: color-mix(in oklab, var(--geo-good) 16%, var(--geo-bg)); color: var(--geo-good-ink); }
.cv-warn .cv-state { background: color-mix(in oklab, var(--geo-warn) 16%, var(--geo-bg)); color: var(--geo-warn-ink); }
.cv-bad .cv-state  { background: color-mix(in oklab, var(--geo-bad) 16%, var(--geo-bg));  color: var(--geo-bad-ink); }
.cv-found { margin: 9px 0 0; font-size: 14px; color: var(--geo-text); line-height: 1.6; overflow-wrap: anywhere; }
.cv-why { margin: 5px 0 0; font-size: 13.5px; color: var(--geo-text2); line-height: 1.6; }
.cv-act { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--geo-border); display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; }
.cv-do { margin: 0; flex: 1 1 260px; font-size: 13.5px; color: var(--geo-text); line-height: 1.55; }
.cv-btn {
  flex: 0 0 auto; display: inline-flex; align-items: center; min-height: var(--geo-ctrl-h); padding: 0 16px;
  border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border2); background: var(--geo-surface);
  color: var(--geo-text); font-size: 13.5px; font-weight: 600; text-decoration: none;
}
.cv-btn:hover { border-color: var(--geo-accent); }
@media (max-width: 767px) {
  .cv-row input, .cv-go, .cv-btn { min-height: 44px; width: 100%; }
  .cv-score { flex-direction: column; align-items: flex-start; gap: 14px; }
}

/* ══ FULL SITE AUDIT (UX_WIN_PLAN item 3) ═════════════════════════════════════
   Lives inside the Technical tab. Same shapes as the Conversion cards, because
   they answer the same kind of question and a person should not have to learn a
   second layout. */
.cw-crawl { margin-top: 26px; padding-top: 22px; border-top: 1px solid var(--geo-border); font-family: var(--geo-font); }
.cr-head h3 { margin: 0 0 4px; font-size: 17px; font-weight: 700; color: var(--geo-text); }
.cr-head p { margin: 0 0 14px; font-size: 13.5px; color: var(--geo-text2); }
.cr-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cr-row label { font-size: 13px; font-weight: 600; color: var(--geo-text2); }
.cr-row select {
  min-height: var(--geo-ctrl-h); padding: 0 12px; font: inherit; font-size: 14px;
  color: var(--geo-text); background: var(--geo-panel);
  border: 1px solid var(--geo-border2); border-radius: var(--geo-r-ctrl);
}
.cr-go {
  min-height: var(--geo-ctrl-h); padding: 0 20px; border: 0; border-radius: var(--geo-r-ctrl);
  background: var(--geo-accent); color: var(--geo-accent-ink); font: inherit; font-weight: 600; cursor: pointer;
}
.cr-go:disabled { opacity: .6; cursor: progress; }
.cr-out { margin-top: 16px; display: grid; gap: 10px; }
.cr-wait, .cr-read { margin: 0; font-size: 13.5px; color: var(--geo-muted); }
.cr-clean { margin: 6px 0 0; font-size: 14px; font-weight: 600; color: var(--geo-good); }
.cr-note { margin: 0; padding: 11px 15px; border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border); border-left: 3px solid var(--geo-warn); background: var(--geo-surface); font-size: 13px; color: var(--geo-text2); }
.cr-error { padding: 15px 17px; border: 1px solid color-mix(in oklab, var(--geo-bad) 40%, var(--geo-border)); border-left: 3px solid var(--geo-bad); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cr-error p { margin: 0; font-size: 14px; color: var(--geo-text); }
.cr-card { padding: 15px 17px; border: 1px solid var(--geo-border); border-left: 3px solid var(--geo-border2); border-radius: var(--geo-r-card); background: var(--geo-surface); }
.cr-card.cr-bad { border-left-color: var(--geo-bad); }
.cr-card.cr-warn { border-left-color: var(--geo-warn); }
.cr-card-head { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.cr-card-head h4 { margin: 0; font-size: 15px; font-weight: 650; color: var(--geo-text); }
.cr-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; background: var(--geo-border2); }
.cr-bad .cr-dot { background: var(--geo-bad); }
.cr-warn .cr-dot { background: var(--geo-warn); }
.cr-count { margin-left: auto; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; padding: 3px 9px; border-radius: 999px; background: var(--geo-surface2); color: var(--geo-text2); }
.cr-bad .cr-count { background: color-mix(in oklab, var(--geo-bad) 16%, var(--geo-bg)); color: var(--geo-bad-ink); }
.cr-warn .cr-count { background: color-mix(in oklab, var(--geo-warn) 16%, var(--geo-bg)); color: var(--geo-warn-ink); }
.cr-why { margin: 8px 0 0; font-size: 13.5px; color: var(--geo-text2); line-height: 1.6; }
.cr-which { margin-top: 10px; }
.cr-which > summary { cursor: pointer; font-size: 12.5px; color: var(--geo-second); min-height: 28px; display: flex; align-items: center; }
.cr-which ul { margin: 6px 0 0; padding-left: 18px; display: grid; gap: 3px; }
.cr-which li { font-size: 12.5px; color: var(--geo-muted); overflow-wrap: anywhere; }
.cr-which a { color: var(--geo-second); }
.cr-more { color: var(--geo-muted); }
.cr-act { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--geo-border); display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; }
.cr-do { margin: 0; flex: 1 1 240px; font-size: 13.5px; color: var(--geo-text); line-height: 1.55; }
.cr-btn {
  flex: 0 0 auto; display: inline-flex; align-items: center; min-height: var(--geo-ctrl-h); padding: 0 16px;
  border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border2); background: var(--geo-surface);
  color: var(--geo-text); font-size: 13.5px; font-weight: 600; text-decoration: none;
}
.cr-btn:hover { border-color: var(--geo-accent); }
@media (max-width: 767px) {
  .cr-row select, .cr-go, .cr-btn { min-height: 44px; }
  .cr-go, .cr-btn { width: 100%; }
}
/* The specifics on a crawl card: what to paste, how long, where to read more. */
.cr-snip { margin-top: 11px; border: 1px solid var(--geo-border); border-radius: var(--geo-r-ctrl); background: var(--geo-panel); overflow: hidden; }
.cr-snip-bar { display: flex; align-items: center; gap: 10px; padding: 7px 12px; border-bottom: 1px solid var(--geo-border); }
.cr-snip-label { font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--geo-muted); }
.cr-copy {
  margin-left: auto; min-height: 30px; padding: 0 12px; font: inherit; font-size: 12.5px; font-weight: 600;
  border: 1px solid var(--geo-border2); border-radius: 999px; background: transparent; color: var(--geo-text); cursor: pointer;
}
.cr-copy:hover { border-color: var(--geo-accent); }
.cr-copy.is-said { color: var(--geo-good); border-color: var(--geo-good); }
.cr-snip pre {
  margin: 0; padding: 12px 14px; overflow-x: auto; white-space: pre;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 12.5px;
  line-height: 1.6; color: var(--geo-text2); background: var(--geo-panel);
}
.cr-meta { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin: 10px 0 0; font-size: 12.5px; color: var(--geo-muted); }
.cr-effort::before { content: "\23F1  "; }
.cr-docs { color: var(--geo-second); text-decoration: none; }
.cr-docs:hover { text-decoration: underline; }
@media (max-width: 767px) { .cr-copy { min-height: 36px; } }
/* How much of the site this covers. A sample that does not say it is a sample gets
   read as the whole site. */
.cr-partial { margin: 8px 0 0; padding: 11px 15px; border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border); border-left: 3px solid var(--geo-warn); background: var(--geo-surface); font-size: 13.5px; color: var(--geo-text2); line-height: 1.6; }
.cr-partial strong { color: var(--geo-text); }
/* A closed <details> needs something to say it opens. The marker was removed and
   nothing put back, so "Which pages" read as an empty heading (23 Sep). */
.cr-which > summary { list-style: none; }
.cr-which > summary::-webkit-details-marker { display: none; }
.cr-which > summary::before { content: "\25b8"; display: inline-block; margin-right: 7px; transition: transform var(--geo-dur) var(--geo-ease); }
.cr-which[open] > summary::before { transform: rotate(90deg); }

/* ══ YOUR SCORE AGAINST THE INDUSTRY ══════════════════════════════════════════
   Was a Tailwind blue fill on a near-black track with a yellow line. Edward,
   23 Sep: "should be our teal". The fill is the accent; the average is an amber
   line, which stays visible on top of the fill; the label sits on its own plate
   so it reads over either side. */
.geo-vs {
  position: relative; height: 34px; border-radius: var(--geo-r-ctrl); overflow: hidden;
  background: var(--geo-surface2); border: 1px solid var(--geo-border);
}
.geo-vs-you {
  position: absolute; left: 0; top: 0; height: 100%;
  background: color-mix(in oklab, var(--geo-accent) 38%, var(--geo-surface2));
  border-right: 2px solid var(--geo-accent);
}
.geo-vs-mark {
  position: absolute; top: 0; height: 100%; width: 0;
  border-left: 2px dashed var(--geo-warn);
}
.geo-vs-label {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  padding: 3px 12px; border-radius: 999px; white-space: nowrap;
  background: var(--geo-surface); border: 1px solid var(--geo-border);
  font-size: 12px; font-weight: 600; color: var(--geo-text);
}

/* ══ HOW MUCH OF THE SITE WAS SCANNED ═════════════════════════════════════════
   Above the Action Plan. Edward, 23 Sep: "we need to easy show 10 out of 200
   pages scanned, then the button scan and fix the rest". */
.ta-pages {
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  margin: 0 0 18px; padding: 14px 18px;
  border: 1px solid var(--geo-border); border-radius: var(--geo-r-card);
  background: var(--geo-surface);
}
.ta-pages-count { margin: 0; font-size: 14px; color: var(--geo-text2); white-space: nowrap; }
.ta-pages-count strong { color: var(--geo-text); font-weight: 700; }
.ta-pages-bar { flex: 1 1 140px; min-width: 100px; height: 6px; border-radius: 999px; background: var(--geo-surface2); overflow: hidden; }
.ta-pages-bar i { display: block; height: 6px; border-radius: 999px; background: var(--geo-accent); }
.ta-pages-do { display: flex; gap: 10px; flex-wrap: wrap; margin-left: auto; }
.ta-rest, .ta-download {
  min-height: var(--geo-ctrl-h); padding: 0 16px; border-radius: var(--geo-r-ctrl);
  font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; white-space: nowrap;
}
.ta-rest { border: 0; background: var(--geo-accent); color: var(--geo-accent-ink); }
.ta-rest:disabled { opacity: .5; cursor: not-allowed; }
.ta-download { border: 1px solid var(--geo-border2); background: var(--geo-surface); color: var(--geo-text); }
.ta-download:hover { border-color: var(--geo-accent); }
@media (max-width: 767px) {
  .ta-pages-do { margin-left: 0; width: 100%; }
  .ta-rest, .ta-download { min-height: 44px; flex: 1 1 100%; }
}
/* Add to tasks, on a fix in the Action Plan. */
.ta-task {
  min-height: 34px; padding: 0 14px; font: inherit; font-size: 13px; font-weight: 600;
  border: 1px solid var(--geo-border2); border-radius: var(--geo-r-ctrl);
  background: transparent; color: var(--geo-text); cursor: pointer;
}
.ta-task:hover { border-color: var(--geo-accent); }
.ta-task:disabled { opacity: .6; cursor: progress; }
.ta-task.is-said { color: var(--geo-good); border-color: var(--geo-good); cursor: default; }
.ta-task-see { margin-left: 12px; font-size: 13px; color: var(--geo-second); text-decoration: none; }
.ta-task-see:hover { text-decoration: underline; }
@media (max-width: 767px) { .ta-task { min-height: 44px; width: 100%; } }

/* Shown only when a tick could not be saved on the server. The tick still works on
   this device, so this warns rather than alarms - it is not a lost fix. */
.ta-save-warn {
  margin-top: 8px; font-size: 13px; line-height: 1.5;
  color: var(--geo-warn-ink);
  background: color-mix(in oklab, var(--geo-warn) 16%, var(--geo-bg));
  border-radius: var(--geo-r-ctrl); padding: 8px 12px;
}

/* ══ A METER FILL KEEPS ITS MEANING ══════════════════════════════════════
   A bar whose width is a percentage is DATA, not decoration. Every other rule in this
   file is about surfaces, edges and ink, and several of them reasonably flatten a
   coloured block to the card surface - which, applied to a bar, paints the filled part
   the same colour as the page and makes 8/10 look like 2/10 (found 23 Sep on Checks
   Passing, then on three more bars by the sweep's new check).

   So a meter is described here once, for the whole app: an element whose width is set
   inline, carrying a colour class, and not a button or a link. 47 bars across the views
   at last count, in 17 colour spellings - naming each one where it sits would be 47
   patches waiting to rot. The colour keeps its MEANING rather than its hex, which is
   what the palette is for.

   This sits at the end of the file on purpose: it is the last word on a bar. */
/* it went well */
.main-content [style*="width:"].bg-green-300:not(button):not(a),
.main-content [style*="width:"].bg-green-400:not(button):not(a),
.main-content [style*="width:"].bg-green-500:not(button):not(a),
.main-content [style*="width:"].bg-green-600:not(button):not(a),
.main-content [style*="width:"].bg-green-700:not(button):not(a),
.main-content [style*="width:"].bg-emerald-300:not(button):not(a),
.main-content [style*="width:"].bg-emerald-400:not(button):not(a),
.main-content [style*="width:"].bg-emerald-500:not(button):not(a),
.main-content [style*="width:"].bg-emerald-600:not(button):not(a),
.main-content [style*="width:"].bg-emerald-700:not(button):not(a),
.main-content [style*="width:"].bg-teal-300:not(button):not(a),
.main-content [style*="width:"].bg-teal-400:not(button):not(a),
.main-content [style*="width:"].bg-teal-500:not(button):not(a),
.main-content [style*="width:"].bg-teal-600:not(button):not(a),
.main-content [style*="width:"].bg-teal-700:not(button):not(a) {
  background-color: var(--geo-good) !important;
  background-image: none !important;
}
/* it went badly */
.main-content [style*="width:"].bg-red-300:not(button):not(a),
.main-content [style*="width:"].bg-red-400:not(button):not(a),
.main-content [style*="width:"].bg-red-500:not(button):not(a),
.main-content [style*="width:"].bg-red-600:not(button):not(a),
.main-content [style*="width:"].bg-red-700:not(button):not(a),
.main-content [style*="width:"].bg-rose-300:not(button):not(a),
.main-content [style*="width:"].bg-rose-400:not(button):not(a),
.main-content [style*="width:"].bg-rose-500:not(button):not(a),
.main-content [style*="width:"].bg-rose-600:not(button):not(a),
.main-content [style*="width:"].bg-rose-700:not(button):not(a) {
  background-color: var(--geo-bad) !important;
  background-image: none !important;
}
/* it needs attention */
.main-content [style*="width:"].bg-amber-300:not(button):not(a),
.main-content [style*="width:"].bg-amber-400:not(button):not(a),
.main-content [style*="width:"].bg-amber-500:not(button):not(a),
.main-content [style*="width:"].bg-amber-600:not(button):not(a),
.main-content [style*="width:"].bg-amber-700:not(button):not(a),
.main-content [style*="width:"].bg-yellow-300:not(button):not(a),
.main-content [style*="width:"].bg-yellow-400:not(button):not(a),
.main-content [style*="width:"].bg-yellow-500:not(button):not(a),
.main-content [style*="width:"].bg-yellow-600:not(button):not(a),
.main-content [style*="width:"].bg-yellow-700:not(button):not(a),
.main-content [style*="width:"].bg-orange-300:not(button):not(a),
.main-content [style*="width:"].bg-orange-400:not(button):not(a),
.main-content [style*="width:"].bg-orange-500:not(button):not(a),
.main-content [style*="width:"].bg-orange-600:not(button):not(a),
.main-content [style*="width:"].bg-orange-700:not(button):not(a) {
  background-color: var(--geo-warn) !important;
  background-image: none !important;
}
/* the plain measure */
.main-content [style*="width:"].bg-blue-300:not(button):not(a),
.main-content [style*="width:"].bg-blue-400:not(button):not(a),
.main-content [style*="width:"].bg-blue-500:not(button):not(a),
.main-content [style*="width:"].bg-blue-600:not(button):not(a),
.main-content [style*="width:"].bg-blue-700:not(button):not(a),
.main-content [style*="width:"].bg-cyan-300:not(button):not(a),
.main-content [style*="width:"].bg-cyan-400:not(button):not(a),
.main-content [style*="width:"].bg-cyan-500:not(button):not(a),
.main-content [style*="width:"].bg-cyan-600:not(button):not(a),
.main-content [style*="width:"].bg-cyan-700:not(button):not(a),
.main-content [style*="width:"].bg-sky-300:not(button):not(a),
.main-content [style*="width:"].bg-sky-400:not(button):not(a),
.main-content [style*="width:"].bg-sky-500:not(button):not(a),
.main-content [style*="width:"].bg-sky-600:not(button):not(a),
.main-content [style*="width:"].bg-sky-700:not(button):not(a) {
  background-color: var(--geo-accent) !important;
  background-image: none !important;
}
/* the second series */
.main-content [style*="width:"].bg-purple-300:not(button):not(a),
.main-content [style*="width:"].bg-purple-400:not(button):not(a),
.main-content [style*="width:"].bg-purple-500:not(button):not(a),
.main-content [style*="width:"].bg-purple-600:not(button):not(a),
.main-content [style*="width:"].bg-purple-700:not(button):not(a),
.main-content [style*="width:"].bg-indigo-300:not(button):not(a),
.main-content [style*="width:"].bg-indigo-400:not(button):not(a),
.main-content [style*="width:"].bg-indigo-500:not(button):not(a),
.main-content [style*="width:"].bg-indigo-600:not(button):not(a),
.main-content [style*="width:"].bg-indigo-700:not(button):not(a),
.main-content [style*="width:"].bg-violet-300:not(button):not(a),
.main-content [style*="width:"].bg-violet-400:not(button):not(a),
.main-content [style*="width:"].bg-violet-500:not(button):not(a),
.main-content [style*="width:"].bg-violet-600:not(button):not(a),
.main-content [style*="width:"].bg-violet-700:not(button):not(a) {
  background-color: var(--geo-second) !important;
  background-image: none !important;
}
/* nothing yet */
.main-content [style*="width:"].bg-gray-300:not(button):not(a),
.main-content [style*="width:"].bg-gray-400:not(button):not(a),
.main-content [style*="width:"].bg-gray-500:not(button):not(a),
.main-content [style*="width:"].bg-gray-600:not(button):not(a),
.main-content [style*="width:"].bg-gray-700:not(button):not(a),
.main-content [style*="width:"].bg-grey-300:not(button):not(a),
.main-content [style*="width:"].bg-grey-400:not(button):not(a),
.main-content [style*="width:"].bg-grey-500:not(button):not(a),
.main-content [style*="width:"].bg-grey-600:not(button):not(a),
.main-content [style*="width:"].bg-grey-700:not(button):not(a),
.main-content [style*="width:"].bg-slate-300:not(button):not(a),
.main-content [style*="width:"].bg-slate-400:not(button):not(a),
.main-content [style*="width:"].bg-slate-500:not(button):not(a),
.main-content [style*="width:"].bg-slate-600:not(button):not(a),
.main-content [style*="width:"].bg-slate-700:not(button):not(a),
.main-content [style*="width:"].bg-zinc-300:not(button):not(a),
.main-content [style*="width:"].bg-zinc-400:not(button):not(a),
.main-content [style*="width:"].bg-zinc-500:not(button):not(a),
.main-content [style*="width:"].bg-zinc-600:not(button):not(a),
.main-content [style*="width:"].bg-zinc-700:not(button):not(a),
.main-content [style*="width:"].bg-neutral-300:not(button):not(a),
.main-content [style*="width:"].bg-neutral-400:not(button):not(a),
.main-content [style*="width:"].bg-neutral-500:not(button):not(a),
.main-content [style*="width:"].bg-neutral-600:not(button):not(a),
.main-content [style*="width:"].bg-neutral-700:not(button):not(a) {
  background-color: var(--geo-muted) !important;
  background-image: none !important;
}

/* A chart box with nothing in it. Written by geoChartEmpty / geoChartFailed in
   geo-2026.js - see the note there for why a blank box was the bug. */
.geo-chart-note {
  display: flex; align-items: center; justify-content: center;
  height: 100%; margin: 0; padding: 0 16px;
  text-align: center; font-size: 14px; line-height: 1.5;
  color: var(--geo-muted);
}
.geo-chart-note[data-tone="warn"] { color: var(--geo-warn-ink); }


/* ── "I paint myself" ─────────────────────────────────────────────────────────
   The blanket button rules above turn any button that has not claimed a colour into a
   plain surface button, with !important. Their exclusion lists had become a record of
   everything ever caught by them - a patch list with a selector around it - and the
   Content board's filter chip was next: in light mode the selected chip was forced
   white while its count kept the ink meant for teal, so "19" was white on white.

   A component that paints itself now says so once, here, by carrying .geo-own-colour.
   Nothing about the blanket rules changes for anything that does not. */

/* ══ CONTENT BOARD ════════════════════════════════════════════════════════════
   /content — everything written for an agency's clients.

   Rewritten 23 Sep 2026. The old page let each row size itself, so the right edge
   zigzagged down the screen and no two rows lined up; two row shapes were mixed in one
   list; and about 40% of the width was empty. One row shape here, full width, and the
   only thing that moves between rows is the words.

   Built at 390 first, because that is where nearly everybody is. */
.cb-wrap { max-width: 1100px; margin: 0 auto; padding: 24px 16px 64px; }

.cb-head h1 { font-size: 28px; font-weight: 700; color: var(--geo-text); margin: 0; letter-spacing: -.01em; }
.cb-head p  { margin: 6px 0 0; font-size: 15px; line-height: 1.55; color: var(--geo-text2); max-width: 62ch; }

/* ── Nothing here yet ─────────────────────────────────────────────────────── */
.cb-none {
  margin-top: 24px; padding: 48px 24px; text-align: center;
  background: var(--geo-surface); border: 1px solid var(--geo-border);
  border-radius: var(--geo-r-card);
}
.cb-none-t { font-size: 17px; font-weight: 600; color: var(--geo-text); margin: 0 0 8px; }
.cb-none p:last-child { margin: 0 auto; max-width: 46ch; color: var(--geo-muted); font-size: 14px; line-height: 1.6; }

/* ── The filter along the top ─────────────────────────────────────────────── */
.cb-filters { display: flex; flex-wrap: wrap; gap: 8px; margin: 24px 0 4px; }
.cb-chip {
  display: inline-flex; align-items: center; gap: 8px;
  min-height: var(--geo-ctrl-h); padding: 0 14px;
  font: inherit; font-size: 14px; font-weight: 500;
  color: var(--geo-text2); background: var(--geo-surface);
  border: 1px solid var(--geo-border); border-radius: 999px;
  cursor: pointer; transition: border-color var(--geo-dur) var(--geo-ease), color var(--geo-dur) var(--geo-ease);
}
.cb-chip i { font-style: normal; font-variant-numeric: tabular-nums; color: var(--geo-muted); font-size: 13px; }
.cb-chip:hover { border-color: var(--geo-border2); color: var(--geo-text); }
.cb-chip.is-on {
  color: var(--geo-accent-ink); background: var(--geo-accent); border-color: var(--geo-accent); font-weight: 600;
}
.cb-chip.is-on i { color: var(--geo-accent-ink); opacity: .75; }
.cb-scope { margin: 8px 0 0; font-size: 13px; color: var(--geo-muted); }

/* ── One client ───────────────────────────────────────────────────────────── */
.cb-group { margin-top: 28px; }
.cb-group-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 8px; }
.cb-group-head h2 {
  margin: 0; font-size: 13px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--geo-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cb-group-head a { font-size: 13px; color: var(--geo-accent); text-decoration: none; white-space: nowrap; }
.cb-group-head a:hover { text-decoration: underline; }

.cb-list {
  background: var(--geo-surface); border: 1px solid var(--geo-border);
  border-radius: var(--geo-r-card); overflow: hidden;
}

/* ── One row. Every row is this shape ─────────────────────────────────────── */
.cb-row {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 16px;
  width: 100%; padding: 14px 16px; text-decoration: none;
  border-top: 1px solid var(--geo-border);
  transition: background var(--geo-dur) var(--geo-ease);
}
.cb-row:first-child { border-top: 0; }
a.cb-row:hover { background: var(--geo-surface2); }
a.cb-row:hover .cb-row-go { color: var(--geo-accent); }
.cb-row.is-shut { cursor: default; }
.cb-row-main { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.cb-row-title { font-size: 15px; font-weight: 600; line-height: 1.4; color: var(--geo-text); }
.cb-row.is-shut .cb-row-title { color: var(--geo-text2); font-weight: 500; }
.cb-row-meta { font-size: 13px; color: var(--geo-muted); }
.cb-row-missing { font-size: 13px; color: var(--geo-warn-ink); }
.cb-row-right { display: flex; align-items: center; gap: 12px; flex-shrink: 0; }
.cb-row-go { font-size: 13px; color: var(--geo-muted); white-space: nowrap; }

/* ── The state, as a tinted pill ──────────────────────────────────────────── */
.cb-pill {
  display: inline-flex; align-items: center; white-space: nowrap;
  padding: 3px 10px; border-radius: 999px;
  font-size: 12px; font-weight: 600; line-height: 1.5;
}
.cb-pill[data-tone="go"]    { color: var(--geo-accent); background: color-mix(in oklab, var(--geo-accent) 15%, var(--geo-bg)); }
.cb-pill[data-tone="good"]  { color: var(--geo-good-ink); background: color-mix(in oklab, var(--geo-good) 15%, var(--geo-bg)); }
.cb-pill[data-tone="warn"]  { color: var(--geo-warn-ink); background: color-mix(in oklab, var(--geo-warn) 15%, var(--geo-bg)); }
.cb-pill[data-tone="busy"]  { color: var(--geo-second); background: color-mix(in oklab, var(--geo-second) 15%, var(--geo-bg)); }
.cb-pill[data-tone="quiet"] { color: var(--geo-muted); background: var(--geo-surface2); }

.cb-empty-filter { margin: 24px 0 0; text-align: center; color: var(--geo-muted); font-size: 14px; }

.cb-pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 28px; }
.cb-pager a { font-size: 14px; color: var(--geo-text2); text-decoration: none; padding: 8px 4px; }
.cb-pager a:hover { color: var(--geo-accent); }
.cb-pager-at { font-size: 13px; color: var(--geo-muted); }

/* ── On a phone the pill and the date go under the title, not beside it ───── */
@media (max-width: 640px) {
  .cb-wrap { padding: 20px 16px 56px; }
  .cb-head h1 { font-size: 24px; }
  .cb-row { flex-direction: column; align-items: stretch; gap: 8px; padding: 14px 16px; }
  .cb-row-right { justify-content: space-between; flex-wrap: wrap; gap: 6px 12px; flex-shrink: 1; min-width: 0; }
  .cb-row-go, .cb-row-again { white-space: normal; }
  .cb-chip { min-height: 40px; }
  .cb-group-head { flex-wrap: wrap; }
}

/* On a wide screen the title can run long without pushing the pill off the row. */
@media (min-width: 641px) {
  .cb-row-main { flex: 1 1 auto; }
  .cb-row-title { overflow-wrap: anywhere; }
  .cb-row-right { min-width: 190px; justify-content: flex-end; }
}
/* A row that went wrong still leads somewhere. */
.cb-row-again { font-size: 13px; color: var(--geo-accent); text-decoration: none; white-space: nowrap; }
.cb-row-again:hover { text-decoration: underline; }

/* ══ SEARCH AND "SHOW MORE" FOR A CARD LIST ══════════════════════════════════
   Written by geo-cards.js. /clients rendered 104 client cards on a phone with no
   search and no paging - 24,172 pixels, about 29 screens. */
.gc-bar { margin-bottom: 12px; }
.gc-search {
  width: 100%; min-height: 44px; padding: 0 14px;
  font: inherit; font-size: 16px;                 /* 16px or a phone zooms on focus */
  color: var(--geo-text); background: var(--geo-surface);
  border: 1px solid var(--geo-border); border-radius: var(--geo-r-ctrl);
}
.gc-search::placeholder { color: var(--geo-muted); }
.gc-search:focus { outline: none; border-color: var(--geo-accent); }
.gc-count { margin: 8px 0 0; font-size: 13px; color: var(--geo-muted); }
.gc-more {
  display: block; width: 100%; min-height: 44px; margin-top: 12px;
  font: inherit; font-size: 14px; font-weight: 600;
  color: var(--geo-text); background: var(--geo-surface);
  border: 1px solid var(--geo-border2); border-radius: var(--geo-r-ctrl);
  cursor: pointer;
}
.gc-more:hover { border-color: var(--geo-accent); color: var(--geo-accent); }

/* The line under "Scan the next 25 pages" - what it will do, and what happened after. */
.ta-pages-note {
  margin: 8px 0 0; font-size: 13px; line-height: 1.5; color: var(--geo-muted);
  max-width: 62ch;
}

/* The way out of a finding: "We can do this for you", beside "Add to tasks".
   Same metrics as .ta-task so the two read as one row of choices - but this one is
   the TEAL filled button, because it is the one action on the card and Add to tasks
   is the quieter alternative. Quote is quieter still: it is what we say when nothing
   the agency offers fits yet. */
.ta-fixer {
  display: inline-flex; align-items: center; min-height: 34px; padding: 0 14px;
  font: inherit; font-size: 13px; font-weight: 600; text-decoration: none;
  border: 1px solid var(--geo-accent); border-radius: var(--geo-r-ctrl);
  background: var(--geo-accent); color: var(--geo-accent-ink);
}
.ta-fixer:hover { filter: brightness(1.08); }
.ta-fixer:focus-visible { outline: 2px solid var(--geo-accent); outline-offset: 2px; }
.ta-fixer-quote { background: transparent; color: var(--geo-accent); }
.ta-fixer-quote:hover { filter: none; background: rgba(20, 184, 166, .12); }
@media (max-width: 767px) { .ta-fixer { min-height: 44px; width: 100%; justify-content: center; } }

/* ── Roast my site: the paid opinion, under the free check ─────────────────
   Teal is the one action, so the button wears it and nothing else here does. The points
   are tinted by the route, matching the three doors used everywhere else. */
.cv-roast-offer { margin-top: 18px; padding: 18px; border: 1px dashed var(--geo-border2);
  border-radius: var(--geo-r-card); text-align: center; }
.cv-roast-lede { margin: 0 0 12px; font-size: 15px; color: var(--geo-text); }

/* ── What is this page for ────────────────────────────────────────────────────
   The offer box is centred, and a list of choices centred is unreadable - the eye has no
   left edge to come back to. So this block goes back to left-aligned inside it, sits on
   its own surface, and keeps the whole thing feeling like one card rather than a form
   bolted underneath an advert.
   The question is already answered from the page we just read, so most people will glance
   at it and press. It is a confirmation, not an interview, and it is styled like one. */
.cv-goal { margin: 0 0 16px; padding: 14px 16px; text-align: left;
  background: var(--geo-surface2); border-radius: var(--geo-r-card); }
/* HOW WE READ THE PAGE, as a sentence they can correct. It replaced a heading
   ("What should this page make someone do?"), five visible radios and a line admitting we
   had pre-ticked one - six things, in front of one button. A statement plus one quiet way
   to disagree does the same job in one line. */
.cv-goal-read { margin: 0 0 4px; font-size: 14px; line-height: 1.5; color: var(--geo-text); }

/* "Not right?" is a text button, not a button-shaped button. It sits inside a sentence, so
   anything with a background or a border would read as the main action - and the main action
   on this block is Roast it. Teal is the one action colour, so it borrows that and nothing
   else. */
.cv-goal-fix { padding: 0; border: 0; background: none; font: inherit; font-size: 13px;
  color: var(--geo-accent); text-decoration: underline; cursor: pointer; }
.cv-goal-fix:hover { text-decoration: none; }
.cv-goal-fix:focus-visible { outline: 2px solid var(--geo-accent); outline-offset: 2px;
  border-radius: 2px; }

/* The choices, once somebody has said we got it wrong. Hidden by the `hidden` attribute, so
   the checked radio still reaches the server while it is folded away. */
.cv-goal-pick { margin: 10px 0 12px; }

.cv-goal-row { display: flex; align-items: center; gap: 8px; margin: 0 0 6px;
  font-size: 13px; color: var(--geo-text2); cursor: pointer; min-height: 32px; }
.cv-goal-row input { accent-color: var(--geo-accent); width: 16px; height: 16px; flex: none; }
.cv-goal-row:hover { color: var(--geo-text); }
.cv-goal textarea { width: 100%; box-sizing: border-box; padding: 8px 10px; font: inherit;
  font-size: 13px; line-height: 1.5; color: var(--geo-text); background: var(--geo-surface);
  border: 1px solid var(--geo-border2); border-radius: var(--geo-r-ctrl); resize: vertical; }
.cv-goal textarea:focus { outline: 2px solid var(--geo-accent); outline-offset: 1px;
  border-color: var(--geo-accent); }
.cv-goal-link { margin: 10px 0 0; font-size: 12px; color: var(--geo-muted, var(--geo-second)); }
.cv-goal-link a { color: var(--geo-accent); text-decoration: none; }
.cv-goal-link a:hover { text-decoration: underline; }
/* On a phone the choices need the whole width and a bigger target. 97% are on one. */
@media (max-width: 767px) {
  .cv-goal { padding: 12px; }
  .cv-goal-row { min-height: 40px; font-size: 14px; }
  /* "Not right?" sits inside a sentence, so it cannot have a 44px box without breaking the
     line. Padding grows the target in both directions instead, and the negative margin keeps
     the sentence spacing it had. It is a small target either way - the cost of putting it in
     the sentence rather than on its own row, which is the right trade because the sentence is
     the point and the correction is the exception. */
  .cv-goal-fix { padding: 8px 4px; margin: -8px -4px; font-size: 14px; }
}
.cv-roast-go { min-height: 44px; padding: 0 20px; font: inherit; font-size: 14px; font-weight: 600;
  border: 1px solid var(--geo-accent); border-radius: var(--geo-r-ctrl);
  background: var(--geo-accent); color: var(--geo-accent-ink); cursor: pointer; }
.cv-roast-go:hover { filter: brightness(1.08); }
.cv-roast-go:disabled { opacity: .7; cursor: progress; }
.cv-roast-note { margin: 10px 0 0; font-size: 12px; color: var(--geo-second); }

.cv-roast { margin-top: 18px; }
.cv-roast-verdict { margin: 0 0 14px; font-size: 18px; font-weight: 600; line-height: 1.4;
  color: var(--geo-text); }
.cv-roast-point { padding: 14px 16px; margin-bottom: 10px; border-radius: var(--geo-r-card);
  border: 1px solid var(--geo-border2); border-left-width: 3px; }
.cv-roast-point h4 { margin: 0 0 6px; font-size: 15px; font-weight: 600; }
/* The one witty line, under the name. docs/roast-flow.md: "Name first, joke second. The card
   title says what it is. The roast line sits underneath. A joke never replaces the name." */
.cv-roast-line { margin: 0 0 8px; font-size: 14px; line-height: 1.5; color: var(--geo-text);
  font-style: italic; }

/* Their words and ours, side by side, when the finding is about writing. The replacement is the
   one they act on, so it is the one that reads as text rather than as a quote. */
.cv-roast-now, .cv-roast-try { margin: 8px 0 0; font-size: 13px; line-height: 1.5; }
.cv-roast-now { color: var(--geo-second); text-decoration: line-through;
  text-decoration-color: var(--geo-border2); }
.cv-roast-try { color: var(--geo-text); }
.cv-roast-now strong, .cv-roast-try strong { text-decoration: none; color: var(--geo-muted, var(--geo-second));
  font-weight: 600; }

/* What's working. It was being thrown away - a roast that only says what is wrong is harder to
   read than it needs to be, and these are the lines that make it feel like a review. */
.cv-roast-good { margin: 16px 0 0; padding: 13px 15px; border-radius: var(--geo-r-card);
  background: var(--geo-surface2); }
.cv-roast-good h4 { margin: 0 0 8px; font-size: 14px; font-weight: 600; color: var(--geo-text); }
.cv-roast-good-row { margin: 0 0 6px; font-size: 13px; line-height: 1.5; color: var(--geo-second); }
.cv-roast-good-row:last-child { margin-bottom: 0; }
.cv-roast-good-row strong { color: var(--geo-text); font-weight: 600; }

.cv-roast-seen { margin: 0 0 6px; font-size: 13px; color: var(--geo-second); }
.cv-roast-why { margin: 0 0 8px; font-size: 13px; color: var(--geo-second); }
.cv-roast-do { margin: 0; font-size: 13px; }
/* Take it away. Quiet - it is the other route out, not the one we are selling - but it
   has a real target size, because half the people who want it are on a phone. */
.cv-take { margin: 14px 0 0; text-align: center; }
.cv-download { display: inline-block; min-height: 40px; line-height: 40px; padding: 0 14px;
  font-size: 13px; color: var(--geo-accent); text-decoration: none; }
.cv-download:hover { text-decoration: underline; }
/* THE RULE BEHIND THE FIX. Quieter than the action and set apart from it, because it is
   the thing they keep rather than the thing they do today. A left rule and a little space
   so the eye can skip it on the first read and find it on the second. */
.cv-roast-rule { margin: 8px 0 0; padding-left: 10px; font-size: 12px; line-height: 1.5;
  color: var(--geo-muted, var(--geo-second)); border-left: 2px solid var(--geo-border2); }
.cv-roast-diy  { border-left-color: var(--geo-second); }
.cv-roast-ai   { border-left-color: var(--geo-accent); }
.cv-roast-team { border-left-color: var(--geo-warn, #eab308); }
@media (max-width: 767px) { .cv-roast-go { width: 100%; } }

/* ═══ ROAST MY SITE · Set up ══════════════════════════════════════════════════
   docs/roast-flow.md §1, built to the prototype's structure on Geophii's own tokens rather
   than the prototype's palette - it is one app, and a screen that brings its own colours reads
   as a bolted-on page. Sizes, spacing and the shape of every control follow the demo.
   Mobile first: 97% of people are on a phone, so the one-column stack is the base and the
   wider layout is the override. */
.rm-setup { display: flex; flex-direction: column; gap: 28px; max-width: 40rem;
  font-size: 16px; }
.rm-head { display: flex; flex-direction: column; }
.rm-eyebrow { margin: 0 0 10px; font-family: var(--geo-mono, ui-monospace, monospace);
  font-size: 12px; font-weight: 500; letter-spacing: .14em; text-transform: uppercase;
  color: var(--geo-accent); }
.rm-h1 { margin: 0; font-size: clamp(28px, 5vw, 40px); line-height: 1.1; font-weight: 700;
  letter-spacing: -.02em; color: var(--geo-text); text-wrap: balance; max-width: 18em; }

.rm-form { display: flex; flex-direction: column; gap: 22px; }
.rm-field { display: flex; flex-direction: column; gap: 8px; border: 0; padding: 0; margin: 0;
  min-width: 0; }
.rm-field > label, .rm-field > legend { padding: 0; font-size: 15px; font-weight: 600;
  color: var(--geo-text); }
.rm-opt { margin-left: 6px; font-size: 13px; font-weight: 400; color: var(--geo-muted); }
.rm-hint { margin: 0; font-size: 14px; color: var(--geo-muted); }

.rm-field input[type="url"], .rm-field textarea {
  width: 100%; box-sizing: border-box; padding: 12px 14px; font: inherit; font-size: 16px;
  color: var(--geo-text); background: var(--geo-surface); border: 1px solid var(--geo-border2);
  border-radius: 10px; }
.rm-field textarea { resize: vertical; min-height: 3.2em; line-height: 1.5; }
.rm-field input::placeholder, .rm-field textarea::placeholder { color: var(--geo-muted); }
.rm-field input:focus, .rm-field textarea:focus { outline: 2px solid var(--geo-accent);
  outline-offset: 1px; border-color: var(--geo-accent); }

/* Chips, not radios in a list. One tap, and the whole pill is the target. */
.rm-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 2px; }
.rm-chip { display: inline-block; }
.rm-chip input { position: absolute; opacity: 0; pointer-events: none; }
/* Measured against the prototype at 390px: mine came out 60px tall against its 43px. The
   min-height and the line-height I had added were both fighting the padding, and padding on
   its own is all the demo uses. A chip that tall reads as a button, and five buttons in a row
   is a different screen. */
.rm-chip span { display: inline-block; padding: 9px 15px; border-radius: 99px;
  border: 1px solid var(--geo-border2); background: var(--geo-surface);
  font-size: 15px; font-weight: 500; color: var(--geo-text2); cursor: pointer; }
.rm-chip input:checked + span { background: var(--geo-accent-soft);
  border-color: var(--geo-accent); color: var(--geo-text); }
.rm-chip input:focus-visible + span { outline: 2px solid var(--geo-accent); outline-offset: 2px; }

.rm-rowcard { display: flex; flex-wrap: wrap; gap: 8px 16px; align-items: center;
  justify-content: space-between; padding: 14px 16px; background: var(--geo-surface);
  border: 1px solid var(--geo-border2); border-radius: 12px; }
.rm-rowcard strong { font-weight: 600; color: var(--geo-text); }
/* INLINE, so "Want it sharper? Check what we know about the business." is one sentence that
   wraps, not two stacked lines. Mine had display:block and read as a heading with a caption
   under it - a different shape from the demo, from one word of CSS.
   The walkthrough toggle gets its line break from its own `strong`, which is block there on
   purpose, so both places read the way the prototype does. */
.rm-sub { font-size: 15px; color: var(--geo-text2); }
.rm-linkbtn { padding: 0; border: 0; background: none; font: inherit; font-weight: 600;
  color: var(--geo-accent); text-decoration: underline; text-underline-offset: 3px;
  cursor: pointer; }
.rm-linkbtn:hover { text-decoration: none; }

.rm-toggle { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: start;
  padding: 14px 16px; background: var(--geo-surface); border: 1px solid var(--geo-border2);
  border-radius: 12px; cursor: pointer; }
.rm-toggle input { width: 20px; height: 20px; margin: 2px 0 0; accent-color: var(--geo-accent); }
.rm-toggle strong { display: block; font-weight: 600; color: var(--geo-text); }
.rm-price-tag { padding-top: 2px; font-family: var(--geo-mono, ui-monospace, monospace);
  font-size: 13px; color: var(--geo-text2); white-space: nowrap; }

.rm-getbox { display: flex; flex-direction: column; gap: 8px; }
.rm-getlabel { margin: 0; font-family: var(--geo-mono, ui-monospace, monospace); font-size: 12px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--geo-muted); }
.rm-gets { list-style: none; margin: 0; padding: 0; display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: 6px 18px;
  font-size: 15px; color: var(--geo-text2); }
.rm-gets li::before { content: "\2713"; margin-right: 8px; font-weight: 800;
  color: var(--geo-accent); }

.rm-gorow { display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center; }
.rm-go { padding: 14px 22px; border: 0; border-radius: var(--geo-r-ctrl); font: inherit; font-size: 16px;
  font-weight: 600; background: var(--geo-accent); color: var(--geo-accent-ink);
  cursor: pointer; min-height: 52px; }
.rm-go:hover { filter: brightness(1.08); }
.rm-go:disabled { opacity: .7; cursor: progress; }
.rm-bal { font-size: 14px; color: var(--geo-muted); }
/* Not enough credits is a fact they act on, so it reads as one rather than as an error. */
.rm-bal.short { color: var(--geo-warn, #d7a75c); font-weight: 600; }

@media (max-width: 767px) {
  .rm-setup { gap: 24px; }
  .rm-go { width: 100%; }
  .rm-gets { grid-template-columns: 1fr; }
}

/* ═══ ROAST MY SITE · Working, the report, the popup ═════════════════════════════
   docs/roast-prototype.html, on Geophii's tokens. Muted text is the grey (--geo-muted), never
   the lavender: at phone width the lavender read as a link on every line of a finding. */
.rm-note { display: flex; flex-direction: column; gap: 10px; align-items: flex-start;
  padding: 14px 16px; border: 1px solid var(--geo-warn); border-radius: 12px;
  background: var(--geo-surface); color: var(--geo-text); font-size: 15px; }
.rm-note[hidden] { display: none; }
.rm-note p { margin: 0; }

.rm-work { display: flex; flex-direction: column; gap: 24px; max-width: 34rem; font-size: 16px; }
.rm-work[hidden], .rm-report[hidden], .rm-setup[hidden] { display: none; }
.rm-steps { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.rm-steps li { display: flex; gap: 12px; align-items: center; color: var(--geo-muted); }
.rm-dot { width: 22px; height: 22px; flex: 0 0 auto; border-radius: 50%;
  border: 2px solid var(--geo-border2); display: grid; place-items: center;
  font-size: 12px; font-weight: 800; }
.rm-steps li.now { color: var(--geo-text); }
.rm-steps li.now .rm-dot { border-color: var(--geo-accent); border-top-color: transparent;
  animation: rm-spin .8s linear infinite; }
.rm-steps li.done { color: var(--geo-text2); }
.rm-steps li.done .rm-dot { background: var(--geo-accent); border-color: var(--geo-accent);
  color: var(--geo-accent-ink); }
@keyframes rm-spin { to { transform: rotate(360deg); } }
.rm-bar { height: 6px; border-radius: 99px; background: var(--geo-border2); overflow: hidden; }
.rm-bar span { display: block; height: 100%; width: 0; background: var(--geo-accent);
  transition: width .5s ease; }
.rm-quip { margin: 0; font-size: 18px; font-weight: 500; min-height: 1.6em; color: var(--geo-text); }

.rm-report { display: flex; flex-direction: column; gap: 32px; font-size: 16px; }
.rm-h2 { margin: 0 0 14px; font-family: var(--geo-mono, ui-monospace, monospace); font-size: 13px;
  font-weight: 500; letter-spacing: .12em; text-transform: uppercase; color: var(--geo-muted); }
.rm-scorerow { display: flex; flex-wrap: wrap; gap: 18px 28px; align-items: flex-end; }
.rm-score { display: flex; align-items: baseline; gap: 2px; font-weight: 700; font-family: var(--geo-font-head); letter-spacing: -.03em; }
.rm-n { font-size: clamp(64px, 12vw, 96px); line-height: .9; font-variant-numeric: tabular-nums; }
.rm-n.good, .rm-n.up { color: var(--geo-good); }
.rm-n.teal { color: var(--geo-accent); }
.rm-n.warn { color: var(--geo-warn); }
.rm-n.bad { color: var(--geo-bad); }
.rm-of { font-size: 22px; font-weight: 600; color: var(--geo-muted); }
.rm-was { margin-right: 10px; font-size: clamp(36px, 7vw, 52px); font-weight: 700;
  color: var(--geo-muted); text-decoration: line-through; }
.rm-arrow { margin-right: 10px; font-size: clamp(28px, 5vw, 40px); font-weight: 600; color: var(--geo-muted); }
.rm-verdict { display: flex; flex-direction: column; gap: 4px; padding-bottom: 6px; min-width: 0; }
.rm-pill { display: inline-block; align-self: flex-start; padding: 4px 10px; border-radius: 99px;
  font-family: var(--geo-mono, ui-monospace, monospace); font-size: 12px; font-weight: 500;
  letter-spacing: .06em; text-transform: uppercase; }
.rm-pill.bad  { background: color-mix(in srgb, var(--geo-bad) 14%, transparent); color: var(--geo-bad-ink); }
.rm-pill.warn { background: color-mix(in srgb, var(--geo-warn) 14%, transparent); color: var(--geo-warn-ink); }
.rm-pill.good { background: color-mix(in srgb, var(--geo-good) 14%, transparent); color: var(--geo-good-ink); }
.rm-pill.teal { background: color-mix(in srgb, var(--geo-accent) 14%, transparent); color: var(--geo-accent); }
.rm-goalline { margin: 0; font-size: 14px; color: var(--geo-muted); overflow-wrap: anywhere; }
.rm-oneliner { margin: 0; max-width: 24em; font-size: clamp(22px, 3.6vw, 30px); font-weight: 700;
  line-height: 1.25; letter-spacing: -.015em; color: var(--geo-text); text-wrap: balance; }

.rm-findings { display: flex; flex-direction: column; gap: 14px; min-width: 0; }
.rm-finding { display: flex; flex-direction: column; gap: 10px; padding: 18px 18px 16px;
  background: var(--geo-surface); border: 1px solid var(--geo-border2); border-radius: 14px; }
.rm-f-head { display: flex; flex-wrap: wrap; gap: 8px 10px; align-items: center; }
.rm-f-head h3 { margin: 0; font-size: 18px; font-weight: 700; color: var(--geo-text); }
.rm-f-head .rm-pill { margin-left: auto; }
.rm-num { width: 24px; height: 24px; flex: 0 0 auto; border-radius: 50%; display: grid;
  place-items: center; font-size: 12px; font-weight: 800; background: var(--geo-bad); color: #fff; }
.rm-num.warn { background: var(--geo-warn); color: #1d1402; }
.rm-roast { margin: 0; font-size: 19px; font-weight: 600; line-height: 1.3; color: var(--geo-text);
  text-wrap: pretty; }
.rm-facts { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 6px 14px; font-size: 15px; }
.rm-facts dt { padding-top: 3px; font-family: var(--geo-mono, ui-monospace, monospace); font-size: 11px;
  letter-spacing: .08em; text-transform: uppercase; color: var(--geo-muted); white-space: nowrap; }
.rm-facts dd { margin: 0; color: var(--geo-text2); }
.rm-rewrite { display: grid; grid-template-columns: auto 1fr; gap: 6px 14px; padding: 12px 14px;
  background: var(--geo-surface2); border: 1px solid var(--geo-border2); border-radius: 10px; }
.rm-rw-k { padding-top: 3px; font-family: var(--geo-mono, ui-monospace, monospace); font-size: 11px;
  letter-spacing: .08em; text-transform: uppercase; color: var(--geo-muted); }
.rm-rewrite p { margin: 0; }
.rm-rw-now { color: var(--geo-muted); text-decoration: line-through; text-decoration-color: var(--geo-bad); }
.rm-rw-try { color: var(--geo-text); font-weight: 600; }
.rm-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; }
.rm-btn { display: inline-flex; align-items: center; min-height: 44px; padding: 10px 15px;
  border-radius: 10px; border: 1px solid var(--geo-border2); background: transparent;
  font: inherit; font-size: 15px; font-weight: 600; color: var(--geo-text); text-decoration: none;
  cursor: pointer; }
.rm-btn:hover { border-color: var(--geo-muted); }
.rm-btn.rm-solid { background: var(--geo-accent); border-color: var(--geo-accent); color: var(--geo-accent-ink); }
.rm-btn[aria-pressed="true"] { border-color: var(--geo-good); color: var(--geo-good-ink); }
/* The app paints every link in .main-content lavender, with selectors specific enough to beat
   .rm-btn. A link that is a button here keeps the button's colours; the tab's id outranks them. */
#site-tab-conversion a.rm-btn { color: var(--geo-text); text-decoration: none; }
#site-tab-conversion a.rm-btn.rm-solid { color: var(--geo-accent-ink); }

.rm-details { padding: 4px 18px; background: var(--geo-surface); border: 1px solid var(--geo-border2);
  border-radius: 14px; }
.rm-details summary { padding: 12px 0; font-size: 17px; font-weight: 700; color: var(--geo-text); cursor: pointer; }
.rm-details[open] summary { margin-bottom: 10px; border-bottom: 1px solid var(--geo-border2); }
.rm-minis { display: flex; flex-direction: column; gap: 16px; padding-bottom: 16px; }
.rm-mini { display: flex; flex-direction: column; gap: 6px; }
.rm-mini + .rm-mini { padding-top: 16px; border-top: 1px solid var(--geo-border2); }
.rm-mini .rm-f-head h3 { font-size: 16px; }
.rm-working { list-style: none; margin: 0; padding: 0 0 14px; display: flex; flex-direction: column; gap: 10px; }
.rm-working li { display: flex; gap: 10px; align-items: baseline; color: var(--geo-text2); }
.rm-working b { font-weight: 600; color: var(--geo-text); }
.rm-tick { font-weight: 800; color: var(--geo-good); }

.rm-choice { display: flex; flex-direction: column; gap: 14px; }
.rm-choices { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: 14px; }
.rm-opt-card { display: flex; flex-direction: column; gap: 12px; padding: 18px;
  background: var(--geo-surface); border: 1px solid var(--geo-border2); border-radius: 14px; }
.rm-opt-card h3 { margin: 0; font-size: 18px; font-weight: 700; color: var(--geo-text); }
.rm-body { margin: 0; font-size: 15px; color: var(--geo-text2); }
.rm-todo { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.rm-todo label { display: flex; gap: 12px; align-items: flex-start; padding: 12px 14px;
  border: 1px solid var(--geo-border2); border-radius: 10px; color: var(--geo-text); cursor: pointer; }
.rm-todo input { width: 18px; height: 18px; margin: 3px 0 0; flex: 0 0 auto; accent-color: var(--geo-accent); }
.rm-todo input:checked + span { text-decoration: line-through; color: var(--geo-muted); }
.rm-again { display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center;
  justify-content: space-between; padding: 14px 16px; border: 1px dashed var(--geo-border2); border-radius: 14px; }
.rm-again p { margin: 0; max-width: 34em; color: var(--geo-text2); }
.rm-again strong { color: var(--geo-text); }

/* The page on a phone, beside the findings (stacked on a phone), as in the prototype. */
.rm-split { display: grid; grid-template-columns: 260px minmax(0, 1fr); gap: 32px; align-items: start; }
.rm-shot { position: sticky; top: 16px; display: flex; flex-direction: column; gap: 10px; align-items: center; }
.rm-cap { margin: 0; max-width: 15em; font-size: 13px; text-align: center; color: var(--geo-muted); }
.rm-phone { width: 240px; max-width: 100%; aspect-ratio: 390 / 844; padding: 10px; border-radius: 32px;
  background: #040606; box-shadow: 0 12px 30px rgba(0, 0, 0, .3); }
.rm-screen { position: relative; height: 100%; overflow: hidden; border-radius: 23px; background: #fff; }
.rm-screen img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: top; }
.rm-pin { position: absolute; width: 28px; height: 28px; min-height: 0; padding: 0; transform: translate(-50%, -50%);
  display: grid; place-items: center; border-radius: 50%; border: 2px solid #fff; background: #d2402e;
  color: #fff; font: 800 13px/1 system-ui, sans-serif; box-shadow: 0 2px 8px rgba(0, 0, 0, .35); cursor: pointer; }
.rm-pin.warn { background: #e3a52a; color: #1d1402; }
.rm-pin-tag { position: absolute; transform: translate(-50%, 0); padding: 2px 6px; border-radius: 4px;
  border: 1px dashed #d2402e; background: #fff; color: #2b2621; font: 700 10px/1.4 system-ui, sans-serif;
  white-space: nowrap; }
.rm-finding, .rm-mini { scroll-margin-top: 80px; }
.rm-flash { animation: rm-flash 1.2s ease; }
@keyframes rm-flash { 0%, 40% { border-color: var(--geo-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--geo-accent) 25%, transparent); } }

.rm-walk { display: flex; flex-direction: column; gap: 14px; }
.rm-walk .rm-h2 { margin: 0; }
.rm-walk-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px;
  align-items: end; }
.rm-wstep { display: flex; flex-direction: column; gap: 10px; align-items: center; text-align: center; }
.rm-wstep p { margin: 0; max-width: 16em; font-size: 15px; color: var(--geo-text2); }
.rm-wstep-n { font-family: var(--geo-mono, ui-monospace, monospace); font-size: 11px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--geo-muted); }
.rm-phone-mini { width: 130px; padding: 6px; border-radius: 18px; box-shadow: 0 6px 16px rgba(0, 0, 0, .25); }
.rm-phone-mini .rm-screen { border-radius: 13px; }

.rm-upgrade { display: flex; flex-direction: column; gap: 10px; align-items: flex-start; padding: 18px;
  border: 1px solid var(--geo-accent); border-radius: 14px;
  background: color-mix(in srgb, var(--geo-accent) 12%, transparent); }
.rm-upgrade h3 { margin: 0; font-size: 18px; font-weight: 700; color: var(--geo-text); }

/* Fix this for me: the popup's list, the status at the top of the report, "We fix it". */
.rm-fix-step { display: flex; flex-direction: column; gap: 14px; }
.rm-fix-step[hidden] { display: none; }
.rm-fixlist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.rm-fixlist label { display: flex; gap: 10px; align-items: flex-start; padding: 10px 12px; cursor: pointer;
  border: 1px solid var(--geo-border2); border-radius: 10px; color: var(--geo-text); }
.rm-fixlist label.hl { border-color: var(--geo-accent); background: color-mix(in srgb, var(--geo-accent) 12%, transparent); }
.rm-fixlist input { width: 18px; height: 18px; margin: 3px 0 0; flex: 0 0 auto; accent-color: var(--geo-accent); }
.rm-fix-err { margin: 0; color: var(--geo-bad-ink); font-weight: 600; }
.rm-status { display: flex; flex-direction: column; gap: 10px; padding: 14px 16px; border-radius: 14px;
  border: 1px solid var(--geo-accent); background: color-mix(in srgb, var(--geo-accent) 12%, transparent); color: var(--geo-text); }
.rm-status[hidden] { display: none; }
.rm-track { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px 18px; font-size: 15px;
  color: var(--geo-muted); }
.rm-track li::before { content: "\25CB"; margin-right: 6px; }
.rm-track li.done { color: var(--geo-text2); }
.rm-track li.done::before { content: "\2713"; color: var(--geo-good); font-weight: 800; }
.rm-track li.now { color: var(--geo-text); font-weight: 600; }
.rm-track li.now::before { content: "\25CF"; color: var(--geo-accent); }
.rm-opt-card.rm-pick { border-color: var(--geo-accent); }

/* Impact bars: what a fix does for the business (RoastImpact). One calm fill, a tick when a
   lane is full. The motion is the reward, so it is short and it respects reduced motion. */
.rm-imp { display: flex; flex-direction: column; gap: 10px; padding: 12px 14px; border-radius: 12px;
  border: 1px solid var(--geo-border2); background: color-mix(in srgb, var(--geo-accent) 5%, transparent); }
.rm-imp:empty { display: none; }
.rm-imp-h { margin: 0; font-size: 13px; font-weight: 650; color: var(--geo-text2); }
.rm-imp-row { --c: var(--geo-accent); display: flex; flex-direction: column; gap: 0; }
.rm-imp-row[data-lane="trust"]   { --c: #e0a93b; }
.rm-imp-row[data-lane="clarity"] { --c: #8f8cf5; }
.rm-imp-row[data-lane="speed"]   { --c: #4ea8f0; }
.rm-imp-top { display: grid; grid-template-columns: 9.8rem minmax(48px, 1fr) 20px; align-items: center; gap: 10px; }
.rm-imp-name { font-size: 14.5px; font-weight: 650; color: var(--geo-text); white-space: nowrap; }
.rm-imp-tick { width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; font-size: 12px;
  font-weight: 800; color: #06201f; background: var(--c); opacity: 0; transform: scale(.4);
  transition: opacity .25s ease, transform .35s cubic-bezier(.3, 1.6, .5, 1); }
.rm-imp-row.full .rm-imp-tick { opacity: 1; transform: scale(1); }
.rm-imp-line { margin: 0; font-size: 13.5px; line-height: 1.35; color: var(--geo-muted); max-height: 0; opacity: 0; overflow: hidden;
  transition: max-height .35s ease, opacity .35s ease, margin .35s ease; }
.rm-imp-row.full .rm-imp-line { max-height: 3.2em; opacity: 1; margin-top: 3px; }
.rm-imp-bar { height: 8px; border-radius: 99px; overflow: hidden; background: color-mix(in srgb, var(--geo-text) 10%, transparent); }
.rm-imp-fill { display: block; height: 100%; width: 0; border-radius: inherit; background: var(--c);
  transition: width .7s cubic-bezier(.2, .8, .2, 1); }
.rm-imp-say { margin: 2px 0 0; font-size: 14px; font-weight: 600; color: var(--geo-text); }
/* On the report's status box: part-way and gently moving while we work, full when live. */
.rm-imp-status { background: transparent; border-color: color-mix(in srgb, var(--geo-accent) 35%, transparent); }
.rm-imp-status:not(.is-live) .rm-imp-fill { background-image: linear-gradient(90deg, transparent 0, rgba(255,255,255,.28) 50%, transparent 100%);
  background-size: 200% 100%; animation: rm-imp-shimmer 2.4s linear infinite; }
.rm-imp-status.is-live .rm-imp-fill { transition-duration: 1.1s; }
@keyframes rm-imp-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
.rm-imp-tag { margin: 0; align-self: flex-start; font-size: 13px; font-weight: 650; padding: 3px 10px; border-radius: 99px;
  color: color-mix(in srgb, var(--c) 72%, var(--geo-text)); background: color-mix(in srgb, var(--c) 14%, transparent);
  --c: var(--geo-accent); }
.rm-imp-tag.lane-trust   { --c: #e0a93b; }
.rm-imp-tag.lane-clarity { --c: #8f8cf5; }
.rm-imp-tag.lane-speed   { --c: #4ea8f0; }
.rm-imp-dot { flex: 0 0 auto; width: 10px; height: 10px; margin: 6px 0 0 auto; border-radius: 50%; background: var(--geo-accent); }
.rm-imp-dot.lane-trust   { background: #e0a93b; }
.rm-imp-dot.lane-clarity { background: #8f8cf5; }
.rm-imp-dot.lane-speed   { background: #4ea8f0; }
.rm-imp-name::before { content: ""; display: inline-block; width: 10px; height: 10px; margin-right: 7px; border-radius: 50%;
  background: var(--c); vertical-align: 0; }
@media (prefers-reduced-motion: reduce) {
  .rm-imp-fill, .rm-imp-tick, .rm-imp-line { transition: none; }
  .rm-imp-status .rm-imp-fill { animation: none; }
}
.rm-wefix-count { margin: 0; font-weight: 600; color: var(--geo-text); }

.rm-scrim { position: fixed; inset: 0; z-index: 10000; /* over the help dock (9969) as well as the phone bar */ display: grid; place-items: center; padding: 16px;
  background: rgba(3, 6, 6, .62); }
.rm-scrim[hidden] { display: none; }
.rm-modal { width: 100%; max-width: 34rem; max-height: calc(100% - 32px); overflow: auto;
  display: flex; flex-direction: column; gap: 16px; padding: 22px; border-radius: 18px;
  background: var(--geo-surface); border: 1px solid var(--geo-border2); color: var(--geo-text); }
.rm-modal h3 { margin: 0; font-size: 22px; font-weight: 700; }
.rm-modal-body, .rm-modal-wait { margin: 0; color: var(--geo-text2); }
.rm-biz-frame { width: 100%; height: calc(100dvh - 300px); min-height: 280px; border: 1px solid var(--geo-border2);
  border-radius: 10px; background: #fff; }
.rm-row-end { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
.rm-toast { position: fixed; left: 16px; right: 16px; bottom: calc(env(safe-area-inset-bottom, 0px) + 24px);
  z-index: 10001; width: fit-content; max-width: calc(100% - 32px); margin: 0 auto; padding: 10px 16px;
  border-radius: 10px; background: var(--geo-text); color: var(--geo-surface); font-size: 15px; font-weight: 600; }
.rm-toast[hidden] { display: none; }

/* A new screen scrolls to the tab's top; on a phone the fixed 64px header must not sit on it. */
#site-tab-conversion { scroll-margin-top: 16px; }
@media (max-width: 1023px) {
  .rm-split { grid-template-columns: 1fr; }
  .rm-shot { position: static; justify-self: center; }
}
@media (max-width: 767px) {
  #site-tab-conversion { scroll-margin-top: 80px; }
  /* At the top on a phone, under the fixed header: the bottom already holds the phone bar and
     the help dock, and a toast there landed on top of them. */
  .rm-toast { top: calc(env(safe-area-inset-top, 0px) + 76px); bottom: auto; }
  .rm-modal { padding: 16px; }
}
@media (max-width: 520px) {
  .rm-facts, .rm-rewrite { grid-template-columns: 1fr; }
  .rm-facts dd { margin-bottom: 6px; }
}
@media (prefers-reduced-motion: reduce) {
  .rm-flash { animation: none; }
  .rm-steps li.now .rm-dot { animation: none; border-top-color: var(--geo-accent); }
  .rm-bar span { transition: none; }
}

/* ── The navy ground (25 Sep 2026, Edward's colours; "you decide what's best") ─────────
   The dark theme's ground moves from near-black to a deep navy (#0F1827) with #121B28 cards,
   and the sidebar on the same navy (Edward, 25 Sep: "change the black to the same background
   as the chat"), set apart by its hairline; the accents stay exactly as they are - so the app
   and the chat read as one surface. The old black is
   one attribute away: <html data-palette="classic">. */
html[data-theme="dark"]:not([data-palette="classic"]) {
  --geo-bg:       #0F1827;
  --geo-panel:    #0F1827;
  --geo-surface:  #121B28;
  --geo-surface2: #1A2432;
  --geo-border:   #1D2736;
  --geo-border2:  #3B424D;
}

/* ── The help button, one pill (25 Sep 2026) ──────────────────────────────────────
   Edward: "the support chat, the layout and button is not right". It was three loose
   pieces - the green launcher, a small tag, a faint circle that looked switched off. Now
   one quiet pill (icon + words) under the launcher, in the app's own surface and border,
   on every screen size; a phone keeps it clear of the bottom bar. */
#geo-dock { flex-direction: column; align-items: flex-end; gap: 10px; }
#geo-dock .geo-dock-label { display: none !important; }
#geo-dock #support-fab.geo-dock-help {
  width: auto !important; height: 40px !important; padding: 0 15px 0 13px !important; gap: 8px !important;
  font-size: 13px !important; font-weight: 600 !important; line-height: 1 !important; letter-spacing: 0;
  color: var(--geo-text2) !important; background: var(--geo-surface) !important;
  border: 1px solid var(--geo-border2) !important; border-radius: 999px !important;
  box-shadow: 0 10px 26px -14px rgba(0,0,0,.6) !important; font-family: var(--geo-font) !important;
}
#geo-dock #support-fab.geo-dock-help svg { width: 17px !important; height: 17px !important; color: var(--geo-accent); }
#geo-dock #support-fab.geo-dock-help:hover { color: var(--geo-text) !important; border-color: var(--geo-accent) !important; transform: none !important; }

/* The window: the app's surface and ink, the one teal action - no gradient. */
#support-modal .sup-card { width: 100%; max-width: 480px; background: var(--geo-surface); border: 1px solid var(--geo-border2);
  border-radius: 16px; overflow: hidden; box-shadow: 0 40px 90px -30px rgba(0,0,0,.7); font-family: var(--geo-font); }
#support-modal .sup-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding: 20px 22px 0; }
#support-modal .sup-title { display: flex; align-items: center; gap: 9px; margin: 0; font-size: 17px; font-weight: 700; color: var(--geo-text); }
#support-modal .sup-title svg { width: 18px; height: 18px; color: var(--geo-accent); }
#support-modal .sup-sub { margin: 6px 0 0; font-size: 13px; line-height: 1.55; color: var(--geo-muted); }
#support-modal .sup-close { flex: none; width: 32px; height: 32px; border-radius: 9px; border: 1px solid var(--geo-border); background: transparent; color: var(--geo-muted); cursor: pointer; }
#support-modal .sup-close:hover { color: var(--geo-text); border-color: var(--geo-border2); }
#support-modal .sup-form { padding: 16px 22px 22px; }
#support-modal .sup-field { width: 100%; min-width: 0; box-sizing: border-box; background: var(--geo-bg); border: 1px solid var(--geo-border2);
  border-radius: 10px; padding: 11px 13px; color: var(--geo-text); font-size: 14px; outline: none; font-family: inherit; }
#support-modal .sup-field:focus { border-color: var(--geo-accent); }
#support-modal textarea.sup-field { resize: vertical; min-height: 120px; }
#support-modal .sup-send { width: 100%; margin-top: 12px; min-height: 44px; border: 0; border-radius: 10px; cursor: pointer;
  font-size: 14px; font-weight: 700; background: var(--geo-accent); color: var(--geo-accent-ink); }
#support-modal .sup-send:disabled { opacity: .6; cursor: default; }
#support-modal .sup-fb { display: none; margin-top: 10px; padding: 10px 13px; border-radius: 10px; font-size: 13px; line-height: 1.6; }
#support-modal .sup-fb.is-ok { display: block; background: color-mix(in oklab, var(--geo-good) 12%, transparent); border: 1px solid color-mix(in oklab, var(--geo-good) 40%, transparent); color: var(--geo-good-ink); }
#support-modal .sup-fb.is-bad { display: block; background: color-mix(in oklab, var(--geo-bad) 12%, transparent); border: 1px solid color-mix(in oklab, var(--geo-bad) 40%, transparent); color: var(--geo-bad-ink); }
#support-modal .sup-bridge { margin-top: 8px; padding: 7px 14px; border-radius: 8px; background: transparent; border: 1px solid currentColor; color: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
@media (max-width: 640px) { #support-modal { align-items: flex-end !important; padding: 0 !important; } #support-modal .sup-card { border-radius: 16px 16px 0 0; } }


/* ══ BUTTONS, 2026 ═══════════════════════════════════════════════════════════════════════
   Edward, 26 Sep: "make the buttons better, maybe flat, higher quality - they look like old
   school style, we want more like high quality saas buttons". The old look was 700-weight system
   type, 10-12px corners and a coloured glow under every primary. Now, everywhere:
     PRIMARY  the accent, a hairline edge a shade darker, a 1px top highlight, Inter 600.
              Hover lightens the fill; nothing lifts, nothing glows.
     QUIET    the surface, a hairline, a barely-there shadow, Inter 500.
   Written last in the file so it settles every earlier primary/quiet rule the same way. */
button, .btn, .geo-btn, input[type="submit"], input[type="button"] { font-family: var(--geo-font-head); }

.geo-btn-primary,
a[class*="bg-green-5"]:not([style*="width:"]), a[class*="bg-green-6"]:not([style*="width:"]), a[class*="bg-emerald-6"]:not([style*="width:"]), a[class*="bg-teal-6"]:not([style*="width:"]),
button[class*="bg-green-5"]:not([style*="width:"]), button[class*="bg-green-6"]:not([style*="width:"]), button[class*="bg-emerald-6"]:not([style*="width:"]),
input[type="submit"][class*="bg-green-"]:not([style*="width:"]),
a[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]),
#ob-card .ob-grad, .rm-go, .rm-btn.rm-solid, #support-modal .sup-send, .ix-send,
.cw-start, .cw-open.is-primary, .cw-door-btn, #gs-academy-modal .gs-action-btn:not(.gs-secondary):not(.gs-ghost),
.pw .pw-primary, .pw form > button[type="submit"] {
  border: 1px solid var(--geo-btn-edge) !important;
  box-shadow: var(--geo-btn-lift) !important;
  font-family: var(--geo-font-head) !important;
  font-weight: 600 !important;
  letter-spacing: -.005em;
  transform: none;
}
.geo-btn-primary:hover, a[class*="bg-green-5"]:hover, a[class*="bg-green-6"]:hover, button[class*="bg-green-5"]:hover:not(:disabled), button[class*="bg-green-6"]:hover:not(:disabled),
a[class*="bg-blue-6"]:not([class*="/"]):hover, button[class*="bg-blue-6"]:not([class*="/"]):hover:not(:disabled),
#ob-card a.ob-grad:hover, .rm-go:hover:not(:disabled), .rm-btn.rm-solid:hover, #support-modal .sup-send:hover:not(:disabled), .ix-send:hover,
.cw-start:hover, .cw-open.is-primary:hover, .cw-door-btn:hover, #gs-academy-modal .gs-action-btn:not(.gs-secondary):not(.gs-ghost):hover,
.pw .pw-primary:hover:not(:disabled), .pw form > button[type="submit"]:hover:not(:disabled) {
  background-color: var(--geo-btn-hover) !important; background-image: none !important;
  filter: none !important; transform: none !important;
  box-shadow: var(--geo-btn-lift) !important;
}
.geo-btn-silver, .geo-tt-btn, .btn-sm.secondary, #ob-card .ob-quiet, .rm-btn:not(.rm-solid),
.cw-open:not(.is-primary), .cw-back, .pw .pw-quiet, #gs-academy-modal .gs-action-btn.gs-secondary {
  box-shadow: var(--geo-btn-quiet) !important;
  font-family: var(--geo-font-head) !important;
  font-weight: 500 !important;
}
html:not([data-theme="dark"]) .main-content button:is([class*="bg-"], [class*=" border"], [class^="border"]):not([class*="bg-green"]):not([class*="bg-blue-6"]):not([class*="bg-teal"]):not([class*="bg-emerald"]):not([class*="bg-transparent"]):not([class*="border-transparent"]):not(.ob-grad):not(.geo-btn-primary):not(.geo-chip):not(.geo-own-colour):not([style*="width:"]) {
  box-shadow: var(--geo-btn-quiet) !important; font-weight: 500;
}
:is(button, a):focus-visible { outline: 2px solid color-mix(in oklab, var(--geo-accent) 70%, transparent); outline-offset: 2px; }
button:active, .btn:active, a[class*="bg-green-"]:active, a[class*="bg-blue-"]:active { transform: none; }
.geo-btn-primary:active, #ob-card .ob-grad:active, .rm-go:active, .cw-start:active, .cw-door-btn:active,
.pw .pw-primary:active, #gs-academy-modal .gs-action-btn:active { box-shadow: inset 0 1px 2px rgba(0, 0, 0, .18) !important; }
/* The roast's one button is the page's whole point: a step larger than an ordinary button. */
#site-tab-conversion .rm-go { font-size: 15px; min-height: 48px; padding: 0 22px; }

/* ═══ ROAST MY SITE · set-up card and past roasts (30 Sep) ════════════════════════
   Edward: "border, layout, separation ... think like a designer ... smooth and addictive".
   The form is ONE card: the questions, then quieter rows (business details, walkthrough) split by
   hairlines, then a tinted footer with what you get and the button. Past roasts sit beside it on
   a wide screen and under it on a phone: the newest as a card with its score ring, the rest as
   rows, and any of them opens its highlights in a popup. */
#site-tab-conversion .rm-setup { max-width: none; }
.rm-layout { display: grid; gap: 28px; align-items: start; }
.rm-layout > .rm-form { max-width: 40rem; }
/* One column (Edward, 30 Sep: "not sure why we're forcing two columns"): the form, then past
   roasts under it, at one width. */
.rm-layout > .rm-past { max-width: 40rem; }
.rm-card { gap: 0; border: 1px solid var(--geo-border); border-radius: 16px; background: var(--geo-surface);
  overflow: hidden; }
.rm-card-body { display: flex; flex-direction: column; gap: 22px; padding: 22px 22px 6px; }
.rm-card-foot { display: flex; flex-direction: column; gap: 16px; padding: 18px 22px 22px; margin-top: 16px;
  border-top: 1px solid var(--geo-border);
  background: color-mix(in srgb, var(--geo-accent) 4%, var(--geo-surface)); }
/* Inside the card the two option rows stop being boxes of their own: one hairline each. */
.rm-card .rm-rowcard, .rm-card .rm-toggle { background: transparent; border: 0; border-top: 1px solid var(--geo-border);
  border-radius: 0; padding: 16px 0 10px; margin-top: -6px; }
.rm-card .rm-toggle + .rm-card-foot, .rm-card .rm-rowcard + .rm-card-foot { margin-top: 0; }
.rm-card .rm-field input[type="url"], .rm-card .rm-field textarea { background: var(--geo-bg); }
.rm-card .rm-chip span { background: var(--geo-bg); transition: border-color .15s ease, background .15s ease, transform .15s ease; }
.rm-card .rm-chip span:hover { border-color: var(--geo-accent); }
.rm-card .rm-chip input:checked + span { background: var(--geo-accent-soft); transform: translateY(-1px); }
.rm-go { transition: transform .15s ease, box-shadow .15s ease, filter .15s ease; }
.rm-go:hover { transform: translateY(-1px); box-shadow: 0 8px 22px -10px var(--geo-accent); }
@media (max-width: 767px) {
  .rm-card-body { padding: 18px 16px 4px; }
  .rm-card-foot { padding: 16px; }
}

/* Past roasts panel. */
.rm-past { display: flex; flex-direction: column; gap: 12px; padding: 18px; border: 1px solid var(--geo-border);
  border-radius: 16px; background: var(--geo-surface); min-width: 0; }
.rm-past-head { display: flex; align-items: center; gap: 8px; }
.rm-past-head .rm-h2 { margin: 0; }
.rm-past-count { min-width: 22px; padding: 1px 7px; border-radius: 99px; font-size: 12px; font-weight: 700; text-align: center;
  color: var(--geo-text2); background: color-mix(in srgb, var(--geo-text) 8%, transparent); font-variant-numeric: tabular-nums; }
.rm-past .tone-good { --t: var(--geo-good); }
.rm-past .tone-teal { --t: var(--geo-accent); }
.rm-past .tone-warn { --t: var(--geo-warn); }
.rm-past .tone-bad  { --t: var(--geo-bad); }
.rm-past-hero, .rm-past-row { width: 100%; font: inherit; text-align: left; cursor: pointer; color: inherit;
  border: 1px solid var(--geo-border); background: var(--geo-bg);
  transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; }
.rm-past-hero:hover, .rm-past-row:hover { border-color: color-mix(in srgb, var(--t, var(--geo-accent)) 55%, var(--geo-border));
  transform: translateY(-1px); box-shadow: 0 10px 24px -18px rgba(0, 0, 0, .6); }
.rm-past-hero:focus-visible, .rm-past-row:focus-visible { outline: 2px solid var(--geo-accent); outline-offset: 2px; }
.rm-past-hero { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 14px; align-items: center;
  padding: 14px; border-radius: 14px;
  background: linear-gradient(135deg, color-mix(in srgb, var(--t) 10%, var(--geo-bg)), var(--geo-bg) 70%); }
/* The score ring: the verdict's colour, drawn to the score. */
.rm-ring { --p: 0; width: 64px; height: 64px; border-radius: 50%; display: grid; place-items: center; flex: 0 0 auto;
  background: conic-gradient(var(--t) calc(var(--p) * 1%), color-mix(in srgb, var(--geo-text) 10%, transparent) 0);
  -webkit-mask: radial-gradient(circle, transparent 0 25px, #000 26px); mask: radial-gradient(circle, transparent 0 25px, #000 26px);
  position: relative; }
.rm-past-hero .rm-ring { -webkit-mask: none; mask: none; }
.rm-past-hero .rm-ring::before { content: ""; position: absolute; inset: 6px; border-radius: 50%; background: var(--geo-bg); }
.rm-ring b { position: relative; font-family: var(--geo-font-head); font-size: 22px; font-weight: 700; color: var(--t);
  font-variant-numeric: tabular-nums; }
.rm-past-hero-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rm-past-tag { align-self: flex-start; font-size: 11.5px; font-weight: 700; letter-spacing: .02em; padding: 1px 8px; border-radius: 99px;
  color: var(--t); background: color-mix(in srgb, var(--t) 14%, transparent); margin-bottom: 2px; }
.rm-past-page { font-size: 15.5px; font-weight: 650; color: var(--geo-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rm-past-verdict { font-size: 14px; color: var(--geo-text2); }
.rm-past-when { font-size: 13px; color: var(--geo-muted); }
.rm-past-go { font-size: 22px; color: var(--geo-muted); transition: transform .18s ease, color .18s ease; }
.rm-past-hero:hover .rm-past-go { transform: translateX(3px); color: var(--t); }
.rm-delta { font-weight: 650; font-variant-numeric: tabular-nums; }
.rm-delta.is-up { color: var(--geo-good); }
.rm-delta.is-down { color: var(--geo-bad); }
.rm-delta.is-same { color: var(--geo-muted); }
.rm-past-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.rm-past-list li[hidden] { display: none; }
.rm-past-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 12px; align-items: center;
  padding: 10px 12px; border-radius: 12px; }
.rm-chipscore { width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center; font-weight: 700; font-size: 15px;
  color: var(--t); background: color-mix(in srgb, var(--t) 13%, transparent); font-variant-numeric: tabular-nums; }
.rm-past-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.rm-past-main b { color: var(--geo-text); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rm-past-main .rm-sub { font-size: 13px; color: var(--geo-muted); }
.rm-past-row .rm-delta { font-size: 13px; padding: 2px 8px; border-radius: 99px; background: color-mix(in srgb, currentColor 12%, transparent); }
.rm-past-toggle { align-self: flex-start; font-size: 14px; }
.rm-past-all { align-self: flex-start; font-size: 14px; font-weight: 600; color: var(--geo-accent); text-decoration: underline; text-underline-offset: 3px; }

/* The highlights popup: fades and lifts in, scrolls inside itself. */
#rm-pop { background: color-mix(in srgb, #000 55%, transparent); opacity: 0; transition: opacity .2s ease; }
#rm-pop.open { opacity: 1; }
.rm-pop { position: relative; max-width: 40rem; display: flex; flex-direction: column; gap: 16px; padding: 24px;
  transform: translateY(10px) scale(.985); transition: transform .25s cubic-bezier(.2, .8, .2, 1); }
#rm-pop.open .rm-pop { transform: none; }
.rm-pop-x { position: absolute; top: 12px; right: 12px; width: 36px; height: 36px; border-radius: 50%; border: 0; cursor: pointer;
  font-size: 22px; line-height: 1; color: var(--geo-text2); background: color-mix(in srgb, var(--geo-text) 7%, transparent); }
.rm-pop-x:hover { color: var(--geo-text); }
.rm-pop-eyebrow { margin: 0; padding-right: 40px; font-size: 13px; font-weight: 600; color: var(--geo-muted); }
.rm-pop .rm-n { font-size: clamp(52px, 10vw, 72px); }
.rm-pop .rm-oneliner { font-size: clamp(18px, 2.6vw, 22px); }
.rm-pop .rm-h2 { margin: 6px 0 0; }
.rm-pop-list { display: flex; flex-direction: column; gap: 10px; }
.rm-pop-card { display: flex; flex-direction: column; gap: 8px; padding: 14px; border: 1px solid var(--geo-border); border-radius: 12px;
  background: var(--geo-bg); }
.rm-pop-card .rm-f-head h4 { margin: 0; font-size: 15.5px; font-weight: 650; color: var(--geo-text); }
.rm-pop-card .rm-roast { font-size: 16px; }
.rm-pop-fix { padding: 10px 12px; border-radius: 10px; background: color-mix(in srgb, var(--geo-accent) 7%, transparent);
  border-left: 3px solid var(--geo-accent); }
.rm-pop-k { display: block; font-size: 12.5px; font-weight: 650; color: var(--geo-text2); margin-bottom: 2px; }
.rm-pop-fix p { margin: 0; color: var(--geo-text); }
.rm-pop-more { margin: 0; font-size: 14px; color: var(--geo-muted); }
.rm-pop .rm-working { padding-bottom: 0; }
.rm-pop-foot { position: sticky; bottom: -24px; margin: 4px -24px -24px; padding: 14px 24px;
  border-top: 1px solid var(--geo-border); background: var(--geo-surface); }
@media (max-width: 767px) {
  .rm-pop { padding: 18px; }
  .rm-pop-foot { bottom: -18px; margin: 4px -18px -18px; padding: 12px 18px; }
  .rm-pop-foot .rm-btn { flex: 1 1 auto; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
  #rm-pop, .rm-pop, .rm-past-hero, .rm-past-row, .rm-go { transition: none; }
}

/* ROAST MY SITE in the app's own type and lines (26 Sep, Edward: "the fonts seem different
   from the rest of the site ... needs to look high quality, layers, design, font sizes and
   flow like the rest of the site"). That answers the open question on the mono capitals: the
   roast now speaks like every other screen.
   - Labels: sentence case in the app's font, not spaced-out monospace capitals.
   - Headings: the heading font at 650, like every page's h1 and card title, not 700 system.
   - Sizes: 15px body like the app's cards (inputs stay 16px so phones don't zoom).
   - Lines: cards and panels use --geo-border like every other card. Controls follow the app's
     own inputs: --geo-border2 in light, --geo-border in dark (the global dark rule). */
#site-tab-conversion :is(.rm-eyebrow, .rm-getlabel, .rm-facts dt, .rm-rw-k, .rm-wstep-n, .rm-pill, .rm-price-tag) {
  font-family: var(--geo-font); text-transform: none; letter-spacing: -.003em; }
#site-tab-conversion :is(.rm-eyebrow, .rm-getlabel) { font-size: 13px; font-weight: 600; }
#site-tab-conversion :is(.rm-facts dt, .rm-rw-k, .rm-wstep-n) { font-size: 12.5px; font-weight: 600; }
#site-tab-conversion .rm-pill { font-size: 12.5px; font-weight: 600; }
#site-tab-conversion .rm-price-tag { font-variant-numeric: tabular-nums; }
#site-tab-conversion .rm-h2 { font-family: var(--geo-font-head); text-transform: none; letter-spacing: -.005em;
  font-size: 16px; font-weight: 650; color: var(--geo-text); }
#site-tab-conversion :is(.rm-h1, .rm-oneliner, .rm-f-head h3, .rm-score) { font-family: var(--geo-font-head); font-weight: 650; }
#site-tab-conversion .rm-h1 { font-size: clamp(24px, 4.2vw, 32px); line-height: 1.15; letter-spacing: -.015em; }
#site-tab-conversion .rm-oneliner { font-size: clamp(20px, 3vw, 26px); letter-spacing: -.01em; }
#site-tab-conversion .rm-f-head h3 { font-size: 16px; }
#site-tab-conversion .rm-mini .rm-f-head h3 { font-size: 15px; }
#site-tab-conversion :is(.rm-setup, .rm-work, .rm-report) { font-size: 15px; }
#site-tab-conversion .rm-field > :is(label, legend) { font-size: 14.5px; }
#site-tab-conversion .rm-hint { font-size: 13.5px; }
#site-tab-conversion :is(.rm-sub, .rm-gets, .rm-chip span) { font-size: 14.5px; }
#site-tab-conversion :is(.rm-finding, .rm-rewrite, .rm-details, .rm-opt-card, .rm-todo label, .rm-again, .rm-fixlist label,
  .rm-imp, .rm-modal, .rm-rowcard, .rm-toggle, .rm-past-row, .rm-biz-frame) { border-color: var(--geo-border); }
#site-tab-conversion .rm-details[open] summary, #site-tab-conversion .rm-mini + .rm-mini { border-color: var(--geo-border); }
html[data-theme="dark"] #site-tab-conversion :is(.rm-chip span, .rm-btn) { border-color: var(--geo-border); }
html[data-theme="dark"] #site-tab-conversion .rm-chip input:checked + span { border-color: var(--geo-accent); }

/* Roast reports on /reports (26 Sep): the audit table's look, with the app's tokens. */
.rp-roasts { margin-top: 32px; scroll-margin-top: 80px; }
.rp-roasts-h { margin: 0 0 4px; font-family: var(--geo-font-head); font-size: 20px; font-weight: 650; color: var(--geo-text); }
.rp-roasts-line { margin: 0 0 14px; font-size: 14px; color: var(--geo-muted); }
.rp-roasts-table td { font-size: 14px; color: var(--geo-text); vertical-align: middle; }
.rp-sub { margin-top: 2px; font-size: 12.5px; color: var(--geo-muted); overflow-wrap: anywhere; }
.rp-page { color: var(--geo-text2); overflow-wrap: anywhere; }
.rp-score, .rp-date { font-variant-numeric: tabular-nums; white-space: nowrap; }
.rp-date { color: var(--geo-text2); }
.rp-open { display: inline-block; white-space: nowrap; font-size: 14px; font-weight: 600; color: var(--geo-accent) !important; text-decoration: underline; text-underline-offset: 3px; }
.rp-none { margin: 0; padding: 16px 24px; font-size: 14px; color: var(--geo-muted); }
.rp-acts { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
.rp-dl { font-weight: 500; color: var(--geo-text2) !important; }

/* ══════════════════════════════════════════════════════════════════════════════
   THE VIOLET LAYER (26 Sep 2026)

   Edward: "I like the mixture of the purple and the green ... add a layer of it, a strip of
   gloss gradient ... and maybe some places use the colour again like 5-10% so it's giving the
   more coloured feel beyond the green and dark bg ... the light mode is bad, the green is
   awful ... the theme is not good quality in light mode." His references: a header gradient
   #00000D -> #060241 -> #241F3C -> #591361 -> #8B0A85 -> #A10297, and purples around #6C459F.

   What it does, and what it deliberately doesn't:
     - Teal stays the ONE action. Violet is the second voice: it takes over from the old
       lavender (--geo-second, used in 62 places for links, marks and the second chart line),
       so the colour spreads evenly without touching any markup.
     - One glossy strip across the top of the app: teal flowing into violet and magenta.
     - A faint violet wash (6-8%) at the top of the page and the sidebar. Never on cards.
     - Light mode: a cleaner teal (the old #00696a read as murky green) and a ground with a
       breath of violet instead of flat grey.
   Contrast, measured: light teal #0B7F7B 4.84:1 under white text, 4.53:1 as text on the
   ground; light violet #6B3FA0 7.38:1 on white; dark violet #B38BE6 6.57:1 on the navy.
   ══════════════════════════════════════════════════════════════════════════════ */
:root {
  --geo-violet:      #6B3FA0;
  --geo-violet-deep: #4E2C7A;
  --geo-violet-soft: rgba(107, 63, 160, .10);
  --geo-magenta:     #A10297;
  /* The strip: our teal into Edward's violets and magenta. */
  --geo-aurora: linear-gradient(90deg, #00B8B5 0%, #2F6FB8 22%, #4B3A9E 42%, #6C459F 62%, #8B0A85 84%, #A10297 100%);

  /* Light, rebuilt: a ground with a breath of violet, not flat grey. */
  --geo-bg:       #F6F5FB;
  --geo-surface2: #EEECF5;
  --geo-border:   #E2DFEC;
  --geo-border2:  #A9A4BA;
  --geo-muted:    #5A6070;
  --geo-accent:   #0B7F7B;
  --geo-accent-soft: rgba(11, 127, 123, .10);

  --geo-second:      var(--geo-violet);
  --geo-second-ink:  var(--geo-violet-deep);
  --geo-second-deep: var(--geo-violet-deep);
  --geo-info:        var(--geo-violet);
}
html[data-theme="dark"] {
  --geo-violet:      #B38BE6;
  --geo-violet-deep: #6C459F;
  --geo-violet-soft: rgba(140, 90, 205, .14);
  --geo-second:      var(--geo-violet);
  --geo-second-ink:  #D6C2F2;
  --geo-second-deep: var(--geo-violet-deep);
  --geo-info:        var(--geo-violet);
}

/* The strip. Fixed to the top of the window, over the phone header too; it never takes a
   click. A top highlight gives it the gloss. */
body::before {
  content: ""; position: fixed; top: 0; left: 0; right: 0; height: 4px; z-index: 10001; pointer-events: none;
  background-image: linear-gradient(to bottom, rgba(255, 255, 255, .5), rgba(255, 255, 255, 0) 75%), var(--geo-aurora);
  box-shadow: 0 1px 12px rgba(108, 69, 159, .45);
}
/* ...and its light falling a little way down the page: the same colours, blurred and faint. */
body::after {
  content: ""; position: fixed; top: 0; left: 0; right: 0; height: 90px; z-index: 0; pointer-events: none;
  background-image: var(--geo-aurora); opacity: .07;
  -webkit-mask-image: linear-gradient(to bottom, #000, transparent); mask-image: linear-gradient(to bottom, #000, transparent);
}
html[data-theme="dark"] body::after { opacity: .11; }

/* The wash: a little violet where the page begins, a little teal opposite, then the ground. */
body {
  background-image:
    radial-gradient(1100px 420px at 100% -120px, var(--geo-violet-soft), transparent 70%),
    radial-gradient(900px 360px at 0% -160px, var(--geo-accent-soft), transparent 70%);
  background-repeat: no-repeat;
}
.sidebar { background-image: radial-gradient(420px 260px at 0% 0%, var(--geo-violet-soft), transparent 75%); }

/* The chosen item in the sidebar carries the same two voices: a violet wash, a teal mark. */
html[data-theme] .sidebar a.bg-gray-700, html:not([data-theme]) .sidebar a.bg-gray-700 {
  background-color: color-mix(in srgb, var(--geo-violet) 13%, transparent) !important;
  background-image: linear-gradient(90deg, color-mix(in srgb, var(--geo-violet) 10%, transparent), transparent) !important;
  box-shadow: inset 3px 0 0 var(--geo-accent);
  color: var(--geo-text) !important;
}
html[data-theme] .sidebar a.bg-gray-700 svg, html:not([data-theme]) .sidebar a.bg-gray-700 svg { color: var(--geo-second) !important; }

/* Section eyebrows (the small capitals over a heading) speak in the second voice. */
.gs-eyebrow, .rm-eyebrow, .cw-door-eyebrow, .pw-eyebrow { color: var(--geo-second) !important; }

@media (prefers-reduced-motion: reduce) { body::before { box-shadow: none; } }

/* ── Light mode at the dark mode's standard (26 Sep 2026) ─────────────────────────────
   Edward: "the dark mode looks awesome, how can we get the same quality for the light mode"
   and "that button colour green, is that the best colour?". Dark mode gets its quality from
   layered surfaces, soft light and the bright logo teal. Light mode had flat grey, rows painted
   as panels and a heavy dark-teal button. So:
     1. THE BUTTON FILL is the logo teal with dark ink in both themes (6.9:1), the same button
        that works in dark mode. The deeper teal stays for text and links, where it must read on
        white (--geo-accent). Compared side by side with violet and ink-navy: this one is the brand.
     2. ROWS ARE NOT PANELS. The light rule that turns dark slabs white matched the class
        "hover:bg-gray-700/30" too, so every table row was painted all the time. A class that
        only applies on hover is left alone; hover gets a breath of violet.
     3. DEPTH FROM LIGHT, NOT LINES: cards lift with a soft violet-tinted shadow. */
:root { --geo-fill: #00B8B5; --geo-fill-ink: #04201f; }
html[data-theme="dark"] { --geo-fill: var(--geo-accent); --geo-fill-ink: var(--geo-accent-ink); }
html:not(#geo-no-such-id) :is(
.geo-btn-primary,
a[class*="bg-green-5"]:not([style*="width:"]), a[class*="bg-green-6"]:not([style*="width:"]), a[class*="bg-emerald-6"]:not([style*="width:"]), a[class*="bg-teal-6"]:not([style*="width:"]),
button[class*="bg-green-5"]:not([style*="width:"]), button[class*="bg-green-6"]:not([style*="width:"]), button[class*="bg-emerald-6"]:not([style*="width:"]),
input[type="submit"][class*="bg-green-"]:not([style*="width:"]),
a[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]),
a[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]), button[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]),
#ob-card .ob-grad, .rm-go, .rm-btn.rm-solid, #support-modal .sup-send, .ix-send,
.cw-start, .cw-open.is-primary, .cw-door-btn, #gs-academy-modal .gs-action-btn:not(.gs-secondary):not(.gs-ghost),
.pw .pw-primary, .pw form > button[type="submit"]
) {
  background-color: var(--geo-fill) !important; background-image: none !important;
  color: var(--geo-fill-ink) !important;
  border-color: color-mix(in oklab, var(--geo-fill) 72%, #000) !important;
}
html:not(#geo-no-such-id) :is(
.geo-btn-primary:hover,
a[class*="bg-green-5"]:not([style*="width:"]):hover,
a[class*="bg-green-6"]:not([style*="width:"]):hover,
a[class*="bg-emerald-6"]:not([style*="width:"]):hover,
a[class*="bg-teal-6"]:not([style*="width:"]):hover,
button[class*="bg-green-5"]:not([style*="width:"]):hover,
button[class*="bg-green-6"]:not([style*="width:"]):hover,
button[class*="bg-emerald-6"]:not([style*="width:"]):hover,
input[type="submit"][class*="bg-green-"]:not([style*="width:"]):hover,
a[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]):hover,
button[class*="bg-blue-6"]:not([class*="/"]):not([style*="width:"]):hover,
a[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]):hover,
button[class*="bg-blue-7"]:not([class*="/"]):not([style*="width:"]):hover,
#ob-card .ob-grad:hover,
.rm-go:hover,
.rm-btn.rm-solid:hover,
#support-modal .sup-send:hover,
.ix-send:hover,
.cw-start:hover,
.cw-open.is-primary:hover,
.cw-door-btn:hover,
#gs-academy-modal .gs-action-btn:not(.gs-secondary):not(.gs-ghost):hover,
.pw .pw-primary:hover,
.pw form > button[type="submit"]:hover
) {
  background-color: color-mix(in oklab, var(--geo-fill) 88%, #fff) !important;
}
html:not([data-theme="dark"]) .main-content [class*="hover:bg-gray-"]:not([class^="bg-gray-"]):not([class*=" bg-gray-"]):not(:hover) {
  background-color: transparent !important;
}
html:not([data-theme="dark"]) .main-content tr[class*="hover:bg-"]:hover,
html:not([data-theme="dark"]) .main-content [class*="hover:bg-gray-"]:not([class^="bg-gray-"]):not([class*=" bg-gray-"]):hover {
  background-color: color-mix(in srgb, var(--geo-violet) 5%, transparent) !important;
}
html:not([data-theme="dark"]) .main-content thead { background-color: #FAF9FD !important; }
html:not([data-theme="dark"]) .main-content th { color: var(--geo-muted) !important; }
html:not([data-theme="dark"]) .main-content :is(.rounded-xl, .rounded-2xl)[class*="bg-gray-8"]:not([style*="width:"]),
html:not([data-theme="dark"]) .main-content :is(.rounded-xl, .rounded-2xl)[class*="bg-white"]:not([style*="width:"]) {
  box-shadow: 0 1px 2px rgba(23, 16, 56, .04), 0 8px 24px -14px rgba(60, 40, 120, .18);
}

/* ── Slick, not 1980 (26 Sep 2026) ─────────────────────────────────────────────────────
   Edward: "make it slick and not 1980 design". What dated it most: 470 labels in spaced-out
   capitals ("WELCOME BACK, EDWARD", "WHAT TO DO", "DO THIS NOW", "AGENCY"), text triangles for
   toggles, and hard focus outlines. Modern product UI (Linear, Stripe, Vercel) speaks in quiet
   sentence case, uses real chevrons and soft focus rings. One rule each, in both themes.
   The roast used to keep its mono capitals; Edward asked for it to match the app (26 Sep),
   so it's under the same rule now. */
:is(.main-content, .sidebar, #geo-switch, #gs-academy-modal, #ob-card, #support-modal) :is(
  .uppercase, [class*="tracking-wide"], .cv-eyebrow, .cv-state, .cb-group-head h2, .gs-eyebrow, .gs-steps-h,
  .gs-stage-h, .gs-upnext .gs-un-l, .cw-sec-h, .cw-door-eyebrow, .pw-eyebrow, .pw h3, .site-sections-group
):not([class*="text-[9px]"]) {
  text-transform: none !important;
  letter-spacing: -.003em !important;
  font-size: max(12.5px, .92em) !important;
  font-weight: 600 !important;
}
#gs-academy-modal .gs-stage-h, #gs-academy-modal .gs-upnext .gs-un-l { font-size: 12.5px !important; }
/* The chat panel's and the intake's small labels, wherever they sit. */
.gfd-kicker, .ix-eyebrow { text-transform: none !important; letter-spacing: -.003em !important; font-size: 12.5px !important; font-weight: 600 !important; }
/* Labels inside small shapes (the set-up ring) keep their size. */
#ob-card [class*="text-[9px]"].uppercase { text-transform: none !important; letter-spacing: 0 !important; font-size: 10px !important; }

/* Toggles: a drawn chevron, not a ▼ character. The span keeps its own rotation. */
.ob-chev, .ol-chev {
  font-size: 0 !important; width: 18px; height: 18px; display: inline-grid !important; place-items: center;
  transition: transform var(--geo-dur) var(--geo-ease);
}
.ob-chev::before, .ol-chev::before {
  content: ""; width: 7px; height: 7px; margin-top: -3px;
  border-right: 1.75px solid currentColor; border-bottom: 1.75px solid currentColor;
  transform: rotate(45deg); border-radius: 1px;
}

/* Fields: a soft ring on focus, the border in the accent. */
:is(.main-content, #support-modal, #ob-card) :is(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]), select, textarea):focus {
  outline: none !important;
  border-color: var(--geo-accent) !important;
  box-shadow: 0 0 0 3px var(--geo-accent-soft) !important;
}

/* Small status pills: soft, sentence case, no shouting. */
.main-content .rounded-full:is([class*="text-xs"], [class*="text-[10px]"], [class*="text-[11px]"]) {
  letter-spacing: 0 !important; font-weight: 600;
}

/* ── Billing & usage (26 Sep 2026) ────────────────────────────────────────────────────
   Edward: "this page needs to make sense and show usage", with OpenRouter's Activity page
   as the model. Four figures with a comparison, credits spent each day by feature, where
   they went and for which client, then the activity. One colour per feature: none of them
   is pass-green, fail-red or warning-amber (test_chart_colours). */
:root {
  --geo-series-audits:   #0B7F7B;
  --geo-series-pages:    #6B3FA0;
  --geo-series-fixes:    #2F6FB8;
  --geo-series-roasts:   #A10297;
  --geo-series-chat:     #3F8FB0;
  --geo-series-research: #5B6B8C;
  --geo-series-services: #7A5C3E;
  --geo-series-other:    #A9A4BA;
}
html[data-theme="dark"] {
  --geo-series-audits:   #00B8B5;
  --geo-series-pages:    #B38BE6;
  --geo-series-fixes:    #6FA8F0;
  --geo-series-roasts:   #E07AD8;
  --geo-series-chat:     #8CC6DE;
  --geo-series-research: #A5B4D4;
  --geo-series-services: #C9A27E;
  --geo-series-other:    #6B6B78;
}
.bu { margin-bottom: 2rem; }
.bu-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.bu-range { display: inline-flex; gap: 2px; padding: 3px; margin-bottom: 1rem; border: 1px solid var(--geo-border); border-radius: 10px; background: var(--geo-surface); }
.bu-range-btn { padding: 6px 12px; border-radius: 7px; font-size: 13px; font-weight: 600; color: var(--geo-muted); text-decoration: none; }
.bu-range-btn:hover { color: var(--geo-text); }
.bu-range-btn.is-on { background: var(--geo-accent-soft); color: var(--geo-accent); }
.bu-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
@media (max-width: 1024px) { .bu-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.bu-card, .bu-box { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: 12px; padding: 16px 18px; min-width: 0; }
.bu-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.bu-card-l { font-size: 13px; font-weight: 600; color: var(--geo-muted); }
.bu-card-n { margin-top: 6px; font-size: 28px; font-weight: 700; line-height: 1.1; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.bu-card-s { margin-top: 6px; font-size: 12.5px; color: var(--geo-muted); }
.bu-vs.is-up::before, .bu-vs.is-down::before { content: ""; display: inline-block; width: 0; height: 0; margin-right: 5px; vertical-align: 1px;
  border-left: 4px solid transparent; border-right: 4px solid transparent; }
.bu-vs.is-up::before { border-bottom: 6px solid currentColor; }
.bu-vs.is-down::before { border-top: 6px solid currentColor; }
.bu-spark { width: 84px; height: 28px; flex: none; }
.bu-spark polyline { fill: none; stroke: var(--geo-second); stroke-width: 1.6; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
.bu-box { margin-bottom: 12px; }
.bu-h { margin: 0 0 12px; font-size: 16px; font-weight: 650; color: var(--geo-text); }
.bu-h-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
/* An inline link inside a sentence. The app had no generic one - the only two in the whole
   codebase were mine, styled `underline`, which renders in the browser's default purple. Teal is
   the one action colour in this palette, so a purple link is the one thing on the page claiming
   to be an action while not looking like one. Uses the token, so it follows both themes. */
.geo-inline-link { color: var(--geo-accent); text-decoration: underline; text-underline-offset: 3px; }
.geo-inline-link:hover { text-decoration-thickness: 2px; }

.bu-link { font-size: 13px; font-weight: 600; color: var(--geo-accent); text-decoration: underline; text-underline-offset: 3px; }
.bu-empty, .bu-note { margin: 0; font-size: 13.5px; color: var(--geo-muted); }
.bu-note { margin-top: 10px; }
.bu-chart { position: relative; height: 240px; }
.bu-two { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.bu-two .bu-box { margin-bottom: 12px; }
@media (max-width: 800px) { .bu-two { grid-template-columns: 1fr; } }
.bu-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.bu-li-top { display: flex; align-items: center; gap: 8px; font-size: 14px; }
.bu-li-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--geo-text); font-weight: 550; }
.bu-li-sub { font-size: 12.5px; color: var(--geo-muted); white-space: nowrap; }
.bu-li-n { font-weight: 650; font-variant-numeric: tabular-nums; color: var(--geo-text); min-width: 3ch; text-align: right; }
.bu-rank { width: 18px; font-size: 12.5px; color: var(--geo-muted); font-variant-numeric: tabular-nums; }
.bu-bar { margin-top: 6px; height: 6px; border-radius: 99px; background: var(--geo-surface2); overflow: hidden; }
.bu-bar > span { display: block; height: 100%; border-radius: 99px; }
.bu-dot { display: inline-block; flex: none; width: 9px; height: 9px; border-radius: 3px; margin-right: 6px; vertical-align: 0; }
.bu-f-audits { background: var(--geo-series-audits); }
.bu-f-pages { background: var(--geo-series-pages); }
.bu-f-fixes { background: var(--geo-series-fixes); }
.bu-f-roasts { background: var(--geo-series-roasts); }
.bu-f-chat { background: var(--geo-series-chat); }
.bu-f-research { background: var(--geo-series-research); }
.bu-f-services { background: var(--geo-series-services); }
.bu-f-other { background: var(--geo-series-other); }
.bu-people { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px 24px; }
.bu-people li { display: flex; gap: 8px; font-size: 14px; padding: 6px 0; border-bottom: 1px solid var(--geo-border); }
/* The rows that make a list add up ("No client", "3 other clients"): quieter than a name. */
.bu-li-muted .bu-li-name, .bu-people .bu-li-muted .bu-li-name { color: var(--geo-muted); font-weight: 500; }
.bu-price-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); gap: 12px; }
.bu-price-card { padding: 12px 14px; border: 1px solid var(--geo-border); border-radius: 10px; background: var(--geo-surface2); }
.bu-price-h { margin: 0 0 6px; display: flex; align-items: center; gap: 6px; font-size: 14.5px; font-weight: 650; color: var(--geo-text); }
.bu-price-body { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
/* Your partnership terms (billing): a group's lines stack with a little air; the note under the groups. */
.pt-card .bu-price-body + .bu-price-body { margin-top: 8px; }
.pt-note { margin-top: 12px; }
.pt-list { margin: 4px 0 0; padding-left: 18px; list-style: disc; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
.bu-plan .bu-li-name { display: inline-flex; align-items: center; gap: 4px; overflow: visible; }
.bu-table-wrap { overflow-x: auto; margin: 0 -18px; padding: 0 18px; }
.bu-table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.bu-table th { text-align: left; font-size: 12.5px; font-weight: 600; color: var(--geo-muted); padding: 8px 10px 8px 0; border-bottom: 1px solid var(--geo-border); white-space: nowrap; }
.bu-table td { padding: 10px 10px 10px 0; border-bottom: 1px solid var(--geo-border); color: var(--geo-text); vertical-align: top; }
.bu-table tr:last-child td { border-bottom: 0; }
.bu-num { text-align: right !important; font-variant-numeric: tabular-nums; white-space: nowrap; }
.bu-num.is-in { color: var(--geo-accent); font-weight: 600; }
.bu-nowrap { white-space: nowrap; }
@media (max-width: 640px) {
  .bu-card { padding: 14px; }
  .bu-card-n { font-size: 24px; }
  .bu-spark { width: 64px; }
  .bu-table .bu-c-who, .bu-table .bu-c-bal { display: none; }
}
/* Group headings: "Your earnings", "Plan and settings". */
.geo-group-h { margin: 2.25rem 0 .25rem; font-size: 19px; font-weight: 650; color: var(--geo-text); }
.geo-group-intro { margin: 0 0 1rem; font-size: 14px; color: var(--geo-muted); }
.geo-group-h + .bg-white, .geo-group-h + div { margin-top: .75rem; }
.bu .bu-range-btn { color: var(--geo-muted) !important; text-decoration: none !important; }
.bu .bu-range-btn:hover { color: var(--geo-text) !important; }
.bu .bu-range-btn.is-on { color: var(--geo-accent) !important; }
.bu .bu-link { color: var(--geo-accent) !important; }
@media (max-width: 640px) { .bu-spark { display: none; } }
.bu-sub-client { display: none; }
@media (max-width: 640px) {
  /* A phone reads date, what (with the client under it) and credits. */
  .bu-table .bu-c-client { display: none; }
  .bu-sub-client { display: block; margin-top: 2px; font-size: 12.5px; color: var(--geo-muted); }
  .bu-table td:first-child { font-size: 12.5px; color: var(--geo-muted); }
}

/* Tooltips (public/js/geo-tip.js): a small ⓘ beside a label; one bubble, kept on screen. */
.geo-tip { display: inline-grid; place-items: center; width: 16px; height: 16px; margin-left: 5px; padding: 0; vertical-align: -2px;
  border: 1.25px solid currentColor; border-radius: 50%; background: transparent; color: var(--geo-muted);
  font: 700 10px/1 ui-serif, Georgia, serif; font-style: italic; cursor: help; opacity: .85; }
.geo-tip:hover, .geo-tip:focus-visible, .geo-tip[aria-expanded="true"] { color: var(--geo-accent); opacity: 1; outline: none; }
.geo-tip:focus-visible { box-shadow: 0 0 0 3px var(--geo-accent-soft); }
/* A bigger tap area on a phone without a bigger mark. */
@media (pointer: coarse) { .geo-tip { position: relative; } .geo-tip::before { content: ""; position: absolute; inset: -12px; } }
.geo-tip-bubble { position: absolute; z-index: 10050; padding: 10px 12px; border-radius: 10px; font-size: 13px; line-height: 1.45; font-weight: 450;
  background: var(--geo-text); color: var(--geo-surface); box-shadow: 0 8px 24px rgba(0, 0, 0, .22); pointer-events: none; }

/* Billing & usage: whose wallet, and the filter row. */
.bu-wallet { display: inline-flex; align-items: center; gap: 6px; margin: 0 0 6px; padding: 3px 10px; border-radius: 99px;
  font-size: 12.5px; font-weight: 650; color: var(--geo-second-ink, var(--geo-second)); background: var(--geo-violet-soft); }
.bu-wallet-note { margin: 0 0 12px; font-size: 13px; color: var(--geo-muted); }
.bu-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin-bottom: 1rem; }
.bu-controls .bu-range { margin-bottom: 0; }
.bu-filter { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.bu-filter select { min-height: 36px; max-width: 220px; padding: 6px 30px 6px 10px; border: 1px solid var(--geo-border); border-radius: 8px;
  background-color: var(--geo-surface); color: var(--geo-text); font-size: 13.5px; }
.bu-filter .bu-apply { min-height: 36px; padding: 6px 14px; border: 1px solid var(--geo-border); border-radius: 8px; background: var(--geo-surface);
  color: var(--geo-text); font-size: 13.5px; font-weight: 600; cursor: pointer; }
.bu-filter .bu-apply:hover { border-color: var(--geo-accent); color: var(--geo-accent); }
.bu-filter-on { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; margin: -4px 0 12px; font-size: 13.5px; color: var(--geo-text); }
.bu-filter-on .bu-empty { font-size: 13px; }
@media (max-width: 640px) { .bu-filter, .bu-filter select { width: 100%; max-width: none; } .bu-filter select { flex: 1 1 100%; } }
/* The bits that say the filter needs no script: the button stays for keyboard and no-JS. */
/* The phone rule that makes every button 44px tall must not stretch the ⓘ: its tap area is the ::before. */
html .main-content button.geo-tip.geo-tip:not(.geo-chip), .geo-tip { width: 16px !important; height: 16px !important; min-width: 0 !important; min-height: 0 !important; padding: 0 !important; line-height: 1 !important; }

/* Analytics: the header row and the top section (26 Sep). */
.ai-controls { align-items: flex-end; }
.ai-dates .ai-date { display: inline-flex; flex-direction: column; gap: 2px; font-size: 12px; color: var(--geo-muted); font-weight: 600; }
.ai-dates input[type="date"] { min-height: 36px; padding: 5px 8px; border: 1px solid var(--geo-border); border-radius: 8px; background: var(--geo-surface); color: var(--geo-text); font-size: 13.5px; }
.ai-export { margin-left: auto; }
.ai-top { margin-bottom: 1.5rem; }
.ai-intro { margin: -6px 0 12px; }
.ai-attention .ai-group { border-top: 1px solid var(--geo-border); padding: 10px 0; }
.ai-attention .ai-group:first-of-type { border-top: 0; padding-top: 0; }
.ai-attention summary { cursor: pointer; font-size: 14px; font-weight: 600; color: var(--geo-text); list-style: none; }
.ai-attention summary::-webkit-details-marker { display: none; }
.ai-attention summary::after { content: ""; display: inline-block; width: 6px; height: 6px; margin-left: 8px; vertical-align: 3px;
  border-right: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor; transform: rotate(45deg); transition: transform .15s; }
.ai-attention details[open] > summary::after { transform: rotate(-135deg); vertical-align: 0; }
.ai-rows { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ai-rows li { display: flex; align-items: baseline; gap: 10px; font-size: 13.5px; }
.ai-rows .bu-link { font-size: 12.5px; white-space: nowrap; }
.ai-more { display: inline-block; margin-top: 8px; }
@media (max-width: 640px) { .ai-export { margin-left: 0; } .ai-dates .ai-date { flex: 1 1 40%; } .ai-dates input[type="date"] { width: 100%; } }
/* The range switch keeps its own colours wherever it sits (Analytics has no .bu around it). */
.bu-range .bu-range-btn { color: var(--geo-muted) !important; text-decoration: none !important; }
.bu-range .bu-range-btn:hover { color: var(--geo-text) !important; }
.bu-range .bu-range-btn.is-on { color: var(--geo-accent) !important; }
.bu-filter-on .bu-link, .ai-rows .bu-link { color: var(--geo-accent) !important; }
@media (max-width: 640px) {
  /* A phone shows the whole client name, with the note and the link under it. */
  .ai-rows li { flex-wrap: wrap; gap: 2px 10px; }
  .ai-rows .bu-li-name { flex: 1 1 100%; white-space: normal; }
}
.ai-rows { max-height: 320px; overflow-y: auto; }

/* ═══ A CLIENT'S HOME (26 Sep 2026) ══════════════════════════════════════════════════
   Edward: "feel like home ... gamified and simplified". Calm cards on the app's tokens, one
   accent for the thing to do, soft colour for progress, nothing shouting. Phone first. */
.ch { max-width: 60rem; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; font-size: 15px; color: var(--geo-text); }
.ch-head { padding: 4px 2px 6px; }
.ch-h1 { margin: 0; font-family: var(--geo-font-head); font-size: clamp(24px, 4.4vw, 32px); font-weight: 650; letter-spacing: -.015em; line-height: 1.15; }
.ch-line { margin: 8px 0 0; font-size: 16px; line-height: 1.5; color: var(--geo-text2); max-width: 40em; }
.ch-site { margin: 6px 0 0; font-size: 13.5px; color: var(--geo-muted); }
.ch-card { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: 16px; padding: 18px 18px 16px; min-width: 0; }
.ch-card-h { margin: 0 0 8px; font-family: var(--geo-font-head); font-size: 17px; font-weight: 650; color: var(--geo-text); display: flex; align-items: center; gap: 8px; }
.ch-card-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px 14px; flex-wrap: wrap; }
.ch-sub { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
.ch-big { margin: 2px 0 4px; font-family: var(--geo-font-head); font-size: 24px; font-weight: 650; }
.ch-ok { margin: 8px 0; font-size: 14px; font-weight: 600; color: var(--geo-good-ink, var(--geo-accent)); }
.ch-count { display: inline-grid; place-items: center; min-width: 24px; height: 24px; padding: 0 7px; border-radius: 99px;
  background: var(--geo-accent); color: var(--geo-accent-ink); font-size: 13px; font-weight: 700; }
.ch-msg { margin: 0; padding: 12px 14px; border-radius: 12px; font-size: 14px; border: 1px solid var(--geo-border); background: var(--geo-surface2); }
.ch-msg.is-ok { border-color: color-mix(in srgb, var(--geo-good) 40%, transparent); }
.ch-msg.is-bad { border-color: color-mix(in srgb, var(--geo-bad) 40%, transparent); }
.ch-waiting { border-color: color-mix(in srgb, var(--geo-accent) 45%, var(--geo-border)); background: color-mix(in srgb, var(--geo-accent) 5%, var(--geo-surface)); }
.ch-waiting.is-empty { border-color: var(--geo-border); background: var(--geo-surface); }
.ch-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; }
.ch-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 10px 0; border-top: 1px solid var(--geo-border); }
.ch-row:first-child { border-top: 0; }
.ch-row-t { flex: 1 1 14rem; min-width: 0; font-size: 14.5px; line-height: 1.45; overflow-wrap: anywhere; }
.ch-dot { width: 8px; height: 8px; border-radius: 99px; flex: none; background: var(--geo-accent); }
.ch-dot-fix { background: var(--geo-warn); } .ch-dot-note { background: var(--geo-muted); }
.ch-tag { font-size: 12.5px; font-weight: 600; padding: 3px 9px; border-radius: 99px; background: var(--geo-surface2); color: var(--geo-text2); white-space: nowrap; }
.ch-btn { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; padding: 0 16px; border-radius: 12px;
  font: inherit; font-size: 14.5px; font-weight: 600; text-decoration: none; cursor: pointer; border: 1px solid var(--geo-border2);
  background: var(--geo-surface); color: var(--geo-text) !important; }
.ch-btn:hover { border-color: var(--geo-accent); }
.ch-btn-sm { min-height: 38px; padding: 0 12px; font-size: 13.5px; border-radius: 10px; }
.ch-btn-quiet { border-color: transparent; background: transparent; color: var(--geo-text2) !important; }
.ch-btn-go { border: 0; background: var(--geo-accent); color: var(--geo-accent-ink) !important; margin-top: 12px; width: 100%; }
.ch-btn-go:hover { filter: brightness(1.06); }
.ch-btn[disabled] { opacity: .6; cursor: default; }
.ch-link { display: inline-block; margin-top: 10px; padding: 0; border: 0; background: none; font: inherit; font-size: 14px; font-weight: 600;
  color: var(--geo-accent) !important; text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.ch-grid { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: 14px; }
.ch-side { display: flex; flex-direction: column; gap: 14px; }
@media (max-width: 820px) { .ch-grid { grid-template-columns: 1fr; } }
.ch-score-row { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin: 6px 0 4px; }
.ch-score-side { flex: 1 1 14rem; min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.ch-ring { --ch-c: var(--geo-accent); width: 112px; height: 112px; flex: none; border-radius: 50%; display: grid; place-items: center;
  background: conic-gradient(var(--ch-c) calc(var(--ch-p) * 1%), var(--geo-surface2) 0); }
.ch-ring::before { content: ""; grid-area: 1 / 1; width: 88px; height: 88px; border-radius: 50%; background: var(--geo-surface); }
.ch-ring-n { grid-area: 1 / 1; position: relative; font-family: var(--geo-font-head); font-size: 30px; font-weight: 700; letter-spacing: -.02em; }
.ch-ring-n small { font-size: 15px; font-weight: 600; color: var(--geo-muted); margin-left: 1px; }
.ch-ring.ch-band-good { --ch-c: var(--geo-good); } .ch-ring.ch-band-warn { --ch-c: var(--geo-warn); } .ch-ring.ch-band-low { --ch-c: var(--geo-accent); }
.ch-delta { margin: 0; font-size: 14px; font-weight: 600; color: var(--geo-text2); }
.ch-delta.is-up { color: var(--geo-good-ink, var(--geo-good)); } .ch-delta.is-down { color: var(--geo-text2); }
.ch-mini-h { margin: 14px 0 6px; font-size: 13px; font-weight: 600; color: var(--geo-muted); }
.ch-engines { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.ch-engines li { display: grid; grid-template-columns: 6.5rem minmax(0, 1fr); gap: 4px 10px; align-items: center; font-size: 14px; }
.ch-eng-n { grid-column: 2; font-size: 12.5px; color: var(--geo-muted); }
.ch-bar { display: block; height: 8px; border-radius: 99px; background: var(--geo-surface2); overflow: hidden; }
.ch-bar > span { display: block; height: 100%; border-radius: 99px; background: var(--geo-accent); }
.ch-bar-lg { height: 10px; margin: 6px 0 12px; }
.ch-bar .ch-band-good { background: var(--geo-good); } .ch-bar .ch-band-warn { background: var(--geo-warn); } .ch-bar .ch-band-low { background: var(--geo-accent); }
.ch-band-good-t { color: var(--geo-good-ink, var(--geo-good)); } .ch-band-warn-t { color: var(--geo-warn-ink, var(--geo-warn)); }
.ch-ms { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(13.5rem, 1fr)); gap: 8px; }
.ch-ms li { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--geo-border);
  font-size: 14px; color: var(--geo-muted); }
.ch-ms-mark { width: 22px; height: 22px; flex: none; border-radius: 50%; border: 2px solid var(--geo-border2); display: grid; place-items: center; }
.ch-ms li.is-done { color: var(--geo-text); background: color-mix(in srgb, var(--geo-good) 8%, var(--geo-surface)); border-color: color-mix(in srgb, var(--geo-good) 30%, var(--geo-border)); }
.ch-ms li.is-done .ch-ms-mark { border-color: var(--geo-good); background: var(--geo-good); }
.ch-ms li.is-done .ch-ms-mark::after { content: ""; width: 6px; height: 10px; margin-top: -2px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }
.ch-ms li.is-next { color: var(--geo-text); border-style: dashed; border-color: var(--geo-accent); }
.ch-ms-next { margin-top: 10px; }
.ch-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin: 12px 0 4px; }
.ch-stat { padding: 10px 6px; border-radius: 12px; background: var(--geo-surface2); text-align: center; display: flex; flex-direction: column; gap: 2px; }
.ch-stat-n { font-family: var(--geo-font-head); font-size: 22px; font-weight: 650; }
.ch-stat-l { font-size: 12.5px; color: var(--geo-muted); }
@media (max-width: 420px) { .ch-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.ch-running { display: flex; align-items: center; gap: 14px; }
.ch-spin { width: 28px; height: 28px; flex: none; border-radius: 50%; border: 3px solid var(--geo-surface2); border-top-color: var(--geo-accent); animation: ch-spin 1s linear infinite; }
@keyframes ch-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .ch-spin { animation: none; } }
.ch-more > summary { cursor: pointer; font-weight: 600; font-size: 14.5px; color: var(--geo-text2); min-height: 32px; }
.ch-more[open] > summary { margin-bottom: 10px; }
.ch-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }

/* ── The growth plan on a client's home (26 Sep): _plan.php ─────────────────────── */
.gp { display: flex; flex-direction: column; gap: 12px; border-color: color-mix(in srgb, var(--geo-accent) 30%, var(--geo-border)); }
/* Which website the plan is for: the design-system chip, one per website, wraps on a phone. */
.gp-sites { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 4px 0 8px; }
.gp-sites-l { font-size: 13px; color: var(--geo-muted); }
.gp-site-chip { max-width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-decoration: none; }
.gp-h3 { margin: 6px 0 0; font-family: var(--geo-font-head); font-size: 15.5px; font-weight: 650; color: var(--geo-text); }
.gp-focus { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
@media (max-width: 900px) { .gp-focus { grid-template-columns: 1fr; } }
.gp-card { display: flex; flex-direction: column; gap: 6px; min-width: 0; padding: 14px; border: 1px solid var(--geo-border); border-radius: 14px; background: var(--geo-surface2); }
.gp-card.is-focus { background: var(--geo-surface); border-color: color-mix(in srgb, var(--geo-accent) 40%, var(--geo-border)); }
.gp-card[hidden] { display: none; }
.gp-area { margin: 0; font-size: 12px; font-weight: 650; letter-spacing: .02em; color: var(--geo-accent); }
.gp-title { margin: 0; font-family: var(--geo-font-head); font-size: 16px; font-weight: 650; line-height: 1.3; color: var(--geo-text); overflow-wrap: anywhere; }
.gp-why { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text2); overflow-wrap: anywhere; }
.gp-gain { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text); }
.gp-acts { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: auto; padding-top: 6px; }
.gp-acts .ch-btn-go { margin-top: 0; width: auto; flex: 1 1 100%; }
.gp-acts .ch-link { margin-top: 0; }
.gp-inline { display: contents; }
.gp-note { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--geo-muted); }
.gp-msg { margin: 0; font-size: 13.5px; font-weight: 600; }
.gp-msg.is-ok { color: var(--geo-good-ink, var(--geo-good)); } .gp-msg.is-bad { color: var(--geo-bad); }
.gp-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; padding-top: 4px; }
.gp-src { font-size: 12px; color: var(--geo-muted); }
.gp-notnow { min-height: 32px; padding: 0 4px; border: 0; background: none; font: inherit; font-size: 12.5px; color: var(--geo-muted); cursor: pointer; }
.gp-notnow:hover { color: var(--geo-text); text-decoration: underline; }
.gp-areas { list-style: none; margin: 4px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(10rem, 45%), 1fr)); gap: 8px; }
.gp-area-tile { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--geo-border); background: var(--geo-surface); }
.gp-area-name { font-size: 13.5px; font-weight: 600; color: var(--geo-text); }
.gp-level { align-self: flex-start; font-size: 12px; font-weight: 650; padding: 2px 9px; border-radius: 99px; background: var(--geo-surface2); color: var(--geo-text2); }
.gp-area-tile.is-strong .gp-level { background: color-mix(in srgb, var(--geo-good) 18%, transparent); color: var(--geo-good-ink, var(--geo-good)); }
.gp-area-tile.is-building .gp-level { background: color-mix(in srgb, var(--geo-accent) 16%, transparent); color: var(--geo-text); }
.gp-area-tile.is-start .gp-level { background: color-mix(in srgb, var(--geo-warn) 16%, transparent); color: var(--geo-text); }
.gp-area-hint { font-size: 12.5px; line-height: 1.4; color: var(--geo-muted); }
.gp-rest { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
@media (max-width: 700px) { .gp-rest { grid-template-columns: 1fr; } }
.gp-asks { display: flex; flex-direction: column; gap: 8px; padding-top: 6px; border-top: 1px solid var(--geo-border); }
.gp-ask { border: 1px solid var(--geo-border); border-radius: 12px; background: var(--geo-surface); padding: 0 12px; }
.gp-ask > summary { cursor: pointer; min-height: 44px; display: flex; align-items: center; font-weight: 600; font-size: 14.5px; line-height: 1.4; color: var(--geo-text); }
.gp-ask[open] { padding-bottom: 12px; }
.gp-ask[data-done] > summary { color: var(--geo-text2); }
.gp-ask-form { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; }
.gp-ask-form textarea, .gp-ask-form input { width: 100%; box-sizing: border-box; min-height: 44px; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--geo-border);
  background: var(--geo-bg, var(--geo-surface)); color: var(--geo-text); font: inherit; font-size: 15px; }
.gp-ask-form textarea:focus, .gp-ask-form input:focus { outline: 2px solid var(--geo-accent); outline-offset: 1px; }
.gp-ask-form .ch-btn { align-self: flex-start; }
.gp-card-ask .gp-ask { border: 0; padding: 0; background: none; }
/* The agency's view of its client's plan (clients/_client_plan.php) */
.agp { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: 16px; padding: 18px; }
.agp-h { margin: 0 0 4px; font-family: var(--geo-font-head); font-size: 17px; font-weight: 650; color: var(--geo-text); }
.agp-h3 { margin: 14px 0 6px; font-size: 14.5px; font-weight: 650; color: var(--geo-text); }
.agp-sub { margin: 0 0 10px; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
.agp-note { margin: 8px 0 0; font-size: 12.5px; color: var(--geo-muted); }
.agp-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.agp-row { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-top: 1px solid var(--geo-border); }
.agp-row:first-child { border-top: 0; }
.agp-row.is-focus { background: color-mix(in srgb, var(--geo-accent) 8%, transparent); border-radius: 10px; padding: 10px; }
.agp-text { flex: 1 1 auto; min-width: 0; }
.agp-area { margin: 0; font-size: 12px; font-weight: 650; color: var(--geo-accent); }
.agp-title { margin: 2px 0; font-weight: 600; font-size: 14.5px; color: var(--geo-text); overflow-wrap: anywhere; }
.agp-why { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--geo-text2); overflow-wrap: anywhere; }
.agp-asked { display: inline-block; margin-top: 6px; font-size: 12px; font-weight: 650; padding: 2px 9px; border-radius: 99px;
  background: color-mix(in srgb, var(--geo-warn) 16%, transparent); color: var(--geo-text); }
.agp-open { flex: none; display: inline-flex; align-items: center; min-height: 38px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--geo-border);
  font-size: 13.5px; font-weight: 600; color: var(--geo-text); text-decoration: none; }
.agp-open:hover { border-color: var(--geo-accent); }
/* "Make the plan" while it works (about a minute): a spinner, and the button says what's happening. */
.agp-spin { display: none; width: 14px; height: 14px; margin-right: 8px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: agp-spin .8s linear infinite; }
.agp-open.is-busy .agp-spin { display: inline-block; }
.agp-open.is-busy { opacity: .85; cursor: progress; }
@keyframes agp-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .agp-spin { animation-duration: 2.4s; } }
.agp-more > summary { cursor: pointer; min-height: 40px; display: flex; align-items: center; font-size: 14px; font-weight: 600; color: var(--geo-accent); }
.agp-told { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; font-size: 13.5px; color: var(--geo-text2); }
.agp-date { font-weight: 650; color: var(--geo-text); }
@media (max-width: 520px) { .agp-row { flex-direction: column; align-items: stretch; } .agp-open { align-self: flex-start; } }

.gp-more > summary { list-style: none; cursor: pointer; }
.gp-more > summary::-webkit-details-marker { display: none; }
.gp-more[open] > summary { display: none; }

.cn-badge { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px; border-radius: 99px;
  background: var(--geo-accent); color: var(--geo-accent-ink); font-size: 11.5px; font-weight: 700; }
.ch-inbox-title { display: block; font-weight: 600; color: var(--geo-text); }
.ch-inbox-msg { display: block; margin-top: 2px; color: var(--geo-text2); }
.ch-inbox-date { display: block; margin-top: 4px; font-size: 12.5px; color: var(--geo-muted); }
.ch-inbox-row:not(.is-new) .ch-inbox-title { font-weight: 500; color: var(--geo-text2); }
.cn-bell { position: relative; margin-left: auto; display: inline-grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; color: var(--geo-text); }
.cn-bell:hover { background: var(--geo-surface2); }
.cn-bell-n { position: absolute; top: 4px; right: 2px; }

/* ═══ THE CLEAN CLIENT HOME (27 Sep 2026) ═════════════════════════════════════════════
   Edward: "no bulky stuff, just clean info, expand for more, take action, clean big SaaS".
   GEOPHII_BLUEPRINT/CLIENT_HOME_CALM_2026-09-27.md. Rows in one panel per section: a name,
   one short fact, one button; the rest behind an arrow. Tokens only, both themes. */
.ck { gap: 18px; max-width: 46rem; }
.ck-tiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
.ck-tile { display: flex; flex-direction: column; gap: 2px; min-width: 0; padding: 12px; border-radius: 14px;
  background: var(--geo-surface); border: 1px solid var(--geo-border); color: var(--geo-text); text-decoration: none; }
a.ck-tile:hover { border-color: var(--geo-border2); }
.ck a.ck-tile, .ck a.ck-tile .ck-tile-n { color: var(--geo-text) !important; }
.ck a.ck-tile .ck-tile-l, .ck a.ck-tile .ck-tile-s:not(.is-up) { color: var(--geo-muted) !important; }
.ck .ck-tile-a { color: var(--geo-accent) !important; }
.ck-tile-l { font-size: 12.5px; color: var(--geo-muted); }
.ck-tile-n { font-family: var(--geo-font-head); font-size: 24px; font-weight: 650; line-height: 1.15; letter-spacing: -.01em; }
.ck-tile-none { font-size: 15px; line-height: 1.6; }
.ck-tile-s { font-size: 12.5px; font-weight: 600; color: var(--geo-muted); }
.ck-tile-s.is-up { color: var(--geo-good-ink, var(--geo-good)); }
.ck-tile-a { color: var(--geo-accent); text-decoration: none; }
.ck-sec { display: flex; flex-direction: column; gap: 8px; }
.ck-h { margin: 0; display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  font-size: 12.5px; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; color: var(--geo-muted); }
.ck .ck-h a { color: var(--geo-accent) !important; }
.ck-h a { font-size: 13.5px; letter-spacing: 0; text-transform: none; color: var(--geo-accent); text-decoration: none; font-weight: 600; }
.ck-list { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: 14px; overflow: hidden; }
.ck-row { padding: 12px 14px; border-top: 1px solid var(--geo-border); }
/* /client-work, more than one website: one group per website (structure audit step 10). */
.ck-group:not([hidden]) ~ .ck-group:not([hidden]) { border-top: 1px solid var(--geo-border); }
.ck-group-h { margin: 0; padding: 12px 14px 8px; font-size: 12.5px; font-weight: 650; letter-spacing: .02em; color: var(--geo-muted); background: var(--geo-surface2); overflow-wrap: anywhere; }

.ck-row:first-child { border-top: 0; }
.ck-row[hidden] { display: none; }
.ck-row-main { display: flex; align-items: center; gap: 12px; min-width: 0; }
.ck-row-t { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ck-row-title { margin: 0; font-size: 15px; font-weight: 600; line-height: 1.35; color: var(--geo-text); overflow-wrap: anywhere; }
.ck-row-sub { margin: 0; font-size: 13px; line-height: 1.4; color: var(--geo-muted); display: flex; flex-wrap: wrap; align-items: center; gap: 6px; overflow-wrap: anywhere; }
.ck-row-act { flex: none; display: flex; gap: 6px; }
.ck-btn { display: inline-flex; align-items: center; justify-content: center; min-height: 38px; padding: 0 14px; border-radius: 10px;
  font: inherit; font-size: 14px; font-weight: 600; white-space: nowrap; text-decoration: none; cursor: pointer;
  border: 1px solid var(--geo-border2); background: transparent; color: var(--geo-accent) !important; }
.ck-btn:hover { border-color: var(--geo-accent); }
.ck-btn-go { border-color: var(--geo-accent); background: var(--geo-accent); color: var(--geo-accent-ink) !important; }
.ck-btn-go:hover { filter: brightness(1.06); }
.ck-btn[disabled] { opacity: .6; cursor: default; }
.ck-chev { flex: none; width: 32px; height: 32px; border: 0; border-radius: 8px; background: transparent; cursor: pointer; color: var(--geo-muted);
  display: grid; place-items: center; }
.ck-chev::before { content: ""; width: 8px; height: 8px; border: solid currentColor; border-width: 0 2px 2px 0; transform: rotate(-45deg); transition: transform var(--geo-dur); }
.ck-chev[aria-expanded="true"]::before { transform: rotate(45deg); }
.ck-chev:hover { background: var(--geo-surface2); }
.ck-exp { padding: 10px 0 2px; display: flex; flex-direction: column; gap: 8px; }
.ck-exp[hidden] { display: none; }
.ck-why, .ck-note { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
.ck-note { color: var(--geo-muted); font-size: 13px; }
.ck-links { margin: 0; display: flex; gap: 16px; align-items: center; }
.ck-link { padding: 0; border: 0; background: none; font: inherit; font-size: 13.5px; font-weight: 600; color: var(--geo-accent); text-decoration: none; cursor: pointer; }
.ck .ck-link { color: var(--geo-accent) !important; }
.ck .ck-link-quiet { color: var(--geo-muted) !important; font-weight: 500; }
.ck-choice { display: flex; flex-direction: column; gap: 8px; padding: 10px; border-radius: 12px; background: var(--geo-surface2); }
.ck-choice-h { margin: 0; font-size: 13px; font-weight: 650; color: var(--geo-text2); }
.ck-opt { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ck-opt .ck-btn { min-width: 11rem; }
.ck-opt-sub { font-size: 13px; color: var(--geo-muted); }
.ck-opt .gp-inline { margin: 0; }
.ck-chip { display: inline-flex; align-items: center; padding: 1px 8px; border-radius: 99px; font-size: 12px; font-weight: 600;
  background: var(--geo-surface2); color: var(--geo-text2); }
.ck-chip.is-you { background: var(--geo-accent-soft); color: var(--geo-accent); }
.ck-chip.is-doing { background: color-mix(in srgb, var(--geo-info) 16%, transparent); color: var(--geo-second-ink); }
.ck-chip.is-done { background: color-mix(in srgb, var(--geo-good) 14%, transparent); color: var(--geo-good-ink); }
.ck-chip.is-due { background: color-mix(in srgb, var(--geo-info) 16%, transparent); color: var(--geo-second-ink); }
/* Messages with the agency on a task (27 Sep, migration 157) */
.ck-msgline { margin: 6px 0 0; font-size: 14px; line-height: 1.45; color: var(--geo-text2); overflow-wrap: anywhere; }
.ck-msgline b { color: var(--geo-text); font-weight: 600; }
.ck-thread { margin-top: 6px; }
.ck-thread > summary { cursor: pointer; font-size: 13px; color: var(--geo-muted); list-style: none; }
.ck-thread > summary::-webkit-details-marker { display: none; }
.ck-thread[open] > summary { font-size: 0; }
.ck-thread[open] > summary::after { content: attr(data-less); font-size: 13px; }
.ck-fold { border-top: 1px solid var(--geo-border); }
.ck-fold:first-child { border-top: 0; }
.ck-fold > summary { list-style: none; display: flex; align-items: center; gap: 12px; padding: 12px 14px; cursor: pointer; }
.ck-fold > summary::-webkit-details-marker { display: none; }
.ck-fold > summary::after { content: ""; flex: none; width: 8px; height: 8px; margin-right: 10px; border: solid var(--geo-muted); border-width: 0 2px 2px 0;
  transform: rotate(-45deg); transition: transform var(--geo-dur); }
.ck-fold[open] > summary::after { transform: rotate(45deg); }
.ck-fold-body { padding: 0 14px 14px; display: flex; flex-direction: column; gap: 8px; }
.ck-fold-body > .ck-row { padding: 12px 0; }
.ck-fold-body > .ck-row:first-child { border-top: 0; }
.ck .gp-row-ask .gp-ask { border: 0; padding: 0; background: none; }
.ck-filters { display: flex; gap: 6px; flex-wrap: wrap; }
.ck-filter { padding: 6px 12px; border-radius: 99px; border: 1px solid var(--geo-border); background: var(--geo-surface); color: var(--geo-text2);
  font: inherit; font-size: 13.5px; font-weight: 600; cursor: pointer; }
.ck-filter[aria-pressed="true"] { background: var(--geo-accent); border-color: var(--geo-accent); color: var(--geo-accent-ink); }
/* Site pills on /client-google are links; beat the global link colour the way .ck-tile-a does. */
.ck a.ck-filter, .ck a.ck-filter:visited { text-decoration: none; color: var(--geo-text2) !important; }
.ck a.ck-filter[aria-pressed="true"], .ck a.ck-filter[aria-pressed="true"]:visited { color: var(--geo-accent-ink) !important; }
.ck-form { display: flex; flex-direction: column; gap: 10px; padding: 14px; }
.ck-form label { font-size: 13.5px; font-weight: 600; color: var(--geo-text2); }
.ck-form input[type=text], .ck-form textarea { width: 100%; box-sizing: border-box; padding: 10px 12px; border-radius: 10px; border: 1px solid var(--geo-border2);
  background: var(--geo-surface); color: var(--geo-text); font: inherit; font-size: 15px; }
.ck-who { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; font-size: 14.5px; color: var(--geo-text); }
.ck-who label { display: inline-flex; align-items: center; gap: 6px; }
.ck-who input[type=radio] { width: auto; margin: 0; }
@media (max-width: 480px) {
  .ck-tile { padding: 10px; }
  .ck-tile-n { font-size: 21px; }
  .ck .ck-row-main { flex-wrap: wrap; }
  .ck .ck-row-t { flex: 1 1 calc(100% - 44px); }
  .ck .ck-row-act { order: 3; flex: 1 1 100%; }
  .ck .ck-row-act .ck-btn, .ck .ck-row-act form, .ck .ck-row-act form .ck-btn { flex: 1 1 0; width: 100%; }
  .ck .ck-row-act:empty { display: none; }
  .ck .gp-row .ck-chev { order: 2; }
  .ck-opt .ck-btn { width: 100%; }
}
/* The client's Google page (27 Sep): a compact four-column table that fits a phone. */
.g-row { display: grid; grid-template-columns: minmax(0, 1fr) 3.6rem 4.6rem 3.6rem; gap: 8px; align-items: center;
  padding: 10px 14px; border-top: 1px solid var(--geo-border); font-size: 14px; }
.g-row:first-child { border-top: 0; }
.g-row > span:not(.g-key) { text-align: right; font-variant-numeric: tabular-nums; color: var(--geo-text2); }
.g-head { font-size: 12px; font-weight: 650; color: var(--geo-muted); }
.g-head > span { color: var(--geo-muted) !important; }
.g-key { min-width: 0; overflow-wrap: break-word; color: var(--geo-text); }
.g-table[hidden] { display: none; }
a.ck-fold-link { display: flex; align-items: center; gap: 12px; padding: 12px 14px; text-decoration: none; color: var(--geo-text) !important; }
a.ck-fold-link::after { content: ""; flex: none; width: 8px; height: 8px; margin-right: 10px; border: solid var(--geo-muted); border-width: 0 2px 2px 0; transform: rotate(-45deg); }
.g-head > span:first-child { text-align: left; }
/* The plan as a checklist (27 Sep): progress first, a round mark per step, ticked when done. */
.ck-progress { display: flex; flex-direction: column; gap: 6px; padding: 2px 2px 4px; }
.ck-progress-l { margin: 0; font-size: 14px; font-weight: 600; color: var(--geo-text); }
.ck-progress-bar { display: block; height: 8px; border-radius: 99px; background: var(--geo-surface2); overflow: hidden; }
.ck-progress-bar > span { display: block; height: 100%; border-radius: 99px; background: var(--geo-good); }
.ck-mark { flex: none; width: 22px; height: 22px; border-radius: 50%; border: 2px solid var(--geo-border2); display: grid; place-items: center; }
.ck-row.is-done .ck-mark { border-color: var(--geo-good); background: var(--geo-good); }
.ck-row.is-done .ck-mark::after { content: ""; width: 5px; height: 9px; margin-top: -2px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }
.ck-row.is-agency .ck-mark { border-color: var(--geo-info); border-style: dashed; }
.ck-row.is-done .ck-row-title { color: var(--geo-muted); text-decoration: line-through; text-decoration-color: var(--geo-border2); }
.ck-gain { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text); padding: 8px 10px; border-radius: 10px;
  background: color-mix(in srgb, var(--geo-good) 9%, var(--geo-surface)); }
.ck-gain strong { display: block; font-size: 12.5px; color: var(--geo-good-ink, var(--geo-good)); margin-bottom: 2px; }
@media (max-width: 480px) { .ck .gp-row.is-step .ck-row-t { flex: 1 1 calc(100% - 80px); } }
.agp-doc { font-size: 14px; line-height: 1.6; color: var(--geo-text2); max-height: 32rem; overflow: auto; padding: 4px 2px; }
.agp-doc h1, .agp-doc h2, .agp-doc h3 { font-size: 15px; color: var(--geo-text); margin: 12px 0 4px; }
.ck-since { font-size: 12.5px; color: var(--geo-muted); }
.ck-since.is-up { color: var(--geo-good-ink, var(--geo-good)); font-weight: 600; }

/* The client's Website page (27 Sep): the header and card headers wrap instead of squeezing a
   button into a thin column on a phone. (No sm:/lg: utilities exist in this build.) */
.ws-wrap { flex-wrap: wrap; row-gap: 10px; }

/* ═══ A CLIENT'S REPORT (reports/client.php, 27 Sep 2026) ═══════════════════════════════
   The client area's cards (.ch-*), plus what a report needs: bars with their figure, small
   tables that scroll sideways on a phone, the questions as folds, and a print version that is
   the download. Tokens only, so both themes come from the theme. */
.cr-back { font-size: 14px; color: var(--geo-text2) !important; text-decoration: none; }
.cr-back:hover { color: var(--geo-text) !important; }
.cr-head .ch-h1 { margin-top: 8px; }
.cr-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; margin-top: 12px; }
.cr-pick { display: inline-flex; align-items: center; gap: 8px; font-size: 13.5px; color: var(--geo-text2); flex-wrap: wrap; }
.cr-pick select { min-height: 38px; max-width: 100%; padding: 0 10px; border-radius: 10px; border: 1px solid var(--geo-border);
  background: var(--geo-surface); color: var(--geo-text); font: inherit; font-size: 14px; }
.cr-unit { margin: 0; font-size: 13px; font-weight: 600; color: var(--geo-muted); }
.cr-band { margin: 10px 0 0; font-size: 15px; line-height: 1.5; color: var(--geo-text); }
.cr-note { margin: 10px 0 0; font-size: 13px; line-height: 1.5; color: var(--geo-muted); }
.cr-muted { color: var(--geo-muted); font-size: 13.5px; }
.cr-small { font-size: 12.5px; color: var(--geo-muted); }
.cr-wrap { overflow-wrap: anywhere; }
.cr-part { margin: 14px 2px 0; font-family: var(--geo-font-head); font-size: 20px; font-weight: 650; color: var(--geo-text); }
.cr-part-sub { margin: -6px 2px 0; }
.cr-part-link { margin: -4px 2px 0; }

/* Bars with their figure beside them. */
.cr-bars { margin-top: 12px; }
.cr-bars li { grid-template-columns: 6.5rem minmax(0, 1fr); }
.cr-bars-wide li { grid-template-columns: minmax(7rem, 11rem) minmax(0, 1fr); }
.cr-bar-row { display: flex; align-items: center; gap: 10px; min-width: 0; }
.cr-bar-row .ch-bar { flex: 1 1 auto; min-width: 0; }
.cr-bar-row b { flex: none; min-width: 2.8em; text-align: right; font-size: 14px; font-variant-numeric: tabular-nums; }
.cr-bar-other { background: var(--geo-muted) !important; opacity: .55; }
.cr-name { min-width: 0; overflow-wrap: anywhere; }
.cr-bars li.is-you .cr-name { font-weight: 650; }
@media (max-width: 480px) {
  .cr-bars li, .cr-bars-wide li { grid-template-columns: 1fr; }
  .cr-bars .ch-eng-n { grid-column: 1; }
}
.cr-you { background: var(--geo-accent-soft); color: var(--geo-accent); }
.cr-tag-good { background: color-mix(in srgb, var(--geo-good) 16%, transparent); color: var(--geo-good-ink, var(--geo-good)); }

/* The trend chart. */
.cr-chart { position: relative; height: 240px; margin-top: 12px; }
@media (max-width: 480px) { .cr-chart { height: 200px; } }

/* Folds and tables. */
.cr-more { margin-top: 10px; }
.cr-more > summary, .cr-q > summary { cursor: pointer; }
.cr-more > summary { font-size: 14px; font-weight: 600; color: var(--geo-accent); }
.cr-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; margin-top: 8px; }
.cr-table { width: 100%; border-collapse: collapse; font-size: 13.5px; font-variant-numeric: tabular-nums; }
.cr-table th, .cr-table td { padding: 8px 10px; text-align: right; border-top: 1px solid var(--geo-border); white-space: nowrap; }
.cr-table th:first-child, .cr-table td:first-child { text-align: left; white-space: normal; }
.cr-table thead th { border-top: 0; font-size: 12.5px; font-weight: 600; color: var(--geo-muted); white-space: normal; vertical-align: bottom; }
@media (max-width: 480px) { .cr-table th, .cr-table td { padding: 8px 6px; font-size: 13px; } }
.cr-table td.cr-wrap { min-width: 8rem; overflow-wrap: normal; word-break: normal; }
.cr-heat tbody th { font-weight: 500; }
.cr-heat tr.is-you th, .cr-heat tr.is-you td { font-weight: 650; }

/* How it talks about them: one stacked bar. */
.cr-stack { display: flex; height: 12px; border-radius: 99px; overflow: hidden; margin: 12px 0 10px; background: var(--geo-surface2); gap: 2px; }
.cr-stack-good { background: var(--geo-good); }
.cr-stack-neutral { background: var(--geo-muted); opacity: .6; }
.cr-stack-bad { background: var(--geo-bad); }
.cr-legend { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 14px; color: var(--geo-text2); }
.cr-legend li { display: inline-flex; align-items: center; gap: 7px; }
.cr-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }

/* The questions. */
.cr-filters { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 4px; }
.cr-filters .ch-btn { min-height: 36px; padding: 0 12px; font-size: 13px; border-radius: 99px; }
.cr-filters .is-on { border-color: var(--geo-accent); color: var(--geo-accent) !important; }
.cr-qs { display: flex; flex-direction: column; margin-top: 6px; }
.cr-q { border-top: 1px solid var(--geo-border); }
.cr-q:first-child { border-top: 0; }
.cr-q > summary { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 12px; padding: 12px 0; list-style: none; }
.cr-q > summary::-webkit-details-marker { display: none; }
.cr-q-t { flex: 1 1 16rem; min-width: 0; font-size: 14.5px; font-weight: 600; line-height: 1.45; }
.cr-answers { list-style: none; margin: 0 0 12px; padding: 0; display: flex; flex-direction: column; gap: 12px; }
.cr-a-h { margin: 0; display: flex; flex-wrap: wrap; gap: 4px 10px; font-size: 14px; }
.cr-quote { margin: 6px 0 0; padding: 8px 12px; border-left: 3px solid var(--geo-border); background: var(--geo-surface2);
  border-radius: 0 8px 8px 0; font-size: 13.5px; line-height: 1.55; color: var(--geo-text2); overflow-wrap: anywhere; }

/* Figures. */
.cr-big { margin: 10px 0 0; font-family: var(--geo-font-head); font-size: 28px; font-weight: 700; }
.cr-stats { display: flex; flex-wrap: wrap; gap: 12px 28px; margin: 12px 0 4px; }
.cr-stats div { display: flex; flex-direction: column; }
.cr-stats b { font-family: var(--geo-font-head); font-size: 26px; font-weight: 700; font-variant-numeric: tabular-nums; }
.cr-stats span { font-size: 13px; color: var(--geo-muted); }
.cr-score { flex: none; min-width: 4.2em; text-align: center; font-weight: 700; font-size: 14px; padding: 4px 8px; border-radius: 10px; background: var(--geo-surface2); }
.cr-band-good { color: var(--geo-good-ink, var(--geo-good)); } .cr-band-warn { color: var(--geo-warn-ink, var(--geo-warn)); } .cr-band-low { color: var(--geo-text2); }
.cr-roast { align-items: flex-start; }
.cr-rank { font-size: 14px; font-weight: 600; white-space: nowrap; }
.cr-bullets { margin: 0; padding-left: 1.2em; font-size: 14px; line-height: 1.6; }
.cr-print-foot { display: none; }

/* The download: reports/client.php on its own page (?export=pdf), then printed. */
.cr-printpage { background: var(--geo-bg, #fff); padding: 20px 16px 40px; }
.cr-printpage .cr-print-foot { display: block; margin-top: 16px; font-size: 12px; color: var(--geo-muted); }
.cr-printbar { max-width: 60rem; margin: 0 auto 8px; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
@media print {
  .cr-printpage { padding: 0; background: #fff; }
  /* Keep the colours: the score ring and every bar are backgrounds, which browsers drop by default. */
  #cr, #cr * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  #cr .cr-noprint, .cr-printbar { display: none !important; }
  #cr { max-width: none; }
  /* Small cards stay whole; the long ones (the questions) flow across pages, one question kept whole. */
  #cr .ch-card { break-inside: auto; }
  #cr .ch-card:not(:has(.cr-qs)):not(:has(.cr-table)) { break-inside: avoid; }
  #cr .cr-q, #cr .ch-row, #cr tr { break-inside: avoid; }
  /* Wide tables fit the paper: wrap, smaller. */
  #cr .cr-scroll { overflow: visible; }
  #cr .cr-table { font-size: 11px; }
  #cr .cr-table th, #cr .cr-table td { white-space: normal; padding: 5px 6px; }
}

/* ── OpenSEO parity (28 Sep 2026): shared keyword-difficulty badge ────────────────────────────
   OpenSEO's six bands (0-20, 21-35, 36-50, 51-65, 66-80, 81-100), folded onto our good / warn / bad
   tokens exactly as the keyword table does (.kt-b1..6 in page-improvement.css), so a 62 is the same
   colour on every screen and flips with the theme. */
.geo-kd { --kd: var(--geo-muted); --kd-ink: var(--geo-text2); --kd-w: 18%; display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 999px; font-size: 11px; font-weight: 700; font-variant-numeric: tabular-nums;
  background: color-mix(in oklab, var(--kd) var(--kd-w), var(--geo-bg)); border: 1px solid color-mix(in oklab, var(--kd) 40%, transparent); color: var(--kd-ink); }
.geo-kd-na { --kd: var(--geo-border2); --kd-ink: var(--geo-text2); }
.geo-kd-1 { --kd: var(--geo-good); --kd-ink: var(--geo-good-ink); --kd-w: 14%; }
.geo-kd-2 { --kd: var(--geo-good); --kd-ink: var(--geo-good-ink); --kd-w: 26%; }
.geo-kd-3 { --kd: var(--geo-warn); --kd-ink: var(--geo-warn-ink); --kd-w: 14%; }
.geo-kd-4 { --kd: var(--geo-warn); --kd-ink: var(--geo-warn-ink); --kd-w: 26%; }
.geo-kd-5 { --kd: var(--geo-bad);  --kd-ink: var(--geo-bad-ink);  --kd-w: 14%; }
.geo-kd-6 { --kd: var(--geo-bad);  --kd-ink: var(--geo-bad-ink);  --kd-w: 28%; }

/* Eight tag colours (OpenSEO's palette names), one set per theme. */
:root { --geo-hue-slate: #64748b; --geo-hue-rose: #e11d48; --geo-hue-amber: #d97706; --geo-hue-lime: #65a30d;
        --geo-hue-emerald: #059669; --geo-hue-sky: #0284c7; --geo-hue-violet: #7c3aed; --geo-hue-fuchsia: #c026d3; }
html[data-theme="dark"] { --geo-hue-slate: #94a3b8; --geo-hue-rose: #fb7185; --geo-hue-amber: #fbbf24; --geo-hue-lime: #a3e635;
        --geo-hue-emerald: #34d399; --geo-hue-sky: #38bdf8; --geo-hue-violet: #a78bfa; --geo-hue-fuchsia: #e879f9; }

/* ── Rank tracking ─────────────────────────────────────────────────────────────────────────── */
.rt-tiles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 0 0 14px; }
@media (min-width: 900px) { .rt-tiles { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
.rt-tile { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 12px 14px;
  display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.rt-tile-l { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--geo-text2); }
.rt-tile-v { font-size: 26px; line-height: 1.1; font-weight: 700; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.rt-tile-sm { font-size: 17px; }
.rt-tile-d { font-size: 12px; font-weight: 600; color: var(--geo-text2); }
.rt-tile-d.is-up { color: var(--geo-good); } .rt-tile-d.is-down { color: var(--geo-warn); }
.rt-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 12px; }
.rt-cmp { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.rt-cmp-l { font-size: 12px; font-weight: 600; color: var(--geo-text2); margin-right: 2px; }
.rt-add { margin: 0 0 14px; }
.rt-add > summary { list-style: none; display: inline-flex; cursor: pointer; }
.rt-add > summary::-webkit-details-marker { display: none; }
.rt-add-form { margin-top: 10px; background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 14px; }
.rt-add-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; margin-top: 10px; }
.rt-kw > summary { cursor: pointer; list-style: none; display: flex; flex-direction: column; gap: 2px; }
.rt-kw > summary::-webkit-details-marker { display: none; }
.rt-kw-t { font-weight: 600; color: var(--geo-text); }
.rt-kw > summary .rt-kw-t::after { content: " ▸"; color: var(--geo-muted); font-size: 11px; }
.rt-kw[open] > summary .rt-kw-t::after { content: " ▾"; }
.rt-kw-sub { font-size: 11px; color: var(--geo-text2); }
.rt-more { margin-top: 10px; padding: 10px 12px; border: 1px solid var(--geo-border); border-radius: 10px; background: var(--geo-surface2); max-width: 420px; }
.rt-more-h { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--geo-text2); margin: 0 0 6px; }
.rt-more-h + * { margin-bottom: 12px; }
.rt-spark { width: 100%; max-width: 280px; height: 64px; display: block; }
.rt-spark-top { stroke: var(--geo-border); stroke-dasharray: 3 3; }
.rt-spark-line { fill: none; stroke: var(--geo-accent); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
.rt-spark-dot { fill: var(--geo-accent); }
.rt-spark-miss { fill: var(--geo-muted); }
.rt-top { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.rt-top li { display: flex; gap: 8px; align-items: baseline; font-size: 12.5px; line-height: 1.35; min-width: 0; }
.rt-top-n { flex: 0 0 18px; text-align: right; font-variant-numeric: tabular-nums; color: var(--geo-text2); font-weight: 600; }
.rt-top-t { min-width: 0; overflow-wrap: anywhere; color: var(--geo-text); }
.rt-top-d { display: block; font-size: 11px; color: var(--geo-text2); }
/* Position: OpenSEO's "was → now" (RankTrackingTableParts.tsx DeviceRankCell). */
.rt-rank { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.rt-was { font-family: var(--geo-mono); font-size: 12px; color: var(--geo-muted); min-width: 18px; text-align: right; }
.rt-arrow { color: var(--geo-muted); font-size: 12px; }
.rt-pos { font-family: var(--geo-mono); font-size: 12.5px; font-weight: 700; padding: 2px 7px; border-radius: 6px;
  background: var(--geo-surface2); color: var(--geo-text); }
.rt-pos-up   { background: color-mix(in oklab, var(--geo-good) 20%, transparent); color: var(--geo-good-ink, var(--geo-good)); }
.rt-pos-down { background: color-mix(in oklab, var(--geo-warn) 22%, transparent); color: var(--geo-warn-ink, var(--geo-warn)); }
.rt-pos-lost { background: color-mix(in oklab, var(--geo-bad) 18%, transparent); color: var(--geo-bad-ink, var(--geo-bad)); font-family: var(--geo-font); }
.rt-pos-out  { background: transparent; color: var(--geo-text2); font-family: var(--geo-font); font-weight: 500; padding: 0; }
.rt-feats { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.rt-feat { font-size: 11px; font-weight: 600; padding: 2px 7px; border-radius: 999px; white-space: nowrap;
  background: var(--geo-surface2); color: var(--geo-text2); border: 1px solid var(--geo-border); }
.rt-table td:nth-child(1) { min-width: 210px; }
.rt-table .rt-kw-t { font-size: 14px; }
.rt-table th:nth-child(n+4):nth-child(-n+6), .rt-table td:nth-child(n+4):nth-child(-n+6) { white-space: nowrap; padding-left: 12px; padding-right: 12px; text-align: right; }
.rt-table td:nth-child(3) { max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rt-table td:nth-child(7) { min-width: 150px; }
@media (max-width: 767px) { .rt-table td:nth-child(1) { min-width: 0; } .rt-table td:nth-child(3) { max-width: none; white-space: normal; }
  .rt-table th:nth-child(n+4):nth-child(-n+6), .rt-table td:nth-child(n+4):nth-child(-n+6) { text-align: left; } }
@media (max-width: 767px) { .rt-table td.rt-empty { display: none; } }

/* ── Saved keywords (OpenSEO parity, 28 Sep 2026) ──────────────────────────────────────────── */
.sk-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 12px; }
.sk-tag { --tg: var(--geo-hue-slate); display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border-radius: 7px;
  font-size: 12px; font-weight: 600; white-space: nowrap; text-decoration: none !important;
  background: color-mix(in oklab, var(--tg) 14%, transparent); color: color-mix(in oklab, var(--tg) 62%, var(--geo-text)) !important;
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--tg) 30%, transparent); }
.sk-tag.is-on { box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--tg) 70%, transparent); }
.sk-dot { width: 6px; height: 6px; border-radius: 999px; background: var(--tg); flex: 0 0 auto; }
.sk-tag-n { opacity: .7; font-variant-numeric: tabular-nums; }
.sk-tag-slate { --tg: var(--geo-hue-slate); } .sk-tag-rose { --tg: var(--geo-hue-rose); } .sk-tag-amber { --tg: var(--geo-hue-amber); } .sk-tag-lime { --tg: var(--geo-hue-lime); }
.sk-tag-emerald { --tg: var(--geo-hue-emerald); } .sk-tag-sky { --tg: var(--geo-hue-sky); } .sk-tag-violet { --tg: var(--geo-hue-violet); } .sk-tag-fuchsia { --tg: var(--geo-hue-fuchsia); }
.sk-chips { display: inline-flex; flex-wrap: wrap; gap: 4px; }
.sk-filters { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; margin: 0 0 12px; }
.sk-f { display: flex; flex-direction: column; gap: 4px; font-size: 12px; font-weight: 600; color: var(--geo-text2); }
.sk-f input { width: 130px; }
.sk-kw { font-weight: 600; color: var(--geo-text); }
.sk-mkt { font-size: 10.5px; font-weight: 700; color: var(--geo-text2); margin-left: 4px; }
.sk-cb { width: 34px; }
.sk-cb input { width: 16px; height: 16px; accent-color: var(--geo-accent); }
.sk-intent { --it: var(--geo-second); display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border-radius: 999px; font-size: 11.5px; font-weight: 700;
  background: color-mix(in oklab, var(--it) 15%, transparent); color: color-mix(in oklab, var(--it) 62%, var(--geo-text));
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--it) 32%, transparent); }
.sk-intent-informational { --it: var(--geo-second); } .sk-intent-commercial { --it: var(--geo-warn); }
.sk-intent-transactional { --it: var(--geo-good); } .sk-intent-navigational { --it: var(--geo-accent); }
.sk-rank-out { font-size: 12px; color: var(--geo-text2) !important; }
.sk-table a.rt-pos { text-decoration: none !important; }
.sk-edit { margin-top: 4px; }
.sk-edit-s { cursor: pointer; font-size: 11.5px; color: var(--geo-text2); list-style: none; }
.sk-edit-s::-webkit-details-marker { display: none; }
.sk-edit-f { display: flex; gap: 6px; margin-top: 6px; }
.sk-edit-f input { min-width: 150px; }
.sk-bar { position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(18px + env(safe-area-inset-bottom, 0px)); z-index: 60;
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px; padding: 6px 8px; max-width: calc(100vw - 24px);
  background: var(--geo-surface); border: 1px solid var(--geo-border2); border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,.22); }
.sk-bar[hidden] { display: none; }
.sk-bar-n { font-size: 13px; font-weight: 700; color: var(--geo-text); padding: 0 6px; white-space: nowrap; }
.sk-bar-sep { width: 1px; align-self: stretch; background: var(--geo-border); margin: 0 2px; }
.sk-bar-b, .sk-bar-x { background: transparent !important; border: 0 !important; box-shadow: none !important; color: var(--geo-text) !important;
  font-size: 13px; font-weight: 600; padding: 8px 10px; border-radius: 8px; cursor: pointer; min-height: 36px; }
.sk-bar-b:hover, .sk-bar-x:hover { background: var(--geo-surface2) !important; }
.sk-bar-danger { color: var(--geo-bad-ink, var(--geo-bad)) !important; }
.sk-bar-tag { flex-basis: 100%; display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; padding: 6px 4px 2px; }
.sk-bar-tag[hidden] { display: none; }
.sk-bar-tag label { display: flex; flex-direction: column; gap: 4px; font-size: 12px; color: var(--geo-text2); }
@media (max-width: 767px) {
  .sk-bar { left: 12px; right: 12px; transform: none; bottom: calc(84px + env(safe-area-inset-bottom, 0px)); justify-content: center; }
  .sk-table td.sk-empty { display: none; }
  .sk-f input { width: 110px; }
}
.sk [hidden], .rt [hidden] { display: none !important; }
.sk-table th, .sk-table td { padding-left: 10px; padding-right: 10px; }
.sk-table td:nth-child(n+3):nth-child(-n+8), .sk-table th:nth-child(n+3):nth-child(-n+8) { white-space: nowrap; }
.sk-table td:nth-child(n+3):nth-child(-n+5) { text-align: right; font-variant-numeric: tabular-nums; }
.sk-table td:nth-child(2) { min-width: 200px; }
.sk-kw { font-size: 14px; font-weight: 500; }
@media (max-width: 767px) { .sk-table td:nth-child(n+3):nth-child(-n+5) { text-align: left; } .sk-table td:nth-child(2) { min-width: 0; } }
.sk-table td:nth-child(10), .rt-table td:nth-child(8) { white-space: nowrap; }

/* ── Keyword research additions (OpenSEO parity, 28 Sep 2026) ──────────────────────────────── */
.kr-recent { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: -4px 0 14px; }
.kr-recent-h { font-size: 12px; font-weight: 600; color: var(--geo-text2); margin-right: 2px; }
.kr-mkt { font-size: 10.5px; font-weight: 700; opacity: .7; }
.kr-top { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; margin: 0 0 14px; }
@media (min-width: 900px) { .kr-top { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); } }
.kr-card { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 14px 16px; min-width: 0; }
.kr-card-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 0 0 10px; }
.kr-card-kw { font-size: 17px; font-weight: 700; color: var(--geo-text); overflow-wrap: anywhere; }
.kr-card-m { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; margin: 0; }
.kr-card-m dt { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--geo-text2); }
.kr-card-m dd { margin: 2px 0 0; font-size: 18px; font-weight: 700; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.kr-trend-h { font-size: 13px; font-weight: 700; color: var(--geo-text); }
.kr-trend-r { font-size: 12px; color: var(--geo-text2); }
.kr-chart { width: 100%; height: auto; display: block; }
.kr-grid { stroke: var(--geo-border); stroke-width: 1; }
.kr-axis { fill: var(--geo-text2); font-size: 11px; }
.kr-area { fill: color-mix(in oklab, var(--geo-accent) 16%, transparent); stroke: none; }
.kr-line { fill: none; stroke: var(--geo-accent); stroke-width: 2.2; stroke-linejoin: round; stroke-linecap: round; }
.kr-dot { fill: var(--geo-accent); }
.kr-peak { font-size: 12px; color: var(--geo-text2); margin: 6px 0 0; }

/* ── Site audit: summary tiles + pages table (OpenSEO parity, 28 Sep 2026) ────────────────── */
.cr-tiles { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin: 16px 0 12px; }
@media (max-width: 520px) { .cr-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.cr-tile { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 12px 14px; min-width: 0; }
.cr-tile-l { display: block; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--geo-text2); }
.cr-tile-v { display: block; margin-top: 4px; font-size: 24px; font-weight: 700; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.cr-pages-h { font-size: 13px; font-weight: 700; color: var(--geo-text); margin: 16px 0 8px; }
.cr-pages td { vertical-align: middle; }
.cr-p-url a { font-size: 13px; overflow-wrap: anywhere; }
.cr-p-title { max-width: 320px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cr-p-st { font-weight: 700; font-size: 12px; font-variant-numeric: tabular-nums; }
td.cr-p-st.is-good { color: var(--geo-good-ink, var(--geo-good)); }
td.cr-p-st.is-warn { color: var(--geo-warn-ink, var(--geo-warn)); }
td.cr-p-st.is-bad  { color: var(--geo-bad-ink, var(--geo-bad)); }
.cr-pages .cr-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.cr-pages .cr-muted { color: var(--geo-text2); }
.cr-pages .cr-p-flag { color: var(--geo-warn-ink, var(--geo-warn)); font-weight: 600; }
@media (max-width: 767px) { .cr-p-title { max-width: none; white-space: normal; } .cr-pages .cr-num { text-align: left; } }
.cr-pages-d > summary { cursor: pointer; list-style: none; } .cr-pages-d > summary::-webkit-details-marker { display: none; }
.cr-pages th, .cr-pages td { padding-left: 10px; padding-right: 10px; }
.cr-pages td:nth-child(6), .cr-pages td:nth-child(2) { white-space: nowrap; }
.cr-pages-d { margin: 0 0 18px; }
@media (max-width: 767px) { .cr-pages td:nth-child(6), .cr-pages td:nth-child(2) { white-space: normal; } }
@media (min-width: 768px) { .cr-pages td.cr-p-url { min-width: 240px; max-width: 360px; } }
/* CSV import box (saved keywords, rank tracking) */
.kr-imp { margin: 0 0 14px; }
.kr-imp > summary { list-style: none; display: inline-flex; cursor: pointer; }
.kr-imp > summary::-webkit-details-marker { display: none; }
.kr-imp-form { margin-top: 10px; background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 14px; }
.kr-imp-form p { margin: 0 0 10px; max-width: 70ch; }
.kr-imp-row { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; }
.kr-imp-f { display: flex; flex-direction: column; gap: 4px; font-size: 12px; font-weight: 600; color: var(--geo-text2); }
.kr-imp-f input[type=file] { font-size: 13px; color: var(--geo-text); max-width: 100%; }
/* A wide research table scrolls inside its box; it never widens the page. */
.sk .geo-table-wrap, .rt .geo-table-wrap { overflow-x: auto; max-width: 100%; }
/* Every cell of a row sits on one line, so a tag and its "Edit tags" never look like they belong
   to the next row; the date stays on one line; Remove is a quiet, compact button (E2E, 28 Sep). */
.sk table td, .rt table td { vertical-align: middle; }
.sk td[data-cell] .sk-edit { margin-top: 2px; }
.sk td:last-child .geo-tt-btn { padding: 4px 10px; font-size: 12px; white-space: nowrap; }
.sk td[data-value] { white-space: nowrap; }
.sk td[data-cell]:has(.sk-chips) { white-space: normal; min-width: 150px; }
.sk-table th, .sk-table td { padding-left: 6px; padding-right: 6px; }
.g-vis { font-size: 14px; font-weight: 600; color: var(--geo-text); margin: 0 0 10px; }
/* The difficulty band as a worded tag, for clients: same colours as the agency's badge. */
.geo-kd-tag { --kd: var(--geo-muted); --kd-ink: var(--geo-text2); --kd-w: 16%; display: inline-flex; align-items: center; height: 24px; padding: 0 9px;
  border-radius: 999px; font-size: 12px; font-weight: 700; white-space: nowrap;
  background: color-mix(in oklab, var(--kd) var(--kd-w), var(--geo-bg)); border: 1px solid color-mix(in oklab, var(--kd) 40%, transparent); color: var(--kd-ink); }
.geo-kd-tag.geo-kd-1 { --kd: var(--geo-good); --kd-ink: var(--geo-good-ink); --kd-w: 14%; }
.geo-kd-tag.geo-kd-2 { --kd: var(--geo-good); --kd-ink: var(--geo-good-ink); --kd-w: 26%; }
.geo-kd-tag.geo-kd-3 { --kd: var(--geo-warn); --kd-ink: var(--geo-warn-ink); --kd-w: 14%; }
.geo-kd-tag.geo-kd-4 { --kd: var(--geo-warn); --kd-ink: var(--geo-warn-ink); --kd-w: 26%; }
.geo-kd-tag.geo-kd-5 { --kd: var(--geo-bad);  --kd-ink: var(--geo-bad-ink);  --kd-w: 14%; }
.geo-kd-tag.geo-kd-6 { --kd: var(--geo-bad);  --kd-ink: var(--geo-bad-ink);  --kd-w: 28%; }
.g-vis { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-weight: 500; color: var(--geo-text2); font-size: 13px; }
.g-vis strong { font-size: 30px; line-height: 1; font-weight: 700; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.ck-row-main:has(> .rt-rank) { flex-wrap: nowrap; align-items: center; }
.ck-row-main > .rt-rank { margin-left: auto; flex-shrink: 0; }
.ck-row-main:has(> .rt-rank) .ck-row-t { min-width: 0; }
.ch-row .cr-rank { font-weight: 500; color: var(--geo-text2); font-size: 13px; }

/* ══ THE AGENCY'S CLIENT PAGE (clients/show.php, 29 Sep) ═══════════════════════════════════
   One client: who they are, the one next step, their plan, their websites, settings, intake.
   Tokens only, so both themes follow. */
.cp-page { display: flex; flex-direction: column; gap: 20px; min-width: 0; }
.cp-page > * { margin-bottom: 0 !important; }
.cp-back { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; color: var(--geo-muted); margin-bottom: 12px; }
.cp-back:hover { color: var(--geo-text); }
.cp-head { display: flex; flex-direction: column; gap: 14px; }
.cp-id { display: flex; gap: 14px; align-items: flex-start; min-width: 0; }
.cp-avatar { width: 48px; height: 48px; border-radius: 12px; flex: none; display: flex; align-items: center; justify-content: center;
  font-family: var(--geo-font-head); font-weight: 700; font-size: 17px; background: var(--geo-accent-soft); color: var(--geo-accent); }
.cp-id-main { min-width: 0; }
.cp-name { margin: 0; font-family: var(--geo-font-head); font-size: 24px; line-height: 1.2; font-weight: 700; color: var(--geo-text);
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; overflow-wrap: anywhere; }
.cp-contact { margin: 4px 0 0; font-size: 14px; color: var(--geo-text2); display: flex; flex-wrap: wrap; gap: 2px 14px; min-width: 0; }
.cp-contact a { color: inherit; overflow-wrap: anywhere; }
.cp-contact a:hover { color: var(--geo-accent); }
.cp-source { margin: 6px 0 0; font-size: 13px; line-height: 1.5; color: var(--geo-muted); }
.cp-link { color: var(--geo-accent); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
.cp-badge { display: inline-flex; align-items: center; height: 22px; padding: 0 9px; border-radius: 999px; font-size: 12px; font-weight: 650;
  font-family: var(--geo-font); background: color-mix(in oklab, var(--geo-warn) 14%, transparent); color: var(--geo-warn-ink);
  border: 1px solid color-mix(in oklab, var(--geo-warn) 40%, transparent); }
.cp-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.cp-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 40px; padding: 0 14px;
  border-radius: var(--geo-r-ctrl); font-size: 14px; text-align: center; line-height: 1.25; }
.cp-btn svg { width: 16px; height: 16px; flex: none; }
.cp-btn:disabled { opacity: .55; cursor: not-allowed; }
@media (min-width: 768px) {
  .cp-head { flex-direction: row; align-items: flex-start; justify-content: space-between; }
  .cp-actions { justify-content: flex-end; flex: none; max-width: 50%; }
}
.cp-card { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); padding: 18px; min-width: 0; }
.cp-h { margin: 0 0 4px; font-family: var(--geo-font-head); font-size: 17px; line-height: 1.3; font-weight: 650; color: var(--geo-text); }
.cp-text { margin: 0; font-size: 14px; line-height: 1.5; color: var(--geo-text2); }
.cp-note { margin: 8px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--geo-muted); }
.cp-eyebrow { margin: 0 0 6px; font-size: 12px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--geo-accent); }
.cp-row { display: flex; flex-direction: column; gap: 14px; }
.cp-row-main { min-width: 0; flex: 1 1 auto; }
.cp-row-act { display: flex; flex-direction: column; gap: 8px; }
.cp-row-act form { margin: 0; }
@media (max-width: 767px) { .cp-row-act .cp-btn { width: 100%; } }
@media (min-width: 768px) {
  .cp-row { flex-direction: row; align-items: center; justify-content: space-between; gap: 20px; }
  .cp-row-act { flex: none; align-items: stretch; }
}
.cp-next { border-color: color-mix(in oklab, var(--geo-accent) 45%, var(--geo-border)); background: color-mix(in oklab, var(--geo-accent) 5%, var(--geo-surface)); }
.cp-prospect { border-color: color-mix(in oklab, var(--geo-warn) 40%, var(--geo-border)); background: color-mix(in oklab, var(--geo-warn) 6%, var(--geo-surface)); }
.cp-prospect .cp-h { color: var(--geo-warn-ink); }
/* The top of a client's page as ONE card, a row per thing to do (Edward, 30 Sep). The rows keep
   their own markup; the wrapper is the card and each row loses its own box. */
.cp-start { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: var(--geo-r-card); overflow: hidden; min-width: 0; }
.cp-start > .cp-card { border: 0; border-radius: 0; background: transparent; padding: 14px 18px; }
.cp-start > .cp-card + .cp-card { border-top: 1px solid var(--geo-border); }
.cp-start .cp-h { font-size: 15.5px; margin: 0; }
.cp-start .cp-row { gap: 10px; }
.cp-start > .cp-next { background: color-mix(in oklab, var(--geo-accent) 5%, transparent); }
.cp-start > .cp-prospect { background: color-mix(in oklab, var(--geo-warn) 6%, transparent); }
.cp-start-for { font-size: 13px; color: var(--geo-muted); }
.cp-section-h { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 0 0 12px; }
.cp-section-h .cp-h { margin: 0; }
.cp-count { font-size: 13px; font-weight: 600; color: var(--geo-muted); margin-left: 6px; }
.cp-sites { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; }
@media (min-width: 768px) { .cp-sites { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1280px) { .cp-sites { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.cp-site { display: flex; flex-direction: column; gap: 10px; padding: 16px; }
.cp-site.is-primary { border-color: color-mix(in oklab, var(--geo-accent) 40%, var(--geo-border)); }
.cp-site-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; min-width: 0; }
.cp-site-domain { margin: 0; font-weight: 650; font-size: 15px; color: var(--geo-text); overflow-wrap: anywhere; }
.cp-site-sub { margin: 2px 0 0; font-size: 13px; color: var(--geo-muted); }
.cp-tag { flex: none; display: inline-flex; align-items: center; height: 22px; padding: 0 9px; border-radius: 999px; font-size: 12px; font-weight: 650;
  background: var(--geo-accent-soft); color: var(--geo-accent); }
.cp-status { margin: 0; font-size: 13px; color: var(--geo-muted); display: flex; align-items: center; gap: 6px; }
.cp-status.is-running { color: var(--geo-warn-ink); }
.cp-status.is-failed { color: var(--geo-bad-ink); }
.cp-dot { width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex: none; }
.cp-site-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: auto; }
.cp-site-acts > a { flex: 1 1 auto; }
.cp-site-acts form { margin: 0; flex: 1 1 auto; display: flex; }
.cp-run { flex: 1 1 auto; white-space: nowrap; }
.cp-empty { border-style: dashed; text-align: center; padding: 28px 18px; }
.cp-check { display: flex; gap: 10px; align-items: flex-start; cursor: pointer; }
.cp-check input { margin-top: 3px; width: 18px; height: 18px; flex: none; accent-color: var(--geo-accent); }
.cp-check strong { color: var(--geo-text); font-weight: 650; }
.cp-settings > * + * { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--geo-border); }
.cp-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.cp-label { font-size: 13px; font-weight: 600; color: var(--geo-text2); }
.cp-input { width: 100%; min-height: 40px; padding: 8px 12px; border-radius: var(--geo-r-ctrl); border: 1px solid var(--geo-border2);
  background: var(--geo-bg); color: var(--geo-text); font-size: 14px; }
.cp-input::placeholder { color: var(--geo-muted); }
.cp-input:focus { outline: 2px solid color-mix(in oklab, var(--geo-accent) 60%, transparent); outline-offset: 1px; }
.cp-copyrow { display: flex; gap: 8px; min-width: 0; }
.cp-copyrow .cp-input { flex: 1 1 auto; min-width: 0; font-family: var(--geo-mono); font-size: 12.5px; }
.cp-pill { display: inline-flex; align-items: center; height: 22px; padding: 0 9px; border-radius: 999px; font-size: 12px; font-weight: 650;
  background: var(--geo-surface2); color: var(--geo-text2); }
.cp-pill.is-good { background: color-mix(in oklab, var(--geo-good) 16%, transparent); color: var(--geo-good-ink); }
.cp-pill.is-warn { background: color-mix(in oklab, var(--geo-warn) 16%, transparent); color: var(--geo-warn-ink); }
.cp-pill.is-accent { background: var(--geo-accent-soft); color: var(--geo-accent); }
.cp-grid3 { display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px; }
@media (min-width: 768px) { .cp-grid3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.cp-stat-k { display: block; font-size: 12.5px; color: var(--geo-muted); }
.cp-stat-v { display: block; font-weight: 650; color: var(--geo-text); font-variant-numeric: tabular-nums; }
.cp-stat-v.is-good { color: var(--geo-good-ink); }
.cp-dialog { width: 100%; max-width: 32rem; max-height: calc(100vh - 32px); overflow-y: auto; box-shadow: 0 20px 50px rgba(0, 0, 0, .35); }
.cp-grid2 { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; }
@media (min-width: 520px) { .cp-grid2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.cp-optional { font-weight: 400; color: var(--geo-muted); }
.cp-wait { text-align: center; max-width: 28rem; }
.cp-wait-ring { width: 56px; height: 56px; margin: 0 auto 16px; border-radius: 50%; border: 3px solid var(--geo-accent-soft); border-top-color: var(--geo-accent); }
.cp-wait-step { margin: 16px 0 0; padding: 10px 14px; border-radius: var(--geo-r-ctrl); background: var(--geo-accent-soft); color: var(--geo-text);
  font-size: 14px; font-weight: 600; transition: opacity .15s; }
.cp-wait-bar { margin-top: 14px; height: 4px; border-radius: 99px; background: var(--geo-surface2); overflow: hidden; }
.cp-wait-bar > div { height: 100%; width: 0; background: var(--geo-accent); transition: width .5s; }
.agp-run { margin: 0; flex: none; }
@media (max-width: 520px) { .agp-run { align-self: flex-start; } }

/* A yellow gap in a draft opens its answer box when tapped (content journey, 30 Sep). */
mark.geophii-gap { cursor: pointer; }

/* ── Fix cards on the Fixes tab (30 Sep): buttons in one row under the card, the fix readable ── */
.fx-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 12px; }
.fx-acts form { margin: 0; }
.fx-btn { display: inline-flex; align-items: center; min-height: 36px; padding: 0 12px; border-radius: 10px; font-size: 13px; font-weight: 600;
  border: 1px solid var(--geo-border2); background: var(--geo-surface); color: var(--geo-text); white-space: nowrap; cursor: pointer; text-decoration: none; }
.fx-btn:hover { border-color: var(--geo-accent); }
.fx-btn-primary { background: var(--geo-accent); border-color: var(--geo-accent); color: var(--geo-accent-ink); }
.fx-btn.is-off { opacity: .6; cursor: not-allowed; }
.fx-link { font-size: 13px; font-weight: 600; color: var(--geo-accent); text-decoration: none; padding: 0 4px; }
.fx-link:hover { text-decoration: underline; }
.fx-steps { margin: 0; white-space: pre-wrap; font-family: inherit; font-size: 14px; line-height: 1.6; color: var(--geo-text);
  background: var(--geo-surface2); border: 1px solid var(--geo-border); border-radius: 10px; padding: 14px 16px; }
/* The app's link colour rule outranks a class (as on the Pages list, content-door.css): these are buttons with their own ink. */
.fx-acts a.fx-btn-primary { color: var(--geo-accent-ink) !important; }
.fx-acts a.fx-btn:not(.fx-btn-primary) { color: var(--geo-text) !important; }
/* ── A website's plan in the Action Plan's shape (30 Sep): number, title, one line; the button opens under the chevron ── */
.agp-top { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.agp-progress { font-size: 13px; font-weight: 600; color: var(--geo-good-ink, var(--geo-good)); }
.agp .agp-row { display: block; padding: 0; border-top: 1px solid var(--geo-border); }
.agp-step > summary { list-style: none; display: flex; align-items: flex-start; gap: 12px; padding: 12px 0; cursor: pointer; }
.agp-step > summary::-webkit-details-marker { display: none; }
.agp-num { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%;
  font-size: 13px; font-weight: 700; color: var(--geo-accent); background: color-mix(in oklab, var(--geo-accent) 14%, transparent); }
.agp-row.is-done .agp-num { color: var(--geo-good-ink, var(--geo-good)); background: color-mix(in oklab, var(--geo-good) 16%, transparent); }
.agp-row.is-done .agp-title { color: var(--geo-muted); }
.agp-step .agp-text { display: flex; flex-direction: column; gap: 2px; }
.agp-step .agp-title { margin: 0; }
.agp-step .agp-asked { align-self: flex-start; margin-top: 2px; }
.agp-chev { flex: none; width: 18px; height: 18px; margin-top: 5px; fill: none; stroke: var(--geo-muted); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: transform .15s; }
.agp-step[open] .agp-chev { transform: rotate(180deg); }
.agp-body { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 0 12px 40px; }
.agp-body:empty { display: none; }
@media (max-width: 520px) { .agp-body { padding-left: 0; } }
.agp-top-r { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; justify-content: flex-end; }
.agp-top-r .agp-make { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; margin: 0; }
.agp-top-r .agp-make .agp-sub { margin: 0; font-size: 12.5px; max-width: 26rem; }
.agp-top { margin-bottom: 6px; }
/* Laptop: the buttons sit on the right of the card, side by side; a phone keeps them underneath (Edward, 30 Sep). */
@media (min-width: 768px) {
  [data-na-row] .geo-row-main { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 20px; }
  [data-na-row] .geo-row-main > * { grid-column: 1; }
  [data-na-row] .geo-row-main > .fx-acts { grid-column: 2; grid-row: 1 / span 4; align-self: center; margin-top: 0; justify-content: flex-end; max-width: 360px; }
}
/* The fix reads as a box of text to copy (Edward, 30 Sep: "a shade so it seems like a text box"). */
.fx-steps { border-color: var(--geo-border2); box-shadow: inset 0 1px 3px color-mix(in oklab, var(--geo-text) 12%, transparent); background: var(--geo-bg); }

/* Your next best step, then See all steps (30 Sep). */
.agp-next { margin: 4px 0 8px; padding: 4px 14px 2px; border: 1px solid color-mix(in oklab, var(--geo-accent) 45%, var(--geo-border)); border-radius: 12px;
  background: color-mix(in oklab, var(--geo-accent) 5%, var(--geo-surface)); }
.agp-next-h { margin: 8px 0 0; font-size: 12px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--geo-accent); }
.agp-next .agp-row { border-top: 0; }
.agp-impact { align-self: flex-start; margin-top: 4px; padding: 2px 9px; border-radius: 99px; font-size: 12px; font-weight: 650;
  color: var(--geo-good-ink, var(--geo-good)); background: color-mix(in oklab, var(--geo-good) 14%, transparent); }
.agp-impact--low { color: var(--geo-muted); background: var(--geo-surface2); }
.agp-all > summary { padding: 10px 0; font-weight: 650; color: var(--geo-accent); cursor: pointer; }

/* The plan says when it needs updating (30 Sep): the line, and Update turns filled. */
.agp-stale { margin: 0 0 10px; padding: 8px 12px; border-radius: 10px; font-size: 13.5px; color: var(--geo-text);
  background: color-mix(in oklab, var(--geo-warn) 12%, transparent); border: 1px solid color-mix(in oklab, var(--geo-warn) 35%, var(--geo-border)); }
.agp-open.agp-open--go { position: relative; border-color: var(--geo-accent); }
/* Needs updating: a dot on the button, the reason in its tooltip (Edward, 30 Sep: "conserve space"). */
.agp-dot { position: absolute; top: -4px; right: -4px; width: 10px; height: 10px; border-radius: 50%; background: var(--geo-warn);
  box-shadow: 0 0 0 2px var(--geo-surface); animation: agp-dot 1.8s ease-in-out infinite; }
@keyframes agp-dot { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.25); } }
@media (prefers-reduced-motion: reduce) { .agp-dot { animation: none; } }

/* A status pill on a narrow board card wraps instead of spilling past the card edge
   (the exception to rule 3's one-line pills: a Task Board column is too narrow). */
.main-content .geo-pill-wrap[class*="rounded-full"] { display: inline-block; max-width: 100%; white-space: normal; }

/* Task Board progress strip (clients/_board_progress.php). One line above the columns;
   click it for the counts. Replaces the donut sidebar so the four columns get the width. */
.bp { background: var(--geo-surface); border: 1px solid var(--geo-border); border-radius: 12px; }
.bp-sum { display: flex; align-items: center; gap: 12px; padding: 10px 14px; cursor: pointer; list-style: none; }
.bp-sum::-webkit-details-marker { display: none; }
.bp-title { font-size: 13px; font-weight: 600; color: var(--geo-text); white-space: nowrap; }
.bp-rate { font-size: 13px; color: var(--geo-text2); white-space: nowrap; font-variant-numeric: tabular-nums; }
.bp-rate span { font-weight: 700; color: var(--geo-text); }
.bp-bar { flex: 1; min-width: 60px; height: 8px; display: flex; overflow: hidden; border-radius: 999px; background: var(--geo-border); }
.bp-bar > span { display: block; height: 100%; transition: width .3s ease; }
.bp-chev { color: var(--geo-muted); transition: transform .2s ease; }
.bp[open] .bp-chev { transform: rotate(180deg); }
.bp-body { padding: 0 14px 12px; display: grid; gap: 8px; }
.bp-legend { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 13px; color: var(--geo-text2); }
.bp-item { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.bp-item b { color: var(--geo-text); font-variant-numeric: tabular-nums; }
.bp-dot { width: 9px; height: 9px; border-radius: 999px; display: inline-block; }
.bp-total { padding-left: 18px; border-left: 1px solid var(--geo-border); }
.bp-label { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--geo-muted); align-self: center; }
@media (max-width: 480px) { .bp-title { display: none; } }
.bf .bf-hide, .bf[open] .bf-show { display: none; }
.bf[open] .bf-hide { display: inline; }

/* The open report's top bar: back to the form, then every saved roast of this site (30 Sep). */
.rm-rnav { display: flex; align-items: center; gap: 12px; padding-bottom: 14px; margin-bottom: 4px;
  border-bottom: 1px solid var(--geo-border); min-width: 0; }
.rm-rnav-back { flex: 0 0 auto; border: 1px solid var(--geo-border); background: var(--geo-surface); color: var(--geo-text);
  font: inherit; font-size: 14px; font-weight: 600; padding: 7px 12px; border-radius: 99px; cursor: pointer; }
.rm-rnav-back:hover { border-color: var(--geo-accent); }
.rm-rnav-chips { display: flex; gap: 8px; overflow-x: auto; scrollbar-width: thin; min-width: 0; padding: 2px; }
.rm-rnav-chip { --t: var(--geo-accent); flex: 0 0 auto; display: inline-flex; align-items: center; gap: 8px; cursor: pointer;
  font: inherit; font-size: 13px; color: var(--geo-text2); padding: 4px 10px 4px 4px; border-radius: 99px;
  border: 1px solid var(--geo-border); background: var(--geo-bg); transition: border-color .15s ease, background .15s ease; }
.rm-rnav-chip b { min-width: 30px; height: 26px; padding: 0 6px; border-radius: 99px; display: grid; place-items: center;
  font-size: 13px; color: var(--t); background: color-mix(in srgb, var(--t) 14%, transparent); font-variant-numeric: tabular-nums; }
.rm-rnav-chip.tone-good { --t: var(--geo-good); }
.rm-rnav-chip.tone-warn { --t: var(--geo-warn); }
.rm-rnav-chip.tone-bad  { --t: var(--geo-bad); }
.rm-rnav-chip:hover { border-color: var(--t); }
.rm-rnav-chip.on { border-color: var(--t); color: var(--geo-text); background: color-mix(in srgb, var(--t) 8%, var(--geo-bg)); }
.rm-aim { margin-top: 2px; }
/* The app's button rule (inline-flex, centred) outranks a class; these are cards that happen to be buttons. */
#site-tab-conversion :is(.rm-past-hero, .rm-past-row) { display: grid; justify-content: stretch; justify-items: start; text-align: left; min-height: 0; }
#site-tab-conversion .rm-past-hero { grid-template-columns: auto minmax(0, 1fr) auto; }
#site-tab-conversion .rm-past-row { grid-template-columns: auto minmax(0, 1fr) auto; }
#site-tab-conversion :is(.rm-past-go, .rm-past-row .rm-delta) { justify-self: end; }
#site-tab-conversion .rm-past-main { justify-self: stretch; }
#site-tab-conversion :is(.rm-rnav-chip, .rm-rnav-back) { min-height: 0; }

/* The fix status box above the form lines up with the cards under it (30 Sep, Edward's
   screenshot: it ran the full width while the form and Past roasts stopped short). */
#site-tab-conversion .rm-setup > .rm-status { max-width: 40rem; box-sizing: border-box; }
.rm-status-page { font-size: 13px; font-weight: 600; color: var(--geo-muted); }
.rm-fixes { display: flex; flex-direction: column; gap: 10px; }
.rm-fixes:empty { display: none; }
.rm-fixes .rm-status { margin: 0; }

/* ═══ ROAST TAB · one visual system (30 Sep, Edward: "the whole thing looks dark, no
   separation, just noisy"). Fewer boxes, clearer layers, space instead of lines:
   - the page is the background; the form is ONE raised card; inputs sit a step lighter
     than the card, so each question reads as its own thing;
   - no hairlines inside the card: space separates the questions;
   - the extras (business details, walkthrough) are quiet tinted rows, not more boxes;
   - past roasts are a plain list under a heading, not a box inside a box. */
#site-tab-conversion .rm-setup { gap: 22px; }
#site-tab-conversion .rm-card { background: var(--geo-surface); border: 1px solid var(--geo-border2);
  border-radius: 18px; box-shadow: 0 1px 0 color-mix(in srgb, var(--geo-text) 4%, transparent), 0 18px 40px -28px rgba(0, 0, 0, .55); }
#site-tab-conversion .rm-card-body { gap: 26px; padding: 26px 26px 20px; }
#site-tab-conversion .rm-card .rm-field input[type="url"],
#site-tab-conversion .rm-card .rm-field textarea { background: var(--geo-surface2); border-color: transparent; }
#site-tab-conversion .rm-card .rm-field input[type="url"]:focus,
#site-tab-conversion .rm-card .rm-field textarea:focus { border-color: var(--geo-accent); }
#site-tab-conversion .rm-card .rm-chip span { background: var(--geo-surface2); border-color: transparent; }
#site-tab-conversion .rm-card .rm-chip input:checked + span { background: var(--geo-accent-soft); border-color: var(--geo-accent); }
#site-tab-conversion .rm-card .rm-hint { color: var(--geo-muted); font-size: 13px; }
#site-tab-conversion .rm-opt { white-space: nowrap; }
/* The extras: quiet tinted rows, no lines. */
#site-tab-conversion .rm-card .rm-rowcard,
#site-tab-conversion .rm-card .rm-toggle { border: 0; margin: 0; border-radius: 12px; padding: 14px 16px;
  background: color-mix(in srgb, var(--geo-surface2) 55%, var(--geo-surface)); }
#site-tab-conversion .rm-card .rm-rowcard + .rm-toggle { margin-top: -14px; }
#site-tab-conversion .rm-card .rm-rowcard .rm-sub,
#site-tab-conversion .rm-card .rm-toggle .rm-sub { font-size: 13.5px; color: var(--geo-muted); }
#site-tab-conversion .rm-card .rm-rowcard strong,
#site-tab-conversion .rm-card .rm-toggle strong { font-size: 14px; }
/* Footer: what you get, then the button. One tint, one line above. */
#site-tab-conversion .rm-card-foot { margin-top: 6px; padding: 20px 26px 24px; border-top: 1px solid var(--geo-border);
  background: color-mix(in srgb, var(--geo-accent) 5%, var(--geo-surface)); }
#site-tab-conversion .rm-card-foot .rm-gets { font-size: 13.5px; gap: 4px 18px; }
/* Past roasts: a heading and a list on the page, no outer box. */
#site-tab-conversion .rm-past { padding: 0; border: 0; background: none; gap: 10px; margin-top: 10px; }
#site-tab-conversion .rm-past-head .rm-h2 { font-size: 18px; }
#site-tab-conversion .rm-past-hero, #site-tab-conversion .rm-past-row { background: var(--geo-surface); border-color: var(--geo-border2); }
#site-tab-conversion .rm-past-hero { background: linear-gradient(135deg, color-mix(in srgb, var(--t) 9%, var(--geo-surface)), var(--geo-surface) 70%); }
#site-tab-conversion .rm-past-hero .rm-ring::before { background: var(--geo-surface); }
@media (max-width: 767px) {
  #site-tab-conversion .rm-card-body { padding: 20px 16px 16px; gap: 22px; }
  #site-tab-conversion .rm-card-foot { padding: 18px 16px 20px; }
}
/* The form in order (30 Sep, Edward: the page, the goal, the comment with the business-details
   link under it, the walkthrough tick, then the button; "should be neat"). The business-details
   link is one quiet line under the comment box; the walkthrough is a plain tick row. No boxes. */
#site-tab-conversion .rm-card .rm-rowcard { display: block; padding: 0; margin-top: -14px; background: none; border-radius: 0; }
#site-tab-conversion .rm-card .rm-rowcard #rm-biz-text { display: inline; }
#site-tab-conversion .rm-card .rm-rowcard #rm-biz-text strong { font-size: 13.5px; font-weight: 600; color: var(--geo-text2); }
#site-tab-conversion .rm-card .rm-rowcard .rm-linkbtn { display: inline; margin-left: 4px; font-size: 13.5px; }
#site-tab-conversion .rm-card .rm-toggle { background: none; padding: 4px 0 0; margin-top: 0; }
#site-tab-conversion .rm-card .rm-rowcard + .rm-toggle { margin-top: 0; }
#site-tab-conversion .rm-card .rm-rowcard, #site-tab-conversion .rm-card .rm-rowcard * { line-height: 1.5; }
#site-tab-conversion .rm-card .rm-rowcard #rm-biz-text > * { display: inline; }
#site-tab-conversion .rm-card .rm-rowcard .rm-linkbtn { display: inline; min-height: 0; padding: 0; vertical-align: baseline; }
/* Text boxes you can see in dark mode (30 Sep, Edward: "it's just dark"): a lighter fill mixed from
   the text colour, so it works on any surface in both themes, and a visible edge. */
#site-tab-conversion .rm-card .rm-field input[type="url"],
#site-tab-conversion .rm-card .rm-field textarea,
#site-tab-conversion .rm-card .rm-chip span {
  background: color-mix(in srgb, var(--geo-text) 9%, var(--geo-surface));
  border: 1px solid color-mix(in srgb, var(--geo-text) 22%, var(--geo-surface)); }
#site-tab-conversion .rm-card .rm-field input[type="url"]:hover,
#site-tab-conversion .rm-card .rm-field textarea:hover { border-color: color-mix(in srgb, var(--geo-text) 38%, var(--geo-surface)); }
#site-tab-conversion .rm-card .rm-field input[type="url"]:focus,
#site-tab-conversion .rm-card .rm-field textarea:focus { border-color: var(--geo-accent); background: color-mix(in srgb, var(--geo-text) 11%, var(--geo-surface)); }
#site-tab-conversion .rm-card .rm-field textarea::placeholder { color: color-mix(in srgb, var(--geo-text) 55%, var(--geo-surface)); }
#site-tab-conversion .rm-card .rm-chip input:checked + span { background: var(--geo-accent-soft); border-color: var(--geo-accent); }
/* The app's dark rule forces every input to --geo-surface2 with !important (line ~500), which on
   this card is nearly the card itself. This card's boxes win it back, in both themes. */
html #site-tab-conversion .rm-card .rm-field input[type="url"],
html #site-tab-conversion .rm-card .rm-field textarea {
  background-color: color-mix(in srgb, var(--geo-text) 9%, var(--geo-surface)) !important;
  border-color: color-mix(in srgb, var(--geo-text) 24%, var(--geo-surface)) !important; }
html #site-tab-conversion .rm-card .rm-field input[type="url"]:focus,
html #site-tab-conversion .rm-card .rm-field textarea:focus { border-color: var(--geo-accent) !important; }
html #site-tab-conversion .rm-card #rm-biz #rm-biz-open { display: inline; font-size: 13.5px; margin-left: 4px; padding: 0; min-height: 0; }
html #site-tab-conversion .rm-card #rm-biz #rm-biz-text strong { font-size: 13.5px; }

/* A button that's sending its form (public/js/button-busy.js, 30 Sep): a spinner in the
   button's own colour, so it reads in both themes and on every button style. */
.is-busy { cursor: progress !important; opacity: .85; }
.is-busy::before {
  content: ""; display: inline-block; width: .9em; height: .9em; margin-right: .5em; vertical-align: -.12em;
  border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%;
}
@media (prefers-reduced-motion: no-preference) { .is-busy::before { animation: rm-spin .7s linear infinite; } }

/* The line beside a button after geoAct() (button-busy.js): quiet when it went through,
   the bad colour when it didn't. Token colours, so it reads in both themes. */
.geo-act-note { display: inline-block; margin-left: .5rem; font-size: .8125rem; line-height: 1.3; color: var(--geo-good); vertical-align: middle; }
.geo-act-note.is-bad { color: var(--geo-bad); }

/* A switched-off button looks switched off, everywhere (30 Sep: the backlinks button looked
   live and did nothing). A busy button keeps its own look (.is-busy above). */
button:disabled:not(.is-busy), input[type="submit"]:disabled:not(.is-busy) {
  opacity: .5 !important; cursor: not-allowed !important; filter: saturate(.4); box-shadow: none !important;
}
button:disabled:not(.is-busy):hover { transform: none !important; }

/* Something already done, shown where its button would be: a quiet tag, not a button. */
.geo-done-tag {
  display: inline-flex; align-items: center; gap: .35rem; min-height: 44px; padding: 0 .9rem;
  border-radius: 999px; border: 1px solid color-mix(in srgb, var(--geo-good) 40%, transparent);
  color: var(--geo-good); font-size: .875rem; font-weight: 600; white-space: nowrap;
}
