/* Kolexposer additions over the Night Scan kit (public/assets/css/kolexposer.css).
   Lives outside public/assets/ so scripts/sync-kit.sh never wipes it. Linked after the kit CSS with a ?v= query:
   bump the query in lib/views.mjs (KX_VER) on every change. Kit tokens only (--bg --pn --p2 --p3 --ln --fg --tx --mu --lime --vio --vio2 --red --yel --sky). */

/* ---------- shared ---------- */
.n .sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.n .tw{overflow-x:auto;-webkit-overflow-scrolling:touch}
.n button.btn{font:600 14px Inter,system-ui,sans-serif}
.n .proof{min-height:24px;padding:5px 9px}
@media (pointer:coarse){.n .proof{min-height:32px;padding:8px 10px}}

/* ---------- KOL page: top screen ---------- */
.n .wrap.kp{gap:36px;padding-top:28px}
.n .kp section[id]{scroll-margin-top:91px}
.n .ktop{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"head act" "hero hero";gap:18px 24px;align-items:center}
.n .ktop .khead{grid-area:head}
.n .ktop .kact{grid-area:act}
.n .ktop .vhero{grid-area:hero}
.n .kact .btn{min-height:44px}

.n .kp .vhero.ns{grid-template-columns:minmax(0,1fr) auto}
.n .kp .vline{font:400 18px/1.45 Inter,system-ui,sans-serif;color:var(--fg);max-width:60ch;margin:0}
.n .kp .vhero .rule{display:block;margin:0;font-size:12px;line-height:1.5;max-width:72ch}
/* small text in the hero sits on the verdict wash: --tx, never --mu (--mu on the mover wash is 4.06:1) */
.n .vhero .rule,.n .vhero .rule b,.n .vhero .score .note,.n .vhero .score .of,.n .ev span{color:var(--tx)}
.n .score.off b,.n .score.off .of{opacity:.35}

/* evidence: how much was read, in neutral ink. Level by material: filled, plain, dashed. Weak is the quietest. */
.n .ev{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;margin:0;max-width:60ch;font:400 13.5px/1.45 Inter,system-ui,sans-serif;color:var(--tx)}
.n .ev b{flex:none;font:600 12px/1 'JetBrains Mono',ui-monospace,monospace;letter-spacing:.02em;padding:6px 9px;border-radius:6px;color:var(--tx);background:var(--p2);border:1px solid var(--ln)}
.n .ev[data-l=strong] b{color:var(--fg);background:var(--p3);border-color:var(--mu)}
.n .ev[data-l=weak] b{font-weight:500;background:transparent;border-style:dashed}
/* weak evidence presses the stamp lighter: same colour and words, no glow, no wash */
.n .vhero[data-ev=weak][data-v]::before{background:none}
.n .vhero[data-ev=weak] .stamp.big{box-shadow:none}

.n .kp .method{font:400 14px/1.5 Inter,system-ui,sans-serif;color:var(--tx);max-width:72ch;margin:0}
.n .kp .method a{color:var(--fg);text-decoration:underline;text-underline-offset:3px}

/* jump nav: a plain row of anchors, not sticky, no JS */
.n .jn{display:flex;flex-wrap:wrap;gap:0 20px;border-top:1px solid var(--ln);border-bottom:1px solid var(--ln);padding:2px 0}
.n .jn a{font:600 13.5px/1 Inter,system-ui,sans-serif;color:var(--mu);padding:12px 0;text-underline-offset:4px}
.n .jn a:hover{color:var(--fg);text-decoration:underline}
@media (pointer:coarse){.n .jn a{padding:15px 0}}

/* findings: on UNCLEAR every dot is neutral (set in the markup) */
.n .kp .f:not(:has(.proof)){grid-template-columns:auto minmax(0,1fr)}


/* collapsed proof: native details, content in the served HTML */
.n .dx{background:var(--pn);border:1px solid var(--ln);border-radius:16px}
.n .dx>summary{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;grid-template-areas:"t c s v";align-items:center;gap:6px 12px;min-height:60px;padding:14px 20px;cursor:pointer;list-style:none;border-radius:15px}
.n .dx>summary::-webkit-details-marker{display:none}
.n .dx .dt{grid-area:t;font:700 20px/1.15 'Space Grotesk';letter-spacing:-.02em;color:var(--fg)}
.n .dx .dc{grid-area:c;font:500 13px/1 'JetBrains Mono',ui-monospace,monospace;color:var(--tx);background:var(--p2);border:1px solid var(--ln);border-radius:6px;padding:4px 8px}
.n .dx .ds{grid-area:s;font-size:13px;color:var(--mu)}
.n .dx .chev{grid-area:v;color:var(--mu);transition:transform .18s cubic-bezier(.23,1,.32,1)}
.n .dx[open]>summary{border-bottom:1px solid var(--ln);border-radius:15px 15px 0 0}
.n .dx[open] .chev{transform:rotate(180deg)}
.n .dx .dxb{display:grid;gap:12px;padding:16px 20px 18px}
.n .dx .dxb .tw{border-radius:12px;background:var(--bg)}
@media (hover:hover) and (pointer:fine){.n .dx>summary:hover{background:var(--p2)}}

/* PnL, context only: no box, no big values, nothing lime, red or --fg */
.n .ctx{display:grid;gap:0}
.n .hx{font:600 15px/1.3 Inter,system-ui,sans-serif;color:var(--tx);letter-spacing:0;margin:0}
.n .cr{display:flex;flex-wrap:wrap;gap:10px 28px;margin:10px 0 6px}
.n .cr div{display:grid;gap:2px}
.n .cr dt{font-size:12px;color:var(--mu)}
.n .cr dd{margin:0;font:500 14px 'JetBrains Mono',ui-monospace,monospace;color:var(--tx)}

/* thin pages: the "Not read on this page" list replaces the empty panels */
.n .nr ul{display:grid;gap:0;margin:10px 0 0;padding:0;list-style:none}
.n .nr li{display:grid;grid-template-columns:minmax(0,9em) minmax(0,1fr);gap:4px 16px;font-size:14px;color:var(--tx);padding:10px 0;border-top:1px solid var(--ln)}
.n .nr li b{font-weight:600;color:var(--fg)}

/* EVM hero right column: what was read, deliberately smaller than Motion */
.n .score.alt b{font-size:32px;color:var(--tx)}
.n .score.alt .jl{font:600 13.5px Inter,system-ui,sans-serif;color:var(--fg);text-decoration:underline;text-underline-offset:4px;margin-top:6px}

/* verdict card preview sits after the context row, smaller */
.n .kp .share .sp{max-width:520px}

/* tables on a KOL page scroll inside .tw with a cue; no column is hidden (the proof column stays) */
.n .kp .tw{background:linear-gradient(90deg,var(--bg) 30%,rgba(11,11,15,0)) left/32px 100% no-repeat local,linear-gradient(270deg,var(--bg) 30%,rgba(11,11,15,0)) right/32px 100% no-repeat local,radial-gradient(farthest-side at 0 50%,rgba(236,236,244,.16),transparent) left/10px 100% no-repeat scroll,radial-gradient(farthest-side at 100% 50%,rgba(236,236,244,.16),transparent) right/10px 100% no-repeat scroll,var(--bg)}
.n .kp .tw .lb th,.n .kp .tw .lb td{display:table-cell}

@media (max-width:760px){
  .n .kp #buys .tw .lb{min-width:640px}
  .n .kp #buys .lb th:first-child,.n .kp #buys .lb td:first-child{position:sticky;left:0;z-index:1;background:var(--bg);box-shadow:1px 0 0 var(--ln)}
}

@media (max-width:560px){
  .n .wrap.kp{padding-top:16px;gap:28px}
  .n .ktop{grid-template-columns:minmax(0,1fr);grid-template-areas:"head" "hero" "act";gap:14px}
  .n .kp .khead{display:grid;grid-template-columns:48px minmax(0,1fr);gap:6px 12px;align-items:center}
  .n .kp .khead .av.big{width:48px;height:48px;font-size:16px}
  .n .kp .kid{display:contents}
  .n .kp .hl{grid-column:2;display:grid;gap:2px}
  .n .kp .khead h1{font-size:24px;overflow-wrap:anywhere}
  .n .kp .nm{font-size:13px;overflow-wrap:anywhere}
  .n .kp .meta{grid-column:1/-1;gap:4px 12px}
  .n .kp .meta span{background:none;border:0;padding:0;color:var(--tx)}
  /* one column, stamp block flattened so Motion sits between the plain line and the rule */
  .n .kp .vhero,.n .kp .vhero.ns{grid-template-columns:minmax(0,1fr);padding:18px;gap:12px}
  .n .kp .vst{display:contents}
  .n .kp .vhero .stamp{order:1;justify-self:start}
  .n .kp .vhero .ev{order:2}
  .n .kp .vhero .vline{order:3;font-size:16px}
  .n .kp .vhero .score{order:4}
  .n .kp .vhero .rule{order:5}
  .n .kp .vhero .vm{display:none}
  .n .kp .stamp.big{font-size:30px;padding:12px 18px}
  .n .kp .score{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-areas:"lbl lbl" "num of" "bar bar" "note note";column-gap:8px;align-items:baseline}
  .n .kp .score .lbl{grid-area:lbl}
  .n .kp .score b{grid-area:num;font-size:44px}
  .n .kp .score .of{grid-area:of;align-self:end;padding-bottom:6px}
  .n .kp .score .bar{grid-area:bar;height:8px;margin-top:4px}
  .n .kp .score .note{grid-area:note}
  .n .kp .score.alt b{font-size:32px}
  .n .kp .score.alt .jl{grid-column:1/-1}
  .n .kact{display:flex;gap:8px;flex-wrap:nowrap}
  .n .kact .btn:not(.ic){flex:1}
  .n .kp h2:not(.hx){font-size:22px}
  .n .dx>summary{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"t c v" "s s s";padding:14px 16px}
  .n .dx .dc{justify-self:start}
  .n .dx .dxb{padding:14px 12px 16px}
  .n .cr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 16px}
  .n .nr li{grid-template-columns:minmax(0,1fr)}
  /* the kit hides the wallet source and its proof link under 560: keep both, the source on its own line */
  .n .kp .wr{grid-template-columns:auto minmax(0,1fr) auto auto}
  .n .kp .wr span{display:block;grid-column:1/-1;order:1}
  .n .kp .wr .proof{display:inline-flex}
}
@media (max-width:360px){
  .n .kact [data-recheck] .lt{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
}
@media (prefers-reduced-motion:reduce){.n .dx .chev{transition:none}}

/* ---------- /claim: two steps, the code is the hero of step two ---------- */
/* prefixed with .legal: the legal template's inline LEGAL_CSS comes later in the page and wins at equal specificity */
.n .legal .cst{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:4px 0 6px;padding:0;list-style:none}
.n .legal .cst li{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--ln);border-radius:12px;font:600 14px/1.3 Inter,system-ui,sans-serif;color:var(--mu)}
.n .legal .cst .sn{display:grid;place-items:center;width:24px;height:24px;flex:none;border-radius:50%;border:1px solid var(--ln);font:500 12px 'JetBrains Mono',ui-monospace,monospace;color:var(--mu)}
/* current step: --fg disc with --bg text, not lime (lime stays the one action of the step) */
.n .legal .cst li[data-s=now]{color:var(--fg);border-color:var(--mu);background:var(--pn)}
.n .legal .cst li[data-s=now] .sn{background:var(--fg);border-color:var(--fg);color:var(--bg)}
.n .legal .cst li[data-s=done],.n .legal .cst li[data-s=done] .sn{color:var(--tx)}
.n .legal .fld{display:grid;gap:6px}
.n .legal .fld label{font:600 14px Inter,system-ui,sans-serif}
.n .legal .hint{font-size:12.5px;line-height:1.5;color:var(--mu);margin:0}
.n .legal .dform textarea[name=wallets]{font:13px/1.5 'JetBrains Mono',ui-monospace,monospace;min-height:96px}
.n .legal .dform .btn.pri{min-height:48px;justify-self:start}
.n .legal .dform .btn.sm{justify-self:start;min-height:44px}
.n .legal .trust{font-size:13.5px;line-height:1.5;color:var(--tx);margin:0}
.n .legal .dx.sm{border-radius:12px}
.n .legal .dx.sm>summary{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"t v";min-height:48px;padding:10px 14px;border-radius:11px}
.n .legal .dx.sm .dt{font:600 14px/1.3 Inter,system-ui,sans-serif}
.n .legal .dx.sm[open]>summary{border-radius:11px 11px 0 0}
.n .legal .dx.sm .dxb{padding:12px 14px 14px}
.n .legal .claim-err{border-color:var(--red)}
.n .legal .claim-err:focus{outline:none}
.n .legal .lbl{font:500 12px/1.4 'JetBrains Mono',ui-monospace,monospace;color:var(--mu);text-transform:none;letter-spacing:0}
.n .legal .cbox{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:20px;background:var(--pn);border:1px solid var(--ln);border-radius:16px}
.n .legal .cbox .lbl{grid-column:1/-1}
.n .legal .ccode{display:block;min-width:0;font:600 40px/1.1 'JetBrains Mono',ui-monospace,monospace;letter-spacing:.02em;color:var(--fg);user-select:all;-webkit-user-select:all;overflow-wrap:anywhere;padding:12px 14px;border-radius:12px;background:var(--bg);border:1px solid var(--ln)}
.n .legal .cp{min-width:10em;min-height:48px}
.n .legal .cp[data-state=copied]{color:var(--lime);border-color:var(--lime)}
.n .legal .howto{display:grid;gap:8px}
.n .legal .eb{justify-self:start;min-height:44px}
.n .legal .wb{display:grid;gap:6px}
.n .legal .wb ul{list-style:none;padding:0;margin:0;display:grid;gap:4px}
.n .legal .wb code{display:block;font:500 12.5px/1.5 'JetBrains Mono',ui-monospace,monospace;color:var(--tx);overflow-wrap:anywhere;word-break:break-all}
.n .legal .wb p{overflow-wrap:anywhere}
@media (max-width:560px){
  .n .legal .cbox{grid-template-columns:minmax(0,1fr);padding:16px}
  .n .legal .ccode{font-size:32px}
  .n .legal .cp,.n .legal .eb,.n .legal .dform .btn.pri,.n .legal .dform .btn.sm{width:100%}
}

/* ---------- global: skip link, burger button, ticker pause, touch targets ---------- */
.n .skip{position:absolute;left:16px;top:-64px;z-index:70;padding:10px 14px;border-radius:10px;background:var(--lime);color:#0B1200;font:600 14px Inter,system-ui,sans-serif}
.n .skip:focus{top:12px}
.n main[tabindex="-1"]:focus{outline:none}
.n button.burger{background:none;cursor:pointer;padding:0;font:inherit}
.n .tkw{position:relative}
.n .tkp{position:absolute;right:12px;top:50%;transform:translateY(-50%);width:32px;height:32px;display:grid;place-items:center;border-radius:8px;background:var(--p2);border:1px solid var(--ln);color:var(--tx);cursor:pointer;padding:0;z-index:1}
/* the band fades out under the button, so no item reads as colliding with it */
.n .tkw::after{content:'';position:absolute;top:0;right:0;bottom:0;width:72px;background:linear-gradient(90deg,transparent,var(--bg) 55%);pointer-events:none}
.n .tkw.paused .tk{animation-play-state:paused}
@media (hover:hover) and (pointer:fine){.n .tkp:hover{color:var(--fg);background:var(--p3)}}
/* footer links: a 24 px+ hit area, 44 px rows on touch */
.n .fl a{display:inline-block;padding:4px 0}
@media (pointer:coarse){.n .fl a{padding:10px 0}}
/* leaderboard filters wrap on a phone instead of pushing the page sideways; the selected one stays visible */
@media (max-width:560px){
  .n .ctl .tabs{display:flex;flex-wrap:wrap;width:100%;gap:4px}
  .n .ctl .tabs a{flex:none;min-height:40px;display:inline-flex;align-items:center;padding:8px 12px}
}
@media (max-width:560px) and (pointer:coarse){
  .n .ctl .tabs a{min-height:44px}
}
@media (prefers-reduced-motion:reduce){.n .tkp,.n .tkw::after{display:none}}

/* ---------- verdict card, HTML twin (cardInner): same evidence line and weak rule as the PNG ---------- */
.n.xcard .xleft{gap:22px}
.n.xcard .xst{display:grid;gap:10px;justify-items:start}
.n.xcard .xscore{margin-top:8px}
.n.xcard .xev{font:500 15px/1 'JetBrains Mono',ui-monospace,monospace;letter-spacing:1.2px;color:var(--tx)}
.n.xcard[data-ev=weak]{background:radial-gradient(55% 80% at 88% 18%,rgba(139,92,246,.4),transparent 60%),var(--bg)}
.n.xcard[data-ev=weak] .stamp.big{box-shadow:none}
.n.xcard .xscore[data-off] b{color:var(--mu)}
.n.xcard .xscore[data-off] .xn span,.n.xcard .xscore[data-off] .bar{display:none}

/* ---------- round 2 polish ---------- */
/* lime wash and glow belong to REAL MOVER only; every other verdict reads on a neutral panel (page hero and card twin) */
.n .kp .vhero:not([data-v=mover])::before{background:none}
.n.xcard:not([data-v=mover]){background:radial-gradient(55% 80% at 88% 18%,rgba(139,92,246,.4),transparent 60%),var(--bg)}
/* UNCLEAR keeps its greyed Motion (Cross's rule) as one compact line: no "of 100", no empty bar */
.n .kp .score.off .of,.n .kp .score.off .bar{display:none}
.n .kp .score.off b{font-size:32px}
/* tap height for links inside tables and the sort links in table heads */
.n .lb td a:not(.proof){display:inline-block;padding-block:4px;min-height:24px}
.n .lb th a.sortlink{display:inline-block;padding-block:5px;min-height:24px}
@media (pointer:coarse){.n .lb th a.sortlink{padding-block:13px}}
/* lists in the legal template (terms, privacy, dispute, claim "What happens next") show their markers */
.n .legal ul:not(.cst){list-style:disc;padding-left:1.2em}
.n .legal ul:not(.cst) li::marker{color:var(--mu)}
.n .ph1 h1 + .sub{margin-top:10px}
/* controls that only work with JS are hidden until app.js can run (html.js is set in the head) */
html:not(.js) .n [data-open],html:not(.js) .n [data-recheck],html:not(.js) .n button[data-copy],html:not(.js) .n .tkp{display:none}

/* ---------- round 3 ---------- */
/* glow belongs to REAL MOVER only: every other stamp is flat in its own colour, at any evidence level */
.n .stamp:not([data-v=mover]){box-shadow:none}
.n .kp .f[data-t=bad] i{box-shadow:none}
.n .kp .f[data-t=larp] i{background:var(--vio)}
/* the wallets tied to a claim code are a plain list, flush with their label */
.n .legal .wb ul{list-style:none;padding-left:0}
/* card twin: evidence 16 px under the stamp, Motion 28 px under the evidence (same as the PNG) */
.n.xcard .xst{gap:14px}
.n.xcard .xscore{margin-top:6px}
/* card twin: a figure takes the verdict colour only when it produced the verdict (sells in the wave on EXIT, Motion on MOVER, calls under half on LARP) */
.n.xcard[data-v] .xf li b{color:var(--mu)}
.n.xcard[data-v] .xf li b.k-exit,.n.xcard[data-v] .xf li b.k-larp{color:var(--red)}
.n.xcard[data-v] .xf li b.k-mover{color:var(--lime)}
