/* ==========================================================================
   v4 — "CINEMA"
   ==========================================================================
   COS'E'.

   Un livello di REGIA sopra v2/v3. Non ridisegna le schermate — quelle
   funzionano — ma cambia il modo in cui sono illuminate.

   Il sito, prima di questo foglio, era corretto e piatto: superfici grigie
   su fondo nero, bordi a un pixel, nessuna profondita'. Legge bene, ma non
   dice niente su chi l'ha fatto. Un launchpad che tiene i soldi della gente
   deve sembrare costato qualcosa.

   LE QUATTRO LEVE, in ordine di quanto si vedono:

   1. LUCE. Un fondo che non e' piu' una tinta ma uno spazio: alone caldo in
      alto (la sorgente), vignetta che chiude in basso, grana di pellicola
      sopra tutto. La grana e' la cosa che, da sola, toglie il "fatto col
      CSS" da un'interfaccia scura.
   2. MATERIA. Ogni pannello prende un bordo a GRADIENTE — chiaro dove la
      luce lo colpisce, spento sotto — piu' un filo interno di luce e
      un'ombra vera. E' quello che fa leggere una card come un oggetto
      appoggiato invece che come un rettangolo dipinto.
   3. FUOCO. Il puntatore porta con se' un alone: la superficie sotto il
      mouse si accende nel colore della chain. Costa due variabili aggiornate
      da v4.js dentro un rAF, e nient'altro.
   4. TEMPO. Niente compare di colpo: le sezioni salgono di 14px quando
      entrano nello schermo, le cifre contano, i bottoni hanno un riflesso
      che passa. Una sola curva, una sola durata di base.

   COSA NON FA, di proposito:
   - non tocca le misure. Nessun padding, nessuna colonna, nessun font-size
     dei dati cambia: le schermate dense restano dense. Aggiunge ombre,
     gradienti, transizioni — proprieta' che non spostano niente.
   - non colora i dati. Verde = compra, rosso = vendi, accento = chain:
     valgono le regole di v2 e non le tocco.
   - non usa !important se non dove v3 spegne esplicitamente qualcosa che
     qui deve tornare (sono cinque righe, tutte marcate).

   ORDINE: va caricato PER ULTIMO. A parita' di specificita' vince l'ordine
   di cascata, ed e' cosi' che questo foglio riaccende cio' che v3 aveva
   spento sulla home senza dover salire di specificita' ovunque.
   ========================================================================== */

/* ==========================================================================
   1. TOKEN
   ==========================================================================
   Tutto quello che segue legge da qui. --green-rgb e' l'accento della chain
   attiva ed e' gia' definito da index.html: v4 non ridichiara nessun colore
   di marca, si limita a comporne le sfumature.
   ========================================================================== */
:root{
  --v4-ease:cubic-bezier(.22,1,.36,1);
  --v4-ease-soft:cubic-bezier(.16,1,.3,1);
  --v4-t:.42s;          /* durata di base: tutto il resto e' una frazione o un multiplo */
  --v4-t-fast:.22s;

  /* Bordi. Il "hi" e' il lato illuminato, il "lo" quello in ombra: sono i
     due estremi del gradiente che disegna il contorno dei pannelli. */
  --v4-edge-hi:rgba(255,255,255,.14);
  --v4-edge-lo:rgba(255,255,255,.035);
  --v4-edge-accent:rgba(var(--green-rgb),.38);

  /* Vetro. Due fermate in piu' rispetto a --v2-glass: la seconda tiene il
     mezzotono, senza la superficie sbiadisce subito sotto il bordo. */
  --v4-glass:linear-gradient(176deg,
    rgba(255,255,255,.062) 0%,
    rgba(255,255,255,.022) 18%,
    rgba(255,255,255,.008) 46%,
    rgba(255,255,255,0) 100%);
  --v4-glass-soft:linear-gradient(176deg,
    rgba(255,255,255,.04) 0%,
    rgba(255,255,255,.012) 24%,
    rgba(255,255,255,0) 100%);

  /* Ombre. Tre livelli, la terza ha la caduta lunga che serve a far
     galleggiare i pannelli grandi. */
  --v4-lift-1:0 1px 2px rgba(0,0,0,.5), 0 6px 16px -10px rgba(0,0,0,.8);
  --v4-lift-2:0 2px 6px rgba(0,0,0,.45), 0 18px 40px -22px rgba(0,0,0,.9);
  --v4-lift-3:0 4px 12px rgba(0,0,0,.5), 0 40px 80px -34px rgba(0,0,0,1);
  --v4-inner:inset 0 1px 0 rgba(255,255,255,.075);

  --v4-glow-sm:0 0 0 1px rgba(var(--green-rgb),.14), 0 8px 26px -12px rgba(var(--green-rgb),.5);
  --v4-glow-md:0 10px 40px -14px rgba(var(--green-rgb),.62);

  --v4-r-xl:20px;
  --v4-r-lg:16px;
  --v4-r-md:12px;
  --v4-r-sm:9px;

  /* Posizione del puntatore dentro l'elemento illuminato. v4.js le riscrive;
     il ripiego mette l'alone al centro, cosi' senza JS non si vede niente di
     sbagliato — si vede solo meno. */
  --v4-mx:50%;
  --v4-my:0%;
}

/* ==========================================================================
   2. LO SPAZIO
   ==========================================================================
   Tre strati fissi dietro tutto, in quest'ordine dal fondo:
     a. l'alone della sorgente in alto + la vignetta in basso  (body::before)
     b. la grana                                              (.v4-grain)
     c. il contenuto
   Nessuno dei tre intercetta il puntatore e nessuno anima proprieta' che
   costringano a ridisegnare: la grana e' una texture statica, l'alone e' un
   gradiente fermo.
   ========================================================================== */

/* v2 usa gia' body::before per la griglia e body::after per la vignetta. Qui
   NON li tocco: aggiungo uno strato mio, in un elemento vero creato da v4.js,
   cosi' i due sistemi non si contendono lo stesso pseudo-elemento. */
.v4-stage{
  position:fixed;inset:0;z-index:0;pointer-events:none;
  contain:strict;
}
.v4-stage::before{
  /* LA SORGENTE. Un'ellisse larga in alto, nel colore della chain, con una
     seconda fermata quasi neutra: senza quella il colore resta appiccicato
     al bordo superiore invece di diffondersi.
     Le alfe sono scese di circa il quaranta per cento. Sommate all'aurora di
     v2 e al campo stellato facevano un fondo che si guardava da solo: passando
     dall'ingresso all'applicazione sembrava di cambiare sito, perche' li' il
     fondo e' quasi fermo e qui era acceso. Ora la sorgente si vede ancora,
     ma sta dietro il contenuto invece che accanto. */
  content:"";position:absolute;inset:0;
  background:
    radial-gradient(120% 62% at 50% -12%,
      rgba(var(--green-rgb),.085) 0%,
      rgba(var(--green-rgb),.032) 26%,
      rgba(255,255,255,.012) 46%,
      transparent 72%),
    radial-gradient(90% 50% at 8% 4%, rgba(255,255,255,.02), transparent 60%);
}
.v4-stage::after{
  /* LA CHIUSURA. Scurisce i bordi e soprattutto il fondo pagina: e' quello
     che impedisce alla lista di token di "finire nel nulla" quando scorre. */
  content:"";position:absolute;inset:0;
  background:
    radial-gradient(140% 100% at 50% 100%, rgba(0,0,0,.62) 0%, transparent 55%),
    radial-gradient(100% 100% at 50% 50%, transparent 42%, rgba(0,0,0,.45) 100%);
}
/* LA GRANA.
   E' l'ingrediente che si nota di meno e cambia di piu'. Senza, un fondo
   scuro con gradienti mostra le bande di quantizzazione a 8 bit — quelle
   fasce concentriche visibili negli aloni — e l'occhio le legge come
   "immagine compressa". Un rumore all'1.8% le rompe.
   E' una SVG in data URI: nessuna richiesta di rete, nessun canvas, nessun
   frame ridisegnato. La dimensione fissa in px (non in %) evita che il
   pattern si stiri su schermi larghi diventando visibile. */
.v4-grain{
  position:fixed;inset:0;z-index:0;pointer-events:none;
  opacity:.045;mix-blend-mode:overlay;
  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='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E");
  background-size:160px 160px;
  contain:strict;
}
/* L'AURORA DI v2, RIPORTATA AL PESO DELL'INGRESSO.
   Sono due cerchi da 58 e 66vmax — piu' larghi dello schermo — uno nel colore
   della rete in alto a sinistra e uno freddo in basso a destra, che derivano
   lentamente. A .34 erano la cosa piu' luminosa della pagina dopo i bottoni:
   il fondo aveva un colore proprio e i pannelli ci galleggiavano sopra invece
   di appoggiarci. La landing usa aloni fermi al 16 e all'11 per cento e si
   legge molto piu' calma; qui si scende alla stessa fascia.
   Non spariscono: senza, il fondo diventa nero piatto e i pannelli, che sono
   quasi neri anche loro, perdono il bordo. */
:root{--v2-field-op:.13;}
:root[data-chain="bsc"]{--v2-field-op:.09;}
:root[data-chain="solana"]{--v2-field-op:.085;}
/* Sotto il marchio discarica il campo ambientale e' uguale su ogni rete:
   le due righe sopra restano per il brand classico ma non devono affiorare
   quando la pelle e' quella della discarica. */
:root[data-brand="trash"]{--v2-field-op:.24;}

/* IL CAMPO STELLATO.
   A .85 i punti si contavano, e su una lista di token si leggevano come
   sporco sopra il contenuto. E' texture, non decorazione: deve dare
   profondita' al nero senza che si noti da cosa. */
#starfield-bg{z-index:0;opacity:.4;}

/* Sopra gli strati di regia deve stare TUTTO il resto: l'applicazione non
   dichiara uno z-index sul proprio contenitore e senza questo la grana ci
   finirebbe sopra. */
/* NIENTE z-index SU .app, ed e' importante.
   .app e' gia' position:relative (index.html) senza z-index: posizionato ma
   NON un contesto di impilamento. Cosi' il cassetto mobile (.sidebar,
   z-index 60, dentro .app) puo' salire sopra il velo #mBackdrop (z-index 50,
   fuori da .app). Il primo v4 gli dava z-index:2 per stare sopra la grana:
   ha chiuso il cassetto dentro un contesto e il velo lo copriva. Gli strati
   di regia stanno a 0 e vengono PRIMA nel DOM: e' l'ordine a tenerli sotto,
   come gia' per aurora e reticolo di v2. */
.app{position:relative;}

/* ==========================================================================
   3. TIPOGRAFIA
   ==========================================================================
   Non cambio famiglie ne' corpo dei dati. Cambio la GERARCHIA: i titoli
   diventano piu' stretti e piu' grandi, le microetichette piu' larghe e piu'
   spente. E' il contrasto fra questi due estremi che si legge come "curato".
   ========================================================================== */
h1,h2,h3,.section-title{
  letter-spacing:-.03em;
  text-wrap:balance;
}
h1{letter-spacing:-.042em;}

/* Il titolo dell'hero prende una rampa di bianco: pieno in alto, appena
   velato in basso. E' un dettaglio da due righe che fa sembrare il testo
   illuminato da sopra invece che stampato. */
.pitch h1,
.hero h1{
  background:linear-gradient(180deg,#fff 4%,rgba(255,255,255,.78) 92%);
  -webkit-background-clip:text;background-clip:text;
  color:transparent;
  /* Il ritaglio sul testo taglia le code di g/y/p quando line-height e'
     sotto 1: si restituisce lo spazio e lo si riassorbe col margine, come
     gia' fatto sulla landing. */
  padding-bottom:.12em;margin-bottom:-.1em;
}
/* La parte accentata del titolo resta accentata: e' identita' di chain e non
   deve essere mangiata dalla rampa qui sopra. */
.hero h1 .accent{
  -webkit-text-fill-color:var(--green);
  background:none;color:var(--green);
}

/* MICROETICHETTE. Ovunque compaia un'etichetta in maiuscoletto sopra un
   numero, deve essere piccola, spaziata e spenta: il numero e' il
   protagonista, l'etichetta e' la didascalia. */
.ms-item dt,.stat-label,.tk-stat-label,.pf-stat-k,.tr-lbl,
.tok-head,.section-head .head-k,.feat-k,.docs-tab{
  letter-spacing:.14em;
}

/* NUMERI. Cifre a larghezza fissa ovunque un valore possa cambiare: senza,
   la riga "balla" ad ogni aggiornamento live. v2 lo fa gia' in alcuni punti,
   qui vale per tutti. */
.mono,.ms-item dd,.stat-value,.tr-num,.pf-stat-v,.feat-nums b,.tk2-v,
.proof b,.v4-num{
  font-variant-numeric:tabular-nums;
  font-feature-settings:"tnum" 1,"zero" 1;
}

/* ==========================================================================
   4. MATERIA — le superfici
   ==========================================================================
   IL BORDO A GRADIENTE, spiegato una volta sola perche' ricorre ovunque.

   Un `border:1px solid` ha un colore solo: illumina il pannello in modo
   uniforme e lo appiattisce. Serve invece un contorno piu' chiaro in alto e
   spento in basso — cioe' un GRADIENTE dentro un bordo, che il CSS non
   permette direttamente.

   La tecnica: un ::before assoluto che copre il pannello, riempito col
   gradiente, ritagliato a ciambella da due maschere sovrapposte in
   `xor` (una piena, una rientrata di 1px con padding-box). Resta solo il
   contorno. Costa un pseudo-elemento e nessun ridisegno.

   Perche' non `border-image`: border-image non segue border-radius sui
   bordi arrotondati compositi e su Safari lascia gli angoli tagliati. */
.hero,.card,.tok-panel,.chart-card,.pf-panel,.modal,.dex-embed-card,
.pf-summary-card,.tm-col,.docs-sec,.feature-card,.how-step,.pf-stat,
.saved-card,.pf-stock-card,.token-card,.market-bar,.trend-card,.stock-hero{
  position:relative;
  isolation:isolate;
}
.hero::after,.card::after,.tok-panel::after,.chart-card::after,
.pf-panel::after,.modal::after,.dex-embed-card::after,.pf-summary-card::after,
.tm-col::after,.docs-sec::after,.feature-card::after,
.pf-stat::after,.saved-card::after,.token-card::after,.market-bar::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
  padding:1px;
  background:linear-gradient(160deg,
    var(--v4-edge-hi) 0%,
    var(--v4-edge-lo) 38%,
    rgba(255,255,255,.02) 62%,
    var(--v4-edge-hi) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  pointer-events:none;z-index:1;
  opacity:.9;
  transition:opacity var(--v4-t) var(--v4-ease);
}
/* .how-step E' L'ECCEZIONE, e va spiegata perche' l'ho gia' sbagliata una
   volta.
   Il suo ::after e' la FRECCIA che collega un passo al successivo, messa da
   v2 a right:-14px, cioe' fuori dal riquadro. Includendolo nel gruppo qui
   sopra, `position:absolute;inset:0` gli riscriveva la posizione e la
   freccia finiva incollata al bordo SINISTRO della card, dentro il testo.
   Qui il bordo passa quindi sul ::before — che v2 dichiara gia' come
   sovrapposizione vuota a inset:0, quindi non tolgo niente a nessuno. */
.how-step::before{
  padding:1px;overflow:visible;
  background:linear-gradient(160deg,
    var(--v4-edge-hi) 0%,var(--v4-edge-lo) 38%,
    rgba(255,255,255,.02) 62%,var(--v4-edge-hi) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  transition:opacity var(--v4-t) var(--v4-ease);
}

/* Il corpo del pannello: vetro + rilievo + filo di luce interno. */
.card,.pf-panel,.feature-card,.how-step,.pf-stat,.pf-summary-card,
.pf-stock-card,.saved-card,.tm-col,.docs-sec,.dex-embed-card{
  background-image:var(--v4-glass);
  box-shadow:var(--v4-inner),var(--v4-lift-1);
  border-radius:var(--v4-r-lg);
  transition:box-shadow var(--v4-t) var(--v4-ease),
             transform var(--v4-t) var(--v4-ease),
             border-color var(--v4-t) var(--v4-ease);
}
.tok-panel,.chart-card{
  box-shadow:var(--v4-inner),var(--v4-lift-2);
  border-radius:var(--v4-r-xl);
}
.hero,.modal{
  box-shadow:var(--v4-inner),var(--v4-lift-3);
  border-radius:var(--v4-r-xl);
}

/* IL FUOCO. L'alone che segue il puntatore.
   Sta su un ::before (l'::after e' gia' il bordo) sotto al contenuto, e vive
   solo mentre il mouse e' dentro: opacity 0 -> 1 in transizione, cosi'
   entrare e uscire non e' uno scatto. Il gradiente e' ancorato a --v4-mx/my,
   che v4.js aggiorna solo per l'elemento sotto il puntatore. */
.card,.tok-panel,.chart-card,.pf-panel,.feature-card,.how-step,.pf-stat,
.docs-sec,.tm-col,.pf-summary-card,.saved-card{
  --v4-spot:0;
}
.card::before,.tok-panel::before,.chart-card::before,.pf-panel::before,
.feature-card::before,.pf-stat::before,.docs-sec::before,.tm-col::before,
.pf-summary-card::before,.saved-card::before{
  content:"";position:absolute;inset:0;border-radius:inherit;
  background:radial-gradient(420px circle at var(--v4-mx) var(--v4-my),
    rgba(var(--green-rgb),.1) 0%,
    rgba(var(--green-rgb),.035) 32%,
    transparent 68%);
  opacity:var(--v4-spot);
  transition:opacity .5s var(--v4-ease);
  /* z-index:-1 e NON 0.
     Il primo tentativo metteva l'alone a 0 e spingeva i figli diretti a
     `position:relative;z-index:2` per tenerli sopra. Ha rotto ogni figlio
     GIA' in posizione assoluta — le icone in alto a destra delle schede del
     profilo sono tornate in flusso e sono finite addosso alle etichette.
     Con -1 non serve toccare i figli: dentro un contesto di impilamento
     (--isolation:isolate qui sopra) uno strato negativo si dipinge SOPRA lo
     sfondo del pannello e SOTTO il contenuto, che e' esattamente l'ordine
     voluto. */
  pointer-events:none;z-index:-1;
}

/* Sollevamento al passaggio. Due pixel, non di piu': su una lista densa un
   movimento maggiore fa "saltare" le righe vicine. */
.feature-card:hover,.how-step:hover,.pf-stat:hover,.saved-card:hover,
.pf-stock-card:hover,.docs-sec:hover{
  transform:translateY(-2px);
  box-shadow:var(--v4-inner),var(--v4-lift-2);
}
.feature-card:hover::after,.pf-stat:hover::after,
.card:hover::after,.tok-panel:hover::after{opacity:1;}

/* ==========================================================================
   5. LA BARRA IN ALTO
   ==========================================================================
   Da "riga con un bordo sotto" a barra sospesa: il vetro si fa piu' denso
   quando la pagina scorre (classe messa da v4.js), e sotto compare una linea
   che si accende al centro nel colore della chain. E' l'unico elemento
   sempre visibile: e' li' che si giudica se un sito e' curato.
   ========================================================================== */
.topbar{
  position:sticky;top:0;z-index:60;
  background:linear-gradient(180deg,
    rgba(var(--v4-bar-rgb,6,9,13),.72),
    rgba(var(--v4-bar-rgb,6,9,13),.42));
  border-bottom:1px solid transparent;
  backdrop-filter:blur(14px) saturate(1.3);
  -webkit-backdrop-filter:blur(14px) saturate(1.3);
  transition:background var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
:root[data-chain="arc"]{--v4-bar-rgb:6,10,22;}
:root[data-chain="bsc"]{--v4-bar-rgb:7,7,6;}
:root[data-chain="hyperevm"]{--v4-bar-rgb:5,13,11;}
:root[data-chain="solana"]{--v4-bar-rgb:7,6,12;}
/* La discarica non tinge la barra di rete in rete: stessa lamiera per tutte. */
:root[data-brand="trash"]{--v4-bar-rgb:28,29,20;}

/* La linea sotto la barra: spenta ai lati, accesa al centro. Un bordo pieno
   taglia la pagina in due; questa la sottolinea. */
.topbar::after{
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:linear-gradient(90deg,
    transparent 0%,
    var(--v4-edge-lo) 12%,
    rgba(var(--green-rgb),.42) 50%,
    var(--v4-edge-lo) 88%,
    transparent 100%);
  opacity:.75;pointer-events:none;
}
.topbar.v4-scrolled{
  background:linear-gradient(180deg,
    rgba(var(--v4-bar-rgb,6,9,13),.94),
    rgba(var(--v4-bar-rgb,6,9,13),.82));
  box-shadow:0 1px 0 rgba(255,255,255,.04),0 18px 40px -28px rgba(0,0,0,1);
}

/* I link: la sottolineatura cresce dal centro invece di comparire. */
.topnav-link{
  position:relative;
  transition:color var(--v4-t-fast) var(--v4-ease);
}
.topnav-link::after{
  content:"";position:absolute;left:50%;right:50%;bottom:2px;height:2px;
  border-radius:2px;
  background:linear-gradient(90deg,transparent,var(--green),transparent);
  transition:left var(--v4-t) var(--v4-ease),right var(--v4-t) var(--v4-ease),
             opacity var(--v4-t) var(--v4-ease);
  opacity:0;
}
.topnav-link:hover::after{left:24%;right:24%;opacity:.7;}
.topnav-link.active::after{left:16%;right:16%;opacity:1;}
.topnav-link.active{color:var(--text);}

/* Il marchio: il logo prende un alone tenue nel colore della chain, cosi'
   l'angolo in alto a sinistra non e' un buco scuro. */
.topbar .brand-top .hero-logo{
  filter:drop-shadow(0 0 12px rgba(var(--green-rgb),.45));
  transition:filter var(--v4-t) var(--v4-ease),transform var(--v4-t) var(--v4-ease);
}
.topbar .brand-top:hover .hero-logo{
  filter:drop-shadow(0 0 18px rgba(var(--green-rgb),.7));
  transform:rotate(-8deg) scale(1.06);
}
.topbar .brand-top .brand-name{letter-spacing:-.028em;}

/* La ricerca: da campo a "comando". Si allarga quando prende il fuoco. */
.search input{
  border-radius:999px;
  background:rgba(255,255,255,.04);
  border:1px solid var(--v4-edge-lo);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04);
  transition:border-color var(--v4-t) var(--v4-ease),
             background var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
.search input:focus{
  border-color:rgba(var(--green-rgb),.5);
  background:rgba(255,255,255,.07);
  box-shadow:0 0 0 4px rgba(var(--green-rgb),.1),
             inset 0 1px 0 rgba(255,255,255,.06),
             0 8px 26px -14px rgba(var(--green-rgb),.7);
}

/* ==========================================================================
   6. I BOTTONI
   ==========================================================================
   Il bottone pieno prende tre cose che prima non aveva: una rampa a tre
   fermate (non due: la terza tiene il colore vivo al centro invece di
   spegnerlo), un alone che cresce al passaggio, e un RIFLESSO che attraversa
   la superficie. Il riflesso e' un gradiente obliquo che scorre in 0.7s: e'
   la firma piu' riconoscibile di una UI costosa, e costa una traslazione.
   ========================================================================== */
.btn-launch,.btn-enter,.pf-btn-primary,.btn-launch-top:not(.ghost),.side-cta:not(.stock){
  position:relative;overflow:hidden;
  /* LA CODA DEL GRADIENTE NON PUO' SCENDERE SOTTO LA LEGGIBILITA'.
     Un valore fisso qui sotto due problemi in uno: sul nero il testo scuro
     del bottone (--on-green) scendeva sotto il 4,5:1 che serve al testo
     piccolo, e su ogni rete che non fosse Robinhood la coda del bottone
     restava verde invece di seguire l'accento di quella rete (o del marchio
     attivo). color-mix scurisce var(--green) stesso: la coda resta leggibile
     e cambia rete per rete, marchio per marchio, invece di essere un colore
     fisso. */
  background:linear-gradient(168deg,
    var(--green-hi) 0%,
    var(--green) 52%,
    color-mix(in srgb, var(--green) 88%, #000) 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34),
             inset 0 -1px 0 rgba(0,0,0,.18),
             0 2px 8px -2px rgba(var(--green-rgb),.4),
             0 12px 30px -14px rgba(var(--green-rgb),.75);
  transition:transform var(--v4-t-fast) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),
             filter var(--v4-t-fast) var(--v4-ease);
}
.btn-launch::after,.btn-enter::after,.pf-btn-primary::after,
.btn-launch-top:not(.ghost)::after,.side-cta:not(.stock)::after{
  content:"";position:absolute;top:0;bottom:0;left:-60%;width:45%;
  background:linear-gradient(100deg,
    transparent 0%,rgba(255,255,255,.42) 50%,transparent 100%);
  transform:skewX(-18deg);
  pointer-events:none;
  transition:left .7s var(--v4-ease);
}
.btn-launch:hover::after,.btn-enter:hover::after,.pf-btn-primary:hover::after,
.btn-launch-top:not(.ghost):hover::after,.side-cta:not(.stock):hover::after{left:130%;}
.btn-launch:hover:not(:disabled),.btn-enter:hover:not(:disabled),
.pf-btn-primary:hover,.btn-launch-top:not(.ghost):hover,.side-cta:not(.stock):hover{
  transform:translateY(-2px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.4),
             0 4px 12px -2px rgba(var(--green-rgb),.5),
             0 20px 44px -14px rgba(var(--green-rgb),.9);
}
.btn-launch:active:not(:disabled),.btn-enter:active:not(:disabled),
.btn-launch-top:not(.ghost):active{transform:translateY(0) scale(.985);}

/* I DUE BOTTONI IN FONDO AL CASSETTO: uno pieno, uno no.
   Erano entrambi gialli, uno sopra l'altro: due azioni con lo stesso peso
   sono nessuna azione. "Launch your token" e' quella principale del sito e
   resta piena (e' gia' nel gruppo dei pieni qui sopra); lo stock token
   diventa il secondario — contorno nel colore della chain, fondo
   trasparente — cosi' si legge come variante e non come doppione.
   Specificita' .sidebar .side-cta (0,3,0) e non !important: batte sia la
   regola di index.html sia quella di v3, che sono a (0,2,0). */
.sidebar .side-cta:not(.stock){border-radius:var(--v4-r-md);color:var(--on-green);border-color:transparent;}
.sidebar .side-cta.stock{
  border-radius:var(--v4-r-md);
  background:rgba(var(--green-rgb),.06);
  background-image:none;
  color:var(--chain-accent,var(--green));
  border:1px solid var(--chain-accent-line,rgba(var(--green-rgb),.4));
  box-shadow:none;
  transition:background var(--v4-t) var(--v4-ease),border-color var(--v4-t) var(--v4-ease),
             transform var(--v4-t-fast) var(--v4-ease);
}
.sidebar .side-cta.stock::after{display:none;}
.sidebar .side-cta.stock:hover{
  background:rgba(var(--green-rgb),.12);
  border-color:var(--chain-accent,var(--green));
  transform:translateY(-1px);
  box-shadow:0 8px 22px -14px rgba(var(--green-rgb),.9);
}

/* Compra e vendi: stessa fisica, colore invariato (verde e rosso, su ogni
   chain — e' semantica, non identita'). */
.btn-buy,.btn-sell{
  position:relative;overflow:hidden;
  transition:transform var(--v4-t-fast) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),background var(--v4-t-fast) var(--v4-ease);
}
.btn-buy{box-shadow:inset 0 1px 0 rgba(255,255,255,.24),
  0 2px 8px -2px rgba(var(--buy-rgb),.4),0 12px 30px -14px rgba(var(--buy-rgb),.7);}
.btn-sell{box-shadow:inset 0 1px 0 rgba(255,255,255,.22),
  0 2px 8px -2px rgba(var(--sell-rgb),.4),0 12px 30px -14px rgba(var(--sell-rgb),.7);}
.btn-buy:hover:not(:disabled){box-shadow:inset 0 1px 0 rgba(255,255,255,.3),
  0 20px 44px -14px rgba(var(--buy-rgb),.9);}
.btn-sell:hover:not(:disabled){box-shadow:inset 0 1px 0 rgba(255,255,255,.28),
  0 20px 44px -14px rgba(var(--sell-rgb),.9);}

/* I secondari: contorno che si accende, fondo che si schiarisce appena. */
.btn-secondary,.qa-btn,.pf-btn,.upload-btn,.page-btn,.page-num,
.btn-launch-top.ghost{
  border-radius:999px;
  border:1px solid var(--v4-edge-lo);
  background-image:var(--v4-glass-soft);
  transition:border-color var(--v4-t) var(--v4-ease),
             background var(--v4-t) var(--v4-ease),
             transform var(--v4-t-fast) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
.btn-secondary:hover:not(:disabled),.qa-btn:hover,.pf-btn:hover,
.upload-btn:hover,.btn-launch-top.ghost:hover{
  border-color:rgba(var(--green-rgb),.45);
  transform:translateY(-1px);
  box-shadow:0 8px 24px -14px rgba(var(--green-rgb),.8);
}

/* Il bottone del wallet in alto a destra: e' l'invito principale della
   barra, quindi e' l'unico elemento chiaro su fondo scuro. */
.btn-connect{
  border-radius:999px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.4),
             0 2px 6px rgba(0,0,0,.4),
             0 10px 26px -14px rgba(255,255,255,.45);
  transition:transform var(--v4-t-fast) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
.btn-connect:hover{
  transform:translateY(-1.5px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5),0 16px 34px -16px rgba(255,255,255,.55);
}

/* ==========================================================================
   7. I CAMPI
   ==========================================================================
   Un campo scuro dentro un pannello scuro non si vede: qui e' INCASSATO —
   ombra interna in alto, filo di luce in basso — cosi' si legge come un
   buco nella superficie invece che come un altro rettangolo.
   ========================================================================== */
.field input:not([type=range]),.field textarea,.field select,
.buy-input-row input,.tm-filters input,.ref-code-row input{
  border-radius:var(--v4-r-md);
  border:1px solid var(--v4-edge-lo);
  background:rgba(0,0,0,.28);
  box-shadow:inset 0 2px 6px rgba(0,0,0,.4),inset 0 -1px 0 rgba(255,255,255,.05);
  transition:border-color var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),
             background var(--v4-t) var(--v4-ease);
}
.field input:not([type=range]):focus,.field textarea:focus,
.buy-input-row input:focus,.tm-filters input:focus{
  border-color:rgba(var(--green-rgb),.55);
  background:rgba(0,0,0,.18);
  box-shadow:0 0 0 4px rgba(var(--green-rgb),.11),
             inset 0 2px 6px rgba(0,0,0,.3),
             0 10px 30px -18px rgba(var(--green-rgb),.9);
  outline:none;
}
/* ==========================================================================
   8. PILLOLE, SCHEDE, BADGE
   ==========================================================================
   Tutte le liste di scelte del sito (filtri della home, schede dei docs,
   schede del profilo, timeframe del grafico) sono la stessa cosa: una fila
   di pillole con una attiva. Qui prendono lo stesso trattamento, cosi' il
   sito smette di avere quattro dialetti per lo stesso comando.
   ========================================================================== */
.feed-tab,.docs-tab,.pf-tab,.chart-tf,.trade-tab,.mode,.chain-pill{
  border-radius:999px;
  transition:background var(--v4-t) var(--v4-ease),
             color var(--v4-t-fast) var(--v4-ease),
             border-color var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),
             transform var(--v4-t-fast) var(--v4-ease);
}
.feed-tab:hover,.docs-tab:hover,.pf-tab:hover,.chart-tf:hover,.tk2-tab:hover{
  transform:translateY(-1px);
}
/* .tk2-tab e' fuori da questo elenco di proposito.
   E' una scheda con la sottolineatura, non una pillola: l'anello dorato le
   disegnava intorno un ovale alto quanto tutta la barra, e la barra ha
   overflow-x:auto, che taglia anche in verticale. Risultato, un anello
   tagliato sopra e sotto — che e' esattamente cio' che si vedeva. */
.feed-tab.active,.docs-tab.active,.pf-tab.active,.chart-tf.active,
.trade-tab.active{
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.4),
             0 6px 20px -12px rgba(var(--green-rgb),.9);
}

/* Il pallino "vivo". Prima era un cerchio pieno che pulsava; ora ha
   un'ONDA che si espande e svanisce — la stessa cosa che fa un segnale
   radar, e si legge come "in tempo reale" senza bisogno della parola. */
.pulse,.feed-pulse,.tk2-dot{
  position:relative;
  box-shadow:0 0 10px rgba(var(--green-rgb),.9);
}
.pulse::after,.feed-pulse::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
  background:inherit;
  animation:v4Ping 2.4s var(--v4-ease) infinite;
  pointer-events:none;
}
@keyframes v4Ping{
  0%{transform:scale(1);opacity:.55;}
  70%,100%{transform:scale(3.4);opacity:0;}
}

/* ==========================================================================
   9. LISTE E RIGHE
   ==========================================================================
   La lista dei token e' il cuore del sito: e' li' che uno passa il tempo.
   Ogni riga prende (a) un fondo che si accende da sinistra al passaggio,
   (b) una barra verticale d'accento sul bordo sinistro che cresce, (c) una
   transizione sola. Nessuna riga si muove: su una tabella, un translate al
   passaggio e' fastidioso perche' fa perdere la riga che si stava leggendo.
   ========================================================================== */
#view-home .tok-row,.tr-row,.tok-row{
  position:relative;
  transition:background var(--v4-t) var(--v4-ease);
}
#view-home .tok-row::before,#view-stocks .tok-row::before,.tr-row::before{
  content:"";position:absolute;left:0;top:6px;bottom:6px;width:2px;
  border-radius:0 2px 2px 0;
  background:linear-gradient(180deg,transparent,var(--green),transparent);
  transform:scaleY(0);transform-origin:center;
  transition:transform var(--v4-t) var(--v4-ease);
  pointer-events:none;
}
#view-home .tok-row:hover::before,#view-stocks .tok-row:hover::before,.tr-row:hover::before{transform:scaleY(1);}
#view-home .tok-row:hover,#view-stocks .tok-row:hover,.tr-row:hover{
  background:linear-gradient(90deg,
    rgba(var(--green-rgb),.055) 0%,
    rgba(255,255,255,.022) 30%,
    transparent 92%);
}

/* L'immagine del token: bordo sottile e ombra, cosi' i loghi quadrati non
   sembrano incollati sul fondo. */
.tr-img,.tk2-ib,.token-img{
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.09),0 4px 12px -6px rgba(0,0,0,.9);
  transition:transform var(--v4-t) var(--v4-ease),box-shadow var(--v4-t) var(--v4-ease);
}
.tok-row:hover .tr-img,.tr-row:hover .tr-img{
  transform:scale(1.06);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.35),
             0 6px 18px -6px rgba(var(--green-rgb),.6);
}

/* L'intestazione delle colonne: si stacca dalla lista e resta ferma mentre
   la lista scorre sotto. */
.tok-head{
  position:sticky;top:0;z-index:3;
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
}

/* ==========================================================================
   10. LE BARRE DI AVANZAMENTO
   ==========================================================================
   Dicono quanto manca alla migrazione: e' il numero piu' guardato del sito,
   e finora era una barretta piatta. Ora e' una rampa nel colore della chain
   con un alone e una luce che la percorre — l'unica animazione continua che
   mi concedo nelle liste, perche' significa "sta succedendo adesso".
   ========================================================================== */
.tr-bar,.token-progress,.feat-bar{
  overflow:hidden;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.55);
}
#view-home .tr-bar-fill,.tr-bar-fill,.token-progress-fill,.feat-bar > i{
  position:relative;
  background:linear-gradient(90deg,
    rgba(var(--green-rgb),.55) 0%,
    var(--green) 62%,
    var(--green-hi) 100%);
  box-shadow:0 0 12px -2px rgba(var(--green-rgb),.75);
  transition:width .8s var(--v4-ease);
}
/* LA LUCE CHE PERCORRE LA BARRA STA SU UNA BARRA SOLA.
   Il primo tentativo la metteva su tutte, comprese le dodici righe della
   lista: partendo tutte insieme diventava un'onda che attraversa la tabella
   ogni 2.8 secondi, cioe' esattamente il tipo di movimento che rende
   faticoso leggere una colonna di numeri.
   Resta dove significa qualcosa: il token in evidenza e la pagina di un
   token, dove la barra e' UNA e sta dicendo "questo sta succedendo adesso". */
#view-home .feature .feat-bar > i::after,
#view-token .token-progress-fill::after,
#view-stock .token-progress-fill::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(90deg,
    transparent 0%,rgba(255,255,255,.4) 50%,transparent 100%);
  transform:translateX(-100%);
  animation:v4Sweep 2.8s var(--v4-ease-soft) infinite;
}
@keyframes v4Sweep{
  0%{transform:translateX(-100%);}
  60%,100%{transform:translateX(220%);}
}

/* ==========================================================================
   11. LE CIFRE DELLA PIATTAFORMA
   ==========================================================================
   La striscia dei quattro numeri sulla home era un rettangolo diviso in
   quattro. Ora ogni cella e' un blocco a se': l'icona vive in un quadrato
   con l'alone della chain, il numero e' grande e con una rampa, e la cella
   sotto il mouse si accende.

   NOTA sulle regole con !important: v3.css spegne esplicitamente ombre e
   gradienti su .market-bar (righe 427-437). Qui li riaccendo, e siccome
   quelle regole hanno la stessa specificita' ma vengono da un file caricato
   prima, basterebbe l'ordine — tranne dove v3 usa `background-image:none`
   sullo stesso selettore identico. Sono le uniche cinque, tutte qui.
   ========================================================================== */
#view-home .market-bar{
  background-color:var(--panel);
  background-image:var(--v4-glass) !important;
  border:1px solid transparent;
  border-radius:var(--v4-r-xl);
  box-shadow:var(--v4-inner),var(--v4-lift-2) !important;
  overflow:hidden;
}
#view-home .ms-item{
  position:relative;
  transition:background var(--v4-t) var(--v4-ease);
}
#view-home .ms-item:hover{
  background:radial-gradient(120% 140% at 50% 0%,
    rgba(var(--green-rgb),.09),transparent 70%) !important;
}
#view-home .ms-item + .ms-item{
  /* La linea di separazione sfuma alle estremita': un filo pieno da bordo a
     bordo taglia la striscia in scomparti. */
  border-left:0;
}
#view-home .ms-item + .ms-item::before{
  content:"";position:absolute;left:0;top:14%;bottom:14%;width:1px;
  background:linear-gradient(180deg,transparent,var(--v4-edge-hi) 30%,
    var(--v4-edge-hi) 70%,transparent);
}
#view-home .ms-item dt svg{
  background:linear-gradient(160deg,
    rgba(var(--green-rgb),.24),rgba(var(--green-rgb),.08)) !important;
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.24),
             0 6px 16px -10px rgba(var(--green-rgb),.9);
  transition:transform var(--v4-t) var(--v4-ease),box-shadow var(--v4-t) var(--v4-ease);
}
#view-home .ms-item:hover dt svg{
  transform:translateY(-1px) scale(1.06);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.4),
             0 10px 24px -10px rgba(var(--green-rgb),1);
}
#view-home .ms-item dd{
  letter-spacing:-.035em;
  background:linear-gradient(180deg,#fff 10%,rgba(255,255,255,.7) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
/* Il rimborso resta l'unica cifra accentata: e' la promessa del prodotto. */
#view-home .ms-item:last-child dd{
  background:linear-gradient(180deg,var(--green-hi),var(--green));
  -webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 0 18px rgba(var(--green-rgb),.35));
}
/* ==========================================================================
   12. IL TOKEN IN EVIDENZA
   ==========================================================================
   E' il pannello che vende: primo schermo, a destra del titolo. Prende
   l'unica cornice accentata della pagina.
   ========================================================================== */
#view-home .feature{
  border-radius:var(--v4-r-xl);
  box-shadow:var(--v4-inner),var(--v4-lift-2);
  overflow:hidden;
}
#view-home .feature::after{
  background:linear-gradient(160deg,
    rgba(var(--green-rgb),.4) 0%,
    var(--v4-edge-lo) 42%,
    rgba(var(--green-rgb),.16) 100%);
}
#view-home .feat-main{position:relative;}
#view-home .feat-main::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(90% 120% at 12% 0%,
    rgba(var(--green-rgb),.1),transparent 62%);
}
#view-home .feat-name{letter-spacing:-.035em;}

/* ==========================================================================
   13. MODALI
   ==========================================================================
   Il fondo si sfoca: e' quello che fa sembrare la finestra "sopra" invece
   che "dentro" la pagina. Ed entra scalando da 0.97, non da 0.8: una
   finestra che rimbalza sembra un giocattolo.
   ========================================================================== */
.modal-backdrop{
  backdrop-filter:blur(10px) saturate(.9);
  -webkit-backdrop-filter:blur(10px) saturate(.9);
  background:radial-gradient(120% 100% at 50% 0%,
    rgba(var(--green-rgb),.07),transparent 55%),rgba(2,4,7,.72);
}
.modal{
  animation:v4Modal .5s var(--v4-ease) both;
}
@keyframes v4Modal{
  from{opacity:0;transform:translateY(14px) scale(.972);}
  to{opacity:1;transform:none;}
}
.modal h2{letter-spacing:-.03em;}
.modal .accept-row{
  border-radius:var(--v4-r-md);
  transition:border-color var(--v4-t) var(--v4-ease),background var(--v4-t) var(--v4-ease);
}

/* ==========================================================================
   14. IL PIEDE
   ==========================================================================
   Chiude la pagina invece di finirla: una linea che si accende al centro,
   come sotto la barra in alto. Le due si rispondono.
   ========================================================================== */
.site-foot,.site-footer{
  position:relative;
  border-top:0;
}
.site-foot::before,.site-footer::before{
  content:"";position:absolute;top:0;left:0;right:0;height:1px;
  background:linear-gradient(90deg,transparent,var(--v4-edge-hi) 22%,
    rgba(var(--green-rgb),.32) 50%,var(--v4-edge-hi) 78%,transparent);
}
.site-foot a,.site-footer a{
  transition:color var(--v4-t-fast) var(--v4-ease),transform var(--v4-t-fast) var(--v4-ease);
}
.site-foot a:hover,.site-footer a:hover{color:var(--green);}

/* ==========================================================================
   15. IL TEMPO — comparse
   ==========================================================================
   Ogni blocco entra una volta sola, quando lo si raggiunge. La classe
   .v4-in la mette v4.js con un IntersectionObserver; senza JS gli elementi
   restano visibili (lo stato di partenza e' applicato dal JS stesso, non
   dal CSS: e' la sola regola che garantisce che una pagina senza script
   resti leggibile).
   ========================================================================== */
.v4-rise{
  opacity:0;transform:translateY(16px);
  transition:opacity .7s var(--v4-ease),transform .7s var(--v4-ease);
  transition-delay:var(--v4-d,0ms);
  will-change:opacity,transform;
}
.v4-rise.v4-in{opacity:1;transform:none;}

/* La comparsa della schermata quando si cambia rotta. Corta: una transizione
   di pagina lunga si trasforma in attesa. */
#view-home,#view-token,#view-create,#view-profile,#view-docs,
#view-terminal,#view-stocks,#view-stock,#view-watchlist,#view-chat,
#view-create-stock{
  animation:v4View .5s var(--v4-ease) both;
}
@keyframes v4View{
  from{opacity:0;transform:translateY(8px);}
  to{opacity:1;transform:none;}
}

/* ==========================================================================
   16. DETTAGLI DI SISTEMA
   ========================================================================== */
::selection{background:rgba(var(--green-rgb),.32);color:#fff;}

/* Barra di scorrimento: sottile, senza frecce, con il pollice che si accende
   al passaggio. Su una pagina scura una scrollbar di sistema chiara e' la
   cosa che rompe l'illusione piu' in fretta. */
*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.14) transparent;}
::-webkit-scrollbar{width:10px;height:10px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{
  background:rgba(255,255,255,.12);
  border-radius:99px;
  border:3px solid transparent;
  background-clip:content-box;
}
::-webkit-scrollbar-thumb:hover{
  background:rgba(var(--green-rgb),.45);
  background-clip:content-box;
}

/* Il fuoco da tastiera deve essere VISIBILE e uguale ovunque: e' l'unico
   modo in cui il sito e' usabile senza mouse. :focus-visible e non :focus,
   o l'anello comparirebbe anche al click del mouse. */
a:focus-visible,button:focus-visible,input:focus-visible,
textarea:focus-visible,select:focus-visible,[tabindex]:focus-visible{
  outline:2px solid rgba(var(--green-rgb),.75);
  outline-offset:2px;
  border-radius:var(--v4-r-sm);
}

/* ==========================================================================
   17. SCHERMI STRETTI
   ==========================================================================
   Su telefono si spengono le cose che costano e non si vedono: il fuoco che
   segue il puntatore (non c'e' un puntatore), la grana (su un pannello
   piccolo e' rumore e basta), le ombre lunghe.
   ========================================================================== */
@media (max-width:760px){
  .v4-grain{opacity:.03;}
  .card::before,.tok-panel::before,.chart-card::before,.pf-panel::before,
  .feature-card::before,.pf-stat::before,.docs-sec::before,.tm-col::before{display:none;}
  :root{
    --v4-lift-2:0 2px 6px rgba(0,0,0,.45),0 12px 24px -18px rgba(0,0,0,.9);
    --v4-lift-3:0 4px 10px rgba(0,0,0,.5),0 20px 40px -24px rgba(0,0,0,1);
  }
}

/* ==========================================================================
   18. LE SINGOLE SCHERMATE
   ==========================================================================
   Fin qui il foglio ha lavorato sul linguaggio comune. Qui ci sono le poche
   cose che valgono per una schermata sola e che, senza, restavano indietro
   rispetto al resto.
   ========================================================================== */

/* ---- 18.1 LANCIA UN TOKEN ----
   Il titolo era della stessa taglia di un'intestazione di sezione, in cima a
   una pagina che chiede di compilare undici campi: chi arriva qui ha appena
   deciso di fare la cosa piu' importante del sito e la pagina non lo
   festeggiava affatto. */
#view-create > .wrap > h1,
#view-create-stock > .wrap > h1{
  /* La taglia e' in sezione 22, con quella della home e della landing: erano
     tre scale diverse per tre titoli dello stesso sito. */
  margin-top:6px;
  background:linear-gradient(180deg,#fff 8%,rgba(255,255,255,.74) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  padding-bottom:.08em;margin-bottom:-.04em;
}
#view-create > .wrap > .sub,
#view-create-stock > .wrap > .sub{
  font-size:15px;max-width:62ch;line-height:1.65;margin-top:12px;
}
/* Il titoletto di ogni scheda del modulo: prima era testo grigio in
   maiuscoletto e si confondeva con le etichette dei campi. Ora ha un trattino
   nel colore della rete che lo precede — costa una riga e separa i due
   livelli senza aggiungere una linea. */
#view-create .card > h3,
#view-create-stock .card > h3{
  display:flex;align-items:center;gap:10px;
}
#view-create .card > h3::before,
#view-create-stock .card > h3::before{
  content:"";width:16px;height:2px;border-radius:2px;flex-shrink:0;
  background:linear-gradient(90deg,var(--green),transparent);
}
/* L'anteprima segue chi scorre: e' il senso di un'anteprima, e prima usciva
   dallo schermo al secondo campo. */
@media (min-width:1080px){
  #view-create .create-side,
  #view-create-stock .create-side{position:sticky;top:88px;align-self:start;}
}
/* Il riquadro del logo: da quadrato grigio a bersaglio. Tratteggio che si
   accende, e l'invito a caricare che diventa il colore della rete. */
.img-preview{
  border-radius:var(--v4-r-lg);
  border:1.5px dashed var(--v4-edge-hi);
  background-image:var(--v4-glass-soft);
  transition:border-color var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),transform var(--v4-t) var(--v4-ease);
}
.img-preview:hover{
  border-color:rgba(var(--green-rgb),.6);
  transform:translateY(-2px);
  box-shadow:0 12px 30px -16px rgba(var(--green-rgb),.9);
}

/* ---- 18.1b LE SCHEDE DEI TOKEN ----
   ==========================================================================
   E' la schermata dove si passa il tempo, ed era la piu' anonima: dodici
   righe grigie con un logo da 36px, tre numeri della stessa taglia e una
   barretta piatta. Tutto leggibile, niente gerarchia — l'occhio non sapeva
   dove posarsi per primo, quindi le leggeva tutte, quindi non ne leggeva
   nessuna.

   La riga resta una RIGA: la griglia a card fa sembrare ogni token un post,
   e dodici riquadri uguali non si confrontano perche' i numeri stanno in
   punti diversi di ognuno. Quello che cambia e' il peso relativo:

     - il logo cresce e prende un anello, cosi' e' un oggetto e non una
       macchia. E' anche l'unica immagine della riga: se non tira l'occhio
       lui, non lo tira niente.
     - il NOME sale di corpo e di peso; simbolo ed eta' scendono nel
       monospaziato spento. Erano quasi uguali, e il nome e' l'unica cosa che
       uno cerca davvero.
     - il MARKET CAP e' il numero grande. E' quello su cui si ordina la lista
       nove volte su dieci, ed era della stessa taglia del volume.
     - la barra diventa un termometro leggibile con la percentuale accanto, e
       si accende quando manca poco: sopra il 90% e' arancio, a 100 e' pieno.
       Prima un token al 12% e uno al 96% avevano la stessa barra grigia con
       un pezzetto colorato di lunghezza diversa, e la differenza — che e' la
       cosa piu' importante della lista — si leggeva solo dal numero.
     - al passaggio del mouse l'indirizzo del contratto lascia il posto a
       "Trade", perche' e' quello che il click fa. Il contratto resta
       copiabile: torna appena il mouse esce.
   ========================================================================== */
#view-home .tok-row,#view-stocks .tok-row,#view-watchlist .tok-row{
  padding-block:15px;
}

/* Il logo: 44px, angoli piu' morbidi, anello sottile e ombra propria. */
#view-home .tr-img,#view-stocks .tr-img,#view-watchlist .tr-img{
  width:44px;height:44px;border-radius:13px;font-size:15px;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.1),
             0 6px 16px -8px rgba(0,0,0,1);
}

/* Nome e sottotitolo: due pesi diversi, non due grigi diversi. */
#view-home .tr-n1,#view-stocks .tr-n1,#view-watchlist .tr-n1{
  font-size:15px;font-weight:600;letter-spacing:-.022em;
  display:flex;align-items:center;gap:7px;flex-wrap:wrap;
}
#view-home .tr-n2,#view-stocks .tr-n2,#view-watchlist .tr-n2{
  font-family:var(--font-mono);font-size:11px;letter-spacing:.05em;
  color:var(--text-mute);margin-top:4px;
}

/* LE ETICHETTE, RIPORTATE A DUE COLORI.
   Prima erano cinque tinte diverse nella stessa riga — verde, oro, viola,
   blu, arancio — e una lista lunga diventava un arcobaleno in cui nessuna
   delle cinque significava piu' niente: quando tutto e' evidenziato, non lo
   e' nulla. E' esattamente cio' che fa sembrare un prodotto messo insieme a
   pezzi invece che disegnato.
   Ora il colore lo prendono solo le due etichette che cambiano una decisione:
   la taglia della modalita' protetta di prima e "Graduated" (non
   piu': ora e' mercato aperto). Tutto il resto — modalita' delle fee, tipo di
   prodotto — descrive com'e' fatto il token, non cosa rischi, e resta in
   grigio: si legge se la si cerca, non urla se non la si cerca. */
.tok-tag{
  font-size:10px;font-weight:600;letter-spacing:.04em;
  padding:3px 8px;border-radius:99px;line-height:1.5;
  color:var(--text-dim);
  background:rgba(255,255,255,.045);
  border:1px solid var(--v4-edge-lo);
}
/* Ridichiarate una per una: in v2.css queste hanno gia' una classe di tipo
   (.tok-tag.stock e compagnia), quindi pesano piu' della regola generica qui
   sopra e la vincerebbero comunque. Stesso grigio, esplicito. */
.tok-tag.stock,.tok-tag.classic,.tok-tag.burn,.tok-tag.lp{
  color:var(--text-dim);
  background:rgba(255,255,255,.045);
  border:1px solid var(--v4-edge-lo);
}
.tok-tag.protected{
  color:#4ade80;background:rgba(74,222,128,.09);border-color:rgba(74,222,128,.24);
}
.tok-tag.grad{
  color:var(--green);background:rgba(var(--green-rgb),.1);
  border-color:rgba(var(--green-rgb),.28);
}

/* Il market cap comanda, il volume lo accompagna. */
#view-home .tr-num[data-col="mcap"],#view-stocks .tr-num:first-of-type{
  font-size:15.5px;font-weight:600;letter-spacing:-.03em;color:var(--text);
}
#view-home .tr-num[data-col="vol"]{
  font-size:12.5px;color:var(--text-dim);
}

/* La sparkline aveva 96px e ci stava dentro una linea che non diceva niente.
   Piu' spazio e piu' altezza: o e' leggibile o e' decorazione. */
#view-home .tr-spark{height:30px;opacity:.9;transition:opacity var(--v4-t) var(--v4-ease);}
#view-home .tok-row:hover .tr-spark{opacity:1;}

/* IL TERMOMETRO.
   La barra sale a 6px e prende una scala di colore: verde-accento fino al
   70%, ambra oltre il 90, pieno acceso a 100. La percentuale accanto passa
   al monospaziato a larghezza fissa, o le cifre ballano da riga a riga. */
#view-home .tr-prog,#view-stocks .tr-prog{display:flex;align-items:center;gap:10px;}
#view-home .tr-bar,#view-stocks .tr-bar{
  flex:1;height:6px;border-radius:99px;
  background:rgba(255,255,255,.06);
  box-shadow:inset 0 1px 2px rgba(0,0,0,.6);
}
#view-home .tr-pct,#view-stocks .tr-pct{
  font-family:var(--font-mono);font-size:11.5px;font-variant-numeric:tabular-nums;
  color:var(--text-dim);min-width:44px;text-align:right;flex-shrink:0;
}
/* Vicino al traguardo. La soglia e' scritta nel markup? No: la larghezza
   della barra e' l'unica cosa che il CSS vede, e da una larghezza non si
   ricava una condizione. Quindi il segnale sta sul colore del riempimento,
   che app.js gia' imposta in percentuale — qui aggiungo solo l'alone piu'
   forte man mano che la barra si riempie, che e' l'effetto voluto: piu' e'
   lunga, piu' brilla. */
#view-home .tr-bar-fill,#view-stocks .tr-bar-fill{
  box-shadow:0 0 10px -1px rgba(var(--green-rgb),.8),
             inset 0 1px 0 rgba(255,255,255,.25);
}

/* IL CONTRATTO CHE DIVENTA "TRADE".
   Il click sulla riga porta al token: la colonna a destra deve dirlo. Resta
   l'indirizzo, che serve a chi vuole copiarlo, e scompare solo mentre il
   mouse e' sulla riga. Le due etichette sono impilate nello stesso spazio,
   quindi niente si sposta quando si scambiano. */
#view-home .tr-ca,#view-stocks .tr-ca{position:relative;}
#view-home .tr-ca .token-ca-v,#view-stocks .tr-ca .token-ca-v{
  transition:opacity var(--v4-t) var(--v4-ease);
}
#view-home .tr-ca::after,#view-stocks .tr-ca::after{
  content:"Trade \2192";
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:flex-end;
  font-family:var(--font-body);font-size:12.5px;font-weight:600;
  letter-spacing:-.01em;color:var(--green);
  opacity:0;transform:translateX(-4px);
  transition:opacity var(--v4-t) var(--v4-ease),transform var(--v4-t) var(--v4-ease);
  pointer-events:none;
}
#view-home .tok-row:hover .tr-ca .token-ca-v,#view-stocks .tok-row:hover .tr-ca .token-ca-v{opacity:0;}
#view-home .tok-row:hover .tr-ca::after,#view-stocks .tok-row:hover .tr-ca::after{opacity:1;transform:none;}
/* Mentre si punta l'indirizzo per copiarlo, l'indirizzo torna: altrimenti si
   clicca su "Trade" credendo di copiare. */
#view-home .tr-ca:hover .token-ca-v,#view-stocks .tr-ca:hover .token-ca-v{opacity:1 !important;}
#view-home .tr-ca:hover::after,#view-stocks .tr-ca:hover::after{opacity:0 !important;}

/* L'intestazione delle colonne, allineata al nuovo peso della riga. */
#view-home .tok-head,#view-stocks .tok-head{
  padding-block:13px;
  background:linear-gradient(180deg,var(--panel-2) 70%,transparent);
}

/* Su schermo stretto la griglia a sei colonne diventa una scheda impilata:
   li' le etichette per riga tornano, perche' non c'e' piu' una testata di
   colonna a cui riferirsi. */
@media (max-width:900px){
  #view-home .tr-n1,#view-stocks .tr-n1,#view-watchlist .tr-n1{font-size:15.5px;}
  #view-home .tr-num[data-col="mcap"],#view-stocks .tr-num:first-of-type{font-size:16px;}
  #view-home .tr-ca::after,#view-stocks .tr-ca::after{display:none;}
}

/* ---- 18.1c IL SELETTORE DI RETE ----
   ==========================================================================
   E' l'unico punto del prodotto in cui si passa da una rete all'altra, ed era
   un elenco di cinque righe di testo con un puntino davanti. Ora ogni voce
   porta il proprio logo, il gas con cui si paga e il DEX su cui migra: le tre
   cose che distinguono una rete dall'altra, e le stesse che la landing mostra
   sulle carte — cosi' chi arriva dalla landing ritrova la stessa scheda.
   Il colore di ogni riga e' quello della SUA rete (--i-rgb, messa da
   chains.js), non dell'attiva: in un menu le voci devono distinguersi fra
   loro, o tornano a essere cinque righe grigie.
   ========================================================================== */
.chain-menu{
  border-radius:var(--v4-r-lg);
  padding:6px;min-width:246px;
  background-image:var(--v4-glass);
  box-shadow:var(--v4-inner),var(--v4-lift-3);
  backdrop-filter:blur(16px) saturate(1.2);
  -webkit-backdrop-filter:blur(16px) saturate(1.2);
}
.chain-item{
  display:flex;align-items:center;gap:11px;
  width:100%;padding:9px 11px;border-radius:var(--v4-r-md);
  position:relative;
  transition:background var(--v4-t) var(--v4-ease);
}
.chain-item-logo{
  width:22px;height:22px;flex-shrink:0;
  filter:drop-shadow(0 0 10px rgba(var(--i-rgb,255,255,255),.5));
}
.chain-item-txt{display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:0;flex:1;}
.chain-item-label{font-size:13.5px;font-weight:550;letter-spacing:-.015em;}
.chain-item-sub{
  font-family:var(--font-mono);font-size:9.5px;letter-spacing:.07em;
  text-transform:uppercase;color:var(--text-mute);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;
}
.chain-item:hover{background:rgba(var(--i-rgb,255,255,255),.09);}
.chain-item.active{
  background:rgba(var(--i-rgb,255,255,255),.12);
  box-shadow:inset 0 0 0 1px rgba(var(--i-rgb,255,255,255),.28);
}
/* Il pallino passa a destra e diventa lo stato "sei qui": a sinistra
   duplicava il logo, che il colore della rete lo porta gia'. */
.chain-item .chain-dot{
  width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-left:auto;
  opacity:0;transition:opacity var(--v4-t) var(--v4-ease);
}
.chain-item.active .chain-dot{
  opacity:1;box-shadow:0 0 10px rgba(var(--i-rgb,255,255,255),.9);
}
.chain-soon{
  margin-left:auto;flex-shrink:0;
  font-size:8.5px;letter-spacing:.14em;text-transform:uppercase;
  padding:3px 7px;border-radius:99px;border:1px solid currentColor;
  opacity:.75;
}
/* Il bottone che apre il menu: il logo della rete attiva accanto al nome. */
.chain-trigger{
  border-radius:999px;
  border-color:var(--v4-edge-lo);
  background-image:var(--v4-glass-soft);
  transition:border-color var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease),
             transform var(--v4-t-fast) var(--v4-ease);
}
.chain-trigger:hover{
  border-color:rgba(var(--green-rgb),.45);
  transform:translateY(-1px);
  box-shadow:0 8px 22px -14px rgba(var(--green-rgb),1);
}

/* ---- 18.1d I TITOLI DI SEZIONE E IL RITMO DELLE SCHERMATE ----
   ==========================================================================
   Ogni schermata dell'applicazione apre con un titolo da 15px preceduto da
   una barretta colorata. A quella taglia un titolo non e' un titolo: e'
   un'etichetta, e infatti "Chat", "Watchlist" e "How it works" si leggevano
   come voci di menu finite in mezzo alla pagina.

   Qui salgono a una misura da titolo e la barretta diventa un filo che si
   spegne — la stessa figura della linea sotto la barra in alto e sopra il
   piede, cosi' le tre ricorrono e la pagina ha una punteggiatura sola.
   Nessuna misura di layout cambia: solo corpo, peso e crenatura.
   ========================================================================== */
.section-title{
  font-size:21px;font-weight:640;letter-spacing:-.032em;
}
#view-home .section-title{font-size:21px;}
.section-head{
  gap:12px;margin-block:34px 16px;
  align-items:center;
}
/* LA BARRETTA D'ACCENTO STA SU .section-title::before, NON SU .section-head.
   Ci ho messo la regola sbagliata al primo tentativo: .section-head::before
   in v3 e' tutt'altro — il filo orizzontale che fa da bordo superiore al
   pannello della lista — e con un width:3px !important glielo avevo
   accorciato a una scheggia. Qui si tocca solo il trattino verticale
   davanti al titolo, che e' l'elemento che intendevo: diventa un filo che
   si spegne verso il basso invece di un rettangolo pieno, e cresce con il
   titolo che ora e' piu' alto. */
.section-title::before{
  width:3px;height:22px;border-radius:3px;
  background:linear-gradient(180deg,var(--green),rgba(var(--green-rgb),.15));
  box-shadow:0 0 14px rgba(var(--green-rgb),.6);
}

/* IL BLOCCO "COSA SI PUO' LANCIARE".
   Chiuso era una riga di testo grigio con una freccia in fondo, appoggiata
   su una linea: non sembrava un comando, sembrava un residuo. Ora e' una
   superficie con un bordo, e la freccia sta in un tondo — cioe' ha l'aspetto
   di una cosa che si apre. */
#view-home .modes{
  border-radius:var(--v4-r-lg);
  border:1px solid transparent;
  background-image:var(--v4-glass-soft);
  box-shadow:var(--v4-inner),var(--v4-lift-1);
  margin-block:4px 16px;
  transition:box-shadow var(--v4-t) var(--v4-ease);
}
#view-home .modes:hover{box-shadow:var(--v4-inner),var(--v4-lift-2);}
#view-home .modes summary{
  padding:15px 18px;font-size:13.5px;font-weight:550;color:var(--text-dim);
}
#view-home .modes summary:hover{color:var(--text);}
#view-home .modes summary i{
  width:26px;height:26px;border-radius:50%;
  border:1px solid var(--v4-edge-lo);
  transform:none;
  display:flex;align-items:center;justify-content:center;
  background:rgba(255,255,255,.04);
  transition:transform .4s var(--v4-ease),border-color .4s var(--v4-ease),
             background .4s var(--v4-ease);
}
/* La freccia dentro il tondo: due lati di un quadrato ruotato, come prima,
   ma disegnati da un ::before cosi' il tondo puo' restare fermo mentre la
   punta gira. */
#view-home .modes summary i::before{
  content:"";width:7px;height:7px;margin-top:-3px;
  border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;
  transform:rotate(45deg);
  transition:transform .4s var(--v4-ease);
}
#view-home .modes summary:hover i{
  border-color:rgba(var(--green-rgb),.5);
  background:rgba(var(--green-rgb),.08);
}
#view-home .modes[open] summary i::before{transform:rotate(-135deg);margin-top:3px;}
#view-home .modes[open]{
  border-color:transparent;
  background-image:var(--v4-glass);
  box-shadow:var(--v4-inner),var(--v4-lift-2);
}
#view-home .mode{
  border-radius:var(--v4-r-md);
  background-image:var(--v4-glass-soft);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
  transition:transform var(--v4-t) var(--v4-ease),box-shadow var(--v4-t) var(--v4-ease);
}
#view-home .mode:hover{
  transform:translateY(-2px);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.3),
             0 10px 26px -16px rgba(var(--green-rgb),.9);
}

/* GLI STATI VUOTI, con qualcosa da guardare.
   "Nothing starred yet" in grigio al centro di un riquadro alto 130px si
   legge come un errore di caricamento. Il tratteggio dice "qui ci va
   qualcosa e non c'e' ancora", che e' la verita', e costa una riga. */
.empty-state,.pf-empty,#view-watchlist .empty-state{
  border:1px dashed var(--v4-edge-lo);
  border-radius:var(--v4-r-lg);
  padding-block:52px;
  font-size:13.5px;
}

/* LA COLONNA DI SINISTRA DELL'HERO.
   Il titolo e il paragrafo occupano 250px in una colonna alta 420: sotto
   restava un buco. Le tre garanzie lo riempiono con l'unica cosa che manca
   davvero li' — il motivo per cui fidarsi — e sono le stesse tre della
   landing, quindi chi arriva da li' le ritrova.
   Il markup non c'e': queste regole servono a .pitch-facts, che aggiungo in
   index.html. Restano inerti se quel blocco non esiste. */
#view-home .pitch{display:flex;flex-direction:column;}
#view-home .pitch-facts{
  margin-top:auto;padding-top:24px;
  display:flex;flex-direction:column;gap:1px;
}
#view-home .pf-line{
  display:flex;align-items:flex-start;gap:12px;
  padding:13px 0;border-top:1px solid var(--v4-edge-lo);
}
#view-home .pf-line:last-child{border-bottom:1px solid var(--v4-edge-lo);}
#view-home .pf-line svg{
  width:15px;height:15px;flex-shrink:0;margin-top:2px;color:var(--green);
}
#view-home .pf-line b{font-size:13.5px;font-weight:600;letter-spacing:-.018em;color:var(--text);}
#view-home .pf-line span{
  display:block;margin-top:3px;font-size:12.5px;line-height:1.55;color:var(--text-dim);
}
@media (max-width:1080px){
  /* Il markup di .pitch-facts e' stato tolto da index.html: la regola resta
   solo perche' l'hero delle chain non ancora attive lo ricostruirebbe, e in
   quel caso deve restare invisibile come qui. */
#view-home .pitch-facts{display:none;}   /* sotto, la lista arriva subito */
}

/* ---- 18.1e IL CASSETTO SU TELEFONO ----
   E' la navigazione intera del sito su schermo stretto, ed era un pannello
   opaco color fondo con sette voci grigie. Vetro sfocato sopra la pagina,
   voci piu' alte (sono bersagli per il dito, 34px erano pochi), il logo di
   ogni rete al posto del pallino, e i due bottoni in fondo con i ruoli
   giusti. La transizione passa dalla curva lineare di 200ms alla curva del
   resto del sito: un cassetto che scatta sembra un menu di sistema. */
@media (max-width:900px){
  .sidebar{
    width:292px;
    background:linear-gradient(180deg,
      rgba(var(--v4-bar-rgb,6,9,13),.92),rgba(var(--v4-bar-rgb,6,9,13),.86));
    backdrop-filter:blur(22px) saturate(1.3);
    -webkit-backdrop-filter:blur(22px) saturate(1.3);
    border-right:1px solid var(--v4-edge-lo);
    /* L'ombra del cassetto: niente finche' e' chiuso.
       Il cassetto chiuso non e' nascosto, e' TRADOTTO: sta a sinistra del
       bordo dello schermo (da -292 a 0). L'ombra, pero', e' spostata di 30px
       a DESTRA con 80 di sfocatura, quindi rientrava in pagina e dipingeva
       una fascia nera lungo tutto il margine sinistro, sempre, anche a menu
       chiuso. Sul tema scuro si notava poco; sul chiaro era una striscia
       grigia (misurata: 128,127,124 su un fondo da 244) che sembrava un
       difetto di resa.
       Ora c'e' solo quando il cassetto e' aperto, che e' l'unico momento in
       cui un'ombra ha qualcosa da separare. E la transizione la accompagna,
       cosi' non compare di scatto. */
    box-shadow:30px 0 80px -30px rgba(0,0,0,0);
    transition:transform .5s var(--v4-ease),
               box-shadow .5s var(--v4-ease);
    padding-inline:14px;
  }
  .sidebar.open{box-shadow:30px 0 80px -30px rgba(0,0,0,1);}

  .sidebar .side-label{padding-top:20px;letter-spacing:.16em;}
  .sidebar .side-link{
    padding:12px 12px;border-radius:var(--v4-r-md);font-size:15px;gap:12px;
    transition:background var(--v4-t) var(--v4-ease),color var(--v4-t-fast) var(--v4-ease);
  }
  .sidebar .side-link svg{width:18px;height:18px;}
  .sidebar .side-link.active{
    background:rgba(var(--green-rgb),.1);
    box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.24);
  }
  .sidebar .side-link.active::before{display:none;}
  .backdrop{
    background:rgba(2,4,7,.55);
    backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
    transition:opacity .5s var(--v4-ease);
  }
  .m-menu-btn,.m-search-btn,.theme-btn{
    border-radius:999px;
    border-color:var(--v4-edge-lo);
    background-image:var(--v4-glass-soft);
  }
}
/* Il logo della rete nel cassetto e nella colonna laterale, al posto del
   pallino: e' messo da chains.js (initSidebarChains). */
.side-chain-logo{
  width:20px;height:20px;flex-shrink:0;
  filter:drop-shadow(0 0 8px var(--chain-accent-soft,transparent));
}
.side-chain .side-chain-dot{display:none;}

/* ---- 18.2 PROFILO ----
   Lo striscione era un rettangolo con un gradiente e nient'altro: la prima
   cosa che si vede della propria pagina, ed era la meno curata del sito.
   Qui prende tre strati — la luce della rete in alto a sinistra, un
   reticolo finissimo che sfuma verso destra, e una linea accesa in basso su
   cui l'avatar si appoggia. */
.pf-banner{
  height:132px;border-radius:var(--v4-r-xl);
  background:
    radial-gradient(90% 200% at 4% 0%, rgba(var(--green-rgb),.3), transparent 58%),
    radial-gradient(70% 160% at 96% 10%, rgba(var(--green-rgb),.1), transparent 60%),
    linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,0) 70%),
    var(--panel-2);
  box-shadow:var(--v4-inner),var(--v4-lift-2);
  overflow:hidden;
}
.pf-banner::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    linear-gradient(rgba(255,255,255,.05) 1px,transparent 1px) 0 0/28px 28px,
    linear-gradient(90deg,rgba(255,255,255,.05) 1px,transparent 1px) 0 0/28px 28px;
  -webkit-mask-image:linear-gradient(100deg,#000,transparent 62%);
  mask-image:linear-gradient(100deg,#000,transparent 62%);
}
.pf-banner::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
  background:linear-gradient(90deg,rgba(var(--green-rgb),.7),transparent 62%);
  opacity:1;
}
.pf-avatar{
  border-radius:var(--v4-r-lg);
  box-shadow:0 0 0 3px var(--bg),
             inset 0 1px 0 rgba(255,255,255,.18),
             0 14px 34px -12px rgba(0,0,0,1),
             0 0 34px -12px rgba(var(--green-rgb),.7);
  transition:transform var(--v4-t) var(--v4-ease),box-shadow var(--v4-t) var(--v4-ease);
}
.pf-avatar:hover{transform:translateY(-2px) scale(1.02);}
.pf-name{letter-spacing:-.035em;}

/* ---- 18.3 DOCS ----
   Due problemi, uno di forma e uno di sostanza.

   FORMA: la pagina era una colonna sola con sette schede in cima e, sotto,
   un riquadro alto trecento pixel in mezzo a mille di vuoto. Su uno schermo
   da desktop sembrava una pagina non finita di caricare.
   Sopra i 1040px diventa quindi una documentazione vera: indice a sinistra,
   fisso mentre si legge, e testo a destra. Nessuna riga di markup cambia —
   .docs-wrap diventa una griglia e i tre pezzi che gia' contiene vengono
   collocati. I pannelli nascosti sono display:none e quindi escono dal
   flusso della griglia: quello visibile finisce sempre nella stessa cella.

   SOSTANZA: e' una pagina di sola lettura, quindi conta solo quanto e'
   facile leggerla. Misura di riga piu' corta, interlinea piu' alta, e le
   frasi marcate che smettono di essere grassetto e diventano evidenziate nel
   colore della rete. */
@media (min-width:1040px){
  #view-docs .docs-wrap{
    display:grid;
    /* La cornice e' quella di tutte le altre pagine (sezione 29), ma la
       colonna del testo si ferma a 760: sopra i settanta caratteri per riga
       l'occhio perde il capo della riga successiva, e questa e' una pagina
       che si legge dall'inizio alla fine. Il blocco si ancora a sinistra,
       quindi l'indice parte dove parte il titolo di ogni altra schermata. */
    /* Era 216px + 760px fissi, ancorati a sinistra: su uno schermo da 1440
       restavano 290px di pagina vuota alla destra del riquadro, e il blocco
       sembrava caduto in un angolo. La MISURA DI LETTURA pero' va difesa: e'
       il motivo per cui c'era il 760.
       Le due cose non sono in conflitto, perche' sono due cose diverse. La
       SUPERFICIE (il riquadro, il suo fondo, il suo bordo) puo' arrivare fino
       in fondo; il TESTO dentro resta a 72 caratteri per riga, come dice la
       regola piu' sotto. E' esattamente come e' fatta ogni documentazione
       tecnica che si legge volentieri. */
    grid-template-columns:216px minmax(0,1fr);
    justify-content:start;
    column-gap:48px;
    align-items:start;
    max-width:1360px;
  }
  #view-docs .docs-head{grid-column:1/-1;margin-bottom:30px;}
  #view-docs .docs-toc{
    grid-column:1;grid-row:2;
    position:sticky;top:88px;
    display:flex;flex-direction:column;align-items:stretch;gap:2px;
    padding-right:16px;
    border-right:1px solid var(--v4-edge-lo);
  }
  #view-docs .docs-tab{
    text-align:left;border-radius:var(--v4-r-sm);
    padding:9px 12px;letter-spacing:0;
    border:0;background:none;
    position:relative;
  }
  #view-docs .docs-tab::before{
    content:"";position:absolute;left:0;top:20%;bottom:20%;width:2px;
    border-radius:0 2px 2px 0;background:var(--green);
    transform:scaleY(0);transform-origin:center;
    transition:transform var(--v4-t) var(--v4-ease);
  }
  #view-docs .docs-tab.active::before{transform:scaleY(1);}
  #view-docs .docs-tab.active{background:rgba(var(--green-rgb),.08);box-shadow:none;}
  #view-docs .docs-tab:hover{transform:none;background:rgba(255,255,255,.045);}
  #view-docs .docs-panel{grid-column:2;grid-row:2;}
  #view-docs .docs-foot{grid-column:2;margin-top:36px;}
}
#view-docs .docs-panel p,#view-docs .docs-sec p{
  line-height:1.75;max-width:72ch;font-size:14.5px;
}
#view-docs .docs-panel strong,#view-docs .docs-sec strong{
  color:var(--text);
  box-shadow:inset 0 -.36em 0 rgba(var(--green-rgb),.22);
}
#view-docs .docs-sec,#view-docs .docs-panel{padding-block:26px;}
#view-docs .docs-sec h2,#view-docs .docs-sec h3,#view-docs .docs-panel h3{
  letter-spacing:-.03em;
}
#view-docs > .wrap > h1{
  font-size:clamp(30px,3.6vw,44px);letter-spacing:-.04em;
  background:linear-gradient(180deg,#fff 8%,rgba(255,255,255,.74) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
  padding-bottom:.08em;margin-bottom:-.04em;
}

/* ---- 18.4 TERMINAL ----
   Le tre colonne sono gia' la schermata piu' riuscita del sito. Qui prendono
   solo la testata appiccicata in cima — scorrendo una colonna lunga si
   perdeva di vista quale delle tre si stava leggendo. */
#view-terminal .tm-col-head{
  position:sticky;top:0;z-index:4;
  background:linear-gradient(180deg,var(--panel) 72%,transparent);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
}

/* ---- 18.5 GLI STATI VUOTI ----
   Una lista vuota diceva una riga di testo grigio in mezzo al niente. Non
   posso cambiare le parole da qui, ma posso far sembrare quel vuoto una
   scelta invece di un caricamento andato male. */
.empty-state,.pf-empty{
  border-radius:var(--v4-r-lg);
  background:
    radial-gradient(70% 100% at 50% 0%, rgba(var(--green-rgb),.05), transparent 70%);
}

/* ---- 18.6 LA PAGINA DI UN TOKEN ----
   ==========================================================================
   E' la schermata dove si spendono i soldi, ed era la piu' timida del sito.
   Tre cose non funzionavano, e sono tre problemi di GERARCHIA, non di stile:

   1. LA TESTATA non diceva di che token si trattava. Logo da 56px, nome da
      20px e prezzo da 23px stavano tutti sulla stessa riga con lo stesso
      peso, e il prezzo — il numero per cui uno apre la pagina — finiva
      schiacciato a destra sotto una didascalia da 10px.
   2. LA FASCIA DEI NUMERI erano sei riquadri da 60px di altezza su due righe:
      metà della prima schermata spesa per sei valori che stanno in una riga.
   3. LA CARD DENTRO LA CARD. Il grafico e' una .chart-card dentro una
      .tk2-card: due bordi e due fondi concentrici a 14px di distanza, che e'
      il difetto piu' visibile della pagina appena si sa riconoscerlo.
   ========================================================================== */

/* --- 1. la testata --- */
#view-token .tk2-head,#view-stock .tk2-head{
  padding:24px 26px;
  border-radius:var(--v4-r-xl);
  background:
    radial-gradient(80% 160% at 0% 0%, rgba(var(--green-rgb),.13), transparent 58%),
    linear-gradient(180deg,var(--panel),var(--bg-1));
  box-shadow:var(--v4-inner),var(--v4-lift-2);
  align-items:flex-start;
}
#view-token .tk2-img,#view-stock .tk2-img{
  width:72px;height:72px;border-radius:20px;font-size:26px;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.12),
             0 10px 28px -10px rgba(0,0,0,1),
             0 0 34px -14px rgba(var(--green-rgb),.8);
}
#view-token .tk2-name,#view-stock .tk2-name{
  font-size:clamp(24px,2.6vw,34px);font-weight:650;letter-spacing:-.038em;
  line-height:1.1;
}
#view-token .tk2-sym,#view-stock .tk2-sym{
  font-family:var(--font-mono);font-size:12px;letter-spacing:.06em;
  padding:4px 9px;border-radius:8px;
  background:rgba(var(--green-rgb),.1);
  border-color:rgba(var(--green-rgb),.26);
  color:var(--green);
}
#view-token .tk2-meta,#view-stock .tk2-meta{margin-top:9px;font-size:12px;}
/* Il prezzo e' il motivo per cui si apre la pagina: prende la taglia che
   merita, e l'etichetta gli va SOPRA in maiuscoletto invece che sotto in
   grigio — cosi' il numero e' l'ultima cosa che si legge e quella che resta. */
#view-token .tk2-px,#view-stock .tk2-px{display:flex;flex-direction:column-reverse;align-items:flex-end;gap:7px;}
#view-token .tk2-px-v,#view-stock .tk2-px-v{
  font-size:clamp(26px,2.8vw,36px);letter-spacing:-.04em;line-height:1;
  background:linear-gradient(180deg,#fff 12%,rgba(255,255,255,.72) 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
#view-token .tk2-px-l,#view-stock .tk2-px-l{
  margin:0;font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-mute);
}
#view-token .tk2-ib,#view-stock .tk2-ib{
  width:40px;height:40px;border-radius:13px;
  border-color:var(--v4-edge-lo);background-image:var(--v4-glass-soft);
  transition:transform var(--v4-t-fast) var(--v4-ease),
             border-color var(--v4-t) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
#view-token .tk2-ib:hover,#view-stock .tk2-ib:hover{
  transform:translateY(-2px);
  border-color:rgba(var(--green-rgb),.5);
  box-shadow:0 8px 22px -12px rgba(var(--green-rgb),1);
}

/* --- 2. la fascia dei numeri ---
   Sei celle in UNA riga sopra i 1080px: e' una fascia di strumenti, non una
   griglia di riquadri. I separatori sfumano alle estremita', come sulla home:
   un filo pieno da bordo a bordo taglia la fascia in scomparti. */
#view-token .tk2-kpi,#view-stock .tk2-kpi{
  border-radius:var(--v4-r-lg);
  background-image:var(--v4-glass-soft);
  box-shadow:var(--v4-inner),var(--v4-lift-1);
}
@media (min-width:1080px){
  #view-token .tk2-kpi,#view-stock .tk2-kpi{grid-template-columns:repeat(6,minmax(0,1fr));}
  #view-token .tk2-kpi>div:nth-child(n+4),#view-stock .tk2-kpi>div:nth-child(n+4){border-top:0;}
  #view-token .tk2-kpi>div:nth-child(3n),#view-stock .tk2-kpi>div:nth-child(3n){border-right:0;}
}
#view-token .tk2-kpi>div,#view-stock .tk2-kpi>div{
  position:relative;padding:15px 18px;border-right:0;border-top:0;
  transition:background var(--v4-t) var(--v4-ease);
}
#view-token .tk2-kpi>div:hover,#view-stock .tk2-kpi>div:hover{
  background:radial-gradient(130% 150% at 50% 0%,rgba(var(--green-rgb),.08),transparent 72%);
}
#view-token .tk2-kpi>div + div::before,#view-stock .tk2-kpi>div + div::before{
  content:"";position:absolute;left:0;top:18%;bottom:18%;width:1px;
  background:linear-gradient(180deg,transparent,var(--v4-edge-hi) 30%,
    var(--v4-edge-hi) 70%,transparent);
}
#view-token .tk2-k,#view-stock .tk2-k{letter-spacing:.15em;font-size:9px;}
#view-token .tk2-v,#view-stock .tk2-v{font-size:18px;letter-spacing:-.03em;margin-top:6px;}

/* --- 3. via la card dentro la card ---
   Il grafico e le altre schede vivono gia' dentro .tk2-card: qui perdono il
   proprio bordo, il proprio fondo e la propria ombra, e restano solo il
   contenuto. Nessun elemento si sposta — spariscono un bordo e un padding. */
#view-token .tk2-pane > .card,
#view-token .tk2-pane > .chart-card,
#view-stock .tk2-pane > .card,#view-stock .tk2-pane > .chart-card{
  background:none;background-image:none;
  border:0;box-shadow:none;border-radius:0;
  padding-inline:18px;
}
#view-token .tk2-pane > .card::after,#view-stock .tk2-pane > .card::after,#view-stock .tk2-pane > .chart-card::after,#view-stock .tk2-pane > .chart-card::before,
#view-token .tk2-pane > .chart-card::after,
#view-token .tk2-pane > .card::before,
#view-token .tk2-pane > .chart-card::before{display:none;}

/* --- la barra verso la migrazione ---
   E' la barra piu' importante del prodotto: dice quanto manca alla fine del
   rimborso. Sale a 8px, prende l'alone della rete e la luce che la percorre
   (qui si', perche' e' UNA e sta dicendo "sta succedendo adesso"). */
#view-token .tk2-bond,#view-stock .tk2-bond{padding:14px 18px;}
#view-token .tk2-bond-bar,#view-stock .tk2-bond-bar{
  height:8px;border-radius:99px;
  background:rgba(255,255,255,.06);
  box-shadow:inset 0 1px 3px rgba(0,0,0,.6);
}
#view-token .tk2-bond-bar > span,#view-stock .tk2-bond-bar > span{
  position:relative;overflow:hidden;
  background:linear-gradient(90deg,
    rgba(var(--green-rgb),.5) 0%,var(--green) 60%,var(--green-hi) 100%);
  box-shadow:0 0 14px -2px rgba(var(--green-rgb),.9);
}
#view-token .tk2-bond-bar > span::after,#view-stock .tk2-bond-bar > span::after{
  content:"";position:absolute;inset:0;
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.42) 50%,transparent);
  transform:translateX(-100%);
  animation:v4Sweep 2.8s var(--v4-ease-soft) infinite;
}
#view-token .tk2-bond-t b,#view-stock .tk2-bond-t b{font-size:15px;letter-spacing:-.02em;}

/* --- il pannello di acquisto ---
   Deve essere l'oggetto piu' presente dello schermo, non uno dei riquadri.
   Su schermo alto resta appiccicato mentre il grafico scorre: e' l'unica
   cosa della pagina che si usa, e scorrere per ritrovarla e' assurdo. */
#view-token .tk2-side > .card:first-child,
#view-token .trade-card,#view-token .buy-card,#view-stock .trade-card{
  box-shadow:var(--v4-inner),var(--v4-lift-3);
}
@media (min-width:1080px) and (min-height:820px){
  #view-token .tk2-side,#view-stock .tk2-side{position:sticky;top:82px;}
}
#view-token .trade-tab-row,#view-stock .trade-tab-row{
  border-radius:99px;padding:4px;
  background:rgba(0,0,0,.28);
  box-shadow:inset 0 1px 3px rgba(0,0,0,.5);
}
#view-token .trade-tab,#view-stock .trade-tab{border-radius:99px;font-weight:600;}
#view-token .trade-tab.active{
  box-shadow:inset 0 0 0 1px rgba(var(--buy-rgb),.4),
             0 6px 18px -10px rgba(var(--buy-rgb),.9);
}

#view-token .tk2-sym,#view-token .tk-name,#view-stock .tk-name{letter-spacing:-.035em;}

/* ==========================================================================
   19. L'INGRESSO
   ==========================================================================
   E' il pezzo che mancava, e spiega perche' l'applicazione "sembrava uguale".

   v2.js aveva una sequenza d'ingresso vera: hero in tre tempi, curva che si
   disegna, numeri che contano. Puntava a .hero, .hero-curve e .hero-copy,
   e v3 ha rifatto la home senza quegli elementi. Da allora l'app non ha
   nessun ingresso: si accende e basta, tutto insieme, allo stesso istante.
   La luce e i materiali di v4 non potevano bastare, perche' si vedono solo
   quando uno li cerca; l'ingresso lo vede chiunque, perche' e' la prima cosa
   che succede.

   COME FUNZIONA. v4.js mette `v4-intro` su <html> quando l'app e' pronta a
   entrare (dopo il benvenuto se c'e', altrimenti subito). Le regole qui
   sotto valgono SOLO con quella classe, con un ritardo scalato per ogni
   pezzo: la barra scende, il titolo sale riga per riga da sotto una maschera,
   il pannello in evidenza scivola da destra e si mette a fuoco, i numeri
   contano (v4.js), le righe della lista entrano in cascata. Un secondo e
   mezzo in tutto, una volta per caricamento, mai al cambio di rotta.

   SENZA JS non succede niente: lo stato nascosto esiste solo sotto
   html.v4-intro, quindi una pagina senza script e' semplicemente ferma.
   ========================================================================== */
/* PERCHE' E' STATO RIFATTO.
   C'erano quindici elementi con quindici ritardi diversi, distribuiti su
   1,1 secondi: la barra, poi la prima riga del titolo, poi la seconda, poi
   il paragrafo, poi le tre garanzie una alla volta, poi il pannello che
   arrivava da destra sfocato, poi la fascia dei numeri, poi i quattro numeri
   uno per uno, poi le modalita', poi la lista, poi le righe della lista in
   sedici passi. Ogni singolo pezzo era curato; messi insieme davano
   l'impressione che la pagina si stesse ancora caricando, o che si fosse
   rotta a meta'. Un ingresso si nota quando e' UNO: quindici ingressi sono
   quindici attese.

   Restano due movimenti. La prima schermata (titolo e pannello) sale insieme
   come un blocco solo; quello che sta sotto la piega la segue subito dopo,
   sempre tutto insieme. Mezzo secondo in tutto invece di uno e mezzo, e
   niente sfocature: era la sfocatura a far sembrare il pannello un'immagine
   che non aveva finito di scaricarsi. */
html.v4-intro .topbar{
  animation:v4TopIn .5s var(--v4-ease) backwards;
}
@keyframes v4TopIn{from{opacity:0;transform:translateY(-10px);}to{opacity:1;transform:none;}}

/* PRIMO MOVIMENTO: la prima schermata, in un pezzo solo.
   Il titolo NON si anima riga per riga. Una maschera per riga e' bella su una
   copertina, dove non c'e' altro; qui c'era anche un pannello che entrava da
   un'altra direzione nello stesso istante, e due movimenti contrari sulla
   stessa schermata si leggono come un errore. */
html.v4-intro #view-home .pitch,
html.v4-intro #view-home .feature{
  animation:v4Up .55s var(--v4-ease) .06s backwards;
}
@keyframes v4Up{from{opacity:0;transform:translateY(14px);}to{opacity:1;transform:none;}}

/* SECONDO MOVIMENTO: tutto il resto, insieme, appena dopo. */
html.v4-intro #view-home .market-bar,
html.v4-intro #view-home .trust,
html.v4-intro #view-home .modes,
html.v4-intro #view-home .tok-panel{
  animation:v4Up .55s var(--v4-ease) .2s backwards;
}

/* ==========================================================================
   20. IL FONDO DELL'HERO: NIENTE
   ==========================================================================
   Qui c'erano due effetti, e sono stati tolti tutti e due.

   LA CURVA. Un SVG largo quanto la colonna, dietro il titolo, con l'area
   sfumata sotto e un punto luminoso che la percorreva ogni sette secondi.
   Il problema non era l'esecuzione, era il soggetto: una curva ascendente
   su fondo scuro e' lo sfondo di ogni progetto del settore, e a forza di
   stare ovunque ha smesso di significare qualcosa. Non diceva "questo
   prodotto e' una curva di bonding", diceva "sito di criptovalute", che e'
   esattamente l'impressione da cui un launchpad serio deve stare lontano.
   In piu' passava DIETRO il paragrafo: una riga di testo attraversata da un
   tratto luminoso si legge peggio e sembra un errore di montaggio.

   LA LUCE CHE PASSA. Una banda chiara che attraversava l'hero in diagonale
   ogni nove secondi. Stessa storia: e' l'effetto "shimmer" dei modelli
   comprati, e su una schermata che mostra prezzi veri un luccichio
   periodico non aggiunge fiducia, la toglie.

   Il fondo dell'hero adesso e' il fondo della pagina. A portare la
   schermata restano la frase, i numeri e il token in evidenza, che sono
   cose vere. Una curva il sito ce l'ha gia', ed e' quella del grafico
   accanto, con i suoi dati sotto e la sua scala.
   ========================================================================== */
#view-home .pitch{position:relative;isolation:isolate;}
#view-home .split{position:relative;}

/* L'INSEGNA DELLE RETI NON ANCORA ATTIVE.
   Con la scheda del token nascosta, v3 porta la griglia a una colonna e ferma
   la colonna del titolo a 62 caratteri: su uno schermo da 1440 restavano
   settecento pixel vuoti a destra, e Arc e Solana sembravano una pagina
   diversa dalle altre tre. Ora nella cella libera va il riquadro che descrive
   la rete, e la geometria torna quella di tutte: due colonne, testo a
   sinistra, stato a destra.
   Stessa specificita' della regola di v3 (id + classe + :has con due classi),
   e questo foglio viene dopo: vince senza !important. */
#view-home .split:has(> .chain-notice:not(.hidden)){
  grid-template-columns:1fr 1.15fr;
}
#view-home .split > .chain-notice:not(.hidden){
  grid-column:2;grid-row:1;align-self:start;margin:0;
}
#view-home .split:has(> .chain-notice:not(.hidden)) .pitch{
  max-width:none;padding:4px;
}
/* Il titolo torna alla scala delle reti attive: accanto ha di nuovo un
   contrappeso, quindi non ha piu' bisogno di crescere per riempire. */
#view-home .split:has(> .chain-notice:not(.hidden)) .pitch h1{
  font-size:clamp(27px,2.75vw,40px);
}
@media (max-width:1080px){
  /* A colonna unica il riquadro torna in cima, dove stava: e' la prima cosa
     da sapere prima di leggere qualunque altra. */
  #view-home .split > .chain-notice:not(.hidden){order:0;margin-bottom:14px;}
}

/* ==========================================================================
   21. INCLINAZIONE
   ==========================================================================
   Il pannello in evidenza e le carte grandi si inclinano di pochi gradi
   verso il puntatore (v4.js scrive --v4-rx/--v4-ry). E' il gesto delle
   carte-prodotto di Apple: la superficie risponde alla mano. Quattro gradi
   e non di piu', perche' oltre i bordi del testo si distorcono.
   ========================================================================== */
.v4-tilt{
  transform:perspective(1100px) rotateX(var(--v4-rx,0deg)) rotateY(var(--v4-ry,0deg)) translateZ(0);
  transition:transform .6s var(--v4-ease);
  transform-style:preserve-3d;
}
.v4-tilt.v4-tilting{transition:transform .12s ease-out;}

/* ==========================================================================
   22. IL BENVENUTO
   ==========================================================================
   La prima cosa che un nuovo utente vede e' il modale dei termini. Era una
   finestra grigia con quattro paragrafi e una casella: l'inizio piu' triste
   possibile per un prodotto che vuole sembrare costato qualcosa.
   Il markup non cambia (e' legale, e app.js ne legge gli id). Cambia tutto
   il resto: il logo della rete grande e in luce, il titolo da titolo, i
   quattro paragrafi come quattro righe con una tacca colorata, la casella
   che si accende, il bottone pieno con il riflesso. Dietro, l'aurora della
   rete che si muove: e' l'unica cosa sullo schermo, quindi puo' permettersi
   di essere piu' forte che altrove.
   ========================================================================== */
#termsModal{
  background:
    radial-gradient(70% 60% at 20% 10%, rgba(var(--green-rgb),.22), transparent 60%),
    radial-gradient(60% 55% at 85% 90%, rgba(var(--v2-field-2,20,110,170),.18), transparent 60%),
    rgba(2,4,7,.86);
  backdrop-filter:blur(18px) saturate(1.2);
  -webkit-backdrop-filter:blur(18px) saturate(1.2);
}
#termsModal::before{
  content:"";position:absolute;inset:-20%;pointer-events:none;
  background:radial-gradient(40% 40% at 50% 50%, rgba(var(--green-rgb),.16), transparent 70%);
  animation:v4Aurora 14s ease-in-out infinite alternate;
}
@keyframes v4Aurora{from{transform:translate3d(-8%,-6%,0) scale(1);}to{transform:translate3d(8%,6%,0) scale(1.15);}}
#termsModal .modal{
  max-width:560px;padding:44px 44px 38px;
  border-radius:28px;
  text-align:left;
  animation:v4Welcome .9s var(--v4-ease) .1s both;
}
@keyframes v4Welcome{from{opacity:0;transform:translateY(22px) scale(.97);}to{opacity:1;transform:none;}}
/* Il logo: un ::before con l'immagine della rete attiva. Le cinque classi
   data-chain sotto scelgono il file, cosi' il benvenuto ha il marchio giusto
   su ogni rete senza toccare il markup. */
#termsModal .modal::before{
  content:"";display:block;width:64px;height:64px;margin:0 0 22px;
  background:url("logo.png") center/contain no-repeat;
  filter:drop-shadow(0 0 22px rgba(var(--green-rgb),.75));
  animation:v4LogoIn 1.2s var(--v4-ease) .2s both;
}
:root[data-chain="arc"] #termsModal .modal::before{background-image:url("logo-arc.png");}
:root[data-chain="bsc"] #termsModal .modal::before{background-image:url("logo-bsc.png");}
:root[data-chain="hyperevm"] #termsModal .modal::before{background-image:url("logo-hyper.png");}
:root[data-chain="solana"] #termsModal .modal::before{background-image:url("logo-solana.png");}
@keyframes v4LogoIn{from{opacity:0;transform:scale(.6) rotate(-30deg);}to{opacity:1;transform:none;}}
#termsModal h2{
  font-size:clamp(26px,3vw,34px);font-weight:650;letter-spacing:-.04em;line-height:1.08;
  margin-bottom:10px;
}
#termsModal .modal-sub{
  font-size:10px;letter-spacing:.2em;color:var(--green);margin-bottom:26px;
}
/* `.terms-body > p` e non piu' `.modal > p`: i paragrafi sono stati chiusi
   dentro il blocco che scorre (vedi la sezione 51 in fondo), quindi non sono
   piu' figli diretti del riquadro e questi quattro selettori avrebbero
   smesso di applicarsi in silenzio — via i pallini, via le righe di
   separazione, via il grassetto chiaro. */
#termsModal .terms-body > p{
  position:relative;padding:12px 0 12px 22px;margin:0;
  font-size:13.5px;line-height:1.6;color:var(--text-dim);
  border-top:1px solid var(--v4-edge-lo);
}
#termsModal .terms-body > p:last-of-type{border-bottom:1px solid var(--v4-edge-lo);}
#termsModal .terms-body > p::before{
  content:"";position:absolute;left:0;top:18px;width:8px;height:8px;border-radius:50%;
  background:var(--green);box-shadow:0 0 12px rgba(var(--green-rgb),.9);
}
#termsModal .terms-body > p strong{color:var(--text);}
#termsModal .accept-row{
  margin-top:24px;padding:14px 16px;border-radius:var(--v4-r-md);
  background:rgba(255,255,255,.03);
  border:1px solid var(--v4-edge-lo);
  transition:border-color var(--v4-t) var(--v4-ease),background var(--v4-t) var(--v4-ease);
}
#termsModal .accept-row:has(input:checked){
  border-color:rgba(var(--green-rgb),.5);
  background:rgba(var(--green-rgb),.07);
}
#termsModal .btn-enter{
  margin-top:16px;width:100%;padding:16px;
  border-radius:999px;font-size:15px;
}
#termsModal .btn-enter:disabled{opacity:.45;}

/* ==========================================================================
   23. LA HOME, CON UN RITMO
   ==========================================================================
   Tutti i blocchi della home avevano lo stesso peso: stessa larghezza,
   stesso fondo, stesso raggio, stessa distanza. Un elenco di pannelli, non
   una pagina. Qui si decide cosa domina in ogni schermata:
     - il titolo su DUE righe, non tre ("Change / your mind." orfano);
     - le cifre piu' grandi, perche' sono la prova;
     - una riga di fiducia subito sotto le cifre, dove uno se la chiede;
     - i titoli di sezione con una riga sotto, e piu' aria sopra.
   ========================================================================== */
/* 60px erano tarati su un titolo di due parole per riga. La frase ora e' una
   sola e deve stare in due righe dentro una colonna larga meta' schermo: a 44
   ci sta, a 60 andava a quattro righe e spingeva giu' tutto il resto.
   La taglia vera e' piu' sotto, nella sezione 22: qui restano solo le regole
   di impaginazione delle due righe. */
#view-home .pitch h1{letter-spacing:-.035em;line-height:1.1;}
#view-home .pitch h1 > span,
#view-home .pitch h1 > em{display:block;font-style:normal;}
#view-home .pitch h1 > br{display:none;}   /* con span ed em a blocco, il br e' una riga vuota */
#view-home .ms-item dd{font-size:30px;}
@media (max-width:760px){#view-home .ms-item dd{font-size:19px;letter-spacing:-.04em;}}

/* La riga della fiducia. Quattro voci con un segno di spunta nel colore
   della rete, in una riga sola, senza riquadro: e' una didascalia delle
   cifre, non un altro pannello. Sotto i 900px va su due colonne. */
#view-home .trust{
  list-style:none;margin:0 0 18px;padding:14px 22px;
  display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px 24px;
  border-radius:var(--v4-r-lg);
  background:linear-gradient(90deg,rgba(var(--green-rgb),.05),transparent 60%);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
}
#view-home .trust li{
  display:flex;align-items:center;gap:0;
  font-size:12.5px;font-weight:500;letter-spacing:-.01em;color:var(--text-dim);
  min-width:0;line-height:1.35;
}
#view-home .trust li svg{
  width:18px;height:18px;padding:3.5px;border-radius:50%;flex-shrink:0;margin-right:10px;
  color:var(--green);
  background:rgba(var(--green-rgb),.12);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.3);
}
#view-home .trust .dexn{color:var(--text);font-weight:600;margin-left:.32em;}
@media (max-width:900px){
  #view-home .trust{grid-template-columns:1fr 1fr;padding:14px 16px;}
}
@media (max-width:520px){#view-home .trust{grid-template-columns:1fr;}}

/* I titoli di sezione, con la riga sotto e l'aria sopra. Il margine di
   .how e' inline nel markup (32px): l'unico !important di questa sezione. */
#view-home .how{margin-top:40px !important;}
#view-home .why{margin-top:36px;}
#view-home .how .section-head,#view-home .why .section-head{
  background:none;border:0;box-shadow:none;border-radius:0;
  padding:0;margin:0 0 6px;overflow:visible;
}
#view-home .how .section-head::before,#view-home .why .section-head::before{display:none;}
#view-home .how .section-title,#view-home .why .section-title{font-size:26px;}
#view-home .section-lede{
  margin:0 0 24px 15px;font-size:14.5px;line-height:1.6;color:var(--text-dim);
  max-width:60ch;
}
#view-home .why .section-lede{margin-bottom:18px;}

/* ==========================================================================
   24. L'INCHIOSTRO SOTTO LE SCHEDE
   ==========================================================================
   Le file di schede (filtri della home, schede del token, del profilo)
   cambiavano lo sfondo della voce attiva: la voce nuova si accende, la
   vecchia si spegne, e fra le due non succede niente. Ora un'unica pillola
   SCIVOLA dalla vecchia alla nuova (v4.js la posiziona). E' il controllo
   segmentato di iOS, ed e' il dettaglio che piu' di ogni altro fa sembrare
   un'interfaccia "nativa" invece che "web".
   La pillola sta SOTTO la voce (z-index 0, voci a 1) cosi' il testo resta
   leggibile e il fondo della voce attiva, che gia' c'e', si somma.
   ========================================================================== */
.feed-tabs,.tk2-tabs,.pf-tabs{position:relative;}
.feed-tabs > *,.tk2-tabs > *,.pf-tabs > *{position:relative;z-index:1;}
.v4-ink{
  position:absolute;left:0;top:0;height:0;width:0;z-index:0 !important;
  border-radius:999px;pointer-events:none;
  background:rgba(var(--green-rgb),.13);
  /* Solo il contorno INTERNO. La seconda ombra era un alone da 22px che
     usciva sotto la pillola e sfumava sul fondo: il colore andava fuori dal
     bordo, ed e' proprio la cosa che questa pillola non deve fare, perche'
     scorre da una voce all'altra e si porta la macchia dietro. */
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.35);
  opacity:0;
  transition:transform .45s var(--v4-ease),width .45s var(--v4-ease),
             height .45s var(--v4-ease),opacity .3s var(--v4-ease);
}
.v4-ink.on{opacity:1;}
/* Quando l'inchiostro c'e', la voce attiva non ha piu' bisogno del proprio
   fondo: si sommerebbero due pillole. Resta il colore del testo.

   #view-home DAVANTI, e non e' pedanteria: il fondo della voce attiva e'
   dichiarato in v3 come "#view-home .feed-tab.active", e un id batte
   qualunque numero di classi a prescindere dall'ordine dei file. Il risultato
   era esattamente la somma che questa regola serve a impedire: il rettangolo
   della voce a raggio 10px acceso al 14%, e sopra la pillola a raggio 999px
   accesa al 13% col suo filo di contorno. Due bordi con curve diverse a un
   pixel di distanza, che a schermo non si leggono come due bordi ma come un
   bordo sbavato: e' l'alone che si vedeva intorno a "Trending". */
#view-home .feed-tabs.v4-inked .feed-tab.active,
#view-home .pf-tabs.v4-inked .pf-tab.active,
.feed-tabs.v4-inked .feed-tab.active,.pf-tabs.v4-inked .pf-tab.active,
.tk2-tabs.v4-inked .tk2-tab.active{
  background:transparent;box-shadow:none;border-color:transparent;
}
/* Sulle schede del token l'inchiostro e' una sottolineatura, non una pillola.
   bottom:0 e non -1: la barra ha overflow-x:auto, quindi quel pixel fuori
   veniva tagliato e la sottolineatura si vedeva alta uno invece che due.
   La riga sotto la voce attiva la disegna gia' l'inchiostro: il bordo di v2
   sparisce, o si vedono due righe dello stesso colore a un pixel di
   distanza. */
.tk2-tabs .v4-ink{
  border-radius:2px 2px 0 0;height:2px !important;top:auto;bottom:0;
  /* Stessa ragione: la sottolineatura e' spessa due pixel, l'alone da 12px
     ne accendeva dodici e sbavava sopra il testo delle schede. */
  background:var(--green);box-shadow:none;
}
.tk2-tabs.v4-inked .tk2-tab.active{border-bottom-color:transparent;}

/* ==========================================================================
   25. LE COSE CHE ARRIVANO
   ==========================================================================
   Una riga nuova nella lista o un nuovo scambio nell'attivita' live si
   accende per un secondo e mezzo: e' l'unico modo in cui uno si accorge che
   la pagina si e' aggiornata senza fissarla. Un lampo nel colore della rete
   che sfuma, e nient'altro si muove.
   ========================================================================== */
.v4-new{animation:v4Flash 1.6s var(--v4-ease) both;}
@keyframes v4Flash{
  0%{background-color:rgba(var(--green-rgb),.16);box-shadow:inset 3px 0 0 var(--green);}
  100%{background-color:transparent;box-shadow:inset 3px 0 0 transparent;}
}

/* Gli scheletri di caricamento scintillano invece di stare fermi in grigio:
   "fermo" si legge come "rotto", "scintilla" come "sta arrivando". */
.skel-line{
  background:linear-gradient(90deg,rgba(255,255,255,.05) 0%,rgba(255,255,255,.13) 50%,rgba(255,255,255,.05) 100%) !important;
  background-size:220% 100% !important;
  animation:v4Shimmer 1.5s ease-in-out infinite;
  border-radius:6px;
}
@keyframes v4Shimmer{from{background-position:120% 0;}to{background-position:-120% 0;}}

/* Il cambio di rete non e' piu' uno scatto: il fondo e la barra passano al
   colore nuovo in un secondo, come sulla landing. */
html,body{transition:background-color .9s var(--v4-ease);}

/* ==========================================================================
   26. L'ATTIVITA' DAL VIVO
   ==========================================================================
   La colonna accanto al token in evidenza: gli scambi che arrivano adesso.
   Era il 40% del riquadro con dentro "No trades yet." in grigio, e quando
   gli scambi c'erano erano sei righe da 11px. Ora la colonna e' piu'
   stretta (250px), ogni scambio e' una riga con l'avatar del token, il
   verso in una pastiglia verde o rossa e l'importo in monospaziato; e il
   vuoto e' un'attesa disegnata, non una frase.
   ========================================================================== */
#view-home .feature{grid-template-columns:1fr 250px;}
@media (max-width:1080px){#view-home .feature{grid-template-columns:1fr;}}
/* La pillola sopra il titolo. Stessa forma e stesso pallino della landing:
   e' il primo elemento che si vede entrando, e ritrovarlo identico e' meta'
   del lavoro di far sembrare i due un posto solo. */
#view-home .pitch-kick{
  align-self:flex-start;
  display:inline-flex;align-items:center;gap:8px;
  padding:6px 13px 6px 10px;margin-bottom:16px;border-radius:999px;
  border:1px solid rgba(var(--green-rgb),.26);
  background:rgba(var(--green-rgb),.07);
  font-size:10px;font-weight:600;letter-spacing:.17em;text-transform:uppercase;
  color:var(--green);
}
#view-home .pitch-kick::before{
  content:"";width:6px;height:6px;border-radius:50%;flex-shrink:0;
  background:var(--green);box-shadow:0 0 10px rgba(var(--green-rgb),.9);
}
/* L'onda che si espande: la stessa del pallino "vivo" altrove nel sito.
   Le coordinate ricalcano quelle del pallino qui sopra — 10px di padding a
   sinistra, centrato in verticale — perche' un pseudo-elemento assoluto non
   sa dove sia il fratello che deve seguire. */
#view-home .pitch-kick::after{
  content:"";position:absolute;left:10px;top:calc(50% - 3px);
  width:6px;height:6px;border-radius:50%;
  background:var(--green);opacity:0;
  animation:v4KickPing 2.6s var(--v4-ease) infinite;
  pointer-events:none;
}
@keyframes v4KickPing{
  0%{transform:scale(1);opacity:.55;}
  70%,100%{transform:scale(3.4);opacity:0;}
}
@media (prefers-reduced-motion:reduce){#view-home .pitch-kick::after{animation:none;}}

#view-home .feat-side{padding:16px 16px 10px;}

/* L'ALTEZZA DELL'INSEGNA NON LA DECIDE PIU' L'ATTIVITA' DAL VIVO.
   Il pannello e' una griglia di due celle e la riga e' alta quanto la piu'
   alta delle due. A destra c'e' un elenco che arriva dalla chain: su una rete
   con sei scambi recenti diventava piu' alto della scheda del token a
   sinistra, e allora il pannello cresceva, la colonna del titolo — che ha
   sempre le stesse due frasi — restava centrata in mezzo a un vuoto, e la
   scheda del token si ritrovava mezzo pannello vuoto sotto.
   Il risultato era che la stessa schermata aveva un aspetto diverso su ogni
   rete: su HyperEVM, con tre scambi, era giusta; su Robinhood, con sei, era
   sbilanciata. Non era una scelta di disegno, era il numero di righe che
   arrivava dal server.
   Con flex-basis:0 l'elenco non porta piu' la propria altezza al calcolo:
   l'insegna e' alta quanto la scheda del token, sempre, su tutte le reti, e
   le righe che non ci stanno restano sotto, raggiungibili scorrendo.

   QUATTRO RIGHE, E LE ALTRE SI RAGGIUNGONO SCORRENDO.
   Prima le righe in eccesso venivano tagliate: si vedeva mezza riga sfumata
   e quello che c'era sotto non si poteva raggiungere. Ora l'elenco scorre —
   dodici scambi dentro l'altezza di quattro — e il pannello resta della
   stessa taglia su qualunque rete, con qualunque quantita' di scambi. */

/* Le quattro righe valgono OVUNQUE, non solo sul monitor grande.
   La regola stava tutta dentro @media (min-width:1081px) perche' nasceva per
   pareggiare le due colonne del pannello, e sotto quella soglia le colonne
   diventano una sola. Ma il problema che risolve non e' l'equilibrio fra
   colonne: e' un elenco che arriva dalla chain e cresce a piacere. Su
   telefono infatti si allungava per dodici righe, cioe' due schermate e
   mezza di scambi prima ancora di aver visto il resto della home.
   Fuori dalla griglia non c'e' un fratello da pareggiare, quindi l'altezza si
   dichiara: 196px sono esattamente quattro righe da 49. */
#view-home .feat-side > #trendingRow{
  overflow-y:auto;overscroll-behavior:contain;
  /* La barra e' sottile e nel colore del bordo: deve dire che si puo'
     scorrere senza diventare un elemento grafico. */
  scrollbar-width:thin;scrollbar-color:var(--v4-edge-hi) transparent;
}
/* La sfumatura in fondo dice "c'e' dell'altro sotto", quindi va messa solo
   quando c'e' davvero dell'altro sotto: con quattro scambi o meno l'elenco
   finisce dove si vede, e una sfumatura li' sbiadirebbe l'ultima riga per
   annunciare il nulla. La quinta riga e' la condizione esatta. */
#view-home .feat-side > #trendingRow:has(.ev:nth-child(5)){
  -webkit-mask-image:linear-gradient(180deg,#000 88%,transparent 100%);
  mask-image:linear-gradient(180deg,#000 88%,transparent 100%);
}
@media (max-width:1080px){
  #view-home .feat-side > #trendingRow{max-height:196px;}
}
@media (min-width:1081px){
  #view-home .feature{align-items:stretch;min-height:232px;}
  #view-home .feat-side{display:flex;flex-direction:column;min-height:0;}
  #view-home .feat-side > .k{flex:none;}
  #view-home .feat-side > #trendingRow{flex:1 1 0;min-height:0;}
}
#view-home .feat-side .k{letter-spacing:.16em;margin-bottom:6px;}
/* 12px e non 10: quattro righe riempiono esattamente l'altezza visibile
   dell'elenco, quindi non se ne vede mezza tagliata sotto, e ogni riga ha
   il bersaglio piu' comodo da toccare. */
#view-home .ev{
  padding:12px 4px;gap:10px;border-radius:var(--v4-r-sm);
  transition:background var(--v4-t) var(--v4-ease),transform var(--v4-t) var(--v4-ease);
}
#view-home .ev:hover{background:rgba(255,255,255,.04);transform:translateX(2px);}
#view-home .ev-av{
  width:28px;height:28px;border-radius:9px;font-size:11px;font-weight:600;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.1),0 4px 10px -6px rgba(0,0,0,1);
}
#view-home .ev-b{
  font-size:8.5px;letter-spacing:.1em;padding:3px 7px;border-radius:99px;
  border:1px solid transparent;
}
#view-home .ev-b.buy{color:#4ade80;background:rgba(74,222,128,.1);border-color:rgba(74,222,128,.28);}
#view-home .ev-b.sell{color:#ff6b78;background:rgba(255,79,98,.1);border-color:rgba(255,79,98,.28);}
#view-home .ev-b.new{color:var(--green);background:rgba(var(--green-rgb),.12);border-color:rgba(var(--green-rgb),.3);}
#view-home .ev-n{font-size:12.5px;font-weight:600;letter-spacing:-.01em;}
#view-home .ev-v{font-size:11.5px;color:var(--text);font-variant-numeric:tabular-nums;}

/* Il vuoto: un anello che respira e due righe. "No trades yet." lo scrive
   app.js; la seconda riga e la figura le mette il CSS. */
#view-home #trendingRow .hl-empty{
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:34px 8px 30px !important;
  font-size:13px;color:var(--text-dim);min-height:220px;
}
#view-home #trendingRow .hl-empty::before{
  content:"";width:38px;height:38px;border-radius:50%;margin-bottom:16px;
  border:1.5px solid rgba(var(--green-rgb),.5);
  box-shadow:0 0 0 6px rgba(var(--green-rgb),.06),0 0 24px -6px rgba(var(--green-rgb),.8);
  background:radial-gradient(circle,rgba(var(--green-rgb),.35) 0%,transparent 60%);
  animation:v4Breathe 2.8s ease-in-out infinite;
}
@keyframes v4Breathe{
  0%,100%{box-shadow:0 0 0 6px rgba(var(--green-rgb),.06),0 0 24px -6px rgba(var(--green-rgb),.8);transform:scale(1);}
  50%{box-shadow:0 0 0 12px rgba(var(--green-rgb),.03),0 0 34px -4px rgba(var(--green-rgb),1);transform:scale(1.06);}
}
#view-home #trendingRow .hl-empty::after{
  content:"Trades on this chain show up here the moment they land.";
  display:block;margin-top:6px;font-size:11.5px;line-height:1.5;color:var(--text-mute);
  max-width:20ch;
}

/* ==========================================================================
   27. LA CHAT
   ==========================================================================
   Era una card con una lista di righe bordate e una casella di testo: leggibile
   e anonima. Ora ogni messaggio e' una riga con un avatar, il mittente in
   monospaziato accentato, l'ora a destra e il testo sotto; i propri messaggi
   hanno una barra nel colore della rete; il team porta la pastiglia "dev";
   la casella sta appoggiata in fondo su vetro e il bottone e' pieno. Il
   markup non cambia: app.js lo genera.
   ========================================================================== */
#view-chat .section-title{font-size:26px;}
#view-chat .list-note{font-size:14.5px;color:var(--text-dim);margin:0 0 20px 15px;max-width:60ch;}
#view-chat .gc-card{padding:0;overflow:hidden;border-radius:var(--v4-r-xl);}
#view-chat .gc-list{
  max-height:min(62vh,640px);overflow-y:auto;padding:8px 0;
  overscroll-behavior:contain;
}
#view-chat .cm-row,#view-chat .gc-row{
  display:grid;grid-template-columns:36px minmax(0,1fr);column-gap:13px;
  padding:13px 20px;border:0;border-radius:0;background:none;
  border-bottom:1px solid var(--v4-edge-lo);
  transition:background var(--v4-t) var(--v4-ease);
}
#view-chat .cm-row:last-child,#view-chat .gc-row:last-child{border-bottom:0;}
#view-chat .cm-row:hover,#view-chat .gc-row:hover{background:rgba(255,255,255,.025);}
/* L'avatar: un tondo con la prima lettera sarebbe la cosa giusta, ma il
   markup non porta un'iniziale leggibile (e' un indirizzo). Un tondo con il
   gradiente della rete, piu' pieno per il team, distingue abbastanza. */
#view-chat .cm-row::before,#view-chat .gc-row::before{
  content:"";grid-row:1 / span 2;width:36px;height:36px;border-radius:12px;
  background:linear-gradient(150deg,rgba(255,255,255,.14),rgba(255,255,255,.04));
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.1);
}
#view-chat .cm-row:has(.cm-badge)::before,#view-chat .gc-row.is-admin::before{
  background:linear-gradient(150deg,rgba(var(--green-rgb),.55),rgba(var(--green-rgb),.15));
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.4),0 0 18px -6px rgba(var(--green-rgb),.9);
}
#view-chat .cm-row.is-me,#view-chat .gc-row.is-me{
  background:linear-gradient(90deg,rgba(var(--green-rgb),.07),transparent 50%);
  box-shadow:inset 3px 0 0 var(--green);
}
#view-chat .cm-head,#view-chat .gc-head{margin-bottom:4px;gap:8px;}
#view-chat .cm-who,#view-chat .gc-who{font-size:12px;letter-spacing:.02em;color:var(--text);font-weight:500;}
#view-chat .cm-who:hover,#view-chat .gc-who:hover{color:var(--green);}
#view-chat .cm-badge,#view-chat .gc-badge{
  padding:2px 7px;border-radius:99px;font-size:8.5px;letter-spacing:.12em;
  color:var(--green);background:rgba(var(--green-rgb),.12);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.3);
}
#view-chat .cm-time,#view-chat .gc-time{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.04em;margin-left:auto;}
#view-chat .gc-tools{display:flex;gap:4px;}
#view-chat .gc-t{border-radius:8px;}
#view-chat .cm-body,#view-chat .gc-body{font-size:14px;line-height:1.55;}
#view-chat .cm-empty{
  margin:14px 16px;padding:44px 16px;border-radius:var(--v4-r-lg);
  border:1px dashed var(--v4-edge-lo);font-size:13.5px;
}
/* La casella: appoggiata in fondo, su vetro, sempre visibile mentre la
   lista scorre sopra. */
#view-chat .cm-box{
  margin:0;padding:14px 16px 6px;gap:10px;
  background:linear-gradient(180deg,transparent,rgba(var(--v4-bar-rgb,6,9,13),.7) 30%);
  border-top:1px solid var(--v4-edge-lo);
}
#view-chat .cm-box textarea{
  border-radius:var(--v4-r-md);padding:12px 14px;font-size:14px;
  background:rgba(0,0,0,.28);border:1px solid var(--v4-edge-lo);
  box-shadow:inset 0 2px 6px rgba(0,0,0,.4);
  transition:border-color var(--v4-t) var(--v4-ease),box-shadow var(--v4-t) var(--v4-ease);
}
#view-chat .cm-box textarea:focus{
  border-color:rgba(var(--green-rgb),.55);
  box-shadow:0 0 0 4px rgba(var(--green-rgb),.1),inset 0 2px 6px rgba(0,0,0,.3);
}
#view-chat #gcSend{
  padding:12px 20px;border-radius:999px;font-weight:600;
  color:var(--on-green);border:0;
  background:linear-gradient(168deg,var(--green-hi),var(--green) 55%,var(--green-dim));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.34),0 10px 26px -12px rgba(var(--green-rgb),.9);
}
#view-chat #gcSend:hover{transform:translateY(-1px);filter:brightness(1.05);}
#view-chat .cm-hint{padding:0 16px 14px;margin:0;font-size:11.5px;}
#view-chat .gc-pin{
  border-radius:var(--v4-r-lg);padding:14px 18px;margin-bottom:14px;
  background:linear-gradient(90deg,rgba(var(--green-rgb),.1),transparent 60%);
  box-shadow:inset 3px 0 0 var(--green),inset 0 0 0 1px var(--v4-edge-lo);
}

/* ==========================================================================
   28. UNA VOCE SOLA PER I TITOLI
   ==========================================================================
   Il titolo della home, quello della landing e quello degli stock token
   avevano tre trattamenti diversi: bianco, gradiente oro su meta' frase,
   gradiente oro su meta' frase con un'altra angolazione. Tre modi di scrivere
   la stessa cosa nello stesso sito sono la ragione per cui, scorrendo, sembra
   che ogni pagina venga da un progetto diverso.
   Da qui in poi i titoli sono monocromatici ovunque. Il colore della rete non
   sparisce: sta nei bottoni, nelle pillole, nelle barre di avanzamento, nei
   numeri che contano e nella curva — dove indica qualcosa, invece di
   decorare una frase. */
/* L'ECCEZIONE, UNA SOLA E RICONOSCIBILE.
   La seconda riga dell'insegna — "Change your mind." nella home, la stessa
   sulla landing — corre dal bianco all'accento della rete. E' l'unico testo
   del sito che prende colore, e cambia quando si cambia catena: e' li' che si
   vede, senza doverlo scrivere, che il prodotto e' lo stesso su cinque
   catene. Tutti gli altri titoli restano monocromatici, quindi questa resta
   un'eccezione e non un terzo trattamento tipografico.
   Il ritaglio sul testo taglia le code di g/y/p quando l'interlinea sta sotto
   1: lo spazio si restituisce col padding e si riassorbe col margine. */
#view-home .pitch h1 > em{
  background:linear-gradient(96deg,#ffffff 0%,var(--green) 78%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
  padding-bottom:.14em;margin-bottom:-.14em;
}
/* Solana ha due colori, non uno: la sfumatura li attraversa entrambi. */
:root[data-chain="solana"] #view-home .pitch h1 > em{
  background:linear-gradient(96deg,#ffffff 0%,var(--green) 52%,var(--green-hi) 100%);
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:transparent;color:transparent;
}
/* Se il ritaglio sul testo non e' supportato, il riempimento trasparente
   lascerebbe la frase INVISIBILE invece che sfumata: si torna al colore
   pieno, nessun effetto ma si legge. */
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  #view-home .pitch h1 > em{
    background:none;-webkit-text-fill-color:var(--green);color:var(--green);
  }
}

.mb-grad{
  background:none;
  -webkit-background-clip:border-box;background-clip:border-box;
  -webkit-text-fill-color:currentColor;
  color:inherit;
  /* Il ritaglio sul testo non c'e' piu': lo spazio per la coda della "g" era
     compensato da un margine negativo, e senza ritaglio quei due valori
     sfalsavano la riga. */
  display:inline;padding-bottom:0;margin-bottom:0;
}
/* Il titolo degli stock token adesso e' una frase intera e non due parole:
   piu' respiro fra le righe, e un corpo che non lo fa diventare un cartello. */
.mb-title{font-size:clamp(21px,2.6vw,32px);line-height:1.12;}

/* ==========================================================================
   29. UNA MISURA SOLA PER TUTTE LE PAGINE
   ==========================================================================
   E' il motivo piu' grosso per cui, passando da una schermata all'altra, il
   sito sembrava un insieme di pezzi presi da progetti diversi. Nove pagine
   avevano OTTO larghezze:

     home, chat        1360
     terminal          1600
     stocks            1440
     profilo, token    1240
     create            1080
     docs              1060
     watchlist          640

   Tutte centrate, quindi il bordo sinistro del contenuto saltava da 0 a 40 a
   100 a 180 a 400 pixel a ogni click del menu: il titolo si spostava, la
   prima colonna si spostava, e il cervello lo legge come "un'altra pagina di
   un altro sito" anche quando i colori sono identici.

   Ora la cornice e' una sola, e le colonne interne conservano la misura che
   serve a loro: un modulo non diventa largo 1360 solo perche' la pagina lo e',
   e un testo da leggere resta sotto i settanta caratteri per riga. Cambia il
   contenuto, non il punto da cui parte.
   ========================================================================== */
@media (min-width:1001px){
  .wrap,
  #view-create .wrap,
  #view-create-stock .wrap,
  #view-stocks .wrap,
  .tm-wrap,
  #view-profile .page,
  .token-container{
    max-width:1360px;
    margin-left:auto;margin-right:auto;
  }
  /* Il modulo di creazione resta largo quanto deve: un campo di testo da 900
     pixel non e' piu' facile da compilare, e' solo piu' largo. La colonna
     dell'anteprima resta una scheda. Il blocco si ancora a sinistra, cosi'
     il titolo sopra e la prima colonna sotto partono dallo stesso punto di
     ogni altra pagina. */
  .create-grid{
    grid-template-columns:minmax(0,660px) minmax(0,390px);
    justify-content:start;
  }
}

/* ==========================================================================
   30. IL CASSETTO SU TELEFONI CORTI
   ==========================================================================
   .sidebar e' un flex in colonna. Su un telefono alto (844, 896, 932) il
   contenuto ci sta e va tutto bene. Su un 667, un 640 o un 568 il contenuto
   misura 834px e non ci sta: flex allora RESTRINGE gli elementi, perche' un
   figlio di flex ha flex-shrink:1 se nessuno dice il contrario. Il bottone di
   lancio passava da 46px a 30, cioe' schiacciato a due terzi, con il testo
   che toccava i bordi. E' il "mezzo tagliato" che si vedeva.

   Due righe lo risolvono: nessun figlio del cassetto si restringe, e i due
   bottoni hanno un'altezza minima da dito (44px, il minimo di Apple). Il
   cassetto scorre gia' (overflow-y:auto), quindi su schermi corti si arriva
   in fondo scorrendo, con i bottoni interi invece che compressi.
   ========================================================================== */
.sidebar > *{flex-shrink:0;}
/* Stessa altezza per tutti e due: 46 il pieno e 48 il contornato facevano
   sembrare il primo compresso accanto al secondo, che e' l'altra meta' del
   "mezzo tagliato". 46px superano il minimo di 44 e i due bottoni finiscono
   identici. */
.sidebar .side-cta{
  /* Altezza fissa e non minima: con box-sizing:border-box il bordo del
     secondo bottone rientra nei 46, mentre con min-height il piu' alto dei
     due restava 48 e la differenza si vedeva. Il testo lo centra il flex,
     quindi il padding verticale non serve piu'. */
  height:46px;padding-top:0;padding-bottom:0;
  display:flex;align-items:center;justify-content:center;
}

/* SU TELEFONI CORTI I BOTTONI SALGONO SOPRA LE ALTRE RETI.
   Il contenuto del cassetto misura 850px. Su un 667, un 640 o un 568 i due
   bottoni finiscono sotto il bordo dello schermo: si aprono le voci di menu e
   l'azione principale non si vede, va cercata scorrendo. Spostati sopra
   "Other chains" stanno a circa 500px dall'alto, cioe' dentro lo schermo di
   qualunque telefono; l'elenco delle altre reti e il piede scorrono sotto,
   ed e' li' che uno si aspetta di dover scorrere.
   Si fa con l'ordine del flex, senza toccare il documento: l'ordine di
   lettura per chi usa la tastiera o uno screen reader resta quello del
   markup. */
@media (max-width:900px) and (max-height:760px){
  .sidebar .side-cta{order:1;}
  .sidebar .side-label-chains,
  .sidebar #sidebarChains{order:2;}
  .sidebar .side-foot{order:3;}
  /* Un filo d'aria sopra i bottoni, che ora seguono l'ultima voce di menu. */
  .sidebar .side-cta:first-of-type{margin-top:14px;}
}

/* ==========================================================================
   31. IL TASTO DELLA RICERCA
   ==========================================================================
   Il segno "/" in fondo al campo. Non e' decorazione: e' l'unico modo in cui
   qualcuno scopre che la scorciatoia esiste. Sparisce appena il campo viene
   usato, e su telefono non compare affatto perche' non c'e' una tastiera
   fisica a cui riferirsi (lo decide v4.js). */
.search{position:relative;}
.v4-kbd{
  position:absolute;right:10px;top:50%;transform:translateY(-50%);
  min-width:19px;height:19px;padding:0 5px;
  display:flex;align-items:center;justify-content:center;
  font-family:var(--font-mono);font-size:11px;line-height:1;
  color:var(--text-mute);
  border-radius:5px;
  background:rgba(255,255,255,.05);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo),0 1px 0 var(--v4-edge-lo);
  pointer-events:none;
}
/* Il campo lascia spazio al tasto, o il testo digitato ci finisce sotto. */
.search input{padding-right:34px;}

/* ==========================================================================
   32. INDIRIZZO CHE NON E' UN LAUNCHPAD
   ==========================================================================
   Una schermata sola, centrata, con il minimo che serve: cos'e' successo,
   l'indirizzo per riconoscerlo, e due strade. Non e' una pagina d'errore da
   nascondere: chi ci arriva ha cliccato un link vecchio o incollato un
   indirizzo, e la cosa piu' utile e' dirgli dove guardare. */
#view-token .tk-missing{
  display:flex;flex-direction:column;
  min-height:min(62vh,520px);
}
.tkm-card{
  margin:auto;max-width:520px;text-align:center;
  padding:34px 30px 30px;border-radius:var(--v4-r-lg);
  background:linear-gradient(176deg,rgba(255,255,255,.045),rgba(255,255,255,.01) 46%,transparent);
  box-shadow:inset 0 1px 0 var(--v4-edge-hi),0 2px 8px rgba(0,0,0,.45),
             0 30px 70px -44px rgba(0,0,0,1);
}
.tkm-icon{
  width:52px;height:52px;margin:0 auto 18px;border-radius:16px;
  display:flex;align-items:center;justify-content:center;
  color:var(--text-mute);
  background:rgba(255,255,255,.04);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
}
.tkm-icon svg{width:24px;height:24px;}
.tkm-card h1{font-size:22px;font-weight:600;letter-spacing:-.03em;margin:0;}
.tkm-card p{
  margin-top:11px;font-size:14px;line-height:1.62;color:var(--text-dim);
}
.tkm-card code{
  font-family:var(--font-mono);font-size:12.5px;color:var(--text);
  padding:2px 7px;border-radius:6px;
  background:rgba(255,255,255,.05);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
  white-space:nowrap;
}
.tkm-acts{
  margin-top:22px;display:flex;gap:12px;flex-wrap:wrap;
  align-items:center;justify-content:center;
}
.tkm-alt{
  font-size:13.5px;color:var(--text-dim);text-decoration:none;
  padding:10px 4px;
  border-bottom:1px solid var(--v4-edge-lo);
  transition:color var(--v4-t-fast) var(--v4-ease),border-color var(--v4-t-fast) var(--v4-ease);
}
.tkm-alt:hover{color:var(--green);border-bottom-color:rgba(var(--green-rgb),.5);}

/* La reputazione del creatore, accanto al suo indirizzo. Un dato, non un
   giudizio: stessa taglia e stesso peso del resto della riga di contorno. Solo
   quando le uscite sono molte e gli arrivi zero prende un tono, e resta
   comunque una tinta e non un allarme. */
.tk2-devrep{
  display:inline-flex;align-items:center;
  margin-left:8px;padding:2px 7px;border-radius:6px;
  font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em;
  color:var(--text-mute);
  background:rgba(255,255,255,.045);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
  cursor:help;
}
.tk2-devrep:empty{display:none;}
.tk2-devrep.is-serial{
  color:#fbbf24;background:rgba(251,191,36,.08);
  box-shadow:inset 0 0 0 1px rgba(251,191,36,.26);
}
/* ==========================================================================
   33. LA CONCENTRAZIONE DEGLI HOLDER
   ==========================================================================
   Una riga sola sopra l'elenco. Il colore e' l'unica cosa che cambia fra i tre
   gradi, e cambia poco: e' un'informazione, non un allarme. Rosso pieno su una
   distribuzione concentrata direbbe "truffa", che non e' quello che il numero
   dice — dice solo che poche mani bastano a muovere il prezzo. */
.hl-conc{
  display:flex;align-items:center;gap:12px;
  margin:0 0 12px;padding:11px 14px;
  border-radius:var(--v4-r-md);
  background:rgba(255,255,255,.035);
  box-shadow:inset 0 0 0 1px var(--v4-edge-lo);
}
.hl-conc-v{
  font-family:var(--font-mono);font-size:19px;font-weight:600;
  letter-spacing:-.03em;line-height:1;flex-shrink:0;
}
.hl-conc-t{font-size:12.5px;color:var(--text-dim);line-height:1.35;}
.hl-conc-t i{
  display:block;font-style:normal;font-size:11px;color:var(--text-mute);
  margin-top:2px;
}
.hl-conc-bassa .hl-conc-v{color:#4ade80;}
.hl-conc-media .hl-conc-v{color:var(--text);}
.hl-conc-alta  .hl-conc-v{color:#fbbf24;}
.hl-conc-alta{box-shadow:inset 0 0 0 1px rgba(251,191,36,.26);background:rgba(251,191,36,.05);}

/* Chi ha chiesto meno movimento riceve meno movimento: restano i colori e i
   materiali, spariscono le animazioni continue e le comparse. */
@media (prefers-reduced-motion:reduce){
  .v4-rise{opacity:1 !important;transform:none !important;}
  #view-home .feature .feat-bar > i::after,
  #view-token .token-progress-fill::after,
  #view-stock .token-progress-fill::after,
  .pulse::after,.feed-pulse::after{animation:none;}
  .btn-launch::after,.btn-enter::after,.pf-btn-primary::after,
  .btn-launch-top::after,.side-cta::after{display:none;}
  #view-home,#view-token,#view-create,#view-profile,#view-docs,
  #view-terminal,#view-stocks,#view-stock,#view-watchlist,#view-chat,
  #view-create-stock,.modal{animation:none;}
}


/* ==========================================================================
   INGRESSI DI LANCIO SU UNA CHAIN NON ANCORA ATTIVA
   --------------------------------------------------------------------------
   Li marca initLaunchGates() in chains.js. Il bottone resta al suo posto,
   perche' e' anche una promessa, ma smette di sembrare premibile: perde il
   pieno d'accento, prende il contorno di un elemento inattivo e porta
   l'etichetta "soon" a destra, la stessa che il selettore di rete usa gia'
   per Arc e Solana. Cosi' la parola "soon" significa la stessa cosa in tutti
   i punti del sito.
   ========================================================================== */
.is-soon-gate{
  background:transparent !important;
  background-image:none !important;
  color:var(--text-mute) !important;
  border:1px dashed var(--border-2) !important;
  box-shadow:none !important;
  cursor:default !important;
  /* filter e transform restano fermi: un bottone spento che si illumina al
     passaggio rimanderebbe esattamente il messaggio che stiamo togliendo. */
  filter:none !important;
  transform:none !important;
  /* NIENTE display QUI. C'era `display:inline-flex !important`, e con una
     specificita' di 0-1-0 piu' !important vinceva sulla media query che su
     telefono nasconde .btn-launch-top: su Solana a 393px il bottone tornava
     nella testata largo 146px, spingeva il selettore di rete a "Sola..." e
     buttava "Login" fuori dallo schermo. Verificato: su BNB alla stessa
     larghezza quel bottone e' display:none, su Solana era display:flex.
     Questa regola dice come si VEDE un ingresso non ancora attivo, non SE si
     vede: quello lo decidono le media query, ed e' la terza volta che me lo
     riscrivo. Le proprieta' di allineamento restano perche' sono inerti su un
     elemento che non e' flex, e i due che lo sono (.head-cta, .btn-launch-top)
     le usano gia'. */
  align-items:center;justify-content:center;
}
.is-soon-gate:hover,.is-soon-gate:active{
  filter:none !important;transform:none !important;
  background:transparent !important;
}
.is-soon-gate::after{display:none !important;}
/* La larghezza si', il display no: nel cassetto il bottone occupa la riga
   intera come quello delle chain attive. */
.side-cta.is-soon-gate,.head-cta.is-soon-gate{width:100%;}

/* margin invece di gap sul contenitore: cosi' l'etichetta sta alla giusta
   distanza sia dentro un bottone flex sia dentro uno a blocco, senza che il
   contenitore debba dichiarare un display che non gli spetta. */
.soon-gate-tag{
  margin-left:9px;vertical-align:middle;
  font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:600;
  line-height:1;padding:3px 6px;border-radius:6px;
  color:var(--chain-accent,var(--green));
  border:1px solid color-mix(in srgb, var(--chain-accent,var(--green)) 34%, transparent);
  background:color-mix(in srgb, var(--chain-accent,var(--green)) 10%, transparent);
  flex-shrink:0;
}

/* Il pannello che spiega perche', quando si tocca un ingresso spento. Un
   lampo solo: se pulsasse a ripetizione diventerebbe un allarme, e non e'
   un errore, e' una data che non e' ancora arrivata. */
@keyframes soonPulsa{
  0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--chain-accent,var(--green)) 45%, transparent);}
  100%{box-shadow:0 0 0 14px transparent;}
}
.chain-notice.pulsa{animation:soonPulsa 1.1s ease-out 1;}


/* ==========================================================================
   22. UNA SOLA VOCE FRA L'INGRESSO E L'APPLICAZIONE
   --------------------------------------------------------------------------
   Misurato prima di scrivere questa sezione, a 1440px:

     landing   h1  68px   peso 640   spaziatura -2.584px   fondo rgb(3,4,10)
     home app  h1  39,6px peso 600   spaziatura -1.386px   fondo rgb(3,3,2)
     crea      h1  44px   peso 600   spaziatura -1.76px

   Tre titoli, tre scale, tre pesi. Nessuno dei tre e' sbagliato da solo; messi
   in fila raccontano tre prodotti. Peggio: sotto i 1080px la colonna del
   titolo in home passa da 603px a TUTTA la larghezza (980px a 1024) e il
   titolo, invece di crescere, SCENDE a 27px. Un titolo da 27px steso su 980px
   e' la cosa che fa sembrare una pagina un modello non finito.

   Qui il peso e la spaziatura diventano uno solo, quello della landing, e la
   taglia resta l'unica cosa che cambia — perche' quella si', deve cambiare:
   un'insegna sopra una tabella di token non e' un manifesto.
   ========================================================================== */

/* Il peso e la spaziatura della landing, su ogni titolo di prima riga
   dell'applicazione. 640 non e' un capriccio: e' il valore a cui il grassetto
   di sistema smette di sembrare un grassetto e comincia a sembrare una
   scelta. Dove il font non e' variabile il browser lo arrotonda a 600 o 700,
   esattamente come fa gia' sulla landing: le due superfici restano pari. */
#view-home .pitch h1,
#view-create > .wrap > h1,
#view-create-stock > .wrap > h1{
  font-weight:640;
  letter-spacing:-.038em;
  line-height:1.03;
  /* Righe bilanciate come sulla landing: senza, l'ultima riga resta con una
     parola sola e il titolo sembra spezzato invece che impaginato. Dove non
     e' supportato si torna all'a capo normale. */
  text-wrap:balance;
}

/* --- LA HOME, A DUE COLONNE (sopra i 1080px) ---
   La colonna misura 482px a 1100 e 603px a 1600. La frase piu' lunga e'
   "Launch a token on a curve": 25 caratteri, che a questa spaziatura occupano
   circa 0,46em l'uno. 48px x 25 x 0,46 = 552px, dentro i 595 disponibili al
   massimo della scala. La pendenza e' calcolata sui due estremi, non a
   occhio: 40px a 1100, 48px a 1600. */
#view-home .pitch h1{
  /* Era clamp(34px, 22.4px+1.6vw, 48px), cioe' 45,4px a 1440, e su tre righe
     faceva 229px di solo titolo. Su una LANDING quella taglia e' giusta: la
     pagina non ha altro da fare. Qui sopra c'e' una tabella di token, e un
     titolo che si prende un quarto della prima schermata sposta il prodotto
     sotto la piega. 36px restano una frase che si legge da lontano e stanno
     in due righe: meta' dell'altezza, stessa voce. */
  font-size:clamp(29px, 15px + 1.45vw, 40px);
}

/* --- LA HOME, A UNA COLONNA (sotto i 1080px) ---
   Qui il titolo ha tutta la larghezza e puo' finalmente prenderne: e' la
   stessa curva della landing, 5.1vw, con un tetto piu' basso perche' sotto
   c'e' una lista di token e non un manifesto. A 1024 fa 52px su 980 di
   colonna, a 900 ne fa 46, a 412 tocca il minimo della landing.
   max-width in caratteri e non in pixel: e' la misura che tiene una riga
   leggibile a qualunque taglia. */
@media (max-width:1080px){
  #view-home .pitch h1{
    font-size:clamp(31px,5.1vw,52px);
    max-width:21ch;
  }
}
/* Sotto i 380px la prima riga andrebbe a capo su tre righe: 2px di meno la
   riportano a due, che e' come e' scritta. */
@media (max-width:379px){
  #view-home .pitch h1{font-size:29px;}
}

/* --- LE PAGINE DI CREAZIONE ---
   Stessa scala della home a due colonne: sono due prime righe dello stesso
   sito e non c'e' motivo che una sia piu' piccola dell'altra. Il tetto sale
   da 44 a 48. */
#view-create > .wrap > h1,
#view-create-stock > .wrap > h1{
  font-size:clamp(32px, 22.4px + 1.6vw, 48px);
}


/* ==========================================================================
   23. LA SCALA DEI TITOLI
   --------------------------------------------------------------------------
   Misurato a 1440px, prima di questa sezione, il titolo di ogni schermata:

     home / crea / crea azionario   45,4px   peso 640
     documentazione                 28px     peso 600
     chat                           26px     peso 640
     terminale / watchlist          21px     peso 600
     profilo                        18px     peso 600

   Sei taglie e due pesi per la stessa cosa: la prima riga di una pagina. Non
   e' una gerarchia, e' deriva — ognuna di quelle regole e' stata scritta in
   un momento diverso guardando solo la propria schermata. L'effetto, passando
   da una all'altra, e' che il sito sembra assemblato da persone che non si
   parlano.

   Restano TRE gradini, e sono tre ruoli diversi, non tre capricci:

     insegna   home, crea, crea azionario   la frase che vende il prodotto
     pagina    terminale, watchlist, doc,   il nome di una schermata di lavoro
               chat
     identita' profilo                      il nome di chi sta guardando

   Peso e spaziatura sono uno solo su tutti e tre, ed e' quello della landing:
   640 e -.035em. E' la parte che si nota davvero passando da una pagina
   all'altra — la taglia cambia con il ruolo, la VOCE no.
   ========================================================================== */

/* --- il gradino "pagina" --- */
#view-terminal .tm-h,
#view-watchlist .tm-h,
#view-docs .docs-head h2,
#view-chat .section-title{
  font-size:clamp(26px, 17px + 1.05vw, 34px);
  font-weight:640;
  letter-spacing:-.035em;
  line-height:1.08;
  /* La stessa rampa di bianco dei titoli della landing e della home: dove
     c'e' un titolo, la luce viene da sopra. */
  background:linear-gradient(180deg,#fff 6%,rgba(255,255,255,.76) 100%);
  -webkit-background-clip:text;background-clip:text;
  color:transparent;
  padding-bottom:.1em;margin-bottom:-.08em;
}
/* --- il gradino "identita'" ---
   Niente rampa qui: questo testo diventa l'indirizzo del wallet quando ci si
   collega, ed e' cliccabile per copiarlo. Un titolo che si puo' premere deve
   restare di un colore solo, o non sembra piu' un bottone. */
.pf-name{
  font-size:clamp(22px, 16px + .62vw, 28px);
  font-weight:640;
  letter-spacing:-.035em;
  line-height:1.1;
}

/* Il sottotitolo del terminale e della watchlist stava a filo del titolo, che
   ora e' dieci punti piu' grande: senza questo respiro le due righe si
   toccano. */
#view-terminal .tm-top .tm-sub,
#view-watchlist .tm-top .tm-sub{margin-top:8px;}


/* ==========================================================================
   24. TRE COSE VISTE GUARDANDO LE PAGINE UNA A UNA
   ========================================================================== */

/* --- 24.1 LA RIGA LEGALE DELLA DOCUMENTAZIONE ---
   Era centrata dentro la colonna del testo, che sopra i 1040px e' larga 760
   su una pagina larga 1360: il risultato e' una riga centrata su NIENTE, a un
   terzo dello schermo. Allineata a sinistra torna in colonna con il testo che
   chiude, che e' l'unica cosa a cui appartiene. */
@media (min-width:1040px){
  #view-docs .docs-foot{text-align:left;}
}

/* --- 24.2 IL BOTTONE DI LANCIO NEL CASSETTO MOBILE ---
   Misurato su iPhone SE e Galaxy S: 263x39. E' l'azione principale del sito
   dentro il menu del telefono, e stava sotto i 44pt che Apple indica come
   minimo per un bersaglio da toccare col pollice (Material dice 48dp). Non e'
   pignoleria: 39px con il pollice in movimento si mancano.
   Solo padding e corpo del testo: la regola sta dentro la media query del
   cassetto, e non tocca display, che e' il modo in cui mi sono gia' rimangiato
   due media query per sbaglio. */
@media (max-width:900px){
  .sidebar .side-cta,
  .sidebar .btn-launch{
    padding:15px 12px;
    font-size:14px;
    line-height:1.15;
  }
}

/* --- 24.3 IL FONDO DELLE ETICHETTE MINUSCOLE ---
   8,5px e 9,5px sono le taglie a cui una maiuscoletto smette di essere letta e
   comincia a essere indovinata. Sono dentro il selettore delle reti, cioe' il
   controllo che dice su quale catena stai per spendere dei soldi: e' il posto
   peggiore del sito dove strizzare gli occhi. */
.chain-item-sub{font-size:10.5px;letter-spacing:.06em;}
.chain-soon{font-size:9.5px;letter-spacing:.12em;padding:3px 8px;}
#view-home .ev-b{font-size:9.5px;letter-spacing:.08em;}

/* --- 24.4 LO STATO VUOTO DEL PROFILO ---
   Il riquadro tratteggiato della sezione 18.5 resta, ma dentro ha qualcosa da
   fare invece di una riga di testo grigio. Le tre parti stanno in colonna e
   centrate, con il bottone a chiudere: e' la forma di uno stato vuoto che
   propone un'azione, ed e' la stessa che usa la landing quando una rete non
   ha ancora token. */
.pf-empty-cta{
  display:flex;flex-direction:column;align-items:center;text-align:center;
  gap:0;padding:44px 24px 40px;
}
.pf-empty-glifo{
  width:52px;height:52px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  color:var(--green);
  background:radial-gradient(circle at 50% 30%, rgba(var(--green-rgb),.18), rgba(var(--green-rgb),.05) 70%);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.24);
}
.pf-empty-glifo svg{width:23px;height:23px;}
.pf-empty-t{
  margin-top:18px;font-size:17px;font-weight:640;letter-spacing:-.025em;color:var(--text);
}
.pf-empty-p{
  margin-top:8px;max-width:46ch;
  font-size:13.5px;line-height:1.6;color:var(--text-dim);
}
.pf-empty-btn{
  margin-top:22px;
  min-height:44px;padding:0 26px;border:0;border-radius:999px;
  font-size:14px;font-weight:600;letter-spacing:-.01em;cursor:pointer;
  color:var(--on-green);
  background:var(--chain-grad-btn,var(--green));
  box-shadow:0 14px 30px -16px rgba(var(--green-rgb),.9),
             inset 0 1px 0 rgba(255,255,255,.26);
  transition:transform var(--v4-t-fast) var(--v4-ease),
             box-shadow var(--v4-t) var(--v4-ease);
}
.pf-empty-btn:hover{
  transform:translateY(-1px);
  box-shadow:0 18px 36px -16px rgba(var(--green-rgb),1),
             inset 0 1px 0 rgba(255,255,255,.3);
}
.pf-empty-btn:active{transform:translateY(0);}
@media (prefers-reduced-motion:reduce){
  .pf-empty-btn:hover{transform:none;}
}

/* --- 24.5 LA MISURA DI LETTURA DELLA DOCUMENTAZIONE ---
   Il riquadro ora e' largo quanto la pagina, quindi la misura va difesa su
   OGNI blocco di testo e non solo sui paragrafi: senza, gli elenchi e le note
   si stendono su 1096px e la riga successiva non si trova piu'. */
#view-docs .docs-panel li,
#view-docs .docs-sec li,
#view-docs .docs-note,
#view-docs .docs-panel h3,
#view-docs .docs-sec h3{max-width:72ch;}


/* ==========================================================================
   25. L'HERO PIU' BASSO
   --------------------------------------------------------------------------
   Misurato a 1440x900, prima: la prima riga di token cominciava a 1001px.
   Su uno schermo da portatile vuol dire che di un launchpad non si vede un
   solo token senza scorrere. La colpa non era di un elemento, era della
   somma: sette fasce orizzontali una sotto l'altra prima del primo dato.

     81   la testata
     627  l'hero (testo 482 | scheda in evidenza 482, piu' i totali 125)
     46   la riga delle garanzie
     58   la fisarmonica "what you can launch here"
     137  le pillole delle reti piu' quelle dei filtri
     44   l'intestazione della tabella

   Sotto, ogni pezzo perde altezza senza perdere niente di cio' che dice.

   UNA COSA SPARISCE DEL TUTTO: le tre garanzie nella colonna di sinistra.
   Non per far posto, ma perche' erano un DOPPIONE. Dicevano "il creatore non
   puo' prosciugarlo / il rimborso e' esatto / nessuno puo' spegnerlo" in 238
   pixel, e centoventi pixel piu' sotto la riga delle garanzie diceva
   "rimborso e' una funzione pubblica del contratto / LP bruciata / nessuna
   chiave di amministrazione / contratti verificati" in 46. Le stesse cose,
   due volte, in due stili diversi: e' esattamente il difetto che fa sembrare
   una pagina montata con pezzi presi altrove. Resta la versione corta, che e'
   anche la piu' concreta, e sta accanto ai numeri invece che accanto al
   titolo.
   ========================================================================== */

#view-home .pitch-facts{display:none;}

/* La colonna del testo non deve piu' allungarsi per pareggiare la scheda
   accanto: erano le garanzie a farlo, con margin-top:auto. */
#view-home .pitch{justify-content:flex-start;padding-block:2px 0;}
#view-home .pitch > p{margin-top:16px;max-width:54ch;}
/* Il testo si allinea al CENTRO della scheda accanto, non al suo bordo alto.
   Senza le tre garanzie la colonna e' alta 180px contro i 340 della scheda:
   ancorata in alto lasciava 160px di vuoto sotto, che si leggono come un
   pezzo che non e' arrivato. Centrata, lo spazio si divide sopra e sotto e
   la riga torna a essere una composizione: due elementi di peso diverso su
   un asse comune, che e' come si impagina una prima schermata. */
@media (min-width:1081px){
  #view-home .split > .pitch{align-self:center;}
}

/* --- LA SCHEDA IN EVIDENZA ---
   480px per un token. Ogni misura qui sotto e' la stessa informazione con
   meno aria intorno: il nome resta il nome, il grafico resta un grafico, le
   tre cifre restano tre cifre. Quello che se ne va e' lo spazio fra loro,
   che era tarato su una scheda che doveva reggere una colonna intera. */
#view-home .feat-main{padding:13px 18px;}
/* 9px li avevo tolti per guadagnare quattro pixel di scheda, ma e'
   maiuscoletto spaziato: sotto i 9,5 si indovina invece di leggerlo, ed e'
   l'etichetta che dice PERCHE' quel token sta li'. I quattro pixel li da'
   il padding. */
#view-home .feat-k{padding:4px 10px;font-size:9.5px;}
#view-home .feat-id{margin-top:8px;gap:11px;}
#view-home .feat-av{width:38px;height:38px;font-size:15px;border-radius:11px;}
#view-home .feat-name{font-size:23px;letter-spacing:-.03em;}
#view-home .feat-sub{margin-top:7px;}
#view-home .feat-nums{margin-top:9px;gap:28px;}
#view-home .feat-nums b{font-size:19px;}
/* Il grafico da 104px era la meta' della scheda, poi 58. Ora 34.
   E' la sola misura che si poteva ancora togliere senza perdere
   un'informazione: la curva qui dice se il token sale o scende, e per dirlo
   bastano trentaquattro pixel. Sotto ci sono la barra e la percentuale alla
   migrazione, che e' il dato vero della scheda.
   Serviva per portare il pannello all'altezza di quattro righe di attivita':
   312px erano un blocco che si prendeva mezza prima schermata. */
#view-home .feat-chart{height:22px;margin-top:8px;}
/* La curva del token in evidenza e' contesto, non un segnale operativo: il
   dato che conta in quel pannello e' la percentuale alla migrazione, scritta
   una riga sotto. A piena saturazione il rosso era la cosa piu' accesa della
   prima schermata — su una pagina verde o oro attirava l'occhio piu' del nome
   del token. Il verso resta leggibile, sale o scende, a meta' intensita'. */
#view-home .feat-chart .spark-line{stroke-width:1.5;opacity:.72;}
#view-home .feat-chart .spark-area{opacity:.45;}
#view-home .feat-bar{margin-top:10px;height:5px;}
#view-home .feat-note{margin-top:6px;}

/* --- I TOTALI ---
   Quattro numeri in una fascia da 125px. La cifra scende da 30 a 24: e'
   ancora il testo piu' grande della fascia, che e' tutto cio' che deve
   essere. */
#view-home .ms-item{padding:13px 20px;}
#view-home .ms-item dd{font-size:24px;}
@media (max-width:760px){#view-home .ms-item dd{font-size:18px;}}
#view-home .ms-item dt{gap:8px;}

/* --- I TOTALI E LE GARANZIE SONO UN PANNELLO SOLO ---
   Erano due riquadri con due bordi separati da 16px di vuoto, e dicevano una
   cosa sola: "ecco i numeri, ed ecco perche' ci si puo' credere". Uniti, la
   riga delle garanzie diventa il piede della fascia dei totali invece di una
   sesta fascia. Un bordo invece di due, e sedici pixel in meno. */
#view-home .market-bar{
  border-bottom-left-radius:0;border-bottom-right-radius:0;
  border-bottom:0;
}
/* Il margine inferiore della griglia dell'hero era 16px e teneva separate le
   due fasce: qui e' esattamente cio' che non vogliamo piu'. */
#view-home .split{margin-bottom:0;}
#view-home .trust{
  margin-top:0;
  /* Il raggio in basso combacia con quello in alto della fascia dei totali
     (20px, non 16): erano due riquadri diversi e si vedeva anche da qui. */
  border-radius:0 0 20px 20px;
  border-top:1px solid var(--v4-edge-lo);
  background:linear-gradient(90deg,rgba(var(--green-rgb),.04),transparent 60%);
  box-shadow:inset -1px -1px 0 0 var(--v4-edge-lo), inset 1px 0 0 0 var(--v4-edge-lo);
}

/* --- L'ATTIVITA' DAL VIVO: I NOMI NON DEVONO TRONCARE ---
   Misurato: la riga e' larga 217px e i quattro pezzi ne chiedevano
   28 + 42 + 40 + 69. Al NOME toccavano 40px, cioe' la fetta piu' piccola
   della riga, e "SOLAPE" diventava "SOLA...", "PEPER" diventava "PEP...".
   Un elenco di scambi in cui i simboli sono tagliati non dice piu' quale
   token si sta muovendo, che e' l'unica cosa per cui esiste.
   L'avatar e l'etichetta cedono qualche pixel, e il nome prende quello che
   avanza invece di una larghezza fissa. */
#view-home .ev{gap:8px;}
#view-home .ev-av{width:24px;height:24px;font-size:10px;}
#view-home .ev-b{padding:3px 6px;letter-spacing:.06em;}
/* La cifra porta il simbolo della rete, e il simbolo cambia lunghezza: con
   "HYPE" la riga arrivava a 217px esatti su 217 disponibili e il nome cedeva
   i suoi ultimi quattro pixel ("PEPER" -> "PEPE..."). Mezzo punto di corpo e
   due pixel di spazio in meno danno dieci pixel di margine: bastano anche per
   un simbolo da cinque lettere. */
#view-home .ev-v{font-size:11px;}
#view-home .ev-n{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
#view-home .ev-v{flex-shrink:0;margin-left:0;}

/* --- LA BARRA DEI FILTRI, PIU' BASSA ---
   137px per due file di pillole. La fila delle reti porta ancora il suo
   margin-top da 18px, che aveva senso quando stava da sola nella pagina e
   ora si somma al padding della barra che la contiene: e' un margine che
   spinge verso il basso l'unica cosa per cui si apre un launchpad. */
#view-home .section-head .chain-row{margin-top:0;}
#view-home .section-head{padding-top:10px;}

/* --- LA RIGA DELLE GARANZIE: IL TESTO DEVE ANDARE A CAPO COME TESTO ---
   Ogni voce era `display:flex`, e in un contenitore flex OGNI figlio diventa
   un elemento a se': lo <span> attorno al nome del DEX smetteva di essere una
   parola dentro una frase e diventava una colonna. A 1180px, dove le quattro
   voci si stringono, "LP burned on PancakeSwap, forever" si spezzava in tre
   pezzi allineati come una tabella, con la virgola orfana su una riga sua.
   Con display:block il testo torna a essere testo: va a capo dove serve, lo
   span resta dentro la frase, e l'icona si allinea alla prima riga con
   vertical-align invece che al centro di un blocco di due righe (che e' anche
   il posto giusto: un segno di spunta guarda l'inizio della frase). */
#view-home .trust li{display:block;}
#view-home .trust li svg{
  display:inline-block;vertical-align:-4px;margin-right:9px;
}

/* --- L'ACCENTO USATO COME TESTO ---
   --accent-txt lo calcola applyChainTheme() in chains.js: e' l'accento della
   rete schiarito quel tanto che basta a reggere 4,6:1 sul pannello scuro.
   Su BNB, HyperEVM, Robinhood e Arc non cambia niente, perche' passano gia';
   su Solana il viola #9945ff (4,13:1) diventa #a55bff (4,92:1).

   L'elenco e' esplicito e non un `color:var(--green) -> var(--accent-txt)` a
   tappeto: `--green` e' anche il PIENO dei bottoni e il colore di cifre
   grandi, dove la soglia e' 3:1 e schiarire toglierebbe forza all'accento.
   Qui ci sono solo i punti in cui l'accento e' testo PICCOLO, che sono quelli
   che la misura ha segnalato. Se se ne aggiunge uno, va aggiunto qui. */
#view-home .tagline,
#view-home .chain-preview .cp-soon,
#view-home .chain-preview .cp-foot a,
#view-home .feat-k,
#view-home .ev-b.new,
#view-home .feed-tab.active,
.feed-tab.active,
.chain-notice a,
.side-label .soon,
.soon-gate-tag{
  color:var(--accent-txt, var(--green));
}
/* --- I BOTTONI PRIMARI DISATTIVATI ---
   Erano il gradiente pieno dell'accento a opacity:.4. Due problemi in uno.
   Il primo e' che si legge male: sul modulo di creazione, "Connect wallet to
   create" e' testo scuro su oro al 40% sopra il nero, e la misura dice 1,1:1.
   Il secondo e' peggio: un bottone sbiadito ma ancora ORO non dice "non si
   puo' ancora premere", dice "questo bottone e' rotto".
   La forma giusta il sito ce l'ha gia' in due punti: .btn-enter:disabled
   (superficie piatta, testo spento) e .is-soon-gate (contorno, nessun pieno).
   Qui si allineano a quella, cosi' "non premibile" ha UN aspetto solo in
   tutto il prodotto invece di tre. */
.btn-launch:disabled,
.btn-secondary:disabled,
.btn-claim:disabled,
.pf-btn-primary:disabled,
.btn-main:disabled{
  opacity:1;
  background:var(--panel-2) !important;
  background-image:none !important;
  color:var(--text-mute) !important;
  -webkit-text-fill-color:var(--text-mute);
  box-shadow:inset 0 0 0 1px var(--border-2) !important;
  text-shadow:none;
  cursor:default;
}
.btn-launch:disabled::after,
.btn-secondary:disabled::after,
.btn-claim:disabled::after,
.pf-btn-primary:disabled::after{content:none;}

/* ==========================================================================
   34. AVVISI: IL MESSAGGIO A SCHERMO, LA SOGLIA, IL PANNELLO
   ==========================================================================
   Il sito non aveva un posto dove dire una cosa breve. Ogni notizia finiva o
   in una riga di log dentro una scheda — che vede solo chi sta guardando
   quella scheda — o da nessuna parte. Questi riquadri stanno in basso a
   destra, sopra tutto, si chiudono da soli e portano dove la notizia e'
   successa. */
.av-pila{
  position:fixed;right:16px;bottom:16px;z-index:9000;
  display:flex;flex-direction:column;gap:8px;align-items:flex-end;
  pointer-events:none;
}
.av-msg{
  pointer-events:auto;position:relative;
  display:block;width:min(320px,calc(100vw - 32px));
  padding:12px 34px 12px 14px;border-radius:var(--v4-r-md,14px);
  background:var(--panel);border:1px solid var(--border-2);
  box-shadow:0 18px 40px -18px rgba(0,0,0,.85),0 0 0 1px rgba(var(--green-rgb),.14);
  text-decoration:none;color:var(--text);
  animation:avEntra .28s var(--v4-ease,cubic-bezier(.2,.7,.3,1)) both;
}
a.av-msg{cursor:pointer;}
a.av-msg:hover{border-color:rgba(var(--green-rgb),.4);}
.av-msg b{display:block;font-size:13.5px;font-weight:650;letter-spacing:-.01em;margin-bottom:2px;}
.av-msg span{display:block;font-size:12.5px;line-height:1.45;color:var(--text-dim);}
.av-msg .av-x{
  position:absolute;top:8px;right:9px;width:20px;height:20px;
  display:flex;align-items:center;justify-content:center;
  font-style:normal;font-size:15px;line-height:1;color:var(--text-mute);
  border-radius:6px;cursor:pointer;
}
.av-msg .av-x:hover{background:var(--panel-2);color:var(--text);}
.av-msg.via{animation:avEsce .24s var(--v4-ease,ease) both;}
@keyframes avEntra{from{opacity:0;transform:translateY(10px) scale(.98);}to{opacity:1;transform:none;}}
@keyframes avEsce{to{opacity:0;transform:translateY(6px) scale(.98);}}
@media (prefers-reduced-motion:reduce){
  .av-msg,.av-msg.via{animation:none;}
}
/* Su telefono la colonna e' una sola: il riquadro prende la larghezza e sta
   sopra la barra di sistema, non sotto il pollice. */
@media (max-width:560px){
  .av-pila{left:12px;right:12px;bottom:12px;align-items:stretch;}
  .av-msg{width:auto;}
}

/* La soglia, accanto alla stella. Un <select> nativo e non un menu costruito
   a mano: su telefono apre la rotella del sistema, che e' piu' comoda di
   qualunque cosa possiamo disegnare noi, e funziona con la tastiera. */
.tk2-alert{
  height:32px;padding:0 26px 0 10px;border-radius:9px;
  background:var(--panel-2);border:1px solid var(--border-2);color:var(--text-dim);
  font-family:inherit;font-size:12px;font-weight:500;letter-spacing:-.01em;
  cursor:pointer;-webkit-appearance:none;appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),
                   linear-gradient(135deg,currentColor 50%,transparent 50%);
  background-position:calc(100% - 14px) 14px,calc(100% - 10px) 14px;
  background-size:4px 4px,4px 4px;background-repeat:no-repeat;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),color var(--v4-t,.18s) var(--v4-ease,ease);
  /* Dentro una riga flex il <select> si lascia stringere sotto la sua stessa
     larghezza minima, e la percentuale — l'unica parte che conta — finisce
     tagliata dalla freccia. Qui si rifiuta di restringersi. */
  flex:0 0 auto;min-width:140px;
}
.tk2-alert:hover{border-color:var(--border-3,var(--border-2));color:var(--text);}
.tk2-alert:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;}
/* Con un avviso attivo il controllo smette di essere un menu qualunque e
   diventa uno stato acceso: si deve vedere da lontano che il token sta
   guardando per te.
   La classe e non [value]: scegliendo un'opzione cambia la PROPRIETA' value
   del <select>, non l'attributo nel markup, quindi un selettore d'attributo
   resterebbe fermo su quello di partenza per sempre. */
.tk2-alert.is-on{color:var(--green);border-color:rgba(var(--green-rgb),.34);}
/* Le voci sono tutte della stessa lunghezza ("Alert at 50%") apposta: cosi'
   la larghezza basta per tutte e nessuna si vede tagliata a meta' — che su
   un controllo con dentro una percentuale e' proprio il pezzo che conta. */
@media (max-width:560px){.tk2-alert{max-width:none;font-size:11.5px;padding:0 22px 0 8px;background-position:calc(100% - 12px) 14px,calc(100% - 8px) 14px;}}

/* Il pannello in cima alla watchlist. */
.wl-al{
  margin:0 0 16px;padding:14px 16px;border-radius:var(--v4-r-md,14px);
  background:var(--panel);border:1px solid var(--border-2);
}
.wl-al-h{display:flex;align-items:center;gap:8px;}
.wl-al-t{
  font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-mute);
}
.wl-al-n:empty{display:none;}
.wl-al-n{
  min-width:18px;height:18px;padding:0 6px;border-radius:99px;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:10.5px;font-weight:650;font-variant-numeric:tabular-nums;
  color:var(--green);background:rgba(var(--green-rgb),.13);
  border:1px solid rgba(var(--green-rgb),.28);
}
.wl-al-p{margin:6px 0 0;font-size:13px;line-height:1.5;color:var(--text-dim);max-width:66ch;}
.wl-al-b{
  margin-top:11px;height:34px;padding:0 14px;border-radius:9px;
  background:var(--panel-2);border:1px solid var(--border-2);color:var(--text);
  font-family:inherit;font-size:12.5px;font-weight:600;cursor:pointer;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease);
}
.wl-al-b:hover{border-color:rgba(var(--green-rgb),.45);}

/* ==========================================================================
   35. CLASSIFICA
   ==========================================================================
   Due colonne, quindici righe ciascuna. Una riga e' un collegamento intero
   al profilo, non un indirizzo cliccabile in mezzo a del testo: il bersaglio
   e' tutta la riga, che e' come si tocca una lista su un telefono. */
.lb-grid{
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;
  align-items:start;
}
@media (max-width:900px){.lb-grid{grid-template-columns:1fr;}}
.lb-card{
  border-radius:var(--v4-r-md,14px);border:1px solid var(--border-2);
  background:var(--panel);overflow:hidden;
}
.lb-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:14px 16px 12px;border-bottom:1px solid var(--border-2);
}
.lb-head h3{margin:0;font-size:14px;font-weight:650;letter-spacing:-.01em;}
.lb-when{
  font-size:9.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--text-mute);
}
.lb-rows{display:flex;flex-direction:column;}
.lb-row{
  display:grid;grid-template-columns:26px minmax(0,1fr) auto;
  grid-template-areas:"pos who big" "pos who small";
  align-items:center;column-gap:10px;
  padding:10px 16px;text-decoration:none;color:var(--text);
  border-top:1px solid var(--border);
  transition:background var(--v4-t,.18s) var(--v4-ease,ease);
}
.lb-rows > .lb-row:first-child{border-top:none;}
.lb-row:hover{background:var(--panel-2);}
.lb-pos{
  grid-area:pos;font-family:var(--font-mono);font-size:12px;font-weight:600;
  color:var(--text-mute);font-variant-numeric:tabular-nums;text-align:right;
}
/* I primi tre si vedono, gli altri no. Una classifica in cui tutte le righe
   pesano uguale non e' una classifica, e' un elenco. */
.lb-row:nth-child(1) .lb-pos,
.lb-row:nth-child(2) .lb-pos,
.lb-row:nth-child(3) .lb-pos{color:var(--green);}
.lb-who{
  grid-area:who;font-family:var(--font-mono);font-size:13px;font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  display:flex;align-items:center;gap:7px;min-width:0;
}
.lb-who i{
  font-style:normal;font-family:var(--font);font-size:9px;font-weight:650;
  letter-spacing:.1em;text-transform:uppercase;padding:2px 6px;border-radius:99px;
  color:var(--green);background:rgba(var(--green-rgb),.13);
  border:1px solid rgba(var(--green-rgb),.28);flex-shrink:0;
}
.lb-big{
  grid-area:big;font-family:var(--font-mono);font-size:13px;font-weight:600;
  font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;
}
.lb-big.is-zero{color:var(--text-mute);font-weight:500;}
.lb-small{
  grid-area:small;font-size:11px;color:var(--text-mute);text-align:right;
  white-space:nowrap;font-variant-numeric:tabular-nums;
}
/* La riga di chi sta guardando: si deve trovare senza cercarla. */
.lb-row.is-me{background:rgba(var(--green-rgb),.05);}
.lb-row.is-me:hover{background:rgba(var(--green-rgb),.09);}
.lb-empty{padding:26px 16px;text-align:center;font-size:13px;color:var(--text-mute);}
.lb-note{
  margin:16px 0 0;font-size:12.5px;line-height:1.6;color:var(--text-mute);
  max-width:78ch;
}
@media (max-width:420px){
  .lb-row{padding:10px 12px;column-gap:8px;}
  .lb-who{font-size:12px;}
  .lb-big{font-size:12.5px;}
}

/* ==========================================================================
   36. IL REGISTRO DEGLI AGGIORNAMENTI
   ==========================================================================
   Stessa forma della sezione sulla landing — una colonna con una riga
   verticale e un punto per voce — perche' e' lo stesso contenuto e non ha
   senso che si presenti in due modi diversi a seconda di dove lo si legge. */
.up-log{position:relative;padding-left:22px;max-width:78ch;}
.up-log::before{
  content:"";position:absolute;left:3px;top:8px;bottom:8px;width:1px;
  background:linear-gradient(180deg,var(--border-3,var(--border-2)),transparent);
}
.up-voce{position:relative;padding:0 0 26px;}
.up-voce:last-child{padding-bottom:0;}
.up-voce::before{
  content:"";position:absolute;left:-22px;top:7px;width:7px;height:7px;border-radius:50%;
  background:var(--border-3,var(--border-2));
}
/* Solo la piu' recente ha il punto acceso: e' l'unica che risponde alla
   domanda "e' ancora vivo?". */
.up-voce:first-child::before{
  background:var(--green);box-shadow:0 0 0 4px rgba(var(--green-rgb),.13);
}
.up-t{display:flex;align-items:center;gap:9px;flex-wrap:wrap;}
.up-d{
  font-family:var(--font-mono);font-size:11px;color:var(--text-mute);
  font-variant-numeric:tabular-nums;letter-spacing:.03em;
}
.up-tag{
  font-size:9px;font-weight:700;letter-spacing:.13em;text-transform:uppercase;
  padding:3px 8px;border-radius:99px;
  color:var(--green);background:rgba(var(--green-rgb),.11);
  border:1px solid rgba(var(--green-rgb),.26);
}
.up-voce h3{margin:8px 0 0;font-size:16px;font-weight:650;letter-spacing:-.015em;}
.up-voce p{margin:6px 0 0;font-size:14px;line-height:1.62;color:var(--text-dim);}
@media (max-width:560px){
  .up-log{padding-left:18px;}
  .up-voce::before{left:-18px;}
}

/* Il pallino accanto alla voce di menu: non un numero, perche' "quante cose
   nuove" non interessa a nessuno — interessa solo SE ce ne sono. */
.side-dot{
  margin-left:auto;width:7px;height:7px;border-radius:50%;
  background:var(--green);box-shadow:0 0 0 3px rgba(var(--green-rgb),.16);
  flex-shrink:0;
}
.side-dot[hidden]{display:none;}
/* Lo stesso pallino nella barra in alto: li' la voce non ha una riga tutta
   sua, quindi si appoggia al testo invece di spingersi a destra. */
.top-dot{
  display:inline-block;width:6px;height:6px;border-radius:50%;margin-left:5px;
  vertical-align:super;background:var(--green);
  box-shadow:0 0 0 3px rgba(var(--green-rgb),.16);
}
.top-dot[hidden]{display:none;}

/* ==========================================================================
   37. VIA IL RILIEVO FINTO DAI BOTTONI
   ==========================================================================
   Ogni bottone pieno del sito portava due righe sovrapposte al colore: una
   bianca in alto (inset 0 1px 0 rgba(255,255,255,.34)) e una nera in basso.
   E' il trucco con cui nel 2010 si dava volume a un rettangolo, e da solo
   fa sembrare vecchio un prodotto nuovo: il bottone non e' piu' una
   superficie colorata, e' una pasticca di plastica lucida.
   Il "Login" chiaro faceva anche di peggio: un alone BIANCO tutto attorno
   (0 10px 26px -14px rgba(255,255,255,.45)), cioe' una luce che nessuna
   sorgente della pagina puo' produrre.

   Cosa resta: il colore, e l'alone NEL COLORE del bottone — quello e' vero
   (un oggetto acceso illumina cio' che ha sotto) e fa tutto il lavoro che
   la riga bianca voleva fare, senza dichiarare un materiale.
   Ogni box-shadow qui va riscritto per intero: e' una proprieta' sola, non
   si puo' togliere uno strato e lasciare gli altri. */
.btn-launch,.btn-enter,.pf-btn-primary,.btn-launch-top:not(.ghost),
.side-cta:not(.stock),.v2-cta{
  box-shadow:0 2px 8px -2px rgba(var(--green-rgb),.34),
             0 12px 30px -14px rgba(var(--green-rgb),.6);
}
.btn-launch:hover:not(:disabled),.btn-enter:hover:not(:disabled),
.pf-btn-primary:hover,.btn-launch-top:not(.ghost):hover,
.side-cta:not(.stock):hover,.v2-cta:hover{
  box-shadow:0 4px 14px -2px rgba(var(--green-rgb),.45),
             0 20px 44px -14px rgba(var(--green-rgb),.8);
}
.btn-buy{
  box-shadow:0 2px 8px -2px rgba(var(--buy-rgb),.34),
             0 12px 30px -14px rgba(var(--buy-rgb),.6);
}
.btn-sell{
  box-shadow:0 2px 8px -2px rgba(var(--sell-rgb),.34),
             0 12px 30px -14px rgba(var(--sell-rgb),.6);
}
.btn-buy:hover:not(:disabled){
  box-shadow:0 4px 14px -2px rgba(var(--buy-rgb),.45),
             0 20px 44px -14px rgba(var(--buy-rgb),.85);
}
.btn-sell:hover:not(:disabled){
  box-shadow:0 4px 14px -2px rgba(var(--sell-rgb),.45),
             0 20px 44px -14px rgba(var(--sell-rgb),.85);
}
/* Il bottone chiaro: un'ombra scura sotto, come qualunque oggetto chiaro
   appoggiato su un fondo scuro. Niente alone bianco. */
.btn-connect{
  box-shadow:0 2px 10px -2px rgba(0,0,0,.55),
             0 14px 30px -18px rgba(0,0,0,.9);
}
.btn-connect:hover{
  box-shadow:0 4px 16px -2px rgba(0,0,0,.6),
             0 20px 40px -18px rgba(0,0,0,1);
}

/* Il riflesso che attraversa il bottone al passaggio del mouse: resta,
   perche' e' movimento e non materiale, ma a meta' forza. A .42 era un
   lampo di luce che ripeteva lo stesso messaggio della riga bianca. */
.btn-launch::after,.btn-enter::after,.pf-btn-primary::after,
.btn-launch-top:not(.ghost)::after,.side-cta:not(.stock)::after{
  background:linear-gradient(100deg,
    transparent 0%,rgba(255,255,255,.16) 50%,transparent 100%);
}

/* Le immagini quadrate (logo del token, avatar del profilo, miniatura nella
   riga di scambio) avevano lo stesso filo bianco in alto: su una foto si
   legge come un bordo sbagliato, non come rilievo. Resta l'ombra sotto. */
.token-img{box-shadow:0 3px 10px rgba(0,0,0,.5);}
.pf-avatar{box-shadow:0 8px 24px -8px rgba(0,0,0,.9);}
.tr-img{box-shadow:0 5px 14px -7px #000;}

/* ==========================================================================
   38. LA CURVA CHE NON C'E'
   ==========================================================================
   Quando un token non ha ancora scambi la mini-curva e' una linea piatta. Era
   disegnata nel colore dei bordi — su fondo scuro, praticamente invisibile —
   e su una lista dove le altre righe hanno una curva verde si leggeva come
   "questo grafico non si e' caricato", non come "questo token non si e'
   ancora mosso".
   Tratteggiata e un po' piu' chiara: un tratteggio non lo si scambia mai per
   l'andamento di un prezzo, e si vede. */
.spark-flat line{
  stroke:var(--border-3,var(--border-2));
  stroke-width:1.4;
  stroke-dasharray:3 4;
  stroke-linecap:round;
  vector-effect:non-scaling-stroke;
  opacity:.9;
}

/* Il controvalore in dollari sotto i totali della fascia. Piu' piccolo e piu'
   spento del numero nativo: e' la sua traduzione, non un secondo dato. */
.ms-usd{
  /* order:3 e non l'ordine del documento: dentro .ms-item l'etichetta e il
     valore hanno un `order` esplicito (1 e 2), quindi un elemento senza
     ordine vale 0 e finisce PRIMA di tutti e due — il controvalore usciva
     sopra la scritta "TOTAL VOLUME". */
  order:3;
  display:block;font-family:var(--font-mono);font-size:10.5px;
  color:var(--text-mute);font-variant-numeric:tabular-nums;margin-top:5px;
  letter-spacing:0;
}
.ms-usd:empty{display:none;}

/* L'hash della transazione nel registro: un collegamento, non un muro di
   sessantasei caratteri. Colore dell'accento e sottolineatura solo al
   passaggio, cosi' si vede che e' cliccabile senza gridare. */
.log-tx{
  color:var(--green);text-decoration:none;
  border-bottom:1px dashed rgba(var(--green-rgb),.4);
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease);
}
.log-tx:hover{border-bottom-style:solid;border-bottom-color:var(--green);}

/* ==========================================================================
   39. I FILTRI DELLA LISTA
   ==========================================================================
   Il pannello sta chiuso finche' non serve. Una fila di controlli sempre
   aperta sopra la lista sposta in basso la cosa che si e' venuti a vedere, e
   su un telefono la spinge fuori dallo schermo. */
.fl-bar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  /* Sotto ci vuole aria quanto sopra. Con margin-bottom a zero il bottone
     "Filters" appoggiava sul bordo della tabella (misurato: 0px fra i due),
     e due elementi che si toccano si leggono come un elemento solo: sembrava
     l'intestazione della lista invece che un comando che sta per conto suo. */
  margin:12px 0 12px;
}
.fl-btn{
  display:inline-flex;align-items:center;gap:7px;
  height:32px;padding:0 12px;border-radius:999px;
  border:1px solid var(--border-2);background:var(--panel);color:var(--text-dim);
  font-family:inherit;font-size:12.5px;font-weight:550;cursor:pointer;
  transition:border-color var(--v4-t) var(--v4-ease),color var(--v4-t) var(--v4-ease);
}
.fl-btn svg{width:14px;height:14px;}
.fl-btn:hover{color:var(--text);border-color:var(--v4-edge-hi);}
/* Con un filtro attivo il bottone smette di essere un bottone qualunque:
   una lista corta e un pannello chiuso, senza questo, sono un sito che
   sembra vuoto e non dice perche'. */
.fl-btn.is-on{color:var(--green);border-color:rgba(var(--green-rgb),.42);background:rgba(var(--green-rgb),.07);}
.fl-n{
  font-style:normal;min-width:16px;height:16px;padding:0 5px;border-radius:99px;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:10px;font-weight:700;font-variant-numeric:tabular-nums;
  color:var(--on-green);background:var(--green);
}
.fl-n:empty{display:none;}
.fl-ghost{
  height:32px;padding:0 11px;border-radius:999px;
  border:1px dashed var(--border-2);background:transparent;color:var(--text-mute);
  font-family:inherit;font-size:12px;cursor:pointer;
  transition:color var(--v4-t) var(--v4-ease),border-color var(--v4-t) var(--v4-ease);
}
.fl-ghost:hover{color:var(--text);border-color:var(--v4-edge-hi);}

.fl-panel{
  margin-top:10px;padding:14px 16px;border-radius:var(--v4-r-md,14px);
  border:1px solid var(--border-2);background:var(--panel);
  display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px 22px;
}
.fl-g{display:flex;flex-direction:column;gap:8px;min-width:0;}
.fl-k{
  font-size:9.5px;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
  color:var(--text-mute);
}
.fl-opts{display:flex;flex-wrap:wrap;gap:6px;}
.fl-o{
  height:30px;padding:0 11px;border-radius:999px;
  border:1px solid var(--border-2);background:var(--panel-2);color:var(--text-dim);
  font-family:inherit;font-size:12px;font-weight:500;cursor:pointer;white-space:nowrap;
  transition:border-color var(--v4-t) var(--v4-ease),color var(--v4-t) var(--v4-ease),
             background var(--v4-t) var(--v4-ease);
}
.fl-o:hover{color:var(--text);border-color:var(--v4-edge-hi);}
.fl-o.on{
  color:var(--green);border-color:rgba(var(--green-rgb),.45);
  background:rgba(var(--green-rgb),.11);
}
.fl-o:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;}

/* Le ricerche salvate. La campana e' un pallino: pieno acceso, vuoto spento —
   due stati che si distinguono anche senza colore. */
.fl-saved{display:flex;flex-wrap:wrap;gap:6px;align-items:center;min-width:0;}
.fs-p{
  display:inline-flex;align-items:center;gap:7px;
  height:30px;padding:0 9px 0 8px;border-radius:999px;cursor:pointer;
  border:1px solid var(--border-2);background:var(--panel-2);
  color:var(--text-dim);font-size:11.5px;max-width:280px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  transition:border-color var(--v4-t) var(--v4-ease),color var(--v4-t) var(--v4-ease);
}
.fs-p:hover{color:var(--text);border-color:var(--v4-edge-hi);}
.fs-p.is-on{border-color:rgba(var(--green-rgb),.4);}
.fs-bell{
  font-style:normal;font-size:9px;line-height:1;color:var(--text-mute);
  padding:3px;border-radius:50%;flex-shrink:0;
}
.fs-p.is-on .fs-bell{color:var(--green);}
.fs-bell:hover{color:var(--text);}
.fs-x{
  font-style:normal;font-size:14px;line-height:1;color:var(--text-mute);
  padding:0 2px;flex-shrink:0;
}
.fs-x:hover{color:#ff6b78;}

@media (max-width:560px){
  .fl-panel{grid-template-columns:1fr;padding:13px 14px;gap:13px;}
  .fs-p{max-width:100%;}
}
/* La campana e la crocetta sono due bersagli dentro una pillola alta trenta
   pixel: con il solo glifo sarebbero larghi nove, cioe' meta' di un pollice.
   Il riempimento porta l'area toccabile a una misura vera senza allargare la
   pillola. */
.fs-bell,.fs-x{
  display:inline-flex;align-items:center;justify-content:center;
  width:22px;height:26px;margin:0 -4px;cursor:pointer;
}

/* ==========================================================================
   40. IL BANNER DEL TOKEN
   ==========================================================================
   C'era il logo — un quadrato piccolo — e nient'altro: tutte le pagine token
   erano identiche sopra la piega, con lo stesso fondo e lo stesso riquadro.
   Il banner e' l'unico posto dove un progetto puo' dire chi e' prima ancora
   che uno legga il nome.
   Sfuma in basso invece di finire con un bordo netto: sotto c'e' subito
   l'intestazione, e una linea orizzontale piena la taglierebbe via dal
   resto della pagina come se fossero due schermate diverse. */
.tk2-banner{
  position:relative;margin:0 0 16px;border-radius:var(--v4-r-md,14px);
  overflow:hidden;line-height:0;
  border:1px solid var(--border-2);
  background:var(--panel-2);
  /* ALTEZZA FISSA, NON aspect-ratio.
     Con aspect-ratio:3/1 e max-height insieme, il browser non taglia
     l'altezza: RESTRINGE LA LARGHEZZA per tenere il rapporto. Misurato, la
     fascia arrivava a poco piu' di meta' pagina e il resto restava fondo
     nudo, che si legge come un'immagine caricata male.
     Un'altezza dichiarata piu' object-fit:cover fa quello che fa un banner
     ovunque: prende tutta la larghezza e taglia quel che avanza. */
  height:clamp(120px,17vw,230px);
}
.tk2-banner img{width:100%;height:100%;object-fit:cover;display:block;}
.tk2-banner::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:38%;
  background:linear-gradient(180deg,transparent,var(--bg-0));
  pointer-events:none;
}
.tk2-banner.hidden{display:none;}
@media (max-width:560px){
  .tk2-banner{margin-bottom:12px;}
}

/* Il riquadro di caricamento nella pagina di creazione. */
.bn-drop{
  display:flex;align-items:center;justify-content:center;
  /* Stessa ragione della fascia sulla pagina token: aspect-ratio con un
     max-height restringe la larghezza invece di tagliare l'altezza. */
  height:clamp(100px,14vw,170px);width:100%;
  border-radius:var(--v4-r-md,14px);
  border:1px dashed var(--border-2);background:var(--panel-2);
  cursor:pointer;overflow:hidden;
  transition:border-color var(--v4-t) var(--v4-ease),background var(--v4-t) var(--v4-ease);
}
.bn-drop:hover{border-color:rgba(var(--green-rgb),.45);background:var(--panel);}
.bn-drop:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;}
/* :not([hidden]) e non solo `img`.
   L'immagine di anteprima nasce con l'attributo hidden e lo perde quando ne
   scegli una. Ma `hidden` non e' una regola forte: e' una dichiarazione del
   browser, e QUALUNQUE display scritto in un foglio di stile la batte. Questa
   riga quindi la riaccendeva sempre, e un <img> senza sorgente si disegna
   comunque — un rettangolo vuoto largo meta' riquadro, con il bordo chiaro del
   segnaposto "immagine mancante", che spingeva di lato la scritta che spiega
   cosa caricare. Nello stato vuoto era la cosa piu' luminosa della pagina, e
   sembrava un errore di caricamento invece di un campo da riempire.
   Si vedeva solo prima di scegliere un'immagine: con una scelta l'attributo
   sparisce e la regola torna a valere. */
.bn-drop img:not([hidden]){width:100%;height:100%;object-fit:cover;display:block;}
.bn-hint{font-size:12.5px;color:var(--text-mute);text-align:center;padding:0 16px;}
.lb-opt{
  font-size:9.5px;font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  color:var(--text-mute);margin-left:7px;
}

/* ==========================================================================
   41. IL COLLEGAMENTO A X SUL PROFILO
   ==========================================================================
   Due link accanto al nome: quello dichiarato e la prova. "proof" e' scritto
   in chiaro e non e' un bollino: un bollino dice "ci abbiamo pensato noi",
   e noi non abbiamo verificato niente — abbiamo un post che chiunque puo'
   aprire, ed e' quello che offriamo. */
.pf-x{display:flex;align-items:center;gap:8px;margin-top:6px;font-size:13px;}
.pf-x svg{width:13px;height:13px;color:var(--text-mute);flex-shrink:0;}
.pf-x a{color:var(--text-dim);text-decoration:none;}
.pf-x a:hover{color:var(--text);}
.pf-x-proof{
  font-size:10px;font-weight:600;letter-spacing:.09em;text-transform:uppercase;
  padding:2px 7px;border-radius:99px;
  color:var(--green) !important;background:rgba(var(--green-rgb),.11);
  border:1px solid rgba(var(--green-rgb),.28);
}
.pf-x-proof:hover{background:rgba(var(--green-rgb),.18);}
.pf-x.hidden{display:none;}

/* Il blocco della prova dentro la finestra di modifica. */
.ep-proof{
  margin-top:9px;padding:11px 12px;border-radius:10px;
  background:var(--panel-2);border:1px solid var(--border-2);
}
.ep-proof p{margin:0 0 8px;font-size:12px;line-height:1.5;color:var(--text-mute);}
.ep-proof code{
  display:block;font-family:var(--font-mono);font-size:11.5px;
  color:var(--text);word-break:break-all;line-height:1.5;margin-bottom:9px;
}
.ep-proof code span{color:var(--green);}

/* ==========================================================================
   42. LE ETICHETTE SUI WALLET E IL FILTRO BALENE
   ==========================================================================
   Un indirizzo con un nome sopra smette di essere una stringa e diventa
   qualcuno. Si vede che e' cliccabile dal tratteggio sotto — discreto, perche'
   in una lista di trenta righe trenta bottoni sarebbero un muro. */
.wl{
  font-family:var(--font-mono);cursor:pointer;
  border-bottom:1px dashed transparent;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),color var(--v4-t,.18s) var(--v4-ease,ease);
}
.wl:hover{border-bottom-color:var(--border-3,var(--border-2));color:var(--text);}
.wl:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;border-radius:3px;}
/* Con un nome addosso non e' piu' mono: e' una parola, e va letta come tale. */
.wl.ha-nome{
  font-family:var(--font);font-weight:600;color:var(--text);
  border-bottom-color:rgba(var(--green-rgb),.3);
}
.wl-in{
  font-family:var(--font);font-size:12px;font-weight:600;
  width:120px;max-width:100%;padding:1px 6px;
  border-radius:6px;border:1px solid rgba(var(--green-rgb),.45);
  background:var(--bg-1);color:var(--text);
  outline:none;
}

.wh-bar{display:flex;gap:4px;align-items:center;}
.wh-o{
  height:24px;padding:0 9px;border-radius:999px;
  border:1px solid var(--border-2);background:var(--panel-2);color:var(--text-mute);
  font-family:var(--font-mono);font-size:10.5px;font-weight:500;cursor:pointer;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),color var(--v4-t,.18s) var(--v4-ease,ease),
             background var(--v4-t,.18s) var(--v4-ease,ease);
}
.wh-o:hover{color:var(--text);border-color:var(--v4-edge-hi);}
.wh-o.on{color:var(--green);border-color:rgba(var(--green-rgb),.45);background:rgba(var(--green-rgb),.11);}
.wh-bar.hidden{display:none;}

/* ==========================================================================
   43. IL NASTRO
   ==========================================================================
   Le tre colonne del Terminal dicono com'e' messo ogni token; il nastro dice
   cosa sta succedendo adesso. Sta in fondo, largo quanto la pagina, con la
   riga piu' recente in cima: e' la forma che ha da sempre in ogni terminale,
   e non c'e' ragione di inventarne un'altra.
   Si chiude, perche' chi sta studiando le colonne non lo vuole per forza
   davanti agli occhi. */
.tp{
  margin-top:16px;border-radius:var(--v4-r-md,14px);
  border:1px solid var(--border-2);background:var(--panel);overflow:hidden;
}
.tp-head{
  display:flex;align-items:center;gap:10px;
  padding:11px 14px;border-bottom:1px solid var(--border-2);
}
.tp-t{
  display:flex;align-items:center;gap:7px;
  font-size:10px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--text-mute);
}
.tp-f{display:flex;gap:4px;margin-left:auto;}
.tp-o{
  height:24px;padding:0 9px;border-radius:999px;
  border:1px solid var(--border-2);background:var(--panel-2);color:var(--text-mute);
  font-family:var(--font-mono);font-size:10.5px;cursor:pointer;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),color var(--v4-t,.18s) var(--v4-ease,ease),
             background var(--v4-t,.18s) var(--v4-ease,ease);
}
.tp-o:hover{color:var(--text);border-color:var(--v4-edge-hi);}
.tp-o.on{color:var(--green);border-color:rgba(var(--green-rgb),.45);background:rgba(var(--green-rgb),.11);}
.tp-x{
  width:26px;height:24px;border-radius:7px;flex-shrink:0;
  border:1px solid var(--border-2);background:transparent;color:var(--text-mute);
  font-size:15px;line-height:1;cursor:pointer;
}
.tp-x:hover{color:var(--text);border-color:var(--v4-edge-hi);}

.tp-rows{
  max-height:280px;overflow-y:auto;overscroll-behavior:contain;
  scrollbar-width:thin;scrollbar-color:var(--v4-edge-hi) transparent;
}
.tp.is-closed .tp-rows{display:none;}
.tp-r{
  display:grid;grid-template-columns:52px minmax(0,1fr) minmax(0,1.1fr) auto;
  align-items:center;gap:12px;
  padding:8px 14px;text-decoration:none;color:var(--text);
  border-top:1px solid var(--border);
  transition:background var(--v4-t,.18s) var(--v4-ease,ease);
}
.tp-rows > .tp-r:first-child{border-top:none;}
.tp-r:hover{background:var(--panel-2);}
.tp-b{
  font-size:8.5px;font-weight:700;letter-spacing:.1em;text-align:center;
  padding:3px 0;border-radius:99px;border:1px solid transparent;
}
.tp-b.buy{color:#4ade80;background:rgba(74,222,128,.1);border-color:rgba(74,222,128,.28);}
.tp-b.sell{color:#ff6b78;background:rgba(255,79,98,.1);border-color:rgba(255,79,98,.28);}
.tp-b.new{color:var(--green);background:rgba(var(--green-rgb),.12);border-color:rgba(var(--green-rgb),.3);}
.tp-s{
  font-family:var(--font-mono);font-size:12.5px;font-weight:600;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.tp-w{font-size:11.5px;color:var(--text-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tp-v{
  font-family:var(--font-mono);font-size:12px;color:var(--text-dim);
  font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap;
}
@media (max-width:640px){
  /* Su telefono il wallet esce: fra le quattro colonne e' quella meno utile
     a colpo d'occhio, e chi la vuole apre il token. */
  .tp-r{grid-template-columns:48px minmax(0,1fr) auto;gap:9px;padding:8px 12px;}
  .tp-w{display:none;}
  .tp-rows{max-height:220px;}
}

/* ==========================================================================
   44. IL CONTO DELLE POSIZIONI
   ==========================================================================
   Tre celle in cima alla scheda Coins: quanto vale adesso, quanto ci hai
   messo, la differenza. Sopra le card, non dentro: e' la risposta alla
   domanda che uno si fa APRENDO la scheda, e va letta prima di scorrere. */
.pf-total{
  display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:2px;
  margin:0 0 16px;border-radius:var(--v4-r-md,14px);overflow:hidden;
  border:1px solid var(--border-2);background:var(--border-2);
}
.pf-total.hidden{display:none;}
.pt-g{
  display:flex;flex-direction:column;gap:3px;
  padding:13px 16px;background:var(--panel);min-width:0;
}
.pt-k{
  font-size:9.5px;font-weight:600;letter-spacing:.15em;text-transform:uppercase;
  color:var(--text-mute);
}
.pt-v{
  font-family:var(--font-mono);font-size:17px;font-weight:600;
  letter-spacing:-.02em;font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.pt-v.su{color:var(--v3-up,#3ecf8e);}
.pt-v.giu{color:var(--v3-down,#ef4a5c);}
.pt-u{
  font-family:var(--font-mono);font-size:10.5px;color:var(--text-mute);
  font-variant-numeric:tabular-nums;
}
.pt-u:empty{display:none;}
@media (max-width:640px){
  .pf-total{grid-template-columns:1fr;}
  .pt-g{padding:11px 14px;}
  .pt-v{font-size:15.5px;}
}

/* La riga del conto dentro la card di un token. Due valori soli — quanto vale
   e di quanto e' cambiato — perche' su una card grande come un pollice il
   terzo numero non lo legge nessuno. */
.pos-mini{
  display:flex;align-items:baseline;justify-content:space-between;gap:8px;
  margin-top:7px;padding-top:7px;border-top:1px solid var(--border);
  font-family:var(--font-mono);font-variant-numeric:tabular-nums;
}
.pos-mini-v{font-size:12.5px;font-weight:600;color:var(--text);}
.pos-mini-d{font-size:12px;font-weight:600;}
.pos-mini-d.su{color:var(--v3-up,#3ecf8e);}
.pos-mini-d.giu{color:var(--v3-down,#ef4a5c);}

/* Il bottone della card da postare, in fondo alla scheda della posizione.
   Secondario per aspetto — non e' l'azione principale di quella colonna, che
   resta comprare o vendere — ma pieno abbastanza da farsi trovare. */
.pos-share{
  display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
  margin-top:12px;height:36px;border-radius:10px;
  border:1px dashed var(--border-2);background:transparent;color:var(--text-dim);
  font-family:inherit;font-size:12.5px;font-weight:600;cursor:pointer;
  transition:color var(--v4-t,.18s) var(--v4-ease,ease),border-color var(--v4-t,.18s) var(--v4-ease,ease),
             background var(--v4-t,.18s) var(--v4-ease,ease);
}
.pos-share svg{width:14px;height:14px;}
.pos-share:hover{
  color:var(--text);border-color:rgba(var(--green-rgb),.45);
  background:rgba(var(--green-rgb),.06);
}
.pos-share.hidden{display:none;}

/* ==========================================================================
   45. LA MODALITA' PROVA
   ==========================================================================
   L'unico modo in cui questa funzione fa danno e' se qualcuno confonde una
   compera finta con una vera. Quindi non e' una sfumatura: acceso, il
   pannello di scambio cambia bordo, il bottone cambia parole, e una fascia
   ambra sta sopra a dirlo. Meglio vistoso che elegante. */
.pv-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin:0 0 10px;padding:8px 10px;border-radius:10px;
  border:1px dashed var(--border-2);background:var(--panel-2);
}
.pv-t{
  display:inline-flex;align-items:center;gap:7px;flex-shrink:0;
  height:26px;padding:0 11px;border-radius:999px;
  border:1px solid var(--border-2);background:transparent;color:var(--text-mute);
  font-family:inherit;font-size:11.5px;font-weight:600;cursor:pointer;
  transition:color var(--v4-t,.18s) var(--v4-ease,ease),border-color var(--v4-t,.18s) var(--v4-ease,ease),
             background var(--v4-t,.18s) var(--v4-ease,ease);
}
.pv-dot{
  width:6px;height:6px;border-radius:50%;background:var(--border-3,var(--border-2));
  transition:background var(--v4-t,.18s) var(--v4-ease,ease);
}
.pv-t:hover{color:var(--text);border-color:var(--v4-edge-hi);}
.pv-t.on{color:#f5b544;border-color:rgba(245,181,68,.5);background:rgba(245,181,68,.12);}
.pv-t.on .pv-dot{background:#f5b544;box-shadow:0 0 0 3px rgba(245,181,68,.2);}
.pv-h{font-size:11px;color:var(--text-mute);line-height:1.4;min-width:0;}

/* Con la prova accesa il pannello smette di somigliare a quello vero. */
body.in-prova #buyCard{
  border-color:rgba(245,181,68,.45);
  box-shadow:0 0 0 1px rgba(245,181,68,.14),0 18px 40px -28px rgba(0,0,0,1);
}
body.in-prova .pv-bar{
  border-color:rgba(245,181,68,.4);border-style:solid;
  background:rgba(245,181,68,.07);
}
body.in-prova .pv-h{color:#f5b544;}
/* Il bottone perde il verde e il rosso: quelli significano "sta per partire
   una transazione", e qui non parte niente. */
body.in-prova #tradeActionBtn{
  background:rgba(245,181,68,.14) !important;
  background-image:none !important;
  color:#f5b544 !important;
  box-shadow:inset 0 0 0 1px rgba(245,181,68,.5) !important;
}
body.in-prova #tradeActionBtn::after{content:none;}

/* ==========================================================================
   46. LA WATCHLIST A GRAFICI
   ==========================================================================
   Due modi di guardare la stessa lista: le schede dicono cos'e' un token, i
   grafici dicono cosa sta facendo. Due per riga su schermo, uno su telefono:
   una curva schiacciata in mezza colonna non e' una curva, e' una riga
   storta. */
.wl-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.wl-view{display:flex;gap:2px;padding:2px;border-radius:999px;border:1px solid var(--border-2);background:var(--panel-2);}
.wl-view.hidden{display:none;}
.wl-v{
  height:26px;padding:0 12px;border-radius:999px;border:0;background:transparent;
  color:var(--text-mute);font-family:inherit;font-size:12px;font-weight:600;cursor:pointer;
  transition:color var(--v4-t,.18s) var(--v4-ease,ease),background var(--v4-t,.18s) var(--v4-ease,ease);
}
.wl-v:hover{color:var(--text);}
.wl-v.on{color:var(--green);background:rgba(var(--green-rgb),.13);}

.wl-charts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;}
.wl-charts.hidden{display:none;}
@media (max-width:820px){.wl-charts{grid-template-columns:1fr;}}
.wc{
  display:block;padding:14px 16px;border-radius:var(--v4-r-md,14px);
  border:1px solid var(--border-2);background:var(--panel);
  text-decoration:none;color:var(--text);
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),transform var(--v4-t,.18s) var(--v4-ease,ease);
}
.wc:hover{border-color:rgba(var(--green-rgb),.35);transform:translateY(-2px);}
.wc-h{display:flex;align-items:center;gap:10px;min-width:0;}
.wc-img{
  width:30px;height:30px;border-radius:9px;flex-shrink:0;
  background:var(--panel-2) center/cover no-repeat;
  display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;color:var(--text-mute);
}
.wc-n{display:flex;flex-direction:column;min-width:0;gap:1px;}
.wc-n b{font-family:var(--font-mono);font-size:13px;font-weight:650;letter-spacing:-.01em;}
.wc-n i{
  font-style:normal;font-size:11px;color:var(--text-mute);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.wc-m{
  margin-left:auto;font-family:var(--font-mono);font-size:13px;font-weight:600;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
/* Alta abbastanza da leggerci una forma: a trentadue pixel, la misura della
   mini-curva in lista, non si distingue una salita da una gobba. */
.wc-c{height:104px;margin:12px 0 8px;}
.wc-c .spark-svg{width:100%;height:100%;}
.wc-f{display:flex;align-items:baseline;justify-content:space-between;gap:10px;}
.wc-d{
  font-family:var(--font-mono);font-size:13px;font-weight:650;
  font-variant-numeric:tabular-nums;color:var(--text-mute);
}
.wc-d.su{color:var(--v3-up,#3ecf8e);}
.wc-d.giu{color:var(--v3-down,#ef4a5c);}
.wc-p{font-size:11px;color:var(--text-mute);}

/* ==========================================================================
   47. LA CURVA DISEGNATA NEL MODULO DI CREAZIONE
   Il cursore del traguardo diceva un numero e basta: chi lancia non aveva
   modo di vedere cosa quel numero comporta. Qui sotto il cursore compare la
   forma della curva e i tre numeri che ne discendono, e si muovono insieme
   al cursore. Vale per entrambi i moduli, quello normale e quello azionario.
   ========================================================================== */
.cv-box{
  margin-top:14px;padding-top:13px;
  border-top:1px solid var(--border);
}
.cv-svg{
  display:block;width:100%;height:92px;
  overflow:visible;
}
.cv-line{
  fill:none;stroke:var(--green);stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;
  vector-effect:non-scaling-stroke;
}
/* Il riempimento non usa il gradiente del <defs> quando il modulo azionario
   non ne ha uno suo: un colore piatto molto tenue si comporta bene in
   entrambi i casi e non dipende da un id che potrebbe non esistere. */
.cv-area{
  fill:rgba(var(--green-rgb),.13);
  stroke:none;
}
.cv-ends{
  position:relative;height:14px;
  margin-top:6px;
  font-size:11px;letter-spacing:.06em;text-transform:uppercase;
  color:var(--text-mute);
}
.cv-ends span:first-child{position:absolute;left:0;top:0;}
/* Sotto la fine della curva, non sul bordo del riquadro: con un traguardo
   basso la curva finisce a meta' e la parola restava sospesa sul vuoto. */
.cv-ends span:last-child{
  position:absolute;top:0;
  left:var(--cv-end,100%);transform:translateX(-100%);
  transition:left .2s ease;
  white-space:nowrap;
}
.cv-nums{
  display:grid;grid-template-columns:repeat(3,1fr);gap:10px;
  margin-top:12px;
}
.cv-nums > div{display:flex;flex-direction:column;gap:3px;min-width:0;}
.cv-nums span{
  font-size:11px;color:var(--text-mute);
  letter-spacing:.03em;
}
.cv-nums b{
  font-size:14px;font-weight:600;color:var(--text);
  font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* Il terzo numero e' il piu' lungo ("812,345,678 (8.12% of supply)"): su
   colonna stretta i tre affiancati lo taglierebbero a meta'. */
@media (max-width:900px){
  .cv-nums{grid-template-columns:1fr 1fr;}
  .cv-nums > div:last-child{grid-column:1 / -1;}
}

/* ==========================================================================
   48. IL CRUSCOTTO DEL CREATORE
   Compare solo a chi ha lanciato il token. Si distingue dalle altre card
   della colonna con una riga d'accento in cima e un'etichetta: e' l'unico
   riquadro della pagina che parla a una persona sola, e deve leggersi
   subito come tale invece di sembrare un'altra scheda di dati pubblici.
   ========================================================================== */
.cr-card{
  position:relative;
  border-color:rgba(var(--green-rgb),.28);
  background:linear-gradient(180deg,rgba(var(--green-rgb),.05),transparent 60%),var(--panel);
}
.cr-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-bottom:12px;
}
.cr-head h3{margin:0;}
.cr-tag{
  font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;
  color:var(--green);
  border:1px solid rgba(var(--green-rgb),.35);
  background:rgba(var(--green-rgb),.10);
  border-radius:100px;padding:3px 9px;
  flex-shrink:0;
}
.cr-lead{margin-bottom:12px;}
.cr-lead-v{
  font-size:26px;font-weight:600;line-height:1.1;
  color:var(--green);
  font-family:var(--font-mono);
  font-variant-numeric:tabular-nums;
  margin-top:3px;
  overflow-wrap:anywhere;
}
/* Le righe del conto: la loro impaginazione e' scritta solo dentro
   .side-position, e questa card non e' una scheda di posizione. Senza queste
   quattro regole etichetta e valore finivano attaccati ("Unique buyers2"). */
.cr-card .pos-rows{display:flex;flex-direction:column;gap:7px;}
.cr-card .pos-rows > div{
  display:flex;justify-content:space-between;align-items:baseline;gap:10px;font-size:13px;
}
.cr-card .pos-rows span{color:var(--text-mute);white-space:nowrap;}
.cr-card .pos-rows b{
  font-family:var(--font-mono);font-weight:500;color:var(--text);
  font-variant-numeric:tabular-nums;text-align:right;min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
/* L'etichetta del wallet dentro la riga "largest buy": piu' spenta della
   cifra, perche' e' un contorno e non un secondo dato. */
.cr-card .pos-rows i{
  font-style:normal;
  color:var(--text-mute);
  font-size:11.5px;
  margin-left:6px;
}
.cr-note{
  margin-top:12px;padding-top:11px;
  border-top:1px solid var(--border);
  font-size:12px;line-height:1.5;color:var(--text-mute);
  text-wrap:pretty;
}

/* ==========================================================================
   49. LA VETRINA DEL CREATORE, SUL PROFILO
   Una fascia sola fra i riquadri del portafoglio e le schede: dice cos'ha
   lanciato quel wallet e quanti di quei token sono arrivati al DEX. E' la
   ragione per cui si apre il profilo di un altro, e prima non c'era.
   ========================================================================== */
.pf-maker{
  margin:16px 0 4px;
  border:1px solid var(--border);
  border-radius:14px;
  background:var(--panel);
  padding:14px 16px 15px;
}
.pf-maker-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:12px;
}
.pf-maker-t{
  font-size:11px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;
  color:var(--text-mute);
}
.pf-maker-share{
  border:1px solid var(--border-2);
  background:transparent;color:var(--text-dim);
  border-radius:100px;padding:5px 12px;
  font:inherit;font-size:12px;font-weight:600;
  cursor:pointer;flex-shrink:0;
  transition:color .16s,border-color .16s,background .16s;
}
.pf-maker-share:hover{
  color:var(--text);
  border-color:rgba(var(--green-rgb),.45);
  background:rgba(var(--green-rgb),.07);
}
.pf-maker-row{
  display:grid;grid-template-columns:repeat(4,1fr);gap:14px;
}
.pf-maker-row > div{display:flex;flex-direction:column;gap:2px;min-width:0;}
.pf-maker-row b{
  font-size:22px;font-weight:600;line-height:1.1;color:var(--text);
  font-variant-numeric:tabular-nums;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.pf-maker-row span{
  font-size:11px;color:var(--text-mute);letter-spacing:.02em;
}
.pf-maker-best{
  display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  margin-top:13px;padding-top:12px;
  border-top:1px solid var(--border);
  font-size:13px;
}
.pf-maker-bl{
  font-size:11px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--text-mute);
}
.pf-maker-b{
  color:var(--green);font-weight:650;text-decoration:none;
}
.pf-maker-b:hover{text-decoration:underline;}
.pf-maker-bv{color:var(--text-dim);font-variant-numeric:tabular-nums;}
@media (max-width:640px){
  .pf-maker-row{grid-template-columns:1fr 1fr;gap:12px;}
  .pf-maker-row b{font-size:19px;}
}

/* ==========================================================================
   50. LA VERSIONE CHE STA GIRANDO
   Il registro dice cosa e' stato rilasciato; questa riga dice se QUESTA
   istanza ce l'ha addosso. Sta in cima alla pagina degli aggiornamenti,
   piccola e spenta: e' una nota tecnica, non una notizia.
   ========================================================================== */
.up-ver{
  display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:6px 11px;border-radius:100px;
  border:1px solid var(--border);
  background:var(--panel);
  font-size:11px;
  flex-shrink:0;
}
.up-ver-k{
  letter-spacing:.09em;text-transform:uppercase;
  color:var(--text-mute);
}
.up-ver-v{
  font-family:var(--font-mono);font-size:11.5px;
  color:var(--green);
  background:none;padding:0;border:0;
}
.up-ver-d{color:var(--text-mute);}
@media (max-width:560px){
  /* Sotto il titolo invece che accanto: affiancata su schermo stretto
     spingerebbe "What's new" su due righe. */
  #view-updates .tm-top{flex-wrap:wrap;}
  .up-ver{margin-top:4px;}
}

/* --- L'INGRESSO NON ANCORA ATTIVO QUANDO NON E' UN BOTTONE ---
   .is-soon-gate disegna un contorno tratteggiato: su un bottone si legge
   come "premibile, ma non ancora", ed e' giusto. Nel footer e nello stato
   vuoto pero' quella classe atterra su un link di TESTO in mezzo ad altri
   link di testo, e il contorno diventa un rettangolo tratteggiato attorno a
   due parole, che a schermo sembra un errore di impaginazione: su Solana e
   su Arc era l'unica cosa riquadrata dell'intero piede della pagina.
   Qui resta cio' che serve — il testo spento e l'etichetta "soon" — e
   sparisce la cornice. */
.foot-col .is-soon-gate,
.empty-state .is-soon-gate{
  border:0 !important;
  padding:0 !important;
  border-radius:0 !important;
}
/* Nel footer l'etichetta sta larga la meta': accanto a un link di testo da
   13px, "soon" con nove pixel di margine spingeva la voce a capo. */
.foot-col .soon-gate-tag{
  margin-left:6px;
  font-size:9px;padding:2px 5px;
}

/* ==========================================================================
   51. IL BENVENUTO: IL TESTO SCORRE, IL CONSENSO RESTA FERMO
   --------------------------------------------------------------------------
   Misurato prima di scrivere questa sezione, su un telefono da 390x844: il
   riquadro era alto 760px (90vh) e il bottone "Enter" cadeva a 911px, cioe'
   159px SOTTO il fondo del riquadro e 117px sotto il bordo dello schermo. Su
   360x640 erano 343 e 311. Il modale scorreva, quindi il bottone si poteva
   raggiungere, ma niente lo diceva: si vedeva un muro di paragrafi che
   finiva al bordo e nessuna azione, che e' il modo piu' rapido di far
   pensare che il sito sia rotto proprio sulla prima schermata.

   Ora il riquadro e' una colonna: intestazione ferma, testo che scorre,
   piede fermo con la casella e il bottone. L'azione non se ne va mai, e la
   riga sopra il piede dice che sopra c'e' altro da leggere.
   ========================================================================== */
#termsModal .modal{
  display:flex;flex-direction:column;
  /* Non scorre piu' il riquadro intero: scorre solo la parte di testo. */
  overflow:hidden;
  /* Il piede porta il proprio spazio sotto, cosi' il fondo bianco della
     barra di scorrimento non ci finisce sopra. */
  padding-bottom:0;
  /* dvh e non vh: su telefono la barra del browser fa parte di vh, quindi
     90vh puo' essere piu' alto dello schermo davvero disponibile. Il min
     tiene il comportamento di prima dove dvh non e' supportato. */
  max-height:min(90vh,100dvh - 32px);
}
/* In una colonna flex questi tre si schiaccerebbero per far posto al testo:
   il logo diventerebbe una fessura e il titolo perderebbe una riga. */
#termsModal .modal::before,
#termsModal h2,
#termsModal .modal-sub{flex-shrink:0;}

#termsModal .terms-body{
  overflow-y:auto;
  -webkit-overflow-scrolling:touch;
  /* Senza min-height:0 un figlio flex non scende sotto la sua altezza
     naturale, quindi non scorrerebbe: tornerebbe a spingere fuori il piede,
     che e' esattamente il difetto di partenza. */
  min-height:0;
  /* Arrivato in fondo, il gesto non passa alla pagina sotto. */
  overscroll-behavior:contain;
  /* La barra di scorrimento non mangia l'ultima lettera delle righe. */
  margin-right:-8px;padding-right:8px;
}
#termsModal .terms-foot{
  position:relative;
  flex-shrink:0;
  padding-top:18px;
  /* Lo spazio sotto che il riquadro ha perso, piu' il margine di sicurezza
     dei telefoni con la barra gestuale in basso. */
  padding-bottom:calc(28px + env(safe-area-inset-bottom,0px));
  background:var(--panel);
  /* La riga dice "sopra c'e' altro": senza, il piede sembra la fine del
     testo invece di un blocco appoggiato sopra a cio' che scorre. */
  box-shadow:0 -1px 0 var(--v4-edge-lo);
}
#termsModal .terms-foot .accept-row{margin-top:0;}
/* La sfumatura sopra il piede. Senza, il testo che scorre viene tagliato di
   netto a meta' parola contro il bordo del piede, e a colpo d'occhio sembra
   un errore di resa invece di "sotto continua". Con venti pixel di
   dissolvenza si legge per quello che e'. */
#termsModal .terms-foot::before{
  content:"";position:absolute;left:0;right:0;bottom:100%;height:22px;
  pointer-events:none;
  background:linear-gradient(to top,var(--panel),transparent);
}

/* Su telefono 44px di margine per lato lasciano 270px di riga: il testo va a
   capo ogni quattro parole e il riquadro sembra pieno anche quando non lo
   e'. E il titolo perde una taglia, perche' "letstrash.fun" su due righe
   mangia da solo un quarto dell'altezza. */
@media (max-width:560px){
  #termsModal .modal{padding:26px 20px 0;border-radius:20px;}
  #termsModal .modal::before{width:48px;height:48px;margin-bottom:16px;}
  #termsModal h2{font-size:24px;}
  #termsModal .modal-sub{margin-bottom:18px;}
  #termsModal .terms-body > p{padding:11px 0 11px 20px;font-size:13px;}
  #termsModal .terms-foot{padding-top:14px;}
  #termsModal .accept-row{padding:12px 13px;}
  #termsModal .btn-enter{padding:15px;font-size:14.5px;}
}

/* ==========================================================================
   52. LA BARRA IN BASSO, SOLO SU TELEFONO
   --------------------------------------------------------------------------
   Su telefono TUTTA la navigazione passava dall'hamburger in alto a
   sinistra: l'angolo piu' lontano dal pollice di chi tiene il telefono in
   una mano. Cambiare sezione costava due gesti e uno di quelli chiedeva di
   riafferrare il telefono.

   Quattro destinazioni piu' l'azione, sempre sotto il pollice. Esiste SOLO
   sotto i 900px, che e' il punto in cui la colonna laterale diventa un
   cassetto: sopra quella soglia il menu di sempre resta l'unico, e questa
   barra non viene nemmeno disegnata.
   ========================================================================== */
.tabbar{display:none;}

@media (max-width:900px){
  .tabbar{
    display:flex;align-items:stretch;justify-content:space-around;
    position:fixed;left:0;right:0;bottom:0;
    /* SOTTO lo sfondo scuro del cassetto (50), non sopra. A 55 la barra
       restava accesa attraverso la velatura mentre il menu era aperto: si
       vedevano il bottone giallo e "Profile" galleggiare sul buio, e la
       velatura smetteva di dire "questo e' spento, guarda il menu". */
    z-index:45;
    padding:6px 4px calc(6px + env(safe-area-inset-bottom,0px));
    background:color-mix(in srgb, var(--bg-1) 88%, transparent);
    backdrop-filter:blur(18px) saturate(1.1);
    -webkit-backdrop-filter:blur(18px) saturate(1.1);
    box-shadow:0 -1px 0 var(--border);
  }
  @supports not (background:color-mix(in srgb,#000 50%,transparent)){
    .tabbar{background:var(--bg-1);}
  }

  .tb-item{
    flex:1 1 0;min-width:0;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    /* 48px: sopra i 44 che un dito chiede, e uguale per tutte e quattro le
       voci, cosi' la barra non ha bersagli di misure diverse. */
    min-height:48px;padding:4px 2px;
    color:var(--text-mute);text-decoration:none;
    font-size:10px;font-weight:600;letter-spacing:.01em;
    -webkit-tap-highlight-color:transparent;
    transition:color .16s var(--v4-ease);
  }
  .tb-item svg{width:21px;height:21px;flex-shrink:0;}
  .tb-item span{
    max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  .tb-item.active{color:var(--green);}
  .tb-item:active{transform:scale(.94);}

  /* L'AZIONE. Sporge dalla barra perche' e' l'unica voce che non porta da
     nessuna parte: fa qualcosa. Il margine negativo la solleva, e il resto
     della barra le lascia lo spazio senza che serva un segnaposto. */
  .tb-fab{
    flex:0 0 auto;
    display:inline-flex;align-items:center;justify-content:center;
    width:52px;height:52px;margin:-14px 6px 0;border-radius:50%;
    background:var(--green);color:#0c0a04;
    text-decoration:none;flex-shrink:0;
    -webkit-tap-highlight-color:transparent;
    transition:transform .16s var(--v4-ease),filter .16s var(--v4-ease);
  }
  .tb-fab svg{width:23px;height:23px;}
  .tb-fab:active{transform:scale(.93);}

  /* Lo spazio sotto il contenuto: senza, la barra copre l'ultima riga della
     lista e il piede della pagina, e su una lista infinita quella riga e'
     sempre quella che stai leggendo. */
  .app{padding-bottom:calc(64px + env(safe-area-inset-bottom,0px));}
  /* Il riquadro dei termini e le finestre stanno SOPRA la barra: chiedono una
     risposta, e una barra di navigazione accanto e' un invito ad andarsene. */
  .modal-backdrop{z-index:100;}
}

/* Su schermo molto stretto le etichette di cinque voci si tagliano a meta'
   ("Watchl..."): resta l'icona, che con la voce attiva colorata basta. */
@media (max-width:359px){
  .tb-item span{display:none;}
  .tb-item{gap:0;}
}

/* ==========================================================================
   53. LA HOME SU TELEFONO: LA LISTA PRIMA
   --------------------------------------------------------------------------
   Misurato prima di scrivere questa sezione, su 390x844: la lista dei token
   cominciava a 1458px, cioe' dopo quasi DUE schermate piene. Prima di lei:
   una pillola che ripete la rete gia' scritta nella barra in alto (29px), un
   titolo da 68, un paragrafo da 96, la fascia delle cifre da 272, il token
   in evidenza da 493, la riga delle garanzie da 141 e l'intestazione di
   sezione da 136.

   Su telefono la home diventava una pagina di presentazione dentro
   l'applicazione: la cosa per cui uno l'ha aperta stava sotto la piega,
   sempre. Niente qui viene tolto perche' "e' troppo": viene ridotto alla
   misura giusta per uno schermo alto ottocento pixel, e le due cose che su
   telefono sono davvero doppioni spariscono.

   TUTTO dentro la media query: su desktop non cambia un pixel.
   ========================================================================== */
@media (max-width:900px){
  /* La pillola dice "Live on BNB Chain". A quattro centimetri sopra, nella
     barra, c'e' il selettore di rete che dice "BNB Chain" con lo stesso
     pallino acceso. Su desktop la barra e' larga e le due cose stanno
     lontane; qui sono la stessa frase due volte in mezzo schermo. */
  #view-home .pitch-kick{display:none;}

  #view-home .pitch h1{font-size:31px;line-height:1.12;letter-spacing:-.035em;}
  #view-home .pitch p{
    font-size:14px;line-height:1.55;
    /* La frase intera resta: e' il patto del prodotto, e chi arriva da fuori
       non l'ha letto altrove. Si stringe la colonna, non il contenuto. */
    max-width:38ch;
  }
  #view-home .split{gap:16px;}

  /* La fascia delle cifre: quattro numeri non hanno bisogno di 272px. */
  #view-home .market-bar{padding:14px 16px;}
  #view-home .mb-top{margin-bottom:10px;}
  #view-home .market-stats{gap:2px;}
  #view-home .ms-item{padding:10px 12px;}
  #view-home .ms-item dt{font-size:9.5px;letter-spacing:.08em;}
  #view-home .ms-item dd{font-size:17px;}

  /* Il token in evidenza resta: e' contenuto, non presentazione, ed e' la
     prima cosa concreta della pagina. Ma 493px sono mezza schermata per un
     token solo. */
  #view-home .feat-main{padding:14px 16px;}
  #view-home .feat-k{font-size:9.5px;margin-bottom:8px;}
  #view-home .feat-name{font-size:22px;}
  #view-home .feat-av{width:38px;height:38px;}
  #view-home .feat-nums{margin:10px 0 8px;}
  #view-home .feat-chart{height:46px;}
  #view-home .feat-side{display:none;}   /* le tre card di contorno: su una colonna sola sono altre tre schermate */

  /* Le garanzie ("selling back is a public contract function", ...) sono la stessa
     riga che la landing mostra tre secondi prima, sotto le stesse cifre. Su
     desktop stanno in una riga sola e costano nulla; qui vanno a quattro
     righe e valgono 141px di ripetizione. */
  #view-home .trust{display:none;}

  #view-home .section-head{margin-bottom:10px;}
  #view-home .section-head .section-title{font-size:19px;}
  #view-home .section-head .section-sub{display:none;}
}

/* ==========================================================================
   54. LA RIGA DELLA LISTA, SU TELEFONO
   --------------------------------------------------------------------------
   Su desktop .tok-row e' una TABELLA: sei colonne allineate, che si leggono
   in verticale e si confrontano davvero. E' la forma giusta li'.

   Su telefono quella griglia si spezzava male. Misurato: i due numeri
   restavano incollati al bordo destro con mezzo riquadro vuoto a sinistra,
   le loro etichette finivano a due altezze diverse, la sparkline compariva
   PRIMA di sapere di che numero fosse il grafico, l'indirizzo del contratto
   si prendeva una riga intera per il dato meno utile della lista, e su un
   token gia' migrato "to bond 100%" ripeteva il badge "Graduated" che stava
   quattro centimetri sopra.

   Qui diventa una scheda con un ordine: chi e' (nome e cosa promette), come
   e' andata (il grafico), i numeri su una striscia sola, e quanto manca al
   traguardo. Il terzo numero della striscia e' il conto degli scambi, che il
   server manda gia' e che non mostravamo da nessuna parte.

   OGNI SELETTORE E' SCRITTO DUE VOLTE, e non per sbaglio: v3.css imposta
   questa griglia con `#view-home .tok-row`, e un id batte qualunque numero
   di classi. Senza la seconda forma le aree qui sotto non si applicavano
   affatto sulla home — provato, la griglia restava quella di v3. La forma
   con la sola classe serve invece alla watchlist, che disegna le stesse
   righe fuori da #view-home.

   Il limite e' 900px come la barra in basso, non 860 come in v3: fra 861 e
   900 le due misure si contraddicevano.
   ========================================================================== */
/* Fuori dal telefono la cella degli scambi non esiste: la tabella ha le sue
   sei colonne tarate, e una settima le stringerebbe tutte. */
.tok-row [data-col="trades"]{display:none;}

@media (max-width:900px){
  .tok-row,
  #view-home .tok-row{
    display:grid;
    grid-template-columns:1fr 1fr 1fr;
    grid-template-areas:
      "chi   chi   chi"
      "graf  graf  graf"
      "mcap  vol   scambi"
      "prog  prog  prog";
    gap:12px 10px;
    padding:14px 14px 15px;
    align-items:start;
  }
  .tok-row .tr-id,          #view-home .tok-row .tr-id{grid-area:chi;}
  .tok-row .tr-spark,       #view-home .tok-row .tr-spark{grid-area:graf;height:52px;margin:0;}
  .tok-row [data-col="mcap"],   #view-home .tok-row [data-col="mcap"]{grid-area:mcap;}
  .tok-row [data-col="vol"],    #view-home .tok-row [data-col="vol"]{grid-area:vol;}
  .tok-row [data-col="trades"], #view-home .tok-row [data-col="trades"]{grid-area:scambi;display:flex;}
  .tok-row .tr-prog,        #view-home .tok-row .tr-prog{grid-area:prog;}

  /* I numeri a SINISTRA, sotto la loro etichetta. Erano allineati a destra
     perche' in una tabella ci si allinea a destra per confrontare le cifre in
     colonna; qui sono tre celle affiancate e l'allineamento a destra staccava
     ogni numero dalla propria etichetta. */
  .tok-row .tr-num,
  #view-home .tok-row .tr-num{
    display:flex;flex-direction:column;gap:3px;
    text-align:left;align-items:flex-start;
    min-width:0;
    font-size:14px;font-variant-numeric:tabular-nums;
    /* Le tre celle sono divise da una riga sottile, non dallo spazio: su
       fondo scuro tre numeri affiancati senza divisione si leggono come un
       numero solo, lungo. */
    padding-left:11px;
    box-shadow:inset 1px 0 0 var(--border);
  }
  .tok-row [data-col="mcap"],
  #view-home .tok-row [data-col="mcap"]{padding-left:0;box-shadow:none;}
  .tok-row .tr-lbl,
  #view-home .tok-row .tr-lbl{
    display:block;position:static;margin:0;
    font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
    color:var(--text-mute);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;
  }

  /* Il traguardo su una riga sola: etichetta, barra che prende lo spazio che
     resta, percentuale. */
  .tok-row .tr-prog,
  #view-home .tok-row .tr-prog{
    display:flex;align-items:center;gap:9px;
    padding-top:11px;
    box-shadow:inset 0 1px 0 var(--border);
  }
  .tok-row .tr-prog .tr-lbl,
  #view-home .tok-row .tr-prog .tr-lbl{flex-shrink:0;}
  .tok-row .tr-bar,
  #view-home .tok-row .tr-bar{flex:1 1 auto;min-width:0;}
  .tok-row .tr-pct,
  #view-home .tok-row .tr-pct{flex-shrink:0;font-size:12.5px;font-variant-numeric:tabular-nums;}

  /* L'indirizzo del contratto: su telefono si prendeva una riga per il dato
     che nessuno legge scorrendo una lista. Sta sulla pagina del token, dove
     si copia con un tocco. */
  .tok-row .tr-ca,
  #view-home .tok-row .tr-ca{display:none;}

  /* Gia' migrato: il traguardo resta al suo posto, pieno.
     L'avevo tolto perche' il badge "Graduated" dice gia' la stessa cosa. Il
     conto pero' non tornava: una riga in meno su alcune schede e non su altre
     e' quello che rende una lista irregolare, e su desktop, dove le schede
     stanno affiancate, spostava anche volume e scambi di venti pixel rispetto
     alla scheda accanto. Una parola in alto e un disegno in basso non sono la
     stessa notizia due volte: la parola dice cos'e', la barra si legge
     scorrendo, senza fermarsi a leggere. */
}

/* ==========================================================================
   55. IL CASSETTO SU TELEFONO: TUTTE LE VOCI IN UNA SCHERMATA
   --------------------------------------------------------------------------
   Il nostro menu ha piu' roba di quello dei siti a cui somiglia: nove
   destinazioni, le altre quattro reti, due modi di lanciare e le note legali.
   Su desktop e' una colonna alta 900px e ci sta tutto senza pensarci. Su
   telefono diventavano 956px di contenuto in 844 di schermo, e quello che
   restava fuori erano proprio i due bottoni di lancio: l'azione per cui il
   sito esiste finiva sotto il bordo, raggiungibile solo scorrendo un menu che
   nessuno si aspetta debba scorrere.

   Niente viene tolto. La barra in basso copre quattro destinazioni ma non
   Chat, Leaderboard, Updates, Docs e X, e chi apre il menu cercando "Profile"
   deve trovarlo dov'e' sempre stato. Quello che cambia e' la MISURA e il
   RAGGRUPPAMENTO, per rientrare nei 844 senza togliere una riga:

     - la parola "Menu" scritta dentro un menu non dice niente a nessuno: via
       lei, restano 39px (l'altra etichetta, "Other chains", separa due cose
       diverse e resta);
     - le nove voci vanno a 44px netti, che e' il minimo per un dito e resta
       il blocco piu' grande della colonna: sono nove destinazioni, costano;
     - le quattro reti erano quattro righe a piena larghezza, 170px per dire
       quattro nomi che il logo dice gia': diventano una griglia due per due,
       88px, e si vedono tutte insieme, che e' anche il modo in cui uno le
       confronta;
     - marchio e note legali si stringono di una dozzina di pixel ciascuno.

   Totale sceso da 956 a circa 740: entra in una schermata da 844 e anche in
   una da 740. Lo spazio che avanza va sopra i lanci (margin-top:auto), non
   sotto: i due bottoni restano appoggiati al fondo, dove il pollice di una
   mano che regge il telefono arriva senza cambiare presa.

   Solo sotto i 900px. Su desktop la colonna resta identica.
   ========================================================================== */
@media (max-width:900px){
  .sidebar{
    /* Colonna con il fondo ancorato: le destinazioni stanno in alto, i lanci
       e le note legali restano appoggiati in basso. */
    display:flex;flex-direction:column;
    padding:12px 12px calc(10px + env(safe-area-inset-bottom,0px));
  }
  /* Il marchio dice su che sito sei, ma qui e' gia' scritto in cima allo
     schermo dietro il cassetto: basta che ci sia, non che respiri. */
  .sidebar .logo{padding:4px 6px 12px;flex-shrink:0;}

  /* "Menu" come titolo di un menu e' la definizione di ridondanza: la si
     legge una volta e non serve mai piu'. "Other chains" invece divide le
     destinazioni dalle reti, e senza quella riga le pastiglie sembrerebbero
     altre voci di navigazione. */
  .sidebar .side-label{display:none;}
  .sidebar .side-label-chains{
    display:block;flex-shrink:0;
    padding:12px 10px 7px;margin-top:8px;
    font-size:9.5px;letter-spacing:.14em;
  }

  /* 44px netti: la misura minima di un bersaglio per un dito, non uno in
     meno. Prima erano 31px, comodi sotto un puntatore, che su telefono non
     esiste. */
  .sidebar .side-link{
    min-height:44px;padding:9px 11px;
    font-size:14px;gap:11px;flex-shrink:0;
  }
  .sidebar .side-link svg{width:17px;height:17px;flex-shrink:0;}

  /* LE ALTRE RETI: da quattro righe a una griglia due per due.
     A piena larghezza ogni rete costava 44px per una parola e un logo, e le
     ultime due finivano sotto il bordo. Due colonne le mettono tutte e
     quattro sopra la piega, e una pastiglia larga 130 e alta 42 e' un
     bersaglio piu' generoso di una riga di testo. */
  #sidebarChains{
    display:grid;grid-template-columns:1fr 1fr;gap:6px;
    flex-shrink:0;
  }
  #sidebarChains .side-chain{
    width:auto;min-width:0;min-height:42px;
    padding:6px;gap:5px;
    border-radius:12px;
    border:1px solid var(--border);
    background:var(--panel);
    font-size:11.5px;
  }
  #sidebarChains .side-chain-logo{width:15px;height:15px;}
  /* Il pallino era la ridondanza del logo: due segni per dire la stessa rete.
     (Gia' nascosto piu' su, qui per non dipendere da quella regola.) */
  #sidebarChains .side-chain-dot{display:none;}
  /* Il nome si accorcia prima di sfondare la colonna, invece di allargarla. */
  #sidebarChains .side-chain-label{
    min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  /* Senza margin-left:auto il "soon" sta attaccato al nome invece di essere
     spinto contro il bordo destro: in una pastiglia stretta quel margine
     rubava lo spazio al nome, che e' il dato che si legge. */
  #sidebarChains .side-chain-soon{
    margin-left:2px;flex-shrink:0;
    font-size:7.5px;padding:1px 3px;letter-spacing:.02em;
  }

  /* IL FONDO. margin-top:auto sul primo dei due bottoni si mangia tutto lo
     spazio avanzato e spinge in basso il blocco che segue: i lanci stanno
     dove il pollice arriva, non in coda a un elenco. */
  .sidebar .side-cta{
    flex-shrink:0;
    min-height:46px;padding:12px;font-size:14px;
    margin-top:8px;
  }
  .sidebar .side-foot{
    flex-shrink:0;
    margin-top:10px;padding-top:10px;
    font-size:10.5px;
  }

}

/* Lo spazio che avanza va SOPRA i lanci, non sotto: restano appoggiati al
   fondo, dove arriva il pollice di una mano che regge il telefono.
   Solo sopra i 760px di altezza. Sotto, la regola della sezione 30 porta i
   due bottoni sopra le altre reti perche' li' il contenuto non ci sta
   comunque, e un margine automatico li' cancellerebbe l'aria che quella
   regola mette fra l'ultima voce e il primo bottone. */
@media (max-width:900px) and (min-height:761px){
  .sidebar .side-cta:not(.stock){margin-top:auto;}
}

/* ==========================================================================
   56. LA RIGA CHE PORTA AI DOCS
   --------------------------------------------------------------------------
   Al posto delle tre sezioni che spiegavano il prodotto in fondo alla lista
   (novecento pixel che chi torna scorreva via ogni volta) resta una riga.
   Una domanda e un link: chi non sa come funziona la trova, chi lo sa non la
   legge nemmeno. Sta DOPO la lista e non prima, perche' prima sarebbe di
   nuovo una spiegazione fra chi arriva e i token.
   ========================================================================== */
.home-docs{
  margin:22px 0 4px;
  font-size:13px;color:var(--text-mute);
  text-align:center;
}
.home-docs a{
  color:var(--accent-txt,var(--green));
  text-decoration:none;
  border-bottom:1px solid rgba(var(--green-rgb),.3);
  padding-bottom:1px;
  transition:border-color var(--v4-t) var(--v4-ease);
}
.home-docs a:hover{border-bottom-color:rgba(var(--green-rgb),.75);}
@media (max-width:900px){
  .home-docs{margin:16px 0 2px;font-size:12.5px;}
}

/* ==========================================================================
   57. SCAMBI RECENTI: LA STRISCIA IN FONDO ALLA HOME
   --------------------------------------------------------------------------
   Una scheda per token, l'ultimo scambio per primo, in una fila che scorre.
   Larghe 216px: sotto quella misura la capitalizzazione e la variazione
   vanno a capo e la scheda diventa alta il doppio per dire le stesse cose.
   Scorre in orizzontale e non si impila: venti righe in coda a una lista di
   venti sarebbero la lista due volte. Su telefono si scorre col dito, che
   e' anche il gesto per cui questa forma esiste.
   ========================================================================== */
.rt{margin:26px 0 4px;}
.rt-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:12px;
  margin-bottom:11px;padding:0 2px;
}
.rt-t{
  font-size:10.5px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  color:var(--text-mute);
}
.rt-n{
  font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--text-mute);opacity:.72;font-family:var(--font-mono);
}

.rt-strip{
  display:flex;gap:10px;
  overflow-x:auto;overflow-y:hidden;
  padding:1px 2px 8px;
  scroll-snap-type:x proximity;
  /* La barra di scorrimento orizzontale sotto una fila di schede e' un
     elemento di sistema in mezzo al disegno: si scorre col dito o con la
     rotella, e su desktop il taglio dell'ultima scheda dice gia' che
     continua. */
  scrollbar-width:none;-ms-overflow-style:none;
}
.rt-strip::-webkit-scrollbar{display:none;}

.rt-c{
  flex:0 0 216px;scroll-snap-align:start;
  display:flex;flex-direction:column;gap:11px;
  padding:13px 14px 12px;
  border-radius:var(--v4-r-lg,14px);
  border:1px solid var(--border);
  background:var(--panel);
  text-decoration:none;color:inherit;
  transition:border-color var(--v4-t) var(--v4-ease),
             transform var(--v4-t) var(--v4-ease),
             background var(--v4-t) var(--v4-ease);
}
.rt-c:hover{
  border-color:rgba(var(--green-rgb),.45);
  background:var(--panel-2);
  transform:translateY(-2px);
}

.rt-h{display:flex;align-items:center;gap:9px;min-width:0;}
.rt-av{
  width:32px;height:32px;flex-shrink:0;border-radius:9px;
  background:var(--panel-2) center/cover no-repeat;
  display:flex;align-items:center;justify-content:center;
  font-weight:600;font-size:13px;color:var(--text-dim);
  box-shadow:inset 0 0 0 1px var(--hairline,var(--border));
}
.rt-id{display:flex;flex-direction:column;min-width:0;gap:1px;}
.rt-id b{
  font-size:14px;font-weight:600;letter-spacing:-.01em;color:var(--text);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.rt-id i{
  font-style:normal;font-family:var(--font-mono);font-size:11px;
  color:var(--text-mute);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

.rt-mc{display:flex;align-items:baseline;justify-content:space-between;gap:8px;}
.rt-mc b{
  font-family:var(--font-mono);font-size:17px;font-weight:600;
  letter-spacing:-.02em;color:var(--text);
}
.rt-ch{font-family:var(--font-mono);font-size:12px;font-weight:600;flex-shrink:0;}
.rt-ch.up{color:var(--buy,var(--green));}
.rt-ch.down{color:var(--sell,var(--red));}
.rt-ch.flat{color:var(--text-mute);}

/* La riga dello scambio, staccata da una linea: sopra c'e' il token, sotto
   c'e' quello che gli e' appena successo. Sono due informazioni diverse e
   separarle costa un pixel. */
.rt-f{
  display:flex;align-items:center;gap:8px;
  padding-top:10px;
  box-shadow:inset 0 1px 0 var(--border);
}
.rt-b{
  flex-shrink:0;
  font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.09em;
  padding:3px 6px;border-radius:5px;border:1px solid;
}
.rt-b.buy{color:var(--buy,var(--green));border-color:rgba(var(--buy-rgb,var(--green-rgb)),.42);
  background:rgba(var(--buy-rgb,var(--green-rgb)),.1);}
.rt-b.sell{color:var(--sell,var(--red));border-color:rgba(var(--sell-rgb,244,63,94),.42);
  background:rgba(var(--sell-rgb,244,63,94),.1);}
.rt-w{
  font-family:var(--font-mono);font-size:11px;color:var(--text-mute);
  /* Cede lo spazio prima degli altri due: fra "quando", "quanto" e "che
     cosa", il quando e' il meno importante, e in una riga che non ci sta e'
     l'unico che si puo' accorciare senza perdere un numero. */
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto;
}
/* Uno scambio avvenuto sulla coppia, dopo la migrazione. Un puntino invece di
   una parola: la parola allargava la riga fino a far uscire il valore dalla
   scheda, e questo e' un dettaglio che si cerca solo quando interessa (il
   titolo lo dice a parole). */
.rt-b.dex::after{
  content:"";display:inline-block;vertical-align:middle;
  width:3px;height:3px;border-radius:50%;background:currentColor;
  margin-left:4px;opacity:.75;
}
.rt-v{
  margin-left:auto;flex-shrink:0;
  font-family:var(--font-mono);font-size:11.5px;font-weight:600;
  white-space:nowrap;
}
.rt-v.buy{color:var(--buy,var(--green));}
.rt-v.sell{color:var(--sell,var(--red));}

@media (max-width:900px){
  /* LE SCHEDE ESCONO DAL MARGINE DELLA PAGINA E RIENTRANO: su telefono una
     fila che scorre deve toccare il bordo, o non si legge come scorrevole.
     La fuga pero' stava sulla FILA ed era scritta a mano, -14px: era il
     vecchio margine fisso di .page (`padding:16px 14px 8px`). Da quando il
     margine di pagina e' `clamp(10px,3.2vw,22px)` quel numero non
     corrisponde piu' a niente. Misurato: a 390px il margine vale 12,48px,
     quindi la fila usciva di 1,52px per lato OLTRE il bordo dello schermo e
     risultava larga 393px in una finestra da 390, da left=-2 a right=392.
     Da fuori e' un filo di scheda tagliato sul lato destro, e bastava a far
     sbordare la pagina di 2px.

     Due correzioni in una riga sola di ragionamento:

     1. la fuga vale ESATTAMENTE il margine di pagina, con la stessa
        espressione invece che con una copia a mano, quindi resta giusta a
        ogni larghezza e anche dentro la tacca;
     2. la fuga passa dalla fila alla SEZIONE. Prima #recentTrades restava
        largo quanto la colonna mentre suo figlio ne usciva di 14px: e'
        esattamente il caso che il controllo "contenuto piu' largo della
        scatola" segnala, e che il controllo classico sulla pagina non vede.
        Ora la sezione e' larga quanto la finestra e la fila sta DENTRO la
        sezione. Il disegno non cambia di un pixel: le schede toccano il
        bordo come prima. */
  .rt{
    --rt-fuga-sx:max(clamp(10px,3.2vw,22px), env(safe-area-inset-left,0px));
    --rt-fuga-dx:max(clamp(10px,3.2vw,22px), env(safe-area-inset-right,0px));
    margin:20px calc(-1 * var(--rt-fuga-dx)) 2px calc(-1 * var(--rt-fuga-sx));
  }
  /* La testata rientra nella colonna: e' testo, non deve toccare il bordo. */
  .rt-head{
    padding-left:calc(var(--rt-fuga-sx) + 2px);
    padding-right:calc(var(--rt-fuga-dx) + 2px);
  }
  .rt-strip{
    margin-left:0;margin-right:0;
    padding-left:var(--rt-fuga-sx);padding-right:var(--rt-fuga-dx);
  }
  .rt-c{flex-basis:204px;}
}

/* ==========================================================================
   58. QUELLO CHE CAMBIA FRA DESKTOP E TELEFONO, E DUE FONDI SBAGLIATI
   --------------------------------------------------------------------------
   Quattro cose diverse, tutte nate dallo stesso giro di prove.
   ========================================================================== */

/* ---- 58.1 UN OGGETTO SOLO: RETI, ORDINAMENTO, FILTRO, TOKEN ----
   #view-home .section-head e .tok-panel sono disegnati per TOCCARSI: la prima
   senza bordo sotto e senza angoli tondi in basso, la seconda senza bordo
   sopra e senza angoli tondi in alto. Insieme sono una barra strumenti
   appoggiata sulla sua tabella, che e' come si presenta un terminale.
   Quello che rompeva il giunto era il bottone "Filters", che stava FUORI,
   incastrato fra i due: la barra restava aperta in basso e la tabella
   cominciava senza bordo, cioe' i due difetti che si vedevano. Ora il filtro
   sta dentro la barra (vedi il markup), il giunto e' di nuovo un giunto, e
   qui non serve piu' separare niente.
   Resta solo la riga che divide il filtro dall'ordinamento sopra: sono due
   comandi diversi, ordinare e tagliare, e senza una riga si leggono come una
   fila sola di pillole. */
/* .section-head e' un contenitore FLEX con a capo automatico: i figli che
   devono prendere una riga intera lo dichiarano, e la barra dei filtri
   arrivando da fuori non lo faceva. Risultato: larga cento pixel, con la sua
   riga divisoria lunga cento pixel invece che quanto il riquadro. */
#view-home .section-head .fl-bar,
#view-home .section-head .fl-panel{
  flex:0 0 100%;width:100%;
}
#view-home .section-head .fl-bar{
  border-top:1px solid var(--pane-inner);
  margin:0;
  padding:10px 0 11px;
}
/* Il pannello dei filtri aperto: dentro la barra, a filo con i suoi bordi. */
#view-home .section-head .fl-panel{
  margin:0 0 12px;
}
/* Il giunto fra la barra e la tabella deve essere un giunto: zero. Il margine
   di 12px sotto .section-head veniva dal tempo in cui era un'intestazione di
   sezione e non la testata di questa tabella. */
#view-home .section-head{margin-bottom:0;}
#view-home .tok-panel{margin-top:0;}
/* Gli angoli in basso della tabella devono avere lo stesso raggio di quelli
   in alto della barra, o l'oggetto e' arrotondato in modo diverso ai due
   estremi. Sotto i 760 la barra passa a --r-sm e la tabella restava a --r-md. */
@media (max-width:760px){
  #view-home .tok-panel{
    border-bottom-left-radius:var(--r-sm, 10px);
    border-bottom-right-radius:var(--r-sm, 10px);
  }
}
/* Il respiro dentro la testata: c'era il gap del flex (12px) PIU' il padding
   di ogni riga, e fra l'ordinamento e il filtro restava una fascia vuota
   alta quanto una riga. Le tre file sono lo stesso comando in tre gradi
   (dove, come ordinare, cosa tenere): vicine si leggono come un gruppo. */
#view-home .section-head{gap:0;}
#view-home .section-head .chain-row{padding-bottom:9px;}
#view-home .section-head .feed-tabs{margin-top:0;padding:9px 0 10px;}

/* ---- 58.2 LE SCHEDE DEGLI SCAMBI RECENTI ERANO TROPPO NERE ----
   Usavano --panel, che sul tema scuro vale #070706: piu' scuro del fondo
   della pagina. Una scheda piu' scura di cio' su cui poggia non si stacca,
   sprofonda. I pannelli veri della home (.tok-panel, .section-head) stanno a
   #131518, ed e' li' che devono stare anche queste: e' lo stesso piano. */
.rt-c{
  background:var(--v3-panel, var(--panel));
  border-color:var(--v3-line, var(--border));
}
.rt-c:hover{background:var(--v3-panel-2, var(--panel-2));}
.rt-av{background-color:var(--v3-panel-2, var(--panel-2));}

/* ---- 58.4 LA BARRA IN ALTO ERA PIU' NERA DEL RESTO ----
   Scorrendo, la barra prende --v4-bar-rgb (7,7,6 su BNB) al 94%: quasi opaca
   e quasi nera, mentre i pannelli che le scorrono sotto stanno a rgb(19,21,24).
   Su desktop la barra e' larga e la differenza si legge come profondita'; su
   telefono e' una striscia nera in cima a una pagina che nera non e'.
   Qui prende il colore dei pannelli, cioe' lo stesso piano del contenuto, e
   resta un filo trasparente perche' il vetro faccia il suo lavoro: si capisce
   che sotto scorre qualcosa. */
@media (max-width:900px){
  /* NERA PIENA, senza vetro e senza sfumatura.
     Era due strati di trasparenza piu' una sfocatura da 14px: su desktop e'
     profondita', su un telefono e' una striscia in cui si intravedono pezzi
     di pagina che scorrono, con un colore che cambia a seconda di cosa ci
     passa sotto. Cioe' l'unico elemento sempre a schermo era anche l'unico
     che non stava fermo su un colore.
     Nera piena, un bordo sotto e basta: sta ferma, si stacca dal contenuto e
     non compete con niente. Il vetro resta su desktop, dove funzionava. */
  .topbar{
    background:#000;
    border-bottom:1px solid var(--v3-line, var(--border));
    backdrop-filter:none;-webkit-backdrop-filter:none;
  }
  .topbar.v4-scrolled{background:#000;}
  /* La linea d'accento che si accendeva sotto la barra era il terzo strato
     dello stesso effetto: con un fondo pieno non ha piu' niente da separare
     che il bordo non separi gia'. */
  .topbar::after{display:none;}
}

/* ---- 58.5 LE SPIEGAZIONI: SUL DESKTOP SI', SU TELEFONO NEI DOCS ----
   "What you can launch here", "How it works" e "Why it holds" sono novecento
   pixel. Su un desktop la pagina e' larga, la lista finisce presto e sotto
   c'e' posto: chi scorre fin li' le trova, chi non scorre non le incontra.
   Su un telefono sono TRE SCHERMATE in coda a una lista che gia' si scorre a
   lungo, e chi torna ogni giorno le supera ogni volta. Li' al loro posto c'e'
   la riga che porta ai Docs, dove le stesse cose stanno per intero.
   Una sola copia nel markup: e' il CSS a decidere, non due blocchi da tenere
   allineati a mano. */
/* La riga che porta ai Docs ora vale ovunque: le tre sezioni non ci sono piu'
   ne' su desktop ne' su telefono, quindi non c'e' piu' un caso in cui sarebbe
   un doppione di qualcosa che sta gia' sotto. */
.home-docs{display:block;}
@media (max-width:900px){

  /* IL TITOLO: a sinistra, e piu' grande.
     Centrato era gia' stato provato: due righe corte in mezzo a uno schermo
     stretto sembrano una citazione, non l'insegna di un prodotto. A sinistra
     partono dallo stesso bordo di tutto il resto della pagina — le schede, i
     numeri, la lista — e l'occhio che scorre ha una sola linea da seguire.
     E cresce: 31px erano tarati per una pagina che dopo il titolo doveva far
     stare altre cinque cose sopra la piega; ora le spiegazioni non ci sono
     piu' e quello spazio c'e'. */
  #view-home .pitch{
    align-items:flex-start;text-align:left;
    padding:2px 2px 4px;
  }
  #view-home .pitch h1{font-size:37px;line-height:1.08;letter-spacing:-.04em;}
  #view-home .pitch p{
    max-width:40ch;
    margin-left:0;margin-right:0;
  }
}

/* ==========================================================================
   59. LA SCHEDA DEL TOKEN: DARLE UNA FACCIA
   --------------------------------------------------------------------------
   Su telefono la riga era corretta e anonima. Corretta perche' tutto quello
   che serve c'era; anonima perche' era tutto della STESSA MISURA: nome,
   capitalizzazione, volume, scambi, traguardo, sei dati con lo stesso peso.
   Una scheda senza gerarchia non si guarda, si legge — e nessuno legge venti
   schede di fila.

   Tre cose la cambiano:

     - LA VARIAZIONE. E' l'unico numero che dice se guardare o no, ed e' anche
       l'unico colorato: verde o rosso, la stessa coppia dei bottoni compra e
       vendi. Il grafico diceva gia' la direzione, ma "su" e "giu'" non
       distinguono un +3% da un +40%.
     - UNA GERARCHIA. La capitalizzazione diventa il numero grande e si prende
       mezza riga con il grafico accanto: il valore e la sua forma, insieme.
       Volume e scambi scendono di misura: sono la conferma, non la notizia.
     - IL MARCHIO PIU' GRANDE. Il logo di un token e' la sua faccia. A 38px in
       una scheda alta duecentoquaranta era un dettaglio; a 46 e' l'ancora da
       cui parte l'occhio, e a colpo d'occhio si scorre per immagini.

   Su desktop la tabella resta la tabella: cambia solo che sotto la
   capitalizzazione compare la variazione, che in una colonna di numeri e'
   esattamente dove ci si aspetta di trovarla.
   ========================================================================== */

/* LA VARIAZIONE. Verde e rosso veri (--buy/--sell), non l'accento della rete:
   il colore qui deve dire "sale o scende", non "sei su BNB". */
.tr-ch{
  display:block;
  font-family:var(--font-mono);
  font-variant-numeric:tabular-nums;
  font-size:11.5px;font-weight:600;
  letter-spacing:-.01em;
  margin-top:2px;
}
.tr-ch.up{color:var(--buy);}
.tr-ch.down{color:var(--sell);}

@media (max-width:900px){
  /* IL GRAFICO ACCANTO AL NUMERO, non sopra.
     Sopra a piena larghezza era la cosa piu' grande della scheda e non era il
     dato piu' importante: si vedeva prima la forma e poi si cercava di che
     numero fosse. Affiancati si leggono insieme, che e' come si guarda un
     prezzo. */
  .tok-row,
  #view-home .tok-row{
    grid-template-columns:1fr 1fr;
    grid-template-areas:
      "chi   chi"
      "mcap  graf"
      "vol   scambi"
      "prog  prog";
    gap:13px 12px;
    padding:15px 14px 16px;
  }
  /* Anche qui il traguardo resta: era la seconda meta' della stessa regola
     tolta sopra, e senza toglierla anche di qui la riga "prog" non aveva piu'
     una casella dove andare e se ne creava una in fondo, allungando proprio le
     schede che dovevano accorciarsi. */
  .tok-row .tr-spark,
  #view-home .tok-row .tr-spark{
    height:58px;align-self:center;
  }

  /* LA CAPITALIZZAZIONE E' IL NUMERO DELLA SCHEDA. */
  .tok-row [data-col="mcap"],
  #view-home .tok-row [data-col="mcap"]{
    font-size:23px;font-weight:600;letter-spacing:-.03em;
    align-self:center;
    line-height:1.1;
  }
  .tok-row [data-col="mcap"] .tr-lbl,
  #view-home .tok-row [data-col="mcap"] .tr-lbl{margin-bottom:1px;}
  .tok-row [data-col="mcap"] .tr-ch,
  #view-home .tok-row [data-col="mcap"] .tr-ch{font-size:13px;margin-top:4px;}

  /* Volume e scambi: la conferma, non la notizia. */
  .tok-row [data-col="vol"],
  .tok-row [data-col="trades"],
  #view-home .tok-row [data-col="vol"],
  #view-home .tok-row [data-col="trades"]{
    font-size:13px;color:var(--text-dim);
  }
  /* La riga divisoria sta fra volume e scambi, che sono affiancati; la
     capitalizzazione ora ha il grafico a destra e non un altro numero, quindi
     li' non serve niente. */
  .tok-row [data-col="trades"],
  #view-home .tok-row [data-col="trades"]{padding-left:11px;box-shadow:inset 1px 0 0 var(--border);}
  .tok-row [data-col="vol"],
  #view-home .tok-row [data-col="vol"]{padding-left:0;box-shadow:none;}

  /* IL MARCHIO. */
  .tok-row .tr-img,
  #view-home .tok-row .tr-img{
    width:46px;height:46px;border-radius:13px;flex-shrink:0;
    font-size:17px;
  }
  .tok-row .tr-id,
  #view-home .tok-row .tr-id{gap:11px;align-items:center;}
  .tok-row .tr-n1,
  #view-home .tok-row .tr-n1{font-size:16px;font-weight:600;letter-spacing:-.015em;}
  .tok-row .tr-n2,
  #view-home .tok-row .tr-n2{font-size:12px;margin-top:2px;}
}

/* Il contenitore delle nove destinazioni non esiste finche' non serve: su
   desktop i link restano figli diretti della colonna, come sono sempre stati. */
.side-nav{display:contents;}

/* ==========================================================================
   60. IL MENU STA SOLO IN BASSO, E OCCUPA TUTTO LO SCHERMO
   --------------------------------------------------------------------------
   Su telefono la navigazione era in due posti: l'hamburger in alto a sinistra
   (nove destinazioni, le reti, i lanci) e la barra in basso (quattro). Due
   menu, uno dei quali nell'angolo piu' lontano dal pollice di chi tiene il
   telefono in una mano, e nessuno dei due completo.

   Adesso e' uno solo. L'hamburger sparisce; il bottone al centro della barra
   in basso — che era la scorciatoia per creare un token, cioe' la cosa che si
   fa una volta ogni tanto — apre il menu, che si fa a tutto schermo. Il
   lancio non si perde: sta dentro il menu con i suoi due bottoni in fondo, e
   in home fra i comandi sotto le cifre.

   A tutto schermo cambia una cosa importante: non c'e' piu' uno "sfondo" da
   toccare per uscire. Quindi la barra in basso resta SOPRA il menu, il
   bottone diventa una croce e lo richiude; e il tasto Esc fa lo stesso.
   ========================================================================== */
@media (max-width:900px){
  /* L'hamburger in alto non ha piu' un mestiere. */
  .m-menu-btn{display:none !important;}

  /* IL CASSETTO DIVENTA UNA SCHERMATA.
     Gli !important sono per una ragione precisa: la larghezza e lo z-index
     del cassetto sono dichiarati con !important in v3 (una vecchia difesa
     contro un contesto di sovrapposizione creato da un antenato). Senza, qui
     resterebbe largo 292. */
  .sidebar{
    width:100% !important;max-width:none !important;
    border-right:0;
    /* Il fondo pieno: a tutto schermo dietro non c'e' niente da lasciar
       vedere, e il vetro costerebbe una sfocatura su tutta la pagina. */
    background:var(--bg-1);
    backdrop-filter:none;-webkit-backdrop-filter:none;
    /* Sotto ci passa la barra, che resta visibile: il contenuto le lascia
       posto invece di finirle dietro. */
    padding-bottom:calc(74px + env(safe-area-inset-bottom,0px));
  }
  .sidebar.open{box-shadow:none;}

  /* La barra in basso SOPRA il menu: e' l'unica via d'uscita, e vederla
     aperta dice anche dove si torna. Il velo non serve piu' (non c'e' niente
     da velare) ma resta per la transizione, sotto entrambi. */
  .tabbar{z-index:90;}
  .backdrop{z-index:75;}

  /* DUE COLONNE. A tutto schermo si guadagna LARGHEZZA, non altezza: nove
     voci incolonnate restano 450 pixel e continuano a non starci insieme
     alle reti, ai lanci e alle note legali. Affiancate sono 250, e ogni
     bersaglio diventa piu' largo invece che piu' stretto.
     display:contents fuori di qui: su desktop il contenitore non esiste e la
     colonna e' identica a prima. */
  .side-nav{
    display:grid;grid-template-columns:1fr 1fr;
    gap:6px;flex-shrink:0;
  }
  .sidebar .logo{padding:6px 8px 16px;font-size:19px;}
  .sidebar .side-link{min-height:50px;font-size:14.5px;padding:11px 12px;}
  .sidebar .side-link svg{width:19px;height:19px;}
  /* Il nome non deve mandare a capo dentro una cella stretta. */
  .side-nav .side-link{
    white-space:nowrap;overflow:hidden;
  }
  #sidebarChains .side-chain{min-height:48px;font-size:13px;padding:8px 10px;}
  #sidebarChains .side-chain-logo{width:19px;height:19px;}
  #sidebarChains .side-chain-soon{font-size:8.5px;padding:2px 5px;}
  .sidebar .side-cta{min-height:50px;font-size:15px;}
  .sidebar .side-foot{font-size:11.5px;}

  /* Il segno sul bottone: hamburger da chiuso, croce da aperto. Due SVG e non
     una rotazione, perche' fra le due forme non c'e' una rotazione che porti
     dall'una all'altra senza passare per qualcosa che non significa niente. */
  .tb-fab-close{display:none;}
  .tb-fab.is-open .tb-fab-open{display:none;}
  .tb-fab.is-open .tb-fab-close{display:block;}
  .tb-fab{border:0;font-family:inherit;cursor:pointer;}
}

/* ==========================================================================
   61. LO STESSO LINGUAGGIO DELL'INGRESSO
   --------------------------------------------------------------------------
   L'ingresso e l'applicazione sembravano due prodotti. Misurate, le due
   grammatiche sono queste:

     ingresso        superfici di VETRO: nessun riempimento, un gradiente di
                     bianco dal 5,5% allo zero, un filo di luce dentro il
                     bordo alto, un'ombra vera sotto, angoli da 20px, e come
                     bordo un filo bianco all'8%;
     applicazione    riquadri PIENI di grigio (#131518) con un bordo grigio
                     (#23272c) e angoli da 14.

   Il primo e' un oggetto appoggiato su una scena; il secondo e' un
   rettangolo dipinto. Fra due schermate consecutive dello stesso sito la
   differenza si legge come "ho cambiato sito".

   Qui l'applicazione prende la grammatica dell'ingresso. Non e' una mano di
   vernice: le variabili sono le stesse (il gradiente, il filo, l'ombra, il
   raggio), quindi da qui in avanti una superficie nuova nasce gia' coerente
   invece di dover essere riportata a mano.
   ========================================================================== */
:root{
  /* IL FONDO E' PIENO, NON TRASPARENTE.
     Prima prova: il vetro della landing alla lettera, cioe' un gradiente di
     bianco sopra il fondo pagina. Sbagliata, e la ragione e' che le due
     pagine non hanno lo stesso fondo. Sull'ingresso dietro il vetro c'e' una
     scena tenuta apposta pulita; nell'applicazione ci sono un alone d'accento
     in alto e un campo di puntini, e un pannello trasparente se li porta
     tutti dentro: la card non si legge come una superficie ma come una
     finestra su una cosa sporca.
     Un colore pieno e neutro chiude fuori tutto. Poco piu' chiaro della
     pagina, cosi' si stacca senza brillare; freddo e non caldo, perche' un
     grigio che tira al giallo sotto un accento oro sembra sporco. Il bordo e
     il raggio restano quelli della landing: e' li' che la parentela si vede,
     non nel riempimento. */
  /* Piu' chiaro e piu' FREDDO. Il primo tentativo (#0f1216) si staccava dalla
     pagina ma di poco, e su un fondo quasi nero un pannello appena piu' chiaro
     non si legge come una superficie: si legge come una macchia. Il salto
     dev'essere netto — e il grigio dev'essere azzurrato, non neutro: sotto un
     accento oro un grigio neutro sembra beige, e beige e' esattamente il
     "moscio". */
  --pane-bg:#141a20;
  --pane-bg-2:#1a2129;
  --pane-edge:inset 0 1px 0 rgba(255,255,255,.045);
  --pane-lift:0 1px 2px rgba(0,0,0,.4), 0 18px 40px -28px rgba(0,0,0,.9);
  /* DUE FILI, NON UNO.
     Erano lo stesso valore per il bordo ESTERNO di una scheda e per le righe
     INTERNE che dividono le celle. Ma i due lavori chiedono forze diverse: il
     bordo esterno deve chiudere una forma contro il fondo della pagina, la
     riga interna deve separare due dati senza spezzare la scheda.
     All'8% l'esterno non chiudeva niente: sopra un pannello a #141a20 diventa
     un #232830, che a un metro dallo schermo non si distingue dal pannello
     stesso. La scheda si leggeva come una macchia piu' chiara, non come un
     oggetto con un bordo — che e' esattamente "i bordi non sono definiti".
     Fuori 14%, dentro 7%. */
  --pane-line:rgba(255,255,255,.14);
  --pane-inner:rgba(255,255,255,.07);
  --pane-line-hi:rgba(255,255,255,.24);
  --pane-r:20px;
}
/* ---- 61.1 LE SUPERFICI ---- */
#view-home .market-bar,
#view-home .feature,
#view-home .section-head,
.rt-c,
.feature-card,
.how-step{
  background:var(--pane-bg);
  border:1px solid var(--pane-line);
  border-radius:var(--pane-r);
  box-shadow:var(--pane-edge), var(--pane-lift);
}
/* La testata e la tabella sono UN oggetto: stesso fondo, e il bordo che li
   separerebbe non c'e'. */
#view-home .section-head{
  border-bottom:0;
  border-radius:var(--pane-r) var(--pane-r) 0 0;
  box-shadow:var(--pane-edge);
}
#view-home .tok-panel{
  background:var(--pane-bg);
  border:1px solid var(--pane-line);
  border-top:0;
  border-radius:0 0 var(--pane-r) var(--pane-r);
  box-shadow:var(--pane-lift);
}
/* I fili interni: quelli che dividono le righe, le celle e le sezioni. Erano
   un grigio pieno (#23272c), che su una superficie di vetro si vede come una
   riga disegnata sopra invece che come un bordo. */
#view-home .tok-row,
#view-home .section-head .feed-tabs,
#view-home .section-head .fl-bar,
#view-home .tok-head{
  border-color:var(--pane-inner);
}
#view-home .section-head .feed-tabs,
#view-home .section-head .fl-bar{
  border-top-color:var(--pane-inner);
}

/* ---- 61.2 IL SOPRATITOLO ----
   Sull'ingresso ogni sezione si apre con un trattino e una parola in
   maiuscoletto spaziato, nel colore della rete. Nell'applicazione la stessa
   riga era una pastiglia con un pallino che pulsa: piu' rumorosa e diversa.
   Stessa forma, cosi' chi entra riconosce dove si trova. */
#view-home .pitch-kick{
  display:flex;align-items:center;gap:11px;
  background:none;border:0;padding:0;margin:0 0 14px;
  font-size:10px;letter-spacing:.24em;text-transform:uppercase;
  font-weight:600;color:var(--green);
  border-radius:0;box-shadow:none;
}
#view-home .pitch-kick::before{
  content:"";width:26px;height:1px;background:currentColor;opacity:.6;flex-shrink:0;
}
/* Il pallino che pulsava dentro la pastiglia: il trattino fa gia' il suo
   lavoro, e due segni per aprire una riga di dieci pixel sono uno di troppo. */
#view-home .pitch-kick .dot,
#view-home .pitch-kick .pulse-dot{display:none;}

/* ---- 61.3 IL TITOLO E IL SOTTOTITOLO ----
   Stessa scala dell'ingresso: stesso peso (640), stessa crenatura (-.042em),
   stessa interlinea (1.04), e lo stesso testo in gradiente dal bianco al 72%.
   Il paragrafo sotto prende la misura della lede: 15.5px su 1.68. */
#view-home .pitch h1{
  font-weight:640;letter-spacing:-.042em;line-height:1.04;
  background:linear-gradient(180deg,#fff 10%,rgba(255,255,255,.72) 100%);
  -webkit-background-clip:text;background-clip:text;
  padding-bottom:.1em;margin-bottom:-.08em;
}
/* Il colore lo porta gia' <em> sulla seconda riga: e' l'unico titolo colorato
   del sito ed e' voluto. Il gradiente vale solo sulla parte bianca. */
#view-home .pitch h1 span{color:transparent;}
#view-home .pitch p{
  margin-top:13px;font-size:15.5px;line-height:1.68;
  color:var(--text-dim);max-width:58ch;
}
/* ---- 61.4 LA FASCIA DELLE CIFRE ----
   Sull'ingresso quattro numeri sono quattro celle senza fondo, divise da un
   filo verticale che sfuma alle estremita', con la cifra in monospazio e in
   gradiente. Nell'applicazione ognuna aveva un quadratino d'accento pieno con
   il suo alone: quattro macchie di colore per quattro etichette, ed erano la
   cosa piu' luminosa della prima schermata dopo il titolo. */
#view-home .ms-item{
  background:none;border:0;box-shadow:none;
  position:relative;
}
#view-home .ms-item + .ms-item::before{
  content:"";position:absolute;left:0;top:18%;bottom:18%;width:1px;
  background:linear-gradient(180deg,transparent,var(--pane-line-hi) 30%,
    var(--pane-line-hi) 70%,transparent);
}
#view-home .ms-item dd{
  font-family:var(--font-mono);font-weight:600;letter-spacing:-.045em;
  font-variant-numeric:tabular-nums;
}
/* L'icona resta (dice di che numero si tratta senza leggere l'etichetta) ma
   smette di essere una macchia: filo di contorno e simbolo, niente
   riempimento e niente alone. */
#view-home .ms-ico{
  background:none;
  box-shadow:inset 0 0 0 1px var(--pane-line);
  color:var(--green);
}

/* ---- 61.5 LA SCHEDA ATTIVA: UNA SOTTOLINEATURA, NON UNA PASTIGLIA ----
   Sull'ingresso non esiste nessuna pastiglia piena: la voce scelta si accende
   e basta. Nella lista era un rettangolo d'accento al 13% con il suo contorno,
   ed e' la seconda macchia di colore della schermata dopo i bottoni.
   L'inchiostro che scorre resta — e' il movimento che fa sembrare nativa una
   barra di schede — ma diventa una riga, come gia' fa sulle schede del token. */
.feed-tabs .v4-ink,
.pf-tabs .v4-ink{
  border-radius:2px 2px 0 0;height:2px !important;top:auto;bottom:0;
  background:var(--green);box-shadow:none;
}
#view-home .feed-tabs.v4-inked .feed-tab.active,
.feed-tabs.v4-inked .feed-tab.active,
.pf-tabs.v4-inked .pf-tab.active{
  color:var(--text);font-weight:600;
}
/* Senza inchiostro (JavaScript spento) la voce attiva resta riconoscibile. */
#view-home .feed-tabs:not(.v4-inked) .feed-tab.active,
.feed-tabs:not(.v4-inked) .feed-tab.active{
  background:none;color:var(--text);font-weight:600;
  box-shadow:inset 0 -2px 0 var(--green);
}

/* ---- 61.6 IL TESTO E' BIANCO ----
   Sull'ingresso il colore della rete tocca poche cose e nessuna di queste e'
   testo grande: il sopratitolo, i pallini, i contorni, un bottone. Il titolo
   e' bianco.
   Nell'applicazione invece il colore era finito ADDOSSO al testo: la seconda
   riga del titolo, la cifra dei rimborsi, l'etichetta del token in evidenza.
   Su BNB e' oro, su Solana viola, su Arc blu — e a ogni cambio di rete la
   pagina cambiava temperatura invece di cambiare un accento.
   La regola diventa quella dell'ingresso: il colore della rete sta nei SEGNI
   (fili, pallini, contorni, la barra sotto la scheda scelta, i bottoni), non
   nelle parole. */

/* Il titolo, tutto e due le righe, nel gradiente bianco della landing. */
#view-home .pitch h1 em{
  color:transparent;font-style:normal;
  background:inherit;-webkit-background-clip:text;background-clip:text;
}
/* La cifra dei rimborsi era l'unica delle quattro colorata, con un alone
   sotto: quattro numeri della stessa natura letti con due pesi diversi.
   Restano quattro numeri, e a distinguerli c'e' gia' la loro etichetta. */
#view-home .ms-item.accent dd{
  color:var(--text);
  filter:none;
}

/* Il sopratitolo della scheda in evidenza e quello dell'attivita': erano due
   pastiglie piene d'accento. Stessa forma del sopratitolo di sezione. */
#view-home .feat-k,
#view-home .hl-k{
  display:inline-flex;align-items:center;gap:9px;
  background:none;border:0;padding:0;
  border-radius:0;box-shadow:none;
  font-size:10px;letter-spacing:.2em;text-transform:uppercase;font-weight:600;
  color:var(--green);
}
#view-home .feat-k::before,
#view-home .hl-k::before{
  content:"";width:18px;height:1px;background:currentColor;opacity:.6;flex-shrink:0;
}
/* Il pallino che pulsava dentro le pastiglie: il trattino lo sostituisce. */
#view-home .feat-k .dot,
#view-home .feat-k .pulse-dot,
#view-home .hl-k .pulse-dot{display:none;}

/* ---- 61.7 IL TITOLO NON DEVE SPEZZARSI MALE ----
   "Change your mind." a 37px in 362 pixel di schermo andava a capo dopo
   "Change", lasciando una riga con una parola e una con due. text-wrap:balance
   distribuisce le righe invece di riempirle fino al bordo — e' quello che usa
   gia' l'ingresso — e la misura scende di quel tanto che basta perche' la
   seconda riga ci stia intera. */
#view-home .pitch h1{text-wrap:balance;}
@media (max-width:900px){
  #view-home .pitch h1{font-size:33px;}
}
@media (max-width:380px){
  #view-home .pitch h1{font-size:30px;}
}

/* ---- 61.8 LA BARRA IN ALTO, PIU' SILENZIOSA ----
   L'ingresso ha in cima: il marchio, quattro voci grigie, un'icona, un
   bottone pieno. L'applicazione ne aveva otto di voci piu' cinque comandi, e
   fra i comandi DUE erano d'accento ("Launch" pieno e "Stock" scritto in oro)
   piu' uno bianco pieno ("Login"): tre inviti che si contendono lo stesso
   angolo. Il colore in una barra vale finche' e' uno solo.
   Resta acceso "Launch", che e' l'azione del prodotto. "Stock" diventa un
   bottone di contorno: la stessa cosa, un grado sotto. */
.topbar .btn-launch-top.ghost{
  background:none;
  color:var(--text-dim);
  box-shadow:inset 0 0 0 1px var(--pane-line);
}
.topbar .btn-launch-top.ghost:hover{
  color:var(--text);
  box-shadow:inset 0 0 0 1px var(--pane-line-hi);
}

/* L'etichetta piu' lunga delle quattro ("tokens launched") andava a capo su
   telefono e faceva la sua cella piu' alta delle altre tre: quattro celle
   della stessa natura con quattro altezze diverse. */
@media (max-width:900px){
  #view-home .ms-item dt{font-size:9px;letter-spacing:.06em;white-space:nowrap;}
}

/* ==========================================================================
   62. NIENTE ANIMAZIONI D'INGRESSO DENTRO L'APPLICAZIONE
   --------------------------------------------------------------------------
   Le comparse a scorrimento e le entrate al caricamento sono giuste
   sull'ingresso: li' la pagina si guarda una volta, in ordine, e il movimento
   accompagna una lettura.

   Dentro l'applicazione fanno il contrario. Chi apre una lista di token la
   apre per LEGGERE dei numeri, spesso venti volte al giorno, e ogni volta
   deve aspettare che i pannelli finiscano di salire: quattordici pixel di
   traslazione e mezzo secondo di dissolvenza fra lui e il dato. Una
   piattaforma su cui si scambiano soldi non fa entrare i numeri in scena, li
   ha gia' li'.

   Non si toccano: il colore che cambia sotto il dito (dice che il tocco e'
   arrivato), l'inchiostro che scorre fra le schede (dice da dove a dove), il
   lampo su una riga appena arrivata (dice che e' nuova) e la barra di
   avanzamento. Quelli rispondono a un'azione o annunciano un fatto; le
   entrate non rispondono a niente.

   Le regole stanno qui e non nei file d'origine: sono di tre versioni diverse
   (v2, v3, v4) e ognuna ha il suo osservatore. Spegnerle in un punto solo
   significa che si riaccendono tutte insieme togliendo una sezione, invece di
   dover ricordare dove stavano.
   ========================================================================== */
.v4-rise,
.v4-rise.v4-in,
.v2-in,
.app .rise{
  opacity:1 !important;
  transform:none !important;
  animation:none !important;
  transition:none !important;
}
/* L'entrata al caricamento: barra, insegna, scheda in evidenza, fascia dei
   numeri, garanzie, tabella. */
html.v4-intro .topbar,
html.v4-intro #view-home .pitch,
html.v4-intro #view-home .feature,
html.v4-intro #view-home .market-bar,
html.v4-intro #view-home .trust,
html.v4-intro #view-home .modes,
html.v4-intro #view-home .tok-panel{
  animation:none !important;
  opacity:1 !important;
  transform:none !important;
}
/* Il cambio di vista: ogni rotta entrava con una sua animazione. */
.view-anim,
[id^="view-"]{
  animation:none !important;
}

/* ==========================================================================
   63. IL TESTO E' GRIGIO, NON DEL COLORE DELLA RETE
   --------------------------------------------------------------------------
   Misurato su cinque reti e nove schermate: --text, --text-dim e --text-mute
   erano ridichiarati da OGNI rete con la sua tinta.

     BNB        #f7f7f6  #a8a7a3  #7c7c78   (caldi, tirano al giallo)
     Solana     #f0eef5  #9a93a6  #7f7a8a   (tirano al viola)
     Arc        #e6ebf5  #8791ab  #788095   (tirano al blu)
     HyperEVM   #eef7f4  #8fa6a0  #71837e   (tirano al verde)

   Due conseguenze. La prima: il bianco non e' bianco, e' un bianco sporco
   della tinta della rete — quello che a occhio si legge come "bianco moscio".
   La seconda: --text-mute cosi' scuro dava 4,36:1 sul pannello, sotto la
   soglia di 4,5 per il testo piccolo, e su quella variabile vivono i suggerimenti
   dei moduli, le intestazioni delle colonne e gli stati vuoti.

   L'ingresso non fa cosi': ha UNA terna neutra e fredda uguale su tutte le
   reti (#f4f7fa / #98a3b2 / #767f8c) e cambia solo l'accento. E' anche il
   motivo per cui li' il bianco sembra bianco.

   Qui si prende la stessa terna. --text-mute sale un gradino rispetto
   all'ingresso, perche' nell'applicazione porta testo da 13px e non solo
   maiuscoletti da 10: cosi' sta a 6,0:1 invece che a 3,2.
   ========================================================================== */
:root,
:root[data-chain],
:root[data-chain="robinhood"],
:root[data-chain="arc"],
:root[data-chain="bsc"],
:root[data-chain="hyperevm"],
:root[data-chain="solana"]{
  /* BIANCO il testo principale — bianco vero, non un bianco tinto.
     Gli altri due non possono essere bianchi anche loro: se nome del token,
     descrizione ed etichetta della colonna hanno lo stesso colore, la scheda
     torna piatta e non si distingue piu' il dato dal contorno. Sono la SCALA
     sotto il bianco, e il difetto era che partivano troppo in basso (4,36:1)
     e con la tinta della rete addosso. Salgono di un gradino ciascuno e
     diventano neutri: il primo grigio e' quasi bianco, il secondo si legge
     senza sforzo. */
  --text:#ffffff;
  --text-dim:#b6bec9;
  --text-mute:#98a3b2;
}

/* ==========================================================================
   64. IL COLORE DELLA RETE NON STA SULLE PAROLE
   --------------------------------------------------------------------------
   Censite tutte le schermate, restavano accese in accento delle ETICHETTE:
   il tag di ogni voce del registro, la taglia sotto le modalita', il
   numero dei passi, la posizione in classifica, "Graduated" sulle righe,
   l'eta' fresca nel Terminal, il titolo della modalita' scelta nel modulo.
   Sono parole, non segni: leggerle in oro su BNB e in viola su Solana non
   aggiunge niente e toglie il bianco.

   Il colore resta dove FA qualcosa: i pallini delle reti, il filo dei
   sopratitoli, la barra sotto la scheda scelta, le barre di avanzamento, i
   bottoni, e il marchio in alto (che e' l'identita', non un'etichetta).
   Comprato e venduto restano verde e rosso: quelli non sono l'accento della
   rete, sono il verso dello scambio.
   ========================================================================== */
.up-tag,
.tagline,
.step-num,
.lb-pos,
.tok-tag.grad,
.tm-fresh,
.tm-badge.stock,
.feemode-opt-title,
.soon-gate-tag,
.side-label .soon{
  color:var(--text);
}
/* Restano riconoscibili per la forma, non per il colore: contorno e fondo
   appena accennati, come gli altri tag della lista. */
.up-tag,
.tok-tag.grad,
.tm-badge.stock,
.soon-gate-tag{
  border-color:var(--pane-line-hi);
  background:rgba(255,255,255,.05);
}
/* Il numero del passo e la posizione in classifica sono cifre dentro un
   quadratino: il quadratino tiene l'accento, la cifra no. */
.step-num,
.lb-pos{
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.35);
  background:rgba(var(--green-rgb),.08);
}

/* Restavano accese in accento anche queste, tutte parole o cifre e nessuna un
   segno: il titolo della modalita' scelta nel modulo, i badge NEW, la parola
   "live" nel Terminal, il filtro scelto sul nastro, il codice della versione,
   la percentuale di avanzamento e il rimborso sulla pagina del token, il
   simbolo accanto al prezzo. */
.feemode-opt.on .feemode-opt-title,
.feemode-opt-title,
.ev-b.new,
.tp-b.new,
.tm-live,
.tp-o.on,
.up-ver-v,
.token-badge.live,
#tokenSymbolDisplay,
#statBonding,
#myExit{
  color:var(--text);
}
.ev-b.new,
.tp-b.new,
.tp-o.on{
  border-color:var(--pane-line-hi);
  background:rgba(255,255,255,.06);
}

/* Due sfuggivano perche' dichiarate con un id o con un discendente piu'
   specifico: la taglia della modalita' e le tre cifre dei passi. */
#view-home .tagline,
.how-step .step-num{
  color:var(--text);
}
.how-step .step-num{
  background:rgba(var(--green-rgb),.08);
  box-shadow:inset 0 0 0 1px rgba(var(--green-rgb),.35);
  border-color:transparent;
}

/* Il numero del passo e' dichiarato in v3 come "#view-home .step-num": un id
   batte qualunque numero di classi, quindi finche' il selettore qui non ne ha
   uno la riga sopra non vale niente. Vale per tutte e due le viste in cui i
   passi compaiono. */
#view-home .step-num,
#view-docs .step-num,
#view-stocks .step-num{
  color:var(--text);
  background:rgba(var(--green-rgb),.1);
  border-color:rgba(var(--green-rgb),.3);
}

/* L'etichetta sotto il numero grande della scheda: dice DI COSA e' quel
   numero, perche' non e' sempre la stessa cosa (la capitalizzazione quando la
   sappiamo, il valore dello scambio quando il token non e' nella lista). */
.rt-k{
  display:block;
  font-size:9px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--text-mute);font-weight:600;
  margin-top:3px;
}
.rt-mc{flex-direction:column;align-items:flex-start;gap:0;}
.rt-mc .rt-ch{margin-top:4px;}
.rt-quiet{color:var(--text-dim);font-size:15px;}

/* Lo stato vuoto della striscia: una riga, non un riquadro. Serve a dire che
   la rete non ha ancora scambi — non a occupare il posto di una fila di
   schede che non c'e'. */
.rt-vuoto{
  padding:16px 2px;
  font-size:13px;color:var(--text-mute);
}

/* ---- IL BOTTONE DEI FILTRI SALE SULLA RIGA DELL'ORDINAMENTO ----
   Su desktop stava su una riga tutta sua sotto le schede, e una riga per un
   bottone alto trentadue pixel e' spazio speso per niente: ordinare e
   filtrare sono lo stesso gesto in due gradi, e stanno bene sulla stessa
   riga. Le schede prendono lo spazio che resta, il bottone sta a destra e non
   si muove.
   Su telefono no: li' le schede scorrono in orizzontale e prendono tutta la
   larghezza, e togliergliene cento per il bottone significherebbe vederne
   due invece di quattro. */
@media (min-width:901px){
  #view-home .section-head{
    display:flex;flex-wrap:wrap;align-items:stretch;
  }
  /* Le reti tengono la loro riga: sono la scelta piu' grande della pagina e
     non vanno affiancate a due comandi della lista. */
  #view-home .section-head .chain-row{flex:0 0 100%;}
  /* flex-basis ZERO e non auto: con auto la base e' la larghezza naturale
     della fila di schede (circa mille pixel), che riempie la riga e manda a
     capo il bottone. Con zero le schede prendono lo spazio che AVANZA dopo il
     bottone, che e' quello che devono fare. */
  /* La base e' 320 e non 0: con zero la fila di schede ha una misura ipotetica
     nulla, quindi ci sta accanto a QUALUNQUE cosa e finisce schiacciata sulla
     riga delle reti senza mai andare a capo. Con 320 non ci sta accanto a una
     riga gia' piena, va a capo come deve, e li' cresce fino a prendere quello
     che avanza dopo il bottone dei filtri. */
  #view-home .section-head .feed-tabs{
    flex:1 1 320px;min-width:0;overflow-x:auto;
    scrollbar-width:none;
    border-top:1px solid var(--pane-inner);
    align-items:center;
  }
  #view-home .section-head .feed-tabs::-webkit-scrollbar{display:none;}
  #view-home .section-head .fl-bar{
    flex:0 0 auto;width:auto;
    border-top:1px solid var(--pane-inner);
    padding-left:14px;
    justify-content:flex-end;align-items:center;
  }
  #view-home .section-head .fl-panel{flex:0 0 100%;}
}

/* ==========================================================================
   65. LA LISTA COME GRIGLIA DI SCHEDE
   --------------------------------------------------------------------------
   La tabella serve a CONFRONTARE: sei colonne allineate, venti righe, e
   l'occhio scende una colonna per volta. La griglia serve a RICONOSCERE: il
   marchio del token e' grande, e chi cerca "quello con la mela" lo trova a
   colpo d'occhio invece di leggere venti nomi.

   Non e' una sostituzione, e' l'altro modo di guardare la stessa lista: si
   sceglie dal bottoncino accanto ai filtri e la scelta resta su questo
   browser. Il markup e' esattamente lo stesso — le celle sono gia' quelle che
   servono a una scheda, e non c'e' una seconda funzione che disegna le
   stesse righe una seconda volta.

   Solo da 901px in su: sotto, la lista e' gia' fatta di schede impilate, e
   una griglia a una colonna sarebbe la stessa cosa con un altro nome.
   ========================================================================== */
.lv{display:none;}
@media (min-width:901px){
  .lv{
    display:inline-flex;gap:2px;padding:2px;
    border-radius:999px;
    border:1px solid var(--pane-line);
    background:rgba(255,255,255,.03);
  }
  .lv-b{
    display:inline-flex;align-items:center;justify-content:center;
    width:30px;height:26px;border:0;border-radius:999px;
    background:none;color:var(--text-mute);cursor:pointer;
    transition:color var(--v4-t) var(--v4-ease),background var(--v4-t) var(--v4-ease);
  }
  .lv-b svg{width:15px;height:15px;}
  .lv-b:hover{color:var(--text);}
  .lv-b.on{background:rgba(255,255,255,.09);color:var(--text);}

  /* LA GRIGLIA. Quattro per riga su una pagina larga, tre sotto i 1200: sotto
     i 260px di larghezza la capitalizzazione e la variazione vanno a capo e la
     scheda diventa alta il doppio per dire le stesse cose. */
  /* La griglia va su #tokenGrid e NON su .tok-panel: le righe non sono figlie
     del pannello, stanno dentro quel contenitore. Mettendo display:grid sul
     pannello i suoi due figli (intestazione e contenitore) diventavano le
     celle, e tutte le schede restavano impilate dentro la prima. */
  #view-home .tok-panel.is-cards{
    padding:14px;
    background:none;border:0;box-shadow:none;
    border-radius:0;
  }
  /* Gli !important non sono un vezzo: .token-grid e' dichiarata in index.html
     con display:flex !important, gap:0 !important e grid-template-columns:none
     !important. Quella riga esiste da quando la lista e' diventata una
     tabella e serviva a spegnere per sempre la vecchia griglia di schede.
     Ora la griglia torna, ma solo quando la si chiede: si sovrascrive
     l'!important con un !important piu' specifico invece di togliere quello,
     che vale ancora per tutti gli altri usi di .token-grid (watchlist,
     profilo, elenco azionario). */
  #view-home .tok-panel.is-cards #tokenGrid{
    display:grid !important;
    grid-template-columns:repeat(auto-fill,minmax(268px,1fr)) !important;
    gap:12px !important;
  }
  /* L'intestazione della tabella non ha piu' colonne da intestare. */
  #view-home .tok-panel.is-cards .tok-head{display:none;}

  #view-home .tok-panel.is-cards .tok-row{
    display:grid;
    grid-template-columns:1fr 1fr;
    grid-template-areas:
      "chi   chi"
      "mcap  graf"
      "prog  prog"
      "vol   scambi";
    gap:12px 10px;
    align-items:start;
    padding:14px 14px 15px;
    border:1px solid var(--pane-line);
    border-radius:var(--v4-r-lg,14px);
    background:var(--v3-panel,var(--pane-bg));
    box-shadow:var(--pane-edge);
    transition:border-color var(--v4-t) var(--v4-ease),
               transform var(--v4-t) var(--v4-ease);
  }
  #view-home .tok-panel.is-cards .tok-row:hover{
    border-color:rgba(var(--green-rgb),.4);
    transform:translateY(-2px);
  }

  #view-home .tok-panel.is-cards .tr-id{grid-area:chi;gap:11px;align-items:center;}
  #view-home .tok-panel.is-cards .tr-img{width:44px;height:44px;border-radius:13px;font-size:17px;}
  #view-home .tok-panel.is-cards .tr-n1{
    font-size:15.5px;font-weight:600;letter-spacing:-.015em;
    display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  }
  #view-home .tok-panel.is-cards .tr-n2{font-size:12px;margin-top:2px;}
  /* L'intestazione ha un'altezza fissa: un token con due badge manda il nome
     a capo, e in una griglia una scheda piu' alta alza TUTTA la riga lasciando
     le altre tre con un vuoto in fondo. Due righe di spazio ci sono sempre,
     le usi o no. */
  #view-home .tok-panel.is-cards .tr-name{
    min-height:48px;
    display:flex;flex-direction:column;justify-content:center;
  }

  #view-home .tok-panel.is-cards [data-col="mcap"]{
    grid-area:mcap;align-self:center;
    display:flex;flex-direction:column;align-items:flex-start;gap:2px;
    font-size:21px;font-weight:600;letter-spacing:-.03em;line-height:1.1;
    text-align:left;
  }
  #view-home .tok-panel.is-cards [data-col="vol"]{grid-area:vol;}
  #view-home .tok-panel.is-cards [data-col="trades"]{grid-area:scambi;display:flex;}
  #view-home .tok-panel.is-cards .tr-spark{grid-area:graf;height:54px;align-self:center;margin:0;}
  #view-home .tok-panel.is-cards .tr-prog{grid-area:prog;}
  #view-home .tok-panel.is-cards .tr-ca{display:none;}

  /* Le etichette tornano visibili: in una scheda non c'e' l'intestazione di
     colonna sopra a dire di che numero si tratta. */
  #view-home .tok-panel.is-cards .tr-lbl{
    display:block;position:static;margin:0 0 2px;
    font-size:9px;letter-spacing:.1em;text-transform:uppercase;
    color:var(--text-mute);font-weight:600;
    white-space:nowrap;
  }
  #view-home .tok-panel.is-cards [data-col="vol"],
  #view-home .tok-panel.is-cards [data-col="trades"]{
    display:flex;flex-direction:column;align-items:flex-start;
    font-size:13.5px;color:var(--text-dim);
    text-align:left;
    padding-top:11px;
    box-shadow:inset 0 1px 0 var(--pane-inner);
  }
  #view-home .tok-panel.is-cards .tr-prog{
    display:flex;align-items:center;gap:9px;
    padding-top:0;box-shadow:none;
  }
  #view-home .tok-panel.is-cards .tr-prog .tr-lbl{margin:0;flex-shrink:0;}
  #view-home .tok-panel.is-cards .tr-bar{flex:1 1 auto;min-width:0;}
  #view-home .tok-panel.is-cards .tr-pct{flex-shrink:0;font-size:12px;font-variant-numeric:tabular-nums;}
}
@media (min-width:901px) and (max-width:1199px){
  #view-home .tok-panel.is-cards #tokenGrid{grid-template-columns:repeat(auto-fill,minmax(252px,1fr)) !important;}
}

#view-home .tok-panel.is-cards .tok-row{
  background:var(--pane-bg);
}

/* ==========================================================================
   66. IL FONDO DELL'APPLICAZIONE E' PIATTO
   --------------------------------------------------------------------------
   Sotto le schermate c'erano quattro strati sovrapposti: il nero di base
   (rgb 3,3,2, caldo), due aloni radiali nel colore della rete al 9%, una
   grana di rumore al 4,5% e un campo di puntini che deriva su un canvas.

   Erano fatti per una pagina che si guarda: danno profondita' a una scena.
   Ma questa e' una schermata di lavoro larga 1440 pixel, e su quella misura
   gli stessi strati diventano un alone giallastro in un angolo, una patina e
   dei puntini che si muovono dietro dei numeri fermi. Peggio da quando i
   pannelli sono azzurrati: fondo caldo e superfici fredde si combattono, ed
   e' quella discordanza che si legge come "il fondo non funziona".

   Piatto e freddo. Il nero resta nero, ma dello stesso freddo dei pannelli,
   e sopra non c'e' niente. L'ingresso tiene i suoi strati: quello e' un
   documento a se' (landing.html non carica questi fogli) e li' servono.
   ========================================================================== */
body{
  background:#080b0e;
}
/* COSA RESTA E COSA NO.
   Il campo di particelle RESTA: e' l'unica cosa animata del fondo, si muove
   piano, segue il cursore con molta inerzia e non compete con niente perche'
   non ha linee. Un fondo assolutamente fermo dietro una schermata di numeri
   fermi e' morto, e questo non e' un documento.
   Se ne vanno invece gli strati che non si muovono e sporcano: i due aloni
   radiali nel colore della rete (un alone giallastro in un angolo su BNB), la
   grana di rumore al 4,5% (una patina su tutto) e il palco vuoto. Erano
   profondita' finta; le particelle sono profondita' vera, calcolata dalla
   distanza.
   Chi ha chiesto meno movimento riceve la scena FERMA e non nessuna scena:
   se ne occupa gia' starfield.js con prefers-reduced-motion. */
.v4-grain,
.v2-aurora,
.v4-stage{display:none !important;}

/* Sul telefono c'e' anche li'. L'avevo spento per la batteria, ma da fuori
   "non c'e' animazione" e "l'ho spenta io" sono la stessa schermata, e la
   scelta giusta non era fra la scena e la batteria: era tagliare dove costa e
   non dove si vede. Se ne occupa starfield.js — un terzo dei punti (la densita'
   che conta e' per area), meta' dei pixel (a dpr 3 un fondo di punti sfocati e'
   tre volte il lavoro per una differenza invisibile), i due gradienti a tutto
   schermo disegnati una volta sola invece che a ogni fotogramma (senza cursore
   il punto di fuga non si muove) e meta' dei fotogrammi. */
/* Piu' presente di prima: su un fondo piatto il 40% spariva, e il senso di
   questo strato e' che si veda muovere qualcosa. */
#starfield-bg{opacity:.75;}

/* ==========================================================================
   67. LE STANGHETTE FRA LE QUATTRO CIFRE, SU TELEFONO
   --------------------------------------------------------------------------
   Su desktop le quattro celle sono una fila e la regola "una riga verticale
   prima di ogni cella tranne la prima" e' giusta.

   Su telefono diventano due per due, e la stessa regola sbaglia: la terza
   cella (il volume) e' la PRIMA della seconda riga, ma per il CSS resta "una
   cella che ne segue un'altra", quindi si disegnava una stanghetta contro il
   bordo interno del pannello. Il risultato era due righe con due trattamenti
   diversi: la prima senza segno a sinistra, la seconda con.

   Coerenza vera: la verticale divide le COLONNE (quindi solo la seconda cella
   di ogni riga), e fra le due righe passa una orizzontale. Cosi' le due righe
   si leggono uguali e la griglia si vede come una griglia.
   ========================================================================== */
@media (max-width:900px){
  /* Via la stanghetta dalla prima cella di ogni riga: in una griglia a due
     colonne sono la prima e la terza. */
  #view-home .ms-item:nth-child(odd)::before{content:none;}
  /* La riga orizzontale fra le due righe, sulle celle della seconda. */
  #view-home .ms-item:nth-child(n+3)::after{
    content:"";position:absolute;left:0;right:0;top:0;height:1px;
    background:linear-gradient(90deg,transparent,var(--pane-line-hi) 22%,
      var(--pane-line-hi) 78%,transparent);
  }
  /* L'orizzontale della cella di destra parte dopo la verticale, o le due si
     incrociano in un punto piu' luminoso. */
  #view-home .ms-item:nth-child(4)::after{left:1px;}
}

/* ==========================================================================
   68. IL MARCHIO DI UN TOKEN NON LASCIA MAI UN QUADRATO VUOTO
   --------------------------------------------------------------------------
   L'immagine di un token la mette chi lo lancia: un indirizzo qualunque, su
   un dominio qualunque, che puo' rispondere 404 oggi e sparire domani. Il
   codice pero' sceglieva: se c'e' un'immagine, disegna l'immagine e NON la
   lettera. Quando quell'immagine non arriva resta un quadrato vuoto, e una
   lista di quadrati vuoti e' il primo difetto che si nota.
   Ora la lettera c'e' sempre, nel markup, e l'immagine le sta sopra come uno
   strato: se non carica, sotto c'e' gia' l'iniziale al posto giusto.
   Costa zero richieste in piu' e nessun JavaScript: se --tok-img non e'
   dichiarata il livello non esiste, e se e' dichiarata ma non risolve il
   livello resta trasparente.
   ========================================================================== */
.tr-img,
.rt-av{position:relative;overflow:hidden;}
/* Il logo copre l'iniziale che sta sotto. Se non carica, l'ascoltatore in
   app.js lo toglie dal documento e resta scoperta la lettera. */
.tok-logo{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:cover;object-position:center;
  border-radius:inherit;
  display:block;
  background:var(--v3-panel-2, var(--panel-2));
}

/* ==========================================================================
   69. LE SCHEDE DEGLI SCAMBI RECENTI SI LEGGONO PER COLONNE
   --------------------------------------------------------------------------
   Una fila di schede affiancate non si legge una scheda alla volta: l'occhio
   scorre in orizzontale e confronta il numero grande della prima con quello
   della seconda, l'etichetta con l'etichetta, il piede con il piede. Perche'
   quel confronto funzioni le parti devono stare alla STESSA altezza in tutte,
   e finora non ci stavano: la riga della variazione esisteva solo nelle schede
   che avevano una capitalizzazione, e le altre risalivano di quindici pixel
   portandosi dietro tutto quello che c'era sotto. Il risultato era una fila di
   schede sfalsate, tutte alte uguale ma con il contenuto a quote diverse.

   Due regole, e nessuna riguarda il caso particolare:
   1. le tre righe del blocco centrale ci sono sempre (in app.js), e quella
      della variazione tiene la sua altezza anche da vuota;
   2. il piede e' ancorato in fondo, cosi' qualunque differenza residua si
      raccoglie nello spazio sopra invece di spingere il piede in su.
   ========================================================================== */
.rt-c{
  /* Tre fasce: identita', numero, piede. Il centro si allarga e assorbe la
     differenza, il piede resta appoggiato al fondo della scheda. */
  display:grid;
  grid-template-rows:auto 1fr auto;
  align-content:stretch;
}
/* Il blocco centrale riempie la fascia elastica (e' un flex in colonna) e il
   suo contenuto resta appoggiato in alto: il numero grande parte sempre dalla
   stessa quota, e lo spazio in piu' finisce sotto la variazione. */
.rt-mc{justify-content:flex-start;}
/* La riga della variazione esiste anche quando non c'e' niente da scriverci.
   In em e non in pixel: segue la dimensione del carattere se cambia. */
.rt-ch{min-height:1.25em;line-height:1.25;}

/* ==========================================================================
   70. ANCHE LE SCHEDE DELLA LISTA SI LEGGONO PER COLONNE
   --------------------------------------------------------------------------
   Stesso difetto delle schede degli scambi, ma su quattro schede affiancate
   invece che su una fila che scorre, quindi si nota di piu': in una griglia
   la capitalizzazione della prima scheda deve stare esattamente alla quota
   della seconda, o non si confrontano.
   Misurato prima: numero grande a quattro quote diverse (75, 84, 90, 99),
   volume e scambi a quattro (161, 171, 189, 195), schede alte 234 o 258.
   Tre cause, tutte della stessa forma — una parte che in certe schede non
   c'e' e in altre si':

   1. IL TRAGUARDO SPARIVA sui token gia' migrati. La riga in meno accorciava
      la scheda di ventiquattro pixel e tirava su volume e scambi. L'avevo
      tolta perche' il badge "Graduated" dice gia' la stessa cosa; e' vero,
      ma il prezzo era una griglia sfalsata, e una barra piena e' comunque il
      modo piu' veloce per leggere "arrivato" scorrendo con l'occhio: la
      parola sta in alto, il disegno sta nella colonna dove c'e' il progresso
      di tutti gli altri. Torna.
   2. IL NOME ANDAVA A CAPO quando aveva due distintivi accanto, o la riga
      sotto era lunga (uno stock token scrive simbolo, eta' e in che titolo
      paga). L'altezza minima da 48px non bastava: era un minimo, non una
      misura. Ora le due righe sono una riga ciascuna e il testo che avanza
      finisce nei puntini.
   3. IL NUMERO GRANDE ERA CENTRATO nella sua fascia, e la fascia contiene
      anche la variazione: le schede senza variazione lo centravano piu' in
      alto. Parte dall'alto, come l'etichetta.
   ========================================================================== */
@media (min-width:901px){
  /* Il nome: due righe, sempre due, mai tre. */
  #view-home .tok-panel.is-cards .tr-name{height:48px;min-height:48px;}
  #view-home .tok-panel.is-cards .tr-n1{flex-wrap:nowrap;min-width:0;}
  /* Il testo cede, i distintivi no: sono larghi poco e dicono cosa e' quel
     token, mentre di un nome lungo bastano le prime lettere per riconoscerlo. */
  #view-home .tok-panel.is-cards .tr-n1 .tn-text{
    min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  }
  #view-home .tok-panel.is-cards .tr-n1 > .tok-tag,
  #view-home .tok-panel.is-cards .tr-n1 > .og-badge{flex-shrink:0;}
  #view-home .tok-panel.is-cards .tr-n2{
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  /* Il numero grande parte dall'alto della sua fascia: cosi' la variazione,
     che c'e' solo su alcune schede, cresce verso il basso invece di spostare
     il numero verso l'alto. */
  #view-home .tok-panel.is-cards [data-col="mcap"]{align-self:start;}
  /* La barra del traguardo c'e' su tutte, piena su quelle arrivate. */
  #view-home .tok-panel.is-cards .tok-row.is-bonded .tr-prog{display:flex;}
}

/* Il posto di un numero che non c'e'. Un trattino solo, nel corpo del numero
   grande, si legge come un segno meno o come un difetto di caricamento; e in
   una colonna in cui gli altri valori sono grossi e chiari, e' l'unica cella
   che sembra rotta. "n/a" e' piu' piccolo e spento del numero che sostituisce,
   quindi non entra nel confronto verticale e non finge di essere un valore.
   (Volume e scambi non passano piu' di qui: uno zero e' un dato, e ora si
   scrive zero.) */
.tr-na{
  font-size:.62em;font-weight:600;letter-spacing:.06em;
  color:var(--text-mute);text-transform:uppercase;
  font-family:var(--font-mono);
}

/* ==========================================================================
   71. IL MENU SU TELEFONO SALE DAL BASSO
   --------------------------------------------------------------------------
   Entrava da sinistra. Era giusto quando era un cassetto laterale aperto da un
   hamburger in alto a sinistra: la cosa si muoveva dal punto in cui l'avevi
   toccata. Da quando il menu e' a tutto schermo e lo apre il bottone tondo in
   mezzo alla barra in BASSO, quel movimento dice la cosa sbagliata: tocchi
   sotto e la schermata arriva da un lato.

   Sale dal basso, dal bottone che l'ha chiamata, e si richiude scendendoci.
   E' anche il verso in cui si muove tutto il resto su un telefono, dove un
   pannello che arriva da sotto e' la forma standard di "una schermata sopra
   quella che stavi guardando".

   Con questo cambiano di verso anche le due cose che accompagnavano lo
   scorrimento laterale:
   - l'ombra, che era spostata a destra per staccare il cassetto dalla pagina,
     ora sta sopra il bordo alto;
   - il bordo, che era a destra, ora e' in alto: e' il lato che tocca la pagina.
   ========================================================================== */
@media (max-width:900px){
  .sidebar{
    transform:translateY(100%);
    /* Un po' piu' lunga della laterale: la corsa e' l'altezza dello schermo
       invece della larghezza di un cassetto, e alla stessa durata sembrerebbe
       uno scatto. */
    transition:transform .34s var(--v4-ease),box-shadow .34s var(--v4-ease);
    /* L'!important risponde a quello di v3 (max-width:1000px), che vale anche
       per la fascia 901-1000 dove la colonna sta davvero a sinistra e quel
       bordo le serve. Qui il pannello e' largo quanto lo schermo, quindi il
       bordo destro cade fuori dal bordo dello schermo: non si vede e non
       significa niente. */
    border-right:0 !important;
    border-top:1px solid var(--v4-edge-lo);
    box-shadow:0 -30px 80px -30px rgba(0,0,0,0);
  }
  .sidebar.open{
    transform:translateY(0);
    box-shadow:0 -30px 80px -30px rgba(0,0,0,1);
  }
  /* Chi ha chiesto meno movimento riceve la schermata, non il viaggio. */
  @media (prefers-reduced-motion:reduce){
    .sidebar{transition:none;}
  }
}

/* ==========================================================================
   72. BERSAGLI DA DITO SU TELEFONO
   --------------------------------------------------------------------------
   Misurati su tre schermi e due temi, questi erano sotto la soglia oltre la
   quale un dito comincia a sbagliare voce (circa 40px, e non si tratta di
   quanto e' grande il testo ma di quanta area accetta il tocco):

     piede pagina        13 link alti 17px, uno sotto l'altro a 13px di
                         distanza. E' il caso peggiore: il bersaglio e' piu'
                         piccolo dello spazio che lo separa dal vicino, quindi
                         un tocco impreciso non manca il link — ne prende un
                         altro, che e' molto peggio che non succedere niente.
     filtri del Terminal chip alti 28px e 24px.

   Su desktop restano come sono: con un mouse un bersaglio da 24px e' preciso,
   e allargarli sfalderebbe una barra di comandi volutamente densa.
   Nessuno cambia dimensione del testo o posizione: cresce solo l'area che
   accetta il tocco, per riempimento verticale, e il distacco che c'era prima
   fra un link e l'altro finisce dentro i bersagli stessi (le voci si toccano,
   quindi non resta nessuna zona morta in cui un tocco non fa niente).
   Il piede pagina passa cosi' da 190 a 221 pixel su un telefono: trentuno
   pixel in fondo a una pagina che ne e' alta quattromilaquattrocento, cioe'
   niente, in cambio di dodici link che si possono premere.
   ========================================================================== */
@media (max-width:900px){
  /* Il link occupa la sua riga per intero, e la riga e' alta quanto un dito.
     Il margine sotto sparisce: era lo spazio fra due bersagli, e ora quello
     spazio e' dentro i bersagli stessi. */
  .foot-col a{
    display:flex;align-items:center;
    min-height:40px;
    margin-bottom:0;
    padding-block:2px;
  }
  .foot-col{gap:0;}
  /* Il titolo di colonna non e' un bersaglio: resta com'era, ma prende un po'
     d'aria sotto ora che i link non hanno piu' il loro margine. */
  .foot-col h4{margin-bottom:4px;}

  /* I chip dei filtri: stessa altezza dei campi accanto a cui stanno. */
  .tmx-f,
  .tp-o,
  .tp-x{min-height:38px;}
  .tp-o,
  .tp-x{padding-inline:14px;}
  .tp-x{min-width:38px;}
}

/* Il testo piu' piccolo del sito, su telefono. 8,5px e' sotto la soglia in cui
   una maiuscola spaziata resta una parola invece di diventare un segno: sul
   nastro del Terminal e' l'etichetta che dice se quello scambio e' un acquisto
   o una vendita, cioe' la cosa che si legge di piu' in quella schermata.
   Su desktop restano a 8,5: li' lo schermo e' piu' vicino agli occhi in
   proporzione e la riga e' molto piu' larga, quindi l'etichetta ha aria
   intorno; su un telefono no. */
@media (max-width:900px){
  .tp-b{font-size:10px;}
  #sidebarChains .side-chain-soon,
  .side-chain-soon{font-size:9.5px;}
}

/* ==========================================================================
   73. IL PIEDE E' UNA SUPERFICIE, NON UN VUOTO
   --------------------------------------------------------------------------
   Era trasparente: nessun fondo, nessun bordo, solo una linea sfumata in alto.
   Aveva senso quando dietro c'era una scenografia da guardare — il piede si
   toglieva di mezzo e la lasciava passare. Da quando il fondo e' piatto e
   freddo e tutto il resto della pagina e' una successione di pannelli pieni,
   quella trasparenza non fa vedere niente: fa solo finire la pagina in un
   punto in cui non c'e' piu' niente, e dodici link appoggiati sul nulla non
   sembrano una parte del sito ma un avanzo.

   Diventa un pannello come gli altri, con le stesse variabili: stesso
   riempimento, stesso bordo, stesso raggio, stesso filo di luce dentro il
   bordo alto. Cosi' la pagina si chiude con un oggetto invece che con una
   dissolvenza, e il piede appartiene alla stessa famiglia di tutto quello che
   ha sopra.

   Gli !important rispondono a quelli di v3, che spegneva fondo, bordo, raggio
   e ombra tutti con !important per centrare il piede sotto un contenuto che
   allora non lo era.
   ========================================================================== */
.site-footer{
  border:1px solid var(--pane-line, var(--border)) !important;
  border-radius:var(--pane-r, 14px) !important;
  padding:26px 24px !important;
  /* Il piede e' l'ultima cosa della pagina: sotto ci vuole aria, o il
     pannello finisce incollato al bordo del documento. */
  margin:20px auto 28px !important;
}
.site-footer{
  background:var(--pane-bg) !important;
  box-shadow:var(--pane-edge), var(--pane-lift) !important;
}
/* La linea sfumata in cima non serve piu' e ora sarebbe anche sbagliata: era
   il bordo del piede quando il piede non ne aveva uno, e su un rettangolo con
   gli angoli arrotondati taglierebbe dritta attraverso le curve. */
.site-footer::before{content:none;}

/* La riga di chiusura dentro il pannello: un filo interno, piu' leggero del
   bordo esterno, come le righe che dividono le celle nelle schede. */
.site-footer .foot-bottom{
  border-top-color:var(--pane-inner, var(--border));
}

@media (max-width:1000px){
  /* Sotto i 1000 il contenuto non e' piu' centrato in una colonna stretta e il
     piede prendeva tutta la larghezza attaccato ai bordi. Da pannello ha
     bisogno degli stessi margini laterali delle altre schede, o il bordo
     appena aggiunto finisce fuori dallo schermo. */
  .site-footer{
    margin:24px 14px calc(18px + env(safe-area-inset-bottom,0px)) !important;
    padding:22px 16px !important;
  }
}
@media (max-width:900px){
  /* LO SPAZIO PER LA BARRA IN BASSO C'ERA GIA'.
     Avevo dato al piede un margine di 86 pixel perche' non finisse sotto la
     barra. Ma quello spazio lo riserva gia' .app con un padding di 64: i due
     si sommavano, e sotto il piede restavano centocinquanta pixel di vuoto per
     una barra alta sessanta. Da fuori sembrava che il sito finisse e poi
     continuasse per un altro po' senza motivo.
     Qui resta solo l'aria che serve a staccare il pannello dalla fine della
     pagina, la stessa che ha su schermo largo. */
  .site-footer{margin-bottom:24px !important;}
}

/* Le colonne del piede si stringono al loro contenuto.
   Erano tre frazioni uguali di tutta la larghezza: a 1440 ogni colonna era
   larga 370 pixel per contenere link larghi 120, e restavano duecentocinquanta
   pixel di vuoto a destra di ognuna. Finche' il piede era trasparente non si
   notava, perche' non c'era una superficie da riempire; su un pannello quel
   vuoto e' meta' dell'oggetto.
   Le tre colonne stanno larghe quanto la voce piu' lunga che contengono, e il
   gruppo si appoggia a destra: il marchio a sinistra, i link dall'altra parte,
   e in mezzo lo spazio che serve a distinguere le due cose invece di quello
   che avanza. */
@media (min-width:721px){
  .site-footer .foot-cols{
    /* Non tutta la larghezza rimasta, e nemmeno strette quanto il testo.
       Attaccate al contenuto finivano tutte e tre ammassate al bordo destro
       con novecento pixel di niente prima: lo stesso vuoto di prima, solo
       spostato. Un tetto di settecentoventi le tiene in tre colonne da
       duecentoquaranta — larghe quanto basta alla voce piu' lunga
       ("Contracts on explorer") piu' un po' d'aria — e il resto della
       larghezza fa da distacco fra il marchio e i link, che e' l'unica cosa
       che quello spazio deve fare. */
    flex:0 1 720px;
    margin-left:auto;
    grid-template-columns:repeat(3,minmax(0,1fr));
    gap:24px 32px;
  }
}
/* Il profilo accanto al marchio: e' un link, non un titolo, quindi pesa meno
   del nome che ha sopra. Il segno e la scritta si accendono insieme. */
.foot-x{
  display:inline-flex;align-items:center;gap:7px;
  margin-top:10px;
  font-size:12.5px;color:var(--text-mute);
  text-decoration:none;
  transition:color var(--v4-t-fast) var(--v4-ease);
}
.foot-x svg{width:13px;height:13px;flex-shrink:0;}
.foot-x:hover{color:var(--text);}
@media (max-width:900px){
  /* Da bersaglio per un dito, come gli altri link del piede. */
  .foot-x{min-height:40px;margin-top:2px;}
}

/* Il punto di separazione fra copyright e assistenza: su telefono le due
   informazioni vanno a capo e il puntino restava appeso in fondo alla prima
   riga, a separare una cosa da niente. Su una riga sola serve, a capo no. */
@media (max-width:720px){
  .site-footer .foot-meta{display:block;}
  .site-footer .foot-meta .sep{display:none;}
  .site-footer .foot-meta > span{display:block;}
}

/* ==========================================================================
   74. IL SELETTORE DELLA SOGLIA NON APRE PIU' IL MENU DEL SISTEMA
   --------------------------------------------------------------------------
   Era un <select> nativo. Chiuso stava bene (la freccia e i colori sono nostri
   da sempre), ma APERTO su telefono usciva la lista del sistema operativo: un
   rettangolo bianco con il carattere di sistema in mezzo a una pagina scura di
   dati. E' l'unico momento in cui il sito smette di essere il sito.

   Il <select> resta nel documento, nascosto, e continua a tenere il valore:
   quello che si vede e' un bottone e un pannello nostri. Se il JavaScript non
   partisse tornerebbe visibile un <select> normale invece di un controllo
   morto — vedi .sel2-native piu' sotto.

   Su schermo largo il pannello si apre sotto il bottone. Su telefono sale dal
   basso a tutta larghezza, nello stesso verso del menu: quando l'unica mano
   che tocca lo schermo arriva da sotto, tutto quello che si apre deve venire
   da li'.
   ========================================================================== */
.sel2{display:inline-flex;position:relative;flex:0 0 auto;}

/* Il <select> vero: c'e' ma non si vede. Non display:none, cosi' resta un
   campo di modulo a tutti gli effetti; e non e' raggiungibile con il tab
   (tabindex -1 nel markup generato), perche' il bersaglio della tastiera e' il
   bottone che gli sta davanti. */
.sel2-native{
  position:absolute;width:1px;height:1px;
  /* E LA LARGHEZZA MINIMA A ZERO, che e' la riga che mancava.
     Il <select> vero conserva le classi che aveva nel markup, e una di
     quelle - `.tk2-alert` - dichiara `min-width:140px` apposta, per non
     farsi stringere dentro la riga flex quando e' lui a vedersi. Su un campo
     largo 1px la larghezza minima vince sulla larghezza: il select restava
     largo 140px, in posizione assoluta, e sporgeva di 28px dal bottone da
     112px che gli sta davanti.
     Non si vedeva (opacity 0, clip-path, pointer-events none) ma c'era, e un
     controllo da 140px fuori dalla propria scatola vicino al bordo destro
     diventa un traboccamento vero il giorno che la riga si sposta.
     Misurato sulla pagina token a 390px: scatola 112px, contenuto 140px. */
  min-width:0;max-width:1px;
  opacity:0;pointer-events:none;
  margin:0;padding:0;border:0;
  clip-path:inset(50%);
}

/* Il bottone eredita l'aspetto che aveva il select chiuso: stessa altezza,
   stesso raggio, stessi colori, stessa larghezza minima (dentro una riga flex
   si lasciava stringere e la percentuale — l'unica parte che conta — finiva
   tagliata). */
.sel2-btn{
  display:inline-flex;align-items:center;gap:8px;
  height:32px;padding:0 10px;border-radius:9px;
  background:var(--panel-2);border:1px solid var(--border-2);color:var(--text-dim);
  font-family:inherit;font-size:12px;font-weight:500;letter-spacing:-.01em;
  cursor:pointer;
  min-width:140px;
  transition:border-color var(--v4-t,.18s) var(--v4-ease,ease),
             color var(--v4-t,.18s) var(--v4-ease,ease),
             background var(--v4-t,.18s) var(--v4-ease,ease);
}
.sel2-val{flex:1 1 auto;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* La freccia: due lati di un quadrato ruotati, non un carattere. Un glifo
   cambia forma da un sistema all'altro. */
.sel2-arw{
  width:6px;height:6px;flex-shrink:0;
  border-right:1.6px solid currentColor;border-bottom:1.6px solid currentColor;
  transform:translateY(-2px) rotate(45deg);
  transition:transform var(--v4-t,.18s) var(--v4-ease,ease);
}
.sel2.is-open .sel2-arw{transform:translateY(1px) rotate(-135deg);}
.sel2-btn:hover{border-color:var(--border-3,var(--border-2));color:var(--text);}
.sel2-btn:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;}
/* Con un avviso attivo il controllo smette di essere un menu qualunque e
   diventa uno stato acceso: si deve vedere da lontano che il token sta
   guardando per te. */
.sel2.is-on .sel2-btn{color:var(--green);border-color:rgba(var(--green-rgb),.34);}

/* IL PANNELLO. position:fixed e collocato dal JavaScript: dentro il
   contenitore basterebbe un antenato con overflow nascosto — e questo
   controllo sta in una riga di comandi dentro una scheda — per tagliarlo a
   meta'. */
.sel2-pan{
  position:fixed;z-index:120;
  padding:5px;
  background:var(--pane-bg, var(--panel));
  border:1px solid var(--pane-line, var(--border-2));
  border-radius:12px;
  box-shadow:0 2px 4px rgba(0,0,0,.3), 0 22px 48px -20px rgba(0,0,0,.85);
  max-height:min(60vh, 420px);overflow-y:auto;
}
.sel2-tit{
  padding:8px 10px 6px;
  font-size:10px;letter-spacing:.11em;text-transform:uppercase;
  color:var(--text-mute);font-weight:600;
}
.sel2-op{
  display:flex;align-items:center;
  min-height:34px;padding:7px 10px;
  border-radius:8px;
  font-size:13px;color:var(--text-dim);
  cursor:pointer;
  transition:background var(--v4-t-fast,.12s) var(--v4-ease,ease),
             color var(--v4-t-fast,.12s) var(--v4-ease,ease);
}
.sel2-op:hover{background:var(--pane-bg-2, var(--panel-2));color:var(--text);}
.sel2-op:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:-2px;}
/* La scelta corrente si riconosce dal segno di spunta, non solo dal colore:
   un verde su un grigio e' una differenza che qualcuno non vede. */
.sel2-op.is-sel{color:var(--text);background:rgba(var(--green-rgb),.1);}
.sel2-op.is-sel::after{
  content:"";margin-left:auto;
  width:5px;height:9px;flex-shrink:0;
  border-right:2px solid var(--green);border-bottom:2px solid var(--green);
  transform:rotate(45deg) translate(-1px,-1px);
}

.sel2-velo{position:fixed;inset:0;z-index:110;background:rgba(0,0,0,.5);}

@media (max-width:900px){
  /* Foglio dal basso, a tutta larghezza, come il menu. Ancorato dal CSS e non
     dal JavaScript: con la barra del browser che si ritrae mentre si scorre,
     una posizione calcolata una volta finirebbe fuori posto. */
  .sel2-pan{
    left:0 !important;right:0;top:auto !important;bottom:0;
    width:auto !important;
    padding:8px 12px calc(14px + env(safe-area-inset-bottom,0px));
    border-radius:18px 18px 0 0;
    border-left:0;border-right:0;border-bottom:0;
    max-height:70vh;
  }
  /* Una presa in cima, come su ogni foglio che sale dal basso: dice che si
     tira giu' per chiuderlo, prima ancora di provarci. */
  .sel2-pan::before{
    content:"";display:block;
    width:34px;height:4px;margin:2px auto 8px;
    border-radius:2px;background:var(--pane-line, var(--border-2));
  }
  .sel2-tit{padding:2px 4px 8px;font-size:11px;}
  /* Bersagli da dito, come tutto il resto su telefono. */
  .sel2-op{min-height:48px;font-size:15px;padding:10px 12px;border-radius:10px;}
  /* 112 e non 126: nella testata del token il bottone sta su una riga insieme
     al prezzo e agli altri due comandi, e quattordici pixel erano la
     differenza fra stare su quella riga e mandarli a capo tutti. La voce piu'
     lunga ("Alert at 100%") ci sta comunque per intero — verificato, non
     stimato: se non ci stesse si vedrebbero i puntini, e i puntini in mezzo a
     una percentuale sono proprio il pezzo che conta. */
  .sel2-btn{min-width:112px;font-size:11.5px;padding:0 9px;}
}

/* ==========================================================================
   75. LA TESTATA DEL TOKEN SU TELEFONO
   --------------------------------------------------------------------------
   Su schermo largo e' una riga sola: logo, nome, prezzo, comandi. Su telefono
   diventava una pila di quattro fasce, ognuna larga quanto tutto il pannello e
   ognuna con dentro una cosa sola — misurata, 335 pixel di testata prima di
   arrivare a un numero. Non e' che stesse stretta: e' che ogni pezzo si
   prendeva una riga intera senza averne bisogno, e da fuori sembrava che i
   pezzi non avessero niente a che fare l'uno con l'altro.

   Tre cose, tutte con lo stesso movente — rimettere insieme quello che va
   letto insieme:

   1. IL LOGO E IL NOME sulla stessa riga. Il logo da solo su una riga e' un
      quadrato di settantadue pixel che non dice niente finche' non leggi la
      riga dopo. Accanto al nome e' quello che e' sempre stato: la faccia di
      quel token.
   2. IL PREZZO ERA ALLINEATO A DESTRA mentre tutto il resto stava a sinistra.
      Su schermo largo e' giusto (chiude la riga dall'altro capo); su telefono
      il blocco e' largo quanto il pannello, quindi il numero finiva da solo
      contro il bordo destro con mezzo pannello di vuoto davanti, e non
      sembrava piu' appartenere alla scheda. Va a sinistra come tutto il resto,
      e divide la riga con i comandi.
   3. I PUNTINI DI SEPARAZIONE non restano appesi. Nella riga sotto il nome
      "di chi e'", "che curva ha" e "l'explorer" sono separati da un punto
      medio; quando la riga va a capo — e va a capo appena il creatore ha una
      pastiglia di reputazione accanto all'indirizzo, cioe' quasi sempre — il
      punto restava l'ultima cosa della riga, a separare una cosa dal nulla.
      Su telefono spariscono e separa lo spazio: i tre gruppi sono gia' diversi
      a vedersi (un indirizzo sottolineato, una pastiglia colorata, un link),
      e uno spazio non puo' restare appeso.
   ========================================================================== */
@media (max-width:640px){
  #view-token .tk2-head,
  #view-stock .tk2-head{
    padding:16px;
    gap:13px 12px;
    align-items:flex-start;
  }
  /* Il logo si stringe: settantadue pixel erano la misura di quando stava su
     una riga sua. Accanto al nome ne bastano cinquantasei. */
  #view-token .tk2-img,
  #view-stock .tk2-img{
    order:1;
    width:56px;height:56px;border-radius:16px;font-size:21px;
    flex-shrink:0;
  }
  /* La base e' "tutta la riga meno il logo": basta a tenere il nome ACCANTO al
     logo (perche' non e' 100%, che lo mandava a capo da solo) e basta a
     riempire quella riga, cosi' prezzo e comandi sono costretti ad andare
     sotto. Con una base a zero ci stavano tutti e quattro su una riga sola e
     il nome si schiacciava a sessantadue pixel: peggio del difetto di
     partenza. */
  #view-token .tk2-id,
  #view-stock .tk2-id{
    order:2;
    flex:1 1 calc(100% - 68px);min-width:0;
  }
  #view-token .tk2-name,
  #view-stock .tk2-name{font-size:22px;}

  #view-token .tk2-meta,
  #view-stock .tk2-meta{
    margin-top:7px;
    flex-wrap:wrap;
    column-gap:11px;row-gap:5px;
  }
  #view-token .tk2-meta .tk2-dot,
  #view-stock .tk2-meta .tk2-dot{display:none;}

  /* Prezzo e comandi dividono la riga sotto. Se non ci stanno, i comandi
     vanno a capo per conto loro: meglio una riga in piu' che un prezzo
     schiacciato, perche' il prezzo e' il motivo per cui si apre la pagina. */
  #view-token .tk2-px,
  #view-stock .tk2-px{
    order:3;
    flex:0 1 auto;
    align-items:flex-start;
    text-align:left;
    gap:5px;
  }
  #view-token .tk2-px-v,
  #view-stock .tk2-px-v{font-size:25px;}
  /* I comandi partono da sinistra come tutto il resto. Spinti a destra da un
     margine automatico stavano sotto il prezzo ma dall'altro capo del
     pannello, e la testata si leggeva a zigzag: nome a sinistra, prezzo a
     sinistra, comandi a destra. Su una colonna di righe larghe uguale c'e' un
     solo bordo da cui partire. */
  #view-token .tk2-btns,
  #view-stock .tk2-btns{
    order:4;
    margin-left:0;margin-right:auto;
    flex-shrink:0;
  }
}

/* ==========================================================================
   76. LA SCHERMATA DI CREAZIONE E' CENTRATA
   --------------------------------------------------------------------------
   Questa corregge una conseguenza della sezione 29, dove ho dato a tutto il
   sito una cornice sola da 1360 perche' il bordo sinistro del contenuto non
   saltasse da una pagina all'altra. Per il modulo di creazione avevo tenuto le
   colonne alla loro misura (660 per il modulo, 390 per l'anteprima) e le avevo
   ancorate a sinistra, cosi' il titolo partiva dallo stesso punto di ogni
   altra pagina.

   Il conto pero' non torna: 660 piu' 28 di distacco piu' 390 fanno 1078, e la
   cornice ne dava 1360. Restavano DUECENTOTRENTA pixel di niente lungo tutto
   il bordo destro, e da fuori la pagina non sembra ancorata a sinistra: sembra
   storta.

   Le altre due strade le ho provate e scartate.
   - Mandare l'anteprima al bordo destro riempie la cornice ma sposta il vuoto
     in mezzo: duecentocinquantotto pixel fra il modulo e la sua anteprima, che
     e' proprio la coppia che va guardata insieme mentre si compila.
   - Far crescere il modulo fino a riempire porta i campi a ottocentonovanta
     pixel. Un campo di testo largo cosi' non e' piu' facile da compilare, e'
     solo piu' largo, e il riquadro dell'immagine di copertina resta della sua
     misura lasciando comunque un buco dentro la scheda.

   Quindi la cornice si stringe alla misura del contenuto e si centra. Il bordo
   sinistro qui non coincide piu' con quello delle altre pagine, ed e' un
   prezzo che questa pagina puo' pagare e le altre no: in una lista si passa da
   una schermata all'altra e il salto si nota, mentre qui si entra apposta per
   fare una cosa sola e ci si resta finche' non e' finita. Un modulo centrato
   e' anche il posto in cui uno se lo aspetta.
   ========================================================================== */
@media (min-width:1001px){
  /* 1130 = 660 + 28 + 390 di contenuto piu' i 26 per lato che .wrap ha su ogni
     pagina. Le colonne restano quelle: e' la cornice ad adattarsi a loro, non
     il contrario. (Misurato: con 1124 il modulo si fermava a 654, sei pixel
     sotto la sua misura, perche' avevo contato 20 di respiro invece di 26.) */
  #view-create .wrap,
  #view-create-stock .wrap{max-width:1130px;}
}

/* ==========================================================================
   77. "NON BASTANO I FONDI" DETTO IN MODO LEGGIBILE
   --------------------------------------------------------------------------
   Era un paragrafo rosso con dentro sei numeri da diciotto decimali, e
   siccome ogni tentativo ne accodava un altro, dopo due prove erano due muri
   identici uno sopra l'altro. Un errore ha un lavoro solo: dire cosa manca e
   quanto. Diciotto decimali non aiutano nessuno a capire se gli mancano due
   dollari o duecento.

   Un riquadro con le voci incolonnate, i numeri accorciati, il controvalore
   in dollari accanto e in fondo la riga che serve davvero: quanto aggiungere.
   Il rosso resta sul bordo e sul titolo, non su tutto il testo: un muro rosso
   si legge come "e' successo un disastro", mentre qui e' solo un conto che
   non torna.
   ========================================================================== */
.nofunds{
  margin-top:12px;padding:14px 16px;
  border:1px solid rgba(var(--sell-rgb,244,63,94),.34);
  border-radius:var(--v4-r-md,14px);
  background:rgba(var(--sell-rgb,244,63,94),.06);
  color:var(--text-dim);
  font-size:13px;line-height:1.5;
}
.nf-t{
  font-size:14px;font-weight:650;letter-spacing:-.01em;
  color:var(--sell,#f43f5e);
  margin-bottom:10px;
}
.nf-r{
  display:flex;align-items:baseline;justify-content:space-between;gap:14px;
  padding:3px 0;
}
.nf-k{color:var(--text-mute);flex:0 1 auto;}
/* I numeri incolonnati a destra e in monospaziato: e' l'unico modo in cui due
   importi uno sotto l'altro si confrontano a colpo d'occhio. */
.nf-v{
  font-family:var(--font-mono);color:var(--text);
  text-align:right;white-space:nowrap;flex:0 0 auto;
}
.nf-v i{font-style:normal;color:var(--text-mute);margin-left:8px;}
.nf-n{
  color:var(--text-mute);font-size:11.5px;line-height:1.45;
  padding:1px 0 4px;
}
.nf-sep{height:1px;background:var(--pane-inner,var(--border));margin:9px 0;}
.nf-do{color:var(--text);padding-top:2px;}
.nf-do b{font-family:var(--font-mono);font-weight:650;}
/* La spiegazione della differenza fra quello che devi AVERE e quello che
   SPENDI: e' la parte che toglie il sospetto di essere derubati, ma e' anche
   la piu' lunga, quindi sta sotto e pesa meno di tutto il resto. */
.nf-w{
  margin-top:9px;padding-top:9px;
  border-top:1px solid var(--pane-inner,var(--border));
  color:var(--text-mute);font-size:11.5px;line-height:1.5;
}
@media (max-width:560px){
  /* Su telefono chiave e valore non ci stanno affiancati senza che i numeri
     vadano a capo in mezzo. Uno sotto l'altro, il numero resta intero. */
  .nf-r{flex-direction:column;gap:1px;padding:5px 0;}
  .nf-v{text-align:left;}
}

/* ==========================================================================
   78. LA TESTATA DEL TOKEN SU TELEFONO, LEGGIBILE
   --------------------------------------------------------------------------
   Misurata sui dati veri di un token (nome lungo, simbolo, verificato,
   Auto-burn, la taglia della modalita', creatore con la sua reputazione): DIECI righe visive
   in 272 pixel, con le pastiglie sparse su cinque di quelle. Non e' che ci
   fossero troppe informazioni: erano nell'ordine sbagliato, ognuna su una riga
   sua, e nessuna raggruppata con quella che dice la stessa cosa.

   Ora sono due gruppi e una riga di note:
     COS'E'   il nome su una riga sua, e sotto tutti i distintivi insieme —
              simbolo, verificato, Auto-burn, taglia della modalita';
     QUANTO   il prezzo;
     DA DOVE  chi l'ha fatto, il suo curriculum, l'explorer: piccoli e spenti,
              perche' si leggono dopo aver deciso che il token interessa.

   Il badge della curva e' stato spostato nel markup, non con un ordine CSS:
   stava fra le note di provenienza e dice cos'e' il token, quindi va con gli
   altri distintivi anche su schermo largo.
   ========================================================================== */
@media (max-width:640px){
  /* IL NOME SU UNA RIGA SUA. Con i distintivi accanto, un nome un po' lungo
     li mandava a capo uno per volta: prima "Auto-burn" da solo, poi il
     verificato mezzo sfalsato. Occupando tutta la riga, il nome non spinge
     piu' niente e i distintivi restano insieme. */
  #view-token .tk2-name-row,
  #view-stock .tk2-name-row{gap:7px;row-gap:8px;}
  /* Il nome divide la riga con il simbolo, non se la prende tutta: sono
     l'identita' del token e si leggono insieme. Cede lui se serve spazio,
     perche' del nome bastano le prime lettere per riconoscerlo mentre un
     ticker tagliato non identifica piu' niente. */
  #view-token .tk2-name,
  #view-stock .tk2-name{
    flex:1 1 auto;min-width:0;
    /* Un nome molto lungo si accorcia invece di occupare tre righe: il
       simbolo qui sotto lo identifica comunque. */
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }

  /* IL SIMBOLO NON E' UN DISTINTIVO. Era una pastiglia verde piena grande
     quanto il nome, e in mezzo agli altri faceva tre pastiglie in fila che
     competevano fra loro. E' un identificatore: monospaziato, spento, senza
     riempimento, come un ticker. */
  #view-token .tk2-sym,
  #view-stock .tk2-sym{
    background:none;border:0;padding:0;
    color:var(--text-mute);
    font-size:12.5px;letter-spacing:.02em;
    max-width:52%;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }

  /* LE NOTE DI PROVENIENZA pesano meno di tutto il resto: si leggono dopo. */
  #view-token .tk2-meta,
  #view-stock .tk2-meta{font-size:11.5px;}
  /* Il curriculum del creatore era una pastiglia larga quanto tutta la riga,
     che mandava a capo l'explorer da solo. Senza riempimento sta accanto
     all'indirizzo, ed e' li' che va letto. */
  #view-token .tk2-devrep,
  #view-stock .tk2-devrep{
    background:none;border:0;padding:0 0 0 7px;
    color:var(--text-mute);
  }
}

/* I distintivi su una riga sola. Misurati: la riga e' larga 278 e loro
   chiedevano 280, due pixel, e la taglia andava a capo da sola, che e'
   proprio il difetto che questa sezione doveva togliere. Un filo piu' piccoli
   e ci stanno tutti, con margine anche per un simbolo lungo come quello che
   ha fatto saltare fuori il problema (dieci lettere invece delle tre o quattro
   di un ticker normale). */
@media (max-width:640px){
  #view-token .tk2-name-row .tok-tag,
  #view-token .tk2-name-row .tk2-curve-badge,
  #view-stock .tk2-name-row .tok-tag,
  #view-stock .tk2-name-row .tk2-curve-badge{
    font-size:10px;padding:3px 7px;letter-spacing:.04em;
  }
  #view-token .tk2-sym,
  #view-stock .tk2-sym{max-width:105px;}
}

/* Il ritorno a capo fra identita' e distintivi: esiste solo su telefono, e su
   schermo largo la riga resta una sola come e' sempre stata. */
.nr-acapo{display:none;}
@media (max-width:640px){
  .nr-acapo{display:block;flex:0 0 100%;height:0;margin:0;}
}

/* ==========================================================================
   79. LA STELLA DELLA WATCHLIST DICE DI ESSERE ACCESA
   --------------------------------------------------------------------------
   Il bottone metteva il token nella watchlist e non cambiava di una virgola:
   nessuna etichetta (il codice cercava uno <span> che nel markup non c'e') e
   nessuna regola per lo stato premuto. Funzionava e sembrava rotto, che dal
   punto di vista di chi lo preme e' la stessa cosa di non funzionare.
   Ora il carattere passa da vuota a piena — in app.js, perche' e' contenuto —
   e qui si accende il colore. Due segnali e non uno solo: una stella piena e
   una vuota si distinguono anche senza vedere il colore.
   ========================================================================== */
.tk2-ib[aria-pressed="true"]{
  color:var(--amber, var(--green));
  border-color:rgba(var(--amber-rgb, var(--green-rgb)),.4);
  background:rgba(var(--amber-rgb, var(--green-rgb)),.1);
}
.tk2-ib[aria-pressed="true"]:hover{
  border-color:rgba(var(--amber-rgb, var(--green-rgb)),.6);
}

/* L'indirizzo del contratto nella testata: un bottone che non sembra un
   bottone, perche' sta in una riga di note e non deve competere con niente.
   Si accende al passaggio, come gli altri collegamenti di quella riga. */
.tk2-ca{
  display:inline-flex;align-items:center;gap:5px;
  padding:0;border:0;background:none;
  font-family:var(--font-mono);font-size:inherit;
  color:var(--text-mute);cursor:pointer;
  border-bottom:1px dotted var(--border-2);
  transition:color var(--v4-t-fast,.12s) var(--v4-ease,ease);
}
.tk2-ca svg{width:12px;height:12px;flex-shrink:0;opacity:.75;}
/* "CA:" — due lettere che dicono di che indirizzo si tratta. Non in corsivo
   (il tag <i> serve solo a non aggiungere una classe in piu' al markup) e piu'
   smorto del valore, perche' e' l'etichetta e non il dato. */
.tk2-ca-k{font-style:normal;opacity:.7;letter-spacing:.04em;margin-right:1px;}

/* ============================================================================
   80. L'INDIRIZZO E L'EXPLORER, SOTTO LA RIGA DELLA MIGRAZIONE
   ============================================================================
   Le due cose che si cercano appena si apre un token che non si conosce.
   Una riga sola, a tutta larghezza: l'indirizzo INTERO da una parte — non
   accorciato, perche' qui c'e' posto e prima di incollare un contratto lo si
   guarda tutto — e il link all'explorer dall'altra.

   SENZA RIQUADRO. La prima versione aveva bordo, sfondo e imbottitura: il
   riquadro pesava piu' del contenuto e sembrava un bottone nero da premere,
   quando invece qui c'e' solo del testo da leggere e copiare. E NON VA A
   CAPO: andando a capo l'explorer finiva su una riga sua e il riquadro
   diventava un rettangolo alto e mezzo vuoto. L'indirizzo si accorcia con i
   puntini, che e' l'unica cosa che deve cedere.

   Il rientro orizzontale e' quello della barra di avanzamento qui sopra
   (.tk2-bond ha padding 14px 18px): senza, il contratto partiva diciotto
   pixel piu' a sinistra di tutto il resto e sembrava incollato al bordo. */
.tk2-quick{
  display:flex;align-items:center;gap:12px;flex-wrap:nowrap;
  margin:-6px 0 12px;padding:0 18px;
  font-family:var(--font-mono);font-size:12px;
}
.tk2-quick-ca{
  display:inline-flex;align-items:center;gap:6px;min-width:0;
  padding:0;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:inherit;color:var(--text-dim);
  transition:color var(--v4-t-fast,.12s) var(--v4-ease,ease);
}
.tk2-quick-ca:hover{color:var(--text);}
/* L'indirizzo cede spazio prima di tutto il resto: su schermo stretto si
   accorcia con i puntini invece di spingere fuori il link all'explorer. */
#tkQuickCaVal{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
.tk2-quick-ca svg{width:13px;height:13px;flex-shrink:0;opacity:.7;}
.tk2-quick-ex{
  display:inline-flex;align-items:center;gap:5px;margin-left:auto;flex-shrink:0;
  color:var(--text-mute);text-decoration:none;
  transition:color var(--v4-t-fast,.12s) var(--v4-ease,ease);
}
.tk2-quick-ex:hover{color:var(--text);}
.tk2-quick-ex svg{width:12px;height:12px;opacity:.8;}
@media (max-width:640px){
  /* Bersagli da dito, e l'indirizzo intero non ci sta: si accorcia da solo
     con i puntini, ma quello che si COPIA resta intero (sta in data-copy). */
  .tk2-quick{font-size:11.5px;gap:10px;}
  .tk2-quick-ca,.tk2-quick-ex{min-height:30px;}
}
.tk2-ca:hover{color:var(--text-dim);}
.tk2-ca:focus-visible{outline:2px solid rgba(var(--green-rgb),.5);outline-offset:2px;}
@media (max-width:640px){
  /* Da bersaglio per un dito, come tutto il resto su telefono: cresce l'area
     che accetta il tocco, non il testo. */
  .tk2-ca{min-height:34px;}
}

/* ============================================================================
   81. API E INDIRIZZI, DENTRO I DOCS
   ============================================================================
   Roba da leggere e da copiare, non da ammirare: monospazio, righe fitte, e
   una sola colonna che cede spazio quando lo schermo si stringe (la
   descrizione). Il metodo e il percorso non si accorciano mai, perche' sono
   le due cose che si copiano. */
.api-try{
  display:flex;align-items:center;gap:8px;
  margin-top:12px;padding:10px 12px;
  border:1px solid var(--border);border-radius:8px;
  background:var(--bg-1);
  font-family:var(--font-mono);font-size:12.5px;
  overflow-x:auto;
}
#apiTryUrl{white-space:nowrap;color:var(--text-dim);}
.api-copy{
  margin-left:auto;flex-shrink:0;display:inline-flex;align-items:center;
  padding:4px;border:0;background:none;cursor:pointer;color:var(--text-mute);
  transition:color var(--v4-t-fast,.12s) var(--v4-ease,ease);
}
.api-copy:hover{color:var(--text);}
.api-copy svg{width:14px;height:14px;}

.api-table{display:flex;flex-direction:column;margin-top:6px;}
.api-row{
  display:grid;grid-template-columns:auto minmax(0,1fr);
  gap:2px 10px;align-items:baseline;
  padding:10px 0;border-top:1px solid var(--hairline);
}
.api-row:first-child{border-top:0;}
/* Il metodo: una pastiglia stretta, verde per la lettura e ambra per i flussi,
   perche' un EventSource non si apre come una GET e la differenza va vista
   prima di leggere la riga. */
.api-m{
  grid-row:1;grid-column:1;align-self:center;
  min-width:36px;text-align:center;
  padding:2px 6px;border-radius:4px;
  background:rgba(var(--green-rgb),.12);color:var(--green);
  font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.06em;
}
.api-m.sse{background:rgba(255,176,32,.13);color:#ffb020;}
.api-p{
  grid-row:1;grid-column:2;
  font-family:var(--font-mono);font-size:12.5px;color:var(--text);
  word-break:break-all;
}
.api-d{grid-row:2;grid-column:2;font-size:12.5px;color:var(--text-mute);line-height:1.5;}

.api-chains{display:flex;flex-direction:column;gap:14px;margin-top:8px;}
.api-chain{
  padding:12px 14px;border:1px solid var(--border);border-radius:10px;
  background:var(--bg-1);
}
.api-ch{
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid var(--hairline);
}
.api-ch b{font-size:13.5px;}
.api-cm{font-family:var(--font-mono);font-size:11px;color:var(--text-mute);}
.api-a{
  display:grid;grid-template-columns:120px minmax(0,1fr);
  gap:4px 12px;align-items:baseline;padding:3px 0;
}
.api-ak{font-size:12px;color:var(--text-mute);}
.api-av{
  font-family:var(--font-mono);font-size:12px;color:var(--text-dim);
  word-break:break-all;cursor:pointer;
}
.api-av:hover{color:var(--text);}
.api-av a{color:inherit;text-decoration:none;}
.api-av a:hover{text-decoration:underline;}
.api-soon{font-size:12px;color:var(--text-mute);font-style:italic;}

@media (max-width:640px){
  /* L'etichetta sopra il valore: a 120px fissi su un telefono l'indirizzo
     restava in una colonna larga due caratteri. */
  .api-a{grid-template-columns:1fr;gap:1px;}
  .api-ak{font-size:11px;}
  .api-row{grid-template-columns:1fr;}
  .api-m{grid-row:1;grid-column:1;justify-self:start;margin-bottom:4px;}
  .api-p{grid-row:2;grid-column:1;}
  .api-d{grid-row:3;grid-column:1;}
}

/* ============ 82. I TOKEN ELENCATI, NON LANCIATI QUI ============
   Un token nato su un'altra piattaforma e soltanto mostrato da noi. Non ha
   percorso la nostra bonding curve, quindi la barra di avanzamento, la riga
   "migrated" e il banner del bond non sono numeri mancanti: sono numeri che
   per questo token non esistono. Lasciarli a zero direbbe una cosa falsa, e
   cioe' un token fermo allo 0% di una curva che non ha mai iniziato.
   Si nascondono da CSS e non da JS di proposito: gli elementi sono sparsi in
   quattro punti del markup, e spegnerli uno per uno in JavaScript vuol dire
   dimenticarne uno alla prossima modifica. */
body.token-elencato .tk2-bond,
body.token-elencato .progress-track,
body.token-elencato #bondedStatus,
body.token-elencato #bondedBanner,
body.token-elencato #kpiRaised,
body.token-elencato #tkByLine,
body.token-elencato #creatorCard{
  display:none !important;
}

/* Il distintivo che dice da dove viene. Neutro di proposito: non e' un
   premio ne' un avviso, e' una provenienza. */
.tk2-badge-est{
  display:inline-flex;align-items:center;gap:5px;
  padding:2px 8px;border-radius:999px;
  font-size:11.5px;font-weight:600;letter-spacing:.01em;
  color:var(--text-dim);
  background:var(--panel-2);
  border:1px solid var(--border-2);
  text-decoration:none;
}
a.tk2-badge-est:hover{color:var(--text);border-color:var(--border);}

/* Senza pool non c'e' niente contro cui scambiare: il pannello resta a
   schermo, cosi' si capisce che il posto per comprare c'e' ed e' solo in
   attesa, ma i comandi non si toccano. */
body.token-non-scambiabile .qa-btn[data-pct],
body.token-non-scambiabile #tradeAmount,
body.token-non-scambiabile .trade-tab-row{
  opacity:.45;pointer-events:none;
}
