/* ------------------------------------------------------------------ */
/* pitch.vin — the Flagship system as a reveal.js theme.               */
/* Tokens are hub.tsx law (site/src/design/hub.tsx): Sora display /    */
/* Albert Sans body / Fira Code strictly for VINs, addresses, figures, */
/* event names; Verified Green #0E6B4A (tint #35B183 on dark);         */
/* paper/ink ground; the green Stop device; no icon glyphs; fonts      */
/* self-hosted — no external request of any kind.                      */
/* ------------------------------------------------------------------ */

@font-face{font-family:'Sora';font-style:normal;font-weight:600;font-display:swap;src:url('/fonts/sora-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Sora';font-style:normal;font-weight:700;font-display:swap;src:url('/fonts/sora-latin-700-normal.woff2') format('woff2')}
@font-face{font-family:'Sora';font-style:normal;font-weight:800;font-display:swap;src:url('/fonts/sora-latin-800-normal.woff2') format('woff2')}
@font-face{font-family:'Albert Sans';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/albert-sans-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Albert Sans';font-style:normal;font-weight:500;font-display:swap;src:url('/fonts/albert-sans-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'Albert Sans';font-style:normal;font-weight:600;font-display:swap;src:url('/fonts/albert-sans-latin-600-normal.woff2') format('woff2')}
@font-face{font-family:'Fira Code';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/fira-code-latin-400-normal.woff2') format('woff2')}
@font-face{font-family:'Fira Code';font-style:normal;font-weight:500;font-display:swap;src:url('/fonts/fira-code-latin-500-normal.woff2') format('woff2')}
@font-face{font-family:'Fira Code';font-style:normal;font-weight:600;font-display:swap;src:url('/fonts/fira-code-latin-600-normal.woff2') format('woff2')}

:root{
  --ink:#0B120F;
  --ink-soft:#3C4642;
  --muted:#66716B;
  --paper:#FFFFFF;
  --paper-2:#F5F7F6;
  --line:#E4E8E5;
  --line-soft:#EEF1EF;
  --green:#0E6B4A;
  --green-deep:#0A523A;
  --tint:#35B183;
  --dark:#0A1411;
  --dark-2:#0E1B16;
  --dark-line:#20342B;
  --dark-text:#DCE7E0;
  --dark-muted:#8BA396;
  --sans-display:"Sora",sans-serif;
  --sans-body:"Albert Sans",sans-serif;
  --mono:"Fira Code",monospace;
}

/* ---------- reveal ground ---------- */
html{color-scheme:light}
.reveal-viewport{background:var(--paper)}
.reveal{
  font-family:var(--sans-body);
  font-size:26px;
  color:var(--ink);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
.reveal ::selection{background:#CDEBDD;color:var(--ink)}
.reveal .slides{text-align:left}
/* Composition law (review P1): every slide is a flex column vertically
   centered in the 1280x720 canvas — deck.js boots Reveal with
   display:'flex' so the present slide's inline display cooperates. The
   bottom padding sets the optical center slightly high and clears the
   fixed tracker pinned at the viewport's bottom-left. The tracker band
   is ~96 real px (4 lines x 19.5px + 18px inset) and does NOT scale
   with Reveal, so the reserve is sized in slide-px against the 1280x720
   scale (0.926): 96 / 0.926 + ~8px breathing room = 112px (round-4
   review P0 — 76px let tall slides print under the tracker). */
.reveal .slides section{
  line-height:1.5;
  height:100%;box-sizing:border-box;
  flex-direction:column;justify-content:center;
  padding-bottom:112px;
}
.reveal .progress{color:var(--green);height:3px}
.reveal a{color:inherit;text-decoration:none}

.mono{font-family:var(--mono)}
.stop{color:var(--green)}
section.dark .stop{color:var(--tint)}
/* The green tld token, single-sourced (review P4). */
.k-tld{color:var(--green)}

/* ---------- shared slide grammar ---------- */
.kicker{
  font-family:var(--mono);
  font-size:.62em;color:var(--muted);
  display:flex;align-items:center;gap:16px;margin:0 0 1.1em;
}
.kicker::after{content:"";height:1px;flex:0 0 64px;background:var(--green)}
.s-word{
  font-family:var(--sans-display);font-weight:800;
  font-size:2.4em;line-height:1.02;letter-spacing:-0.035em;
  margin:0;
}
.s-claim{
  font-family:var(--sans-display);font-weight:600;
  font-size:1.05em;letter-spacing:-0.015em;line-height:1.3;
  margin:.9em 0 0;max-width:34em;
}
.s-claim .mono{font-size:.9em}
.s-note{margin:1.1em 0 0;font-size:.62em;color:var(--muted);max-width:60em}
.s-note.mono{font-size:.56em}
.s-cols{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,6fr);gap:38px;margin-top:1.2em;align-items:start}

/* ---------- dark band (the AI act) ---------- */
section.dark{color:var(--dark-text)}
section.dark .kicker{color:var(--dark-muted)}
section.dark .kicker::after{background:var(--tint)}
section.dark .s-word,section.dark .s-claim{color:#F2F7F4}
section.dark .s-note{color:var(--dark-muted)}

/* ---------- 01 · home — the stack ---------- */
/* The cover leads the deck's scale, not trails it (round-2 review P3):
   the four-act stack sits just under the act-divider register — 3.8em is
   the ceiling that still seats mark + stack + thesis + lockup in the
   720px canvas. */
.home-mark{
  font-family:var(--mono);font-weight:600;font-size:.8em;color:var(--green);
  margin:0 0 .9em;
}
.home-stack{list-style:none;margin:0;padding:0}
.home-stack li{
  font-family:var(--sans-display);font-weight:800;
  font-size:3.8em;line-height:1.04;letter-spacing:-0.04em;
}
.home-thesis{
  margin:1.1em 0 0;max-width:38em;
  font-size:.78em;color:var(--ink-soft);
}
.home-lockup{margin:1.3em 0 0;font-family:var(--mono);font-size:.58em;color:var(--muted)}

/* ---------- act dividers ---------- */
/* The divider is a moment, not a margin note (review P1): the slide's
   flex column centers it in the canvas and the act word carries it. */
.act-num{font-family:var(--mono);font-size:.62em;color:var(--muted);margin:0 0 .9em}
.act-word{
  font-family:var(--sans-display);font-weight:800;
  font-size:6.5em;line-height:1;letter-spacing:-0.04em;margin:0;
}
.act-claim{
  font-family:var(--sans-display);font-weight:600;
  font-size:1.05em;letter-spacing:-0.015em;margin:.8em 0 0;color:var(--ink-soft);
}
section.dark .act-claim{color:var(--dark-muted)}
/* WCAG AA on the dark divider (round-4 review P1): --muted on --dark is
   3.74:1; --dark-muted reads 8.9:1 for the small mono act counter. */
section.dark .act-num{color:var(--dark-muted)}

/* ---------- trinity ---------- */
/* Full-width rules, like the rest of the rows grammar (review P2). */
.trinity{list-style:none;margin:1.1em 0 0;padding:0;border-top:1px solid var(--line)}
.trinity li{
  display:grid;grid-template-columns:minmax(0,5.5em) minmax(0,1fr);
  gap:4px 24px;align-items:baseline;
  padding:.5em 4px;border-bottom:1px solid var(--line);
}
.trinity .t-mark{font-family:var(--mono);font-weight:600;font-size:.8em;color:var(--green)}
.trinity .t-def{font-size:.66em;color:var(--ink-soft)}

/* ---------- 02 · anatomy ---------- */
.anatomy{
  display:flex;flex-wrap:wrap;gap:14px 26px;
  justify-content:space-between; /* the six segments occupy the panel (review P2) */
  margin-top:1.2em;padding:20px 24px 16px;
  border:1px solid var(--line);border-radius:14px;background:var(--paper-2);
}
.seg{display:flex;flex-direction:column;gap:4px}
.seg-chars{
  font-family:var(--mono);font-weight:600;
  font-size:1.3em;letter-spacing:.1em;
  border-top:2px solid var(--ink);padding-top:6px;
}
.seg-check .seg-chars{border-top-color:var(--green);color:var(--green)}
.seg-pos{font-family:var(--mono);font-size:.48em;color:var(--green)}
.seg-label{font-size:.52em;color:var(--muted)}

/* ---------- 03 · fracture ---------- */
.fan{border:1px solid var(--line);border-radius:14px;padding:16px 20px;background:var(--paper)}
/* Column balance (round-5 review P3, the lighter #fracture case): the
   fan card stretches to the provider list's height, its note settling
   at the card's foot — the two columns bottom out together. */
#fracture .fan{align-self:stretch;display:flex;flex-direction:column}
#fracture .fan .s-note{margin-top:auto;padding-top:1.1em}
.fan-vin{font-family:var(--mono);font-weight:600;font-size:.66em;letter-spacing:.06em;margin:0;overflow-wrap:anywhere}
.fan-car{font-family:var(--sans-display);font-weight:700;font-size:.74em;letter-spacing:-0.015em;margin:.3em 0 0}
.fan-trims{list-style:none;display:flex;flex-wrap:wrap;gap:7px;margin:.7em 0 0;padding:0}
.fan-trims li{
  font-size:.56em;font-weight:500;color:var(--green);
  border:1px solid #CBE3D8;border-radius:999px;padding:3px 13px;background:#F1F8F5;
}
.providers{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
/* The grain cell sits beside its identifier, not pinned to the far rail
   (round-3 review P2): a fixed middle track holds the id column, the
   trailing 1fr keeps the row rule full-width. */
.providers li{
  display:grid;grid-template-columns:minmax(0,11em) 11em minmax(0,1fr);
  gap:2px 12px;align-items:baseline;
  padding:4px;border-bottom:1px solid var(--line-soft);
  font-size:.56em;
}
.providers .pr-more .pr-id{grid-column:2/4}
.pr-name{font-weight:500}
.pr-id{font-family:var(--mono);font-size:.9em;color:var(--ink-soft)}
.pr-grain{font-family:var(--mono);font-size:.84em;color:var(--green);white-space:nowrap}
/* Nine named rows and a quiet terminator — the wound stays countable
   from the back of the room (round-2 review P4). */
.providers .pr-more .pr-name,.providers .pr-more .pr-id{color:var(--muted);font-weight:400}

/* ---------- rows grammar (tiers, rungs, facts) ---------- */
.rows{list-style:none;margin:1.2em 0 0;padding:0;border-top:1px solid var(--line)}
.rows li{
  display:grid;gap:4px 20px;align-items:baseline;
  padding:.45em 4px;border-bottom:1px solid var(--line);
}
.rows.bands li{grid-template-columns:minmax(0,4em) minmax(0,11em) minmax(0,1fr)}
.b-name{font-family:var(--sans-display);font-weight:700;font-size:.72em}
.b-basis{font-family:var(--mono);font-size:.54em;color:var(--green)}
.b-faces{font-size:.66em;color:var(--ink-soft)}
.b-note{grid-column:3;font-family:var(--mono);font-size:.52em;color:var(--muted)}
/* The price sits beside its rung, not across a dead track at the far
   rail (round-3 review P2): fixed middle column, full-width rule kept. */
.rows.rungs li{grid-template-columns:minmax(0,7em) 19em minmax(0,1fr)}
.r-rung{font-family:var(--mono);font-size:.58em;font-weight:500;color:var(--green)}
.r-what{font-size:.66em;color:var(--ink-soft)}
.r-price{font-family:var(--mono);font-size:.56em;white-space:nowrap}
.rows.facts li{grid-template-columns:minmax(0,8.5em) minmax(0,1fr);font-size:.66em;color:var(--ink-soft)}
.rows.facts .f-label{font-family:var(--mono);font-size:.8em;color:var(--green)}
.rows.facts .mono{font-size:.9em;color:var(--ink)}

/* ---------- vindex ---------- */
/* Two columns (review P1): the spine card left, the wedge rows right —
   the slide shortens, the right half of the canvas works. */
/* Flat 1px border — one card grammar deck-wide (round-5 review P3):
   no box-shadow; every container sits on the same plane. */
.spine-card{
  border:1px solid var(--line);border-radius:14px;background:var(--paper);
  padding:12px 16px;
}
.spine-row{
  font-family:var(--mono);font-size:.6em;font-weight:600;margin:0;
  border:1px solid #CBE3D8;background:#F1F8F5;border-radius:10px;
  padding:8px 12px;overflow-wrap:anywhere;
}
.spine-edges{list-style:none;margin:.5em 0 0;padding:0;border-top:1px solid var(--line-soft)}
.spine-edges li{
  font-family:var(--mono);font-size:.52em;color:var(--muted);
  padding:3px 2px;border-bottom:1px solid var(--line-soft);overflow-wrap:anywhere;
}
.wedge-rows{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.wedge-rows li{
  display:grid;grid-template-columns:minmax(0,6em) minmax(0,1fr);
  gap:2px 18px;align-items:baseline;
  padding:.5em 2px;border-bottom:1px solid var(--line);
}
.w-label{font-family:var(--mono);font-size:.56em;color:var(--green)}
.w-fact{font-size:.66em;font-weight:500}

/* ---------- services · lanes + chassis ---------- */
.lanes{list-style:none;margin:1.2em 0 0;padding:0;border-top:1px solid var(--line)}
.lanes li{
  display:grid;grid-template-columns:minmax(0,6.5em) minmax(0,1fr);
  gap:4px 20px;align-items:baseline;
  padding:.42em 4px;border-bottom:1px solid var(--line);
}
.lane-word{font-family:var(--sans-display);font-weight:800;font-size:.8em;letter-spacing:.01em}
.lane-fact{font-size:.64em;color:var(--ink-soft)}
.chassis-line{
  margin:1em 0 0;font-family:var(--mono);font-size:.6em;color:var(--ink);
  overflow-wrap:anywhere;
}
.chassis-line .hop{
  border:1px solid var(--line);border-radius:8px;background:var(--paper-2);
  padding:3px 9px;white-space:nowrap;
}
.chassis-line .arrow{color:var(--green)}
/* No widow (round-4 review P2): at 60em the lanes note wraps at ~940px
   and strands the one-word line "deal." — 56em breaks the line at the
   sentence's own comma instead. */
#lanes .s-note{max-width:56em}
/* Tracker clearance (round-5 review P2): #lanes is the deck's tallest
   light slide — .85em restores >=24 slide-px between the note and the
   tracker band. #partner keeps the base 1em. */
#lanes .chassis-line{margin-top:.85em}

/* ---------- commerce ---------- */
.flywheel{list-style:none;margin:1.2em 0 0;padding:0;display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.flywheel li{display:flex;align-items:center;gap:10px}
.fw-arrow{color:var(--green);font-size:.9em}
.fw-step{
  display:flex;flex-direction:column;gap:2px;
  border:1px solid var(--line);border-radius:12px;background:var(--paper);
  padding:8px 14px;
}
.fw-addr{font-family:var(--mono);font-size:.56em;font-weight:500;color:var(--green)}
.fw-what{font-size:.56em;color:var(--ink-soft)}
.events{
  margin:1.1em 0 0;font-family:var(--mono);font-size:.56em;font-weight:500;line-height:2.1;
  overflow-wrap:anywhere;
}
.events .ev{
  border:1px solid var(--line);border-radius:8px;background:var(--paper-2);
  padding:3px 8px;white-space:nowrap;
}
.events .ev-arrow{color:var(--green)}

/* ---------- commerce · two customers, one record ---------- */
.counters{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:20px;margin-top:1.2em}
.counter{
  border:1px solid var(--line);border-radius:14px;background:var(--paper);
  padding:14px 18px;
}
.c-who{font-family:var(--sans-display);font-weight:700;font-size:.8em;letter-spacing:-0.02em;margin:0}
.c-wound{margin:.4em 0 0;font-size:.58em;color:var(--muted)}
.c-answer{margin:.5em 0 0;font-size:.62em;color:var(--ink-soft)}
.c-addr{margin:.6em 0 0;font-family:var(--mono);font-size:.52em;color:var(--green);overflow-wrap:anywhere}

/* ---------- commerce · the partner equation ---------- */
.rows.equation li{grid-template-columns:minmax(0,8.5em) minmax(0,12em) minmax(0,1fr)}
.eq-channel{font-family:var(--sans-display);font-weight:700;font-size:.66em;letter-spacing:-0.01em}
.eq-rail{font-family:var(--mono);font-size:.52em;color:var(--green);overflow-wrap:anywhere}
.eq-fact{font-size:.6em;color:var(--ink-soft)}

/* ---------- ai · machine surface ---------- */
/* Zero top margin: the stack shares a top line with the code card in the
   align-items:start s-cols grid (review P3). */
.stack-list{list-style:none;margin:0;padding:0;border-top:1px solid var(--dark-line)}
.stack-list li{
  font-family:var(--mono);font-size:.58em;color:var(--dark-text);
  padding:.45em 2px;border-bottom:1px solid var(--dark-line);overflow-wrap:anywhere;
}
.motions-line{margin:.9em 0 0;font-family:var(--mono);font-size:.56em;color:var(--dark-muted)}
.code-proof{
  min-width:0;border:1px solid var(--dark-line);border-radius:16px;background:var(--dark-2);
  overflow:hidden;
}
.code-head{
  display:flex;justify-content:space-between;gap:12px;align-items:center;flex-wrap:wrap;
  padding:10px 16px;border-bottom:1px solid var(--dark-line);
}
.code-head .proof-title{font-size:.6em;font-weight:600;color:var(--dark-text)}
.code-head .proof-addr{font-family:var(--mono);font-size:.52em;color:var(--tint)}
.code-proof pre{
  margin:0;padding:14px 16px;overflow-x:auto;
  font-family:var(--mono);font-size:.5em;line-height:1.7;color:#B9CFC3;
  box-shadow:none;width:auto;
}
.code-proof pre code{background:none;padding:0;font-family:inherit;max-height:none}
.code-proof .k{color:#7FC9AB}
.code-proof .s{color:#E6EFE9}
.code-proof .c{color:#7A9587}

/* ---------- ai · the motion grammar ---------- */
.motions{list-style:none;margin:0;padding:0;border-top:1px solid var(--dark-line)}
/* .36em rows + .6em pattern margin (round-4 review P0 follow-through):
   the motions column is the deck's tallest — a notch tighter seats its
   last line clear of the tracker band at every viewport. */
.motions li{
  display:grid;grid-template-columns:minmax(0,4.5em) minmax(0,1fr);
  gap:4px 18px;align-items:baseline;
  padding:.36em 2px;border-bottom:1px solid var(--dark-line);
}
.m-code{font-family:var(--mono);font-weight:600;font-size:.64em;color:var(--tint)}
.m-what{font-size:.58em;color:var(--dark-text)}
/* max-width (round-4 review P2): the attest line breaks intentionally
   into two balanced lines, no one-stub widow. 39em, not the review's
   30em — at 30em the 118-char mono line wraps to THREE lines (~50
   chars/line), growing the block ~20 slide-px and re-creating the P0
   tracker collision on #motions; 39em is the narrowest width that
   still seats it in two. */
.m-pattern{margin:.5em 0 0;font-family:var(--mono);font-size:.52em;color:var(--dark-muted);max-width:39em}
.trust-card{
  border:1px solid var(--dark-line);border-radius:16px;background:var(--dark-2);
  padding:14px 18px;
}
.trust-title{font-size:.64em;font-weight:600;color:var(--dark-text);margin:0}
.artifacts{list-style:none;margin:.6em 0 0;padding:0;border-top:1px solid var(--dark-line)}
.artifacts li{
  display:flex;flex-direction:column;gap:3px;
  padding:.5em 2px;border-bottom:1px solid var(--dark-line);
}
.artifacts li:last-child{border-bottom:none}
.a-name{font-family:var(--mono);font-weight:600;font-size:.56em;color:var(--tint)}
.a-fact{font-size:.56em;color:var(--dark-muted)}
/* Column balance (round-5 review P3): the trust-card stretches to the
   motions column's height and the artifacts rows share the extra run —
   no dark void in the lower-right quadrant. */
#motions .trust-card{align-self:stretch;display:flex;flex-direction:column}
#motions .artifacts{flex:1;display:flex;flex-direction:column}
#motions .artifacts li{flex:1;justify-content:center}

/* ---------- why now ---------- */
/* Full-width rules — the rows occupy the canvas (review P2). */
.now-rows{list-style:none;margin:1.2em 0 0;padding:0;border-top:1px solid var(--dark-line)}
/* .5em rows (round-5 review P2): restores >=24 slide-px clearance above
   the tracker band — the last row no longer docks onto the device. */
.now-rows li{display:flex;flex-direction:column;gap:4px;padding:.5em 4px;border-bottom:1px solid var(--dark-line)}
.n-line{font-family:var(--sans-display);font-weight:700;font-size:.94em;letter-spacing:-0.02em;color:#F2F7F4}
.n-ground{font-size:.6em;color:var(--dark-muted);max-width:60em}

/* ---------- the close ---------- */
.close-line{margin:.9em 0 0;font-size:.68em;color:var(--ink-soft);max-width:40em}
/* The ask is the arc's terminal beat, so it speaks in the claim register
   (round-3 review P1): display weight and scale, its own zone above the
   live door — the deck builds to it, then hands over the keyboard. */
.ask{
  margin:1em 0 0;font-family:var(--sans-display);font-weight:800;
  font-size:1.7em;line-height:1.15;letter-spacing:-0.03em;
}
.ask .mono{font-size:.85em;font-weight:600}
/* Corner economy (round-4 review P2): the terminal beat — the ask, then
   the live door — owns the bottom-left; the whole close column caps
   (trinity 1.4->1.1em, close-line 1.2->.9em, ask 1.4->1em,
   door 1.3->.9em, addr 1.4->1em) so the address line clears the
   tracker by >=20px real at 1024x768. */
.close-addr{margin:1em 0 0;font-family:var(--mono);font-size:.62em;color:var(--muted)}

/* ---------- the close · the live door (DECKSPEC 14, review P3) ---------- */
/* The last slide is a live door: the same GET ?vin form every door
   carries. Submitting resolves at this worker and lands back on the
   close with the VIN posted in the address (deck.js closes the loop). */
.door{
  margin:.9em 0 0;max-width:34em;
  display:flex;align-items:stretch;
  border:1px solid var(--line);border-radius:12px;background:var(--paper);
  overflow:hidden;
}
/* Focus is visible from the back of the room, not a 1px hue shift
   (round-3 review P2, WCAG 2.4.7/2.4.11): border re-inks AND a ring. */
.door:focus-within{
  border-color:var(--green);
  box-shadow:0 0 0 3px rgba(14,107,74,.25);
}
.door-addr{
  display:flex;align-items:center;padding:0 2px 0 14px;
  font-family:var(--mono);font-size:.6em;color:var(--muted);white-space:nowrap;
}
.door input{
  flex:1;min-width:0;border:0;outline:none;background:transparent;
  font-family:var(--mono);font-size:.6em;color:var(--ink);
  letter-spacing:.06em;text-transform:uppercase;
  padding:12px 8px;
}
.door input::placeholder{color:var(--muted)}
.door button{
  border:0;cursor:pointer;background:var(--green);color:#fff;
  font-family:var(--mono);font-weight:600;font-size:.56em;letter-spacing:.08em;
  padding:0 18px;
}
.door button:hover{background:var(--green-deep)}
.sr-only{
  position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;
}

/* ---------- THE TRACKER ---------- */
/* The mini-stack, pinned bottom-left: Data · Services · Commerce · AI —
   the current act lit in Verified Green; pre-act slides none lit; the
   close all lit. Driven by Reveal 'slidechanged' + data-act (deck.js). */
/* left/bottom/font-size here are the pre-boot fallback; deck.js
   re-anchors the tracker to the scaled slide area's bottom-left AND
   scales it with Reveal.getScale() on ready/resize (round-4 review P0:
   a fixed-px tracker occupies a different slide-px band at every window
   shape, so no single padding reserve can clear it — scaled, its band
   is a constant ~97 slide-px and the 112px section reserve holds at
   every viewport). Sized via em so one font-size drives the device. */
.tracker{
  position:fixed;left:20px;bottom:18px;z-index:40;
  pointer-events:none;
  font-size:13px;
  transition:opacity .3s ease;
}
/* Hidden on #home — the home stack already is the tracker (review P3);
   deck.js fades it in from the second slide onward. */
.tracker.is-hidden{opacity:0}
.tracker ol{list-style:none;margin:0;padding:0}
/* Unlit acts hold full-opacity muted tokens (>= 4.5:1 on both grounds,
   review P2) — color alone distinguishes the lit act. */
.tracker li{
  font-family:var(--sans-display);font-weight:700;
  font-size:1em;line-height:1.5;letter-spacing:-0.01em;
  color:var(--muted);
  transition:color .25s ease;
}
.tracker li .stop{color:inherit}
.tracker li.on{color:var(--green)}
.tracker li.on .stop{color:var(--green)}
/* On the dark band the tracker re-inks for contrast (deck.js toggles). */
.tracker.on-dark li{color:var(--dark-muted)}
.tracker.on-dark li.on,.tracker.on-dark li.on .stop{color:var(--tint)}
@media (prefers-reduced-motion: reduce){
  .tracker,.tracker li{transition:none}
}

/* ---------- print: the deck is the leave-behind ---------- */
/* Reveal 5's print view wraps each slide's background in .pdf-page — no
   .backgrounds ancestor exists there (round-2 review P1), so the
   selectors match .slide-background directly. The fixed tracker is also
   hidden in the on-screen ?print-pdf preview (round-2 review P4). */
html.print-pdf .slide-background,
html.reveal-print .slide-background,
html.print-pdf .slide-background-content,
html.reveal-print .slide-background-content{
  background:#fff!important;background-color:#fff!important;
}
html.print-pdf .tracker,
html.reveal-print .tracker{display:none}
/* The on-screen ?print-pdf preview must read like the printed page
   (round-3 review P1): the background whitens above, so the dark band's
   near-white text re-inks here too — the same overrides as @media print. */
html.print-pdf section.dark,html.reveal-print section.dark,
html.print-pdf section.dark .s-word,html.reveal-print section.dark .s-word,
html.print-pdf section.dark .s-claim,html.reveal-print section.dark .s-claim,
html.print-pdf section.dark .act-claim,html.reveal-print section.dark .act-claim{color:var(--ink)!important}
html.print-pdf section.dark .stop,html.reveal-print section.dark .stop{color:var(--green)!important}
html.print-pdf section.dark .kicker,html.reveal-print section.dark .kicker{color:var(--muted)!important}
html.print-pdf section.dark .kicker::after,html.reveal-print section.dark .kicker::after{background:var(--green)!important}
html.print-pdf .code-head .proof-title,html.reveal-print .code-head .proof-title{color:var(--ink)!important}
html.print-pdf .code-head .proof-addr,html.reveal-print .code-head .proof-addr{color:var(--green)!important}
html.print-pdf .code-head,html.reveal-print .code-head{border-color:var(--line)!important}
html.print-pdf .n-line,html.reveal-print .n-line{color:var(--ink)!important}
html.print-pdf .n-ground,html.reveal-print .n-ground,
html.print-pdf .stack-list li,html.reveal-print .stack-list li,
html.print-pdf .motions-line,html.reveal-print .motions-line{color:var(--ink-soft)!important}
html.print-pdf .code-proof,html.reveal-print .code-proof{background:#fff;border-color:var(--line)}
html.print-pdf .code-proof pre,html.reveal-print .code-proof pre,
html.print-pdf .code-proof .k,html.reveal-print .code-proof .k,
html.print-pdf .code-proof .s,html.reveal-print .code-proof .s,
html.print-pdf .code-proof .c,html.reveal-print .code-proof .c{color:var(--ink)!important}
html.print-pdf .m-code,html.reveal-print .m-code,
html.print-pdf .a-name,html.reveal-print .a-name{color:var(--green)!important}
html.print-pdf .m-what,html.reveal-print .m-what,
html.print-pdf .trust-title,html.reveal-print .trust-title{color:var(--ink)!important}
html.print-pdf .m-pattern,html.reveal-print .m-pattern,
html.print-pdf .a-fact,html.reveal-print .a-fact{color:var(--ink-soft)!important}
html.print-pdf .motions,html.reveal-print .motions,
html.print-pdf .motions li,html.reveal-print .motions li,
html.print-pdf .artifacts,html.reveal-print .artifacts,
html.print-pdf .artifacts li,html.reveal-print .artifacts li,
html.print-pdf .stack-list,html.reveal-print .stack-list,
html.print-pdf .stack-list li,html.reveal-print .stack-list li,
html.print-pdf .now-rows,html.reveal-print .now-rows,
html.print-pdf .now-rows li,html.reveal-print .now-rows li{border-color:var(--line)!important}
html.print-pdf .trust-card,html.reveal-print .trust-card{background:#fff;border-color:var(--line)}
@media print{
  .tracker{display:none}
  .slide-background,
  .slide-background-content{background:#fff!important;background-color:#fff!important}
  section.dark,section.dark .s-word,section.dark .s-claim,section.dark .act-claim{color:var(--ink)!important}
  section.dark .stop{color:var(--green)!important}
  section.dark .kicker{color:var(--muted)!important}
  section.dark .kicker::after{background:var(--green)!important}
  .code-head .proof-title{color:var(--ink)!important}
  .code-head .proof-addr{color:var(--green)!important}
  .code-head{border-color:var(--line)!important}
  .n-line{color:var(--ink)!important}
  .n-ground,.stack-list li,.motions-line{color:var(--ink-soft)!important}
  .code-proof{background:#fff;border-color:var(--line)}
  .code-proof pre,.code-proof .k,.code-proof .s,.code-proof .c{color:var(--ink)!important}
  .m-code,.a-name{color:var(--green)!important}
  .m-what,.trust-title{color:var(--ink)!important}
  .m-pattern,.a-fact{color:var(--ink-soft)!important}
  .motions,.motions li,.artifacts,.artifacts li,
  .stack-list,.stack-list li,.now-rows,.now-rows li{border-color:var(--line)!important}
  .trust-card{background:#fff;border-color:var(--line)}
}
