/* Theme: auto-cqbet.uk
   Generated from style tokens for cqbet@GB (editorial; hue 174, vivid, dark-first; compact).
   Structure inherited from the neon skeleton; the token block
   at the end of this file replaces its palette. */
/* Theme: neon
   ──────────────────────────────────────────────────────────────────────────
   The one theme built to be clicked rather than read.

   The other three are editorial: quiet surfaces, one accent, type doing the
   work. That is right for a comparison somebody arrived at from a query, and
   wrong for a page whose job is to send a reader to an operator — next to the
   pages that actually rank for a brand term, they read as a whitepaper.

   What changed and what did not. No JavaScript, no web fonts, no external host:
   the CSS fingerprint is the network's cheapest tell and a font request is a
   third party on every page. Everything here is a gradient, a shadow, a radius
   or a colour, which cost nothing and are what "modern casino site" is actually
   made of.

   The offer box gets the loudest thing on the page and nothing else competes
   with it. Significant terms inside it stay at the theme's smallest step and
   the secondary ink colour — never smaller, never dimmer. Terms a reader cannot
   read satisfy a checker and nobody else. */

:root {
  --ink: #f2f4ff;
  --ink-2: #a7adcc;
  --muted: #8b867c;
  --rule: #262c47;
  --rule-2: #1a1f36;
  --bg: #080a12;
  --surface: #121627;
  --raised: #1c1a14;
  --accent: #ffc23d;
  --accent-ink: #14120c;
  --accent-soft: #1d1a12;
  --warn-bg: #241a0c;
  --warn-rule: #5a4318;
  --warn-ink: #e8bf6c;
  --star: #e0a63c;
  --bar: #e0a63c;
  --star-empty: None;

  --measure: 74ch;
  --page: 1060px;
  --radius: 4px;
  --shadow: 0 1px 0 rgb(255 255 255 / .04) inset, 0 12px 32px -16px rgb(0 0 0 / .9);

  --step-0: clamp(1.0625rem, 1rem + .3vw, 1.1875rem);
  --step--1: clamp(.9375rem, .92rem + .07vw, .96875rem);
  --step--2: .8125rem;
  --step--3: .6875rem;
  --sp-1: .25rem; --sp-2: .5rem; --sp-3: .75rem; --sp-4: 1rem;
  --sp-5: 1.5rem; --sp-6: 2rem; --sp-8: 3rem; --sp-12: 4.5rem;
  --step-1: clamp(1.2rem, 1.13rem + .35vw, 1.4rem);
  --step-2: clamp(1.5rem, 1.35rem + .75vw, 1.95rem);
  --step-3: clamp(2rem, 1.6rem + 2vw, 3.1rem);
}

@media (prefers-color-scheme: light) {
  :root {
    /* Dark-first theme, so this is the deliberate light counterpart rather than
       the original palette: same amber, darkened wherever it carries text,
       because amber on white is a contrast failure at every text size. */
    --ink: #14172a;
    --ink-2: #4a5070;
    --muted: #5b6180;
    --rule: #d9dcec;
    --rule-2: #eceef7;
    --bg: #f7f8fc;
    --surface: #ffffff;
    --raised: #ffffff;
    --accent: #8a5a00;
    --accent-ink: #ffffff;
    --accent-soft: #fdf3dd;
    --warn-bg: #fdf3dd;
    --warn-rule: #d8bf82;
    --warn-ink: #5a4310;
    --star: #8a5a00;
    --bar: #8a5a00;
    --shadow: 0 1px 2px rgb(20 23 42 / .06), 0 10px 28px -14px rgb(20 23 42 / .22);
  }
}

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }

/* The page is centred on <body>, not on its children.

   It used to be centred by `body > * { margin-inline: auto }`, and every block
   that set a `margin: 0 0 1.75rem` shorthand — the age notice, the hero, the
   takeaways, nearly all of them — silently reset that auto back to zero. A
   shorthand writes all four sides, so each of those rules undid the centring
   without mentioning margins horizontally at all. The whole page sat against
   the left edge with the rest of a wide screen empty beside it.

   Centring the container instead puts the declaration somewhere no block rule
   can reach: a child cannot override a property it does not inherit. Blocks are
   free to use margin shorthands, which is what a block author will write. */
body {
  max-width: calc(var(--page) + 2.5rem);  /* the page, plus both gutters */
  margin: 0 auto;
  padding: clamp(1.25rem, 4vw, 2.5rem) 1.25rem 4rem;
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: var(--step-0);
  line-height: 1.68;
  color: var(--ink);
  background: var(--bg);
}

h1, h2, h3 { line-height: 1.15; letter-spacing: -.02em; margin: 0 0 .5em; text-wrap: balance; }
h1 { font-size: var(--step-3); font-weight: 800; }
h2 { font-size: var(--step-2); font-weight: 750; margin-top: 2.75rem; }
h3 { font-size: var(--step-1); font-weight: 700; }
p  { margin: 0 0 1.1em; }

a { color: var(--accent); text-underline-offset: .18em; }

.prose, .hero-body, .methodology-body, .legal-body { max-width: var(--measure); }

.visually-hidden {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}

/* ── Age notice ─────────────────────────────────────────────────────────── */
.age-18 {
  display: flex; gap: .85rem; align-items: center;
  margin: 0 0 1.75rem; padding: .8rem 1rem;
  background: var(--warn-bg);
  border-left: 3px solid var(--warn-ink);
  border-radius: 0 var(--radius) var(--radius) 0;
  color: var(--warn-ink); font-size: var(--step--1);
}
.age-18 p { margin: 0; }
.age-mark {
  flex: none; display: grid; place-items: center;
  min-width: 2.4rem; height: 1.6rem;
  background: var(--warn-ink); color: var(--warn-bg);
  border-radius: var(--radius);
  font-weight: 800; font-size: var(--step--2);
}

/* ── Hero ────────────────────────────────────────────────────────────────── */
.hero { margin: 0 0 2.5rem; }
.eyebrow {
  display: inline-block; margin: 0 0 .8rem; padding: .2rem .6rem;
  background: var(--accent-soft); color: var(--accent);
  border-radius: var(--radius);
  font-size: var(--step--3); font-weight: 700; letter-spacing: .1em; text-transform: uppercase;
}
.hero-body { color: var(--ink-2); font-size: 1.05em; }
.hero-meta { margin: 1.1rem 0 0; font-size: var(--step--2); color: var(--muted); }

/* ── Trust strip ─────────────────────────────────────────────────────────── */
.trust-strip {
  display: flex; flex-wrap: wrap; gap: .5rem; list-style: none;
  margin: 1.5rem 0 0; padding: 0;
}
.trust-item {
  flex: 1 1 10rem; padding: .75rem .9rem;
  background: var(--surface); border: 1px solid var(--rule); border-radius: var(--radius);
}
.trust-value {
  display: block; font-size: 1.15rem; font-weight: 800; line-height: 1.2;
  font-variant-numeric: tabular-nums; color: var(--accent);
}
.trust-label { display: block; margin-top: .15rem; font-size: var(--step--2); color: var(--muted); }
@media (max-width: 560px) { .trust-item { flex: 1 1 100%; } }

/* ── Affiliate disclosure ────────────────────────────────────────────────── */
.affiliate-disclosure {
  margin: 0 0 2rem; padding: .75rem 1rem;
  background: var(--surface); border: 1px solid var(--rule); border-radius: var(--radius);
  color: var(--muted); font-size: var(--step--1);
}

/* ── Comparison table ────────────────────────────────────────────────────── */
.offer-listing { margin: 0 0 .5rem; }
.offer-intro { max-width: var(--measure); color: var(--ink-2); }

.table-scroll {
  overflow-x: auto;
  /* Explicit: a non-visible overflow-x makes overflow-y compute to auto,
     which turns this into a vertical scroll container that eats the page's
     wheel events whenever the pointer happens to be over the table. */
  overflow-y: hidden;
  background: var(--raised);
  border: 1px solid var(--rule);
  border-radius: var(--radius) var(--radius) 0 0;
  box-shadow: var(--shadow);
}

.offer-table { width: 100%; border-collapse: collapse; min-width: 660px; font-size: var(--step--1); }
.offer-table thead th {
  padding: .75rem 1rem; background: var(--surface);
  text-align: left; font-size: var(--step--3); font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase; color: var(--muted);
  border-bottom: 1px solid var(--rule); white-space: nowrap;
}
.offer-table tbody td, .offer-table tbody th {
  padding: var(--sp-4); text-align: left; vertical-align: top;
  border-bottom: 1px solid var(--rule-2);
}
.offer-table tbody tr:last-child td, .offer-table tbody tr:last-child th { border-bottom: 0; }
.offer-table tbody tr:hover { background: var(--accent-soft); }


.brand-cell {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-1) var(--sp-2);
  min-width: 205px; font-weight: 400;
  border-inline-start: 3px solid transparent;
}
.brand-cell .brand-name { flex-basis: 100%; font-weight: 700; }
.offer-table tr.top-pick > .brand-cell { border-inline-start-color: var(--accent); }
.brand-mark { margin-right: 0; }
.brand-note { margin-left: 0; flex-basis: 100%; }
.brand-mark {
  display: inline-grid; place-items: center;
  width: 2.15rem; height: 2.15rem; margin-right: .65rem; vertical-align: middle;
  background: linear-gradient(145deg, var(--accent), color-mix(in srgb, var(--accent) 62%, #000));
  color: var(--accent-ink); border-radius: var(--radius);
  font-weight: 800; font-size: var(--step--2);
}

/* A supplied mark, in exactly the box .brand-mark occupies, so a row is the
   same height whether or not anyone has signed for a logo yet. object-fit is
   `contain` and the file is already padded to the box, which means the mark is
   never stretched — a squashed wordmark is an altered wordmark.

   No filter, no mix-blend-mode, no opacity: each is a recolour by another name,
   and recolouring is a contract breach, not a style choice. The dark variant
   comes from the operator via <picture>, or the light one is shown as supplied. */
.brand-logo { display: inline-block; margin-right: .6rem; vertical-align: middle; }
.brand-logo img {
  display: block; width: auto; height: 2.15rem; max-width: 8.25rem;
  object-fit: contain; object-position: left center;
}

.offer-cell { max-width: 22ch; }
.num { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--accent); white-space: nowrap; }

.rating-cell { white-space: nowrap; }
.rating { display: inline-flex; flex-direction: column; gap: .3rem; }
.rating-num {
  font-size: 1.18rem; font-weight: 800; line-height: 1;
  font-variant-numeric: tabular-nums; color: var(--ink);
}
.rating-num small { font-size: var(--step--3); font-weight: 600; color: var(--muted); }
.rating-bar {
  position: relative; width: 5.5rem; height: .3rem;
  background: var(--rule); border-radius: 999px; overflow: hidden;
}
.rating-bar i {
  display: block; height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, color-mix(in srgb, var(--bar) 60%, transparent), var(--bar));
}

.cta-cell { text-align: right; }
.cta {
  display: inline-flex; align-items: center; padding: .7rem 1.1rem; min-height: 44px;
  background: var(--accent); color: var(--accent-ink);
  border-radius: var(--radius);
  font-size: var(--step--2); font-weight: 750; letter-spacing: .01em;
  text-decoration: none; white-space: nowrap;
}
.cta:hover { filter: brightness(1.12); }

/* ── Top pick and per-row badge ────────────────────────────────────────── */
.offer-table tr.top-pick { background: var(--accent-soft); }
.offer-table tr.top-pick .brand-name { font-weight: 800; }
.badge {
  display: inline-block; margin-left: .55rem; padding: .1rem .5rem;
  background: var(--accent); color: var(--accent-ink);
  border-radius: var(--radius); font-size: var(--step--3); font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase; vertical-align: middle;
}
.sig-terms-list { list-style: none; margin: .35rem 0 0; padding: 0; }
.sig-terms-list li { margin-bottom: .3rem; }
.sig-terms-list li:last-child { margin-bottom: 0; }

/* ── Significant terms ─────────────────────────────────────────────────────
   In-table, under the offer they qualify. */
.terms-row td { border-inline-start: 0;
  padding: .1rem 1rem .9rem !important;
  border-bottom: 1px solid var(--rule) !important;
}
.offer-table tbody tr.terms-row:hover { background: transparent; }
.sig-terms { margin: 0; font-size: var(--step--2); line-height: 1.55; color: var(--ink-2); }
.sig-terms-label {
  display: inline-block; margin-right: .45rem;
  font-size: var(--step--3); font-weight: 700; letter-spacing: .12em;
  text-transform: uppercase; color: var(--accent);
}
.offer-conditions {
  margin: 0 0 2.5rem; padding: .9rem 1rem;
  background: var(--surface);
  border: 1px solid var(--rule); border-top: 0;
  border-radius: 0 0 var(--radius) var(--radius);
  font-size: var(--step--2); color: var(--muted);
}
.offer-conditions p { margin: 0; }

/* ── Methodology ─────────────────────────────────────────────────────────── */
.methodology { margin: 3.25rem 0; }
.weights { list-style: none; margin: 1.3rem 0 1rem; padding: 0; max-width: 34rem; }
.weight { display: grid; grid-template-columns: 10rem 1fr 3rem; gap: .85rem; align-items: center; margin-bottom: .55rem; }
.weight-name { font-size: var(--step--1); text-transform: capitalize; }
.weight-bar { height: .45rem; background: var(--rule-2); border-radius: 999px; overflow: hidden; }
.weight-bar i {
  display: block; height: 100%; border-radius: 999px;
  background: linear-gradient(90deg, color-mix(in srgb, var(--accent) 55%, transparent), var(--accent));
}
.weight-num { font-size: var(--step--2); font-variant-numeric: tabular-nums; color: var(--muted); text-align: right; }
.methodology-note { font-size: var(--step--2); color: var(--muted); }

/* ── Licence verification ────────────────────────────────────────────────── */
.licence-verification { margin: 3.25rem 0; }
.licence-card {
  display: flex; gap: 1rem; align-items: flex-start;
  padding: 1.15rem 1.25rem;
  background: var(--surface); border: 1px solid var(--rule);
  border-left: 3px solid var(--accent); border-radius: var(--radius);
}
.licence-badge {
  flex: none; display: grid; place-items: center;
  width: 2.1rem; height: 2.1rem; border-radius: 50%;
  background: var(--accent); color: var(--accent-ink); font-weight: 800;
}
.licence-card p { margin: 0 0 .35rem; }
.licence-card p:last-child { margin: 0; }
.licence-number {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: .9em; color: var(--accent);
}

/* ── Responsible gambling ────────────────────────────────────────────────── */
.rg-help {
  margin: 4rem 0 0; padding: 1.75rem 1.25rem;
  background: var(--surface); border: 1px solid var(--rule); border-radius: var(--radius);
}
.rg-help h2 { margin-top: 0; font-size: var(--step-1); }
.rg-links { list-style: none; margin: 1rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .55rem; }
.rg-links li { margin: 0; }
.rg-links a {
  display: inline-block; padding: .42rem .85rem;
  background: var(--raised); border: 1px solid var(--rule); border-radius: var(--radius);
  font-size: var(--step--2); text-decoration: none;
}
.rg-links a:hover { border-color: var(--accent); }

/* ── Key takeaways ───────────────────────────────────────────────────────
   A panel, matching this theme's panels-on-near-black structure. */
.takeaways { margin: 0 0 var(--sp-6); }
.takeaway-list {
  margin: 0; padding: var(--sp-5) var(--sp-5) var(--sp-5) calc(var(--sp-5) + 1.2rem);
  list-style: none; background: var(--surface);
  border: 1px solid var(--rule); border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  display: grid; gap: var(--sp-3);
}
.takeaway-list li {
  position: relative; padding-left: .35rem;
  max-width: var(--measure); color: var(--ink-2);
}
.takeaway-list li::before {
  content: "\25b8"; position: absolute; left: -1.2rem; top: 0; color: var(--accent);
}

/* ── FAQ ─────────────────────────────────────────────────────────────────
   A definition list, not accordions. Answers hidden behind JavaScript on a
   site that ships none would be hidden permanently. */
.faq { margin: var(--sp-6) 0; }
.faq-list { margin: 0; display: grid; gap: var(--sp-5); }
.faq-list dt {
  font-weight: 700; color: var(--ink); max-width: var(--measure);
  margin-bottom: var(--sp-2);
}
.faq-list dd {
  margin: 0; padding: var(--sp-3) var(--sp-4);
  background: var(--surface); border: 1px solid var(--rule);
  border-radius: var(--radius);
  color: var(--ink-2); max-width: var(--measure);
}

.faq-list dd p { margin: 0 0 .6em; }
.faq-list dd p:last-child { margin-bottom: 0; }

/* ── Payment methods ─────────────────────────────────────────────────── */
.payments { margin: var(--sp-6) 0; }
.payments-intro { max-width: var(--measure); color: var(--ink-2); }
.payments-table { width: 100%; border-collapse: collapse; min-width: 460px; font-size: var(--step--1); }
.payments-table thead th {
  background: var(--surface); padding: .8rem 1rem; text-align: left;
  font-size: var(--step--3); font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted);
  border-bottom: 1px solid var(--rule); white-space: nowrap;
}
.payments-table tbody th, .payments-table tbody td {
  padding: var(--sp-4); border-bottom: 1px solid var(--rule-2);
  text-align: left; vertical-align: top;
}
.payments-table tbody th { font-weight: 700; color: var(--ink); }

/* The card layout starts here rather than at 640px because that was wrong.
   Measured in a browser, this table's min-content width is about 816px against
   40px of page gutter, so every viewport from 641px to roughly 858px put the
   table in table mode and clipped the CTA off the right edge — the one element
   the page exists to offer, hidden behind a scrollbar with no affordance. The
   margin above the measurement is deliberate: a longer real brand name than
   "Northgate Casino" pushes min-content up again. */
@media (max-width: 900px) {
  .offer-table { min-width: 0; }
  .offer-table thead { display: none; }
  .offer-table tbody tr { display: block; padding: .4rem 0; border-bottom: 1px solid var(--rule); }
  .offer-table tbody tr:last-child { border-bottom: 0; }
  .offer-table tbody td, .offer-table tbody th {
    display: flex; justify-content: space-between; gap: 1rem;
    padding: .45rem 1rem; border: 0; text-align: right;
  }

  /* The header row is gone here, so every value has to carry its own name. The
     template has emitted data-label on each cell all along and no theme ever
     rendered it, so this layout showed a column of bare figures — "£20", "40x",
     "8/10" — with nothing saying which was the deposit and which the wagering.
     space-between was written around a label that was never there. */
  .offer-table tbody td::before {
    content: attr(data-label);
    flex: 0 0 auto; text-align: left;
    font-size: var(--step--3); font-weight: 700;
    letter-spacing: .08em; text-transform: uppercase; color: var(--muted);
    align-self: center;
  }
  .offer-table tbody td.cta-cell::before { content: none; }
  /* 22ch is a sane column in a table and a cage in a card. */
  .offer-cell { max-width: none; }
  .offer-table tbody th.brand-cell {
    display: flex; flex-wrap: wrap; justify-content: flex-start;
    text-align: left; gap: var(--sp-1) var(--sp-2); padding-top: .75rem;
  }
  .brand-note { margin-left: 0; }
  .terms-row td { display: block; text-align: left; padding: .2rem 1rem .8rem !important; }
  .terms-row td::before { content: none; }
  .cta { width: 100%; text-align: center; }
  .payments-table { min-width: 0; }
  .payments-table thead { display: none; }
  .payments-table tbody tr { display: block; padding: var(--sp-3) 0; border-bottom: 1px solid var(--rule); }
  .payments-table tbody th, .payments-table tbody td {
    display: flex; justify-content: space-between; gap: 1rem;
    padding: .35rem 1rem; border: 0; text-align: right;
  }
  .payments-table tbody th { text-align: left; padding-top: .7rem; }
  .payments-table tbody td::before {
    content: attr(data-label); flex: 0 0 auto; text-align: left;
    font-size: var(--step--3); font-weight: 700; letter-spacing: .07em;
    text-transform: uppercase; color: var(--muted); align-self: center;
  }
  .weight { grid-template-columns: 8rem 1fr 2.6rem; }
}


/* ── Licensee table ───────────────────────────────────────────────────────
   Every cell comes from the regulator's register, so this table carries no
   rating, no badge and no top pick — there is nothing here anyone chose. It
   collapses to cards at the same width as the offer table and for the same
   reason: a licence number is long, and five columns of long strings clip the
   last one off the right edge before a reader notices there was a fifth. */
.licensees { margin: 0 0 var(--sp-7, 2.5rem); }
.licensees-intro { max-width: var(--measure); color: var(--ink-2); }
.licensee-table {
  width: 100%; border-collapse: collapse; min-width: 680px;
  font-size: var(--step--1);
}
.licensee-table thead th {
  text-align: left; font-size: var(--step--2); text-transform: uppercase;
  letter-spacing: .06em; color: var(--ink-2); font-weight: 650;
  padding: .7rem .85rem; border-bottom: 1px solid var(--rule);
}
.licensee-table tbody td, .licensee-table tbody th {
  padding: .8rem .85rem; vertical-align: top; border-bottom: 1px solid var(--rule);
}
.licensee-table tbody tr:last-child td, .licensee-table tbody tr:last-child th { border-bottom: 0; }
/* A licence reference is 19 characters of digits and hyphens. Left to wrap it
   breaks mid-number, and half a licence number reads like a different one. */
.licence-cell { font-variant-numeric: tabular-nums; white-space: nowrap; font-weight: 500; }
.licensee-was {
  display: block; margin-top: .25rem; font-size: var(--step--2); color: var(--ink-2);
}

@media (max-width: 980px) {
  .licensee-table { min-width: 0; }
  .licensee-table thead { display: none; }
  .licensee-table tbody tr {
    display: block; border-bottom: 1px solid var(--rule); padding: .35rem 0;
  }
  .licensee-table tbody tr:last-child { border-bottom: 0; }
  .licensee-table tbody td, .licensee-table tbody th {
    display: flex; gap: .75rem; align-items: baseline; border: 0;
    padding: .3rem .1rem; white-space: normal;
  }
  .licensee-table tbody td::before {
    content: attr(data-label);
    flex: 0 0 auto; min-width: 9.5rem;
    font-size: var(--step--2); text-transform: uppercase; letter-spacing: .05em;
    color: var(--ink-2);
  }
  .licensee-table tbody th.brand-cell { font-size: var(--step-0); padding-bottom: .5rem; }
  .licence-cell { white-space: normal; word-break: break-all; }
}


/* ── Single-operator review ───────────────────────────────────────────────
   Five blocks that only appear on a brand page. Laid out to match what the
   ranking reviews in the UK results actually do: a summary a reader can skim
   in five seconds, two columns of strengths and drawbacks, scores that show
   their own weighting, and a verdict that repeats the rating where a reader
   looks for it. */

.at-a-glance { margin: 0 0 var(--sp-7, 2.5rem); }
.glance-grid { margin: 0; display: grid; gap: 1px; background: var(--rule); border: 1px solid var(--rule); }
.glance-row { display: flex; gap: 1rem; padding: .7rem .9rem; background: var(--bg); }
.glance-row dt { flex: 0 0 13rem; color: var(--ink-2); font-size: var(--step--1); }
.glance-row dd { margin: 0; font-weight: 600; }

.pros-cons { margin: 0 0 var(--sp-7, 2.5rem); }
.proscons-intro { max-width: var(--measure); color: var(--ink-2); }
.proscons-grid { display: grid; gap: 1.25rem; grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pros, .cons { border: 1px solid var(--rule); padding: .9rem 1.1rem; }
.pros h3, .cons h3 { margin: 0 0 .5rem; font-size: var(--step--1); text-transform: uppercase; letter-spacing: .06em; }
.pros ul, .cons ul { margin: 0; padding-left: 1.1rem; }
.pros li, .cons li { margin: 0 0 .4rem; }
.pros li::marker { content: "✓ "; color: #4fd1a5; }
.cons li::marker { content: "✕ "; color: #ff8b7a; }

.criteria { margin: 0 0 var(--sp-7, 2.5rem); }
.criteria-intro, .criteria-note { max-width: var(--measure); color: var(--ink-2); }
.criteria-note { font-size: var(--step--2); }
.criteria-list { list-style: none; margin: 1rem 0; padding: 0; }
.criteria-row {
  display: grid; align-items: center; gap: .75rem; padding: .4rem 0;
  grid-template-columns: minmax(7rem, 12rem) minmax(0, 1fr) auto auto;
}
.criteria-name { text-transform: capitalize; }
.criteria-bar { display: block; height: .5rem; background: var(--rule-2, var(--rule)); }
.criteria-bar i { display: block; height: 100%; background: var(--accent); }
.criteria-score { font-weight: 650; }
.criteria-weight { font-size: var(--step--2); color: var(--ink-2); white-space: nowrap; }

.providers { margin: 0 0 var(--sp-7, 2.5rem); }
.providers-intro { max-width: var(--measure); color: var(--ink-2); }
.provider-list { list-style: none; margin: 1rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: .5rem; }
.provider-list li { border: 1px solid var(--rule); padding: .3rem .7rem; font-size: var(--step--1); }

.verdict { margin: 0 0 var(--sp-7, 2.5rem); border-top: 1px solid var(--rule); padding-top: 1.1rem; }
.verdict-score { display: flex; align-items: baseline; gap: .75rem; margin: 0 0 .6rem; }
.verdict-basis { font-size: var(--step--2); color: var(--ink-2); }
.verdict-body { max-width: var(--measure); }

@media (max-width: 640px) {
  .glance-row { display: block; }
  .glance-row dt { font-size: var(--step--2); }
  .proscons-grid { grid-template-columns: minmax(0, 1fr); }
  /* The bar is the first thing to go: it is decoration, and at this width it
     squeezes the score and its weight into two characters each. */
  .criteria-row { grid-template-columns: minmax(0, 1fr) auto; }
  .criteria-bar { display: none; }
  .criteria-weight { grid-column: 1 / -1; }
}


/* ── The offer, first ─────────────────────────────────────────────────────
   The only block on the page designed to be clicked rather than read. It gets
   the accent as a filled surface, the largest type outside the h1, and the
   button at a size a thumb hits without aiming.

   The significant terms sit inside the box. Small, but not smaller than the
   theme's smallest step and not greyed below the contrast floor: terms a reader
   cannot read are terms that satisfy a checker and nobody else, and that is the
   exact complaint the ASA upholds. */
.offer-hero {
  margin: 0 0 var(--sp-7, 2.5rem);
  border: 2px solid var(--accent);
  background: var(--accent-soft);
  box-shadow: var(--shadow);
}
.offer-hero-body { padding: 1.4rem 1.5rem 1.25rem; }
.offer-hero-brand {
  margin: 0 0 .25rem; font-size: var(--step--2); text-transform: uppercase;
  letter-spacing: .1em; font-weight: 700; color: var(--accent);
}
.offer-hero-headline {
  margin: 0 0 .4rem; font-size: var(--step-2); line-height: 1.12; font-weight: 780;
}
.offer-hero-pitch { margin: 0 0 1rem; color: var(--ink-2); max-width: 46ch; }

.offer-hero-facts {
  list-style: none; margin: 0 0 1.1rem; padding: 0;
  display: grid; gap: .6rem 1.5rem;
  grid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));
}
.offer-hero-facts li { display: flex; flex-direction: column; gap: .1rem; }
.offer-hero-facts span { font-size: var(--step--2); color: var(--ink-2); }
.offer-hero-facts strong { font-size: var(--step-0); font-weight: 700; }

.cta-large {
  display: inline-block; font-size: var(--step-0); font-weight: 700;
  padding: .8rem 1.6rem; min-height: 2.75rem;
}

.offer-hero-terms {
  margin: 1rem 0 0; padding-top: .8rem; border-top: 1px solid var(--rule);
  /* Not below the theme's smallest step, and not below --ink-2. */
  font-size: var(--step--2); color: var(--ink-2); line-height: 1.5;
}

@media (max-width: 560px) {
  .offer-hero-body { padding: 1.1rem 1rem 1rem; }
  .offer-hero-headline { font-size: var(--step-1); }
  .cta-large { display: block; text-align: center; }
}


/* ── What makes this theme different from the other three ─────────────────
   Everything below is an override on the dark base above. Kept in one block so
   the difference between a reading theme and a converting one is legible as a
   diff rather than scattered through eight hundred lines. */

:root {
  --radius: 14px;
  --radius-sm: 9px;
  --accent-2: #7b5cff;                      /* cool secondary, for depth only */
  --glow: 0 0 0 1px rgb(255 194 61 / .35), 0 10px 30px -8px rgb(255 194 61 / .45);
  --lift: 0 1px 0 rgb(255 255 255 / .04) inset, 0 12px 32px -18px rgb(0 0 0 / .9);
  --step-3: clamp(2.1rem, 1.3rem + 3.6vw, 3.4rem);
}

body { background:
  radial-gradient(1100px 520px at 50% -12%, #17203f 0%, transparent 70%),
  var(--bg);
}

/* Surfaces are cards, not rules. Rounded and lifted, because every page this
   competes with is built out of tiles and a flat bordered box reads as a form. */
.age-18, .takeaways, .licence-card, .rg-help, .faq, .pros, .cons,
.table-scroll, .glance-grid, .at-a-glance, .criteria, .providers, .verdict {
  border-radius: var(--radius);
}
.table-scroll, .pros, .cons { background: var(--surface); box-shadow: var(--lift); }
.glance-grid { overflow: hidden; box-shadow: var(--lift); }
.glance-row { background: var(--surface); }

/* The hero offer: the loudest object on the page, and the only one allowed to be. */
.offer-hero {
  border: 0;
  border-radius: calc(var(--radius) + 4px);
  background:
    linear-gradient(180deg, rgb(255 194 61 / .10), transparent 55%),
    linear-gradient(140deg, #1b2140 0%, #141830 55%, #10132a 100%);
  box-shadow: 0 0 0 1px rgb(255 194 61 / .28), 0 26px 60px -30px rgb(0 0 0 / 1);
}
.offer-hero-brand { color: var(--accent); letter-spacing: .14em; }
.offer-hero-headline {
  background: linear-gradient(92deg, #ffe8a8, var(--accent) 55%, #ff9f45);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.offer-hero-facts li {
  background: rgb(255 255 255 / .035);
  border: 1px solid var(--rule);
  border-radius: var(--radius-sm);
  padding: .55rem .7rem;
}
.offer-hero-facts strong { color: var(--ink); }

/* One button treatment, used everywhere a click is wanted. */
.cta {
  border-radius: 999px;
  background: linear-gradient(180deg, #ffd166, var(--accent) 45%, #f0a91f);
  color: var(--accent-ink);
  border: 0;
  font-weight: 750;
  letter-spacing: .01em;
  box-shadow: var(--glow);
  text-decoration: none;
}
.cta:hover { filter: brightness(1.07); }
.cta:active { transform: translateY(1px); }
.cta-large { padding: .95rem 2rem; }

/* Chips: providers, payment methods, anything that is a set of short labels.
   A bulleted list of studio names is data; a row of chips is a library. */
.provider-list li, .payments-list li {
  border-radius: 999px;
  border-color: var(--rule);
  background: rgb(255 255 255 / .04);
  padding: .38rem .85rem;
}

/* Badges and ratings carry the accent, so a scan finds the ranking first. */
.badge {
  border-radius: 999px;
  background: linear-gradient(180deg, #ffd166, var(--accent));
  color: var(--accent-ink);
  font-weight: 750;
}
.rating-num { color: var(--accent); }
.rating-bar, .criteria-bar { border-radius: 999px; overflow: hidden; background: var(--rule-2); }
.rating-bar i, .criteria-bar i {
  background: linear-gradient(90deg, var(--accent-2), var(--accent));
}

/* The top row of a comparison reads as the top row without anyone writing that
   it is: a hairline of accent down its edge, not a different background. */
.offer-table tr.top-pick { background: linear-gradient(90deg, rgb(255 194 61 / .07), transparent 55%); }
.offer-table tr.top-pick > .brand-cell { border-inline-start-color: var(--accent); }

.brand-mark {
  border-radius: var(--radius-sm);
  background: linear-gradient(160deg, #2a3157, #191d33);
  border: 1px solid var(--rule);
  color: var(--ink-2);
}

/* The age notice stays legible rather than becoming decoration: it is the one
   element on the page a regulator reads, and a dimmed one is a finding. */
.age-18 { border-inline-start: 3px solid var(--accent); background: var(--surface); }

h1, h2 { letter-spacing: -.022em; }
h2 { margin-top: 2.75rem; }

@media (prefers-color-scheme: light) {
  /* The hero's gradient text and the button's glow are devices for a dark
     canvas. On white the first loses contrast and the second looks like a
     rendering artefact, so both revert to something flat and legible. */
  body { background: var(--bg); }
  .offer-hero {
    background: linear-gradient(180deg, var(--accent-soft), var(--surface) 60%);
    box-shadow: 0 0 0 1px var(--warn-rule), var(--shadow);
  }
  .offer-hero-headline { background: none; color: var(--ink); -webkit-text-fill-color: currentColor; }
  .cta { box-shadow: var(--shadow); }
  .brand-mark { background: var(--accent-soft); color: var(--ink-2); }
  .offer-hero-facts li { background: rgb(20 23 42 / .03); }
  .provider-list li, .payments-list li { background: rgb(20 23 42 / .03); }
}


/* Site navigation — links every page of the site, rendered on every page. */
.site-nav { display: flex; flex-wrap: wrap; gap: var(--sp-4); align-items: center;
  max-width: var(--measure); margin: 0 auto; padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--rule); font-size: var(--step--1); }
.site-nav a { color: var(--muted); text-decoration: none; }
.site-nav a:hover { color: var(--ink); }
.site-nav a[aria-current="page"] { color: var(--accent); font-weight: 600; }

/* ── Masthead, footer, CTA (page furniture rendered on every page) ── */
/* Full-bleed header and footer bars with a bold accent rule; content sits in a
   centred, wide column. Header is three zones — brand left, page nav centred,
   operator actions right. Footer links spread across the full width, with the
   disclaimer beneath them. These are baked in for every site the generator makes. */
html, body { width: 100%; }
body { max-width: none; margin: 0; padding: 0; overflow-x: clip; }
img { max-width: 100%; height: auto; }
.offer-hero-art, .offer-cta-art { max-width: none; height: 100%; }

.page { max-width: var(--page); margin: 0 auto;
  padding: clamp(1.5rem, 3vw, 2.75rem) clamp(1rem, 3vw, 2rem) 4rem; }

.masthead { background: var(--surface); border-bottom: 4px solid var(--accent);
  box-shadow: 0 1px 0 var(--rule); margin: 0 0 var(--sp-6);
  /* Pinned: the nav and the Register button ride the scroll on every screen. */
  position: sticky; top: 0; z-index: 60; }
/* The phone drawer. A <details> element, so it opens without JavaScript. */
.nav-drawer { display: none; position: relative; flex: 0 0 auto; }
.nav-burger { list-style: none; cursor: pointer; display: block; padding: .5rem; }
.nav-burger::-webkit-details-marker { display: none; }
.nav-burger span { display: block; width: 20px; height: 2px; background: var(--ink);
  margin: 4px 0; border-radius: 1px; }
.masthead .site-nav--drawer { position: absolute; top: calc(100% + .5rem); left: 0; z-index: 70;
  display: flex; flex-direction: column; align-items: flex-start; gap: var(--sp-3);
  background: var(--surface); border: 1px solid var(--rule);
  border-radius: var(--radius, 8px); box-shadow: var(--shadow);
  padding: var(--sp-4); min-width: 13rem; width: max-content; }
.masthead .site-nav--drawer a { padding: .2rem 0; }
.masthead-inner { display: flex; flex-wrap: nowrap; gap: var(--sp-4);
  align-items: center; max-width: var(--page); margin: 0 auto;
  padding: var(--sp-4) clamp(1rem, 3vw, 2rem); }
.brand-home { flex: 0 0 auto; display: inline-flex; align-items: center;
  gap: .6rem; font-weight: 800; font-size: var(--step-1);
  color: var(--ink); text-decoration: none; letter-spacing: -0.01em; }
.brand-home:hover { color: var(--accent); }
/* The brand mark, beside the name — the lockup, not a banner above the H1. */
.masthead-logo { display: block; flex: 0 0 auto; }
.masthead-logo img { display: block; height: 42px; width: auto; }
.brand-home-name { display: inline-block; white-space: nowrap; }
.masthead .site-nav--bar { flex: 1 1 auto; min-width: 0; display: flex; flex-wrap: wrap;
  justify-content: center; gap: var(--sp-4) var(--sp-5); border-bottom: 0; padding: 0;
  margin: 0; max-width: none; width: auto; }
.masthead-auth { flex: 0 0 auto; display: flex; gap: var(--sp-3); align-items: center;
  margin-left: auto; }
/* One row on every width. On a phone the page nav folds into the drawer:
   burger left, brand mark centred, the operator actions on the right. */
@media (max-width: 760px) {
  .nav-drawer { display: block; }
  .masthead .site-nav--bar { display: none; }
  .brand-home { margin: 0 auto; min-width: 0; }
  .masthead-inner { gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); }
  .masthead-auth { margin-left: 0; gap: var(--sp-2); }
  .masthead-auth .btn { padding: .45rem .65rem; font-size: var(--step--2); }
  .masthead-logo img { height: 30px; }
  .brand-home-name { font-size: var(--step-0); overflow: hidden; text-overflow: ellipsis; }
}
@media (max-width: 380px) {
  .masthead-auth .btn { padding: .4rem .5rem; font-size: var(--step--3); }
  .masthead-logo img { height: 26px; }
}

.btn { display: inline-block; padding: .55rem 1.1rem; border-radius: var(--radius-sm, 6px);
  font-weight: 700; font-size: var(--step--1); text-decoration: none; line-height: 1.1;
  white-space: nowrap; }
.btn-login { color: var(--ink); border: 1px solid var(--rule); background: transparent; }
.btn-login:hover { border-color: var(--accent); color: var(--accent); }
.btn-register { color: var(--accent-ink); background: var(--accent); border: 1px solid var(--accent); }
.btn-register:hover { filter: brightness(1.06); }

.hero-cta { margin: var(--sp-5) 0 0; }
.hero-cta .cta { display: inline-block; }

.offer-cta { margin: var(--sp-7) 0; padding: var(--sp-6);
  background: var(--surface); border: 1px solid var(--rule); border-radius: var(--radius, 8px);
  text-align: center; }
.offer-cta h2 { margin: 0 0 var(--sp-2); }
.offer-cta-headline { font-size: var(--step-2); font-weight: 800; color: var(--accent);
  margin: 0 0 var(--sp-2); }
.offer-cta-pitch { max-width: var(--measure); margin: 0 auto var(--sp-4); color: var(--ink-2); }
.offer-cta .cta-large { display: inline-block; }
.offer-cta-terms { margin: var(--sp-4) auto 0; max-width: var(--measure);
  color: var(--muted); font-size: var(--step--1); }

.site-footer { background: var(--surface); border-top: 4px solid var(--accent);
  margin: var(--sp-8) 0 0; }
.footer-inner { max-width: var(--page); margin: 0 auto;
  padding: var(--sp-6) clamp(1rem, 3vw, 2rem);
  display: flex; flex-direction: column; gap: var(--sp-4); }
.footer-nav { display: flex; flex-wrap: wrap; gap: var(--sp-4); width: 100%;
  justify-content: space-between; font-size: var(--step--1); }
.footer-nav a { color: var(--muted); text-decoration: none; }
.footer-nav a:hover { color: var(--ink); }
.footer-legal { font-size: var(--step--1); color: var(--ink); margin: var(--sp-3) 0 0; font-weight: 600; }
.footer-copy { font-size: var(--step--2); color: var(--muted); margin: 0; max-width: var(--measure); }

/* Author byline — the named reviewer behind the assessment (E-E-A-T). */
.author-card { margin: var(--sp-5) 0; padding: var(--sp-4) var(--sp-5);
  border-left: 3px solid var(--accent); background: var(--surface);
  border-radius: 0 var(--radius-sm, 6px) var(--radius-sm, 6px) 0; max-width: var(--measure); }
.author-byline { margin: 0; font-size: var(--step--1); color: var(--ink-2); }
.author-name { font-weight: 700; color: var(--ink); }
.author-bio { margin: var(--sp-2) 0 0; font-size: var(--step--1); color: var(--muted); }

/* ── Operator promo art behind the offer surfaces ──────────────────────────
   The art is decoration supplied by the operator; the scrim is ours. It fades
   the theme's own surface over the text side so contrast never depends on
   what the artwork happens to contain. */
.offer-hero--art, .offer-cta--art { position: relative; overflow: hidden; }
.offer-hero-art, .offer-cta-art { position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: 78% center; z-index: 0; }
.offer-hero--art::before { content: ""; position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to right, var(--surface) 45%, transparent 72%); }
.offer-hero--art .offer-hero-body { position: relative; z-index: 2; max-width: 36rem; }
/* The subject side comes from the asset record; the text column takes the other.
   The left variant oversizes the element and shifts it out of frame instead of
   relying on object-position: art narrower than the box never crops
   horizontally, so position alone cannot move a centred subject clear of the
   copy. The file itself is untouched — this is a viewport, not an edit. */
.offer-hero--art-right .offer-hero-art, .offer-cta--art-right .offer-cta-art { object-position: 78% center; }
.offer-hero--art-center .offer-hero-art, .offer-cta--art-center .offer-cta-art { object-position: center; }
.offer-hero--art-left .offer-hero-art { inset: 0 auto 0 -28%; width: 132%; object-position: center 18%; }
.offer-cta--art-left .offer-cta-art { object-position: 20% center; }
/* No directional scrim on the left variant: the art carries its own dark side
   under the copy, and the body gets a translucent panel instead — readable on
   any art without veiling the subject. */
.offer-hero--art-left::before { background: none; }
.offer-hero--art-left .offer-hero-body { background: color-mix(in srgb, var(--surface) 82%, transparent);
  border-radius: var(--radius, 8px); }
.offer-hero--art-left .offer-hero-body { margin-left: auto; }
/* A mascot is a placed cutout, not a covered scene: no scrim, and it sits inset
   on the focus side at contained size rather than bleeding to the edges. */
.offer-hero--mascot::before { display: none; }
.offer-hero--mascot { display: flex; align-items: stretch; }
.offer-hero--mascot .offer-hero-art { position: absolute; inset: auto 0 0 auto; z-index: 0;
  height: 94%; width: auto; max-width: 42%; object-fit: contain; object-position: bottom right; }
.offer-hero--mascot.offer-hero--art-left .offer-hero-art { inset: auto auto 0 0; object-position: bottom left; }
.offer-hero--mascot.offer-hero--art-left .offer-hero-body { margin-left: auto; }
.offer-hero--mascot .offer-hero-body { position: relative; z-index: 2; max-width: 60%; }
@media (max-width: 700px) {
  .offer-hero--mascot .offer-hero-art { display: none; }
  .offer-hero--mascot .offer-hero-body { max-width: none; }
}
.offer-hero--art-right::before { background: linear-gradient(to right, var(--surface) 45%, transparent 72%); }
.offer-cta--art::before { content: ""; position: absolute; inset: 0; z-index: 1;
  background: var(--surface); opacity: .72; }
.offer-cta--art > :not(.offer-cta-art) { position: relative; z-index: 2; }
@media (max-width: 700px) {
  .offer-hero--art::before { background: var(--surface); opacity: .84; }
  .offer-hero--art .offer-hero-body { max-width: none; }
}


/* operator-media — the operator's own imagery as evidence: licensed art and
   dated quotation screenshots. Added with the screenshot-review feature. */
.operator-media { margin: 0 0 var(--sp-7, 2.5rem); }
.operator-media-heading { font-size: var(--step-2, 1.35rem); line-height: 1.2; margin: 0 0 .5rem; }
.operator-media-intro { margin: 0 0 1.25rem; color: var(--ink-2); max-width: 62ch; }
.operator-media-grid { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }
@media (min-width: 720px) { .operator-media-grid { grid-template-columns: repeat(2, 1fr); } }
.operator-media-item { margin: 0; border: 1px solid var(--rule); border-radius: var(--radius, 8px); overflow: hidden; background: var(--surface); }
.operator-media-item--banner, .operator-media-item--mascot { border-color: var(--accent); }
.operator-media-art { display: block; width: 100%; height: auto; }
.operator-media-ack { padding: .4rem .75rem .6rem; font-size: var(--step--2, .8rem); color: var(--muted); }
.operator-media-section { margin: 0; padding: .5rem .75rem 0; font-size: var(--step--2, .78rem); font-weight: 700; text-transform: uppercase; letter-spacing: .07em; color: var(--accent); }
.operator-media-caption { margin: 0; padding: .6rem .75rem; font-size: var(--step--1, .92rem); color: var(--ink-2); line-height: 1.5; }
.operator-media-caption + .operator-media-ack { border-top: 1px solid var(--rule); }


/* masthead identity — lettermark badge + tagline, coloured by the brand's own
   tokens so every brand's header reads as its own. Added with the header pass. */
.brand-home { display: flex; align-items: center; gap: .65rem; text-decoration: none; }
.brand-badge { display: inline-flex; align-items: center; justify-content: center;
  width: 2.15rem; height: 2.15rem; border-radius: calc(var(--radius, 8px) * .75);
  background: var(--accent); color: var(--accent-ink); font-weight: 800;
  font-size: 1.2rem; line-height: 1; box-shadow: 0 2px 8px rgba(0,0,0,.25); }
.brand-home-text { display: flex; flex-direction: column; gap: .1rem; }
.brand-tagline { font-size: var(--step--2, .78rem); color: var(--muted);
  font-weight: 400; letter-spacing: .02em; }
@media (max-width: 560px) { .brand-tagline { display: none; } }
.masthead { border-bottom: 3px solid var(--accent); }


/* hero first screen — the brand's art is the stage; eyebrow, headline and CTA
   compose on top of it. Four compositions, picked per domain by the layout
   planner (hero_variant) so sibling domains open differently: art-right,
   full-bleed-scrim, split-panel, banner-stack. A mascot renders as a placed
   cutout instead of a covered scene; without art the hero stays a plain lead. */
.hero { display: grid; grid-template-columns: 1fr; gap: 1.1rem; align-items: center; }
.hero-lead .eyebrow { margin-bottom: .5rem; }
.hero-lead h1 { margin: 0 0 .9rem; }
.hero .hero-cta { margin: 0; }
.hero .hero-cta .cta { display: inline-block; font-size: var(--step-0); font-weight: 700;
  padding: .8rem 1.6rem; min-height: 2.75rem; }
.hero-body { grid-column: 1 / -1; }
.hero .trust-strip { grid-column: 1 / -1; }
@media (max-width: 560px) {
  .hero .hero-cta .cta { display: block; text-align: center; }
}

/* Image-led hero: the art covers the box, the theme's own scrim keeps the copy
   readable whatever the artwork contains, and the content sits above both. */
.hero--art { position: relative; overflow: hidden; display: block;
  border: 1px solid var(--rule); border-radius: var(--radius, 8px);
  padding: clamp(1.4rem, 4vw, 2.6rem); }
.hero--art .hero-art { position: absolute; inset: 0; width: 100%; height: 100%;
  max-width: none; max-height: none; object-fit: cover; border: 0; border-radius: 0;
  z-index: 0; }
.hero--art::before { content: ""; position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to right, var(--surface) 42%, transparent 75%); }
.hero--art > :not(.hero-art) { position: relative; z-index: 2; }
.hero--art .hero-lead { max-width: 36rem; }
.hero--art .hero-body { max-width: 44rem; }
.hero--art .hero-cta { margin: 1rem 0 0; }
.hero--art .trust-strip { margin-top: 1.1rem; padding: .55rem .8rem;
  background: color-mix(in srgb, var(--surface) 82%, transparent);
  border-radius: var(--radius-sm, 6px); width: fit-content; }
/* The subject side comes from the asset record; the copy takes the other. */
.hero--art-left .hero-art { object-position: 18% center; }
.hero--art-center .hero-art { object-position: center; }
.hero--art-right .hero-art { object-position: 80% center; }

/* The four planner compositions. */
.hero--v-full-bleed-scrim { min-height: clamp(300px, 40vw, 430px);
  display: flex; flex-direction: column; justify-content: center; gap: 1rem; }
.hero--v-full-bleed-scrim::before {
  background: color-mix(in srgb, var(--surface) 80%, transparent); }
.hero--v-art-right .hero-art { inset: 0 0 0 auto; width: 54%; }
.hero--v-art-right::before {
  background: linear-gradient(to right, var(--surface) 0%, var(--surface) 44%, transparent 68%); }
.hero--v-split-panel .hero-art { inset: 0 0 0 auto; width: 44%; }
.hero--v-split-panel::before {
  background: linear-gradient(to right, var(--surface) 0 56.5%, transparent 56.5%); }
.hero--v-split-panel { border-left: 4px solid var(--accent); }
.hero--v-banner-stack { padding: 0 0 clamp(1.2rem, 3vw, 1.8rem); }
.hero--v-banner-stack .hero-art { position: relative; inset: auto; width: 100%;
  height: clamp(200px, 30vw, 340px); display: block; }
.hero--v-banner-stack::before { display: none; }
.hero--v-banner-stack > :not(.hero-art) {
  margin-left: clamp(1.2rem, 3vw, 2rem); margin-right: clamp(1.2rem, 3vw, 2rem); }
.hero--v-banner-stack .hero-lead { margin-top: 1.2rem; }

/* A mascot is a placed cutout, not a covered scene: no scrim, contained size,
   inset on the focus side; the copy takes the rest. These override the
   composition geometry above, whichever variant the planner picked. */
.hero--mascot::before { display: none; }
.hero--mascot .hero-art { position: absolute; inset: auto 0 0 auto; width: auto;
  height: 92%; max-width: 40%; object-fit: contain; object-position: bottom right; }
.hero--mascot.hero--art-left .hero-art { inset: auto auto 0 0; object-position: bottom left; }
.hero--mascot.hero--art-left .hero-lead,
.hero--mascot.hero--art-left .hero-body { margin-left: auto; }
.hero--mascot .hero-lead, .hero--mascot .hero-body { max-width: 58%; }
.hero--mascot.hero--v-banner-stack { padding: clamp(1.4rem, 4vw, 2.6rem); min-height: 300px; }
.hero--mascot.hero--v-banner-stack > :not(.hero-art) { margin-left: 0; margin-right: 0; }

@media (max-width: 700px) {
  .hero--art::before { background: var(--surface); opacity: .84; }
  .hero--v-art-right .hero-art, .hero--v-split-panel .hero-art { inset: 0; width: 100%; }
  .hero--art .hero-lead, .hero--art .hero-body { max-width: none; }
  .hero--mascot .hero-art { display: none; }
  .hero--mascot .hero-lead, .hero--mascot .hero-body { max-width: none; }
}

/* A light-ink operator mark (white wordmark on transparency) sits on a dark
   chip in the masthead — our design furniture, not an edit to the mark. On a
   dark scheme the chip almost disappears into the bar, which is fine. */
.masthead-logo--chip { background: #101623; border-radius: var(--radius-sm, 6px);
  padding: 5px 10px; display: inline-block; }
.masthead-logo--chip img { display: block; }

/* ── structural variant (seed 2252123990) — generated, deterministic ── */
:root {
  --step--3: 0.6149rem;
  --step--2: 0.7378rem;
  --step--1: 0.8854rem;
  --step-0: clamp(0.9775rem, 0.9188rem + 0.272vw, 1.147rem);
  --step-1: clamp(1.173rem, 1.103rem + 0.326vw, 1.377rem);
  --step-2: clamp(1.408rem, 1.323rem + 0.392vw, 1.652rem);
  --step-3: clamp(1.689rem, 1.588rem + 0.47vw, 1.983rem);
  --sp-1: 0.27rem;
  --sp-2: 0.54rem;
  --sp-3: 0.81rem;
  --sp-4: 1.08rem;
  --sp-5: 1.62rem;
  --sp-6: 2.16rem;
  --sp-8: 3.24rem;
  --sp-12: 4.86rem;
  --radius: 14px;
  --page: 980px;
  --measure: 70ch;
  --shadow: 0 1px 2px rgb(0 0 0 / .08), 0 8px 24px -12px rgb(0 0 0 / .25);
}
.masthead { border-bottom-width: 3px; }
.site-footer { border-top-width: 3px; }
.cta, .btn { border-radius: 10px; }
.at-a-glance, .criteria, .payments, .faq { background: color-mix(in srgb, var(--surface) 55%, transparent); border: 1px solid var(--rule); border-radius: 14px; padding: var(--sp-5) var(--sp-5) var(--sp-4); }
.rating-bar, .weight-bar { height: 6px; }

/* ── brand tokens (generated; the cascade means these win) ── */
:root {
  --bg: #0a1514;
  --surface: #132523;
  --ink: #eef2f1;
  --ink-2: #c1cdcb;
  --muted: #8b9c9b;
  --rule: #253735;
  --rule-2: #314947;
  --accent: #37f1de;
  --accent-ink: #08211e;
  --accent-soft: #17302e;
  --warn-bg: #292414;
  --warn-rule: #6f5e2a;
  --warn-ink: #e2cd8d;
  --star: #37f1de;
  --bar: #37f1de;
}
@media (prefers-color-scheme: light) {
:root {
  --bg: #f7fafa;
  --surface: #ffffff;
  --ink: #122120;
  --ink-2: #3b5452;
  --muted: #657b79;
  --rule: #dbe6e5;
  --rule-2: #c3d5d3;
  --accent: #0ba293;
  --accent-ink: #ffffff;
  --accent-soft: #e8f3f1;
  --warn-bg: #f6f0df;
  --warn-rule: #cab472;
  --warn-ink: #6c5613;
  --star: #0ba293;
  --bar: #0ba293;
}
}
