/* Fairgain demo.
 *
 * This is an INSTRUMENT, not an essay. Somebody arrives to watch a system work,
 * so the system fills the screen: dense, high-contrast, anchored by a dark rail,
 * with the explanation cut to what a person needs before the first offer lands.
 *
 * The one idea the design carries: the agents are language models and the guard
 * is ordinary code, so they have different voices. Agents speak in proportional
 * type. The guard speaks in monospace — verdicts, reason codes, every number.
 *
 * No framework, no webfont: font-src is 'self'.
 */

:root {
  --bg: #0e1116;
  --sheet: #ffffff;
  --sheet-2: #f6f7f9;
  --ink: #0e1116;
  --ink-2: #454d5a;
  --muted: #737d8c;
  --line: #e5e8ec;
  --line-2: #cfd5dd;

  --accent: #2b59ff;
  --accent-deep: #1c3fc4;
  --accent-soft: #eef2ff;

  --pass: #0f7a45;
  --pass-bg: #e8f6ee;
  --pass-line: #8fd0ac;
  --veto: #cc2618;
  --veto-bg: #fdecea;
  --veto-line: #f0a9a1;

  --warn: #9a6b00;
  --warn-bg: #fff8e6;
  --warn-line: #ebd191;

  --prose: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
           "Noto Sans Bengali", sans-serif;
  --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
          "Liberation Mono", monospace;

  --r: 10px;
  --pad: clamp(1.15rem, .6rem + 2vw, 2.4rem);

  /* One measured column, declared once. --edge is the inset that puts a
     full-bleed element's CONTENT back on that column: half of whatever the
     window has spare, never less than the gutter. Percentages resolve against
     the element's own containing block, so this works on <header>, on <footer>
     and on a grid item spanning the full track alike. */
  --band: 78rem;
  --edge: calc((100% - min(100% - 2 * var(--pad), var(--band))) / 2);
}

* { box-sizing: border-box; }

html { background: var(--bg); }
body {
  margin: 0;
  min-height: 100vh; display: flex; flex-direction: column;
  font-family: var(--prose);
  font-size: 16px;
  line-height: 1.55;
  color: var(--ink);
  background: var(--sheet);
  -webkit-font-smoothing: antialiased;
}

/* ------------------------------------------------------------------ rail */

/* A dark bar the full width of the window. It gives the page an anchor and a
   horizon, which is most of what separates a designed page from a document. */
.masthead {
  background: var(--bg); color: #fff;
  border-bottom: 1px solid #202836;
}
header {
  padding: .85rem var(--edge);
  display: flex; align-items: center; gap: 1.1rem;
}
.brand {
  display: flex; align-items: center; gap: .6rem; flex: none;
  text-decoration: none; color: #fff;
}
.brand svg { display: block; flex: none; }
.wordmark {
  font-weight: 640; font-size: 1.05rem; letter-spacing: -.01em;
  color: #fff; text-decoration: none;
}
/* The tagline is one line at any width that can hold it. It used to carry a
   34rem cap, which wrapped it into two ragged lines beside the wordmark on a
   wide screen and made the bar look like an accident. */
.tagline {
  color: #9aa4b2; margin: 0; font-size: .82rem; line-height: 1.45;
  padding-left: 1.1rem; border-left: 1px solid #2a3038;
  min-width: 0; text-wrap: balance;
}
/* A quiet marker on the right, so the bar is composed rather than a logo with
   a sentence trailing off it. */
.mast-tag {
  margin-left: auto; flex: none;
  font-family: var(--mono); font-size: .64rem; font-weight: 700;
  letter-spacing: .16em; text-transform: uppercase; color: #8f9aab;
  border: 1px solid #2f3846; border-radius: 999px; padding: .26rem .7rem;
}
@media (max-width: 62rem) {
  header { flex-wrap: wrap; gap: .5rem 1rem; }
  .tagline { padding-left: 0; border-left: 0; order: 3; flex-basis: 100%; font-size: .8rem; }
  .mast-tag { margin-left: auto; }
}
@media (max-width: 34rem) { .tagline { display: none; } }

/* ----------------------------------------------------------------- sheet */

/* The sheet is full-bleed white; only its CONTENT is measured.
 *
 * The column is a GRID TRACK, not a pair of auto margins. That distinction is
 * the whole point: a track cannot be cancelled by a child. Every component in
 * here legitimately sets `margin: 0` or `margin: 1.5rem 0 0` for its own
 * vertical rhythm, and under auto margins each one of those silently threw its
 * section 300-odd pixels to the left of the heading above it. Under a track
 * they cannot: horizontal placement is the parent's business and stays there.
 *
 * Children therefore carry NO horizontal padding of their own. A band that
 * wants its background to reach the window edge takes `.bleed` and gets the
 * same content column back through --edge.
 */
main {
  background: var(--sheet); flex: 1;
  display: grid; align-content: start;
  grid-template-columns:
    [full-start] minmax(var(--pad), 1fr)
    [band-start] minmax(0, var(--band)) [band-end]
    minmax(var(--pad), 1fr) [full-end];
}
main > * { grid-column: band; min-width: 0; }
main > .bleed { grid-column: full; padding-inline: var(--edge); }

/* ------------------------------------------------------------- step rail */

/* Four words on a hairline read as leftover text. This is the same four steps
   drawn as a rail: a numbered token per step, a connector between them, and
   one of them lit. It tells you where you are without being asked to. */
.steps {
  background: var(--sheet-2); border-bottom: 1px solid var(--line);
}
.steps ol {
  display: flex; align-items: center; flex-wrap: wrap;
  margin: 0; padding: 0; list-style: none;
  font-family: var(--mono); font-size: .7rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted);
}
.steps li {
  display: flex; align-items: center; gap: .5rem;
  padding: .62rem 0; white-space: nowrap;
}
/* The connector is the rail. It belongs between steps, so it hangs off the
   step that follows rather than trailing the last one. */
.steps li + li::before {
  content: ""; width: clamp(.9rem, 2.4vw, 2.2rem); height: 1px;
  background: var(--line-2); margin: 0 clamp(.55rem, 1.4vw, 1rem);
}
.s-n {
  display: grid; place-items: center; flex: none;
  width: 1.35rem; height: 1.35rem; border-radius: 50%;
  border: 1px solid var(--line-2); background: var(--sheet);
  font-size: .66rem; font-weight: 700; letter-spacing: 0; color: var(--muted);
}
.steps .done .s-n { border-color: var(--line-2); background: var(--sheet); color: var(--ink-2); }
.steps .done { color: var(--ink-2); }
.steps .at { color: var(--accent-deep); font-weight: 700; }
.steps .at .s-n { background: var(--accent); border-color: var(--accent); color: #fff; }

/* ------------------------------------------------------------------ type */

h1 {
  font-size: clamp(1.7rem, 1.15rem + 2.4vw, 2.5rem);
  line-height: 1.08; letter-spacing: -.03em; font-weight: 700;
  margin: clamp(1.3rem, 3vw, 2rem) 0 .5rem; max-width: 22ch;
}
h2 { font-size: 1rem; font-weight: 650; letter-spacing: -.01em; margin: 0 0 .3rem; }
.intro { padding-top: 0; }
.intro p { max-width: 44rem; color: var(--ink-2); margin: .55rem 0; font-size: .96rem; }
.intro p strong { color: var(--ink); font-weight: 640; }
.hint, .counter { color: var(--muted); font-size: .84rem; }

/* ------------------------------------------------------------- two sides */

/* The columns share the heading's left edge. They used to add a gutter of
   their own inside a form that was already padded, so every column heading sat
   one gutter to the right of the h1 above it. The rule between them is a
   border and the space around that rule is padding on the inner edges only. */
.sides {
  display: grid; gap: 0; grid-template-columns: 1fr;
  margin: 1.6rem 0 0; border-top: 1px solid var(--line);
}
@media (min-width: 54rem) { .sides { grid-template-columns: 1fr 1fr; } }

.side { padding: 1.35rem 0 1.6rem; background: var(--sheet); border-bottom: 1px solid var(--line); }
@media (min-width: 54rem) {
  .side { padding-right: clamp(1.4rem, 3vw, 2.6rem); }
  .side + .side {
    border-left: 1px solid var(--line);
    padding-left: clamp(1.4rem, 3vw, 2.6rem); padding-right: 0;
  }
}
.side h2 {
  font-size: .72rem; font-family: var(--mono); letter-spacing: .14em;
  text-transform: uppercase; color: var(--accent); margin-bottom: .55rem;
}

textarea {
  width: 100%; font: inherit; font-size: .94rem; line-height: 1.5;
  padding: .75rem .85rem; border: 1px solid var(--line-2);
  border-radius: 8px; resize: vertical; background: var(--sheet); color: var(--ink);
}
textarea::placeholder { color: #9aa3b0; }
textarea:focus-visible, button:focus-visible, a:focus-visible, input:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 2px;
}

.examples { margin: .55rem 0 .6rem; font-size: .82rem; color: var(--muted); }
button.example {
  font: inherit; font-size: .8rem; padding: .2rem .6rem; margin: 0 .2rem .25rem 0;
  border: 1px solid var(--line-2); border-radius: 6px; background: var(--sheet);
  color: var(--accent-deep); cursor: pointer; transition: background .12s, border-color .12s;
}
button.example:hover { border-color: var(--accent); background: var(--accent-soft); }

/* ------------------------------------------------------------ attack box */

fieldset.attack {
  margin: 1.5rem 0; border: 1px solid var(--warn-line); border-radius: var(--r);
  padding: .95rem 1.05rem; background: var(--warn-bg);
}
fieldset.attack legend {
  padding: 0 .45rem; font-weight: 700; font-size: .68rem; color: var(--warn);
  font-family: var(--mono); letter-spacing: .12em; text-transform: uppercase;
}
fieldset.attack label { display: flex; gap: .6rem; align-items: flex-start; font-size: .92rem; }
fieldset.attack .hint { color: #8a6410; margin-bottom: 0; }

/* ------------------------------------------------------------ the agents */

/* The picker is three cards, not a dropdown: the price is the reason to pick
   one, and a price you have to open a menu to see is a price nobody read. */
fieldset.agents {
  margin: 1.5rem 0; border: 1px solid var(--line); border-radius: var(--r);
  padding: .95rem 1.05rem; background: var(--sheet-2);
}
fieldset.agents legend {
  padding: 0 .45rem; font-weight: 700; font-size: .68rem; color: var(--muted);
  font-family: var(--mono); letter-spacing: .12em; text-transform: uppercase;
}
.agent-tiers { display: grid; gap: .7rem; grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr)); }
.agent-tier {
  display: grid; gap: .25rem; align-content: start;
  border: 1px solid var(--line); border-radius: 8px; padding: .7rem .8rem;
  background: var(--sheet); cursor: pointer;
}
.agent-tier:has(input:checked) { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.agent-tier input { margin: 0 .4rem 0 0; }
.agent-name { font-weight: 650; font-size: .95rem; }
.agent-blurb { font-size: .86rem; color: var(--ink-2); }
.agent-model, .agent-price { font-family: var(--mono); font-size: .7rem; color: var(--muted); }
.agent-tier.unavailable { opacity: .55; cursor: not-allowed; }

/* ------------------------------------------------- what happens next */

/* The page used to end on "nothing binds; two people would still have to
   approve it", which is a claim. This section is the demonstration of it, so
   it gets the weight of one: the steps, the two approvals, and a panel that
   is empty until both of them exist. */
.unlock { margin: 2rem 0 0; padding: 1.6rem 0 2rem; border-top: 1px solid var(--line); }
.unlock h2 { font-size: 1.35rem; letter-spacing: -.02em; margin: 0 0 .4rem; }
.unlock-lede { max-width: 46rem; color: var(--ink-2); margin: 0 0 1.1rem; }

.unlock-steps { list-style: none; margin: 0 0 1.4rem; padding: 0; display: grid; gap: .55rem; }
.unlock-steps li { display: flex; gap: .7rem; align-items: baseline; max-width: 46rem; font-size: .94rem; }
.step-n {
  flex: 0 0 auto; width: 1.45rem; height: 1.45rem; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--sheet-2); border: 1px solid var(--line-2);
  font-family: var(--mono); font-size: .72rem; color: var(--ink-2);
}

.approvals { display: grid; gap: .8rem; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); max-width: 46rem; }
.approval {
  display: grid; gap: .5rem; justify-items: start;
  padding: .9rem 1rem; border: 1px solid var(--line); border-radius: var(--r);
  background: var(--sheet);
}
.approval.is-approved { border-color: var(--pass-line); background: var(--pass-bg); }
.approval-side { font-weight: 640; }
.approval-tick { font-family: var(--mono); font-size: .78rem; color: var(--pass); }
.approval-waiting { font-family: var(--mono); font-size: .78rem; color: var(--muted); }

/* Locked is a statement about where the details are, not a visual effect. It
   is deliberately not a blur of the real thing: there is nothing behind it. */
.locked {
  margin: 1.2rem 0 0; max-width: 46rem; padding: .95rem 1.05rem;
  border: 1px dashed var(--line-2); border-radius: var(--r); background: var(--sheet-2);
}
.locked p { margin: 0; font-size: .9rem; color: var(--ink-2); }
.locked-title {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .4rem !important;
}

.unlocked {
  margin: 1.2rem 0 0; max-width: 46rem; padding: 1.1rem 1.15rem;
  border: 1px solid var(--pass-line); border-radius: var(--r); background: var(--sheet);
}
.unlocked h3 { margin: 0 0 .5rem; font-size: 1rem; }
.unlock-fee { margin: 0 0 .9rem; font-size: .94rem; }
.contact-cards { display: grid; gap: .7rem; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr)); }
.contact-card {
  display: grid; gap: .15rem; padding: .8rem .9rem;
  border: 1px solid var(--line); border-radius: 8px; background: var(--sheet-2);
}
.contact-side {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted);
}
.contact-party { font-weight: 640; font-size: .95rem; }
.contact-line { font-family: var(--mono); font-size: .8rem; color: var(--ink-2); }
.unlock-caveat { margin: .9rem 0 0; font-size: .86rem; color: var(--ink-2); }

/* -------------------------------------------------------------- controls */

button.primary {
  font: inherit; font-weight: 600; font-size: .95rem;
  padding: .7rem 1.35rem; border: 0; border-radius: 8px;
  background: var(--accent); color: #fff; cursor: pointer;
  transition: background .12s, transform .06s;
}
button.primary:hover { background: var(--accent-deep); }
button.primary:active { transform: translateY(1px); }
button.primary[disabled] { background: #aeb6c2; cursor: not-allowed; }

a.secondary { color: var(--accent-deep); font-size: .9rem; text-underline-offset: 2px; }
.actions { margin: 1.5rem 0 2rem; display: flex; gap: 1.1rem; align-items: center; flex-wrap: wrap; }
/* `display: flex` outranks the UA sheet's [hidden] { display: none }, so the
   restart form was on screen from the first second of a run that had not
   started yet. */
.actions[hidden] { display: none; }

.error {
  color: var(--veto); background: var(--veto-bg); border: 1px solid var(--veto-line);
  border-radius: 8px; padding: .65rem .85rem; margin: 1rem 0;
}

/* ---------------------------------------------------------------- footer */

/* Two grey sentences under a hairline is not a footer, it is the end of the
   text. This one closes the page: it repeats the dark rail from the top, says
   what the mark is, and states the four promises as facts rather than as an
   apologetic paragraph. */
footer {
  background: var(--bg); color: #8f9aab; font-size: .82rem;
  padding: 2.2rem var(--edge) 2.6rem; margin-top: 3rem;
}
.foot-inner {
  display: grid; gap: 1.6rem 3rem; grid-template-columns: 1fr;
  align-items: start;
}
@media (min-width: 54rem) {
  .foot-inner { grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); }
}
.foot-brand { display: flex; align-items: center; gap: .55rem; }
.foot-brand .wordmark { font-size: .98rem; }
.foot-line { margin: .6rem 0 0; color: #7c8798; line-height: 1.55; max-width: 26rem; }

.foot-facts { margin: 0; padding: 0; list-style: none; display: grid; gap: .1rem; }
@media (min-width: 40rem) { .foot-facts { grid-template-columns: 1fr 1fr; gap: .1rem 2rem; } }
.foot-facts li {
  position: relative; padding: .3rem 0 .3rem 1.25rem; line-height: 1.5; color: #9aa4b2;
}
/* The mark is the same bar that stands between the two agents upstairs. */
.foot-facts li::before {
  content: ""; position: absolute; left: 0; top: .78em;
  width: 7px; height: 1px; background: #46516210; background: #465162;
}
.foot-note {
  margin: 1.7rem 0 0; padding-top: 1.1rem; border-top: 1px solid #202836;
  color: #6b7686; font-size: .76rem;
}

/* ---------------------------------------------------------- confirm page */

details.written { margin: .2rem 0 .8rem; }
details.written summary {
  cursor: pointer; color: var(--muted); font-size: .72rem;
  font-family: var(--mono); letter-spacing: .1em; text-transform: uppercase;
}
.raw {
  margin: .5rem 0 0; padding: .65rem .8rem; background: var(--sheet-2);
  border-left: 2px solid var(--line-2); white-space: pre-wrap;
  font-size: .89rem; color: var(--ink-2);
}
ul.limits { margin: .5rem 0 .9rem; padding: 0; list-style: none; }
ul.limits li {
  margin: 0; padding: .45rem 0 .45rem 1.5rem; border-bottom: 1px solid var(--line);
  position: relative; font-size: .93rem;
}
ul.limits li:last-child { border-bottom: 0; }
ul.limits li::before {
  content: "\2014"; position: absolute; left: 0; color: var(--accent); font-weight: 700;
}
label.confirm {
  display: flex; gap: .6rem; align-items: flex-start; font-size: .92rem;
  border-top: 1px solid var(--line); padding-top: .8rem; margin-top: .6rem;
}
.review {
  background: var(--veto-bg); border: 1px solid var(--veto-line); border-radius: 8px;
  padding: .75rem .85rem; color: var(--veto); font-size: .9rem;
}
.review ul { margin: .4rem 0; padding-left: 1.1rem; }

/* ----------------------------------------------------------- briefs page */

.brief h3 {
  font-family: var(--mono); font-size: .68rem; margin: 0 0 .4rem;
  text-transform: uppercase; letter-spacing: .14em; font-weight: 700;
}
.block { border-left: 2px solid var(--line-2); padding: .1rem 0 .1rem .85rem; margin: 0 0 1.15rem; }
.block ul { margin: .45rem 0 0; padding-left: 1.1rem; font-size: .93rem; }
.block li { margin: .25rem 0; }
/* Own limits and the other side's public profile are coloured differently on
   purpose: the page is an invitation to check that the second column never
   contains the first kind of thing. */
.block.own { border-left-color: var(--accent); }
.block.own h3 { color: var(--accent); }
.block.prefs { border-left-color: var(--warn-line); }
.block.prefs h3 { color: var(--warn); }
.block.public { border-left-color: var(--pass-line); }
.block.public h3 { color: var(--pass); }

.untrusted {
  margin-top: .65rem; border: 1px dashed var(--line-2); border-radius: 8px;
  padding: .55rem .65rem; background: var(--sheet-2);
}
.untrusted-label {
  margin: 0 0 .35rem; font-size: .68rem; color: var(--muted);
  font-family: var(--mono); letter-spacing: .12em; text-transform: uppercase;
}
/* The prompt is machine-facing text, so it is shown on a machine-facing
   surface rather than dressed up as prose. */
pre.prompt {
  white-space: pre-wrap; font-family: var(--mono); font-size: .73rem; line-height: 1.5;
  background: #0e1116; color: #c9d1d9; border-radius: 8px;
  padding: .85rem; max-height: 26rem; overflow: auto;
}
.attack-note {
  margin: 1.4rem 0; border: 1px solid var(--warn-line); background: var(--warn-bg);
  border-radius: var(--r); padding: .95rem 1.05rem;
}
.attack-note p { margin: .4rem 0; max-width: 44rem; font-size: .92rem; }

/* ---------------------------------------------------- negotiation stream */

/* The ticker is the guard's ledger. It stays with you as the stream grows,
   because the running cost is half the point of watching. */
.ticker {
  position: sticky; top: 0; z-index: 5;
  /* full-bleed via .bleed in the template; content stays on the band */
  display: flex; gap: 1.1rem; align-items: baseline; flex-wrap: wrap;
  padding: .7rem 0; margin: 0;
  background: var(--sheet-2); border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.ticker-label {
  font-family: var(--mono); font-size: .66rem; color: var(--muted);
  text-transform: uppercase; letter-spacing: .14em;
}
.ticker-value {
  font-family: var(--mono); font-variant-numeric: tabular-nums;
  font-weight: 700; font-size: 1.05rem; letter-spacing: -.02em; color: var(--ink);
}
.ticker-note { font-size: .76rem; color: var(--muted); }

/* The stream is a timeline: one rule down the left, cards hanging off it. */
ol.turns { list-style: none; margin: 0; padding: 1.4rem 0 .5rem; position: relative; }
ol.turns::before {
  content: ""; position: absolute; left: 5px; top: 1.7rem; bottom: 1rem;
  width: 2px; background: var(--line);
}
/* A round is one exchange: the two cards that make it sit together under one
   heading, with what the round came to underneath them. */
li.round { list-style: none; margin: 0 0 1.5rem; }
.round-head { margin: 0 0 .5rem 1.9rem; }
.round-no {
  font-family: var(--mono); font-size: .72rem; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
}
ol.cards { list-style: none; margin: 0; padding: 0; }
.round-note {
  margin: 0 0 0 1.9rem; padding: .55rem .8rem;
  border-left: 2px solid var(--line-2); background: var(--sheet-2);
  font-size: .84rem; color: var(--ink-2);
}
.round-note p { margin: 0 0 .25rem; }
.round-note p:last-child { margin-bottom: 0; }
.round-list-label {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .08em;
  text-transform: uppercase; color: var(--muted);
}

li.turn {
  position: relative; margin: 0 0 .8rem 1.9rem; padding: .8rem .95rem;
  background: var(--sheet); border: 1px solid var(--line); border-radius: var(--r);
}
li.turn::before {
  content: ""; position: absolute; left: -1.95rem; top: 1.1rem;
  width: 12px; height: 12px; border-radius: 50%; background: var(--sheet);
  border: 2px solid var(--line-2);
}
li.turn.pass { border-color: var(--pass-line); }
li.turn.pass::before { border-color: var(--pass); background: var(--pass); }
li.turn.veto { border-color: var(--veto-line); box-shadow: 0 0 0 3px var(--veto-bg); }
li.turn.veto::before { border-color: var(--veto); background: var(--veto); }

.turn-head { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }
.round, .gate {
  font-family: var(--mono); font-size: .7rem; color: var(--muted); letter-spacing: .06em;
}
.gate { order: 8; }
.who { font-weight: 660; letter-spacing: -.01em; font-size: .98rem; }
.type {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .14em;
  color: var(--muted); text-transform: uppercase;
}

/* The verdict is the guard speaking: the strongest mono on the page, because it
   is the one thing here that no model produced. */
.badge {
  font-family: var(--mono); font-size: .7rem; font-weight: 700; letter-spacing: .14em;
  padding: .2rem .55rem; border-radius: 4px; order: 9; margin-left: auto; color: #fff;
}
li.turn.pass .badge { background: var(--pass); }
li.turn.veto .badge { background: var(--veto); }

/* The CARD decides how many columns of terms fit, not the window. A card can
   be half the page wide in a layout the window knows nothing about, and a pair
   of terms laid out for the window then runs straight over its neighbour. */
li.turn { container-type: inline-size; }

dl.terms {
  display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 0 1.2rem;
  margin: .7rem 0 0; font-size: .88rem;
  border-top: 1px solid var(--line); padding-top: .6rem;
}
/* An offer is a dozen short terms. In one pair per row across a wide card they
   are a thin ribbon with half the card empty beside them; in two they read as
   the spec sheet they are. Where container queries are not supported this rule
   is skipped and every card keeps the one-pair layout, which always fits. */
@container (min-width: 34rem) {
  dl.terms {
    grid-template-columns: max-content minmax(0, 1fr) max-content minmax(0, 1fr);
    column-gap: 1.2rem;
  }
  dl.terms dt:nth-of-type(2n) { padding-left: 1.6rem; }
}
dl.terms dt { color: var(--muted); font-size: .8rem; padding: .16rem 0; min-width: 0; }
/* A value can be a long unbroken token — beef_trim_80_20 — and a token wider
   than its track must wrap inside it rather than run across the label beside
   it. This is what makes the grid safe at any card width. */
dl.terms dd {
  margin: 0; padding: .16rem 0; font-variant-numeric: tabular-nums;
  min-width: 0; overflow-wrap: anywhere;
}
dl.terms dt.changed, dl.terms dd.changed { background: var(--warn-bg); font-weight: 650; }

/* The reason codes are the payoff of the page: the moment deterministic code
   overrules two language models, and says exactly why. */
ul.reasons {
  margin: .75rem -.95rem -.8rem; padding: .6rem .95rem .6rem 2.1rem; list-style: none;
  color: var(--veto); font-size: .8rem; font-family: var(--mono); line-height: 1.6;
  background: var(--veto-bg); border-top: 1px solid var(--veto-line);
  border-radius: 0 0 calc(var(--r) - 1px) calc(var(--r) - 1px);
}
ul.reasons li { position: relative; margin: .35rem 0; }
ul.reasons li::before { content: "\2715"; position: absolute; left: -1.15rem; opacity: .75; }

/* The code is the contract, so it keeps the monospace weight it always had.
   The sentence beside it is prose, and is set as prose: a code nobody can
   read is a veto nobody believes. */
.reason-code { font-family: var(--mono); font-weight: 600; }
.reason-text {
  display: block; margin-top: .15rem;
  font-family: var(--prose); font-size: .88rem; line-height: 1.5;
  color: var(--ink); opacity: .85;
}

/* Whose check refused, said once above the codes. Without it "buyer outbound
   check VETO" reads as the system refusing the buyer, rather than the buyer's
   own limits stopping the buyer's own agent. */
.gate-note {
  font-family: var(--prose);
  margin: .75rem 0 0; font-size: .88rem; line-height: 1.55; color: var(--ink);
}

.status {
  color: var(--muted); margin: 0; padding: .8rem 0 1.2rem;
  font-size: .84rem; font-family: var(--mono);
}

/* The outcome is the guard's last word, stamped rather than titled. */
.outcome {
  margin: 0; padding: 1.4rem 0 1.6rem;
  border-top: 1px solid var(--line); background: var(--sheet-2);
}
/* Until the run ends this element holds nothing. Left visible it drew a bare
   grey strip across the page, which looked like a rendering fault. */
.outcome:empty, .status:empty { display: none; }
.outcome h2 {
  text-transform: uppercase; margin-bottom: .45rem; font-size: .9rem;
  font-family: var(--mono); letter-spacing: .16em; font-weight: 700; color: var(--ink);
}
.outcome > p { max-width: 44rem; color: var(--ink-2); font-size: .94rem; }
.withheld {
  border-left: 2px solid var(--line-2); padding-left: .8rem; color: var(--ink-2);
  font-size: .9rem;
}

/* THE VERDICT. A run that reached a deal and a run that did not used to end
   with the same grey strip and a machine word in lower case. They are the two
   outcomes the whole demo is about, so they are told apart at a glance: the
   colour, the mark and the word all say the same thing at once. */
.verdict {
  border: 1px solid var(--line-2); border-left-width: 4px; border-radius: var(--r);
  background: var(--sheet); padding: 1rem 1.15rem; margin: 0 0 1.1rem;
}
.verdict-head { display: flex; align-items: baseline; gap: .6rem; flex-wrap: wrap; margin: 0 0 .4rem; }
.verdict-mark {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.55rem; height: 1.55rem; border-radius: 50%; flex: none;
  font-size: .95rem; font-weight: 700; color: #fff; align-self: center;
}
.verdict-word { font-size: 1.35rem; font-weight: 700; letter-spacing: -.01em; color: var(--ink); }
.verdict-sub {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted);
}
.verdict-line { margin: 0; max-width: 46rem; color: var(--ink-2); font-size: .95rem; }
.verdict-reasons { margin-top: .7rem; }
.verdict-waiting { color: var(--muted); font-size: .92rem; }

/* WHAT BOTH SIDES ARE TOLD. The terms a hard limit refused, in the words the
   offer cards use. It is deliberately quiet: it is a fact about the run, not a
   second verdict, and it sits under the reasons rather than beside them. */
.verdict-blocked {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: .45rem;
  margin: .8rem 0 0; font-size: .92rem;
}
.verdict-blocked-label {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted);
}
.blocked-term {
  font-weight: 600; color: var(--ink);
  border-bottom: 2px solid var(--veto-line); padding-bottom: .05rem;
}
.verdict-blocked-sep { color: var(--muted); }
.verdict-blocked-note {
  margin: .45rem 0 0; max-width: 46rem; font-size: .84rem; color: var(--muted);
}

.v-deal { border-color: var(--pass-line); background: var(--pass-bg); }
.v-deal .verdict-mark { background: var(--pass); }
.v-deal .verdict-word { color: var(--pass); }
.v-none { border-color: var(--veto-line); background: var(--veto-bg); }
.v-none .verdict-mark { background: var(--veto); }
.v-none .verdict-word { color: var(--veto); }
.v-fault { border-color: var(--warn-line); background: var(--warn-bg); }
.v-fault .verdict-mark { background: var(--warn); }
.v-fault .verdict-word { color: var(--warn); }

/* TRY IT AGAIN, WITH BETTER AGENTS. It sits directly under a refusal because
   that is where the question gets asked, and it is a quiet panel rather than a
   loud one: the answer on screen is a real answer, and this offers a second
   one rather than apologising for the first. */
.again {
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet);
  padding: 1rem 1.15rem; margin: 0 0 1.2rem;
}
.again-head {
  margin: 0 0 .3rem; font-size: 1rem; font-weight: 700; letter-spacing: -.01em;
  color: var(--ink);
}
.again-line { margin: 0 0 .85rem; max-width: 46rem; font-size: .9rem; color: var(--ink-2); }
.again-row { display: flex; flex-wrap: wrap; gap: .6rem; }
.again-go {
  display: grid; gap: .1rem; text-align: left; cursor: pointer;
  padding: .55rem .9rem; border-radius: 10px;
  border: 1px solid var(--line-2); background: var(--sheet); color: var(--ink);
  font: inherit;
}
.again-go:hover { border-color: var(--accent); background: var(--accent-soft); }
.again-go:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.again-go-label { font-size: .92rem; font-weight: 600; }
.again-go-note { font-family: var(--mono); font-size: .74rem; color: var(--muted); }

/* WHAT IT WOULD HAVE EARNED. The business model is three numbers and the demo
   has no reason to bury them: what the deal is worth, what Fairgain would take
   of it, and what the run really cost to produce. */
.takings {
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet);
  padding: 1rem 1.15rem; margin: 0 0 1.2rem;
}
.takings h3 {
  margin: 0 0 .8rem; font-family: var(--mono); font-size: .72rem; font-weight: 700;
  letter-spacing: .16em; text-transform: uppercase; color: var(--muted);
}
.takings-rows { display: grid; gap: .55rem; margin: 0; grid-template-columns: 1fr; }
.takings-rows > div {
  display: flex; align-items: baseline; gap: .75rem; flex-wrap: wrap;
  padding-bottom: .55rem; border-bottom: 1px solid var(--line);
}
.takings-rows > div:last-child { border-bottom: 0; padding-bottom: 0; }
.takings-rows dt { flex: none; min-width: 11rem; color: var(--ink-2); font-size: .92rem; }
.takings-rows dd {
  margin: 0; font-family: var(--mono); font-size: 1.05rem; font-weight: 700; color: var(--ink);
}
.takings-fee dd { color: var(--accent); font-size: 1.3rem; }
.takings-note {
  display: block; font-family: var(--prose); font-size: .82rem;
  font-weight: 400; color: var(--muted); margin-top: .15rem;
}
.takings-none {
  font-family: var(--prose) !important; font-size: .92rem !important;
  font-weight: 400 !important; color: var(--ink-2) !important; max-width: 40rem;
}
.takings-caveat { margin: .9rem 0 0; font-size: .85rem; color: var(--muted); max-width: 44rem; }

@media (min-width: 46rem) {
  .takings-rows { grid-template-columns: repeat(3, 1fr); gap: 1.4rem; }
  .takings-rows > div {
    display: block; border-bottom: 0; padding-bottom: 0;
    border-left: 2px solid var(--line); padding-left: .9rem;
  }
  .takings-rows dt { min-width: 0; }
}

pre, table { max-width: 100%; overflow-x: auto; }

/* The negotiation page is a live view, so its heading is small and its standing
   caveat sits below the stream rather than in front of it. */
.intro.live { padding-bottom: .4rem; }
.intro.live h1 { font-size: clamp(1.3rem, 1rem + 1.2vw, 1.6rem); margin: 1.25rem 0 .35rem; }
.intro.live p { font-size: .92rem; margin: .35rem 0 .7rem; }
.caveat {
  margin: 0; padding: .9rem 0 1.2rem; color: var(--muted);
  font-size: .84rem; max-width: 48rem;
}

/* ==================================================================== */
/* Landing page                                                          */
/* ==================================================================== */

/* The front page has one job an inner page does not: make somebody want to
   press a button. So it is allowed colour, scale and depth that the working
   pages are not — those stay quiet because a live view should. */

.hero {
  grid-column: full;
  padding: clamp(2.6rem, 6vw, 4.4rem) var(--edge) clamp(2.4rem, 5vw, 3.6rem);
  background:
    radial-gradient(120rem 40rem at 15% -20%, #24399e 0%, transparent 60%),
    radial-gradient(90rem 40rem at 90% 0%, #0f7a70 0%, transparent 55%),
    linear-gradient(180deg, #131a2b 0%, #0e1116 100%);
  color: #fff;
  display: grid; grid-template-columns: 1fr; gap: 2rem; align-items: center;
  border-bottom: 1px solid #1e2531;
}
@media (min-width: 62rem) {
  .hero { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 3.5rem; }
}
/* The band is the grid's job now, so these are plain blocks. */
.hero-inner, .hero-proof { max-width: none; margin: 0; padding: 0; width: auto; min-width: 0; }
.hero-proof { font-family: var(--mono); }

.eyebrow {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .18em;
  text-transform: uppercase; color: #7de3c8; margin: 0 0 1rem;
}
.hero h1 {
  font-size: clamp(2.1rem, 1.1rem + 4vw, 3.6rem);
  line-height: 1.06; letter-spacing: -.035em; font-weight: 700;
  margin: 0 0 1.15rem; max-width: none; color: #fff;
}
.lede {
  font-size: clamp(1rem, .95rem + .3vw, 1.12rem); line-height: 1.6;
  color: #c3cbd8; max-width: 40rem; margin: 0 0 1rem;
}
.lede-note { font-size: .93rem; color: #8e99a9; max-width: 38rem; margin: 0 0 .4rem; }

/* A small, honest picture of what the visitor is about to watch. */
.hero-proof {
  margin: 0 auto; padding: 0 var(--pad) clamp(2.4rem, 5vw, 3.4rem);
  width: 100%; font-family: var(--mono);
}
@media (min-width: 62rem) { .hero-proof { padding: 0; } }
.proof-row {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  background: rgba(255,255,255,.045); border: 1px solid rgba(255,255,255,.1);
  border-radius: 10px; padding: .6rem .8rem; margin-bottom: .5rem;
}
.proof-row.is-veto { border-color: rgba(255,120,105,.45); background: rgba(204,38,24,.16); }
.proof-who { color: #c3cbd8; font-size: .84rem; }
.proof-badge {
  font-size: .68rem; font-weight: 700; letter-spacing: .14em;
  padding: .16rem .5rem; border-radius: 4px; color: #fff;
}
.proof-badge.pass { background: #12a05c; }
.proof-badge.veto { background: #e0392a; }
/* The refusal. It is the first thing a visitor reads about this product, so it
   says what the check decided in a sentence and keeps the code as a small
   handle underneath. Bare SCREAMING_SNAKE on a red panel reads as a crash —
   which is the opposite of what is being shown. */
/* The note under the two side links: how the tabs behave, and the one thing a
   page cannot do for the reader. */
.pair-note {
  max-width: 46rem; color: var(--ink-2); font-size: .92rem; line-height: 1.55;
  margin: 1.1rem 0 0;
}
.pair-note [data-private-hint] { color: var(--muted); }

.proof-reasons {
  list-style: none; margin: 0; padding: .7rem .85rem; border-radius: 10px;
  background: rgba(204,38,24,.14); border: 1px solid rgba(255,120,105,.28);
}
.proof-reasons li { display: flex; gap: .55rem; }
.proof-reasons li > div { min-width: 0; }
.proof-reasons li + li { margin-top: .6rem; padding-top: .6rem; border-top: 1px solid rgba(255,120,105,.18); }
.proof-reasons li::before {
  content: "\2715"; flex: none; color: #ff8a7a; font-size: .74rem; line-height: 1.5;
}
.proof-why {
  display: block; font-family: var(--prose); font-size: .86rem;
  line-height: 1.5; color: #f3d7d2;
}
.proof-code {
  display: block; margin-top: .2rem; font-size: .66rem; letter-spacing: .1em;
  color: #d9857a;
}

/* ------------------------------------------------------------- the three */

.picker { padding-top: clamp(2.2rem, 5vw, 3.2rem); }
.picker-head {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--muted); font-weight: 700;
  margin: 0 0 1.1rem;
}

/* The landing page's picker. It is scoped to its own section because the name
   is not its alone: a round's two turns are also an `ol.cards`, and an
   unscoped rule here laid them out three across — each turn squeezed into a
   third of the page, with the terms inside it overlapping. */
.picker .cards { display: grid; gap: 1rem; grid-template-columns: 1fr; }
@media (min-width: 50rem) { .picker .cards { grid-template-columns: repeat(3, 1fr); } }

.card {
  display: flex; flex-direction: column; gap: .5rem;
  padding: 1.4rem 1.35rem 1.25rem; text-decoration: none; color: inherit;
  background: var(--sheet); border: 1px solid var(--line); border-radius: 14px;
  position: relative; overflow: hidden;
  transition: border-color .14s, transform .14s, box-shadow .14s;
}
.card::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 4px;
  background: linear-gradient(90deg, var(--accent), #46b8a4);
}
.card:hover {
  border-color: var(--accent); transform: translateY(-2px);
  box-shadow: 0 12px 30px rgba(20, 30, 60, .12);
}
.card-icon {
  font-size: 1.5rem; line-height: 1; color: var(--accent);
  width: 2.6rem; height: 2.6rem; border-radius: 10px; background: var(--accent-soft);
  display: grid; place-items: center; margin-bottom: .25rem;
}
.card-kicker {
  font-family: var(--mono); font-size: .66rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted);
}
.card-title { font-size: 1.35rem; font-weight: 700; letter-spacing: -.02em; }
.card-body { font-size: .92rem; color: var(--ink-2); line-height: 1.5; }
.card-terms { display: flex; flex-wrap: wrap; gap: .3rem; margin-top: .35rem; }
.card-terms em {
  font-style: normal; font-family: var(--mono); font-size: .66rem;
  letter-spacing: .04em; padding: .2rem .45rem; border-radius: 5px;
  background: var(--sheet-2); color: var(--ink-2); border: 1px solid var(--line);
}
.card-go {
  margin-top: auto; padding-top: .9rem; font-weight: 640; font-size: .9rem;
  color: var(--accent-deep);
}

/* Two ways into the same demo. They are stacked rather than side by side
   because they are not equal: the two-party run is the one that lets somebody
   check the claim instead of taking it on trust, so it is first and it is
   heavier. */
.card-ways { margin-top: auto; padding-top: 1rem; display: grid; gap: .5rem; }
.way {
  display: block; text-decoration: none; color: inherit;
  border: 1px solid var(--line); border-radius: 10px; padding: .65rem .8rem;
  transition: border-color .12s, background .12s;
}
.way strong { display: block; font-size: .92rem; font-weight: 640; color: var(--accent-deep); }
.way em {
  display: block; font-style: normal; font-size: .8rem; line-height: 1.45;
  color: var(--muted); margin-top: .15rem;
}
.way:hover { border-color: var(--accent); background: var(--accent-soft); }
.way-main { border-color: var(--line-2); background: var(--sheet-2); }
.way-main strong::after { content: " \2192"; }

/* A demo whose wiring is not finished says so and does not pretend. */
.card-soon { opacity: .72; cursor: default; }
.card-soon::before { background: linear-gradient(90deg, #b6bec9, #d4dae2); }
.card-soon:hover { border-color: var(--line); transform: none; box-shadow: none; }
.card-soon .card-icon { color: var(--muted); background: var(--sheet-2); }
.card-soon .card-go { color: var(--muted); }

/* ----------------------------------------------------------------- how */

.how { padding-top: clamp(2.2rem, 5vw, 3rem); padding-bottom: 1rem; }
.how-steps {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: .8rem; grid-template-columns: 1fr;
  counter-reset: none;
}
@media (min-width: 56rem) { .how-steps { grid-template-columns: repeat(4, 1fr); gap: 1rem; } }
.how-steps li {
  font-size: .92rem; color: var(--ink-2); line-height: 1.5;
  padding: 1rem 1rem 1.1rem; border: 1px solid var(--line); border-radius: 12px;
  background: var(--sheet-2);
}
.how-steps strong { display: block; color: var(--ink); font-weight: 650; margin-bottom: .15rem; }
.how-n {
  display: grid; place-items: center; width: 1.7rem; height: 1.7rem;
  border-radius: 50%; background: var(--accent); color: #fff;
  font-family: var(--mono); font-size: .78rem; font-weight: 700;
  margin-bottom: .6rem;
}

/* --------------------------------------------------------- what is missing */

/* The gap panel tells somebody what they did NOT say. It is advice, not a
   demand, so it is quieter than a review error — that one means a side cannot
   be used at all, this one means it could be sharper. */
.gaps {
  margin: .2rem 0 1rem; padding: .8rem .9rem;
  background: var(--sheet-2); border: 1px solid var(--line); border-radius: 10px;
}
.gaps-head {
  margin: 0 0 .5rem; font-family: var(--mono); font-size: .68rem;
  letter-spacing: .12em; text-transform: uppercase; color: var(--muted); font-weight: 700;
}
.gap-list { margin: 0 0 .5rem; padding: 0; list-style: none; }
.gap-list li {
  position: relative; padding-left: 1.4rem; margin: .35rem 0;
  font-size: .89rem; line-height: 1.5; color: var(--ink-2);
}
.gap-list li::before { position: absolute; left: 0; font-family: var(--mono); font-size: .8rem; }

/* Needed: without it the negotiation is hollow. Helpful: it would be a better
   one. Two weights, because treating them alike would make the important one
   easy to skim past. */
.gap-need li { color: var(--ink); }
.gap-need li::before { content: "!"; color: var(--warn); font-weight: 700; }
.gap-soft li::before { content: "+"; color: var(--muted); }
.gaps-note { margin: .5rem 0 0; font-size: .78rem; color: var(--muted); line-height: 1.45; }

.revise { margin: 0 0 .9rem; }
.revise summary {
  cursor: pointer; color: var(--accent-deep); font-size: .86rem;
  font-family: var(--mono); letter-spacing: .04em;
}
.revise-form { margin: .6rem 0 0; }
.revise-form textarea { margin-bottom: .4rem; }
.revise-form .hint { margin: 0 0 .6rem; }
button.primary.small { font-size: .86rem; padding: .5rem 1rem; }

/* ==================================================================== */
/* Two-party demo                                                        */
/* ==================================================================== */

/* Every page of a two-party run shows ONE side. The first thing it has to
   answer is "which one am I", because a person who is unsure whose limits they
   are looking at cannot check the one claim the page is making. */
.whoami {
  margin: 1.4rem 0 .2rem; font-size: .82rem; color: var(--ink-2);
  font-family: var(--mono); letter-spacing: .02em;
}
.whoami strong { color: var(--accent-deep); font-weight: 700; }

/* One side, one column. The solo pages are two columns because they hold two
   sides; here the second column would be an empty half-screen. */
.one-side { max-width: 46rem; margin: 1.5rem 0 0; }
.one-side .actions { margin-bottom: 2rem; }
.one-side.brief { max-width: 52rem; }

/* --- the two links --- */

.links { display: grid; gap: 1rem; grid-template-columns: 1fr; margin: 1.7rem 0 0; }
@media (min-width: 54rem) { .links { grid-template-columns: 1fr 1fr; } }
.link-card {
  border: 1px solid var(--line); border-radius: 14px; padding: 1.2rem 1.25rem 1.3rem;
  background: var(--sheet); position: relative; overflow: hidden;
}
.link-card::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 4px;
  background: linear-gradient(90deg, var(--accent), #46b8a4);
}
.link-card h2 {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--accent); margin: .3rem 0 .4rem;
}
.link-row { display: flex; gap: .5rem; margin: .8rem 0 .9rem; }
.link-input {
  flex: 1; min-width: 0; font-family: var(--mono); font-size: .78rem;
  padding: .55rem .65rem; border: 1px solid var(--line-2); border-radius: 8px;
  background: var(--sheet-2); color: var(--ink-2);
}
button.copy {
  font: inherit; font-size: .78rem; font-family: var(--mono); flex: none;
  padding: .55rem .8rem; border: 1px solid var(--line-2); border-radius: 8px;
  background: var(--sheet); color: var(--accent-deep); cursor: pointer;
}
button.copy:hover { border-color: var(--accent); background: var(--accent-soft); }
a.primary-link {
  display: inline-block; font-weight: 600; font-size: .9rem;
  padding: .6rem 1.1rem; border-radius: 8px; text-decoration: none;
  background: var(--accent); color: #fff;
}
a.primary-link:hover { background: var(--accent-deep); }

/* --- waiting --- */

/* A wait is not an error and not a dead end, so it gets a calm block rather
   than a spinner: the thing being waited for is another person, and no amount
   of animation makes them type faster. */
.waiting {
  margin: 1.8rem 0 2.4rem; max-width: 40rem;
  border: 1px solid var(--line); border-radius: 14px;
  background: var(--sheet-2); padding: 1.6rem 1.5rem;
}
.waiting p { margin: .45rem 0; color: var(--ink-2); font-size: .95rem; }
.waiting strong { color: var(--ink); font-weight: 650; }
.waiting-mark {
  font-size: .7rem; letter-spacing: .5em; color: var(--accent);
  margin: 0 0 .6rem !important; animation: pulse 1.6s ease-in-out infinite;
}
@keyframes pulse { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .waiting-mark { animation: none; opacity: .7; }
}

/* ---- Working on it -------------------------------------------------------
   Every wait on this demo is a model call, and every one of them used to look
   like a page that had ignored the click. One spinner, used in three places:
   on the button that started the call, in the card where the answer will
   land, and in the status line before the first offer. */

.spinner {
  display: inline-block; width: .82em; height: .82em; flex: none;
  vertical-align: -.08em; margin-right: .5em;
  border: 2px solid currentColor; border-right-color: transparent;
  border-radius: 50%; opacity: .55;
  animation: spin .7s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* A busy button keeps its size and colour and loses its hover, because it is
   still the thing that was clicked — it is not disabled scenery. */
button.busy { cursor: progress; }
button.busy .spinner { opacity: .8; }
button:disabled { cursor: not-allowed; }
/* A busy button keeps the accent it had when it was clicked. Greyed out, it
   reads as "this control is unavailable" — which is the opposite of true: it
   is the one thing on the page that is currently doing something. The
   [disabled] rule above is more specific, so this one has to say so too. */
button.primary.busy[disabled] { background: var(--accent); opacity: 1; }

/* The form dims but is not disabled: a disabled field is not submitted, and
   this form is in the middle of being submitted. */
form.is-busy textarea,
form.is-busy input[type="checkbox"] { opacity: .6; }
form.is-busy { cursor: progress; }

/* The note sits above the button it belongs to, so the click point does not
   move under the cursor the moment it appears. */
.busy-note {
  margin: 0 0 .7rem; max-width: 46ch;
  font-size: .82rem; color: var(--ink-2);
}

/* The pending card is the shape of the card that replaces it, so the page
   does not jump when the answer arrives. Dashed, because there is nothing in
   it yet and a solid border would claim otherwise. */
li.turn.pending {
  border-style: dashed; border-color: var(--line-2); background: var(--sheet-2);
}
li.turn.pending::before { border-color: var(--line-2); background: var(--sheet); }
li.turn.pending .who { color: var(--ink-2); }
.thinking { color: var(--muted); font-size: .88rem; }

.status .spinner { color: var(--muted); }

@media (prefers-reduced-motion: reduce) {
  .spinner { animation: none; border-right-color: currentColor; opacity: .35; }
}

/* ---- The ledger ----------------------------------------------------------
   The deals page makes a claim with numbers, so the numbers are the page: set
   large, in the mono the guard's verdicts use, because they come from the same
   place — arithmetic over typed terms, not prose. */

.deals-intro { max-width: 62ch; }
.deals-caveat {
  margin-top: .9rem; padding: .75rem .9rem; border-radius: var(--r);
  background: var(--warn-bg); border: 1px solid var(--warn-line);
  color: var(--ink-2); font-size: .88rem;
}

.ledger { background: var(--sheet-2); border-block: 1px solid var(--line); }
.ledger-inner {
  display: grid; gap: 1.4rem 2.4rem; padding: 1.5rem 0;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
}
.tally { display: flex; flex-direction: column; gap: .3rem; }
.tally-n {
  font-family: var(--mono); font-size: 1.5rem; font-weight: 700;
  letter-spacing: -.02em; color: var(--ink);
}
.tally-lead .tally-n { font-size: 2.1rem; color: var(--accent-deep); }
.tally-l { font-size: .82rem; color: var(--muted); max-width: 30ch; }

.deal-list { list-style: none; margin: 1.6rem 0 0; padding: 0; display: grid; gap: .6rem; }
.deal-link {
  display: grid; gap: .35rem .9rem; padding: .95rem 1.1rem;
  grid-template-columns: 1fr auto; align-items: baseline;
  background: var(--sheet); border: 1px solid var(--line); border-radius: var(--r);
  text-decoration: none; color: inherit;
}
.deal-link:hover { border-color: var(--accent); background: var(--accent-soft); }
.deal-headline { font-family: var(--mono); font-weight: 700; font-size: 1rem; }
.deal-value { font-family: var(--mono); color: var(--ink-2); text-align: right; }
.deal-fee { grid-column: 1 / -1; font-size: .9rem; color: var(--ink-2); }
.deal-fee strong { color: var(--pass); font-family: var(--mono); }
.deal-fee em { color: var(--muted); font-style: normal; font-size: .84rem; }
.deal-meta {
  grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: .8rem;
  font-family: var(--mono); font-size: .7rem; color: var(--muted);
  letter-spacing: .04em;
}
/* A two-party deal is the harder thing to do, so it is the one that is marked. */
.deal-mode.is-pair { color: var(--accent-deep); font-weight: 700; }
.deal-go { grid-column: 1 / -1; font-size: .84rem; color: var(--accent); }
.deals-replay-note { margin-top: 1rem; max-width: 60ch; }
.empty-ledger { padding: 2.4rem 0; color: var(--muted); }
.deals-actions { display: flex; flex-wrap: wrap; gap: .8rem; align-items: center; margin-top: 2rem; }

/* The ledger link on a landing card, under the two ways in. */
.card-ledger {
  display: flex; flex-direction: column; gap: .15rem; margin-top: .7rem;
  padding: .6rem .8rem; border-radius: var(--r);
  background: var(--pass-bg); border: 1px solid var(--pass-line);
  text-decoration: none; color: var(--ink);
}
.card-ledger:hover { border-color: var(--pass); }
.card-ledger strong { font-size: .92rem; }
.card-ledger em { font-style: normal; font-size: .8rem; color: var(--ink-2); }

.replay-intro { max-width: 64ch; }
.replay-kicker {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--muted); margin-bottom: .3rem;
}
.replay-fee {
  margin-top: .8rem; padding: .75rem .9rem; border-radius: var(--r);
  background: var(--pass-bg); border: 1px solid var(--pass-line);
}
.replay-fee strong { font-family: var(--mono); font-size: 1.05rem; }

/* ---- The example picker --------------------------------------------------
   One button per example became a row of buttons as soon as there was more
   than one outcome to demonstrate. A dropdown says what each one IS, which a
   button labelled "English" never did. */

/* The label sits on the first row and the dropdown gets a row of its own: an
   option that says what the pairing DOES is worth more than a narrow control,
   and a truncated one says nothing. */
.examples {
  display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .6rem;
  margin: 0 0 .8rem;
}
.examples label { flex: 1 0 100%; font-size: .84rem; color: var(--muted); }
.example-pick {
  flex: 1 1 auto; min-width: 0;
  font: inherit; font-size: .84rem; color: var(--ink);
  padding: .4rem .55rem; border: 1px solid var(--line-2); border-radius: 6px;
  background: var(--sheet);
}
.example-pick:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
button.example {
  font: inherit; font-size: .82rem; padding: .4rem .8rem; cursor: pointer;
  color: var(--accent-deep); background: var(--accent-soft);
  border: 1px solid var(--line-2); border-radius: 6px;
}
button.example:hover { border-color: var(--accent); }

/* The one line that explains why there is more than one example per side. */
.pick-note {
  margin: 0 0 1.2rem; max-width: 66ch;
  font-size: .88rem; color: var(--ink-2);
}

/* "Start fresh" sits beside the submit, quieter than it: emptying the form is
   a real thing to want and never the main thing. */
.go { display: flex; flex-wrap: wrap; align-items: center; gap: .9rem; margin: 0; }
a.secondary.clear { font-size: .86rem; }
.pick-note strong { color: var(--ink); }

/* ---------------------------------------------------------- invitations */

.admin-number { width: 6rem; }
.admin-table tr.is-revoked { opacity: .55; }
.admin-table .link-input { min-width: 18rem; }
.admin-nav {
  margin: 2rem 0 0; font-size: .9rem;
  display: flex; gap: 1.2rem; align-items: center; flex-wrap: wrap;
}
.admin-actions { display: flex; gap: .4rem; }
.row-note { display: block; font-size: .8rem; color: var(--muted); }
.code-totals {
  display: grid; gap: .8rem; margin: 1.6rem 0;
  grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
}
.code-total {
  display: grid; gap: .2rem; padding: .9rem 1rem;
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet);
}
.code-total-n { font-size: 1.35rem; font-weight: 680; letter-spacing: -.02em; }
.code-total-of { font-size: .9rem; font-weight: 400; color: var(--muted); }
.code-total-label {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted);
}
.signin { max-width: 34rem; }
.signin-form { margin-top: 1.2rem; }
.signin-form input[type="password"] {
  font: inherit; font-size: .9rem; padding: .45rem .6rem; min-width: 18rem;
  border: 1px solid var(--line-2); border-radius: 6px; background: var(--sheet);
}
.signin-form input[type="password"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.invite-code { font-size: 1.05rem; letter-spacing: .06em; }

/* --------------------------------------------------------- an invitation */

/* The page a guest lands on is the first thing they see of any of this, so it
   gets a band of its own rather than starting mid-sentence under the
   masthead. */
.invite-hero {
  background: var(--sheet-2); border-bottom: 1px solid var(--line);
  padding: 2.6rem 0 2.4rem; margin-bottom: 2.2rem;
}
.invite-inner { max-width: 46rem; }
.invite-hero h1 { font-size: clamp(2.1rem, 5vw, 3rem); letter-spacing: -.03em; margin: .3rem 0 .6rem; }
.invite-hero .lede { font-size: 1.05rem; color: var(--ink-2); margin: 0 0 .5rem; }
.invite-note { font-size: .92rem; color: var(--muted); margin: 0; }
.invite-form { margin-top: 1.2rem; }
.invite-form input[type="text"] {
  font: inherit; font-family: var(--mono); font-size: 1rem; letter-spacing: .08em;
  padding: .5rem .7rem; min-width: 12rem;
  border: 1px solid var(--line-2); border-radius: 8px; background: var(--sheet);
}
.invite-form input[type="text"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.invite-more { margin: 2.4rem 0 1rem; font-size: .95rem; }
.picker-note { max-width: 46rem; color: var(--ink-2); font-size: .95rem; margin: .3rem 0 1.2rem; }

/* ------------------------------------------------------------ dead ends */

/* An expired run, a spent quota, a fault of ours. These are the pages a
   visitor is most likely to leave from, so they are pages rather than a line
   of plain text — and every one of them offers the next thing. */
.stop-hero {
  background: var(--sheet-2); border-bottom: 1px solid var(--line);
  padding: 2.6rem 0 2.4rem; margin-bottom: 2.2rem;
}
.stop-inner { max-width: 46rem; }
.stop-hero h1 { margin: .3rem 0 .6rem; }
.stop-hero .lede { font-size: 1.05rem; color: var(--ink-2); margin: 0 0 .6rem; max-width: 44rem; }
.stop-hero .hint { max-width: 44rem; margin: 0; }

.stop-links {
  display: grid; gap: .7rem; margin: 2rem 0 1rem; max-width: 46rem;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
}
.stop-link {
  display: grid; gap: .2rem; padding: .85rem 1rem; text-decoration: none; color: inherit;
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet);
  transition: border-color .12s, transform .12s;
}
.stop-link:hover { border-color: var(--accent); transform: translateY(-1px); }
.stop-link strong { color: var(--accent-deep); font-size: .95rem; font-weight: 640; }
.stop-link em { font-style: normal; color: var(--muted); font-size: .85rem; }

/* ----------------------------------------------------------- the reel */

/* Six cards somebody can page through in a minute. It is a scroller with snap
   points first and a slideshow second: with no JavaScript it still scrolls,
   with a keyboard it still moves, and the arrows and dots are conveniences
   laid on top rather than the mechanism. */
.reel-wrap { margin: 2.4rem 0 0; }
.reel-head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; }
.reel-controls { display: flex; gap: .4rem; }
.reel-arrow {
  font: inherit; font-size: 1rem; line-height: 1; cursor: pointer;
  width: 2.1rem; height: 2.1rem; border-radius: 50%;
  border: 1px solid var(--line-2); background: var(--sheet); color: var(--ink-2);
}
.reel-arrow:hover { border-color: var(--accent); color: var(--accent-deep); }

.reel {
  list-style: none; margin: .9rem 0 0; padding: 0 0 .6rem;
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(min(22rem, 82vw), 24rem);
  gap: 1rem; overflow-x: auto; scroll-snap-type: x mandatory;
  scrollbar-width: none;
}
.reel::-webkit-scrollbar { display: none; }
.reel:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: var(--r); }

.slide {
  scroll-snap-align: start;
  display: grid; align-content: start; gap: .5rem;
  padding: 1.3rem 1.35rem 1.5rem;
  background: var(--sheet); border: 1px solid var(--line); border-radius: 14px;
}
.slide-n {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .14em; color: var(--accent);
}
.slide h3 { margin: 0; font-size: 1.12rem; letter-spacing: -.01em; line-height: 1.3; }
.slide p { margin: 0; font-size: .93rem; color: var(--ink-2); line-height: 1.55; }

.reel-dots { display: flex; gap: .4rem; margin: .9rem 0 0; }
.reel-dot {
  width: .55rem; height: .55rem; padding: 0; border-radius: 50%; cursor: pointer;
  border: 0; background: var(--line-2); transition: background .15s, transform .15s;
}
.reel-dot.is-at { background: var(--accent); transform: scale(1.25); }

/* THE HERO REEL. The right half of the first screen used to be one still
   picture of a refusal, which showed the best moment and none of the argument
   around it. It is now four slides — what is hard, what each agent may see,
   what the check does about what they agreed, and what still has to happen
   before any of it counts — drawn in the same card vocabulary the real run
   uses, so the fourth page is recognisable when a visitor gets to it.

   On the dark hero, so the panel colours are set here rather than inherited
   from the light pages the reel also appears on. */
.hero-reel { padding: 0 var(--pad) clamp(2.4rem, 5vw, 3.4rem); width: 100%; }
@media (min-width: 62rem) { .hero-reel { padding: 0; } }

.hero-slides { grid-auto-columns: 100%; gap: 0; margin: 0; padding: 0; }
/* Each slide carries its own accent, because five identical grey panels is a
   carousel a reader stops watching on the second one. The accent is a tint on
   the panel and a colour on the heading — never on the body text, which has to
   stay readable on a dark gradient that is itself changing colour across the
   screen. */
.hero-slide {
  --tint: 255,255,255;
  --accent-slide: #7de3c8;
  position: relative; overflow: hidden;
  background:
    linear-gradient(135deg, rgba(var(--tint),.10), rgba(var(--tint),.02) 60%),
    rgba(255,255,255,.035);
  border: 1px solid rgba(var(--tint),.22);
  border-radius: 14px; padding: 1.15rem 1.2rem 1.25rem;
  align-content: start; gap: .5rem; min-height: 17.5rem;
}
/* A hairline of the accent along the top, so the colour reads as deliberate
   rather than as a tint somebody forgot to remove. */
.hero-slide::before {
  content: ""; position: absolute; inset: 0 0 auto 0; height: 2px;
  background: linear-gradient(90deg, var(--accent-slide), transparent 72%);
}
.slide-money  { --tint: 125,227,200; --accent-slide: #7de3c8; }
.slide-limits { --tint: 143,168,255; --accent-slide: #9fb4ff; }
.slide-brief  { --tint: 186,148,255; --accent-slide: #c7a6ff; }
.slide-refuse { --tint: 255,138,122; --accent-slide: #ff9a8d; }
.slide-unlock { --tint: 120,220,150; --accent-slide: #86e3a6; }
.slide-boost  { --tint: 255,199,102; --accent-slide: #ffcf80; }
.hero-slide .hero-slide-head { color: var(--accent-slide) !important; }

/* MOTION. The panel's contents arrive rather than appear, staggered, and only
   for the slide a reader is actually on: animating all five on load would
   animate four nobody can see, and the browser pays for every one of them.
   Off entirely for somebody who has asked their machine to stop moving. */
.hero-slide.is-at > * { animation: hero-rise .45s cubic-bezier(.2,.7,.3,1) both; }
.hero-slide.is-at > *:nth-child(2) { animation-delay: .06s; }
.hero-slide.is-at > *:nth-child(3) { animation-delay: .12s; }
.hero-slide.is-at > *:nth-child(4) { animation-delay: .18s; }
.hero-slide.is-at > *:nth-child(5) { animation-delay: .24s; }
@keyframes hero-rise {
  from { opacity: 0; transform: translateY(.6rem); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .hero-slide.is-at > * { animation: none; }
  .hero-big, .hero-bar-fill, .hero-lane-bar { animation: none !important; }
}

/* The money slide. It leads the reel, so it is the slide that has to earn the
   second one. The total is the headline and it climbs; underneath it, each
   demo's fees draw a bar against the biggest, so the shape of where the money
   came from is readable before any of the numbers are. */
/* Two classes deep, both of them — ".slide p" is class-plus-type and beats a
   lone class wherever it is declared. The headline number is a <p>, so a
   single-class rule lost to the body-text colour and the biggest figure on the
   page rendered in the dimmest grey on it. */
.hero-slide .hero-big {
  margin: .1rem 0 0; font-family: var(--mono); font-size: clamp(2rem, 1.1rem + 3.4vw, 3.1rem);
  font-weight: 700; letter-spacing: -.03em; line-height: 1.05;
  color: #ffffff;
}
/* Guarded, because the fallback for an unsupported background-clip is
   transparent text: an invisible headline is a worse slide than a white one. */
@supports (background-clip: text) or (-webkit-background-clip: text) {
  .hero-slide .hero-big {
    background: linear-gradient(100deg, #ffffff 10%, var(--accent-slide) 55%, #ffffff 95%);
    background-size: 220% 100%;
    -webkit-background-clip: text; background-clip: text; color: transparent;
  }
}
.hero-slide.is-at .hero-big { animation: hero-rise .45s cubic-bezier(.2,.7,.3,1) both, hero-sheen 2.6s ease-in-out .5s 1; }
@keyframes hero-sheen {
  from { background-position: 100% 0; }
  to   { background-position: 0 0; }
}
.hero-slide .hero-big-sub {
  margin: .2rem 0 .55rem; font-size: .82rem; line-height: 1.5; color: #b6c4d6;
}
.hero-bars { list-style: none; margin: .1rem 0 0; padding: 0; }
.hero-bar {
  display: grid; gap: .22rem .8rem;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: "who fee" "track track";
  align-items: baseline; padding: .34rem 0 .46rem;
}
.hero-bar-who { grid-area: who; font-size: .88rem; color: #dde4ee; }
.hero-bar-count { font-size: .74rem; color: #93a3b7; white-space: nowrap; }
.hero-bar-fee { grid-area: fee; font-family: var(--mono); font-size: .9rem; color: #f3f7fb; }
/* The bar lengths. They are classes because the page's Content-Security-Policy
   is `style-src 'self'` with no unsafe-inline, so the browser discards every
   style attribute in the document — a width written inline is present in the
   markup, passes a test that reads the markup, and has no effect on the page.
   Five per cent is the step: finer than anybody reads a bar this size. */
.hero-bar-fill.bar-0   { width: 0; }
.hero-bar-fill.bar-5   { width: 5%; }
.hero-bar-fill.bar-10  { width: 10%; }
.hero-bar-fill.bar-15  { width: 15%; }
.hero-bar-fill.bar-20  { width: 20%; }
.hero-bar-fill.bar-25  { width: 25%; }
.hero-bar-fill.bar-30  { width: 30%; }
.hero-bar-fill.bar-35  { width: 35%; }
.hero-bar-fill.bar-40  { width: 40%; }
.hero-bar-fill.bar-45  { width: 45%; }
.hero-bar-fill.bar-50  { width: 50%; }
.hero-bar-fill.bar-55  { width: 55%; }
.hero-bar-fill.bar-60  { width: 60%; }
.hero-bar-fill.bar-65  { width: 65%; }
.hero-bar-fill.bar-70  { width: 70%; }
.hero-bar-fill.bar-75  { width: 75%; }
.hero-bar-fill.bar-80  { width: 80%; }
.hero-bar-fill.bar-85  { width: 85%; }
.hero-bar-fill.bar-90  { width: 90%; }
.hero-bar-fill.bar-95  { width: 95%; }
.hero-bar-fill.bar-100 { width: 100%; }

/* The track carries NO background of its own. A tinted one is a full-width
   line under every row, which reads as a full bar — so a demo that has earned
   nothing looked like it had earned as much as the one beside it. The only
   thing drawn here is the length that was actually earned. */
.hero-bar-track { grid-area: track; height: .34rem; border-radius: 999px; overflow: hidden; }
.hero-bar-fill {
  display: block; width: 0; height: 100%; border-radius: 999px;
  background: rgba(255,255,255,.5); transform-origin: left center;
}
/* The bar's LENGTH is the class above — a real proportion, computed from the
   ledger — and the animation is a scale on top of it, so growing it never
   touches layout and the length survives a browser that refuses to animate. */
.hero-slide.is-at .hero-bar-fill { animation: hero-fill .9s cubic-bezier(.2,.8,.3,1) .2s both; }
@keyframes hero-fill { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.hero-bar.is-top .hero-bar-who, .hero-bar.is-top .hero-bar-fee { color: var(--accent-slide); font-weight: 700; }
.hero-bar.is-top .hero-bar-fill {
  background: linear-gradient(90deg, var(--accent-slide), rgba(125,227,200,.55));
  box-shadow: 0 0 14px rgba(var(--tint),.45);
}

/* The boost slide: three lanes running, one of them refused. */
.hero-race { display: grid; gap: .5rem; margin: .3rem 0 .2rem; }
.hero-lane { display: grid; grid-template-columns: 5.6rem 1fr; align-items: center; gap: .6rem; }
.hero-lane-who { font-family: var(--mono); font-size: .72rem; color: #93a3b7; }
.hero-lane-bar {
  height: .5rem; border-radius: 999px; background: rgba(255,255,255,.1);
  position: relative; overflow: hidden;
}
/* The lane lengths are classes rather than an inline custom property, for the
   same reason the earnings bars are: the page's CSP is `style-src 'self'` with
   no unsafe-inline, so the browser discards the whole style attribute before
   the CSSOM ever sees it. The markup looks right and the bar renders empty. */
.hero-lane-bar::after {
  content: ""; position: absolute; inset: 0 auto 0 0; border-radius: 999px;
  background: var(--accent-slide); transform-origin: left center;
}
.run-long::after  { width: 92%; }
.run-mid::after   { width: 66%; }
.run-short::after { width: 38%; }
.hero-slide.is-at .hero-lane-bar::after { animation: hero-run 1.1s cubic-bezier(.3,.8,.3,1) both; }
.hero-lane-bar.is-out::after { background: #ff8a7a; }
@keyframes hero-run { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.hero-go { color: var(--accent-slide); white-space: nowrap; }
/* Two classes deep, because the shared ".slide p" is class-plus-type and so
   outranks a lone class however late it is declared. Source order does not
   save a rule that loses on specificity. */
.hero-slide .hero-slide-head {
  margin: 0 0 .25rem; font-size: 1rem; font-weight: 700; letter-spacing: -.01em;
  color: #f3f6fa;
}
.hero-slide .hero-slide-note {
  margin: .35rem 0 0; font-size: .85rem; line-height: 1.55; color: #b0bfd2;
}
.hero-slide .proof-row { margin-bottom: .45rem; }
.hero-slide .proof-reasons { margin: .1rem 0 0; }
.proof-limit { font-size: .78rem; color: #93a3b7; text-align: right; }
.proof-row.is-blocked {
  border-style: dashed; border-color: rgba(255,255,255,.16);
  background: transparent; opacity: .62;
}
.proof-row.is-blocked .proof-limit { text-decoration: line-through; }
.proof-row.is-done { border-color: rgba(60,190,130,.4); background: rgba(18,160,92,.14); }
.proof-row.is-done .proof-limit { color: #7fe0ad; }
.proof-row.is-unlocked { border-color: rgba(255,255,255,.2); background: rgba(255,255,255,.07); }
.proof-row.is-unlocked .proof-limit { color: #d7e0ec; }
.hero-dots { justify-content: flex-start; margin-top: .85rem; }
.hero-dots .reel-dot { background: rgba(255,255,255,.28); }
.hero-dots .reel-dot.is-at { background: #7de3c8; }

/* -------------------------------------------------------------- boost mode */

/* Several negotiations at once. The board is the point: three lanes running
   side by side, then a ranking of what each one came to. */
.boost-intro { padding-bottom: .6rem; }
.boost-result { margin: 0 0 1.6rem; }

.boost-totals {
  display: grid; gap: 1rem; grid-template-columns: 1fr; margin: 0 0 1.4rem;
}
@media (min-width: 46rem) { .boost-totals { grid-template-columns: repeat(3, 1fr); } }
.boost-total { border-left: 2px solid var(--line); padding-left: .9rem; }
.boost-total-lead { border-left-color: var(--accent); }
.boost-n {
  display: block; font-family: var(--mono); font-size: 1.45rem; font-weight: 700;
  color: var(--ink); letter-spacing: -.01em;
}
.boost-total-lead .boost-n { color: var(--accent); font-size: 1.75rem; }
.boost-l { display: block; margin-top: .2rem; font-size: .84rem; color: var(--muted); }

.boost-board { list-style: none; margin: 0; padding: 0; }
/* One row per lane. Narrow: the name on top, the numbers under it. Wide: one
   line, with the money in a column of its own so three rows can be compared
   down the page rather than read one at a time. */
.boost-row {
  display: grid; align-items: baseline; gap: .15rem .9rem;
  grid-template-columns: 1.6rem minmax(0, 1fr) auto;
  grid-template-areas:
    "place who     verdict"
    ".     money   rounds"
    ".     open    open";
  padding: .7rem .9rem; margin-bottom: .5rem;
  border: 1px solid var(--line); border-left-width: 3px; border-radius: 10px;
  background: var(--sheet);
}
.boost-place { grid-area: place; }
.boost-who { grid-area: who; }
.boost-verdict { grid-area: verdict; justify-self: end; }
.boost-money { grid-area: money; }
.boost-rounds { grid-area: rounds; justify-self: end; }
.boost-open { grid-area: open; margin-top: .3rem; }
@media (min-width: 48rem) {
  .boost-row {
    align-items: center; gap: .9rem;
    grid-template-columns: 1.6rem minmax(0, 1fr) 6rem 7.5rem 5.5rem auto;
    grid-template-areas: "place who verdict money rounds open";
  }
  .boost-verdict { justify-self: start; }
  .boost-rounds { justify-self: start; }
  .boost-open { margin-top: 0; }
}
.boost-row.is-won { border-color: var(--pass-line); border-left-color: var(--pass); background: var(--pass-bg); }
.boost-place { font-family: var(--mono); font-weight: 700; color: var(--muted); }
.boost-who { font-weight: 600; color: var(--ink); }
.boost-verdict {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .12em;
  text-transform: uppercase; color: var(--muted);
}
.boost-row.is-won .boost-verdict { color: var(--pass); }
.boost-money { font-family: var(--mono); font-weight: 700; color: var(--ink); }
.boost-rounds, .boost-open { font-size: .84rem; color: var(--muted); white-space: nowrap; }
.boost-money { white-space: nowrap; }

.boost-lanes {
  list-style: none; margin: 1.4rem 0 1.6rem; padding: 0;
  display: grid; gap: 1rem; grid-template-columns: 1fr;
}
@media (min-width: 52rem) { .boost-lanes { grid-template-columns: repeat(3, 1fr); } }
.boost-lane {
  border: 1px solid var(--line); border-radius: 12px; background: var(--sheet);
  padding: .9rem 1rem 1rem; min-height: 11rem;
}
.boost-lane-head { display: flex; justify-content: space-between; gap: .6rem; align-items: baseline; }
.boost-lane-who { font-weight: 600; font-size: .95rem; color: var(--ink); }
.boost-lane-state {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .1em;
  text-transform: uppercase; color: var(--muted); white-space: nowrap;
}
.boost-lane-state.is-won { color: var(--pass); }
.boost-lane-state.is-lost { color: var(--veto); }
.boost-turns { list-style: none; margin: .7rem 0 .6rem; padding: 0; min-height: 5.4rem; }
.boost-turn {
  font-family: var(--mono); font-size: .72rem; padding: .2rem 0;
  color: var(--ink-2); border-bottom: 1px solid var(--line);
  animation: boost-in .32s ease-out both;
}
.boost-turn.veto { color: var(--veto); }
.boost-turn.pass { color: var(--pass); }
@keyframes boost-in {
  from { opacity: 0; transform: translateY(.35rem); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) { .boost-turn { animation: none; } }

/* ------------------------------------------------- the executive summary */

/* A document rather than a screen: one column, generous measure, and no
   stagecraft. Somebody reading this is deciding, not playing. */
.summary-intro { padding-bottom: .4rem; }
.eyebrow-dark {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--accent); margin: 1.4rem 0 .6rem;
}
.lede-plain {
  max-width: 44rem; color: var(--ink-2); font-size: 1rem; line-height: 1.62;
  margin: 0 0 .9rem;
}

.summary-block { padding: 1.6rem 0 0; border-top: 1px solid var(--line); margin-top: 1.8rem; }
.summary-block h2 {
  margin: 0 0 .9rem; font-size: 1.25rem; letter-spacing: -.015em;
}
.summary-block h3 {
  margin: 0 0 .25rem; font-size: 1rem; letter-spacing: -.01em;
}
.summary-note, .summary-why {
  max-width: 44rem; margin: 0 0 .9rem; font-size: .9rem; line-height: 1.55;
  color: var(--muted);
}

.summary-list { list-style: none; margin: 0; padding: 0; }
.summary-list > li {
  display: flex; gap: .7rem; padding: .75rem 0;
  border-bottom: 1px solid var(--line);
}
.summary-list > li:last-child { border-bottom: 0; }
.summary-tick { flex: none; color: var(--pass); font-weight: 700; line-height: 1.6; }
.summary-list p { margin: 0; max-width: 44rem; font-size: .95rem; line-height: 1.6; color: var(--ink-2); }
.summary-how { margin-top: .25rem !important; font-size: .87rem !important; color: var(--muted) !important; }

.summary-gap { padding: .9rem 0; border-bottom: 1px solid var(--line); }
.summary-gap:last-child { border-bottom: 0; }
.summary-open { margin: 0; padding-left: 1.1rem; }
.summary-open li {
  max-width: 44rem; margin-bottom: .45rem; font-size: .95rem;
  line-height: 1.6; color: var(--ink-2);
}

.summary-table { width: 100%; max-width: 46rem; border-collapse: collapse; font-size: .92rem; }
.summary-table th {
  text-align: left; font-family: var(--mono); font-size: .7rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--muted);
  padding: 0 .9rem .5rem 0; border-bottom: 1px solid var(--line-2);
}
.summary-table td {
  padding: .6rem .9rem .6rem 0; border-bottom: 1px solid var(--line);
  color: var(--ink-2);
}
.summary-table td.num { font-family: var(--mono); color: var(--ink); }
.summary-table td.quiet, .quiet { color: var(--muted); }

.foot-links { list-style: none; margin: 1rem 0 0; padding: 0; }
.foot-links li { margin-bottom: .4rem; font-size: .92rem; }

/* ------------------------------------------------------------- admin page */

/* The allowlist page. It is an operator's tool, not part of the demo, so it
   borrows the demo's type and colour and none of its stagecraft: a statement
   of what is on the list, a box to add to it, and a way to take one off. */
.ok {
  color: var(--pass); background: var(--pass-bg); border: 1px solid var(--pass-line);
  border-radius: 8px; padding: .65rem .85rem; margin: 1rem 0;
}
.admin-you, .admin-add, .admin-list { margin: 1.8rem 0; }
.admin-you h2, .admin-add h2, .admin-list h2 {
  font-size: 1rem; margin: 0 0 .5rem; color: var(--ink);
}
.admin-form { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .7rem; margin: .8rem 0 0; }
.admin-form label { font-size: .84rem; color: var(--muted); }
.admin-form input[type="text"] {
  font: inherit; font-size: .9rem; color: var(--ink);
  padding: .45rem .6rem; border: 1px solid var(--line-2); border-radius: 6px;
  background: var(--sheet); min-width: 14rem;
}
.admin-form input[type="text"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.admin-form button {
  font: inherit; font-size: .86rem; padding: .45rem .95rem; cursor: pointer;
  color: #fff; background: var(--accent); border: 1px solid var(--accent);
  border-radius: 6px;
}
.admin-form button:hover { background: var(--accent-deep); border-color: var(--accent-deep); }
.admin-form button.remove {
  color: var(--veto); background: var(--veto-bg); border-color: var(--veto-line);
}
.admin-form.inline { margin: 0; }

.admin-table { border-collapse: collapse; width: 100%; font-size: .9rem; margin: .8rem 0 0; }
.admin-table th { text-align: left; font-size: .78rem; color: var(--muted); font-weight: 600; }
.admin-table th, .admin-table td {
  padding: .5rem .7rem .5rem 0; border-bottom: 1px solid var(--line); vertical-align: middle;
}
.admin-table code { font-family: var(--mono); font-size: .88rem; }
.admin-you-tag {
  font-size: .72rem; color: var(--accent-deep); background: var(--accent-soft);
  border-radius: 999px; padding: .1rem .45rem; margin-left: .3rem;
}
.admin-fixed { margin: .6rem 0 0; padding: 0 0 0 1.1rem; }
.admin-fixed code { font-family: var(--mono); font-size: .88rem; }

/* Visible to a screen reader, and to nothing else. */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* --------------------------------------------------- waiting list, investors */

/* The two forms that collect a contact. They are the plainest pages on the
   site on purpose: somebody is about to type their phone number in, and that
   is not a moment for a carousel. */
.signup-panel {
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet);
  padding: clamp(1.1rem, 3vw, 1.7rem); margin: 0 0 1.4rem;
}
.signup-panel h2 { margin: 0 0 1rem; font-size: 1.1rem; letter-spacing: -.01em; }
.signup-done h2 { color: var(--pass); }
.signup-form { display: grid; gap: 1.1rem; }
.field { display: grid; gap: .35rem; border: 0; padding: 0; margin: 0; min-width: 0; }
.field-label {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted); padding: 0;
}
.field-need { color: var(--accent); letter-spacing: .08em; }
.field-hint { margin: 0 0 .2rem; font-size: .84rem; color: var(--muted); }
.field input[type="text"], .field input[type="email"], .field input[type="tel"],
.field textarea {
  width: 100%; box-sizing: border-box; font: inherit; color: var(--ink);
  padding: .6rem .75rem; border: 1px solid var(--line-2); border-radius: 10px;
  background: var(--paper-2, #fff);
}
.field textarea { resize: vertical; min-height: 4.5rem; }
.field input:focus-visible, .field textarea:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 1px; border-color: var(--accent);
}
.field-row { display: grid; gap: 1.1rem; }
@media (min-width: 40rem) { .field-row { grid-template-columns: 1fr 1fr; } }

/* One row per answer rather than a dropdown: the list is short, and the whole
   point of asking is that somebody reads the options. */
.role-list { display: grid; gap: .4rem; }
.role {
  display: flex; align-items: flex-start; gap: .6rem; cursor: pointer;
  padding: .55rem .7rem; border: 1px solid var(--line); border-radius: 10px;
  font-size: .92rem;
}
.role:hover { border-color: var(--line-2); background: var(--sheet-2); }
.role:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); }
.role input { margin-top: .15rem; flex: none; }

/* The cheque ladder. Twenty round numbers, so they are a grid of chips rather
   than twenty rows. */
.ticket-list {
  display: grid; gap: .45rem;
  grid-template-columns: repeat(auto-fill, minmax(7.5rem, 1fr));
}
.ticket {
  position: relative; display: grid; gap: .1rem; cursor: pointer; text-align: center;
  padding: .55rem .4rem; border: 1px solid var(--line); border-radius: 10px;
}
.ticket:hover { border-color: var(--line-2); background: var(--sheet-2); }
.ticket:has(input:checked) {
  border-color: var(--accent); background: var(--accent-soft);
  box-shadow: inset 0 0 0 1px var(--accent);
}
/* The radio itself is off-screen rather than display:none, so it keeps its
   place in the tab order and a screen reader still announces the group. */
.ticket input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.ticket-usd { font-family: var(--mono); font-size: .92rem; font-weight: 700; color: var(--ink); }
.ticket-pct { font-size: .72rem; color: var(--muted); }
.ticket:has(input:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }

.signup-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .8rem; margin: 0; }
.signup-count { font-size: .84rem; color: var(--muted); }
.signup-aside {
  margin: 0 0 2rem; padding: .9rem 1.1rem; border-left: 3px solid var(--line-2);
}
.signup-aside h2 { margin: 0 0 .3rem; font-size: .98rem; }
.signup-aside p { margin: 0; font-size: .92rem; color: var(--ink-2); }

/* The round's terms, as a definition list rather than prose: somebody scanning
   for the number should not have to read a paragraph to find it. */
.round-terms {
  border: 1px solid var(--line); border-radius: var(--r); background: var(--sheet-2);
  padding: clamp(1rem, 2.5vw, 1.5rem); margin: 0 0 1.6rem;
}
.round-terms h2 { margin: 0 0 .9rem; font-size: 1.05rem; }
.round-rows { display: grid; gap: .7rem; margin: 0 0 1rem; }
@media (min-width: 46rem) { .round-rows { grid-template-columns: repeat(4, 1fr); gap: 1.2rem; } }
.round-rows > div { display: grid; gap: .15rem; }
.round-rows dt {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--muted);
}
.round-rows dd { margin: 0; font-size: 1rem; font-weight: 600; color: var(--ink); }
.round-note { margin: 0; font-size: .85rem; color: var(--muted); max-width: 48rem; }
.round-links { margin: .2rem 0 0; padding-left: 1.1rem; display: grid; gap: .5rem; }
.round-links li { font-size: .93rem; color: var(--ink-2); }

/* The operator's list. */
.signup-note { display: block; font-size: .8rem; color: var(--muted); margin-top: .2rem; }
.inline-form { display: inline; }
.link-button {
  font: inherit; font-size: .8rem; color: var(--muted); background: none;
  border: 0; padding: 0; cursor: pointer; text-decoration: underline;
}
.link-button:hover { color: var(--veto); }
.foot-links { display: flex; flex-wrap: wrap; gap: 1.2rem; margin: 1rem 0 0; font-size: .85rem; }
.foot-links a { color: #aab3c0; }
.foot-links a:hover { color: #fff; }
.landing-cta { margin: 0 var(--pad) 2rem; }
@media (min-width: 62rem) { .landing-cta { margin-left: 0; margin-right: 0; } }
