/* REX Chain design system — rex.fun ink + neon green */
:root{
  --bg:#0b100c;--bg2:#111913;--panel:#161e18;
  --surface:rgba(255,255,255,.04);--surface2:rgba(255,255,255,.07);--surface3:rgba(255,255,255,.11);
  --line:rgba(255,255,255,.09);--line2:rgba(255,255,255,.17);
  --text:#ffffff;--muted:rgba(255,255,255,.62);--dim:rgba(255,255,255,.38);
  --rex:#22c55e;--lime:#9dff8f;--deep:#15803d;--mint:#cfe9d6;
  --ember:#22c55e;--gold:#9dff8f;--ember2:#4ecb6a;
  --up:#22c55e;--down:#ff5470;--sol:#9945ff;--usdc:#2775ca;--gp:#ffc24d;
  --grad:linear-gradient(120deg,#15803d 0%,#22c55e 55%,#9dff8f 100%);
  --r:18px;--rs:12px;--rx:8px;
  --fd:'Clash Display','Space Grotesk',system-ui,sans-serif;--fb:'Inter',system-ui,sans-serif;--fm:'JetBrains Mono',ui-monospace,monospace;
  --shadow:0 20px 60px rgba(0,0,0,.6),0 2px 8px rgba(0,0,0,.4);
  --glow:0 0 0 1px rgba(34,197,94,.35),0 0 32px rgba(34,197,94,.22);
  --nav-h:64px;--tape-h:34px;
}
*{box-sizing:border-box}html{scroll-behavior:smooth}
html,body{margin:0;background:var(--bg);color:var(--text);font-family:var(--fb);font-size:14px;line-height:1.45;-webkit-font-smoothing:antialiased;min-height:100%}
body{overflow-x:hidden}
a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;cursor:pointer;border:0;background:none}
input,select,textarea{font:inherit;color:inherit}
::selection{background:rgba(255,120,40,.35)}
.mono{font-family:var(--fm);font-variant-numeric:tabular-nums}
.num{font-family:var(--fm);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.up{color:var(--up)}.down{color:var(--down)}.muted{color:var(--muted)}.dim{color:var(--dim)}.gold{color:var(--gold)}.ember{color:var(--ember)}
.grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
h1,h2,h3,h4{font-family:var(--fd);letter-spacing:-.02em;margin:0;font-weight:700}
h1{font-size:clamp(34px,5vw,58px);line-height:1.02}h2{font-size:22px}h3{font-size:16px}
p{margin:0}
/* background */
#bg{position:fixed;inset:0;z-index:-1;background:
  radial-gradient(1100px 620px at 50% -12%,rgba(34,197,94,.16),transparent 62%),
  radial-gradient(760px 520px at 88% 18%,rgba(157,255,143,.05),transparent 60%),
  radial-gradient(700px 500px at 4% 44%,rgba(21,128,61,.10),transparent 60%),var(--bg)}
#bg::before{content:"";position:absolute;inset:0;opacity:.5;background-image:
  repeating-radial-gradient(circle at 18% 22%,transparent 0 58px,rgba(34,197,94,.055) 58px 59px),
  repeating-radial-gradient(circle at 82% 68%,transparent 0 74px,rgba(34,197,94,.04) 74px 75px);
  mask-image:radial-gradient(120% 100% at 50% 0,#000 35%,transparent 78%)}
#bg::after{content:"";position:absolute;inset:0;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.045'/%3E%3C/svg%3E");mix-blend-mode:overlay;pointer-events:none}
#embers{position:absolute;inset:0;width:100%;height:100%;opacity:.9}
/* nav */
#nav{position:sticky;top:0;z-index:50;height:var(--nav-h);display:flex;align-items:center;gap:14px;padding:0 22px;white-space:nowrap;overflow:hidden;background:rgba(7,8,11,.72);backdrop-filter:blur(18px) saturate(140%);-webkit-backdrop-filter:blur(18px) saturate(140%);border-bottom:1px solid var(--line)}
.brand{display:flex;align-items:center;gap:10px;font-family:var(--fd);font-weight:700;letter-spacing:.14em;font-size:17px}
/* ───── images may never be distorted ─────────────────────────────────────────
   Two separate ways an <img> gets squashed, and both are off by default here so a new one cannot
   reintroduce either:
     1. A width AND a height with no object-fit. The default is `fill`, which STRETCHES the picture
        to the box instead of fitting it. Every sized image on this site has both dimensions.
     2. Living in a flex row. An <img> is a flex item, so it is allowed to shrink below its own
        width while its height stays put — which squeezes it horizontally on narrow screens.
   `contain` is the baseline because it never crops and never stretches. The places that genuinely
   want `cover` — a coin's artwork filling a square tile — say so below; cover crops, it does not
   distort, so both are safe. Only the default is not. */
img{object-fit:contain;flex-shrink:0;max-width:100%}

/* flex:none and object-fit together are what stop the mark being squeezed: inside a flex row an
   <img> with a width is still allowed to shrink, so on a narrow screen the height held at 30px
   while the width collapsed and the logo came out squashed. Elio saw this on his phone. */
.brand .mark{width:30px;height:30px;flex:0 0 30px;object-fit:contain;filter:drop-shadow(0 0 10px rgba(34,197,94,.5))}
.swapwrap{max-width:560px;margin:0 auto}
.swapcard{position:relative}
.swapleg{background:var(--surface2);border:1px solid var(--line);border-radius:14px;padding:12px 14px}
.swapleg + .swapleg{margin-top:8px}
.swapleg .l{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.swapleg .row{align-items:center;gap:10px;margin-top:6px}
.swapleg input{flex:1 1 auto;background:none;border:0;font-size:26px;font-weight:700;color:var(--text);min-width:0;padding:0}
.swapleg input:focus{outline:none}
.swapleg input[readonly]{color:var(--muted)}
.tokpick{display:flex;align-items:center;gap:7px;flex:none;background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:6px 11px;font-weight:700;font-size:14px;color:var(--text);transition:.15s}
.tokpick:hover{border-color:var(--up)}
.tokpick img,.toklist img{width:20px;height:20px;border-radius:50%;object-fit:cover;flex:none}
.tokpick .dot,.toklist .dot{width:20px;height:20px;border-radius:50%;background:var(--surface2);display:inline-block;flex:none}
.swapflip{position:absolute;left:50%;transform:translateX(-50%);margin-top:-15px;z-index:2;width:30px;height:30px;border-radius:10px;background:var(--surface);border:1px solid var(--line);color:var(--muted);font-size:14px;line-height:1}
.swapflip:hover{color:var(--up);border-color:var(--up)}
.swapinfo{display:grid;gap:5px;margin-top:12px;font-size:12.5px}
.swapinfo span{display:flex;justify-content:space-between;gap:12px}
.swapinfo b{font-weight:600;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:62%}
.toklist{max-height:46vh;overflow:auto;margin-top:8px;display:grid;gap:2px}
.toklist button{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;border-radius:10px;text-align:left;transition:.12s}
.toklist button:hover{background:var(--surface2)}
.toklist button span{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}
.toklist button small{color:var(--muted);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.camini{gap:6px;align-items:center}
.camini code{font-size:11.5px;color:var(--muted);background:var(--surface2);border:1px solid var(--line);border-radius:7px;padding:3px 8px}
.ca{display:flex;align-items:center;gap:7px;flex-wrap:wrap;justify-content:center;padding:5px 14px;font-size:11.5px;color:var(--muted);
  border-bottom:1px solid var(--line);background:rgba(255,255,255,.015)}
.ca b{color:var(--ember);font-weight:600}
.ca .addr{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--text);background:var(--surface2);
  border:1px solid var(--line);border-radius:7px;padding:3px 8px;max-width:min(60vw,430px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ca .shortca{display:none}
@media(max-width:640px){.ca{gap:6px;padding:5px 10px}.ca .addr{max-width:none}.ca .full{display:none}.ca .shortca{display:inline}}
.ca button{border:1px solid var(--line);background:var(--surface);border-radius:7px;padding:3px 9px;font-size:11px;font-weight:600;color:var(--text);transition:.15s}
.ca button:hover{border-color:var(--up);color:var(--up)}
.ca button.done{border-color:var(--up);color:var(--up)}
.ca a.buy{border-radius:7px;padding:3px 10px;font-size:11px;font-weight:700;background:var(--up);color:#06240f}
.langsw{display:flex;gap:1px;background:var(--surface2);border:1px solid var(--line);border-radius:9px;padding:2px;flex:none}
.langsw button{padding:4px 8px;border-radius:7px;font-size:11px;font-weight:700;letter-spacing:.04em;color:var(--muted);transition:.15s}
.langsw button:hover{color:var(--text)}
.langsw button.on{background:var(--surface);color:var(--ember)}
@media(max-width:900px){.langsw{display:none}}
.links{display:flex;gap:4px;margin-left:8px}
.links a{padding:8px 12px;border-radius:10px;color:var(--muted);font-weight:500;transition:.15s;white-space:nowrap}
.links a:hover{color:var(--text);background:var(--surface)}.links a.active{color:var(--text);background:var(--surface2)}
.search{flex:1 1 200px;min-width:140px;max-width:420px;margin-left:auto;display:flex;align-items:center;gap:8px;padding:0 12px;height:38px;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--muted);transition:.15s}
.search:focus-within{border-color:var(--line2);background:var(--surface2);color:var(--text)}
.search input{flex:1;background:none;border:0;outline:0;min-width:0}.search kbd{font-family:var(--fm);font-size:11px;padding:1px 6px;border:1px solid var(--line2);border-radius:6px;color:var(--dim)}
.right{display:flex;align-items:center;gap:10px}
.epoch-chip{display:flex;align-items:center;gap:8px;padding:0 12px;height:36px;border-radius:12px;border:1px solid rgba(255,194,77,.25);background:rgba(255,194,77,.06);font-size:12px;color:var(--muted);white-space:nowrap}
.epoch-chip b{font-family:var(--fm);color:var(--gold);font-weight:600}
.epoch-chip .dot{width:7px;height:7px;border-radius:50%;background:var(--gold);box-shadow:0 0 10px var(--gold);animation:pulse 2s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:38px;padding:0 18px;border-radius:999px;border:1px solid var(--line2);background:var(--surface2);font-weight:600;transition:.15s;white-space:nowrap;position:relative;overflow:hidden}
.btn:hover{background:var(--surface3);border-color:rgba(255,255,255,.22);transform:translateY(-1px)}
.btn:active{transform:translateY(0)}.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
.btn.cta{background:var(--grad);border-color:transparent;color:#04170b;box-shadow:0 6px 24px rgba(34,197,94,.32)}
.btn.cta::after{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.45) 50%,transparent 70%);transform:translateX(-120%);transition:.6s}
.btn.cta:hover::after{transform:translateX(120%)}
.btn.ghost{background:transparent}.btn.sm{height:30px;padding:0 13px;font-size:12px;border-radius:999px}.btn.xs{height:26px;padding:0 11px;font-size:11.5px;border-radius:999px}.btn.lg{height:50px;padding:0 28px;font-size:15px;border-radius:999px}
.btn.wallet.on{border-color:rgba(61,255,160,.35);background:rgba(61,255,160,.07)}
.btn.buy{background:linear-gradient(120deg,#15803d,#22c55e);color:#04170b;border-color:transparent;box-shadow:0 8px 28px rgba(61,255,160,.25)}
.btn.sell{background:linear-gradient(120deg,#e0334f,#ff5470);color:#1a0509;border-color:transparent;box-shadow:0 8px 28px rgba(255,77,109,.25)}
/* tape */
#simbar{padding:7px 18px;font-size:12.5px;line-height:1.45;text-align:center;color:#ffd9a3;
  background:linear-gradient(180deg,rgba(245,158,11,.16),rgba(245,158,11,.08));border-bottom:1px solid rgba(245,158,11,.3)}
#simbar b{color:#ffc04d}
#simbar a{color:inherit;text-decoration:underline;text-underline-offset:2px}
#simbar[hidden]{display:none}
@media(max-width:700px){#simbar{padding:6px 12px;font-size:11.5px}}
#tape{height:var(--tape-h);border-bottom:1px solid var(--line);background:rgba(11,13,18,.6);overflow:hidden;position:relative}
#tape::before,#tape::after{content:"";position:absolute;top:0;bottom:0;width:80px;z-index:2;pointer-events:none}
#tape::before{left:0;background:linear-gradient(90deg,var(--bg),transparent)}#tape::after{right:0;background:linear-gradient(-90deg,var(--bg),transparent)}
.tape-track{display:flex;gap:28px;align-items:center;height:100%;padding-left:20px;white-space:nowrap;will-change:transform;animation:tape 60s linear infinite}
#tape:hover .tape-track{animation-play-state:paused}
@keyframes tape{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.tk{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--muted)}
.tk img{width:16px;height:16px;border-radius:5px;object-fit:cover}.tk b{color:var(--text);font-weight:600}.tk .num{font-size:12px}
/* layout */
/* ⛔ THE CONTENT COLUMN WAS 1380px WHILE THE HEADER, TAPE AND FEATURED BAR SPAN THE VIEWPORT.
   On a wide screen that left a dead rail down both sides of every page and made the site look like
   it was rendering in a window inside the window. The cap rises with the viewport instead of being
   a fixed number, and stays a cap: on a very wide monitor a full-bleed line of body text is its own
   readability problem, so it tops out rather than running edge to edge. */
#app{max-width:min(1760px, calc(100vw - 48px));margin:0 auto;padding:22px 22px 60px;min-height:calc(100vh - var(--nav-h) - var(--tape-h))}
.fade{animation:fade .35s ease both}@keyframes fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);backdrop-filter:blur(8px)}
.panel.pad{padding:18px}
.row{display:flex;align-items:center;gap:10px}.between{justify-content:space-between}.wrap{flex-wrap:wrap}.grow{flex:1;min-width:0}
.stack{display:flex;flex-direction:column;gap:10px;min-width:0}.stack>*{min-width:0}
.chip{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 9px;border-radius:999px;font-size:11.5px;font-weight:600;border:1px solid var(--line2);background:var(--surface2);color:var(--muted);white-space:nowrap}
.chip.sm{height:18px;padding:0 7px;font-size:10px;letter-spacing:.04em;text-transform:uppercase;vertical-align:middle;margin-left:6px}
.chip.fair{border-color:rgba(255,194,77,.4);background:rgba(255,194,77,.1);color:var(--gold)}
.chip.conv{border-color:rgba(61,255,160,.35);background:rgba(61,255,160,.08);color:var(--up)}
.chip.grad{border-color:rgba(153,69,255,.45);background:rgba(153,69,255,.12);color:#c9a3ff}
.chip.live{border-color:rgba(255,106,26,.45);background:rgba(255,106,26,.1);color:var(--ember2)}
.chip.dev{border-color:rgba(255,255,255,.2);background:rgba(255,255,255,.08);color:var(--text)}
.chip .qd{width:8px;height:8px;border-radius:50%}
.quote-SOL{color:#c9a3ff}.quote-USDC{color:#7fb6ff}.quote-GP{color:var(--gold)}
/* hero */
.hero{position:relative;display:grid;grid-template-columns:1.25fr 1fr;gap:28px;align-items:center;padding:34px 34px 30px;overflow:hidden;background:linear-gradient(180deg,rgba(255,255,255,.04),rgba(255,255,255,.015));border:1px solid var(--line);border-radius:26px}
.hero::before{content:"";position:absolute;inset:-1px;border-radius:27px;padding:1px;background:linear-gradient(120deg,rgba(255,106,26,.5),rgba(255,194,77,.15) 40%,transparent 70%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none}
.hero .eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--fm);font-size:11.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--rex);font-weight:500;margin-bottom:16px}
.hero .eyebrow i{width:18px;height:1px;background:var(--rex);display:inline-block}
.hero p.lead{font-size:16px;color:var(--muted);max-width:560px;margin:16px 0 22px;line-height:1.55}
.hero .actions{display:flex;gap:10px;flex-wrap:wrap}
.usps{display:grid;gap:12px}
.usp{padding:16px 18px;border-radius:16px;background:var(--surface);border:1px solid var(--line);position:relative;overflow:hidden;transition:.2s}
.usp:hover{border-color:var(--line2);transform:translateY(-2px)}
.usp .t{font-family:var(--fd);font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px;margin-bottom:6px}
.usp .t .n{width:22px;height:22px;border-radius:7px;display:inline-grid;place-items:center;font-size:12px;background:var(--grad);color:#1a0d03}
.usp p{color:var(--muted);font-size:13px;line-height:1.5}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}
.stat{padding:16px 18px;border-radius:16px;background:var(--surface);border:1px solid var(--line);position:relative;overflow:hidden}
.stat::after{content:"";position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--grad);opacity:.5}
.stat .l{font-size:11.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim);font-weight:600}
.stat .v{font-family:var(--fd);font-size:26px;font-weight:700;margin-top:4px;letter-spacing:-.02em}
.stat .s{font-size:12px;color:var(--muted);margin-top:2px}
/* section headers */
.sec{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:28px 0 12px}
.eyelabel{font-family:var(--fm);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--dim);font-weight:500}
.sec h2{display:flex;align-items:center;gap:10px}.sec h2 .live-dot{width:8px;height:8px;border-radius:50%;background:var(--up);box-shadow:0 0 12px var(--up);animation:pulse 1.6s infinite}
.tabs{display:flex;gap:4px;padding:4px;border-radius:12px;background:var(--surface);border:1px solid var(--line)}
.tabs button{height:30px;padding:0 12px;border-radius:9px;color:var(--muted);font-weight:600;font-size:12.5px;transition:.15s}
.tabs button:hover{color:var(--text)}.tabs button.on{background:var(--surface3);color:var(--text)}
.chips{display:flex;gap:6px;flex-wrap:wrap}.chips .chip{cursor:pointer}.chips .chip.on{border-color:var(--line2);background:var(--surface3);color:var(--text)}
/* rails + grid */
.rail{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(300px,1fr);gap:12px;overflow-x:auto;padding-bottom:6px;scroll-snap-type:x mandatory;scrollbar-width:thin}
.rail>*{scroll-snap-align:start}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.card{display:block;padding:14px;border-radius:var(--r);background:var(--surface);border:1px solid var(--line);position:relative;overflow:hidden;transition:border-color .18s,background .18s,transform .18s,box-shadow .18s}.card.in{animation:fade .3s both}
.card.has-spark .top{padding-right:80px}.card .nm{flex-wrap:wrap;gap:2px 7px;line-height:1.2}.card .nm .nmt{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;min-width:0}.card .nm .sym{flex:none}
.card:hover{border-color:rgba(255,160,80,.35);background:var(--surface2);transform:translateY(-2px);box-shadow:0 12px 40px rgba(0,0,0,.35)}
.card.flash{animation:flash .9s}
@keyframes flash{0%{box-shadow:inset 0 0 0 1px var(--gold),0 0 30px rgba(255,194,77,.35)}100%{box-shadow:none}}
.card .top{display:flex;gap:12px;align-items:flex-start}
.card img.av,.av{width:56px;height:56px;border-radius:14px;object-fit:cover;background:var(--surface2);flex:none}
.av.lg{width:84px;height:84px;border-radius:20px}.av.sm{width:28px;height:28px;border-radius:8px}.av.xs{width:20px;height:20px;border-radius:6px}
.card .nm{font-family:var(--fd);font-weight:700;font-size:15px;display:flex;align-items:center;gap:7px;min-width:0}
.card .nm .sym{color:var(--muted);font-weight:600;font-size:13px}
.card .by{font-size:12px;color:var(--dim);margin-top:2px}
.card .meta{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.card .kpi{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:12px}
.kpi .l{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);font-weight:600}
.kpi .v{font-family:var(--fm);font-size:13px;font-weight:600;margin-top:1px}
.spark{position:absolute;right:12px;top:14px;width:68px;height:30px;opacity:.9}
/* ⛔ THE SECOND CAUSE OF THE SQUEEZED CARD, independent of the inline-flex one below. `.spark` is
   absolute, so `.card.has-spark .top` reserves 80px of padding-right to keep text from running
   under it. That is a fixed cost against a card that keeps shrinking: the text column is
   card − 28 (card padding) − 80 (spark) − 56 (avatar) − 12 (gap), so it hits ~42px once the card is
   near 220px — a phone in split screen, which is what Julz was using. A 68px sparkline on a 220px
   card tells nobody anything; the coin's name does. Below this width the spark goes and the whole
   row comes back. */
@media (max-width:380px){
  .card .spark{display:none}
  .card.has-spark .top{padding-right:0}
}
.prog{height:6px;border-radius:999px;background:rgba(255,255,255,.07);overflow:hidden;position:relative;margin-top:12px}
.prog>i{display:block;height:100%;border-radius:999px;background:var(--grad);position:relative;transition:width .6s cubic-bezier(.2,.8,.2,1)}
.prog>i::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent);animation:shimmer 2.2s infinite;transform:translateX(-100%)}
@keyframes shimmer{to{transform:translateX(100%)}}
.prog.grad>i{background:linear-gradient(120deg,#9945ff,#c9a3ff)}
.prog-l{display:flex;justify-content:space-between;font-size:11px;color:var(--dim);margin-top:6px}
.fo-line{margin-top:10px;padding:8px 10px;border-radius:10px;background:rgba(255,194,77,.07);border:1px solid rgba(255,194,77,.22);font-size:12px;color:var(--muted)}.fo-line b{color:var(--gold)}
/* countdown ring */
.ring{position:relative;width:64px;height:64px;flex:none}
.ring svg{transform:rotate(-90deg)}.ring .bg{stroke:rgba(255,255,255,.08)}.ring .fg{stroke:var(--gold);stroke-linecap:round;transition:stroke-dashoffset 1s linear;filter:drop-shadow(0 0 6px rgba(255,194,77,.6))}
.ring .t{position:absolute;inset:0;display:grid;place-items:center;font-family:var(--fm);font-size:14px;font-weight:600;color:var(--gold)}
.ring.lg{width:120px;height:120px}.ring.lg .t{font-size:24px}
/* king */
.king{display:grid;grid-template-columns:auto 1fr auto;gap:18px;align-items:center;padding:18px 20px;border-radius:22px;background:linear-gradient(120deg,rgba(255,194,77,.12),rgba(255,106,26,.06) 60%,transparent);border:1px solid rgba(255,194,77,.3);position:relative;overflow:hidden}
.king::before{content:"";position:absolute;right:-8px;top:-16px;width:110px;height:110px;opacity:.06;transform:rotate(12deg);background:var(--ic-crown) center/contain no-repeat}
.king .crown{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--gold);font-weight:700}
.king h3{font-size:22px;margin-top:2px}
.king .kp{display:flex;gap:22px;margin-top:10px}.king .kp .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim)}.king .kp .v{font-family:var(--fm);font-weight:600;font-size:15px}
/* token page */
.tp{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:16px}
.thead{display:flex;gap:16px;align-items:center;flex-wrap:wrap}
.thead h1{font-size:30px}.thead .sym{color:var(--muted);font-weight:600;font-size:18px;margin-left:8px}
.thead .price{margin-left:auto;text-align:right}.thead .price .big{font-family:var(--fd);font-size:30px;font-weight:700;letter-spacing:-.02em}
.thead .price .sub{font-family:var(--fm);font-size:12.5px;color:var(--muted)}
.kpis{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin-top:14px}
.kpis .k{padding:10px 12px;border-radius:12px;background:var(--surface);border:1px solid var(--line)}
.kpis .l{font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);font-weight:600}.kpis .v{font-family:var(--fm);font-weight:600;font-size:14px;margin-top:2px}
.chart-wrap{position:relative;height:440px;border-radius:var(--r);overflow:hidden;background:rgba(0,0,0,.25);border:1px solid var(--line)}
.chart-wrap .tools{position:absolute;top:10px;left:10px;z-index:3;display:flex;gap:6px}
.chart-wrap .tools .tabs{background:rgba(10,12,16,.8)}
#chart{position:absolute;inset:0}
.chart-wrap .wm{position:absolute;right:14px;bottom:36px;font-family:var(--fd);font-weight:700;letter-spacing:.14em;color:rgba(255,255,255,.08);font-size:22px;pointer-events:none;z-index:2}
/* trade panel */
.side{position:sticky;top:calc(var(--nav-h) + var(--tape-h) + 14px);align-self:start;max-height:calc(100vh - var(--nav-h) - var(--tape-h) - 28px);overflow:auto;scrollbar-width:none}.side::-webkit-scrollbar{display:none}
.trade .switch{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border-radius:14px;background:rgba(0,0,0,.3);border:1px solid var(--line)}
.trade .switch button{height:38px;border-radius:11px;font-weight:700;color:var(--muted);transition:.15s}
.trade .switch button.buy.on{background:rgba(61,255,160,.16);color:var(--up);box-shadow:inset 0 0 0 1px rgba(61,255,160,.35)}
.trade .switch button.sell.on{background:rgba(255,77,109,.16);color:var(--down);box-shadow:inset 0 0 0 1px rgba(255,77,109,.35)}
.amt{margin-top:12px;border:1px solid var(--line2);border-radius:14px;background:rgba(0,0,0,.28);padding:10px 12px;transition:.15s}
.amt:focus-within{border-color:rgba(255,194,77,.5);box-shadow:0 0 0 3px rgba(255,194,77,.1)}
.amt .l{display:flex;justify-content:space-between;font-size:11.5px;color:var(--dim)}.amt .l b{color:var(--muted);font-weight:500;cursor:pointer}
.amt .in{display:flex;align-items:center;gap:8px;margin-top:4px}
.amt input{flex:1;background:none;border:0;outline:0;font-family:var(--fm);font-size:22px;font-weight:600;min-width:0;width:100%}
.amt .asset{display:flex;align-items:center;gap:6px;padding:5px 9px;border-radius:9px;background:var(--surface2);font-weight:700;font-size:12.5px;white-space:nowrap}
.quick{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-top:8px}
.quick button{height:30px;border-radius:9px;background:var(--surface);border:1px solid var(--line);font-family:var(--fm);font-size:12px;color:var(--muted);transition:.15s}
.quick button:hover{background:var(--surface3);color:var(--text)}
.qout{margin-top:12px;padding:12px;border-radius:14px;background:var(--surface);border:1px solid var(--line);font-size:12.5px}
.qout .r{display:flex;justify-content:space-between;padding:3px 0;color:var(--muted)}.qout .r b{color:var(--text);font-family:var(--fm);font-weight:500}
.qout .r.big b{font-size:18px;font-weight:700;font-family:var(--fd)}
.slip{display:flex;align-items:center;gap:6px;margin-top:10px;font-size:12px;color:var(--dim)}
.slip button{height:24px;padding:0 8px;border-radius:7px;border:1px solid var(--line);background:var(--surface);font-family:var(--fm);font-size:11px;color:var(--muted)}.slip button.on{color:var(--text);border-color:var(--line2);background:var(--surface3)}
.slip input{width:52px;height:24px;border-radius:7px;border:1px solid var(--line);background:var(--surface);text-align:center;font-family:var(--fm);font-size:11px;outline:0}
.trade .go{width:100%;margin-top:12px;height:50px;font-size:15px;border-radius:999px}
.note{font-size:11.5px;color:var(--dim);margin-top:8px;line-height:1.45}
/* The reason a buy cannot happen, said in the panel rather than discovered at signature. */
.needq{display:flex;gap:9px;align-items:flex-start;margin:10px 0 2px;padding:10px 12px;border-radius:12px;
  background:color-mix(in srgb,var(--ember) 9%,transparent);border:1px solid color-mix(in srgb,var(--ember) 28%,transparent);
  font-size:12.5px;line-height:1.5;color:var(--text)}
.needq svg,.needq .ic{flex:0 0 auto;margin-top:1px;opacity:.9}
.needq b{color:var(--ember)}
/* side panels */
.side{display:flex;flex-direction:column;gap:12px}
.fo{border-color:rgba(255,194,77,.35);background:linear-gradient(180deg,rgba(255,194,77,.09),rgba(255,194,77,.02))}
.fo .h{display:flex;align-items:center;gap:12px}.fo .h .t{font-family:var(--fd);font-weight:700;font-size:16px}
.fo .h .s{font-size:12px;color:var(--muted)}
.fo .g{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}
.fo .g .b{padding:10px;border-radius:12px;background:rgba(0,0,0,.25);border:1px solid var(--line)}.fo .g .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--dim)}.fo .g .v{font-family:var(--fm);font-weight:600;font-size:15px;margin-top:2px}
.cv{border-color:rgba(61,255,160,.25);background:linear-gradient(180deg,rgba(61,255,160,.07),rgba(61,255,160,.015))}
.ladder{display:grid;grid-template-columns:repeat(5,1fr);gap:4px;margin-top:12px}
.ladder .st{padding:8px 6px;border-radius:10px;background:rgba(0,0,0,.25);border:1px solid var(--line);text-align:center;transition:.2s}
.ladder .st .m{font-family:var(--fm);font-weight:700;font-size:14px}.ladder .st .n{font-size:10px;color:var(--dim);margin-top:2px;text-transform:uppercase;letter-spacing:.06em}.ladder .st .h{font-size:10px;color:var(--dim)}
.ladder .st.on{border-color:rgba(61,255,160,.55);background:rgba(61,255,160,.12);box-shadow:0 0 18px rgba(61,255,160,.15)}.ladder .st.on .m{color:var(--up)}
.ladder .st.past{opacity:.7}.ladder .st.past .m{color:var(--up)}
.tier{display:inline-flex;align-items:center;gap:5px;font-family:var(--fm);font-size:11.5px;font-weight:600;padding:2px 7px;border-radius:7px;background:rgba(61,255,160,.1);color:var(--up);border:1px solid rgba(61,255,160,.25)}
.tier.m1{background:var(--surface2);color:var(--muted);border-color:var(--line)}
.tier.m3{background:rgba(255,194,77,.12);color:var(--gold);border-color:rgba(255,194,77,.4)}
/* tables */
.tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.tbl th{text-align:left;font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);font-weight:600;padding:8px 10px;border-bottom:1px solid var(--line)}
.tbl td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:middle;white-space:nowrap}
.tbl tr:last-child td{border-bottom:0}.tbl tr.new td{animation:rowin .8s}
@keyframes rowin{from{background:rgba(255,194,77,.16)}to{background:transparent}}
.tbl .r{text-align:right}.tbl td.r{font-family:var(--fm)}
.tbl a.w{color:var(--text);font-weight:500}.tbl a.w:hover{color:var(--gold)}
/* ⛔ THE TAB STRIP IS THE ONLY REASON A COIN PAGE SCROLLS SIDEWAYS ON A PHONE.
   Six tabs come to 485px. The panel is 257px. The strip was `nowrap` with `overflow-x: visible`, so
   Payouts and Info simply hung outside the panel and dragged the whole document to 553px — Julz
   circled them in red ("screen moves and look these words are out there") and Elio sent the same
   screenshot again the next morning. The trades table below them was never at fault: it already
   scrolls inside #tabBody.

   A strip that is wider than its box should SCROLL, not overflow and not clip — clipping would make
   Payouts and Info unreachable rather than merely ugly. `flex:none` keeps each tab its natural width
   instead of squashing six labels into 257px, and the scrollbar is hidden because a 2px-tall bar
   under a tab row is noise on a phone.

   The 1px of padding is load-bearing: `overflow-x:auto` makes the Y axis a scroll box too, which
   would otherwise clip the active tab's underline where it sits on the strip's own border. */
.side-tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);margin-bottom:8px;
  overflow-x:auto;overflow-y:hidden;padding-bottom:1px;scrollbar-width:none;-ms-overflow-style:none;
  /* The classic scroll shadow: `local` layers move with the content and `scroll` layers do not, so
     a shadow shows on an edge only while there is something past it. No JS, and it cannot go stale. */
  background:
    linear-gradient(to right, var(--panel), transparent) left center/22px 100% no-repeat local,
    linear-gradient(to left, var(--panel), transparent) right center/22px 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%, rgba(0,0,0,.45), transparent) left center/11px 100% no-repeat scroll,
    radial-gradient(farthest-side at 100% 50%, rgba(0,0,0,.45), transparent) right center/11px 100% no-repeat scroll}
.side-tabs::-webkit-scrollbar{display:none}
.side-tabs button{padding:10px 14px;color:var(--muted);font-weight:600;border-bottom:2px solid transparent;margin-bottom:-1px;flex:none;white-space:nowrap}
.side-tabs button.on{color:var(--text);border-color:var(--gold)}
.chat{display:flex;flex-direction:column;max-height:420px}
.chat .msgs{flex:1;overflow:auto;display:flex;flex-direction:column;gap:6px;padding:6px 2px}
.chat .m{font-size:13px;line-height:1.4}.chat .m b{color:var(--gold);font-weight:600;margin-right:6px}.chat .m .t{color:var(--dim);font-size:11px;margin-left:6px}
.chat form{display:flex;gap:8px;margin-top:8px}.chat input{flex:1;height:38px;border-radius:11px;border:1px solid var(--line2);background:rgba(0,0,0,.3);padding:0 12px;outline:0}
/* forms */
.form{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:20px;align-items:start}
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.field label{font-size:12px;font-weight:600;color:var(--muted);display:flex;justify-content:space-between;align-items:baseline;gap:10px;flex-wrap:wrap}
/* A long hint wraps under its label on a phone instead of butting straight up against it. */
.field label .dim{text-align:right;flex:1 1 auto;min-width:0}
@media (max-width:560px){ .field label{flex-direction:column;gap:2px} .field label .dim{text-align:left} }
.field input,.field textarea,.field select{height:42px;border-radius:12px;border:1px solid var(--line2);background:rgba(0,0,0,.28);padding:0 12px;outline:0;transition:.15s;width:100%}
.field textarea{height:96px;padding:10px 12px;resize:vertical}
.field input:focus,.field textarea:focus{border-color:rgba(255,194,77,.5);box-shadow:0 0 0 3px rgba(255,194,77,.1)}
.two{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.opts{display:grid;grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:6px}
/* ⛔ `height:40px` WAS A CEILING, NOT A SIZE, and anything taller than it spilled over the chip
   below. That is how the rule picker ended up with "Rising max per wallet" written through
   "Blocklist" on a phone — but it is not only that picker: any chip whose label or sub-label wraps
   to two lines has been overflowing silently, including three of the coin chips on /liquidity. A
   grid row stretches every cell to the tallest in it, so letting the content set the height makes a
   taller row rather than a ragged one. */
.opts button{min-height:40px;padding:5px 8px;border-radius:11px;border:1px solid var(--line);background:var(--surface);font-weight:600;font-size:12.5px;color:var(--muted);transition:.15s;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px}
.opts button small{font-size:10px;line-height:1.35;color:var(--dim);font-weight:500;text-align:center}
.opts button.on{border-color:rgba(255,194,77,.55);background:rgba(255,194,77,.1);color:var(--text)}
.drop{height:150px;border:1px dashed var(--line2);border-radius:16px;display:grid;place-items:center;text-align:center;color:var(--muted);cursor:pointer;transition:.15s;position:relative;overflow:hidden}
.drop:hover,.drop.over{border-color:var(--gold);background:rgba(255,194,77,.05)}
.drop img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* ⛔ The invisible file input must cover the WHOLE drop zone. `inset:0` alone does not do it: the
   input sits inside a `.field`, and `.field input{height:42px}` sets an explicit height that beats
   the stretch. The result was a 305x150 box reading "click to upload" whose top 42px were live and
   whose middle — where a thumb naturally lands — did nothing. The image is REQUIRED to launch, so
   this quietly blocked launching from a phone. */
.drop input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;padding:0;border:0}
.preview{position:sticky;top:calc(var(--nav-h) + var(--tape-h) + 14px)}
.hint{font-size:12px;color:var(--dim);line-height:1.5}
/* profile */
.bal{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px}
.bal .b{padding:14px;border-radius:14px;background:var(--surface);border:1px solid var(--line)}.bal .l{font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);font-weight:600}.bal .v{font-family:var(--fm);font-size:18px;font-weight:600;margin-top:2px}
/* learn */
.learn{max-width:900px;margin:0 auto}
.learn .block{padding:26px;border-radius:22px;background:var(--surface);border:1px solid var(--line);margin-top:16px}
.learn h2{font-size:26px}.learn p{color:var(--muted);line-height:1.6;margin-top:10px;font-size:15px}
.learn ul{color:var(--muted);line-height:1.7;margin:10px 0 0 18px;padding:0}
.cmp{width:100%;border-collapse:collapse;margin-top:14px;font-size:13.5px}.cmp th,.cmp td{padding:10px 12px;border-bottom:1px solid var(--line);text-align:left}.cmp th{color:var(--dim);font-size:11px;letter-spacing:.08em;text-transform:uppercase}
.cmp td.y{color:var(--up);font-weight:600}.cmp td.n{color:var(--down)}
.diagram{display:grid;grid-template-columns:1fr auto 1fr;gap:14px;align-items:center;margin-top:18px}
.diagram .box{padding:14px;border-radius:14px;background:rgba(0,0,0,.3);border:1px solid var(--line);font-size:13px}
.diagram .box b{display:block;font-family:var(--fd);margin-bottom:6px}.diagram .arrow{font-size:26px;color:var(--gold)}
.wmenu{position:fixed;z-index:80;min-width:220px;padding:6px;border-radius:14px;background:rgba(16,18,24,.98);border:1px solid var(--line2);box-shadow:var(--shadow);animation:fade .15s}
.wmenu .wm-head{padding:8px 10px 10px;border-bottom:1px solid var(--line);margin-bottom:4px;display:flex;flex-direction:column;gap:2px}.wmenu .wm-head b{font-family:var(--fd)}.wmenu .wm-head .mono{font-size:11px}
.wmenu button{display:block;width:100%;text-align:left;padding:9px 10px;border-radius:9px;font-weight:500;color:var(--text)}.wmenu button:hover{background:var(--surface3)}.wmenu button.danger{color:var(--down)}
/* toasts + modal */
#toasts{position:fixed;right:18px;bottom:18px;z-index:100;display:flex;flex-direction:column;gap:8px}
.toast{padding:12px 14px;border-radius:14px;background:rgba(16,18,24,.95);border:1px solid var(--line2);box-shadow:var(--shadow);min-width:260px;max-width:360px;font-size:13px;animation:fade .25s;display:flex;gap:10px;align-items:center}
.toast.ok{border-color:rgba(61,255,160,.45)}.toast.err{border-color:rgba(255,77,109,.5)}.toast.gold{border-color:rgba(255,194,77,.5)}
.toast img{width:28px;height:28px;border-radius:8px;object-fit:cover}
#modal{position:fixed;inset:0;z-index:90;background:rgba(0,0,0,.6);backdrop-filter:blur(6px);display:grid;place-items:center;padding:20px}
#modal[hidden]{display:none}
.mbox{width:min(520px,100%);padding:22px;border-radius:22px;background:#0f1117;border:1px solid var(--line2);box-shadow:var(--shadow);animation:fade .25s}
.empty{padding:36px;text-align:center;color:var(--dim);border:1px dashed var(--line);border-radius:var(--r)}
.skeleton{height:120px;border-radius:var(--r);background:linear-gradient(90deg,var(--surface),var(--surface2),var(--surface));background-size:200% 100%;animation:sk 1.2s infinite}
@keyframes sk{to{background-position:-200% 0}}
.tick-up{animation:tu .7s}.tick-down{animation:td .7s}
@keyframes tu{0%{color:var(--up);text-shadow:0 0 12px rgba(61,255,160,.7)}100%{}}
@keyframes td{0%{color:var(--down);text-shadow:0 0 12px rgba(255,77,109,.7)}100%{}}
.payout-pop{position:fixed;left:50%;top:84px;transform:translateX(-50%);z-index:95;padding:12px 18px;border-radius:16px;background:rgba(16,18,24,.96);border:1px solid rgba(255,194,77,.5);box-shadow:0 0 40px rgba(255,194,77,.25);display:flex;align-items:center;gap:12px;animation:fade .3s}
.payout-pop b{color:var(--gold);font-family:var(--fd)}
.dev-note{padding:8px 12px;border-radius:10px;background:rgba(255,194,77,.08);border:1px solid rgba(255,194,77,.25);font-size:12px;color:var(--muted)}
.right{flex:none}
@media (max-width:1320px){.epoch-chip span:not(.dot){display:none}.epoch-chip{padding:0 10px}.links a{padding:8px 9px}}
@media (max-width:1100px){.tp,.form{grid-template-columns:minmax(0,1fr)}.stack>*,.side>*{min-width:0}.side,.preview{position:static;max-height:none}.kpis{grid-template-columns:repeat(3,1fr)}.hero{grid-template-columns:minmax(0,1fr)}.hero>*{min-width:0}.stats{grid-template-columns:repeat(2,1fr)}.links{display:none}.search{max-width:none}.epoch-chip{display:none}}
/* Five stats and 22px gaps do not fit a phone in one row. Wrapping onto two is the honest answer:
   a min-width gives each cell a floor so flex cannot shave them, and the row breaks instead. */
@media (max-width:640px){
  .king .kp{flex-wrap:wrap;gap:12px 18px}
  .king .kp>*{min-width:86px;flex:0 1 auto}
}
@media (max-width:640px){#nav{padding:0 14px;gap:10px}#app{padding:14px 16px 40px}.hero{padding:22px 18px}.stats{grid-template-columns:1fr 1fr}#nav .btn.cta{display:none}.king{grid-template-columns:1fr}.rail{grid-auto-columns:minmax(260px,1fr)}.chart-wrap{height:320px}.kpis{grid-template-columns:repeat(2,1fr)}.thead .price{margin-left:0;text-align:left;width:100%}.search kbd{display:none}.brand .word{display:none}.btn.wallet{padding:0 10px;max-width:120px;overflow:hidden}.btn.wallet .mono,.btn.wallet .mono+span{display:none}#nav .right{gap:6px}}
/* footer */
#foot{max-width:min(1760px, calc(100vw - 48px));margin:0 auto;padding:22px 22px 34px;display:flex;align-items:center;justify-content:space-between;gap:16px;border-top:1px solid var(--line);color:var(--dim);font-size:12.5px;flex-wrap:wrap}
#foot .fw{display:flex;align-items:center;gap:12px}#foot .word{font-family:var(--fd);font-weight:700;letter-spacing:.14em;color:var(--muted)}#foot .tag{color:var(--dim)}
#foot .fl{display:flex;gap:16px;align-items:center;flex-wrap:wrap}#foot .fl a:hover{color:var(--text)}

/* a11y + motion */
:focus-visible{outline:2px solid rgba(255,194,77,.7);outline-offset:2px;border-radius:8px}
.search input:focus-visible,.amt input:focus-visible,.field input:focus-visible,.field textarea:focus-visible,.chat input:focus-visible{outline:none}
@media (prefers-reduced-motion:reduce){.tape-track{animation:none}.prog>i::after,.epoch-chip .dot,.sec h2 .live-dot{animation:none}.card.in,.fade,.toast,.mbox,.payout-pop,.wmenu{animation:none}}
#tabBody,.panel:has(>.tbl),.learn .block{overflow-x:auto}
.tabs{max-width:100%;overflow-x:auto;scrollbar-width:none}.tabs::-webkit-scrollbar{display:none}.tabs button{flex:none}
.card .av,.thead .av{box-shadow:0 0 0 1px rgba(255,255,255,.06),0 6px 18px rgba(0,0,0,.35)}
.king .av{box-shadow:0 0 0 1px rgba(255,194,77,.35),0 0 28px rgba(255,194,77,.18)}
.btn.go:hover{filter:brightness(1.06)}.btn.buy:hover{box-shadow:0 10px 34px rgba(61,255,160,.35)}.btn.sell:hover{box-shadow:0 10px 34px rgba(255,77,109,.35)}
.thead h1{max-width:60vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:640px){.thead h1{max-width:100%;white-space:normal}.sec{flex-wrap:wrap}.tp{gap:12px}.chart-wrap .tools{flex-wrap:wrap;max-width:calc(100% - 20px)}.chart-wrap .tools .tabs button{padding:0 9px;font-size:11.5px;height:26px}.chart-wrap{height:360px}.payout-pop{width:calc(100% - 24px);top:76px;font-size:12.5px}}

/* mobile tab bar + token trade bar */
#mnav{display:none}
#mtrade{display:none}
#tape::before{z-index:3}
#livedot{position:absolute;left:10px;top:50%;width:7px;height:7px;margin-top:-3.5px;border-radius:50%;background:var(--up);box-shadow:0 0 10px var(--up);z-index:4;transition:.3s}
#tape.offline #livedot{background:var(--dim);box-shadow:none}
.tape-track{padding-left:28px}
.stackav{display:flex}.stackav img{margin-left:-6px;border:2px solid #10121a;border-radius:7px}.stackav img:first-child{margin-left:0}
@media (max-width:1100px){
  /* ⛔ `position:fixed` AND `backdrop-filter` ON THE SAME ELEMENT DRIFTS ON iOS SAFARI.
     The filter moves the element onto a compositing path where WebKit stops re-pinning it to the
     viewport during momentum scrolling, so the bar slides up into the middle of the page — Elio
     screenshotted it floating above the footer. It is correct in every desktop engine and in
     Chrome's device emulation, which is why it shipped; only real iOS shows it.
     The bar stays fixed and the blur moves to a child layer, which is the combination WebKit
     handles. `translateZ(0)` promotes the bar itself so the two layers cannot disagree. */
  #mnav{position:fixed;left:0;right:0;bottom:0;z-index:60;display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);padding:6px 8px calc(6px + env(safe-area-inset-bottom));border-top:1px solid var(--line);transform:translateZ(0);will-change:transform;isolation:isolate}
  #mnav::before{content:"";position:absolute;inset:0;background:rgba(9,10,14,.92);backdrop-filter:blur(18px) saturate(140%);-webkit-backdrop-filter:blur(18px) saturate(140%)}
  #mnav>*{position:relative}
  #mnav a{display:flex;flex-direction:column;align-items:center;gap:3px;padding:6px 0;border-radius:12px;color:var(--dim);font-size:10px;font-weight:600;letter-spacing:.01em;white-space:nowrap}
  #mnav a svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
  #mnav a.active{color:var(--text)}#mnav a.mk{margin-top:-8px}#mnav a.mk svg{width:34px;height:34px;padding:6px;border-radius:11px;background:var(--grad);stroke:#140a02;box-shadow:0 6px 18px rgba(255,120,40,.35)}
  #app{padding-bottom:96px}#foot{padding-bottom:110px}
  body.token-page #mnav{display:none}
  body.token-page #mtrade{position:fixed;left:0;right:0;bottom:0;z-index:60;display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:10px 12px calc(10px + env(safe-area-inset-bottom));background:rgba(9,10,14,.92);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border-top:1px solid var(--line)}
  body.token-page #mtrade .btn{height:46px;font-size:15px}body.token-page #mtrade .btn.cta{grid-column:1/-1}
  #toasts{bottom:96px}
}

/* REX hero mascot + hold gate */
.hero{grid-template-columns:1.15fr .85fr}
.heromask{position:relative;justify-self:center;width:100%;max-width:420px;aspect-ratio:1;background:url('/brand/rex-hero.jpg') center/cover;-webkit-mask-image:radial-gradient(closest-side,#000 52%,transparent 78%);mask-image:radial-gradient(closest-side,#000 52%,transparent 78%);filter:saturate(1.05);animation:float 7s ease-in-out infinite}
@keyframes float{0%,100%{transform:translateY(-6px)}50%{transform:translateY(6px)}}
.hero .usps{gap:10px}
.gate{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:999px;border:1px solid rgba(34,197,94,.3);background:rgba(34,197,94,.07);font-size:12.5px;color:var(--muted)}
.gate b{color:var(--rex);font-family:var(--fm)}
.gate.blocked{border-color:rgba(255,84,112,.35);background:rgba(255,84,112,.07)}.gate.blocked b{color:var(--down)}
.tier.m3{background:rgba(157,255,143,.12);color:var(--lime);border-color:rgba(157,255,143,.4)}
.chip.conv{border-color:rgba(34,197,94,.35);background:rgba(34,197,94,.09);color:var(--rex)}
.chip.fair{border-color:rgba(157,255,143,.35);background:rgba(157,255,143,.08);color:var(--lime)}
.epoch-chip{border-color:rgba(34,197,94,.25);background:rgba(34,197,94,.06)}.epoch-chip b{color:var(--rex)}.epoch-chip .dot{background:var(--rex);box-shadow:0 0 10px var(--rex)}
.king{background:linear-gradient(120deg,rgba(34,197,94,.13),rgba(21,128,61,.06) 60%,transparent);border-color:rgba(34,197,94,.3)}
.king::before{background-image:var(--ic-rex)}
.king .crown{color:var(--rex)}
.fo{border-color:rgba(157,255,143,.3);background:linear-gradient(180deg,rgba(157,255,143,.07),rgba(157,255,143,.02))}
.cv{border-color:rgba(34,197,94,.26);background:linear-gradient(180deg,rgba(34,197,94,.07),rgba(34,197,94,.015))}
.ring .fg{stroke:var(--rex);filter:drop-shadow(0 0 6px rgba(34,197,94,.6))}.ring .t{color:var(--rex)}
.fo-line{background:rgba(157,255,143,.06);border-color:rgba(157,255,143,.2)}.fo-line b{color:var(--lime)}
.stat::after{background:var(--grad)}
.ladder .st.on{border-color:rgba(34,197,94,.55);background:rgba(34,197,94,.12);box-shadow:0 0 18px rgba(34,197,94,.15)}.ladder .st.on .m{color:var(--rex)}
.ladder .st.past .m{color:var(--rex)}
#mnav a.mk svg{stroke:#04170b}
.gold{color:var(--lime)}.ember{color:var(--rex)}
@media (max-width:1100px){.hero{grid-template-columns:minmax(0,1fr)}.hero>*{min-width:0}.heromask{max-width:300px;order:-1}}

/* rewards */
.bkts{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}
.bkt{padding:18px;border-radius:var(--r);background:var(--surface);border:1px solid var(--line);position:relative;overflow:hidden}
.bkt::after{content:"";position:absolute;left:0;bottom:0;height:3px;width:100%;background:var(--grad);opacity:.55}
.bkt .pct{font-family:var(--fd);font-size:34px;font-weight:700;color:var(--rex);letter-spacing:-.02em}
.bkt .bl{font-weight:600;margin-top:4px}
.bkt .bt{font-family:var(--fm);font-size:10.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);margin-top:4px}
@media (max-width:640px){.bkts{grid-template-columns:1fr 1fr}.bkt .pct{font-size:26px}}

.claimbox{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;padding:12px 14px;border-radius:14px;background:rgba(157,255,143,.08);border:1px solid rgba(157,255,143,.28)}

/* test-network banner */
#chainbar{position:fixed;left:0;right:0;bottom:0;z-index:70;display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap;
  padding:9px 16px calc(9px + env(safe-area-inset-bottom));background:rgba(255,196,107,.1);border-top:1px solid rgba(255,196,107,.35);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);font-size:12.5px;color:var(--muted)}
#chainbar .cb-tag{font-family:var(--fm);font-size:10.5px;letter-spacing:.14em;padding:3px 8px;border-radius:999px;background:rgba(255,196,107,.16);color:#ffc46b;border:1px solid rgba(255,196,107,.4)}
#chainbar button{height:28px;padding:0 12px;border-radius:999px;border:1px solid rgba(157,255,143,.35);background:rgba(157,255,143,.12);color:var(--lime);font-weight:600;font-size:12px;cursor:pointer}
#chainbar button:hover{background:rgba(157,255,143,.2)}#chainbar button:disabled{opacity:.5}
#chainbar a{color:var(--muted);text-decoration:underline}
body:has(#chainbar) #foot{padding-bottom:70px}
@media (max-width:1100px){#chainbar{bottom:73px}body:has(#chainbar) #mnav{bottom:0}}

/* ---- fee module: the live sum, shown on the front screen and on Advanced ---- */
.opts.tight{grid-template-columns:repeat(auto-fit,minmax(58px,1fr))}
.opts.tight button{min-height:34px;font-size:12px}
.opts button.blocked{opacity:.3;cursor:not-allowed}
.tabs.big{width:100%;margin-bottom:10px}
.tabs.big button{flex:1;height:36px;font-size:13px}
.feesum{margin-top:14px;padding:12px;border-radius:13px;border:1px solid var(--line);background:var(--surface);transition:.2s}
.feesum.over{border-color:rgba(255,84,112,.5);background:rgba(255,84,112,.07)}
.feesum .l{font-size:12px;color:var(--muted);font-weight:600}
.feesum .v{font-family:var(--fm);font-size:19px;font-weight:700;color:var(--gold)}
.feesum.over .v{color:var(--down)}
.feesum .v .dim{font-size:12px;font-weight:500}
.fsbar{display:flex;gap:2px;height:9px;margin:9px 0 8px;border-radius:5px;overflow:hidden;background:rgba(0,0,0,.35)}
.fsg{display:inline-block;border-radius:3px}
.fsg.h{background:var(--up)}.fsg.c{background:var(--gp)}.fsg.v{background:var(--usdc)}.fsg.b{background:var(--down)}.fsg.k{background:#a78bfa}
.fsg.rest{background:rgba(255,255,255,.06)}
.fslegend{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:11.5px;color:var(--muted)}
.fslegend span{display:flex;align-items:center;gap:5px}
.fslegend .fsg{width:8px;height:8px;border-radius:2px;flex:0 0 auto}
.fslegend small{color:var(--dim);font-size:10.5px}
.fserr{margin-top:8px;font-size:11.5px;color:var(--down);font-weight:600}
.btn.bad{opacity:.5;cursor:not-allowed}
.vaultaddr{margin-top:12px;padding:9px 11px;border-radius:11px;background:rgba(39,117,202,.08);border:1px solid rgba(39,117,202,.25);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.vaultaddr code{font-size:11px;color:var(--text);word-break:break-all;flex:1 1 200px}
.note.gold{color:var(--gold)}
/* ---- Against the field ---- */
.vs{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:10px}
.vs th,.vs td{padding:9px 10px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}
.vs th{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--dim);font-weight:600}
.vs th.rex,.vs td.rex{background:rgba(34,197,94,.07)}
.vs th.rex{color:var(--ember)}
.vs td:first-child{color:var(--muted);font-weight:600;white-space:nowrap}
.vs td.rex{color:var(--text);font-weight:500}

/* ---- social / growth layer ---- */
.sharebox{margin-top:12px;padding:12px;border-radius:13px;border:1px solid rgba(34,197,94,.28);background:rgba(34,197,94,.06)}
.sharebox b{font-size:13.5px}
.reflink{display:flex;align-items:center;gap:8px;margin-top:9px;padding:8px 10px;border-radius:10px;background:rgba(0,0,0,.3);border:1px solid var(--line)}
.reflink code{flex:1 1 auto;min-width:0;font-size:11.5px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.posts{margin-top:10px;display:flex;flex-direction:column;gap:8px}
.post{padding:9px 11px;border-radius:11px;background:var(--surface);border:1px solid var(--line);font-size:13px;line-height:1.5}
.post .dim{font-size:11px}
@media (max-width:560px){ .reflink code{font-size:10.5px} }
.repbox{margin-top:12px;padding:12px;border-radius:13px;border:1px solid var(--line);background:var(--surface)}
.replist{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:9px;font-size:11.5px;color:var(--dim)}
.replist span{display:flex;flex-direction:column;gap:1px}
.replist b{font-family:var(--fm);font-size:13px;color:var(--text);font-weight:600}
.marks{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}
.mark{font-size:10.5px;padding:3px 8px;border-radius:999px;background:rgba(34,197,94,.1);border:1px solid rgba(34,197,94,.3);color:var(--ember)}
.verbs{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px;margin:18px 0 20px}
.verbs a{padding:10px 12px;border-radius:12px;border:1px solid var(--line);background:var(--surface);display:flex;flex-direction:column;gap:2px;transition:.15s}
.verbs a:hover{border-color:rgba(34,197,94,.45);background:rgba(34,197,94,.06)}
.verbs b{font-size:14px;color:var(--text)}
.verbs span{font-size:11px;color:var(--dim)}
@media (max-width:560px){ .verbs{grid-template-columns:repeat(2,1fr)} }
.needroom{padding:10px 12px;border-radius:11px;background:rgba(255,194,77,.07);border:1px solid rgba(255,194,77,.26);font-size:12.5px;color:var(--muted);line-height:1.5}
.needroom .btn{margin-top:8px}

/* The REX NFT picker on the welcome screen. Square, because NFT art is square and a circle would
   crop the corners off work somebody paid for. */
.nftpick{width:60px;height:60px;padding:0;border:2px solid var(--line);border-radius:12px;overflow:hidden;background:#0f1117;cursor:pointer;flex-shrink:0}
.nftpick img{width:100%;height:100%;object-fit:cover;display:block}
.nftpick.on{border-color:var(--gold);box-shadow:0 0 0 3px rgba(255,196,77,.18)}
.nftpick:hover{border-color:var(--gold)}

/* ---------- Points board
   Rank, who, held, points — in that order, because the question people arrive with is "where am I"
   and the one they stay for is "who is ahead of me". */
.prow{display:grid;grid-template-columns:48px 1fr auto auto;gap:12px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--line)}
.prow:last-child{border-bottom:0}
.pr-rank{font-weight:700;color:var(--muted);font-size:15px;text-align:center}
.pr-who{display:flex;gap:10px;align-items:center;min-width:0}
.pr-who .av{width:34px;height:34px;border-radius:50%;object-fit:cover;flex-shrink:0}
.pr-who .av-ph{display:grid;place-items:center;background:#1c1f2a;font-size:16px}
.pr-badges{display:flex;gap:5px;flex-wrap:wrap;margin-top:3px}
.pb{font-size:10px;padding:2px 7px;border-radius:999px;border:1px solid var(--line2);color:var(--muted);white-space:nowrap}
.pb.dia{border-color:var(--gold);color:var(--gold)}
.pb.og{border-color:#7c5cff;color:#a98bff}
.pr-held,.pr-pts{text-align:right;font-variant-numeric:tabular-nums;font-weight:600}
.pr-pts{color:var(--gold);min-width:74px}
.pr-held{color:var(--muted);min-width:56px;font-weight:500}
.pr-held small,.pr-pts small{display:block;font-size:10px;font-weight:400;color:var(--muted);opacity:.75}
.pme-grid{display:flex;gap:28px;flex-wrap:wrap;align-items:flex-start}
.pme-grid .l{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.pme-grid .v{font-size:26px;font-weight:700;margin-top:2px}
.pme-grid .chase{margin-left:auto;text-align:right}
.pbreak{display:flex;flex-wrap:wrap;gap:10px 22px}
.pbreak span{display:flex;flex-direction:column;gap:2px;font-size:12px;color:var(--muted)}
.pbreak b{font-size:16px;color:var(--text);font-variant-numeric:tabular-nums}
.pbreak.earn b{color:var(--gold)}
.pbreak small{font-size:11px;opacity:.8;max-width:30ch}
.soon{opacity:.72}
@media(max-width:520px){
  .prow{grid-template-columns:34px 1fr auto;gap:8px;padding:10px 12px}
  .pr-held{display:none}      /* the rank, who, and the score — a phone has room for three columns */
  .pme-grid{gap:18px}
  .pme-grid .chase{margin-left:0}
}

/* ---------- featured coin bar
   Reads as one line of facts, not an advert. The disclaimer is part of the bar rather than a
   tooltip, because the numbers beside it are real money and the book around them is not.

   ⛔ THE COIN ARTWORK IS THE POINT OF THE BAR AND IT WAS 20px. REXMARS is a 900px render — an alien
   on a gold-ringed Mars disc — and at 20 square it read as a green smudge, which is what a logo
   shown at two percent of its size looks like. It now fills the bar's height. Nothing about the
   source changed; it was never a resolution problem. */
#featbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:7px 16px;
  background:linear-gradient(90deg,rgba(34,197,94,.10),transparent 60%);
  border-bottom:1px solid var(--line);font-size:12.5px}
.fb-tag{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--gold);
  border:1px solid var(--gold);border-radius:999px;padding:2px 8px;flex-shrink:0}
/* ⛔ THE ROW SCROLLS RATHER THAN WRAPS, AT EVERY WIDTH. It used to wrap, which was fine for the two
   pinned coins it was built for; carrying every launch, wrapping turns a one-line strip into a
   block that pushes the whole page down and grows with each new coin. One rail, scrolled sideways,
   stays one line however many coins exist. Snap points stop it resting mid-coin. */
.fb-row{display:flex;align-items:stretch;gap:8px;flex-wrap:nowrap;min-width:0;flex:1;
  overflow-x:auto;scrollbar-width:none;scroll-snap-type:x proximity;overscroll-behavior-x:contain;
  -webkit-overflow-scrolling:touch}
.fb-row::-webkit-scrollbar{display:none}
.fb-row>.fb-item{scroll-snap-align:start;flex:none}
/* "There is more this way" — only drawn when it is true, toggled from JS because CSS cannot ask
   whether an element overflows. */
#featbar{position:relative}
#featbar.scrolls::after{content:"";position:absolute;right:0;top:0;bottom:0;width:56px;pointer-events:none;
  background:linear-gradient(90deg,transparent,var(--bg));opacity:.95;transition:opacity .2s}
#featbar.scrolls.at-end::after{opacity:0}
/* Our own launches read as ours; the pinned mainnet coins keep their own treatment. */
.fb-item.own .fb-sym{color:var(--text)}
.fb-item.own:hover{background:rgba(255,255,255,.06)}
.fb-item{display:flex;align-items:center;gap:10px;padding:4px 12px 4px 6px;border-radius:999px;
  border:1px solid transparent;background:transparent;color:inherit;font:inherit;cursor:pointer;
  text-align:left;transition:background .15s,border-color .15s}
.fb-item:hover{background:rgba(255,255,255,.05);border-color:var(--line2)}
.fb-item.rex{background:rgba(34,197,94,.08);border-color:rgba(34,197,94,.28)}
.fb-item.rex:hover{background:rgba(34,197,94,.14)}
/* Big enough to actually read the artwork, with the ring the coins draw for themselves. */
.fb-img{width:34px;height:34px;border-radius:50%;object-fit:cover;flex-shrink:0;
  box-shadow:0 0 0 1px rgba(255,255,255,.10),0 2px 8px rgba(0,0,0,.45);background:#0b0d12}
.fb-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.fb-top,.fb-bot{display:flex;align-items:baseline;gap:7px;white-space:nowrap}
.fb-sym{color:var(--text)}
.fb-pair,.fb-note{color:var(--muted)}
.fb-mc,.fb-vol{color:var(--text);font-variant-numeric:tabular-nums;font-size:11.5px}
.fb-bot{opacity:.82}
.fb-mc small,.fb-vol small{color:var(--muted);font-size:10px;margin-left:4px}
.fb-ch{font-size:11.5px} .fb-ch.up{color:var(--ember)} .fb-ch.down{color:#ff4d6d}
.fb-note{font-size:11px;opacity:.8;margin-left:auto}
@media(max-width:620px){
  /* The ROW owns the scrolling now, so the bar itself must not also scroll — two nested scrollers
     fight each other and the outer one steals the gesture. */
  #featbar{gap:8px;padding:6px 10px;font-size:12px;flex-wrap:nowrap;overflow:hidden}
  .fb-tag{display:none}                  /* the bar's own position already says what it is */
  .fb-row{flex-wrap:nowrap}
  .fb-img{width:30px;height:30px}
  .fb-vol,.fb-note{display:none}         /* symbol, cap and move survive; the rest is desktop detail */
}

/* The featured sheet: somebody else's chart and a Jupiter route, in one box. */
.fbmodal{width:min(760px,100%);padding:0;overflow:hidden}
.fbhead{display:flex;align-items:center;gap:12px;padding:16px 18px;border-bottom:1px solid var(--line)}
.fbhead h3{font-size:19px;margin:0}
.fbhead p{font-size:12px;margin:3px 0 0}
.fbhead .btn{margin-left:auto;flex-shrink:0}
.fbh-img{width:52px;height:52px;border-radius:50%;object-fit:cover;flex-shrink:0;
  box-shadow:0 0 0 1px rgba(255,255,255,.12),0 3px 14px rgba(0,0,0,.5)}
.fbchart{height:340px;background:#0b0d12;border-bottom:1px solid var(--line)}
.fbchart iframe{width:100%;height:100%;border:0;display:block}
.fbswap{padding:16px 18px 18px}
.fbswap .row{display:flex;align-items:center;gap:10px}
.fbswap .row.between{justify-content:space-between}
.fbswap .l{font-size:12.5px;color:var(--muted)}
.fbswap input{flex:1;min-width:0;background:rgba(255,255,255,.03);border:1px solid var(--line2);
  border-radius:12px;padding:12px 14px;color:var(--text);font:600 19px/1 'JetBrains Mono',ui-monospace,monospace}
.fbunit{font-size:13px;color:var(--muted);flex-shrink:0}
.fbquick{display:flex;gap:6px;margin-top:8px}
.fbquick button{flex:1;padding:6px 0;border-radius:9px;border:1px solid var(--line2);
  background:transparent;color:var(--muted);font-size:12px;cursor:pointer}
.fbquick button:hover{color:var(--text);border-color:var(--gold)}
.fbmeta{display:flex;gap:12px;flex-wrap:wrap;margin-top:5px;font-size:11.5px}
@media(max-width:620px){
  .fbchart{height:260px}
  .fbh-img{width:42px;height:42px}
  .fbhead,.fbswap{padding-left:14px;padding-right:14px}
}

/* A pasted wallet is a public record, so say so rather than making people infer it. */
.pubnote{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12.5px;color:var(--muted);
  padding:8px 14px;margin-bottom:14px;border:1px solid var(--line);border-radius:10px;background:rgba(255,255,255,.02)}
.field.lookup input{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}

/* The burn pot fills toward the threshold that triggers the next buy. */
.prog.burnbar i{background:linear-gradient(90deg,#ff7a18,#ffb347)}

/* Burn history — one row per burn, each with the transaction that proves it. */
.burnlist{margin-top:16px;border-top:1px solid var(--line);max-height:280px;overflow-y:auto}
.brow{display:grid;grid-template-columns:22px 1fr auto auto;gap:10px;align-items:center;
  padding:9px 2px;border-bottom:1px solid var(--line);font-size:13px}
.brow:last-child{border-bottom:0}
.bamt{color:var(--text)} .bwhen{color:var(--muted);font-size:12px} .btx{color:var(--gold);font-size:12px}
.btx.dim{color:var(--muted)}
/* The pot is live, so the bar is too — a slow ember travelling the fill, not a loop demanding
   attention. Stopped outright for anyone who asked for less motion. */
.prog.burnbar i{background:linear-gradient(90deg,#ff7a18,#ffb347,#ff7a18);background-size:220% 100%;
  animation:ember 3.2s ease-in-out infinite}
@keyframes ember{0%,100%{background-position:0% 0}50%{background-position:100% 0}}
@media(prefers-reduced-motion:reduce){.prog.burnbar i{animation:none}}
@media(max-width:520px){.brow{grid-template-columns:20px 1fr auto;gap:8px}.bwhen{display:none}}

/* The burn, on the front page. One line of facts that reads as momentum, not an advert — the
   numbers are real and large, so they do the work without a gradient shouting over them. */
/* The pot bar on the front-page burn strip. Full width on its own row beneath the figures, so it
   reads as the strip's progress rather than as another statistic competing with them. */
.bs-pot{flex-basis:100%;margin-top:2px}
.bs-pot .prog{margin-top:6px}
.bs-pot .prog-l{margin-top:4px;font-size:10.5px}
/* ---- Buyback and burn, on the front page. Elio, 5 Oct: "I like it bigger and more easy to read
   and big flames 🔥", with a layout to match — eyebrow, headline, the last burn, two large figures,
   a wide pot bar, and fire across the bottom.

   ⛔ It replaced a 96px STRIP, and the strip is why the fire never worked. Julz reported the burn
   section as having no flames while nine embers were genuinely animating: at that height they were
   a few pixels of warmth behind a line of text. Height is the feature here, not decoration — the
   panel is sized so the fire has somewhere to burn. */
.burnhero{position:relative;display:block;overflow:hidden;text-decoration:none;
  margin-top:14px;padding:22px 24px 34px;min-height:340px;border-radius:20px;
  border:1px solid rgba(255,122,24,.32);
  background:radial-gradient(120% 150% at 100% 0%,rgba(255,122,24,.16),transparent 58%),var(--panel);
  transition:border-color .18s,transform .18s,box-shadow .18s}
.burnhero:hover{border-color:rgba(255,122,24,.6);transform:translateY(-2px);
  box-shadow:0 16px 48px rgba(255,90,20,.14)}
.burnhero .bh-body{position:relative;z-index:2;display:block;max-width:min(100%,660px)}
.bh-tag{display:flex;align-items:center;gap:7px;font-size:11.5px;font-weight:600;
  text-transform:uppercase;letter-spacing:.14em;color:#ffb347}
.bh-h{display:block;margin-top:10px;font-family:var(--fd);font-weight:700;
  /* Scales with the viewport so it stays a headline on a phone instead of three cramped lines. */
  font-size:clamp(24px,5.2vw,38px);line-height:1.08;color:var(--text);letter-spacing:-.01em}
.bh-last{display:block;margin-top:12px;font-size:13px;color:var(--muted)}
.bh-last::before{content:"";display:block;width:34px;height:3px;border-radius:2px;margin-bottom:10px;
  background:linear-gradient(90deg,#ff7a18,#ffc45a)}
/* auto-fit, so three figures sit in a row on a wide card and stack cleanly on a narrow one without
   ever being squeezed into an unreadable column. */
.bh-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px 22px;margin-top:18px}
.bh-stat{display:block;min-width:0}
.bh-n{display:block;font-size:clamp(22px,4vw,30px);font-weight:700;color:var(--text);
  font-variant-numeric:tabular-nums;line-height:1.1;letter-spacing:-.01em}
.bh-l{display:block;margin-top:4px;font-size:11px;font-weight:600;text-transform:uppercase;
  letter-spacing:.1em;color:var(--dim);line-height:1.35}
.bh-pot{display:block;margin-top:20px}
/* ⛔ display:block — .prog sets a height but never a display, and on /rewards it happens to be a
   <div>. Here it is a <span> inside the panel's <a>, so it was INLINE: height and the fill's width
   had nothing to apply to and the bar was invisible. The two labels rendered, which made it look
   like a spacing bug rather than a missing element. */
.prog.burnbar.big{display:block;height:14px;margin-top:0;border-radius:999px;
  background:rgba(0,0,0,.5);box-shadow:inset 0 1px 3px rgba(0,0,0,.5)}
.prog.burnbar.big>i{box-shadow:0 0 14px rgba(255,140,40,.75)}
/* ⛔ THESE TWO SIT ON TOP OF THE FIRE, so they cannot be dim-orange-on-bright-orange. With the
   flames turned up, "the ledger →" in #ffb347 became unreadable against them — turning the fire up
   had quietly traded away the "easier to read" half of the same request. White, heavier, and with
   a shadow to lift it off the flame, which is how Elio's own mock sets the text over the fire. */
.bh-pot .prog-l{margin-top:8px;font-size:12.5px;color:#fff;font-weight:600;
  text-shadow:0 1px 10px rgba(0,0,0,.75),0 0 2px rgba(0,0,0,.6)}
.bh-go{display:inline-block;margin-top:16px;color:#fff;font-weight:700;font-size:14px;
  text-shadow:0 1px 10px rgba(0,0,0,.8),0 0 2px rgba(0,0,0,.7)}
.burnhero:hover .bh-go{text-decoration:underline}
/* ⛔ SETS B AND C. Fire is layers moving at different speeds — one set scaling up and down is a
   pulsing gradient, three sets drifting past each other is a flame. These are deliberately offset
   in position, width, duration AND direction from set A on .bs-fire::after, so no two line up. */
.burnhero .bs-flames{position:absolute;left:0;right:0;bottom:0;height:92%;z-index:1;
  pointer-events:none;overflow:hidden;border-radius:inherit;mix-blend-mode:screen;
  /* ⛔ THE TONGUES STAY TALL AND GO TRANSPARENT AS THEY RISE. Turning the flames up to full height
     at full strength washed out the pot line and the ledger link — the same trade that had already
     cost the "easier to read" half of this request once. Shrinking them back would just undo the
     ask, so they keep their height and lose their opacity instead, which is what real flame does
     anyway: dense and opaque at the base, thin and see-through at the tip. */
  -webkit-mask-image:linear-gradient(to top,#000 0%,#000 34%,rgba(0,0,0,.42) 68%,transparent 100%);
          mask-image:linear-gradient(to top,#000 0%,#000 34%,rgba(0,0,0,.42) 68%,transparent 100%)}
.burnhero .bs-flames::before,.burnhero .bs-flames::after{content:"";position:absolute;
  inset:auto 0 -5% 0;transform-origin:50% 100%}
.burnhero .bs-flames::before{height:100%;filter:blur(3px);
  background:
    radial-gradient(6% 100% at 13% 100%, rgba(255,248,208,1) 20%, rgba(255,146,38,.94) 50%, transparent 70%),
    radial-gradient(4% 68% at 25% 100%, rgba(255,214,116,1) 24%, rgba(255,112,26,.88) 56%, transparent 76%),
    radial-gradient(7% 100% at 40% 100%, rgba(255,254,226,1) 19%, rgba(255,150,40,.94) 49%, transparent 70%),
    radial-gradient(5% 74% at 54% 100%, rgba(255,206,96,1) 23%, rgba(255,104,24,.88) 55%, transparent 75%),
    radial-gradient(6% 98% at 69% 100%, rgba(255,250,212,1) 20%, rgba(255,152,42,.92) 50%, transparent 71%),
    radial-gradient(4% 64% at 83% 100%, rgba(255,200,88,1) 24%, rgba(255,108,26,.86) 56%, transparent 76%);
  animation:bhFlameB 1.9s ease-in-out infinite alternate}
.burnhero .bs-flames::after{height:84%;filter:blur(1.5px);
  background:
    radial-gradient(4% 86% at 5% 100%,  rgba(255,255,240,1) 22%, rgba(255,170,52,.94) 52%, transparent 72%),
    radial-gradient(3.5% 58% at 20% 100%, rgba(255,236,158,1) 26%, rgba(255,130,30,.9) 58%, transparent 78%),
    radial-gradient(5% 100% at 36% 100%, rgba(255,255,248,1) 20%, rgba(255,176,56,.96) 50%, transparent 70%),
    radial-gradient(3.5% 56% at 49% 100%, rgba(255,230,148,1) 26%, rgba(255,124,28,.9) 58%, transparent 78%),
    radial-gradient(4.5% 94% at 63% 100%, rgba(255,255,244,1) 21%, rgba(255,172,54,.94) 51%, transparent 71%),
    radial-gradient(3.5% 54% at 77% 100%, rgba(255,226,140,1) 26%, rgba(255,120,28,.88) 58%, transparent 78%),
    radial-gradient(4% 82% at 93% 100%, rgba(255,252,222,1) 23%, rgba(255,164,48,.92) 53%, transparent 73%);
  animation:bhFlameC 2.7s ease-in-out infinite alternate-reverse}
@keyframes bhFlameB{
  0%  {transform:scaleY(.88) scaleX(1.05) translateX(8px); opacity:.8}
  50% {transform:scaleY(1.2) scaleX(.96) translateX(-5px); opacity:1}
  100%{transform:scaleY(.94) scaleX(1.02) translateX(6px); opacity:.92}
}
@keyframes bhFlameC{
  0%  {transform:scaleY(1.05) scaleX(.98) translateX(-7px);opacity:.9}
  45% {transform:scaleY(.86) scaleX(1.06) translateX(5px); opacity:.78}
  100%{transform:scaleY(1.28) scaleX(.94) translateX(-4px);opacity:1}
}
@media (max-width:620px){.burnhero .bs-flames{height:72%}.burnhero .bs-flames::before{height:64%}}
@media(prefers-reduced-motion:reduce){
  .burnhero .bs-flames::before,.burnhero .bs-flames::after{animation:none}
}
/* With fire this tall the figures sit IN it, so every one of them carries its own lift. Without
   this, making the flames bigger simply deletes the text — the opposite of "easier to read". */
.bh-h,.bh-n{text-shadow:0 2px 16px rgba(0,0,0,.8),0 0 3px rgba(0,0,0,.65)}
.bh-l,.bh-last{text-shadow:0 1px 10px rgba(0,0,0,.85),0 0 2px rgba(0,0,0,.7)}
/* The mascot sits behind the text on the right. Masked rather than cropped, so it melts into the
   panel instead of sitting on it as a square, and it is the FIRST thing dropped when the panel
   gets narrow — a 208px render on a phone would own the card and leave the figures nowhere. */
.burnhero .bs-art{position:absolute;right:8px;bottom:0;z-index:1;width:208px;height:208px;
  object-fit:cover;opacity:.92;pointer-events:none;
  -webkit-mask-image:radial-gradient(closest-side,#000 58%,transparent 92%);
          mask-image:radial-gradient(closest-side,#000 58%,transparent 92%)}
@media (max-width:860px){.burnhero .bs-art{width:150px;height:150px;opacity:.5}}
@media (max-width:620px){
  .burnhero{padding:18px 16px 16px;border-radius:16px}
  .burnhero .bs-art{display:none}
  .bh-stats{gap:12px 16px}
}
.burnstrip{display:flex;align-items:baseline;gap:8px 14px;flex-wrap:wrap;padding:11px 16px;margin-top:12px;
  border:1px solid rgba(255,122,24,.28);border-radius:14px;
  background:linear-gradient(90deg,rgba(255,122,24,.13),rgba(255,122,24,.03) 55%,transparent);
  font-size:13px;color:var(--muted);text-decoration:none}
.burnstrip:hover{border-color:rgba(255,122,24,.5)}
.bs-tag{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:#ffb347;flex-shrink:0}
.bs-n{font-size:17px;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}
.bs-l{font-size:12px}
.bs-go{margin-left:auto;color:#ffb347;white-space:nowrap}
@media(max-width:620px){.burnstrip{gap:6px 10px;padding:10px 12px}.bs-n{font-size:15px}.bs-go{margin-left:0;width:100%}}

/* ---- Swap, promoted on the front page (Elio, 3 Oct: "after the burn 🔥 graphics").
   The art is the same cast as the hero, reused from the rewards site rather than redrawn. */
.swappromo{display:grid;grid-template-columns:auto 1fr;gap:20px;align-items:center;margin:18px 0 6px;padding:20px 22px;
  border:1px solid var(--line);border-radius:18px;
  background:radial-gradient(120% 140% at 0% 50%,rgba(45,212,110,.10),transparent 60%),var(--panel)}
.swappromo img{width:132px;height:132px;border-radius:16px;object-fit:cover;flex:none;
  /* The render is a figure on its own dark field — a soft mask blends that field into the card
     instead of sitting on it as a visible square. */
  -webkit-mask-image:radial-gradient(closest-side,#000 68%,transparent 97%);mask-image:radial-gradient(closest-side,#000 68%,transparent 97%)}
.swappromo h2{margin:4px 0 6px;font-family:'Clash Display',system-ui,sans-serif;font-size:30px;line-height:1}
.swappromo p{margin:0;color:var(--dim);font-size:13.5px;line-height:1.55;max-width:60ch}
.swappromo .actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
@media (max-width:760px){
  .swappromo{grid-template-columns:1fr;text-align:center;padding:18px 16px;gap:10px}
  .swappromo img{width:112px;height:112px;justify-self:center}
  .swappromo p{margin-inline:auto}
  .swappromo .actions{justify-content:center}
}
/* The launch form's reward-mode picker: two cards, not a row of chips — the choice is consequential
   and each option needs its one-line explanation next to it. */
#advMode{display:grid;grid-template-columns:1fr 1fr;gap:8px}
#advMode button{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:11px 13px;text-align:left}
#advMode button span{font-weight:650;font-size:13px}
#advMode button small{color:var(--dim);font-size:11px;line-height:1.35}
#advMode button.on small{color:inherit;opacity:.78}
@media (max-width:560px){#advMode{grid-template-columns:1fr}}

/* The burn strip's own art. The strip is a wrapping flex row of figures, so the image is pulled out
   as a fixed-size leading element and hidden on narrow screens where the numbers need the width. */
.burnstrip{position:relative}
.bs-stat{display:inline-flex;align-items:baseline;gap:6px;white-space:nowrap}
.burnstrip .bs-art{width:76px;height:76px;border-radius:14px;object-fit:cover;flex:none;align-self:center;margin-right:4px;
  -webkit-mask-image:radial-gradient(closest-side,#000 66%,transparent 96%);mask-image:radial-gradient(closest-side,#000 66%,transparent 96%)}
/* ⛔ The art used to be display:none below 620px, so on a phone — which is where Julz looked — the
   burn section showed no burn imagery at all and never even fetched the file. The picture is the
   point of the strip; it gets smaller, it does not get deleted. */
@media (max-width:620px){.burnstrip .bs-art{width:52px;height:52px;border-radius:11px;margin-right:2px}}

/* ---- The launch form's pair tabs: Quote, META, ALTS, Leverage, Stocks, Advanced.
   The generic .tabs rule makes a narrow row scroll horizontally, which does not LOSE the last tab
   but reads exactly like a clipped one — Fco circled it on a phone as a bug, which is the only test
   that matters. Scrolling is therefore still off the table.

   ⛔ THE REPLACED FIX GAVE EVERY TAB AN EQUAL SHARE (`flex:1 1 0`) AND SHRANK THE TYPE TO SUIT.
   That worked for the five tabs it was written for, and then a SIXTH — "Advanced" — was added.
   Equal shares hand "ALTS" 48px when it needs 37 and "Advanced" the same 48px when it needs 63, so
   the long labels overflowed their own pills: the highlight sat narrower than the word sitting in
   it, which is what Elio screenshotted as a box sticking out. The type was already clamped down to
   10.9px, so there was nothing left to shrink.

   Sizing each tab to its CONTENT spends the width where it is actually needed — all six now fit one
   row at a legible 12px — and `flex-wrap` means the row breaks onto a second line rather than
   spilling when it genuinely cannot fit (verified: two clean rows at 320px). Nothing is clipped,
   nothing hides behind a swipe, and a seventh tab degrades instead of breaking.
   Scoped to #ctabs so the sort/filter rows elsewhere keep scrolling, which is right for them
   because their count varies. */
/* A Meteora coin is charted by Birdeye, because its swaps happen in Meteora's program and never
   reach our own candle table — a self-drawn chart for one of these would be permanently blank. */
.chart-wrap.dbc{position:relative;padding:0;overflow:hidden}
.chart-wrap.dbc iframe{width:100%;height:100%;border:0;display:block;border-radius:inherit}
.chart-wrap.dbc .chart-note{position:absolute;left:0;right:0;bottom:0;padding:9px 12px;
  background:linear-gradient(180deg,transparent,rgba(9,10,14,.92) 38%);
  color:var(--muted);font-size:12.5px;text-align:center;pointer-events:auto}
.chart-wrap.dbc .chart-note a{color:var(--text);text-decoration:underline}

/* Elio's fomo referral. Visibly a link off-site, so nobody taps it expecting to stay here. */
.fomopromo{display:flex;align-items:center;gap:14px;margin-top:18px;padding:14px 16px;border-radius:14px;
  border:1px solid rgba(99,102,241,.38);background:linear-gradient(90deg,rgba(99,102,241,.14),rgba(99,102,241,.04));
  color:var(--text);transition:.15s}
.fomopromo:hover{border-color:rgba(99,102,241,.7)}
.fomopromo div{flex:1;min-width:0}
.fomopromo b{display:block;font-size:14.5px}
.fomopromo span{display:block;color:var(--muted);font-size:12.5px;margin-top:3px}
.fomopromo i{font-style:normal;font-weight:600;font-size:12.5px;color:#a5b4fc;white-space:nowrap}
@media (max-width:560px){.fomopromo{flex-wrap:wrap;gap:8px}.fomopromo i{width:100%}}

/* A trade landing, felt rather than announced: one short wash of the side's colour across the
   chart pane. It fires on a real swap arriving over the socket, never on a timer — a chart that
   pulses on its own is decoration, and decoration on a price chart costs you the reader's trust. */
@keyframes chartPulseBuy  { from { box-shadow: inset 0 0 0 0 rgba(61,255,160,.00), inset 0 -40px 60px -40px rgba(61,255,160,.55) } to { box-shadow: inset 0 0 0 0 transparent } }
@keyframes chartPulseSell { from { box-shadow: inset 0 0 0 0 rgba(255,77,109,.00), inset 0 -40px 60px -40px rgba(255,77,109,.55) } to { box-shadow: inset 0 0 0 0 transparent } }
.chart-pulse-buy  { animation: chartPulseBuy  .85s ease-out }
.chart-pulse-sell { animation: chartPulseSell .85s ease-out }
@media (prefers-reduced-motion:reduce){ .chart-pulse-buy,.chart-pulse-sell{animation:none} }

/* Tape entries are links now — they were the only live prices on the page you could not click. */
.tk{cursor:pointer;text-decoration:none;color:inherit;border-radius:8px;padding:2px 6px;transition:background .12s}
.tk:hover{background:rgba(255,255,255,.07)}

/* A quote asset's own artwork in place of the coloured dot. Same box as the dot it replaces, so
   nothing around it shifts when one asset has a logo and another does not. */
.qdi{width:1.15em;height:1.15em;border-radius:50%;object-fit:cover;vertical-align:-.22em;margin-right:.35em;
  background:#0b0d12;box-shadow:0 0 0 1px rgba(255,255,255,.12)}

/* The launcher's own bar on a coin page. The creator dashboard is useless if the person it was
   built for never finds it, and the coin page is the one place a launcher reliably goes. */
.launcherbar{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:var(--r);
  background:linear-gradient(90deg,rgba(255,194,77,.13),rgba(255,194,77,.04));border:1px solid rgba(255,194,77,.3);
  color:var(--text);font-size:13.5px}
.launcherbar .ic{color:#ffc24d;flex:none}
.launcherbar span{flex:1;min-width:0}
.launcherbar i{font-style:normal;font-weight:600;color:#ffc24d;white-space:nowrap}
@media (max-width:560px){.launcherbar{font-size:12.5px;padding:9px 11px}}

/* A medal AND its rank, on one line, so the "#" column reads consistently all the way down. */
td.num{white-space:nowrap}
td.num .crown{vertical-align:-.22em;margin-right:3px}
td.num .rk{font-variant-numeric:tabular-nums}

#ctabs{overflow-x:visible;gap:2px;flex-wrap:wrap;row-gap:2px}
#ctabs button{flex:1 1 auto;min-width:max-content;padding:0 10px;text-align:center;white-space:nowrap;font-size:12px}
@media (max-width:420px){ #ctabs{padding:3px} #ctabs button{padding:0 7px;letter-spacing:-.01em} }

/* ---- The burn strip's moving fire.
   The rewards site does this with a <canvas> and a JS particle loop. This is CSS only: it costs no
   JavaScript, cannot stall the strip if a script fails, and animates ONLY transform and opacity so
   the work stays on the compositor rather than relaunching layout nine times a second.
   The embers are decorative, so the element is aria-hidden and carries no text. */
.bs-fire{position:absolute;left:0;right:0;bottom:0;height:74%;pointer-events:none;z-index:0;
  overflow:hidden;border-radius:inherit;mix-blend-mode:screen}
/* The bed of heat the embers rise out of. Two offset breathing gradients read as a flicker without
   any single obvious cycle. */
/* ⛔ At .30-.40 alpha behind a 96px strip this was technically animating and visually absent —
   Julz reported the burn section as having no fire while nine embers were in fact running. A fire
   nobody can see is a fire that is not there. Three warmer beds and brighter embers. */
.bs-fire::before{content:"";position:absolute;inset:auto 0 -34% 0;height:84%;
  background:radial-gradient(62% 100% at 18% 100%, rgba(255,150,56,.72), transparent 72%),
             radial-gradient(48% 96% at 46% 100%, rgba(255,96,28,.58), transparent 74%),
             radial-gradient(40% 90% at 76% 100%, rgba(255,170,60,.45), transparent 74%);
  filter:blur(9px);animation:bsGlow 3.1s ease-in-out infinite alternate}
@keyframes bsGlow{from{opacity:.55;transform:scaleY(.92)}to{opacity:1;transform:scaleY(1.08)}}
.bs-fire b{position:absolute;bottom:-8px;width:5px;height:5px;border-radius:50%;
  background:radial-gradient(circle,#fffbe8 0%,#ffc45a 48%,rgba(255,130,40,0) 74%);
  box-shadow:0 0 6px rgba(255,170,70,.75);
  opacity:0;animation:bsEmber linear infinite}
/* Each ember gets its own lane, delay and duration — a shared timing function would make nine
   particles pulse in lockstep, which reads as a loading bar rather than a fire. */
.bs-fire b:nth-child(1){left:6%;  animation-duration:3.4s; animation-delay:0s}
.bs-fire b:nth-child(2){left:14%; animation-duration:4.1s; animation-delay:.7s; width:3px;height:3px}
.bs-fire b:nth-child(3){left:23%; animation-duration:2.9s; animation-delay:1.4s}
.bs-fire b:nth-child(4){left:33%; animation-duration:3.8s; animation-delay:.3s; width:5px;height:5px}
.bs-fire b:nth-child(5){left:44%; animation-duration:4.4s; animation-delay:2.1s; width:3px;height:3px}
.bs-fire b:nth-child(6){left:55%; animation-duration:3.2s; animation-delay:1.1s}
.bs-fire b:nth-child(7){left:67%; animation-duration:4.0s; animation-delay:2.6s; width:3px;height:3px}
.bs-fire b:nth-child(8){left:79%; animation-duration:3.6s; animation-delay:.5s}
.bs-fire b:nth-child(9){left:90%; animation-duration:4.6s; animation-delay:1.8s; width:3px;height:3px}
/* ⛔ EMBERS 10-18 NEED THEIR OWN LANES TOO. `left` has no default here, so any ember without a rule
   inherits `auto` and every one of them rises from the same point — a single thick column of
   particles, which looks like a bug rather than a fire. Doubling the count means doubling these. */
.bs-fire b:nth-child(10){left:2%;  animation-duration:3.9s; animation-delay:2.4s}
.bs-fire b:nth-child(11){left:19%; animation-duration:3.3s; animation-delay:1.9s; width:4px;height:4px}
.bs-fire b:nth-child(12){left:28%; animation-duration:4.7s; animation-delay:.9s; width:3px;height:3px}
.bs-fire b:nth-child(13){left:38%; animation-duration:3.1s; animation-delay:2.8s}
.bs-fire b:nth-child(14){left:50%; animation-duration:4.2s; animation-delay:.2s; width:6px;height:6px}
.bs-fire b:nth-child(15){left:61%; animation-duration:3.5s; animation-delay:3.1s; width:3px;height:3px}
.bs-fire b:nth-child(16){left:73%; animation-duration:4.9s; animation-delay:1.3s}
.bs-fire b:nth-child(17){left:85%; animation-duration:3.0s; animation-delay:2.2s; width:4px;height:4px}
.bs-fire b:nth-child(18){left:95%; animation-duration:4.3s; animation-delay:.6s; width:3px;height:3px}
.bs-fire b:nth-child(19){left:11%; animation-duration:3.7s; animation-delay:1.6s; width:4px;height:4px}
.bs-fire b:nth-child(20){left:26%; animation-duration:4.5s; animation-delay:.4s}
.bs-fire b:nth-child(21){left:41%; animation-duration:3.2s; animation-delay:2.9s; width:3px;height:3px}
.bs-fire b:nth-child(22){left:53%; animation-duration:4.8s; animation-delay:1.0s; width:5px;height:5px}
.bs-fire b:nth-child(23){left:66%; animation-duration:3.4s; animation-delay:2.5s}
.bs-fire b:nth-child(24){left:81%; animation-duration:4.1s; animation-delay:.1s; width:4px;height:4px}
.bs-fire b:nth-child(25){left:93%; animation-duration:3.6s; animation-delay:3.3s; width:3px;height:3px}
.bs-fire b:nth-child(26){left:4%;  animation-duration:4.4s; animation-delay:1.2s; width:5px;height:5px}

/* ⛔ THE FIRE IS SCALED UP FOR THE PANEL. These values were tuned for a 96px strip: a 74% bed and
   embers that die 120px up read as warmth behind one line of text, which is exactly why the fire
   "wasn't there". In a ~300px panel they must travel further and burn brighter, or the extra height
   just makes them look sparser than before. */
/* ⛔ BIGGER AND HOTTER, because "technically animating" is not the same as visible — the strip
   version was running nine embers behind a warm haze and Julz reported the section as having no
   fire at all. Two layers do the work: a tall soft GLOW that gives the panel its heat, and a
   shorter, barely-blurred BODY of overlapping tongues at the base that actually reads as flame.
   One blurred layer alone is a sunset; the hard edges are what make it fire. */
.burnhero .bs-fire{height:88%;mix-blend-mode:screen}
.burnhero .bs-fire::before{height:46%;filter:blur(20px);opacity:.85;
  background:radial-gradient(70% 100% at 14% 100%, rgba(255,150,56,.95), transparent 70%),
             radial-gradient(58% 100% at 40% 100%, rgba(255,88,24,.88), transparent 72%),
             radial-gradient(54% 98% at 66% 100%, rgba(255,170,60,.78), transparent 72%),
             radial-gradient(46% 92% at 90% 100%, rgba(255,110,30,.72), transparent 74%)}
/* The flame body: tongues of different widths and heights along the base, lightly blurred so they
   keep a shape, breathing out of phase with the glow behind them. */
.burnhero .bs-fire::after{content:"";position:absolute;inset:auto 0 -4% 0;height:86%;
  -webkit-mask-image:linear-gradient(to top,#000 0%,#000 30%,rgba(0,0,0,.38) 66%,transparent 100%);
          mask-image:linear-gradient(to top,#000 0%,#000 30%,rgba(0,0,0,.38) 66%,transparent 100%);
  /* ⛔ Barely blurred, and the colour stops are TIGHT. A wide blur or a lazy fade turns tongues
     back into the single warm haze this is replacing — the hard-ish edge between the pale core and
     the orange is the whole reason it reads as flame rather than as a gradient. */
  filter:blur(2px);mix-blend-mode:screen;
  background:
    radial-gradient(7% 96% at 8% 100%,  rgba(255,244,190,1) 22%, rgba(255,150,40,.92) 52%, transparent 72%),
    radial-gradient(5% 64% at 18% 100%, rgba(255,210,104,1) 24%, rgba(255,118,28,.88) 56%, transparent 76%),
    radial-gradient(8% 100% at 32% 100%, rgba(255,252,216,1) 20%, rgba(255,140,34,.94) 50%, transparent 70%),
    radial-gradient(5% 70% at 45% 100%, rgba(255,200,90,1) 24%, rgba(255,104,24,.88) 56%, transparent 76%),
    radial-gradient(7% 92% at 60% 100%, rgba(255,248,198,1) 21%, rgba(255,148,38,.92) 51%, transparent 72%),
    radial-gradient(5% 62% at 73% 100%, rgba(255,194,82,1) 24%, rgba(255,108,26,.86) 56%, transparent 76%),
    radial-gradient(7% 90% at 88% 100%, rgba(255,238,158,1) 22%, rgba(255,134,32,.9) 52%, transparent 72%);
  animation:bhFlame 2.4s ease-in-out infinite alternate;transform-origin:50% 100%}
@keyframes bhFlame{
  0%  {transform:scaleY(.82) scaleX(1.04) translateX(-6px);opacity:.82}
  35% {transform:scaleY(1.14) scaleX(.97) translateX(4px); opacity:1}
  65% {transform:scaleY(.95) scaleX(1.03) translateX(-3px);opacity:.9}
  100%{transform:scaleY(1.22) scaleX(.95) translateX(7px); opacity:1}
}
@media(prefers-reduced-motion:reduce){.burnhero .bs-fire::after{animation:none}}
.burnhero .bs-fire b{width:8px;height:8px}
.burnhero .bs-fire b{animation-name:bhEmber;box-shadow:0 0 10px rgba(255,170,70,.9)}
@keyframes bhEmber{
  0%   {opacity:0;   transform:translate3d(0,0,0) scale(.6)}
  10%  {opacity:1}
  70%  {opacity:.6}
  100% {opacity:0;   transform:translate3d(22px,-330px,0) scale(.15)}
}
@media (max-width:620px){
  .burnhero .bs-fire{height:46%}
  @keyframes bhEmber{
    0%{opacity:0;transform:translate3d(0,0,0) scale(.6)}
    10%{opacity:1}
    70%{opacity:.6}
    100%{opacity:0;transform:translate3d(10px,-140px,0) scale(.2)}
  }
}
@media(prefers-reduced-motion:reduce){.burnhero .bs-fire b{animation:none;opacity:0}}
@keyframes bsEmber{
  0%   {opacity:0;   transform:translate3d(0,0,0) scale(.6)}
  12%  {opacity:.95}
  70%  {opacity:.65}
  100% {opacity:0;   transform:translate3d(10px,-120px,0) scale(.25)}
}
.burnstrip>*:not(.bs-fire){position:relative;z-index:1}
/* A strip that flickers forever is a strip some people cannot read. */
@media (prefers-reduced-motion:reduce){
  .bs-fire b{display:none}
  .bs-fire::before{animation:none;opacity:.7}
}

/* The auto-allocate presets. Four options, so a 2x2 on anything narrow rather than a squeeze. */
#advAi{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
#advAi button{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:11px 13px;text-align:left}
#advAi button span{font-weight:650;font-size:13px}
#advAi button small{color:var(--dim);font-size:11px;line-height:1.35}
#advAi button.on small{color:inherit;opacity:.78}
@media (max-width:560px){#advAi{grid-template-columns:1fr}}

/* ---- "Pick a program" cards.
   The generic .opts button is a fixed 40px tall, which is right for a row of 0.5%/1% chips and
   wrong for a card carrying a name AND a line of explanation — the content overflowed and the rows
   overlapped each other. These size to their text instead. */
#advPg{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;align-items:stretch}
#advPg button{height:auto;min-height:62px;padding:11px 13px;text-align:left;align-items:flex-start;
  justify-content:center;gap:4px;line-height:1.25}
#advPg button span{font-weight:650;font-size:13px;white-space:normal}
#advPg button small{font-size:11px;line-height:1.35;white-space:normal;text-align:left;color:var(--dim)}
#advPg button.on small{color:inherit;opacity:.78}
/* The category row is a tab strip, not a scroller — four short labels always fit. */
#advPgCat{overflow-x:visible}
#advPgCat button{flex:1 1 0;min-width:0;font-size:clamp(11px,3vw,12.5px);white-space:nowrap}
@media (max-width:480px){#advPg{grid-template-columns:1fr}}

/* ---- "Your fees, doing something" — the programs, on the front page.
   Everything this advertises lived only inside /create → Advanced, so the home page looked
   unchanged after a night of work and the first person to open the link said exactly that.
   A feature nobody can see has not shipped. */
.pgpromo{margin:18px 0 6px;padding:22px;border:1px solid var(--line);border-radius:18px;
  background:radial-gradient(120% 140% at 100% 0%,rgba(45,212,110,.10),transparent 55%),var(--panel)}
.pgpromo h2{margin:6px 0 8px;font-family:'Clash Display',system-ui,sans-serif;font-size:30px;line-height:1.05}
.pgpromo p{margin:0 0 16px;color:var(--dim);font-size:13.5px;line-height:1.55;max-width:62ch}
.pgwrap{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px}
.pgcard{padding:13px 15px;border:1px solid var(--line);border-radius:14px;background:var(--surface)}
.pgcard b{display:block;font-size:13.5px;margin-bottom:5px}
.pgcard span{display:block;color:var(--dim);font-size:12px;line-height:1.45}
.pgpromo .actions{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap}
.pgpromo .hint{margin-top:12px}
@media (max-width:760px){.pgpromo{padding:18px 16px}.pgpromo h2{font-size:26px}.pgwrap{grid-template-columns:1fr}}

/* ════════════════════════════════════════════════════════════════════════════
   MOBILE POLISH — tap targets.
   Audited every route at 375px: no horizontal page scroll and nothing overflowing the viewport,
   which are the faults that actually break a phone. What was left were controls too small to hit
   reliably with a thumb. Apple's guideline is 44px and Google's is 48; these were 17–30.
   Each fix grows the TAP area without moving anything, so the layout is unchanged.
   ════════════════════════════════════════════════════════════════════════════ */
@media (max-width:1100px){
  /* The swap flip control was 30x30 and sits between two inputs — the easiest thing on the page to
     miss and the most annoying to miss, because the fat-finger lands in an amount field. */
  .swapflip{width:44px;height:44px;margin-top:-22px;border-radius:13px;font-size:17px}

  /* Filter chips are tapped constantly — quote filters, sorts, badges. 24px is a guess-and-tap. */
  .chips .chip{height:34px;padding:0 13px;font-size:12.5px}

  /* "tx ↗" links on the rewards ledger were 23x17. A link to a transaction is worth being able to
     open: the hit area is grown with padding and a negative margin, so the row does not reflow. */
  .btx,a.gold{display:inline-flex;align-items:center;min-height:30px;padding:6px 8px;margin:-6px -8px}

  /* Inline "See all →" / "launch one" links inside headings and prose. Same trick: bigger target,
     identical position. */
  .sec a.muted{display:inline-flex;align-items:center;min-height:32px;padding:6px 4px;margin:-6px -4px}

  /* The King strip clipped its tail by ~23px on a narrow screen.
     ⛔ My first fix was `overflow:visible`, which stopped the clipping and started a 6px sideways
     page scroll instead — trading a cosmetic fault for the one that actually makes a site feel
     broken on a phone. Neither is the answer: the content should WRAP. Clipping stays off the table
     because the strip names the coin, and overflow stays contained. */
  .king{overflow:hidden;grid-template-columns:1fr;row-gap:10px}
  .king>*{min-width:0;max-width:100%}
  /* Only the parts that can contain an unbreakable string. Applying this to `.king *` swept in the
     stat cells and cost them their min-content floor — see the note above. */
  .king .nm,.king .nmt,.king .ca,.king .mono{overflow-wrap:anywhere}

  /* Leaderboard rows were 28px — a whole row is the tap target and it was shorter than a fingertip. */
  a.row{min-height:44px}

  /* Wallet handles and $TICKER links sit INSIDE those rows, so they are nested targets: too small to
     hit on purpose, and big enough to hit by accident while aiming for the row. Padding gives them a
     real hit area without changing where anything sits. */
  /* ⛔ :not(.card) IS LOAD-BEARING. A coin card IS an <a href="/t/...">, and the Discover grid is a
     div that directly follows a .sec heading — so `.sec+div a[href^="/t/"]` matched every card on
     the front page and, below 1100px only, turned it into a horizontal inline-flex ROW. .top, .meta
     and .kpi became flex items side by side instead of stacked, which squeezed the name column to
     ~42px and set the creator line one character per line. That is the mangled mobile card Julz
     reported repeatedly; it never reproduced on desktop because the rule is inside this media
     query. These selectors are meant for the small $TICKER and wallet links NESTED inside rows,
     never for the card that contains them. */
  a.w,.sec+div a[href^="/t/"]:not(.card),.board a[href^="/t/"]:not(.card),.board a[href^="/u/"]:not(.card){
    display:inline-flex;align-items:center;min-height:30px;padding:7px 5px;margin:-7px -5px}
}

/* ⛔ NOT "fixed": the 24px badges on coin cards — "⚖ Fair Open live", "🦖 Pays 2%", "🎓 Graduated",
   the quote pill. They report as clickable only because they inherit cursor:pointer from the CARD
   they sit inside, and the card is the tap target. Growing them would swell every card to chase a
   number in an audit while making the list harder to scan. The only genuinely standalone chips are
   the filter rows, handled above as `.chips .chip`. */

/* ⛔ TWO OVERFLOWS I INTRODUCED TONIGHT, both measured at 375px and both self-inflicted.
   The page scrolled sideways by 73px, which is the one fault that makes a site feel broken on a
   phone, and neither was visible until the viewport was actually set to a phone.

   1. #mnav used `grid-auto-columns:1fr`. That is minmax(AUTO,1fr), and the auto floor refuses to
      shrink below the content — so adding a sixth tab made the whole bar wider than the screen.
      minmax(0,1fr) lets the columns actually divide the width. Fixed above.

   2. The filter row grew past the viewport once $WIF joined the quote chips and the chips
      themselves got taller for thumbs. `.chips` already wraps, but its flex PARENT sized itself to
      the content instead of the screen, because a flex item's default min-width is auto — the
      classic reason a wrapping row still overflows. */
@media (max-width:1100px){
  .row.wrap{flex-wrap:wrap;max-width:100%}
  .row.wrap>*{min-width:0;max-width:100%}
  .chips{max-width:100%;flex-wrap:wrap}
  #mnav a{min-width:0}
  #mnav a span{max-width:100%;overflow:hidden;text-overflow:ellipsis}
}

/* ⛔ THE ROOT CAUSE OF EVERY REMAINING SIDEWAYS SCROLL: `min-width:auto`.
   A grid or flex item will not shrink below its own content by default, so one long word, one wide
   number or one un-wrapped row makes the whole page scroll sideways — /rewards by 165px,
   /leaderboard by 61px. The containers were never at fault; the items simply refused to be smaller
   than their contents.

   `min-width:0` lets them. Scoped to mobile and applied to the layout wrappers only, so the rails —
   which are SUPPOSED to be wider than the screen and scroll inside themselves — are untouched. */
@media (max-width:1100px){
  .panel,.card,.board,.sec,.fo,.kpis,.stats,.grid,.tp{min-width:0;max-width:100%}
  .grid>*,.board>*,.kpis>*,.stats>*,.fo>*,.tp>*{min-width:0}
  /* Long unbroken strings — a mint address, a wallet, a URL — are the usual single offender.
     ⛔ THIS LIST USED TO INCLUDE .k, .v AND .l, AND THAT BROKE EVERY STAT ROW ON A PHONE.
     `overflow-wrap:anywhere` makes an element's MIN-CONTENT WIDTH ONE CHARACTER, so `min-width:auto`
     stops providing any floor and a flex or grid parent is free to squeeze the cell to ~11px. The
     King strip did exactly that: five columns and 88px of gaps in a 301px row rendered "Holder
     rewards" as a 11x198 tower reading HOL/DER/REW/ARD/S, and "$3,324" one digit per line. Those
     three classes hold SHORT labels and figures — they never needed anywhere-breaking, and normal
     word wrapping keeps a sane floor (the longest word) while still fitting. Keep this list to
     things that genuinely cannot break at a space. */
  .mono,.ca{overflow-wrap:anywhere;word-break:break-word}
  .k,.v,.l{min-width:0}
  /* A table is wide by nature: let IT scroll rather than the page. */
  main table{display:block;max-width:100%;overflow-x:auto}
}

/* `minmax(420px, 1fr)` with auto-fit cannot produce a track SMALLER than 420px, so on a 375px phone
   it overflows by exactly the difference — no amount of min-width on the children helps, because
   the track itself is the floor. `min(420px, 100%)` is the idiom: the full width when there is room,
   the screen when there is not. Applied here as a safety net for any grid that sets a fixed minimum. */
@media (max-width:1100px){
  .grid{grid-template-columns:repeat(auto-fill,minmax(min(300px,100%),1fr))}
  .bkts{grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr))}
  .pgwrap{grid-template-columns:repeat(auto-fit,minmax(min(210px,100%),1fr))}
}

/* "Connect wallet" was squeezed to 102px inside a `.row.between` and clipped mid-word — the button
   shrank because a flex item may shrink below its content, and `overflow:hidden` then hid the
   evidence rather than the problem. A call to action that reads "Connect wall" is worse than one
   that wraps to the next line. */
@media (max-width:1100px){
  main .btn{flex-shrink:0;max-width:100%}
  main .row.between{flex-wrap:wrap;gap:10px}
}

/* ⛔ The program cards were <div>s styled to look like buttons. Fco tapped one and reported
   "you press on them nothing happens" — correctly, because nothing did. They are links now, and
   they also have to FEEL like links: a pointer, a hover state, and a visible focus ring for anyone
   navigating by keyboard. Something that looks pressable and is not is worse than a plain
   paragraph, because it spends the reader's attention and gives nothing back. */
a.pgcard{display:block;text-decoration:none;color:inherit;cursor:pointer;transition:.15s}
a.pgcard:hover{border-color:var(--line2);background:var(--surface3);transform:translateY(-1px)}
a.pgcard:active{transform:translateY(0)}
a.pgcard:focus-visible{outline:2px solid var(--up);outline-offset:2px}
a.pgcard b::after{content:" →";opacity:.45;font-weight:600}

/* Each quote asset's own caveat, shown where it is chosen. A blanket "⚠️ issuer can freeze" on the
   whole category was wrong the moment a second leveraged asset arrived that CANNOT freeze — the
   warning has to be the asset's, not the tab's. */
.opts button .qnote{display:block;margin-top:4px;font-size:10px;line-height:1.3;color:var(--dim);
  font-style:normal;white-space:normal;text-align:left}
.opts button.on .qnote{color:inherit;opacity:.8}
#quotes button{height:auto;min-height:52px;padding:9px 11px;align-items:flex-start;text-align:left}

/* ---------- the pairs board
   Julz's ranking. Dense on purpose: twelve columns of real numbers read as a market, and a market
   that needs scrolling to compare two rows is not doing its job. The table scrolls sideways inside
   its own wrapper rather than widening the page — a board is the one screen where a phone is
   genuinely better off panning than having columns taken away from it. */
.pairspage .sec{margin-top:4px}
.pairspage h1{font-size:34px}

.ptabs{display:flex;gap:7px;flex-wrap:wrap;margin:16px 0 10px}
.ptabs button{display:flex;align-items:center;gap:7px;padding:9px 15px;border-radius:12px;
  border:1px solid var(--line2);background:rgba(255,255,255,.02);color:var(--muted);
  font-size:13px;font-weight:600;cursor:pointer;transition:.15s;white-space:nowrap}
.ptabs button:hover{color:var(--text);border-color:var(--line2);background:rgba(255,255,255,.05)}
.ptabs button.on{background:var(--ember);border-color:var(--ember);color:#07140c}
.ptabs button.on svg{stroke-width:2}

.prow2{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.pwins{display:flex;gap:5px}
.pwins button{padding:7px 15px;border-radius:9px;border:1px solid var(--line2);background:transparent;
  color:var(--muted);font-size:12px;font-weight:600;cursor:pointer}
.pwins button:hover{color:var(--text)}
.pwins button.on{background:rgba(34,197,94,.14);border-color:rgba(34,197,94,.45);color:var(--ember)}
.psearch{margin-left:auto;display:flex;align-items:center;gap:8px;padding:0 13px;border-radius:10px;
  border:1px solid var(--line2);background:rgba(255,255,255,.02);color:var(--muted);min-width:220px}
.psearch input{flex:1;min-width:0;background:none;border:0;outline:none;color:var(--text);
  font-size:13px;padding:9px 0}

.ptablewrap{border:1px solid var(--line);border-radius:16px;overflow:auto;background:rgba(255,255,255,.015)}
.ptable{width:100%;border-collapse:collapse;font-size:13px;min-width:1040px}
.ptable th{position:sticky;top:0;z-index:1;background:#10131a;text-align:left;font-size:10.5px;
  text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600;
  padding:11px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
.ptable th.r,.ptable td.r{text-align:right}
.ptable th.num,.ptable td.num{text-align:center;width:46px}
.ptable th.sortable{cursor:pointer;user-select:none}
.ptable th.sortable::after{content:' ⇅';opacity:.45}
.ptable th.sortable:hover{color:var(--text)}
.ptable th.sortable.on{color:var(--ember)}
.ptable td{padding:9px 12px;border-bottom:1px solid rgba(255,255,255,.045);
  font-variant-numeric:tabular-nums;white-space:nowrap;vertical-align:middle}
.ptable tbody tr:last-child td{border-bottom:0}
.ptable tbody tr:hover{background:rgba(255,255,255,.035)}
.crown{vertical-align:middle}
.crown.c1{fill:#ffc24d} .crown.c2{fill:#c9d1d9} .crown.c3{fill:#cd7f32}
.ppair{display:flex;align-items:center;gap:10px;color:inherit}
.ppair span{display:flex;flex-direction:column;line-height:1.25;min-width:0}
.ppair b{font-size:13px}
.ppair small{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.03em}
.pprice{display:block}
.ptable td.r small{display:block;font-size:11px}
.pspark{width:70px;padding:0 6px!important}
/* ⛔ .spark is position:absolute for the card layout it was written for. Dropped into a table cell
   it escapes to the page and parks itself at the top-right corner, nowhere near its row. */
.pspark .spark{position:static;width:64px;height:26px;display:block;opacity:1}
.ptable .btn.trade{padding:5px 14px;font-size:12px;border-color:rgba(34,197,94,.45);color:var(--ember)}
.ptable .btn.trade:hover{background:rgba(34,197,94,.14)}

.ptotals{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(210px,100%),1fr));gap:10px;margin-top:14px}
.ptile{display:flex;flex-direction:column;gap:3px;padding:14px 16px;border-radius:14px;
  border:1px solid var(--line);background:linear-gradient(160deg,rgba(34,197,94,.07),transparent 70%)}
.ptile .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted)}
.ptile b{font-size:22px;font-variant-numeric:tabular-nums}
.ptile small{color:var(--muted);font-size:11px}

@media(max-width:720px){
  .pairspage h1{font-size:27px}
  .ptabs{gap:6px}
  .ptabs button{padding:8px 12px;font-size:12px}
  .psearch{margin-left:0;width:100%;min-width:0}
  .ptile b{font-size:19px}
}

/* ---------- leaderboard: movement, and your own row
   The boards refresh themselves, so the reader needs to see WHAT changed without diffing two
   screenshots in their head. Rank movement is a chip; a row that moved flashes once; your own row
   is tinted wherever it sits. Nothing here invents a signal — every chip is a real change in a real
   position since this browser last looked. */
.lbpanel{overflow:hidden}
.lbhead{display:flex;align-items:flex-start;gap:12px;padding:16px 16px 6px}
.lbhead h3{margin:0}
.lbhead .btn{margin-left:auto;flex-shrink:0}
.lbtable td.num{width:34px;text-align:center}
.lbtable td.mvcell{width:46px;padding-left:0}
.lbc{display:inline-grid;place-items:center;width:21px;height:21px;border-radius:7px;
  font-size:11.5px;font-weight:700;color:#07140c}
.lbc.c1{background:#ffc24d} .lbc.c2{background:#c9d1d9} .lbc.c3{background:#cd7f32}
.mv{font-size:10.5px;font-weight:700;font-variant-numeric:tabular-nums}
.mv.up{color:var(--ember)} .mv.down{color:#ff4d6d} .mv.flat{color:#4b5563}
.mv.new{color:var(--gold);font-size:9px;letter-spacing:.06em}
.lbtable tr.mine{background:rgba(34,197,94,.10);box-shadow:inset 2px 0 0 var(--ember)}
.lbtable tr.moved{animation:lbmove 1.6s ease-out 1}
.lbtable tr.tookover{animation:lbtop 2.4s ease-out 1}
@keyframes lbmove{0%{background:rgba(255,194,77,.16)}100%{background:transparent}}
@keyframes lbtop{0%{background:rgba(255,194,77,.34)}60%{background:rgba(255,194,77,.12)}100%{background:transparent}}

/* "You are #12 of 840 — 253 pts to #11". The only number on the page that is about the reader. */
.youare{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:4px 0 16px;padding:12px 16px;
  border-radius:14px;border:1px solid rgba(34,197,94,.3);
  background:linear-gradient(90deg,rgba(34,197,94,.12),transparent 70%)}
.youare .l{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted)}
.youare b{font-size:24px;font-variant-numeric:tabular-nums}
.youare .pts{margin-left:auto;color:var(--gold);font-variant-numeric:tabular-nums}
.youare .chase{font-size:12px;color:var(--muted)}
.youare .chase.top{color:var(--ember)}
@media(max-width:620px){
  .youare .pts{margin-left:0}
  .lbtable td.mvcell{width:38px}
}
@media (prefers-reduced-motion:reduce){.lbtable tr.moved,.lbtable tr.tookover{animation:none}}
/* Your pinned row sits under a hairline so it never reads as the eleventh place. */
.lbtable tr.pinned td{border-top:1px dashed rgba(255,255,255,.14)}
.lbtable tr.pinned .mv.flat{color:var(--ember);font-size:9px;letter-spacing:.06em;text-transform:uppercase}
/* On a phone a six-column board is wider than the card. The figures are the point, so the name
   truncates first and the card pans as a last resort — losing a column would lose the number
   somebody opened the board to read. */
.lbscroll{overflow-x:auto;scrollbar-width:none}
.lbscroll::-webkit-scrollbar{display:none}
.lbtable .row span{min-width:0}
.lbtable .row b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;max-width:150px;vertical-align:bottom}
@media(max-width:620px){
  .lbtable .row b{max-width:92px}
  .lbtable .row .muted{display:none}   /* the ticker repeats what the name already says */
  .lbtable td{padding-left:8px;padding-right:8px}
}
/* The badge is flavour; the points are the number. On a phone the flavour goes. */
@media(max-width:620px){ .lbtable td.lbmin{display:none} }

/* ---------- the icon set
   Replaces every emoji on the site. Sized in em so one icon works beside 11px chip text and inside
   a 30px heading without a per-use override — the thing that keeps a set from drifting back into a
   pile of one-offs. Optical alignment is -0.12em: a 24-grid glyph centred on its own box sits
   slightly high against a Latin baseline, and every icon here is off by the same amount, so it is
   corrected once. */
.ic{width:1.05em;height:1.05em;display:inline-block;vertical-align:-0.16em;flex-shrink:0}
h1 .ic,h2 .ic,h3 .ic{vertical-align:-0.12em;margin-right:.12em}
.chip .ic,.bs-tag .ic,.tabs .ic{width:1em;height:1em;vertical-align:-0.14em;margin-right:.3em}
.btn .ic{margin-right:.35em}
/* Where an icon carries meaning rather than decoration, it takes the colour of the thing it means. */
.ic-gold{color:var(--gold)} .ic-ember{color:var(--ember)} .ic-warn{color:#ff4d6d}
.ic-lg{width:1.5em;height:1.5em}


/* The two glyphs CSS paints itself, as data URIs from the same drawings as the icon set — a
   background-image rather than content:"emoji", which rendered as whatever the OS felt like at a
   size nothing could control. Single quotes inside, because the url() wrapper takes the doubles. */
:root{
  --ic-crown: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2322c55e' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.4 8.2 6.9 12l3.4-5.6a2 2 0 0 1 3.4 0L17.1 12l3.5-3.8 1 10a1.4 1.4 0 0 1-1.4 1.5H3.8a1.4 1.4 0 0 1-1.4-1.5z'/%3E%3Cpath d='M3.1 16.6h17.8'/%3E%3C/svg%3E");
  --ic-rex: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2322c55e' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.2 14.6c0-3.6 2.6-6.6 6.1-7.3l1.6-.3 1-1.6a.7.7 0 0 1 1.3.3V7l2.2.7c1.8.6 3 2.2 3 4.1v1.4l1.6 1.2-1.9.6-.6 2.1a3 3 0 0 1-2.9 2.1H8.4a4.2 4.2 0 0 1-4.2-4.2z'/%3E%3Ccircle cx='15.4' cy='11.6' r='1.05' fill='%2322c55e'/%3E%3C/svg%3E");
}
/* The brand mark is artwork, not a glyph — it keeps its own colour where every other icon inherits. */
.ic-brand{object-fit:contain;border-radius:2px}

/* ---------- effects
   Pulses, flashes and the live-number treatment. Every rule here has a reduced-motion counterpart
   that keeps the INFORMATION and drops the movement — the person who set that flag still needs to
   know their rank changed, they just must not have it thrown across the screen. */
.fx-canvas{position:fixed;inset:0;pointer-events:none;z-index:95}
.fx-pulse{position:fixed;width:12px;height:12px;margin:-6px 0 0 -6px;border-radius:50%;
  border:2px solid var(--ember);pointer-events:none;z-index:94;animation:fxpulse .85s ease-out forwards}
.fx-pulse.gold{border-color:var(--gold)}
@keyframes fxpulse{0%{transform:scale(1);opacity:.9}100%{transform:scale(13);opacity:0}}
.fx-flash{animation:fxflash 1.5s ease-out 1}
@keyframes fxflash{0%{background:rgba(255,194,77,.22)}100%{background:transparent}}
/* A number that just changed gets a brief lift — the eye goes to the thing that moved. */
.fx-live{transition:color .25s,transform .25s}
.fx-live.up{color:var(--ember);transform:translateY(-1px)}
.fx-live.down{color:#ff4d6d;transform:translateY(1px)}
@media (prefers-reduced-motion:reduce){
  .fx-pulse{animation:none;opacity:0}
  .fx-flash{animation:none}
  .fx-live{transition:none;transform:none}
}

/* ---------- the flywheel
   The site's pitch, drawn. Four live figures on a ring with a dot travelling each arc, so the loop
   the copy describes is something a reader can actually watch turn. SVG rather than canvas because
   the labels have to stay legible from 320px to 900px and text in a canvas does not scale, select
   or translate. */
.fwrap{display:grid;grid-template-columns:1fr minmax(300px,420px);gap:34px;align-items:center;
  margin-top:26px;padding:26px 28px;border:1px solid var(--line);border-radius:22px;
  background:radial-gradient(120% 100% at 100% 50%,rgba(34,197,94,.09),transparent 60%)}
.fwtext h2{font-size:30px;margin:10px 0 10px;letter-spacing:-.01em}
.fwtext p{font-size:14px;line-height:1.65;max-width:52ch}
.fwtext .btn{margin-top:16px}
.fwheel{width:100%;height:auto;display:block;overflow:visible}
.fw-ring{fill:none;stroke:rgba(255,255,255,.07);stroke-width:1.5}
.fw-arc{fill:none;stroke:rgba(34,197,94,.42);stroke-width:2;stroke-linecap:round}
.fw-hub{fill:#0b0d12;stroke:var(--ember);stroke-width:2}
.fw-dot{fill:var(--gold);filter:drop-shadow(0 0 6px rgba(255,194,77,.85))}
.fw-v{fill:var(--text);font:700 15px/1 'JetBrains Mono',ui-monospace,monospace}
.fw-l{fill:var(--ember);font:600 11px/1 Inter,system-ui,sans-serif;letter-spacing:.02em}
.fw-s{fill:var(--muted);font:500 10px/1 Inter,system-ui,sans-serif}
/* ⛔ THESE TWO USED `var(--fg)`, WHICH THIS STYLESHEET NEVER DEFINES — 13 declarations did.
   An undefined custom property makes the declaration invalid at computed-value time, which for an
   INHERITED property means `inherit`. In HTML that is survivable: `color` inherits something
   sensible from an ancestor, so those sites merely looked fine by accident. In SVG it is fatal,
   because `fill` inherits from the <svg>, whose initial value is BLACK — so the wordmark in the
   middle of the flywheel rendered black on a black wheel and simply was not there. Elio reported it
   as "REX black font is not visible". The variable is `--text`. */
.fw-mid{fill:var(--text);font:700 20px/1 'Clash Display',Inter,sans-serif;letter-spacing:.04em}
.fw-mids{fill:var(--muted);font:600 10px/1 Inter,sans-serif;letter-spacing:.22em}
@media(max-width:860px){
  .fwrap{grid-template-columns:1fr;gap:18px;padding:22px 18px}
  .fwtext h2{font-size:24px}
  .fwheel{max-width:360px;margin:0 auto}
}
/* The dots are the only moving part; without them the wheel is still a correct diagram. */
@media (prefers-reduced-motion:reduce){ .fw-dot{display:none} }

/* ---------- the header must never clip its own actions
   ⛔ REPORTED BY A USER ON A PC: "the connect wallet option is out of the screen". Reproduced at
   1280px, where #nav wanted 1581px of content and had 1280. #nav is `overflow:hidden` with
   `white-space:nowrap`, so whatever does not fit is silently cut off the right edge — and .right is
   LAST in source order, which made "Launch a coin" and "Connect wallet" the first two things to
   disappear. A visitor who cannot reach the connect button cannot use the site at all, so this is
   not a polish bug.

   The cause was a slow squeeze and then one link too many: the row carries ten items, and adding
   Pairs to it today was what finally pushed a header that had been fitting by a few pixels.

   The fix is an order of sacrifice, so no width can ever take the actions again:
     .right   never shrinks and is always last to give — it holds the only two things a visitor
              MUST be able to press.
     .search  shrinks first; a narrower search box still works.
     .links   absorbs what is left and scrolls inside itself, so every destination stays reachable
              rather than a few being dropped at an arbitrary width. Below 1100px it hides entirely
              and the bottom tab bar takes over, which is unchanged. */
#nav .links{flex:1 1 auto;min-width:0;overflow-x:auto;overscroll-behavior-x:contain;
  scrollbar-width:none;-ms-overflow-style:none}
#nav .links::-webkit-scrollbar{display:none}
/* The fade is applied only when there IS more to see — a permanent one would dim the last link at
   full width, which is a worse lie than no affordance at all. */
#nav .links.scrolls{mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent);
  -webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 26px),transparent)}
/* The shrink FACTOR is what makes the priority real, not just the order of the rules. Flexbox
   distributes a squeeze in proportion to factor x basis, so a plain `flex:0 1` on both meant the
   links gave up as much as the search did and Leaderboard fell off the end at 1280px.

   A factor of 20 got the links down to an 11px loss — still a clipped word, because flexbox splits
   a squeeze in proportion whether or not an item has room left to give. 200 makes the search's
   share ~99.3%, so it gives everything down to its min-width before the links lose a pixel.

   The links stay SHRINKABLE on purpose: once the search bottoms out they absorb the rest and
   scroll, which is the fallback that keeps the actions safe at any width. Making the links rigid
   would hand the overflow straight back to .right, which is the bug this all started with. */
#nav .search{flex:0 200 320px;min-width:104px}
#nav .right{flex:0 0 auto;margin-left:0}
/* Between 1100 and ~1260 the search hits its floor and the links start paying, which clipped
   "Leaderboard". The next thing to give is the payout countdown: it is a nice ambient detail, not a
   destination, and the same number is on the rewards page. Dropping it there returns ~110px, which
   is the whole shortfall. The language switch stays — it is the only way to change language. */
@media (max-width:1260px){ #nav .epoch-chip{display:none} }
/* Below ~1160 even a floored search is not enough and "Leaderboard" was still losing its tail. The
   next thing to give is the wordmark beside the logo: the mark alone identifies the site, it is
   already how the header behaves on a phone, and it returns ~90px — more than the shortfall. */
@media (max-width:1160px){ #nav .brand .word{display:none} }
/* The quiet state: one honest sentence instead of a row of zeros that reads as a fault. */
.stat.quiet .v{font-size:26px}
.stat.quiet .s{max-width:68ch;line-height:1.55}
/* Two fields side by side: one carries a hint in its label ("Dev buy · optional"), the other does
   not. Below 560px the label stacks onto two lines, so the field WITH a hint pushed its input a
   line lower than the field without — Ale drew a red line across the two boxes to show it. Giving
   every label in a paired row the height of two lines lands both inputs on the same baseline. */
@media (max-width:560px){
  /* display:contents drops the .field box out of the layout so its label, input and hint become
     items of the .two grid itself — which means the labels share one row and the inputs share the
     next, and they line up no matter how many lines a label wraps to. A min-height guess only works
     until a label wraps to three lines; this cannot drift. :has() keeps it to rows that actually
     hold fields, since .two is used for plain panels elsewhere. */
  .two:has(> .field){grid-template-rows:auto auto auto;row-gap:6px;align-items:start}
  .two:has(> .field) > .field{display:contents}
  .two:has(> .field) > .field > label{grid-row:1}
  .two:has(> .field) > .field > input,
  .two:has(> .field) > .field > textarea,
  .two:has(> .field) > .field > select{grid-row:2}
  .two:has(> .field) > .field > .hint{grid-row:3}
}

/* ---- Affiliate tree, feedback box and the admin panel (Elio, 5 Oct) --------------------------- */
/* Each level is indented by its depth, capped at 4 so a deep tree cannot walk off a phone screen —
   the indent is a hint about shape, and a row nobody can read is worse than a flat one. */
.treelvl{margin-top:14px}
.treelvl:first-child{margin-top:0}
.treelvl-h{display:flex;gap:10px;align-items:baseline;margin-bottom:6px}
.tdepth{font-size:11px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:#ffb347}
.trow{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr) auto auto;gap:10px;align-items:center;
  padding:8px 10px;border-radius:10px;background:var(--surface);border:1px solid var(--line);
  /* ⛔ --d IS DECLARED HERE, not only set inline. A custom property that exists only in a style
     attribute is undefined for any row that does not carry one, and an undefined property makes the
     whole declaration invalid at computed-value time — the margin is then dropped silently rather
     than falling back. The fallback in var() covers the value; declaring it covers the property. */
  --d:0;
  margin:5px 0 5px calc(var(--d) * 16px);font-size:13px}
.trow .w{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.trow .dim{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width:620px){
  /* The indent and the "brought by" column are the first things to go: on a phone the name and the
     number are the content, and four columns at 320px is the squeezed card all over again. */
  .trow{grid-template-columns:minmax(0,1fr) auto;margin-left:0;gap:6px}
  .trow .dim{display:none}
}

.fb h3{display:flex;align-items:center;gap:8px;margin:0 0 14px;font-size:18px}
.fbtabs{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;margin-bottom:12px}
.fbtabs button{padding:9px 6px;border-radius:10px;border:1px solid var(--line);background:var(--surface);
  color:var(--muted);font-size:13px;font-weight:600;cursor:pointer}
.fbtabs button.on{border-color:rgba(45,212,110,.5);background:rgba(45,212,110,.1);color:var(--text)}
.fbstars{display:flex;gap:6px;margin-bottom:12px}
.fbstars button{width:40px;height:40px;border-radius:10px;border:1px solid var(--line);background:var(--surface);
  color:var(--dim);cursor:pointer;display:grid;place-items:center}
.fbstars button.on{color:#ffc24d;border-color:rgba(255,194,77,.5);background:rgba(255,194,77,.12)}
.fb textarea{width:100%;min-height:96px;resize:vertical}
/* A plain link in the footer, not a button that looks like an action bar item. */
.flink{background:none;border:0;padding:0;color:inherit;font:inherit;cursor:pointer;text-decoration:underline}
.flink:hover{color:var(--text)}
/* The top-up button sits inside the opening-buy hint, so it has to read as an action without
   becoming the loudest thing in a form whose primary action is Launch. */
.btn.sm.topup{margin-left:8px;vertical-align:baseline;border-color:rgba(45,212,110,.45);color:var(--text)}
.btn.sm.topup:hover{background:rgba(45,212,110,.12)}

/* ---------- recent buys feed (home) -------------------------------------------------------- */
/* A LIST, not a tape. The tape at the top of the page is a strip you read in passing; this answers
   "is anything being bought right now, and by whom" — so every row is the same shape, the sizes are
   all in one currency and they line up in a column you can actually compare down. */
.buysfeed{margin:28px 0 0}
.bf-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 12px}
.bf-head h2{display:flex;align-items:center;gap:10px;margin:0;font-family:var(--fd);font-size:20px}
.bf-head h2 .live-dot{width:8px;height:8px;border-radius:50%;background:var(--up);box-shadow:0 0 12px var(--up);animation:pulse 1.6s infinite}
.bf-list{border:1px solid var(--line);border-radius:var(--r);background:var(--panel);overflow:hidden}
/* Grid, not flex: the whole point of a feed over a tape is that column four lines up with column
   four of every other row, which flex-with-margins cannot promise once a ticker runs long. */
.bf-row{display:grid;grid-template-columns:22px minmax(58px,auto) minmax(0,1fr) auto auto;align-items:center;gap:10px;
  padding:9px 14px;border-top:1px solid var(--line);transition:background .14s}
.bf-row:first-child{border-top:0}
.bf-row:hover{background:var(--surface)}
.bf-sym{font-family:var(--fm);font-weight:600;font-size:13px}
.bf-buyer{display:flex;align-items:center;gap:7px;min-width:0}
.bf-who{color:var(--muted);font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bf-tag{flex:none;font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--lime);
  border:1px solid rgba(157,255,143,.34);background:rgba(34,197,94,.1);border-radius:999px;padding:2px 7px;white-space:nowrap}
.bf-size{font-family:var(--fm);font-variant-numeric:tabular-nums;color:var(--up);font-weight:600;text-align:right;white-space:nowrap}
.bf-ago{color:var(--dim);font-size:11.5px;font-variant-numeric:tabular-nums;text-align:right;min-width:42px;white-space:nowrap}
/* A first-ever buy is the one fact here the tape can never carry, so it gets a mark in the margin
   as well as the badge — the badge is the first thing to go when the row runs out of width. */
.bf-tag:empty{border:0;background:none;padding:0}
.bf-row.is-new{box-shadow:inset 2px 0 0 var(--lime)}
/* ⛔ THE BADGE IS THE FIRST THING TO DROP ON A PHONE, not the size or the time. Five columns do not
   fit in 360px, and of the five the badge is the only one whose information is also carried by the
   margin stripe above — dropping a figure would leave a row that says nothing. */
@media (max-width:560px){
  .bf-row{grid-template-columns:20px minmax(52px,auto) minmax(0,1fr) auto auto;gap:8px;padding:8px 11px}
  .bf-tag{display:none}
}

/* ---------- a warning you cannot read past -------------------------------------------------- */
/* Used where a choice is PERMANENT. A transfer hook cannot be removed from a mint afterwards, so
   the consequence belongs in the flow of the form at full contrast, not in a tooltip or a dim hint
   under it — the two places a launcher in a hurry will not look. */
.warn{display:flex;gap:10px;align-items:flex-start;padding:11px 13px;border-radius:var(--rs);
  border:1px solid rgba(255,196,77,.34);background:rgba(255,196,77,.08);color:var(--text);font-size:12.5px;line-height:1.5}
.warn svg{flex:none;width:16px;height:16px;margin-top:1px;color:var(--gp)}
.warn b{color:var(--gp)}

/* ---------- the transfer-rule picker ------------------------------------------------------- */
/* ⛔ THIS WAS BUILT ON `.opts` AND `.opts button` IS `height:40px`. That grid is for short chips —
   "Off", "0.5%", "Diamond Hands" — and a rule needs a sentence to be understood at all, so every
   button overflowed its own box and the labels landed on top of each other. MiKOL screenshotted it
   on a phone: "Rising max per wallet" written through "Blocklist", "Sniper-fee cap" through "Buyer
   rewards". Patching .opts would have dragged every other picker along with it, so the rules get
   the component the content actually needs.

   It is a RADIO LIST, not a chip grid, because that is what the choice is: one option, permanent,
   and consequential enough to deserve room to explain itself. One per row on a phone; two columns
   once there is width for them. No fixed heights anywhere — the text decides. */
.rulepick{display:grid;grid-template-columns:1fr;gap:8px}
.rulepick button{display:flex;align-items:flex-start;gap:11px;width:100%;text-align:left;
  padding:13px 14px;border:1px solid var(--line);border-radius:var(--rs);background:var(--surface);
  color:var(--muted);transition:border-color .15s,background .15s;cursor:pointer}
.rulepick button:hover:not(.blocked){border-color:var(--line2);background:var(--surface2)}
.rulepick button.on{border-color:rgba(157,255,143,.5);background:rgba(34,197,94,.09);color:var(--text)}
/* The dot carries the single-select meaning that a chip grid leaves to colour alone. */
.rp-dot{flex:none;width:15px;height:15px;margin-top:2px;border-radius:50%;border:1.5px solid var(--line2);transition:.15s}
.rulepick button.on .rp-dot{border-color:var(--lime);box-shadow:inset 0 0 0 3.5px var(--bg),inset 0 0 0 9px var(--lime)}
.rp-body{display:flex;flex-direction:column;gap:3px;min-width:0}
.rp-body b{display:flex;align-items:center;gap:7px;flex-wrap:wrap;font-size:13.5px;font-weight:600;color:var(--text)}
.rulepick button.blocked .rp-body b{color:var(--muted)}
/* The blurb is the whole point of the component, so it gets real line-height and may wrap freely. */
.rp-body small{font-size:12px;line-height:1.5;color:var(--muted);font-weight:400}
.rulepick button.blocked{opacity:.5;cursor:not-allowed}
.rulepick button.blocked .rp-body small{color:var(--down)}
.rp-tag{font-style:normal;font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--gp);
  border:1px solid rgba(255,194,77,.34);background:rgba(255,194,77,.1);border-radius:999px;padding:2px 7px;white-space:nowrap}
/* The detail of whatever is selected, attached to the list rather than floating under it. */
.rp-detail{margin-top:10px;padding:12px 14px;border:1px solid var(--line);border-left:2px solid var(--lime);
  border-radius:var(--rs);background:var(--surface);font-size:12.5px;line-height:1.55;color:var(--muted)}
.rp-detail p{margin:0 0 7px}
.rp-detail p:last-child{margin-bottom:0}
.rp-fund b{color:var(--gp)}
.rp-prog{font-size:11px;color:var(--dim)}
.rp-prog .mono{overflow-wrap:anywhere}
@media (min-width:720px){ .rulepick{grid-template-columns:1fr 1fr} }

/* ---------- the tier + downline strip on /points -------------------------------------------- */
/* The two figures that turn a scoreboard into a flywheel: what your tier multiplies everything by,
   and what the people you invited are earning you while you do nothing. A rank alone tells somebody
   where they stand; these tell them what to do next. */
.ptier{margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.pt-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.pt-badge{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:3px 9px;border-radius:999px;border:1px solid}
.pt-bronze{color:#c88a52;border-color:rgba(200,138,82,.45);background:rgba(200,138,82,.12)}
.pt-silver{color:#cbd5e1;border-color:rgba(203,213,225,.4);background:rgba(203,213,225,.1)}
.pt-gold{color:var(--gp);border-color:rgba(255,194,77,.45);background:rgba(255,194,77,.12)}
.pt-diamond{color:var(--lime);border-color:rgba(157,255,143,.5);background:rgba(34,197,94,.14)}
.pt-mult{font-size:12.5px;font-weight:600;color:var(--text)}
.pt-next{margin-left:auto;font-size:11.5px;color:var(--dim);white-space:nowrap}
.pt-down{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:9px;font-size:12px;color:var(--muted)}
.pt-down b{color:var(--lime)}
.pt-down .btn{margin-left:auto}
@media (max-width:560px){ .pt-next{margin-left:0;width:100%} .pt-down .btn{margin-left:0} }
/* The routing warning. A rule that only trades through Hooked makes a coin nobody can sell on this
   pad, and that is permanent once minted — so it is red, on the button, not in a footnote. */
.rp-tag.rp-warn{color:var(--down);border-color:rgba(255,84,112,.4);background:rgba(255,84,112,.1)}
.rp-route{color:var(--down)}
.rp-route b{color:var(--down)}

/* Where a holding actually lives, said once above the table instead of left to be guessed. */
.custody{display:flex;gap:10px;align-items:flex-start;margin:0 0 10px;padding:11px 13px;border-radius:12px;
  background:color-mix(in srgb,var(--gold) 8%,transparent);border:1px solid color-mix(in srgb,var(--gold) 26%,transparent);
  font-size:12.5px;line-height:1.5;color:var(--text)}
.custody svg,.custody .ic{flex:0 0 auto;margin-top:1px;opacity:.9}
.custody b{color:var(--gold)}
.nowrap{white-space:nowrap}
.tbl td.nowrap .btn{vertical-align:middle}
@media (max-width:760px){.custody{font-size:12px}}
/* The cost of an exotic pair, said in the launch form rather than discovered on fomo. */
.reach{display:flex;gap:9px;align-items:flex-start;margin:10px 0 0;padding:10px 12px;border-radius:12px;
  background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);
  font-size:12px;line-height:1.5;color:var(--muted)}
.reach svg,.reach .ic{flex:0 0 auto;margin-top:1px;opacity:.75}
.reach b{color:var(--text)}
/* Post & earn — paste a link to a post, earn points for it. */
.shareboost{margin-top:14px}
.shareboost h2{font-size:17px;display:flex;align-items:center;gap:7px;margin:0}
.shareboost .muted{margin-top:5px;font-size:12.5px;line-height:1.5}
.sb-in{display:flex;gap:8px;margin-top:12px}
.sb-in input{flex:1;min-width:0;height:38px;padding:0 13px;border-radius:10px;border:1px solid rgba(255,255,255,.14);
  background:rgba(255,255,255,.04);color:var(--text);font-size:13.5px}
.sb-in input:focus{outline:none;border-color:color-mix(in srgb,var(--ember) 55%,transparent)}
.sb-in .btn{flex:0 0 auto;height:38px}
.sb-note{margin-top:8px;font-size:11.5px;color:var(--dim)}
.sb-list{margin-top:12px;border-top:1px solid rgba(255,255,255,.08)}
.sb-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid rgba(255,255,255,.06);font-size:12.5px}
.sb-row a{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.sb-when{color:var(--dim);font-size:11.5px;white-space:nowrap}
.sb-st{white-space:nowrap;font-weight:600;font-size:11.5px}
.sb-approved .sb-st{color:var(--gold)}
.sb-pending .sb-st{color:var(--muted)}
.sb-rejected .sb-st{color:var(--down)}
@media (max-width:620px){.sb-in{flex-wrap:wrap}.sb-in input{width:100%;flex:1 1 100%}.sb-in .btn{width:100%}}
/* Callouts — a public call on a coin, with the entry it was called at. */
.colist{margin-top:10px;display:flex;flex-direction:column;gap:8px}
.co{padding:9px 11px;border-radius:11px;background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.07)}
.co-top{display:flex;align-items:center;gap:8px;font-size:12.5px}
.co-top .dim{font-size:11.5px}
.co-x{margin-left:auto;font-weight:700;font-variant-numeric:tabular-nums}
.co-t{margin-top:5px;font-size:13px;line-height:1.5}
.co-b{margin-top:5px;font-size:11.5px;color:var(--dim)}
.co-b a{color:var(--muted)}
/* The caller board. */
.cb-x{font-variant-numeric:tabular-nums;font-weight:700}
/* Email sign-in, offered only where Privy is configured. */
.pvy{margin-top:14px;padding-top:14px;border-top:1px solid rgba(255,255,255,.1)}
.pvy-or{display:flex;align-items:center;gap:10px;margin-bottom:10px;color:var(--dim);font-size:11.5px}
.pvy-or::before,.pvy-or::after{content:'';flex:1;height:1px;background:rgba(255,255,255,.1)}
.pvy .sb-in{margin-top:8px}
/* Rule settings — every rule's own parameters, asked for before the coin is minted. */
.rp-fam{grid-column:1/-1;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--dim);margin:12px 0 2px;padding-left:2px}
.rp-fam:first-child{margin-top:0}
.rp-fields{display:flex;flex-direction:column;gap:14px;margin-bottom:12px}
.rp-field{display:flex;flex-direction:column;gap:5px}
.rp-flab{display:flex;align-items:baseline;justify-content:space-between;gap:10px;font-size:13px}
.rp-fval{font-variant-numeric:tabular-nums;color:var(--gold);white-space:nowrap}
.rp-fhelp{font-size:11.5px;color:var(--dim);line-height:1.45}
.rp-slider{display:flex;align-items:center;gap:10px}
.rp-slider input[type=range]{flex:1;min-width:0;accent-color:var(--ember)}
.rp-num{width:92px;flex:0 0 auto;height:30px;padding:0 8px;border-radius:8px;border:1px solid rgba(255,255,255,.14);
  background:rgba(255,255,255,.04);color:var(--text);font-size:12.5px;font-variant-numeric:tabular-nums}
.rp-field .in input{width:100%;height:32px;padding:0 10px;border-radius:8px;border:1px solid rgba(255,255,255,.14);
  background:rgba(255,255,255,.04);color:var(--text);font-size:12.5px}
.rp-opts{display:flex;gap:6px;flex-wrap:wrap}
.rp-opts button{min-height:30px;padding:0 12px;font-size:12.5px;border-radius:8px}
.rp-sum{margin-top:10px;padding:10px 12px;border-radius:10px;background:color-mix(in srgb,var(--ember) 8%,transparent);
  border:1px solid color-mix(in srgb,var(--ember) 24%,transparent);font-size:12.5px;line-height:1.55;color:var(--text)}
.rp-sum.bad{background:color-mix(in srgb,var(--down) 10%,transparent);border-color:color-mix(in srgb,var(--down) 32%,transparent)}
@media (max-width:620px){.rp-num{width:76px}.rp-slider{gap:7px}}
