/* CLOUDFORGE — Steampunk-fantasy airship empire. Mobile-first game UI.
   Not a webapp: an immersive dusk-sky HUD of brass, steam and floating iron.
   Palette: dusk sky, satin brass framing, amber-gold energy, rust alerts,
   oxidized-copper "patina" for tech, warm off-white ink. */
:root {
  /* legacy slate tokens (kept so existing inline styles never break) */
  --slate-0: #11161b; --slate-1: #19212a; --slate-2: #222d37; --slate-3: #2e3a45;

  /* sky / atmosphere — tono verde-ottone (ripristino pre-v373, richiesta utente) */
  --sky-0: #0a0f17; --sky-1: #101b28; --sky-2: #172a33; --horizon: #3a3322;

  /* panels (warm-cool forged metal) */
  --panel-0: #131a21; --panel-1: #1a242c; --panel-2: #243039;
  /* Fondo del bottone neutro. Sono i valori storici, spostati in due token perche' una palette
     possa riaccordarli: un esadecimale scritto dentro `.btn` non lo raggiunge nessuno. */
  --btn-1: #2c353d; --btn-0: #181f25;
  --edge-hi: rgba(255,228,176,.10); --edge-lo: rgba(0,0,0,.55);

  /* brass framing */
  --brass-d: #6a5126; --bronze-d: #7d6238; --bronze: #b08d57; --brass: #c39c5f; --brass-l: #eccd8e;

  /* energy / status */
  /* --rust-l sta a --rust come --amber-l sta a --amber: la versione leggibile in CORPO PICCOLO.
     --rust puro a 11px maiuscoletto su fondo scuro è quasi illeggibile — serve per bordi, barre e
     numeri, non per etichette. */
  --amber: #e9b54a; --amber-l: #ffd97a; --rust: #c34b30; --rust-l: #d98a68; --patina: #67b9a8;
  /* IL VIOLA DELLA GRANDE RICERCA. Nella tavolozza mancava un colore per l'ARCANO: ottone è
     l'impero, ruggine è il Mondo Rosso, patina è la tecnica. La Ricerca non è nessuna delle tre —
     è la cosa che apre un mondo — e finché portava l'ottone si leggeva come una consegna merci
     col titolo in maiuscoletto. Stessa coppia degli altri: --viola per bordi e campiture,
     --viola-l per il testo, perché il viola pieno a 10px su fondo scuro non si legge. */
  --viola: #8257b0; --viola-l: #c8a9e8;
  --ink: #ece6d8; --ink-dim: #97a1a9; --good: #79c08c;

  --radius: 13px;
  --tap: 44px;
  --nav-h: 58px;
  --safe-b: env(safe-area-inset-bottom, 0px);
  --font-display: "Cinzel", "Times New Roman", Georgia, serif;

  /* ═══ LA SCALA — vedi COSTITUZIONE.md ═══════════════════════════════════════════════
     Non è inventata: è MISURATA su questo foglio. Prima di scriverla il CSS conteneva 127
     valori px distinti, 184 padding diversi, 37 spaziature, 31 corpi di testo (mezzi pixel
     compresi: 12.5, 10.5, 11.5 — nessuno li aveva decisi, si erano sedimentati). I passi
     qui sotto sono quelli che l'app usa già di più, così convergere sposta ogni misura di
     UN pixel o due: invisibile a schermo, ma da 37 valori si scende a 10.
     REGOLA: nel CSS nuovo si usano SOLO questi. Un valore fuori scala lo blocca il test
     tests/test_design_system.py — che è il vero motivo per cui questa scala sopravvivrà. */

  /* Spazi (padding, margin, gap). Il nome dice i pixel: --sp-8 è 8px, e basta. */
  --sp-2: 2px; --sp-4: 4px; --sp-6: 6px; --sp-8: 8px; --sp-10: 10px;
  --sp-12: 12px; --sp-16: 16px; --sp-20: 20px; --sp-24: 24px; --sp-32: 32px;

  /* Raggi. Quattro, non diciotto. --radius resta l'alias storico della card. */
  --r-sm: 4px; --r-md: 8px; --r-lg: 12px; --r-pill: 999px;
  /* Il raggio della FAMIGLIA BOTTONI, e ha un token suo perche' e' una decisione, non un caso:
     a 12 su un bottone alto 32 l'angolo si mangia il 37% del fianco e la cosa si legge come una
     pillola. Un bottone qui e' una targa d'ottone avvitata alla plancia, e una targa ha lo
     spigolo smussato, non arrotondato. Vale per tutte e tre le taglie: il raggio non scala con
     l'altezza, se no i tasti piccoli sembrano di un altro insieme. */
  --r-btn: 6px;

  /* Corpi di testo. Niente mezzi pixel: non li distingue nessuno e moltiplicano i valori. */
  --fs-xs: 10px; --fs-sm: 11px; --fs-base: 12px; --fs-md: 13px; --fs-lg: 14px;
  --fs-xl: 16px; --fs-2xl: 18px; --fs-3xl: 22px; --fs-4xl: 28px;

  /* Altezze dei bottoni. Misurate anche queste: erano QUINDICI valori distinti (44, 40, 38, 36,
     34, 32, 31, 30, 28, 27, 26, 24, 22, 20, 17) su 35 regole diverse, e nessuno li aveva decisi
     — ogni schermata nuova ne inventava uno, e a volte l'altezza non era nemmeno dichiarata ma
     usciva dall'icona dentro al bottone, che ne spingeva la scatola oltre il minimo.
     Quattro passi bastano, e il nome dice a cosa serve, non quanti pixel è:
       --btn-h        azione normale: primaria, bronzo, secondaria a tutta riga
       --btn-h-sm     compatto: righe di tabella, testate di card, chat
       --btn-h-xs     pillola in riga, accanto a un contatore o dentro una card
       --btn-h-micro  tondo: il tasto (i), i +/− piccoli
     Restano fuori solo cio' che bottone non e' per davvero — le Ali della Guerra (pannelli
     verticali), la card dell'albero, i pallini d'allerta — e il tasto d'invio della chat, che
     prende l'altezza dal contenuto per stare in riga con l'input. */
  --btn-h: 32px; --btn-h-sm: 28px; --btn-h-xs: 24px; --btn-h-micro: 22px;

  /* Ombre. SOLO scure (regola di casa: mai glow). Tre profondità, non centoventi. */
  --sh-1: 0 1px 2px rgba(0,0,0,.35);
  --sh-2: 0 4px 12px rgba(0,0,0,.45);
  --sh-3: 0 12px 32px rgba(0,0,0,.55);

  /* ═══ GLI STRATI ═══════════════════════════════════════════════════════════════════
     Chi copre chi, dichiarato una volta. Prima erano 28 quote diverse da -2 a 9998,
     decise una alla volta: i toast stavano SOTTO la chat (avvisi invisibili), le tendine
     sotto i pannelli, e il carrello del Mercato sotto la barra di navigazione. */
  --z-hud: 20;        /* topbar e barre di stato agganciate all'header */
  --z-nav: 30;        /* dock di navigazione in basso */
  --z-drawer: 40;     /* strisce d'azione fisse in basso (carrello, checkout): SOPRA la nav */
  --z-inline-pop: 50; /* tendine e popover che vivono DENTRO la pagina */
  --z-panel: 80;      /* pannelli a schermo intero (chat, mappa, rapporti, gilda) */
  --z-dialog: 90;     /* conferme: devono coprire il pannello che le ha aperte */
  --z-pop: 95;        /* popover agganciati al body: sopra i pannelli, sotto gli avvisi */
  --z-toast: 100;     /* avvisi: sopra tutto ciò che è contenuto */
  --z-tutorial: 1200; /* spotlight: copre l'app perché è l'app che sta insegnando */
  --z-consent: 5000;  /* consenso cookie: prima di ogni altra cosa, per legge */
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
/* Touch-scrolled webapp: hide scrollbars everywhere (finger/wheel scroll still works).
   The visible bar just clutters the immersive HUD. */
* { scrollbar-width: none; -ms-overflow-style: none; }
*::-webkit-scrollbar { width: 0; height: 0; display: none; }
html, body { margin: 0; height: 100%; }
/* App-feel: la pagina è una "shell" fissa a tutto schermo — niente scroll di pagina,
   niente rimbalzo laterale, niente pinch/doppio-tap zoom. Lo scroll vive dentro
   .views e negli overlay. touch-action:manipulation toglie il doppio-tap-zoom;
   il pinch è bloccato via JS (iOS ignora user-scalable=no). */
html { position: fixed; inset: 0; overflow: hidden; overscroll-behavior: none;
  -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }   /* Android/iOS: niente auto-inflate dei font */
body {
  position: fixed; inset: 0; width: 100%; height: 100%; overflow: hidden;
  overscroll-behavior: none; touch-action: manipulation;
  background: var(--sky-0);
  color: var(--ink);
  font-family: "Segoe UI", system-ui, -apple-system, Roboto, "Helvetica Neue", Arial, sans-serif;
  font-size: 14px; line-height: 1.42;
  -webkit-font-smoothing: antialiased;
}
.hidden { display: none !important; }
b { font-weight: 700; }
small { font-size: 12px; }

/* ---- App-feel: spegni i comportamenti "browser" che rovinano l'esperienza webapp ----
   niente selezione/evidenziazione testo, niente menù long-press "Salva immagine"/"Copia",
   niente drag delle immagini. I CAMPI di testo restano selezionabili/editabili (eccezione). */
* {
  -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;
  -webkit-touch-callout: none;   /* iOS: niente popup salva-immagine / copia al long-press */
}
input, textarea, [contenteditable="true"], select {
  -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; user-select: text;
  -webkit-touch-callout: default;
}
img, svg, a, .acc-head, button { -webkit-user-drag: none; user-drag: none; }
/* ECCEZIONE PER-CAPITANO (19/08/2026): ai tag in `admin.text_select_tags` il client rimette la
   classe `copiabile` sul <html> (vedi applyState) e la selezione/copia torna quella del browser.
   Solo il testo: il drag delle immagini e il pointer-events di <img> restano spenti. */
html.copiabile, html.copiabile * {
  -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; user-select: text;
  -webkit-touch-callout: default;
}
img { pointer-events: none; }   /* niente drag/menù "salva immagine"; il tap arriva al contenitore.
   NB: solo <img> (arte/tile decorativi). Gli SVG restano cliccabili: worldmap, motore guerra, stemmi. */

/* ---- Atmosphere: fixed dusk sky + drifting cloud banks behind everything ---- */
.sky {
  position: fixed; inset: 0; z-index: -2; overflow: hidden; pointer-events: none;
  /* Fascia d'orizzonte + bagliore parametrizzati: le palette per-isola li INTONANO alla
     loro tinta (i default bruno-dorati stanno bene solo su blu/ruggine — su verde/viola/
     cremisi sporcavano il colore: era il "qualcosa che non torna"). */
  background:
    radial-gradient(120% 75% at 50% 6%, var(--sky-glow, #1a2c3a) 0%, var(--sky-1) 38%, var(--sky-0) 78%),
    linear-gradient(180deg, transparent 55%, var(--horiz-a, rgba(74,58,30,.45)) 86%, var(--horiz-b, rgba(120,82,34,.30)) 100%);
}
.sky::after {  /* warm horizon glow + top vignette */
  content: ""; position: absolute; inset: 0;
  background:
    radial-gradient(80% 40% at 50% 104%, var(--horiz-glow, rgba(233,181,74,.18)), transparent 70%),
    radial-gradient(140% 90% at 50% -20%, transparent 60%, rgba(0,0,0,.55));
}
.cloud {
  position: absolute; border-radius: 50%; filter: blur(26px); opacity: .5;
  background: radial-gradient(closest-side, var(--cloud-c, rgba(120,150,170,.55)), transparent 70%);
  animation: drift linear infinite;
}
.cloud-a { width: 70vw; height: 30vw; top: 12%;  left: -30%; animation-duration: 70s; }
.cloud-b { width: 55vw; height: 24vw; top: 40%;  left: -40%; opacity: .35; animation-duration: 95s; animation-delay: -30s; }
.cloud-c { width: 80vw; height: 34vw; top: 66%;  left: -35%; opacity: .3;  background: radial-gradient(closest-side, rgba(180,140,90,.5), transparent 70%); animation-duration: 120s; animation-delay: -60s; }
@keyframes drift { to { transform: translateX(165vw); } }
@media (prefers-reduced-motion: reduce) { .cloud { animation: none; } }
/* overlay full-screen aperto (mappa/albero → body.wm-lock): le nuvole sono coperte e
   comporle a 60fps sotto un velo opaco è lavoro sprecato — in pausa finché non riemergono */
body.wm-lock .cloud { animation-play-state: paused; }
/* DENTRO il gioco (post-login) le nuvole sono FERME: restano come sfondo statico, il drift
   vive solo sulla schermata di login — zero compositing perpetuo durante la partita */
body.in-game .cloud { animation-play-state: paused; }

/* Gilda tab: the page atmosphere warms to a rust/ember dusk (navy→red-orange), so the
   guild section feels distinct. Only the fixed .sky backdrop shifts — topbar & bottomnav
   are opaque and untouched. The .5s fade makes the swap read as an animated transition. */
.sky, .sky::after, .cloud { transition: background 0.55s ease; }
/* (.empire-sky = Panoramica in scope Impero: stessa atmosfera rossa — vista collettiva)
   (.varco-sky  = l'Avamposto — vedi in fondo al blocco: deve stare DOPO `body.tab-azioni`) */
body.tab-gilda .sky, body.empire-sky .sky {
  background:
    radial-gradient(120% 75% at 50% 6%, #4a1e18 0%, #331512 40%, #1e0d0b 80%),
    linear-gradient(180deg, transparent 52%, rgba(150,52,26,.42) 84%, rgba(196,86,34,.34) 100%);
}
body.tab-gilda .sky::after, body.empire-sky .sky::after {
  background:
    radial-gradient(80% 42% at 50% 104%, rgba(233,120,52,.24), transparent 70%),
    radial-gradient(140% 90% at 50% -20%, transparent 58%, rgba(0,0,0,.55));
}
body.tab-gilda .cloud, body.empire-sky .cloud     { background: radial-gradient(closest-side, rgba(200,96,54,.5), transparent 70%); }
body.tab-gilda .cloud-c, body.empire-sky .cloud-c { background: radial-gradient(closest-side, rgba(214,128,60,.5), transparent 70%); }

/* Mercato tab: atmosfera PULITA e fredda — uno showroom notturno azzurro-acciaio, più arioso del
   navy di default e distinto dal rosso della gilda. Niente più marrone/fango. */
body.tab-mercato .sky {
  background:
    radial-gradient(120% 84% at 50% -6%, #35485c 0%, #223140 44%, #10171f 82%),
    linear-gradient(180deg, transparent 52%, rgba(120,160,190,.14) 100%);
}
body.tab-mercato .sky::after {
  background:
    radial-gradient(80% 44% at 50% 104%, rgba(120,170,200,.16), transparent 70%),
    radial-gradient(140% 90% at 50% -20%, transparent 60%, rgba(0,0,0,.42));
}
body.tab-mercato .cloud   { background: radial-gradient(closest-side, rgba(150,185,215,.42), transparent 70%); }
body.tab-mercato .cloud-c { background: radial-gradient(closest-side, rgba(170,200,225,.42), transparent 70%); }
/* Azioni (esclusa la sottopagina Mercato, che ha già il suo cielo chiaro): qui le card-content
   sono piccole e lo sfondo predomina → il fondo troppo nero pesava. Alziamo il "pavimento" del
   gradiente da --sky-0 (il più scuro) a --sky-1 e ammorbidiamo la vignette. USA LE VAR DI PALETTE
   (--sky-glow/--sky-1/--horiz-*): così vale per TUTTE e 5 le palette isola + il default madre,
   ognuna resta della sua tinta, solo meno cupa (niente colori hardcoded che le cancellerebbero). */
body.tab-azioni .sky {
  background:
    radial-gradient(120% 82% at 50% 8%, var(--sky-glow, #1a2c3a) 0%, var(--sky-1) 40%, color-mix(in srgb, var(--sky-1) 42%, var(--sky-0)) 92%),
    linear-gradient(180deg, transparent 55%, var(--horiz-a, rgba(74,58,30,.42)) 88%, var(--horiz-b, rgba(120,82,34,.28)) 100%);
}
body.tab-azioni .sky::after {
  background:
    radial-gradient(80% 40% at 50% 104%, var(--horiz-glow, rgba(233,181,74,.18)), transparent 70%),
    radial-gradient(140% 90% at 50% -20%, transparent 62%, rgba(0,0,0,.42));
}

/* L'AVAMPOSTO — oltre il Varco il cielo di casa non c'entra. Stessa atmosfera di ruggine della
   tab Gilda, e nessun colore nuovo: sono gli stessi tre gradienti.
   QUESTA REGOLA DEVE STARE QUI, DOPO `body.tab-azioni`, e non lassu' con le sue gemelle.
   L'Avamposto E' una sottopagina di Azioni, quindi le due classi convivono sul body; hanno la
   stessa specificita' (0,2,1) e a parita' vince l'ultima scritta. Messa in alto perdeva sempre —
   la classe c'era, il cielo restava azzurro, e non c'era niente di rotto da cercare. */
body.varco-sky .sky {
  background:
    radial-gradient(120% 75% at 50% 6%, #4a1e18 0%, #331512 40%, #1e0d0b 80%),
    linear-gradient(180deg, transparent 52%, rgba(150,52,26,.42) 84%, rgba(196,86,34,.34) 100%);
}
body.varco-sky .sky::after {
  background:
    radial-gradient(80% 42% at 50% 104%, rgba(233,120,52,.24), transparent 70%),
    radial-gradient(140% 90% at 50% -20%, transparent 58%, rgba(0,0,0,.55));
}
body.varco-sky .cloud   { background: radial-gradient(closest-side, rgba(200,96,54,.5), transparent 70%); }
body.varco-sky .cloud-c { background: radial-gradient(closest-side, rgba(214,128,60,.5), transparent 70%); }

/* ---- Gear / loader ---- */
.gear {
  width: 26px; height: 26px; display: inline-block; border-radius: 50%;
  border: 5px solid var(--brass); border-top-color: transparent;
  animation: spin 1.1s linear infinite;
  /* glow rimosso */
}
.gear-big { width: 58px; height: 58px; border-width: 8px; }
@keyframes spin { to { transform: rotate(360deg); } }
.loader { position: fixed; inset: 0; display: grid; place-items: center; background: rgba(8,10,14,.6); z-index: 60; backdrop-filter: blur(2px); }

/* ---- Buttons (forged metal plates) ---- */
.btn {
  min-height: var(--btn-h); padding: 0 16px; border: 1px solid #0b0f13;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;   /* icona+label sempre centrati */
  /* Un bottone NON si stira all'altezza della riga che lo contiene. Senza questa riga il token
     e' una bugia: dentro un flex o una grid con `align-items: stretch` (che e' il default) il
     bottone prende l'altezza del vicino piu' alto, e ne bastava uno per far sballare la riga.
     E' cosi' che «Invita» risultava 38 con min-height 32, e «Vai a caccia» 44 con min-height 38. */
  align-self: center;
  /* Il fondo passa da due TOKEN invece che da due esadecimali scritti qui. I valori di default
     sono gli stessi di prima al byte, quindi fuori dal Mondo Rosso non cambia un pixel: serve
     perche' un fondo scritto a mano non lo raggiunge nessuna riaccordatura di palette, e su una
     pagina di ruggine ogni bottone neutro restava azzurro-ardesia. */
  background: linear-gradient(180deg, var(--btn-1), var(--btn-0));
  color: var(--ink); border-radius: var(--r-btn); font-size: 14px; font-weight: 600; cursor: pointer;
  letter-spacing: .2px; text-shadow: 0 1px 1px rgba(0,0,0,.55);
  box-shadow: inset 0 1px 0 var(--edge-hi), inset 0 -2px 5px rgba(0,0,0,.45), 0 2px 5px rgba(0,0,0,.4);
  transition: filter .12s, transform .04s, box-shadow .08s;
}
.btn:hover { filter: brightness(1.08); }
.btn:active { transform: translateY(1px); box-shadow: inset 0 2px 7px rgba(0,0,0,.6); }
/* IL FOCUS — col dito e col mouse NON si vede, con la tastiera si'.
   Non c'era nessuna regola, quindi usciva l'anello AZZURRO di sistema: al primo tocco su un
   tasto compariva un rettangolo blu che non c'entra niente con l'ottone di questo gioco, e ci
   restava finche' non toccavi altrove.
   `:focus-visible` e' il selettore che distingue i due casi — i browser lo accendono solo
   quando la messa a fuoco arriva da tastiera. Quindi l'anello resta, ed e' giusto che resti
   (senza, chi naviga col Tab non sa piu' dov'e'), ma in ottone e solo per chi ne ha bisogno. */
.btn:focus, .round-x:focus, .chat-x:focus, .mkc-x:focus, .mkt-cart-x:focus,
.sub-info:focus, .gr-info-btn:focus, .bnt-i:focus, .cf-info-btn:focus,
.navbtn:focus, .btn-ic:focus { outline: none; }
.btn:focus-visible, .round-x:focus-visible, .chat-x:focus-visible, .mkc-x:focus-visible,
.mkt-cart-x:focus-visible, .sub-info:focus-visible, .gr-info-btn:focus-visible,
.bnt-i:focus-visible, .cf-info-btn:focus-visible, .navbtn:focus-visible,
.btn-ic:focus-visible { outline: 2px solid var(--brass-l); outline-offset: 2px; }
.btn:disabled { opacity: .4; cursor: not-allowed; filter: grayscale(.4); }
/* LA LIVREA DI CHI AGISCE — stessa ricetta di chi annulla, in ottone invece che in ruggine:
   targa brunita, contorno e scritta del colore del metallo. Prima erano pieni di giallo con la
   scritta nera, e in una schermata che di tasti ne ha otto gridavano tutti insieme: quello che
   contava non si distingueva dagli altri, e l'occhio non sapeva dove posarsi.
   Ora la gerarchia la fa il CONTORNO, non l'urlo: ottone = fai questo, ruggine = disfa questo,
   niente bordo = secondario. Tre livree, una grammatica sola. */
/* Il giallo torna PIENO e la scritta torna NERA — come nella livrea storica — ma sopra la
   targa, non al posto suo: resta il contorno d'ottone e resta il rilievo. E' la terza taratura,
   e le prime due sbagliavano in versi opposti: il pieno originale gridava, la targa velata non
   parlava piu'. Qui il tasto si vede da lontano e continua a stare dentro una grammatica —
   ottone = fai questo, ruggine = disfa, niente bordo = secondario. */
/* TUTTI E TRE I GIALLI SULLA STESSA SCOCCA (04/08/2026, ordine del committente: «i tasti gialli
   vecchi falli cosi'», indicando «Vai a caccia»).
   `.btn-brass` era gia' arrivato dove serviva: cambia SOLO i due colori del fondo, e forma,
   raggio, contorno, rilievo, peso e spaziatura arrivano da `.btn` — cioe' sono identici al
   tasto neutro che gli sta di fianco. Questi due invece si ridichiaravano addosso tutto:
   sfumatura a TRE fermate, contorno d'ottone chiaro, ombra portata all'ESTERNO invece che
   incisa dentro, peso 700, spaziatura .3. Il risultato e' che in una riga con due bottoni non
   sembravano due tasti della stessa schermata: sembravano un tasto e un'insegna.
   La TINTA non cambia — amber per il primario, brass per il bronzo, gli stessi due estremi di
   prima. Cambia la scocca sotto. */
.btn-primary { --btn-1: #ffd97a; --btn-0: #b8842c;
  --bevel-lo: rgba(0,0,0,.32); --bevel-hi: rgba(255,250,235,.5);
  color: #241a0b; text-shadow: none; }
.btn-primary .gi, .btn-primary .ricon { filter: brightness(0); }
.btn-bronze { --btn-1: #eccd8e; --btn-0: #a8813f;
  --bevel-lo: rgba(0,0,0,.32); --bevel-hi: rgba(255,250,235,.5);
  color: #241a0b; text-shadow: none; }
.btn-bronze .gi, .btn-bronze .ricon { filter: brightness(0); }
/* L'OTTONE SUL TELAIO NEUTRO — stesso giallo di `.btn-bronze`, stessa scocca del bottone base.
   Serve dove un tasto in ottone sta ACCANTO a un tasto neutro e i due si leggono come una
   coppia: all'Avamposto «Vai a caccia» e «Manda navi» stanno affiancati, e con due scocche
   diverse non sembravano due bottoni della stessa schermata — sembravano un bottone e un titolo.

   COSA CAMBIA RISPETTO A `.btn-bronze`, che resta la livrea giusta per una chiamata all'azione
   isolata: la scocca. Il bronzo si ridichiara addosso tutto — sfumatura a TRE fermate, contorno
   d'ottone chiaro, ombra portata all'esterno, peso 700, spaziatura .3 — e cosi' facendo esce
   dalla grammatica del bottone base. Qui invece si cambiano solo i due colori del fondo: forma,
   dimensioni, raggio, contorno e il suo colore, rilievo interno, peso e spaziatura arrivano tutti
   da `.btn`, cioe' sono gli stessi identici del tasto neutro che gli sta di fianco. Il giallo e'
   quello di prima al byte: le due fermate sono gli estremi della sfumatura del bronzo, e il punto
   di mezzo cade su `--brass` come prima.

   Le uniche due righe che NON si allineano al vicino sono l'ombra del testo e il filtro
   dell'icona, e non e' incoerenza: il tasto neutro ha la scritta chiara su fondo scuro, questo ce
   l'ha nera su ottone. Un'ombra scura sotto una scritta nera la impasta e basta, e un'icona
   cromata su fondo chiaro sparisce. */
.btn-brass {
  /* Sfumatura e velatura RITARATE, non ridisegnate: la tinta media resta quella di prima
     (cade su `--brass`, come la fermata centrale del bronzo), cambia solo QUANTO viaggia.
     Il motivo e' che il rilievo si misura in chiarezza percepita, non in alfa: gli stessi
     valori del tasto neutro, su un fondo tre volte piu' chiaro, disegnavano una cupola dove
     sulla ruggine si vedeva appena una piega. Numeri (in L*, la scala in cui l'occhio misura):
     la sfumatura viaggiava 14,8 contro 12,1 e la velatura in basso 14,6 contro 8,8 — sommate,
     il giallo era il 44% piu' bombato del suo vicino. Qui viaggiano 12,1 e 8,8, cioe' gli
     stessi due numeri della ruggine. */
  --btn-1: #e3c589; --btn-0: #b08742;
  /* .26 pareggiava la ruggine al centesimo (8,8 di chiarezza persa in basso, come lei). Portata
     a .32 su richiesta: sono 11 invece di 8,8 — mezza tacca sopra il vicino, non il 14,6 di
     partenza. Il tasto riprende un filo di peso senza tornare a fare la cupola. */
  --bevel-lo: rgba(0,0,0,.32);
  /* Il filo di luce in alto e' l'unica cosa che NON si puo' pareggiare: su un fondo chiaro non
     c'e' abbastanza spazio verso il bianco (servirebbe un L* oltre 100). Portato al massimo
     credibile — oltre, diventa un riflesso cromato che nel resto del gioco non esiste. */
  --bevel-hi: rgba(255,250,235,.5);
  color: #241a0b; text-shadow: none;
}
.btn-brass .gi, .btn-brass .ricon { filter: brightness(0); }
.btn-ghost { background: rgba(255,255,255,.04); box-shadow: inset 0 1px 0 rgba(255,255,255,.05); border-color: var(--brass-d); }
/* Variante ghost per lasciare/sciogliere/revocare. Il commento diceva che il `.btn-danger` PIENO
   restava per i popup di conferma, «dove distruggere E' l'azione primaria»: non e' piu' vero, e
   la ragione sta scritta sul `.btn-danger` qui sotto. Primaria non vuol dire invitante. */
.btn-ghost.danger { color: #e08a72; border-color: #7a2415; }
.btn-ghost.danger:hover { background: rgba(195,75,48,.12); }
/* Etichetta centrata nel bottone anche con icona iniziale: l'icona va nella fascia di padding
   sinistra (fuori dal flusso), così la scritta resta centrata invece di "tendere a destra". */
.btn.btn-ctr { position: relative; padding-left: 34px; padding-right: 34px; }
.btn.btn-ctr .gi { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); margin: 0; }
/* LA LIVREA DI CHI ANNULLA — targa brunita col contorno ruggine, non un mattone rosso pieno.
   Era il contrario: pieno dappertutto, e spento solo sul tasto Richiama. Il pieno gridava piu'
   dell'ottone, che nel gioco e' il colore del «fai questo»: nel popup di conferma il tasto piu'
   acceso della schermata era quello che DISTRUGGE, e l'occhio ci cadeva sopra per primo.
   Distruggere resta possibile e resta leggibile — il rosso c'e', nel bordo e nel testo — ma
   smette di essere invitante. Chi vuole annullare lo trova; chi non voleva, non ci inciampa. */
.btn-danger {
  background: linear-gradient(180deg, rgba(216,105,78,.16), rgba(141,46,28,.20));
  color: #eca48f; border-color: #8a2e1c; font-weight: 600; letter-spacing: .3px;
  text-shadow: 0 1px 1px rgba(0,0,0,.5);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 1px 4px rgba(0,0,0,.32);
}
.btn-danger:hover { filter: none;
  background: linear-gradient(180deg, rgba(224,120,92,.26), rgba(160,52,32,.30)); }
.btn-danger .gi { filter: none; opacity: .92; }
.btn-sm { min-height: var(--btn-h-sm); padding: 0 12px; font-size: 13px; border-radius: var(--r-btn); }
/* Full gold/amber buttons were tall & heavy — slim them down (the small ones keep .btn-sm's 36). */
.btn-primary, .btn-bronze { min-height: var(--btn-h); }
/* ...ma la TAGLIA batte la livrea, e queste due righe stanno DOPO apposta. `.btn-sm` e `.btn-xs`
   sono dichiarate piu' su nel foglio, quindi la riga qui sopra le sovrascriveva: un
   `btn-sm btn-bronze` usciva alto 32 e il `btn-sm btn-ghost` accanto a lui 28, e i due si
   leggevano come due componenti diversi. Il colore dice COSA FA il tasto, la taglia dice QUANTO
   SPAZIO occupa: due assi indipendenti, e la taglia non la decide il colore.
   Senza nominare le livree: la prima stesura elencava `.btn-sm.btn-primary, .btn-sm.btn-bronze`
   e cosi' rimetteva in piedi lo stesso difetto dall'altra parte — nella lista delle gilde lo
   STESSO posto e' `btn-xs btn-bronze` (Unisciti) o `btn-xs btn-ghost` (Annulla la richiesta) a
   seconda dello stato, e la riga saltava di otto pixel al cambio di stato. */
.btn-sm { min-height: var(--btn-h-sm); }
.btn-xs { min-height: var(--btn-h-xs); }
/* Il fondo e' di nuovo giallo pieno, quindi le icone tornano NERE come la scritta: su un fondo
   chiaro un glifo d'ottone non si legge. `brightness(0)` le appiattisce a silhouette scura. */
.btn-primary .gi, .btn-bronze .gi, .btn-primary .ricon, .btn-bronze .ricon { filter: brightness(0); }
/* Contrasto GARANTITO: su qualsiasi bottone dorato/ambra la scritta resta SCURA, mai chiara su
   giallo. Resta !important perche' batta ogni override di contesto — e' la regola che impedisce
   a una schermata di rendersi illeggibile per una svista locale. */
.btn-primary, .btn-bronze, .btn-primary.btn-build, .btn-bronze.btn-build { color: #241a0b !important; }
/* Unified primary-action pill: compact, uppercase, rounded — one language for every
   "commit" CTA (Costruisci, Invia spedizione, Attacca, Potenzia, Incastona, Riscuoti…)
   so Isola / Azioni / Gilda / Profilo read consistently. */
.btn-build { min-height: var(--btn-h-xs); height: var(--btn-h-xs); padding: 0 16px; width: auto;
  display: inline-flex; align-items: center; justify-content: center; gap: 4px;
  font-size: 11px; text-transform: uppercase; letter-spacing: .7px; border-radius: 999px; }
.btn-build .gi, .btn-build .ricon { width: 15px; height: 15px; flex: none; }
/* In an action row (next to a stepper / secondary buttons) it hugs content, sits at the right.
   Extra .btn specificity so it beats the later `.card-actions .btn { flex: 1 }` full-width rule. */
.card-actions .btn.btn-build, .gm-actions .btn.btn-build { flex: 0 0 auto; margin-left: auto; }

/* ---- Auth ---- */
.auth { position: absolute; inset: 0; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch; min-height: 100%; display: grid; place-items: center; padding: 24px 16px; }

/* Nota sotto un campo del form (es. spiegazione del codice amico). */
.field-hint { display: block; margin-top: 4px; font-size: 11px; line-height: 1.4; color: var(--ink-dim); font-weight: 400; }
.field-hint b { color: var(--ink); }
.tag-hash { color: var(--ink-dim); font-weight: 700; }

/* Nuvoletta "Installa come app": spinge l'installazione PWA, esce a ogni login,
   chiudibile. Nascosta se il gioco gira già installato (standalone). */
.install-hint {
  position: fixed; left: 50%; transform: translateX(-50%);
  top: calc(env(safe-area-inset-top, 0px) + 12px);
  z-index: 55; width: min(92vw, 430px);
  display: flex; gap: 12px; align-items: flex-start;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--brass); border-radius: 15px; padding: 12px 34px 12px 12px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 12px 34px rgba(0,0,0,.6);
  animation: ih-pop .32s cubic-bezier(.2,.8,.3,1); cursor: pointer;
}
.install-hint::after {  /* codina della nuvoletta, punta in alto */
  content: ""; position: absolute; left: 50%; top: -8px; transform: translateX(-50%) rotate(45deg);
  width: 15px; height: 15px; background: var(--panel-2);
  border-left: 1px solid var(--brass); border-top: 1px solid var(--brass);
}
@keyframes ih-pop { from { opacity: 0; transform: translateX(-50%) translateY(-12px); } }
.ih-icon {
  flex: 0 0 auto; width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center;
  background: linear-gradient(180deg, var(--amber-l), var(--amber) 55%, #a8762a);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.55);
}
.ih-icon svg { width: 23px; height: 23px; display: block; }   /* icona Condividi (box + freccia su) */
.ih-body { flex: 1; min-width: 0; }
.ih-body b { font-family: var(--font-display); color: var(--brass-l); letter-spacing: .5px; font-size: 14px; }
.ih-body p { margin: 2px 0 8px; font-size: 12px; line-height: 1.4; color: var(--ink); }
.ih-x { position: absolute; top: 5px; right: 7px; background: none; border: 0; color: var(--ink-dim); font-size: 16px; cursor: pointer; padding: 4px; line-height: 1; }
.ih-x:hover { color: var(--brass-l); }
/* Login backdrop: photo fills vertically, the horizontal excess pans very slowly (~45s,
   cinematic) and a soft fade hides the loop reset so it's barely noticeable. */
.auth-bg {
  position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: url("/assets/images/login_bg.webp") no-repeat;
  background-size: cover; background-position: 100% center;
  animation: authPan 78s ease-in-out infinite;   /* ~13% faster pan (login slider) */
}
.auth-bg::after {  /* readability scrim over the artwork */
  content: ""; position: absolute; inset: 0;
  background: radial-gradient(120% 90% at 50% 28%, rgba(8,12,18,.32), rgba(8,12,18,.74) 82%);
}
@keyframes authPan {
  0%   { background-position: 100% center; opacity: 0; }
  10%  { opacity: 1; }
  82%  { background-position: 0% center;   opacity: 1; }
  100% { background-position: 0% center;   opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .auth-bg { animation: none; background-position: center; opacity: 1; }
}
.auth-card {
  position: relative; z-index: 1; width: 100%; max-width: 420px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid #0c1116; border-radius: 18px; padding: 32px 20px 20px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 24px 60px rgba(0,0,0,.55), 0 0 0 1px rgba(195,156,95,.12);
}
.auth-card::before, .auth-card::after {
  content: ""; position: absolute; width: 18px; height: 18px; border: 2px solid var(--brass); opacity: .55;
}
.auth-card::before { top: 9px; left: 9px; border-right: 0; border-bottom: 0; border-top-left-radius: 6px; }
.auth-card::after { bottom: 9px; right: 9px; border-left: 0; border-top: 0; border-bottom-right-radius: 6px; }
/* Selettore lingua nella pagina di login (in alto a destra della card) */
.auth-lang { position: absolute; top: 12px; right: 14px; display: flex; gap: 4px; z-index: 2; }
.auth-lang-btn { background: none; border: 1px solid transparent; border-radius: 8px; padding: 2px 4px;
  font-size: 18px; line-height: 1; cursor: pointer; transition: opacity .15s, color .15s;
  /* Su Windows le emoji-bandiera diventano lettere monocrome (IT/GB): senza un colore chiaro
     restano nere e illeggibili sul pannello scuro. Il color è ignorato dove le bandiere sono a colori. */
  color: var(--ink-dim); opacity: .75; }
.auth-lang-btn:hover { opacity: 1; color: var(--ink); }
.auth-lang-btn.on { opacity: 1; color: var(--ink); border-color: var(--brass); background: rgba(195,156,95,.12); }
/* Nazionalità obbligatoria in registrazione */
.auth-nat { margin: 2px 0 4px; }
.auth-nat-lbl { display: block; font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.brand { text-align: center; margin-bottom: 20px; }
.brand-logo {
  display: block; width: min(280px, 82%); height: auto; margin: 4px auto 2px;
  /* filter glow rimosso */
  animation: logo-float 5.5s ease-in-out infinite;
}
@keyframes logo-float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
@media (prefers-reduced-motion: reduce) { .brand-logo { animation: none; } }
/* Settings logo pinned to the very top of the screen, OUTSIDE the sheet. The sheet
   grows upward with its content until it reaches just below the logo, then scrolls. */
.settings-logo-top {
  position: absolute; top: calc(env(safe-area-inset-top, 0px) + 8px); left: 0; right: 0;
  z-index: 2; text-align: center; pointer-events: none;
}
.settings-logo-top img { width: min(190px, 52%); height: auto; filter: drop-shadow(0 4px 16px rgba(0,0,0,.55)); }
#settings-overlay .chat-sheet { max-height: calc(100% - env(safe-area-inset-top, 0px) - 128px); }
#settings-overlay .settings-body { overflow-y: auto; -webkit-overflow-scrolling: touch; }
.brand h1 {
  font-family: var(--font-display); letter-spacing: 7px; margin: 12px 0 6px; font-size: 30px; font-weight: 700;
  color: transparent; background: linear-gradient(180deg, var(--brass-l), var(--bronze)); -webkit-background-clip: text; background-clip: text;
  /* glow rimosso */
}
.tagline { color: var(--ink-dim); margin: 0; font-size: 13px; font-style: italic; }
.tabs { display: flex; gap: 8px; margin-bottom: 16px; }
.tab {
  flex: 1; min-height: var(--tap); background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); color: var(--ink-dim);
  border: 1px solid #0c1116; border-radius: 8px; font-weight: 600; cursor: pointer; letter-spacing: .3px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04);
}
.tab.on { background: linear-gradient(180deg, var(--panel-2), var(--panel-1)); color: var(--brass-l); border-color: var(--bronze-d); box-shadow: inset 0 1px 0 var(--edge-hi); }
form label { display: block; font-size: 12px; color: var(--ink-dim); margin-bottom: 12px; letter-spacing: .3px; text-transform: uppercase; }
form input {
  width: 100%; min-height: var(--tap); margin-top: 6px; padding: 0 12px; text-transform: none;
  background: var(--sky-0); color: var(--ink); border: 1px solid #0b0f13; border-radius: 8px; font-size: 16px;
  box-shadow: inset 0 2px 5px rgba(0,0,0,.45);
}
form input:focus { outline: none; border-color: var(--brass); box-shadow: inset 0 2px 5px rgba(0,0,0,.45), 0 0 0 2px rgba(195,156,95,.22); }
#auth-submit { width: 100%; margin-top: 8px; }
.msg { min-height: 18px; color: var(--rust); font-size: 13px; margin: 2px 0 8px; }
.linklike { display: block; width: 100%; margin-top: 12px; padding: 4px; background: none; border: none; cursor: pointer; color: var(--brass-l); font-size: 12px; text-align: center; text-decoration: underline; text-underline-offset: 3px; }
label .opt { color: var(--ink-dim); font-weight: 400; }
.hint { color: var(--ink-dim); font-size: 11px; text-align: center; margin: 16px 0 0; line-height: 1.5; }
.google-wrap { margin-top: 8px; }
.divider { display: flex; align-items: center; gap: 10px; color: var(--ink-dim); font-size: 12px; margin: 12px 0; }
.divider::before, .divider::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--bronze-d), transparent); }
.google-btn { display: flex; justify-content: center; min-height: var(--btn-h); }

/* ---- Game shell ---- */
.game { height: 100%; display: flex; flex-direction: column; }

/* Top HUD: forged instrument bar */
.topbar {
  position: sticky; top: 0; z-index: 20; display: flex; align-items: center; gap: 8px;
  padding: 9px 12px calc(9px + 1px); padding-top: calc(9px + env(safe-area-inset-top, 0px));
  min-height: calc(88px + env(safe-area-inset-top, 0px));   /* floor ≥ tallest content (resource cells ~86px) so every tab — incl. Profilo — is identical height */
  background: linear-gradient(180deg, #1d2a3b, #121a27);
  border-bottom: 1px solid var(--bronze-d);
  box-shadow: 0 2px 0 rgba(0,0,0,.4), 0 6px 16px rgba(0,0,0,.4), inset 0 1px 0 var(--edge-hi);
}
.topbar::after {  /* brass filigree under-rail */
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
  background: linear-gradient(90deg, transparent, var(--brass) 20%, var(--brass-l) 50%, var(--brass) 80%, transparent); opacity: .5;
}
.topbar.under-attack { background: linear-gradient(180deg, #6e2a1d, #3a120c); border-bottom-color: var(--rust); }
/* battito d'allarme: velo bianco che pulsa in OPACITY su layer proprio (compositor) —
   stesso effetto di brightness() ma senza ripitturare l'header a ogni frame */
.topbar.under-attack::before { content: ""; position: absolute; inset: 0; z-index: 30; pointer-events: none; background: #fff; opacity: 0; --pk: .12; animation: gpulse 1.1s infinite; }
/* pulse condiviso di tutta l'app: anima SOLO l'opacity (GPU, zero repaint); picco per-uso via --pk */
@keyframes gpulse { 0%, 100% { opacity: 0; } 50% { opacity: var(--pk, 1); } }
/* Anello ambra sull'input coordinate quando arrivi da mappa ▸ Colonizza: mostra che le
   coordinate scelte sono già dentro il campo. Due battiti, poi torna normale. */
@keyframes coord-pulse {
  0%, 70% { border-color: var(--amber); }
  100%    { border-color: var(--line); }
}
.coord-pulse { animation: coord-pulse 1s ease-out 2; }
/* 3 resource cells fill the left at equal width; a flexible empty column is the spacer
   (graphic distance, no rule); the Energy cell is compact (content width) on the right. */
.res-cluster { flex: 1; display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; align-items: stretch; min-width: 0; }
/* Con più isole legname/vapore/ottone aprono la panoramica isole: puntatore (energia ha già role=button). */
.topbar.multi-isl .res-cluster .res:not(.res-energy) { cursor: pointer; }
.res {
  display: flex; flex-direction: column; align-items: stretch; line-height: 1.12; min-width: 0;
  padding: 2px 0 4px;
}
/* the value sits above a live capacity gauge; hourly production / energy % read below it */
.res b { font-variant-numeric: tabular-nums; font-size: 14px; color: var(--ink); text-shadow: 0 1px 2px rgba(0,0,0,.6); text-align: left; margin-top: 2px; }
/* capacity gauge: fill toward the storage cap (energy cell: load %). Colors follow state:
   brass (ok) → amber (≥90%) → rust (full), so a "red" header explains itself at a glance. */
.rbar { display: block; height: 3px; margin: 4px 0; border-radius: 2px; overflow: hidden;
  background: rgba(0,0,0,.5); box-shadow: inset 0 1px 1px rgba(0,0,0,.5); }
.rbar > i { display: block; height: 100%; width: 0; border-radius: 2px;
  background: linear-gradient(90deg, var(--bronze), var(--brass-l)); transition: width .5s ease; }
.res.near .rbar > i { background: linear-gradient(90deg, var(--amber), var(--amber-l)); }
.res.full .rbar > i { background: linear-gradient(90deg, #8d2e1c, var(--rust)); }
.res-energy .rbar > i { background: var(--good); }
.res-energy.en-y .rbar > i { background: #ffd24a; }
.res-energy.en-o .rbar > i { background: #e8862e; }
.res-energy.en-r .rbar > i { background: var(--rust); }
/* name on the left, icon on the right; the label + value + prod all sit left-aligned in the cell */
.rtop { display: flex; flex-direction: row-reverse; justify-content: flex-end; align-items: center; gap: 4px; }
.rname { color: var(--ink-dim); font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; }
.rprod { color: var(--good); font-size: 11px; font-variant-numeric: tabular-nums; text-align: left; }
.res.full .rprod { color: var(--rust); font-weight: 700; }
.res.full b { color: var(--amber-l); }
.ricon {
  /* -4px e non `middle` (18/08/2026, ordine del committente: «numbers e svg sfasati»):
     MISURATO sul DOM, `middle` piazzava il centro dell'icona 1,8px SOTTO il centro delle cifre
     accanto (font 11px); a -4px lo scarto e' 0,5px, invisibile. Nei contenitori flex il
     vertical-align e' ignorato e non cambia niente; i contesti con la loro taratura
     (.ricon-txt, .quest-row) vincono per specificita' come prima. */
  width: 18px; height: 18px; display: inline-block; vertical-align: -4px; flex: none;
  background-size: contain; background-repeat: no-repeat; background-position: center;
  /* vector SVG resources: scale crisply at any DPR, no pixelation needed */
}
.ricon-wood  { background-image: url("/assets/resources/legno.svg?v=7"); }
.ricon-steam { background-image: url("/assets/resources/vapore.svg?v=5"); }
.ricon-brass { background-image: url("/assets/resources/ottone.svg?v=5"); }
.ricon-energy { background-image: url("/assets/resources/energia.svg?v=2"); }
/* inline energy bolt sized to the surrounding text (replaces the old energy emoji everywhere) */
.ricon.ricon-txt { width: 1.05em; height: 1.05em; vertical-align: -0.16em; }

/* ---- gi(): game-icons.net placeholder icons (tinted silhouettes) ----
   Inline by default, sized to surrounding text like the energy bolt. The
   .gi-coin modifier wraps the icon in a round brass medallion (dark disc +
   ottone rim) for the framed placeholder slots; bare .gi stays transparent. */
.gi { display: inline-block; width: 1.15em; height: 1.15em; vertical-align: -0.2em; flex: none;
  background-size: contain; background-repeat: no-repeat; background-position: center; }
.gi-castle { background-image: url("/assets/ui/castle.svg?v=2"); }
.gi-chest  { background-image: url("/assets/ui/chest.svg?v=1"); }
.gi-console { background-image: url("/assets/ui/console.svg?v=1"); }
.gi-bag    { background-image: url("/assets/ui/bag.svg?v=2"); }
.gi-box    { background-image: url("/assets/ui/box.svg?v=1"); }
.gi-target { background-image: url("/assets/ui/target.svg?v=1"); }
.gi-attack { background-image: url("/assets/ui/attack.svg?v=1"); }
.gi-speed  { background-image: url("/assets/ui/speed.svg?v=2"); }
.gi-prod   { background-image: url("/assets/ui/prod.svg?v=1"); }
.gi-ensave { background-image: url("/assets/ui/ensave.svg?v=1"); background-size: 80%; }
.gi-ptime  { background-image: url("/assets/ui/ptime.svg?v=1"); }
.gi-defense{ background-image: url("/assets/ui/shield.svg?v=1"); }
.gi-hourglass { background-image: url("/assets/ui/hourglass.svg?v=1"); }
.gi-flamer { background-image: url("/assets/ui/flamer.svg?v=1"); }
.gi-cog    { background-image: url("/assets/ui/cog.svg?v=1"); }
.gi-wrench { background-image: url("/assets/ui/wrench.svg?v=2"); }
.gi-envelope { background-image: url("/assets/ui/envelope.svg?v=1"); }
.gi-trophy-gold   { background-image: url("/assets/ui/trophy-gold.svg?v=1"); }
.gi-trophy-silver { background-image: url("/assets/ui/trophy-silver.svg?v=1"); }
.gi-trophy-bronze { background-image: url("/assets/ui/trophy-bronze.svg?v=1"); }
/* HUD header buttons: size the gi icon to the 18px button glyph slot */
.hud-ico .gi { width: 21px; height: 21px; vertical-align: middle; }
/* Daily-reward gift medallion: red disc, with the brass frame kept ON TOP via the
   two-layer clip (red → content-box, bronze rim → border-box padding ring). */
.icon-slot.ds-gift { background:
  radial-gradient(120% 120% at 30% 20%, #b5352a, #6e130d),
  conic-gradient(from 210deg, var(--bronze-d), var(--brass-l), var(--bronze-d));
  background-clip: content-box, border-box; }
.gi-island { background-image: url("/assets/ui/island.svg?v=1"); }
/* Tre linee decrescenti: il segno universale di «filtri». Non c'era fra le 82 icone, e al suo
   posto era finita prima una lente (che prometteva una ricerca inesistente) e poi un occhio. */
.gi-filter { background-image: url("/assets/ui/filter.svg?v=1"); }
/* ICONA TINTA — stessa silhouette, dipinta col colore corrente invece che con la sua art.
   Le `.gi` sono immagini di sfondo, e un'immagine non si ricolora: qui la stessa SVG si usa come
   MASCHERA e il colore lo mette `background-color: currentColor`. Cosi' basta un `color:` sul
   contenitore e l'icona lo segue — che e' come funziona gia' tutto il resto del testo.
   Serve alle isole nelle liste: ognuna porta il colore della SUA palette, quello scelto nella
   vista Isola, e due colonie non si confondono piu' a colpo d'occhio. */
.gi.gi-tint { background-image: none; background-color: currentColor;
  -webkit-mask-size: contain; mask-size: contain;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;
  -webkit-mask-position: center; mask-position: center; }
.gi.gi-tint.gi-island { -webkit-mask-image: url("/assets/ui/island.svg?v=1"); mask-image: url("/assets/ui/island.svg?v=1"); }
.gi.gi-tint.gi-castle { -webkit-mask-image: url("/assets/ui/castle.svg?v=2"); mask-image: url("/assets/ui/castle.svg?v=2"); }
/* La bandiera dei punti di controllo: prende il colore della gilda che tiene il punto, lo stesso
   del rombo sul globo e dei ping di quella gilda. Bianca finche' e' libero. */
.gi.gi-tint.gi-flag { -webkit-mask-image: url("/assets/ui/flag.svg?v=2"); mask-image: url("/assets/ui/flag.svg?v=2"); }
/* Il teschio della caccia: bianco quando e' il Boss Mondiale, ruggine quando e' il Mondo Rosso.
   Stessa sagoma, due colori — perche' e' lo stesso gesto (dare la caccia a una bestia) in due
   posti diversi, e il colore dice QUALE dei due. */
.gi.gi-tint.gi-skull { -webkit-mask-image: url("/assets/ui/crest/skull.svg?v=1"); mask-image: url("/assets/ui/crest/skull.svg?v=1"); }
/* Il globo tingibile: azzurro e' il Mondo 1, rosso e' il Varco. Sono lo STESSO disegno con due
   colori — perche' sono lo stesso oggetto (un mondo), e il colore e' l'unica cosa che cambia.
   Un'altra sagoma direbbe «un'altra cosa», e non lo e'. */
.gi.gi-tint.gi-world { -webkit-mask-image: url("/assets/ui/world.svg?v=1"); mask-image: url("/assets/ui/world.svg?v=1"); }
/* Il microscopio della Grande Ricerca, azzurro ovunque compaia. La stessa tinta la faceva gia'
   a mano la card di Isola ▸ Ricerche, con una regola tutta sua che rimascherava lo stesso file:
   due modi di dipingere lo stesso disegno sono due disegni diversi appena qualcuno ne tocca uno.
   Qui c'e' la maschera, il colore lo mette `.gi-patina`, e chi vuole il microscopio azzurro
   scrive le stesse tre classi in tutti e due i posti. */
.gi.gi-tint.gi-microscope { -webkit-mask-image: url("/assets/ui/microscope.svg?v=1"); mask-image: url("/assets/ui/microscope.svg?v=1"); }
/* Le carte-dossier in chat tingono i loro glifi: lente e spade d'ORO nella fascia del titolo
   (currentColor = il brass della fascia), spade in VERDE sulla riga dei compagni partiti. */
.gi.gi-tint.gi-swords { -webkit-mask-image: url("/assets/ui/swords.svg?v=3"); mask-image: url("/assets/ui/swords.svg?v=3"); }
.gi.gi-tint.gi-search { -webkit-mask-image: url("/assets/ui/search.svg?v=1"); mask-image: url("/assets/ui/search.svg?v=1"); }
.gi.gi-tint.gi-cargo { -webkit-mask-image: url("/assets/ui/box.svg?v=1"); mask-image: url("/assets/ui/box.svg?v=1"); }
.gi.gi-tint.gi-defense { -webkit-mask-image: url("/assets/ui/shield.svg?v=1"); mask-image: url("/assets/ui/shield.svg?v=1"); }
/* Le fasce dei rapporti condivisi in chat: senza la maschera `gi-tint` dipinge un quadrato
   pieno del colore corrente — ed e' esattamente quel che si vedeva sulle carte Spedizione e
   Condivisa. Ogni icona tinta deve avere la SUA maschera, qui. */
.gi.gi-tint.gi-compass { -webkit-mask-image: url("/assets/ui/compass.svg?v=1"); mask-image: url("/assets/ui/compass.svg?v=1"); }
.gi.gi-tint.gi-three-friends { -webkit-mask-image: url("/assets/ui/three-friends.svg?v=1"); mask-image: url("/assets/ui/three-friends.svg?v=1"); }
/* ROSSASTRO, non cremisi. Era #b4243a — un rosso freddo, quasi vinaccia — e su una card
   scura leggeva come un avviso di pericolo invece che come una livrea. `--rust` e' il rosso
   che il gioco usa gia' per il Mondo Rosso: e' lo stesso della barra della caccia nella
   striscia, quindi il globo e il suo timer adesso sono della stessa tinta. */
.gi.gi-rosso { color: var(--rust); }
/* AZZURRO. La Grande Ricerca si fa QUI, di qua dal Varco: il rosso e' quello che si apre dopo. */
.gi.gi-patina { color: var(--patina); }
.gi-gem    { background-image: url("/assets/ui/gem.svg?v=3"); }
.gi-diamond{ background-image: url("/assets/ui/diamond.svg?v=2"); }
.gi-diamond-gold{ background-image: url("/assets/ui/diamond-gold.svg?v=1"); }
.gi-hand   { background-image: url("/assets/ui/hand.svg?v=1"); }
.gi-sailboat { background-image: url("/assets/ui/sailboat.svg?v=1"); }
.gi-swords { background-image: url("/assets/ui/swords.svg?v=3"); }
.gi-padlock { background-image: url("/assets/ui/padlock.svg?v=1"); }
.gi-anchor { background-image: url("/assets/ui/anchor.svg?v=2"); }
.gi-front-wing   { background-image: url("/assets/ui/front-wing.svg?v=1"); }
.gi-front-wing-r { background-image: url("/assets/ui/front-wing-r.svg?v=1"); }
.gi-front-peak   { background-image: url("/assets/ui/front-peak.svg?v=1"); }
.gi-bell   { background-image: url("/assets/ui/bell.svg?v=2"); }
.gi-pencil { background-image: url("/assets/ui/pencil.svg?v=1"); }
.gi-three-friends { background-image: url("/assets/ui/three-friends.svg?v=1"); }
.gi-compass{ background-image: url("/assets/ui/compass.svg?v=1"); }
.gi-rocket { background-image: url("/assets/ui/rocket.svg?v=2"); }
.gi-crown  { background-image: url("/assets/ui/crown.svg?v=1"); }
.gi-star   { background-image: url("/assets/ui/star.svg?v=1"); }
.gi-person { background-image: url("/assets/ui/person.svg?v=1"); }
.gi-wanted { background-image: url("/assets/ui/wanted.svg?v=1"); }
.gi-dishonored { background-image: url("/assets/ui/dishonored.svg?v=1"); }
.gi-mountains { background-image: url("/assets/ui/mountains.svg?v=1"); }
.gi-warning{ background-image: url("/assets/ui/warning.svg?v=2"); }
.gi-lab    { background-image: url("/assets/ui/lab.svg?v=2"); }
.gi-globe  { background-image: url("/assets/ui/globe.svg?v=1"); }
.gi-world  { background-image: url("/assets/ui/world.svg?v=1"); }
.gi-worldgold { background-image: url("/assets/ui/worldgold.svg?v=1"); }
.gi-worldbrown { background-image: url("/assets/ui/worldbrown.svg?v=1"); }
.gi-teamup { background-image: url("/assets/ui/teamup.svg?v=1"); }
.gi-flag       { background-image: url("/assets/ui/flag.svg?v=2"); }
.gi-shieldcomb { background-image: url("/assets/ui/shieldcomb.svg?v=1"); }
.gi-handshake  { background-image: url("/assets/ui/handshake.svg?v=1"); }
.gi-pig        { background-image: url("/assets/ui/pig.svg?v=1"); }
.gi-pin        { background-image: url("/assets/ui/pin.svg?v=1"); }
.gi-scroll     { background-image: url("/assets/ui/scroll.svg?v=1"); }
.gi-megaphone  { background-image: url("/assets/ui/megaphone.svg?v=6");
  /* sagoma larga e bassa: lo slot .gi di default (1.15em) la rende minuscola →
     ingrandisco l'icona ~2x e correggo l'allineamento verticale. */
  width: 1.6em; height: 1.6em; vertical-align: -0.5em; }
.gi-chat   { background-image: url("/assets/ui/chat.svg?v=1"); }
.gi-satellite { background-image: url("/assets/ui/satellite.svg?v=1"); }
.gi-ring   { background-image: url("/assets/ui/ring.svg?v=1"); }
/* IL VARCO. Usata in sette punti (Grande Ricerca, Riserva, chip dell'Avamposto, righe di
   volo) e per mesi non ha avuto una regola: `gi("portal")` produceva uno <span> con una
   classe che il CSS non conosceva, cioe' un rettangolo vuoto. Niente errore, niente 404 —
   solo un buco dove doveva esserci un'icona. Presta l'anello finche' non c'e' un'arte sua:
   un cerchio aperto e' la cosa piu' vicina a un varco fra le icone che ci sono. */
.gi-portal { background-image: url("/assets/ui/ring.svg?v=1"); }
/* La Grande Ricerca e' RICERCA prima che portale: l'anello che ci stava prima raccontava
   l'arrivo, non il lavoro. Il microscopio dice cosa stai facendo — e l'azzurro lo tiene di
   casa, perche' la ricerca si fa QUI: il rosso e' quello che si apre dopo. Nel gioco lo si
   chiede sempre tinto (`gi gi-tint gi-patina gi-microscope`, la maschera sta lassu'); questa
   e' la livrea nuda, per quando servira' su un fondo che il colore ce l'ha gia'. */
.gi-microscope { background-image: url("/assets/ui/microscope.svg?v=1"); }
/* Le ALTRE mute, trovate insieme al Varco (02/08/2026) misurando sulla pagina viva quali
   classi `.gi-*` non avessero ne' `background-image` ne' `mask`. Sette punti del gioco
   disegnavano un rettangolo vuoto — la lente della ricerca nello Storico, il cuore della
   vita del Boss, la freccia di rientro, il pacco del Mercato. Prendono in prestito un'arte
   che esiste: meglio un'icona vicina che un buco. */
.gi-magnifying-glass { background-image: url("/assets/ui/search.svg?v=1"); }
.gi-cargo  { background-image: url("/assets/ui/box.svg?v=1"); }
.gi-warn   { background-image: url("/assets/ui/warning.svg?v=2"); }
.gi-return-arrow { background-image: url("/assets/ui/anchor.svg?v=1"); }
.gi-info   { background-image: url("/assets/ui/scroll.svg?v=1"); }
/* Innesti del Mondo Rosso: UNA sola icona per tutte le carte, come le carte di Ragnarok —
   si riconoscono dal nome e dalla tendina, non dal disegno. Venticinque icone diverse in una
   griglia da sei colonne sono rumore, e il ritratto della bestia sta gia' nella tendina. */
.gi-card   { background-image: url("/assets/ui/card.svg?v=1"); }
.gi-gift   { background-image: url("/assets/ui/gift.svg?v=2"); }
.gi-trophy { background-image: url("/assets/ui/trophy.svg?v=1"); }
.gi-medal  { background-image: url("/assets/ui/medal.svg?v=1"); }
.gi-laurel { background-image: url("/assets/ui/laurel.svg?v=1"); }
.gi-eye    { background-image: url("/assets/ui/eye.svg?v=1"); }
/* Bottega/negozio (delapouite, game-icons): bottone header + titolo del Negozio skin. */
.gi-shop   { background-image: url("/assets/ui/shop.svg?v=2"); }
/* Mercato delle Nubi (delapouite «sell-card», game-icons): la carta con la merce e la mano
   che la passa. Distinta da `gi-shop`, che resta dell'Emporio: i due tasti stanno uno
   accanto all'altro e con la stessa icona si distinguevano solo per il fondo. */
.gi-sell-card { background-image: url("/assets/ui/sell-card.svg?v=4"); }
/* Ingrandisci (delapouite, game-icons): apre la vetrina del bundle. */
.gi-expand { background-image: url("/assets/ui/expand.svg?v=1"); }
/* Castone (diamante, game-icons): SOLO il premio del settimo giorno. Sta a parte da `gi-ring`
   di proposito — quella e' l'ANELLO e la usano inventario, rapporti e schede oggetto: cambiarne
   la sorgente per far contento un riquadro avrebbe spostato il disegno in mezzo gioco. */
.gi-diamond { background-image: url("/assets/ui/diamond.svg?v=2"); }
   RIQUADRO non il viewBox: stringere il viewBox avrebbe
   tagliato le frecce, che arrivano fino al bordo della figura (486 di lato su 510 di
   riquadro). Il fondo e' `contain`, quindi il disegno scala per intero e resta centrato. */
/* Occhio "normale" (visione/intel): uso PUBBLICO (rapporti spia, aiuti). L'occhio onnisciente
   (gi-eye) resta riservato ad admin/GM (dashboard, God Mode). */
.gi-sight  { background-image: url("/assets/ui/sight.svg?v=1"); }
.gi-scrap  { background-image: url("/assets/ui/scrap.svg?v=1"); }
.gi-hammer { background-image: url("/assets/ui/hammer.svg?v=1"); }
.gi-temple { background-image: url("/assets/ui/temple.svg?v=1"); }
.gi-search { background-image: url("/assets/ui/search.svg?v=1"); }
.gi-close  { background-image: url("/assets/ui/close.svg?v=1"); }
.gi-skull  { background-image: url("/assets/ui/crest/skull.svg?v=1"); }  /* teschio bianco: boss nello strip + report */
.gi-coin { width: 1.9em; height: 1.9em; vertical-align: -0.55em; border-radius: 50%;
  background-size: 64%; background-color: #241a0e;
  box-shadow: inset 0 0 0 2px rgba(202,162,74,.7), inset 0 6px 10px rgba(76,58,34,.55), 0 1px 3px rgba(0,0,0,.4); }

.hud-right { display: flex; align-items: center; gap: 8px; flex: none; min-width: 0; }
/* ORA DI CLOUDFORGE nell'header (16/08/2026): TESTO NUDO su una riga, niente scocca da tasto —
   in mezzo a sei quadrati d'ottone un settimo riquadro sarebbe stato solo rumore, e l'ora non e'
   un comando. La propria ora non si ripete qui (ce l'hai sull'orologio del dispositivo): sta in
   Profilo, insieme al fuso. Vale su desktop E su telefono, dove atterra nel vuoto lasciato dalla
   molla dell'Emporium. */
/* La sigla si allinea al CENTRO dell'ora, non alla sua base: appoggiata sulla linea di scrittura
   sembrava caduta in basso. Nessun effetto al passaggio: e' un'indicazione, non un comando. */
.cft-chip {
  display: inline-flex; align-items: center; gap: var(--sp-6); flex: none; padding: 0 var(--sp-4);
  white-space: nowrap; font-variant-numeric: tabular-nums;
  /* Un pixel piu' in basso: le cifre del Cinzel poggiano alte nella loro scatola e accanto ai
     tasti quadrati l'ora sembrava sollevata. Correzione OTTICA, non di allineamento. */
  position: relative; top: 1px;
}
/* Le due parti si guardano quasi alla pari: l'ora scesa a 15 e la sigla salita a 11 in peso
   pieno e tinta d'ottone chiara. Prima l'ora gridava e «CFT» spariva, e senza la sigla il numero
   e' solo un numero — la sigla e' la meta' che dice DI CHI e' quell'ora. */
.cft-chip b { font-family: var(--font-display); font-size: var(--fs-lg); font-weight: 700; color: var(--brass-l); letter-spacing: .8px; }
/* La sigla nello STESSO ottone chiaro dell'ora: in bronzo scuro si spegneva sul fondo navy e
   restava un'ombra. A distinguerle basta la misura. */
.cft-chip small { font-family: var(--font-display); font-size: var(--fs-base); font-weight: 700; color: var(--brass-l); letter-spacing: .8px; }
@media (max-width: 560px) { .cft-chip small { font-size: var(--fs-sm); } }
/* SU TELEFONO E TABLET L'ORA STA SOLO IN PROFILO (16/08/2026, ordine del committente): accanto a
   legname, vapore, ottone ed energia un quinto numero si legge come una quinta risorsa, e quella
   barra deve dire una cosa sola. Sopra i 1100px l'header ha spazio e la tiene sempre. */
@media (max-width: 1099px) {
  .cft-chip { display: none; }
  .topbar.profile-mode .cft-chip { display: inline-flex; }
}
/* Strumenti GM nelle Impostazioni: due tasti affiancati che vanno a capo se non ci stanno.
   Il pallino delle segnalazioni si appoggia al tasto, quindi il tasto fa da ancora. */
.set-gm { display: flex; gap: var(--sp-8); flex-wrap: wrap; margin-top: var(--sp-10); }
.set-gm .btn { position: relative; }
/* Chi vive gia' nell'ora di Cloudforge (fuso automatico o scelto che coincide) non ha bisogno di
   un secondo orologio uguale a quello del suo telefono: la sigla sparisce finche' non serve. */
.cft-chip.cft-inutile,
.topbar.profile-mode .cft-chip.cft-inutile { display: none; }

/* L'orologio delle IMPOSTAZIONI: CFT sopra, la tua ora sotto, cosi' lo scarto si legge
   senza spiegazioni. (La card gemella in Profilo e' stata tolta: li' l'ora sta gia' in barra.) */
/* Fondo navy pulito e etichette in grigio-inchiostro: il gradiente finiva su un verde oliva e
   le diciture erano in patina, e insieme davano al riquadro una velatura giallastra che non
   c'entra niente col resto della plancia. */
.cft-box { border: 1px solid var(--brass-d); border-radius: 4px; padding: 8px 10px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0)); }
.cft-box .cb-riga { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.cft-box .cb-riga + .cb-riga { margin-top: 4px; }
.cft-box .cb-et { font-family: var(--font-display); font-size: 10px; letter-spacing: 1.5px;
  text-transform: uppercase; color: var(--ink-dim); }
.cft-box b { font-family: var(--font-display); font-size: 16px; color: var(--brass-l); font-variant-numeric: tabular-nums; }

.hud-btn {
  position: relative; width: 40px; height: var(--btn-h); flex: none; border-radius: 12px; cursor: pointer;
  background: radial-gradient(120% 120% at 30% 20%, var(--panel-2), var(--panel-0));
  border: 1px solid var(--bronze-d); color: var(--brass-l); font-size: 18px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 2px 5px rgba(0,0,0,.4);
  display: grid; place-items: center;
}
.hud-btn:active { transform: translateY(1px); }
/* Il tasto dell'Emporio e' l'unico con la parola scritta accanto all'icona: fra quattro quadrati
   identici, quello che porta al negozio deve dire cosa fa. Larghezza libera invece dei 40px
   fissi, e la griglia diventa una riga per tenere icona e testo affiancati. */
.hud-btn.hud-btn-wide { width: auto; display: flex; align-items: center; gap: var(--sp-6); padding: 0 var(--sp-10); }
.hud-lbl { font-family: Cinzel, serif; font-size: 13px; font-weight: 600; letter-spacing: .02em;
  white-space: nowrap; line-height: 1; }
.hud-ico { line-height: 1; filter: drop-shadow(0 1px 1px rgba(0,0,0,.5)); }
.hud-badge {
  position: absolute; top: -5px; right: -5px; min-width: 17px; height: 17px; padding: 0 4px;
  border-radius: 999px; background: linear-gradient(180deg, var(--rust), #8d2e1c); color: #fff;
  font-size: 10px; font-weight: 700; line-height: 17px; text-align: center;
  border: 1px solid #2a0c06; /* glow rimosso */
}
/* Footer Impostazioni: build (commit git) discreto, centrato, in fondo alla schermata. */
.set-footer { text-align: center; font-size: 11px; margin: 12px 0 4px; opacity: .65; font-variant-numeric: tabular-nums; }
/* Pallino rosso "nuove segnalazioni" sull'occhio GM (solo a DXCH). */
.hud-dot {
  position: absolute; top: -3px; right: -3px; width: 11px; height: 11px; border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, #ff7a5c, var(--rust) 60%, #8d2e1c);
  border: 1.5px solid #2a0c06; /* glow rimosso */
  animation: hudDotPulse 1.6s ease-in-out infinite;
}
@keyframes hudDotPulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.18); opacity: .82; } }
@media (prefers-reduced-motion: reduce) { .hud-dot { animation: none; } }
/* Profilo identity box: full name + level, horizontal, height matched to the HUD buttons. */
.cap-id {
  height: 40px; flex: 0 1 auto; min-width: 0; display: flex; align-items: center; gap: 6px; padding: 0 12px;
  border-radius: 12px; color: var(--ink);
  background: radial-gradient(120% 120% at 50% 0%, rgba(195,156,95,.18), rgba(0,0,0,.25));
  border: 1px solid var(--bronze-d); box-shadow: inset 0 1px 0 var(--edge-hi);
}
/* Il box nome CEDE per primo quando lo spazio stringe (i tasti restano interi): il nome si
   accorcia con "…" invece di mandare la barra in overflow. Il livello non si tocca mai. */
.cap-id #cap-name { font-family: var(--font-display); font-size: 14px; color: var(--brass-l); white-space: nowrap; letter-spacing: .3px; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cap-id .cap-lv { flex: none; font-size: 11px; color: var(--ink-dim); text-transform: uppercase; letter-spacing: .5px; white-space: nowrap; }
.cap-id .cap-lv b { color: var(--amber-l); font-size: 14px; font-family: var(--font-display); }

/* Energy = 4th resource cell: identical layout to .res, only the text colour shifts by load
   band (green ≤95 · yellow 95–100 · orange 100–115 · red >115 or blackout). */
/* 4th cell: an elegant brass hairline (fades at both ends) sets the energy read-out apart from
   the three stockpiles — the deliberate divider the original layout meant the spacer to imply. */
.res-energy { cursor: pointer; padding-left: 12px; border-left: 1px solid transparent;
  border-image: linear-gradient(180deg, transparent 8%, rgba(207,170,104,.42), transparent 92%) 1; }
.res-energy b, .res-energy .rprod { color: var(--good); }            /* green (default) */
.res-energy.en-y b, .res-energy.en-y .rprod { color: #ffd24a; }      /* yellow 95–100% */
.res-energy.en-o b, .res-energy.en-o .rprod { color: #e8862e; }      /* orange 100–115% */
.res-energy.en-r b, .res-energy.en-r .rprod { color: var(--rust); }  /* red >115% / blackout */

/* Two-state header: default shows resources + energy; Profilo shows gear + comms + identity. */
/* I QUATTRO TASTI STANNO SEMPRE NELLA BARRA (15/08/2026, ordine del committente): Mercato,
   Emporio, notifiche, opzioni — non piu' solo nella schermata Profilo. Restano fuori solo
   `#cap-id` (l'identita' la porta gia' `.hud-cap` a sinistra) e la chat globale, che ha il
   suo dock agganciato e in barra sarebbe un doppione. */
#settings-btn, #comms-btn, #cap-id, #wchat-btn { display: none; }
/* AGGANCIATA ALLA COLONNA DI DESTRA (15/08/2026, ordine del committente): i quattro tasti
   stanno sulla verticale di MAPPA / STORICO / CLASSIFICHE, cioe' dove prima stava il ritratto
   che abbiamo portato a sinistra. left/width glieli da' `positionWchatDock`, la stessa
   funzione che misura la colonna: una geometria sola per tutti e due i blocchi dell'header. */
@media (min-width: 1100px) {
  .topbar .hud-right { position: absolute; top: 0; bottom: 0; right: auto; margin: 0;
    align-items: center; justify-content: flex-end; }
}
.topbar.profile-mode #settings-btn, .topbar.profile-mode #comms-btn, .topbar.profile-mode #wchat-btn { display: grid; }
/* Ordine (Guglielmo 25/07): SINISTRA nome+livello, bottega, occhio GM · DESTRA chat, posta,
   ingranaggio. Il margin-left:auto sta sulla CHAT (primo del gruppo destro, sempre visibile):
   è lei a staccarsi e portare con sé posta+ingranaggio, qualunque cosa sia nascosta a sinistra. */
/* IL NOME+LIVELLO NELLA BARRA NON C'E' PIU' (09/08/2026). Diceva le stesse tre cose che la
   scheda sotto dice meglio dieci pixel piu' in basso — nome, tag e livello — e per farlo si
   mangiava meta' della barra su telefono. L'elemento resta nel documento (lo cerca ancora il
   passo del tutorial sul livello) ma non si mostra piu': lo spazio va ai tasti. */
.topbar.profile-mode #shop-btn { order: -2; }
/* ORDINE DELLA BARRA (15/08/2026, ordine del committente): da destra verso sinistra opzioni,
   notifiche, Emporio, Mercato. `.hud-right` e' un flex normale, quindi l'ordine visivo da
   sinistra e' l'inverso — e si scrive con `order` invece che spostando il markup, cosi' l'HTML
   resta quello che era e le due schermate (gioco e Profilo) non divergono. Console e Occhio GM
   non entrano nella conta: sono tasti di servizio, restano in testa alla fila. */
/* L'EMPORIUM NON E' UN TASTO COME GLI ALTRI. E' l'unico posto del gioco dove si spende denaro
   vero, e deve leggersi cosi': fondo NERO invece dell'ottone di tutti, filo d'oro, e un box
   piu' largo che si stacca dalla fila. Risalta per CONTRASTO, non per luce — niente glow. */
.topbar.profile-mode #shop-btn {
  width: auto; padding: 0 var(--sp-16); margin-right: auto;   /* ← la molla della barra */
  /* Velatura d'oro dall'alto che si spegne quasi subito nel nero: la stessa aria dell'Emporium
     — prevalentemente nero, con l'ottone che sfiora il bordo superiore. E' luce DIPINTA nel
     fondo, non un alone: il divieto di glow riguarda le ombre luminose, non le velature. */
  background: radial-gradient(120% 130% at 50% 0%, rgba(202,162,74,.30), #05060b 58%);
  border-color: #caa24a;
  color: #e9c87e;
}
/* L'ora sta SUBITO dopo l'Emporium, nel vuoto lasciato dalla sua molla: stesso `order` dei tasti
   di servizio, ma prima nel documento, quindi prima anche a schermo. Per i capitani normali —
   che Console e Occhio GM non li hanno — e' il primo elemento del gruppo di destra. */
.topbar.profile-mode #cft-chip { order: -1; }
.topbar.profile-mode #market-btn { order: 6; }   /* riordinato nel blocco desktop */
/* L'ANCORA STA SULLA BOTTEGA, non sulla chat (09/08/2026). Era `margin-left:auto` sul tasto
   chat: lui si staccava e portava a destra tutto il gruppo. Ma la chat SPARISCE sugli schermi
   stretti — e senza di lei spariva anche l'unica molla della barra, cosi' `flex-end`
   impacchettava tutto a destra e la bottega finiva in mezzo agli altri invece che al suo posto.
   Adesso spinge la bottega: e' lei a restare a sinistra e a mandare il resto a destra. Quando
   la bottega non si vede (chi non ha l'Emporium) non serve nessuna molla — `flex-end` fa gia'
   quel che deve. Una molla sola: due margini automatici si spartirebbero lo spazio a meta'. */
.topbar.profile-mode #wchat-btn { order: 1; }   /* right cluster: chat … */
.topbar.profile-mode #comms-btn { order: 2; }     /* … poi posta … */
.topbar.profile-mode #settings-btn { order: 3; }  /* … e ingranaggio */
.topbar.profile-mode .res-cluster, .topbar.profile-mode #energy-chip { display: none; }
.topbar.profile-mode .hud-right { flex: 1; justify-content: flex-end; }
/* Identità del capitano nell'header (solo desktop largo): nel gutter destro, sopra la colonna
   del dock — il ritratto del Profilo col badge livello in fondo a destra, e alla sua sinistra
   due righe: nome sopra, titolo sotto. left/width li mette positionWchatDock (stessa colonna). */
.hud-cap { display: none; }
@media (min-width: 1100px) {
  /* ANCORATA AL BORDO SINISTRO DELLA COLONNA (15/08/2026, ordine del committente). Il blocco ha
     già left/width della colonna del dock (li mette positionWchatDock): allineandolo a destra
     galleggiava staccato dalla verticale di MAPPA / STORICO / CLASSIFICHE, e da lì l'effetto di
     una cosa appesa fuori squadra. Da sinistra il ritratto cade sulla stessa riga d'inizio di
     tutte le card sotto. */
  .hud-cap { position: absolute; right: 20px; top: 0; bottom: 0; display: flex;
    align-items: center; justify-content: flex-start; gap: 12px; pointer-events: none; }
  /* Ritratto PRIMA, scritte dopo: si legge come ogni altra riga del gioco — icona a sinistra,
     testo a destra. Nel DOM l'avatar resta secondo (non si tocca il markup): lo sposta `order`. */
  .hud-cap .hud-avatar { order: -1; }
  /* IL BLOCCO PORTA AL PROFILO, ma i clic li prendono SOLO il ritratto e le scritte: il
     contenitore è alto quanto tutta la barra e largo quanto la colonna, e riaprirlo per intero
     metterebbe una lastra invisibile sopra mezzo header. Il `pointer-events:none` di sopra resta
     dov'è e serve proprio a questo. */
  .hud-cap .hud-id, .hud-cap .hud-avatar { pointer-events: auto; cursor: pointer; }
  /* Nessuna reazione al passaggio del mouse (16/08/2026): l'identita' in barra e' un'insegna,
     non un tasto — il dito che la tocca ci arriva comunque, e il cursore basta a dire che porta
     al Profilo. Le luci al passaggio le tengono i comandi veri. */
  /* SOLO sull'header di produzione: nel Profilo l'identità è già nella scheda sotto. */
  .topbar.profile-mode .hud-cap { display: none; }
  .hud-id { display: flex; flex-direction: column; align-items: flex-start; justify-content: center;
    gap: 2px; min-width: 0; }
  /* Il bollo del livello sta SOPRA il ritratto: a 24px copriva mezzo mento del capitano. Qui è
     più piccolo e rientra sul bordo invece di sporgere — l'illustrazione resta leggibile, che è
     il motivo per cui il ritratto c'è. */

  /* Armonia con le celle risorse: nome come i titoli (Cinzel, maiuscoletto largo, ottone),
     titolo sotto piccolo e spento come le rese orarie. */
  .hud-id .hud-id-name { font-family: var(--font-display); font-size: 14px; font-weight: 700;
    color: var(--brass-l); letter-spacing: 1px; text-transform: uppercase; white-space: nowrap;
    overflow: hidden; text-overflow: ellipsis; text-shadow: 0 1px 2px rgba(0,0,0,.6); }
  .hud-id .hud-id-title { font-size: 11px; font-style: italic; color: var(--ink-dim);
    letter-spacing: .3px; white-space: nowrap; }
  #topbar .hud-avatar { display: grid; width: 56px; height: 56px; font-size: 28px; border-radius: 12px; }
  /* IL RAGGIO INTERNO SEGUE QUELLO ESTERNO MENO IL BORDO: cornice 12 con bordo 2 -> 10.
     A 8 l'immagine restava piu' squadrata della cornice e sugli angoli si vedeva lo stacco,
     come una foto messa storta dentro il suo telaio. Scritto come sottrazione e non come `10px`
     perche' 10 non e' una misura scelta: e' il raggio della cornice meno il suo bordo. Se un
     giorno la cornice cambia curva, questo la segue da solo — ed e' anche il motivo per cui il
     valore non deve stare sulla scala dei raggi: non e' un raggio, e' una differenza. */
  #topbar .hud-avatar .av-img { border-radius: calc(var(--r-lg) - 2px); width: 100%; height: 100%; object-fit: cover; }
  /* Il bollo del livello e' un SEGNO sul ritratto, non una targa: a 20px su un'illustrazione
     dipinta ne mangiava un angolo. Rientrato sul bordo e ridotto, lascia il volto intero.
     La regola sta qui e non su `.hud-cap` perche' quella, senza id, perdeva il confronto di
     specificita' con questa e non si vedeva applicata. */
  /* SPORGE DALLA CORNICE, in basso a destra: appoggiato dentro sembrava una toppa sul
     ritratto; a cavallo del bordo torna a leggersi come un sigillo applicato sopra. */
  #topbar .hud-avatar .pid-lv { right: -4px; bottom: -8px; min-width: 16px; height: 16px;
    padding: 0 4px; font-size: var(--fs-xs, 10px); border-width: 1px; }
}

/* Per-tab "in progress" strip — thin live bars pinned just under the header. */
.progress-strip {
  flex: none; display: flex; flex-direction: column; gap: 4px; padding: 4px 12px;
  background: linear-gradient(180deg, #131c24, #0f1622);
  border-bottom: 1px solid var(--bronze-d); box-shadow: 0 2px 6px rgba(0,0,0,.35);
}
.ps-row { display: flex; align-items: center; gap: 6px; }
.ps-ico { flex: none; width: 14px; text-align: center; font-size: 11px; line-height: 1; filter: drop-shadow(0 1px 1px rgba(0,0,0,.55)); }
.ps-row .progress { flex: 1; height: 3px; margin-top: 0; border-radius: 4px; }
.ps-time { flex: none; min-width: 44px; text-align: right; font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }

/* Selettore isola UNICO: PRIMA riga sotto l'header (sopra la strip), solo su Isola/Unità/Azioni.
   È IL titolo dell'isola (nome · coordinate + matita) nello stile classico "due linee eleganti"
   dei view-title, con velo laterale del colore identità. Con la SOLA isola madre è STATICO
   (niente pallino, niente tendina); con ≥1 colonia il tap apre la tendina. Nessun caret. */
.island-bar {
  flex: none; position: relative; display: flex; align-items: center; justify-content: center;
  gap: 8px; min-height: 32px; padding: 4px 12px; cursor: pointer; user-select: none;
  font-family: var(--font-display); font-size: 13px; letter-spacing: 2px; text-transform: uppercase;
  color: var(--brass-l);
  /* Linee SEMPRE d'oro (linguaggio dei view-title); l'identità dell'isola sta nello SFONDO:
     pannello scuro della strip + alone tenue del colore isola centrato dietro il nome, che
     sfuma a nulla verso i bordi. Cambio isola → l'alone vira di tinta. Zero glow. */
  background:
    radial-gradient(56% 150% at 50% 58%, color-mix(in srgb, var(--ib-col, #5b87c9) 22%, transparent), transparent 76%),
    linear-gradient(180deg, #131c24, #0f1622);
  border-bottom: 1px solid var(--bronze-d);
}
.island-bar.ib-static { cursor: default; }
/* Contenuto CENTRATO NELLA COLONNA (640px come #views): su schermi larghi frecce e nome non
   finiscono più agli estremi dello schermo ma restano nella colonna di gioco.
   touch-action: pan-y → lo swipe ORIZZONTALE resta al nostro handler (isola prev/next) mentre
   lo scroll verticale della pagina passa oltre (iOS/Android non "rubano" il gesto). */
.island-bar { z-index: 31; touch-action: pan-y; }
.island-bar .ib-in { position: relative; display: flex; align-items: center; gap: 8px; width: 100%; max-width: 640px; margin: 0 auto; }
.island-bar .ib-line { flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--bronze-d)); }
.island-bar .ib-line-r { background: linear-gradient(90deg, var(--bronze-d), transparent); }
.island-bar .ib-name { font-weight: 700; line-height: 1; transform: translateY(1px); text-shadow: 0 1px 2px rgba(0,0,0,.6); }
.island-bar .ib-coords { font-size: 11px; letter-spacing: 1px; color: var(--patina); font-variant-numeric: tabular-nums; transform: translateY(1px); }
.island-bar .pid-edit { font-size: 12px; }
/* Freccette ‹ › agli estremi della colonna: isola precedente/successiva (ciclico). Area di
   tocco generosa, glifo d'ottone; si accendono d'ambra al tap. */
/* Il glifo ‹ › "casca" basso nella sua cassa tipografica: padding-bottom nella flombox lo
   ricentra otticamente sulla riga del nome (leggerissimo offset verso l'alto). */
.island-bar .ib-arr { flex: none; width: 34px; height: 28px; margin: -2px -6px; padding: 0 0 2px; border: none; background: none;
  color: var(--brass); font-family: var(--font-display); font-size: 22px; line-height: 1; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; }
.island-bar .ib-arr:active { color: var(--amber-l); }
/* Tendina IN-PLACE: si apre da SOTTO il selettore (niente più drawer dal fondo — costringeva
   la mano a scendere fino al footer). Pannello ancorato alla barra, largo quanto la colonna. */
.islbar-drop { position: fixed; left: 50%; width: 100%; max-width: 640px; z-index: 59;
  /* EDGE TO EDGE (16/08/2026, come le barre-risorsa sotto l'header): niente padding laterale
     ne' superiore — le placche-isola corrono da bordo a bordo e la prima tocca subito l'header.
     Il fondo resta 4: sotto c'e' la riga dei totali, testo nudo appoggiato all'elenco. */
  padding: 0 0 4px;
  /* Estensione dell'header (l'«ether»): stessa famiglia navy (topbar #1d2a3b→#121a27), un filo
     più scura così legge come continuazione dell'header e non come un pannello grigio a parte. */
  background: linear-gradient(180deg, #141d29, #0d1420);
  border: 1px solid var(--bronze-d); border-top: none; border-radius: 0 0 12px 12px;
  box-shadow: 0 14px 30px rgba(0,0,0,.6), inset 0 -1px 0 var(--edge-hi);
  animation: ibddn .16s ease-out; transform: translateX(-50%); }
@keyframes ibddn { from { opacity: .35; transform: translateX(-50%) translateY(-8px); } to { opacity: 1; transform: translateX(-50%); } }
.islbar-drop.ibd-closing { animation: ibdup2 .15s ease-in forwards; }
@keyframes ibdup2 { from { opacity: 1; transform: translateX(-50%); } to { opacity: 0; transform: translateX(-50%) translateY(-8px); } }
/* Ogni isola è una PLACCA tinta del SUO colore identità (--row-col): niente ping, il colore
   vive nello sfondo (gradiente laterale) così si distingue a colpo d'occhio quale isola è quale. */
.islbar-drop .ib-row {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; column-gap: 10px; width: 100%; min-height: 48px; padding: var(--sp-4) var(--sp-12); margin: 0;
  /* Colore-isola RICCO: mescolato con un blu scuro (non 'transparent' sopra un pannello chiaro,
     che dava l'effetto pastello/slavato). Da saturo a sinistra a navy profondo a destra.
     29/07: l'estremo chiaro sceso da 72% a 52% — a schermo intero le tre placche affiancate
     facevano una fascia luminosa che tirava l'occhio via dal contenuto e dava fastidio. La
     tinta si riconosce ancora a colpo d'occhio, ma sta sotto al testo invece che sopra. */
  /* 16/08/2026: a tutta larghezza le placche al 52% erano TROPPO chiare, al 20% quasi
     indistinguibili. Punto d'equilibrio 32%→15%: la tinta identita' si riconosce al volo,
     ma la tendina resta della stessa famiglia scura del topbar. */
  background: linear-gradient(90deg,
    color-mix(in srgb, var(--row-col, #5b87c9) 32%, #0c111a),
    color-mix(in srgb, var(--row-col, #5b87c9) 15%, #0c111a) 62%,
    #0f1622 92%);
  /* EDGE TO EDGE (16/08/2026): placche contigue a tutta larghezza, come le barre-risorsa
     sotto l'header. UN SOLO filo tra una e l'altra: ogni riga porta solo il border-bottom,
     i lati li fa il bordo della tendina, e niente ombra esterna che sporcherebbe la placca
     sotto. Angoli vivi: la tessera non e' piu' un'isola nel pannello, E' la riga. */
  border: none; border-bottom: 1px solid var(--bronze-d);
  border-radius: 0; cursor: pointer; text-align: left; color: var(--ink); font: inherit;
  box-shadow: inset 0 1px 0 var(--edge-hi);
  transition: border-color .12s, transform .04s;
}
/* LA RIGA DEI TOTALI, in fondo. Stessa griglia delle righe-isola — `1fr auto` fuori e le tre
   colonne da 46px dentro — perche' il suo lavoro e' proprio quello: stare INCOLONNATA sotto le
   tre risorse, cosi' la somma si legge sotto i suoi addendi senza doverla cercare.
   NIENTE LINEA DI SEPARAZIONE e margini stretti: la riga e' gia' l'ultima e non ha colore
   d'isola, quindi si stacca da sola. Una linea piu' lo spazio che le serve intorno costavano
   quasi quanto una quarta isola, per dire una cosa che si vedeva gia'.
   E i numeri sono gli STESSI delle righe sopra — stesso corpo, stesso verde, stesso peso: sono
   la somma di quelli, non un titolo. In grassetto e piu' grandi sembravano la voce principale e
   le isole il dettaglio, che e' il contrario di come si legge questa tendina. */
.islbar-drop .ib-tot {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; column-gap: 10px; width: 100%; margin-top: 4px;
  /* Le righe-isola edge-to-edge non hanno piu' bordi laterali: la loro gronda e' il solo
     padding da 12. Qui idem — niente bordo-fantasma, stesso 12 — e le colonne combaciano. */
  padding: 0 12px; border: none; }
.islbar-drop .ib-tot .ib-nm { font-size: 11px; color: var(--ink-dim); font-weight: 600; }
/* TUTTI SULLA STESSA RIGA DI SCRITTURA. `center` allinea i CENTRI delle scatole: con
   l'etichetta a 11 e i numeri a 10 le quattro basi cadevano a quote diverse di poco — quel poco
   che basta perche' la riga sembri storta senza che si capisca perche'. `baseline` allinea il
   piede delle lettere, che e' come si legge una riga di testo. */
.islbar-drop .ib-tot,
.islbar-drop .ib-tot .ib-right,
.islbar-drop .ib-tot .ib-res { align-items: baseline; }
.islbar-drop .ib-tot .ib-r { justify-content: center; }
.islbar-drop .ib-row:active { transform: translateY(1px); }
/* Isola ATTIVA: bordo OTTONE come le altre e come il bordo inferiore dell'header (coerenza
   grafica); la selezione si legge dal velo caldo + anello ambra INTERNO (niente cornice gialla). */
/* Isola ATTIVA, quarta passata (16/08/2026): SOLO CONTORNO — anello ambra pieno e basta,
   niente velo caldo dentro («solo outline, non applicare film velatino»). Il fondo resta
   quello delle sorelle, col suo velo d'identita'. */
.islbar-drop .ib-row.on {
  border-color: var(--amber);
  box-shadow: inset 0 1px 0 var(--edge-hi), inset 0 0 0 1px var(--amber);
}
/* Nome + coord sulla STESSA riga a sinistra: la coord siede appena a destra del nome (non più in
   una colonna staccata). min-width:0 sul nome così l'ellissi scatta e la coord non viene spinta via. */
.islbar-drop .ib-row .ib-hd { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.islbar-drop .ib-row .ib-nm { font-family: var(--font-display); font-size: 11px; letter-spacing: .5px; color: var(--brass-l); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.islbar-drop .ib-row.on .ib-nm { color: var(--amber-l); }
.islbar-drop .ib-row .ib-co { font-size: 10px; color: var(--patina); font-variant-numeric: tabular-nums; flex: none; }
/* SINISTRA: su MOBILE impilata (nome sopra, «Liv. N · coord» sotto); su DESKTOP tutto su UNA riga
   (nome + livello·coord a destra del nome), allineato a sinistra. */
.islbar-drop .ib-row .ib-hd { flex-direction: column; align-items: flex-start; gap: 2px; }
.islbar-drop .ib-row .ib-sub { font-size: 10px; color: var(--patina); font-variant-numeric: tabular-nums;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
@media (min-width: 620px) {
  .islbar-drop .ib-row .ib-hd { flex-direction: row; align-items: baseline; gap: 8px; }
  .islbar-drop .ib-row .ib-sub { flex: none; }
}
/* Livello GIALLO (più visibile del patina): è il primo token della sotto-riga. */
.islbar-drop .ib-row .ib-sub .ib-lv, .islbar-drop .ib-row .ib-lv { color: var(--amber-l); font-weight: 700; }
/* DESTRA in RIGA: slot navi a SINISTRA della produzione (stessa riga orizzontale), allineati a destra. */
.islbar-drop .ib-row .ib-right { display: flex; flex-direction: row; align-items: center; justify-content: flex-end; gap: 10px; }
.islbar-drop .ib-row .ib-ships { font-size: 10px; color: var(--patina); font-variant-numeric: tabular-nums;
  display: inline-flex; align-items: center; gap: 4px; line-height: 1; flex: none; }
.islbar-drop .ib-row .ib-ships .gi { width: 12px; height: 12px; flex: none; opacity: .85; }
/* Produzione oraria in verde piccola SOTTO la barretta (come il +/h dell'header). */
.islbar-drop .ib-rp { font-size: 10px; line-height: 1; color: var(--good); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Colonna stock: 3 celle FISSE, icona+valore con SOTTO un GAUGE incassato (fill ottone; ruggine
   quando il deposito è quasi pieno) — stessa lingua delle barre del gioco. */
.islbar-drop .ib-res { display: grid; grid-template-columns: repeat(3, 46px); column-gap: 8px; justify-content: end; }
.islbar-drop .ib-r { display: flex; flex-direction: column; gap: 2px; }
.islbar-drop .ib-rv { display: inline-flex; align-items: center; gap: 2px; font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; white-space: nowrap; }
.islbar-drop .ib-rv .ricon { width: 11px; height: 11px; flex: none; }
.islbar-drop .ib-rbar { height: 4px; border-radius: 4px; background: #0c1016; overflow: hidden;
  border: 1px solid rgba(0,0,0,.5); box-shadow: inset 0 1px 2px rgba(0,0,0,.7); }
.islbar-drop .ib-rbar > i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(180deg, var(--brass-l), var(--bronze)); }
.islbar-drop .ib-rbar.full > i { background: linear-gradient(180deg, #c86a4a, var(--rust)); }
/* Toggle "Impero" della Panoramica: interruttore d'ottone, allineato a destra su una riga sola.
   Binario scuro incassato; pomello d'ottone che scorre; acceso = velo ambra (niente glow). */
.pano-empire { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin: 0 2px 10px; }
.pano-empire .pe-lbl { font-size: 12px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase; color: var(--ink-dim); display: inline-flex; align-items: center; gap: 4px; }
.pano-empire .pe-lbl .gi { width: 14px; height: 14px; }
.cf-toggle {
  position: relative; width: 44px; height: 24px; padding: 0; cursor: pointer; border-radius: 999px;
  background: linear-gradient(180deg, #0c1116, #141c24); border: 1px solid var(--bronze-d);
  box-shadow: inset 0 2px 4px rgba(0,0,0,.6);
  transition: background .15s, border-color .15s;
}
.cf-toggle > i {
  position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%;
  background: linear-gradient(180deg, #3a4550, #232c34); border: 1px solid #0b0f13;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.18), 0 1px 3px rgba(0,0,0,.5);
  transition: left .16s ease, background .15s;
}
.cf-toggle.on { background: linear-gradient(180deg, rgba(233,181,74,.30), rgba(233,181,74,.14)); border-color: var(--amber); }
.cf-toggle.on > i { left: 22px; background: linear-gradient(180deg, var(--brass-l), var(--bronze)); border-color: #5d4828; }

/* Strip Isola: gruppi SEPARATI (Costruzioni / Flotta), ognuno espandibile → la sua coda + ETA. */
.ps-expandable { padding: 0; }
.ps-group + .ps-group { border-top: 1px solid rgba(255,255,255,.06); }
/* Strip Azioni: niente rail sinistro colorato (l'icona di categoria basta come indicatore). */
.ps-group.ps-acc { position: relative; }
/* In una strip espandibile (padding:0) SOLO la war row (riga piatta, figlia diretta) perde
   l'inset: glielo ridò e la separo dai gruppi sotto. NB: figlia DIRETTA, così non tocco le
   .ps-row dentro i toggle (Isola/Azioni/gilda) che hanno già il loro padding. */
.ps-expandable > .ps-war { padding: 4px 12px; }
.ps-war + .ps-group { border-top: 1px solid rgba(255,255,255,.06); }
/* Spedizione di gilda estesa: UNA riga con tutti i capitani in orizzontale; l'eccedenza scorre (swipe). */
.ps-gexp-row { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.ps-gexp-row::-webkit-scrollbar { display: none; }
.ps-gexp-chip {
  flex: none; white-space: nowrap; font-size: 10px; line-height: 1;
  padding: 4px 8px; border-radius: 999px; color: var(--ink-dim);
  background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.07);
  font-variant-numeric: tabular-nums;
}
.ps-gexp-chip.me { color: var(--amber-l); border-color: rgba(233,181,74,.4); background: rgba(233,181,74,.1); }
/* Leader della lobby: Fondatore = arancione, Ufficiale = viola (identifica chi ha indetto la spedizione) */
.ps-gexp-chip.lead-admin { color: #f0a24b; border-color: rgba(240,162,75,.5); background: rgba(240,162,75,.12); }
.ps-gexp-chip.lead-off { color: #c79bf0; border-color: rgba(199,155,240,.5); background: rgba(199,155,240,.12); }
.ps-gexp-eta { margin-top: 6px; font-size: 11px; }
.ps-gexp-eta b { color: var(--brass-l); font-variant-numeric: tabular-nums; }
/* Dettaglio Guerra del Pinnacolo: fase attuale → prossima. */
.ps-war-phase { font-size: 11px; color: var(--ink); white-space: nowrap; }
.ps-war-phase .az-dir { margin: 0 4px; }

/* Note di aggiornamento (Impostazioni): collassabile + navigazione tra le patch. */
.pn-details > summary { cursor: pointer; list-style: none; user-select: none; }
.pn-details > summary::-webkit-details-marker { display: none; }
.pn-details > summary::after { content: "▸"; float: right; color: var(--brass-l); transition: transform .15s ease; }
.pn-details[open] > summary::after { transform: rotate(90deg); }
.pn-body { margin-top: 10px; }
.pn-nav { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.pn-arrow {
  flex: none; width: 26px; height: 26px; border-radius: 50%; cursor: pointer;
  background: var(--panel-2); border: 1px solid var(--bronze-d); color: var(--brass-l);
  font-size: 14px; line-height: 1; display: grid; place-items: center;
}
.pn-arrow:disabled { opacity: .3; cursor: default; }
.pn-head { flex: 1; min-width: 0; text-align: center; font-size: 13px; }
.pn-head .pn-sub { font-size: 11px; margin-top: 1px; }
.pn-count { font-size: 10px; margin-top: 1px; }
.pn-sec { margin-top: 8px; }
.pn-sec-t { font-size: 11px; font-weight: 700; color: var(--brass-l); margin-bottom: 2px; }
/* NIENTE PALLINI. Le voci di una nota di aggiornamento sono paragrafi, non un elenco della
   spesa: ognuna apre con la sua frase in grassetto, che e' gia' il suo capo. Il pallino
   davanti le faceva sembrare appunti, e su una sezione da una voce sola era un pallino
   solitario in mezzo al vuoto. Restano le voci separate, spaziate, senza segni. */
.pn-list { margin: 0; padding-left: 0; list-style: none; }
.pn-list li { font-size: 12px; color: var(--ink); margin: 0 0 8px; line-height: 1.45; }
.pn-list li:last-child { margin-bottom: 0; }
/* Direzione attacco: freccetta → in andata, ← in rientro (al posto delle emoji). */
.az-dir { color: var(--brass-l); font-weight: 700; }
.ps-toggle {
  display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 4px 12px; background: none; border: 0; cursor: pointer; text-align: left; color: inherit;
}
.ps-toggle .ps-row { flex: 1; min-width: 0; }
.ps-count { flex: none; min-width: 16px; text-align: center; font-size: 10px; color: var(--brass-l); font-variant-numeric: tabular-nums; }
.ps-chevron { flex: none; width: 9px; height: 9px; border-right: 1.5px solid var(--brass-l); border-bottom: 1.5px solid var(--brass-l);
  transform: rotate(45deg); margin-top: -2px; opacity: .8; transition: transform .18s ease; }
.ps-group.ps-open .ps-chevron { transform: rotate(225deg); margin-top: 2px; }
/* Slide fluido: l'altezza è guidata dalla Web Animations API (slideDetail in app.js) — una
   sola animazione ottimizzata invece del ricalcolo di grid-template-rows a ogni frame, che su
   mobile scattava. Lo stato a riposo è puro CSS (chiuso height:0, aperto height:auto); il fade
   dell'opacità resta in composizione GPU. */
.ps-detail { overflow: hidden; height: 0; }
.ps-group.ps-open .ps-detail { height: auto; }
.ps-detail-in { opacity: 0; transition: opacity .2s ease; will-change: opacity; }
.ps-group.ps-open .ps-detail-in { opacity: 1; }
.ps-detail-pad { padding: 4px 12px; }   /* simmetrico + compatto → contenuto centrato, area più piccola */
.ps-drow { display: flex; align-items: center; gap: 8px; padding: 4px 0; border-top: 1px solid rgba(255,255,255,.05); font-size: 11px; }
.ps-drow:first-child { border-top: 0; }   /* niente linea sopra la prima riga: centra il singolo item */
/* X per annullare una costruzione in attesa: a DESTRA, subito prima del tempo (dove stava la
   vecchia icona pausa, ora rimossa). Placeholder ps-dx-sp per le righe non annullabili, così
   i tempi restano allineati in colonna. */
.ps-dx { flex: none; width: 16px; height: 16px; padding: 0; border: 0; background: none; cursor: pointer;
  color: var(--ink-dim); font-size: 12px; line-height: 1; border-radius: 4px; transition: color .12s, background .12s; }
.ps-dx:hover { color: #e6604d; background: rgba(230,96,77,.14); }
.ps-dx-sp { flex: none; width: 16px; }
.ps-dico { flex: none; width: 14px; text-align: center; }
.ps-dico .gi { width: 12px; height: 12px; opacity: .85; }
.ps-dname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
.ps-dtime { flex: none; min-width: 52px; text-align: right; font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
/* Riga in attesa: durata di produzione FERMA (non un countdown), solo attenuata. L'icona pausa
   che stava qui è stata rimossa: quel posto ora è della X di annullamento (vedi .ps-dx). */
.ps-drow.is-waiting .ps-dtime { opacity: .6; }
.ps-dempty { padding: 4px 0; }
.ps-dtotal { display: flex; align-items: center; justify-content: space-between; gap: 8px;
  margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--bronze-d); font-size: 11px; }
.ps-dtot-t { display: inline-flex; align-items: center; gap: 4px; color: var(--brass-l); }
.ps-dtot-t .gi { width: 11px; height: 11px; }
.ps-dtot-t b { font-variant-numeric: tabular-nums; }

/* Phase-aware Guerra del Pinnacolo clock (bespoke strip row) — icon · bar · timer,
   all vertically centered on one line (fixed-width ends so nothing shifts). */
.ps-war { align-items: center; }
.ps-war-ico { flex: none; width: 16px; height: 14px; display: inline-flex; align-items: center; justify-content: center; }
.ps-war-ico .gi { width: 13px; height: 13px; }
.ps-war-bar { flex: 1; display: flex; align-items: center; }
.ps-war-bar .progress { flex: 1; height: 3px; margin-top: 0; border-radius: 4px; }
.ps-war-timer { flex: none; display: inline-flex; align-items: center; gap: 2px; min-width: 60px; justify-content: flex-end; line-height: 1; }
.ps-war-timer .gi { width: 10px; height: 10px; opacity: .8; }
.ps-war-timer .ps-time { min-width: 0; }
/* LIVE battle: red bar + blinking red dot (no label) */
.ps-war.is-live .progress > i { background: linear-gradient(90deg, #ff5436, #c4231b); }
.ps-war.is-live .ps-time { color: #ff9d85; }
.rec-dot { width: 8px; height: 8px; border-radius: 50%; background: #ff3b30; /* glow rimosso */ animation: recPulse 1.1s ease-in-out infinite; }
@keyframes recPulse { 0%, 100% { opacity: 1; } 50% { opacity: .18; } }

/* ---- Views ---- */
/* min-height:0 lets this flex child shrink and become the internal scroller, so the
   header + production strip stay pinned (an extension of the header) instead of the
   whole page scrolling and carrying the strip away. */
.views { flex: 1; min-height: 0; overflow-y: auto; padding: 14px 12px calc(var(--nav-h) + var(--safe-b) + 18px); -webkit-overflow-scrolling: touch; overscroll-behavior: contain; }
/* Centered like the rest of the layout, with fading rails on BOTH sides (matches .view-sep). */
.view-title {
  font-family: var(--font-display); font-size: 14px; letter-spacing: 3px; text-transform: uppercase;
  color: var(--brass-l); margin: 6px 2px 12px; display: flex; align-items: center; justify-content: center; gap: 8px;
  text-align: center;
}
.view-title::before { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--bronze-d)); }
.view-title::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, var(--bronze-d), transparent); }
/* Pulsante "indietro" nelle schermate di ricerca: fuori dal flusso, tutto a destra → il titolo
   resta centrato tra le linee decorative. */
.view-title.vt-back-wrap { position: relative; }
.view-title .vt-back { position: absolute; right: 0; top: 50%; transform: translateY(-50%); z-index: 1; }
.subtle { color: var(--ink-dim); font-size: 12px; }

/* ---- Panels / cards (forged modules) ---- */
.card {
  position: relative;
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid #0c1116; border-left: 3px solid var(--bronze-d);
  border-radius: var(--radius); padding: 12px; margin-bottom: 10px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35);
}
.card.resource { border-left-color: var(--good); }
.card.infra    { border-left-color: var(--brass); }
/* Solo la striscetta del bordo sinistro colorata per risorsa (sfondo card invariato):
   Legname = bruno scuro, Vapore = azzurro, Ottone = ocra. Wayfinding discreto. */
.card.res-legname { border-left-color: #8a5a30; }
.card.res-vapore  { border-left-color: #6fb2d8; }
.card.res-ottone  { border-left-color: #c99a3e; }
.card-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.card-head h3 { margin: 0; font-size: 14px; flex: 1; min-width: 0; font-weight: 700; letter-spacing: .2px; }
/* Icon medallion — beveled brass ring; drop a 42x42 <img> in later for real art. */
.icon-slot {
  flex: none; width: 44px; height: 44px; border-radius: 50%;
  background:
    radial-gradient(120% 120% at 30% 20%, var(--panel-2), var(--sky-0)),
    conic-gradient(from 210deg, var(--bronze-d), var(--brass-l), var(--bronze-d));
  background-clip: content-box, border-box; padding: 2px;
  border: 1px solid var(--brass-d); display: grid; place-items: center; position: relative;
  font-size: 22px; line-height: 1; overflow: hidden;
  box-shadow: inset 0 1px 2px rgba(255,235,190,.25), 0 2px 5px rgba(0,0,0,.45);
}
.icon-slot img { position: absolute; inset: 2px; width: calc(100% - 4px); height: calc(100% - 4px); object-fit: cover; border-radius: 50%; }
/* Brown-centred variant: matches the .gi-coin medallions (#241a0e) instead of the default
   slate/blue disc — for gold-framed yellow icons (Esercito Condiviso, Tesoro di Gilda). */
.icon-slot.is-brown { background:
  radial-gradient(120% 120% at 30% 20%, #3a2a12, #170f05),
  conic-gradient(from 210deg, var(--bronze-d), var(--brass-l), var(--bronze-d));
  background-clip: content-box, border-box; }
/* Spedizioni condivise: rarità dal livello di difficoltà. La prima (comune) resta MARRONE come
   il resto; le altre virano il medaglione + il velo della cornice della card (verde→blu→viola→
   arancio→rosso) per leggere la difficoltà a colpo d'occhio. Solo tinta, niente glow. */
.icon-slot.gexp-rar-0 { background: radial-gradient(120% 120% at 30% 20%, #3a2a12, #170f05), conic-gradient(from 210deg, var(--bronze-d), var(--brass-l), var(--bronze-d)); background-clip: content-box, border-box; }
.icon-slot.gexp-rar-1 { background: radial-gradient(120% 120% at 30% 20%, #123a2a, #06170f), conic-gradient(from 210deg, #2e6a52, #7fd4b3, #2e6a52); background-clip: content-box, border-box; border-color: #2e6a52; }
.icon-slot.gexp-rar-2 { background: radial-gradient(120% 120% at 30% 20%, #123048, #06121c), conic-gradient(from 210deg, #2f5f80, #86c4ec, #2f5f80); background-clip: content-box, border-box; border-color: #2f5f80; }
.icon-slot.gexp-rar-3 { background: radial-gradient(120% 120% at 30% 20%, #2a1c48, #120a24), conic-gradient(from 210deg, #5a4a9a, #b7a2ff, #5a4a9a); background-clip: content-box, border-box; border-color: #5a4a9a; }
.icon-slot.gexp-rar-4 { background: radial-gradient(120% 120% at 30% 20%, #4a2c10, #1c1005), conic-gradient(from 210deg, #a6621f, #f0b46c, #a6621f); background-clip: content-box, border-box; border-color: #a6621f; }
.icon-slot.gexp-rar-5 { background: radial-gradient(120% 120% at 30% 20%, #481414, #1c0707), conic-gradient(from 210deg, #a63a2f, #f08a7c, #a63a2f); background-clip: content-box, border-box; border-color: #a63a2f; }
.gexp-card { --gexp-c: var(--bronze); position: relative; overflow: hidden; }
/* IL POSTO DOVE SI VA, sotto la card — stessa grammatica della Grande Ricerca: immagine sotto,
   velatura scura sopra, contenuto al terzo piano. Sei difficolta', sei illustrazioni: prima
   erano sei card identiche distinte solo dal nome, e «Razzia del Baratro» e «Convoglio delle
   Nubi» si sceglievano leggendo, non guardando.
   La velatura non e' decorazione: sotto ci sono i capitani iscritti, la potenza combinata e la
   percentuale di riuscita — numeri, e su un fondo dipinto i numeri non si leggono. Verticale e
   piu' fitta scendendo, perche' e' scendendo che il testo si accumula. */
.gexp-card .gexp-bg { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0;
  object-fit: cover; object-position: center 42%; }
.gexp-card::before { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(180deg, rgba(9,13,18,.46) 0%, rgba(9,13,18,.80) 42%, rgba(9,13,18,.92) 100%); }
.gexp-card > *:not(.gexp-bg) { position: relative; z-index: 2; }
.gexp-card.gexp-rar-1 { --gexp-c: #7fd4b3; } .gexp-card.gexp-rar-2 { --gexp-c: #86c4ec; }
.gexp-card.gexp-rar-3 { --gexp-c: #b7a2ff; } .gexp-card.gexp-rar-4 { --gexp-c: #f0b46c; } .gexp-card.gexp-rar-5 { --gexp-c: #f08a7c; }
.gexp-card .gexp-head { cursor: pointer; }
.gexp-card .gexp-arrow { margin-left: auto; color: var(--gexp-c); font-size: 12px; opacity: .85; }
.gexp-card .gexp-head .chat-x { margin-left: 8px; }
/* Compositore INLINE sotto la card condivisa (tipo Attacco/Spedizioni): tag isola in cima
   SCORRIBILI in orizzontale (overflow nascosto → la pagina non si sposta), lista navi sotto. */
/* «Ripartizione equa» / «Per peso stiva» sono due meta' di UNA scelta, non due azioni diverse:
   quindi mezzo e mezzo, non ognuna larga quanto la sua etichetta. Le parole hanno lunghezze
   diverse e a larghezza libera uscivano due tasti scompagnati — e due tasti di misura diversa
   si leggono come «questo conta piu' di quello», che qui non e' vero. */
.gexp-split .btn { flex: 1 1 0; min-width: 0; }
.gexp-composer { margin-top: 10px; border-top: 1px solid var(--bronze-d); padding-top: 10px; }
/* Tag isola: SEMPRE su UNA riga (mai a capo) → scorrimento laterale, overflow nascosto. Sovrascrive
   il flex-wrap:wrap di .mkt-island-sel. */
.gexp-isles { display: flex; flex-wrap: nowrap !important; align-items: center; gap: 6px;
  overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch;
  touch-action: pan-x; scrollbar-width: none; margin: 0 -2px 8px; padding: 0 2px 2px; }
.gexp-isles::-webkit-scrollbar { display: none; }
.gexp-isles .isl-chip { flex: none; white-space: nowrap; }
/* Righe navi COMPATTE e di altezza UGUALE: niente wrap (lo stepper NON va a capo toccando titolo/
   giacenza), controlli piccoli, tasto Max QUADRATO. Su qualsiasi larghezza il rigo resta una riga. */
/* Niente `width: 100%` qui. La riga base porta un margine negativo (`margin: 0 -6px`) che le fa
   sbordare lo sfondo fino al bordo della card — e' cosi' in Spedizioni e in Attacco. Sommandoci
   una larghezza del 100% del contenitore, la riga partiva 6px piu' a sinistra restando larga
   quanto prima: risultato, 7px di margine a sinistra e 19 a destra. Asimmetrica, e si vedeva.
   Senza, la larghezza la decide il flusso e torna 7/7 come nelle altre due schermate. */
.gexp-composer .picker-ship { box-sizing: border-box; flex-wrap: nowrap !important; gap: 6px; align-items: center; padding: 6px 8px; }
.gexp-composer .picker-ship .ps-info { flex: 1 1 auto; min-width: 0; }
.gexp-composer .picker-ship .ps-head { min-width: 0; }
.gexp-composer .picker-ship .ps-head b, .gexp-composer .picker-ship .ps-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: inline-block; max-width: 100%; }
.gexp-composer .picker-ship .art-sm { --art: 40px; }
.gexp-composer .picker-ship .meta-stats { font-size: 10px; gap: 1px 10px !important; }
.gexp-composer .stepper { flex: none !important; gap: 2px; margin: 0 !important; }
.gexp-composer .stepper .btn { min-width: 22px; min-height: var(--btn-h-micro); width: 22px; padding: 0; font-size: 13px; }
.gexp-composer .stepper input { width: 30px; min-height: 24px; padding: 0 2px; }
/* Il moltiplicatore di passo (×1 → ×10 → ×100 → MAX): stesso tasto delle spedizioni singole.
   Qui deve stare piu' stretto perche' il compositore inline ha meno larghezza, ma l'etichetta
   «MAX» e' la piu' lunga e non deve andare a capo. */
/* Il moltiplicatore di passo cambia ETICHETTA a ogni tocco (×1 → ×10 → ×100 → MAX), e le quattro
   non sono larghe uguale. Con una larghezza `auto` il tasto si allargava su «×100» e su «MAX», e
   tutta la pulsantiera − 0 + slittava di lato sotto il dito: si mira a un tasto e se ne preme un
   altro. La larghezza qui NON si dichiara apposta — la eredita da `.picker-ship .step-mag`, che
   e' fissa a 36px per tutti e tre i selettori navi. Restano solo altezza e corpo, che nel
   compositore inline sono davvero piu' stretti. */
/* Nel compositore inline cambia solo l'ALTEZZA (le righe sono piu' strette). Larghezza, corpo e
   padding vengono dalla regola condivisa `.picker-ship .stepper .step-mag`, cosi' il tasto e'
   identico nei tre selettori navi e si ritara in un posto solo. */
.gexp-composer .stepper .step-mag { height: 24px; display: inline-flex; align-items: center; justify-content: center; }
.gexp-hint { font-size: 11px; line-height: 1.35; margin: 0 0 8px; color: var(--patina); }
.gexp-hint .gi { width: 12px; height: 12px; vertical-align: -2px; margin-right: 2px; }
/* Fallback NASCOSTO di default: compare solo se l'immagine manca davvero (onerror →
   .noart). Prima era visibile "sotto" l'art e lampeggiava a ogni re-render. */
.icon-slot .is-fallback { display: grid; place-items: center; visibility: hidden; }
.icon-slot.noart .is-fallback { visibility: visible; }

/* Art tile — framed illustration plate (ships now; buildings/tech later).
   Bigger than .icon-slot to give the artwork presence, with an emoji fallback
   layered underneath so a missing image degrades gracefully. */
.art-tile {
  position: relative; flex: none; width: var(--art, 87px); height: var(--art, 87px);
  border-radius: 12px; overflow: hidden;   /* no element border → the art fills edge-to-edge */
  background: radial-gradient(130% 130% at 30% 18%, var(--panel-2), var(--sky-0));
  box-shadow: inset 0 1px 0 rgba(255,235,190,.22), 0 3px 9px rgba(0,0,0,.45);
}
.art-tile .art-fallback { position: absolute; inset: 0; display: grid; place-items: center; font-size: 32px; line-height: 1; filter: drop-shadow(0 1px 2px rgba(0,0,0,.55)); visibility: hidden; }
.art-tile.noart .art-fallback { visibility: visible; }   /* solo quando l'art manca davvero */
.art-tile img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
.art-tile::after {  /* brass frame + glossy sheen — drawn ON TOP of the art (image fills the whole tile) */
  content: ""; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background: linear-gradient(180deg, rgba(255,245,225,.10), transparent 44%, rgba(0,0,0,.16));
  box-shadow: inset 0 0 0 1px var(--brass-d), inset 0 0 0 2px rgba(0,0,0,.4), inset 0 0 7px rgba(0,0,0,.12);
}
.card.locked .art-tile { filter: grayscale(.5); }
.art-tile.art-sm { --art: 46px; border-radius: 8px; }
.art-tile.art-sm .art-fallback { font-size: 18px; }
.lvl { color: var(--amber-l); font-weight: 700; font-size: 13px; white-space: nowrap; font-variant-numeric: tabular-nums; /* glow rimosso */ }
.card-body { margin-top: 6px; font-size: 13px; color: var(--ink-dim); }
.row { display: flex; flex-wrap: wrap; gap: 8px 12px; margin-top: 6px; align-items: center; }
.cost { display: inline-flex; align-items: center; gap: 4px; font-variant-numeric: tabular-nums; color: var(--ink); }
.cost.lack { color: var(--rust); }
/* Cost group used inline within a text line (banners, dialogs): keeps the individual
   .cost chips evenly spaced and vertically aligned with the surrounding label instead
   of jamming together with no gap. */
.cost-inline { display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap; vertical-align: middle; }
/* Costo×quantità nelle card navi/difese (stepper): stesso problema di .cost-inline —
   senza flex+gap i .cost interni si appiccicano ("57 114 209" tutto attaccato) e il
   timer della .row finisce disallineato. */
.cost-qty-row { display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap; min-width: 0; vertical-align: middle; }
/* «×3» davanti al costo: la riga mostra il totale del LOTTO accanto a un tempo che è per unità,
   e senza questa targhetta il totale si leggeva come un rincaro del prezzo unitario. */
.qty-mult { font-weight: 700; color: var(--amber-l); }
.card-actions { display: flex; gap: 8px; margin-top: 10px; align-items: center; }
.card-actions .btn { flex: 1; }
/* Compact upgrade button: doesn't stretch full-width (level-up CTAs). */
.card-actions .btn-compact { flex: 0 1 auto; align-self: flex-start; }

/* Compact "Lv up" square: black rounded up-arrow + tiny label, right-aligned beside cost/time
   (replaces the wide "Passa al livello" — frees horizontal space so cards stay tight). */
.lvlup-row { display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
.cost-grp { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.btn-lvlup {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  width: 56px; height: 17px; padding: 0; border-radius: 999px; cursor: pointer;
  background: linear-gradient(180deg, var(--brass-l), var(--bronze) 55%, var(--bronze-d));
  border: 1px solid var(--brass-d); box-shadow: inset 0 1px 0 rgba(255,235,190,.4), 0 2px 5px rgba(0,0,0,.4);
}
.btn-lvlup svg { width: 13px; height: 13px; display: block; }
.btn-lvlup svg path { fill: #0d0a02; stroke: #0d0a02; }
/* Disabled = fully opaque dull-grey pill (not translucent): with .btn-lvlup absolutely
   positioned over the tech-tree connector line, an opacity fade let the line bleed
   through the button. A solid muted background reads as "off" without the see-through. */
.btn-lvlup:disabled { opacity: 1; cursor: default; box-shadow: none;
  background: linear-gradient(180deg, #6b6a62, #4a4943 55%, #3a3933); border-color: #57554c; }
.btn-lvlup:disabled svg path { fill: #8b8880; stroke: #8b8880; }
.btn-lvlup:not(:disabled):active { filter: brightness(.9); }
/* Mounted in the tech-tree tile column: sits centred under the level pip. */
.tnode-tile .btn-lvlup { position: absolute; top: calc(100% + 15px); left: 4px; right: 4px; width: auto; z-index: 2; }
/* Short cards (e.g. Castoneria): reserve room for the mounted button so it never
   spills under the next node. tile 68 + gap 15 + button 17 + padding ≈ */
.tnode:has(.tnode-tile .btn-lvlup) { min-height: 120px; }
/* IL RIPENSAMENTO: per un minuto dall'ordine la pillola d'ottone porta ANNULLA al posto della
   freccia. Stessa pillola, stesso posto, stessa altezza — cambia solo il contenuto, così il
   dito lo ritrova dov'era. La freccia non viene rimossa dal DOM ma spenta (.is-off): allo
   scadere del minuto torna al suo posto senza ricostruire la pagina. */
.btn-lvlup.is-off { display: none; }
/* NIENTE maiuscolo: la pillola è larga 60px fissi (la incornicia il medaglione sopra) e le parole
   lunghe delle altre lingue — «Abbrechen», «Annuleren» — in maiuscolo ci sbattono contro. */
.btn-undo {
  font-size: var(--fs-xs); font-weight: 700; line-height: 1; color: #0d0a02;
  padding: 0 2px; overflow: hidden;
}
.btn-undo:not(:disabled):active { filter: brightness(.9); }
/* collapsed locked tech node: just the head (icon + name + level), tap to expand */
.lock-min { cursor: pointer; }
.lock-min .card-head { margin-bottom: 0; cursor: pointer; }
.lock-min .card-body { display: none; }
/* Il primo requisito mancante SULLA CARD CHIUSA: una riga sotto il nome, non un elenco. Serve
   la direzione, non l'inventario — l'elenco completo resta dentro, aprendola. La pastiglia e'
   la stessa dell'elenco (`.reqchip`), quindi porta anche al nodo che manca: e' insieme il
   motivo e la strada. Nessuna misura nuova: solo i passi della scala. */
.lock-why { display: flex; align-items: center; gap: var(--sp-6); flex-wrap: wrap;
  margin-top: var(--sp-6); }
.lock-why .subtle { font-size: var(--fs-sm); }
/* small inline energy saetta inside the upgrade-confirm popup lines */
.cf-line > span:first-child { display: inline-flex; align-items: center; gap: 4px; }   /* keeps the saetta vertically centred with "Consumo" */
.cf-line .ricon { width: 13px; height: 13px; margin: 0; }

/* progress: glowing energy conduit */
.progress { height: 7px; border-radius: 4px; background: var(--sky-0); overflow: hidden; margin-top: 8px; box-shadow: inset 0 1px 3px rgba(0,0,0,.6); }
.progress > i { display: block; height: 100%; width: 0; border-radius: 4px; background: linear-gradient(90deg, var(--bronze), var(--amber) 70%, var(--amber-l)); /* glow rimosso */ }
.timer { font-variant-numeric: tabular-nums; color: var(--ink); }

/* stepper */
.stepper { display: flex; align-items: center; gap: 6px; }
.stepper input { width: 56px; min-height: 36px; text-align: center; background: var(--sky-0); color: var(--ink); border: 1px solid #0b0f13; border-radius: var(--r-sm); font-size: 14px; box-shadow: inset 0 2px 4px rgba(0,0,0,.5); }
.stepper .btn { min-width: 36px; flex: none; }
/* Step-magnitude toggle: cycles the +/- increment ×1→×10→×100 (big fleets/cargo). FIXED width
   so "×1" and "×100" occupy the same box — no jitter as the label changes while navigating. */
.stepper .step-mag { width: 40px; min-width: 40px; flex: none; box-sizing: border-box;
  padding-left: 2px; padding-right: 2px; font-size: 11px; line-height: 1; white-space: nowrap;
  display: inline-flex; align-items: center; justify-content: center; overflow: hidden;
  font-variant-numeric: tabular-nums; color: var(--amber-l); border-color: var(--bronze-d); }
/* Variante compatta (Flotta/Difese): stessi tasti dell'attacco, occupano meno spazio orizzontale. */
.stepper-sm { gap: 2px; }
.stepper-sm .btn { min-width: 24px; min-height: var(--btn-h-xs); padding: 0 4px; font-size: 13px; }
.stepper-sm input { width: 34px; min-height: 28px; padding: 0 2px; font-size: 13px; border-radius: var(--r-sm); }
.stepper-sm .step-mag { width: 36px; min-width: 36px; font-size: 10px; }

/* Notification prefs (settings): brass toggle switches + per-row hints */
.ntoggle {
  flex: none; position: relative; width: 42px; height: 24px; padding: 0; cursor: pointer;
  border-radius: 999px; border: 1px solid var(--bronze-d);
  background: linear-gradient(180deg, #10181f, #1a252e);
  box-shadow: inset 0 2px 4px rgba(0,0,0,.55); transition: background .18s ease;
}
.ntoggle i {
  position: absolute; top: 2px; left: 2px; width: 18px; height: 18px; border-radius: 50%;
  background: linear-gradient(180deg, #8d9aa5, #5c6a76); transition: left .18s ease, background .18s ease;
  box-shadow: 0 1px 3px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.25);
}
.ntoggle.on { background: linear-gradient(180deg, var(--bronze-d), var(--bronze)); border-color: var(--brass-d); }
.ntoggle.on i { left: 20px; background: linear-gradient(180deg, var(--amber-l), var(--amber)); }
.ntoggle:disabled { opacity: .4; cursor: default; }
.np-hint { display: block; font-size: 10px; margin-top: 1px; }
.np-row.np-dim { opacity: .45; }
/* Notifiche push: header (master) fisso, lista tipi scorribile con margini stabili */
.np-head { padding-bottom: 10px; border-bottom: 1px solid var(--brass-d); }
.np-list { max-height: 46vh; overflow-y: auto; margin-top: 8px; padding-right: 4px; -webkit-overflow-scrolling: touch; }
.np-list .np-row { padding: 6px 0; border-bottom: 1px solid rgba(255,255,255,.05); }
.np-list .np-row:last-child { border-bottom: none; }
.np-lbl { font-size: 13px; }
.np-group {
  margin: 12px 0 2px; padding: 4px 0;
  font-family: "Cinzel", serif; font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
  color: var(--amber-l);
}
.np-group:first-child { margin-top: 0; }

/* Aiuto (in-game manual) + Segnala (alfa feedback) in settings */
.help-topic { border-bottom: 1px solid rgba(255,255,255,.06); padding: 4px 0; }
.help-topic:last-child { border-bottom: none; }
.help-topic summary { cursor: pointer; font-size: 13px; color: var(--amber-l); list-style: none; }
.help-topic summary::before { content: "▸ "; color: var(--bronze); }
.help-topic[open] summary::before { content: "▾ "; }
.help-topic p { font-size: 12px; line-height: 1.45; }
.fb-text {
  width: 100%; margin-top: 8px; padding: 8px 10px; resize: vertical; min-height: 64px;
  border-radius: 8px; border: 1px solid var(--bronze-d); color: var(--ink);
  background: linear-gradient(180deg, #10181f, #1a252e); box-shadow: inset 0 2px 4px rgba(0,0,0,.45);
  font: inherit; font-size: 13px;
}
.fb-text:focus { outline: none; border-color: var(--brass-d); }
.alfa-note { color: var(--amber-l); opacity: .85; font-size: 11px; }

/* chips (engraved tags) */
.chip { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; border: 1px solid var(--bronze-d); color: var(--ink-dim); background: rgba(0,0,0,.25); box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.chip.scout{color:#9fc0cb} .chip.cargo{color:#d8b06a} .chip.fighter{color:#e09877}
.chip.frigate{color:#c8bd77} .chip.cruiser{color:#d6897a} .chip.tank{color:#97aed3} .chip.capital{color:var(--amber-l)}
/* un numero che e' salito grazie ai bonus (potenza effettiva sopra quella di listino) */
.chip.good{color:var(--good)}
/* «regolatore N%» sulla card di una miniera: dice PERCHE' il numero e' basso e porta alla manopola.
   E' un bottone, quindi eredita font e cursore; ambrato perche' e' un avviso, non un errore. */
/* La pastiglia del regolatore vive in fondo alla riga dei costi, spinta a destra dallo
   `space-between` della riga. `flex:none` perche' non deve MAI stringersi: se cede lei, cede
   sul numero — «regolatore 9…%» e' peggio di non scriverlo. A cedere, semmai, e' il gruppo dei
   materiali, che ha `min-width:0` e sa andare a capo. */
.chip-thr{color:var(--amber-l);cursor:pointer;font-family:inherit;line-height:inherit;flex:none}
.chip-thr:active{filter:brightness(.9)}
.chip.titan{color:#f0c869; border-color:var(--brass); background:linear-gradient(180deg,rgba(120,84,26,.35),rgba(0,0,0,.3)); /* glow rimosso */ letter-spacing:.4px}
.chip.leviathan{color:#8fe6d0; border-color:#3f7f74; background:linear-gradient(180deg,rgba(20,90,80,.42),rgba(0,0,0,.35)); /* glow rimosso */ letter-spacing:.5px}
/* Engine-power slider — one compact row, minimal height */
.pw-row{display:flex;align-items:center;gap:8px;margin-top:8px;font-size:12px}
.pw-row .pw-lbl{color:var(--amber-l);white-space:nowrap;letter-spacing:.3px}
/* % value: FIXED width + tabular figures so the slider never shifts as 80→90→100 changes width. */
.pw-row .pw-pct{flex:none;width:42px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink)}
/* hint on its OWN line below → radical text changes (durata/vapore) never reflow the slider row. */
.pw-hint{margin-top:2px;text-align:right;font-size:11px;white-space:nowrap;min-height:14px}
.pw-slider{flex:1;min-width:80px;height:16px;-webkit-appearance:none;appearance:none;background:transparent;cursor:pointer}
.pw-slider::-webkit-slider-runnable-track{height:4px;border-radius:4px;background:linear-gradient(90deg,#6b4a1c,var(--brass))}
.pw-slider::-moz-range-track{height:4px;border-radius:4px;background:linear-gradient(90deg,#6b4a1c,var(--brass))}
.pw-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;margin-top:-4px;border-radius:50%;background:var(--amber-l);border:1px solid #2a1c08}
.pw-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--amber-l);border:1px solid #2a1c08}

.card.locked { opacity: .68; border-left-color: var(--slate-3); filter: grayscale(.25); }
.locked-note { flex: 1; font-size: 13px; color: var(--ink-dim); padding: 6px 0; }
.locked-note b { color: var(--brass-l); }

.rar-comune{color:var(--ink-dim)} .rar-raro{color:#6fc0aa} .rar-epico{color:#a98fe0} .rar-leggendario{color:var(--amber-l)} .rar-mitico{color:#e7627a}

/* Fleet composer row: ship art tile + name/stats + stepper with a Max shortcut.
   Selected rows glow amber so the composed fleet reads at a glance. */
.picker-ship { display: flex; justify-content: space-between; align-items: center; gap: 8px;
  padding: 6px 6px; margin: 0 -6px; border-radius: 8px; }
/* Niente riga tratteggiata fra una nave e l'altra. Le separa gia' tutto il resto — la tessera
   dell'arte, il salto di riga, la spaziatura — e il tratteggio aggiungeva rumore a una lista
   che di righe ne ha dieci. Vale per TUTTI i selettori navi: Spedizioni, Attacco, condivise. */
.picker-ship:last-of-type { border-bottom: none; }
.picker-ship .ps-info { flex: 1 1 auto; min-width: 58px; display: flex; flex-direction: column; gap: 2px; }
/* Riga 1: nome a sinistra, GIACENZA (×N) a destra. Riga 2: solo le statistiche.
   Il nome può andare a capo (niente "F..." troncato): la giacenza resta pinnata in alto a destra. */
.picker-ship .ps-head { display: flex; align-items: baseline; justify-content: flex-start; gap: 6px; }
/* Nome nave: non cresce (flex 0), così la giacenza ×N gli sta SUBITO a destra invece che spinta a fondo riga. */
.picker-ship .ps-head b { font-size: 13px; flex: 0 1 auto; min-width: 0; line-height: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.picker-ship .ps-own { margin-top: 0; }
.picker-ship .meta { font-size: 11px; color: var(--ink); font-variant-numeric: tabular-nums;
  display: flex; flex-wrap: wrap; gap: 2px 8px; align-items: center; }
/* Ogni coppia icona+valore resta UNITA anche andando a capo (niente simbolo staccato dal numero). */
.picker-ship .meta .stat { display: inline-flex; align-items: center; gap: 2px; white-space: nowrap; }
/* Ships-available count reads at a glance: bright amber, bold. */
.picker-ship .ps-own { flex: none; color: var(--amber-l); font-weight: 700; }
.picker-ship .ps-own small { color: var(--ink-dim); font-weight: 400; font-size: 10px; }
.picker-ship.sel { background: linear-gradient(90deg, rgba(233,181,74,.10), transparent 72%); }
.picker-ship.sel .art-tile { box-shadow: 0 0 0 1px var(--amber); }
/* Stepper compatto e meno invasivo (− valore + ×N Max): tasti piccoli, altezza contenuta. */
.picker-ship .stepper { gap: 2px; flex: none; }
.picker-ship .stepper .btn { min-width: 23px; min-height: var(--btn-h-xs); padding: 0 4px; font-size: 12px; }
.picker-ship .stepper input { width: 30px; min-height: 27px; padding: 0 2px; font-size: 12px; }
/* Il moltiplicatore di passo, in TUTTI e tre i selettori navi (Spedizioni, Attacco, condivise).
   `.picker-ship .stepper .btn` qui sopra ha la stessa specificita' e viene dopo, quindi vinceva
   lei: il corpo restava a 12px e il padding a 4, e «×100» chiedeva 33px di testo piu' 8 di
   padding dentro una scatola da 36 — sbordava, e non solo nel compositore di gilda.
   Un selettore in piu' (`.stepper`) la mette davanti, e le misure tornano a essere quelle
   pensate per questo tasto. La larghezza e' FISSA di proposito: l'etichetta cambia a ogni tocco
   (×1 → ×10 → ×100 → MAX) e se il tasto si allarga trascina con se' tutta la pulsantiera − 0 +,
   cioe' si mira a un tasto e se ne preme un altro. */
.picker-ship .stepper .step-mag { width: 36px; min-width: 36px; font-size: 10px; padding: 0; letter-spacing: -.2px; }
.picker-ship .ps-max { font-size: 10px; padding: 0 4px; }
.ps-max { font-size: 10px; letter-spacing: .6px; text-transform: uppercase; color: var(--brass-l); }
/* Telefoni stretti: lo stepper (−/valore/+/×N/Max) va a CAPO su una seconda riga allineata a
   destra, così su riga 1 nome+giacenza e stat hanno tutta la larghezza (niente nomi troncati né
   layout schiacciato dietro i tasti). L'art e le info restano in alto, i controlli sotto. */
@media (max-width: 430px) {
  .picker-ship { flex-wrap: wrap; align-items: center; }
  .picker-ship .ps-info { flex: 1 1 auto; min-width: 0; }
  .picker-ship .ps-head b { font-size: 13px; }
  .picker-ship .stepper { margin-left: auto; margin-top: 8px; }
}

/* Narrativa del rapporto: italico pulito, SENZA rail colorato a sinistra (era "slop"). */
.report { font-style: italic; color: var(--ink); }
.badge-ok { color: var(--good); font-weight:700; } .badge-fail { color: var(--rust); font-weight:700; }

/* --- Riepilogo scontro (rework grafico) --- */
.rep-battle { overflow: hidden; padding: 0; }
.rep-battle .card-body { padding: 12px 12px 12px; }
.rep-banner { display: flex; align-items: center; gap: 8px; padding: 8px 12px;
  border-bottom: 1px solid var(--bronze-d); font-family: var(--font-display); }
.rep-banner .rep-role { display: flex; align-items: center; gap: 4px; font-size: 12px; letter-spacing: .5px; color: var(--brass-l); text-transform: uppercase; }
.rep-banner .rep-role .gi { width: 16px; height: 16px; }
.rep-verdict { margin-left: auto; font-size: 14px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; }
.rep-flag { font-size: 10px; font-weight: 700; letter-spacing: .6px; text-transform: uppercase;
  padding: 2px 6px; border-radius: 4px; border: 1px solid var(--bronze-d); background: rgba(9,13,18,.5); color: var(--amber-l); }
.rep-b-win  { background: linear-gradient(90deg, rgba(74,168,110,.22), transparent); }
.rep-b-win  .rep-verdict { color: var(--good); }
.rep-b-loss { background: linear-gradient(90deg, rgba(196,74,58,.22), transparent); }
.rep-b-loss .rep-verdict { color: var(--rust); }
.rep-b-draw { background: linear-gradient(90deg, rgba(160,160,170,.16), transparent); }
.rep-b-draw .rep-verdict { color: var(--patina); }
/* Rapporto EVENTO (boss mondiale): tema viola (il plasma del colosso), diverso dal PvP. */
.rep-b-event { background: linear-gradient(90deg, rgba(158,101,214,.28), transparent); }
.rep-b-event .rep-verdict { color: #c79bf0; }
.rep-b-event .rep-role { color: #b892e6; }
.rep-event { border-color: rgba(158,101,214,.45);
  background: linear-gradient(180deg, rgba(158,101,214,.06), transparent 120px); }
.bf-boss { font-size: 12px; color: #cbb2ea; display: flex; align-items: center; gap: 6px;
  padding: 12px 10px; opacity: .95; border-radius: 8px;
  background: rgba(158,101,214,.1); border: 1px solid rgba(158,101,214,.28); }
.bf-boss .gi { width: 15px; height: 15px; }
/* Ritratto del colosso al posto dell'avatar nemico. */
.bf-boss-head { display: flex; flex-direction: column; align-items: center; gap: 6px; }
.bf-boss-av { width: 58px; height: 58px; border-radius: 12px; overflow: hidden; display: flex;
  align-items: center; justify-content: center; font-size: 30px;
  background: radial-gradient(circle at 50% 35%, rgba(158,101,214,.35), rgba(20,14,30,.9));
  border: 1px solid rgba(158,101,214,.5); }
.bf-boss-av .av-img { width: 100%; height: 100%; object-fit: cover; }
.bf-boss-av.dead { filter: grayscale(.6) brightness(.72); box-shadow: none;
  border-color: rgba(158,101,214,.3); }
.bf-boss-name { font-family: var(--font-display); font-size: 12px; color: #cbb2ea;
  letter-spacing: .4px; text-align: center; }
.rep-vs { font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.rep-vs b { color: var(--ink); }
/* «Lo scontro e' finito, le navi tornano»: il rapporto esce all'istante dello scontro, ma il
   bottino entra nella stiva all'atterraggio. Senza questa riga uno legge il bottino, va a
   cercarlo e non lo trova — e pensa a un furto. */
.rep-inflight { font-size: 11px; margin: var(--sp-6) 0 0; display: flex; align-items: center;
  gap: var(--sp-6); color: var(--amber-l); }
/* IL RITRATTO DELLA PREDA e tutto il resto alla sua destra: nome, tier, avviso di volo e le
   pillole di danno/perdite stanno in colonna accanto alla bestia, non sopra e sotto.
   `align-items: flex-start` e non `center`: la colonna di testo cresce di una riga quando la
   flotta sta ancora rientrando, e centrata faceva ballare il ritratto su e giu' fra una scheda
   e l'altra. La tessera e' quella della Chiamata alla caccia — stessa creatura, stessa faccia. */
.rep-preda { display: flex; align-items: flex-start; gap: var(--sp-10); }
.rep-preda-art { width: 56px; height: 56px; }
.rep-preda-art.noart { display: none; }   /* arte mancante: via la tessera, non un riquadro vuoto */
.rep-preda-testo { flex: 1; min-width: 0; }
.rep-preda-chip { margin: var(--sp-6) 0 0; }
.rep-story { font-style: italic; color: var(--ink); line-height: 1.45; margin: 6px 0 10px; font-size: 12px;
  border-left: 2px solid var(--brass); padding-left: 10px; }
.rep-story b { font-style: normal; color: var(--brass-l); }

.bf-grid { display: flex; flex-direction: column; gap: 6px; }
.bf-side { background: #0c1219; border: 1px solid var(--bronze-d); border-radius: 8px; padding: 8px 8px; }
/* Tu vs nemico: cornice tinta su TUTTI i lati + velo di sfondo appena percettibile
   (niente rail colorato su un solo lato — il bordo avatar + la didascalia bastano). */
.bf-mine  { border-color: rgba(202,162,74,.6); background: linear-gradient(180deg, rgba(233,181,74,.16), #0c1219 58%); }
.bf-enemy { border-color: rgba(176,79,74,.6); background: linear-gradient(180deg, rgba(190,90,74,.18), #0c1219 58%); }
.bf-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.bf-av.av-slot { width: 46px; height: 46px; }   /* batte .av-slot (40px), stessa specificità ma definita dopo */
.bf-av { width: 46px; height: 46px; border-radius: 8px; flex: none; overflow: hidden;
  border: 1px solid var(--bronze-d); box-shadow: inset 0 1px 0 var(--edge-hi); }
.bf-mine  .bf-av { border-color: var(--brass); }
.bf-enemy .bf-av { border-color: var(--rust); cursor: pointer; }
.bf-av .av-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.bf-who { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.bf-who > b { font-size: 13px; color: var(--ink); font-family: var(--font-display); letter-spacing: .3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bf-guild { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; color: var(--brass-l); cursor: pointer; width: fit-content; }
.bf-guild .crest-ic, .bf-guild .gi { width: 15px; height: 15px; }
.bf-gtag { color: var(--patina); font-weight: 700; }
.bf-head .bf-pow { margin-left: auto; font-family: var(--font-display); font-size: 13px; color: var(--ink); letter-spacing: .5px; flex: none; }
.bf-head .bf-pow::before { content: "⚔ "; color: var(--patina); }
.bf-cap { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--patina); margin: 0 0 6px 2px; }
/* Griglia a 5 COLONNE fisse: le tessere si adattano alla larghezza (più grandi che a 6/fila) e
   sono sempre 5 per riga in qualunque contenitore — niente wrap che a volte ne infila 6. */
.bf-units { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
/* Desktop: 6 tessere per riga (su schermo grande 5 risultavano troppo grandi). Mobile e tablet
   restano a 5 — breakpoint sopra il tablet landscape. */
@media (min-width: 1100px) { .bf-units { grid-template-columns: repeat(6, 1fr); } }
/* Desktop (≥900px): tessere ~20% più piccole OVUNQUE sulla classe (ordine 08/08/2026) —
   non un numero fisso di colonne ma celle a riempimento da ~86px: nel pannello Storico
   (griglia 572px) entrano 6 tessere da ~92px dove prima erano 5 da ~110. Vince sulla
   regola 1100px sopra perché viene dopo a pari specificità. */
@media (min-width: 900px) {
  .bf-units, #views .bf-units { grid-template-columns: repeat(auto-fill, minmax(86px, 1fr)); }
}
.bf-empty { grid-column: 1 / -1; font-size: 11px; color: var(--muted); font-style: italic; }
.bf-unit { position: relative; min-width: 0; }
/* Arte quadrata responsive: riempie la cella della griglia, la healthbar si ancora al suo fondo. */
.bf-art { position: relative; display: block; width: 100%; aspect-ratio: 1 / 1; }
.bf-unit .art-xs { width: 100%; height: 100%; border-radius: 8px; }
.art-xs { width: 46px; height: 46px; border-radius: 8px; }
/* Numero unità SPOSTATO nell'angolo alto-destra (prima copriva il bordo basso, dove ora vive la
   healthbar): pillola flottante come il badge perdite, ma a destra. */
.bf-unit .bf-ct { position: absolute; top: -5px; right: -4px; bottom: auto; font-size: 10px; font-weight: 700; color: var(--ink);
  background: rgba(9,13,18,.92); border: 1px solid var(--bronze-d); border-radius: 4px; padding: 0 4px; line-height: 15px; box-shadow: 0 1px 3px rgba(0,0,0,.5); }
/* Perdite: micro-badge bianco-su-rosso in alto a DESTRA, SOVRAPPOSTO al numero totale (ne copre il
   bordo basso, tipo pallino notifica) → resta leggibile il totale sotto, l'arte resta libera. */
.bf-unit .bf-lost { position: absolute; top: 7px; right: -3px; font-size: 7px; font-weight: 700; color: #fff;
  background: var(--rust); border: 1px solid rgba(0,0,0,.4); border-radius: 4px; padding: 0 2px; line-height: 11px; box-shadow: 0 1px 2px rgba(0,0,0,.6); }
.bf-unit.hit .art-tile { box-shadow: inset 0 0 0 1px rgba(196,74,58,.6); }
.bf-unit.wiped .art-tile { filter: grayscale(1) brightness(.5); }
/* Healthbar SOTTILISSIMA sul bordo basso dell'arte (~4px → copre quasi nulla): traccia scura +
   fill colorato per fascia. Dentro .bf-art → ancorata al fondo dell'ARTE, non della tessera.
   La % esatta vive nel tooltip (title), non a schermo, così la navicella resta visibile. */
.bf-hp { position: absolute; left: 4px; right: 4px; bottom: 2px; height: 4px; border-radius: 4px;
  background: rgba(6,9,13,.7); border: 1px solid rgba(0,0,0,.35); overflow: hidden;
  box-shadow: inset 0 1px 1px rgba(0,0,0,.45); }
.bf-hp i { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 4px; }
.bf-hp.hp-ok  i { background: linear-gradient(90deg, #3f7d4e, #5aa568); }
.bf-hp.hp-mid i { background: linear-gradient(90deg, #9c7a2e, #caa24a); }
.bf-hp.hp-low i { background: linear-gradient(90deg, #7d3a30, #b0504a); }
/* Nome sotto la tessera: le immagini navi si somigliano, quindi va scritto. Ancorato alla
   larghezza dell'immagine (58px) → mai overflow orizzontale; fino a 2 righe poi ellissi. */
.bf-name { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2;
  overflow: hidden; width: 100%; margin-top: 2px; text-align: center; color: #fff;
  font-size: 10px; line-height: 1.15; font-weight: 600; overflow-wrap: anywhere; }
.bf-power { height: 7px; border-radius: 4px; background: var(--rust); overflow: hidden;
  box-shadow: inset 0 1px 2px rgba(0,0,0,.6); }
.bf-power .bf-power-mine { display: block; height: 100%; background: linear-gradient(90deg, var(--brass), var(--brass-l)); border-radius: 4px; }
/* Tabellina round-per-round: navi residue di ciascun lato a ogni round. Testo, non grafici — si
   legge COME è andata e se il vantaggio si RIBALTA (la cella in testa, .rt-lead, cambia lato). */
.rep-rounds { margin-top: 10px; border: 1px solid var(--bronze-d); border-radius: 8px;
  background: #0c1219; overflow: hidden; }
.rt-title { padding: 8px 10px 2px; font-size: 11px; text-transform: uppercase; letter-spacing: .5px;
  color: var(--patina); font-weight: 700; }
.rt-title .gi { width: 13px; height: 13px; vertical-align: -2px; margin-right: 4px; }
.rt-title .rt-cap { display: block; margin-top: 2px; text-transform: none; letter-spacing: 0;
  font-weight: 400; font-style: italic; font-size: 10px; color: var(--muted); }
.rt { width: 100%; border-collapse: collapse; font-size: 12px; }
.rt th { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--patina);
  font-weight: 600; padding: 6px 10px; text-align: right; background: rgba(0,0,0,.2); }
.rt th.rt-lbl { text-align: left; }
/* Forze di partenza tra parentesi nell'intestazione (al posto della vecchia riga «inizio»). */
.rt th .rt-h0 { font-weight: 400; opacity: .75; font-size: 10px; }
.rt td { padding: 4px 10px; text-align: right; font-variant-numeric: tabular-nums; color: var(--ink-dim); }
.rt td.rt-lbl { text-align: left; color: var(--muted); font-size: 11px; }
.rt .rt-num td { border-top: 1px solid rgba(255,255,255,.05); }
.rt .rt-me { color: var(--brass-l); }
.rt .rt-en { color: var(--rust); }
/* Perdite di quel round, tra parentesi accanto al conteggio: più piccole e smorzate. */
.rt .rt-d { font-size: 10px; font-weight: 400; opacity: .68; }
/* Cella in testa quel round: più marcata → il ribaltamento salta all'occhio. */
.rt td.rt-lead { font-weight: 800; }
.rt td.rt-me.rt-lead { color: var(--brass-l); }
.rt td.rt-en.rt-lead { color: #d9756a; }
/* Riga-frase di interlinea: racconta lo scambio del round tra una riga-numeri e l'altra. Niente
   rail colorato a lato (regola dei bordi-accento) — colore nel testo + freccetta d'esito. */
.rt .rt-say td { padding: 4px 10px 4px; text-align: left; font-size: 10px; font-style: italic;
  color: var(--muted); background: rgba(0,0,0,.16); }
.rt .rt-say b { font-style: normal; font-weight: 700; }
.rt .rt-say .rt-mark { font-style: normal; font-weight: 800; margin-right: 6px; }
.rt .rt-say-win td { color: #b7c8a6; } .rt .rt-say-win .rt-mark { color: var(--good); }
.rt .rt-say-loss td { color: #d4aaa3; } .rt .rt-say-loss .rt-mark { color: var(--rust); }
.rt .rt-say-even .rt-mark { color: var(--patina); }
.rep-loot { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 10px; font-size: 12px; }
.rep-loot-lbl { font-size: 11px; color: var(--patina); text-transform: uppercase; letter-spacing: .5px; }
/* LA VITA DELLA PREDA nel rapporto di caccia. Stessa grammatica della barra delle navi — pieno
   a sinistra, colore che scende — ma alta e leggibile, perche' qui la barra E' il rapporto. Il
   morso di QUESTA sortita e' il segmento ruggine attaccato al pieno: si vede a colpo d'occhio
   quanto le hai tolto rispetto a quel che le restava. Niente glow: solo bordi e ombre interne. */
.boss-hp-wrap { margin: 6px 0 2px; }
.boss-hp-top, .boss-hp-foot { display: flex; align-items: baseline; justify-content: space-between;
  gap: 8px; font-size: 11px; }
.boss-hp-top b, .boss-hp-foot b { font-variant-numeric: tabular-nums; color: var(--ink); }
.boss-hp { display: flex; height: 8px; margin: 4px 0; border-radius: 4px; overflow: hidden;
  background: rgba(6,9,13,.7); border: 1px solid rgba(0,0,0,.45);
  box-shadow: inset 0 1px 2px rgba(0,0,0,.55); }
.boss-hp i { display: block; height: 100%; }
/* Il morso a RIGHE, non a tinta piatta: quando la preda e' gia' al lumicino il pieno e' rosso
   anche lui, e due rossi accostati diventano una barra sola. La rigatura dice «questo pezzo
   gliel'hai staccato tu» a qualunque livello di vita. */
.boss-hp .bh-hit { background: repeating-linear-gradient(135deg,
    rgba(214,108,74,.95) 0 3px, rgba(120,40,26,.95) 3px 6px);
  border-left: 1px solid rgba(0,0,0,.55); }
.boss-hp.bh-ok  .bh-left { background: linear-gradient(90deg, #3f7d4e, #5aa568); }
.boss-hp.bh-mid .bh-left { background: linear-gradient(90deg, #9c7a2e, #caa24a); }
.boss-hp.bh-low .bh-left { background: linear-gradient(90deg, #7d3a30, #b0504a); }
.boss-hp-foot .bh-dmg { display: inline-flex; align-items: center; gap: 4px; color: var(--rust-l); }
.boss-hp-foot .bh-dmg .gi { width: 12px; height: 12px; }
/* Quel che e' caduto: caselle d'inventario, non chip di testo. */
.rep-drop { margin-top: 8px; }
/* Fuori dalla griglia dell'inventario le caselle non hanno una colonna che le dimensioni:
   `aspect-ratio: 1` da solo le farebbe collassare sul contenuto. Larghezza esplicita. */
.rep-drop-slots { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.rep-drop-slots .inv-slot { width: 46px; flex: none; }
.rep-drop-hint { font-size: 10px; margin-top: 4px; }
/* Risorse/capitani nei rapporti condivisi: icona+numero (o nome) IN LINEA, senza pillole
   (il muro di round-box era pesante). Separati da spaziatura, non da box. */
.rep-res { display: inline-flex; align-items: center; gap: 2px; margin-right: 12px; color: var(--ink); font-variant-numeric: tabular-nums; }
.rep-res .ricon { width: 14px; height: 14px; }
.rep-cap { color: var(--ink); white-space: nowrap; }
.rep-cap:not(:last-child)::after { content: "·"; color: var(--ink-dim); margin: 0 6px; }
.rep-cap .gi { width: 12px; height: 12px; }

/* ---- Tech tree (Costruzioni / Ricerche) ---- */
.tech-lane { font-family: var(--font-display); font-size: 11px; letter-spacing: 2px; text-transform: uppercase; color: var(--patina); margin: 12px 2px 4px; }
.tech-lane:first-child { margin-top: 2px; }
.tech-tree { position: relative; }
/* LA FASCIA DI GRUPPO (16/08/2026): righe alterne «da tabella», ma la riga e' il GRUPPO —
   etichetta + corsia — e la velatura sta sullo sfondo dell'espandibile, DIETRO le card, a tutta
   larghezza (i -12px rientrano il padding di .acc-body-in). La fascia parte SOPRA l'etichetta del
   gruppo e muore prima dell'etichetta successiva. Per ora accesa solo su DEPOSITI (.tt-fascia
   assegnata in sectionCostruzioni). L'involucro .tt-gruppo e' trasparente: le due righe qui sotto
   restituiscono all'etichetta i margini che aveva da figlia diretta del corpo. */
.tt-gruppo > .tech-lane { margin-top: 12px; }
.tt-gruppo:first-child > .tech-lane { margin-top: 2px; }
.tt-fascia { background: linear-gradient(180deg, rgba(0, 0, 0, .26), rgba(0, 0, 0, .1)); margin: 10px -12px 0; padding: 10px 12px 12px; }
.tt-fascia > .tech-lane { margin-top: 0; }
.tnode { position: relative; display: grid; grid-template-columns: 76px 1fr; gap: 12px; padding: 8px 0; scroll-margin-top: 70px; }
/* SBARRATO dai lavori al Laboratorio: velo scuro su tutto il nodo + lucchetto d'ottone al centro.
   Il velo intercetta i click (niente tap accidentali sulle card sotto); il lucchetto sta sopra e
   spiega perché. Torna tutto normale appena il Laboratorio finisce. */
.tnode.lab-busy .tnode-art, .tnode.res-busy .tnode-art { filter: grayscale(.7) brightness(.38); }
.tnode-lock { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 4;
  width: 34px; height: 34px; display: grid; place-items: center; cursor: pointer;
  border: 1px solid var(--brass-d); border-radius: 50%; background: rgba(12,18,26,.9);
  color: var(--brass-l); padding: 0; transition: transform .12s, border-color .12s; }
.tnode-lock:hover { border-color: var(--brass-l); transform: translate(-50%, -50%) scale(1.08); }
.tnode-lock:active { transform: translate(-50%, -50%) scale(.95); }
.tnode-lock .gi { width: 16px; height: 16px; }
/* Connector spine — opt-in: only lanes that are a real dependency CHAIN draw it.
   Same-tier siblings (parallel lanes) get no spine. (16/08/2026: confermato dal committente
   «solo dove chains» — l'elenco delle corsie-catena sta in CHAIN_LANES, in app.js.) */
.tech-tree--chain .tnode::before {
  content: ""; position: absolute; left: 38px; top: 0; bottom: 0; width: 2px;
  background: rgba(135,106,62,.42);   /* uniform connector — no mid-strip colour shift */
}
.tech-tree--chain .tnode:first-child::before { top: 32px; }
.tech-tree--chain .tnode:last-child::before { bottom: auto; height: 32px; }
/* Rounded medallion (image-ready): emoji now, drop /assets/<kind>/<key>.jpg later. */
.tnode-tile {
  position: relative; width: 68px; height: 68px; z-index: 1; align-self: start; justify-self: center;
}
.tnode-art {
  position: absolute; inset: 0; border-radius: 15px; overflow: hidden; border: 1px solid var(--brass-d);
  background: radial-gradient(130% 130% at 32% 18%, var(--panel-2), var(--sky-0));
  box-shadow: inset 0 1px 0 rgba(255,235,190,.22), 0 3px 9px rgba(0,0,0,.5);
}
.tnode-art::after { content: ""; position: absolute; inset: 0; border-radius: 15px; background: linear-gradient(180deg, rgba(255,245,225,.14), transparent 42%, rgba(0,0,0,.3)); box-shadow: inset 0 0 0 1px rgba(0,0,0,.4); pointer-events: none; }
.tnode-art img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.tnode-lvl {
  position: absolute; bottom: -8px; left: 50%; transform: translateX(-50%); z-index: 3; white-space: nowrap;
  padding: 0 8px; height: 19px; line-height: 18px; text-align: center;
  border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: .2px;
  background: linear-gradient(180deg, var(--panel-2), var(--sky-0)); color: var(--amber-l);
  border: 1px solid var(--brass-d); box-shadow: 0 2px 4px rgba(0,0,0,.55);
}
/* Castone incastonato: badge SOLO-icona nell'angolo alto-destra del medaglione, tinto per
   rarità (nessun testo). Click → modale del castone (Disequipaggia). Più castoni si impilano. */
.tnode-gems { position: absolute; top: -7px; right: -7px; z-index: 4; display: flex; flex-direction: column; gap: 2px; }
/* Difese/altre card non-techNode: wrapper attorno all'art per ancorare il badge castone in alto a destra. */
.art-gem-wrap { position: relative; display: inline-block; flex: none; }
.gem-corner { width: 20px; height: 20px; padding: 0; display: grid; place-items: center; cursor: pointer;
  border-radius: 4px; background: radial-gradient(120% 120% at 30% 20%, #20262f, #0b0e13);
  border: 1px solid var(--bronze-d); box-shadow: 0 1px 4px rgba(0,0,0,.6); }
.gem-corner .gi { width: 13px; height: 13px; }
.gem-corner.rar-comune       { border-color: #9aa4b2; /* glow rimosso */ }
.gem-corner.rar-comune .gi   { filter: grayscale(1) brightness(1.6); }
.gem-corner.rar-raro         { border-color: #6fc0aa; /* glow rimosso */ }
.gem-corner.rar-raro .gi     { filter: hue-rotate(115deg) saturate(1.4); }
.gem-corner.rar-epico        { border-color: #a98fe0; /* glow rimosso */ }
.gem-corner.rar-epico .gi    { filter: hue-rotate(220deg) saturate(1.5) brightness(1.15); }
.gem-corner.rar-leggendario  { border-color: var(--amber-l); /* glow rimosso */ }
.gem-corner.rar-leggendario .gi { filter: brightness(1.15); }
.gem-corner.rar-mitico       { border-color: #e7627a; }
.gem-corner.rar-mitico .gi   { filter: hue-rotate(320deg) saturate(1.6) brightness(1.1); }
.gem-corner.unstable::after { content: ""; position: absolute; top: -2px; right: -2px; width: 6px; height: 6px; border-radius: 50%; background: #e0a63a; /* glow rimosso */ }
.gem-corner:active { transform: translateY(1px); }
.tnode.is-max .tnode-art { border-color: #7c571a; box-shadow: inset 0 1px 0 rgba(255,255,255,.4), 0 3px 9px rgba(0,0,0,.5); }
.tnode.is-max .tnode-lvl { color: #2c1e06; background: linear-gradient(180deg, var(--amber-l), var(--amber)); border-color: #7c571a; }
/* In-production glow: slow, soft LED breathing — l'alone ambra al picco è PRE-pittato su un
   ::after del tile (la art ha overflow:hidden) e respira in OPACITY (compositor, zero repaint). */
.tnode.is-building .tnode-tile::after { content: ""; position: absolute; inset: 0; border-radius: 15px; pointer-events: none; /* glow rimosso */ opacity: 0; animation: gpulse 3.6s ease-in-out infinite; }
.tnode.is-locked .tnode-art { filter: grayscale(.65) brightness(.82); }
.tnode.is-locked .tnode-tile::after { content: ""; position: absolute; top: -6px; right: -6px; z-index: 4; background: url("/assets/ui/padlock.svg") center/12px no-repeat, var(--sky-0); border: 1px solid var(--brass-d); border-radius: 50%; width: 21px; height: 21px; display: grid; place-items: center; box-shadow: 0 1px 3px rgba(0,0,0,.6); }
.tnode-body { min-width: 0; }
.tnode-body .card { margin-bottom: 0; }
.tnode-body .card.resource, .tnode-body .card.infra { border-left-width: 3px; }
/* LE DUE RICERCHE DI RILIEVO (16/08/2026, indicate a dito dal committente): Ponte di
   Colonizzazione (terraforming) in azzurro e Compressione Antimateriale in viola — bordo
   colorato su icona E card, NIENTE glow. Dopo .is-max a pari specificita': l'accento vince
   anche a ricerca completata. */
.tnode[data-node="research:terraforming"] .tnode-art,
.tnode[data-node="research:terraforming"] .tnode-body > .card { border-color: #5f93c4; }
.tnode[data-node="research:compressione_antimateriale"] .tnode-art,
.tnode[data-node="research:compressione_antimateriale"] .tnode-body > .card { border-color: var(--viola); }
/* La sbarratura da requisiti scolora l'intero .tnode-art, bordo compreso: sui due nodi di
   rilievo il velo passa alla sola immagine, cosi' il bordo tiene il suo colore. */
.tnode.is-locked[data-node="research:terraforming"] .tnode-art,
.tnode.is-locked[data-node="research:compressione_antimateriale"] .tnode-art { filter: none; }
.tnode.is-locked[data-node="research:terraforming"] .tnode-art img,
.tnode.is-locked[data-node="research:compressione_antimateriale"] .tnode-art img { filter: grayscale(.65) brightness(.82); }
/* path illumination: flash a prerequisite node, mark the locked source */
.tnode.req-flash .tnode-art { animation: reqflash 1s ease-in-out 2; }
@keyframes reqflash { 0%,100% { box-shadow: inset 0 1px 0 rgba(255,235,190,.22), 0 3px 9px rgba(0,0,0,.5); } 50% { box-shadow: 0 0 0 3px var(--amber); } }

/* Requirements panel on locked items (ships/defenses/techs) */
.reqs { margin-top: 4px; }
.reqs-title { font-size: 11px; letter-spacing: .4px; color: var(--brass-l); text-transform: uppercase; margin-bottom: 4px; }
.reqchip {
  display: inline-flex; align-items: center; gap: 4px; padding: 4px 8px; margin: 0 6px 6px 0; border-radius: 999px;
  font-size: 11px; font: inherit; font-size: 11px; cursor: default; border: 1px solid var(--bronze-d);
  background: rgba(0,0,0,.25); color: var(--ink-dim);
}
.reqchip.rq-ok { color: var(--good); border-color: rgba(121,192,140,.5); }
.reqchip.rq-no { color: #e6b89c; border-color: var(--rust); cursor: pointer; }
.reqchip.rq-no:active { transform: translateY(1px); }
.reqchip .rq-have { color: var(--ink-dim); font-size: 10px; }

/* ---- War alert banner ---- */
.warbar {
  /* In flow directly under the sticky header, above the build progress strip
     (order: header → alert → progress). The header's under-attack pulse stays the
     persistent indicator once this scrolls out of view. */
  position: relative; z-index: 19;
  background: linear-gradient(180deg, #5a1410, #350c08); color: #ffd9d2;
  border-bottom: 1px solid var(--rust); font-size: 12px; font-weight: 700; text-align: center;
  padding: 8px 12px; letter-spacing: .2px; box-shadow: 0 3px 12px rgba(0,0,0,.45);
}
.warbar .wb-acc { opacity: .75; font-weight: 600; }
/* battito delle barre d'avviso: velo in opacity (compositor), non brightness (repaint) */
.warbar::after, .guildfreebar::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: #fff; opacity: 0; --pk: .16; animation: gpulse 1.6s ease-in-out infinite; }

/* ---- Energy overload bar (thin strip under the header) ----
   Overclock (101–105%): amber, gentle pulse. Shutdown (>105%): red, faster red pulse. */
.energybar {
  position: relative; z-index: 19; text-align: center; padding: 4px 12px;
  font-size: 11px; font-weight: 800; letter-spacing: .4px; text-transform: uppercase;
  border-bottom: 1px solid; box-shadow: 0 2px 8px rgba(0,0,0,.4);
}
.energybar b { font-variant-numeric: tabular-nums; text-transform: none; }
.energybar.over {
  background: linear-gradient(180deg, #4a3810, #2c2107); color: var(--amber-l);
  border-bottom-color: var(--amber);
}
.energybar.down {
  background: linear-gradient(180deg, #5a1410, #350c08); color: #ffd9d2;
  border-bottom-color: var(--rust);
}
/* battito overload/blackout in opacity (compositor) al posto di brightness (repaint) */
.energybar::after { content: ""; position: absolute; inset: 0; pointer-events: none; background: #fff; opacity: 0; }
.energybar.over::after { --pk: .13; animation: gpulse 2.2s ease-in-out infinite; }
.energybar.down::after { --pk: .24; animation: gpulse 1s ease-in-out infinite; }

/* ---- Avviso novizi (azzurro, scudo, testo bianco) sotto l'header ---- */
.noticebar {
  position: relative; z-index: 19; text-align: center; padding: 8px 12px;
  background: linear-gradient(180deg, #1f5f96, #123f68); color: #fff;
  border-bottom: 1px solid #4f9fd6; font-size: 12px; font-weight: 700; letter-spacing: .2px;
  box-shadow: 0 3px 12px rgba(0,0,0,.4);
}
.noticebar .gi { filter: brightness(0) invert(1); vertical-align: -2px; }

/* ---- Evento mondiale: banner criptico della vigilia (viola notte, corsivo) ---- */
/* Marrone d'ottone come i drawer / il banner God Mode; testo in corsivo, nessuna icona. */
.cryptbar {
  position: relative; z-index: 19; text-align: center; padding: 8px 12px;
  background: linear-gradient(180deg, #2a1f10, #180f06); color: var(--brass-l);
  border-bottom: 1px solid var(--bronze-d); font-size: 12px; font-style: italic; letter-spacing: .3px;
  box-shadow: 0 3px 12px rgba(0,0,0,.45);
}
.cryptbar i { font-style: italic; }

/* ---- Avviso one-time selettore isola: marrone/oro (come il cryptbar/drawer), bordo d'ottone,
   edge-to-edge sotto il selettore. Sparisce per sempre al primo tocco del selettore. ---- */
.islbar-hint {
  position: relative; z-index: 18; text-align: center; padding: 8px 12px;
  background: linear-gradient(180deg, #2a1f10, #180f06); color: var(--brass-l);
  border-bottom: 1px solid var(--bronze-d); border-top: 1px solid var(--brass-d);
  font-size: 12px; font-weight: 600; letter-spacing: .2px;
  box-shadow: 0 3px 12px rgba(0,0,0,.4);
  animation: ibHintIn .35s ease-out;
}
.islbar-hint b { color: #fff; font-weight: 700; }
.islbar-hint .gi { filter: brightness(0) invert(.86) sepia(.4) saturate(3) hue-rotate(3deg); vertical-align: -2px; }
@keyframes ibHintIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }

/* ---- Richiamo alle armi: fascia della mobilitazione del Pinnacolo ----
   Stesse misure della fascia dell'energia (e' lo stesso posto e devono sembrare parenti), ma
   fondo di guerra e scritta d'ottone: il rosso dice che c'e' una scadenza, l'oro che e' roba
   di gilda e non un guasto. Niente aloni: bordo sopra e sotto e ombra scura, come da regola. */
.mobilbar {
  position: relative; z-index: var(--z-hud); text-align: center; padding: var(--sp-4) var(--sp-12);
  font-size: 11px; font-weight: 800; letter-spacing: .4px; text-transform: uppercase;
  background: linear-gradient(180deg, #4a1410, #2b0a08);
  color: var(--brass-l);
  border-top: 1px solid var(--bronze-d); border-bottom: 1px solid var(--brass);
  box-shadow: 0 2px 8px rgba(0,0,0,.4);
}
.mobilbar { cursor: pointer; }   /* si tocca per metterla via: il popup chiede conferma */
.mobilbar .gi { vertical-align: -2px; margin-right: var(--sp-6); }
/* Il tempo che resta e' l'unica parte che cambia da sola: cifre a passo fisso, cosi' la fascia
   non balla a ogni secondo, e in ottone chiaro perche' e' LEI la notizia. */
.mobilbar b { font-variant-numeric: tabular-nums; text-transform: none; color: #f4d9a4; }
.mobilbar .mb-sep { opacity: .5; margin: 0 var(--sp-6); }

/* ---- Miniere ferme ----
   Stesse misure delle due fasce qui sopra: e' lo stesso posto e devono sembrare parenti. Il
   colore no: niente rosso di guerra e niente ambra d'allarme, ma il grigio-ferro di una macchina
   spenta. Non c'e' niente da fare e niente da temere, e' uno stato che scade da solo — e il
   giocatore deve leggerlo in mezzo secondo senza spaventarsi. Non e' cliccabile di proposito:
   non si mette via, perche' non e' un avviso, e' una condizione. */
.minebar {
  position: relative; z-index: var(--z-hud); text-align: center; padding: var(--sp-4) var(--sp-12);
  font-size: 11px; font-weight: 800; letter-spacing: .4px; text-transform: uppercase;
  background: linear-gradient(180deg, #232a30, #14191d);
  color: #b8a883;
  border-top: 1px solid #3a4249; border-bottom: 1px solid var(--bronze-d);
  box-shadow: 0 2px 8px rgba(0,0,0,.4);
}
.minebar .gi { vertical-align: -2px; margin-right: var(--sp-6); opacity: .75; }
.minebar b { font-variant-numeric: tabular-nums; text-transform: none; color: #e6d7b4; }
.minebar .mb-sep { opacity: .5; margin: 0 var(--sp-6); }

/* ---- Annuncio server effimero (Anello Mitico droppato): banner rosso-mitico, 15s ---- */
.announcebar {
  position: relative; z-index: 19; text-align: center; padding: 8px 12px;
  background: linear-gradient(180deg, #3a1420, #24030d); color: #f3d9df;
  border-bottom: 1px solid #e7627a; font-size: 12px; font-weight: 700; letter-spacing: .2px;
  animation: announcePop .35s ease-out;
}
.announcebar .rar-mitico { color: #ff8098; }
.announcebar .gi { vertical-align: -2px; }
.announcebar .subtle { color: #d69fab; font-weight: 600; }
@keyframes announcePop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) { .announcebar { animation: none; } }

/* ---- Evento gilda gratis (rosso pulsante, timer) sotto l'header ---- */
.guildfreebar {
  position: relative; z-index: 19; text-align: center; padding: 8px 12px;
  background: linear-gradient(180deg, #5a1410, #350c08); color: #ffd9d2;
  border-bottom: 1px solid var(--rust); font-size: 12px; font-weight: 700; letter-spacing: .2px;
  box-shadow: 0 3px 12px rgba(0,0,0,.45);
}
.guildfreebar b { font-variant-numeric: tabular-nums; }

/* Alone di stato — ambra in overclock, rosso in spegnimento. Applicato alla card MACRO
   Energia (l'accordion parent, tra Costruzioni e Ricerche) e al box Regolazione produzione,
   NON alla barra di carico interna. */
.accordion.en-over, .throttle-panel.over { box-shadow: 0 0 0 1px rgba(233,181,74,.35); }
.accordion.en-down, .throttle-panel.down { box-shadow: 0 0 0 1px rgba(196,60,40,.5); }
/* respiro in opacity (compositor): alone base fisso sull'elemento, bagliore interno che
   pulsa sull'::after (overflow:hidden clipperebbe un glow esterno del pseudo) */
.accordion.en-over::after, .throttle-panel.over::after { content: ""; position: absolute; inset: 0; pointer-events: none; box-shadow: inset 0 0 0 1px rgba(233,181,74,.5); opacity: 0; animation: gpulse 2.2s ease-in-out infinite; }
.accordion.en-down::after, .throttle-panel.down::after { content: ""; position: absolute; inset: 0; pointer-events: none; box-shadow: inset 0 0 0 1px rgba(224,72,50,.7); opacity: 0; animation: gpulse 1s ease-in-out infinite; }
/* Il box Regolazione produzione pulsa in CONTROFASE (battere e levare) rispetto alla card
   macro: sfasato di metà periodo con animation-delay negativo. Attira l'occhio sui comandi. */
.throttle-panel.over { animation-delay: -1.1s; }
.throttle-panel.down { animation-delay: -0.5s; }

/* ---- Inbox ---- */
.notif { display: flex; align-items: flex-start; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--slate-3); }
.notif:last-child { border-bottom: none; }
/* Fixed-height, vertically-scrollable inbox lists (swipe) with infinite scroll (+50). */
.inbox-scroll { max-height: 46vh; overflow-y: auto; overflow-x: hidden; -webkit-overflow-scrolling: touch;
  scrollbar-width: thin; overscroll-behavior: contain; }
.card.inbox-scroll { padding-top: 4px; padding-bottom: 4px; }
/* Messaggi in un riquadro come l'inbox notifiche qui sopra: lo scroll taglia le card
   dietro una cornice intenzionale, non più a filo pagina (hard edge). */
.inbox-scroll-msgs { max-height: 52vh; padding: 8px 8px 0; border: 1px solid var(--slate-3); border-radius: 12px; background: rgba(0,0,0,.14); }
/* Flash quando si salta a un messaggio da una notifica DM: alone ambra che sfuma. */
.card.msg-flash { animation: msgFlash 1.7s ease-out; }
@keyframes msgFlash {
  0% { box-shadow: 0 0 0 0 rgba(233,181,74,0); }
  12% { box-shadow: 0 0 0 2px var(--amber); }
  100% { box-shadow: 0 0 0 0 rgba(233,181,74,0); }
}
@media (prefers-reduced-motion: reduce) { .card.msg-flash { animation: none; } }
.inbox-end { text-align: center; font-size: 11px; padding: 8px 0 2px; opacity: .6; }
/* Type-colored medallion: the ring color telegraphs what kind of event it is before reading. */
.notif-ico { width: 32px; height: 32px; flex: 0 0 auto; display: grid; place-items: center;
  font-size: 14px; line-height: 1; border-radius: 50%;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.28);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 1px 3px rgba(0,0,0,.4);
  filter: drop-shadow(0 1px 1px rgba(0,0,0,.5)); }
.notif-ico.nt-attack, .notif-ico.nt-defense, .notif-ico.nt-incoming { border-color: var(--rust); background: linear-gradient(180deg, rgba(140,46,28,.3), rgba(0,0,0,.3)); }
.notif-ico.nt-scout { border-color: var(--patina); background: linear-gradient(180deg, rgba(103,185,168,.16), rgba(0,0,0,.3)); }
.notif-ico.nt-expedition, .notif-ico.nt-ship { border-color: var(--brass); background: linear-gradient(180deg, rgba(195,156,95,.18), rgba(0,0,0,.3)); }
.notif-ico.nt-market, .notif-ico.nt-daily, .notif-ico.nt-medal { border-color: var(--amber); background: linear-gradient(180deg, rgba(233,181,74,.16), rgba(0,0,0,.3)); }
.notif-ico.nt-guild, .notif-ico.nt-pinnacolo { border-color: var(--bronze); }
.notif-ico.nt-energy { border-color: var(--good); }
.notif-txt { flex: 1 1 auto; font-size: 13px; }
.notif-time { font-size: 11px; color: var(--ink-dim); flex: 0 0 auto; white-space: nowrap; }
.notif-x { cursor: pointer; } .notif-x:hover { opacity: .92; }
.notif-detail { padding: 4px 0 10px; border-bottom: 1px solid var(--slate-3); }
.notif-detail .card { margin-bottom: 0; }
.field { display: block; font-size: 12px; color: var(--ink-dim); margin-bottom: 8px; letter-spacing: .2px; }
.field select, .field textarea, .field input {
  display: block; box-sizing: border-box; width: 100%; margin-top: 4px;
  background: var(--sky-0); color: var(--ink); border: 1px solid #0b0f13; border-radius: 8px;
  padding: 10px; font: inherit; font-size: 14px; box-shadow: inset 0 2px 4px rgba(0,0,0,.45);
}
.field textarea { resize: vertical; min-height: 66px; }
.field select:focus, .field textarea:focus, .field input:focus { outline: none; border-color: var(--brass); box-shadow: inset 0 2px 4px rgba(0,0,0,.45), 0 0 0 2px rgba(195,156,95,.2); }

/* ---- Emblem picker + segmented control (guild) ---- */
.emblem-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 8px; margin-top: 6px; }
.emblem {
  aspect-ratio: 1; display: grid; place-items: center; font-size: 22px; cursor: pointer;
  border-radius: 8px; border: 1px solid var(--bronze-d); color: var(--ink);
  background: radial-gradient(120% 120% at 30% 20%, var(--panel-2), var(--sky-0));
  box-shadow: inset 0 1px 0 var(--edge-hi);
}
.emblem.sel { border-color: var(--amber); box-shadow: 0 0 0 2px rgba(233,181,74,.5), inset 0 1px 0 var(--edge-hi); transform: translateY(-1px); }
.seg { display: flex; gap: 0; margin-top: 4px; border: 1px solid var(--bronze-d); border-radius: 8px; overflow: hidden; }
.seg button {
  flex: 1; min-height: 40px; border: none; cursor: pointer; font: inherit; font-size: 13px; font-weight: 600;
  background: var(--panel-0); color: var(--ink-dim); border-right: 1px solid #0c1116;
}
.seg button:last-child { border-right: none; }
.seg button.on { background: linear-gradient(180deg, var(--panel-2), var(--panel-1)); color: var(--amber-l); box-shadow: inset 0 1px 0 var(--edge-hi); }

/* ---- Accordion (collapsible game panels) ---- */
.accordion {
  position: relative;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid #0c1116; border-radius: var(--radius);
  margin-bottom: 12px; overflow: hidden;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 6px 16px rgba(0,0,0,.4);
}
.accordion::before {  /* brass top seam */
  content: ""; position: absolute; left: 12px; right: 12px; top: 0; height: 2px;
  background: linear-gradient(90deg, transparent, var(--brass) 20%, var(--brass-l) 50%, var(--brass) 80%, transparent); opacity: .45;
}
.acc-head {
  width: 100%; min-height: 50px; display: flex; align-items: center; justify-content: space-between;
  gap: 10px; padding: 12px 12px; background: none; border: none; color: var(--ink);
  font-size: 14px; font-weight: 700; cursor: pointer; text-align: left;
}
.acc-title { display: flex; align-items: center; gap: 12px; font-family: var(--font-display); letter-spacing: .8px; font-size: 14px; }
/* Pallino rosso "novità" (es. chat/direttive con nuovi messaggi), oltre al glow del bordo. */
.acc-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--rust); /* glow rimosso */ border: 1px solid #2a0c06; flex: 0 0 auto; align-self: center; }
/* Sui banner il pallino "novità" va nell'angolo alto-destra, sul bullone d'ottone,
   con un glow più marcato (pulsa) così si nota anche a card chiusa. */
.acc-head.acc-banner .acc-dot {
  position: absolute; top: 5px; right: 5px; z-index: 3;
  width: 11px; height: 11px;
  box-shadow: 0 1px 2px rgba(0,0,0,.9);
}
.acc-head.acc-banner .acc-dot::after { content: ""; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; /* glow rimosso */ opacity: 0; animation: gpulse 1.4s ease-in-out infinite; }
/* col pallino acceso, nascondi il bullone in alto a destra (il pallino ne prende il posto) */
.acc-head.acc-banner:has(.acc-dot) .acc-rivets::after { opacity: 0; }
/* Banner header: section art fills the width; text sits on a scrim so it stays readable.
   +50% height vs the plain header, and it stays as a top banner when the card expands. */
.acc-head.acc-banner {
  position: relative; min-height: 76px; align-items: flex-end; padding-bottom: 8px;
  background-size: cover; background-position: center 40%; background-repeat: no-repeat;
}
.acc-head.acc-banner::before {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(8,12,16,0) 25%, rgba(8,12,16,.55) 62%, rgba(8,12,16,.92) 100%);
  pointer-events: none;
}
.acc-head.acc-banner .acc-title,
.acc-head.acc-banner .acc-right { position: relative; z-index: 1; text-shadow: 0 1px 3px rgba(0,0,0,.85); }
.acc-head.acc-banner .acc-title { font-size: 16px; letter-spacing: 1px; }
/* Aperto: NIENTE linea d'ottone che brilla sotto il banner (sembrava sollevare la card). Il
   banner scorre dritto nel corpo — solo lo slide, sobrio e pulito. */
.accordion.open .acc-head.acc-banner { border-bottom: none; }
/* Brass frame around banner sections: bronze outer border + engraved inner fillet with
   riveted corners, so the collapsed stack reads as framed plates instead of flat strips. */
.accordion.has-banner {
  border: 1px solid rgba(195,156,95,.5);
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 6px 16px rgba(0,0,0,.45), 0 0 0 1px rgba(0,0,0,.55);
}
.accordion.has-banner::before { opacity: .8; }
.acc-head.acc-banner::after {
  content: ""; position: absolute; inset: 4px; border-radius: 4px;
  border: 1px solid rgba(216,181,121,.38);
  box-shadow: inset 0 0 14px rgba(0,0,0,.45);
  pointer-events: none;
}
/* corner rivets on the inner fillet */
.acc-head.acc-banner .acc-rivets, .acc-head.acc-banner .acc-rivets::before,
.acc-head.acc-banner .acc-rivets::after { position: absolute; pointer-events: none; }
.acc-head.acc-banner .acc-rivets { inset: 0; z-index: 1; }
.acc-head.acc-banner .acc-rivets::before, .acc-head.acc-banner .acc-rivets::after {
  content: ""; width: 5px; height: 5px; border-radius: 50%; top: 8px;
  background: radial-gradient(circle at 35% 30%, var(--brass-l), var(--brass) 55%, #4a3a22);
  box-shadow: 0 1px 2px rgba(0,0,0,.8), 0 0 0 1px rgba(0,0,0,.35);
}
.acc-head.acc-banner .acc-rivets::before { left: 8px; }
.acc-head.acc-banner .acc-rivets::after { right: 8px; }
.acc-right { display: flex; align-items: center; gap: 10px; flex: none; }
/* Titolo Gilda con crestIcon: l'icona resta fissata in alto (align-items:flex-start) mentre nome
   + tag [GILDA] vivono in un normale span inline (gh-title-text) che scorre e va a capo come
   testo — se il nome è lungo il tag lo segue sul secondo rigo invece di restare centrato a metà
   tra le due righe (comportamento di un flex-row con align-items:center sul blocco intero). */
.gh-title-wrap { display: flex; align-items: flex-start; gap: 10px; }
.gh-title-wrap > :first-child { flex: none; margin-top: 1px; }
.gh-title-text .chip { vertical-align: middle; margin-left: 2px; }
.acc-meta { font-size: 12px; color: var(--amber); font-variant-numeric: tabular-nums; }
.acc-chevron { color: var(--brass); transition: transform .18s ease; }
.accordion.open .acc-chevron { transform: rotate(180deg); }
/* Glow giallo sulla card (es. Chat & Direttive con un nuovo messaggio non letto) */
.accordion.acc-glow { border-color: var(--amber); box-shadow: inset 0 1px 0 var(--edge-hi), 0 6px 16px rgba(0,0,0,.45), 0 0 0 1px rgba(233,181,74,.25); }
.accordion.acc-glow .acc-title { color: var(--amber-l); }
/* respiro ambra in opacity (compositor): bagliore interno perché l'accordion ha overflow:hidden */
.accordion.acc-glow::after { content: ""; position: absolute; inset: 0; pointer-events: none; box-shadow: inset 0 0 0 1px rgba(233,181,74,.5); opacity: 0; animation: gpulse 1.6s ease-in-out infinite; }
.accordion.open .acc-head { border-bottom: none; }
/* Tendina con SLIDE morbido: altezza animata via max-height gestita in JS (toggleSection misura
   scrollHeight) → niente più lo scatto display:none↔block sulle card lunghe di Isola/Gilda.
   A riposo max-height:0 (chiusa) / none (aperta, così i contenuti dinamici non vengono tagliati);
   durante la transizione il JS imposta un max-height in px per far scorrere l'altezza. */
.acc-body { overflow: hidden; max-height: 0;
  transition: max-height .28s cubic-bezier(.4, 0, .2, 1);
  background: linear-gradient(180deg, rgba(0,0,0,.18), transparent 40%); }
.accordion.open .acc-body { max-height: none; }
/* L'ESPANDIBILE ENERGIA SI RICONOSCE AL VOLO (16/08/2026): velatura azzurra sullo sfondo del
   corpo, perche' i giocatori confondono centrali e miniere — il colore lo dice prima del testo.
   Solo tinta di fondo: card, corsie e tubo restano quelli di sempre. Niente glow. */
.accordion[data-sec="energia"] .acc-body {
  background: linear-gradient(180deg, rgba(88, 146, 202, .17), rgba(52, 96, 142, .07) 45%, rgba(52, 96, 142, .03) 100%);
}
.accordion.acc-noanim .acc-body { transition: none; }   /* collasso istantaneo delle sorelle (ancora anti-salto esatta) */
.acc-body-in { padding: 12px; }
.acc-body-in > .card:last-child, .acc-body-in > .accordion:last-child { margin-bottom: 0; }

/* ---- Sondaggi di gilda (stile WhatsApp, veste ottone) ---- */
.btn-wide { display: inline-flex; align-items: center; justify-content: center; width: 100%; }
/* Wizard Invia (Logistica): una card per volta. Briciole in testa — passi FATTI in ottone
   (tappabili col valore scelto), CORRENTE acceso ambra, FUTURI spenti; «‹» piccolo e
   discreto per tornare indietro. Cornici uniformi, no glow. */
.lw-crumbs { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: 0 0 10px; }
.lw-back { width: 30px; height: 30px; border-radius: 50%; border: 1px solid var(--bronze-d);
  background: rgba(255,255,255,.03); color: var(--brass-l); font-size: 16px; line-height: 1;
  cursor: pointer; flex: none; }
.lw-back:hover { border-color: var(--brass); }
.lw-crumb { border: 1px solid var(--line); background: none; color: var(--ink-dim);
  border-radius: 999px; padding: 4px 10px; font-size: 12px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px; font: inherit; }
.lw-crumb:disabled { cursor: default; opacity: .5; }
.lw-crumb.done { color: var(--brass-l); border-color: var(--bronze-d); opacity: 1; }
.lw-crumb.on, .lw-crumb.on:disabled { color: var(--amber-l); opacity: 1;
  border-color: color-mix(in srgb, var(--amber) 45%, var(--line));
  background: color-mix(in srgb, var(--amber) 8%, transparent); }
.lw-crumb small { font-size: 10px; color: var(--ink-dim); max-width: 90px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.lw-sep { color: var(--ink-dim); font-size: 12px; flex: none; }
.lw-next { display: flex; justify-content: flex-end; margin-top: 10px; }

.poll-actions { display: flex; gap: 8px; margin-top: 8px; }
.poll-actions .btn { flex: 1 1 0; justify-content: center; }
/* Card Chat & Direttive: pila azioni SIMMETRICA — ogni riga a tutta larghezza, gap uniforme.
   La direttiva nuova è una stella ambra DENTRO il bottone chat (stesso idioma del contatore
   sui Piani di Guerra), niente chip orfana in mezzo alla pila. No glow. */
.gc-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.gc-actions .poll-actions { margin-top: 0; }
.gc-actions .poll-actions .btn { flex: 1 1 0; }
/* Direttiva nuova = ping rosso in alto a destra del bottone chat (niente stella, no glow). */
.gc-actions .btn { position: relative; }
.gc-ping { position: absolute; top: -4px; right: -4px; width: 9px; height: 9px; border-radius: 50%;
  background: var(--rust); border: 1px solid #0c0f16; }
/* I SONDAGGI PARLANO LA LINGUA DELLE ALTRE CARD (16/08/2026). Ereditavano `.card` nudo, cioe'
   il RAIL SINISTRO da 3px — che in questo gioco appartiene SOLO alle action-card delle Missioni
   — e gli angoli morbidi: dentro un popup di plancia stonavano. Qui si ricopia la pelle che il
   blocco `#views .card` impone a tutte le card di gioco: cornice d'ottone su tutti e quattro i
   lati, angoli a 4px, fondo bruciato. Serve scriverla a mano perche' l'overlay vive FUORI da
   #views e quella regola non lo raggiunge. */
.poll-card {
  margin-top: 10px;
  background: linear-gradient(180deg, #1a2029, #12140f);
  border: 1px solid var(--rw-brass, #6d4f24);
  border-radius: 4px;
  box-shadow: inset 0 1px 0 rgba(240,209,138,.16), inset 0 -3px 8px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.45);
}
.poll-q { font-family: var(--font-display); font-size: 14px; color: var(--brass-l); letter-spacing: .3px; display: flex; align-items: center; gap: 6px; }
.poll-q .gi { width: 16px; height: 16px; flex: none; }
.poll-q .poll-rm { margin-left: auto; flex: none; }
.poll-sub { font-size: 11px; margin: 4px 0 8px; }
.poll-opts { display: flex; flex-direction: column; gap: 6px; }
.poll-opt { position: relative; overflow: hidden; display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  padding: 8px 10px; border-radius: 8px; border: 1px solid var(--slate-3); background: var(--slate-1); color: var(--ink);
  font-size: 13px; cursor: pointer; -webkit-tap-highlight-color: transparent; transition: border-color .15s, background .15s; }
.poll-opt:active { transform: translateY(1px); }
.poll-opt .po-fill { position: absolute; inset: 0 auto 0 0; background: linear-gradient(90deg, rgba(176,141,87,.28), rgba(236,205,142,.16)); border-radius: 8px 0 0 8px; transition: width .35s ease; z-index: 0; }
.poll-opt .po-tick { position: relative; z-index: 1; width: 18px; height: 18px; flex: none; border-radius: 50%; border: 1.5px solid var(--bronze-d);
  display: inline-flex; align-items: center; justify-content: center; font-size: 12px; color: var(--slate-0); background: transparent; }
.poll-opt .po-text { position: relative; z-index: 1; flex: 1 1 auto; min-width: 0; white-space: normal; overflow-wrap: break-word; word-break: break-word; }
.poll-opt .po-count { position: relative; z-index: 1; flex: none; font-variant-numeric: tabular-nums; color: var(--ink-dim); font-weight: 700; }
.poll-opt.on { border-color: var(--brass); background: linear-gradient(180deg, var(--slate-2), var(--slate-1)); }
.poll-opt.on .po-tick { border-color: var(--brass-l); background: var(--brass-l); }
.poll-opt.on .po-count { color: var(--brass-l); }
.poll-rm { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; padding: 0; border-radius: 8px;
  border: 1px solid var(--slate-3); background: var(--slate-1); color: var(--rust); cursor: pointer; }
/* display:block = centring flex esatto (via il vertical-align em di .gi); il glifo del cestino
   pende ~5% verso il basso nel suo viewBox → background risollevato di 1px. */
.poll-rm .gi { width: 19px; height: 19px; display: block; margin: 0; background-position: center calc(50% - 1px); }
.poll-rm:hover { border-color: var(--rust); }
/* Archivia (chiudi sondaggio): stesso tasto ma tinta ottone; sta PRIMA di Rimuovi, quindi eredita
   lui il margin-left:auto e il Rimuovi gli si affianca. */
.poll-q .poll-rm + .poll-rm { margin-left: 6px; }
.poll-arch:hover { border-color: var(--brass); }
.poll-q .poll-closed { margin-left: auto; flex: none; font-size: 10px; color: var(--ink-dim); }
.poll-q .poll-closed + .poll-rm { margin-left: 6px; }
/* Overlay creazione + storico (riusa .dl-sheet/.dl-head) */
.poll-sheet { width: min(440px, 94vw); max-height: 86vh; display: flex; flex-direction: column; }
.poll-form, .poll-hist-body { padding: 12px 16px 16px; overflow-y: auto; }
.poll-hist-body { display: flex; flex-direction: column; }
.poll-hist-body .poll-card:first-child { margin-top: 0; }
.poll-opt-label { margin: 12px 0 6px; font-size: 12px; }
.poll-opt-row { margin-bottom: 6px; }
.poll-add { margin: 2px 0 4px; }
.poll-toggle { display: flex; align-items: center; gap: 8px; margin-top: 12px; font-size: 13px; cursor: pointer; }
.poll-toggle input { width: 17px; height: 17px; accent-color: var(--brass); flex: none; }
.ph-opts { display: flex; flex-direction: column; gap: 4px; margin-top: 4px; }
/* Righe del risultato: stessa grammatica delle righe di gioco (fondo scuro + filo d'ottone),
   non riquadri d'ardesia che sembrano di un'altra applicazione. */
.ph-opt { display: flex; justify-content: space-between; gap: var(--sp-10); padding: var(--sp-4) var(--sp-8); border-radius: 4px;
  background: linear-gradient(180deg, #202836, #171b13); border: 1px solid rgba(106,81,38,.45); font-size: 12px; }
.ph-opt b { color: var(--brass-l); font-variant-numeric: tabular-nums; }
/* Locked accordion (e.g. guild cards without a guild): dimmed, no chevron, not expandable */
.accordion.locked-acc { opacity: .5; }
.accordion.locked-acc .acc-head { cursor: default; }
.accordion.locked-acc .acc-title { color: var(--ink-dim); }
.acc-lock { color: var(--patina); font-size: 13px; }

/* ---- Bottom dock ---- */
.bottomnav {
  position: fixed; bottom: 0; left: 0; right: 0; height: calc(var(--nav-h) + var(--safe-b));
  padding-bottom: var(--safe-b); display: grid; grid-template-columns: repeat(5, 1fr);
  background: linear-gradient(180deg, #1d2a3b, #121a27); border-top: 1px solid var(--bronze-d); z-index: 30;
  box-shadow: 0 -4px 16px rgba(0,0,0,.45), inset 0 1px 0 var(--edge-hi);
}
.bottomnav::before {
  content: ""; position: absolute; left: 0; right: 0; top: -1px; height: 2px;
  background: linear-gradient(90deg, transparent, var(--brass) 15%, var(--brass-l) 50%, var(--brass) 85%, transparent); opacity: .5;
}
.navbtn {
  position: relative; min-height: var(--tap); background: none; border: none; color: var(--ink-dim);
  font-size: 10px; font-weight: 700; letter-spacing: .4px; text-transform: uppercase; line-height: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: flex-end; gap: 2px;
  padding-bottom: 2px; cursor: pointer; white-space: nowrap;
}
/* Medaglioni d'ottone circolari (silhouette game-icons.net). La moneta è già rotonda,
   quindi lo slot è un cerchio pieno: niente box quadrato dietro. L'attivo è un alone
   ambrato CIRCOLARE che sfuma a trasparente (nessuna sagoma quadrata). Niente :has()
   così è robusto anche dove non è supportato.
   VIETATO usare filter (saturate/brightness/drop-shadow) sugli SVG qui: WebKit mobile
   rasterizza l'SVG filtrato in un buffer opaco → riappare il quadrato scuro dietro la
   moneta. Dim = opacity, glow attivo = box-shadow sul cerchio (segue il border-radius). */
.navbtn .navicon {
  --nav-base: 1;                 /* scala a riposo del medaglione (per-bottone, sotto) */
  width: 34px; height: 34px; display: grid; place-items: center;
  border-radius: 50%; transform: scale(var(--nav-base)); transform-origin: bottom center;
  transition: background .15s, box-shadow .15s, transform .18s ease;
}
/* SOLO Azioni: medaglione ingrandito ancorato alla BASE (cresce verso l'alto e sconfina sopra il
   bordo del footer). Il transform non rifluisce → la label resta fissa. Icona sempre a piena opacità. */
.navbtn[data-view="azioni"] .navicon { --nav-base: 1.5; }
/* Gli altri medaglioni: +5% ancorati alla base (crescono verso l'alto, label fissa). */
.navbtn[data-view="isola"] .navicon,
.navbtn[data-view="unita"] .navicon,
.navbtn[data-view="gilda"] .navicon,
.navbtn[data-view="profilo"] .navicon { --nav-base: 1.05; }
/* SELEZIONE: il medaglione attivo cresce del +10% (relativo alla sua scala base), ancorato alla
   base come sempre. Al tap fa un piccolo overshoot al +13% e rientra al +10% → feedback vivo ma
   seamless. Deselezionando, la transition su transform lo riporta dolcemente alla base. */
.navbtn.on .navicon { transform: scale(calc(var(--nav-base) * 1.05)); animation: navpop .3s ease-out; }
@keyframes navpop {
  0%   { transform: scale(var(--nav-base)); }
  55%  { transform: scale(calc(var(--nav-base) * 1.08)); }
  100% { transform: scale(calc(var(--nav-base) * 1.05)); }
}
/* niente translateZ(0): senza il layer GPU pre-rasterizzato a 32px l'SVG viene scalato come
   vettore → nitido anche a 1.5×. Spento un filo più acceso degli altri (.85) perché il
   medaglione ingrandito sporge e va tenuto leggibile; a piena opacità quando attivo. */
.navbtn[data-view="azioni"] .navicon-svg { transform: none; opacity: .9; }
/* Il footer non deve ritagliare il medaglione Azioni che sporge in alto. */
.bottomnav, .navbtn { overflow: visible; }
.navicon-img { width: 24px; height: 24px; display: block; }
/* translateZ(0) tiene l'SVG SEMPRE su un layer GPU: senza, il passaggio opacity .74→1
   crea/distrugge il layer e su mobile l'icona "salta" di un subpixel al cambio tab. */
.navicon-svg { width: 32px; height: 32px; display: block; opacity: .74; transition: opacity .15s; transform: translateZ(0); backface-visibility: hidden; }
.navbtn.on { color: var(--amber-l); }
.navbtn.on .navicon {
  background: radial-gradient(circle at 50% 45%, rgba(233,181,74,.30), rgba(233,181,74,0) 72%);
  /* glow rimosso */
}
.navbtn.on .navicon-svg { opacity: 1; }
.navbtn .dot { position: absolute; top: 7px; right: 50%; margin-right: -20px; width: 9px; height: 9px; border-radius: 50%; background: var(--rust); /* glow rimosso */ border: 1px solid #2a0c06; }
/* Azioni: il medaglione è ingrandito (1.5×, ancorato in basso → cresce verso l'alto), quindi il
   pallino va alzato per restare sul suo bordo alto-destro invece che a mezz'aria come sugli altri. */
.navbtn[data-view="azioni"] .dot { top: -6px; margin-right: -24px; }
/* BUSTA invece del pallino quando ad aspettare è un messaggio di ciurma: cambia la FORMA, non
   il colore — resta il rosso del ping, così nella barra è sempre lo stesso richiamo e a dirti
   che si tratta di parole è la sagoma.
   Perché la busta e non la nuvoletta: la chat.svg è un palloncino largo con una coda sottile,
   e sotto i 16px la coda finisce in un pixel sbavato — non legge come nuvoletta, legge come un
   pallino storto (è quello che stonava). La busta è compatta e simmetrica: a 14 si riconosce.
   La svg fa da MASCHERA perché l'icona d'ottone del set non si tingerebbe; niente bordo né
   raggio, la forma È il messaggio. */
/* IDENTICA AL PALLINO, cambia solo la sagoma: stesso rosso (--rust) e stesso bordo bruno
   (#2a0c06, quello di `border: 1px solid` del tondo).
   IL CONTORNO STA SUL CONTENITORE, LA MASCHERA SUL FIGLIO — e non è un vezzo: nel rendering
   CSS il `filter` si applica PRIMA della `mask`, quindi mettendoli sullo stesso elemento il
   contorno veniva ritagliato via insieme al resto e spariva (era il difetto: il bordo non si
   vedeva affatto). Con la maschera su ::before, il filtro del genitore traccia il profilo
   della forma GIÀ ritagliata. Quattro copie a raggio ZERO spostate di un pixel = contorno
   pieno da 1px; niente sfocature, che darebbero un alone (vietato). */
.navbtn .dot.dot-chat {
  width: 12px; height: 12px; top: 6px; margin-right: -22px;
  border: 0; border-radius: 0; background: none;
  /* Il bruno è SEMITRASPARENTE (.75) e non pieno come sul tondo: la nuvoletta è 12px contro 9,
     quindi lo stesso identico contorno le pesava addosso molto più che al pallino e stonava.
     Stessa geometria da 1px, meno contrasto — a schermo i due badge si equivalgono. */
  filter:
    drop-shadow(1px 0 0 rgba(42,12,6,.75)) drop-shadow(-1px 0 0 rgba(42,12,6,.75))
    drop-shadow(0 1px 0 rgba(42,12,6,.75)) drop-shadow(0 -1px 0 rgba(42,12,6,.75));
}
.navbtn .dot.dot-chat::before {
  content: ""; display: block; width: 100%; height: 100%; background: var(--rust);
  -webkit-mask: url("/assets/ui/chat.svg?v=1") center / contain no-repeat;
  mask: url("/assets/ui/chat.svg?v=1") center / contain no-repeat;
}

/* ---- Toasts ---- */
.toasts { position: fixed; left: 50%; transform: translateX(-50%); bottom: calc(var(--nav-h) + var(--safe-b) + 14px); z-index: 100; width: min(92vw, 460px); display: flex; flex-direction: column; gap: 8px; }
/* Niente rail colorato a sinistra: lo stato (info/errore/successo) lo dà un pallino
   iniziale + la cornice tinta su tutti i lati. */
.toast {
  display: flex; align-items: center; gap: 8px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0)); border: 1px solid var(--bronze-d);
  border-radius: 8px; padding: 12px 12px; font-size: 13px;
  box-shadow: 0 12px 32px rgba(0,0,0,.5), inset 0 1px 0 var(--edge-hi); animation: rise .2s ease;
}
.toast::before { content: ""; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--brass); }
.toast.err, .toast.error, .toast.bad { border-color: color-mix(in srgb, var(--rust) 55%, var(--bronze-d)); }
.toast.err::before, .toast.error::before, .toast.bad::before { background: var(--rust); }
.toast.win, .toast.ok { border-color: color-mix(in srgb, var(--amber) 55%, var(--bronze-d)); }
.toast.win::before, .toast.ok::before { background: var(--amber); }
.toast.info { border-color: color-mix(in srgb, var(--patina) 55%, var(--bronze-d)); }
.toast.info::before { background: var(--patina); }
@keyframes rise { from { transform: translateY(10px); opacity: 0; } }

/* ---- Confirm dialog (centered yes/no for sensitive actions) ---- */
/* UN POPUP COPRE SEMPRE IL PANNELLO CHE L'HA APERTO (15/08/2026). `.confirm-overlay` è la classe
   di TUTTI i riquadri creati a caldo — castone, anello, isola, colosso, lista bersagli, scheda
   gilda, profilo — e stava a 60, cioè SOTTO ogni pannello a schermo intero (80) e sotto lo
   Storico (70). Chi apriva un oggetto da dentro lo Storico non vedeva comparire niente: il
   riquadro c'era, disegnato dietro. Il difetto era già stato incontrato tre volte e curato tre
   volte sul singolo overlay (`#confirm-overlay` a 80, `#guild-overlay`/`#player-overlay` a 90) —
   cioè sul sintomo. Il token `--z-dialog` esiste da sempre e dice esattamente questo. */
.confirm-overlay { position: fixed; inset: 0; z-index: var(--z-dialog); display: grid; place-items: center; padding: 20px; }
/* Il sì/no generico è spesso invocato DA uno di quei riquadri (incastona? svendi? richiama?):
   deve stare sopra anche a loro, non alla loro stessa quota. */
#confirm-overlay { z-index: calc(var(--z-dialog) + 2); }
.confirm-backdrop { position: absolute; inset: 0; background: rgba(6,9,13,.62); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); }
.confirm-box {
  position: relative; z-index: 1; width: 100%; max-width: 360px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--bronze-d); border-radius: var(--radius);
  padding: 16px; box-shadow: inset 0 1px 0 var(--edge-hi), 0 22px 56px rgba(0,0,0,.6); animation: rise .16s ease;
}
.confirm-title { margin: 0 0 10px; font-size: 16px; font-family: var(--font-display); letter-spacing: .3px; color: var(--brass-l); }
.confirm-body { font-size: 13px; color: var(--ink-dim); max-height: 62vh; overflow-y: auto; }
/* Pallino rosso "non letto" accanto a un messaggio/notifica da leggere. */
.unread-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex: none;
  background: var(--rust); /* glow rimosso */ border: 1px solid #2a0c06;
  margin-right: 6px; vertical-align: middle; }
/* I TRATTEGGI RESTANO SOLO DOVE VOGLIONO DIRE «QUI NON C'E' ANCORA NIENTE» (04/08/2026, ordine
   del committente: linee continue in tutto il gioco tranne gli inventari).
   La riga tratteggiata aveva finito per fare due mestieri: separare due voci di un elenco, e
   segnare una casella vuota. Il secondo e' un significato — una cornice a trattini dice che li'
   ci andrebbe qualcosa che non c'e' — il primo era solo decorazione, e in un pannello di sei
   righe faceva sembrare provvisorio anche cio' che era definitivo.
   Da oggi: separatore = linea continua. Trattini = casella vuota, slot d'anello libero,
   bersaglio del trascinamento, obiettivo di guerra non ancora impegnato, chip «aggiungi isola».
   Restano tratteggiati anche i due sottolineati dei link (nome capitano, coordinate): non sono
   linee di separazione, sono il segno che quella parola si tocca. */
.cf-line { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 4px 0; border-bottom: 1px solid var(--slate-3); }
.cf-line:last-child { border-bottom: none; }
.cf-line b { color: var(--ink); font-variant-numeric: tabular-nums; }
.cf-cost { display: inline-flex; gap: 8px; }
.confirm-actions { display: flex; gap: 8px; margin-top: 16px; }
.confirm-actions .btn { flex: 1; }

/* Classifica donazioni: popup minimale ancorato in alto, entra con slide verticale (no
   spostamento orizzontale). Margini laterali fissi dalla .confirm-overlay (padding). */
.donlb-overlay { place-items: start center; padding: 54px 16px 20px; }
.don-lb-btn { flex: none; width: 30px; height: var(--btn-h-sm); display: inline-flex; align-items: center; justify-content: center;
  background: linear-gradient(180deg, #24303c, #18222c); border: 1px solid var(--bronze-d); border-radius: 8px; cursor: pointer;
  box-shadow: inset 0 1px 0 var(--edge-hi); }
.don-lb-btn .gi { width: 17px; height: 17px; }
.don-lb-btn:active { transform: translateY(1px); }
.dl-sheet {
  position: relative; z-index: 1; width: 100%; max-width: 420px; max-height: 78vh; display: flex; flex-direction: column;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--bronze-d); border-radius: var(--radius);   /* cornice uniforme, niente rail d'ottone in alto */
  box-shadow: 0 22px 56px rgba(0,0,0,.6), inset 0 1px 0 var(--edge-hi); overflow: hidden; animation: dlDown .2s ease;
}
@keyframes dlDown { from { transform: translateY(-26px); opacity: 0; } }
.dl-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 16px 10px; border-bottom: 1px solid rgba(195,156,95,.18); }
.dl-title { margin: 0; font-family: var(--font-display); font-size: 14px; letter-spacing: .3px; color: var(--brass-l); display: inline-flex; align-items: center; gap: 8px; }
.dl-title .gi { width: 18px; height: 18px; }
.dl-cols { display: flex; align-items: center; gap: 10px; padding: 8px 16px; font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--ink-dim); border-bottom: 1px solid var(--slate-3); }
.dl-list { overflow-y: auto; -webkit-overflow-scrolling: touch; }
.dl-row { display: flex; align-items: center; gap: 10px; padding: 8px 16px; border-bottom: 1px solid rgba(255,255,255,.04); font-size: 13px; }
.dl-row.dl-me { background: rgba(233,181,74,.09); }
.dl-rank { flex: none; width: 22px; text-align: center; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.dl-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; gap: 4px; color: var(--ink); }
.dl-medal { flex: none; display: inline-flex; }
.dl-medal .gi { width: 14px; height: 14px; }
.dl-lvl { flex: none; width: 46px; text-align: right; color: var(--ink-dim); font-size: 11px; font-variant-numeric: tabular-nums; }
.dl-don { flex: none; min-width: 74px; text-align: right; color: var(--brass-l); font-variant-numeric: tabular-nums; display: inline-flex; align-items: center; gap: 4px; justify-content: flex-end; }
.dl-don .gi { width: 12px; height: 12px; }
.dl-empty { padding: 20px 16px; text-align: center; }

/* Dashboard GM: sheet ampio, scroll interno, entra dall'alto (come la classifica donazioni). */
.admin-overlay { place-items: start center; padding: 34px 12px 16px; }
.adm-sheet { position: relative; z-index: 1; width: 100%; max-width: 520px; max-height: 88vh; display: flex; flex-direction: column;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0)); border: 1px solid #0c1116; border-top: 3px solid var(--brass);
  border-radius: var(--radius); box-shadow: 0 22px 56px rgba(0,0,0,.6), inset 0 1px 0 var(--edge-hi); overflow: hidden; animation: dlDown .2s ease; }
.adm-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px 10px; border-bottom: 1px solid rgba(195,156,95,.18); }
.adm-title { margin: 0; font-family: var(--font-display); font-size: 14px; letter-spacing: .3px; color: var(--brass-l); display: inline-flex; align-items: center; gap: 8px; }
.adm-title .gi { width: 18px; height: 18px; }
.adm-scroll { overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 12px 16px 16px; }
.adm-loading { padding: 40px 16px; text-align: center; }
.adm-sec { margin-bottom: 16px; }
.adm-sec-t { font-family: var(--font-display); font-size: 11px; letter-spacing: 2px; text-transform: uppercase; color: var(--brass-l); margin-bottom: 8px; padding-bottom: 4px; border-bottom: 1px solid var(--slate-3); }
.adm-alerts { display: flex; flex-direction: column; gap: 6px; }
.adm-alert { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 8px; font-size: 12px; border: 1px solid transparent; }
.adm-alert .gi { width: 15px; height: 15px; flex: none; }
.adm-alert.crit { background: rgba(196,35,27,.14); border-color: rgba(255,84,54,.4); color: #ff9d85; }
.adm-alert.warn { background: rgba(233,181,74,.12); border-color: rgba(233,181,74,.35); color: var(--amber-l); }
.adm-alert.info { background: rgba(120,150,180,.1); border-color: var(--slate-3); color: var(--ink-dim); }
.adm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 8px; }
.adm-stat { background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); border: 1px solid #0c1116; border-left: 2px solid var(--bronze-d); border-radius: 8px; padding: 8px 8px; display: flex; flex-direction: column; gap: 1px; }
.adm-k { font-size: 10px; text-transform: uppercase; letter-spacing: .4px; color: var(--ink-dim); }
.adm-v { font-size: 16px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.adm-sub { font-size: 10px; color: var(--ink-dim); }
.adm-bars { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; }
.adm-barrow { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--ink-dim); }
.adm-barrow > span:first-child { flex: none; width: 40px; }
.adm-barrow.big > span:first-child { width: auto; min-width: 84px; color: var(--ink); font-variant-numeric: tabular-nums; }
.adm-bar { flex: 1; height: 7px; border-radius: 4px; background: #10171f; overflow: hidden; border: 1px solid #0c1116; }
.adm-bar > i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(90deg, #6fb27a, #4d9a63); transition: width .3s ease; }
.adm-bar.warn > i { background: linear-gradient(90deg, #e9b54a, #c99a3e); }
.adm-bar.crit > i { background: linear-gradient(90deg, #ff5436, #c4231b); }
.adm-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.adm-chip { font-size: 11px; padding: 2px 8px; border-radius: 999px; background: #18222c; border: 1px solid var(--slate-3); color: var(--ink-dim); }
.adm-chip.on { color: #8fd6a0; border-color: rgba(120,200,140,.35); }
.adm-chip.off { color: #ff9d85; border-color: rgba(255,84,54,.4); }
.adm-chip.warn { color: var(--amber-l); border-color: rgba(233,181,74,.4); }
/* Testata sezione con controllo a destra (es. selettore periodo). */
.adm-sec-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px;
  padding-bottom: 4px; border-bottom: 1px solid var(--slate-3); }
.adm-sec-h .adm-sec-t { margin: 0; padding: 0; border: none; }
/* Selettore periodo 7g/14g/30g: segmenti d'ottone come i toggle del gioco. */
.adm-per-seg { display: inline-flex; border: 1px solid var(--bronze-d); border-radius: 8px; overflow: hidden; flex: none; }
.adm-per { background: transparent; border: none; border-left: 1px solid var(--bronze-d); color: var(--ink-dim);
  font: inherit; font-size: 11px; font-weight: 600; padding: 4px 10px; cursor: pointer; }
.adm-per:first-child { border-left: none; }
.adm-per.on { background: linear-gradient(180deg, rgba(120,84,26,.32), rgba(0,0,0,.2)); color: var(--amber-l); }
/* Grafico iscritti giorno per giorno: barre a colonna con numero sopra e giorno sotto. */
.sg-chart { display: grid; grid-template-columns: repeat(var(--sg-cols, 14), 1fr); gap: 2px; align-items: end;
  height: 128px; padding: 2px 0 0; }
.sg-col { display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; min-width: 0; gap: 2px; }
.sg-col .sg-n { font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; line-height: 1; height: 10px; }
.sg-bar { width: 100%; max-width: 18px; flex: 1; display: flex; align-items: flex-end;
  background: rgba(0,0,0,.28); border-radius: 4px 4px 0 0; overflow: hidden; }
.sg-bar > i { display: block; width: 100%; min-height: 2px; border-radius: 4px 4px 0 0;
  background: linear-gradient(180deg, #f0cc79, #bd7d26); }
.sg-col.today .sg-bar > i { background: linear-gradient(180deg, #9fe6c0, #46b98a); }
.sg-col .sg-d { font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; line-height: 1; }
.sg-col .sg-w { font-size: 7.5px; color: var(--slate-4, #5a6678); text-transform: uppercase; line-height: 1; letter-spacing: .3px; }
/* Con 30 giorni le colonne sono strette: nascondi le etichette secondarie per non affollare. */
.sg-chart[style*="--sg-cols:30"] .sg-n, .sg-chart[style*="--sg-cols:30"] .sg-w { display: none; }
.adm-fb { padding: 6px 0; border-bottom: 1px solid rgba(255,255,255,.04); }
.adm-fb-t { font-size: 12px; color: var(--ink); white-space: pre-wrap; }
.adm-fb-m { font-size: 10px; margin-top: 2px; display: flex; align-items: center; gap: 6px; }
/* Segnalazione cliccabile → apre la scheda profilo (col tasto per scrivere un DM). */
.adm-fb-clk { cursor: pointer; margin: 0 -8px; padding: 6px 8px; border-radius: 8px; transition: background .15s ease; }
.adm-fb-clk:hover { background: rgba(195,156,95,.1); }
.adm-fb-clk:hover .adm-fb-go { color: var(--amber-l); }
.adm-fb-go { margin-left: auto; color: var(--brass); font-weight: 700; white-space: nowrap; }
/* Coda moderazione: header collassabile + elenco messaggi segnalati (tasto "Segnala"). */
.adm-collap { display: flex; align-items: center; justify-content: space-between; gap: 8px; cursor: pointer; user-select: none; }
.adm-collap:hover { color: var(--amber-l); }
.adm-mod-badge { font-family: var(--font-ui, inherit); letter-spacing: 0; font-size: 11px; font-weight: 700; color: var(--ink-dim);
  background: rgba(0,0,0,.25); border: 1px solid var(--bronze-d); border-radius: 999px; padding: 1px 8px; }
.adm-mod-badge.has { color: #14210f; background: var(--rust); border-color: var(--rust); }
.adm-mod-list { display: flex; flex-direction: column; gap: 8px; }
.adm-mod-item { padding: 8px 10px; border: 1px solid var(--slate-3); border-radius: 8px; background: rgba(0,0,0,.18); }
.adm-mod-body { font-size: 12px; color: var(--ink); white-space: pre-wrap; word-break: break-word; }
.adm-mod-meta { font-size: 10px; margin-top: 4px; }
.adm-mod-sender { cursor: pointer; color: var(--brass); font-weight: 700; }
.adm-mod-sender:hover { color: var(--amber-l); }
.adm-mod-flag { color: var(--rust); font-weight: 700; }
.adm-mod-clear { margin-top: 6px; }
.adm-foot { text-align: center; font-size: 10px; margin-top: 4px; }

/* ---- Guild chat: bottom-sheet overlay ---- */
.chat-overlay { position: fixed; inset: 0; z-index: 80; display: flex; flex-direction: column; justify-content: flex-end; }
.chat-backdrop { position: absolute; inset: 0; background: rgba(6,9,13,.55); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.chat-sheet {
  position: relative; z-index: 1; display: flex; flex-direction: column; width: 100%; max-height: 86vh;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--bronze-d); border-top: 2px solid var(--bronze); border-radius: 18px 18px 0 0;
  box-shadow: 0 -16px 44px rgba(0,0,0,.6), inset 0 1px 0 var(--edge-hi);
  padding-bottom: var(--safe-b); animation: sheetUp .22s ease;
}
/* Tastiera aperta (iOS): l'overlay è già ancorato al visual viewport → niente padding safe-area
   sul foglio, così il compositore sta a FILO sopra la tastiera senza vuoti. */
.chat-overlay.kb-up .chat-sheet { padding-bottom: 0; }
/* Chat di GILDA (modale desktop) e dock globale in modalità gilda: fondo ROSSO BRACE, i toni
   del cielo della tab Gilda — le due chat non si confondono mai. (Su mobile il blocco ≤899px
   più sotto ridefinisce lo stesso rosso col raccordo alla status bar.) */
#chat-overlay .chat-sheet, #wchat-overlay.guild-mode .chat-sheet {
  /* Le stesse sfumature MORBIDE del cielo della tab Gilda: bagliore granata in alto che
     si spegne dolcemente nel bruno scuro — niente stacchi netti. */
  background:
    radial-gradient(130% 60% at 50% -6%, rgba(96,42,30,.55), transparent 72%),
    linear-gradient(180deg, #291411 0%, #1b0d0b 48%, #140908 100%);
}
/* In gilda anche textbox e tasti si scaldano e si SCHIARISCONO un filo: il navy della globale
   sul fondo brace faceva a pugni (blu su rosso). Bordi color cuoio, focus resta ottone. */
#chat-overlay .chat-composer textarea, #wchat-overlay.guild-mode .chat-composer textarea {
  background: #2a1713; border-color: #4a2a1e;
}
#chat-overlay .chat-composer .chat-actions .btn, #wchat-overlay.guild-mode .chat-actions .btn {
  background: #2a1713; border-color: #4a2a1e;
}
#chat-overlay .chat-composer textarea:focus, #wchat-overlay.guild-mode .chat-composer textarea:focus { border-color: var(--brass); }
/* BACHECA: si apre DALLA chat di gilda, quindi porta il suo rosso brace e non l'ardesia
   generica dei fogli — un albo che cambia colore rispetto alla stanza da cui esce sembra
   un'altra schermata. Stesse due sfumature del foglio di gilda qui sopra. */
#board-overlay .chat-sheet {
  background:
    radial-gradient(130% 60% at 50% -6%, rgba(96,42,30,.55), transparent 72%),
    linear-gradient(180deg, #291411 0%, #1b0d0b 48%, #140908 100%);
  /* Niente cornice ai lati e SOTTO: il bordo in fondo disegnava una riga a un dito dal bordo
     dello schermo e il foglio sembrava una card ritagliata. Senza, esce da sotto e continua. */
  border-left: none; border-right: none; border-bottom: none;
}
#board-overlay .chat-composer textarea { background: #2a1713; border-color: #4a2a1e; }
#board-overlay .chat-composer textarea:focus { border-color: var(--brass); }
/* Gli avvisi: velo caldo sul rosso invece del giallo ottone, che sul brace sbiadiva. */
#board-overlay .board-item {
  background: linear-gradient(180deg, rgba(150,32,22,.20), rgba(10,5,4,.28));
  border-color: #5a3324;
}
@keyframes sheetUp { from { transform: translateY(100%); } }
/* MOBILE/PWA (≤899px): chat di gilda e chat GLOBALE a schermo intero (ordine di Guglielmo 25/07).
   Solo le due chat, NON bacheca/impostazioni (condividono .chat-overlay): height piena, niente raccordi. */
@media (max-width: 899px) {
  #chat-overlay .chat-sheet, #wchat-overlay .chat-sheet {
    height: 100dvh; max-height: 100dvh; width: 100%; max-width: none; margin: 0;
    border: none; border-radius: 0; box-shadow: none;
    padding-top: env(safe-area-inset-top, 0px);
    /* A schermo intero il gradiente panel-2→panel-0 spalmava l'ardesia CALDA (punta oliva) su
       tutto lo schermo: su OLED/Night Shift leggeva come un velo giallo (segnalato 25/07).
       BLU NOTTE con le stesse sfumature morbide della gilda ma fredde: bagliore acciaio
       in alto che si spegne dolcemente nel navy profondo. */
    background:
      radial-gradient(130% 34% at 50% -4%, rgba(46,78,116,.5), transparent 72%),
      linear-gradient(180deg, #111a28 0%, #0e1520 46%, #0b111b 100%);
  }
  /* Chat di GILDA a schermo intero: fondo ROSSO BRACE (i toni del cielo della tab Gilda) —
     colpo d'occhio immediato su quale delle due chat hai davanti. Vale anche per il dock/overlay
     globale quando è commutato in modalità gilda. */
  #chat-overlay .chat-sheet, #wchat-overlay.guild-mode .chat-sheet {
    /* Stesse sfumature morbide del cielo tab-Gilda, distese su tutto lo schermo:
       bagliore granata in alto → bruno scuro, senza stacchi. */
    background:
      radial-gradient(130% 34% at 50% -4%, rgba(96,42,30,.55), transparent 72%),
      linear-gradient(180deg, #291411 0%, #1b0d0b 46%, #140908 100%);
  }
  /* NIENTE backdrop a schermo intero: il foglio copre già tutto, e su iOS il backdrop-filter
     (blur) può dipingersi SOPRA il foglio (bug WebKit di stacking) sfumando il cielo caldo
     della tab sotto → era il "film giallo" segnalato da iPhone il 25/07. Via del tutto. */
  #chat-overlay .chat-backdrop, #wchat-overlay .chat-backdrop { display: none; }
  /* Compositore IN RIGA solo per la chat GLOBALE (un tasto solo): textbox e invio affiancati.
     La chat di GILDA tiene i tasti SOTTO la textbox: ufficiali/fondatori ne hanno tre
     (pin/megafono/invio) e in riga schiaccerebbero il campo di scrittura. */
  #wchat-overlay .chat-composer { flex-direction: row; align-items: stretch; gap: 8px; }
  #wchat-overlay .chat-composer textarea { flex: 1 1 auto; min-width: 0; }
  #wchat-overlay .chat-actions { flex: none; align-items: stretch; }
  #wchat-overlay .chat-actions .btn { height: auto; min-height: 0; align-self: stretch; }
  #chat-overlay .chat-sheet::before, #wchat-overlay .chat-sheet::before,
  #chat-overlay .chat-sheet::after, #wchat-overlay .chat-sheet::after { display: none; }   /* niente grab-handle né cucitura: non è più un foglio */
}

/* ───────── DESKTOP (≥900px) ─────────
   Chat di gilda: torna il foglio modale "come prima" (centrato, 640px — regola più sotto).
   Chat GLOBALE: NON a schermo intero, ma pannello agganciato in basso a destra, collassabile
   verso l'alto e ridimensionabile. Non-modale: la pagina resta usabile mentre è aperta.
   Lo stato aperto/chiuso e l'altezza si ricordano (localStorage) → mai da rifare. */
@media (min-width: 900px) {
  #wchat-overlay { inset: auto; right: 20px; bottom: 0; left: auto; top: auto;
    width: auto; height: auto; z-index: 70; display: block; background: none;
    justify-content: flex-start; pointer-events: none; padding: 0; }
  #wchat-overlay .chat-backdrop { display: none; }   /* niente velo: dock flottante, pagina cliccabile */
  #wchat-overlay .chat-sheet {
    pointer-events: auto; position: relative; width: 400px; max-width: 400px;
    /* Tetto legato all'header: chat + le due card sopra non devono mai salire sulla topbar
       (prima 82vh: con le card aggiunte sfondava sulle finestre basse). */
    height: var(--wchat-h, 460px); max-height: calc(100dvh - 240px); min-height: 0; margin: 0;
    border: 1px solid var(--bronze-d); border-top: 2px solid var(--bronze); border-bottom: none;
    border-radius: 12px 12px 0 0; box-shadow: 0 -10px 34px rgba(0,0,0,.55), inset 0 1px 0 var(--edge-hi);
    /* NIENTE `sheetUp` SUL DOCK (15/08/2026, segnalato dal committente). Su mobile la chat E' un
       foglio che sale dal basso e l'animazione racconta il gesto; da desktop e' un pannello
       AGGANCIATO in basso a destra, e li' quell'animazione non racconta niente — anzi mente.
       Si riaccendeva a ogni ricostruzione del nodo: aprivi un popup a schermo intero, lo
       chiudevi, e il dock GIA' APERTO risaliva da sotto come se lo stessi aprendo adesso.
       Un'animazione d'ingresso su una cosa che non sta entrando e' rumore. Il dock ha gia' la
       sua transizione vera, quella del collasso (`.wchat-collapse`), che segue un gesto reale. */
    padding-bottom: 0; animation: none;
    /* Stesse sfumature vive del mobile: bagliore acciaio in alto → navy profondo.
       (In guild-mode vince la regola granata, che ha specificità maggiore.) */
    background:
      radial-gradient(130% 40% at 50% -5%, rgba(46,78,116,.5), transparent 72%),
      linear-gradient(180deg, #111a28 0%, #0e1520 46%, #0b111b 100%);
  }
  #wchat-overlay .chat-sheet::before, #wchat-overlay .chat-sheet::after { display: none; }
  /* Composer del dock: input e invio SULLA STESSA RIGA (niente spazio morto). L'invio è un tondo
     compatto con l'icona a freccia (paper-plane), non più il tasto "Invia" testuale. */
  #wchat-overlay .chat-composer { flex-direction: row; align-items: stretch; gap: 8px; padding: 8px 10px; border-top: 1px solid rgba(195,156,95,.14); }
  #wchat-overlay .chat-composer textarea { min-height: 34px; height: 34px; max-height: 84px; font-size: 13px; padding: 8px 10px; }
  #wchat-overlay .chat-actions { flex: none; display: flex; align-items: stretch; }
  /* Invio: stessa ALTEZZA dell'input e stessi colori (fondo scuro, bordo scuro, freccia ottone) —
     niente blocco dorato acceso che stona accanto alla textbox. */
  #wchat-overlay .wchat-send-btn { min-width: 0; min-height: 0; width: 34px; height: auto; align-self: stretch; padding: 0; border-radius: 8px; display: grid; place-items: center;
    background: var(--sky-0); border: 1px solid #0b0f13; color: var(--brass-l); box-shadow: inset 0 2px 4px rgba(0,0,0,.45); }
  #wchat-overlay .wchat-send-btn:hover { border-color: var(--brass); color: var(--brass); }
  #wchat-overlay .wchat-send-ico { width: 12px; height: 12px; color: var(--brass-l); display: block; margin: auto; }   /* glifo Enter: simmetrico, niente compensi ottici */
  #wchat-overlay .wchat-send-btn:hover .wchat-send-ico { color: var(--brass); }
  /* Chat di gilda (modale desktop): stesso tasto invio a icona Enter (testo nascosto), il resto
     del layout resta invariato (pin + megafono + invio in fila). */
  #chat-overlay .wchat-send-btn { min-width: 0; width: 42px; padding: 0; display: grid; place-items: center; }
  #chat-overlay .wchat-send-txt { display: none; }
  #chat-overlay .wchat-send-ico { display: block; width: 15px; height: 15px; color: var(--brass-l); margin: auto; }
  #chat-overlay .wchat-send-btn:hover .wchat-send-ico { color: var(--brass); }
  #wchat-overlay .wchat-send-txt { display: none; }
  #wchat-overlay .wchat-send-ico { display: block; }
  /* Header = maniglia di collasso: cursore a mano, chevron che ruota. Compatto (~metà altezza):
     margini ridotti sopra/sotto, niente bordo inferiore, tasti più piccoli, titolo appena più piccolo. */
  #wchat-overlay .chat-head { cursor: pointer; user-select: none; padding: 6px 8px 6px 12px; border-bottom: none; gap: 4px; }
  #wchat-overlay .chat-title { font-size: 13px; letter-spacing: .4px; }
  #wchat-overlay .chat-head .gi-chat { width: 15px; height: 15px; }
  #wchat-overlay .chat-head .chat-x { width: 21px; height: 21px; font-size: 10px; border-radius: 4px;
    display: grid; place-items: center; padding: 0; line-height: 1; }
  #wchat-overlay .chat-head .wchat-closebtn { display: none; }   /* da desktop niente ✕: si collassa (ribadito: la regola sopra ha specificità maggiore) */
  #wchat-overlay .chat-head .wchat-bell svg { width: 11px; height: 11px; display: block; }
  #wchat-overlay .wchat-collapse { line-height: 0; }
  /* Tasto swap: doppia freccia ruotata 90°, compatta come le altre nell'header del dock. */
  #wchat-overlay .chat-head .wchat-swap svg { width: 11px; height: 11px; }
  #wchat-overlay .chat-head-btns { gap: 4px; }
  #wchat-overlay .wchat-collapse { transition: transform .2s ease; }
  /* Barra di resize sul bordo superiore (trascina su/giù per allungare/ridurre). */
  #wchat-overlay .wchat-resize { display: block; position: absolute; top: 0; left: 0; right: 0;
    height: 8px; cursor: ns-resize; z-index: 3; }
  /* Collassata: solo l'header in basso a destra, stream e composer nascosti.
     E VESTITA COME LA BARRA DI NAVIGAZIONE, perché è quello che diventa: un pezzo di footer
     appoggiato alla stessa linea di terra, non un pannello rimasto a metà. Le differenze erano
     tre, e nessuna era voluta a questa taglia:
     · il bagliore acciaio in alto è tarato su un pannello alto 460 (copre il 40% dell'altezza).
       Su una barra di 35 quel 40% sono quattordici pixel su trentacinque: metà barra lavata di
       azzurro, ed è per questo che sembrava più chiara del footer invece che uguale;
     · il filo superiore era 2px di bronzo CHIARO contro l'1px scuro del footer — a un centimetro
       di distanza si leggevano due spessori diversi sulla stessa riga;
     · l'ombra portata era quasi tripla (-10px/34 contro -4px/16), quindi la barra galleggiava
       più in alto del suo vicino pur poggiando sullo stesso bordo.
     Da espansa il pannello riprende tutto: lì il bagliore ha lo spazio per cui è nato. */
  #wchat-overlay.collapsed .chat-sheet {
    height: auto;
    border-top: 1px solid var(--bronze-d);
    box-shadow: 0 -4px 16px rgba(0,0,0,.45), inset 0 1px 0 var(--edge-hi);
    background: linear-gradient(180deg, #1d2a3b, #121a27);
  }
  /* ...ma la TINTA continua a dire quale chat è: commutata su gilda resta brace, come il
     pannello aperto e come il cielo della tab. Stessa scocca del footer, livrea diversa —
     e gli stessi due salti di chiarezza del navy, così le due barre pesano uguale. */
  #wchat-overlay.collapsed.guild-mode .chat-sheet {
    background: linear-gradient(180deg, #452118, #2d1412);
  }
  /* Stessa altezza del footer: due barre sulla stessa riga che finiscono a quote diverse si
     leggono come un gradino, non come una fascia. In più la maniglia di collasso diventa un
     bersaglio pieno invece di una striscia. */
  /* -1px: il foglio somma il suo border-top FUORI dal min-height (height:auto), il footer invece
     conta il bordo DENTRO i suoi nav-h. Senza il pareggio la barra chat finiva 1px più alta e la
     linea di terra faceva un gradino (segnalato da screenshot 08/08). */
  #wchat-overlay.collapsed .chat-head { min-height: calc(var(--nav-h) - 1px); box-sizing: border-box; }
  /* Da collassata è un pezzo di footer, e si veste da footer anche nei caratteri: scritta
     compatta maiuscola come le label della navbar (loro 10px, qui 11 perché è sola), icona
     poco sopra il testo invece del pallone gonfio, e tutto nell'oro del tema — niente
     grigi di servizio sui tastini a fianco. */
  /* E lo stesso filo d'ottone del footer: 2px sfumati che si accendono al centro (.bottomnav::before).
     Il ::after è libero (quello di .chat-sheet è spento sopra) e va riacceso qui. */
  #wchat-overlay.collapsed .chat-sheet::after {
    content: ""; display: block; position: absolute; left: 0; right: 0; top: -1px; height: 2px;
    background: linear-gradient(90deg, transparent, var(--brass) 15%, var(--brass-l) 50%, var(--brass) 85%, transparent); opacity: .5;
  }
  #wchat-overlay.collapsed .chat-title { font-size: 11px; letter-spacing: .5px; text-transform: uppercase; }
  /* Niente fianchi, né da collassata né da aperta: è un pezzo di footer, e il footer non ha
     bordi laterali (esteso alla versione aperta su richiesta 08/08). */
  #wchat-overlay .chat-sheet, #wchat-overlay.collapsed .chat-sheet { border-left: none; border-right: none; }
  /* Le CALAMITE sopra il dock: Storico e Classifiche, vestite come chat e footer (navy, filo
     bronzo, small-caps). Stanno nell'overlay prima del foglio → si muovono con lui. */
  /* Larghezza AGGANCIATA a quella della chat (400px), con la sicura anti-overflow sulle
     finestre strette: mai più larghe dello schermo meno i margini del dock. */
  #wchat-overlay .wdock-cards { display: flex; flex-direction: column; gap: 8px; margin: 0 0 8px;
    pointer-events: auto; width: 400px; max-width: calc(100vw - 40px); }
  /* CALAMITA SOTTO L'HEADER: il blocco mappa resta dov'è nel DOM (stessi gestori, stessa
     larghezza inline della colonna) — è solo FISSATO in alto; cresce verso il basso, quindi
     sopra la topbar non può salire. top/left/width li aggiorna positionWchatDock. */
  #wchat-overlay .wdock-mapcol { position: fixed; z-index: 50; top: 96px;
    display: flex; flex-direction: column; gap: 8px; pointer-events: auto; }
  /* Il mini-mappamondo: pannello QUADRATO largo quanto la chat, canvas dentro, comandi
     sovrapposti agli angoli alti (mondi a sinistra, setacci a destra). */
  /* TETTO SOTTO L'HEADER: la colonna del dock cresce verso l'alto (è ancorata in basso) e su
     finestre basse sfondava la topbar. Il quadrato è l'unico pezzo elastico: si accorcia lui —
     100dvh meno topbar, card, barra chat e margini (~340px) — e il globo si adatta (usa il
     lato minore). Sotto i 180px non scende: meglio un rettangolo basso che una fessura. */
  #wdock-map { pointer-events: auto; position: relative; aspect-ratio: 1 / 1;
    width: 100%; max-height: calc(100dvh - 340px); min-height: 180px;
    overflow: hidden; background: linear-gradient(180deg, #0d1420, #080d15);
    border: 1px solid var(--bronze-d); border-radius: 12px; box-shadow: 0 10px 30px rgba(0,0,0,.55); }
  #wdock-map.hidden { display: none; }
  .wdm-top { position: absolute; top: 6px; left: 8px; right: 8px; display: flex;
    justify-content: space-between; z-index: 2; pointer-events: none; }
  .wdm-worlds, .wdm-filters { display: flex; align-items: center; gap: 4px; pointer-events: auto; margin-left: auto; }
  .wdm-worlds { margin-left: 0; margin-right: auto; }
  .wdm-worlds.hidden, .wdm-filters.hidden { display: none; }
  .wdm-wname { font-size: 11px; font-weight: 700; letter-spacing: .5px; text-transform: uppercase;
    color: var(--brass-l); padding: 0 4px; background: rgba(13,19,27,.8); border: 1px solid var(--bronze-d);
    border-radius: 4px; height: 24px; display: inline-flex; align-items: center; }
  /* La stessa doppia freccia dello swap chat, ruotata orizzontale. */
  .wdm-sw-ico { transform: rotate(90deg); display: block; }
  /* Il tasto filtri del globo incassato si allinea alla riga alta dei comandi (world switch). */
  #worldmap-overlay.wm-embed .wm-filt-btn { top: 6px; right: 8px; }
  #worldmap-overlay.wm-embed .wm-filt-panel { top: 38px; }
  .wdm-chip { width: 24px; height: 24px; display: grid; place-items: center; border-radius: 4px;
    background: rgba(13,19,27,.8); border: 1px solid var(--bronze-d); color: var(--ink-dim);
    font-size: 11px; font-weight: 700; cursor: pointer; padding: 0; }
  .wdm-chip.on { color: var(--brass-l); border-color: var(--brass); }
  .wdm-chip .gi { width: 13px; height: 13px; }
  #wdm-canvas { position: absolute; inset: 0; width: 100%; height: 100%; cursor: grab; touch-action: none; }
  #wdm-canvas:active { cursor: grabbing; }
  .wdock-card { display: flex; align-items: center; justify-content: center; gap: 8px;
    height: 41px; background: linear-gradient(180deg, #1d2a3b, #121a27);
    border: 1px solid var(--bronze-d); border-radius: 12px; color: var(--ink-dim);
    font-size: 12px; font-weight: 700; letter-spacing: .7px; text-transform: uppercase;
    font-family: var(--font-display);
    cursor: pointer; box-shadow: 0 -4px 16px rgba(0,0,0,.35), inset 0 1px 0 var(--edge-hi); }
  /* Medaglione ANCORATO A SINISTRA (assoluto: la scritta resta centrata sul tasto), più
     grande, col glifo centrato nel disco (background-position esplicito: il vertical-align
     da inline non vale nel flusso assoluto). */
  .wdock-card { position: relative; }
  .wdock-card .gi { position: absolute; left: 10px; top: 50%; transform: translateY(-50%);
    width: 26px; height: 26px; margin: 0; background-position: center; background-size: 60%; }
  .wdock-card .wdock-lbl { line-height: 1; }
  .wdock-card:hover, .wdock-card.on { color: var(--brass-l); border-color: var(--bronze); }
  /* Il globo del medaglione diventa ROSSO quando la mappa è swappata sul Varco: il disco
     d'ottone resta, il pianeta si ridipinge a maschera nel rosso del secondo mondo. */
  .wdock-card.varco .gi-world { background-image: none; }
  .wdock-card.varco .gi-world::after { content: ""; position: absolute; inset: 0;
    background: var(--rust);
    -webkit-mask: url("/assets/ui/world.svg?v=1") center / 60% no-repeat;
    mask: url("/assets/ui/world.svg?v=1") center / 60% no-repeat; }
  /* Il pannello classifiche sotto la calamita: stessa livrea del dock, scroll suo. */
  #wchat-overlay .wdock-lb { pointer-events: auto; height: calc(100dvh - 380px); overflow: hidden;
    display: flex; flex-direction: column;
    background: linear-gradient(180deg, #131c29, #0d131c); border: 1px solid var(--bronze-d);
    border-radius: 12px; padding: 10px; box-shadow: 0 10px 30px rgba(0,0,0,.55); }
  #wchat-overlay .wdock-lb.hidden { display: none; }
  /* Niente card-nella-card: il pannello E' la card, il contenuto si stende a tutta altezza
     e scrolla solo la lista. */
  #wchat-overlay .wdock-lb > .card { background: none; border: none; box-shadow: none;
    padding: 0; margin: 0; flex: 1; min-height: 0; display: flex; flex-direction: column; }
  #wchat-overlay .wdock-lb .lb-scroll { flex: 1; min-height: 0; }
  #wchat-overlay .wdock-lb .lb-scroll.scrolls { max-height: none; }
  /* Le barre isola col mouse: mano che afferra, pugno mentre trascini. */
  /* A schermo pieno (mappamondo, Storico, rapporti) il dock si toglie di mezzo: la sua
     colonna (z 80) galleggiava SOPRA gli overlay (z 70). Regole separate: una lista unica
     con :has() cadrebbe tutta insieme dove :has non c'è. */
  body.wm-lock #wchat-overlay { display: none; }
  body:has(#history-overlay:not(.hidden)) #wchat-overlay { display: none; }
  /* …tranne quando il rapporto è STATO APERTO DALLA CHAT: lì il dock deve restare visibile
     sotto il popup, se no si "esce" dalla conversazione proprio mentre la si sta facendo. */
  body:has(#report-overlay:not(.hidden):not(.rep-onchat)) #wchat-overlay { display: none; }
  body.wm-lock .wdock-left { display: none; }
  body:has(#history-overlay:not(.hidden)) .wdock-left { display: none; }
  body:has(#report-overlay:not(.hidden):not(.rep-onchat)) .wdock-left { display: none; }
  .isl-switcher, .lb-tabs, .shop-sqrow { cursor: grab; }
  .isl-switcher:active, .lb-tabs:active, .shop-sqrow:active { cursor: grabbing; }
  #wchat-overlay.collapsed .chat-head .gi-chat { width: 13px; height: 13px; margin-right: 6px; }
  #wchat-overlay.collapsed .chat-head .chat-x { color: var(--brass); }
  #wchat-overlay.collapsed .chat-head .chat-x svg { color: var(--brass); }
  #wchat-overlay.collapsed .chat-stream,
  #wchat-overlay.collapsed .chat-composer,
  #wchat-overlay.collapsed .wchat-resize { display: none; }
  #wchat-overlay.collapsed .wchat-collapse { transform: rotate(180deg); }
  /* Pallino "nuovi messaggi" sull'header del dock quando è collassato. */
  #wchat-overlay .wchat-head-dot { position: absolute; top: 8px; left: 8px; width: 9px; height: 9px;
    border-radius: 50%; background: radial-gradient(circle at 35% 30%, #ff7a5c, var(--rust) 60%, #8d2e1c);
    border: 1.5px solid #2a0c06; display: none; }
  #wchat-overlay.collapsed.has-unread .wchat-head-dot { display: block; }
}
/* PANORAMICA D'IMPERO FISSA nella colonna sinistra: solo desktop largo (≥1100), speculare
   al dock destro. Testata come le calamite (non cliccabile), corpo che scrolla da solo. */
.wdock-left { display: none; }
@media (min-width: 1100px) {
  .wdock-left { position: fixed; z-index: 40; bottom: 16px; display: flex;
    flex-direction: column; gap: 8px; }
  .wdock-left.hidden { display: none; }
  /* Niente barra visibile: si scorre con la rotella, la colonna resta pulita. */
  .wdock-left .wdock-left-body { flex: 1; min-height: 0; overflow-y: auto;
    overflow-x: hidden; scrollbar-width: none; border-radius: 12px; }
  .wdock-left .wdock-left-body::-webkit-scrollbar { display: none; }
  .wdock-left .lr-pano { display: flex; flex-direction: column; gap: 8px; }
  .wdock-left .lr-pano .card { margin: 0; }
  /* Tessere navi a 6 per fila (la regola auto-fill da 86px ne farebbe 4 su ~400px). */
  #views .wdock-left .bf-units { grid-template-columns: repeat(6, 1fr); }
}

/* Maniglia resize + chevron di collasso: solo da desktop (su mobile la chat è a schermo intero).
   Il tasto SWAP globale⇄gilda invece c'è OVUNQUE: è utile anche su mobile/tablet. */
.wchat-resize, #wchat-overlay .wchat-head-dot, .wchat-collapse, .wdock-cards { display: none; }
.wchat-swap { display: grid; place-items: center; }
.wchat-swap svg { transform: rotate(90deg); }
/* In modalità GILDA la campanella (avvisi chat globale) sparisce ovunque: lì è inutile. */
#wchat-overlay.guild-mode .wchat-bell { display: none; }
@media (min-width: 900px) {
  #wchat-overlay .wchat-collapse { display: grid; place-items: center; }
  #wchat-overlay .wchat-closebtn { display: none; }   /* da desktop non si "chiude": si collassa */
  /* Da desktop il dock è sempre agganciato → il bottone chat nell'header è ridondante: via.
     (stessa specificità della regola profile-mode che lo mostra, ma successiva → vince). */
  .topbar.profile-mode #wchat-btn { display: none; }
  /* Da desktop lo spazio avanza: la modale di gilda se lo prende (86 → 94vh, otto punti di
     conversazione in più) e la testata torna a respirare. Su telefono e tablet resta bassa. */
  #chat-overlay .chat-sheet { max-height: 94vh; }
  #chat-overlay .chat-head { padding: 8px 16px; }
}
/* Meta della chat globale: stemma di gilda piccolo + [TAG] tra nome ed età del messaggio. */
.cm-gld { display: inline-flex; align-items: center; gap: 2px; }
.cm-gld .crestbadge { width: 14px; height: 14px; font-size: 10px; flex: none; }
.cm-gld .crestbadge .cricon { width: 9px; height: 9px; }
.cm-gtag { color: var(--brass-l); letter-spacing: .04em; }
/* Grab-handle brunito (gradiente d'ottone), come la tendina isole. */
.chat-sheet::before { content: ""; position: absolute; top: 7px; left: 50%; transform: translateX(-50%); width: 44px; height: 4px; border-radius: 999px; background: linear-gradient(90deg, var(--bronze-d), var(--brass), var(--bronze-d)); opacity: .7; }
/* Cucitura d'ottone appena sotto il bordo superiore (stesso seam delle card/accordion e della tendina isole). */
.chat-sheet::after { content: ""; position: absolute; left: 16px; right: 16px; top: 0; height: 2px; background: linear-gradient(90deg, transparent, var(--brass) 22%, var(--brass-l) 50%, var(--brass) 78%, transparent); opacity: .5; pointer-events: none; }
/* Testata bassa di suo: su telefono e tablet la chat è a schermo intero e ogni pixel speso in
   cornice è un messaggio in meno a video (il titolo occupava quasi trenta pixel di aria). Su
   desktop, dove lo spazio avanza, la regola più sotto gliene ridà un po'. */
.chat-head { display: flex; align-items: center; justify-content: space-between; padding: 6px 16px; border-bottom: 1px solid rgba(195,156,95,.18); }
.chat-title { font-family: var(--font-display); letter-spacing: .6px; font-size: 14px; }
.chat-title b { color: var(--brass-l); }
/* .chat-x: forma dal canone del tasto a solo glifo, piu' su. */
.chat-head-btns { display: flex; align-items: center; gap: 8px; }
/* Campanella avvisi chat globale: attiva = piena; spenta = barrata + spenta. */
.wchat-bell { display: grid; place-items: center; padding: 0; }
.wchat-bell .wchat-bell-slash { display: none; }
.wchat-bell.off { color: var(--ink-dim); }
.wchat-bell.off .wchat-bell-slash { display: block; }
.chat-pinned { padding: 10px 12px 2px; display: flex; flex-direction: column; gap: 8px; max-height: 28vh; overflow-y: auto; }
.chat-directive { display: flex; align-items: flex-start; gap: 8px; padding: 8px 10px; border-radius: 12px; border: 1px solid var(--bronze-d); background: linear-gradient(180deg, rgba(233,181,74,.15), rgba(233,181,74,.04)); cursor: pointer; }
.chat-directive:hover { border-color: var(--brass); }
.cd-ico { flex: none; display: inline-flex; align-items: center; margin-top: 1px; }
.cd-ico .gi { width: 16px; height: 16px; }
.cd-txt { flex: 1; min-width: 0; }
.cd-remove { flex: none; font-size: 13px; line-height: 1; color: var(--ink-dim); padding: 2px 4px; margin: -2px -2px 0 0; background: none; border: 0; cursor: pointer; border-radius: 4px; }
.cd-remove:hover { color: var(--rust); background: rgba(195,75,48,.14); }
/* Testo troncato a 2 righe con "…"; card .expanded → testo intero. */
.cd-body { font-size: 13px; color: var(--ink); line-height: 1.4;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.chat-directive.expanded .cd-body { -webkit-line-clamp: unset; overflow: visible; }
.cd-meta { font-size: 11px; color: var(--ink-dim); margin-top: 2px; }

/* Tasto Bacheca nella testata chat (accanto alla ✕) */
.chat-board-btn { display: inline-flex; align-items: center; justify-content: center; }
.chat-board-btn .gi { width: 18px; height: 18px; }
/* .chat-head e' gia' dichiarata sopra: qui resta solo cio' che aggiunge davvero. */
.chat-head { gap: 8px; }
.chat-head .chat-title { margin-right: auto; }

/* ===== Assalti di gilda in volo: striscia sotto l'header chat + barre nel popup dossier =====
   STESSO componente delle strip di Azioni/Unità (ps-group/ps-row: barra sottile, contatore,
   chevron, coda a scomparsa) — qui si tara solo il COLORE: livrea acc-rosso già di casa
   (riempimento ruggine), fondo velato del brace della chat. */
.chat-attacks { border-bottom: 1px solid rgba(195,156,95,.18); background: rgba(150,32,22,.14); }
/* Allineata ai 16px dell'header della chat (le strip di pagina stanno a 12). */
.chat-attacks .ps-toggle { padding: 4px 16px; }
.chat-attacks .ps-detail-pad { padding: 4px 16px; }
/* Nome → bersaglio nella riga: la strip di pagina non ne ha bisogno (lì parla l'icona), qui
   il NOME è l'informazione — chi della ciurma sta volando, su chi. */
.ga-t { flex: 0 1 auto; min-width: 0; font-size: 11px; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Le righe-volo dentro il popup del dossier (fra carta e piede): le STESSE righe-flotta della
   Panoramica (fleetRow, accento acc-pvp → --acc ruggine su barra e punta), che si estendono su
   flotta e potenza. Qui solo il respiro fra carta e righe. */
.ga-list { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; }
/* Niente rail rosso a sinistra: qui il rosso lo dice già la barra — il rail è il codice delle
   card categoria della Panoramica, e in un popup di sole righe uguali non distingue niente. */
.ga-list .fleet-row-wrap { margin: 0; border-left: 1px solid #0c1116; }
/* E niente anello --acc quando la riga è aperta (in Panoramica segna QUALE riga hai aperto in
   mezzo a venti; qui le righe sono due e il rosso attorno leggeva come un bordo sbagliato). */
.ga-list .fleet-row-wrap.open { box-shadow: inset 0 1px 0 var(--edge-hi); }
/* Il condividi in coda a ogni battaglia dello Storico: minimale, solo outline, ULTIMO
   elemento dentro il corpo della card — così è chiaro a quale rapporto appartiene. */
.hist-share { margin: 12px 0 0; }
.hist-share .btn { width: 100%; }
/* Il registro dell'operazione: chi ha già colpito resta nel popup con la riga tinta
   dell'esito — VELATURA verde o rossa (mai glow, mai rail) e il verdetto scritto dove i
   voli vivi hanno il timer. Dentro l'espansa: superstiti coi badge perdite, e il bottino. */
.ga-list .fleet-row-wrap.ga-won { background: rgba(74,222,128,.06); }
.ga-list .fleet-row-wrap.ga-lost { background: rgba(180,36,58,.10); }
.ga-esito.ok { color: var(--good); }
.ga-esito.ko { color: var(--rust-l); }
/* Sul medaglione il volto dell'attaccante, alla stessa taglia del tondo (30px). */
.ga-list .fr-ico { overflow: hidden; }
.ga-list .fr-ico .av-img, .ga-list .fr-ico img { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; }
/* Il popup dal messaggio: il piede porta l'Attacca già puntato — niente barra di fondo, solo
   il tasto a larghezza carta. E l'«Attacca con questa intel» DENTRO la carta si spegne: due
   tasti per lo stesso gesto nello stesso popup sono uno di troppo. */
.report-overlay.rep-onchat .report-foot { border-top: none; background: none; padding: 10px 0 0; }
.report-overlay.rep-onchat .fr-recall { display: none; }

/* Bacheca: elenco avvisi (albo delle direttive) */
.board-list { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; min-height: 130px; }
.board-item { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--bronze-d); background: linear-gradient(180deg, rgba(233,181,74,.12), rgba(233,181,74,.03)); }
.board-item .bd-av { flex: none; }
.bd-main { flex: 1; min-width: 0; }
.bd-body { font-size: 13px; color: var(--ink); line-height: 1.45; white-space: pre-wrap; word-break: break-word; }
.bd-meta { font-size: 11px; color: var(--ink-dim); margin-top: 4px; }
.bd-remove { flex: none; font-size: 14px; line-height: 1; color: var(--ink-dim); background: none; border: 0; cursor: pointer; padding: 2px 4px; border-radius: 8px; }
.bd-remove:hover { color: var(--rust); background: rgba(195,75,48,.14); }
.chat-stream { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; min-height: 130px; }
/* Altri: bolla a sinistra, avatar a DESTRA (row-reverse). Miei: bolla a destra, avatar a
   SINISTRA (row normale). Così l'icona sta sempre sul lato interno verso il centro. */
/* -webkit-touch-callout: la pressione lunga sul messaggio apre le reaction, non il menu di
   sistema di iOS (che sarebbe uscito sopra il popup). Il testo resta selezionabile. */
.chat-msg { max-width: 86%; align-self: flex-start; display: flex; gap: 6px; align-items: flex-start; flex-direction: row-reverse; -webkit-touch-callout: none; }
.chat-msg.mine { align-self: flex-end; flex-direction: row; }
/* Avatar del capitano accanto alla bolla. */
.cm-av { flex: none; }
.cm-av.av-slot.av-sm { width: 36px; height: 36px; font-size: 18px; }
.chat-msg:not(.mine) .cm-av { cursor: pointer; }
.cm-main { min-width: 0; }
/* Stella del Generale di guerra: dorata, luminosa, allineata all'avatar (lato esterno). */
.gen-star { flex: none; align-self: flex-start; display: inline-flex; align-items: center; height: 26px; margin-top: 1px; }
.gen-star .gi { width: 15px; height: 15px; /* filter glow rimosso */ }
/* Coroncina oro del Fondatore in chat (come la stella del Generale, ma senza glow). */
.gen-crown { flex: none; align-self: flex-start; display: inline-flex; align-items: center; height: 36px; }
.gen-crown .gi { width: 22px; height: 22px; }
/* Medaglia dell'Ufficiale in chat (grado di gilda, accanto all'avatar come corona/stella). */
.gen-off { flex: none; align-self: flex-start; display: inline-flex; align-items: center; height: 36px; }
.gen-off .gi { width: 18px; height: 18px; }
/* Marker RICERCATO (taglia attiva): icona cliccabile accanto al grado, ovunque. Più grande e con
   un contorno scuro + leggera schiaritura → ben visibile su qualsiasi sfondo (anche sull'oro del "tu"). */
.wanted-badge { display: inline-flex; align-items: center; cursor: pointer; vertical-align: -3px; margin-left: 2px; }
.wanted-badge .gi { width: 18px; height: 18px; filter: brightness(1.18) drop-shadow(0 0 1px rgba(0,0,0,.75)) drop-shadow(0 1px 1px rgba(0,0,0,.5)); }
.wanted-badge:hover .gi { filter: brightness(1.4) drop-shadow(0 0 1px rgba(0,0,0,.75)); }
.cm-wanted { flex: none; align-self: flex-start; margin-top: 2px; }
.cm-wanted .gi { width: 19px; height: 19px; }
.cm-nm { font-weight: 700; }
/* Nome colorato per ruolo in chat (Fondatore ambra, Ufficiale viola); membri = colore meta. */
.cm-bubble { padding: 8px 10px; border-radius: 12px; border-top-left-radius: 4px; font-size: 13px; line-height: 1.35; background: var(--panel-2); border: 1px solid #0c1116; box-shadow: inset 0 1px 0 rgba(255,255,255,.05); word-break: break-word; }
.chat-msg.mine .cm-bubble { border-top-left-radius: 13px; border-top-right-radius: 4px; background: linear-gradient(180deg, var(--bronze), var(--bronze-d)); color: #241a0b; border-color: #5d4828; }
.cm-meta { font-size: 10px; color: var(--ink-dim); margin-top: 2px; padding: 0 4px;
  display: flex; align-items: center; flex-wrap: wrap; gap: 4px; line-height: 1.1; }
.chat-msg.mine .cm-meta { justify-content: flex-end; }
.cm-flag { font-size: 10px; color: var(--amber-l); }
/* --- Coordinamento in chat (11/08/2026): quote, carte-rapporto, reaction, menzioni ---
   Tutto su pezzi già in uso: velature scure, bordi bronzo, chip. Niente glow, niente rail. */
.cm-quote { padding: 4px 8px; margin-bottom: 6px; border-radius: 8px; background: rgba(0,0,0,.28);
  color: var(--ink-dim); font-size: 12px; cursor: pointer; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; max-width: 100%; }
.cm-quote b { color: var(--ink); }
.chat-msg.mine .cm-quote { background: rgba(0,0,0,.18); color: #241a0b; }
.chat-msg.mine .cm-quote b { color: #241a0b; }
/* La carta-rapporto in chat: VELATURA scura, non un pannello — la bolla la incornicia già,
   un secondo bordo e un fondo pieno erano una scatola nella scatola (e il blu di plancia
   dentro l'ottone stonava). Traslucida funziona su entrambi i lati: sulle bolle bronzo si
   scurisce quanto basta a far leggere icone e numeri disegnati per il buio, su quelle scure
   è un lieve incasso. Inchiostro chiaro sempre, niente varianti. */
/* Fondo a BRACE: rosso scuro che sfuma in nero, in diagonale — vetro fumé rosso, sempre
   semitrasparente ma DECISO (la prima versione era slavata: troppo poco pigmento e il bronzo
   della bolla la infangava). L'inchiostro chiaro ci sta sopra netto. */
/* TESTATA PIENA, CORPO VELATO — come le carte di rapporto grandi: la fascia col titolo tiene
   il colore, sotto il fondo si alleggerisce e lascia respirare il brace della chat. Una carta
   tutta opaca sembrava incollata sopra la conversazione invece che dentro. */
/* LA TAVOLOZZA DELLE CARTE IN CHAT (13/08/2026, ordine del committente): ogni genere la sua
   fascia — battaglia rosso, spionaggio GIALLO come la rotta delle sonde sul mappamondo,
   richieste azzurre, spedizioni personali e condivise la SCALA DELLE RARITÀ (ottone→verde→
   blu→viola→arancio→rosso). Il CORPO invece è quello dei normali messaggi: pannello pieno,
   bordo e filo di luce come `.cm-bubble` — una carta in mezzo alla conversazione deve sembrare
   parte della conversazione. L'unica col corpo velato che sfuma nel fondale è la CACCIA
   (`.rosso`, più sotto): quell'effetto particolare è il Mondo Rosso che filtra, ed è suo.

   UNA RICETTA, N TAVOLOZZE: ogni variante imposta quattro proprietà — testo fascia (--rc-t),
   i due fermi del gradiente (--rc-h1/--rc-h2) e il bordo (--rc-bd) — e la carta si monta da
   sola. Le tinte sono OPACHE e sature-scure, scelte a mano: un rgba sopra il pannello scuro
   desaturava tutto, e il blu usciva ardesia, il giallo senape spenta. Il bordo porta la STESSA
   tinta scurita, così fascia e corpo sono un oggetto solo — bordi nel colore, mai aloni.
   Geometria da bolla (raggio 12, spalla 4 dal lato del parlante): la carta È il messaggio. */
.cm-refcard { display: block; padding: 0 0 6px; margin-bottom: 4px;
  --rc-t: var(--brass-l); --rc-h1: #5a2114; --rc-h2: #3d150c; --rc-bd: #401a10;
  border-radius: 12px; border-top-left-radius: 4px;
  overflow: hidden;
  background: var(--panel-2); border: 1px solid var(--rc-bd);
  color: var(--ink); cursor: pointer; }
.chat-msg.mine .cm-refcard { border-top-left-radius: 12px; border-top-right-radius: 4px; }
/* Bolla che contiene SOLO la carta: la bolla SPARISCE. Un dossier non è una battuta, non ha
   bisogno del fumetto attorno — e la scocca d'ottone (o di plancia) attorno a una carta che ha
   già fondo, raggio e forma propri era una cornice su una cornice. Resta la sola carta, che
   nella colonna dei messaggi si distingue proprio perché NON è una bolla. */
.cm-bubble.has-ref { padding: 0; background: none; border: 0; box-shadow: none; }
.chat-msg.mine .cm-bubble.has-ref { background: none; border: 0; }
.cm-bubble.has-ref .cm-refcard { margin-bottom: 0; }
/* Riga-titolo: icona + etichetta in ottone, la stessa voce della testata del rapporto vero.
   La chiamata alle armi si distingue dal colore del titolo (ruggine), non da un bordo. */
.cm-ref-h { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600;
  color: var(--rc-t); letter-spacing: .02em;
  /* La fascia del titolo resta PIENA e va da bordo a bordo: è l'unico appiglio opaco della
     carta, e senza di lei il corpo non si leggeva più come un oggetto a sé. Il filo di luce
     in alto è la targa d'ottone della plancia; sotto, l'ombra che la stacca dal corpo. */
  padding: 6px 8px; margin-bottom: 2px;
  background: linear-gradient(180deg, var(--rc-h1), var(--rc-h2));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 1px 0 rgba(0,0,0,.4); }
/* CACCIA oltre il Varco: stessa scocca delle altre — bordo tinto, fascia rossa — ma il CORPO
   resta ROSSO, solo OPACO: un pannello monocromo alla stessa luminanza del `--panel-2` delle
   altre carte, virato ruggine. È il Mondo Rosso che filtra, senza più la trasparenza che si
   perdeva nel fondale (provata e ritirata il 13/08/2026: rompeva la serie). */
.cm-refcard.rosso { --rc-t: var(--rust-l); background: #33201b; }
/* Glifo della fascia: a maschera (gi-tint) prende l'ORO del titolo, e un filo più piccolo
   del passo di default — a 1.15em pesava quanto il testo, e la fascia s'era fatta alta. */
.cm-ref-h .gi { width: 12px; height: 12px; }
/* I compagni partiti su UNA riga: chi non ci sta finisce nei «…» — la lista intera, con le
   barre dei voli, è dietro il tocco. Verde «dei nostri», icona compresa (currentColor). */
.cm-ref-r.cm-ref-atk { display: block; color: var(--good);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cm-ref-atk .gi { width: 11px; height: 11px; vertical-align: -0.1em; }
.cm-refcard.rally .cm-ref-h { color: var(--rust-l); }
/* SPIONAGGIO non ancora trasformato in attacco: corpo GIALLASTRO (velatura ambrata, stessa
   trasparenza) sotto la fascia che resta rossa — così l'intel si distingue al volo dalle
   carte Attacco/Battaglia, tutte di brace pieno. */
/* La fascia GIALLA come la rotta delle sonde sul mappamondo (#e9c24a): il dossier era rosso
   in testa come una battaglia, e in una colonna di carte rosse non lo trovavi. Quando qualcuno
   parte la carta perde `.intel` e torna al rosso d'attacco, com'è giusto: si combatte. */
/* Oro AMBRATO, non oliva: la prima versione (#4d3d14) aveva poca saturazione e in colonna
   virava al verdastro. Qui il gradiente è più caldo e più saturo — la rotta delle sonde è
   d'oro, e d'oro deve leggersi anche la fascia. */
.cm-refcard.intel { --rc-t: #f2c94e; --rc-h1: #6b4a10; --rc-h2: #47300a; --rc-bd: #59400f; }
/* RICHIESTA alla ciurma: veste AZZURRINA — qui non si combatte, si dà una mano. */
.cm-refcard.req { --rc-t: #a9d3ea; --rc-h1: #1c4257; --rc-h2: #12303f; --rc-bd: #17384a; }
/* SPEDIZIONI (personali e condivise): fascia nel colore della RARITÀ — gli stessi accenti
   delle card gexped in Gilda: ottone, poi verde blu viola arancio rosso. La rarità sta sulla
   FASCIA (e sul bordo, via le proprietà), quindi la tavolozza si dichiara sulla carta. */
.cm-refcard.gexp.gexp-rar-0 { --rc-h1: #4e3b1c; --rc-h2: #362808; --rc-bd: #423114; }
.cm-refcard.gexp.gexp-rar-1 { --rc-t: #7fd4b3; --rc-h1: #1d5038; --rc-h2: #123826; --rc-bd: #1a4530; }
.cm-refcard.gexp.gexp-rar-2 { --rc-t: #86c4ec; --rc-h1: #1d4560; --rc-h2: #123043; --rc-bd: #1a3c52; }
.cm-refcard.gexp.gexp-rar-3 { --rc-t: #b7a2ff; --rc-h1: #382a66; --rc-h2: #251b47; --rc-bd: #302458; }
.cm-refcard.gexp.gexp-rar-4 { --rc-t: #f0b46c; --rc-h1: #5a3812; --rc-h2: #3f260b; --rc-bd: #4d300f; }
.cm-refcard.gexp.gexp-rar-5 { --rc-t: #f08a7c; --rc-h1: #5c221b; --rc-h2: #401511; --rc-bd: #4f1d16; }
/* Il contatore degli impegnati: niente spade davanti (la fascia ne ha già una nel titolo, e
   due nella stessa riga leggevano come due cose diverse). Allineato al centro della fascia. */
.cm-ref-h .cm-ref-n { margin-left: auto; font-weight: 400; font-size: 11px; color: var(--ink);
  white-space: nowrap; display: flex; align-items: center; line-height: 1;
  /* flex collassa lo spazio fra etichetta e countdown («parte tra1h») → il gap lo ridà */
  gap: 4px; }
/* Il corpo si tiene la sua imbottitura: la carta non ne ha più, perché la fascia del titolo
   deve arrivare a filo dei bordi. */
.cm-refcard > *:not(.cm-ref-h) { padding-left: 8px; padding-right: 8px; }
.cm-refcard .subtle { font-weight: 400; color: var(--ink-dim);
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
/* Lo stemma in chat va alla taglia della riga: 21px erano un bottone su un testo da 12. */
.cm-refcard .tgt-guild { margin-left: 0; font-size: 11px; }
/* Lo stemma alla taglia OTTICA del testo, non a quella nominale: a 14px un medaglione pieno
   d'oro accanto a caratteri da 11-12 sporgeva sopra e sotto la riga e sembrava disallineato
   anche quando i centri coincidevano. A 12 la riga torna una riga sola. */
.cm-refcard .tgt-guild .crestbadge, .cm-refcard .tgt-guild .gi { width: 12px; height: 12px; }
/* Nome e tag alla STESSA taglia: erano 12 e 11, e il gradino faceva leggere il tag come se
   fosse appoggiato più in basso. */
.cm-refcard .subtle, .cm-refcard .tgt-guild, .cm-refcard .tgt-gtag { font-size: 11px; line-height: 1.4; }
/* Anteprima dei numeri dentro la carta di chat: le stesse `cost`/`stat` del rapporto grande,
   rimpicciolite e su una riga che va a capo da sola. Peso normale: sono dati, non un titolo. */
.cm-ref-r { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; margin-top: 4px; font-weight: 400; }
.cm-ref-r .cost, .cm-ref-r .stat { font-size: 11px; gap: 4px; }
.cm-ref-r .ricon { width: 11px; height: 11px; }
.cm-ref-r .gi { width: 11px; height: 11px; }
/* (nessuna variante "mine": la carta resta scura su entrambi i lati — vedi sopra) */
/* Reaction: UNA pastiglia ovale nella riga della firma (nome · ora · Rispondi), non più una
   fila di chip sotto la bolla. Tutte le emoji ricevute dentro lo stesso tag e il totale a
   destra quando sono più d'una — così un messaggio molto reagito occupa comunque una riga
   sola. Fondo velato e bordo bronzo come i chip di prima: qui sotto c'è il brace della chat,
   un fondo pieno ci finiva sopra come una toppa. */
.cm-react { display: inline-flex; align-items: center; gap: 2px; padding: 0 4px;
  border-radius: 999px; background: rgba(0,0,0,.28); border: 1px solid var(--bronze-d);
  line-height: 1.6; vertical-align: -2px; }
/* Bordo in ottone se fra quelle reaction c'è la MIA: la stessa evidenza dei chip di prima. */
.cm-react.mia { border-color: var(--brass); background: rgba(233,181,74,.12); }
/* Ogni emoji nella SUA scatoletta centrata: i glifi della font emoji non hanno tutti le
   stesse metriche (le spade siedono sulla linea di base, il pollice sporge sotto) e in fila
   sulla baseline uno risultava più basso dell'altro. La scatola è PIÙ LARGA del glifo
   (14px per un corpo 11px): su iOS la font emoji disegna ~un quinto oltre il corpo chiesto,
   e nella scatola da 12px il pollice sbordava dalla pastiglia. Centratura SOLO geometrica
   (flex): i vecchi ritocchi per-emoji tarati a occhio sul desktop spostavano i glifi fuori
   mezzeria su ogni altra piattaforma — metriche diverse, correzione sbagliata. */
.cm-rx { display: inline-flex; align-items: center; justify-content: center;
  width: 14px; height: 14px; font-size: 11px; line-height: 1; }
.cm-react b { font-weight: 600; color: var(--ink); font-size: 10px; }
.cm-mention { color: var(--amber-l); font-weight: 700; }
.chat-msg.mine .cm-mention { color: #241a0b; text-decoration: underline; }
.cm-reply-btn { cursor: pointer; color: var(--ink-dim); }
.cm-reply-btn:hover { color: var(--ink); }
.chat-replybar { display: flex; align-items: center; gap: 8px; padding: 6px 12px;
  border-top: 1px solid rgba(195,156,95,.18); background: rgba(0,0,0,.28); font-size: 12px; color: var(--ink-dim); }
.chat-replybar .crb-t { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chat-replybar b { color: var(--ink); }
.chat-mentions { display: flex; flex-wrap: wrap; gap: 4px; padding: 6px 12px;
  border-top: 1px solid rgba(195,156,95,.18); background: rgba(0,0,0,.28); }
.cm-emoji-bar { display: flex; justify-content: center; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
/* Bottone com'è, emoji PIÙ PICCOLA e centrata: a 18px riempiva tutto il tasto e la fila
   sembrava una griglia di faccine, non una barra di scelta. Il grid la centra su tutti e due
   gli assi — l'allineamento di riga del testo la spingeva in basso. */
.cm-emoji { font-size: 14px; min-width: 42px; display: grid; place-items: center; padding: 0; }
.cm-emoji.on { border-color: var(--brass); background: rgba(233,181,74,.12); }
/* Esito nella mini-carta: stessi colori dei verdetti dei rapporti (palette di plancia). */
.rv-win  { color: var(--good); }
.rv-loss { color: var(--rust-l); }
.rv-draw { color: var(--ink-dim); }
.chat-composer { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-top: 1px solid rgba(195,156,95,.18); }
/* font-size 16px OBBLIGATORIO: sotto i 16px iOS Safari ZOOMA la pagina al focus del campo —
   era metà del bug "riquadro nero sul compositore" segnalato da iPhone. */
.chat-composer textarea { width: 100%; box-sizing: border-box; resize: none; min-height: 42px; max-height: 100px; background: var(--sky-0); color: var(--ink); border: 1px solid #0b0f13; border-radius: 8px; padding: 10px 10px; font: inherit; font-size: 16px; box-shadow: inset 0 2px 4px rgba(0,0,0,.45); }
.chat-composer textarea:focus { outline: none; border-color: var(--brass); }
/* Actions row aligned under the text box: officer icon-buttons + Invia, same height */
.chat-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; }
/* Il menu delle richieste sta da SOLO a sinistra (margin-right auto), pin/megafono/invio a
   destra. Stretto come il tasto-invio della chat (stesse misure e specificità: le regole
   della veste gilda pesano di più di una classe sola); le tre linee sono DISEGNATE e in
   ottone — il glifo ☰ non c'è in tutte le font e usciva un rettangolo muto. */
#chat-overlay .chat-actions .chat-req-btn, #wchat-overlay .chat-actions .chat-req-btn {
  margin-right: auto; width: 40px; min-width: 0; flex: none; padding: 0;
  display: grid; place-items: center; }
.req-burger { display: flex; flex-direction: column; justify-content: center; gap: 4px; width: 16px; }
.req-burger i { display: block; height: 2px; border-radius: 999px; background: var(--brass-l); }
/* Le risposte nel popup della richiesta: nome + chip CENTRATI sulla stessa riga flex. */
.req-resp { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Il selettore d'isola del form richieste: una riga per isola, TINTA del suo colore identità
   (--ric da _islPalColor: madre blu, colonie la loro palette) — velatura e bordo nel colore,
   mai glow. Il colore fa da secondo nome: si vede al volo DOVE si sta chiedendo. */
.req-isles { display: flex; flex-direction: column; gap: 6px; }
.req-isl { display: flex; align-items: center; gap: 8px; width: 100%; padding: 6px 8px;
  border-radius: 8px; text-align: left; cursor: pointer; font-size: 13px; color: var(--ink);
  background: color-mix(in srgb, var(--ric, #5b87c9) 8%, transparent);
  border: 1px solid color-mix(in srgb, var(--ric, #5b87c9) 35%, #0c1116); }
.req-isl.on { border-color: var(--ric, #5b87c9);
  background: color-mix(in srgb, var(--ric, #5b87c9) 18%, transparent); }
.req-isl .req-isl-nm { font-weight: 600; }
.req-isl small { margin-left: auto; }
/* Il form della richiesta nel popup: etichette piccole sopra i campi, respiro fra i blocchi. */
.req-form .req-lbl { margin: 10px 0 4px; font-size: 11px; }
.req-form .req-lbl:first-child { margin-top: 0; }
.req-form .logi-res { margin-top: 6px; }
.chat-actions .btn { min-height: var(--btn-h-sm); height: var(--btn-h-sm); }
.chat-actions .btn-officer { width: 42px; padding: 0; flex: none; }
.chat-actions .btn-bronze { min-width: 72px; }
/* Tasto invio (chat globale + gilda) OVUNQUE: tondo compatto scuro con l'icona Enter, niente
   più "Invia" testuale. Stessa resa su desktop, tablet e mobile (riflesso dallo stile desktop). */
.wchat-send-txt { display: none; }
.wchat-send-ico { display: block; width: 15px; height: 15px; color: var(--brass-l); margin: auto; }
.chat-actions .wchat-send-btn { min-width: 0; width: 44px; padding: 0; display: grid; place-items: center;
  background: var(--sky-0); border: 1px solid #0b0f13; color: var(--brass-l); box-shadow: inset 0 2px 4px rgba(0,0,0,.45); }
.chat-actions .wchat-send-btn:hover { border-color: var(--brass); color: var(--brass); }
.wchat-send-btn:hover .wchat-send-ico { color: var(--brass); }
/* Chat di GILDA: stesso STILE dell'input della chat globale (fondo scuro come la textbox,
   bordo scuro, contenuto ottone, ombra interna) — il LAYOUT resta quello (pin/megafono/Invia). */
#chat-overlay .chat-actions .btn {
  background: var(--sky-0); border: 1px solid #0b0f13; color: var(--brass-l);
  box-shadow: inset 0 2px 4px rgba(0,0,0,.45); text-shadow: none;
}
#chat-overlay .chat-actions .btn:hover { border-color: var(--brass); color: var(--brass); }
/* Pin + megafono: le due gi partono da fill diversi (pin oro, megafono nero) → normalizzo a nero
   e ritinto in OTTONE CHIARO come l'icona Enter, così i tre tasti hanno lo stesso colore. */
/* Colore UNIFORME per tutte e tre le icone (pin/megafono/invio): stesso ottone chiaro pallido
   di --brass-l, niente glow né tinte accese diverse tra loro. */
#chat-overlay .chat-actions .btn-officer .gi {
  filter: brightness(0) saturate(100%) invert(87%) sepia(18%) saturate(420%) hue-rotate(356deg) brightness(99%) contrast(90%);
  opacity: 1;
}
#chat-overlay .chat-actions .btn-officer:hover .gi { filter: brightness(0) saturate(100%) invert(87%) sepia(18%) saturate(420%) hue-rotate(356deg) brightness(99%) contrast(90%); }
/* Icona bacheca (scroll) nell'header della chat di gilda: ORO come la nuvoletta del titolo
   accanto — stessa ricetta di filtro delle azioni ufficiale qui sopra, non un secondo giallo.
   La ✕ resta bianca: è chiusura, non un'azione di gilda. */
#chat-overlay .chat-head .chat-x .gi {
  filter: brightness(0) saturate(100%) invert(87%) sepia(18%) saturate(420%) hue-rotate(356deg) brightness(99%) contrast(90%);
  opacity: 1;
}
/* Officer actions (Fissa direttiva / Comunicato): gold OUTLINE only (no fill), yellow icon */
.btn-officer { background: transparent; color: var(--amber); border: 1.5px solid var(--amber); box-shadow: none; }
.btn-officer:hover { background: rgba(233,181,74,.12); }
.btn-officer .gi { width: 20px; height: 20px; filter: none; opacity: 1; }

/* Donate control (Skill Tree treasury) */
.don-field { min-height: 38px; background: var(--sky-0); color: var(--ink); border: 1px solid #0b0f13; border-radius: 8px; padding: 0 10px; font: inherit; font-size: 14px; box-shadow: inset 0 2px 4px rgba(0,0,0,.45); }
.don-field#don-res { flex: 0 0 auto; }
/* Freccia del <select> BIANCA e identica su ogni browser/OS: tolgo l'arrow di sistema
   (che iOS/Android/Chrome disegnano ognuno a modo loro) e ne disegno una custom in SVG. */
select.don-field {
  -webkit-appearance: none; -moz-appearance: none; appearance: none;
  padding-right: 32px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; background-size: 12px;
}
select.don-field::-ms-expand { display: none; }
.don-field#don-amt { flex: 1 1 80px; min-width: 0; width: 80px; }

/* Dropdown IN-GAME: rimpiazza i <select> nativi (che aprono il picker del dispositivo, diverso
   su iOS/Android/desktop e fuori dal tema). Il trigger riusa .don-field; il pannello vive nella
   pagina. La scelta la scrive un <input type=hidden> con lo STESSO id del vecchio select. */
.csel { position: relative; display: inline-flex; vertical-align: middle; }
.csel--block { display: flex; width: 100%; }
.csel-trigger { display: inline-flex; align-items: center; gap: 8px; justify-content: space-between; width: 100%; cursor: pointer; text-align: left; }
.csel-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.csel-arrow { flex: 0 0 auto; color: #fff; transition: transform .15s ease; }
.csel.open .csel-arrow { transform: rotate(180deg); }
.csel-panel { position: absolute; top: calc(100% + 4px); left: 0; z-index: 60; min-width: 100%; max-height: 264px; overflow-y: auto;
  background: var(--sky-0); border: 1px solid #0b0f13; border-radius: 8px; padding: 4px; box-shadow: 0 8px 22px rgba(0,0,0,.55); }
.csel-opt { display: block; width: 100%; text-align: left; background: transparent; border: 0; color: var(--ink);
  font: inherit; font-size: 14px; padding: 8px 10px; border-radius: 4px; cursor: pointer; white-space: nowrap; }
.csel-opt:hover { background: rgba(255,255,255,.08); }
.csel-opt.on { background: rgba(198,150,74,.28); }
.csel-opt.is-off { color: var(--muted, #7c8894); cursor: default; opacity: .65; font-size: 13px; }
.csel-group { font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--muted, #8a97a3); padding: 6px 10px 2px; }

/* Gilda nav glows while a new directive is unseen (silent notification) */
.navbtn.glow .navicon { position: relative; }
.navbtn.glow .navicon::after { content: ""; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; /* glow rimosso */ opacity: 0; animation: gpulse 1.4s ease-in-out infinite; }

/* Pinnacle War (E5): 5x5 tactical map */
.pinn-map { display: grid; gap: 4px; margin: 12px 0 4px; }
.pinn-cell {
  position: relative; aspect-ratio: 1 / 1; border-radius: 8px; cursor: pointer; padding: 0; overflow: hidden;
  border: 1px solid var(--bronze-d); color: var(--ink); display: grid; place-items: center;
  background: radial-gradient(120% 120% at 30% 18%, var(--panel-2), var(--panel-0));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05);
}
.pinn-zic { font-size: 16px; opacity: .85; }
.pinn-cell.z-pinnacolo { border-color: var(--amber); /* glow rimosso */ }
.pinn-cell.z-correnti { background: radial-gradient(120% 120% at 30% 18%, #1c2f33, var(--panel-0)); }
.pinn-cell.z-campi_minati { background: radial-gradient(120% 120% at 30% 18%, #3a2620, var(--panel-0)); border-color: #7d4a3a; }
.pinn-cell.z-nebbia { background: radial-gradient(120% 120% at 30% 18%, #20262b, var(--panel-0)); opacity: .9; }
.pinn-cell.mine  { border-color: var(--good); /* glow rimosso */ }
.pinn-cell.enemy { border-color: var(--rust); }
.pinn-cell.sel   { outline: 2px solid var(--brass-l); outline-offset: 1px; }
.pinn-prize { position: absolute; top: 3px; left: 4px; font-size: 10px; color: var(--amber-l); font-weight: 700; }
.pinn-mycount {
  position: absolute; top: 2px; right: 3px; min-width: 15px; height: 15px; padding: 0 2px; border-radius: 8px;
  background: rgba(121,192,140,.92); color: #0c1a10; font-size: 10px; font-weight: 800; display: grid; place-items: center;
}
.pinn-lead { position: absolute; bottom: 2px; left: 0; right: 0; text-align: center; font-size: 10px; font-weight: 700; }
.pinn-lead.mine { color: var(--good); }
.pinn-lead.enemy { color: var(--rust); }
.pinn-lead.contested { color: var(--amber-l); }
.pinn-roster { display: flex; flex-direction: column; gap: 6px; }
.pinn-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 8px; border-radius: 8px; background: rgba(255,255,255,.03); border: 1px solid var(--bronze-d); flex-wrap: wrap; }
.pinn-row-name { font-size: 13px; font-weight: 600; min-width: 0; flex: 1 1 auto; }
.pinn-row-ctl { display: flex; gap: 6px; flex: none; align-items: center; }
.pinn-row-ctl .btn { min-width: 38px; }
/* Un filo d'aria fra le righe (ordine del committente, 18/08/2026: «separale qualche pixel,
   giusto pochino»). Dentro `.pinn-roster` la spaziatura la fa già il `gap`; qui le righe sono
   figlie dirette della card e si toccavano bordo a bordo, sembrando una griglia unica. */
.card > .pinn-row + .pinn-row { margin-top: 6px; }
/* SCHERMI STRETTI: nome sopra a tutta larghezza, comandi sotto su una riga sola. In fila unica
   i comandi (stepper a quattro tasti + «Richiama») non ci stanno: il nome veniva schiacciato a
   colonna — «Titano di Ottone» si spezzava su tre righe con il sottotitolo a seguire — e il
   tasto Richiama finiva mezzo fuori dallo schermo, cioe' irraggiungibile proprio dove serve
   (segnalato su iPhone, 18/08/2026). Impilare e' l'unica via che tiene i tasti a misura di
   pollice senza rimpicciolire niente. */
@media (max-width: 560px) {
  .pinn-row { align-items: stretch; row-gap: 6px; }
  .pinn-row-name { flex: 1 1 100%; }
  .pinn-row-ctl { flex: 1 1 100%; justify-content: space-between; }
  .pinn-row-ctl > .btn { white-space: nowrap; }
}
.pinn-legend { display: flex; flex-direction: column; gap: 8px; }
.pinn-leg { display: flex; gap: 8px; align-items: flex-start; }
.pinn-leg-ic { font-size: 18px; flex: none; width: 22px; text-align: center; }
.card.pinn-mine { border-left-color: var(--good); }
.card.pinn-won  { border-left-color: var(--amber); /* glow rimosso */ }

/* Guerra del Pinnacolo v2 — phase bar, election, mobilization, battle map */
/* Stepper delle fasi di guerra: nodi con icona uniti da una barra di avanzamento che si
   riempie fino alla fase attiva. Il track e il fill sono posizionati tra i CENTRI del primo
   e dell'ultimo nodo (inset 50%/n con n = numero fasi). */
.war-stepper { position: relative; display: flex; padding: 12px 6px 10px; --n: 4; --active: 0; }
.war-stepper::before, .war-stepper::after {
  content: ""; position: absolute; top: 27px; height: 3px; border-radius: 4px;
  left: calc(50% / var(--n)); pointer-events: none;
}
.war-stepper::before { right: calc(50% / var(--n)); background: var(--slate-3); }
.war-stepper::after { width: calc(var(--active) * 100% / var(--n));
  background: linear-gradient(90deg, var(--brass), var(--amber));
  /* glow rimosso */ transition: width .55s cubic-bezier(.4,.8,.3,1); }
.wst-step { position: relative; z-index: 1; flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 6px; }
.wst-node { width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center; flex: none;
  border: 2px solid var(--slate-3); background: var(--panel-0); color: var(--ink-dim); font-size: 13px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05); transition: all .3s ease; }
.wst-step.done .wst-node { border-color: var(--brass); color: #fff;
  /* icona BIANCA sul pallino pieno d'ottone: il marrone scuro spariva sul gradiente dorato */
  background: linear-gradient(180deg, var(--brass-l), var(--bronze-d)); /* glow rimosso */ }
.wst-step.on .wst-node { position: relative; border-color: var(--amber); color: #fff; background: rgba(233,181,74,.12);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05), 0 0 0 3px rgba(233,181,74,.14); }
.wst-step.on .wst-node::after { content: ""; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; box-shadow: 0 0 0 5px rgba(233,181,74,.26); opacity: 0; animation: gpulse 1.7s ease-in-out infinite; }
.wst-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .4px; font-weight: 700; color: var(--ink-dim); text-align: center; line-height: 1.1;
  /* Le etichette stanno nella loro colonna: «MOBILITAZIONE» è una parola sola più larga dello
     spicchio, e senza queste due righe sbordava sulle vicine — sul telefono si leggeva
     «TREGUAMOBILITAZIONESTRATEGIA» tutto attaccato (18/08/2026). Va a capo invece di invadere. */
  max-width: 100%; overflow-wrap: anywhere; }
/* Schermi stretti: si stringe la spaziatura fra le lettere, non il corpo del testo (la scala
   dei corpi parte da 10px e li' si ferma) — «MOBILITAZIONE» ci sta senza andare a capo. */
@media (max-width: 400px) { .wst-lbl { letter-spacing: 0; } }
.wst-step.done .wst-lbl { color: var(--brass); }
.wst-step.on .wst-lbl { color: var(--amber-l); /* glow rimosso */ }
@media (prefers-reduced-motion: reduce) { .wst-step.on .wst-node::after { animation: none; } }
/* La spada del passo "Battaglia" era argento (#eef2f7, come lo scudo delle stat Att/Dif) e
   stonava con le altre icone-passo, tutte in ottone. La tingo in ottone come le sorelle SENZA
   toccare la swords.svg globale: la uso come maschera e la coloro. */
.wst-node .gi-swords {
  background-image: none;
  background-color: #d2a24a;
  -webkit-mask: url("/assets/ui/swords.svg?v=3") center / contain no-repeat;
  mask: url("/assets/ui/swords.svg?v=3") center / contain no-repeat;
}

/* Riepilogo "Settimana scorsa" (renderWarLastResult): su mobile la riga fitta di "·" era
   illeggibile → intestazione, risultato personale in evidenza, statistiche come chip separate. */
/* «i» dell'Armata: apre chi ha schierato cosa. Tondo piccolo, non un bottone d'azione — non
   deve competere con «INVIA AL FRONTE», che è l'unica cosa da fare in quella schermata. */
/* La «i» va nell'ANGOLO in alto a destra della card, non attaccata al testo: così sta sempre
   nello stesso posto qualunque sia la lunghezza della riga, e l'occhio la trova senza cercarla. */
.war-army-head { display: flex; align-items: center; gap: 6px; }
.war-army-head .war-i { margin-left: auto; }
.war-i { flex: none; width: 17px; height: 17px; padding: 0; border-radius: 50%; cursor: pointer;
  font-family: Cinzel, serif; font-weight: 800; font-size: 11px; line-height: 1;
  color: var(--amber-l); background: transparent;
  border: 1px solid color-mix(in srgb, var(--amber-l) 55%, transparent); }
.war-i:hover { background: color-mix(in srgb, var(--amber-l) 16%, transparent); }
/* Chi ha schierato cosa */
.army-who .aw-row { padding: 6px 0; border-top: 1px solid color-mix(in srgb, var(--bronze-d) 45%, transparent); }
.army-who .aw-row:first-of-type { border-top: 0; }
.army-who .aw-row.mine b { color: var(--good); }
.army-who .aw-top { display: flex; align-items: baseline; gap: 8px; }
.army-who .aw-pw { margin-left: auto; flex: none; font-size: 11px; color: var(--ink-dim);
  font-variant-numeric: tabular-nums; white-space: nowrap; }
/* MAI SCORRIMENTO LATERALE in questo popup (segnalato su iPhone, 18/08/2026). La pillola del
   conteggio (`.bf-ct`) sporge di 4px a destra della tessera: sull'ULTIMA colonna della griglia
   quei 4px rendevano il contenuto piu' largo del riquadro, e `.confirm-body` (overflow auto) si
   lasciava trascinare di lato — con la potenza del capitano tagliata a destra, cioe' il numero
   per cui la lista esiste. Si lascia il posto alla pillola e si taglia il resto; il nome del
   capitano — un token senza spazi, che non sa accorciarsi — finisce in ellissi invece di
   spingere la potenza fuori dal riquadro. */
.army-who { overflow-x: clip; }
.army-who .bf-units { padding-right: 6px; }
.army-who .aw-top b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.army-who .aw-ships { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.army-who .aw-transit { color: var(--ink-dim); font-style: italic; }
.army-who .aw-none { margin-top: 10px; padding-top: 8px;
  border-top: 1px solid color-mix(in srgb, var(--bronze-d) 55%, transparent); }
.army-who .aw-zero { color: var(--ink-dim); opacity: .75; }
.war-recap-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; }
/* PODIO del Verdetto. Gradini di altezza diversa: il primo si riconosce dalla FORMA, prima
   ancora di leggere un numero — è il solo punto della guerra in cui la gerarchia va vista. */
.war-podium { display: flex; align-items: flex-end; justify-content: center; gap: 8px;
  margin: 12px 0 10px; }
.wp-step { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center;
  text-align: center; gap: 2px; }
.wp-step .wp-crest { font-size: 18px; line-height: 1; }
.wp-step .wp-tag { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  max-width: 100%; }
.wp-step .wp-score { font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.wp-prizes { display: flex; flex-direction: column; align-items: center; gap: 2px; margin-bottom: 2px; }
.wp-prize { font-size: 10px; color: var(--amber-l); white-space: nowrap; }
.wp-prize.champ { color: var(--good); }
.wp-prize.none { color: var(--ink-dim); opacity: .6; }
.wp-base { width: 100%; border-radius: 4px 4px 0 0; display: flex; align-items: center;
  justify-content: center; border: 1px solid color-mix(in srgb, var(--bronze-d) 60%, transparent);
  border-bottom: 0; background: linear-gradient(180deg, rgba(120,86,40,.35), rgba(60,42,20,.25)); }
.wp-1 .wp-base { height: 62px; background: linear-gradient(180deg, rgba(214,168,74,.45), rgba(120,86,40,.28)); }
.wp-2 .wp-base { height: 44px; }
.wp-3 .wp-base { height: 32px; }
.wp-rank { font-family: Cinzel, serif; font-weight: 800; font-size: 18px; color: var(--amber-l); }
.wp-1 .wp-rank { font-size: 28px; color: #f4d68a; }
.wp-step.mine .wp-tag b { color: var(--good); }
.wp-step.mine .wp-base { border-color: color-mix(in srgb, var(--good) 55%, transparent); }
@media (max-width: 380px) { .wp-prize { font-size: 10px; } .wp-step .wp-tag { font-size: 11px; } }
.war-recap-title { font-weight: 600; }
.war-recap-you { margin-top: 6px; font-size: 14px; color: var(--ink); }
.war-recap-you b { color: var(--amber-l); }
.war-recap-stats { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.war-recap-stats .chip { font-size: 12px; display: inline-flex; align-items: center; gap: 4px; }
.war-count { margin-top: 6px; font-size: 12px; color: var(--ink); }
.war-count b { color: var(--amber-l); font-variant-numeric: tabular-nums; }
.war-dev { border: 1px solid var(--bronze-d); }
.chip.war-live { position: relative; color: #fff; background: linear-gradient(180deg, var(--rust), #8d2e1c); border-color: #7a2415; }
.chip.war-live::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; background: #fff; opacity: 0; --pk: .12; animation: gpulse 1.1s infinite; }
.war-cands { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; }
.war-cand { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 10px; border: 1px solid var(--bronze-d); border-radius: 8px; background: var(--panel-0); }
.war-cand.voted { border-color: var(--good); box-shadow: inset 0 0 0 1px rgba(121,192,140,.3); }
/* Selettore dei fronti disposto come il TEATRO DI GUERRA: Pinnacolo (centro) fascia in alto,
   le due Ali rettangoli verticali ai lati nel mezzo, Retrovie fascia in basso — i 4 insieme
   formano il campo, così richiama la battaglia ed è meno confuso della griglia 2×2. */
.war-fronts { display: grid; gap: 8px; margin: 10px 0;
  grid-template-columns: 1fr 1fr;
  grid-template-areas: "centro centro" "sx dx" "retro retro"; }
.war-fbtn[data-front="centro"]   { grid-area: centro; }
.war-fbtn[data-front="ala_sx"]   { grid-area: sx; }
.war-fbtn[data-front="ala_dx"]   { grid-area: dx; }
.war-fbtn[data-front="retrovie"] { grid-area: retro; }
/* Le Ali al centro sono "alte" (rettangoli verticali), col testo in basso come le zone del campo. */
.war-fbtn[data-front="ala_sx"], .war-fbtn[data-front="ala_dx"] { min-height: 138px; justify-content: flex-end; }
.war-fbtn { display: flex; flex-direction: column; gap: 2px; align-items: flex-start; padding: 8px 10px; border: 1px solid var(--bronze-d); border-radius: 12px; background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); color: var(--ink); text-align: left; cursor: pointer; }
.war-fbtn.sel { border-color: var(--amber); box-shadow: inset 0 0 0 1px rgba(233,181,74,.35); }
/* Membri (non Generale): i fronti sono un riepilogo, non un selettore — niente cursore a manina. */
.war-fbtn.static { cursor: default; }
.war-fbtn .wf-ic { font-size: 18px; }
.war-fbtn b { font-size: 13px; }
.war-fbtn .wf-star { color: var(--amber-l); font-size: 11px; }
.war-fbtn .wf-pow { color: var(--ink-dim); font-size: 10px; font-variant-numeric: tabular-nums; }
/* Battle map: control lanes + advancing fleet tokens (the "mini graphics engine") */
.war-battlefield { display: flex; flex-direction: column; gap: 10px; }
.wb-front { border: 1px solid var(--bronze-d); border-radius: 12px; padding: 8px 10px; background: radial-gradient(120% 120% at 50% 0%, var(--panel-2), var(--panel-0)); }
/* Tasto "?" regolamento nell'header della Guerra del Pinnacolo */
.war-info-btn { flex: none; width: 20px; height: 20px; margin-left: 6px; padding: 0; border-radius: 50%;
  border: 1px solid var(--brass-d); background: var(--panel-0); color: var(--brass);
  font-size: 12px; font-weight: 700; line-height: 1; cursor: pointer; display: inline-flex;
  align-items: center; justify-content: center; }
.war-info-btn:hover { background: var(--brass-d); color: #241a0b; }
/* Nudge una-tantum al Fondatore: il tasto Regole diventa una pillola dorata che pulsa,
   finché non lo apre (o scoccano le 21:30). width auto per contenere "📖 Regole". */
.war-info-btn.glow-pulse { width: auto; border-radius: 999px; padding: 0 10px; gap: 4px; white-space: nowrap;
  border-color: var(--amber); color: #241a0b; background: var(--amber); }
.war-info-btn.glow-pulse, .warnow-rules.glow-pulse { position: relative; }
.war-info-btn.glow-pulse::after, .warnow-rules.glow-pulse::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; /* glow rimosso */ opacity: 0; animation: gpulse 1.5s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) { .war-info-btn.glow-pulse::after, .warnow-rules.glow-pulse::after { animation: none; } }
/* Stesso nudge sul tasto regolamento della card-guida (bottone pieno): pulsa bordo+tinta ambra
   senza deformare la forma. */
.warnow-rules.glow-pulse { border-color: var(--amber); color: var(--amber-l); font-weight: 700; }
/* Card-guida "cosa fare ADESSO": apre la tab guerra e dice al giocatore il suo compito. */
.warnow { border-left: 3px solid var(--brass); margin-top: 8px; padding: 12px 12px; }
.warnow-mobilitazione { border-left-color: var(--patina); }
.warnow-strategia { border-left-color: var(--brass-l); }
.warnow-battaglia { border-left-color: var(--rust); }
.warnow-verdetto { border-left-color: var(--amber); }
.warnow-head { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--ink); line-height: 1.25; }
.warnow-ic { font-size: 18px; flex: none; }
.warnow-steps { display: flex; flex-direction: column; gap: 4px; margin: 10px 0 2px; }
.warnow-step { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--ink); }
.warnow-step .wns-check { width: 17px; height: 17px; flex: none; border-radius: 50%; border: 1.5px solid var(--bronze-d);
  display: inline-flex; align-items: center; justify-content: center; font-size: 11px; color: transparent; }
.warnow-step.done { color: var(--ink-dim); }
.warnow-step.done .wns-check { background: var(--good); border-color: var(--good); color: #14210f; font-weight: 700; }
.warnow-sub { font-size: 12px; color: var(--ink-dim); line-height: 1.45; margin-top: 8px; }
.warnow-sub b { color: var(--brass-l); font-weight: 700; }
.warnow-next { margin-top: 8px; font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.warnow-next b { color: var(--amber-l); font-family: var(--font-display); }
.warnow-battaglia .warnow-next b { color: #ff9d85; }

/* Banner check-in del Generale (fallback anti-assenza): appare ~10 min prima della battaglia. */
.warci { margin-top: 8px; padding: 12px 12px; border-left: 3px solid var(--brass); }
.warci-me { border-left-color: var(--amber); }
.warci-ok { border-left-color: var(--good); }
.warci-wait { border-left-color: var(--patina); }
.warci-row { display: flex; align-items: flex-start; gap: 10px; }
.warci-ic { font-size: 18px; flex: none; }
.warci-row b { color: var(--ink); font-size: 14px; }
.warci-next { margin-top: 6px; font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.warci-next b { color: var(--amber-l); font-family: var(--font-display); }
.warci-btn { width: 100%; margin-top: 10px; }
.warnow-rules { margin-top: 10px; width: 100%; }

/* Corpo del regolamento (dentro il popup di conferma) */
.war-rules { font-size: 13px; line-height: 1.5; }
.war-rules .wr-intro { margin: 0 0 10px; color: var(--ink); }
/* Heading istituzionali: icona SVG + testo, con filetto d'ottone sotto (look da regolamento). */
.war-rules h4 { display: flex; align-items: center; gap: 6px; margin: 12px 0 4px; padding-bottom: 4px;
  font-family: var(--font-display); font-size: 13px; letter-spacing: .4px; text-transform: uppercase;
  color: var(--brass-l); border-bottom: 1px solid rgba(195,156,95,.22); }
.war-rules h4 .gi { width: 16px; height: 16px; vertical-align: middle; }
.war-rules ul { margin: 4px 0 6px; padding-left: 16px; }
.war-rules li { margin: 2px 0; }
.war-rules li .gi { vertical-align: -0.18em; margin-right: 2px; }
.war-rules p { margin: 4px 0 6px; }
/* Icona nel titolo del popup (confirm-title con titleHtml). */
.confirm-title .gi { width: 18px; height: 18px; vertical-align: -0.22em; margin-right: 4px; }

.wb-front.mine  { border-color: var(--good); }
.wb-front.enemy { border-color: var(--rust); }
.wb-top { display: flex; align-items: center; gap: 6px; font-size: 12px; }
.wb-top .wb-ic { font-size: 16px; }
.wb-top b { flex: 1; }
.wb-top .wb-star { color: var(--amber-l); font-size: 11px; }
.wb-lane { position: relative; height: 16px; margin: 6px 0 4px; border-radius: 8px; background: linear-gradient(90deg, rgba(195,75,48,.18), rgba(255,255,255,.04)); overflow: visible; border: 1px solid var(--bronze-d); }
.wb-fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 8px 0 0 8px; background: linear-gradient(90deg, rgba(121,192,140,.35), rgba(121,192,140,.6)); transition: width .8s ease; }
.wb-front.enemy .wb-fill { background: linear-gradient(90deg, rgba(195,75,48,.35), rgba(195,75,48,.6)); }
.wb-front.none  .wb-fill { background: linear-gradient(90deg, rgba(151,161,169,.25), rgba(151,161,169,.45)); }
.wb-ship { position: absolute; top: 50%; transform: translate(-50%, -50%); transition: left .8s ease; filter: drop-shadow(0 1px 2px rgba(0,0,0,.6)); }
.wb-ship-svg { width: 20px; height: 20px; display: block; }
.wb-ship-svg path { fill: var(--brass-l); }
.wb-front.mine .wb-ship-svg path { fill: var(--good); }
.wb-front.enemy .wb-ship-svg path { fill: #e07a5f; }
.wb-owner { font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
/* ── HUD di battaglia: orologio + la mia posizione + corsa al punteggio ── */
.war-hud .wh-clock { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12px; color: var(--ink); }
.war-hud .wh-clock .gi { width: 13px; height: 13px; vertical-align: -2px; }
.wh-bar { height: 5px; border-radius: 4px; background: rgba(255,255,255,.07); margin: 6px 0 10px; overflow: hidden; }
.wh-bar i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(90deg, var(--bronze-d), var(--amber-l)); transition: width .8s ease; }
/* BATTITO DEL TICK: filo sottile sotto la barra di battaglia che si riempie durante il tick
   corrente e riparte a ogni colpo. Serve a dire «sta girando» nei minuti in cui lo schermo
   non cambia. Animazione CSS pura (nessun timer JS) e si ferma da sola a scheda nascosta. */
.wh-tick { height: 2px; border-radius: 2px; background: rgba(255,255,255,.06); margin: -6px 0 10px; overflow: hidden; }
.wh-tick i { display: block; height: 100%; width: 0; border-radius: 2px; background: var(--patina);
  animation-name: whTick; animation-timing-function: linear; animation-iteration-count: infinite; }
@keyframes whTick { from { width: 0; } to { width: 100%; } }
@media (prefers-reduced-motion: reduce) { .wh-tick i { animation: none; width: 100%; opacity: .35; } }
.wh-me { display: flex; align-items: center; gap: 10px; padding: 8px 12px; margin-bottom: 8px; border-radius: 8px;
  border: 1px solid var(--brass); background: linear-gradient(180deg, rgba(233,181,74,.12), rgba(0,0,0,.18)); }
.wh-rank { font-family: var(--font-display); font-size: 28px; font-weight: 800; color: var(--amber-l); line-height: 1; flex: none; }
.wh-me-tx { min-width: 0; font-size: 13px; }
.wh-me-tx .wh-sub { font-size: 11px; margin-top: 2px; }
.wd-good { color: var(--good); font-weight: 700; }
.wd-bad  { color: var(--rust); font-weight: 700; }
.wd-even { color: var(--amber-l); font-weight: 700; }
/* Barre-punteggio proporzionali: la corsa si VEDE, non si deduce dai numeri. */
.wb-id { flex: 1 1 auto; min-width: 0; }
.wb-id .wb-nm { color: var(--ink-dim); font-size: 11px; }
.wb-scorebar { height: 4px; border-radius: 2px; background: rgba(255,255,255,.06); margin-top: 4px; overflow: hidden; }
.wb-scorebar i { display: block; height: 100%; border-radius: 2px; background: linear-gradient(90deg, rgba(176,141,87,.7), var(--brass-l)); transition: width .8s ease; }
.wb-row.mine .wb-scorebar i { background: linear-gradient(90deg, rgba(121,192,140,.7), var(--good)); }
.wb-pace.zero { color: var(--ink-dim); font-weight: 400; }
.war-board { display: flex; flex-direction: column; gap: 4px; margin-top: 10px; }
.wb-row { display: flex; align-items: center; gap: 6px; padding: 6px 10px; border: 1px solid var(--bronze-d); border-radius: 8px; background: var(--panel-0); font-size: 12px; }
.wb-row.mine { border-color: var(--good); }
/* ── Card-fronte: badge stato, duello di potenza, previsione ── */
.wb-status { flex: none; font-size: 10px; font-weight: 800; letter-spacing: .5px; padding: 2px 6px; border-radius: 999px; border: 1px solid; font-variant-numeric: tabular-nums; }
.wb-status.st-mine   { color: var(--good); border-color: var(--good); background: rgba(121,192,140,.12); }
.wb-status.st-danger { color: #ffb3a0; border-color: var(--rust); background: rgba(195,75,48,.22); animation: wbPulse 1.2s ease-in-out infinite; }
.wb-status.st-enemy  { color: #e07a5f; border-color: var(--rust); background: rgba(195,75,48,.12); }
.wb-status.st-taking { color: var(--amber-l); border-color: var(--amber-l); background: rgba(233,181,74,.14); }
.wb-status.st-none   { color: var(--ink-dim); border-color: var(--slate-3); background: rgba(151,161,169,.1); }
/* Pulse SENZA glow: respira il bordo, niente aloni luminosi. */
@keyframes wbPulse { 50% { border-color: #e07a5f; } }
.wb-front.danger { border-color: var(--rust); box-shadow: inset 0 0 14px rgba(195,75,48,.14); }
.wb-duel { display: flex; align-items: center; gap: 8px; margin: 4px 0 0; font-size: 11px; font-variant-numeric: tabular-nums; color: var(--ink-dim); }
.wb-duel .wd-side { flex: none; } .wb-duel .wd-side.mine { color: var(--good); }
.wd-bar { flex: 1 1 auto; height: 6px; border-radius: 4px; background: rgba(195,75,48,.4); overflow: hidden; }
.wd-bar .wd-mine { display: block; height: 100%; background: var(--good); border-radius: 4px 0 0 4px; transition: width .8s ease; }
.wb-verdict { font-size: 11px; margin-top: 2px; }
/* CHI CONTENDE il fronte: una barra con un segmento per gilda + la legenda scritta. Sostituisce
   il duello a due, che su un fronte conteso da sei ne mostrava due e nascondeva le altre. */
.wc-bar { display: flex; gap: 1px; height: 7px; margin-top: 4px; border-radius: 4px;
  overflow: hidden; background: rgba(0,0,0,.35); }
/* Colori SOLO sui segmenti della barra: le stesse classi stanno anche sulle righe della
   legenda, e senza questo vincolo le riempivano di colore rendendo il testo illeggibile. */
.wc-bar i { display: block; height: 100%; transition: width .8s ease; }
.wc-bar i.wc-mine { background: var(--good); }
.wc-bar i.wc-ctrl { background: var(--amber-l); }
.wc-bar i.wc-foe  { background: color-mix(in srgb, var(--rust) 78%, transparent); }
/* Una gilda per RIGA: in tessere strette sei nomi affiancati si incollavano fra loro
   («3.8k[W501]»), e l'elenco diventava illeggibile proprio dove serve leggerlo in fretta. */
.wc-legend { display: flex; flex-direction: column; gap: 2px; margin-top: 6px;
  font-size: 10px; color: var(--ink-dim); }
.wc-legend .wc-leg { display: flex; align-items: center; gap: 4px; white-space: nowrap;
  line-height: 1.5; }
.wc-legend .wc-leg b { flex: 0 0 auto; }
/* Potenza a larghezza fissa e cifre tabulari: le frecce restano incolonnate e la riga si
   scorre in verticale senza inseguire i numeri. */
.wc-legend .wc-pw { margin-left: auto; font-variant-numeric: tabular-nums; }
.wc-legend .wc-up { color: var(--good); font-size: 10px; }
.wc-legend .wc-dn { color: var(--rust); font-size: 10px; }
.wc-legend .wc-eq { color: var(--ink-dim); opacity: .5; font-size: 10px; }
.wc-legend .wc-leg::before { content: ""; width: 7px; height: 7px; border-radius: 2px;
  flex: none; background: currentColor; opacity: .85; }
.wc-legend .wc-mine { color: var(--good); }
.wc-legend .wc-ctrl { color: var(--amber-l); }
.wc-legend .wc-foe { color: color-mix(in srgb, var(--rust) 85%, var(--ink-dim)); }
.wc-legend .wc-count { font-weight: 800; color: var(--ink); margin-bottom: 2px;
  letter-spacing: .3px; text-transform: uppercase; font-size: 10px; }
.wc-legend .gi { width: 10px; height: 10px; }
.wb-cast { font-size: 11px; margin-top: 4px; padding: 4px 8px; border-radius: 8px; }
.wb-cast .gi { width: 12px; height: 12px; vertical-align: -2px; }
.wb-cast.good { color: var(--good); background: rgba(121,192,140,.09); }
.wb-cast.bad  { color: #ffb3a0; background: rgba(195,75,48,.13); }
.wb-cast.hold { color: var(--ink-dim); background: rgba(255,255,255,.04); }
/* Anteprima dopo-mossa sui chip-bersaglio della console. */
.war-tgt .wt-prev { display: block; width: 100%; font-size: 10px; margin-top: 2px; font-variant-numeric: tabular-nums; }
.wd-tag-mine { color: var(--good); }
.wd-tag-foe  { color: #e07a5f; }

/* ── TEATRO DI GUERRA: il campo spaziale (ali · Pinnacolo · retrovie) ── */
.war-theatre { display: grid; gap: 6px;
  grid-template-areas: "sx centro dx" "retro retro retro";
  grid-template-columns: 1fr 1.22fr 1fr; }
.wz-ala_sx { grid-area: sx; } .wz-centro { grid-area: centro; }
.wz-ala_dx { grid-area: dx; } .wz-retrovie { grid-area: retro; min-height: 0; }
@media (max-width: 470px) {   /* schermi stretti: Pinnacolo in cima a tutta larghezza */
  .war-theatre { grid-template-areas: "centro centro" "sx dx" "retro retro"; grid-template-columns: 1fr 1fr; }
}
.wz { position: relative; border: 1px solid var(--bronze-d); border-radius: 12px; overflow: hidden;
  min-height: 150px; background: radial-gradient(130% 130% at 50% 0%, var(--panel-2), var(--panel-0)); }
.wz-centro { border-width: 2px; border-color: var(--brass); box-shadow: inset 0 1px 0 var(--edge-hi); }
.wz-retrovie { min-height: 96px; }
/* Il TERRENO della zona si tinge di chi lo controlla: altezza = controllo%. */
.wz-terr { position: absolute; left: 0; right: 0; bottom: 0; height: var(--ctl, 0%); z-index: 0;
  background: linear-gradient(180deg, transparent, rgba(121,192,140,.34)); transition: height .8s ease; }
.wz.enemy .wz-terr { background: linear-gradient(180deg, transparent, rgba(195,75,48,.32)); }
.wz.none  .wz-terr { background: linear-gradient(180deg, transparent, rgba(151,161,169,.22)); }
.wz.mine  { border-color: var(--good); }
.wz.enemy { border-color: var(--rust); }
.wz.danger { animation: wbPulse 1.2s ease-in-out infinite; }
/* Flip di controllo: la zona LAMPEGGIA quando cambia padrone (flash di luminosità, no glow). */
.wz.flipped { animation: wzFlip 1.8s ease; }
@keyframes wzFlip { 20% { filter: brightness(1.55); } 100% { filter: brightness(1); } }
.wz-in { position: relative; z-index: 1; padding: 8px 10px 10px; display: flex; flex-direction: column; gap: 4px; height: 100%; }
.wz-head { display: flex; align-items: center; gap: 6px; font-size: 12px; }
/* Sfondo illustrato PER-FRONTE (assets/cards/gilda/pinnacolo), appena visibile sotto uno scrim
   forte — sui pulsanti fronte (Strategia) e sulle zone del Teatro di Guerra. Il terreno colorato
   (.wz-terr) e il testo (.wz-in) restano SOPRA. */
.war-fbtn[data-front="ala_sx"],  .wz-ala_sx   { --front-bg: url("/assets/cards/gilda/pinnacolo/alasinistra.jpg"); }
.war-fbtn[data-front="centro"],  .wz-centro   { --front-bg: url("/assets/cards/gilda/pinnacolo/pinnacolo.jpg"); }
.war-fbtn[data-front="ala_dx"],  .wz-ala_dx   { --front-bg: url("/assets/cards/gilda/pinnacolo/aladestra.jpg"); }
.war-fbtn[data-front="retrovie"],.wz-retrovie { --front-bg: url("/assets/cards/gilda/pinnacolo/retrovie.jpg"); }
.war-fbtn[data-front] {
  background:
    linear-gradient(180deg, rgba(12,16,22,.80) 0%, rgba(12,16,22,.90) 100%),
    var(--front-bg) center / cover no-repeat,
    linear-gradient(180deg, var(--panel-1), var(--panel-0)) !important;
}
.war-fbtn[data-front] b, .war-fbtn[data-front] .wf-fav, .war-fbtn[data-front] .wf-pow,
.war-fbtn[data-front] .wf-star { text-shadow: 0 1px 3px rgba(0,0,0,.75); }
.wz-ala_sx, .wz-centro, .wz-ala_dx, .wz-retrovie {
  background:
    linear-gradient(180deg, rgba(9,13,19,.76) 0%, rgba(9,13,19,.88) 100%),
    var(--front-bg) center / cover no-repeat,
    radial-gradient(130% 130% at 50% 0%, var(--panel-2), var(--panel-0)) !important;
}
/* Leggibilità SOPRA gli sfondi illustrati: alone scuro dietro TUTTO testo/icona, e i colori
   NEUTRI (grigi/dim) portati a chiaro — così non si perdono sull'arte. I colori semantici
   (verde=mio, rosso=nemico, good/bad) restano, solo col contorno scuro per staccare. */
.wz-in, .wz-in b, .wz-in span, .wz-in small,
.war-fbtn[data-front], .war-fbtn[data-front] b, .war-fbtn[data-front] span {
  text-shadow: 0 1px 3px rgba(0,0,0,.92), 0 0 2px rgba(0,0,0,.6);
}
.wz-in .gi, .wz-in .wb-ship-svg, .wz-in .cricon,
.war-fbtn[data-front] .gi, .war-fbtn[data-front] .wf-ic {
  filter: drop-shadow(0 1px 2px rgba(0,0,0,.9));
}
.wz-head b, .wz-head { color: #f3f6fb; }
.wz-owner.none { color: #e4e9f1; }
.wz-in .wb-duel { color: #eaeef4; }
.wb-cast.hold { color: #e2e8f1; background: rgba(0,0,0,.34); }
.war-fbtn[data-front] { color: #f3f6fb; }
.war-fbtn[data-front] .wf-pow { color: #e7ecf3; }
.war-fbtn[data-front] .wf-fav { color: #d3ecda; }
.wz-head b { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wz-head .wz-ic { font-size: 14px; flex: none; }
.wz-centro .wz-head b { font-family: var(--font-display); font-size: 14px; letter-spacing: .3px; }
/* Vessillo del padrone: stemma + tag, grande e colorato. */
.wz-owner { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 800; font-variant-numeric: tabular-nums; }
.wz-owner.mine { color: var(--good); } .wz-owner.enemy { color: #e07a5f; } .wz-owner.none { color: var(--ink-dim); font-weight: 600; }
.wz-owner .crestbadge { transform: scale(.86); transform-origin: left center; }
.wz-owner .gi { width: 13px; height: 13px; }
/* Mirino d'assalto telegrafato: pulsa sulla zona bersaglio col countdown (nel flusso,
   sotto il nome del fronte — da assoluto copriva l'intestazione). */
.wz-tele { align-self: flex-start; display: flex; align-items: center; gap: 4px;
  font-size: 10px; font-weight: 700; color: #ffb3a0; background: rgba(20,8,4,.72); border: 1px solid var(--rust);
  border-radius: 999px; padding: 2px 8px; }
.wz-tele.mine { color: var(--amber-l); border-color: var(--brass); }
/* Mirino piccolo e CENTRATO nel chip (box fisso + flex): la scala del pulse è contenuta
   così non sborda né si disallinea dal testo. */
.wz-cross { width: 12px; height: 12px; flex: none; display: inline-flex; align-items: center; justify-content: center;
  font-size: 11px; line-height: 1; animation: teleSpin 1.1s ease-in-out infinite; transform-origin: center; }
@keyframes teleSpin { 50% { transform: scale(1.12); opacity: .65; } }
/* Flotte a SAGOME: la massa si vede prima ancora di leggere i numeri. */
.wz-field { display: flex; align-items: center; gap: 6px; margin-top: auto; min-height: 18px; flex-wrap: wrap; }
.wz-field .wz-fleet { display: inline-flex; gap: 1px; flex-wrap: wrap; }
.wz-field .wb-ship-svg { width: 13px; height: 13px; }
.wz-field .wz-fleet.mine .wb-ship-svg path { fill: var(--good); }
.wz-field .wz-fleet.foe  .wb-ship-svg path { fill: #e07a5f; }
.wz-field .wb-vs .gi { width: 11px; height: 11px; opacity: .6; }
.wz .wz-field + .wb-duel { margin-top: 2px; }
.wz .wb-duel { margin-top: auto; }   /* il duello si ancora al fondo della zona */
.wz .wb-cast { margin-top: 2px; padding: 2px 6px; }
@media (max-width: 640px) { .wz .wb-duel { flex-wrap: wrap; } .wz .wd-bar { min-width: 60px; } }
/* Live battle intel: force presence per front + score pace / ships afloat per guild */
.wb-pres { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px; font-size: 11px; margin: 2px 0 2px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.wb-pw.mine { color: var(--amber-l); font-weight: 700; }
.wb-vs { opacity: .55; } .wb-vs .gi { width: 11px; height: 11px; }
.wb-live-meta { display: flex; align-items: center; gap: 8px; margin-left: auto; font-size: 11px; font-variant-numeric: tabular-nums; }
.wb-pace { color: var(--good); font-weight: 700; }
.wb-ships { color: var(--ink-dim); display: inline-flex; align-items: center; gap: 2px; }
.wb-ships .gi { width: 12px; height: 12px; }
.war-howto { margin: 0 0 8px; font-size: 11px; }
.war-howto .gi { width: 12px; height: 12px; }
.wb-rank { color: var(--amber-l); font-weight: 700; font-family: var(--font-display); }
.wb-crest { font-size: 14px; }
.wb-row .wb-score { margin-left: 8px; color: var(--amber-l); font-weight: 700; font-variant-numeric: tabular-nums; }
.war-feed { display: flex; flex-direction: column; gap: 2px; max-height: 180px; overflow-y: auto; }
.wb-ev { font-size: 11px; color: var(--ink-dim); padding: 2px 2px; border-bottom: 1px solid rgba(125,98,56,.2); }
.wb-ev.mine { color: var(--good); }
.wb-ev.cmd { color: var(--amber-l); }
.wb-ev.cmd.mine { color: var(--brass-l); }

/* Live Commander console (ridisegno): Punti-Comando scarsi → ordini strategici, leggibili. */
.chip.war-cp { color: var(--amber-l); background: rgba(214,158,58,.12); border-color: var(--bronze-d); }
.war-cmd .war-cmd-types { flex-wrap: wrap; gap: 6px; }
.war-cmd .war-cmd-fronts { flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.war-cp-cost { opacity: .8; font-size: 10px; margin-left: 2px; }

/* Misuratore Punti-Comando: gemme (◆) piene = spendibili adesso */
.war-cp-bar { display: flex; align-items: center; gap: 10px; padding: 8px 10px; margin-bottom: 10px;
  border: 1px solid var(--bronze-d); border-radius: 12px;
  background: linear-gradient(180deg, rgba(214,158,58,.08), rgba(0,0,0,.22)); }
/* I rombi devono stare su UNA riga anche a 10 punti (erano 8): senza `flex: none` il
   contenitore si stringeva per far posto alla clessidra e il decimo andava a capo. */
.cp-pips { display: flex; gap: 2px; flex: none; }
.cp-pip { width: 11px; height: 11px; flex: none; border-radius: 50%; transform: rotate(45deg);
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.35); }
.cp-pip.on { background: linear-gradient(180deg, var(--amber-l), var(--amber)); border-color: #8a6a1e;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.4); }
.cp-meta { font-size: 12px; color: var(--ink-dim); line-height: 1.25; }
.cp-meta b { color: var(--amber-l); font-size: 14px; font-family: var(--font-display); }
.cp-meta small { display: block; font-size: 10px; opacity: .8; }
/* Ricarica del prossimo Punto-Comando: barra MUTA sotto i rombi, lunga quanto la fila dei
   10 punti. Nessun testo e nessun timer — il rombo che si accende è già la ricompensa; la
   barra dice solo «quanto manca», e si legge con la coda dell'occhio senza rubare spazio. */
.cp-stack { display: flex; flex-direction: column; gap: 6px; flex: none; }
.cp-regen-bar { height: 4px; border-radius: 4px; background: rgba(255,255,255,.07); overflow: hidden; }
.cp-regen-bar i { display: block; height: 100%; border-radius: 4px;
  background: linear-gradient(90deg, var(--bronze-d), var(--amber-l)); transition: width .6s linear; }
.cp-regen-bar.full i { background: var(--patina); opacity: .7; }

/* Passi guidati */
.war-step { font-size: 11px; letter-spacing: .5px; text-transform: uppercase; color: var(--brass);
  font-weight: 700; margin: 10px 0 6px; }
.war-step.sub { color: var(--ink-dim); margin-top: 12px; }
.war-hint { font-size: 12px; color: var(--ink-dim); padding: 8px 10px; border-radius: 8px;
  background: rgba(255,255,255,.03); border: 1px solid var(--bronze-d); }

/* Tile ordine: icona + nome + costo (gemme) + effetto in chiaro */
.war-cmd-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.war-cmd-tile { text-align: left; padding: 8px 10px; border-radius: 12px; cursor: pointer;
  border: 1px solid var(--bronze-d); background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  color: var(--ink); display: flex; flex-direction: column; gap: 4px; position: relative; transition: border-color .12s, box-shadow .12s; }
.war-cmd-tile:first-child { grid-column: 1 / -1; }   /* Ridispiega in cima, largo */
.war-cmd-tile:hover:not([disabled]) { border-color: var(--brass); }
.war-cmd-tile.sel { border-color: var(--amber); box-shadow: 0 0 0 1px var(--amber-d);
  background: linear-gradient(180deg, rgba(120,84,26,.35), var(--panel-0)); }
.war-cmd-tile[disabled] { opacity: .5; cursor: not-allowed; filter: saturate(.5); }
.wct-head { display: flex; align-items: center; gap: 6px; font-size: 13px; }
.wct-head b { flex: 1; }
.wct-ic { font-size: 16px; }
.wct-cost { color: var(--amber-l); font-size: 11px; letter-spacing: 1px; }
.wct-eff { font-size: 11px; color: var(--ink-dim); }
.war-cmd-tile.sel .wct-eff { color: var(--amber-l); }
.wct-lock { position: absolute; right: 8px; bottom: 7px; font-size: 10px; color: var(--rust); }

/* Chip-bersaglio: fronte con controllo% e detentore, colorato per proprietà */
.war-tgts { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 2px; }
.war-tgt { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 8px 10px;
  border-radius: 12px; cursor: pointer; border: 1px solid var(--bronze-d); background: var(--panel-0); color: var(--ink); }
.war-tgt:hover { border-color: var(--brass); /* glow rimosso */ }
.war-tgt.mine  { border-color: var(--good); }
.war-tgt.enemy { border-color: var(--rust); }
.war-tgt.reserve { border-style: dashed; border-color: var(--patina); }
.war-tgt .wt-ic { font-size: 14px; }
.war-tgt .wt-nm { font-size: 12px; font-weight: 700; }
.war-tgt .wt-ctrl { font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.war-tgt.mine  .wt-ctrl { color: var(--good); }
.war-tgt.enemy .wt-ctrl { color: #e79b86; }

/* Form Ridispiega compatto */
.war-move-form { display: grid; grid-template-columns: 1fr; gap: 8px; }
/* Redeploy MIX picker: control the whole force at the source front, per-type amounts. */
.war-mix-head { display: flex; align-items: center; justify-content: space-between; margin: 8px 0 4px; font-size: 13px; color: var(--muted); }
.war-mix-tools { display: flex; gap: 6px; }
.war-mix { display: flex; flex-direction: column; gap: 6px; }
.war-mix-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 8px; border: 1px solid rgba(0,0,0,.35); border-radius: 8px; background: var(--sky-0); opacity: .72; transition: opacity .12s ease, border-color .12s ease; }
.war-mix-row.sel { opacity: 1; border-color: var(--brass, #b9893f); }
.war-mix-row .wmx-nm { font-size: 14px; }
.war-mix-row .stepper { flex: none; gap: 2px; }
.war-mix-row .stepper .btn { min-width: 26px; min-height: var(--btn-h-xs); padding: 0 6px; }
.war-mix-row .stepper input { width: 46px; min-height: 30px; }
/* Telegraphed assault banner: the whole lobby sees the countdown — respond or brace. */
.war-incoming { position: relative; display: flex; align-items: center; gap: 6px; padding: 8px 12px; margin-bottom: 8px;
  border-radius: 12px; font-size: 12px; color: #ffd9cd;
  border: 1px solid var(--rust); background: linear-gradient(180deg, rgba(140,46,28,.32), rgba(0,0,0,.3));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06); }
.war-incoming::after { content: ""; position: absolute; inset: 0; border-radius: inherit; pointer-events: none; background: #fff; opacity: 0; --pk: .1; animation: gpulse 1.4s infinite; }
.war-incoming.mine { border-color: var(--amber); color: var(--amber-l);
  background: linear-gradient(180deg, rgba(120,84,26,.3), rgba(0,0,0,.3)); box-shadow: inset 0 1px 0 rgba(255,255,255,.06); }
.war-incoming.mine::after { content: none; }
.wb-ev.warn { color: #ff9d85; }
/* Front specialization tag on the strategy front buttons */
.war-fbtn .wf-fav { display: block; font-size: 10px; color: var(--patina); letter-spacing: .3px; }
.war-orders { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.chip.war-order { color: var(--brass-l); font-size: 11px; }

/* Division promotion/relegation (Phase 5) */
.chip.war-div-chip { color: var(--amber-l); background: rgba(214,158,58,.1); border-color: var(--bronze-d); }
.war-div { margin-top: 6px; font-weight: 600; font-size: 12px; }
.war-div.up { color: var(--good); }
.war-div.down { color: var(--rust); }
.war-lobby { display: flex; flex-direction: column; gap: 4px; }
.wl-row { display: flex; align-items: center; gap: 6px; font-size: 12px; padding: 4px 8px; border-radius: 8px; }
.wl-row.mine { background: rgba(121,192,140,.12); }
.wl-row .wl-rating { margin-left: auto; color: var(--brass-l); font-variant-numeric: tabular-nums; }
/* Rank assoluto nella classifica di server (scroll infinito): numero incassato a larghezza fissa. */
.wl-row .wl-rank { flex: none; min-width: 26px; text-align: right; color: var(--patina); font-variant-numeric: tabular-nums; font-size: 11px; }
.wl-row.mine .wl-rank { color: var(--good); font-weight: 700; }
.gld-lb-sentinel { text-align: center; padding: 10px 0 2px; font-size: 11px; min-height: 8px; }
/* «Espandi / Carica altre 25»: link discreto e CENTRATO, non un mattone a piena larghezza. Sta in
   fondo a una lista, non è un'azione primaria — testo brunito, si scalda al tap. Bottone nudo
   (niente classe .btn) così non eredita nulla dallo stile dei pulsanti. */
.gld-lb-more {
  display: block; width: auto; margin: 12px auto 2px; padding: 4px 12px;
  background: none; border: none; box-shadow: none;
  color: var(--patina); font-family: var(--font-display); font-size: 11px; letter-spacing: .6px;
  text-transform: uppercase; cursor: pointer; transition: color .12s;
}
.gld-lb-more:hover { color: var(--brass-l); }
.gld-lb-more:active { color: var(--amber-l); }
.gld-lb-more:disabled { opacity: .55; cursor: default; }
.gld-lb-more .chip { margin-left: 4px; font-size: 10px; padding: 1px 6px; vertical-align: 1px; }
/* Avviso «guerra rimandata»: banner marrone/oro (linguaggio del boss/avvisi), niente glow. */
.war-notice { margin: 0 0 10px; padding: 8px 12px; border-radius: 4px;
  background: linear-gradient(180deg, #2a1f10, #180f06); color: var(--brass-l);
  border: 1px solid var(--bronze-d); border-top: 1px solid var(--brass-d);
  font-family: var(--font-display); font-size: 13px; letter-spacing: .4px; text-align: center;
  box-shadow: inset 0 1px 0 var(--edge-hi); }
.war-notice .gi { width: 15px; height: 15px; vertical-align: -3px; margin-right: 4px; }

/* Profile identity, medals & leaderboards (Fase F) */
.profile-id { display: flex; gap: 12px; align-items: center;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border-left: 3px solid var(--brass); }
.pid-avatar { position: relative; font-size: 44px; width: 78px; height: 78px; flex: none; display: grid; place-items: center; border-radius: 16px;
  border: 2px solid var(--bronze-d); background: radial-gradient(120% 120% at 30% 18%, var(--panel-2), var(--sky-0)); padding: 0; color: inherit;
  box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 3px 8px rgba(0,0,0,.45), inset 0 1px 0 var(--edge-hi); }
/* Level badge riveted to the avatar's corner — the captain's rank at a glance. */
.pid-lv { position: absolute; right: -7px; bottom: -7px; min-width: 24px; height: 24px; padding: 0 4px;
  display: grid; place-items: center; border-radius: 999px;
  font-family: var(--font-display); font-size: 12px; font-weight: 700; color: #1a1206;
  background: linear-gradient(180deg, var(--brass-l), var(--brass)); border: 1px solid #3a2c12;
  box-shadow: 0 1px 4px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.4); }
button.pid-avatar.editable { cursor: pointer; }
button.pid-avatar.editable:hover { border-color: var(--brass); /* glow rimosso */ }
.pid-meta { flex: 1; min-width: 0; }
.pid-meta h3 { margin: 0 0 2px; font-size: 14px; }
.pid-name { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pid-tag { color: var(--ink-dim); font-weight: 600; font-size: 12px; letter-spacing: .5px; font-variant-numeric: tabular-nums; }
/* Conteggio isole allineato a destra sulla riga del nome (sostituisce la vecchia barra stats). */
.pid-isles { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 400; color: var(--ink-dim); white-space: nowrap; }
.pid-isles b { color: var(--ink); font-variant-numeric: tabular-nums; }
.pid-isles .gi { width: 14px; height: 14px; }
/* Rename pencil — deliberately quiet (used once or twice ever): faint until hovered/tapped. */
.pid-edit { background: none; border: 0; padding: 1px 2px; line-height: 1; cursor: pointer; font-size: 12px; color: var(--ink-dim); opacity: .55; vertical-align: middle; }
.pid-edit:hover, .pid-edit:active { opacity: 1; color: var(--brass-l); }
.view-title .pid-edit { margin-left: -2px; }
.pid-title { display: inline-block; background: none; border: none; color: var(--brass-l); font: inherit; font-size: 13px; font-style: italic; padding: 0; }
button.pid-title.editable { cursor: pointer; }
.avatar-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; }
.avatar-opt { font-size: 22px; aspect-ratio: 1/1; border-radius: 12px; border: 1px solid var(--bronze-d); background: var(--panel-0); cursor: pointer; display: grid; place-items: center; overflow: hidden; padding: 0; }
.avatar-opt.sel { border-color: var(--amber); /* glow rimosso */ }
/* Player-icon portraits (illustrated webp) fill whichever avatar frame holds them. */
.av-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pid-avatar .av-img { border-radius: 12px; }
/* Leaderboard avatars: round + single bronze cornice, matching the Gilda member slots. */
.lb-av { width: 30px; height: 30px; border-radius: 50%; overflow: hidden; display: grid; place-items: center; font-size: 18px;
  background: var(--panel-0); border: 2px solid var(--bronze-d); box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 2px 5px rgba(0,0,0,.45); }
.lb-av .av-img { border-radius: 50%; }
.title-opt { cursor: pointer; }
.title-opt.sel { color: var(--amber-l); border-color: var(--amber); /* glow rimosso */ }
/* Medaglie & Trofei: box fisso (altezza scroll invariata), contenuto scorribile solo
   in verticale — mai orizzontale. Ogni riquadro ha dimensione identica (grid-auto-rows)
   a prescindere dalla lunghezza del testo, niente icone SVG: solo emoji pulite. */
.medal-scroll { max-height: 360px; overflow-y: auto; overflow-x: hidden; padding-right: 2px; }
/* Righe ad altezza automatica con un pavimento contenuto: la card CRESCE se il titolo va a capo
   (es. "Esploratore Instancabile" su 2 righe) senza tagliare, ma resta compatta quando il testo
   è breve. Il foot (barra/tag) segue SUBITO la descrizione — niente più vuoto in mezzo. */
.medal-grid { display: grid; grid-template-columns: repeat(2, 1fr); grid-auto-rows: minmax(78px, auto); gap: 8px; }
.medal { padding: 8px 10px; border-radius: 8px; border: 1px solid var(--bronze-d); background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); text-align: left;
  display: flex; flex-direction: column; align-items: stretch; min-height: 78px; }
.medal.locked { opacity: .6; filter: saturate(.5); }
.medal.earned { border-color: var(--amber); }
/* Titolo medaglia: al massimo 2 righe (un nome estremo non sfonda comunque la card). */
.medal-name { font-size: 12px; font-weight: 700; color: var(--brass-l); margin: 0 0 2px; line-height: 1.2;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* La descrizione NON si allarga (niente flex:1): così il foot resta vicino al testo. */
.medal-desc { font-size: 10px; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.medal-bar { height: 5px; border-radius: 4px; background: rgba(0,0,0,.4); overflow: hidden; margin: 6px 0 2px; width: 100%; }
.medal-bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--bronze), var(--amber)); }
/* Foot ancorato SOTTO la descrizione (margine fisso), non spinto in fondo alla card. */
.medal-foot { margin-top: 6px; width: 100%; }
/* Bottoni "acquista" dell'Emporio della Gloria: larghezza minima comune → i prezzi con cifre
   diverse (100 / 400 / 1.0k) restano bottoni della STESSA dimensione, non una colonna sfalsata. */
.gl-buy { min-width: 86px; }
/* Switch superiore Giocatori/Gilde (riusa .seg): sopra le tab metrica. */
.lb-scope { margin-bottom: 8px; }
/* Tab metrica: MAI a capo — se non c'è spazio (es. +Pinnacolo) scorrono in orizzontale
   (scrollbar nascosta, come isl-switcher / ps-gexp-row). */
.lb-tabs { display: flex; flex-wrap: nowrap; gap: 6px; overflow-x: auto; overflow-y: hidden;
  -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.lb-tabs::-webkit-scrollbar { display: none; }
.lb-tab { flex: none; font-size: 11px; padding: 6px 8px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(255,255,255,.03); color: var(--ink-dim); cursor: pointer; white-space: nowrap; }
.lb-tab.sel { color: var(--brass-l); border-color: var(--brass); background: linear-gradient(180deg, var(--panel-2), var(--panel-1)); }
.lb-windows { display: flex; gap: 6px; margin-top: 8px; }
.lb-windows .chip { cursor: pointer; }
.lb-windows .chip.sel { color: var(--amber-l); border-color: var(--amber); }
/* Classifica in box ad altezza fissa: scroll SOLO verticale (mai laterale); righe 25 alla volta. */
.lb-scroll { display: flex; flex-direction: column; overflow-x: hidden; margin-top: 10px; }
.lb-scroll.scrolls { max-height: 56vh; overflow-y: auto; overscroll-behavior: contain;
  padding-right: 4px; margin-right: -4px; -webkit-overflow-scrolling: touch;
  scrollbar-width: thin; scrollbar-color: var(--bronze-d) transparent; }
.lb-scroll.scrolls::-webkit-scrollbar { width: 8px; }
.lb-scroll.scrolls::-webkit-scrollbar-thumb { background: var(--bronze-d); border-radius: 8px; }
.lb-scroll.scrolls::-webkit-scrollbar-track { background: transparent; }
.lb-more { align-self: center; margin-top: 8px; }
.lb-list { display: flex; flex-direction: column; gap: 4px; }
.lb-row { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px; background: rgba(255,255,255,.025); border: 1px solid transparent; }
/* Evidenziazioni a SOLO FILL (niente bordo): la tua riga in oro deciso (la piu' evidente),
   i compagni di gilda in verde patina piu' tenue → risaltano ma senza rubarti la scena. */
.lb-row.me { border-color: transparent; background: linear-gradient(90deg, rgba(233,181,74,.30), rgba(233,181,74,.16)); }
.lb-row.lb-mate { border-color: transparent; background: rgba(103,185,168,.13); }
.lb-row.sep { margin-top: 8px; }
.lb-rank { width: 28px; text-align: center; font-weight: 800; font-size: 13px; color: var(--amber-l); flex: none; }
.lb-av { font-size: 18px; flex: none; }
/* Riga gilda: lo stemma riempie la cella come quadrato arrotondato (non il cerchio dell'avatar). */
.lb-av.lb-crest { border: 0; background: none; box-shadow: none; border-radius: 8px; }
.lb-av.lb-crest .crestbadge { width: 30px; height: 30px; }
.lb-name { flex: 1; min-width: 0; font-size: 13px; font-weight: 600; }
/* Stemma gilda inline accanto al nome (solo icona, cliccabile → scheda gilda). */
.lb-gcrest { display: inline-flex; vertical-align: -4px; cursor: pointer; margin-left: 2px; }
.lb-gcrest .crestbadge { width: 16px; height: 16px; }
.lb-gcrest:hover { filter: brightness(1.2); }
.lb-val { font-variant-numeric: tabular-nums; font-weight: 700; color: var(--ink); flex: none; }

/* Quest settimanali (PvP loop) */
.quest-card .qc-head { display: flex; align-items: center; gap: 8px; }
.quest-card .qc-head h3 { flex: 1; min-width: 0; }
.quest-card .qc-head .lvl { font-size: 11px; color: var(--ink-dim); white-space: nowrap; }
/* Solo l'icona del dado, come un filtro on/off: SPENTO (dimmato) di default, ACCESO (oro +
   bagliore) in modalita' reroll. Niente riquadro/bordo/sfondo, niente outline al focus. */
.qc-dado { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px;
  margin-left: 4px; padding: 0; border: 0; background: none; color: var(--brass-l); cursor: pointer;
  opacity: .5; filter: grayscale(.4); transition: opacity .15s, filter .15s, color .15s; }
.qc-dado:focus, .qc-dado:focus-visible { outline: none; }
.qc-dado:hover:not(:disabled) { opacity: .8; filter: none; color: var(--amber-l); }
.qc-dado.on { opacity: 1; color: var(--amber-l); }
.qc-dado:disabled { opacity: .25; filter: grayscale(1); cursor: default; }
.qc-list { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.quest-row { display: flex; gap: 8px; padding: 8px 8px; border: 1px solid var(--slate-3); border-radius: 8px; background: rgba(0,0,0,.16); }
.quest-row.qr-done { border-color: rgba(121,192,140,.5); background: rgba(121,192,140,.07); }
.quest-row .qr-cat { flex: none; width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 8px; background: rgba(0,0,0,.28); }
.quest-row .qr-cat .gi { width: 15px; height: 15px; }
.qr-pvp { color: var(--rust); } .qr-pve { color: var(--brass-l); } .qr-dev { color: var(--ink-dim); } .qr-guild { color: #b98cff; }
.quest-row .qr-main { flex: 1; min-width: 0; }
.quest-row .qr-text { font-size: 12px; color: var(--ink); }
.quest-row .qr-text .ricon { width: 13px; height: 13px; vertical-align: -2px; }
.quest-row .qr-check .gi { width: 13px; height: 13px; color: var(--good); vertical-align: -2px; }
.quest-row .qr-bar { height: 6px; border-radius: 4px; background: rgba(0,0,0,.35); overflow: hidden; margin: 4px 0 4px; }
.quest-row .qr-bar > i { display: block; height: 100%; background: linear-gradient(90deg, var(--brass), var(--amber-l)); border-radius: 4px; }
.quest-row.qr-done .qr-bar > i { background: var(--good); }
/* Progresso a tacche discrete: N celle separate, le prime `progress` accese; le vuote restano
   scure (la barra sotto NON si riempie). Cosi si legge "1 di 3 → 2 di 3 → 3 di 3". */
.quest-row .qr-pips { display: flex; gap: 2px; height: 7px; margin: 4px 0 4px; }
.quest-row .qr-pips i { flex: 1; height: 100%; border-radius: 2px; background: rgba(0,0,0,.4); box-shadow: inset 0 0 0 1px rgba(255,255,255,.04); }
.quest-row .qr-pips i.on { background: linear-gradient(180deg, var(--amber-l), var(--brass)); box-shadow: inset 0 0 0 1px rgba(255,235,190,.35); }
.quest-row.qr-done .qr-pips i.on { background: var(--good); box-shadow: inset 0 0 0 1px rgba(121,192,140,.5); }
.quest-row .qr-meta { font-size: 10px; display: flex; align-items: center; gap: 4px; }
.quest-row .qr-meta .gi { width: 11px; height: 11px; }
.qr-got { color: var(--good); }
.quest-card.rerolling .qr-pick { cursor: pointer; border-color: var(--amber); box-shadow: inset 0 0 0 1px rgba(195,156,95,.4); }
.qc-hint, .qc-bonus { font-size: 11px; margin-top: 8px; }
.qc-bonus { color: var(--amber-l); } .qc-bonus .gi { width: 13px; height: 13px; vertical-align: -2px; }
.qc-bonus-tease { color: var(--ink-dim); } .qc-bonus-tease b { color: var(--amber-l); }
.qc-claim { margin-top: 10px; width: 100%; }
.qc-lock { padding: 6px 2px; } .qc-lock .gi { width: 14px; height: 14px; vertical-align: -2px; }

/* Daily login rewards (Fase G) */
.daily-card.ready { border-color: var(--amber); /* glow rimosso */ }
/* Header a colonna in alto a destra: "serie" sopra, "Prossima tra Xh" sotto (fuori dal corpo). */
.daily-card .card-head { align-items: flex-start; }
.daily-card h3 { line-height: 1.12; }
.daily-card .dh-meta { flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; text-align: right; }
.daily-card .dh-next { font-size: 11px; white-space: nowrap; }
.daily-strip { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
.daily-day { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 6px 2px; border-radius: 8px;
  border: 1px solid var(--bronze-d); background: rgba(255,255,255,.025); }
.daily-day .dd-num { font-size: 10px; font-weight: 700; color: var(--ink-dim); text-transform: uppercase; letter-spacing: .3px; }
.daily-day .dd-ic { font-size: 16px; }
.daily-day.done { opacity: .55; }
.daily-day.done .dd-ic { color: var(--good); }
.daily-day.today { border-color: var(--amber); background: rgba(233,181,74,.14); /* glow rimosso */ }
.daily-day.today .dd-num { color: var(--amber-l); }

/* Energy section (Fase Energia): load balance bar, overclock alert, mine throttle */
.energy-balance { padding: 8px 12px; }
.energy-balance.over { border-color: var(--amber); }
.energy-balance.down { border-color: var(--rust); }
.eb-row { display: flex; align-items: center; gap: 10px; }
.eb-row .load-bar { flex: 1; margin-top: 0; }
.eb-pct { flex: none; font-weight: 700; font-size: 14px; color: var(--brass-l); font-variant-numeric: tabular-nums; white-space: nowrap; }
.eb-nums { flex: none; font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Power-plant fuel upkeep line (advanced plants burn legname to run). */
.eb-fuel { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 12px; color: var(--ink-dim); }
.eb-fuel .gi { width: 15px; height: 15px; flex: none; opacity: .85; }
.eb-fuel b { color: var(--ink); font-variant-numeric: tabular-nums; }
.eb-fuel.low { color: #e0a07a; }
.eb-fuel.low b { color: #e0a07a; }
.load-bar { position: relative; height: 12px; margin-top: 8px; border-radius: 999px; overflow: hidden;
  background: rgba(0,0,0,.35); border: 1px solid var(--bronze-d); box-shadow: inset 0 1px 3px rgba(0,0,0,.5); }
.load-bar > i { display: block; height: 100%; border-radius: 999px; transition: width .35s ease;
  background: linear-gradient(90deg, var(--good), #9fd6ad); }
.load-bar.over > i { background: linear-gradient(90deg, var(--amber), var(--amber-l)); }
.load-bar.down > i { background: linear-gradient(90deg, var(--rust), #e07a5f); }
/* Ferita centrali: linea del tetto di produzione ridotta + glow ambra quando il carico ci preme contro */
.load-bar .eb-cap { position: absolute; top: -1px; bottom: -1px; width: 2px; transform: translateX(-1px);
  background: var(--amber-l); z-index: 2; }
.load-bar.brownout { box-shadow: inset 0 1px 3px rgba(0,0,0,.5); }
.load-bar.brownout > i { background: linear-gradient(90deg, var(--amber), var(--rust)); }
.energy-alert { margin-top: 8px; padding: 6px 10px; border-radius: 8px; font-size: 12px; font-weight: 600; }
.energy-alert.over { color: #2a1c06; background: linear-gradient(180deg, var(--amber-l), var(--amber)); }
.energy-alert.down { color: #fff; background: linear-gradient(180deg, var(--rust), #8d2e1c); }
.energy-alert b { font-variant-numeric: tabular-nums; }
/* minimal mine-throttle control panel */
.throttle-panel { position: relative; border: 1px solid var(--slate-3); border-radius: 12px; background: rgba(0,0,0,.2); overflow: hidden; }
.throttle-row { display: flex; align-items: center; gap: 8px; padding: 4px 8px; border-bottom: 1px solid var(--slate-3); font-size: 11px; }
.throttle-row:last-child { border-bottom: none; }
.throttle-row .tr-ic { font-size: 14px; flex: none; display: inline-flex; }
/* Icona risorsa della miniera ricolorata in GIALLO-ENERGIA (coerenza col pannello energia). */
.throttle-row .tr-res-ic { width: 15px; height: 15px;
  filter: brightness(0) saturate(100%) invert(78%) sepia(46%) saturate(680%) hue-rotate(357deg) brightness(97%) contrast(92%); }
.throttle-row .tr-name { flex: 1; min-width: 0; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.throttle-row .tr-draw { color: var(--ink-dim); font-variant-numeric: tabular-nums; font-size: 10px; flex: none; }
.throttle-row .thr-btn { width: 20px; height: var(--btn-h-micro); padding: 0; border-radius: 4px; border: 1px solid var(--bronze-d); background: rgba(255,255,255,.05); color: var(--brass-l); font-size: 13px; line-height: 1; cursor: pointer; flex: none; }
.throttle-row .thr-btn:disabled { opacity: .35; cursor: default; }
.throttle-row .thr-val { min-width: 32px; text-align: center; font-variant-numeric: tabular-nums; color: var(--amber-l); font-size: 11px; flex: none; }
.settings-body { padding: 4px; flex: 1; min-height: 0; }

/* Azioni hub: tall, centered, obviously-tappable action cards → dedicated sub-pages.
   Side padding narrows the cards so the art crops less (aspect closer to the source jpgs). */
.action-hub { display: flex; flex-direction: column; gap: 12px; padding: 0 7%; }
.action-card {
  position: relative; overflow: hidden; isolation: isolate;
  display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch;   /* text anchored to the bottom */
  text-align: left;
  width: 100%; min-height: 162px; cursor: pointer; padding: 0; color: #fff;   /* ~1.85:1 with the 7% side padding (matches the 2:1 art) */
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));   /* fallback if art missing */
  border: 1px solid #0c1116;   /* niente rail colorato a sinistra: la categoria la porta la targhetta PvE/PvP/Intel */
  border-radius: var(--radius);
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35);
  transition: border-color .25s ease, box-shadow .25s ease;
}
/* Card a MEZZA altezza (es. Logistica sotto lo Spionaggio): stessa larghezza, metà presenza. */
.action-card.ac-half { min-height: 81px; }
.action-card.ac-half .ac-desc { -webkit-line-clamp: 1; line-clamp: 1; }
/* Colore di categoria (--acc): usato dalla targhetta d'angolo (bordo tag). */
.acc-pve   { --acc: var(--good); }
.acc-intel { --acc: var(--patina); }
.acc-pvp   { --acc: var(--rust); }
.acc-logi  { --acc: var(--bronze); }
.acc-map   { --acc: #6fa8d0; }
.acc-mkt   { --acc: var(--amber); }
.acc-war   { --acc: #b183d8; }
.acc-boss  { --acc: #9e65d6; }   /* Boss Mondiale: viola, come la rotta sul mappamondo */
.acc-colony{ --acc: var(--amber-l); }   /* colonizzazione: icona mondo gialla */
/* Il Varco. Stava insieme alla card dell'Avamposto, seicento righe piu' sotto, come se fosse
   roba di quella schermata: ora e' un accento come gli altri — legenda della barra, testata del
   gruppo, riga di volo — e vive con la sua famiglia. Il Varco prima prendeva in prestito il
   viola del Boss: due cose diverse con lo stesso colore in una legenda da otto voci. */
.acc-rosso { --acc: #b4243a; }
/* LA ROTTA OLTRE IL VARCO: rotaia velata nel rosso della categoria, tratto percorso in pieno.
   Il fondo comune (`rgba(233,220,190,.10)`) e' quasi invisibile, e con una barra alta 4px
   «quanto manca» diventava indovinello. Velatura, non luce: nessuna ombra chiara.
   Il giallo qui non c'entrava: due passate di prova (oro, poi ottone scuro) e in tutte e due la
   riga del Varco urlava piu' di quanto valesse. La rotaia sta nella SUA famiglia di colore, e
   il pallino non ha nessuna regola speciale — e' il disco velato di tutte le altre righe, con
   l'accento rosso. Una riga di volo non deve distinguersi dalle sorelle: deve essere leggibile. */
.acc-rosso .fr-bar { background: rgba(180,36,58,.28); box-shadow: inset 0 1px 2px rgba(0,0,0,.55); }
/* E ANCHE IL RIEMPIMENTO DELLA BARRA. L'accento colorava il bordo del gruppo, ma la barra che
   avanza restava d'ottone come tutte le altre: nella striscia dell'Avamposto — dove TUTTO e'
   Mondo Rosso — l'unica cosa in movimento aveva il colore di casa. Adesso e' ruggine, e si
   riconosce anche in mezzo alle barre d'impero senza doverne leggere l'etichetta. */
.acc-rosso .progress > i { background: linear-gradient(90deg, #7d1a2a, var(--rust) 70%, var(--rust-l)); }
/* E l'icona in testa alla riga. Restava bianca: in una striscia mista era l'unico pezzo del
   gruppo che non diceva «Mondo Rosso», e il teschio bianco e' quello del Boss. `gi-tint` la
   trasforma in maschera, cosi' prende il `color` invece della sua livrea. */
.acc-rosso .ps-ico .gi { color: var(--rust-l); }

/* ============ Logistica: Panoramica (control panel flotte) ============ */
/* Selettore principale della tab Unità (Panoramica/Invia/Smantella): è IL comando della pagina,
   non un mini-switcher — bottoni pieni ed equi, etichetta leggibile, attivo in ambra su placca
   chiara con tacca dorata sotto (stesso linguaggio dei tab dell'app, niente glow). */
.logi-nav { margin-bottom: 12px; }
.logi-nav button {
  flex: 1; min-height: 40px; font-size: 12px; font-weight: 700; letter-spacing: .4px;
  text-transform: uppercase; display: inline-flex; align-items: center; justify-content: center;
  gap: 6px; color: var(--ink-dim); border-right: 1px solid rgba(0,0,0,.35);
}
.logi-nav button .gi { width: 14px; height: 14px; opacity: .8; }
/* LA CORNICE INTERA, non la tacca in basso. Era un filo d'ambra sul solo bordo inferiore, e su
   tre linguette affiancate dentro una cornice unica quel filo si leggeva come la sottolineatura
   di un titolo — non come «sei qui». Un anello chiuso su quattro lati dice che la linguetta e'
   un oggetto selezionato, non una parola sottolineata.
   E' un'ombra INTERNA da 2px, non un `border`: il bordo cambierebbe la scatola e spingerebbe di
   due pixel le due linguette accanto a ogni cambio di scheda. */
.logi-nav button.on {
  color: var(--amber-l);
  background: linear-gradient(180deg, var(--panel-2), var(--panel-1));
  box-shadow: inset 0 1px 0 var(--edge-hi);
}
/* LA CORNICE E' UN OGGETTO SOLO CHE SI SPOSTA, non un'ombra che si spegne qui e si accende la'.
   Un elemento unico ancorato alla barra, largo una linguetta, che scorre: e' l'unico modo per
   far vedere QUALE ha preso il posto di quale. Larghezza e passo vengono da `--seg-n`, cosi'
   la stessa regola regge anche una barra a due o a quattro voci.
   `transform` e non `left`: si anima sulla scheda grafica e non ridisegna niente sotto.
   `pointer-events: none` perche' sta SOPRA le linguette e non deve rubare i tocchi. */
.logi-nav { position: relative; }
.logi-nav::after {
  content: ""; position: absolute; top: 0; bottom: 0; left: 0; z-index: 2; pointer-events: none;
  width: calc(100% / var(--seg-n, 3));
  transform: translateX(calc(var(--seg-i, 0) * 100%));
  box-shadow: inset 0 0 0 2px var(--amber);
  transition: transform .22s cubic-bezier(.4, 0, .2, 1);
}
@media (prefers-reduced-motion: reduce) { .logi-nav::after { transition: none; } }
.logi-nav button.on .gi { opacity: 1; }

/* Barra di allocazione flotta — un solo elemento, niente muro di card. */
/* Toggle scope Panoramica: questa isola ⇄ impero. Due bottoni segmentati. */
.pano-scope { display: flex; gap: 6px; margin-bottom: 8px; }
.pano-scope-btn { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  padding: 6px 10px; border-radius: 8px; font-size: 12px; font-weight: 600; cursor: pointer;
  color: var(--ink-dim); background: var(--panel-0); border: 1px solid var(--bronze-d);
  box-shadow: inset 0 1px 0 var(--edge-hi); transition: color .12s, background .12s, border-color .12s; }
.pano-scope-btn .gi { width: 15px; height: 15px; }
.pano-scope-btn.on { color: var(--amber-l); font-weight: 600; border-color: var(--amber);
  background: linear-gradient(180deg, rgba(233,181,74,.22), rgba(233,181,74,.09));
  box-shadow: inset 0 0 0 1px rgba(233,181,74,.32); }
.fleet-muster {
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid #0c1116; border-left: 3px solid var(--brass);
  border-radius: var(--radius); padding: 12px; margin-bottom: 10px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35);
}
.mu-top { cursor: pointer; }
.mu-head { font-size: 13px; color: var(--ink-dim); display: flex; align-items: baseline; gap: 6px; }
/* Slot flotta (posti nave usati/totali) dello scope, spinti all'edge destro come sulla card Flotta
   in Isola: margin-left:auto mangia lo spazio e porta con sé anche il caret. `over` = sforo (ambra). */
.mu-slots { margin-left: auto; align-self: center; font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.mu-slots .gi { width: 12px; height: 12px; }
.mu-slots.over { color: var(--amber-l); }
/* Quando gli slot precedono il caret, SOLO gli slot tengono l'auto (due auto si dividono lo spazio
   → slot a metà). Così il caret segue a filo (gap della .mu-head) e gli slot arrivano all'edge. */
.mu-slots + .mu-caret { margin-left: 0; }
.mu-caret { margin-left: auto; color: var(--brass-l); font-size: 11px; align-self: center; display: inline-block; transition: transform .2s cubic-bezier(.4,0,.2,1); }
.fleet-muster.open .mu-caret { transform: rotate(90deg); }
.fleet-muster.open { box-shadow: inset 0 1px 0 var(--edge-hi), 0 0 0 1px color-mix(in srgb, var(--brass) 32%, transparent), 0 4px 12px rgba(0,0,0,.35); }
/* Breakdown per-nave: casa vs in volo. */
.mu-breakdown { margin-top: 10px; padding-top: 8px; border-top: 1px solid rgba(255,255,255,.07); }
/* Header e righe condividono la STESSA griglia → colonne perfettamente allineate. */
.mu-brk-head, .mu-brk-row { display: grid; grid-template-columns: 1fr 58px 58px; align-items: center; column-gap: 10px; }
.mu-brk-head { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--ink-dim); margin-bottom: 4px; }
.mb-h-lbl { text-align: right; white-space: nowrap; display: inline-flex; align-items: center; justify-content: flex-end; gap: 4px; }
.mu-brk-head .gi { width: 12px; height: 12px; }
.mu-brk-row { padding: 4px 0; }
.mu-brk-row + .mu-brk-row { border-top: 1px solid rgba(255,255,255,.04); }
.mb-lead { display: flex; align-items: center; gap: 8px; min-width: 0; }
.mb-name { min-width: 0; font-size: 12px; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mb-home, .mb-away { text-align: right; font-size: 12px; font-variant-numeric: tabular-nums; font-weight: 700; }
.mb-home { color: var(--good); }
.mb-away { color: var(--amber-l); }
.mb-home .gi, .mb-away .gi { width: 12px; height: 12px; }
.mb-home.zero, .mb-away.zero { color: var(--ink-dim); opacity: .45; font-weight: 400; }
/* Prima card Panoramica: due inventari a tessere (Parcheggiate / In volo). Ognuno un titolo con
   icona + totale, poi la griglia di tessere navi (le stesse dei rapporti, con healthbar). */
/* Riepilogo potenza totale in cima all'overview espansa: etichetta a sinistra, atk·dif a destra.
   Stesso padding orizzontale di .mu-invs (12px) così si allinea con DOCKED/IN FLIGHT sotto. */
.mu-power { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 10px 12px 10px; border-bottom: 1px solid rgba(233,220,190,.12); }
.mu-power .mu-pw-lbl { font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: var(--patina); }
.mu-power .mu-pw-val { font-weight: 700; color: var(--ink); }
.mu-power .mu-pw-val .gi { width: 13px; height: 13px; vertical-align: -2px; }
.mu-invs { display: flex; flex-direction: column; gap: 12px; }
.mu-inv-head { display: flex; align-items: center; gap: 6px; margin-bottom: 8px;
  font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: var(--patina); }
.mu-inv-head .mu-inv-ico .gi { width: 14px; height: 14px; }
.mu-inv-head .mu-inv-t { font-weight: 700; }
.mu-inv-head .mu-inv-n { margin-left: auto; font-family: inherit; font-size: 14px; font-weight: 700;
  color: var(--ink); letter-spacing: .3px; font-variant-numeric: tabular-nums; }
.mu-inv + .mu-inv { padding-top: 10px; border-top: 1px solid rgba(255,255,255,.07); }
.mu-inv-empty { font-size: 11px; font-style: italic; padding: 2px 0 4px; }
/* L'AVAMPOSTO E' L'ALTRO MONDO, e la sua riga deve dirlo prima di essere letta. La Panoramica è
   tutta azzurra e la sua testata stava in patina come «Ormeggiate» e «In volo»: tre righe identiche,
   e la flotta che sta oltre il Varco sembrava ormeggiata in casa come le altre. Qui prende la
   ruggine del Mondo Rosso — scritta e icona, che è di sfondo e quindi si ritinge col filtro come
   già si fa altrove. Il totale a destra resta avorio come negli altri due blocchi: è un numero
   che si confronta con loro, e colorarlo lo avrebbe tolto dal confronto. */
/* I gruppi «ruggine» (In volo, Punti di controllo, All'Avamposto) si distinguono anche di
   FONDO: velatura calda e bordo bruciato, non solo la testata colorata — a colpo d'occhio
   sono «navi fuori casa», il resto è ormeggio. Niente glow: velatura e bordo, come da regola. */
.mu-inv-rosso { background: linear-gradient(180deg, rgba(120,45,28,.16), rgba(120,45,28,.06));
  border: 1px solid rgba(195,75,48,.28); border-radius: 8px; padding: 8px 10px 10px; }
.mu-inv-rosso .mu-inv-head { color: var(--rust-l); }
.mu-inv-rosso .mu-inv-ico .gi {
  filter: brightness(0) saturate(100%) invert(72%) sepia(28%) saturate(900%)
          hue-rotate(330deg) brightness(94%) contrast(88%);
}
.mu-big { font-size: 22px; color: var(--ink); font-variant-numeric: tabular-nums; letter-spacing: .3px; }
.mu-bar {
  display: flex; gap: 2px; height: 12px; margin: 10px 0 8px;
  border-radius: 8px; overflow: hidden; background: var(--sky-0);
  box-shadow: inset 0 1px 3px rgba(0,0,0,.6);
}
.mu-seg { display: block; min-width: 5px; border-radius: 4px; background: var(--acc, var(--bronze)); /* glow rimosso */ animation: muGrow .5s cubic-bezier(.2,.7,.3,1) backwards; }
.mu-seg.mu-home { background: #26323b; box-shadow: none; }
@keyframes muGrow { from { flex-basis: 0 !important; opacity: .3; } }
.mu-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 11px; color: var(--ink-dim); }
.mu-leg { display: inline-flex; align-items: center; gap: 4px; }
.mu-leg i { width: 8px; height: 8px; border-radius: 50%; background: var(--acc, var(--bronze)); /* glow rimosso */ }

/* Lista compatta raggruppata per tipo (scroll interno per cappare la lunghezza). */
/* Niente scroll interno: la lista fluisce con la PAGINA (#views scorre) e finisce sotto il footer
   come tutto il resto. Il vecchio max-height:62vh tagliava le righe a metà sul bordo del box
   (la "barra marrone": il clip sul bordo bronzo delle card isola). */
.fleet-list { margin: 0 -2px; padding: 0 2px; }
.fleet-group-head {
  display: flex; align-items: center; gap: 6px;
  font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px;
  color: var(--ink-dim); margin: 12px 2px 6px;
}
.fleet-group-head:first-child { margin-top: 2px; }
.fleet-group-head .fg-ico { color: var(--acc); display: inline-flex; }
.fleet-group-head .fg-ico svg, .fleet-group-head .fg-ico .gi { width: 15px; height: 15px; }
.fg-n { min-width: 18px; height: 16px; padding: 0 4px; border-radius: 8px; background: color-mix(in srgb, var(--acc) 22%, transparent); color: var(--acc); font-size: 11px; display: inline-flex; align-items: center; justify-content: center; }
.fg-link { margin-left: auto; background: none; border: none; color: var(--acc); font-size: 11px; font-weight: 700; cursor: pointer; padding: 2px 4px; }
/* Vista IMPERO: card bordata per ISOLA (Common Region) → ogni base è un blocco. Le missioni dentro
   tengono l'accento colore di categoria (dual coding). Spazio TRA le isole > dentro (gerarchia). */
.pano-island { border: 1px solid var(--bronze-d); border-radius: 12px; padding: 2px 6px 6px; margin-top: 12px;
  background: rgba(9,13,18,.22); box-shadow: inset 0 1px 0 var(--edge-hi); }
.pano-island:first-child { margin-top: 4px; }
.pano-isl-head { display: flex; align-items: center; gap: 8px; padding: 8px 6px 8px; margin-bottom: 2px;
  border-bottom: 1px solid rgba(255,255,255,.06); }
/* Cinzel ha metriche verticali alte: line-height 1 + 1px di compensazione così il nome sta
   sulla stessa linea ottica di stemma e coordinate (prima "galleggiava" più in alto). */
.pano-isl-head > b { font-family: var(--font-display); font-size: 13px; color: var(--ink); letter-spacing: .3px;
  line-height: 1; transform: translateY(1px); }
.pano-isl-head .gi { width: 16px; height: 16px; color: var(--brass-l); flex: none; }
/* Il medaglione TINTO tiene il colore identità dell'isola (palette della colonia, rosso del
   Varco): il chrome ottone della riga sopra non deve stingerlo. */
.pano-isl-head .av-slot .gi.gi-tint { color: inherit; }
.pano-isl-head .subtle { font-size: 11px; color: var(--muted); line-height: 1; }
.pano-isl-head .fg-n { margin-left: auto; --acc: var(--brass-l); }
/* Riga "in cantiere" nella Panoramica: navi/difese in costruzione (non ancora volabili). */
.yard-line { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 12px; }
.yard-line .gi { width: 15px; height: 15px; flex: none; }
.yard-line .fg-link { margin-left: auto; }
/* RIPARAZIONI D'IMPERO: una card sola che si apre. Chiusa dice il totale — che è la risposta
   alla domanda vera («quante navi ho ferite?») — e aperta dà la riga per isola. Prima erano N
   card affiancate, una per base, e su quattro isole si mangiavano mezza schermata. */
.yard-rip { display: block; }
.yard-rip > summary { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-6); cursor: pointer; list-style: none; }
.yard-rip > summary::-webkit-details-marker { display: none; }
.yard-rip > summary::after { content: "▸"; margin-left: auto; color: var(--ink-dim); font-size: var(--fs-xs); }
.yard-rip[open] > summary::after { content: "▾"; }
.rip-list { margin-top: var(--sp-8); display: grid; gap: var(--sp-4); }
.rip-row { display: flex; align-items: baseline; gap: var(--sp-8); padding: var(--sp-4) var(--sp-6);
  border-radius: var(--r-sm); background: rgba(0, 0, 0, .22); }
.rip-isl { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--brass-l); }
.rip-n { flex: none; }
.rip-min { flex: none; font-variant-numeric: tabular-nums; }

.fleet-row-wrap {
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid #0c1116; border-left: 3px solid var(--acc, var(--brass));
  border-radius: 8px; margin-bottom: 6px; overflow: hidden;
  box-shadow: inset 0 1px 0 var(--edge-hi);
}
.fleet-row { display: flex; align-items: center; gap: 10px; padding: 8px 10px; }
.fleet-row-wrap.expandable .fleet-row { cursor: pointer; }
.fleet-row-wrap.expandable .fleet-row:hover { background: rgba(255,255,255,.03); }
.fleet-row-wrap.open { box-shadow: inset 0 1px 0 var(--edge-hi), 0 0 0 1px color-mix(in srgb, var(--acc) 30%, transparent); }
.fr-caret { display: inline-block; color: var(--acc); margin-right: 6px; font-size: 10px; transition: transform .2s cubic-bezier(.4,0,.2,1); }
.fleet-row-wrap.open .fr-caret { transform: rotate(90deg); }   /* ▸ → ▾ ruotando, coerente con lo slide */
/* Dettaglio espanso: tabella navi a 2 colonne (icona · nome · ×N) che riempie la larghezza
   senza spazi, stile "muster" invece dei vecchi tag/pill. */
/* Slide fluido come Isola/Gilda: il dettaglio è SEMPRE nel DOM (height:0 a riposo, auto da
   aperto) e l'altezza è animata dalla Web Animations API (_slideHeight), non ri-renderizzando
   la view a ogni click → niente scatti su mobile. Padding costante dentro il clip (nessun salto). */
.fr-slide { overflow: hidden; height: 0; }   /* slider SENZA padding → chiuso è davvero 0 (border-box) */
.fleet-row-wrap.open .fr-slide, .fleet-muster.open .fr-slide { height: auto; }
.fr-detail { display: grid; grid-template-columns: 1fr 1fr; column-gap: 16px; padding: 2px 10px 10px 10px; }
/* Le tessere flotta nel dettaglio missione occupano tutta la larghezza (fuori dalle 2 colonne). */
.fr-detail .fr-fleet { grid-column: 1 / -1; margin-top: 6px; }
/* Itinerario della missione (fasi + tempi): riga informativa in cima al dettaglio espanso. */
.fr-itin { grid-column: 1 / -1; font-size: 11px; line-height: 1.4; margin: 2px 0 6px; color: var(--ink-dim); }
.fr-itin .gi { width: 12px; height: 12px; vertical-align: -2px; }
/* Le icone-risorsa del bottino allo STESSO passo dei glifi (12px, non i 18 di default): a
   taglia piena sbilanciavano la riga — più alte del testo, appiccicate ai numeri — e la riga
   Loot non stava in asse con la riga potenza qui sopra. */
.fr-loot .ricon { width: 12px; height: 12px; vertical-align: -2px; margin: 0 2px; }
/* itinerario + rientro totale sulla STESSA riga: fase a sinistra, rientro allineato a destra
   (salva altezza sfruttando lo spazio orizzontale). Va a capo con grazia se non c'è spazio. */
.fr-itin-row { grid-column: 1 / -1; display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.fr-itin-row .fr-itin { grid-column: auto; margin: 2px 0 6px; }
/* I Trofei della scheda capitano: chiusi di default, si aprono al tocco. Il summary veste
   l'intestazione delle sezioni (pp-hist-h), il triangolino nativo si spegne e al suo posto
   ruota il solito chevron. */
.pp-trofei > summary { cursor: pointer; list-style: none; display: flex; align-items: center; gap: 6px; }
.pp-trofei > summary::-webkit-details-marker { display: none; }
.pp-trofei .acc-chevron { margin-left: auto; transition: transform .15s; }
.pp-trofei[open] .acc-chevron { transform: rotate(180deg); }
.pp-trofei .pp-meds { margin-top: 4px; overflow: hidden; }   /* l'altezza la anima il JS */

/* Attacco/Difesa della flotta: sempre a destra della riga (anche quando è l'unico elemento),
   forza corrente (superstiti al rientro). */
.fr-power { text-align: right; margin-left: auto; }
.fr-power .gi { width: 12px; height: 12px; vertical-align: -2px; }
/* Tasto richiamo nascosto nell'espansione della riga Panoramica: occupa tutta la riga. */
.fr-recall { grid-column: 1 / -1; margin-top: 10px; text-align: center; }
/* Tasto Richiama: qui resta solo la FORMA (targa larga con l'icona incassata a sinistra). La
   livrea brunita col contorno ruggine era nata qui, ed e' diventata quella di TUTTI i tasti che
   annullano: sta nel `.btn-danger` di base, e questa regola non la ripete piu'. */
.fr-recall .btn-danger {
  width: auto; min-width: 160px; min-height: var(--btn-h-sm); padding: 0 16px 0 34px;
}
/* Regolamento nelle Opzioni: stessa livrea del richiamo, ma a tutta larghezza. Li' il tasto e'
   un'azione secondaria appesa a una riga di flotta; qui e' l'unica cosa nella card, e un
   bottoncino da 160px in mezzo al vuoto si legge come un ripensamento. Niente icona: il testo
   e' gia' l'etichetta, e il padding asimmetrico che le faceva posto qui sbilancerebbe.
   Selettore doppio-classe sullo STESSO elemento (.fr-recall.rules-cta): piu' specifico di
   `.fr-recall .btn` qui sotto, che impone min-width 200px — cosi' vince a prescindere
   dall'ordine, e spostare le regole in futuro non lo rompe. */
.fr-recall.rules-cta .btn-danger {
  width: 100%; min-width: 0; padding: 0 12px; min-height: var(--btn-h); justify-content: center;
}
/* Storico compravendite: stessa targa del Richiama, livrea AMBRA. Il rosso e' la livrea di chi
   annulla; qui non si annulla niente, si apre un archivio — quindi ottone chiaro, non ruggine.
   Tutta larghezza come .rules-cta: e' l'unica cosa in fondo all'order book, e un bottoncino da
   160px in mezzo al vuoto si legge come un ripensamento. Nessun alone: solo bordo e velatura. */
.fr-recall.hist-cta { margin-top: 12px; }
.fr-recall.hist-cta .btn-amber {
  width: 100%; min-width: 0; min-height: var(--btn-h); padding: 0 12px; justify-content: center;
  display: inline-flex; align-items: center; gap: 6px;
  background: linear-gradient(180deg, rgba(233,200,126,.17), rgba(150,112,38,.22));
  color: #f0d7a2; border: 1px solid #8a6b24; font-weight: 600; letter-spacing: .3px;
  text-shadow: 0 1px 1px rgba(0,0,0,.5);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06), 0 1px 4px rgba(0,0,0,.32);
}
.fr-recall.hist-cta .btn-amber:hover { filter: none;
  background: linear-gradient(180deg, rgba(242,212,147,.27), rgba(170,130,46,.32)); }
.fr-recall.hist-cta .btn-amber:active { transform: translateY(1px); }
.fr-recall.hist-cta .btn-amber .gi { filter: none; opacity: .92; }
/* Ritorno al Mercato in cima alla pagina Storico. Riusa la pillola .sub-back dell'hero, ma li'
   e' in position:absolute dentro il banner: qui non c'e' banner, quindi torna nel flusso. */
.mkt-hist-top { margin: 2px 0 10px; }
.mkt-hist-top .sub-back { position: static; display: inline-block; }
/* Pallino «non ancora letto» sul tasto: dentro il bottone, prima del testo, cosi' scorre con
   l'etichetta invece di stare appeso a un angolo. Ombra scura, mai un alone luminoso. */
.rules-cta .rules-ping {
  width: 7px; height: 7px; border-radius: 50%; background: #e0603c;
  box-shadow: 0 1px 2px rgba(0,0,0,.5); flex: 0 0 auto; margin-right: 8px;
}
.rules-cta .rules-ping.hidden { display: none; }
/* Testo secondario sui bottoni dorati (es. "≥25000" nella difficoltà selezionata): scuro come
   il resto, non grigio slavato — su fondo giallo il grigio era illeggibile. */
.btn-primary .subtle, .btn-bronze .subtle { color: #241a0b !important; opacity: .68; }
.fr-recall .btn { display: inline-flex; align-items: center; gap: 6px; min-width: 200px; }
.fr-ship { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 4px 0; border-bottom: 1px solid rgba(255,255,255,.05); }
.fr-ship-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--ink); }
.fr-ship-n { flex: none; font-weight: 700; color: var(--amber-l); font-variant-numeric: tabular-nums; font-size: 12px; }
.art-tile.art-xs { --art: 26px; border-radius: 4px; }
.art-tile.art-xs .art-fallback { font-size: 13px; }
.fr-ico {
  flex: none; width: 30px; height: 30px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: radial-gradient(circle at 35% 30%, color-mix(in srgb, var(--acc) 34%, transparent), rgba(0,0,0,.25));
  border: 1px solid color-mix(in srgb, var(--acc) 55%, #0c1116); color: var(--acc);
}
.fr-ico svg, .fr-ico .gi { width: 16px; height: 16px; }
.fr-main { flex: 1; min-width: 0; }
.fr-title { font-size: 13px; font-weight: 700; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fr-sub { font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.fr-tag { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; color: var(--acc); background: color-mix(in srgb, var(--acc) 16%, transparent); padding: 1px 6px; border-radius: 4px; vertical-align: 1px; }
/* Sottotitolo di RIENTRO: esito (verde riuscita/vittoria, rosso fallita/sconfitta) + bottino a icone
   + castoni/anelli con numero (come l'Inventario dell'isola). */
.fr-tag.fr-ok { color: var(--good); background: color-mix(in srgb, var(--good) 18%, transparent); }
.fr-tag.fr-ko { color: #e79a86; background: color-mix(in srgb, var(--rust) 20%, transparent); }
.fr-outcome .fr-tag { margin-right: 4px; }
.fr-outcome .ricon { margin-left: 2px; }
.fr-drop { margin-left: 6px; white-space: nowrap; font-weight: 600; color: var(--ink); }
.fr-drop .gi { width: 12px; height: 12px; vertical-align: -2px; margin-left: 1px; }
.fr-eta { flex: none; width: 78px; text-align: right; }
.fr-timer { font-size: 12px; font-variant-numeric: tabular-nums; color: var(--ink); }
/* Barra progressione spedizione: traccia tenue + riempimento acceso (colore categoria) con
   una punta triangolare in testa che indica la marcia. In rientro (.is-back) la punta si
   ribalta orizzontalmente (guarda verso casa). overflow visibile: la punta sborda la traccia. */
.fr-bar { position: relative; height: 4px; border-radius: 4px; margin-top: 6px; background: rgba(233,220,190,.10); overflow: visible; box-shadow: inset 0 1px 2px rgba(0,0,0,.55); display: flex; }
/* RIENTRO A RITROSO (17/08/2026, ordine del committente): la barra parte PIENA e si svuota
   mentre le navi tornano, con la punta di marcia sul bordo destro del riempimento e rivolta a
   SINISTRA — cosi' la freccia cammina verso casa man mano che la barra si accorcia. Il
   riempimento resta ancorato a sinistra (nessun `flex-end`): e' la sua LARGHEZZA che scende da
   100 a 0, e la punta scende con lei. La versione precedente cresceva verso casa: leggibile,
   ma non diceva «quanto manca», che e' la domanda di chi guarda una flotta che rientra. */
.fr-bar > i { position: relative; display: block; height: 100%; width: 0; border-radius: 4px; background: linear-gradient(90deg, color-mix(in srgb, var(--acc) 45%, transparent), var(--acc)); /* glow rimosso */ transition: width .35s linear; }
.fr-bar > i::after {   /* punta di marcia in testa al riempimento */
  content: ""; position: absolute; top: 50%; right: 0; transform: translate(100%, -50%);
  width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent;
  border-left: 6px solid var(--acc); /* filter glow rimosso */
}
.fr-bar.is-back > i::after { right: 0; left: auto; transform: translate(100%, -50%) scaleX(-1); }   /* rientro: punta sul bordo destro, rivolta a sinistra (verso casa) */
.fr-bar.no-tip > i::after { display: none; }   /* presidio: flotta ferma → nessuna punta di marcia */
/* Colonizzazione atterrata: barra piena che PULSA piano per le 24h di preparazione del
   territorio (solo opacità, niente glow) + pallino che batte in testa alla barra. */
.fr-bar.fr-pulse > i { animation: colprep 2.4s ease-in-out infinite; }
.fr-bar.fr-pulse > i::after {   /* la punta diventa un pallino che pulsa */
  width: 8px; height: 8px; border: none; border-radius: 50%;
  background: var(--acc); transform: translate(50%, -50%);
  animation: colping 2.4s ease-in-out infinite;
}
@keyframes colprep { 0%, 100% { opacity: 1; } 50% { opacity: .6; } }
@keyframes colping { 0%, 100% { transform: translate(50%, -50%) scale(1); } 50% { transform: translate(50%, -50%) scale(1.45); } }
@media (prefers-reduced-motion: reduce) { .fr-bar.fr-pulse > i, .fr-bar.fr-pulse > i::after { animation: none; } }

/* ============ Logistica: Smantella ============ */
.scrap-intro { border-left-color: var(--rust); }
.scrap-intro .card-body { font-size: 13px; }
/* Coda smantellamento: righe con icona cestino, barra "lavori in corso" (traccia giallastra a
   strisce di cantiere — non è pericolo/rosso, è WIP), timer sulla destra. */
.scrap-queue { border-left-color: var(--amber-d, #8a6a1e) !important; }
.scrap-queue .sq-head { font-size: 12px; display: flex; align-items: center; gap: 6px; color: var(--amber-l); margin-bottom: 8px; }
.scrap-queue .sq-head .gi { width: 15px; height: 15px; }
.scrap-qrow { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-top: 1px solid rgba(255,255,255,.05); }
.scrap-qrow:first-of-type { border-top: 0; }
.scrap-qrow .sq-ico { width: 22px; height: 22px; flex: none; opacity: .95; }
.scrap-qrow .sq-main { flex: 1; min-width: 0; }
.scrap-qrow .sq-title { font-size: 12px; margin-bottom: 4px; }
.scrap-qrow .sq-title .cost { margin-right: 4px; }
.scrap-qrow .sq-timer { flex: none; font-size: 12px; font-variant-numeric: tabular-nums; color: var(--amber-l); min-width: 52px; text-align: right; }
.scrap-qrow .sq-cancel { flex: none; padding: 2px 8px; font-size: 11px; }
.scrap-queue .sq-note { font-size: 11px; line-height: 1.4; }
/* Barra WIP: la TRACCIA è giallastra a strisce diagonali da cantiere (giallo scuro/ambra), il
   riempimento resta ambra brillante. Sovrascrive il track nero della veste steampunk. */
#views .progress.wip { background: repeating-linear-gradient(45deg, rgba(214,164,44,.30) 0 7px, rgba(120,88,20,.30) 7px 14px) !important; border-color: var(--amber-d, #8a6a1e) !important; }
/* Le righe usano il layout .picker-ship dell'Attacco; qui lo stepper NON va mai a capo
   (niente flex-wrap) e l'anteprima recupero è verde e comprimibile. */
.scrap-card .picker-ship { flex-wrap: nowrap; }
.scrap-card .ps-info { min-width: 0; }
.sr-refund { color: var(--good) !important; flex-wrap: nowrap !important; overflow: hidden; min-height: 15px; }
.sr-refund .cost { margin-right: 6px; }
/* Stesso vassoio caldo del checkout (ottone/cuoio) → coerente con Invia/Attacca/Spia. */
.scrap-bar {
  position: sticky; bottom: 8px; z-index: 3;
  display: flex; align-items: center; gap: 10px; margin-top: 10px;
  background: linear-gradient(180deg, #2f2717, #17110a 78%);
  border: 1px solid var(--brass); border-radius: 12px; padding: 10px 12px;
  box-shadow: 0 8px 20px rgba(0,0,0,.5), inset 0 1px 0 rgba(244,209,123,.28), inset 0 0 0 1px rgba(120,84,34,.35);
}
.scrap-bar::before {
  content: ""; position: absolute; left: 12px; right: 12px; top: -1px; height: 2px; border-radius: 2px;
  background: linear-gradient(90deg, transparent, var(--brass) 15%, var(--brass-l) 50%, var(--brass) 85%, transparent); opacity: .8;
}
.scrap-bar .sb-tot { flex: 1; min-width: 0; font-size: 13px; color: var(--ink); }
.scrap-bar .sb-tot .sb-lbl { display: block; font-size: 12px; color: var(--brass-l); margin-bottom: 4px; }
.scrap-bar .btn { flex: none; }
/* Riga risorse recuperate: i 3 materiali su UNA riga, icone allineate col numero, mai spezzati
   fra icona e cifra (chip = unità indivisibile). Usata nella barra, nella coda e nel popup. */
.scrap-res { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; }
.scrap-res .cost { margin: 0; white-space: nowrap; }
.scrap-qrow .sq-refund { margin: 1px 0 4px; font-size: 12px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.scrap-res-line { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; margin-top: 10px; font-size: 13px; color: var(--ink); }
.action-card:hover { border-color: var(--brass); box-shadow: inset 0 1px 0 var(--edge-hi), 0 6px 16px rgba(0,0,0,.42); }
.action-card:active { transform: translateY(1px); }
/* Staggered entrance: the hub deals its cards like a hand. */
.action-hub .action-card { animation: cardIn .38s cubic-bezier(.2,.7,.3,1) backwards; }
.action-hub .action-card:nth-child(2) { animation-delay: .07s; }
.action-hub .action-card:nth-child(3) { animation-delay: .14s; }
@keyframes cardIn { from { opacity: 0; transform: translateY(12px); } }
@media (prefers-reduced-motion: reduce) { .action-hub .action-card, .ac-bg { animation: none !important; transition: none !important; } }
/* Illustration fills the card width; cover-fit zooms/crops so it never overflows the height. */
.ac-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center; z-index: 0; transition: transform .5s ease; }
.action-card:hover .ac-bg { transform: scale(1.05); }
/* Legibility scrim: opaque at the bottom (behind the text), fading to clear at the top. */
.action-card::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(0deg, rgba(9,13,18,.82) 0%, rgba(9,13,18,.58) 36%, rgba(9,13,18,.14) 68%, rgba(9,13,18,0) 100%);
}
/* Engraved inner frame + brass corner brackets: reads "game panel", not "web card". */
.action-card::before, .sub-hero::before {
  content: ""; position: absolute; inset: 6px; z-index: 2; pointer-events: none;
  border: 1px solid rgba(236,205,142,.14); border-radius: 8px;
  background:
    linear-gradient(var(--brass-l),var(--brass-l)) 0 0/14px 2px,
    linear-gradient(var(--brass-l),var(--brass-l)) 0 0/2px 14px,
    linear-gradient(var(--brass-l),var(--brass-l)) 100% 0/14px 2px,
    linear-gradient(var(--brass-l),var(--brass-l)) 100% 0/2px 14px,
    linear-gradient(var(--brass-l),var(--brass-l)) 0 100%/14px 2px,
    linear-gradient(var(--brass-l),var(--brass-l)) 0 100%/2px 14px,
    linear-gradient(var(--brass-l),var(--brass-l)) 100% 100%/14px 2px,
    linear-gradient(var(--brass-l),var(--brass-l)) 100% 100%/2px 14px;
  background-repeat: no-repeat;
  opacity: .55;
}
/* Category plate mounted top-right (Cinzel smallcaps on dark metal). */
.ac-tag {
  position: absolute; top: 11px; right: 11px; z-index: 3;
  font-family: var(--font-display); font-size: 10px; font-weight: 700;
  letter-spacing: 1.6px; text-transform: uppercase; color: var(--brass-l);
  padding: 2px 8px; border-radius: 8px;
  border: 1px solid var(--acc, var(--bronze-d));
  background: rgba(9,13,18,.72);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.08), 0 1px 4px rgba(0,0,0,.5);
}
.ac-tag.static { position: static; }
/* Bottone-mappa sulla card Mondo: quadrotto in pergamena dorata (stessa veste della
   nuvoletta tutorial) col mondo marrone — apre direttamente il mappamondo. */
.ac-map-btn {
  position: absolute; top: 10px; right: 10px; z-index: 3;
  width: 31px; height: var(--btn-h-sm); display: grid; place-items: center;
  background: linear-gradient(180deg, #f7e8c4, #e9d09b);
  border: 2px solid #b98a3a; border-radius: 8px; cursor: pointer;
  box-shadow: 0 2px 0 rgba(255,246,220,.55) inset, 0 3px 10px rgba(0,0,0,.55), 0 0 0 1px rgba(0,0,0,.35);
}
.ac-map-btn .gi { width: 20px; height: 20px; }
.ac-map-btn:hover { background: linear-gradient(180deg, #fdf2d6, #f0dbaa); }
.ac-map-btn:active { transform: translateY(1px); box-shadow: 0 1px 0 rgba(255,246,220,.4) inset, 0 1px 4px rgba(0,0,0,.5); }
.ac-body { position: relative; z-index: 2; width: 100%; padding: 12px 16px 12px; display: flex; flex-direction: column; gap: 4px; }
.ac-name { margin: 0; font-size: 18px; font-weight: 700; letter-spacing: .4px; font-family: var(--font-display); text-shadow: 0 1px 4px rgba(0,0,0,.95); }
.ac-desc { margin: 0; line-height: 1.4; max-width: 340px; font-size: 12px; color: #e7dcc8; text-shadow: 0 1px 3px rgba(0,0,0,.98); }
.ac-meta { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--amber-l); font-weight: 700; text-shadow: 0 1px 3px rgba(0,0,0,.95); }
.ac-meta.alert { color: #ff9d85; }
.ac-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; background: currentColor; /* glow rimosso */ animation: acPulse 1.6s ease-in-out infinite; }
@keyframes acPulse { 50% { opacity: .3; } }

/* Sub-page hero: compact banner reusing the hub card art (continuity) + back chip. */
.sub-hero {
  position: relative; overflow: hidden; isolation: isolate; min-height: 88px;
  display: flex; flex-direction: column; justify-content: flex-end;
  margin: 2px 0 12px;
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid #0c1116;   /* cornice uniforme, niente rail colorato a sinistra */
  border-radius: var(--radius);
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35);
}
.sub-hero .ac-bg { transition: none; }
.sub-hero::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(0deg, rgba(9,13,18,.92) 0%, rgba(9,13,18,.5) 55%, rgba(9,13,18,.12) 100%);
}
.sub-hero-t { position: relative; z-index: 3; display: flex; align-items: center; gap: 8px; padding: 24px 16px 10px;
  font-family: var(--font-display); font-size: 18px; font-weight: 700; letter-spacing: .8px; color: var(--brass-l); text-shadow: 0 1px 4px rgba(0,0,0,.9); }
.sub-back {
  position: absolute; top: 9px; left: 9px; z-index: 4; cursor: pointer;   /* above .sub-hero-t, which spans the full hero */
  border: 1px solid var(--bronze-d); border-radius: 999px; background: rgba(9,13,18,.74);
  color: var(--brass-l); font-size: 12px; font-weight: 700; padding: 4px 12px 4px 8px;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.07), 0 1px 4px rgba(0,0,0,.5);
}
.sub-back:active { transform: translateY(1px); }
/* IL TASTO (i) — uno solo, ovunque nel gioco.
   Cerchio d'ottone sottile su fondo velato: l'informazione si offre, non si impone. Niente
   pieno e niente ombra portata, che sono il linguaggio dei tasti su cui si AGISCE.
   Ce n'erano tre versioni per lo stesso identico gesto — questa, il `.round-x` pieno della
   Grande Ricerca e il `.bnt-i` delle taglie — e il giocatore doveva impararlo tre volte.
   La FORMA sta qui; le classi qui sotto portano solo la loro POSIZIONE, che e' l'unica cosa
   che cambia davvero da un posto all'altro. */
.sub-info, .gr-info-btn, .bnt-i, .cf-info-btn {
  width: 22px; height: var(--btn-h-micro); padding: 0; cursor: pointer; flex: none;
  display: flex; align-items: center; justify-content: center;   /* cerchio −15%, glifo invariato */
  border: 1px solid rgba(210,162,74,.55); border-radius: 999px; background: rgba(9,13,18,.42);
  color: var(--brass-l); font-size: 14px; font-weight: 700; font-style: italic; line-height: 1;
  font-family: Georgia, "Times New Roman", serif;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06); backdrop-filter: blur(2px);
  transition: border-color .12s, background .12s, color .12s;
}
.sub-info { position: absolute; top: 9px; right: 9px; z-index: 4; }
.cf-info-btn { position: absolute; top: 10px; right: 10px; }
/* ---- Tabella dei contro (Manuale + popup «Forze e debolezze») ----
   Una riga per pezzo: nome a sinistra, targhette col MOLTIPLICATORE a destra. Stessa grammatica
   dei bonus di ricerca/specializzazione: verde sopra 1, rosso sotto. I numeri sono gia' visibili
   nel Pronostico, quindi qui si mostrano invece di tradurli in «molto forte / debole». */
.cm-table { display: flex; flex-direction: column; gap: 6px; margin: 8px 0 10px; }
.cm-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; padding-bottom: 6px;
  border-bottom: 1px solid rgba(210,162,74,.13); }
.cm-row:last-child { border-bottom: none; padding-bottom: 0; }
.cm-att { flex: 0 0 auto; min-width: 118px; font-weight: 700; color: var(--brass-l); font-size: 12px; }
.cm-att::after { content: ":"; opacity: .55; }
.cm-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.cm-chip { display: inline-flex; align-items: baseline; gap: 4px; padding: 2px 6px; border-radius: 999px;
  font-size: 11px; line-height: 1.5; border: 1px solid transparent; background: rgba(255,255,255,.045);
  color: var(--ink-2, #c9d3dd); white-space: nowrap; }
.cm-chip b { font-variant-numeric: tabular-nums; font-weight: 800; }
.cm-chip.cm-up { color: #7fd6a2; border-color: rgba(94,190,136,.38); background: rgba(58,140,96,.14); }
.cm-chip.cm-dn { color: #e59a8f; border-color: rgba(198,96,80,.38); background: rgba(150,58,46,.14); }
/* Il richiamo del fuoco non e' un contro: e' quanto un pezzo ATTIRA. Riga staccata, tono neutro. */
.cm-row.cm-rich { margin-top: 2px; border-top: 1px solid rgba(210,162,74,.22); border-bottom: none; padding-top: 8px; }
.cm-row.cm-rich .cm-att { color: var(--amber-l, #d6a42c); }
@media (max-width: 420px) { .cm-att { min-width: 100%; } }

.sub-info:hover, .gr-info-btn:hover, .bnt-i:hover, .cf-info-btn:hover {
  background: rgba(9,13,18,.7); border-color: var(--brass-l); color: var(--brass-l); }
.sub-info:active, .gr-info-btn:active, .bnt-i:active, .cf-info-btn:active { transform: translateY(1px); }
/* Acceso = pannello aperto: si scurisce il fondo, non si accende un bagliore. */
.cf-info-btn.on, .gr-info-btn.on { background: rgba(9,13,18,.78); border-color: var(--brass-l); }
/* Testata del compositore d'assalto: titolo a sinistra, (i) a destra. Il tasto qui vive nel
   FLUSSO (non absolute come sull'eroe): la card non e' posizionata, e un absolute finirebbe
   nell'angolo della prima card posizionata piu' in alto. */
.cmp-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.cmp-head .cmp-info { position: static; flex: 0 0 auto; }
/* Tasto (i) sull'header-banner di un accordion (es. Gilda › Panoramica): stesso stile e
   posizione dei banner Azioni, sovrapposto in alto a destra sopra il bullone d'ottone. */
.acc-info { top: 8px; right: 8px; z-index: 5; }
/* AZIONE NELLA TESTATA di una sezione: quadrata, sola icona, in alto a destra. Vive FUORI dal
   bottone-testata (un bottone non si annida in un altro) ma dentro la sua area, così apre la
   cosa senza espandere la fisarmonica. Stessa scocca della «i» — velatura scura, bordo ottone,
   niente glow — ma quadrata con gli angoli del sistema, per distinguerla a colpo d'occhio. */
.acc-headrow { position: relative; }   /* il riferimento del tasto: la SOLA testata */
/* `right: 12px` = la stessa gronda della testata, cioè dove cade il bordo destro dei
   triangolini di tutte le altre sezioni: il tasto sta sul loro asse invece di sporgere. */
.acc-act { position: absolute; top: 50%; transform: translateY(-50%); right: 12px; z-index: 5;
  width: 44px; height: 44px; padding: 0; cursor: pointer; flex: none;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid rgba(210,162,74,.55); border-radius: 8px; background: rgba(9,13,18,.42);
  color: var(--brass-l); backdrop-filter: blur(2px);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.06);
  transition: border-color .12s, background .12s; }
.acc-act:hover { border-color: var(--brass); background: rgba(9,13,18,.62); }
.acc-act .gi { width: 24px; height: 24px; }
/* Dove la testata ha già la sua azione, la freccia sparisce: la sezione si apre toccando la
   fascia (come sempre), e due glifi nello stesso angolo si contendevano lo stesso gesto. */
.accordion:has(.acc-act) .acc-chevron { display: none; }
.acc-act .acc-act-ping { position: absolute; top: -3px; right: -3px; }
/* Col tasto azione nell'angolo, il bullone d'ottone lì sotto sparisce (come per la «i»). */
.accordion:has(.acc-act) .acc-head.acc-banner .acc-rivets::after { opacity: 0; }
/* La testata gli fa POSTO: freccia e meta si spostano a sinistra invece di finirci sotto.
   Lo spazio vale 32+32: due gradini della scala (il tasto ne occupa 56 con la sua gronda, qui
   ce ne sono 64, cioè otto di respiro) invece di un numero inventato. */
.accordion:has(.acc-act) .acc-head { padding-right: calc(32px + 32px); }
/* Se ci sono ENTRAMBI, la «i» scala a sinistra dell'azione. */
.accordion:has(.acc-act) .acc-info { right: 50px; }
/* col tasto (i) nell'angolo, nascondi il bullone d'ottone in alto a destra (lo rimpiazza) */
.accordion:has(.acc-info) .acc-head.acc-banner .acc-rivets::after { opacity: 0; }

/* Small brass rivets flanking a section-separator label. */
.sep-gem { width: 5px; height: 5px; flex: none; transform: rotate(45deg);
  background: var(--brass); /* glow rimosso */ }

/* ---- Target cards (Spionaggio / Attacco): rival portrait + compact meta chips ---- */
/* Round brass-ringed medallion showing the rival captain's portrait (emoji fallback). */
.av-slot { width: 40px; height: 40px; flex: none; display: grid; place-items: center; font-size: 18px;
  border-radius: 50%; overflow: hidden; background: var(--panel-0);
  border: 2px solid var(--bronze-d); box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 2px 5px rgba(0,0,0,.45); }
.av-slot .av-img { width: 100%; height: 100%; object-fit: cover; }
.av-slot.av-sm { width: 26px; height: 26px; font-size: 14px; border-width: 1px; }
.dt-id { display: inline-flex; align-items: center; gap: 6px; vertical-align: middle; }
.card.tgt .card-head h3 { font-size: 13px; }
.tgt-meta { display: flex; flex-wrap: wrap; gap: 6px; }
.tgt-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 8px;
  font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums;
  border: 1px solid var(--slate-3); background: rgba(0,0,0,.24); box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.tgt-chip b { color: var(--ink); font-weight: 600; }
.tgt-chip .ricon { width: 13px; height: 13px; }
.tgt-chip.lack { border-color: var(--rust); }
.tgt-chip.lack b { color: #ff9d85; }
/* AVANZI DEL SACCO: bersaglio con bottino ancora a terra dopo una rotta totale. Ottone acceso e
   velatura calda — niente glow: e' un invito a decollare, non un semaforo. */
.tgt-chip.loot { border-color: var(--brass); color: var(--brass-l, #e0bd6e);
  background: rgba(190,150,60,.14); }
.tgt-chip.loot b { color: #f0d590; }

/* Card bersaglio COMPATTA: due righe (identità + azione), niente card-head/actions doppie.
   Cornice uniforme (queste card vivono anche nel popup-mappa, fuori da #views dove la
   neutralizzazione del rail non arriva) — niente accento a sinistra. */
/* QUATTRO LATI IDENTICI. La `.card` di base dà a ogni card un rail sinistro di 3px e lascia
   gli altri tre quasi neri: e' il vestito giusto per le action-card, non per una riga di
   elenco. Qui i quattro lati si dichiarano UNO PER UNO, non con la scorciatoia `border`:
   la scorciatoia sembrava bastare e non bastava — misurato sulla pagina viva, tre lati bronzo
   e il sinistro nero. Un lato diverso dagli altri non dice niente, e si vede. */
.card.tgt {
  border-width: 1px; border-style: solid;
  border-top-color: var(--bronze-d); border-right-color: var(--bronze-d);
  border-bottom-color: var(--bronze-d); border-left-color: var(--bronze-d);
}
/* La riga porta il colore della gilda del capitano — lo stesso dei ping sul globo. E' un aiuto
   alla SCANSIONE, non una campitura: una velatura al 7% sul fondo e un filo piu' acceso sul
   bordo. Piu' di cosi' e la lista diventa un arcobaleno e i nomi smettono di leggersi.

   BORDI TUTTI UGUALI (ordine del committente, 03/08/2026, dopo che ne avevo messo uno rosso a
   sinistra): la cornice e' bronzo su ogni lato, identica per ogni card. La gilda si legge dal
   FONDO, non dal bordo. Un bordo di colore diverso su una card in mezzo ad altre non dice «e'
   di quella gilda», dice «questa card e' speciale» — che e' un'altra frase, e falsa. */
.card.tgt.tgt-gilda {
  background-image: linear-gradient(180deg, rgba(255,255,255,.045), rgba(0,0,0,.16)),
                    linear-gradient(0deg, var(--gcol-velo), var(--gcol-velo));
}
/* Il bordo prende un filo del colore, non tutto: resta una cornice di bronzo che ha CAPITO di
   che gilda e', non un contorno colorato che grida. */
.card.tgt.tgt-gilda { box-shadow: inset 0 0 0 1px var(--gcol-velo),
                                  inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35); }
.attack-form .card.tgt { padding: 8px 10px; }
.tgt-top { display: flex; align-items: center; gap: 8px; }
.tgt-top .av-slot { width: 30px; height: 30px; font-size: 14px; flex: none; }
.tgt-id { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.tgt-id b { font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tgt-sub { font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
/* Preferito bersaglio: icona human-target (ottone). Spento = attenuato, acceso = pieno + glow. */
/* Badge TAGLIA sulla card bersaglio (al posto della vecchia stella preferiti): oro, cliccabile. */
/* Badge TAGLIA: oro pieno con testo scuro (come i bottoni gold del gioco) → si vede bene, urla
   "montepremi". Niente glow: solo bevel chiaro sopra + bordo bronzo scuro. */
.tgt-bounty { flex: none; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; font-size: 11px;
  font-weight: 800; color: #2c1e06; font-variant-numeric: tabular-nums; padding: 2px 8px; border-radius: 999px;
  border: 1px solid #7c571a; background: linear-gradient(180deg, var(--amber-l), var(--amber) 60%, #d29a2f);
  box-shadow: inset 0 1px 0 rgba(255,246,220,.55), 0 1px 3px rgba(0,0,0,.4); white-space: nowrap; letter-spacing: .2px; }
.tgt-bounty .gi { width: 14px; height: 14px; filter: brightness(0) opacity(.72); }   /* icona scura sull'oro */
.tgt-bounty:hover { border-color: #5c3f12; }
.tgt-bounty:active { transform: translateY(1px); }
/* Pallino d'allerta TAGLIA sulla card Attacco (angolo alto-sinistro, opposto alla targhetta):
   ROSSO FISSO, stesso template del pallino nav (.navbtn .dot) — niente glow né pulsazione. */
.action-card.ac-bounty::after { content: ""; position: absolute; top: 10px; left: 10px; z-index: 3;
  width: 11px; height: 11px; border-radius: 50%; background: var(--rust);
  border: 1px solid #2a0c06; box-shadow: 0 1px 3px rgba(0,0,0,.45); }
/* Strip "Ricercati" in cima al selettore d'attacco: hint ambra per attirare l'occhio sulle taglie
   attive (niente glow/rail — solo velatura + bordo tenue, in tema col badge taglia). */
.wanted-hint { color: var(--amber-l); font-size: 12px; padding: 8px 10px;
  border-color: rgba(255,217,122,.35); background: rgba(233,181,74,.08); }
.wanted-strip .logi-dhead .view-title .gi { color: var(--amber-l); }
/* Card RICERCATO come DRAWER: plancia di LEGNO caldo con cornice d'OTTONE (stessa veste del
   bottone Albero del Progresso) → spicca dal dark bluastro senza essere un papiro bianco. Testo
   crema/tan chiaro, badge oro invariato. #views + !important per vincere il background globale. */
#views .wanted-strip .card.tgt {
  background: linear-gradient(180deg, #543a1e, #3a2611 48%, #281a0b) !important;
  border: 1px solid #caa24a !important;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,230,173,.14),
              inset 0 -8px 16px rgba(0,0,0,.5), 0 3px 10px rgba(0,0,0,.45) !important;
}
.wanted-strip .card.tgt .tgt-id b { color: #f4e7c8; }
.wanted-strip .card.tgt .tgt-sub { color: #b89b6a; }
.wanted-strip .card.tgt .tgt-chip {
  color: #d8c9a8; border-color: rgba(202,162,74,.4); background: rgba(0,0,0,.3); box-shadow: none;
}
.wanted-strip .card.tgt .tgt-chip b { color: #f4e7c8; }
.wanted-strip .card.tgt .tgt-chip.lack { border-color: var(--rust); }
.wanted-strip .card.tgt .tgt-chip.lack b { color: #ff9d85; }
.wanted-strip .card.tgt .tgt-gtag { color: var(--brass-l); }
#views .wanted-strip .card.tgt.on { border-color: var(--amber) !important;
  box-shadow: inset 0 1px 0 rgba(255,230,173,.2), 0 0 0 1px var(--amber) !important; }
/* Selettore taglie nell'Emporio: testata con pallino INFO a destra + CTA sulla card bersaglio. */
.bnt-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 2px 0 8px; }
/* .bnt-i vive in una riga flex: la forma la prende dal tasto (i) canonico. */
.tgt-bnt-cta { flex: none; display: inline-flex; align-items: center; color: var(--brass-l); opacity: .85; }
.tgt-bnt-cta .gi { width: 18px; height: 18px; }
/* Bacheca: card "manifesto da ricercato" — mugshot GRANDE quadrato con cornice d'ottone a
   sinistra (le art dei capitani sono ritratti quadrati), info e taglia a destra. */
.bnt-body { display: flex; gap: 12px; align-items: flex-start; }
.bnt-mug { flex: none; width: 64px; height: 64px; padding: 0; border-radius: 8px; overflow: hidden; cursor: pointer;
  display: grid; place-items: center; font-size: 30px;
  background: radial-gradient(120% 120% at 30% 24%, var(--slate-2), var(--slate-0));
  border: 2px solid var(--bronze-d); box-shadow: inset 0 1px 0 var(--edge-hi), 0 3px 9px rgba(0,0,0,.45); }
.bnt-mug .av-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.bnt-mug:hover { border-color: var(--brass); }
.bnt-mug:active { transform: translateY(1px); }
.bnt-info { flex: 1 1 auto; min-width: 0; }
.tgt-bottom { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.tgt-bottom .tgt-meta { flex: 1 1 auto; }
.tgt-bottom .tgt-go { flex: none; white-space: nowrap; }
.card.tgt.locked .tgt-bottom .locked-note { flex: none; margin: 0; font-size: 11px; }
/* Bersaglio selezionabile (click sull'intera card) e stato selezionato (cornice + glow ambra). */
.card.tgt[data-action="atk-pick"] { cursor: pointer; }
.attack-form .card.tgt.on { border-color: var(--amber); box-shadow: inset 0 1px 0 var(--edge-hi), 0 0 0 1px var(--amber); }
.tgt-picked { margin-left: auto; flex: none; font-size: 11px; font-weight: 700; color: var(--amber-l); white-space: nowrap; }
/* Stemma gilda del bersaglio, in basso a destra; click → scheda gilda. */
.tgt-guild { flex: none; margin-left: auto; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; font-size: 14px; }
.tgt-gtag { font-size: 11px; font-weight: 700; letter-spacing: .3px; color: var(--brass-l); white-space: nowrap; }
.tgt-guild:hover .crestbadge { box-shadow: inset 0 0 0 1px rgba(255,255,255,.2); }
.gc-crest .crestbadge { width: 3em; height: 3em; }
.gc-members-btn { display: inline-flex; align-items: center; gap: 4px; background: none; border: 0; padding: 0;
  color: var(--muted); font: inherit; cursor: pointer; }
.gc-members-btn:hover { color: var(--brass-l); }
.gc-chev { display: inline-block; transition: transform .18s ease; font-weight: 700; }
.gc-roster { max-height: 0; overflow: hidden; transition: max-height .22s ease; }
.gc-roster.open { max-height: 230px; overflow-y: auto; overflow-x: hidden; margin: 8px 0 2px;
  border-radius: 8px; background: rgba(0,0,0,.2); }
.gc-roster.open::-webkit-scrollbar { width: 8px; }
.gc-roster.open::-webkit-scrollbar-thumb { background: var(--bronze-d); border-radius: 8px; }
.gc-mrow { display: flex; align-items: center; gap: 8px; padding: 6px 8px; cursor: pointer;
  border-bottom: 1px solid rgba(255,255,255,.05); }
.gc-mrow:last-child { border-bottom: 0; }
.gc-mrow:hover { background: rgba(255,255,255,.04); }
.gc-mname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.gc-mlv { flex: none; font-size: 12px; }
/* Gradi in sola icona nella lista membri (senza scritta, per spazio): corona/medaglia/stella. */
.gc-rk { flex: none; display: inline-flex; align-items: center; }
.gc-rk .gi { width: 14px; height: 14px; }
.gc-rk-gen .gi { /* stella del Generale */ }
/* Roster gilda: nome colorato per ruolo (icona-solo accanto, niente testo grado). */
.dt-name.role-found { color: var(--amber-l); }
.dt-name.role-off   { color: #a98fe0; }
.gc-desc { margin-top: 8px; font-size: 12px; color: var(--ink); line-height: 1.4; border-left: 2px solid var(--brass); padding-left: 10px; }
/* Storico di gilda (spedizioni condivise): lista sfogliabile, scroll SOLO verticale. */
.gxh-list { max-height: 52vh; overflow-y: auto; overflow-x: hidden; margin: 6px 0 4px; display: flex; flex-direction: column; gap: 8px; }
.gxh-list::-webkit-scrollbar { width: 8px; }
.gxh-list::-webkit-scrollbar-thumb { background: var(--bronze-d); border-radius: 8px; }
.gxh-row { padding: 8px 10px; border: 1px solid var(--bronze-d); border-radius: 8px; background: rgba(0,0,0,.18); }
.gxh-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.gxh-top b { font-size: 13px; }
.gxh-date { flex: none; font-size: 11px; }
.gxh-line { font-size: 12px; margin-top: 2px; }
.gxh-pager { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 8px; }
/* "Apri mappa" sotto il campo di ricerca bersaglio: largo quanto il box. */
.atk-map-btn { width: 100%; margin-top: 10px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
/* Spionaggio: selettore droni globale (stepper + hint sulla stessa riga). */
.spy-drone-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.spy-drone-row .stepper { margin-left: auto; flex: none; }   /* a destra come in ogni altro preventivatore */

/* Rapporti di battaglia: box a altezza fissa con solo scroll verticale (25 alla volta). */
.report-scroll { max-height: 460px; overflow-y: auto; overflow-x: hidden;
  border: 1px solid var(--slate-3); border-radius: 12px; padding: 10px; background: rgba(0,0,0,.16); }
.report-scroll > .card:last-of-type { margin-bottom: 0; }
/* STORICO A TUTTA LARGHEZZA (Attacco): l'archivio non e' un modulo da compilare — niente box
   dentro il box, niente doppia cornice, niente scroll annidato che ruba il gesto alla pagina.
   Scorre la pagina, e le card usano tutta la riga. */
.hist-wide { margin-top: 4px; }
.hist-wide .report-scroll { max-height: none; overflow: visible; border: 0; border-radius: 0;
  padding: 0; background: none; }
/* ELENCO BERSAGLI: 5 card e poi scorre dentro di se'. Senza tetto una ricerca generica sputava
   trenta card e spingeva fuori schermo la scelta successiva. Una card misura ~101px coi margini,
   quindi 5 = ~507px; il 60vh evita che su uno schermo corto la lista si mangi tutta la pagina. */
.tgt-scroll { max-height: min(507px, 60vh); overflow-y: auto; overflow-x: hidden;
  -webkit-overflow-scrolling: touch; overscroll-behavior: contain; }
.tgt-scroll > .card:last-of-type { margin-bottom: 0; }
/* Passo 2 dell'Attacco: la testata sparisce, resta una striscia col bersaglio scelto. */
.atk-step-back { display: inline-flex; align-items: center; gap: 4px; background: none; border: 0;
  color: var(--ink-dim); font: inherit; font-size: 12px; font-weight: 700; padding: 2px 0 6px;
  cursor: pointer; letter-spacing: .02em; }
.atk-step-back:hover { color: var(--ink); }
.atk-step-tgt { display: flex; align-items: center; gap: 6px; margin-bottom: 10px; padding-bottom: 8px;
  border-bottom: 1px solid color-mix(in srgb, var(--bronze-d) 65%, transparent); font-size: 14px; }
.atk-step-tgt .gi { width: 15px; height: 15px; flex: none; opacity: .85; }
.atk-step-tgt b { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.atk-step-tgt .subtle { font-size: 11px; flex: none; }
.report-more { text-align: center; padding: 10px 0 2px; font-size: 11px; }
/* Dossier rapporto spionaggio: righe etichettate (label maiuscoletto + valore sotto), separate
   da hairline che sfuma. Leggibile su mobile senza muro di testo. */
/* Il padding c'è perché il foglio HA un bordo (glielo mette la regola dei pannelli, più giù):
   senza, le etichette ISOLA/RISORSE/FLOTTA nascevano incollate al filo (screenshot 08/08). */
.si-sheet { display: flex; flex-direction: column; padding: 10px 12px; }
/* Tessere navi/difese nel dossier spia: STESSA griglia e stessa taglia dei rapporti di
   battaglia (.bf-units, 5-6 colonne) — solo un filo d'aria sopra. */
.si-units { margin-top: 4px; }
/* Didascalia «Difese» quando navi e difese statiche stanno divise nel rapporto. */
.bf-cap-def { margin-top: 8px; }
/* Flotta all'Avamposto: il .fleet-muster di #views ha padding 0 (lo mettono .mu-top e .mu-invs),
   quindi i figli diretti dello slider — chip di forza, note, stato vuoto — il loro se lo portano. */
/* E all'Avamposto la testata non è più un tasto: la card sta sempre aperta (13/08/2026), quindi
   niente cursore a mano su una riga che non fa niente. */
.mondo-rosso .fleet-muster .mu-top { cursor: default; }
.mondo-rosso .fleet-muster .av-forza { padding: 0 12px; }
.mondo-rosso .fleet-muster .fr-slide > .subtle { padding: 0 12px 12px; }
/* Desktop: In volo e Punti di controllo (i due gruppi ruggine) a FILE DA 8 — tessere più
   minute per i gruppi «di servizio»; gli ormeggi per isola tengono la taglia normale. */
@media (min-width: 900px) {
  /* Col prefisso #views: la regola generale «.bf-units a riempimento» porta un id e vincerebbe. */
  #views .mondo-rosso .fleet-muster .mu-inv-rosso .bf-units { grid-template-columns: repeat(8, 1fr); }
}
/* L'avatar del bersaglio nello slot tondo della testata: ci pensa già `.icon-slot img`
   (assoluto, inset 2px, tondo) — NIENTE override di taglia qui, il primo tentativo con
   width:100% rompeva la cornice. Resta solo la bandiera di gilda: dentro un h3 il box
   inline-flex cavalca la baseline e stemma+tag salivano rispetto al testo. */
.card-head h3 .tgt-guild { vertical-align: middle; margin-left: 2px; }
.card-head h3 .tgt-guild .crestbadge { width: 15px; height: 15px; }
/* `vertical-align: middle` su un inline-flex allinea alla mezza x-height, non al centro vero:
   lo stemma restava due pixel più in alto del nome. Dove il badge c'è, il titolo diventa una
   riga flex e il centro è il centro. */
.card-head h3:has(.tgt-guild) { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.si-row { display: flex; flex-direction: column; gap: 2px; padding: 6px 0; position: relative; }
.si-row:first-child { padding-top: 0; }
.si-row:last-child { padding-bottom: 0; }
.si-row:not(:last-child)::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: linear-gradient(90deg, rgba(233,181,74,.14), rgba(233,181,74,.05) 60%, transparent); }
.si-k { font-size: 10px; letter-spacing: .8px; text-transform: uppercase; color: var(--brass-l); }
.si-k .subtle { text-transform: none; letter-spacing: 0; font-size: 10px; }
.si-v { font-size: 12px; color: var(--ink); line-height: 1.45; }
.si-v .cost-grp { gap: 12px; }
.si-v .stat { display: inline-flex; align-items: center; gap: 4px; margin-right: 16px; }
.si-v .stat .gi { width: 13px; height: 13px; }
.si-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 10px; }
/* Data e ora dell'intel: non è un chip, è una firma in calce — spinta a destra, discreta,
   non deve competere con gli avvisi («fuori portata», «novizio protetto») che le stanno accanto. */
.si-when { margin-left: auto; font-size: 11px; color: var(--ink-dim);
  display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.si-when .gi { width: 12px; height: 12px; }

/* ---- Gilda: banner hero + compact roster rows ---- */
.guild-hero { position: relative; display: flex; gap: 12px; align-items: center;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0)); border-left: 3px solid var(--brass); }
.gh-crest { position: relative; width: 64px; height: 64px; flex: none; display: grid; place-items: center; font-size: 34px;
  border-radius: 16px; border: 2px solid var(--bronze-d);
  background: radial-gradient(120% 120% at 30% 18%, var(--panel-2), var(--sky-0));
  box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 3px 8px rgba(0,0,0,.45), inset 0 1px 0 var(--edge-hi);
  filter: drop-shadow(0 2px 4px rgba(0,0,0,.5)); }
.gh-meta { flex: 1; min-width: 0; }
/* Ingranaggio impostazioni gilda: in alto a destra della card, allineato col titolo. Solo gestori. */
.gh-settings { position: absolute; top: 10px; right: 10px; width: 30px; height: 30px; border-radius: 8px;
  border: 1px solid var(--bronze-d); background: var(--panel-1); color: var(--brass-l);
  display: grid; place-items: center; cursor: pointer; padding: 0; z-index: 2; }
.gh-settings .gi { width: 15px; height: 15px; }
.gh-settings:hover { border-color: var(--brass); color: var(--amber-l); }
.gh-settings.on { background: var(--brass-d); color: #fff; border-color: var(--brass); }
.guild-settings .gs-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.guild-settings .gs-head b { color: var(--brass-l); }
.guild-settings .gs-sec { padding: 10px 0; border-top: 1px solid var(--slate-3); }
.guild-settings .gs-sec:first-of-type { border-top: 0; padding-top: 0; }
.gh-name { margin: 0 0 2px; font-family: var(--font-display); font-size: 16px; letter-spacing: .4px; color: var(--brass-l); }
/* Tag [GILDA] sotto il nome, su riga propria: il nome può essere lungo e a destra ci sono
   ingranaggio + eventuale bottone Discord — inline rischierebbe l'overflow. */
.gh-name .gh-tag { display: block; width: max-content; margin-top: 2px; }
.gh-desc { margin-top: 1px; font-size: 12px; }
.roster-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 8px 10px; margin-bottom: 6px;
  border-radius: 12px; border: 1px solid var(--slate-3);
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.roster-row.me { border-color: var(--brass); box-shadow: inset 0 1px 0 var(--edge-hi); }
.rr-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.rr-info b { font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rr-info .subtle { font-size: 11px; }
.rr-actions { flex-basis: 100%; display: flex; flex-wrap: wrap; gap: 6px; }
/* Roster scrollabile: una gilda piena (fino a decine di membri) non allunga la pagina.
   Scroll SOLO verticale (mai di lato); oltre ~6 membri compare la barra + una sfumatura
   in basso che segnala "c'è dell'altro". Padding-right per non far finire i bottoni sotto la barra. */
.roster-scroll { display: flex; flex-direction: column; overflow-x: hidden; }
.roster-scroll.scrolls {
  max-height: 340px; overflow-y: auto; overscroll-behavior: contain;
  padding: 2px 6px 2px 2px; margin-right: -4px;
  -webkit-overflow-scrolling: touch; scrollbar-width: thin; scrollbar-color: var(--bronze-d) transparent;
  border-radius: 12px;
  -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 10px, #000 calc(100% - 16px), transparent 100%);
          mask-image: linear-gradient(180deg, transparent 0, #000 10px, #000 calc(100% - 16px), transparent 100%);
}
.roster-scroll.scrolls::-webkit-scrollbar { width: 8px; }
.roster-scroll.scrolls::-webkit-scrollbar-thumb { background: var(--bronze-d); border-radius: 8px; }
.roster-scroll.scrolls::-webkit-scrollbar-track { background: transparent; }
.roster-scroll .roster-row:last-child { margin-bottom: 0; }
/* Roster in stile tabella: NOME · LIVELLO · MSG. Righe alte per l'avatar grande (misura chat). */
.gtable-scroll { display: block; }
/* Layout fisso: il nome (1ª colonna) prende lo spazio residuo e va in ellissi; Livello e Azioni
   hanno larghezza fissa così i bottoni non traboccano mai fuori dalla card. */
.gtable { width: 100%; table-layout: fixed; }
/* Avatar "misura chat" (36px), condiviso da roster gilda e posta in arrivo. */
.av-slot.av-gm { width: 36px; height: 36px; font-size: 18px; border-width: 1px; }
/* Intestazione messaggio: avatar + Nome#TAG cliccabili → profilo. */
.msg-from { cursor: pointer; flex: 1; min-width: 0; }
.msg-from h3 { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.msg-from:hover h3 { color: var(--amber-l); }
.av-slot.av-gm.lb-clk { cursor: pointer; }
/* Roster: pallino attività in basso a destra dell'avatar (come le notifiche, ma sul lato basso).
   Wrapper esterno overflow:visible così il pallino esce dal cerchio; l'.av-slot interno resta
   overflow:hidden (ritaglio circolare dell'avatar intatto). */
.roster-av { position: relative; display: inline-flex; flex: none; }
/* Stesso template del pallino notifica (.navbtn .dot / .acc-dot): 9px, bordo scuro, niente
   glow né animazione. Cambia solo il colore. Nessun pallino = offline ma attivo di recente. */
.rav-ping { position: absolute; right: -1px; bottom: -1px; width: 9px; height: 9px; border-radius: 50%;
  border: 1px solid #2a0c06; box-sizing: border-box; z-index: 1; }
.ping-online   { background: #46d17a; }   /* verde: sta guardando l'app ORA */
.ping-away     { background: var(--amber); }   /* giallo: assente 3+ giorni */
.ping-inactive { background: var(--rust); }    /* rosso: assente 7+ giorni */
/* Leggenda pallini dentro il popup info (.war-rules li): il pallino sta inline prima del testo. */
.war-rules li .rav-ping { flex: none; }
.gtable tbody td { height: 52px; box-sizing: border-box; padding: 6px 8px; vertical-align: middle; }
.gtable td:first-child { white-space: nowrap; }
.gtable .num { width: 32px; }
.gtable .dt-act { width: 44px; white-space: nowrap; text-align: right; }
.gtable-mng .dt-act { width: 108px; }   /* riservo spazio per + · × · busta quando puoi gestire */
.gtable .dt-id { display: flex; align-items: center; gap: 8px; max-width: 100%; overflow: hidden; }
.gtable .dt-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gtable .dt-id .chip { flex: none; }
.gtable .btn-ic { display: inline-flex; align-items: center; justify-content: center; }
.gtable .btn-ic .gi { vertical-align: 0; }
/* Controlli compatti a icona, fra Livello e la busta messaggio. */
.gtable .gact { display: inline-flex; gap: 4px; align-items: center; justify-content: flex-end; }
.gtable .gmi { font-weight: 700; font-size: 16px; }
.gtable .gmi-promote { color: var(--patina); }   /* promuovi a Ufficiale (colore ufficiale) */
.gtable .gmi-manage  { color: var(--rust); }      /* menù gestisci (azione severa) */

/* Spionaggio mission-control bar (drones ready / in flight) */
.spy-hud { display: flex; align-items: center; gap: 8px; padding: 10px 12px; margin-bottom: 12px;
  border-radius: 12px; font-size: 13px; color: var(--ink);
  border: 1px solid var(--bronze-d);   /* cornice uniforme: niente rail sinistro */
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0)); box-shadow: inset 0 1px 0 var(--edge-hi); }
.spy-hud b { color: var(--amber-l); font-variant-numeric: tabular-nums; }
.spy-hud .sh-ic { font-size: 18px; line-height: 1; filter: drop-shadow(0 1px 2px rgba(0,0,0,.6)); }
/* Carcassa boss come card-bersaglio nello Spionaggio: mini-avatar teschio. */
.boss-tgt .boss-av-sm { display: grid; place-items: center; background: #2a1414;
  border: 1px solid color-mix(in srgb, var(--rust) 45%, var(--line)); }
.boss-tgt .boss-av-sm .boss-ico { font-size: 16px; }
.spy-hud .sh-hint { margin-left: auto; font-size: 10px; color: var(--ink-dim); text-align: right; max-width: 45%; }

/* Island switcher (multi-island): home + colony chips + colonize launcher. */
.isl-switcher { display: flex; gap: 6px; flex-wrap: nowrap; margin: 0 0 12px;
  overflow-x: auto; overflow-y: hidden; scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch; scrollbar-width: none;
  /* Full-bleed fino ai bordi pagina + DISSOLVENZA ai lati: le chip che scorrono
     sfumano invece di essere tagliate vive (regge qualsiasi palette di sfondo).
     Il padding laterale = fascia di fade, così a riposo la prima chip è integra. */
  /* padding verticale (2px sopra/sotto): con overflow-y:hidden serve respiro, altrimenti
     premendo una chip il transform translateY(1px) di :active taglia il bordo inferiore. */
  margin-left: -12px; margin-right: -12px; padding: 2px 12px;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 12px, #000 calc(100% - 12px), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 12px, #000 calc(100% - 12px), transparent); }
.isl-switcher::-webkit-scrollbar { display: none; }
.isl-switcher > * { flex: 0 0 auto; scroll-snap-align: start; }
/* ISOLE TUTTE A SCHERMO (Impostazioni → «Mostra tutte le isole»). La striscia va a capo invece
   di scorrere: con quattro o cinque isole la terza e la quarta stavano fuori, e per raggiungerle
   si trascinava ogni volta, in tutte e quattro le schermate che usano questo selettore.
   La maschera di dissolvenza va spenta: serve a dire «c'e' altro oltre il bordo», e qui non c'e'
   piu' niente oltre il bordo — lasciata accesa sbiadirebbe le chip di testa e coda per niente. */
body.isl-wrap .isl-switcher { flex-wrap: wrap; overflow: visible; row-gap: var(--sp-6);
  -webkit-mask-image: none; mask-image: none; }
.isl-chip {
  display: inline-flex; align-items: center; gap: 6px; cursor: pointer; padding: 6px 10px;
  border-radius: 999px; font-size: 12px; font-weight: 600; color: var(--ink-dim);
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid var(--bronze-d); box-shadow: inset 0 1px 0 rgba(255,255,255,.05);
}
/* Coordinate: font più piccolo → col box-center i numeri "galleggiano" ~1px sopra la linea del
   nome. Le riporto sulla stessa base del nome così "Aetheris 100:101:1" legge come una riga sola. */
.isl-chip small { color: var(--patina); font-variant-numeric: tabular-nums; font-weight: 600; font-size: 10px;
  position: relative; top: 1px; }
/* L'AVAMPOSTO NON È UNA TUA ISOLA: il globo diventa ROSSO. In fila con le altre partenze è
   l'unica che sta al di là del Varco e l'unica che capovolge il verso del viaggio — il colore lo
   dice prima di leggere il nome. Le icone sono SVG a tinta fissa, quindi si tingono col filtro,
   come già i castoni per rarità: questi tre numeri portano l'azzurro dell'arte (#8fb8d6) a
   rgb(204,59,49), cioè il ruggine del gioco. Niente glow — solo il pigmento. */
.av-chip .gi { filter: hue-rotate(150deg) saturate(8) brightness(.8); }
/* Isola ATTIVA: velo ambra + testo/bordo ambra (come una tab attiva), niente glow, stesso peso e
   footprint dello spento — non deve sembrare più grande. Riconoscibile ma sobria. */
.isl-chip.on { color: var(--amber-l); font-weight: 600; border-color: var(--amber);
  background: linear-gradient(180deg, rgba(233,181,74,.22), rgba(233,181,74,.09));
  box-shadow: inset 0 0 0 1px rgba(233,181,74,.32); }
.isl-chip.on small { color: var(--amber-l); opacity: .75; }
.isl-chip.isl-add { color: var(--good); border-style: dashed; }
.isl-chip:active { transform: translateY(1px); }
.isl-chip.busy, .isl-chip[disabled] { opacity: .45; cursor: not-allowed; filter: grayscale(.5); }
.isl-chip.busy:active { transform: none; }
/* "Which island" tag on items in the GENERAL (Profile) inventory, where all islands mix. */
.chip.isl-badge { color: var(--brass-l); border-color: var(--brass-d); }

/* Profilo: stat card + inventory button + collapsable medals */
.ref-count { text-align: center; color: var(--good); font-size: 12px; font-weight: 600; letter-spacing: .2px; margin: 8px 0 2px; }
.ref-count b { color: var(--good); }
.prof-stats { margin-top: 10px; }
.ps-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr)); gap: 8px; }
.ps-tile { display: flex; flex-direction: column; gap: 1px; padding: 8px 10px; border-radius: 12px; background: rgba(0,0,0,.22); border: 1px solid var(--slate-3); }
/* Banda profilo SOTTILE = separatore: una riga di info essenziali, muta, con divisori. */
.prof-stats { padding: 8px 12px; }
.ps-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 12px; color: var(--ink-dim); }
.ps-strip .ps-chip { display: inline-flex; align-items: center; gap: 4px; }
.ps-strip .ps-chip b { color: var(--ink); font-weight: 700; font-variant-numeric: tabular-nums; }
.ps-strip .ps-chip.good { color: var(--good); font-weight: 700; }
.ps-strip .ps-chip .gi { width: 13px; height: 13px; }
.ps-strip .ps-chip + .ps-chip::before { content: "·"; margin-right: 4px; color: var(--slate-3); }
.ps-k { font-size: 10px; text-transform: uppercase; letter-spacing: .6px; color: var(--patina); font-weight: 700; }
.ps-v { font-size: 16px; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; line-height: 1.1; }
.ps-v.good { color: var(--good); }
.ps-sub { font-size: 10px; color: var(--ink-dim); }
.ps-xp { height: 6px; border-radius: 4px; background: rgba(0,0,0,.35); overflow: hidden; margin: 10px 0 0; border: 1px solid var(--slate-3); }
.ps-xp > i { display: block; height: 100%; background: linear-gradient(90deg, var(--bronze), var(--amber) 70%, var(--amber-l)); }
.ps-xp-cap { font-size: 10px; text-align: right; margin: 4px 0 6px; letter-spacing: .3px; }
.ps-email { font-size: 11px; }
.prof-inv { display: flex; align-items: center; gap: 12px; width: 100%; margin-top: 12px; padding: 12px 12px; border-radius: 12px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-1)); border: 1px solid var(--bronze-d); box-shadow: inset 0 1px 0 var(--edge-hi); cursor: pointer; text-align: left; }
.prof-inv:active { transform: translateY(1px); }
.prof-inv-static { cursor: default; }
.prof-inv-static:active { transform: none; }
.prof-inv .pi-ic { font-size: 22px; display: flex; align-items: center; }
.prof-inv .pi-tx { flex: 1; display: flex; flex-direction: column; }
.prof-inv .pi-tx b { color: var(--brass-l); font-size: 14px; }
.prof-inv .pi-arrow { color: var(--patina); font-size: 22px; }
/* Bigger, round-framed placeholder icons for the Profilo rows (Inventario / Cerca) & the
   collapsible sections (Emporio / Medaglie). Override the inline em sizing with fixed px. */
.prof-inv .pi-ic .gi { width: 30px; height: 30px; vertical-align: middle; }
.prof-collapse > summary .gi { width: 30px; height: 30px; vertical-align: middle; margin-right: 4px; }
.prof-inv .pi-ic .gi-coin, .prof-collapse > summary .gi-coin { background-size: 62%; }
/* Inventario: gem loadout panel */
.inv-panel { margin-top: 8px; }
/* Il tasto info "i" è absolute in alto a destra: lascia spazio al testo così non ci passa sotto
   (la parola finale della prima riga veniva coperta). */
.inv-panel > .card-body { padding-right: 38px; }
.inv-grid { margin-top: 10px; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.inv-gem { margin: 0; }
.inv-gem.on { border-color: var(--amber-l); box-shadow: inset 0 0 0 1px var(--amber-l); }
.inv-gem .card-head { gap: 6px; }
.inv-gem .card-actions { margin-top: 8px; display: flex; align-items: center; justify-content: space-between; gap: 6px; }
@media (max-width: 360px) { .inv-grid { grid-template-columns: 1fr; } }

/* Onboarding checklist: first-session guidance card (home island, dismissible) */
.onboard { margin: 10px 0 4px; border-color: var(--brass-d); }
.onboard .card-head h3 { flex: 1; }
.onboard .chat-x { margin-left: auto; }
.ob-step { display: flex; align-items: center; gap: 8px; font-size: 12px; padding: 2px 0; }
.ob-step.done { color: var(--ink-dim); text-decoration: line-through; }
/* Obiettivi cliccabili → nodo edificio/ricerca: cursore a mano + evidenzia al tocco. */
.stt-clk { cursor: pointer; border-radius: 4px; }
.stt-clk:active { background: rgba(233,181,74,.1); }
.ob-step.stt-clk > span:last-child { text-decoration: underline; text-decoration-color: rgba(233,181,74,.35); text-underline-offset: 2px; }
.ob-step.done.stt-clk > span:last-child { text-decoration: line-through; }
.ob-tick { width: 16px; text-align: center; color: var(--patina); }
.ob-step.done .ob-tick { color: var(--good); }
.ob-hint { margin-top: 6px; font-size: 11px; border-top: 1px solid var(--bronze-d); padding-top: 6px; }
.ob-reward { margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12px; }
.ob-reward-lbl { color: var(--amber-l); font-weight: 700; text-transform: uppercase; letter-spacing: .4px; font-size: 10px; }

/* ---- INNESTI (Mondo Rosso): le card nell'inventario dell'isola ----
   Tutte le card hanno la STESSA icona, come le carte di Ragnarok: si riconoscono dal nome
   e dalla tendina, non dal disegno. È voluto — venticinque icone diverse in una griglia da
   6 colonne diventano rumore, e il ritratto della bestia è già nella tendina, grande. */
.inn-tile .is-card { width: 30px; height: 30px; display: block;
  filter: drop-shadow(0 2px 4px rgba(0,0,0,.6)); }
/* Il nome si ferma a DUE RIGHE, con i puntini. Prima era un `max-height: 18px` su righe da 10.5:
   tagliava a meta' della seconda riga, e «Essenza del Cuore d'Assedio» finiva mozzata a meta'
   glifo — che non si legge come «continua», si legge come rotto. */
.inn-tile { min-width: 0; }
.inn-tile .is-nome { font-size: 10px; line-height: 1.05; text-align: center; padding: 0 2px;
  color: var(--brass-l); overflow: hidden; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.inn-tile.montata { border-color: var(--brass); }
/* Qui c'erano tre regole rimaste senza padrone dopo che gli Innesti sono diventati piatti
   (31/07/2026): `.is-g` disegnava i numeri romani del grado, `.is-cnt` un contatore di copie di
   una UI ancora precedente, e `.inn-tile.fuse-ready` accendeva la tessera quando ne avevi tre da
   fondere. Nessun JS le emette piu'.
   ATTENZIONE per chi passa di qui: `.inv-slot.fuse-ready`, un centinaio di righe piu' sotto, si
   chiama quasi uguale ma e' dei CASTONI — e i castoni la fusione ce l'hanno ancora. Sono due
   sistemi diversi con lo stesso nome di classe, ed e' l'unico punto in cui si toccano. */

/* L'Innesto montato, sull'arte della nave: stesso angolo e stessa meccanica del castone. */
.gem-corner.inn-corner { padding: 0; overflow: hidden; }
.gem-corner.inn-corner img { width: 100%; height: 100%; object-fit: contain; display: block; }

/* La tendina: ritratto della bestia a sinistra, scheda a destra (impianto Ragnarok, pelle
   nostra). Fissa e riposizionata via JS così funziona anche dentro la borsa che scrolla. */
.inn-pop { position: fixed; z-index: 90; width: min(340px, calc(100vw - 24px));
  border-radius: 12px; overflow: hidden; border: 1px solid var(--brass-d);
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  box-shadow: 0 10px 30px rgba(0,0,0,.65), inset 0 1px 0 rgba(255,228,176,.1); }
.inn-pop .ip-top { display: flex; gap: 10px; padding: 10px; }
.inn-pop .ip-art { width: 92px; height: 92px; flex: none; border-radius: 8px; overflow: hidden;
  border: 1px solid var(--brass-d); background: #140d0c; }
.inn-pop .ip-art img { width: 100%; height: 100%; object-fit: cover; display: block; }
.inn-pop .ip-art.vuota { display: flex; align-items: center; justify-content: center;
  color: var(--ink-dim); font-size: 10px; text-align: center; padding: 4px; }
/* La materia non ha un ritratto: al posto dell'arte va la sua icona, grande, nello stesso
   riquadro. Cosi' le due carte hanno la stessa impaginazione anche se una ha una bestia
   dipinta e l'altra un disegno solo. */
.inn-pop .ip-art-ico .gi { width: 32px; height: 32px; }
/* La materia ha due righe di testo, non un ritratto e cinque: il riquadro da 92 lasciava
   mezza carta vuota e spingeva il lore sotto la barra di navigazione. */
.inn-pop.mat-pop .ip-art { width: 56px; height: 56px; }
.inn-pop .ip-tit { flex: 1; min-width: 0; }
.inn-pop h4 { font-family: var(--font-display); font-size: 14px; margin: 0 0 1px;
  color: var(--brass-l); line-height: 1.15; }
.inn-pop .ip-da { font-size: 11px; color: var(--ink-dim); margin-bottom: 4px; }
.inn-pop .ip-eff { display: flex; align-items: baseline; gap: 6px; font-size: 11px; padding: 2px 0; }
.inn-pop .ip-eff .k { font-size: 10px; letter-spacing: .08em; text-transform: uppercase;
  border-radius: 4px; padding: 0 4px; line-height: 14px; flex: none; }
.inn-pop .ip-eff .k.c { color: var(--patina); border: 1px solid rgba(103,185,168,.4); }
.inn-pop .ip-eff .k.g { color: var(--rust); border: 1px solid rgba(195,75,48,.45); }
.inn-pop .ip-eff .t { flex: 1; min-width: 0; }
.inn-pop .ip-eff b { color: var(--amber-l); font-variant-numeric: tabular-nums; }
.inn-pop .ip-lore { font-size: 11px; color: var(--ink-dim); font-style: italic;
  padding: 0 10px 8px; }
.inn-pop .ip-foot { display: flex; gap: 6px; align-items: center; padding: 8px 10px;
  border-top: 1px solid rgba(255,228,176,.08); background: rgba(0,0,0,.2); }
.inn-pop .ip-foot .sp { flex: 1; font-size: 11px; color: var(--ink-dim); }

/* FASCIA III = MVP (12/08/2026): la carta rara e doppia si riconosce PRIMA di aprirla.
   Viola su tessera e tendina — bordi e velature come da regola, MAI glow: le ombre restano scure. */
.inn-tile.f3 { border-color: #8a63c9;
  background: linear-gradient(160deg, rgba(122,84,196,.30), rgba(43,28,74,.20)); }
.inn-tile.f3 .is-card { filter: drop-shadow(0 2px 4px rgba(26,10,52,.75)); }
/* L'innesto DENTRO la stiva del trasporto: la stessa carta della borsa, ma dentro una tessera
   .mkt-tile che ha gia' cornice e fondo suoi — qui l'innesto e' solo l'arte, senza doppio bordo.
   Le tessere degli innesti non hanno rarita' di gemma (.rar-*): il colore lo da' la fascia. */
.mkt-tile.is-inn { border-color: var(--line); }
.inn-tile.inn-instiva { display: flex; align-items: center; justify-content: center;
  border: 0; background: none; padding: 0; }
.inn-tile.inn-instiva.f3 .is-card { filter: drop-shadow(0 2px 4px rgba(26,10,52,.75)); }
.mkt-tile.is-inn:has(.inn-instiva.f3) { border-color: #8a63c9;
  background: linear-gradient(160deg, rgba(122,84,196,.30), rgba(43,28,74,.20)); }
.inn-pop.f3 { border-color: #8a63c9;
  background: linear-gradient(180deg, rgba(96,66,158,.26), rgba(36,22,66,.30)),
    linear-gradient(180deg, var(--panel-2), var(--panel-0)); }
.inn-pop.f3 .ip-art { border-color: rgba(138,99,201,.55); }
.inn-pop.f3 h4 { padding-right: 32px; }
.ip-mvp { position: absolute; top: 8px; right: 8px; z-index: 1;
  font-size: 10px; font-weight: 700; letter-spacing: .08em; line-height: 14px;
  color: #e8ddff; padding: 0 6px; border-radius: 4px;
  border: 1px solid rgba(160,122,224,.65); background: rgba(84,56,140,.45); }

/* ---- MONDO ROSSO: la scheda della preda e la composizione dell'assalto ----
   Stessa pagina-rapporto degli altri overlay: qui cambia solo il contenuto, non la cornice. */
.rz-testa { display: flex; gap: 10px; align-items: flex-start; }
.rz-art { width: 104px; height: 104px; flex: none; border-radius: 8px; overflow: hidden;
  border: 1px solid var(--brass-d); background: #150c0b; }
.rz-art img { width: 100%; height: 100%; object-fit: cover; display: block; }
.rz-art.vuota { display: flex; align-items: center; justify-content: center; text-align: center;
  color: var(--ink-dim); font-size: 10px; padding: 6px; }
/* TESTATA A BANDA per i punti di controllo: l'illustrazione fa da FONDO, non da francobollo.
   Prima c'era un riquadro da 104 con dentro un'iconcina di bandiera — un buco nero quadrato in
   cima alla scheda, che a schermo leggeva come un'immagine che non aveva caricato. E l'arte dei
   punti e' larga 1086x362: dentro un quadrato si sarebbe vista una fetta centrale senza senso.
   Stesso trattamento delle tessere nella lista e delle card Azioni — immagine in `cover`, velo di
   leggibilita' sopra, testo sopra ancora — cosi' aprire un punto dalla lista non cambia linguaggio.
   Se il file manca, `data-artfall="remove"` toglie l'immagine e resta la banda scura: nessun buco. */
.rz-testa.rz-banda { display: block; position: relative; overflow: hidden;
  border: 1px solid var(--bronze-d); border-radius: 8px;
  padding: var(--sp-12); min-height: 92px; background: var(--slate-0); }
.rz-banda .rz-bg { position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; object-position: center; z-index: 0; }
.rz-banda::before { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(90deg, rgba(9,13,18,.86) 0%, rgba(9,13,18,.6) 48%, rgba(9,13,18,.28) 100%); }
.rz-banda .rz-tit { position: relative; z-index: 2; }
/* IL TUO PRESIDIO — staccato da quello che c'e' sopra. Sopra si COMPONE una partenza, qui si
   guarda cosa hai gia' su quel punto e lo si riporta a casa: due gesti opposti, e nella stessa
   colonna senza uno stacco si scambiava il selettore di sopra per quello del richiamo — cioe' si
   rischiava di mandare via navi credendo di sceglierle.
   Lo stacco lo fa il FONDO che scurisce scendendo, non un bordo: un bordo in piu' in una scheda
   che ne ha gia' cinque diventa rumore, una campitura piu' cupa si legge senza guardarla. */
.rz-presidio {
  margin: var(--sp-16) calc(-1 * var(--sp-12)) calc(-1 * var(--sp-12));
  padding: var(--sp-4) var(--sp-12) var(--sp-16);
  border-top: 1px solid rgba(0,0,0,.5);
  background: linear-gradient(180deg, rgba(0,0,0,.22), rgba(0,0,0,.42));
}
.rz-presidio .rz-sez { display: flex; align-items: center; gap: var(--sp-6); }
.rz-presidio-n { margin-left: auto; font-size: 13px; font-weight: 700; color: var(--ink);
  font-variant-numeric: tabular-nums; letter-spacing: .3px; }
.rz-presidio-nota { font-size: 11px; margin-top: var(--sp-8); }
/* Flotta all'avamposto, un blocco per isola d'ancoraggio: intestazione con nome e totale, poi
   le stesse tessere della Panoramica. La riga divide le isole senza incorniciarle — sono
   sezioni di una lista, non card dentro una card. */
.av-isola + .av-isola { margin-top: var(--sp-12); padding-top: var(--sp-10);
  border-top: 1px solid rgba(255,255,255,.07); }
.av-isola-h { display: flex; align-items: center; gap: var(--sp-8); margin-bottom: var(--sp-6);
  font-size: 11px; text-transform: uppercase; letter-spacing: .5px; color: var(--patina); }
/* Il nome sta ACCANTO al medaglione, non sotto. Il medaglione e' un `.av-slot`, cioe' un
   `display:grid`: dentro uno span di testo si prende la riga tutta per se' e sfratta il nome
   a capo. Qui lo span diventa a sua volta una riga, e i due si allineano al centro. */
.av-isola-h .av-isl { font-weight: 700; display: inline-flex; align-items: center;
  gap: var(--sp-6); min-width: 0; }
/* Il conto delle navi e' un NUMERO DA PLANCIA, non una parola: stesso ottone inciso del totale
   in testata, un corpo sotto. Prima era il grassetto di sistema, e in una colonna di cifre
   incolonnate sembrava testo capitato li'. */
/* I posti nave che quelle navi tengono occupati SULL'ISOLA da cui sono partite. Sta a sinistra
   del conto navi e in tono minore: e' il prezzo, non il vanto. */
.av-isola-slot { margin-left: auto; display: inline-flex; align-items: center; gap: var(--sp-4);
  font-size: 11px; color: var(--muted); font-variant-numeric: tabular-nums; text-transform: none;
  letter-spacing: 0; }
.av-isola-slot .gi { width: 12px; height: 12px; }
.av-isola-n { margin-left: var(--sp-8); font-family: var(--font-display); font-size: 16px;
  font-weight: 700; color: var(--brass-l); letter-spacing: .5px;
  font-variant-numeric: tabular-nums; }
/* Attacco e difesa di tutta la flotta di la': pillole sotto la testata, prima delle isole —
   e' il riassunto, e i riassunti stanno in cima. */
.av-forza { display: flex; flex-wrap: wrap; gap: var(--sp-6); margin: var(--sp-6) 0 var(--sp-12); }
/* Giacenza della materia: barra piatta, incassata. Non e' una barra di progresso verso un
   premio — e' un contenitore che si riempie, e quando e' pieno si butta via roba. */
.rm-giacenza { margin-top: var(--sp-12); padding-top: var(--sp-10);
  border-top: 1px solid rgba(255,255,255,.07); }
.rm-gia-top { display: flex; align-items: baseline; justify-content: space-between;
  font-size: 11px; margin-bottom: var(--sp-6); }
.rm-gia-top b { font-variant-numeric: tabular-nums; letter-spacing: .3px; }
.rm-gia-bar { height: 8px; border-radius: 4px; overflow: hidden; background: var(--slate-0);
  border: 1px solid var(--slate-3); box-shadow: inset 0 1px 3px rgba(0,0,0,.6); }
.rm-gia-bar > i { display: block; height: 100%; background: linear-gradient(90deg, #8d5a2e, var(--brass)); }
.rz-tit { flex: 1; min-width: 0; }
.rz-tit h4 { font-family: var(--font-display); font-size: 16px; margin: 0 0 2px; color: var(--brass-l); }
/* La vita si mostra in BARRA, mai in cifre: il numero esatto trasforma il coordinamento di
   gilda in un foglio di calcolo, la barra lascia una caccia. */
.rz-vita { height: 7px; border-radius: 4px; margin-top: 6px; overflow: hidden;
  background: rgba(0,0,0,.5); border: 1px solid var(--bronze-d); }
.rz-vita i { display: block; height: 100%; background: linear-gradient(90deg, #b4243a, #d9662f); }
.rz-storia { font-size: 12px; color: var(--ink-dim); font-style: italic; margin: 10px 0 4px;
  border-left: 2px solid var(--bronze-d); padding-left: 8px; }
.rz-sez { font-size: 10px; letter-spacing: .09em; text-transform: uppercase; color: var(--patina);
  margin: 12px 0 6px; border-bottom: 1px solid rgba(255,228,176,.08); padding-bottom: 4px; }
/* «La flotta» col tasto Tutte a destra, come negli altri selettori navi (07/08/2026). */
.rz-sez-flex { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.rz-sez-flex .btn-tutte { margin-left: 0; text-transform: none; letter-spacing: normal; }
.rz-riga { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 13px; }
.rz-riga .rz-nome { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rz-riga .rz-num { display: flex; align-items: center; gap: 6px; }
.rz-riga .rz-num b { min-width: 30px; text-align: center; font-variant-numeric: tabular-nums; }
.rz-pron .cf-line { font-size: 13px; }
/* Gli avvisi non sono errori: sono il motivo per cui la flotta sbagliata torna a mani vuote.
   Vanno letti PRIMA di partire, quindi stanno qui e non nel rapporto. */
.rz-avviso { font-size: 12px; color: #ffc9a8; background: rgba(195,75,48,.13);
  border-left: 2px solid var(--rust); border-radius: 0 8px 8px 0; padding: 4px 8px; margin-top: 6px; }

/* Game-style inventory bag: framed scrollable box of square socket tiles */
.inv-hint { font-size: 11px; margin: 8px 2px 0; }
.inv-box { margin-top: 8px; max-height: 320px; overflow-y: auto; -webkit-overflow-scrolling: touch;
  padding: 10px; border: 1px solid var(--brass-d); border-radius: 12px;
  background: linear-gradient(180deg, rgba(10,15,22,.85), rgba(14,20,28,.92));
  box-shadow: inset 0 2px 10px rgba(0,0,0,.55), inset 0 0 0 1px rgba(0,0,0,.35); }
/* `minmax(0, 1fr)` e non `1fr`. Sono la stessa cosa finche' il contenuto e' piccolo, e diverse
   appena non lo e': `1fr` vale `minmax(auto, 1fr)`, e quell'`auto` impedisce alla casella di
   scendere sotto la parola piu' lunga che contiene. Nella tab Innesti, dove i nomi sono
   «Saettamorte» e «Ingozzatore», le sei tracce sommavano 390px dentro 326px di cornice: la
   sesta colonna finiva FUORI, e si vedeva solo scorrendo di lato una griglia che nessuno pensa
   di poter scorrere. Con lo zero come minimo la casella si stringe e il nome va a capo. */
.inv-slots { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 6px; }
@media (max-width: 340px) { .inv-slots { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
@media (min-width: 560px) { .inv-slots { grid-template-columns: repeat(8, minmax(0, 1fr)); } }
.inv-slot { position: relative; aspect-ratio: 1; border-radius: 8px; padding: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  background: radial-gradient(120% 120% at 50% 20%, rgba(35,46,60,.9), rgba(16,22,30,.95));
  border: 1.5px solid var(--ink-dim); color: var(--ink);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05), inset 0 -6px 12px rgba(0,0,0,.4);
  cursor: pointer; font: inherit; }
.inv-slot:active { transform: translateY(1px); }
.inv-slot .is-ico { font-size: 18px; line-height: 1; filter: drop-shadow(0 2px 4px rgba(0,0,0,.6)); }
.inv-slot .is-ico .gi { width: 20px; height: 20px; }
.inv-slot .is-val { font-size: 10px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--ink); }
/* Ring loot tile: quanti AFFISSI ha l'anello, in rombi. Scritto «2×» si leggeva come «due
   anelli» — e gli anelli non si impilano MAI: ogni casella è un oggetto. */
.inv-slot.ring-slot-tile .rt-pips { display: flex; gap: 2px; margin-top: 1px; }
.inv-slot.ring-slot-tile .rt-pips i { width: 5px; height: 5px; background: var(--amber-l);
  transform: rotate(45deg); border-radius: 1px; display: block; }
.inv-slot .is-lock { position: absolute; top: 3px; right: 4px; font-size: 10px; opacity: .95; }
.inv-slot .is-lock .gi { width: 11px; height: 11px; }
.inv-slot.safe { border-color: var(--amber-l); box-shadow: inset 0 0 0 1px rgba(233,181,74,.4); }
.inv-slot[draggable="true"] { cursor: grab; }
.inv-slot.dragging { opacity: .4; }
.drop-hot { outline: 2px dashed var(--amber-l); outline-offset: -2px; }
/* Cassaforte strip + vault slots */
.vault-strip { margin-top: 10px; }
.vault-head { font-size: 12px; margin-bottom: 6px; display: flex; align-items: center; gap: 6px; color: var(--amber-l); }
.vault-slots { grid-template-columns: repeat(6, 1fr); }
.inv-slot.vault-slot { border-color: rgba(233,181,74,.5); background: linear-gradient(180deg, rgba(120,84,26,.18), rgba(0,0,0,.35)); }
.inv-slot.vault-slot.empty { border-style: dashed; color: rgba(233,181,74,.55); display: flex; align-items: center; justify-content: center; }
.inv-slot.vault-slot.empty .gi { width: 18px; height: 18px; opacity: .6; }
/* Vault toggle row inside the gem modal */
.vault-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap;
  margin: 8px 0; padding: 8px 10px; border-radius: 8px; border: 1px solid var(--slate-3); background: rgba(0,0,0,.2); }
.vault-row.safe { border-color: rgba(233,181,74,.45); background: linear-gradient(180deg, rgba(120,84,26,.16), rgba(0,0,0,.22)); }
/* Il testo (lungo) manda il bottone a capo su una riga propria: margin-left:auto lo tiene
   comunque a DESTRA. min-width comune → "Fondi", "Metti al sicuro" e "Togli" stessa dimensione. */
.vault-row .subtle { flex: 1 1 auto; min-width: 0; }
.vault-row .btn { flex: none; margin-left: auto; min-width: 120px; }
.inv-slot .is-flag { position: absolute; top: 3px; left: 5px; font-size: 10px; }
.inv-slot .is-isle { position: absolute; bottom: 3px; left: 5px; font-size: 10px; opacity: .8; }
.inv-slot .gem-dot { top: 5px; right: 5px; }
/* Pronti a fondere: quando esistono ≥3 castoni identici, tutti e 3 BRILLANO forte (pulse ambra).
   Nessun badge/pallino: solo il bagliore invita a toccarne uno → nel modale appare "Fondi". */
.inv-slot.fuse-ready { border-color: var(--amber); box-shadow: 0 0 0 1px rgba(233,181,74,.55); }
.inv-slot.fuse-ready::after { content: ""; position: absolute; inset: -1px; border-radius: 8px; pointer-events: none; border: 1px solid var(--amber-l); box-shadow: 0 0 0 1px rgba(240,209,138,.95); opacity: 0; animation: gpulse 1.15s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) {
  .inv-slot.fuse-ready { animation: none; box-shadow: 0 0 0 1px rgba(240,209,138,.9); }
}
.inv-slot.rar-comune      { border-color: #5b6a78; }
.inv-slot.rar-raro        { border-color: #6fc0aa; box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.inv-slot.rar-epico       { border-color: #a98fe0; box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.inv-slot.rar-leggendario { border-color: var(--amber-l); box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.inv-slot.rar-mitico      { border-color: #e7627a; box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.inv-slot.on { outline: 2px solid rgba(126,190,120,.5); outline-offset: -2px; }
.inv-slot.empty { background: rgba(10,14,20,.6); border: 1.5px dashed rgba(120,134,150,.25);
  box-shadow: inset 0 2px 8px rgba(0,0,0,.5); cursor: default; }
/* Infra castone slot on a building's detail card: engraved sub-panel under the stats. */
.castone-slot { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--bronze-d); display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.castone-slot-title { width: 100%; font-size: 11px; color: var(--patina); letter-spacing: .3px; text-transform: uppercase; }
.castone-slot-title .subtle { text-transform: none; }
.castone { display: inline-flex; align-items: center; gap: 6px; padding: 2px 8px; border-radius: 8px; font-size: 12px;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.castone.unstable { border-color: var(--rust); background: linear-gradient(180deg, rgba(140,46,28,.22), rgba(0,0,0,.25)); }
.castone .castone-stat { font-weight: 600; font-variant-numeric: tabular-nums; }
.castone .castone-kind { font-size: 10px; color: var(--ink-dim); }
.castone-pick { display: flex; flex-wrap: wrap; gap: 6px; width: 100%; }

/* Compact buff badges shown to the LEFT of a building's level (per socketed castone). */
.buff-badges { display: inline-flex; flex-wrap: wrap; gap: 4px; justify-content: flex-end; }
.buff-badge { display: inline-flex; align-items: center; gap: 2px; padding: 1px 6px; border-radius: 999px; white-space: nowrap; flex: none;
  font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; cursor: pointer; white-space: nowrap;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.28); box-shadow: inset 0 1px 0 rgba(255,255,255,.05); }
.buff-badge:hover { border-color: var(--brass); }
.buff-badge.unstable { border-color: var(--rust); background: linear-gradient(180deg, rgba(140,46,28,.2), rgba(0,0,0,.25)); }

/* Inventory gem cards: tap to open the socket/unsocket modal; in-use gems get a red dot. */
.inv-gem[role="button"] { cursor: pointer; position: relative; }
.inv-gem[role="button"]:hover { border-color: var(--brass); }
.gem-dot { position: absolute; top: 7px; right: 7px; width: 9px; height: 9px; border-radius: 50%;
  background: var(--rust); box-shadow: inset 0 1px 0 rgba(255,255,255,.25); z-index: 2; }
/* Gem modal (reuses .confirm-overlay/.confirm-box) */
.gm-box { max-width: 380px; }
.gm-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 4px; }
/* Header del modale castone: buff in evidenza + chip rarità/tipo, con spazio per la (i). */
.gm-hero { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; margin: 2px 34px 10px 0; }
.gm-buff { font-size: 14px; padding: 4px 12px; gap: 6px; cursor: default; }
.gm-buff .gi { width: 18px; height: 18px; }
.gm-tags { display: flex; flex-wrap: wrap; gap: 6px; }
.gm-where { margin: 0 0 4px; line-height: 1.45; }
.gm-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 12px; }
.gm-targets { display: flex; flex-direction: column; gap: 6px; max-height: 46vh; overflow-y: auto; }
.gm-target { text-align: left; justify-content: flex-start; }

/* Public player card (reuses .confirm-overlay/.gm-box) */
.lb-clk { cursor: pointer; }
.lb-clk:active { transform: scale(.99); }
/* Nome giocatore / gilda cliccabile ovunque: sottolineatura tratteggiata discreta + pointer. */
.name-link, .guild-link { cursor: pointer; text-decoration: underline dotted rgba(210,180,120,.55); text-underline-offset: 2px; }
.name-link:hover, .guild-link:hover { text-decoration-style: solid; filter: brightness(1.15); }
.name-link:active, .guild-link:active { transform: scale(.99); }
/* Scala di rivelazione dello spionaggio: chip che si "accendono" al salire dei droni inviati. */
.spy-reveal-ladder { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0 6px; }
.spy-reveal-ladder .srl-ok { color: var(--good); border-color: rgba(120,200,120,.4); }
.spy-reveal-ladder .srl-lock { opacity: .6; }
/* Nota sotto la scala: le soglie contano le sonde che TORNANO. Piccola e su riga propria —
   e' la regola che spiega perche' sei sonde a volte non bastano. */
.spy-reveal-ladder .srl-note { display: block; width: 100%; margin-top: 4px; font-size: 10px;
  line-height: 1.4; color: var(--ink-dim); opacity: .9; }
/* Velo scuro traslucido su TUTTE le card giocatore (profondità); chi ha una gilda
   riceve in più l'alone del colore-bandiera. Nessun bordo/lato colorato. */
.pp-box { max-width: 380px; background-image: linear-gradient(180deg, rgba(4,6,10,.34), rgba(4,6,10,.06) 46%);
  border-left: 1px solid #0c1116; padding-top: 20px; }   /* niente rail d'ottone a sinistra */
/* Chiudi rotondo ed elegante: stesso pulsante per card giocatore e mappa-mondo. */
/* IL TASTO A SOLO GLIFO — chiudere, rimuovere, tornare indietro. Uno solo, ovunque.
   NIENTE SCATOLA: c'e' il glifo e basta. Erano quattro scatole diverse e tutte troppo pesanti
   — .chat-x 34×34 col fondo pannello e il bordo bronzo, .round-x un tondo pieno con l'ombra
   portata, .mkc-x e .mkt-cart-x due riquadri bordati — e a schermo gridavano piu' dei tasti su
   cui si agisce davvero. Un ✕ non e' un'azione che si offre: e' una via d'uscita, e deve stare
   zitta finche' non la cerchi.
   L'AREA DI TOCCO resta piena e quadrata (--btn-h): un bersaglio piccolo su un telefono e' un
   bottone che non si preme. Si toglie la scatola, non il bersaglio.
   Il fondo compare solo al passaggio, come velatura — mai un bagliore. */
.round-x, .chat-x, .mkc-x, .mkt-cart-x {
  width: var(--btn-h); height: var(--btn-h); padding: 0; flex: none;
  display: grid; place-items: center; cursor: pointer;
  background: none; border: 0; border-radius: var(--r-pill); box-shadow: none;
  color: var(--ink-dim); font-size: 16px; line-height: 1;
  transition: color .12s, background .12s, transform .04s;
}
.round-x:hover, .chat-x:hover, .mkc-x:hover, .mkt-cart-x:hover {
  color: var(--brass-l); background: rgba(255,255,255,.07); }
.round-x:active, .chat-x:active, .mkc-x:active, .mkt-cart-x:active { transform: translateY(1px); }
/* Le due ✕ del Mercato tolgono una riga dal carrello: rosse al tocco, non ottone. */
.mkc-x:hover, .mkt-cart-x:hover { color: #e7627a; background: rgba(231,98,122,.10); }
.round-x { position: absolute; top: 10px; right: 10px; }
.round-x:hover { border-color: var(--brass); color: var(--brass-l); }
.round-x:active { transform: translateY(1px); }
/* Tasto INFO del popup di conferma (round-x con "i") + pannello spiegazione a scomparsa. */
.cf-info-panel { margin-top: 10px; padding: 10px 12px; border-radius: 8px; border: 1px solid var(--slate-3);
  background: rgba(0,0,0,.28); font-size: 12px; color: var(--ink-dim); line-height: 1.42; }
.cf-info-panel b { color: var(--ink); }
.cf-info-panel ul { margin: 6px 0 0; padding-left: 16px; }
.cf-info-panel li { margin: 2px 0; }
.pp-box.pp-tinted {
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 10px 30px rgba(0,0,0,.5);
}
.pp-head { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.pp-head h3 { margin: 0; }
/* Riga «quale isola»: compare solo aprendo la scheda dal globo, e dice se hai cliccato la
   capitale o una colonia. È il pezzo che mancava quando si attaccava sempre l'isola madre. */
/* Niente rail d'ottone a sinistra (17/08/2026): quella barretta appartiene SOLO alle action-card
   delle Missioni, e su una riga informativa dentro la scheda di un capitano faceva l'occhiello
   posticcio. Cornice uniforme e angoli a 4px, come le altre card del gioco. */
.pp-island { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: -4px 0 10px;
  padding: 6px 10px; border-radius: 4px; font-size: 12px;
  border: 1px solid var(--bronze-d);
  background: linear-gradient(180deg, rgba(233,181,74,.07), rgba(0,0,0,.18)); }
.pp-island .gi { width: 14px; height: 14px; }
.pp-tag { color: var(--ink-dim); font-weight: 600; font-size: .72em; letter-spacing: .3px; margin-left: 2px; vertical-align: middle; }
/* Ritratto del capitano: cornice quadra-smussata come nella tab Profilo (.pid-avatar). */
.pp-av { width: 56px; height: 56px; flex: 0 0 auto; border-radius: 15px; overflow: hidden;
  border: 2px solid var(--bronze-d); background: radial-gradient(120% 120% at 30% 18%, var(--panel-2), var(--sky-0));
  box-shadow: 0 0 0 1px rgba(0,0,0,.6), 0 3px 8px rgba(0,0,0,.45), inset 0 1px 0 var(--edge-hi);
  display: grid; place-items: center; }
.pp-av img, .pp-av svg { width: 100%; height: 100%; }
.pp-av .av-img { border-radius: 12px; object-fit: cover; }
/* Scheda di una TUA isola: icona casa/castello centrata al posto dell'avatar. */
.pp-av.own-isl-ico { display: flex; align-items: center; justify-content: center; font-size: 32px;
  background: linear-gradient(160deg, #2a1f10, #180f06); }
/* Stemma di gilda nella card: 2× rispetto a prima. */
.pp-guild .pp-crest .crestbadge { width: 3em; height: 3em; }
.pp-guild { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); margin-bottom: 10px; }
.pp-guild .crest, .pp-guild svg { width: 34px; height: 34px; flex: 0 0 auto; }
/* Gradi sotto il nome gilda: chip Fondatore/Ufficiale (+ Generale se eletto) con la loro icona. */
.pp-ranks { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.pp-ranks .chip { font-size: 11px; padding: 1px 8px; text-transform: capitalize; }
.pp-ranks .chip .gi { width: 12px; height: 12px; vertical-align: -2px; }
.pp-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 12px; margin-bottom: 10px; }
.pp-stat { display: flex; justify-content: space-between; align-items: baseline; gap: 8px;
  padding: 4px 8px; border-radius: 8px; background: rgba(0,0,0,.18); }
.pp-stat-wide { grid-column: 1 / -1; }   /* valore lungo (es. "Su richiesta") su un rigo tutto suo */
.pp-stat-wide b { white-space: nowrap; }
.pp-meds { display: flex; flex-wrap: wrap; gap: 6px; }
.pp-compose textarea { width: 100%; box-sizing: border-box; resize: vertical; margin-top: 8px;
  border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.28);
  color: var(--ink); padding: 8px; font: inherit; }
/* Player-modal action row: buttons share the top row evenly, the muted-gold primary
   spans full width below — always aligned, never a ragged wrap. */
.pp-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.pp-acts .btn { flex: 1 1 auto; min-width: 96px; margin: 0; }
.pp-acts .btn.pp-primary { flex: 1 1 100%; margin-left: 0; }
/* Mutual history timeline in the player modal — fixed-height, scrollable (swipe) box */
.pp-hist { margin: 12px 0 4px; }
.pp-hist-h { font-size: 11px; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 6px; }
.pp-hist-scroll { max-height: 168px; overflow-y: auto; overflow-x: hidden;
  -webkit-overflow-scrolling: touch; scrollbar-width: thin;
  border: 1px solid var(--bronze-d); border-radius: 8px; background: rgba(0,0,0,.18); padding: 6px; }
.pp-hist-row { display: flex; align-items: center; gap: 8px; padding: 4px 8px; border-radius: 8px;
  background: rgba(0,0,0,.22); margin-bottom: 4px; font-size: 12px; color: var(--ink); }
.pp-hist-row:last-child { margin-bottom: 0; }
.pp-hist-row .gi { width: 16px; height: 16px; flex: 0 0 auto; opacity: .85; }
.pp-hist-lbl { flex: 1 1 auto; min-width: 0; text-transform: capitalize; }
.pp-hist-when { flex: 0 0 auto; font-size: 11px; }
.pp-hist-row.hist-win { box-shadow: inset 3px 0 0 var(--good); }
.pp-hist-row.hist-loss { box-shadow: inset 3px 0 0 var(--rust, #b4552e); }
/* Guild invites (invitee's Gilda tab) */
.pp-inv-row { display: flex; align-items: center; gap: 10px; padding: 8px 4px; border-bottom: 1px solid rgba(0,0,0,.2); }
.pp-inv-row:last-child { border-bottom: none; }
.pp-inv-row .crest-slot, .pp-inv-row .crest-slot svg { width: 34px; height: 34px; flex: 0 0 auto; }
.pp-inv-info { flex: 1 1 auto; min-width: 0; }
.pp-inv-acts { display: flex; gap: 6px; flex: 0 0 auto; }

/* Inventory tabs (Gemme / Anelli / Altro) + per-island selector */
/* Le schede dell'inventario SCORRONO in orizzontale: da tre a quattro (Innesti) non ci
   stanno più su un telefono stretto, e comprimerle fino a spezzare le parole è peggio che
   farle scorrere. `flex: 0 0 auto` toglie la compressione, il contenitore scorre, e su
   desktop la rotella del mouse muove l'asse orizzontale (vedi _wheelToX in app.js).
   `scroll-snap` fa fermare la scheda sul bordo invece che a metà. */
.inv-tabs { display: flex; gap: 6px; margin: 4px 0 8px; overflow-x: auto; overflow-y: hidden;
  scroll-snap-type: x proximity; -webkit-overflow-scrolling: touch; scrollbar-width: none;
  overscroll-behavior-x: contain; }
.inv-tabs::-webkit-scrollbar { display: none; }
.inv-tab { flex: 0 0 auto; min-width: 92px; scroll-snap-align: start;
  padding: 8px 12px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.25);
  color: var(--ink-dim); font-size: 12px; font-weight: 700; cursor: pointer; white-space: nowrap; }
/* Quando ci stanno tutte, si allargano a riempire la riga: su schermi larghi la fila corta
   e allineata a sinistra sembrerebbe un errore di layout. */
@media (min-width: 520px) { .inv-tab { flex: 1 1 auto; } }
.inv-tab.on { color: var(--amber-l); border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.2), rgba(0,0,0,.25)); }
.inv-islands { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }

/* Combat loadout: N generic ring slots (multi-affix rings, stile Souls) */
.rk-totals { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--slate-3); }
/* I 4 slot anello del loadout: griglia FISSA (2×2 su mobile, 1×4 da 480px) con celle di
   dimensione COSTANTE — vuote o piene rendono identiche, così equipaggiare/rimuovere un
   anello non altera più forma o layout. Gli affix sono top-aligned e clippati alla cella. */
.ring-loadout { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin: 8px 0; }
@media (min-width: 480px) { .ring-loadout { grid-template-columns: repeat(4, 1fr); } }
.ring-eqslot { text-align: left; border: 1px solid var(--bronze-d); border-radius: 12px; padding: 10px; background: rgba(0,0,0,.22);
  cursor: pointer; color: var(--ink); display: flex; flex-direction: column; gap: 6px;
  height: 116px; overflow: hidden; box-sizing: border-box; }
.ring-eqslot:hover { border-color: var(--brass); }
.ring-eqslot.empty { border-style: dashed; align-items: center; justify-content: center; color: var(--ink-dim); cursor: pointer; gap: 4px; font: inherit; }
.ring-eqslot.empty:hover { border-color: var(--brass); color: var(--ink); }
.ring-eqslot.empty .rk-add { font-size: 10px; color: var(--brass-l); }
/* Picker anelli: lista di anelli liberi (tutte le isole), riga cliccabile = equipaggia. */
.rp-list { display: flex; flex-direction: column; gap: 6px; max-height: 62vh; overflow-y: auto; margin-top: 4px; }
.rp-row { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; cursor: pointer; font: inherit;
  padding: 8px 10px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); color: var(--ink); }
.rp-row:hover { border-color: var(--brass); background: rgba(120,84,26,.16); }
.rp-row:disabled { opacity: .5; cursor: not-allowed; }
/* RARITA' = BORDO INTERO, non rail a sinistra (17/08/2026, ordine del committente). Era
   l'ULTIMO posto col rail: caselle inventario, angoli castone, libri del Mercato e gli slot
   anello equipaggiati — che stanno nella stessa schermata — usano tutti il bordo colorato.
   Lo stesso anello cambiava linguaggio secondo se lo stavi scegliendo o se lo portavi. */
.rp-row.rar-raro { border-color: #6fc0aa; } .rp-row.rar-epico { border-color: #a98fe0; }
.rp-row.rar-leggendario { border-color: var(--amber-l); } .rp-row.rar-mitico { border-color: #e7627a; }
.rp-ic { flex: none; } .rp-ic .gi { width: 20px; height: 20px; }
.rp-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; font-size: 12px; }
.rp-info b { font-size: 13px; }
.rp-isl { flex: none; font-size: 11px; display: inline-flex; align-items: center; gap: 2px; white-space: nowrap; }
.rp-isl .gi { width: 12px; height: 12px; }
.ring-eqslot.rar-raro { border-color: #6fc0aa; } .ring-eqslot.rar-epico { border-color: #a98fe0; } .ring-eqslot.rar-leggendario { border-color: var(--amber-l); /* glow rimosso */ } .ring-eqslot.rar-mitico { border-color: #e7627a; }
.ring-eqslot .rk-head { display: flex; align-items: center; gap: 6px; font-size: 12px; }
/* "Anello" scritto semplice accanto all'icona; il tag rarità sta a destra (flusso normale).
   Se non c'è spazio è il nome "Anello" a essere TAGLIATO (overflow), non il tag a coprirlo. */
.ring-eqslot .rk-head b { flex: 1; min-width: 0; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ink-dim); font-weight: 600; }
.ring-eqslot .rk-head .rk-rar { flex: none; margin: 0; }
.ring-eqslot .rk-ic .gi, .ring-eqslot .rk-ic { width: 18px; height: 18px; }
.rk-affs { display: flex; flex-direction: column; gap: 2px; }
.rk-aff { font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums; display: inline-flex; align-items: center; gap: 4px; }
.rk-aff b { color: var(--good); }
.rk-affs-lg { gap: 8px; margin: 6px 0 10px; }
.rk-aff-row { display: flex; align-items: center; gap: 8px; font-size: 13px; padding: 6px 8px; border-radius: 8px; background: rgba(0,0,0,.22); }
.rk-aff-row b { color: var(--good); font-variant-numeric: tabular-nums; }
.rk-loose-acts { display: flex; flex-direction: column; gap: 4px; margin: 6px 0 10px; align-items: flex-start; }
/* Fusion panel */
.fusion-card .fusion-list { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.fusion-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: space-between;
  padding: 6px 8px; border-radius: 8px; background: rgba(0,0,0,.2); border: 1px solid var(--slate-3); }
.fusion-what { font-size: 12px; display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.fusion-arrow { font-size: 11px; color: var(--ink-dim); display: inline-flex; align-items: center; gap: 4px; }

/* Invia Flotta (inter-island logistics) */
/* Mission detail lines (cargo carried / garrison composition + condition). */
.mi-cargo, .mi-fleet { margin-top: 6px; font-size: 12px; color: var(--ink-dim); display: flex; align-items: center; flex-wrap: wrap; gap: 4px 8px; }
.mi-cargo .cost, .mi-fleet .cost { color: var(--ink); }
.mi-lbl { font-family: var(--font-display); font-size: 10px; letter-spacing: .07em; text-transform: uppercase; color: var(--patina); }
.mi-note { color: var(--patina); }
.mi-cond { margin-top: 6px; }
.mi-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); }
.mi-chip.good { color: var(--good); border-color: rgba(122,176,110,.4); background: rgba(122,176,110,.1); }
.mi-chip.rust { color: var(--rust); border-color: rgba(196,84,64,.4); background: rgba(196,84,64,.1); }

/* Card della logistica/attacco in coerenza con le "macro card" dell'Isola (.accordion.has-banner):
   cornice d'ottone sottile + cimosa brass in alto, così i passi si leggono come piastre
   incorniciate invece che strisce piatte. Scoped a .logi-form e .attack-form. */
.logi-form .card, .attack-form .card {
  position: relative;
  border: 1px solid rgba(195,156,95,.5); border-radius: 12px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 6px 16px rgba(0,0,0,.4), 0 0 0 1px rgba(0,0,0,.55);
  padding: 12px 12px; overflow: hidden;
}
.logi-form .card::before, .attack-form .card::before {   /* cimosa d'ottone in alto, come .accordion::before */
  content: ""; position: absolute; left: 12px; right: 12px; top: 0; height: 2px;
  background: linear-gradient(90deg, transparent, var(--brass) 20%, var(--brass-l) 50%, var(--brass) 80%, transparent);
  opacity: .55;
}

/* Destinazione stile Mondo: data-table con avatar, colonne allineate, riga selezionabile. */
.ldest-wrap { max-height: 264px; overflow-y: auto; }
.ldest-table { table-layout: fixed; }
.ldest-table td { padding: 6px 8px; }
.ldest-table .dt-coord { width: 66px; color: var(--ink-dim); }
.ldest-table .dt-act { width: 34px; text-align: right; }
.ldest-table .dt-id { display: flex; align-items: center; gap: 6px; max-width: 100%; overflow: hidden; }
.ldest-table .dt-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ldest-row { cursor: pointer; }
.ldest-row.on td { background: linear-gradient(180deg, rgba(120,84,26,.30), rgba(0,0,0,.16)); }
.ldest-row.on td:first-child { box-shadow: inset 3px 0 0 var(--brass); }
.ldest-row.on .dt-name { color: var(--amber-l); }
.ldest-table .lr-star { cursor: pointer; font-size: 14px; line-height: 1; color: var(--slate-3); }
.ldest-table .lr-star.on { color: var(--amber-l); }

.logi-list { display: flex; flex-direction: column; gap: 4px; }
/* Compressed, fixed-height picker with its own scroll — same pattern as the notifications list.
   Keeps the guild-mate roster from pushing the rest of the form far down the page. */
.logi-scroll { max-height: 172px; overflow-y: auto; padding-right: 4px; }
.logi-scroll::-webkit-scrollbar { width: 6px; }
.logi-scroll::-webkit-scrollbar-thumb { background: var(--brass-d); border-radius: 4px; }
/* Barra d'azione FISSA che EMERGE DA SOTTO IL FOOTER: come il banner GodMode è
   position:fixed appena sopra la navbar, z-index sotto di essa (29 < 30) così scivola
   su da dietro il dock. Edge-to-edge, spigoli dritti, fondo bruno/oro + linea ambra in alto. */
.logi-checkout {
  position: fixed; left: 0; right: 0; z-index: 29;
  /* Il fondo MARRONE continua giù di 14px SOTTO il footer (che ha z-index maggiore → lo copre):
     il drawer sembra un'estensione del footer. Il contenuto resta sopra grazie al padding-bottom. */
  bottom: calc(var(--nav-h) + var(--safe-b) - 14px);
  padding: 8px clamp(12px, 4vw, 20px) 24px;
  border-radius: 0;       /* linea dritta, niente angoli arrotondati sui lati */
  background: linear-gradient(180deg, #2a1f10, #180f06);
  border: none; border-top: 1px solid var(--amber);
  color: var(--ink);
  box-shadow: 0 -6px 20px rgba(0,0,0,.55);
  animation: lcUp .3s cubic-bezier(.2,.9,.3,1);
  transform-origin: bottom center; overflow: hidden;
}
/* Uscita: la barra si ritira scivolando GIÙ dietro il footer (da dove è uscita). */
.logi-checkout.lc-closing { animation: lcDown .24s cubic-bezier(.4,0,.7,.4) forwards; pointer-events: none; }
/* Il Mondo Rosso ridisegna l'intera scheda a ogni tocco (vedi _drawerMounted in app.js): dalla
   seconda volta in poi il nodo è di nuovo NUOVO ma non deve sembrarlo — niente scivolo. */
.logi-checkout.lc-noanim { animation: none; }
/* IL VASSOIO DEL MONDO ROSSO: stessa meccanica (si alza SOLO a mano), fondo ROSSO invece che
   marrone — qui si combatte, non si spedisce merce. Stessi rossi della schermata (--rust,
   .rz-avviso), non un colore nuovo inventato per l'occasione. */
.logi-checkout.rosso-checkout { background: linear-gradient(180deg, #3a1710, #1c0a06); border-top-color: var(--rust); }
.logi-checkout.rosso-checkout.lc-ready.lc-peek .lc-peeklbl { color: var(--rust-l); }
/* NIENTE FOOTER SOTTO QUESTA SCHEDA: `#rosso-overlay` copre tutto lo schermo, la navbar non
   c'è. Il `bottom` di base riserva lo spazio della navbar (`--nav-h`) che qui non esiste — la
   barra restava sospesa con un vuoto sotto. Qui scende fino al bordo, rispettando solo la
   safe-area (tacca/home-indicator). */
.logi-checkout.rosso-checkout, .logi-checkout.rosso-checkout.lc-peek { bottom: var(--safe-b); }
@keyframes lcUp { from { transform: translateY(100%); } to { transform: translateY(0); } }
@keyframes lcDown { from { transform: translateY(0); } to { transform: translateY(100%); } }
/* SEMPRE scoped alla vista VISIBILE (`.view:not(.hidden)`): il vassoio vive dentro
   #view-azioni, e cambiando tab quella sezione viene solo NASCOSTA, non svuotata. Senza
   questo vincolo `:has()` continuava a trovarlo e riservava 320px di spazio in fondo a
   OGNI altra tab — il buco fra il contenuto e il footer (segnalato 28/07 sull'Albero del
   Progresso, in fondo alla tab Isola). */
/* La barra è fissa e sovrapposta: quando è presente riservo spazio extra in fondo allo
   scroll così l'ultima riga di contenuto non finisce dietro la barretta ripiegata. */
#views:has(.view:not(.hidden) .logi-checkout) { padding-bottom: calc(var(--nav-h) + var(--safe-b) + 74px); }
/* Vassoio APERTO (riepilogo esteso): è alto ~300px e altrimenti coprirebbe l'ultima riga del
   compositore (chip capacità destinazione: slot flotta o spazio deposito). Riservo abbastanza
   spazio così quelle chip restano scrollabili SOPRA il vassoio invece di finirci dietro. */
#views:has(.view:not(.hidden) .logi-checkout:not(.lc-peek)) { padding-bottom: calc(var(--nav-h) + var(--safe-b) + 270px); }
/* STESSA GUARDIA per il vassoio del Mondo Rosso: vive dentro `#rosso-overlay .report-body`,
   un fratello di `#views` che quella regola non tocca. Senza, l'ultima riga della scheda
   (garrison/presidio, tasto Richiama) finiva dietro la barretta ripiegata — segnalato
   07/08/2026 con screenshot. */
#rosso-overlay .report-body:has(.logi-checkout) { padding-bottom: calc(var(--safe-b) + 74px); }
#rosso-overlay .report-body:has(.logi-checkout:not(.lc-peek)) { padding-bottom: calc(var(--safe-b) + 270px); }
/* Lineetta = BOTTONE tappabile (apre/chiude la barra). Area di tocco ampia, linea d'ottone al centro. */
.lc-grip { display: block; position: relative; width: 54px; height: 18px; border: none; padding: 0;
  margin: -4px auto 6px; background: none; cursor: pointer; }
.lc-grip::before { content: ""; position: absolute; left: 50%; top: 7px; transform: translateX(-50%);
  width: 46px; height: 5px; border-radius: 999px; background: var(--brass); opacity: .85; }
.lc-grip:active::before { opacity: 1; width: 40px; }
/* Etichetta della barra ripiegata: visibile SOLO in peek. Mini-riepilogo dinamico tappabile. */
.lc-peeklbl { display: none; }
/* Apri/chiudi il riepilogo = SCIVOLAMENTO morbido, non uno scatto: il corpo collassa in
   altezza (max-height + opacità) mentre la barra riduce il padding, tutto sulla stessa curva. */
.logi-checkout { transition: padding .26s cubic-bezier(.2,.9,.3,1), bottom .26s cubic-bezier(.2,.9,.3,1); }
.lc-summary, .lc-send { overflow: hidden;
  transition: max-height .26s cubic-bezier(.2,.9,.3,1), opacity .18s ease, margin .26s cubic-bezier(.2,.9,.3,1); }
.lc-summary { max-height: 300px; }
.lc-send { max-height: 60px; }
/* "Spazio a dest." con eccedenza che rientra: informativo (ambra), NON errore rosso (.lack). */
.lc-line b.lc-info { color: var(--amber-l); }
/* Pronostico pre-attacco: striscia in testa al checkout d'assalto. Bordo UNIFORME (mai accento su un
   solo lato, [[left-accent-border-rule]]); il verdetto si legge da testo colorato + una VELATURA di
   sfondo nel colore dell'esito + un pallino colorato. Nessun glow. */
.js-atk-fc:empty { display: none; }
.atk-fc { margin: 0 0 6px; padding: 6px 8px; border-radius: 8px; border: 1px solid var(--bronze-d);
  background: rgba(0,0,0,.24); }
.atk-fc-top { display: flex; align-items: center; gap: 6px; font-size: 12px; }
.atk-fc-top .gi { width: 15px; height: 15px; flex: none; }
.atk-fc-top b { font-weight: 700; }
/* pallino di stato: piccolo tondo nel colore del verdetto, davanti al testo */
.atk-fc-top b::before { content: ""; display: inline-block; width: 7px; height: 7px; margin-right: 6px;
  border-radius: 50%; background: currentColor; vertical-align: middle; }
/* Timbro UPSET: acceso solo quando stai attaccando in inferiorità di potenza, cioè quando
   una vittoria varrebbe la quest. Bordo e velatura, nessun bagliore. */
.atk-fc-upset { margin-left: 8px; padding: 1px 6px; border-radius: 999px; font-size: 10px;
  font-weight: 800; letter-spacing: .06em; color: var(--amber-l); white-space: nowrap;
  border: 1px solid var(--brass); background: rgba(233,181,74,.12); }
.atk-fc-upset .gi { width: 11px; height: 11px; vertical-align: -1px; }
.atk-fc-conf { margin-left: auto; font-size: 10px; font-weight: 600; letter-spacing: .02em;
  text-transform: uppercase; color: var(--ink-dim); }
/* Età intel: mai maiuscola (niente "3G FA" che sembra la rete 3G); ambra se vecchia (rispia). */
.atk-fc-age { text-transform: none; margin-left: 4px; letter-spacing: 0; }
.atk-fc-age.stale { color: var(--amber-l); }
/* Barretta di confronto forze: tu (verde) su fondo nemico (rosso). Nessun glow. */
.atk-fc-bar { height: 5px; border-radius: 4px; margin: 4px 0 2px; overflow: hidden;
  background: color-mix(in srgb, var(--rust) 52%, rgba(0,0,0,.4)); }
.atk-fc-bar-you { display: block; height: 100%; border-radius: 4px 0 0 4px; background: var(--good); }
.atk-fc-sub { margin-top: 2px; font-size: 10px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.atk-fc-sub b { color: var(--ink); font-weight: 700; }
/* La riga del FUOCO nel pronostico: e' il numero che decide chi resta in piedi (la potenza e'
   per meta' corazza, e la corazza non uccide nessuno). Colore = verdetto del solo fuoco. */
.atk-fc-fire { display: flex; align-items: center; gap: 4px; margin-top: 2px; font-size: 10px;
  font-variant-numeric: tabular-nums; color: var(--ink-dim); }
.atk-fc-fire b { font-weight: 700; }
.atk-fc-fire.fire-good b { color: var(--good); }
.atk-fc-fire.fire-bad { color: var(--rust); }
.atk-fc-fire.fire-bad b { color: var(--rust); }
/* L'avviso del colpo ripetuto: bordo ruggine, PRIMA delle righe del riepilogo — il decadimento
   si dice prima di premere, non si scopre nel rapporto. Velatura, mai bagliori. */
.atk-decay { display: flex; align-items: flex-start; gap: var(--sp-6); margin: var(--sp-6) 0 var(--sp-2); padding: var(--sp-4) var(--sp-8);
  font-size: 11px; color: var(--ink); border: 1px solid var(--rust);
  border-radius: var(--r-sm); background: rgba(110, 42, 29, .18); }

/* LA PASTIGLIA DEL BASTIONE (sezione Difese): il muro mezzo vuoto detto forte. Ambra come il
   regolatore — e' un invito a costruire, non un'emergenza; la barra dice quanto e' pieno con la
   stessa grammatica delle barre risorse. Velature e bordi, mai bagliori. */
.bast-pill { border-color: var(--brass-d); }
.bast-pill .card-body { display: flex; flex-direction: column; gap: var(--sp-6); }
.bast-pill .bp-testa { color: var(--amber-l); }
.bast-pill .bp-testa b { font-family: var(--font-display); letter-spacing: .4px; }
.bast-pill .bp-riga { display: block; height: 6px; border-radius: 999px; overflow: hidden;
  background: rgba(0, 0, 0, .45); border: 1px solid var(--bronze-d); }
.bast-pill .bp-riga i { display: block; height: 100%; background: linear-gradient(90deg, var(--bronze), var(--brass-l)); }
.bast-pill .bp-nota { font-size: 12px; color: var(--ink-dim); }
.atk-fc-crush { background: color-mix(in srgb, var(--good) 9%, rgba(0,0,0,.24)); border-color: color-mix(in srgb, var(--good) 30%, var(--bronze-d)); }
.atk-fc-crush .atk-fc-top b { color: var(--good); }
.atk-fc-win { background: color-mix(in srgb, var(--patina) 8%, rgba(0,0,0,.24)); border-color: color-mix(in srgb, var(--patina) 26%, var(--bronze-d)); }
.atk-fc-win .atk-fc-top b { color: var(--patina); }
.atk-fc-even { background: color-mix(in srgb, var(--amber-l) 8%, rgba(0,0,0,.24)); border-color: color-mix(in srgb, var(--amber-l) 26%, var(--bronze-d)); }
.atk-fc-even .atk-fc-top b { color: var(--amber-l); }
.atk-fc-bad { background: color-mix(in srgb, var(--rust) 10%, rgba(0,0,0,.24)); border-color: color-mix(in srgb, var(--rust) 30%, var(--bronze-d)); }
.atk-fc-bad .atk-fc-top b { color: var(--rust); }
/* Le due righe AMBRA del pronostico (flotta nemica in volo, difesa proiettata) sono CHIOSE:
   informano, non si decide su di esse. A dimensione piena occupavano quanto il verdetto e
   spingevano il vassoio a coprire il selettore di flotta (segnalato 28/07). Restano
   leggibili, ma piccole. */
.atk-fc-away { display: flex; align-items: center; gap: 4px; margin-top: 2px; font-size: 10px;
  font-weight: 600; line-height: 1.35; color: var(--amber-l); opacity: .9; }
.atk-fc-away .gi { width: 11px; height: 11px; flex: none; }
.atk-fc-full { font-weight: 700; opacity: .92; }   /* difesa proiettata se la flotta rientra */
.atk-fc-unknown { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ink-dim); }
.atk-fc-unknown .gi { width: 14px; height: 14px; flex: none; opacity: .8; }
/* Vantaggio tattico: dice se la flotta composta e' la risposta giusta per QUEL muro. Riga in piu'
   dentro una striscia gia' densa → si avvolge su mobile invece di spingere fuori i chip. */
.atk-fc-tac { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; margin-top: 4px;
  padding-top: 4px; border-top: 1px solid color-mix(in srgb, var(--bronze-d) 60%, transparent);
  font-size: 10px; font-weight: 600; color: var(--ink-dim); }
.atk-fc-tac .gi { width: 13px; height: 13px; flex: none; opacity: .85; }
.atk-fc-tac b { font-variant-numeric: tabular-nums; font-weight: 800; color: var(--ink); }
.atk-fc-tac.tac-good b { color: var(--good); }
.atk-fc-tac.tac-bad b { color: var(--rust); }
.atk-fc-tac.tac-dim { opacity: .65; }
.tac-wall { font-style: italic; font-weight: 600; opacity: .85; }
.tac-pairs { display: flex; flex-wrap: wrap; gap: 4px; width: 100%; }
.tac-chip { font-size: 10px; font-weight: 700; padding: 1px 6px; border-radius: 999px;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.2); color: var(--ink-dim); }
.tac-chip b { font-weight: 800; }
.tac-up { border-color: color-mix(in srgb, var(--good) 40%, var(--bronze-d)); }
.tac-up b { color: var(--good); }
.tac-down { border-color: color-mix(in srgb, var(--rust) 40%, var(--bronze-d)); }
.tac-down b { color: var(--rust); }
/* Profilo della muraglia nel rapporto di spionaggio: 4 segmenti = quote di scafo per ruolo. */
.wall-bar { display: flex; height: 6px; border-radius: 4px; overflow: hidden; margin-top: 4px;
  background: rgba(0,0,0,.3); }
.wall-bar i { display: block; height: 100%; }
.wall-bar .wp-leggera { background: var(--patina); }
.wall-bar .wp-media { background: var(--amber-l); }
.wall-bar .wp-schermo { background: color-mix(in srgb, var(--ink-dim) 70%, transparent); }
.wall-bar .wp-pesante { background: var(--rust); }
/* Legenda scritta della muraglia: la barra da sola si legge solo col tooltip, che su telefono
   non esiste. Stessi colori dei segmenti, così il pallino lega la parola alla fetta. */
.wall-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 4px;
  font-size: 11px; color: var(--ink-dim); }
.wall-legend .wp-leg { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.wall-legend .wp-dot { width: 7px; height: 7px; border-radius: 2px; flex: none; }
.wall-legend .wp-leggera { background: var(--patina); }
.wall-legend .wp-media { background: var(--amber-l); }
.wall-legend .wp-schermo { background: color-mix(in srgb, var(--ink-dim) 70%, transparent); }
.wall-legend .wp-pesante { background: var(--rust); }
/* «Chi ha colpito cosa»: le coppie che hanno deciso lo scontro, sotto la tabellina dei round. */
.rep-pairs { margin-top: 10px; }
.pm-row { display: flex; align-items: center; gap: 8px; padding: 2px 10px; font-size: 11px;
  color: var(--ink-dim); border-top: 1px solid color-mix(in srgb, var(--bronze-d) 45%, transparent); }
.pm-row .pm-p { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-row .pm-m { font-weight: 800; font-variant-numeric: tabular-nums; }
.pm-row .pm-q { width: 42px; text-align: right; font-variant-numeric: tabular-nums; opacity: .75; }
.pm-up .pm-m { color: var(--good); }
.pm-down .pm-m { color: var(--rust); }
/* Barra CHIUSA (peek): compatta — solo la lineetta + l'etichetta, senza padding alto.
   Da chiusa il fondo marrone resta TUCCATO dietro la nav (nessun gap in cui trapeli il contenuto
   viola dei rapporti-evento): il drawer scende fin sotto il footer, mentre il contenuto (lineetta +
   etichetta) è sollevato dal padding-bottom così l'etichetta tappabile resta SOPRA la nav (tap-safe). */
.logi-checkout.lc-peek { bottom: calc(var(--nav-h) + var(--safe-b) - 14px); padding-top: 4px; padding-bottom: 20px; }
.logi-checkout.lc-peek .lc-grip { height: 12px; margin: 0 auto 1px; }
.logi-checkout.lc-peek .lc-grip::before { top: 4px; }
.logi-checkout.lc-peek .lc-peeklbl { padding: 0 4px 1px; }
.logi-checkout.lc-peek .lc-summary, .logi-checkout.lc-peek .lc-send {
  max-height: 0; min-height: 0; opacity: 0; margin-top: 0; margin-bottom: 0; pointer-events: none; }
/* Il tasto Invia è inline-flex: da chiuso riservava un intero line-box (~17px) anche a max-height:0.
   Block-level in peek → nessun line-box, collassa davvero a 0 e la barra chiusa resta bassa. */
.logi-checkout.lc-peek .lc-send { display: block; border-width: 0; }
.logi-checkout.lc-peek .lc-peeklbl { display: block;
  font-weight: 700; font-size: 12px; letter-spacing: .02em; text-align: center;
  color: var(--brass-l); cursor: pointer; padding: 1px 4px 2px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Suffisso dell'etichetta iniettato via variabile tradotta (vedi _lcSuffixVars in app.js):
   chiuso = "· tocca per aprire"; ORDINE COMPLETO (.lc-ready) = "· pronto · invia" in ambra,
   così si capisce che si può spedire anche col vassoio ripiegato. Niente glow (regola no-glow). */
.logi-checkout.lc-peek .lc-peeklbl::after { content: var(--lc-open-suffix, ""); opacity: .78; font-weight: 600; }
.logi-checkout.lc-ready.lc-peek .lc-peeklbl { color: var(--amber-l); font-weight: 800; }
.logi-checkout.lc-ready.lc-peek .lc-peeklbl::after { content: var(--lc-ready-suffix, ""); opacity: 1; }
.lc-summary { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; }
.lc-line { display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: 12px; }
.lc-line > span { color: #b79a68; display: inline-flex; align-items: center; gap: 4px; }
.lc-line > span .ricon { width: 13px; height: 13px; margin: 0; }
.lc-line > b { color: var(--ink); font-weight: 700; font-variant-numeric: tabular-nums; text-align: right; min-width: 0; }
.lc-line .js-logi-fuel, .lc-line .js-atk-fuel, .lc-line .js-spy-fuel, .lc-line .js-exp-fuel { color: var(--amber-l); }
.lc-line b.lack { color: var(--rust); }
/* Avviso "il carico non entra tutto e torna indietro": la riga si tinge d'ambra (velatura piena,
   niente accento su un solo lato né glow) così l'utente lo nota PRIMA di spedire. */
.lc-line.lc-warn { background: rgba(214,158,74,.12); border: 1px solid rgba(214,158,74,.34);
  border-radius: 8px; padding: 4px 8px; margin: 1px -2px; }
.lc-line.lc-warn > span { color: var(--amber-l); }
.lc-send { width: 100%; }
.logi-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; text-align: left;
  padding: 8px 10px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); cursor: pointer;
  font: inherit; color: var(--ink); overflow: hidden;
  /* Non comprimere le righe: la lista è un flex-column con max-height → senza questo, con molte
     righe (gilda numerosa) il flexbox le schiaccia invece di far scorrere. */
  flex: none; }
.logi-row.on { border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.18), rgba(0,0,0,.25)); }
/* Name truncates (no horizontal shift); coords + star sit in a fixed right cluster. */
.logi-row .lr-name { display: flex; align-items: center; gap: 6px; min-width: 0; flex: 1; font-weight: 700; font-size: 13px; }
.logi-row .lr-name .lr-txt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.logi-row .lr-right { display: flex; align-items: center; gap: 8px; flex: none; }
.logi-row .lr-meta { font-size: 11px; white-space: nowrap; }
.logi-row .lr-star { font-size: 14px; line-height: 1; color: var(--slate-3); }
.logi-row .lr-star.on { color: var(--amber-l); }
.logi-scroll { overflow-x: hidden; }
/* Destination header: title left, 3 minimal icon-only filter toggles top-right. */
.logi-dhead { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.logi-filts { display: flex; gap: 4px; flex: none; }
.logi-filt {
  width: 30px; height: 28px; display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
  border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22); color: var(--ink-dim); font-size: 14px;
}
.logi-filt .gi { width: 15px; height: 15px; }
.logi-filt.on { color: var(--amber-l); border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.28), rgba(0,0,0,.22)); }
.logi-filt.on .gi { filter: none; }
/* La stella "Preferiti" è SEMPRE dorata (non grigia): la ★ si legge subito come preferito. */
.logi-filt[data-f="preferiti"] { color: #f2c14e; }
/* Azione: segmented control a 3 colonne uguali — sempre una riga, mai a capo su mobile. */
.logi-acts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.logi-act {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  padding: 8px 4px; min-width: 0; cursor: pointer; border-radius: 8px;
  background: rgba(0,0,0,.22); border: 1px solid var(--bronze-d); color: var(--ink-dim);
  font-family: inherit; font-size: 12px; font-weight: 600; line-height: 1;
}
.logi-act .la-ico { font-size: 16px; line-height: 1; }
.logi-act .la-lbl { white-space: nowrap; }
.logi-act.on { color: var(--amber-l); border-color: var(--brass);
  background: linear-gradient(180deg, rgba(120,84,26,.28), rgba(0,0,0,.25));
  box-shadow: inset 0 1px 0 rgba(255,235,190,.25); }
.logi-act:not(.on):active { background: rgba(255,255,255,.05); }

/* Risorse: icona a inizio riga; label prende lo spazio → input + Max allineati a destra. */
.logi-res { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 4px 0; }
.logi-res .lrs-id { display: flex; align-items: center; gap: 8px; min-width: 0; flex: 1; }
.logi-res .lrs-id .ricon { width: 20px; height: 20px; margin: 0; flex: none; }
.logi-res input { width: 92px; min-height: 34px; text-align: right; background: var(--sky-0); color: var(--ink);
  border: 1px solid #0b0f13; border-radius: 8px; padding: 0 8px; font: inherit; font-size: 14px;
  font-variant-numeric: tabular-nums; box-shadow: inset 0 2px 4px rgba(0,0,0,.5); }
/* Max delle risorse IDENTICO a quello della Flotta: stessa larghezza/padding compatti. */
.logi-res .ps-max { flex: none; min-width: 27px; padding: 0 6px; min-height: 34px; }
.logi-switcher { margin-bottom: 12px; }
/* Riepilogo potenza/slot della flotta scelta (Difesa/Navi), sotto la lista navi. */
.logi-fstats { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; padding-top: 10px;
  border-top: 1px solid rgba(233,181,74,.14); }
.logi-fstats .chip { font-size: 11px; }
.logi-fstats:empty { display: none; }   /* niente bordo/spazio quando non c'è ancora nessuna nave */
/* Flotta: righe .picker-ship come la pagina Attacco (art + nome/meta + stepper con Max). */
.logi-form .picker-ship, .attack-form .picker-ship, .rz-navi .picker-ship { border-bottom: none; margin: 0; padding: 8px 0; position: relative; }
/* Info nave (att/dif/vel/stiva) come nell'Isola: può andare a capo così non viene troncata
   dallo stepper — niente ellissi che nasconde le statistiche. */
.logi-form .picker-ship .meta, .attack-form .picker-ship .meta { white-space: normal; overflow: visible; text-overflow: clip;
  font-size: 10px; line-height: 1.3; }
/* Statistiche nave — griglia 2×2 SOLO SU MOBILE. Su schermi stretti le 4 stat andavano a capo
   in modo imprevedibile (1 o 2 righe → card di altezze diverse); qui le fissiamo a 2×2 compatte:
   attacco|difesa su riga 1, velocità|stiva su riga 2. Colonne a larghezza-contenuto e VICINE
   (column-gap piccolo), impacchettate a sinistra: le coppie si leggono unite, non allargate a
   tutta la card. Su TABLET/DESKTOP la regola non si applica: le 4 stat restano nel flusso inline
   originale (una riga, vicine) — su schermi larghi il grid 2-colonne le allontanava troppo.
   Mobile-first; interfaccia desktop dedicata più avanti. Vale ovunque ci sia questo layout
   (Unità→Invia, Attacco, Spedizioni, mobilitazione Guerra). Esclusi: Smantella (.sr-refund) e la
   riga TESTUALE di adesione alle spedizioni di gilda (.meta senza chip .stat). */
@media (max-width: 640px) {
  .picker-ship .meta.meta-stats { display: grid; grid-template-columns: max-content max-content;
    justify-content: start; column-gap: 16px; row-gap: 2px; align-items: center; }
  /* Badge non-statistica (es. integrità "in riparazione") su riga propria, a piena larghezza. */
  .picker-ship .meta.meta-stats > :not(.stat) { grid-column: 1 / -1; }
}
.logi-res { position: relative; }
/* Separatore elegante fra le righe (flotta/risorse): hairline che SFUMA ai bordi, non tratteggiata. */
/* Selettore del Mondo Rosso: arte piu' GRANDE (l'unica riga informativa e' la foto — la si
   guarda per riconoscere lo scafo) e la salute sta SULLA foto (barra .bf-hp dentro la cornice),
   non in un badge di testo: stessa resa delle tessere della Panoramica. */
.rz-navi .art-tile.art-sm { --art: 58px; border-radius: 8px; }
.rz-navi .art-tile.art-sm .art-fallback { font-size: 22px; }
/* `.rz-navi` e' il contenitore delle righe navi del Mondo Rosso, e serve proprio perche' li'
   sotto le navi arrivano Pronostico e i verbi: senza involucro `:not(:last-of-type)` avrebbe
   tirato una riga anche SOTTO l'ultima nave, cioe' un separatore fra la flotta e il pronostico
   che non separa niente. Con l'involucro le righe sono le uniche sorelle e la regola torna a
   dire quello che dice altrove: fra una nave e l'altra. */
.logi-form .picker-ship:not(:last-of-type)::after,
.attack-form .picker-ship:not(:last-of-type)::after,
.rz-navi .picker-ship:not(:last-of-type)::after,
.logi-res:not(:last-child)::after {
  content: ""; position: absolute; left: 2px; right: 2px; bottom: 0; height: 1px; pointer-events: none;
  background: linear-gradient(90deg, transparent, rgba(233,181,74,.16) 18%, rgba(233,181,74,.16) 82%, transparent);
}
/* Niente frecce native (spinner) sui number input: restano editabili da tastiera, ma il "secondo
   selettore" del browser sparisce visto che abbiamo già i tasti − / + / Max. */
.stepper input[type=number]::-webkit-inner-spin-button,
.stepper input[type=number]::-webkit-outer-spin-button,
.logi-res input[type=number]::-webkit-inner-spin-button,
.logi-res input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.stepper input[type=number], .logi-res input[type=number] { -moz-appearance: textfield; appearance: textfield; }
/* Popup scelta isola: righe selezionabili con coordinate BEN visibili; card in stile Mondo. */
.pick-list { display: flex; flex-direction: column; gap: 8px; }
.pick-list .pick-opt { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left;
  padding: 10px 12px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22);
  color: var(--ink); font: inherit; font-size: 14px; font-weight: 600; cursor: pointer; }
.pick-list .pick-opt:hover, .pick-list .pick-opt:active { border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.20), rgba(0,0,0,.2)); }
.pick-list .pick-opt .gi { flex: none; }
.pick-list .pick-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pick-list .pick-coord { margin-left: auto; color: var(--brass-l); font-weight: 700; font-variant-numeric: tabular-nums; }
.confirm-box.pick-mode { border: 1px solid var(--slate-3); border-left: 1px solid var(--slate-3); border-radius: 12px; }
.logi-itembox { max-height: 220px; overflow-y: auto; display: flex; flex-direction: column; gap: 4px; padding: 4px;
  border: 1px solid var(--bronze-d); border-radius: 8px; background: rgba(0,0,0,.25); }
.logi-item { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; text-align: left;
  padding: 6px 8px; border-radius: 8px; border: 1px solid transparent; background: rgba(0,0,0,.2); cursor: pointer;
  font: inherit; font-size: 12px; color: var(--ink); }
.logi-item.on { border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.22), rgba(0,0,0,.28)); }
.logi-item .li-buff { font-weight: 600; font-variant-numeric: tabular-nums; }
.chip.over { color: #fff; background: var(--rust); border-color: var(--rust); }

/* Mercato delle Nubi (resource barter) */
.mkt-form { display: flex; flex-direction: column; gap: 10px; }
.mkt-leg { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.mkt-lbl { flex: 0 0 88px; font-size: 12px; color: var(--patina); text-transform: uppercase; letter-spacing: .3px; }
.mkt-num { flex: 1 1 90px; min-width: 0; }
.mkt-sel { flex: 0 0 auto; }
.mkt-arrow { text-align: center; color: var(--brass-l); font-size: 16px; line-height: 1; }
.mkt-xchg { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.mkt-side { display: flex; flex-direction: column; gap: 2px; align-items: flex-start; }
.mkt-side .subtle { font-size: 10px; text-transform: uppercase; letter-spacing: .3px; }
.mkt-op { color: var(--brass-l); font-size: 16px; }
.mkt-order .card-head { align-items: center; }
/* --- Book card: stessa struttura delle card bersaglio (.card.tgt) + tinta per rarità --- */
/* Bordo allineato alle card bersaglio (attacco/spionaggio): brass uniforme su tutti i lati,
   niente accento bronzo a sinistra, stesso raggio. */
/* Card annuncio: superficie PULITA elevata (showroom), niente più marrone. Bordo freddo sottile,
   raggio morbido, ombra leggera. */
.mkt-book { border: 1px solid rgba(150,175,200,.16); border-radius: 12px; padding: 0; overflow: hidden;
  background: linear-gradient(180deg, #1b232e, #151b24);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.04), 0 3px 10px rgba(0,0,0,.32); }
/* Header: separa il venditore dalla merce con un velo chiaro e una hairline d'ottone tenue.
   Resta cosi' sulle card di STATO («La tua inserzione», «In arrivo da»), dove l'intestazione E'
   l'informazione. Sulle card che si COMPRANO il venditore scende in fondo — vedi .mkt-seller. */
.mkt-book .mkt-head { margin: 0; padding: var(--sp-6) var(--sp-12);
  background: linear-gradient(180deg, rgba(255,255,255,.055), rgba(255,255,255,.012));
  border-bottom: 1px solid rgba(198,164,96,.22); box-shadow: none; }
/* Corpo annuncio: e' LUI la card. Piu' aria, fondo pulito, e la merce grande abbastanza da
   leggersi scorrendo. Prima era la parte piu' scura e piu' compressa delle due. */
.mkt-book .mkt-trade { padding: var(--sp-12); margin: 0; background: transparent;
  display: block; }
.mkt-book .mkt-trade .tgt-meta { font-size: var(--fs-lg); }
.mkt-book .mkt-trade .mkt-item { font-size: var(--fs-lg); }
/* I due tempi dell'offerta, sotto la merce: quanto resta per comprarla e quanto ci mette ad
   arrivare. Sommessi — sono un vincolo, non il prodotto. */
.mkt-when { margin-top: var(--sp-8); font-size: var(--fs-sm); color: var(--ink-dim);
  font-variant-numeric: tabular-nums; display: flex; align-items: center; gap: var(--sp-6); }
.mkt-when .gi { width: 13px; height: 13px; }
/* IL VENDITORE: una riga sola, in fondo, sommessa. Rientrata (fondo piu' scuro del corpo) invece
   che in rilievo, cosi' l'occhio ci arriva DOPO la merce — che e' l'ordine in cui si compra. */
.mkt-book .mkt-seller { border-bottom: 0; border-top: 1px solid rgba(198,164,96,.16);
  background: rgba(0,0,0,.22); padding: var(--sp-6) var(--sp-12); }
.mkt-book .mkt-seller .av-slot { width: 22px; height: 22px; font-size: var(--fs-sm); }
.mkt-book .mkt-seller .tgt-id b { font-size: var(--fs-base); font-weight: 600; color: var(--ink-dim); }
.mkt-book .mkt-seller .mkt-name-clk:hover { color: var(--amber-l); }
.mkt-book .mkt-seller .tgt-guild { font-size: var(--fs-sm); }
.mkt-book .mkt-seller .tgt-guild .crestbadge { width: 20px; height: 20px; }
.mkt-book .mkt-seller .tgt-gtag { font-size: var(--fs-sm); }
/* Le card di stato tengono il ritratto grande di prima. */
.mkt-book .mkt-head:not(.mkt-seller) .av-slot { width: 34px; height: 34px; font-size: 16px; }
.mkt-book .mkt-head:not(.mkt-seller) .tgt-guild { font-size: var(--fs-base); }
.mkt-book .mkt-head:not(.mkt-seller) .tgt-guild .crestbadge { width: 30px; height: 30px; }
.mkt-book .mkt-head:not(.mkt-seller) .tgt-gtag { font-size: var(--fs-base); }
.mkt-name-clk { cursor: pointer; }
.mkt-name-clk:hover { color: var(--amber-l); text-decoration: underline; }
/* Card selezionabile per il checkout: click = tutto l'annuncio si accende (bordo ambra + alone +
   velo dorato sull'intera card). Niente spunta flottante che si taglia ai bordi. */
.mkt-pick { cursor: pointer; position: relative; transition: box-shadow .14s ease, border-color .14s ease, transform .14s ease; }
.mkt-pick:hover { border-color: rgba(198,164,96,.55); }
.mkt-pick.mkt-sel { border-color: var(--amber-l) !important;
  box-shadow: 0 0 0 2px var(--amber-l), 0 6px 18px rgba(0,0,0,.42); }
/* Velo dorato che colora TUTTA la card selezionata (header + corpo), sotto il contenuto. */
.mkt-pick.mkt-sel::before { content: ""; position: absolute; inset: 0; z-index: 0; border-radius: inherit;
  background: linear-gradient(180deg, rgba(240,200,120,.16), rgba(240,200,120,.05)); pointer-events: none; }
.mkt-pick.mkt-sel .tgt-top, .mkt-pick.mkt-sel .tgt-bottom { position: relative; z-index: 1; }
/* Il carrello del Mercato: a riposo una striscia, aperto una scheda che sale dal basso.
   Stava a z-index 29, cioe' SOTTO la barra di navigazione (30): da aperto ci finiva dietro, e
   insieme all'altezza libera era meta' del motivo per cui sembrava mangiarsi la pagina.
   Ora sta sulla quota dichiarata per le strisce d'azione (--z-drawer, sopra la nav). */
.mkt-drawer { position: fixed; left: 0; right: 0; z-index: var(--z-drawer);
  bottom: calc(var(--nav-h) + var(--safe-b) - 14px);
  padding: var(--sp-12) clamp(14px, 4vw, 22px) 27px;
  background: linear-gradient(180deg, #1c2530, #121821); border-top: 1px solid var(--amber);
  color: var(--ink); box-shadow: 0 -6px 20px rgba(0,0,0,.55);
  animation: lcUp .3s cubic-bezier(.2,.9,.3,1); overflow: hidden;
  transition: padding .26s cubic-bezier(.2,.9,.3,1); }
/* Fondale: dice che sotto c'e' la pagina, e la riporta con un tocco fuori. Velo scuro, mai chiaro. */
@keyframes mktBackIn { from { opacity: 0; } to { opacity: 1; } }
.mkt-back { position: fixed; inset: 0; z-index: calc(var(--z-drawer) - 1);
  background: rgba(6,9,13,.55); animation: mktBackIn .18s ease; }
#views:has(.view:not(.hidden) .mkt-drawer) { padding-bottom: calc(var(--nav-h) + var(--safe-b) + 84px); }
/* TETTO D'ALTEZZA. Prima il corpo poteva arrivare a 60vh e con maniglia, titolo, totale e tasti
   la scheda superava i tre quarti dello schermo: da un telefono non si vedeva piu' cosa si stava
   comprando. Ora la scheda non passa MAI meta' schermo, e a crescere e' l'elenco, che scorre. */
.mkt-drawer .md-body { overflow: hidden; transition: max-height .26s cubic-bezier(.2,.9,.3,1), opacity .18s ease;
  max-height: min(46vh, 380px); }
.mkt-drawer.md-peek { padding-top: 4px; padding-bottom: 20px; }
.mkt-drawer.md-peek .md-body { max-height: 0; opacity: 0; margin: 0; }
.mkt-drawer.md-peek .md-peeklbl { display: flex; }
.md-peeklbl { display: none; align-items: center; gap: 6px; justify-content: center; cursor: pointer;
  font-size: 12px; color: var(--ink); flex-wrap: wrap; }
.md-peeklbl .gi { width: 16px; height: 16px; }
.md-peeklbl .md-sep { color: var(--ink-dim); }
.md-title { font-family: "Cinzel", serif; font-size: 14px; color: var(--brass-l); margin-bottom: 8px; display: flex; align-items: center; gap: 6px; }
.md-title .gi { width: 17px; height: 17px; }
.md-rows { max-height: min(26vh, 220px); overflow-y: auto; display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.mkt-cart-row { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px;
  background: rgba(0,0,0,.28); border: 1px solid var(--slate-3); }
.mkt-cart-what { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 12px; }
.mkt-cart-what .mkt-op { color: var(--ink-dim); }
/* .mkt-cart-x: forma dal canone del tasto a solo glifo. */
.md-total { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 8px 2px; border-top: 1px solid rgba(240,209,138,.18); }
.md-total-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--ink-dim); }
.md-actions { display: flex; gap: 8px; margin-top: 8px; }
.md-actions .md-buy { flex: 1; }
/* Riepilogo d'ordine (l'ultimo cancello prima di pagare): stesse righe del carrello, ma qui la
   ✕ non e' un ripensamento estetico — e' l'unico modo di correggere un ordine sbagliato prima
   che diventi denaro. Quindi bersaglio pieno da 30px e reazione rossa evidente. */
.mkc-rows { display: flex; flex-direction: column; gap: 6px; max-height: 46vh; overflow-y: auto; padding-right: 2px; }
.mkc-row { display: flex; align-items: center; gap: 8px; padding: 8px 8px; border-radius: 8px;
  background: rgba(0,0,0,.28); border: 1px solid var(--slate-3); }
.mkc-what { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 12px; }
.mkc-what .mkt-op { color: var(--ink-dim); }
.mkc-who { flex-basis: 100%; font-size: 10px; margin-top: 1px; }
/* .mkc-x: forma dal canone. Il bersaglio resta pieno (--btn-h) perche' qui la ✕ non e' un
   ripensamento estetico: e' l'unico modo di correggere un ordine sbagliato prima che diventi
   denaro. Cambia la scatola, non la facilita' di premerla. */
.mkc-tot { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 8px; padding-top: 8px;
  border-top: 1px solid rgba(240,209,138,.18); }
.mkc-tot-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; color: var(--ink-dim); }
/* Annuncio sparito fra la scelta e la conferma: velatura ambra, mai un alone. Va letto, non subito. */
.mkc-gone { font-size: 11px; line-height: 1.45; color: var(--brass-l); margin-bottom: 8px;
  padding: 6px 8px; border-radius: 8px; border: 1px solid rgba(240,209,138,.28); background: rgba(240,209,138,.07); }
.mkc-gone .gi { width: 12px; height: 12px; vertical-align: -2px; margin-right: 2px; }
.mkc-short { font-size: 11px; color: #e7627a; margin-top: 4px; }
/* Tab Annunci/Vendi: pulite, tab attiva con velo chiaro + accento ambra sottolineato (niente
   più tinta marrone). */
.mkt-tabs { border-color: rgba(150,175,200,.24); background: rgba(0,0,0,.18); }
.mkt-tabs button { display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  min-height: 38px; font-size: 12px; font-weight: 600; letter-spacing: .2px; }
.mkt-tabs button .gi { width: 16px; height: 16px; }
.mkt-tabs button.on { background: linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.02));
  color: var(--amber-l); box-shadow: inset 0 -2px 0 var(--amber); }
/* Filtri "cosa offre": 4 toggle a icona (legname/vapore/ottone/anelli). Off = spento, on = brass. */
.mkt-ftoggles { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.mkt-ft { flex: none; width: 40px; height: 36px; display: inline-flex; align-items: center; justify-content: center;
  border-radius: 8px; border: 1px solid var(--slate-3); background: rgba(0,0,0,.22); cursor: pointer;
  color: var(--brass-l); opacity: .55; filter: grayscale(.3); transition: all .15s ease; }
.mkt-ft:hover { opacity: .85; border-color: var(--brass-d); }
.mkt-ft.on { opacity: 1; filter: none; border-color: var(--brass); background: rgba(198,148,74,.16);
  box-shadow: inset 0 0 0 1px var(--brass); }
.mkt-ft .ricon { width: 20px; height: 20px; }
.mkt-ft .gi { width: 20px; height: 20px; }
.mkt-ftoggles .btn { margin-left: auto; }
.mkt-book .av-slot { cursor: pointer; }
/* NON wrappare la riga: il meta (offre→prezzo) cresce e il tasto Compra resta a destra.
   Il wrap su due righe dell'offerta-oggetto avviene DENTRO il meta (.mkt-xchg-inline). */
.mkt-trade { flex-wrap: nowrap; }
.mkt-trade .tgt-meta { min-width: 0; }
/* Il tasto Compra/Ritira era troppo alto e pesante (min-height bronze 38px): qui è snello. */
.mkt-trade > .btn { flex: none; align-self: center; min-height: var(--btn-h-xs); padding: 0 12px; font-size: 12px; font-weight: 600; }
.mkt-xchg-inline { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.mkt-side-lbl { font-size: 10px; text-transform: uppercase; letter-spacing: .4px; color: var(--ink-dim); }
.mkt-price-line { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Offerta OGGETTO: la parte "→ prezzo" va su una seconda riga (l'oggetto è verboso). */
.mkt-two-rows .mkt-price-line { flex-basis: 100%; margin-top: 2px; }
/* Le mie inserzioni: timer (o "venduto") in alto a destra, al posto del tag gilda. */
.mkt-mine-tr { margin-left: auto; flex: none; font-size: 11px; font-weight: 700; color: var(--amber-l); white-space: nowrap; font-variant-numeric: tabular-nums; display: inline-flex; align-items: center; gap: 4px; }
/* Tinta bordo per rarità del castone in vendita (riusa i colori dell'inventario) */
.mkt-book.rar-raro        { border-color: #6fc0aa; box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.mkt-book.rar-epico       { border-color: #a98fe0; box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.mkt-book.rar-leggendario { border-color: var(--amber-l); box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
.mkt-book.rar-mitico      { border-color: #e7627a; box-shadow: inset 0 1px 0 rgba(255,255,255,.04); }
/* La rarità sulla card mercato è SOLO bordo + oggetto: il testo della card (venditore, timer,
   prezzo) resta neutro — si colorano solo nome oggetto e bonus (es. "+2% stiva"). */
.mkt-book.rar-comune, .mkt-book.rar-raro, .mkt-book.rar-epico, .mkt-book.rar-leggendario, .mkt-book.rar-mitico { color: var(--ink); }
.mkt-book.rar-comune      .mkt-item > b { color: var(--ink-dim); }
.mkt-book.rar-raro        .mkt-item > b { color: #6fc0aa; }
.mkt-book.rar-epico       .mkt-item > b { color: #a98fe0; }
.mkt-book.rar-leggendario .mkt-item > b { color: var(--amber-l); }
.mkt-book.rar-mitico      .mkt-item > b { color: #e7627a; }
/* Marketplace v2: item grid, price picker, filters */
.mkt-item { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Anello in vendita: icona anello + tag rarità + affissi in riga. */
.mkt-ring { gap: 6px; }
.mkt-ring-ic { display: inline-flex; align-items: center; }
.mkt-ring-ic .gi { width: 18px; height: 18px; }
.mkt-rar { flex: none; text-transform: capitalize; font-weight: 700; }
.mkt-affs { display: inline-flex; align-items: center; gap: 4px 10px; flex-wrap: wrap; }
/* Card "in arrivo": impaginazione come le card annuncio. Icona scatola brunita nell'header,
   timer di consegna a destra, corpo "ricevi → pagato". */
.mkt-inc .mkt-inc-ic { background: linear-gradient(180deg, rgba(240,209,138,.14), rgba(0,0,0,.3));
  border: 1px solid var(--brass-d); color: var(--brass-l); }
.mkt-inc .mkt-inc-ic .gi { width: 18px; height: 18px; }
.mkt-inc-timer { margin-left: auto; flex: none; font-size: 11px; font-weight: 700; color: var(--amber-l);
  white-space: nowrap; font-variant-numeric: tabular-nums; display: inline-flex; align-items: center; gap: 4px; }
/* Bottone "Storico acquisti e vendite" a piena larghezza sotto l'order book. */
.mkt-hist-open { width: 100%; justify-content: center; margin-top: 10px; }
/* Filtri storico: due righe di chip (lato + categoria). */
.mkt-hfrow { display: flex; gap: 6px; flex-wrap: wrap; }
.mkt-hf { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: 999px;
  border: 1px solid var(--slate-3); background: rgba(0,0,0,.22); color: var(--ink-dim); cursor: pointer;
  font-size: 12px; font-weight: 600; }
.mkt-hf:hover { border-color: var(--brass-d); }
.mkt-hf.on { color: var(--amber-l); border-color: var(--brass); background: rgba(198,148,74,.14); }
.mkt-hf .ricon, .mkt-hf .gi { width: 15px; height: 15px; }
/* Righe storico: compatte, icona direzione (comprato = scatola, venduto = borsa) + scambio + esito. */
/* ── STORICO: UNA RIGA PER AFFARE ────────────────────────────────────────────────────
   La riga chiusa e' alta quanto il suo contenuto e basta: icona, scambio, quando, freccia.
   NIENTE RAIL COLORATO A SINISTRA (15/08/2026): quel segno e' riservato alle action-card di
   Missioni — e' quello che lo rende riconoscibile, e usarlo anche qui lo trasformerebbe in una
   decorazione qualsiasi. A dire se hai comprato o venduto ci pensa l'ICONA in testa alla riga,
   che e' gia' diversa per i due casi (cassa in entrata, sacco in uscita) e non ha bisogno di un
   bordo che la ripeta. La cornice resta quella neutra di ogni altra card. */
.mkt-hist-row { border: 1px solid var(--slate-2); border-radius: 8px; background: rgba(0,0,0,.16);
  margin-bottom: var(--sp-4); cursor: pointer; transition: border-color .12s, background .12s; }
.mkt-hist-row:hover { border-color: var(--bronze-d); background: rgba(0,0,0,.24); }
.mkt-hist-row.on { border-color: var(--bronze-d); background: rgba(0,0,0,.26); }
/* La distinzione sta nell'icona: fredda quando la merce entra, ottone quando esce. E' una
   velatura sul disegno, non un alone e non una targa. */
.mkt-hist-row.h-buy .mkt-hist-dir { color: #6f99c0; }
.mkt-hist-row.h-sell .mkt-hist-dir { color: var(--amber-l); }
/* La testata: tutto su UNA riga, e a stringersi e' lo scambio — il tempo e la freccia hanno
   una misura fissa, cosi' le righe restano incolonnate anche con nomi di merce diversi. */
.mh-cap { display: flex; align-items: center; gap: var(--sp-8); padding: var(--sp-6) var(--sp-10); min-width: 0; }
.mh-scambio { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: var(--sp-6);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mh-scambio .mkt-op { color: var(--ink-dim); flex: none; }
/* I chip del prezzo NON vanno a capo dentro la riga chiusa. `.mkt-item` e' a capo libero
   perche' altrove (l'annuncio, il checkout) deve poter mostrare tre risorse su due file; qui
   invece un prezzo da due risorse raddoppiava l'altezza della riga e rompeva l'incolonnamento
   di tutto l'elenco. Se proprio non ci sta, taglia l'ellissi — e il dettaglio, che si apre a
   un tocco, lo mostra per intero. */
.mh-scambio .mkt-item { flex-wrap: nowrap; min-width: 0; }
.mh-quando { flex: none; font-size: var(--fs-xs); }
.mh-caret { flex: none; color: var(--ink-dim); font-size: var(--fs-xs); width: 10px; text-align: center; }
/* Il dettaglio: coppie etichetta/valore, allineate in colonna. Sta DENTRO la stessa card e non
   in un popup — quel che si vuole e' vedere il resto dell'affare senza perdere di vista la
   riga, e un popup coprirebbe proprio l'elenco che si sta scorrendo. */
.mh-dett { padding: 0 var(--sp-10) var(--sp-8) 34px; display: flex; flex-direction: column; gap: var(--sp-4);
  border-top: 1px solid var(--slate-2); margin-top: var(--sp-2); padding-top: var(--sp-8); }
.mh-d-row { display: flex; align-items: baseline; gap: var(--sp-8); font-size: var(--fs-xs); }
.mh-d-k { flex: 0 0 84px; color: var(--ink-dim); }
.mh-d-v { flex: 1 1 auto; min-width: 0; color: var(--ink); }
.mh-d-affs { margin-bottom: var(--sp-4); }
.mkt-hist-dir { flex: none; opacity: .85; }
.mkt-hist-dir .gi { width: 16px; height: 16px; }
.mkt-hist-body { min-width: 0; flex: 1; }
.mkt-hist-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.mkt-hist-line .mkt-op { color: var(--ink-dim); }
.mkt-hist-sub { font-size: 11px; color: var(--ink-dim); margin-top: 2px; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
/* La seconda fila di filtri (la merce) sta sotto la prima (il movimento), separata da un filo:
   sono due domande diverse sullo stesso registro e si leggono meglio una per riga. */
.mkt-hfrow-2 { margin-top: var(--sp-6); padding-top: var(--sp-6); border-top: 1px solid var(--slate-2); }
/* La porta dell'archivio, in cima alla sezione e a voce bassa: larga quanto la colonna perche'
   sta da sola su una riga, ma in velatura invece che in ottone pieno — chi entra nel Mercato
   viene per comprare, e questo tasto deve farsi trovare senza chiamare. */
.mkt-hist-cta { margin: var(--sp-8) 0 var(--sp-10); }
.mkt-hist-cta .btn { width: 100%; justify-content: center; color: var(--ink); }
.mkt-hist-cta .btn:hover { color: var(--amber-l); border-color: var(--brass); }
.mkt-hist-cta .gi { width: 15px; height: 15px; opacity: .8; }
.mkt-hist-st { text-transform: uppercase; letter-spacing: .3px; font-weight: 700; }
.mkt-hist-st.st-delivered { color: var(--good); }
.mkt-hist-st.st-cancelled, .mkt-hist-st.st-expired { color: var(--ink-dim); }
/* Data assoluta accanto al «12h fa»: c'e' quando serve incrociare un affare con un giorno
   preciso, ma non deve competere con il resto della riga — un gradino sotto, non un secondo
   timestamp che urla. */
.mkt-hist-date { opacity: .62; }
.mkt-hist-sub .gi { width: 11px; height: 11px; vertical-align: -1px; opacity: .8; }
.mkt-hist-sentinel { height: 1px; }
.mkt-island-sel { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin: 4px 0 10px; }
.mkt-island-sel .isl-chip { padding: 4px 10px; }
.mkt-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; margin: 4px 0 10px; }
.mkt-tile { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; text-align: left; padding: 10px 10px; border: 1px solid var(--slate-3); border-radius: 12px; background: rgba(0,0,0,.18); cursor: pointer; color: inherit; }
.mkt-tile:hover { border-color: var(--brass); }
.mkt-tile.sel { border-color: var(--brass-l); box-shadow: 0 0 0 1px var(--brass-l) inset; background: rgba(198,148,74,.12); }
.mkt-tile-ic { font-size: 18px; line-height: 1; }
.mkt-tile-nm { font-size: 12px; font-weight: 600; color: var(--ink); }
.mkt-price { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
.mkt-price-row { display: flex; align-items: center; gap: 8px; }
.mkt-price-row .ricon { flex: 0 0 auto; }
.mkt-price-lbl { flex: 0 0 62px; font-size: 12px; color: var(--patina); }
.mkt-price-row .mkt-num { flex: 1 1 auto; }
.mkt-filters .don-field { width: 100%; }
.locked-panel .progress { max-width: 260px; margin: 0 auto; }
.prof-collapse { margin-top: 12px; border: 1px solid var(--slate-3); border-radius: 12px; background: rgba(0,0,0,.18); overflow: hidden; }
.prof-collapse > summary { list-style: none; cursor: pointer; padding: 12px 12px; font-family: var(--font-display); font-size: 13px; color: var(--brass-l); letter-spacing: .4px; display: flex; align-items: center; justify-content: space-between; }
.prof-collapse > summary::-webkit-details-marker { display: none; }
.prof-collapse > summary::after { content: "▾"; color: var(--patina); transition: transform .15s; }
.prof-collapse[open] > summary::after { transform: rotate(180deg); }
.prof-collapse > div { padding: 0 12px 12px; }
/* Voce "Storico imprese": IDENTICA al sommario collassabile (icona + titolo), ma è un BOTTONE
   che apre la pagina a schermo intero. Freccia › al posto del chevron, niente sottotitolo. */
.prof-openbtn { width: 100%; background: rgba(0,0,0,.18); border: 1px solid var(--slate-3); cursor: pointer;
  padding: 12px 12px; font-family: var(--font-display); font-size: 13px; color: var(--brass-l);
  letter-spacing: .4px; display: flex; align-items: center; justify-content: space-between; }
.prof-openbtn .gi { width: 30px; height: 30px; margin-right: 4px; vertical-align: middle; }
.prof-openbtn .gi-coin { background-size: 62%; }
.prof-openbtn::after { content: "›"; color: var(--patina); font-size: 18px; line-height: 1; }
.prof-openbtn:active { background: rgba(255,255,255,.04); }

/* Storico a schermo intero: barra tab sotto la testata + footer col pager. */
/* Le quattro tab su UNA riga sola, scorribile col dito o con la rotella. Andando a capo la
   quarta («Pinnacolo») si prendeva una seconda riga tutta per se', e in un overlay a schermo
   intero quella riga e' spazio rubato ai rapporti — che sono il motivo per cui si e' aperto lo
   Storico. Overflow nascosto a destra: lo scorrimento dice da solo che c'e' altro.
   `overscroll-behavior-x: contain` impedisce che arrivare in fondo alla striscia trascini la
   PAGINA sotto, che su un telefono e' il modo classico di uscire da un pannello per sbaglio. */
.hist-tabs { flex: none; display: flex; flex-direction: column; gap: 6px; padding: 8px 12px;
  border-bottom: 1px solid rgba(195,156,95,.16); }
/* Le quattro tab su UNA riga sola, scorribile col dito o con la rotella. Andando a capo la
   quarta («Pinnacolo») si prendeva una seconda riga tutta per se', e in un overlay a schermo
   intero quella riga e' spazio rubato ai rapporti — che sono il motivo per cui si e' aperto lo
   Storico. Overflow nascosto a destra: lo scorrimento dice da solo che c'e' altro.
   `overscroll-behavior-x: contain` impedisce che arrivare in fondo alla striscia trascini la
   PAGINA sotto, che su un telefono e' il modo classico di uscire da un pannello per sbaglio. */
.hist-tabstrip { display: flex; flex-wrap: nowrap; gap: 6px;
  overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain;
  scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.hist-tabstrip::-webkit-scrollbar { display: none; }
.hist-tabstrip > .hist-tab { flex: none; }
/* Barra di ricerca dello Storico: seconda riga, larghezza piena sotto le tab. */
/* La ricerca in VETRO: sta sotto le tab ma non si prende una fascia opaca tutta sua — il fondo
   e' quasi trasparente e sfocato, e i rapporti si intravedono attraverso. In un overlay a
   schermo intero ogni striscia piena e' spazio tolto a quello che si e' venuti a leggere.
   Il bordo resta (senza, un campo di testo trasparente non si capisce che e' un campo), ma
   attenuato: c'e' quando lo cerchi, non prima. */
.hist-search { flex: none; width: 100%; display: flex; align-items: center; gap: 6px; margin-top: 2px;
  padding: 0 var(--sp-10); border-radius: var(--r-md); border: 1px solid rgba(195,156,95,.28);
  background: rgba(9,13,18,.30); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); }
/* A fuoco si fa solida quel tanto che basta a leggere quello che si sta scrivendo. */
.hist-search:focus-within { background: rgba(9,13,18,.62); border-color: var(--brass); }
.hist-search .gi { width: 14px; height: 14px; flex: none; opacity: .7; }
.hist-search input { flex: 1; min-width: 0; padding: 8px 0; border: 0; background: transparent;
  color: var(--ink); font: inherit; font-size: 13px; outline: none; }
.hist-search input::placeholder { color: var(--ink-dim); opacity: .8; }
.hist-search input::-webkit-search-cancel-button { -webkit-appearance: none; height: 14px; width: 14px;
  background: var(--ink-dim); border-radius: 50%; cursor: pointer;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 6l12 12M18 6L6 18' stroke='black' stroke-width='3'/%3E%3C/svg%3E") center/12px no-repeat; }
#history-overlay.hist-shared .hist-search { border-color: var(--brass); }
/* Divisore per giorno tra i gruppi di rapporti. */
.hist-day { display: flex; align-items: center; gap: 10px; margin: 12px 2px 8px; }
.hist-day::before, .hist-day::after { content: ""; flex: 1; height: 1px; background: rgba(195,156,95,.22); }
.hist-day span { flex: none; font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: var(--patina); }
#history-overlay.hist-shared .hist-day::before, #history-overlay.hist-shared .hist-day::after { background: rgba(210,160,90,.28); }
.hist-tab { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  padding: 8px 6px; border-radius: 8px; border: 1px solid var(--bronze-d); background: rgba(0,0,0,.22);
  color: var(--ink-dim); font: inherit; font-size: 12px; font-weight: 600; cursor: pointer; }
.hist-tab .gi { width: 15px; height: 15px; }
.hist-tab.on { color: var(--amber-l); border-color: var(--brass); background: linear-gradient(180deg, rgba(120,84,26,.28), rgba(0,0,0,.22)); }
.hist-foot { justify-content: space-between; align-items: center; }
.hist-foot .btn { flex: none; min-width: 96px; }
.hist-foot .hist-page { font-size: 12px; font-variant-numeric: tabular-nums; }
.gxh-card .card-head h3 { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Isola: minimal specialization line under the coordinates */
.spec-mini { display: flex; align-items: center; flex-wrap: nowrap; gap: 6px; margin: -6px 2px 12px;
  overflow-x: auto; overflow-y: hidden; scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch; scrollbar-width: none; }
.spec-mini::-webkit-scrollbar { display: none; }
.spec-mini > * { flex: 0 0 auto; scroll-snap-align: start; }
.spec-mini .spec-k { font-size: 10px; text-transform: uppercase; letter-spacing: .6px; color: var(--patina); font-weight: 700; }
.spec-chip { font-size: 10px; padding: 1px 8px; border-radius: 999px; border: 1px solid var(--slate-3); background: rgba(0,0,0,.22); color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.spec-chip.up { color: var(--good); border-color: rgba(121,192,140,.4); }
.spec-chip.down { color: #e0a07a; border-color: rgba(180,90,60,.4); }

/* Data tables (guild / player / planet directories) — filterable, sortable */
.table-filters { display: flex; gap: 8px; align-items: center; margin: 0 0 10px; }
.table-filters .don-field { flex: 1; min-width: 0; }
.table-filters .tp-count { flex: none; font-size: 11px; white-space: nowrap; }
/* Pager sotto le tabelle navigabili (pianeti liberi, ecc.): Prec / pagina X di Y / Succ. */
.tbl-pager { display: flex; align-items: center; justify-content: center; gap: 12px; margin: 10px 0 2px; }
.tbl-pager .tp-info { font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.tbl-pager .tp-info b { color: var(--brass-l); }
.seg-lng { display: flex; border: 1px solid var(--bronze-d); border-radius: 8px; overflow: hidden; flex: none; }
.seg-lng button { background: transparent; border: none; color: var(--ink-dim); font: inherit; font-size: 11px; padding: 0 8px; cursor: pointer; }
.seg-lng button.on { background: linear-gradient(180deg, var(--panel-2), var(--panel-1)); color: var(--brass-l); }
.table-wrap { overflow-x: auto; border: 1px solid var(--slate-3); border-radius: 12px; -webkit-overflow-scrolling: touch; }
/* Tabelle DENTRO una card (mobile): banda full-bleed da bordo a bordo della card — recupera
   i 24px di padding (spazio prezioso), niente doppia cornice laterale né angoli: il taglio
   coincide col bordo card. La prima colonna sticky resta opaca sopra lo scroll. */
.card .table-wrap { margin-left: -12px; margin-right: -12px; border-left: 0; border-right: 0; border-radius: 0; }
.wp-target .table-wrap, .wp-campaign .table-wrap { margin-left: -12px; margin-right: -12px; }
/* Mondo · Capitani: la colonna identità (avatar+nome+gilda) resta FISSA a sinistra
   (position:sticky) e il resto — Coord/Liv/Dist/Azioni — scorre in orizzontale quando
   manca spazio (mobile). Lo scroll X è del wrapper, la Y resta alla pagina: il browser
   blocca il gesto sull'asse dominante, niente pan diagonale libero.
   Sfondo tabella OPACO = le celle sticky coprono senza aloni ciò che scorre sotto. */
.table-wrap.mondo-wrap { overflow-x: auto; }
.mondo-wrap .mtable { min-width: 510px; background: var(--sky-0); }
.mtable th.c-name, .mtable td.td-name {
  position: sticky; left: 0; z-index: 2;
  background: var(--sky-0); border-right: 1px solid var(--slate-3);
}
/* Tinte di riga (zebra / riga "io") ricalcolate SOLIDE per la cella sticky:
   sky-0 + velo nero .14 e sky-0 + ambra .14 (i background rgba non coprirebbero). */
.mtable tbody tr:nth-child(even) td.td-name { background: #090d14; }
.mtable tbody tr.mtr-me td.td-name { background: #292620; }
/* Lista Mondo: layout a larghezza fissa che entra sempre → niente slide orizzontale. */
.table-wrap.table-fit { overflow-x: hidden; }
/* Riga "io" nella lista Mondo: evidenziata (ambra) così ti riconosci in mezzo agli altri. */
.mtable tbody tr.mtr-me td { background: rgba(233,181,74,.14); }
.mtable tbody tr.mtr-me .dt-name { color: var(--amber-l); font-weight: 700; }
.data-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.data-table th, .data-table td { padding: 8px 8px; text-align: left; border-bottom: 1px solid var(--slate-3); white-space: nowrap; }
.data-table thead th { font-size: 10px; text-transform: uppercase; letter-spacing: .4px; color: var(--patina); cursor: pointer; user-select: none; }
.data-table tbody tr:last-child td { border-bottom: none; }
.data-table tbody tr:nth-child(even) { background: rgba(0,0,0,.14); }
.data-table .num { text-align: right; font-variant-numeric: tabular-nums; }
.data-table .dt-crest { margin-right: 4px; }
.data-table .dt-name small { color: var(--ink-dim); }
.data-table .dt-lng { color: var(--brass-l); font-weight: 700; font-size: 11px; }
.data-table .dt-act { text-align: right; }
.btn-xs { padding: 2px 8px; font-size: 11px; border-radius: var(--r-btn); flex: none; }
.mondo-acts { display: flex; gap: 4px; justify-content: flex-end; }
.btn-ic { border: 1px solid var(--bronze-d); background: rgba(0,0,0,.25); border-radius: var(--r-btn); width: 28px; height: var(--btn-h-xs); font-size: 13px; line-height: 1; cursor: pointer; padding: 0; color: var(--ink, #fff); }
/* Mappa · Capitani: the table always fits the screen — no horizontal scroll. Fixed layout lets
   the island name truncate with an ellipsis while coords/level/dist/actions keep compact widths. */
.mtable { table-layout: fixed; }
.mtable th, .mtable td { padding: 8px 4px; }
/* Bottone d'azione in tabella (es. Colonizza): compatto e allineato. Da DISABILITATO non
   diventa una macchia grigia (grayscale): resta un tasto "spento" pulito, bordo d'ottone. */
.mtable .dt-act .btn { min-width: 84px; }
.mtable .dt-act .btn:disabled { opacity: 1; filter: none; cursor: not-allowed;
  background: rgba(0,0,0,.28) !important; color: var(--ink-dim) !important;
  border-color: var(--bronze-d) !important; box-shadow: inset 0 1px 0 rgba(255,255,255,.04) !important; }
.mtable .dt-act .btn:disabled .gi, .mtable .dt-act .btn:disabled .ricon { filter: none; opacity: .6; }
.mtable .c-coord { width: 62px; }
.mtable .c-lv { width: 30px; }
.mtable .c-dist { width: 46px; }
.mtable .c-guild { width: 68px; }
.mtable .c-pt { width: 54px; }
.mtable .c-act { width: 44px; }
/* Classifica "Cerca giocatori" = stessa veste della tabella Mondo (mtable), ma con le sue colonne
   (Pt/Liv al posto di Coord/Dist): meno colonne → nome flessibile e nessuna larghezza minima forzata. */
.mondo-wrap .mtable.ptable { min-width: 0; }
.mondo-wrap .mtable.ptable .c-name { width: auto; }
.mtable.ptable .c-act { width: 46px; }
/* Colonne Gilda, Coord, Liv e Pt: intestazione e contenuto allineati a SINISTRA (stemma/tag,
   coordinate, livello, punti). thead/tbody per vincere sulla regola generale text-align:right. */
.mtable thead th.c-guild, .mtable tbody td.c-guild,
.mtable thead th.c-coord, .mtable tbody td.c-coord,
.mtable thead th.c-pt, .mtable tbody td.c-pt,
.mtable thead th.c-lv, .mtable tbody td.c-lv { text-align: left; }
.mtable td.c-guild .dt-guild { margin-left: 0; justify-content: flex-start; cursor: pointer; }
.mtable td.c-guild .dt-nogld { font-size: 11px; }
/* Solo lista Capitani: colonna identità a larghezza fissa (serve allo sticky) e
   colonna Azioni più larga (due tasti: Spia + Messaggio). */
/* Colonna Giocatore (fissa): larghezza in variabile, un po' più stretta di prima e
   RIDIMENSIONABILE trascinando la maniglia sul confine (persistita per dispositivo). */
.mondo-wrap { --mondo-name-w: 148px; }
.mondo-wrap .mtable .c-name { width: var(--mondo-name-w); }
.mtable th.c-name { position: sticky; }
.col-drag { position: absolute; top: 0; bottom: 0; right: -5px; width: 11px; cursor: col-resize;
  z-index: 3; touch-action: none; }
.col-drag::after { content: ""; position: absolute; top: 0; bottom: 0; left: 5px; width: 1px;
  background: var(--slate-3); transition: background .12s, width .12s; }
.col-drag:hover::after, .col-drag:active::after { background: var(--brass); width: 3px; left: 4px; }
.mondo-wrap .mtable .c-act { width: 72px; }
@media (min-width: 641px) { .mondo-wrap { --mondo-name-w: 240px; } }
/* Gilda accanto al nome: icona crest + [TAG], non si comprime (si accorcia il nome). */
.dt-guild { flex: none; display: inline-flex; align-items: center; gap: 2px; margin-left: 6px; }
.dt-guild .crestbadge { width: 16px; height: 16px; }
.dt-gtag { color: var(--patina); font-size: 10px; font-weight: 700; letter-spacing: .2px; }
/* Nome a sinistra; tutte le altre colonne (Coord/Liv/Dist/Azioni) allineate a destra,
   contenuto incluso → il nome del capitano guadagna spazio e i numeri restano incolonnati. */
.mtable th:not(.c-name), .mtable td:not(:first-child) { text-align: right; }
.mtable td:first-child { white-space: nowrap; }
/* Name cell never wraps: it's a single-line flex row that clips (name ellipsis first, then the
   newbie shield) instead of pushing content onto a second line and misaligning the action buttons. */
.mtable .dt-id { display: flex; align-items: center; max-width: 100%; overflow: hidden; }
.mtable .dt-idcol { display: flex; flex-direction: column; min-width: 0; gap: 1px; }
.mtable .dt-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 2ª riga: SVG isola (castello = madre, isola = colonia) + nome isola → distingue le righe
   dello stesso capitano che prima differivano solo per le coordinate. */
.mtable .dt-island { font-size: 11px; line-height: 1.2; color: var(--ink-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mtable .dt-island .gi { width: 12px; height: 12px; vertical-align: -2px; margin-right: 2px; opacity: .85; flex: none; }
.mtable .dt-shield { flex: none; color: var(--good); padding: 0 4px; }
/* align-items:center → il bottone NON si stira in altezza (default flex = stretch, causa
   dell'overflow) e resta centrato nel rigo. Bottone e icona rimpiccioliti e centrati. */
.mtable .mondo-acts { gap: 2px; align-items: center; }
.mtable .btn-ic { display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: var(--btn-h-xs); font-size: 14px; }
.mtable .btn-ic .gi { vertical-align: 0; }
/* Altezza riga UNIFORME a prescindere dal pulsante MSG: senza, la riga "io" (priva di
   bottone) restava più bassa delle altre → le righe si sfasavano e la banda d'evidenziazione
   ambra non combaciava con le celle a destra. Fisso l'altezza e centro in verticale: il
   bottone (32px) sta comodo dentro i 44px e ogni riga è alta uguale. */
.mtable tbody td { height: 44px; box-sizing: border-box; padding-top: 4px; padding-bottom: 4px; vertical-align: middle; }
.mtable tbody .dt-act { padding-top: 0; padding-bottom: 0; }
.btn-ic:disabled { opacity: .32; cursor: default; }
.btn-ic:not(:disabled):active { transform: translateY(1px); }

/* Section separator (e.g. Azioni › Mondo) */
.view-sep { display: flex; align-items: center; gap: 10px; margin: 20px 2px 12px; font-family: var(--font-display);
  font-size: 12px; letter-spacing: 2px; text-transform: uppercase; color: var(--patina); }
.view-sep::before, .view-sep::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--bronze-d), transparent); }

/* Mondo: horizontally-swipeable galaxy of nearby islands */
.mondo-strip { display: flex; gap: 10px; overflow-x: auto; padding: 4px 2px 12px; scroll-snap-type: x proximity; -webkit-overflow-scrolling: touch; }
.mondo-cell {
  flex: 0 0 auto; width: 116px; scroll-snap-align: center; cursor: pointer; color: var(--ink);
  display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 12px 8px;
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  border: 1px solid #0c1116; border-left: 3px solid var(--bronze-d); border-radius: 12px;
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.35);
}
.mondo-cell:active { transform: translateY(1px); }
.mondo-cell .mc-ic { font-size: 30px; line-height: 1; filter: drop-shadow(0 2px 4px rgba(0,0,0,.6)); }
.mondo-cell .mc-name { font-weight: 700; font-size: 13px; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mondo-cell .mc-coords { font-variant-numeric: tabular-nums; font-size: 11px; color: var(--brass-l); }
.mondo-cell .mc-sub { font-size: 10px; color: var(--ink-dim); }
.mondo-cell.me { border-left-color: var(--good); }
.mondo-cell.mineisl { border-left-color: var(--brass); }
.mondo-cell.enemy { border-left-color: var(--rust); }
.mondo-cell.prot { border-left-color: var(--patina); opacity: .85; }
.mondo-cell.on { border-color: var(--amber); box-shadow: inset 0 1px 0 var(--edge-hi); }

@media (min-width: 620px) {
  .chat-sheet { max-width: 640px; margin: 0 auto; border-radius: 18px 18px 0 0; }
  .views { max-width: 640px; margin: 0 auto; width: 100%; }
  .bottomnav { max-width: 640px; width: 100%; left: 50%; transform: translateX(-50%); border-radius: 12px 12px 0 0; }
  /* Barra checkout: centrata a 640px come la navbar (margin-left, non transform, per non
     entrare in conflitto con la translateY dell'animazione d'entrata). */
  .logi-checkout { left: 50%; right: auto; width: 640px; margin-left: -320px; border-radius: 4px 4px 0 0; }
  /* CARRELLO DEL MERCATO: stessa cura del checkout logistica. Da bordo a bordo su schermo largo
     attraversava tutta la finestra e passava SOTTO la colonna delle flotte e sotto la chat —
     pannelli che stanno su una quota più alta — così la scheda finiva tagliata a metà da roba
     che non c'entrava. Larga quanto la colonna centrale non incontra più nessuno: sta sopra la
     pagina che si sta usando, dove il carrello deve stare. */
  .mkt-drawer { left: 50%; right: auto; width: 640px; margin-left: -320px; border-radius: 4px 4px 0 0; }
  /* True header: the top HUD + its production strip keep their background & rails EDGE-TO-EDGE
     (full viewport width), but their CONTENT (resource cards, progress bars, icons, timers) is
     pushed into the same centred 640px column as .views — so bars line up under the header cards
     while the frame bleeds to the screen edges. Padding = the gutter to the 640px column + the
     original 12px inner padding; vertical padding is untouched. */
  .topbar, .progress-strip {
    padding-left: calc((100% - 640px) / 2 + 12px);
    padding-right: calc((100% - 640px) / 2 + 12px);
  }
}

/* ---- Composable guild crests: white game-icon over a preset colour ---- */
.crestbadge { display:inline-grid; place-items:center; flex:none; width:1.5em; height:1.5em; aspect-ratio:1; border-radius:28%; vertical-align:-0.42em; box-shadow: inset 0 0 0 1px rgba(255,255,255,.18), inset 0 -3px 6px rgba(0,0,0,.35), 0 1px 3px rgba(0,0,0,.5); }
.crestbadge .cricon { width:74%; height:74%; }
/* Crest SVGs are bbox-centered at the file level (viewBox shifted per-icon), so plain
   center positioning is now exact — no optical nudges needed here. */
.cricon { display:block; background-size:contain; background-repeat:no-repeat; background-position:center; }
.cbg-0 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #b23b2e; }
.cbg-1 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #b8862f; }
.cbg-2 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #3f7d54; }
.cbg-3 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #2f5d8a; }
.cbg-4 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #6a3f8a; }
.cbg-5 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #2f8a86; }
.cbg-6 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.13), rgba(0,0,0,.4)), #1d2127; }
.cbg-7 { background: radial-gradient(120% 120% at 32% 22%, rgba(255,255,255,.16), rgba(0,0,0,.28)), #7d2f4a; }
.cricon-skull { background-image:url("/assets/ui/crest/skull.svg?v=1"); }
.cricon-ironcross { background-image:url("/assets/ui/crest/ironcross.svg?v=1"); }
.cricon-spades { background-image:url("/assets/ui/crest/spades.svg?v=1"); }
.cricon-helmet { background-image:url("/assets/ui/crest/helmet.svg?v=1"); }
.cricon-curl { background-image:url("/assets/ui/crest/curl.svg?v=1"); }
.cricon-freemasonry { background-image:url("/assets/ui/crest/freemasonry.svg?v=1"); }
.cricon-yinyang { background-image:url("/assets/ui/crest/yinyang.svg?v=1"); }
.cricon-wolf { background-image:url("/assets/ui/crest/wolf.svg?v=2"); }
.cricon-diamondsmile { background-image:url("/assets/ui/crest/diamondsmile.svg?v=2"); }
.cricon-dragon { background-image:url("/assets/ui/crest/dragon.svg?v=1"); }
.cricon-eyepatch { background-image:url("/assets/ui/crest/eyepatch.svg?v=1"); }
.cricon-hook { background-image:url("/assets/ui/crest/hook.svg?v=2"); }
.cricon-warlord { background-image:url("/assets/ui/crest/warlord.svg?v=1"); }
.cricon-drakkardragon { background-image:url("/assets/ui/crest/drakkardragon.svg?v=2"); }
.cricon-drakkar { background-image:url("/assets/ui/crest/drakkar.svg?v=2"); }
.cricon-kenku { background-image:url("/assets/ui/crest/kenku.svg?v=1"); }
.cricon-meat { background-image:url("/assets/ui/crest/meat.svg?v=2"); }
.cricon-unicorn { background-image:url("/assets/ui/crest/unicorn.svg?v=1"); }
.cricon-spectre { background-image:url("/assets/ui/crest/spectre.svg?v=1"); }
.cricon-cultist { background-image:url("/assets/ui/crest/cultist.svg?v=1"); }
.cricon-desertskull { background-image:url("/assets/ui/crest/desertskull.svg?v=2"); }
.cricon-dreamcatcher { background-image:url("/assets/ui/crest/dreamcatcher.svg?v=2"); }
.cricon-heart { background-image:url("/assets/ui/crest/heart.svg?v=1"); }
.cricon-paw { background-image:url("/assets/ui/crest/paw.svg?v=2"); }
.cricon-armadillo { background-image:url("/assets/ui/crest/armadillo.svg?v=1"); }
.cricon-scorpion { background-image:url("/assets/ui/crest/scorpion.svg?v=2"); }
.cricon-tiger { background-image:url("/assets/ui/crest/tiger.svg?v=2"); }
.cricon-eagle { background-image:url("/assets/ui/crest/eagle.svg?v=1"); }
.cr-builder { display:flex; align-items:center; gap:12px; margin-top:6px; }
.cr-preview .crestbadge { width:44px; height:44px; }
.cr-colors { display:grid; grid-template-columns:repeat(4,1fr); gap:6px; flex:1; }
.cr-color { width:100%; height:26px; border-radius:8px; border:2px solid rgba(0,0,0,.4); cursor:pointer; padding:0; }
.cr-color.sel { border-color:var(--amber); box-shadow: 0 0 0 2px rgba(233,181,74,.5); }
.cr-icons { display:grid; grid-template-columns:repeat(7,1fr); gap:6px; margin-top:10px; max-height:200px; overflow-y:auto; padding:2px; }
.cr-icon { aspect-ratio:1/1; border-radius:8px; border:1px solid var(--bronze-d); background:var(--panel-0); cursor:pointer; display:grid; place-items:center; padding:0; }
.cr-icon .cricon { width:64%; height:64%; filter:brightness(.85); }
.cr-icon.sel { border-color:var(--amber); background:rgba(233,181,74,.15); /* glow rimosso */ }
.cr-icon.sel .cricon { filter:none; }
.gh-crest-edit { position: absolute; right: -7px; bottom: -7px; width: 22px; height: 22px; border-radius: 50%; border: 1px solid var(--brass-d); background: var(--panel-1); color: var(--brass-l); display: grid; place-items: center; cursor: pointer; padding: 0; box-shadow: 0 1px 3px rgba(0,0,0,.6); }
.gh-crest-edit .gi { width: 12px; height: 12px; }
/* Keep the crest medallion optically centered in fixed slots (no inline baseline shift) */
.gh-crest .crestbadge, .icon-slot .crestbadge, .av-slot .crestbadge, .lb-av .crestbadge, .dt-crest .crestbadge, .wb-crest .crestbadge { vertical-align: middle; }
/* Guild-hero logo: the coloured badge fills the whole framed square so only the guild's
   own colour shows between the emblem and the brass frame (no slate/blue corners). */
.gh-crest .crestbadge { width: 100%; height: 100%; border-radius: 12px; }

/* ---- Albero del Vapore (skill tree): overlay + bottone in coda a Isola + todo sotto le quest ---- */
#skilltree-frame { position:fixed; inset:0; z-index:1200; background:#05060b; animation:st-fade .34s ease both; }
#skilltree-frame.closing { animation:st-fadeout .3s ease both; }
@keyframes st-fade { from { opacity:0 } to { opacity:1 } }
@keyframes st-fadeout { from { opacity:1 } to { opacity:0 } }
#skilltree-frame iframe { width:100%; height:100%; border:0; display:block; }
/* Bottone "Albero del Progresso": plancia di legno con cornice d'ottone e ingranaggi ai lati
   (idle: ruotano piano; al click steamGears() li accelera in crescendo + vapore dai lati). */
.st-open-btn { position:relative; z-index:5; display:block; width:100%; margin:16px 0 4px; padding:16px 12px; text-align:center; cursor:pointer; overflow:hidden;
  border:1px solid #caa24a; border-radius:4px;   /* z5: sopra il fumo (z4) che sbuca da dietro */
  background: linear-gradient(180deg, #543a1e, #3a2611 48%, #281a0b);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.55), inset 0 0 0 2px rgba(202,162,74,.30), inset 0 1px 0 rgba(255,230,173,.12), inset 0 -9px 18px rgba(0,0,0,.5), 0 2px 10px rgba(0,0,0,.45);
  transition: box-shadow .2s, border-color .2s, transform .05s; }
/* grana del legno su ::before con blur leggero: toglie il feel pixellato delle righe.
   z-index:-1 = slot "layer di sfondo": sopra il background del bottone ma sotto TUTTI i
   figli (ingranaggi z1, scritta z2), garantito dalla spec su ogni browser */
.st-open-btn::before { content:""; position:absolute; inset:-4px; z-index:-1; pointer-events:none;
  background:
    repeating-linear-gradient(91deg, rgba(0,0,0,.14) 0 2px, rgba(0,0,0,0) 2px 5px, rgba(255,230,173,.04) 5px 6px, rgba(0,0,0,0) 6px 11px),
    repeating-linear-gradient(89deg, rgba(0,0,0,.10) 0 14px, rgba(0,0,0,0) 14px 34px);
  filter: blur(.9px); }
.st-open-btn:hover { border-color:#e9b54a;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.55), inset 0 0 0 2px rgba(202,162,74,.45), inset 0 1px 0 rgba(255,230,173,.16), inset 0 -9px 18px rgba(0,0,0,.5), 0 2px 12px rgba(0,0,0,.5); }
.st-open-btn:active { transform:translateY(1px); }
.st-open-btn .st-lbl { position:relative; z-index:2; display:block;
  font-family:Georgia,'Times New Roman',serif; font-weight:600; font-size:13px; letter-spacing:.2em; text-transform:uppercase;
  background:linear-gradient(180deg,#fff6e2,#caa24a); -webkit-background-clip:text; background-clip:text; -webkit-text-fill-color:transparent;
  /* filter glow rimosso */ }
.st-open-btn .st-gear { position:absolute; z-index:1; pointer-events:none; opacity:.95; filter: drop-shadow(0 1px 2px rgba(0,0,0,.6)); }
.st-open-btn .st-gear svg { display:block; }
.st-open-btn .gl  { left:-26px;  top:50%; margin-top:-32px; }
.st-open-btn .gl2 { left:27px;   top:-17px; }
.st-open-btn .gr  { right:-26px; top:50%; margin-top:-32px; }
.st-open-btn .gr2 { right:27px;  bottom:-17px; }
/* spin idle sugli SPAN .st-gear (elementi HTML → compositor/GPU, zero repaint): MAI animare
   il <g> interno all'SVG (raster CPU a ogni frame — era quello a scaldare i telefoni).
   Ingranamento 12/9 esatto: piccoli a 27s contro-rotanti, fase sx 20° nei keyframes,
   destro sfasato di mezzo tick (delay -1.5s). Al click .firing spegne la CSS e steamGears
   prosegue il moto via rAF dalla fase corrente. */
.st-open-btn .st-gear { will-change:transform; }
.st-open-btn .gl, .st-open-btn .gr { animation:st-spin 36s linear infinite; }
.st-open-btn .gl2, .st-open-btn .gr2 { animation:st-spin-r 27s linear infinite; }
.st-open-btn .gr2 { animation-delay:-1.5s; }
.st-open-btn.firing .st-gear { animation:none; }
.st-open-btn .gl2 { transform:rotate(20deg); }   /* fase statica quando l'animazione è spenta (reduced-motion) */
@media (prefers-reduced-motion:reduce) { .st-open-btn .st-gear { animation:none; } }
@keyframes st-spin { to { transform:rotate(360deg); } }
@keyframes st-spin-r { from { transform:rotate(20deg); } to { transform:rotate(-340deg); } }
.st-open-btn.slim { margin:12px 0 0; padding:10px; }
/* «I miei obiettivi» è una tendina come le card sotto (banner d'arte + corpo che scorre).
   Banner un filo più basso delle sezioni Costruzioni ecc.: è una card di riepilogo, non una sezione. */
.sttodo.accordion { margin-bottom: 12px; }
.sttodo .acc-head.acc-banner { min-height: 62px; background-position: center 45%; }
.sttodo.all-done { border-color: rgba(121,192,140,.5); }
/* Tutti gli obiettivi completati → tasto SPUNTA verde nell'header (conferma e svuota la lista). */
/* Il TIMBRO verde e' il ::before, piccolo e nitido; il bottone resta la scatola di prima e fa
   solo da HITBOX (18/08/2026, ordine del committente: «pallino troppo grande e sfocato, riduci
   ma mantieni hitbox»). Prima il cerchio era il bottone stesso: border-radius 50% su una
   scatola 26 x btn-h-xs NON quadrata = un'ellisse stirata, che a schermo leggeva sfocata. */
.stt-done-btn { flex: none; width: 26px; height: var(--btn-h-xs); display: grid; place-items: center;
  padding: 0; cursor: pointer; font-size: 14px; font-weight: 800; color: #0d1510; position: relative; z-index: 2;
  background: none; border: 0; box-shadow: none; }
.stt-done-btn::before { content: ""; position: absolute; left: 50%; top: 50%; width: 16px; height: 16px;
  transform: translate(-50%, -50%); border-radius: 50%; z-index: -1;
  background: var(--good); border: 1px solid #3f7d52;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.3), 0 1px 2px rgba(0,0,0,.4); }
.stt-done-btn:hover { filter: brightness(1.08); }
.sttodo .stt-goal { font-size:10px; text-transform:uppercase; letter-spacing:.1em; color:var(--brass); margin:8px 0 2px; }
.sttodo .stt-goal:first-child { margin-top:0; }

/* ---- Mappa Mondo (worldmap.js): overlay pitch-black + globo a particelle ---- */
/* "Apri mappa": stessa forma del tasto Riscuoti (pillola dorata, poco alta) ma EDGE-TO-EDGE. */
.btn-map {
  display: flex; align-items: center; justify-content: center; width: 100%; margin: 0 0 10px;
  min-height: var(--btn-h-sm); height: var(--btn-h-sm); padding: 0 12px; font-size: 11px; font-weight: 700;
  background: linear-gradient(180deg, var(--amber-l), var(--amber) 52%, #a8762a);
  color: #2c1e06; border: 1px solid #7c571a; border-radius: 999px; cursor: pointer;
  letter-spacing: .7px; text-transform: uppercase; text-shadow: none;
  box-shadow: inset 0 1px 0 rgba(255,255,255,.5), 0 2px 5px rgba(0,0,0,.4);
  transition: filter .12s, transform .04s;
}
.btn-map:hover { filter: brightness(1.08); }
.btn-map:active { transform: translateY(1px); }
/* La card Mondo + il bottone "Apri mappa" restano appaiati (niente gap doppio dell'hub). */
.action-hub .btn-map { margin-top: -4px; }
#worldmap-overlay {
  position: fixed; inset: 0; z-index: 55; background: #000;
  opacity: 0; transition: opacity .55s ease; display: none;
}
#worldmap-overlay.wm-on { opacity: 1; }
/* GLOBO INCASSATO (mini-mappamondo del dock): stesso motore, ma vive DENTRO il pannello
   quadrato — posizione assoluta nel contenitore, canvas alto quanto lui, niente X, niente
   suggerimento, niente targhette voli/tempesta: a questa taglia sono solo rumore. */
#worldmap-overlay.wm-embed { position: absolute; inset: 0; z-index: 1; border-radius: 12px; overflow: hidden; }
#worldmap-overlay.wm-embed::before { display: none; }
#worldmap-overlay.wm-embed .wm-canvas { height: 100%; }
#worldmap-overlay.wm-embed .wm-close, #worldmap-overlay.wm-embed .wm-hint,
#worldmap-overlay.wm-embed .wm-miss, #worldmap-overlay.wm-embed .wm-temp,
#worldmap-overlay.wm-embed .wm-list { display: none !important; }
#worldmap-overlay.wm-embed .wm-filt-panel { max-width: calc(100% - 16px); max-height: calc(100% - 52px); overflow-y: auto; }
/* Sfumatura nera in cima: copre la giunzione con la status bar (anch'essa nera) e fonde tutto.
   Arriva a metà strada tra la barra e la X. */
#worldmap-overlay::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0;
  height: calc(env(safe-area-inset-top) + 46px);
  background: linear-gradient(180deg, #000 0%, #000 42%, transparent 100%);
  pointer-events: none; z-index: 1;
}
/* Ingresso "wow" seamless: mentre il velo si dissolve, il globo (già in rotazione) fa un
   leggero push-in da scala 1.06 → 1. */
#worldmap-overlay .wm-canvas { width: 100%; height: 100dvh; display: block; touch-action: none; cursor: grab;
  transform: scale(1.06); transform-origin: center; transition: transform .7s cubic-bezier(.2,.7,.2,1); }
#worldmap-overlay.wm-on .wm-canvas { transform: scale(1); }
#worldmap-overlay .wm-canvas:active { cursor: grabbing; }
#worldmap-overlay .wm-close {
  position: absolute; top: calc(12px + env(safe-area-inset-top)); right: 14px; z-index: 2;
}
/* TARGHETTA DELLE MISSIONI IN VOLO, in cima al globo. TRASPARENTE per scelta: il mondo dietro
   deve restare visibile — è la mappa il soggetto, questa è una didascalia. Niente glow (regola
   di casa): solo un velo scuro e un filo d'ottone. Larga al massimo quanto serve e mai oltre
   metà schermo, così su un telefono non mangia il globo. Sparisce da sola quando non vola nulla
   (`.on` la accende), e i clic la attraversano: non deve mai rubare una rotazione al dito. */
#worldmap-overlay .wm-miss {
  position: absolute; top: calc(var(--sp-12) + env(safe-area-inset-top));
  left: var(--sp-12); right: calc(var(--sp-32) + var(--sp-24));   /* lascia libera la X in alto a destra */
  z-index: 2; display: none; flex-direction: column; gap: var(--sp-4); pointer-events: none;
  max-width: 520px;
}
#worldmap-overlay .wm-miss.on { display: flex; }
#worldmap-overlay .wm-miss-row {
  position: relative; display: grid; grid-template-columns: 1fr auto; align-items: center;
  gap: var(--sp-8); padding: var(--sp-6) var(--sp-10) var(--sp-8); border-radius: var(--r-btn);
  background: rgba(10,7,5,.42); border: 1px solid rgba(202,162,74,.30);
  backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px);
  font-size: var(--fs-sm); color: var(--ink-dim);
}
#worldmap-overlay .wm-miss-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#worldmap-overlay .wm-miss-timer { font-variant-numeric: tabular-nums; color: var(--amber); font-weight: 700; }
/* La barra e' la STESSA della Panoramica (`.fr-bar`), riempimento e verso del rientro compresi:
   un secondo modo di disegnare la stessa cosa e' un secondo modo di sbagliarla. Qui si aggiusta
   solo la larghezza, perche' occupa tutta la riga sotto al testo. */
#worldmap-overlay .wm-miss-bar { grid-column: 1 / -1; margin-top: var(--sp-2); }
/* IL BOTTINO GIA' RISCOSSO, sotto la barra e dentro la stessa riga: chi torna carico lo vede
   senza aprire niente. Va a capo perche' con materiali, innesto e castone insieme una riga sola
   costringerebbe a scorrere una targhetta che non si tocca (`pointer-events: none`). */
#worldmap-overlay .wm-miss-premi { grid-column: 1 / -1; display: flex; flex-wrap: wrap;
  gap: var(--sp-4); margin-top: var(--sp-6); }
/* LA RIGA SI ESPANDE AL TOCCO (18/08/2026): flotta a tessere + Richiama, come in Panoramica.
   La targhetta e' `pointer-events: none` per lasciar girare il globo: si riaccende SOLO sulle
   righe che hanno un dettaglio — il resto della fascia resta trasparente ai trascinamenti. */
#worldmap-overlay .wm-miss-row.has-det { pointer-events: auto; cursor: pointer; }
/* Slider come `.fr-slide`: fuori solo l'altezza (chiuso = 0 vero), dentro bordo e padding.
   L'animazione la fa il click handler con WAAPI, la stessa fisarmonica della Panoramica. */
#worldmap-overlay .wm-miss-det { grid-column: 1 / -1; overflow: hidden; height: 0; }
#worldmap-overlay .wm-miss-row.open .wm-miss-det { height: auto; }
#worldmap-overlay .wm-miss-det-in { margin-top: var(--sp-6);
  border-top: 1px solid rgba(202,162,74,.22); padding-top: var(--sp-6); }
#worldmap-overlay .wm-miss-det .fr-recall { margin-top: var(--sp-6); }
#worldmap-overlay .wm-premio { display: inline-flex; align-items: center; gap: var(--sp-4);
  padding: 0 var(--sp-6); border-radius: var(--r-btn); font-size: var(--fs-xs);
  background: rgba(0,0,0,.34); border: 1px solid rgba(202,162,74,.28);
  font-variant-numeric: tabular-nums; }
#worldmap-overlay .wm-premio.oro { color: var(--amber-l); }
#worldmap-overlay .wm-premio .gi { width: 11px; height: 11px; }
#worldmap-overlay .wm-premio .ricon { width: 11px; height: 11px; }
/* Pulsanti filtro mappa-azione, impilati sotto la X (fino a 3 slot). */
#worldmap-overlay .wm-islands, #worldmap-overlay .wm-fav, #worldmap-overlay .wm-fav2, #worldmap-overlay .wm-fav3 {
  position: absolute; right: 14px; z-index: 2; overflow: hidden; padding: 0;
}
/* X in cima; poi il gruppo filtri con uno stacco maggiore dalla X e 10px tra un tasto e l'altro
   (tasto 20px → passo 30px). */
#worldmap-overlay .wm-islands { top: calc(12px + 20px + 14px + env(safe-area-inset-top)); }
#worldmap-overlay .wm-fav     { top: calc(12px + 20px + 14px + 30px + env(safe-area-inset-top)); }
#worldmap-overlay .wm-fav2    { top: calc(12px + 20px + 14px + 60px + env(safe-area-inset-top)); }
#worldmap-overlay .wm-fav3    { top: calc(12px + 20px + 14px + 90px + env(safe-area-inset-top)); }
#worldmap-overlay .wm-islands .wm-isl-ico { width: 100%; height: 100%; border-radius: 50%; object-fit: cover; display: block; }
/* UN SOLO aspetto «spento» per OGNI filtro della mappa: smorzato e grigio — lo stesso che aveva
   gia' il tasto delle isole disabitate, l'unico che si capiva a colpo d'occhio.

   Gli altri filtri, accendendosi, cambiavano solo il colore del bordo e un anello da un pixel: il
   giocatore li vedeva sempre uguali. Provato a schermo, quel segnale non funzionava affatto — il
   bordo NON seguiva la classe su nessuno dei tasti (le isole restavano ambra anche da spente, gli
   altri restavano ottone anche da accesi). Invece di inseguirlo, l'ho tolto: un segnale che non si
   accende non e' un segnale debole, e' un segnale finto, e ne bastava uno solo purche' vero.
   Resta l'unico che si legge davvero, uguale per tutti. (Costituzione R2: un solo aspetto «acceso».) */
#worldmap-overlay .wm-swords.wm-off { opacity: .4; filter: grayscale(1); }
#worldmap-overlay .wm-swords.wm-on { opacity: 1; }
/* IL PANNELLO FILTRI — un tasto solo sul bordo, e le scelte in un elenco che si apre.
   Prima erano fino a quattro quadrati impilati, con la sola icona: per sapere cosa facevano
   bisognava toccarli. Qui ogni riga porta il suo nome, e il tetto di quattro non c'e' piu'. */
#worldmap-overlay .wm-filt-btn { position: absolute; top: calc(60px + env(safe-area-inset-top)); right: 14px; z-index: 3; }
/* Il numerino dice quanti filtri sono accesi: a pannello chiuso e' l'unico indizio che la mappa
   non sta mostrando tutto. Senza, si guarda un globo mezzo vuoto senza capire perche'. */
#worldmap-overlay .wm-filt-n { position: absolute; top: -5px; right: -5px; min-width: 15px; height: 15px;
  padding: 0 var(--sp-2); border-radius: var(--r-pill); background: var(--amber); color: #241a0b;
  font: 800 9px/15px system-ui, sans-serif; text-align: center; font-style: normal;
  display: none; }
#worldmap-overlay .wm-filt-n.show { display: block; }
#worldmap-overlay .wm-filt-panel {
  position: absolute; top: calc(96px + env(safe-area-inset-top)); right: 14px; z-index: 3;
  width: min(74vw, 268px); max-height: min(56vh, 420px); overflow-y: auto;
  padding: var(--sp-6); border-radius: var(--r-md); border: 1px solid var(--brass-d);
  background: rgba(10,13,18,.94); backdrop-filter: blur(4px);
  display: none; }
#worldmap-overlay .wm-filt-panel.show { display: block; }
#worldmap-overlay .wm-fr { display: flex; align-items: center; gap: 8px; width: 100%;
  padding: var(--sp-6) var(--sp-8); border: 0; border-radius: var(--r-md); background: none; cursor: pointer; text-align: left; }
#worldmap-overlay .wm-fr:hover { background: rgba(255,255,255,.05); }
#worldmap-overlay .wm-fr-ic { width: 17px; height: 17px; flex: none; opacity: .5; }
#worldmap-overlay .wm-fr.on .wm-fr-ic { opacity: 1; }
#worldmap-overlay .wm-fr-txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
#worldmap-overlay .wm-fr-txt b { font-size: 12px; font-weight: 700; color: var(--ink-dim); letter-spacing: .2px; }
#worldmap-overlay .wm-fr.on .wm-fr-txt b { color: var(--amber-l); }
#worldmap-overlay .wm-fr-txt i { font-size: 10px; font-style: normal; color: rgba(151,161,169,.72); line-height: 1.3; }
/* L'interruttore: una pista con la pallina. Acceso = ambra, spento = spento. Niente bagliori. */
#worldmap-overlay .wm-fr-sw { flex: none; width: 26px; height: 15px; border-radius: 999px;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.4); position: relative; transition: background .12s, border-color .12s; }
#worldmap-overlay .wm-fr-sw::after { content: ""; position: absolute; top: 2px; left: 2px;
  width: 9px; height: 9px; border-radius: 50%; background: var(--ink-dim); transition: transform .12s, background .12s; }
#worldmap-overlay .wm-fr.on .wm-fr-sw { background: rgba(233,181,74,.26); border-color: var(--amber); }
#worldmap-overlay .wm-fr.on .wm-fr-sw::after { transform: translateX(11px); background: var(--amber-l); }
#worldmap-overlay .wm-fr-sep { height: 1px; margin: var(--sp-4) var(--sp-6); background: rgba(195,156,95,.20); }
/* Etichetta del filtro cliccato: pill d'ottone alla SINISTRA della colonna tasti, allineata al
   tasto premuto. Fade-in ~.25s → resta ~2.4s → fade-out (classe .show gestita da worldmap.js). */
#worldmap-overlay .wm-filt-toast {
  position: absolute; right: 44px; z-index: 2; max-width: min(72vw, 270px);
  padding: 6px 10px; border-radius: 8px; text-align: right;
  background: rgba(10,13,18,.94); border: 1px solid var(--brass);
  box-shadow: 0 4px 16px rgba(0,0,0,.55), inset 0 1px 0 rgba(255,235,190,.12);
  font-size: 12px; color: var(--ink); line-height: 1.35; pointer-events: none;
  opacity: 0; transform: translateX(8px); transition: opacity .25s ease, transform .25s ease;
}
#worldmap-overlay .wm-filt-toast.show { opacity: 1; transform: none; }
#worldmap-overlay .wm-filt-toast .wm-ft-line { display: flex; align-items: baseline; justify-content: flex-end; gap: 6px; }
#worldmap-overlay .wm-filt-toast .wm-ft-line b { color: var(--brass-l); font-family: var(--font-display); letter-spacing: .3px; font-size: 12px; }
#worldmap-overlay .wm-filt-toast .wm-ft-state { font-size: 10px; font-weight: 800; text-transform: uppercase; letter-spacing: .6px; color: var(--ink-dim); }
#worldmap-overlay .wm-filt-toast .wm-ft-state.on { color: var(--amber-l); }
#worldmap-overlay .wm-filt-toast .wm-ft-desc { margin-top: 2px; font-size: 11px; color: var(--ink-dim); }
#worldmap-overlay .wm-hint {
  position: absolute; left: 0; right: 0; bottom: calc(14px + env(safe-area-inset-bottom));
  text-align: center; font-size: 11px; color: rgba(214,204,182,.45); pointer-events: none;
  letter-spacing: .3px;
}
/* Tasto LISTA bersagli: box quadrato opaco + cornice d'ottone, in basso a SINISTRA (le altre
   control sono in alto a destra). Tap target più generoso delle spade. */
#worldmap-overlay .wm-ctl.wm-list {
  position: absolute; left: 14px; bottom: calc(30px + env(safe-area-inset-bottom)); z-index: 3;
  width: 30px; height: 30px;
}
/* Popup ELENCO BERSAGLI (sopra la mappa): sheet a colonna, lista che riempie e scorre. */
/* Trova-bersaglio: stessa veste della scheda personaggio (.pp-box) — vetro scuro traslucido,
   cornice d'ottone — ma a tutta altezza con header/ricerca fissi e lista che scorre. */
.tgtlist-sheet { max-width: 460px; width: 100%; max-height: 84vh; padding: 0 !important;
  display: flex; flex-direction: column; overflow: hidden; }
.tgtlist-sheet .dl-head { flex: none; padding: 12px 16px 10px; border-bottom: 1px solid rgba(195,156,95,.20); }
/* La X del popup è normalmente absolute (angolo dello sheet): qui vive in un flex-row accanto al
   toggle taglia, quindi la riporto in flusso per non sovrapporsi. */
.tgtlist-sheet .round-x { position: static; }
/* Ricerca sticky in vetro: resta in cima mentre la lista scorre. */
.tgtlist-search { flex: none; display: block; margin: 0; padding: 10px 16px 8px;
  background: linear-gradient(180deg, rgba(4,6,10,.5), rgba(4,6,10,.2)); border-bottom: 1px solid rgba(195,156,95,.12); }
.tgtlist-scroll { flex: 1 1 auto; min-height: 0; max-height: none; overflow-y: auto; padding: 12px 12px 12px; }
/* Card bersaglio dentro il popup: vetro coerente col resto, non il panel pieno delle card gioco. */
.tgtlist-scroll .tgt { background: linear-gradient(180deg, rgba(255,255,255,.045), rgba(0,0,0,.16)); }
/* Popup INFO skill (edificio/ricerca/difesa). */
.info-sheet { max-width: 440px; }
.info-sheet .round-x { position: static; }
.info-scroll { overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 12px 16px 16px; }
/* Quadrata e centrata (come le tessere dell'albero): larghezza FISSA così l'inquadratura
   non cambia al resize della finestra (prima width:100% + max-height croppava di più). */
.info-art { width: min(100%, 200px); aspect-ratio: 1 / 1; height: auto; max-height: none; object-fit: cover;
  border-radius: 8px; border: 1px solid var(--bronze-d); display: block; margin: 0 auto 2px; }
.info-sub { font-size: 11px; text-transform: uppercase; letter-spacing: .5px; margin: 10px 0 2px; }
.info-desc { margin: 4px 0 10px; font-size: 13px; line-height: 1.5; color: var(--ink); }
.info-scaling { font-size: 12px; margin-bottom: 10px; }
.info-rows { display: flex; flex-direction: column; gap: 4px; border-top: 1px solid rgba(195,156,95,.14); padding-top: 10px; }
.info-row { display: flex; justify-content: space-between; gap: 12px; font-size: 13px; }
.info-row .info-v { text-align: right; color: var(--ink); }
.tnode-tile[data-action] { cursor: pointer; }
/* Pager minimal della lista Mondo (16/pagina, centrata sul giocatore). */
.mondo-sentinel { text-align: center; padding: 12px; font-size: 12px; letter-spacing: .5px; opacity: .7; }
/* Scheda specialità pianeta libero (click da mappa-mondo). */
.isl-spec { display: flex; flex-direction: column; gap: 6px; }
.isl-spec-row { display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: var(--panel-1); border: 1px solid var(--bronze-d); border-radius: 8px; }
.isl-spec-row .ricon { width: 18px; height: 18px; }
.isl-spec-row b { margin-left: auto; }
.isl-spec-row b.good { color: var(--good, #6ec07a); }
.isl-spec-row b.bad { color: var(--rust, #e08a72); }
body.wm-lock { overflow: hidden; }
@media (max-width: 560px) {
  /* stesso taglio minimal del desktop (20px, passo 30px): niente override su mobile */
}

/* ============================================================================
   STEAMPUNK REWORK — "plancia d'ottone" (permanente)
   Titoli Cinzel (già caricato in index.html) · corpo/numeri font di sistema.
   HEADER (#topbar/.res) INTATTO: tutto è scoped a #views o agli overlay.
   Eccezioni volute: barra energia arrotondata · card-immagine di Azioni tonde ·
   tasti mappa rotondi. Niente rail colorati a sinistra (solo action-card di Missioni).
   ============================================================================ */
:root { --rw-brass: #6d4f24; }

/* grana pellicola tenue sul fondo scuro (atmosfera, mai dietro il testo) */
body::after {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 5; opacity: .045; mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 200px 200px;
}

/* Titoli in Cinzel inciso */
#views .acc-title, #views .section-title, #views .view-title, #views .acc-head,
#views .card-head h3, #views .ac-name, #views .gh-name, #views .tech-lane {
  font-family: "Cinzel", serif; font-weight: 700; letter-spacing: 1px;
}

/* Pannelli: ferro sbalzato (bevel), spigolo soft 3px. Header escluso (scoping #views). */
#views .card, #views .card.infra, #views .acc-head, #views .acc-banner, #views .accordion,
#views .gh-card, #views .guildfreebar, #views .cp-card, #views .war-card, #views .chip,
#views .btn, #views .btn-bronze, #views .btn-build, #views .btn-ghost,
#views input, #views select, #views textarea, #views .seg, #views .lvl, #views .tnode-lvl,
#views .progress, #views .fleet-muster, #views .fleet-row-wrap, #views .scrap-bar {
  border-radius: 4px !important; -webkit-clip-path: none !important; clip-path: none !important;
}
#views .action-card, #views .ac-card { border-radius: 12px !important; }   /* card Missioni: angoli un po' più morbidi */
#views .card, #views .card.infra {
  background: linear-gradient(180deg, #1a2029, #12140f) !important;
  border: 1px solid var(--rw-brass) !important;
  box-shadow: inset 0 1px 0 rgba(240,209,138,.16), inset 0 -3px 8px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.45) !important;
  position: relative;
}
/* Le due card di STATO dell'isola colpita: Tregua in corso (verde) e sacco ancora aperto
   (ruggine). Servono qui, con `!important`, perché il blocco #views .card qui sopra impone a
   TUTTE le card la cornice d'ottone: prima erano scritte in stile inline e perdevano in
   silenzio — la Tregua annunciava l'intoccabilità con la stessa cornice del resto della
   plancia. Solo il bordo: niente glow, la velatura la fa la card. */
#views .card.infra.tregua-attiva { border-color: var(--good) !important; }
#views .card.infra.sacco-aperto  { border-color: var(--rust) !important; }
/* Sfondi illustrati (arte utente) su tre card, sotto uno scrim scuro che tiene testo e icone
   leggibili. Dopo il blocco #views .card sopra e con specificità ≥ per vincere il suo !important. */
#views .card.infra.war-head {
  background:
    linear-gradient(180deg, rgba(16,20,26,.74), rgba(13,15,11,.90)),
    url("/assets/cards/gilda/woodbakeka01.jpg") center / cover no-repeat !important;
}
#views .card.infra.daily-card {
  background:
    linear-gradient(180deg, rgba(16,20,26,.80), rgba(13,15,11,.93)),
    url("/assets/cards/profilo/ricompensa01.jpg") center / cover no-repeat !important;
}
#views .card.quest-card {
  background:
    linear-gradient(180deg, rgba(16,20,26,.80), rgba(13,15,11,.93)),
    url("/assets/cards/profilo/quest01.jpg") center / cover no-repeat !important;
}
#views .card.war-recap {
  background:
    linear-gradient(180deg, rgba(16,20,26,.82), rgba(13,15,11,.90)),
    url("/assets/cards/gilda/tramatura01.jpg") center / cover no-repeat !important;
}
#views .card.inv-panel {
  background:
    linear-gradient(180deg, rgba(16,20,26,.84), rgba(13,15,11,.92)),
    url("/assets/cards/profilo/anelli01.jpg") center / cover no-repeat !important;
}
#views .card.gexped-intro {
  background:
    linear-gradient(180deg, rgba(16,20,26,.82), rgba(13,15,11,.90)),
    url("/assets/cards/gilda/spedizionecondivisa01.jpg") center / cover no-repeat !important;
}
#views .acc-head, #views .acc-banner {
  box-shadow: inset 0 1px 0 rgba(240,209,138,.14), inset 0 -3px 10px rgba(0,0,0,.55) !important;
}
#views .fleet-muster, #views .fleet-row-wrap {
  background: linear-gradient(180deg, #18212e, #0f151e) !important;
  border: 1px solid var(--rw-brass) !important;
  box-shadow: inset 0 1px 0 rgba(240,209,138,.16) !important;
}
/* Panoramica flotta: l'illustrazione "plancia" (assets/cards/unità) vive SOLO nell'HEADER
   (.mu-top), come i banner accordion. All'espansione NON si stira sul corpo (.mu-breakdown),
   che resta pannello piatto e leggibile. Scrim sull'header + cornice d'ottone (::after). */
#views .fleet-muster {
  position: relative; overflow: hidden; padding: 0 !important;
  background: linear-gradient(180deg, #18212e, #0f151e) !important;
  border: 1px solid var(--rw-brass) !important;
  box-shadow: inset 0 1px 0 rgba(240,209,138,.18), 0 4px 14px rgba(0,0,0,.42) !important;
}
#views .fleet-muster .mu-top {
  position: relative; padding: 12px;
  background:
    linear-gradient(90deg, rgba(13,19,27,.94) 0%, rgba(13,19,27,.72) 48%, rgba(13,19,27,.50) 100%),
    linear-gradient(180deg, rgba(13,19,27,.12), rgba(13,19,27,.66)),
    url("/assets/cards/unita/panoramica.jpg") center right / cover no-repeat;
}
#views .fleet-muster.open .mu-top { border-bottom: 1px solid rgba(240,209,138,.22); }
#views .fleet-muster .mu-invs {
  position: relative; margin: 0; padding: 10px 12px 12px; border-top: none;
  background: linear-gradient(180deg, #18212e, #12160f);
}
#views .fleet-muster::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  box-shadow: inset 0 0 0 1px rgba(240,209,138,.32);
}

/* Art unificate: riquadro quadro d'ottone. I badge d'angolo (livello/lucchetto) NON vanno clippati. */
#views .art-tile, #views .tnode-tile, #views .icon-slot, #views [class*="arttile"] {
  border-radius: 4px !important; overflow: visible !important; box-shadow: 0 0 0 1px var(--rw-brass) !important;
}
#views .art-tile img, #views .art-tile .art-fallback, #views .tnode-art, #views .tnode-art img,
#views .art-sm, #views .picker-ship img {
  border-radius: 4px !important; overflow: hidden !important; box-shadow: 0 0 0 1px var(--rw-brass), inset 0 0 0 1px rgba(0,0,0,.55) !important;
}
/* LE DUE RICERCHE DI RILIEVO (16/08/2026): qui, DOPO la pelle, perche' i blocchi qui sopra
   impongono con !important il bordo card in --rw-brass e la cornice-anello dei riquadri icona.
   Il colore dell'accento (azzurro colonizzazione / viola antimateria) e' dichiarato una volta
   sola sul nodo; niente glow, solo l'anello 1px ricolorato. Le regole gemelle a ~riga 1920
   tengono il bordo interno e il velo-requisiti sulla sola immagine. */
#views .tnode[data-node="research:terraforming"] { --rilievo: #5f93c4; }
#views .tnode[data-node="research:compressione_antimateriale"] { --rilievo: var(--viola); }
#views .tnode[data-node="research:terraforming"] .tnode-body > .card,
#views .tnode[data-node="research:compressione_antimateriale"] .tnode-body > .card { border-color: var(--rilievo) !important; }
#views .tnode[data-node="research:terraforming"] .tnode-tile,
#views .tnode[data-node="research:compressione_antimateriale"] .tnode-tile { box-shadow: 0 0 0 1px var(--rilievo) !important; }
#views .tnode[data-node="research:terraforming"] .tnode-art,
#views .tnode[data-node="research:terraforming"] .tnode-art img,
#views .tnode[data-node="research:compressione_antimateriale"] .tnode-art,
#views .tnode[data-node="research:compressione_antimateriale"] .tnode-art img { box-shadow: 0 0 0 1px var(--rilievo), inset 0 0 0 1px rgba(0,0,0,.55) !important; }
#views .tnode-lvl { z-index: 2; display: inline-flex !important; align-items: center; justify-content: center; line-height: 1; }
/* Nodi Isola (costruzioni/ricerche): cornice perfettamente QUADRA (niente rounding sull'immagine),
   con la cornice/sheen disegnata SOPRA l'immagine. */
#views .tnode-tile, #views .tnode-art, #views .tnode-art img { border-radius: 0 !important; }
.tnode-art img { z-index: 1; }
.tnode-art::after { border-radius: 0; z-index: 2; }

/* Targhetta livello smaltata + barra a manometro */
#views .lvl, #views .tnode-lvl {
  background: linear-gradient(180deg, #37290f, #20170a) !important; border: 1px solid var(--rw-brass) !important;
  color: var(--amber-l) !important; box-shadow: inset 0 1px 0 rgba(240,209,138,.22) !important;
  /* targhetta: margini interni dalla label, si dimensiona da sé sulla lunghezza (nowrap) */
  display: inline-flex !important; align-items: center; justify-content: center;
  padding: 2px 10px !important; line-height: 1.15; white-space: nowrap;
}
#views .progress { border: 1px solid var(--rw-brass); height: 9px !important; background: #0c0f16 !important; box-shadow: inset 0 1px 3px rgba(0,0,0,.7) !important; }
#views .progress > i { background: linear-gradient(180deg, #f0d18a, #b9812c) !important; /* glow rimosso */ }

/* ECCEZIONE: barra bilancio energia arrotondata (rilievo incassato, non un bottone) */
#views .energy-balance .load-bar, #views .load-bar, #views .load-bar > i { border-radius: 999px !important; }

/* Bottoni: bevel d'ottone + tap "a timbro" (la centratura è già nel .btn base).
   I DUE STRATI PASSANO DA TOKEN, e i default sono gli stessi di prima al byte. Serve perché
   questa riga ha `!important`: una livrea non poteva più dosare il proprio rilievo nemmeno
   volendo, e su un fondo chiaro la stessa ricetta rende molto di più che su uno scuro — la
   velatura in basso a .4 toglie 15 punti di chiarezza percepita su un ottone e 9 su una
   ruggine, ed è per questo che due bottoni identici al pixel sembravano di due famiglie. */
#views .btn, #views .btn-bronze, #views .btn-build, #views .btn-ghost {
  box-shadow: inset 0 1px 0 var(--bevel-hi, rgba(240,209,138,.18)),
              inset 0 -2px 4px var(--bevel-lo, rgba(0,0,0,.4)) !important;
}
#views .btn:active { transform: translateY(1px) scale(.995); box-shadow: inset 0 2px 6px rgba(0,0,0,.6) !important; }

/* Niente rail colorati a sinistra fuori da Missioni (l'icona/segmento basta come indicatore) */
#views .card, #views .scrap-intro, #views .report, #views .picker-ship, #views .big-card,
#views .mondo-cell, #views .roster-row, #views .warnow, #views .card.pinn-mine, #views .card.pinn-won,
#views .fleet-row-wrap {
  border-left-color: var(--rw-brass) !important; border-left-width: 1px !important;
}
/* Stessa regola DENTRO gli overlay/popup (rapporti in notifica, storico, schede): le .card qui
   avevano ancora il rail d'ottone a sinistra ("slop"). Bordo uniforme come il resto della card.

   `:not(.tgt)` AGGIUNTO IL 03/08/2026, ed e' il motivo per cui la lista bersagli aveva tre lati
   bronzo e il quarto nero. Questa regola spegne il rail portando il lato sinistro al colore
   degli ALTRI TRE di una `.card` normale, che li' e' #0c1116. Ma la `.card.tgt` ha i suoi tre
   lati in BRONZO — e allora questo `!important` non spegneva il rail: lo faceva diventare
   l'unico lato scuro di una cornice chiara. Il risultato era la cosa che si vede peggio in una
   lista: una cornice che non chiude. */
#confirm-overlay .card:not(.tgt), #report-overlay .card:not(.tgt), #history-overlay .card:not(.tgt),
.pp-box .card:not(.tgt), .gm-box .card:not(.tgt),
#settings-body .card:not(.tgt), .settings-body .card:not(.tgt) {
  border-left-color: #0c1116 !important; border-left-width: 1px !important;
}

/* Tasti della Mappa: quadrati spigolosi minimal — bordo 1px d'ottone, fondo scuro opaco,
   icona bianca. Niente arrotondamenti né gradienti: pulizia da HUD. */
#worldmap-overlay .wm-ctl {
  position: absolute; z-index: 2; width: 20px; height: 20px; padding: 0; cursor: pointer;
  display: grid; place-items: center; border-radius: 0;
  background: #0c0f14; border: 1px solid var(--brass);
  transition: border-color .12s, box-shadow .12s, transform .04s;
}
#worldmap-overlay .wm-ctl:hover { border-color: var(--amber); }
#worldmap-overlay .wm-ctl:active { transform: translateY(1px); }
/* Icona centrata con 2px di margine su ogni lato + SEMPRE bianca (SVG d'ottone neutralizzate). */
#worldmap-overlay .wm-ctl .wm-sw-ico { width: calc(100% - 4px); height: calc(100% - 4px); filter: brightness(0) invert(1); opacity: .92; }

/* UN GUSCIO SOLO PER TUTTI I POPUP — quello della carta dell'Innesto (ordine del committente,
   04/08/2026). Erano gia' quasi uniformi: cornice d'ottone su tutti i lati, niente accento su
   un lato solo, nessun glow. Ma la carta dell'Innesto aveva spigoli piu' morbidi e un'ombra
   piu' pulita, e messa accanto agli altri sembrava di un altro gioco.
   Adesso e' LA STESSA REGOLA: `.inn-pop` sta nell'elenco insieme agli altri, cosi' non possono
   piu' divergere per distrazione. Chi aggiunge un pannello nuovo lo aggiunge qui.
   Cosa cambia davvero: raggio da 4 a 12, e l'ombra perde la velatura scura in basso — quella
   schiacciava i pannelli lunghi (il Regolamento, la scheda dell'edificio) contro il fondo. */
.confirm-box, .pp-box, .gm-box, .dl-box, .adm-box, .adm-sheet, .gexphist-box, .np-box,
.settings-body, .info-sheet, .inn-pop, .boss-box, .shop-modal, .poll-sheet, .si-sheet {
  border-radius: 12px !important; border: 1px solid var(--brass-d) !important;
  box-shadow: 0 10px 30px rgba(0,0,0,.65), inset 0 1px 0 rgba(255,228,176,.1) !important;
}
/* Dashboard GM allineata alla grafica di gioco: niente rail colorato a sinistra sulle stat
   (la regola vale solo per Missioni) — bordo uniforme come le card. */
.adm-stat { border-left: 1px solid #0c1116 !important; }
.confirm-box .btn, .pp-box .btn, .gm-box .btn, .settings-body .btn, .dl-box .btn, .gexphist-box .btn {
  border-radius: 4px !important; box-shadow: inset 0 1px 0 rgba(240,209,138,.18), inset 0 -2px 4px rgba(0,0,0,.4) !important;
}
.round-x { border-radius: 4px !important; }

/* ===== GOD MODE (osservazione GM in sola lettura) ===== */
.god-sec { text-align: center; }
.god-enter-btn {
  width: 100%; padding: 12px; border-radius: 4px; cursor: pointer;
  font-family: var(--font-display); font-size: 14px; letter-spacing: .5px; color: #1a1206;
  background: linear-gradient(180deg, var(--brass-l), var(--brass) 55%, var(--bronze-d));
  border: 1px solid var(--brass-d);
  box-shadow: inset 0 1px 0 rgba(255,255,255,.35), 0 2px 6px rgba(0,0,0,.4);
}
.god-enter-btn img, .god-enter-btn svg { width: 18px; height: 18px; vertical-align: -3px; filter: brightness(0) opacity(.75); }
.god-hint { margin-top: 6px; font-size: 12px; }

.god-search-overlay .gs-sheet {
  position: relative; z-index: 1; width: min(520px, 92vw); max-height: 82vh; margin: 8vh auto 0;
  display: flex; flex-direction: column; gap: 10px; padding: 16px;
  background: #17130c; border: 1px solid var(--brass-d); border-radius: var(--radius);
  box-shadow: 0 12px 40px rgba(0,0,0,.6);
}
.gs-head { display: flex; align-items: center; justify-content: space-between; }
.gs-head h3 { font-family: var(--font-display); color: var(--brass-l); font-size: 16px; margin: 0; }
.gs-head img, .gs-head svg, .gb-eye img, .gb-eye svg { width: 18px; height: 18px; vertical-align: -3px; }
.gs-input {
  width: 100%; padding: 10px 12px; font-size: 14px; color: var(--ink);
  background: #0e0b06; border: 1px solid var(--bronze-d); border-radius: 4px; outline: none;
}
.gs-input:focus { border-color: var(--brass); background: rgba(120,84,26,.12); }
.gs-results { overflow-y: auto; display: flex; flex-direction: column; gap: 6px; }
.gs-empty { text-align: center; padding: 20px 8px; }
.gs-row {
  display: flex; align-items: center; gap: 10px; padding: 8px 10px;
  background: rgba(255,255,255,.03); border: 1px solid rgba(195,156,95,.18); border-radius: 8px;
}
.gs-who { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; flex: 1; min-width: 0; }
.gs-name { color: var(--ink); font-weight: 600; }
.gs-tag { color: var(--brass-l); font-weight: 600; }
.gs-meta { font-size: 12px; }
.gs-guild { display: inline-flex; align-items: center; gap: 2px; font-size: 12px; color: var(--brass-l); flex: none; }
.gs-guild img, .gs-guild svg { width: 16px; height: 16px; }
.gs-gtag { color: var(--ink-dim); }
.gs-noguild { opacity: .45; }
.gs-dot { width: 8px; height: 8px; border-radius: 50%; background: #55504a; flex: none; }
.gs-dot.on { background: var(--good); /* glow rimosso */ }
.gs-enter {
  flex: none; padding: 6px 12px; border-radius: 4px; cursor: pointer; font-size: 13px; color: #1a1206;
  background: linear-gradient(180deg, var(--brass-l), var(--brass)); border: 1px solid var(--brass-d);
}
.gs-enter img, .gs-enter svg { width: 14px; height: 14px; vertical-align: -2px; filter: brightness(0) opacity(.7); }

.god-banner {
  position: fixed; left: 0; right: 0;
  bottom: calc(var(--nav-h) + var(--safe-b)); z-index: 29;   /* sotto la navbar (30): l'icona AZIONI, che sporge, resta davanti al banner */
  display: flex; align-items: center; gap: 12px;
  padding: 10px clamp(12px, 4vw, 40px); border-radius: 0;
  background: linear-gradient(180deg, #2a1f10, #180f06);
  border: none; border-top: 1px solid var(--amber); border-bottom: 1px solid rgba(233,181,74,.35);
  box-shadow: 0 -4px 18px rgba(0,0,0,.5);
  color: var(--ink); font-size: 13px; animation: godpulse 2.6s ease-in-out infinite;
}
.god-banner .gb-txt { flex: 1 1 auto; min-width: 0; }   /* il testo occupa tutta la barra, Esci resta a destra */
@keyframes godpulse { 0%,100% { border-color: var(--amber); } 50% { border-color: var(--amber-l); } }
.god-banner .gb-txt b { color: var(--brass-l); }
.god-banner .gb-txt em { color: var(--amber-l); font-style: normal; }
.god-banner .gb-tag { color: var(--brass-l); }
.god-banner .gb-exit {
  flex: none; padding: 6px 12px; border-radius: 999px; cursor: pointer; font-weight: 600; color: #1a1206;
  background: linear-gradient(180deg, var(--amber-l), var(--amber)); border: 1px solid #8a5a1a;
}

/* ===== Link legali sotto il login (in evidenza, sottolineati — requisito GDPR) ===== */
.legal-links { display: flex; gap: 12px; justify-content: center; align-items: center; margin-top: 12px; font-size: 13px; }
.legal-links a { color: var(--brass-l); text-decoration: underline; font-weight: 600; }
.legal-links a:hover { color: var(--amber-l); }
.legal-links span { color: var(--ink-dim); }
/* Riga legale compatta nelle Impostazioni: link a sinistra, mini-tasto cookie a destra. */
.legal-inline { justify-content: flex-start; gap: 8px; }
.cookie-mini { margin-left: auto; flex: none; padding: 2px 8px; font-size: 11px; font-weight: 600; cursor: pointer;
  color: var(--ink-dim); background: none; border: 1px solid var(--slate-3); border-radius: 999px; font-family: inherit; }
.cookie-mini:hover { color: var(--ink); border-color: var(--bronze-d); }
/* Blocco social: NIENTE card/box — testo minimale + 4 icone bianche a tutta larghezza. */
.soc-block { margin-top: 16px; }
.soc-note { display: block; text-align: center; font-size: 11px; line-height: 1.45; margin: 0 6px 12px; }
.soc-row { display: flex; justify-content: center; align-items: center; gap: 20px; padding: 0; }
.soc-ic { display: inline-flex; padding: 4px; opacity: .6; transition: opacity .15s, transform .05s; }
.soc-ic:hover { opacity: .95; }
.soc-ic:active { transform: translateY(1px); }
.soc-ic .gi { width: 17px; height: 17px; }
.gi-soc-discord   { background-image: url("/assets/ui/soc-discord.svg?v=1"); }
.gi-soc-tiktok    { background-image: url("/assets/ui/soc-tiktok.svg?v=1"); }
.gi-soc-instagram { background-image: url("/assets/ui/soc-instagram.svg?v=1"); }
.gi-soc-facebook  { background-image: url("/assets/ui/soc-facebook.svg?v=1"); }

/* ===== Consenso cookie (GDPR / ePrivacy) ===== */
.cookie-consent {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 5000;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 12px clamp(14px, 4vw, 40px) calc(12px + var(--safe-b));
  background: linear-gradient(180deg, #16202b, #0d141c);
  border-top: 1px solid var(--bronze-d);
  box-shadow: 0 -6px 22px rgba(0, 0, 0, .5);
  color: var(--ink); font-size: 13px; line-height: 1.45;
}
.cookie-consent .cc-text { flex: 1 1 260px; min-width: 0; }
.cookie-consent a { color: var(--brass-l); text-decoration: underline; }
.cc-actions { display: flex; gap: 10px; flex: 0 0 auto; margin-left: auto; }
.cc-btn {
  padding: 8px 20px; border-radius: 4px; cursor: pointer; font-size: 14px; font-weight: 600;
  border: 1px solid var(--brass-d); font-family: inherit;
}
.cc-primary { color: #1a1206; background: linear-gradient(180deg, var(--brass-l), var(--brass)); }
.cc-ghost { color: var(--ink); background: transparent; border-color: var(--bronze-d); }
@media (max-width: 520px) { .cc-actions { width: 100%; } .cc-btn { flex: 1; } }

/* Tag "Traditore" (chi ha lasciato la tua gilda) sulla scheda giocatore */
.pp-traitor { background: linear-gradient(180deg, rgba(196,60,40,.42), rgba(120,20,12,.38)); color: #ffccc2; border-color: var(--rust); font-weight: 700; letter-spacing: .3px; vertical-align: 2px; }

/* ---- Tutorial guidato (spotlight bloccante) --------------------------------
   4 pannelli fissi oscurano tutto attorno al rect del bersaglio: il bersaglio
   resta nativamente cliccabile (nessun re-dispatch), tutto il resto è bloccato.
   z=70: sopra chat/toast (45-50), sotto confirm (80) e skilltree (1200). */
.tut-overlay.hidden { display: none; }
.tut-panel { position: fixed; z-index: 70; background: rgba(10, 12, 18, .72); transition: top .2s ease, left .2s ease, width .2s ease, height .2s ease; }
/* Anello del buco geometrico: SPENTO (niente bordi/glow gialli — il contrasto
   del velo scuro basta). Il nodo resta per il posizionamento della bolla. */
.tut-ring { position: fixed; z-index: 71; pointer-events: none; display: none; }
.tut-bubble { position: fixed; z-index: 72; max-width: 300px; padding: 12px 36px 12px 16px; background: linear-gradient(180deg, #f7e8c4, #e9d09b); color: #241803; border: 2px solid #b98a3a; border-radius: 12px; box-shadow: 0 2px 0 rgba(255, 246, 220, .55) inset, 0 12px 34px rgba(0, 0, 0, .65), 0 0 0 1px rgba(0, 0, 0, .35); font-size: .95rem; line-height: 1.5; }
.tut-bubble > b { display: block; font-family: Cinzel, serif; font-size: 1.06rem; letter-spacing: .01em; margin-bottom: 4px; color: #1f1402; border-bottom: 1px solid rgba(122, 84, 24, .35); padding-bottom: 4px; }
.tut-bubble p { margin: 0; }
.tut-bubble p b { color: #6b3f06; }
.tut-bubble .ih-x { position: absolute; top: 6px; right: 6px; }
.tut-bubble #tut-ack { margin-top: 10px; }
.tut-bubble::after { content: ""; position: absolute; width: 0; height: 0; border: 9px solid transparent; }
.tut-bubble[data-side="bottom"]::after { top: -18px; left: var(--arrow-x, 24px); border-bottom-color: #f4e3bc; }
.tut-bubble[data-side="top"]::after { bottom: -18px; left: var(--arrow-x, 24px); border-top-color: #e8cf9a; }
.tut-bubble[data-side="left"]::after { left: -18px; top: 18px; border-right-color: #f4e3bc; }
/* Glow temporaneo sui contatori risorse del topbar (step "risorse") */
/* Glow risorse: SPENTO (i contatori si indicano con la bolla, senza aloni). */
.res.tut-glow { position: relative; }
/* Step "free": guida senza bloccare — pannelli spenti, resta solo anello+bolla
   (il giocatore deve poter usare picker/campi aperti fuori dal foro). */
.tut-overlay.tut-free .tut-panel { display: none; }
/* MODALITÀ ELEVAZIONE (preferita): velo unico full-screen + bersaglio ALZATO sopra
   di esso via z-index, con l'anello come box-shadow sull'elemento stesso — niente
   geometria da misurare, robusto a qualsiasi risoluzione/zoom/reflow. Se un antenato
   crea uno stacking context che impedisce l'elevazione, il motore ripiega da solo
   sui 4 pannelli geometrici. */
.tut-overlay.tut-elevate .tut-panel { display: none; }
.tut-overlay.tut-elevate .tut-ring { display: none; }
.tut-overlay.tut-elevate::before { content: ""; position: fixed; inset: 0; z-index: 70; background: rgba(10, 12, 18, .72); }
/* Anello via OUTLINE + drop-shadow: non tocca né box-shadow né border-radius
   dell'elemento — il bottone conserva la sua faccia (bevel d'ottone incluso). */
/* NB: niente `position` qui — un bersaglio già absolute (es. la pill btn-lvlup,
   lunga proprio perché absolute) collasserebbe. Se è static, ci pensa il JS.
   NIENTE outline/glow: il contrasto col velo scuro fa tutto il lavoro. */
.tut-elevated { z-index: 71 !important; }
/* Quando il bersaglio vive dentro uno stacking context (accordion z19, topbar sticky
   z20...), si eleva la SEZIONE intera sopra il velo — ma il suo CONTENUTO viene
   scurito da un velo interno (::after): resta in luce SOLO il bersaglio, che emerge
   sopra il velo interno. Contrasto identico al buco geometrico, zero geometria. */
.tut-sec-elevated { z-index: 71 !important; pointer-events: none !important; }
.tut-sec-elevated::after { content: ""; position: absolute; inset: 0; z-index: 5; background: rgba(10, 12, 18, .72); border-radius: inherit; pointer-events: none; }
.tut-sec-elevated .tut-elevated { pointer-events: auto !important; z-index: 6 !important; }
/* Catena di antenati del bersaglio dentro la sezione: chi crea uno stacking context
   intermedio (tile con transform/z-index…) terrebbe il bersaglio SOTTO il velo interno
   pur restando cliccabile — va alzato anche lui sopra il velo (z6). */
.tut-chain { z-index: 6 !important; }
/* Durante il tutorial anche il documento è inchiodato (non solo #views): su schermate
   basse il body poteva scorrere sotto l'overlay. */
html.tut-lock, html.tut-lock body { overflow: hidden !important; overscroll-behavior: none; }
/* Scroll bloccato negli step bloccanti: senza, scorrendo il bersaglio finiva sotto
   l'header sticky (foro lì, bottone coperto) e il tutorial restava murato. */
#views.tut-noscroll { overflow: hidden !important; }
/* Niente toast informativi mentre l'overlay tutorial è in scena: spuntavano sopra
   il footer e disturbavano la guida. Gli ERRORI restano visibili (es. coda piena,
   risorse insufficienti): senza, il giocatore non capirebbe perché il tap non fa nulla. */
#tut-overlay:not(.hidden) ~ .toasts .toast:not(.err) { display: none; }


/* ---- Dashboard GM "last gen": tendenze (sparkline), funnel onboarding, strumenti ---- */
.adm-trends { display: grid; grid-template-columns: repeat(auto-fill, minmax(128px, 1fr)); gap: 8px; }
.adm-trend { background: rgba(255, 255, 255, .035); border: 1px solid rgba(202, 162, 74, .18); border-radius: 8px; padding: 6px 8px 6px; display: flex; flex-direction: column; gap: 2px; }
.adm-trend-h { display: flex; justify-content: space-between; align-items: baseline; gap: 6px; }
.adm-trend .adm-dir { font-size: 10px; opacity: .7; }
.adm-spark { width: 100%; height: 34px; display: block; }
.adm-funnel { display: flex; flex-direction: column; gap: 4px; }
.adm-frow { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.adm-fl { flex: 0 0 96px; color: #b9c2d0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.adm-fbar { flex: 1; height: 9px; border-radius: 4px; background: rgba(255, 255, 255, .06); overflow: hidden; }
.adm-fbar i { display: block; height: 100%; border-radius: 4px; background: linear-gradient(90deg, #8a6a2a, #e9b54a); }
.adm-fn { flex: 0 0 66px; text-align: right; color: #e9c87e; font-size: 12px; }
.adm-fn small { color: #7d8aa0; font-weight: 400; }
.adm-tools { margin-top: 4px; }
.adm-tool-row { display: flex; gap: 8px; align-items: center; margin: 6px 0; }
.adm-audit { width: 100%; border-collapse: collapse; font-size: 12px; font-variant-numeric: tabular-nums; }
.adm-audit th { text-align: left; color: var(--ink-dim); font-weight: 600; padding: 4px 8px; border-bottom: 1px solid var(--bronze-d); }
.adm-audit td { padding: 4px 8px; border-bottom: 1px solid rgba(195,156,95,.12); }
.adm-input { flex: 1; min-width: 0; background: rgba(0, 0, 0, .25); border: 1px solid rgba(202, 162, 74, .3); border-radius: 8px; color: #e8edf5; padding: 6px 10px; font-size: 13px; text-transform: uppercase; }
.adm-input:focus { outline: none; border-color: #e9b54a; }


/* ---- Revisione UI 2026-07-11: rapporti a schermo intero, passi Logistica, flash card ---- */

/* Sottotitolo di orientamento sotto il titolo di pagina (Unità &co.). */
.view-sub { text-align: center; font-size: 12px; line-height: 1.5; color: var(--ink-dim);
  margin: -6px auto 12px; max-width: 480px; }

/* Rapporto a schermo intero: pagina overlay (non popup). Testata d'ottone + corpo
   scorrevole + footer con le azioni; su desktop resta una colonna centrata. */
/* Il rapporto è un PANNELLO a schermo intero, come la chat e la mappa: sta alla quota dei
   pannelli, e i riquadri che apre gli passano sopra (vedi `.confirm-overlay`). */
.report-overlay { position: fixed; inset: 0; z-index: var(--z-panel); display: flex; }
.report-backdrop { position: absolute; inset: 0; background: rgba(6,9,13,.72);
  backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); }
.report-page { position: relative; z-index: 1; flex: 1; display: flex; flex-direction: column;
  max-width: 640px; width: 100%; margin: 0 auto;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  box-shadow: 0 0 60px rgba(0,0,0,.65); animation: rise .18s ease; }
@media (min-width: 700px) {
  .report-page { margin: 24px auto; border: 1px solid var(--bronze-d); border-radius: var(--radius); overflow: hidden; }
}
/* RAPPORTO APERTO DALLA CHAT (11/08/2026): non è una pagina, è un popup SOPRA la ciurma.
   Due problemi in uno: la pagina rapporto sta a z-index 70 e la chat a 80, quindi da chat il
   rapporto finiva DIETRO; e a schermo intero ti buttava fuori dalla conversazione — mentre
   qui il rapporto è la cosa di cui si sta parlando, non una destinazione. Sopra la chat,
   centrato e ritagliato come il popup di conferma, così una toccata lo apre e una lo chiude
   senza mai perdere il filo del discorso. */
.report-overlay.rep-onchat { z-index: calc(var(--z-panel) + 1); align-items: center; justify-content: center;
  /* Sopra un filo d'aria, sotto NIENTE margine sprecato: la card può prendersi quasi tutto
     lo schermo e il lungo si scorre dentro, non si taglia sul velo. Niente ✕: si chiude
     toccando fuori, che è quello che uno prova per istinto. */
  padding: 24px 12px 8px; }
/* NIENTE CORNICE: resta la sola card, in sovrimpressione. La pagina-rapporto porta con sé una
   testata col titolo e una ✕, più un piede con «Chiudi»: attorno a un contenuto che È già una
   card diventano una scatola dentro una scatola, e due comandi per la stessa cosa. Si toglie
   tutto — il modo di chiudere è toccare fuori, che è quello che uno prova per istinto. */
.report-overlay.rep-onchat .report-head { display: none; }
.report-overlay.rep-onchat .report-foot:empty { display: none; }
.report-overlay.rep-onchat .report-page {
  flex: 0 1 auto; max-width: 520px; max-height: calc(100dvh - 32px - env(safe-area-inset-top, 0px));
  margin: 0; background: none; box-shadow: none; overflow: visible;
}
.report-overlay.rep-onchat .report-body { padding: 0; }
/* Il velo è più leggero della pagina intera: qui sotto c'è la conversazione, e deve restare
   riconoscibile — si sfoca, non si spegne. */
.report-overlay.rep-onchat .report-backdrop { background: rgba(6,9,13,.42); }
.report-head { flex: none; display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: calc(10px + env(safe-area-inset-top, 0px)) 14px 10px;
  border-bottom: 1px solid rgba(195,156,95,.28);
  background: linear-gradient(180deg, rgba(120,84,26,.22), rgba(0,0,0,.12)); }
.report-title { font-family: var(--font-display); font-size: 14px; letter-spacing: .4px; color: var(--brass-l);
  display: inline-flex; align-items: center; gap: 8px; }
.report-title .gi { width: 17px; height: 17px; }
/* `min-height: 0` è il fix del «contenuto tagliato e non scorribile»: in una colonna flex un
   figlio con overflow ha min-height:auto, quindi invece di scorrere ALLARGA la pagina oltre lo
   schermo e la coda sparisce sotto il bordo. `touch-action: pan-y` + overscroll contengono il
   gesto: lo scroll resta al pannello e non scivola al globo/alla vista sotto. */
.report-body { flex: 1; min-height: 0; overflow-y: auto; padding: 12px 12px 6px;
  -webkit-overflow-scrolling: touch; overscroll-behavior: contain; touch-action: pan-y; }
.report-body > .card { margin: 0; }
/* Storico: le card di rapporto avevano lo stesso gradiente della pagina (entrambi sfumano a
   panel-0) → si confondevano col fondo. Sfondo SOLIDO (non sfuma) + bordo bronzo netto su tutti i
   lati + ombra scura: ogni card stacca chiaramente dalla pagina. */
#history-overlay .report-body > .card {
  background: #1e2b37;   /* pannello SOLIDO, un gradino più chiaro del fondo pagina → stacca */
  border: 0;             /* NESSUN outline: separa già lo sfondo solido + l'ombra + lo spazio */
  box-shadow: 0 4px 16px rgba(0,0,0,.6);
  margin-bottom: 12px;
}
.report-body .rep-expand { display: none; }   /* dentro l'overlay il tasto "apri" non serve */
.report-foot { flex: none; display: flex; gap: 8px; padding: 11px 14px calc(12px + env(safe-area-inset-bottom, 0px));
  border-top: 1px solid rgba(195,156,95,.2); background: rgba(0,0,0,.22); }
.report-foot .btn { flex: 1; }
/* Senza azioni il piede è una barra vuota che ruba spazio al dossier (capita a chi non è in
   gilda: gli restano solo i comandi dentro la card). Se non c'è niente, non c'è la barra. */
.report-foot:empty { display: none; }

/* Storico imprese: stessa veste del Profilo invece dell'accento d'ottone dei rapporti di
   battaglia — niente glow, cornici slate, testata/piede senza fondo bronzeo e lo STESSO
   sfondo a gradiente blu del cielo (che nel Profilo traspare dietro le card). Scoped a
   #history-overlay così i veri rapporti di battaglia restano com'erano. */
/* Pelle «cielo» della pagina-overlay: Storico e Rapporto di spionaggio la condividono.
   Era scritta DUE VOLTE, identica, a ventotto righe di distanza — e due copie della stessa
   regola divergono al primo ritocco, che e' esattamente come nascono i «tremila stili». */
#history-overlay .report-page,
#history-overlay .report-head { background: transparent; border-bottom-color: var(--slate-3); }
#history-overlay .hist-tabs { border-bottom-color: var(--slate-3); }
#history-overlay .report-foot { background: transparent; border-top-color: var(--slate-3); }
@media (min-width: 700px) { #history-overlay .report-page { border-color: var(--slate-3); } }
/* Card dello Storico un po' distanziate (non adiacenti). Con il MARGINE, non flex: il flex
   column + overflow schiacciava le card (flex-shrink) tagliandone le griglie navi. */
#history-overlay #history-body > .card { margin-bottom: 10px; }
/* Condivise = spedizioni di gilda → sfondo ROSSO "dusk" come la tab Gilda (le altre tab blu). */
#history-overlay.hist-shared .report-page {
  background:
    radial-gradient(120% 75% at 50% 6%, #4a1e18 0%, #331512 40%, #1e0d0b 80%),
    linear-gradient(180deg, transparent 52%, rgba(150,52,26,.42) 84%, rgba(196,86,34,.34) 100%);
}
/* Su fondo rosso i bordi slate (bluastri) stonano → cornici in OTTONE come il resto del tema gilda. */
#history-overlay.hist-shared .report-head { border-bottom-color: var(--brass); }
#history-overlay.hist-shared .hist-tabs { border-bottom-color: var(--brass); }
#history-overlay.hist-shared .report-foot { border-top-color: var(--brass); }
@media (min-width: 700px) { #history-overlay.hist-shared .report-page { border-color: var(--brass); } }
/* NB: le card NON si colorano di rosso — come nella tab Gilda restano il pannello scuro di
   default e stanno SOPRA lo sfondo rosso "dusk". Solo la cornice del report è in ottone. */
/* Rapporto di SPIONAGGIO: stessa veste del Profilo (come lo Storico) — niente glow/gradiente
   d'ottone in testa, sfondo blu "cielo" e cornici slate. Il rapporto di BATTAGLIA resta bronzeo. */
#report-overlay.rep-intel .report-page {
  box-shadow: none;
  background:
    radial-gradient(120% 75% at 50% 6%, var(--sky-glow, #1a2c3a) 0%, var(--sky-1) 38%, var(--sky-0) 78%),
    linear-gradient(180deg, transparent 55%, rgba(74,58,30,.45) 86%, rgba(120,82,34,.30) 100%);
}
#report-overlay.rep-intel .report-head { background: transparent; border-bottom-color: var(--slate-3); }
/* La veste "Profilo" dell'intel dipinge un cielo sulla PAGINA: aperta dalla chat la pagina non
   esiste più (c'è solo la card), quindi quel cielo tornerebbe a essere la cornice appena tolta.
   Sta dopo la regola .rep-onchat, quindi va disinnescata qui — l'ordine è la specificità. */
#report-overlay.rep-intel.rep-onchat .report-page { background: none; }
#report-overlay.rep-intel .report-foot { background: transparent; border-top-color: var(--slate-3); }
@media (min-width: 700px) { #report-overlay.rep-intel .report-page { border-color: var(--slate-3); } }
/* Riga punteggi attacco/difesa (+ totale/personale nelle condivise): sotto ogni lato del
   rapporto di battaglia e nelle card spedizione. Globale: i rapporti compaiono anche in Attacco. */
.rep-scores { display: flex; flex-wrap: wrap; gap: 4px; margin: 4px 0; }
.rep-scores .chip { font-size: 11px; }
#history-overlay .rep-fleet { margin-top: 8px; }

/* Tasto "apri a schermo intero" in coda al nastro del rapporto (nascosto nell'overlay).
   Il verdetto conserva il suo margin-left:auto → l'impaginazione del nastro non cambia,
   il tasto si accoda semplicemente all'estrema destra. */
.rep-expand { flex: none; width: 26px; height: 26px; display: inline-flex;
  align-items: center; justify-content: center; cursor: pointer; border-radius: 8px;
  border: 1px solid rgba(255,255,255,.22); background: rgba(0,0,0,.25); color: inherit;
  font: inherit; font-size: 14px; line-height: 1; opacity: .85; }
.rep-expand:active { transform: translateY(1px); }

/* Flash di inquadratura: la notifica ti porta ALLA card giusta e la evidenzia con un breve velo
   caldo che SFUMA. NIENTE glow/alone (effetto che dà fastidio): solo il colore di sfondo. */
@keyframes repFlash { 0% { background-color: rgba(233,181,74,.20); } 100% { background-color: transparent; } }
.rep-flash { animation: repFlash 1.6s ease-out; border-radius: var(--radius); }

/* Testata di passo (Logistica): numerale su medaglione d'ottone + label maiuscoletto. */
.step-h { display: flex; align-items: center; gap: 8px; margin: 0 0 10px; }
.step-h.step-inline { display: inline-flex; margin: 0; }
.step-n { width: 21px; height: 21px; border-radius: 50%; flex: none; display: inline-flex;
  align-items: center; justify-content: center; font-family: var(--font-display);
  font-size: 11px; font-weight: 700; color: #2c1e06;
  background: linear-gradient(180deg, #f0cc79, #bd7d26);
  box-shadow: inset 0 1px 0 rgba(255,246,214,.55), 0 1px 3px rgba(0,0,0,.45); }
.step-lbl { font-family: var(--font-display); font-size: 12px; font-weight: 600;
  letter-spacing: .8px; text-transform: uppercase; color: var(--brass-l); }
.step-h .chip { margin-left: auto; }
.step-h.step-inline .chip { margin-left: 4px; }

/* Scelta azione Logistica: righe auto-esplicative (icona + titolo + descrizione),
   al posto dei tre bottoni muti con la spiegazione condivisa in piccolo sotto. */
.logi-acts { grid-template-columns: 1fr; gap: 6px; }
/* justify-content:flex-start: la base centra il contenuto → su desktop (riga più larga del
   testo) il blocco finiva in mezzo; così resta SEMPRE allineato a sinistra come su mobile. */
.logi-act { flex-direction: row; align-items: center; justify-content: flex-start; text-align: left; gap: 12px; padding: 10px 12px; }
.logi-act .la-ico { font-size: 18px; flex: none; width: 26px; display: inline-flex; justify-content: center; }
.logi-act .la-ico .gi { width: 22px; height: 22px; }
.logi-act .la-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.logi-act .la-lbl { font-size: 13px; white-space: nowrap; }
.logi-act .la-desc { font-size: 11px; line-height: 1.45; font-weight: 400; color: var(--ink-dim); white-space: normal; }
.logi-act.on .la-desc { color: var(--ink); opacity: .85; }

/* Azioni secondarie in card (es. "Richiama flotta"): allineate a destra, larghezza
   naturale — il full-width resta per le CTA primarie (`.card-actions .btn { flex:1 }`). */
.card-actions.right { justify-content: flex-end; }
.card-actions.right .btn { flex: 0 0 auto; }

/* ===== Evento Boss Mondiale: scheda del colosso ===== */
/* max-width capato anche al viewport: il grid `auto` di .confirm-overlay dimensiona la colonna
   alla content-width del figlio più largo e su schermi stretti (Android) faceva sforare il box
   oltre il bordo (X/«i»/bottoni tagliati). Il cap forza il riflow interno dentro lo schermo. */
/* Grande Ricerca (season): card dedicata a due viste + Riserva. Cornice ottone come le card
   di gioco, nessun glow (evidenza coi bordi). */
.gr-card { position: relative; border: 1px solid var(--rw-brass, var(--bronze-d));
  overflow: hidden; }
/* L'ILLUSTRAZIONE SOTTO TUTTA LA CARD. `object-position: top` perche' il soggetto sta in alto
   nel quadrato: centrandola si vedeva il tavolo e non il lavoro. La velatura e' verticale e
   piu' fitta in basso, dove il testo si accumula — un fondo dipinto sotto una colonna di cifre
   e' illeggibile, e la Riserva e' tutta cifre. */
.gr-card .gr-bg { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 0;
  object-fit: cover; object-position: center 38%; }
.gr-card::before { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(180deg, rgba(9,13,18,.46) 0%, rgba(9,13,18,.80) 42%, rgba(9,13,18,.92) 100%); }
.gr-card > *:not(.gr-bg) { position: relative; z-index: 2; }
.gr-card .gr-head { display: flex; align-items: center; gap: 8px; }
/* IL TASTO «i» E' UN FIGLIO DELLA RIGA, non un francobollo appiccicato sopra. Era `absolute`
   con `top: 8px`, e il suo riferimento non era la card ma la TESTATA — alta 23px contro i 22
   del tasto: otto pixel di sbalzo lo facevano sporgere di sette sotto il titolo, storto
   rispetto a tutto il resto. Dentro il flex si centra da solo, sempre, a qualunque corpo del
   titolo; `margin-left: auto` lo tiene a destra e il `padding-right` posticcio non serve piu'. */
.gr-card .gr-head .gr-info-btn { position: static; margin-left: auto; flex: none; }
.gr-card .gr-head h3 { margin: 0; font-family: var(--font-display); letter-spacing: .3px; color: var(--brass-l); }
.gr-ico { font-size: 18px; line-height: 1; }
/* AZZURRO, non ottone: la Grande Ricerca e' l'unica cosa di casa in una card che parla del
   Mondo Rosso, e il colore lo dice prima del testo. La maschera e la tinta stanno lassu' con le
   altre `.gi-tint` — qui resta solo la misura. Prima erano ricopiate a mano proprio qui, e per
   qualche giorno il microscopio della Logistica e quello di Isola ▸ Ricerche sono stati due
   oggetti diversi che si somigliavano. */
.gr-ico-lab .gi { width: 20px; height: 20px; }
/* IL TASTINO DELL'ALBO, sulla riga di «Migliori contributori». Deve stare DENTRO l'altezza di
   quella scritta e non spostare niente: la card della Riserva e' gia' fitta di barre, e un
   tasto che aggiunge una riga o un margine la sfalsa tutta. Nessun fondo, nessun bordo — solo
   il glifo, che si accende avvicinandosi. */
.gr-albo-btn { background: none; border: 0; padding: 0 2px; margin: 0; line-height: 1;
  color: var(--viola-l); opacity: .75; cursor: pointer; font-size: 11px; }
.gr-albo-btn:hover, .gr-albo-btn:active { opacity: 1; }
.gr-albo-btn .gi { width: 12px; height: 12px; vertical-align: -2px; }
/* L'ALBO. Stessa livrea della Grande Ricerca — viola e microscopio azzurro — perche' e' la
   stessa impresa vista da vicino, e una schermata figlia che cambia colore sembra un'altra cosa. */
..gr-albo-titolo { display: inline-flex; align-items: center; gap: 8px; color: var(--viola-l);
  font-family: var(--font-display); letter-spacing: .3px; }
.gr-albo-titolo .gi { width: 20px; height: 20px; }
.gr-albo { max-height: 62vh; overflow-y: auto; margin: 2px 0; }
.gr-albo-riga { padding: 8px 10px; margin-bottom: 6px; border-radius: 8px;
  border: 1px solid var(--viola);
  background: linear-gradient(180deg, #241733 0%, #1a1224 100%); }
.gr-albo-capo { display: flex; align-items: baseline; gap: 8px; }
.gr-albo-pos { flex: none; min-width: 20px; text-align: right; font-size: 10px;
  color: var(--viola-l); opacity: .7; font-variant-numeric: tabular-nums; }
.gr-albo-nome { flex: 1; min-width: 0; font-size: 13px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.gr-albo-nome .subtle { font-size: 11px; }
.gr-albo-tot { flex: none; color: var(--viola-l); font-variant-numeric: tabular-nums; }
/* Il dettaglio rientra sotto il nome, allineato alla colonna del nome e non al numero: si legge
   come una nota di quella riga, non come una riga nuova. */
.gr-albo-det { display: flex; flex-wrap: wrap; gap: 10px; margin: 4px 0 0 24px;
  font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.gr-albo-res { display: inline-flex; align-items: center; gap: 4px; }
.gr-albo-piede { display: flex; justify-content: space-between; align-items: center; gap: 10px;
  flex-wrap: wrap; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--viola);
  font-size: 11px; color: var(--viola-l); font-variant-numeric: tabular-nums; }
.gr-info-btn { position: absolute; top: 8px; right: 8px; }
.gr-sub { font-size: 11px; margin: 4px 0 2px; line-height: 1.45; }
/* IL VARCO INSTABILE: il Portale è acceso ma non ancora attraversabile. Riquadro rientrato
   con conto alla rovescia e barra di stabilizzazione — una promessa con una data, non un
   «presto». Nessun bagliore: bordo sinistro d'ottone e velatura scura. */
.gr-portal-wait { margin-top: 10px; padding: 8px 10px; border-radius: 8px;
  border: 1px solid var(--bronze-d); border-left: 3px solid var(--brass);
  background: linear-gradient(180deg, rgba(233,181,74,.07), rgba(0,0,0,.2)); }
.gr-portal-wait .js-cd { color: var(--amber-l); font-family: var(--font-display); font-size: 14px; }
.gr-portal-lore { margin-top: 6px; font-size: 11px; font-style: italic; opacity: .85; line-height: 1.45; }
.gr-reserve { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--slate-3); }
.gr-bar-row { margin: 4px 0; }
.gr-contribs { margin-top: 8px; }
.gr-load { margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--slate-3); }
.gr-load-row { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.gr-load-f { display: flex; align-items: center; gap: 4px; background: rgba(0,0,0,.18);
  border: 1px solid var(--slate-3); border-radius: 4px; padding: 2px 6px; }
.gr-load-f input { width: 76px; border: none; background: transparent; color: var(--ink);
  font-size: 13px; outline: none; }
.gr-info p { margin: 0 0 8px; font-size: 12px; line-height: 1.5; }
.gr-info p:last-child { margin-bottom: 0; }
/* Quarta azione della Logistica: «La Grande Ricerca». Staccata dalle tre sopra da un filetto —
   si vede che non è una consegna qualsiasi. Compare solo a Riserva aperta. */
.logi-acts-gr { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--slate-3); }
/* VIOLA, non ottone. Per un pezzo ha portato cuoio e ottone, e bastava: le serviva solo a
   distinguersi dalle tre consegne blu-ardesia qui sopra. Poi sotto le e' arrivato il Varco in
   ruggine, e l'ottone e' il colore di TUTTO il resto del gioco: in un gruppo di due righe
   staccate, quella d'ottone si legge come la riga normale e quella ruggine come l'eccezione.
   La Grande Ricerca non e' la riga normale: e' l'impresa che apre un mondo. Il viola non lo porta
   nient'altro nell'interfaccia, quindi non lo si confonde con niente, e sta accanto alla ruggine
   senza litigarci — sono i due capi della stessa season, l'arcano e l'altrove.
   Stessa ricetta di sempre: alone in alto, campitura che scende, colore e bordo. Nessun bagliore.
   Velato, non pieno: sotto ci sono due righe di testo, e un fondo saturo se le mangia. */
.logi-act.gr-act { background:
    radial-gradient(120% 60% at 50% -10%, rgba(122, 82, 168, .30), transparent 70%),
    linear-gradient(180deg, #241733 0%, #1a1224 100%);
  border: 1px solid var(--viola); align-items: flex-start; }
.logi-act.gr-act.on { border-color: var(--viola-l); background:
    radial-gradient(120% 60% at 50% -10%, rgba(154, 104, 206, .38), transparent 70%),
    linear-gradient(180deg, #2f1e45 0%, #221632 100%); }
.logi-act.gr-act .la-lbl { color: var(--viola-l); font-family: var(--font-display); letter-spacing: .4px; }
.logi-act.gr-act .la-ico { opacity: .95; }
/* Il filo caldo in cima al bottone selezionato arriva da `.logi-act.on`, dove e' giusto: li' il
   fondo e' d'ambra. Su una campitura viola era l'unica cosa color crema della riga, e si vedeva
   solo lui. Lo si ritinge, non lo si spegne: senza, la riga scelta perde il rilievo. Il `:not`
   c'e' perche' sotto la Ricerca sta il Varco, che di questa livrea non prende niente. */
.logi-act.gr-act.on:not(.varco-act) { box-shadow: inset 0 1px 0 rgba(226, 205, 246, .22); }
/* IL VARCO NON E' D'OTTONE. Nel resto del gioco l'altrove e' ruggine — il globo, la barra della
   caccia, il cielo di la' — e con lo stesso fondo delle altre l'unica riga che ti sposta di mondo
   si leggeva come una consegna merci con un'icona diversa.
   Stessa ricetta, tinta cambiata: un alone caldo in alto e una campitura che scende. La ruggine
   e' velata, non piena: sotto ci sono due righe di testo, e un fondo saturo se le mangia. */
.logi-act.gr-act.varco-act { background:
    radial-gradient(120% 60% at 50% -10%, rgba(160, 58, 38, .30), transparent 70%),
    linear-gradient(180deg, #2c1512 0%, #1e1210 100%);
  border-color: var(--rust); }
.logi-act.gr-act.varco-act.on { border-color: var(--rust-l); background:
    radial-gradient(120% 60% at 50% -10%, rgba(190, 74, 48, .38), transparent 70%),
    linear-gradient(180deg, #3a1a14 0%, #241413 100%); }
.logi-act.gr-act.varco-act .la-lbl { color: var(--rust-l); }
.logi-act.gr-act.varco-act .gr-act-dest { color: var(--rust-l); }
/* Riga «destinazione fissa: <capogilda>»: si legge prima di entrare, così nessuno cerca
   una destinazione che non c'è da scegliere. */
.gr-act-dest { display: block; margin-top: 4px; font-size: 10px; color: var(--viola-l); opacity: .92; }
.gr-act-dest b { color: var(--ink); }
.boss-box { max-width: min(460px, calc(100vw - 44px));
  display: flex; flex-direction: column;
  max-height: calc(100vh - 48px); max-height: calc(100dvh - 48px); }
/* Su schermi bassi il contenuto (lore + HP + lista cannonieri) eccedeva il viewport e finiva
   tagliato: X e info restano pinnati sul box (position:absolute), qui scrolla solo il corpo. */
.boss-scroll { overflow-y: auto; overflow-x: hidden; min-height: 0;
  -webkit-overflow-scrolling: touch; overscroll-behavior: contain; }
/* Ritratto del colosso nella scheda: frame grande, illustrazione del miriapode intera. */
.boss-av { width: 96px; height: 96px; display: inline-flex; align-items: center; justify-content: center; overflow: hidden; }
.boss-av .av-img { max-width: 512px; max-height: 512px; width: 100%; height: 100%;
  object-fit: cover; object-position: center; }
.boss-ico { font-size: 30px; line-height: 1; filter: drop-shadow(0 2px 4px rgba(0,0,0,.6)); }
.boss-tag-alive { background: rgba(196,60,40,.28); color: #ffb3a6; border: 1px solid rgba(226,80,63,.55); }
.boss-tag-dead  { background: rgba(120,128,140,.22); color: #c9cfd8; border: 1px solid rgba(150,158,170,.4); }
/* Testata: lascio spazio a destra per la X + tasto info impilati, e il titolo VA A CAPO
   (col tag EMERSO/ABBATTUTO) invece di finire sotto i due tasti. */
.boss-box .pp-head.boss-head { padding-right: 40px; }
.boss-head-t { min-width: 0; }
.boss-head-t h3 { white-space: normal; overflow-wrap: anywhere; line-height: 1.25; }
.boss-head-t h3 .fr-tag { white-space: nowrap; }
.boss-lore { font-size: 12px; color: var(--ink-dim); margin: 6px 0 12px; line-height: 1.55; }
.boss-lore p { margin: 0 0 6px; }
.boss-lore p:last-child { margin-bottom: 0; }
.boss-hp { margin: 4px 0 12px; }
/* SOLO una linea rossa piena + percentuale vita al centro (bianca). Niente tacche né numeri grezzi. */
.boss-hp-bar { position: relative; height: 22px; border-radius: 8px; background: rgba(0,0,0,.6);
  border: 1px solid rgba(226,80,63,.5); overflow: hidden; box-shadow: inset 0 2px 6px rgba(0,0,0,.55); }
.boss-hp-bar i { display: block; height: 100%; background: linear-gradient(180deg, #ff5a46, #8e2416);
  border-radius: 4px; transition: width .6s ease; }
.boss-hp-pct { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 700; color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,.85);
  font-variant-numeric: tabular-nums; pointer-events: none; }
.boss-hp-num { text-align: center; font-size: 13px; margin-top: 4px; font-variant-numeric: tabular-nums; color: #ff8a72; }
.boss-hp-num b { color: #ffd7c8; font-family: var(--font-display); letter-spacing: .3px; }
.boss-hp-num .gi { width: 13px; height: 13px; vertical-align: -2px; }
.boss-hp-time { text-align: right; font-size: 11px; margin-top: 4px; font-variant-numeric: tabular-nums; }
/* Migrazione: riga countdown sotto la barra HP (prossima sparizione / riemersione). */
/* Flusso inline (NON flex): icona + testo su una riga che va a capo come un paragrafo,
   mai spezzato in due colonne. Il timer resta compatto (niente "5h" / "59m" a capo). */
.boss-move { display: block; margin-top: 4px; font-size: 12px; line-height: 1.35; }
.boss-move .gi { width: 12px; height: 12px; display: inline-block; vertical-align: -1px; margin-right: 4px; }
.boss-move .timer { white-space: nowrap; }
/* Tasto info (regole evento) SOTTO la X, stessa veste tonda. */
.boss-rules-btn { top: 46px !important; font-style: normal; font-weight: 700; }
.boss-loot { font-size: 13px; margin: 8px 0; padding: 8px 10px; border-radius: 8px;
  background: rgba(120,84,26,.14); border: 1px solid var(--bronze-d); }
.boss-mythic { color: #e7627a; font-weight: 700; }
.boss-prev { font-size: 12px; margin-top: 6px; color: var(--ink); }
.boss-contrib { margin-top: 10px; font-size: 12px; }
.boss-top-row { display: flex; align-items: center; gap: 6px; padding: 2px 0; }
.boss-top-row b { margin-left: auto; font-variant-numeric: tabular-nums; }
.boss-top-row.mine { color: var(--amber-l); }
.boss-cta { margin-top: 12px; gap: 8px; flex-wrap: wrap; }
/* min-width:0 = i bottoni possono stringersi sotto il loro min-content e mandare il testo a capo
   (come "Spia la carcassa"): senza, su Android — dove il box è un filo più stretto — forzavano il
   riquadro più largo del viewport e X/«i»/«Manda i cargo» finivano tagliati fuori a destra. */
.boss-cta .btn { flex: 1 1 130px; min-width: 0; }

/* ============ Storico ▸ Pinnacolo: rapporto settimanale di guerra ============ */
.wrp-standings { margin-top: 8px; }
.wrp-standings .lb-val { text-align: right; line-height: 1.25; }
.wrp-elo { font-size: 11px; font-weight: 700; font-variant-numeric: tabular-nums; }
.wrp-elo.up { color: var(--good); }
.wrp-elo.dn { color: var(--rust); }
.wrp-elo.eq { color: var(--ink-dim); }
.wrp-promo { color: var(--good); border-color: color-mix(in srgb, var(--good) 45%, transparent); }
.wrp-releg { color: var(--rust); border-color: color-mix(in srgb, var(--rust) 45%, transparent); }
.wrp-mvp { color: var(--amber-l); border-color: color-mix(in srgb, var(--amber) 55%, transparent); }
.wrp-hls { margin-top: 10px; border-top: 1px solid rgba(233,220,190,.10); padding-top: 8px; }
.wrp-hl { font-size: 12px; padding: 2px 0; color: var(--ink); }
.wrp-hl-t { color: var(--ink-dim); font-variant-numeric: tabular-nums; margin-right: 4px; }

/* ============ Aiuto ▸ leggenda "code e limiti" ============ */
.lim-legend { margin: 10px 0 4px; border: 1px solid var(--bronze-d); border-radius: 8px;
  background: color-mix(in srgb, var(--panel-0) 70%, transparent); overflow: hidden; }
.lim-head { padding: 10px 12px; border-bottom: 1px solid rgba(233,220,190,.10);
  background: linear-gradient(180deg, rgba(233,181,74,.07), transparent); }
.lim-head b { display: block; color: var(--amber-l); font-size: 13px; }
.lim-head small { display: block; margin-top: 2px; font-size: 11px; }
.lim-list { display: flex; flex-direction: column; }
.lim-row { display: flex; align-items: center; gap: 10px; padding: 8px 12px; }
.lim-row + .lim-row { border-top: 1px solid rgba(233,220,190,.06); }
.lim-ic { flex: none; width: 26px; height: 26px; display: grid; place-items: center;
  color: var(--brass-l); font-size: 14px; opacity: .95; }
.lim-tx { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; line-height: 1.2; }
.lim-tx b { font-size: 12px; color: var(--ink); }
.lim-tx small { font-size: 10px; margin-top: 1px; }
.lim-badge { flex: none; display: flex; flex-direction: column; align-items: flex-end;
  text-align: right; min-width: 62px; }
.lim-badge b { font-size: 14px; color: var(--amber-l); font-variant-numeric: tabular-nums; line-height: 1; }
.lim-badge small { font-size: 10px; text-transform: uppercase; letter-spacing: .3px; color: var(--ink-dim); margin-top: 2px; }

/* Pinnacolo report ▸ il bilancio PERSONALE del giocatore */
.wrp-me { margin-top: 10px; padding: 8px 10px; border-radius: 8px;
  border: 1px solid color-mix(in srgb, var(--amber) 30%, var(--bronze-d));
  background: color-mix(in srgb, var(--amber) 6%, transparent); }
.wrp-me-row { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.wrp-me-cost { margin-top: 6px; }
/* Stima materiali persi: solo icona + valore, i 3 su una sola riga orizzontale (niente chip). */
.wrp-cost-row { display: flex; align-items: center; gap: 16px; margin-top: 2px; flex-wrap: nowrap; }
.wrp-cost-i { display: inline-flex; align-items: center; gap: 4px; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Tesoro di Gilda ▸ crediti dalla Guerra del Pinnacolo */
.tg-war { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px;
  padding-top: 8px; border-top: 1px solid rgba(233,220,190,.08); }
.tg-war > b { color: var(--amber-l); font-variant-numeric: tabular-nums; }
.tg-war-up { font-size: 11px; font-weight: 700; color: var(--good); padding: 1px 6px; border-radius: 999px;
  border: 1px solid color-mix(in srgb, var(--good) 45%, transparent);
  background: color-mix(in srgb, var(--good) 12%, transparent); animation: tgUpIn .4s ease; }
.tg-war-hint { flex-basis: 100%; font-size: 11px; margin-top: 2px; }
@keyframes tgUpIn { from { opacity: 0; transform: translateY(-3px); } to { opacity: 1; transform: none; } }

/* Cancellazione account (Impostazioni, sotto Esci) */
.acc-del { text-align: center; margin-top: 10px; }
.acc-del-link { font-size: 12px; color: var(--ink-dim); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
.acc-del-link:hover { color: var(--ink); }
.acc-del-link.danger { color: color-mix(in srgb, var(--rust) 80%, var(--ink-dim)); }
.acc-del-link.danger:hover { color: var(--rust); }
.acc-del.scheduled { margin-top: 12px; padding: 10px 12px; border-radius: 8px; text-align: left;
  border: 1px solid color-mix(in srgb, var(--rust) 45%, var(--bronze-d));
  background: color-mix(in srgb, var(--rust) 8%, transparent); font-size: 12px; color: var(--ink); line-height: 1.4; }
.acc-del.scheduled .acc-del-link { color: var(--amber-l); }

/* Classifica donazioni: riepilogo Pinnacolo (crediti al tesoro dalla guerra) */
/* Riga Pinnacolo: STESSA griglia a colonne delle righe classifica (rank·nome·lvl·donato)
   così "1 guerra" si allinea sotto LIV. e i crediti sotto DONATO. */
.dl-pinn { display: flex; align-items: center; gap: 10px;
  margin: 2px 0 8px; padding: 8px 16px; border-radius: 8px;
  border: 1px solid color-mix(in srgb, var(--amber) 30%, var(--bronze-d));
  background: color-mix(in srgb, var(--amber) 7%, transparent); font-size: 12px; }
.dl-pinn .dl-lvl { white-space: nowrap; color: var(--ink); }
.dl-pinn-lbl { color: var(--amber-l); font-weight: 500; }
.dl-pinn-stats { color: var(--ink); font-variant-numeric: tabular-nums; }

/* --- Lingue / nazionalità (feature bandiere) --------------------------------- */
.lang-pick { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
/* Lingua del gioco: una riga sola, scorribile in orizzontale quando le lingue crescono
   (come lo switcher isole). Le chip non si restringono. */
.lang-scroll { flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: none;
  -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; padding-bottom: 2px; }
.lang-scroll::-webkit-scrollbar { display: none; }
.lang-scroll .lang-chip { flex: 0 0 auto; scroll-snap-align: start; }
.set-lang-row { margin-top: 10px; }
.set-lang-lbl { display: block; font-size: 12px; }
.lang-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 8px; border-radius: 999px;
  border: 1px solid var(--line); background: rgba(255,255,255,.03); color: var(--ink);
  font-size: 12px; cursor: pointer; transition: border-color .12s, background .12s; }
.lang-chip .lang-nm { font-size: 11px; color: var(--muted); }
.lang-chip.on { border-color: var(--amber); background: color-mix(in srgb, var(--amber) 14%, transparent); }
.lang-chip.on .lang-nm { color: var(--amber-l); }
.lang-chip[disabled] { opacity: .4; cursor: default; }
.lang-chip.lang-clear { color: var(--muted); }
.lang-flag { white-space: nowrap; font-size: 16px; line-height: 1; }
.lang-flag .lang-nm { font-size: 11px; color: var(--muted); margin-left: 2px; vertical-align: middle; }
.gc-langs { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; }
/* Bandiera nazionalità: emoji-paese ingrandita e centrata verticalmente sul testo */
.pp-flag { font-size: 1.4em; line-height: 1; vertical-align: -0.18em; margin-left: 1px; }
/* Profilo: bandiera nazionalità accanto al conteggio isole */
.pid-side { display: inline-flex; align-items: center; gap: 8px; margin-left: auto; }
.pid-flag { font-size: 18px; line-height: 1; }  /* nazionalità: solo bandiera, a destra (scelta in Impostazioni) */
.pid-lang { background: none; border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px;
  cursor: pointer; color: var(--ink); font-size: 18px; line-height: 1.2; }
.pid-lang .subtle { font-size: 12px; }  /* il prompt "Lingua" resta piccolo, solo la bandiera è grande */
.pid-lang-pick { margin-top: 8px; }
/* Tabella Mondo: colonna bandiera stretta tra gilda e coordinate */
.mtable th.c-flag, .mtable td.c-flag { width: 30px; text-align: center; padding-left: 2px; padding-right: 2px; }
.dt-flag { font-size: 18px; line-height: 1; display: inline-block; }

/* ==== Piani di Guerra: bacheca di coordinamento attacchi di gilda ==== */
/* Il bottone d'ingresso usa lo stesso .btn-bronze a tutta larghezza della chat di gilda */
.wp-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--rust); display: inline-block; }
.wp-pend { background: var(--rust); color: #fff; border-radius: 999px; font-size: 11px;
  min-width: 17px; height: 17px; line-height: 17px; text-align: center; padding: 0 4px; font-weight: 700; }

/* Lista piani */
.wp-plan { cursor: pointer; padding: 10px 12px; }
.wp-plan:hover { border-color: var(--brass); }
.wp-plan-top { font-family: var(--font-display); font-size: 14px; display: flex; align-items: center; gap: 8px; }
/* La gilda del bersaglio al bordo destro della card (stemma + tag), il volto a sinistra. */
.wp-plan-gld { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; }
/* Piano archiviato: nota minima in basso a destra, sulla riga dell'autore. Verde la missione
   compiuta, rossa la fallita (nessuna vittoria a colpi portati), neutra la chiusura a vuoto. */
.wp-plan-sub { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.wp-plan-arch { margin-left: auto; color: var(--good); }
.wp-plan-arch.wp-arch-ko { color: var(--rust-l); }
.wp-plan-arch.wp-arch-nt { color: var(--ink-dim); }
.wp-plan-top .av-slot.av-sm { flex: none; }
.wp-tgt-gld { margin-left: auto; display: inline-flex; align-items: center; gap: 4px; }
.wp-plan-meta { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; align-items: center; }
.wp-plan-sub { margin-top: 4px; font-size: 12px; }
.wp-hist-head { margin: 12px 2px 6px; text-transform: uppercase; letter-spacing: .06em; font-size: 11px; }

/* Strip "I tuoi incarichi" (pendenti) */
.wp-mine { border-color: color-mix(in srgb, var(--amber) 45%, var(--line)); }
.wp-mrow { display: flex; align-items: center; gap: 8px; padding: 6px 2px; border-top: 1px solid var(--line); flex-wrap: wrap; }
.wp-mrow-txt { flex: 1 1 200px; min-width: 0; font-size: 13px; }
.wp-mrow-act { display: flex; gap: 6px; }

/* Dettaglio piano */
.wp-head-card { padding: 10px 12px; }
/* Tasto Mappa di guerra: stesso box dorato del tasto mappa sulle card Azioni (.ac-map-btn),
   angolo alto-destra della testata piano. Icona-solo, coerente col resto del gioco, no glow. */
.wp-head-card { position: relative; }
.wp-head-card .card-body, .wp-head-card .wp-plan-meta { padding-right: 40px; }
/* MAPPA DI GUERRA (17/08/2026): era l'unico tasto CREMA PIENO del gioco — una pillola bianca
   appiccicata sull'angolo di una card scura, con dentro un globo azzurrino che quasi non si
   leggeva sul fondo chiaro. Ora e' un comando come gli altri: scocca d'ottone scuro, filo di
   bronzo, angoli a 4px, e il globo TINTO d'ottone (gi-tint) invece dei suoi colori originali. */
.wp-map-btn {
  position: absolute; top: 10px; right: 10px; z-index: 3;
  width: 32px; height: var(--btn-h-sm); display: grid; place-items: center;
  background: radial-gradient(120% 120% at 30% 20%, var(--panel-2), var(--panel-0));
  border: 1px solid var(--bronze-d); border-radius: 4px; cursor: pointer;
  color: var(--brass-l);
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 2px 5px rgba(0,0,0,.4);
}
.wp-map-btn .gi { width: 18px; height: 18px; background-color: var(--brass-l); }
.wp-map-btn:hover { border-color: var(--brass); }
.wp-map-btn:active { transform: translateY(1px); }
.wp-disclaimer { margin-top: 8px; font-size: 12px; }
.wp-target { padding: 10px 12px; margin-top: 10px; }
.wp-tgt-top { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 6px; }
.wp-cur { font-size: 11px; border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; color: var(--ink-dim); }
.wp-cur.wp-no { color: var(--rust); border-color: color-mix(in srgb, var(--rust) 50%, var(--line)); }
.wp-arow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 6px 0; border-top: 1px solid var(--line); position: relative; }
.wp-arow-id { display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.wp-anm { font-size: 13px; }
.wp-anm.wp-me { color: var(--amber-l); font-weight: 600; }
.wp-arow-bt { flex: 1 1 160px; min-width: 0; display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wp-arow-act { display: flex; gap: 6px; }
.wp-st { font-size: 11px; border-radius: 999px; padding: 2px 8px; border: 1px solid var(--line); }
.wp-st.wp-ok, .wp-bt.wp-ok { color: var(--good); border-color: color-mix(in srgb, var(--good) 45%, var(--line)); }
.wp-st.wp-no, .wp-bt.wp-no { color: var(--rust); border-color: color-mix(in srgb, var(--rust) 45%, var(--line)); }
.wp-st.wp-wait, .wp-bt.wp-wait { color: var(--amber-l); border-color: color-mix(in srgb, var(--amber) 40%, var(--line)); }
.wp-bt { font-size: 12px; border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; }
.wp-bt.wp-volo { color: var(--amber-l); border-color: color-mix(in srgb, var(--amber) 40%, var(--line)); }
.wp-bt .gi { width: 13px; height: 13px; }
.wp-loot { display: inline-flex; gap: 6px; align-items: center; }
.wp-ax { background: none; border: none; color: var(--muted); cursor: pointer; font-size: 14px; padding: 2px 6px; margin-left: auto; }
.wp-ax:hover { color: var(--rust); }
.wp-tgt-foot { margin-top: 6px; }
.wp-picker { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }

/* Wizard */
/* Le card del wizard vivono nell'overlay #warplan-body, FUORI da #views: non ricevono la
   cornice uniforme della "plancia d'ottone" e ricadrebbero sul rail d'ottone 3px a sinistra
   dello stile base. Le riallineiamo al resto del gioco: bordo uniforme brass, niente rail. */
.wp-wcard, .wp-wsel { border: 1px solid var(--rw-brass, #6d4f24); border-radius: 4px; }
/* I Piani di Guerra sono uno strumento di GILDA → l'overlay usa lo STESSO sfondo rosso
   "dusk" della tab Gilda (ricetta identica a body.tab-gilda .sky, già riusata dallo
   Storico Condivise) con cornici in ottone. Le card restano il pannello scuro sopra. */
#warplan-overlay .report-page {
  box-shadow: none;
  background:
    radial-gradient(120% 75% at 50% 6%, #4a1e18 0%, #331512 40%, #1e0d0b 80%),
    linear-gradient(180deg, transparent 52%, rgba(150,52,26,.42) 84%, rgba(196,86,34,.34) 100%);
}
#warplan-overlay .report-head { background: transparent; border-bottom-color: var(--brass); }
#warplan-overlay .report-foot { background: transparent; border-top-color: var(--brass); }
@media (min-width: 700px) { #warplan-overlay .report-page { border-color: var(--brass); } }
/* Lista piani: card distanziate (il reset .report-body>.card le incollerebbe). */
#warplan-body > .wp-plan { margin-bottom: 10px; }
/* Le card dell'overlay vivono FUORI da #views: non ricevono il bevel di plancia della tab
   Gilda. Lo riportiamo qui identico (stesso gradiente + luci incise), così il salto
   tab→overlay non cambia materiale. Le card "di guerra" (campagna, incarichi miei, quadro
   di comando) tengono l'identità ROSSA: stesso bevel ma su fondo ruggine scuro. */
#warplan-body .card {
  background: linear-gradient(180deg, #1a2029, #12140f);
  box-shadow: inset 0 1px 0 rgba(240,209,138,.16), inset 0 -3px 8px rgba(0,0,0,.5), 0 2px 8px rgba(0,0,0,.45);
  /* Bordo UNIFORME su OGNI card dell'overlay (lista piani inclusa): il rail mono-lato
     del .card base qui non deve MAI comparire. */
  border: 1px solid var(--rw-brass, #6d4f24); border-radius: 4px;
}
#warplan-body .wp-campaign, #warplan-body .wp-mine, #warplan-body .wp-board {
  background: linear-gradient(180deg, #231a19, #150f0e);
}
/* Testate card dei Piani di Guerra: il .card-head base è space-between e spediva il titolo
   all'estrema destra (icona orfana a sinistra — leggeva come rotto). Qui icona+titolo stanno
   INSIEME a sinistra, in Cinzel ottone come le altre testate di plancia; l'eventuale chip
   conteggio resta appoggiata a destra. Filo sottile sotto per staccare la testata dal corpo. */
#warplan-body .card-head { justify-content: flex-start; gap: 6px; margin-bottom: 8px;
  padding-bottom: 6px; border-bottom: 1px solid var(--line);
  font-family: var(--font-display); font-size: 13px; letter-spacing: .05em; color: var(--brass-l); }
#warplan-body .card-head .gi { width: 15px; height: 15px; flex: 0 0 auto; }
#warplan-body .card-head .chip { margin-left: auto; letter-spacing: 0;
  font-family: "Segoe UI", system-ui, -apple-system, Roboto, "Helvetica Neue", Arial, sans-serif; }
/* L'identità rossa "guerra" delle testate campagna/quadro di comando vince sull'ottone. */
#warplan-body .card-head.wp-red-head { color: color-mix(in srgb, var(--rust) 60%, var(--ink)); }
/* Respiro tra le tre step-card (il reset .report-body > .card { margin:0 } le incollava). */
.report-body > .wp-wcard { margin: 0 0 12px; }
/* Card del DETTAGLIO piano: stessa cura del wizard. Il .card base ha un rail 3px a SINISTRA
   (border-left bronzo) che l'utente detesta → bordo UNIFORME su tutti i lati; e margine tra le
   card (il reset .report-body>.card le incollava, leggeva come "ai slop"). */
.wp-head-card, .wp-target, .wp-campaign, .wp-mine { border: 1px solid var(--rw-brass, #6d4f24); }
.wp-mine, .wp-campaign { border-color: color-mix(in srgb, var(--rust) 40%, var(--rw-brass, #6d4f24)); }
.report-body > .wp-head-card, .report-body > .wp-target, .report-body > .wp-campaign { margin: 0 0 12px; }
/* Etichetta di sezione (es. «Incarichi»): dà gerarchia, così le card non paiono buttate lì. */
.wp-sec-label { display: flex; align-items: center; gap: 6px; margin: 2px 2px 8px;
  font-family: var(--font-display); font-size: 12px; letter-spacing: .07em; text-transform: uppercase; color: var(--ink-dim); }
.wp-sec-label .gi { width: 13px; height: 13px; }
/* «Tutte/All» dei selettori navi: il vestito del moltiplicatore ×N (corpo 10px, ambra su bordo
   bronzo) ma con una classe SUA e l'etichetta FISSA — il repaint globale di `step-mag` riscrive
   il testo a ogni ciclo ×1→×10→×100, e questo tasto non deve mai entrarci. Spinto a destra
   della riga flex che lo ospita. */
.btn-tutte { margin-left: auto; flex: none; min-width: 36px; height: var(--btn-h-xs); min-height: var(--btn-h-xs); padding: 0 8px;
  font-size: 10px; line-height: 1; display: inline-flex; align-items: center; justify-content: center;
  white-space: nowrap; color: var(--amber-l); border-color: var(--bronze-d); }
.wp-empty { padding: 8px 2px; }
/* Quadro di comando: la plancia da sala operativa in testa al wizard — numeri grandi Cinzel,
   etichette minuscole, velatura rossa sul bordo (guerra), MAI glow. */
.wp-board { border-color: color-mix(in srgb, var(--rust) 38%, var(--rw-brass, #6d4f24)); }
.wp-board-row { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 8px; }
.wp-stat { display: inline-flex; flex-direction: column; align-items: flex-start; line-height: 1.15; }
.wp-stat b { font-family: var(--font-display); font-size: 18px; letter-spacing: .3px; color: var(--brass-l); }
.wp-stat small { font-size: 10px; text-transform: uppercase; letter-spacing: .07em; color: var(--ink-dim);
  display: inline-flex; align-items: center; gap: 2px; }
.wp-stat small .gi { width: 11px; height: 11px; }
/* Forze su un singolo bersaglio (schierata vs nemico) nella card d'assegnazione. */
.wp-forces { display: inline-flex; gap: 4px; align-items: center; }
.wp-forces .chip .gi { width: 12px; height: 12px; }
/* Capitano senza flotte libere: chip spenta ma ancora tappabile (il tap spiega il perché). */
.wp-mchip-full { opacity: .45; filter: grayscale(.35); }
/* Colore-nome per grado militare (ovunque nei Piani di Guerra): Fondatore giallo, Ufficiale
   viola — stessi toni dei chip rarità leggendario/epico. Vince anche sul "Tu" ambra. */
.wp-mchip-nm.rk-found, .wp-anm.rk-found { color: var(--amber-l); }
.wp-mchip-nm.rk-off, .wp-anm.rk-off { color: #a98fe0; }
/* Icona madre/colonia accanto alle coordinate nelle liste bersagli. */
.wp-tpick-id .subtle .gi, .wp-tgt-id .subtle .gi, .wp-tgt-top > .subtle .gi { width: 12px; height: 12px; }
/* Badge ⚓ incarichi/moli sulla chip-membro; al limite diventa ruggine. */
.wp-docks { font-size: 10px; color: var(--ink-dim); border: 1px solid var(--line); border-radius: 999px; padding: 1px 6px; }
.wp-docks-max { color: var(--rust); border-color: color-mix(in srgb, var(--rust) 50%, var(--line)); }
/* Coordinate cliccabili nella tabella Mondo → centra il mappamondo sul bersaglio. */
.coord-link { cursor: pointer; text-decoration: underline dotted; text-underline-offset: 3px; color: var(--brass-l); }
.coord-link:hover { color: var(--ink); }
.wp-gchips { margin-top: 8px; }
.wp-tlist { margin-top: 8px; max-height: 300px; overflow-y: auto; display: flex; flex-direction: column; gap: 6px; }
.wp-tpick { text-align: left; background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--line); border-radius: var(--radius); color: var(--ink); padding: 8px 10px;
  cursor: pointer; display: flex; align-items: center; gap: 8px; position: relative; min-height: 46px; }
.wp-tpick.on { border-color: var(--amber); background: color-mix(in srgb, var(--amber) 10%, var(--panel-1)); }
.wp-tpick .wp-tick { margin-left: 4px; color: var(--amber-l); font-weight: 700; }
.wp-tpick-id { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
/* Nome e riga sotto: TRONCATI (niente wrap sguaiato con nomi lunghi + tag + chip potenza). */
.wp-tpick-id b, .wp-tpick-id .subtle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.wp-tpick-id .subtle { font-size: 11px; }
.wp-tpick .av-slot, .wp-tpick .chip, .wp-tpick .crestbadge, .wp-tpick .wp-pow { flex: none; }   /* mai schiacciati */
.wp-tpick .chip { max-width: 8em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wp-tpick .av-slot { flex: 0 0 auto; }
.wp-tpick .crest-slot, .wp-tgt-crest .crest-slot { width: 22px; height: 22px; }
/* Conteggio flotte dello stesso capitano su un bersaglio (×2, ×3): pastiglia ambra compatta. */
.wp-mchip .wp-cnt { flex: none; font-size: 11px; font-weight: 700; color: #241a0b; background: var(--amber); border-radius: 999px; padding: 0 6px; line-height: 16px; }
/* Potenza flotta (chip compatta, icona spade) */
.wp-pow { display: inline-flex; align-items: center; gap: 2px; font-size: 11px; color: var(--ink-dim);
  border: 1px solid var(--line); border-radius: 999px; padding: 2px 8px; white-space: nowrap; }
.wp-pow .gi { width: 11px; height: 11px; }
/* Chip-membro (wizard + "+ assegna"): avatar + nome + grado + potenza */
.wp-mchip { display: inline-flex; align-items: center; gap: 6px; background: linear-gradient(180deg, var(--panel-2), var(--panel-0));
  border: 1px solid var(--line); border-radius: 999px; padding: 4px 10px 4px 4px; color: var(--ink);
  cursor: pointer; font-size: 12px; }
/* Membro ASSEGNATO = verde (arruolato): si distingue subito dall'ambra di selezione/hover. */
.wp-mchip.on { border-color: var(--good); background: color-mix(in srgb, var(--good) 12%, var(--panel-1)); }
.wp-mchip .av-slot { width: 27px; height: 27px; }   /* volti più leggibili */
.wp-mchip-nm { max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wp-mchip .gc-rk { width: 14px; height: 14px; }
/* Testata bersaglio nel dettaglio */
.wp-tgt-id { display: flex; flex-direction: column; min-width: 0; line-height: 1.25; }
.wp-tgt-id .subtle { font-size: 11px; }
/* Identità "guerra": velo ROSSO tenue e uniforme (bordo intero, mai su un solo lato) */
.wp-mine, .wp-campaign { border-color: color-mix(in srgb, var(--rust) 40%, var(--line)); }
.wp-red-head { color: color-mix(in srgb, var(--rust) 60%, var(--ink)); }
/* Report di campagna */
.wp-campaign { padding: 10px 12px; margin-top: 12px; }
.wp-cblock { margin-top: 10px; }
.wp-cblock-h { font-family: var(--font-display); font-size: 13px; letter-spacing: .04em; margin-bottom: 6px;
  display: flex; align-items: center; gap: 6px; }
.wp-cr { border: 1px solid var(--line); border-radius: var(--radius); padding: 6px 10px; margin-top: 6px;
  background: linear-gradient(180deg, var(--panel-2), var(--panel-0)); }
.wp-cr.rep-b-win { border-color: color-mix(in srgb, var(--good) 40%, var(--line)); }
.wp-cr.rep-b-loss { border-color: color-mix(in srgb, var(--rust) 40%, var(--line)); }
.wp-cr-top { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wp-cr-meta { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
.wp-cr-fly, .wp-cr-wait { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wp-cr .av-slot { width: 22px; height: 22px; }
.wp-wsel { padding: 10px 12px; margin-top: 8px; }
.wp-time-row { display: flex; gap: 8px; margin-top: 8px; }
.wp-time-row .csel { flex: 1; }
#wp-title, #wp-note { width: 100%; margin-top: 8px; }
#wp-q { width: 100%; }

/* Link social di gilda: Telegram (parità con soc-discord) + bottone-logo nella hero card */
.gi-soc-telegram  { background-image: url("/assets/ui/soc-telegram.svg?v=1"); }
/* Stesso stile dell'ingranaggio subito sopra (bordo bronzo, pannello, raggio 8) */
.gh-social { position: absolute; top: 46px; right: 10px; width: 30px; height: 30px; border-radius: 8px;
  border: 1px solid var(--bronze-d); background: var(--panel-1); color: var(--brass-l);
  display: grid; place-items: center; z-index: 2; }
.gh-social .gi { width: 15px; height: 15px; }
.gh-social:hover { border-color: var(--brass); }

/* Classifiche: nota minimale sotto i filtri (es. disclaimer potenza militare) */
.lb-note { font-size: 11px; margin: 6px 2px 2px; font-style: italic; }

/* ==== Palette per-isola (2026-07-17) ============================================
   Identità visiva delle COLONIE: il giocatore sceglie un tema colori dalla matita
   (rinomina isola) e a ogni switch d'isola capisce A COLPO D'OCCHIO dove si trova.
   La madre resta SEMPRE sul tema di default (blu «Cielo»): colore ≠ blu ⇒ colonia.
   Le palette cambiano SOLO LO SFONDO (il backdrop .sky): card, pannelli, testata,
   footer e input restano IDENTICI — richiesta utente. E valgono solo sulle tab
   operative (Isola/Unità/Azioni: data-pal messo/tolto da applyIslandPalette in
   app.js); Profilo è generale, Gilda ha il suo sfondo. Niente glow. */
/* Ogni palette è un TRAMONTO COERENTE nella sua famiglia: cielo + fascia d'orizzonte +
   bagliore + nuvole intonati alla tinta (l'orizzonte bruno-dorato di default resta solo
   su Cielo e Ruggine, dove è di famiglia). */
html[data-pal="smeraldo"] .sky {
  --sky-glow: #1f5c46; --sky-1: #0f2a20; --sky-0: #091510;
  --horiz-a: rgba(52,74,30,.45); --horiz-b: rgba(96,120,38,.30);
  --horiz-glow: rgba(190,225,120,.16); --cloud-c: rgba(120,170,150,.5);
}
/* Ametista DESATURATA (2026-07-18): il viola acceso non stava nella palette d'ottone.
   Ora è un crepuscolo grigio-violaceo: cielo slate-violet spento, orizzonte tirato sul
   prugna CALDO (così la cornice brass ci si appoggia), bagliore lavanda-grigio tenue. */
html[data-pal="ametista"] .sky {
  --sky-glow: #423a5e; --sky-1: #1b1830; --sky-0: #100e1a;
  --horiz-a: rgba(72,52,58,.45); --horiz-b: rgba(114,86,92,.30);
  --horiz-glow: rgba(205,190,215,.13); --cloud-c: rgba(140,138,165,.5);
}
html[data-pal="ruggine"]  .sky {
  --sky-glow: #56341c; --sky-1: #291810; --sky-0: #170f09;
  --cloud-c: rgba(175,150,115,.5);
}

/* Season «La Corsa» — riga compatta nella strip (tab Gilda): solo stato, niente barre. */
.ps-row.ps-corsa { gap: 8px; }
.ps-corsa-tx { font-size: 12px; color: var(--ink-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex: 1 1 auto; }
.ps-corsa-tx b { color: var(--amber-l); }
html[data-pal="cremisi"]  .sky {
  --sky-glow: #6b2547; --sky-1: #321226; --sky-0: #1a0b13;
  --horiz-a: rgba(84,32,40,.45); --horiz-b: rgba(140,58,60,.30);
  --horiz-glow: rgba(240,140,130,.16); --cloud-c: rgba(185,130,145,.5);
}

/* Selettore palette nella card rinomina (solo colonie): 5 medaglioni-cielo */
.pal-row { display: flex; gap: 10px; margin-top: 4px; }
.pal-sw {
  width: 34px; height: 34px; border-radius: 50%; cursor: pointer; padding: 0;
  border: 2px solid var(--bronze-d); box-shadow: inset 0 1px 2px rgba(0,0,0,.5);
}
.pal-sw.on { border-color: var(--amber-l); transform: scale(1.08); }
.pal-sw:active { transform: scale(.94); }

/* Richiamo tipo-tutorial sulla matita (colonia mai personalizzata): ping ROSSO netto
   (richiesta utente: da gold a red, niente effetto-alone) — pulsa solo di scala, senza
   dissolvenza morbida che leggeva come glow. Sparisce alla prima apertura. */
.pid-edit { position: relative; }
.pal-dot {
  position: absolute; top: -3px; right: -3px; width: 9px; height: 9px;
  border-radius: 50%; background: var(--rust); border: 1px solid #5a1f12;
  animation: palDot 1.5s ease-in-out infinite;
}
@keyframes palDot { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.25); } }

/* ==== Piani di Guerra — rework leggibilità (2026-07-18) =========================
   La pagina era funzionale ma illeggibile: righe che andavano a capo a caso, chip
   di altezze diverse, nessuna gerarchia. Ora: righe-assegnatario a colonne fisse,
   badge ISOLA DI LANCIO (incarichi per-isola: castello=madre, isolotto=colonia),
   report di campagna a griglia, picker per-isola. Niente glow, niente accenti a
   lato singolo ([[no-glow-rule]], [[left-accent-border-rule]]). */
.wp-isl {
  display: inline-flex; align-items: center; gap: 4px; font-size: 11px;
  border: 1px solid var(--bronze-d); border-radius: 999px; padding: 1px 8px;
  color: var(--brass-l); white-space: nowrap; max-width: 130px; overflow: hidden; text-overflow: ellipsis;
}
.wp-isl .gi { width: 12px; height: 12px; flex: 0 0 auto; }
.wp-isl.wp-isl-col { color: var(--patina); border-color: color-mix(in srgb, var(--patina) 45%, var(--bronze-d)); }
.wp-isl.wp-isl-gone { color: var(--rust); border-color: color-mix(in srgb, var(--rust) 45%, var(--bronze-d)); }

.wp-map-btn { margin-left: auto; }
.wp-campaign .card-head { display: flex; align-items: center; gap: 8px; }

/* Rendiconto in testa al report: numeri grandi Cinzel (riuso del linguaggio del Quadro di
   comando) + rendiconto danni a due righe. Vinte verde, perse ruggine, non-accettati smorzato. */
.wp-recap { display: flex; flex-wrap: wrap; gap: 8px 20px; margin-top: 10px; }
.wp-recap .wp-stat b { font-family: var(--font-display); font-size: 18px; letter-spacing: .3px; color: var(--brass-l); }
.wp-recap .wp-stat small { font-size: 10px; text-transform: uppercase; letter-spacing: .07em; color: var(--ink-dim); }
.wp-recap .wp-stat-win b { color: var(--good); }
.wp-recap .wp-stat-loss b { color: var(--rust); }
.wp-recap .wp-stat-dim b { color: var(--ink-dim); }
.wp-ledger { margin-top: 10px; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.wp-ledger-row { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 6px 10px; border-top: 1px solid var(--line); font-size: 12px; }
.wp-ledger-row:first-child { border-top: 0; }
.wp-ledger-lbl { display: inline-flex; align-items: center; gap: 6px; color: var(--ink-dim); }
.wp-ledger-lbl .gi { width: 13px; height: 13px; }
.wp-ledger-val { display: inline-flex; align-items: center; gap: 6px; text-align: right; flex-wrap: wrap; justify-content: flex-end; }
.wp-ledger-val b { color: var(--ink); }
/* Il NETTO è il protagonista del rendiconto: fascia EDGE-TO-EDGE (full-bleed coi margini
   negativi, come le tabelle dei Piani), gradiente semitrasparente che sfuma verso destra —
   verde se l'operazione ha reso, rosso se è costata — e NIENTE raggi: è una fascia, non una
   card, e così non si confonde coi riquadri degli scontri qui sotto. */
.wp-net { display: flex; align-items: center; justify-content: space-between; gap: 10px;
  flex-wrap: wrap; margin: 10px -12px 0; padding: 8px 12px;
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
  background: linear-gradient(90deg, rgba(74,222,128,.14), rgba(74,222,128,.02)); }
.wp-net.ko { background: linear-gradient(90deg, rgba(180,36,58,.16), rgba(180,36,58,.03)); }
.wp-net-lbl { font-family: var(--font-display); font-size: 12px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--brass-l); font-weight: 700; }
.wp-net .wp-ledger-val, .wp-net .wp-ledger-val b { font-size: 13px; }
.wp-net-neg, .wp-ledger-val b.wp-net-neg { color: var(--rust-l); }
.wp-ledger-val b.wp-net-pos { color: var(--good); }

/* Lista incarichi dentro la card bersaglio: separata dalla testata da una linea, righe
   compatte a due colonne [chi · isola] | [potenza · stato/esito]. Poco alte, ben distinte. */
.wp-alist { margin-top: 8px; border-top: 1px solid var(--line); }
.wp-arow { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center;
  gap: 2px 10px; padding: 6px 28px 6px 0; border-top: 1px solid var(--line); position: relative; }
.wp-alist > .wp-arow:first-child { border-top: 0; }
.wp-arow-id { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.wp-arow-rt { justify-self: end; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
.wp-arow-act { grid-column: 1 / -1; display: flex; gap: 6px; margin-top: 2px; }
.wp-arow-dec { opacity: .5; }   /* rifiutato: smorzato ma leggibile (il report lo esclude) */
.wp-ax { position: absolute; right: 0; top: 50%; transform: translateY(-50%); margin: 0; }

/* Tabella assegnatari — STESSO pattern della tabella Mondo: colonna MEMBRO fissa a
   sinistra (position:sticky) e Isola/Pot./Stato/✕ che SCORRONO in orizzontale quando
   manca spazio. Niente ellipsis aggressive né celle compresse: ogni colonna ha la sua
   larghezza naturale, il min-width della tabella garantisce che nulla si sovrapponga. */
.wp-atable-wrap { margin-top: 10px; overflow-x: auto; }
.wp-atable { min-width: 470px; background: var(--sky-0); }
.wp-atable th, .wp-atable td { padding: 6px 6px; }
.wp-atable th:first-child, .wp-atable td.td-name {
  position: sticky; left: 0; z-index: 2;
  background: var(--sky-0); border-right: 1px solid var(--slate-3);
  width: 148px; min-width: 148px; max-width: 148px;
}
/* display:flex + min-width:0 → il nome lungo va in ELLIPSIS invece di essere tagliato vivo. */
.wp-atable .dt-id { display: flex; gap: 6px; flex-wrap: nowrap; overflow: hidden; min-width: 0; max-width: 100%; }
.wp-atable .av-slot.av-sm { width: 22px; height: 22px; flex: 0 0 auto; }
.wp-atable .dt-name { font-weight: 400; font-size: 12px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wp-atable tbody tr.mtr-me .dt-name { color: var(--amber-l); font-weight: 600; }
.wp-atable .wp-td-isl .wp-isl { max-width: 150px; }
.wp-atable .wp-td-st .wp-st { white-space: nowrap; }
.wp-atable .dt-act { width: 34px; text-align: center; }
.wp-atable .wp-ax { position: static; transform: none; padding: 4px 6px; margin: 0; }
.wp-tr-dec { opacity: .5; }
/* Sotto-riga battaglia: colspan sotto la riga del membro. Il contenuto è STICKY a sinistra
   → "In volo — arrivo tra…" resta leggibile anche quando le colonne scorrono. */
.wp-atable tbody tr.wp-tr-hasbt td { border-bottom: 0; }
.wp-atable tbody tr.wp-tr-bt td { padding: 0 6px 6px 34px; }
.wp-atable tbody tr.wp-tr-bt .wp-bt { font-size: 11px; position: sticky; left: 34px; display: inline-flex; }
/* Zebratura ricalcolata SOLIDA per la cella sticky (i background rgba non coprono ciò che
   scorre sotto); le sotto-righe sfasano nth-child → zebra spenta, resta l'evidenza "io". */
.wp-atable tbody tr:nth-child(even) { background: transparent; }
.wp-atable tbody tr.mtr-me td { background: rgba(233,181,74,.10); }
.wp-atable tbody tr.mtr-me td.td-name { background: #292620; }
/* Esito sulla RIGA: velatura in gradiente — verde il colpo a segno, rossa il respinto — che
   sfuma verso destra. Sta sul <tr> (una campata sola, non un gradiente per cella); le celle
   tornano trasparenti (vince sull'ambra "io"), e la cella sticky del nome rivuole il suo
   colore PIENO nelle stesse tinte (un velato lascerebbe intravedere ciò che scorre sotto). */
.wp-atable tbody tr.wp-tr-won { background: linear-gradient(90deg, rgba(74,222,128,.14), rgba(74,222,128,.02)); }
.wp-atable tbody tr.wp-tr-lost { background: linear-gradient(90deg, rgba(180,36,58,.18), rgba(180,36,58,.03)); }
.wp-atable tbody tr.wp-tr-won td, .wp-atable tbody tr.wp-tr-lost td { background: transparent; }
.wp-atable tbody tr.wp-tr-won td.td-name { background: #1b2a20; }
.wp-atable tbody tr.wp-tr-lost td.td-name { background: #2a181c; }
/* Barra Accetta/Rifiuta sotto la tabella (il MIO incarico in attesa): tocco comodo, non in cella. */
.wp-tbar { display: flex; gap: 8px; margin-top: 8px; }
/* Orario target nel report di campagna: quanto manca + ora esatta */
.wp-when-row { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 13px; }
.wp-when-row .gi { width: 14px; height: 14px; }

/* Report di campagna: identità del bersaglio su riga PIANA in testa (niente fascia — la
   fascia d'oro faceva concorrenza alla testata rossa del report), blocco-scontri a griglia. */
.wp-camp-tgt { display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 13px;
  font-family: var(--font-display); letter-spacing: .04em; }
.wp-camp-tgt b { color: var(--brass-l); }
.wp-camp-tgt .gi { width: 12px; height: 12px; }
.wp-cblock { margin-top: 12px; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.wp-cblock .wp-camp-tgt { margin: 0; padding: 6px 10px 0; }
.wp-recap-note { margin-top: 4px; font-size: 11px; }
.wp-cr { display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 2px 10px; align-items: center; padding: 8px 10px; border-top: 1px solid var(--line); }
.wp-cr:first-of-type { border-top: 0; }
.wp-cr-who { display: flex; align-items: center; gap: 8px; min-width: 0; }
.wp-cr-nm { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; }
.wp-cr-res { display: flex; align-items: center; gap: 6px; justify-self: end; text-align: right; flex-wrap: wrap; justify-content: flex-end; }
/* Scontro minimale: nome+isola e verdetto sulla STESSA riga (flex, lui spinto a destra),
   flotta in lettere su una riga con «…», bottino sotto, ora in basso a destra. Flotta e
   bottino al filo SINISTRO del medaglione: una colonna sola, si legge in verticale. */
.wp-cr-open { cursor: pointer; }
.wp-cr-line1 { grid-column: 1 / -1; display: flex; align-items: center; gap: 6px; min-width: 0; }
.wp-cr-line1 .wp-cr-who { flex: 1 1 auto; }
/* Verdetto a FILO destro come l'orario: niente pillola (bordo+imbottitura lo staccavano dal
   margine di due passi rispetto all'ora qui sotto). Il colore basta a farlo leggere. */
.wp-cr-line1 .wp-bt { flex: none; white-space: nowrap; border: 0; padding: 0; border-radius: 0; }
.wp-cr-fleet { grid-column: 1 / -1; font-size: 11px; display: flex; align-items: center; gap: 6px; min-width: 0; }
.wp-cr-fl { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Bottino e orario sulla STESSA riga: lui a sinistra col medaglione, il gruppo di destra è
   «apri rapporto · 07:01» — l'invito minimale che dice che la riga si tocca. */
.wp-cr-hint { font-size: 11px; margin-left: auto; }
.wp-cr-when { font-size: 11px; }
.wp-cr-meta { grid-column: 1 / -1; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wp-cr-meta .chip { font-size: 11px; }
/* esiti: velatura di fondo (mai bordo a lato singolo, mai glow) */
.wp-cr.rep-b-win  { background: color-mix(in srgb, var(--good) 7%, transparent); }
.wp-cr.rep-b-loss { background: color-mix(in srgb, var(--rust) 7%, transparent); }
.wp-cr.rep-b-draw { background: color-mix(in srgb, var(--amber) 6%, transparent); }

/* Picker per-isola: una riga per membro, le sue isole come interruttori indipendenti */
.wp-picker2 { display: flex; flex-direction: column; gap: 2px; margin-top: 8px; max-height: 300px; overflow-y: auto; }
.wp-prow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 6px 2px; border-top: 1px solid var(--line); }
.wp-prow-isles { display: flex; gap: 6px; flex-wrap: wrap; margin-left: auto; }
.wp-ichip {
  display: inline-flex; align-items: center; gap: 4px; cursor: pointer;
  font-size: 11px; color: var(--ink-dim); background: var(--panel-0);
  border: 1px solid var(--bronze-d); border-radius: 999px; padding: 2px 8px; min-height: 26px;
}
.wp-ichip .gi { width: 12px; height: 12px; }
.wp-ichip .wp-ichip-nm { max-width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wp-ichip.on { color: #241a06; background: linear-gradient(180deg, var(--brass-l), var(--brass)); border-color: var(--brass-d); font-weight: 600; }
.wp-ichip.wp-ichip-busy { opacity: .62; }
.wp-ichip:active { transform: scale(.96); }

/* ==== Piani di Guerra — ottimizzazione MOBILE (Android + iOS) ===================
   Tap-target da pollice (≥40px reali anche se il visivo resta compatto) e layout
   a colonna sulle larghezze telefono: la platea è quasi tutta mobile. */
.wp-ichip { min-height: 36px; padding: 6px 12px; font-size: 12px; }
.wp-ichip .gi { width: 14px; height: 14px; }
/* ✕ rimuovi-incarico: visivo piccolo, area di tocco 40x40 (padding, niente layout shift) */
.wp-ax { padding: 10px 12px; margin: -8px -6px 0 0; line-height: 1; }

@media (max-width: 480px) {
  /* Report campagna: la riga nome+verdetto è ormai flex (wp-cr-line1) e regge da sola anche
     stretta; flotta e bottino restano al filo sinistro del medaglione pure su mobile. */
  .wp-cr { grid-template-columns: 1fr; }
  .wp-cr-res { justify-self: start; text-align: left; justify-content: flex-start; padding-left: 32px; }
  /* Riga incarico: potenza+stato scendono sotto il nome, allineati all'avatar */
  .wp-arow { grid-template-columns: 1fr; }
  .wp-arow-rt { justify-self: start; justify-content: flex-start; padding-left: 32px; }
  /* Rendiconto danni: etichetta sopra, valore sotto (niente due colonne strette) */
  .wp-ledger-row { flex-direction: column; align-items: flex-start; gap: 2px; }
  .wp-ledger-val { justify-content: flex-start; text-align: left; }
  /* Picker: le isole del membro su riga PROPRIA a tutta larghezza (comode per il pollice) */
  .wp-prow-isles { flex-basis: 100%; margin-left: 0; padding-left: 32px; }
  /* Testata piano: il tasto Mappa di guerra respira su riga sua se il resto è pieno */
  .wp-map-btn { flex: 1 1 auto; justify-content: center; }
}

/* Selettore isola d'attacco: sorgente con assalto già in volo (1 per isola) → smorzata + ⚔ */
.isl-chip.atk-src-busy { opacity: .6; }
.isl-chip.atk-src-busy .gi-swords { width: 12px; height: 12px; opacity: .85; }

/* ============================== NEGOZIO (skin) ==============================
   Veste "Albero del Progresso": nero profondo (#05060b) + oro #caa24a, titoli
   serif dorati con linee ornamentali a cuneo, cornici sottili. Niente card né
   bottoni in vetrina: tessere QUADRATE nude (cornice d'oro sull'arte) con testo
   sotto, TUTTE cliccabili; i bundle sono righe con le skin in fila. Mai glow. */
.shop-page { background: #05060b; }
/* DESKTOP: l'Emporium non è una finestra aperta sul gioco, è un POSTO IN CUI SI ENTRA.
   Su schermo largo gli altri rapporti restano una colonna incorniciata che galleggia sul mondo
   sfocato; qui no — la pagina prende tutto lo schermo, il fondo è opaco e di quello che c'era
   dietro non si intravede più niente: si è cambiata pagina, non aperto un pannello. Il
   CONTENUTO però resta una colonna leggibile e centrata (le tessere sono quadrate: allargarle
   su 1920px farebbe una vetrina di francobolli sperduti), mentre la testata resta a tutta
   larghezza così il filo d'oro sotto attraversa lo schermo come la barra di una pagina vera.
   `padding-inline` con `max()`: fino a 960px il respiro è quello di sempre, oltre il titolo si
   allinea da solo alla colonna sotto. */
@media (min-width: 700px) {
  #shop-overlay .report-backdrop { background: #05060b; backdrop-filter: none; -webkit-backdrop-filter: none; }
  #shop-overlay .report-page { margin: 0; max-width: none; border: 0; border-radius: 0; box-shadow: none; }
  #shop-overlay .report-body { width: 100%; max-width: 960px; margin-left: auto; margin-right: auto; }
  #shop-overlay .report-head { padding-inline: max(var(--sp-16), calc((100% - 960px) / 2 + var(--sp-12))); }
}
/* SALDO PERLE nella testata del Negozio: SOLO la perla e il numero, senza pillola intorno —
   l'arte è già un oggetto, incorniciarla la fa sembrare un bottone. */
/* È un TASTO: apre la borsa. Nudo però — bordo e fondo li toglie, perché una pillola intorno
   al saldo lo farebbe leggere come un contatore da guardare invece che come un posto in cui
   entrare. Lo dice il puntatore, non una cornice. */
.shop-perle { margin-left: auto; margin-right: var(--sp-10); display: inline-flex; align-items: center;
  gap: var(--sp-6); padding: 0; border: 0; background: none; cursor: pointer; }
.shop-perle .perla { width: 36px; height: 36px; flex: none; display: inline-block;
  background: url("/assets/resources/perla.png") center/contain no-repeat; }
/* Il numero PRIMA della perla e più grande: si legge il saldo, poi si riconosce la moneta. */
.shop-perle b { font-size: var(--fs-xl); color: #e9c87e; font-variant-numeric: tabular-nums; }
.shop-page .report-head {
  background: linear-gradient(180deg, rgba(202,162,74,.10), rgba(0,0,0,.25));
  border-bottom-color: rgba(202,162,74,.35);
}
/* Il fondo della pagina Negozio lo tiene il CONTENUTO, non il contenitore: la barra del
   carrello è `sticky bottom:0` e si incolla al bordo interno del padding — con 28px sotto
   restava una fascia nera vuota fra la barra e il fondo della finestra. Lo spazio serve
   comunque, ma va SOPRA la barra (vedi .shop-note-foot), dove è respiro e non un buco. */
.shop-page .report-body { padding: 12px 12px 0; }
.shop-note-foot { margin-bottom: 16px; }
/* tab Acquista/Equipaggia: chip tecnologici neri, oro quando attivi */
.shop-tabs { display: flex; gap: 8px; margin: 2px 0 12px; }
.shop-tab {
  flex: 1 1 0; padding: 10px 8px; cursor: pointer; border-radius: 4px;
  font-size: 11px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
  color: #8a8577; background: #0c0f14; border: 1px solid rgba(202,162,74,.28);
  transition: border-color .12s, color .12s, background .12s;
}
.shop-tab.on { color: #e9c87e; border-color: #caa24a; background: rgba(202,162,74,.12); }
.shop-tab .gi { width: 13px; height: 13px; vertical-align: -2px; }
/* intestazione vetrina: titolo serif in gradiente d'oro tra due linee a cuneo */
.shop-hero { text-align: center; margin: 4px 0 12px; }
.shop-hero-row { display: flex; align-items: center; justify-content: center; gap: 10px; }
.shop-hero-t {
  flex: none; font-family: Georgia, "Times New Roman", serif; font-weight: 600; font-size: 14px;
  letter-spacing: .2em; text-transform: uppercase;
  background: linear-gradient(180deg, #fff6e2, #caa24a);
  -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
}
.shop-hero-s { margin-top: 4px; font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: #8a8577; }
.shop-hero-tag { font-size: 10px; letter-spacing: .04em; color: #7d7768; margin-bottom: 6px; font-style: italic; }
.shop-tagline { text-align: center; margin: 2px 0 10px; }
.shop-hero-timer { margin-top: 4px; font-size: 12px; letter-spacing: .06em; color: #e9c87e; font-variant-numeric: tabular-nums;
  display: flex; align-items: center; justify-content: center; gap: 4px; }
.shop-hero-timer .gi { opacity: .8; width: 13px; height: 13px; flex: none; }
.shl, .shr { flex: 1; max-width: 120px; min-width: 22px; height: 1.5px; }
.shl { background: linear-gradient(90deg, rgba(202,162,74,0), #e9c87e); clip-path: polygon(0 50%, 100% 0, 100% 100%); }
.shr { background: linear-gradient(90deg, #e9c87e, rgba(202,162,74,0)); clip-path: polygon(0 0, 100% 50%, 0 100%); }
.shop-note { font-size: 11px; line-height: 1.5; color: #8a8577; margin: 0 2px 12px; text-align: center; }
.shop-note-foot { margin-top: 16px; }
/* sezioni: etichetta centrata tra linee d'oro */
.shop-sec { margin: 16px 0 4px; }
.shop-sec-hd { display: flex; align-items: center; justify-content: center; gap: 10px; margin: 0 2px 10px; }
.shop-sec-hd b {
  flex: none; font-family: Georgia, serif; font-weight: 600; font-size: 12px;
  letter-spacing: .18em; text-transform: uppercase; color: #e9ddc0;
}
/* tessere quadrate nude, scorrimento orizzontale */
/* Le strisce scorrono come i selettori isola: rotella (senza Shift) e trascinamento col mouse
   li gestisce `_H_SCROLL` in app.js. Barra nascosta come là — la fila di tessere tagliate a metà
   dice già da sé che si continua di lato. */
/* NIENTE AGGANCIO (08/08/2026): lo `scroll-snap` faceva scattare la striscia da una tessera
   all'altra mentre la si trascinava — accanto alle file dei bundle, che scivolano lisce perché
   non hanno punti d'aggancio, sembrava rotta. Il trascinamento è un gesto continuo: deve
   seguire il dito (o il mouse), non correggerlo. */
.shop-sqrow { display: flex; gap: 12px; overflow-x: auto; padding: 2px 2px 10px;
  scrollbar-width: none; }
.shop-sqrow::-webkit-scrollbar { display: none; }
.shop-sq { flex: 0 0 116px; cursor: pointer; -webkit-tap-highlight-color: transparent; }
.shop-sq:active .sq-art { transform: translateY(1px); }
.sq-art {
  display: block; aspect-ratio: 1 / 1; border-radius: 8px; overflow: hidden;
  border: 1.5px solid rgba(202,162,74,.5); background: #10141e;
  transition: border-color .12s;
}
.shop-sq:hover .sq-art { border-color: #caa24a; }
.shop-sq.owned .sq-art { border-color: #caa24a; }
.sq-art img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sq-name { display: block; margin-top: 6px; font-family: Georgia, serif; font-size: 12px; line-height: 1.3; color: #f2ecdb; }
.sq-sub { display: block; margin-top: 1px; font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: #8a8577; }
.sq-price { display: block; margin-top: 2px; font-size: 12px; font-weight: 600; letter-spacing: .05em; color: #e9c87e; }
.sq-price.own { color: #67b9a8; }
/* bundle: riga a tutta larghezza, tutte le skin in fila, click = finestra col contenuto */
.shop-bundle {
  margin: 0 2px 10px; padding: 10px 12px; cursor: pointer; border-radius: 12px;
  background: linear-gradient(180deg, rgba(24,29,42,.65), rgba(12,15,25,.65));
  border: 1px solid rgba(202,162,74,.35); transition: border-color .12s;
}
.shop-bundle:hover { border-color: #caa24a; }
.shop-bundle:active { transform: translateY(1px); }
.shop-bundle.owned { border-color: rgba(103,185,168,.45); }
.sb-hd { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.sb-hd b { font-family: Georgia, serif; font-size: 13px; letter-spacing: .04em; color: #f2ecdb; }
.sb-hd .sq-price { margin-top: 0; flex: none; }
.sb-sub { margin-top: 2px; font-size: 11px; color: #8a8577; }
.sb-strip { display: flex; gap: 6px; overflow-x: auto; margin-top: 8px; padding-bottom: 2px; }
.sb-th { width: 44px; height: 44px; flex: none; object-fit: cover; border-radius: 8px;
  border: 1px solid rgba(202,162,74,.4); background: #10141e; }
/* tessera nel carrello: cornice oro piena + spunta */
.sq-art { position: relative; }
.shop-sq.incart .sq-art { border-color: #e9c87e; box-shadow: inset 0 0 0 1.5px rgba(233,200,126,.6); }
.shop-sq.incart .sq-price { color: #67b9a8; }
.sq-badge { position: absolute; top: 5px; right: 5px; width: 20px; height: 20px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 900;
  line-height: 1; color: #0b0e16; background: #e9c87e; }
.sq-badge svg { width: 12px; height: 12px; fill: currentColor; }
.shop-sq.owned { opacity: .78; cursor: default; }
/* bundle: toggle delle modalità (Navi / Difese / Navi+Difese) */
.sb-hint { font-size: 10px; }
.sb-modes { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.sb-mode { flex: 1 1 0; min-width: 96px; display: flex; flex-direction: column; align-items: center;
  gap: 2px; padding: 8px 6px; border-radius: 8px; cursor: pointer; color: #cfc8b8;
  background: rgba(255,255,255,.03); border: 1px solid rgba(202,162,74,.3); transition: border-color .12s, background .12s; }
.sb-mode:hover { border-color: #caa24a; }
.sb-mode.on { border-color: #e9c87e; background: rgba(233,200,126,.12); }
.sb-mode.owned { opacity: .6; cursor: default; }
.sbm-l { font-family: Georgia, serif; font-size: 12px; color: #f2ecdb; }
.sbm-p { font-size: 12px; font-weight: 600; letter-spacing: .04em; color: #e9c87e; }
.sb-mode.on .sbm-p { color: #67b9a8; }
/* barra carrello: fissa in fondo all'overlay */
/* IL VASSOIO DEL CARRELLO. Da bordo a bordo (i -12px annullano il padding della pagina), chiuso
   è una riga sola; toccando la testata si apre VERSO L'ALTO col conto voce per voce. La lista sta
   PRIMA della testata nel markup: così cresce verso il cielo e la riga dei tasti non si muove di
   un pixel sotto il dito. */
.shop-cart { position: sticky; bottom: 0; margin: 16px -12px 0; padding: 0 12px 12px;
  display: flex; flex-direction: column; gap: 10px;
  background: #000; border-top: 1px solid rgba(202,162,74,.55); }
.sc-head { display: flex; align-items: center; justify-content: space-between; gap: 12px;
  width: 100%; margin: 0 -12px; padding: 12px; border: 0; background: none; cursor: pointer;
  width: calc(100% + 24px); text-align: left; }
.sc-chev { color: var(--brass); font-size: 12px; transition: transform .14s; }
.shop-cart.on .sc-chev { transform: rotate(180deg); }
/* La lista: scorre da sola oltre metà schermo — un carrello lungo non deve mangiarsi la vetrina. */
.sc-list { max-height: 46vh; overflow-y: auto; margin: 10px -12px 0; padding: 0 12px;
  display: flex; flex-direction: column; gap: 6px; scrollbar-width: none; }
.sc-list::-webkit-scrollbar { display: none; }
.sc-row { display: flex; align-items: center; gap: var(--sp-8); padding: var(--sp-6);
  border-radius: 8px; background: rgba(255,255,255,.03); border: 1px solid var(--slate-3); }
.sc-th { flex: none; width: 34px; height: 34px; border-radius: 8px; overflow: hidden;
  background: var(--panel-0); border: 1px solid var(--bronze-d); }
.sc-th img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sc-rn { flex: 1; min-width: 0; font-size: var(--fs-md); color: var(--ink); }
.sc-rp { flex: none; font-size: var(--fs-md); color: #e9c87e; font-variant-numeric: tabular-nums; }
.sc-rx { flex: none; width: 24px; height: 24px; padding: 0; cursor: pointer; border-radius: 4px;
  font-size: 12px; line-height: 1; color: var(--ink-dim); background: rgba(0,0,0,.3);
  border: 1px solid var(--slate-3); }
.sc-rx:hover { color: var(--rust-l); border-color: var(--rust); }
/* bottoni carrello nello stile dei tab Acquista/Equipaggia: Paga = attivo, Svuota = spento */
.sc-pay, .sc-clear {
  padding: 10px 12px; cursor: pointer; border-radius: 4px;
  font-size: 11px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
  border: 1px solid rgba(202,162,74,.28); transition: border-color .12s, color .12s, background .12s;
}
.sc-clear { color: #8a8577; background: #0c0f14; }
.sc-clear:hover { border-color: rgba(202,162,74,.5); }
.sc-pay { color: #e9c87e; border-color: #caa24a; background: rgba(202,162,74,.12); }
.sc-pay:hover { background: rgba(202,162,74,.2); }
/* Bundle: card scorribile + popup di scelta (toggle Navi/Difese) */
.shop-bundle-card { margin: 0 2px 12px; padding: 10px 2px 4px; border-radius: 12px; cursor: pointer;
  border: 1px solid rgba(202,162,74,.3); background: linear-gradient(180deg, rgba(24,29,42,.5), rgba(12,15,25,.5)); }
.shop-bundle-card.sel { border-color: #e9c87e; }
.sbc-hd { display: flex; align-items: center; gap: 8px; padding: 0 10px; margin-bottom: 8px; }
.sbc-hd b { font-family: Georgia, serif; font-size: 14px; letter-spacing: .03em; color: #f2ecdb; }
.sbc-check { width: 18px; height: 18px; border-radius: 50%; background: #e9c87e; color: #0b0e16;
  font-weight: 900; font-size: 12px; display: flex; align-items: center; justify-content: center; }
.sbc-go { margin-left: auto; font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: #e9c87e; }
.bundle-thumb { flex: 0 0 116px; }
.shop-modal-back { position: fixed; inset: 0; z-index: 60; display: flex; align-items: center; justify-content: center;
  padding: 20px; background: rgba(3,4,8,.72); }
.shop-modal { width: 100%; max-width: 340px; border-radius: 16px; padding: 20px 16px;
  border: 1px solid rgba(202,162,74,.5); background: #0b0e16; text-align: center; }
.sm-title { font-family: Georgia, serif; font-size: 18px; color: #e9c87e; letter-spacing: .03em; }
.sm-sub { font-size: 11px; margin-top: 2px; }
.sm-toggles { display: flex; gap: 10px; margin: 16px 0; }
.sm-tog { flex: 1; padding: 12px 8px; border-radius: 8px; cursor: pointer; font-size: 12px; font-weight: 600;
  letter-spacing: .05em; color: #8a8577; background: rgba(255,255,255,.03); border: 1px solid rgba(202,162,74,.3);
  transition: border-color .12s, color .12s, background .12s; }
.sm-tog.on { color: #e9c87e; border-color: #e9c87e; background: rgba(233,200,126,.14); }
.sm-tog .gi { width: 14px; height: 14px; vertical-align: -2px; }
.sm-add { width: 100%; }
.sm-add[disabled] { opacity: .45; cursor: default; }
/* LA BORSA DI PERLE: popup LARGO, i cinque pacchi in fila sotto gli occhi. Non è una vetrina da
   scorrere, è una scelta da fare in un colpo: si confrontano taglio, regalo e prezzo guardandoli
   insieme, e per questo la fila non va mai a scorrimento — su schermo stretto si spezza in due
   righe, ma nessun pacco resta nascosto oltre il bordo. */
.shop-pearls { max-width: 900px; }
/* CINQUE COLONNE, non «quante ce ne stanno»: `auto-fit` mandava a capo l'ultimo pacco appena
   mancavano dieci pixel, e il taglio più grosso — quello con il regalo migliore — finiva da solo
   in fondo come un ripensamento. Sotto i 700px (telefono) la fila si spezza davvero, e lì è
   giusto: cinque tessere da 50 pixel non sono una scelta, sono un rebus. */
.pk-row { display: grid; grid-template-columns: repeat(5, 1fr);
  gap: var(--sp-10); margin: var(--sp-16) 0 var(--sp-12); }
/* Quando la fila si spezza, la CODA VA CENTRATA. Con la griglia i due pacchi avanzati si
   incollavano a sinistra e la fila sotto sembrava un errore di impaginazione, non una scelta:
   il taglio più grosso — quello con il regalo migliore — finiva in un angolo. Qui serve il
   flex: le tessere restano tutte della STESSA misura (larghezza calcolata, niente `grow`, se
   no l'ultima riga si gonfierebbe a riempire il vuoto) e la riga incompleta si centra da sé. */
@media (max-width: 699px) {
  .pk-row { display: flex; flex-wrap: wrap; justify-content: center; }
  .pk { width: calc((100% - var(--sp-10) * 2) / 3); }
  /* SU TELEFONO LA BORSA È UNA PAGINA, non un francobollo in mezzo allo schermo: cinque scrigni
     dipinti dentro un riquadro da 340px diventavano cinque miniature. Si apre sotto la TESTATA —
     che resta scoperta e sopra il velo — e la testata è anche il modo per uscire: è dove il
     pollice è già stato per aprirla. `--shop-head-h` la misura app.js a ogni render, perché
     scritta a mano sbaglierebbe su ogni telefono col notch (la testata porta la safe-area).
     Cornice e raggio arrivano dalla regola comune dei pannelli con `!important` e qui vanno
     tolti: una pagina intera non ha angoli arrotondati. */
  /* Quota dichiarata, non un 61 inventato per stare «uno sopra» al velo: siamo DENTRO il
     contesto della pagina del Negozio (`.report-page` ha z-index 1), quindi il numero vale solo
     qui e non scavalca niente fuori. */
  #shop-overlay .report-head { position: relative; z-index: var(--z-panel); }
  .shop-modal-back.sm-full { top: var(--shop-head-h, 56px); padding: 0; align-items: stretch; }
  .sm-full .shop-pearls { max-width: none; width: 100%; height: 100%; overflow-y: auto;
    border-radius: 0 !important; border-width: 1px 0 0 0 !important; }
}
@media (max-width: 419px) {
  .pk { width: calc((100% - var(--sp-10)) / 2); }
}
.pk { display: flex; flex-direction: column; gap: var(--sp-4); padding: var(--sp-8);
  cursor: pointer; border-radius: 12px; text-align: center; color: var(--ink);
  background: linear-gradient(180deg, rgba(24,29,42,.65), rgba(12,15,25,.65));
  border: 1px solid rgba(202,162,74,.35); transition: border-color .12s; }
.pk:hover { border-color: #caa24a; }
.pk:active { transform: translateY(1px); }
.pk[disabled] { opacity: .5; cursor: default; }
.pk-art { position: relative; display: block; border-radius: 8px; overflow: hidden;
  border: 1px solid rgba(202,162,74,.4); background: #10141e; }
.pk-art img { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; }
/* Il regalo si vede PRIMA del prezzo: è il motivo per guardare oltre il primo pacco. */
.pk-bonus { position: absolute; top: 6px; right: 6px; padding: var(--sp-2) var(--sp-6);
  border-radius: 4px; font-size: var(--fs-xs); font-weight: 700; letter-spacing: .04em;
  color: #0b0e16; background: #e9c87e; }
.pk-n { display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-4);
  margin-top: var(--sp-6); }
.pk-n b { font-size: var(--fs-2xl); color: #e9c87e; font-variant-numeric: tabular-nums; }
.pk-n .perla { width: 20px; height: 20px; flex: none; display: inline-block;
  background: url("/assets/resources/perla.png") center/contain no-repeat; }
/* LA PERLA IN LINEA: il simbolo di valuta della vetrina. Cresce con il testo che la circonda
   (1.35em) invece di essere inchiodata a una misura, così sta bene accanto al prezzo di una
   tessera come dentro il tasto del carrello, e non ha bisogno di una classe per formato. */
.perla-in { display: inline-block; width: 1.35em; height: 1.35em; margin-left: .25em;
  vertical-align: -.35em;
  background: url("/assets/resources/perla.png") center/contain no-repeat; }
/* NOME E PREZZO SULLA STESSA RIGA: erano due righe sotto la cifra delle perle, e su telefono
   quelle due righe per cinque tessere erano un dito di schermo speso per niente. Il nome scende
   di un gradino (è l'etichetta, non la notizia: la notizia è quante perle prendi) e il prezzo
   gli si mette a fianco. `baseline` perché due corpi diversi si allineino sul rigo e non sui
   bordi; `wrap` perché un nome lungo (o una lingua che allunga) vada a capo invece di stringere
   il prezzo fino a spezzarlo. */
.pk-meta { display: flex; align-items: baseline; justify-content: center; gap: var(--sp-6);
  flex-wrap: wrap; }
.pk-t { font-family: Georgia, serif; font-size: var(--fs-base); line-height: 1.3; }
.pk-p { font-size: var(--fs-md); font-weight: 600; letter-spacing: .04em; color: #e9c87e;
  white-space: nowrap; }
.shop-pearls .shop-note { margin-bottom: 0; }
/* ANTEPRIMA «come appare in gioco»: stessa scocca del popup bundle, con l'arte grande in cima e
   sotto i componenti VERI del gioco (medaglione rotondo, tessera flotta, riga selettore). Si
   compra dopo aver visto l'oggetto addosso, non prima. Niente bagliori: cornice e velatura. */
.shop-prev { max-width: 360px; }
.spv-hero { margin: var(--sp-12) 0 var(--sp-8); border-radius: 12px; overflow: hidden;
  border: 1px solid var(--bronze-d); background: var(--panel-0);
  box-shadow: inset 0 1px 0 var(--edge-hi), 0 4px 12px rgba(0,0,0,.45); }
.spv-hero img { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; }
.spv-lbl { display: flex; align-items: center; gap: var(--sp-8); margin: var(--sp-12) 0 var(--sp-8);
  font-size: var(--fs-xs); letter-spacing: .12em; text-transform: uppercase; color: var(--ink-dim); }
.spv-lbl .shl, .spv-lbl .shr { flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--bronze-d)); }
.spv-lbl .shr { background: linear-gradient(90deg, var(--bronze-d), transparent); }
.spv-live { display: flex; flex-direction: column; gap: var(--sp-8); text-align: left;
  padding: var(--sp-10); border-radius: 8px; border: 1px solid var(--slate-3); background: rgba(0,0,0,.24); }
.spv-row { display: flex; align-items: center; gap: var(--sp-10); }
.spv-cap { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
.spv-cap b { font-size: var(--fs-sm); color: var(--ink); }
.spv-cap .subtle { font-size: var(--fs-xs); }
/* Le tessere flotta sono una griglia a cinque colonne: qui ne serve UNA, e di misura FISSA.
   Con `max-content` la colonna era larga quanto il NOME, e siccome la tessera e' quadrata a
   larghezza piena la miniatura cresceva coi nomi lunghi: scorrendo il bundle l'immagine e tutta
   la scheda si ridimensionavano a ogni pezzo — «Spy Drone» dava un francobollo, «Lightning
   Battery» un riquadro mezzo dito piu' grande, e la card ballava di cinquanta pixel. Una colonna
   fissa la inchioda: cambia il disegno dentro, non la cornice. */
.spv-tiles { flex: none; width: auto; grid-template-columns: 64px; }
/* E il nome occupa DUE RIGHE anche quando ne basta una: e' l'ultima cosa che poteva far salire
   e scendere il fondo della scheda mentre si scorre. */
.spv-tiles .bf-name { min-height: 2.3em; }
/* La merce nel popup bundle: griglia da SEI, che va a capo. Niente scorrimento laterale — in un
   popup si decide, e quel che si sta per pagare deve stare tutto sotto gli occhi. Le celle della
   stessa riga hanno la stessa altezza per costruzione (è una griglia), quindi i nomi lunghi non
   fanno ballare la fila. */
.sbm-strip { display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--sp-8) var(--sp-6);
  margin: 0 0 var(--sp-12); padding: var(--sp-2) 0 var(--sp-4); text-align: left; }
.sbm-strip .bf-name { font-size: var(--fs-xs); line-height: 1.15; }
.spv-unit { display: flex; flex-direction: column; gap: var(--sp-6); }
.spv-unit > .subtle { font-size: var(--fs-xs); }
.sc-info { font-size: 13px; color: #f2ecdb; }
.sc-info b { color: #e9c87e; }
.sc-acts { display: flex; gap: 8px; align-items: center; }
/* Nel vassoio i due tasti stanno su una riga sola e a piena larghezza: «Paga» prende lo spazio
   che avanza, perché è il gesto che si cerca col pollice. */
.shop-cart .sc-acts { width: 100%; }
.shop-cart .sc-pay { flex: 1; }
.btn-gold { background: linear-gradient(180deg, #e9c87e, #caa24a); color: #1a1206; font-weight: 700;
  border: 1px solid #caa24a; letter-spacing: .03em; }
.btn-gold:hover { background: linear-gradient(180deg, #f2d493, #d6ae54); }
/* riepilogo carrello nella finestra di conferma */
.shb-list { display: flex; flex-direction: column; gap: 6px; max-height: 42vh; overflow-y: auto; }
.shb-line { display: flex; justify-content: space-between; gap: 12px; font-size: 12px; color: #cfc8b8;
  padding: 6px 8px; border-radius: 8px; background: rgba(255,255,255,.03); }
.shb-line b { color: #e9c87e; }
.shb-total { display: flex; justify-content: space-between; margin-top: 10px; padding-top: 8px;
  border-top: 1px solid rgba(202,162,74,.25); font-size: 14px; color: #f2ecdb; }
.shb-total b { color: #e9c87e; }
/* finestra d'acquisto (confirm): chip BUNDLE + griglia del contenuto */
.shb { text-align: left; }
.shb-chip {
  display: inline-block; margin-bottom: 8px; padding: 2px 10px; border-radius: 4px;
  font-size: 10px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: #e9c87e; background: rgba(202,162,74,.14); border: 1px solid rgba(202,162,74,.45);
}
.shb-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; max-height: 42vh; overflow-y: auto; }
.shb-grid.one { grid-template-columns: minmax(0, 180px); justify-content: center; }
.shb-it img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; display: block; border-radius: 8px;
  border: 1px solid rgba(202,162,74,.45); background: #10141e; }
.shb-it span { display: block; margin-top: 4px; font-size: 10px; line-height: 1.25; color: #cfc8b8; }
.shb-note { display: block; margin-top: 10px; font-size: 11px; color: #8a8577; }
/* L'arte del pacco sopra il conto: si conferma guardando la cosa, non una riga di testo. */
.shb-art { margin: 0 0 12px; border-radius: 8px; overflow: hidden; border: 1px solid rgba(202,162,74,.4); }
.shb-art img { display: block; width: 100%; aspect-ratio: 1 / 1; object-fit: cover; }

/* ===== VESTE «EMPORIO» DEL DIALOGO DI CONFERMA (`cls: "cf-emporio"`) =====
   Il popup di conferma è uno solo per tutto il gioco, ed è giusto così: una sola logica, un
   solo comportamento della tastiera, un solo modo di chiudersi. Ma la sua SCOCCA è la plancia
   d'ottone su fondo blu, e dentro l'Emporium — nero, oro, titoli serif — arrivava come un
   ritaglio di un'altra applicazione incollato sopra la vetrina. Qui non cambia niente di come
   funziona: cambia solo di cosa è fatto. Fondo nero come i popup del Negozio, titolo serif
   dorato fra le due lame d'oro delle sezioni, tasti piatti come «Paga» e «Svuota» del carrello.
   NB: raggio e cornice arrivano già dalla regola comune dei pannelli (§ pannelli, `!important`),
   e vanno bene così — il Negozio usa gli stessi. Qui si riveste il resto. */
.cf-emporio .confirm-backdrop { background: rgba(3,4,8,.78); }
.cf-emporio .confirm-box { background: #0b0e16; padding: 20px 16px; }
.cf-emporio .confirm-title { display: flex; align-items: center; justify-content: center;
  gap: var(--sp-10); margin-bottom: var(--sp-12);
  font-family: Georgia, "Times New Roman", serif; font-size: var(--fs-2xl); letter-spacing: .03em;
  color: #e9c87e; text-transform: none; }
.cf-emporio .confirm-title .gi { width: 18px; height: 18px; }
.cf-emporio .confirm-body { color: #8a8577; }
/* I tasti dell'Emporium sono PIATTI: il rilievo d'ottone (inset della regola comune) qui stona
   accanto a «Paga» e «Svuota», che di rilievo non ne hanno. Da qui l'`!important`: non è una
   scorciatoia, è la stessa eccezione dichiarata che il Negozio si prende sul resto della veste. */
.cf-emporio .confirm-box .btn { box-shadow: none !important; font-size: var(--fs-sm);
  font-weight: 600; letter-spacing: .14em; text-transform: uppercase; }
/* Il testo dei tasti primari è marrone scuro `!important` in tutto il gioco, perché lì sotto c'è
   l'ottone pieno. Qui il fondo è una velatura su nero: senza questa riga la scritta sparisce. */
.cf-emporio .confirm-box .btn-primary { color: #e9c87e !important; border: 1px solid #caa24a;
  background: rgba(202,162,74,.12); }
.cf-emporio .confirm-box .btn-primary:hover { background: rgba(202,162,74,.2); }
.cf-emporio .confirm-box .btn-ghost { color: #8a8577; background: #0c0f14;
  border: 1px solid rgba(202,162,74,.28); }
.cf-emporio .confirm-box .btn-ghost:hover { border-color: rgba(202,162,74,.5); }
/* ===== VESTE «GILDA» DEL DIALOGO DI CONFERMA (`cls: "cf-gilda"`) =====
   Stessa idea della veste Emporio qui sopra, per i popup che escono DALLA chat di gilda
   (reaction, condividi rapporto, chiamata alle armi): la scocca blu di plancia atterrava sopra
   il foglio brace come un ritaglio di un'altra schermata. Cambia solo di cosa è fatta: il
   fondo è lo stesso rosso del foglio della chat, cornice cuoio, tasti scaldati. */
.cf-gilda .confirm-box {
  background:
    radial-gradient(120% 70% at 50% -10%, rgba(96,42,30,.55), transparent 72%),
    linear-gradient(180deg, #291411 0%, #1b0d0b 60%, #140908 100%);
  border-color: #5a3324;
}
.cf-gilda .confirm-box .btn-ghost { background: #2a1713; border-color: #4a2a1e; }
/* VESTE DEL VARCO, per i popup che escono dalle schermate del Mondo Rosso (chiamata alla
   caccia). Stessa idea: un dialogo di plancia blu sopra il cielo di ruggine sembrava il
   ritaglio di un'altra schermata. Qui i toni sono quelli di `.mondo-rosso`. */
.cf-rosso .confirm-box {
  background:
    radial-gradient(120% 70% at 50% -10%, rgba(150,52,34,.5), transparent 72%),
    linear-gradient(180deg, #33201b 0%, #241512 60%, #180d0a 100%);
  border-color: #6b3526;
}
.cf-rosso .confirm-box .btn-ghost { background: #2c1a14; border-color: #4d2e24; }
.cf-gilda .si-row { border-color: rgba(195,156,95,.16); }
.cf-gilda .cm-emoji { background: #2a1713; border-color: #4a2a1e; }
.cf-gilda .cm-emoji.on { border-color: var(--brass); background: rgba(233,181,74,.12); }
/* --- Equipaggia (stessa veste nero-oro) --- */
.shop-isl { margin: 2px 0 4px; }
/* TUTTE le icone del negozio sono QUADRATE (ordine di Guglielmo): tessere 3-per-riga
   su mobile, arte 1:1 anche nella tendina delle opzioni. */
.eq-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(106px, 1fr)); gap: 10px; padding: 2px; }
.eq-tile {
  border-radius: 8px; overflow: hidden; border: 1px solid rgba(202,162,74,.3);
  background: linear-gradient(180deg, rgba(24,29,42,.65), rgba(12,15,25,.65));
}
.eq-tile.skinned { border-color: #caa24a; }
.eq-tile.open { grid-column: 1 / -1; border-color: #caa24a; }
.eq-hit { display: block; width: 100%; padding: 0; margin: 0; border: 0; background: none; color: inherit; cursor: pointer; text-align: left; }
.eq-img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; display: block; background: #10141e; }
.eq-name { display: block; font-family: Georgia, serif; font-size: 12px; color: #f2ecdb; padding: 6px 8px 0; }
.eq-cur { display: block; font-size: 10px; letter-spacing: .05em; text-transform: uppercase; color: #8a8577; padding: 1px 8px 8px; }
.eq-tile.skinned .eq-cur { color: #e9c87e; }
/* Tessera del pezzo su cui è aperto il popup: resta segnata, così tornando indietro si sa
   subito su quale nave si stava lavorando. */
.eq-tile.on { border-color: #caa24a; }
/* LE LIVREE DISPONIBILI, dentro il popup: griglia che va a capo, non striscia da scorrere.
   In un popup si decide, e quello che si può mettere addosso deve stare tutto sotto gli occhi;
   se le livree sono tante scorre in verticale, il verso in cui si legge. */
.eq-picker { display: flex; gap: 8px; }
.eq-picker-pop { display: grid; grid-template-columns: repeat(auto-fill, minmax(92px, 1fr));
  max-height: 46vh; overflow-y: auto; margin: var(--sp-12) 0 var(--sp-4);
  scrollbar-width: none; }
.eq-picker-pop::-webkit-scrollbar { display: none; }
/* IL TASTO DELLE LIVREE COMPLETE: uno solo, da bordo a bordo, come i tab Acquista/Equipaggia —
   apre il popup, non applica niente da sé. Porta scritto quello che l'isola indossa adesso, così
   si sa cosa si sta per cambiare prima ancora di aprirlo. */
.eq-sets-btn { display: flex; align-items: center; justify-content: center; gap: var(--sp-8);
  width: 100%; margin: 2px 0 4px; padding: 10px 8px; cursor: pointer; border-radius: 4px;
  font-size: var(--fs-sm); font-weight: 600; letter-spacing: .14em; text-transform: uppercase;
  color: #e9c87e; background: rgba(202,162,74,.10); border: 1px solid rgba(202,162,74,.45);
  transition: border-color .12s, background .12s; }
.eq-sets-btn:hover { border-color: #caa24a; background: rgba(202,162,74,.18); }
.eq-sets-btn:active { transform: translateY(1px); }
.eq-sets-btn .gi { width: 15px; height: 15px; flex: none; }
.shop-pick { max-width: 420px; }
/* Titolo fra le due lame d'oro, come le sezioni della vetrina e i popup di conferma. */
.shop-pick .sm-title { display: flex; align-items: center; justify-content: center; gap: var(--sp-10); }
.eq-opt {
  flex: 0 0 92px; border: 1px solid rgba(202,162,74,.3); border-radius: 8px; overflow: hidden;
  background: #0c0f14; color: #8a8577; cursor: pointer; padding: 0; font-size: 11px;
}
.eq-opt.on { border-color: #caa24a; color: #e9c87e; }
.eq-opt-img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover; display: block; }
/* DUE RIGHE SEMPRE, anche quando il nome ne riempie una sola. «Predefinita» sta su una riga e
   «Bioship · Galeone da Guerra» su due: senza un'altezza riservata la prima tessera risaliva di
   mezzo centimetro rispetto alle vicine e la fila sembrava storta. Lo spazio si prenota, non si
   contratta ogni volta in base a quanto è lungo il nome. */
.eq-opt span { display: block; padding: 4px 6px 6px; line-height: 1.2; min-height: 2.4em; }
/* icone capitano nella gestione: tessere quadrate nude come la vetrina */
.shop-card.eq-cap { flex: 0 0 116px; cursor: pointer; border: 0; background: none; box-shadow: none; border-radius: 0; overflow: visible; }
.shop-card.eq-cap .sc-art { aspect-ratio: 1 / 1; border-radius: 8px; overflow: hidden; border: 1.5px solid rgba(202,162,74,.5); background: #10141e; }
.shop-card.eq-cap.on .sc-art { border-color: #caa24a; }
.shop-card.eq-cap .sc-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.shop-card.eq-cap .sc-name { font-family: Georgia, serif; font-size: 12px; color: #f2ecdb; padding: 6px 0 0; }
.shop-card.eq-cap .sc-foot { padding: 2px 0 0; justify-content: flex-start; }
.shop-card.eq-cap .sc-owned { font-size: 10px; color: #67b9a8; border: 0; padding: 0; letter-spacing: .06em; text-transform: uppercase; }
.shop-card.eq-cap .btn { min-height: var(--btn-h-xs); padding: 2px 10px; font-size: 11px; }
/* righe generiche riusate dalla gestione */
.shop-row { margin: 12px 0 4px; }
.shop-row-hd { display: flex; align-items: baseline; gap: 8px; margin: 0 2px 8px; }
.shop-row-hd b { font-family: Georgia, serif; letter-spacing: .12em; text-transform: uppercase; color: #e9ddc0; font-size: 12px; }
.shop-row-hd .gi { width: 14px; height: 14px; }
.shop-cards { display: flex; gap: 12px; overflow-x: auto; padding: 2px 2px 8px; }

/* Spedizione in volo (Azioni › Spedizioni): riga "Rientro tra …" a sinistra, "Rientra su
   <isola>" allineata a destra sulla STESSA riga. */
.exp-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.exp-dest { font-size: 12px; display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.exp-dest b { color: var(--brass-l); font-weight: 600; display: inline-flex; align-items: center; gap: 4px; }
.exp-dest .gi { width: 13px; height: 13px; }

/* ---- INTERDIZIONE (sospensione a tempo) ----
   Un ban che non caccia via: il capitano entra, vede il suo impero, ma le miniere sono ferme e
   nessuna azione passa. Deve essere IMPOSSIBILE non accorgersene, e altrettanto impossibile
   confonderlo con un guasto: banner rosso in testa con il timer, più una velatura rossa fissa
   su tutta la pagina. Niente glow — velo e bordi, ombre solo scure. */
.suspbar {
  position: relative; z-index: 21;
  background: linear-gradient(180deg, #6b1512, #3a0a08); color: #fff;
  border-bottom: 2px solid #b33a30; font-size: 12px; font-weight: 700;
  text-align: center; padding: 10px 12px; letter-spacing: .2px;
  box-shadow: 0 3px 12px rgba(0,0,0,.5);
}
.suspbar .sb-timer { font-variant-numeric: tabular-nums; font-weight: 800; }
.suspbar .sb-why { display: block; margin-top: 2px; font-weight: 600; opacity: .8; font-size: 11px; }

/* Velatura rossa: sopra tutto, non intercetta i clic (il gioco resta navigabile in lettura).
   Tenue di proposito — deve tingere l'ambiente, non impedire di leggere i numeri. */
body.suspended::after {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 9998;
  background: rgba(150, 24, 18, .13);
  box-shadow: inset 0 0 0 3px rgba(179, 58, 48, .55);
}

/* ---- Marchio del DISONORE ----
   Piccolo, allineato a destra nella scheda identità, e cliccabile: la spiegazione sta nella
   nuvoletta, non nella scheda. Scadenza propria (30g) separata dall'interdizione — quando la
   sanzione finisce il marchio resta, ed è quello che vedono gli altri.
   Niente glow: solo velatura rossa e bordo, ombre scure. */
/* Sotto il conteggio isole, allineato a destra (posizione indicata dall'utente). */
/* `position: relative` perché la nuvoletta si ancora QUI e vive in sovraimpressione. */
.pid-dish-row { position: relative; display: flex; justify-content: flex-end; margin-top: 2px; }
/* Solo l'SVG: nessun riquadro, nessun bordo, nessuno sfondo. */
.dish-badge { display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; flex: none; opacity: .9; }
.dish-badge:hover { opacity: 1; }
.dish-badge .gi { width: 14px; height: 23px; vertical-align: 0; }
/* SOVRAIMPRESSIONE: assoluta e fuori dal flusso, così aprirla non sposta di un pixel quello
   che c'è sotto. Ancorata all'angolo destro della riga dell'icona. */
.dish-pop { position: absolute; top: calc(100% + 6px); right: 0; z-index: 40;
  width: min(300px, 78vw); padding: 10px 12px; border-radius: 8px;
  background: linear-gradient(180deg, #3a0a08, #260605); border: 1px solid rgba(201, 70, 59, .5);
  box-shadow: 0 8px 22px rgba(0,0,0,.55);
  color: #ffdcd7; font-size: 12px; line-height: 1.55; text-align: left; }
.dish-pop b { color: #ff9b90; }
.dish-pop .dish-left { display: block; margin-top: 4px; opacity: .8; font-size: 11px; }
/* Rassicurazione, non accusa: piu' spenta della riga che la ospita. */
.dish-pop .dish-priv { opacity: .72; font-style: italic; }

/* «Sei qui» sulla busta: Comms non e' nel footer (si apre da qui), quindi entrandoci nessuna
   voce della barra resta accesa e si perde l'unico riferimento di dove ci si trova. */
.hud-btn.here { border-color: var(--amber-l); color: var(--amber-l); }
.hud-btn.here .gi { filter: brightness(1.25); }

/* ---- L'AVAMPOSTO (Azioni ▸ Il Varco) ---------------------------------------------------
   Due verbi sopra la piega, il resto è lettura.
   (`.acc-rosso` viveva qui: e' salito nella famiglia degli accenti, dove stanno gli altri otto.) */
.av-stato { display: flex; align-items: center; gap: 6px; font-size: 12px; margin: 10px 2px 8px; }
.av-stato.ok b { color: var(--good); }
.av-stato.attesa b { color: var(--amber-l); }
.av-verbi { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 10px; }
.av-verbi .btn { margin: 0; }
.av-big { font-family: var(--font-display); font-size: 18px; color: var(--brass-l); }
.av-riga { display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
  padding: 4px 0; font-size: 12px; border-top: 1px solid rgba(255,228,176,.06); }
.av-riga:first-of-type { border-top: 0; }
.av-riga .av-isl { flex: none; color: var(--brass-l); }
.av-riga .av-navi { text-align: right; min-width: 0; }

/* COSA RIPORTA QUESTA FLOTTA — il carico del rientro, appeso sotto le navi della SUA isola.
   Incassato e con un filo di ruggine a sinistra: si legge come una conseguenza di quel blocco,
   non come una sezione a sé. Il rail colorato qui non c'entra con quello delle Missioni: è un
   bordo di continuità dentro un blocco, non il marchio di una action-card. */
.vi-carico { margin-top: var(--sp-8); padding: var(--sp-8) var(--sp-10);
  border-radius: 8px; background: rgba(0,0,0,.22);
  border: 1px solid rgba(255,255,255,.06); }
.vc-head { display: flex; align-items: center; gap: var(--sp-8); width: 100%;
  padding: var(--sp-8) var(--sp-10); background: none; border: 0; cursor: pointer;
  font-family: inherit; text-align: left;
  font-size: var(--fs-sm); text-transform: uppercase; letter-spacing: .5px; color: var(--patina); }
.vi-carico.on .vc-head { border-bottom: 1px solid rgba(255,255,255,.06); }
.vc-head b.bad { color: var(--rust-l); }
/* OGNI FLOTTA IL COLORE DELLA SUA ISOLA (02/08/2026). Tre blocchi identici nella stessa scheda
   si leggevano come un elenco unico e si finiva per caricare la flotta sbagliata. Velo al 10% e
   un rail sinistro sottile: niente glow, solo pigmento. La madre resta neutra. */
.varco-isola { border-radius: var(--r-md); padding: var(--sp-8) var(--sp-10);
  border: 1px solid rgba(255,255,255,.06); }
.varco-isola + .varco-isola { margin-top: var(--sp-12); }
/* NIENTE RAIL A SINISTRA. Il bordo colorato sul lato sinistro e' il marchio delle action-card
   delle Missioni: usarlo qui vorrebbe dire insegnare due volte lo stesso segno per due cose
   diverse. Il velo e il medaglione dicono gia' di chi e' la flotta. */
.varco-isola.vi-tinta { background: var(--icol-velo);
  border-color: color-mix(in srgb, var(--icol) 28%, transparent); }
.vi-head { display: flex; align-items: center; gap: var(--sp-8); margin-bottom: var(--sp-8); }
.vi-head b { font-family: var(--font-display); }
.vi-head .av-slot { margin: -2px 0; }

/* LA STRISCIA «Inventario»: chiusa di default. Il rientro normale e' «riporto le navi»; il
   carico e' la cosa in piu' che si apre quando serve, e con tre isole aperte insieme la
   schermata diventava un muro di caselle in cui le flotte sparivano. */
.vi-carico { margin-top: var(--sp-8); border-radius: 8px; background: rgba(0,0,0,.22);
  border: 1px solid rgba(255,255,255,.06); overflow: hidden; }
.vc-corpo { padding: 0 var(--sp-10) var(--sp-8); }
.vc-sunto { margin-left: auto; font-size: var(--fs-xs); color: var(--ink);
  font-variant-numeric: tabular-nums; text-transform: none; letter-spacing: 0; }
.vc-chev { flex: none; opacity: .7; }
/* LE TESSERE d'inventario: una casella = un oggetto o una pila. Non hanno quantita' da
   comporre, quindi non hanno steppers: si toccano e basta.
   La cornice, la griglia e la casella sono quelle della borsa dell'Isola (`.inv-box`,
   `.inv-slots`, `.inv-slot`): e' LA STESSA ROBA vista da un'altra parte, e con due disegni
   diversi il giocatore doveva impararla due volte. Qui restano solo le differenze vere. */
/* SEI colonne, le stesse della borsa dell'Isola (13/08/2026, ordine del committente). Erano
   quattro per far posto a due righe di nome sotto l'icona; i nomi non ci sono piu' — la
   tessera si riconosce dalla faccia e il nome vive nel tooltip — quindi la deroga e' caduta
   con la sua ragione: vale la griglia base di `.inv-slots`. */
/* IL QUADRATO NON SI DEFORMA: `min-height: 0` toglie al contenuto il diritto di dettare
   l'altezza — la forma la decide il quadrato. */
.varco-slot { min-width: 0; min-height: 0; }
/* Il conto della pila e' lo STESSO badge del numero navi (.bf-ct): pillola incorniciata
   nell'angolo alto-destra. Prima era una macchia nera senza bordo, e accanto alle tessere
   della flotta — a cinque centimetri di distanza nella stessa schermata — sembrava un'altra
   cosa. Due disegni per lo stesso significato si imparano due volte. */
.varco-slot .is-val { position: absolute; top: -5px; right: -4px; padding: 0 var(--sp-4);
  border-radius: 4px; background: rgba(9,13,18,.92); border: 1px solid var(--bronze-d);
  color: var(--ink); line-height: 15px; box-shadow: 0 1px 3px rgba(0,0,0,.5);
  /* Un terzo piu' piccolo (ordine del committente). Si rimpicciolisce con `scale`, non con un
     corpo fuori scala: 10px meno il 30% farebbe 7, che non sta nella scala tipografica e
     aprirebbe un'eccezione da inseguire per sempre. `top right` come origine perche' il badge
     e' ancorato a quell'angolo: scalando dal centro si staccherebbe dalla casella. */
  transform: scale(.82); transform-origin: top right; }
.varco-slot[disabled] { opacity: .4; cursor: not-allowed; }

/* Nome e tetto stanno INSIEME a sinistra, uno sotto l'altro: il «max» spiega quel numero, e
   messo su una riga tutta sua sembrava una nota a pie' di pagina di un'altra cosa. */
.vc-riga { display: flex; align-items: center; gap: var(--sp-8); padding: var(--sp-4) 0; }
.vc-riga + .vc-riga { border-top: 1px solid rgba(255,255,255,.05); }
.vc-eti { display: flex; flex-direction: column; gap: var(--sp-2); min-width: 0; }
.vc-nome { display: flex; align-items: center; gap: var(--sp-6); font-size: var(--fs-base); min-width: 0; }
.vc-nome .ricon, .vc-nome .gi { flex: none; }
.vc-disp { font-size: var(--fs-xs); line-height: 1.25; }
.vc-riga .stepper { margin-left: auto; flex: none; }

/* Riga diagnostica delle notifiche: dice se QUESTO dispositivo e' davvero registrato.
   Permesso del telefono e iscrizione sul server sono due cose diverse, e quando divergono
   l'interruttore resta acceso e non arriva niente. Scritta con i soli token della scala. */
.np-diag { margin: var(--sp-8) 0 var(--sp-4); padding: var(--sp-8) var(--sp-10);
  border: 1px solid var(--bronze-d); border-radius: var(--r-md);
  background: rgba(0,0,0,.18); font-size: var(--fs-sm); line-height: 1.45; }
.np-diag.ok   { border-color: color-mix(in srgb, var(--good) 55%, var(--bronze-d)); }
.np-diag.warn { border-color: color-mix(in srgb, var(--amber) 55%, var(--bronze-d)); }
.np-diag.ko   { border-color: color-mix(in srgb, var(--rust) 55%, var(--bronze-d)); }
.np-diag .btn { margin-left: var(--sp-6); }

/* Vetrina dell'Armata: la flotta di OGNI capitano a tessere, con la sua livrea. Le chip di testo
   dicevano quante navi; le tessere dicono anche di chi sono — ed e' il motivo per cui una skin
   si compra. Righe fitte: qui i capitani sono trenta. */
.aw-fleet { margin-top: var(--sp-6); gap: var(--sp-4); }
.aw-fleet .bf-unit { padding: var(--sp-2) var(--sp-4); }

/* ---- Mondo Rosso: materiali, chiamata alla caccia, punti di controllo ---------------------
   Scritto sui soli token della scala. La riga «dove si trova» sotto ogni materiale non e'
   decorazione: senza, si accumulano Scaglie a migliaia senza capire perche' il Nucleo non
   arriva mai — e la risposta e' proprio cio' che deve far cambiare preda. */
.rm-lista { display: flex; flex-direction: column; gap: var(--sp-8); margin-top: var(--sp-8); }
.rm-riga { display: grid; grid-template-columns: 1fr auto; gap: var(--sp-4) var(--sp-8); align-items: baseline; }
.rm-nome { font-size: var(--fs-md); }
.rm-qta { font-size: var(--fs-lg); color: var(--brass-l); font-variant-numeric: tabular-nums; }
.rm-dove { grid-column: 1 / -1; font-size: var(--fs-sm); line-height: 1.4; }

.rc-card { border-color: var(--amber); }
.rc-top { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-8); }
.rc-vuota { display: flex; align-items: center; gap: var(--sp-8); font-size: var(--fs-sm); }
.rc-preda { display: flex; align-items: center; gap: var(--sp-10); margin-top: var(--sp-8);
  padding: var(--sp-8); border: 1px solid var(--bronze-d); border-radius: var(--r-md);
  background: rgba(0,0,0,.22); cursor: pointer; }
.rc-arte { flex: none; width: 44px; height: 44px; border-radius: var(--r-md); overflow: hidden;
  border: 1px solid var(--bronze-d); }
.rc-arte img { width: 100%; height: 100%; object-fit: cover; display: block; }
.rc-testo { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.rc-testo .subtle { font-size: var(--fs-sm); }
.rc-vai { flex: none; opacity: .8; }

/* Titolo della lista + la (i) del regolamento, sulla stessa riga. */
.rp-testa { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-8); }
/* I VERBI DELLE SCHEDE OLTRE IL VARCO. «Tutte» e' il gesto di servizio e sta a sinistra alla sua
   larghezza; il verbo vero prende tutto il resto in ottone, come in fondo al Teatro. La chiamata
   alla gilda e' un'altra cosa ancora: riga sua, tutta larga, e distanziata. */
.rz-cta { display: flex; align-items: stretch; gap: var(--sp-8); margin-top: var(--sp-12); }
.rz-cta .btn { margin: 0; min-height: var(--btn-h); }
.rz-cta .btn:last-child { flex: 1; }
.rz-chiama { width: 100%; margin: var(--sp-8) 0 0; }
.rp-lista { display: flex; flex-direction: column; gap: var(--sp-8); margin-top: var(--sp-8); }
/* TESSERA di un punto di controllo. Erano tre righe sottili in fondo a una card: la cosa piu'
   contesa del Mondo Rosso si leggeva come una nota a pie' di pagina, e tre bottoni identici
   incolonnati a destra erano l'unica cosa che si notava. Ora ogni punto e' un bersaglio a se':
   bandiera a sinistra, stato a colori, verbo a destra — e si tocca TUTTA, non solo il bottone.

   NIENTE RAIL COLORATO A SINISTRA. Ce l'aveva, ed era fuori regola: il bordo sinistro colorato in
   questo gioco appartiene alle action-card di Missioni e a nient'altro. Era sfuggito al controllo
   che lo spegne ovunque (`#views .card, …` piu' su) solo perche' quella lista nomina le classi una
   per una e `.rp-card` non e' una `.card` — cioe' non era una deroga, era una svista.
   Di chi e' il punto lo dicono gia' due cose, ed e' abbastanza: il colore della BANDIERA e il
   colore della parola di stato. Due segnali sullo stesso fatto, nessuna cimosa. */
.rp-card { position: relative; overflow: hidden;
  display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: var(--sp-10);
  width: 100%; text-align: left; cursor: pointer; padding: var(--sp-10) var(--sp-12);
  border-radius: var(--r-btn); border: 1px solid var(--bronze-d);
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.05); color: inherit; font: inherit; }
.rp-card:hover { border-color: var(--brass); }
/* L'ILLUSTRAZIONE DEL LUOGO, con lo stesso gesto delle card Azioni: immagine in `cover` sul fondo,
   velo di leggibilita' sopra, testo sopra ancora. Il velo non e' decorazione — su un'arte chiara
   il nome del punto e la parola di stato sparirebbero, e quelle due sono l'unica cosa che dice di
   chi e' il posto. Piu' fitto a sinistra, dove sta il testo, e piu' rado a destra, dove l'arte
   puo' respirare dietro il verbo. */
.rp-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  object-position: center; z-index: 0; }
.rp-card::after { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(90deg, rgba(9,13,18,.88) 0%, rgba(9,13,18,.72) 42%, rgba(9,13,18,.38) 100%); }
.rp-card > .rp-flag, .rp-card > .rp-corpo, .rp-card > .rp-verbo { position: relative; z-index: 2; }
.rp-flag { font-size: 18px; opacity: .85; display: flex; }
/* La bandiera prende il colore del proprietario: e' il segnale che prima stava nella cimosa. */
/* IL COLORE DELLA BANDIERA LO METTE LA GILDA, non lo stato. Qui c'erano tre righe che davano
   grigio/verde/ruggine a seconda che il punto fosse libero, mio o altrui — e non facevano
   niente: la `.gi` e' un'immagine di sfondo, e un'immagine non segue il `color`. Erano una
   manopola scollegata, di quelle che sembrano documentare una scelta e invece descrivono una
   cosa che a schermo non e' mai successa (le tre bandiere sono sempre state identiche).
   Ora l'icona e' una MASCHERA (`gi-tint`) e il colore arriva dal padrone del punto, in linea. */
.rp-flag .gi { width: 1em; height: 1em; }
.rp-corpo { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.rp-nome { font-size: var(--fs-md); }
.rp-stato { font-size: var(--fs-sm); }
.rp-verbo { font-family: var(--font-title); letter-spacing: .5px; font-size: var(--fs-sm);
  color: var(--amber); white-space: nowrap; }
/* Il colore lo porta la BANDIERA (`--pcol`, in linea sulla tessera): nome e stato lo seguono,
   cosi' la riga e il rombo sul globo si riconoscono senza legenda. I tre nomi di classe restano
   perche' dicono ancora COSA e' il punto — e reggono il fallback se `--pcol` non arriva. */
.rp-nome b { color: var(--pcol, var(--ink)); }
.rp-libero { color: var(--pcol, var(--ink-dim)); }
.rp-mio { color: var(--pcol, var(--good)); }
.rp-altrui { color: var(--pcol, var(--rust)); }
.rp-nota { margin-top: var(--sp-10); font-size: var(--fs-sm); line-height: 1.45; }
/* Cosa da' il rombo, sulla tessera: accanto alle coordinate, in tono d'ottone. Una parola e un
   numero — e' l'unica differenza fra i tre punti prima di aprirli. */
.rp-bon { display: inline-flex; align-items: center; gap: 2px; font-size: var(--fs-xs);
  color: var(--amber-l); white-space: nowrap; }
.rp-bon .gi { width: 11px; height: 11px; flex: none; }
.rp-picks { display: flex; flex-direction: column; gap: var(--sp-6); }
.rp-pick { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-8); }
.rp-pick .rp-n { width: 92px; text-align: right; }

.rp-isole { display: flex; gap: var(--sp-6); flex-wrap: wrap; margin-bottom: var(--sp-8); }
.rp-isole .rp-isl { font-size: var(--fs-sm); }

/* QUANTO E' SALDO IL POSSESSO: filo in fondo alla tessera, fuori dalla griglia (la card e' un
   `grid` a tre colonne e un quarto figlio in flusso la spaccherebbe). Niente numeri qui — il
   numero sta nel Teatro; questa serve solo a far vedere che sta scendendo. */
.rp-ctrl { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; z-index: 2;
  background: rgba(0,0,0,.45); }
.rp-ctrl > i { display: block; height: 100%; background: var(--pcol, var(--brass)); }
/* L'ORDINE DELL'UFFICIALE sulla tessera: un pallino e una parola, e basta. E' un richiamo, non
   un annuncio — se occupasse una riga intera diventerebbe la cosa piu' grossa della tessera e
   coprirebbe lo stato, che e' quello che si legge sempre. */
.rp-ordine { display: inline-flex; align-items: center; gap: var(--sp-6); margin-top: 2px;
  font-size: var(--fs-xs); font-family: var(--font-title); letter-spacing: .4px;
  text-transform: uppercase; min-width: 0; }
.rp-ordine.rp-ord-rit { color: #e8879a; }
.rp-ordine.rp-ord-rin { color: var(--amber-l); }
.rp-card.has-ord { border-color: rgba(195,156,95,.5); }
/* Il PING: opacita' che respira, nessun alone. Le ombre luminose non esistono in questo gioco. */
.rp-ping { width: 6px; height: 6px; border-radius: 50%; flex: none; background: currentColor;
  animation: rp-ping-p 1.8s ease-in-out infinite; }
@keyframes rp-ping-p { 0%,100% { opacity: .35; } 50% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .rp-ping { animation: none; opacity: .9; } }

/* ═══ IL TEATRO DEL VARCO ═════════════════════════════════════════════════════════════════
   La schermata piena di un punto conteso. Vive dentro `.report-overlay.mondo-rosso`, quindi
   pannelli, cornici e fondo arrivano gia' accordati sulla ruggine: qui c'e' solo quello che il
   Teatro ha in piu' — la testata illustrata, le due barre e le due liste.
   La grammatica e' quella del Teatro di Guerra del Pinnacolo (barra di controllo, barra
   segmentata della presenza, chip per gilda): un secondo linguaggio per la stessa idea sarebbe
   una seconda cosa da imparare per chi il Pinnacolo lo gioca gia'. */
/* LE CARD DELLA CONTESA SONO CARD DI GIOCO, non pannelli di rapporto. (Erano scopate su
   `#varco-teatro`: dal 15/08/2026 quel pannello non esiste piu' e le stesse card vivono nella
   scheda del punto, che e' un overlay identico — stesso `.report-body`, stesso problema.)
   La lastra sbalzata del gioco (`#views .card`) e' scopata dentro `#views`, e questa schermata
   vive in un overlay: cadeva sulla `.card` di base — spigolo da 13, gradiente piatto, e il RAIL
   D'OTTONE A SINISTRA che in questo gioco appartiene solo alle action-card di Missioni. Qui la
   lastra si riscrive per esteso invece di allargare quel selettore: il blocco di `#views` ha il
   fondo azzurro cablato con `!important`, e di la' dal Varco i pannelli sono di ruggine.
   `margin-bottom` esplicito perche' `.report-body > .card` lo azzera: dentro un rapporto la card
   e' una sola, qui sono sei incollate l'una all'altra. */
#rosso-overlay .card {
  border: 1px solid var(--rw-brass);
  border-radius: var(--r-sm);
  background: linear-gradient(180deg, var(--panel-1), var(--panel-0));
  box-shadow: inset 0 1px 0 rgba(240,209,138,.16), inset 0 -3px 8px rgba(0,0,0,.5),
              0 2px 8px rgba(0,0,0,.45);
  margin: 0 0 var(--sp-10);
}
/* Titoli in Cinzel come ovunque nel gioco: `#views` li accorda e qui non arrivava. */
/* Il secondo selettore non e' un doppione: nelle due card col fondo il titolo sta dentro
   `.tv-arte-in`, quindi non e' piu' figlio diretto di `.card-body` e senza questo perdeva il
   Cinzel restando l'unico titolo della schermata scritto in un'altra faccia. */
#rosso-overlay .card > .card-body > b,
#rosso-overlay .tv-arte-in > b { font-family: var(--font-display); letter-spacing: .6px; }
/* L'ARTE DEL LUOGO VA DA BORDO A BORDO. Stava dentro `.card-body`, cioe' dentro i 12px di
   padding della card: l'illustrazione aveva una cornice di fondo scuro su tutti e quattro i lati
   e sembrava un francobollo incollato invece del posto in cui sei. Ancorata alla CARD (che e'
   gia' `position: relative` e `overflow: hidden`, quindi si taglia sugli angoli tondi) riempie
   la testata; il testo resta rientrato perche' il padding lo tiene lui. */
/* LA BARRA DI CONTROLLO NELLA SCHEDA DEL PUNTO. Stava nella testata del Teatro, che aveva la sua
   card col fondo dipinto; qui la testata e' gia' `.rz-testa` con l'illustrazione, e la barra le
   va SOTTO — attaccata, senza una seconda cornice: sono la stessa notizia (dove sei, dove stai
   andando) e due scatole per una notizia sola sono una scatola di troppo. */
.rz-ctrl { display: flex; flex-direction: column; gap: var(--sp-6); padding: var(--sp-10) 0 0; }
.tv-head, .tv-arte { position: relative; overflow: hidden; }
.tv-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  object-position: center; z-index: 0; }
.tv-head::after { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(180deg, rgba(9,13,18,.30) 0%, rgba(9,13,18,.72) 46%, rgba(9,13,18,.92) 100%); }
.tv-head-in { position: relative; z-index: 2; display: flex; flex-direction: column; gap: var(--sp-6); }
/* LE DUE CARD CHE HANNO UN FONDO PROPRIO: il convoglio e l'ordine alla gilda. Stessa regola
   della testata — arte ancorata alla CARD, non a `.card-body`, cosi' arriva ai quattro bordi e
   si taglia sugli angoli tondi invece di sembrare un francobollo incollato dentro il padding.
   LA VELATURA E' PIU' PIENA di quella della testata, e non e' un capriccio: li' l'arte e' un
   eroe alto dove il testo sta in fondo, qui e' una fascia dietro a righe di testo su tutta
   l'altezza. Con la sfumatura della testata i numeri delle navi finivano sopra le nuvole
   chiare e sparivano. Piatta al 78%, appena piu' scura in basso dove ci sono i bottoni. */
.tv-arte::after { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(180deg, rgba(9,13,18,.52) 0%, rgba(9,13,18,.62) 52%, rgba(9,13,18,.80) 100%); }
/* Il contenuto sale sopra la velatura con un involucro suo. NON si mette `position: relative`
   su `.card-body`: l'immagine ci sta dentro, e ancorarla al body invece che alla card la
   riporterebbe esattamente dentro i 12px di padding da cui l'abbiamo tirata fuori. */
.tv-arte-in { position: relative; z-index: 2; }
.tv-nome { display: flex; align-items: center; gap: var(--sp-8); font-size: 18px;
  font-family: var(--font-display); }
.tv-flag { display: flex; font-size: 18px; }
.tv-flag .gi { width: 1em; height: 1em; }
.tv-owner { font-size: var(--fs-sm); }
.tv-libero { color: var(--ink-dim); }
.tv-ctrl-lab { display: flex; align-items: baseline; justify-content: space-between;
  margin-top: var(--sp-4); font-size: var(--fs-sm); color: var(--ink-dim); }
.tv-ctrl-lab b { font-family: var(--font-display); font-size: 16px; color: var(--brass-l); }
/* LA BARRA DI CONTROLLO. E' l'unica cosa della schermata che si muove da sola mentre la guardi,
   quindi sta in alto e la si legge per prima. Il colore dice se sta lavorando per te. */
.tv-ctrl { height: 8px; border-radius: var(--r-pill); overflow: hidden; background: rgba(0,0,0,.5);
  border: 1px solid var(--bronze-d); }
.tv-ctrl > i { display: block; height: 100%; background: var(--brass);
  transition: width .4s ease; }
.tv-ctrl.mio > i { background: linear-gradient(90deg, #4f8f63, #79b98a); }
.tv-ctrl.altrui > i { background: linear-gradient(90deg, #8d4a3f, #c07a58); }
/* LA PREVISIONE: la riga per cui la schermata esiste. La barra dice dove sei, questa dice dove
   stai andando — e quanto tempo hai per cambiare idea. */
.tv-cast { margin-top: var(--sp-6); font-size: var(--fs-sm); display: flex; align-items: center;
  gap: var(--sp-6); padding: var(--sp-8) var(--sp-10); border-radius: var(--r-btn);
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.28); }
.tv-cast .gi { width: 14px; height: 14px; flex: none; }
.tv-cast.good { border-color: rgba(90,160,110,.5); color: #a7d6b4; }
.tv-cast.bad { border-color: rgba(190,90,90,.5); color: #e8a2a2; }
.tv-cast.hold { color: var(--ink-dim); }
/* L'ORDINE. Striscia sotto la testata perche' e' la cosa che cambia la decisione che stai per
   prendere. Bordo e tinta, nessun alone. */
.tv-ordine { display: flex; align-items: center; gap: var(--sp-8); margin: var(--sp-8) 0;
  padding: var(--sp-8) var(--sp-10); border-radius: var(--r-btn);
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.3); font-size: var(--fs-sm); }
.tv-ordine.rit { border-color: rgba(190,90,110,.55); color: #e8879a; }
.tv-ordine.rin { border-color: rgba(195,156,95,.55); color: var(--amber-l); }
.tv-ord-t { min-width: 0; flex: 1; }
.tv-ord-t b { font-family: var(--font-title); letter-spacing: .5px; text-transform: uppercase; }
.tv-ord-w { flex: none; font-size: var(--fs-xs); }
/* LA CONTESA: barra segmentata, un segmento per gilda, larghezza = quota di potenza. Il colore
   di ogni segmento e' quello della gilda — lo STESSO calcolo dei ping sul globo. */
.tv-bar { display: flex; height: 12px; border-radius: var(--r-pill); overflow: hidden;
  border: 1px solid var(--bronze-d); background: rgba(0,0,0,.5); margin: var(--sp-8) 0 var(--sp-6); }
.tv-bar > i { display: block; height: 100%; background: var(--gc, var(--brass));
  border-right: 1px solid rgba(0,0,0,.45); }
.tv-bar > i:last-child { border-right: 0; }
.tv-bar > i.tv-seg-foe { opacity: .72; }
.tv-legend { display: flex; flex-wrap: wrap; gap: var(--sp-6); }
.tv-leg { display: inline-flex; align-items: center; gap: var(--sp-6); padding: var(--sp-2) var(--sp-8);
  border-radius: var(--r-btn); border: 1px solid var(--bronze-d); background: rgba(0,0,0,.25);
  font-size: var(--fs-sm); }
.tv-leg b { color: var(--gc, var(--ink)); }
.tv-leg .gi { width: 12px; height: 12px; }
.tv-leg.tv-seg-mia { border-color: rgba(195,156,95,.55); }
.tv-pw { font-family: var(--font-display); font-size: var(--fs-md); color: var(--brass-l);
  font-variant-numeric: tabular-nums; }
.tv-tetto, .tv-nota { margin-top: var(--sp-8); font-size: var(--fs-sm); line-height: 1.45; }
/* COSA DA' IL ROMBO: una riga di pastiglie sotto il nome, dentro la testata. Era una card
   intera con due paragrafi; la ricompensa non e' una notizia, e' un'etichetta del posto. */
.tv-bonus { display: flex; flex-wrap: wrap; gap: var(--sp-6); margin: var(--sp-2) 0 var(--sp-4); }
.tv-b { display: inline-flex; align-items: center; gap: var(--sp-4); padding: 2px var(--sp-8);
  border-radius: var(--r-sm); border: 1px solid var(--bronze-d); background: rgba(0,0,0,.32);
  font-size: var(--fs-sm); color: var(--ink); white-space: nowrap; }
.tv-b .gi { width: 12px; height: 12px; flex: none; }
/* LA CONTESA, UNA RIGA PER GILDA. A server pieno su un rombo ne arrivano otto: otto blocchi di
   navi a icone grandi sono una schermata chilometrica. La riga porta i tre numeri che decidono e
   la flotta vera si apre a richiesta. */
.tv-glist { display: flex; flex-direction: column; margin-top: var(--sp-8); }
.tv-g { border-top: 1px solid rgba(195,156,95,.16); }
.tv-g:first-child { border-top: 0; }
/* DUE BERSAGLI SULLA STESSA RIGA, e non e' un vezzo: il nome della gilda apre la sua scheda,
   i numeri aprono la sua flotta. Un bottone dentro un bottone non e' HTML valido, quindi sono
   due fratelli — il primo si prende la larghezza che gli serve, il secondo tutto il resto. */
/* QUATTRO COLONNE, e l'intestazione le nomina. Senza, quella riga di numeri e' «42K 277 83%» e
   nessuno sa cosa sia il secondo: l'intestazione e' minuscola e in tono spento perche' si legge
   UNA volta e poi non deve piu' dare fastidio. Le larghezze sono le stesse fra intestazione e
   riga — cambiarne una qui vuol dire cambiarla in tutte e due, ed e' per questo che stanno nella
   stessa dichiarazione. */
.tv-ghead, .tv-g-num { --tvc: 54px 44px 42px 12px; }
.tv-ghead { display: grid; grid-template-columns: 1fr var(--tvc); gap: var(--sp-8);
  align-items: baseline; margin-top: var(--sp-10); padding-bottom: var(--sp-4);
  border-bottom: 1px solid rgba(195,156,95,.20);
  font-family: var(--font-title); font-size: var(--fs-xs); letter-spacing: .5px;
  text-transform: uppercase; color: var(--ink-dim); }
.tv-g-r { display: flex; align-items: center; gap: var(--sp-8); }
.tv-g-id, .tv-g-num { background: none; border: 0; color: inherit; font: inherit;
  cursor: pointer; padding: var(--sp-8) 0; text-align: left; }
/* IL NOME PRENDE SOLO LA SUA LARGHEZZA (`flex: none`). Con `flex: 1` si mangiava tutto il vuoto
   fino ai numeri, e un tocco a meta' riga — cioe' quasi ovunque — apriva la scheda della gilda
   invece della tendina. Lo spazio libero appartiene al secondo bottone: nome = scheda, tutto il
   resto della riga = flotta. */
.tv-g-id { display: inline-flex; align-items: center; gap: var(--sp-6); flex: none;
  color: var(--gc, var(--ink)); min-width: 0; }
.tv-g-nm { display: inline-flex; align-items: baseline; min-width: 0; }
.tv-g-id b { color: var(--gc, var(--ink)); }
.tv-g-id:hover b { text-decoration: underline; }
/* La cella vuota in testa assorbe lo slack: cosi' il bottone copre tutta la riga fino al bordo,
   e le quattro colonne restano incolonnate sotto l'intestazione, che ha la stessa griglia. */
.tv-g-num { flex: 1; display: grid; grid-template-columns: 1fr var(--tvc);
  align-items: baseline; gap: var(--sp-8); min-width: 0; }
/* La cella libera in mezzo alla riga: ci vive la targhetta CONTROLLA, che cosi' non spinge ne'
   il nome ne' i numeri. `overflow: hidden` perche' su schermo strettissimo deve sparire lei,
   non far scappare le colonne. */
.tv-g-gap { min-width: 0; display: flex; align-items: center; justify-content: flex-start; }
/* I numeri incolonnati: tabellari, a destra, e tutti larghi uguale. */
.tv-c { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* BANDIERA E TAG DELLO STESSO COLORE: e' un fatto solo — di chi e' questa flotta. */
.tv-g-flag { display: flex; font-size: var(--fs-lg); color: var(--gc, var(--ink)); }
.tv-g-flag .gi { width: 1em; height: 1em; }
/* CHI CONTROLLA, a parole. La stella da sola in una lista di otto righe e' un puntino, e
   «chi tiene il punto» e' la prima domanda che si fa chi apre questa schermata. */
.tv-g-cap { display: inline-flex; align-items: center; gap: 2px; flex: none; font-style: normal;
  white-space: nowrap; padding: 1px var(--sp-4); border-radius: var(--r-sm);
  border: 1px solid var(--amber-l); color: var(--amber-l);
  font-family: var(--font-title); font-size: var(--fs-xs); letter-spacing: .5px;
  text-transform: uppercase; }
.tv-g-cap .gi { width: 10px; height: 10px; }
.tv-g-num .tv-c { font-size: var(--fs-sm); color: var(--ink); }
.tv-g-num .tv-pw { font-size: var(--fs-md); }
.tv-g-x { color: var(--ink-dim); font-size: var(--fs-sm); text-align: right; }
.tv-g.mia { background: rgba(195,156,95,.07); }
.tv-g-open { padding: 0 0 var(--sp-10); }
/* ICONE PICCOLE per le flotte altrui: stessa tessera, otto per riga e senza il nome sotto —
   quello che serve qui e' «di che pasta e' fatta», non leggerne il nome una per una. */
.bf-units.bf-mini { grid-template-columns: repeat(6, 1fr); gap: var(--sp-4); }
@media (min-width: 700px) { .bf-units.bf-mini { grid-template-columns: repeat(9, 1fr); } }
.bf-mini .bf-name { display: none; }
.bf-mini .bf-ct { font-size: var(--fs-xs); line-height: 13px; padding: 0 2px; top: -4px; right: -3px; }
.bf-mini .art-xs { border-radius: var(--r-sm); }
/* I COMPAGNI: tre colonne fisse, il nome che si accorcia e i numeri incolonnati. Una lista di
   capitani si scorre per confrontare, e senza colonne allineate non si confronta niente. */
.tv-crew { display: flex; flex-direction: column; margin-top: var(--sp-8); }
.tv-crew-r { display: grid; grid-template-columns: 1fr auto auto; align-items: baseline;
  gap: var(--sp-10); padding: var(--sp-6) 0; border-top: 1px solid rgba(195,156,95,.16);
  font-size: var(--fs-sm); }
.tv-crew-r:first-child { border-top: 0; }
.tv-crew-r.io { color: var(--brass-l); }
.tv-crew-n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  display: inline-flex; align-items: center; gap: var(--sp-6); }
.tv-crew-n .gi { width: 13px; height: 13px; flex: none; }
.tv-crew-i, .tv-crew-p { font-variant-numeric: tabular-nums; white-space: nowrap; }
.tv-crew-i { color: var(--ink-dim); text-align: right; }
.tv-crew-p { min-width: 72px; text-align: right; }
.tv-ord-in { width: 100%; margin-top: var(--sp-8); }
/* I TRE ORDINI SONO TRE POSIZIONI DELLA STESSA MANOPOLA, non tre bottoni: «rinforzi», «ritirata»
   e «nessun ordine» sono lo stesso comando con tre valori, e uno solo e' vero alla volta. Prima
   erano un bottone d'ottone, uno neutro e un fantasma — tre pesi diversi per tre gesti gemelli, e
   il primo si confondeva col verbo d'ottone in fondo alla pagina, che invece manda una flotta.
   `.seg` e' la manopola di casa: stessa forma per tutti, la posizione attiva in ambra. */
.tv-ord-seg { margin-top: var(--sp-8); }
.tv-ord-seg button { min-height: 34px; font-size: var(--fs-sm); }
/* IL VERBO in fondo: uno solo, e porta dove si compone la flotta. */
.tv-verbi { margin: var(--sp-12) 0 var(--sp-8); }
.tv-verbi .btn { width: 100%; margin: 0; }

/* ═══ LA PELLE DI RUGGINE ═══════════════════════════════════════════════════════════════
   Di la' dal Varco il cielo e' rosso, il globo e' rosso, le bestie sono rosse — e le schede
   erano rimaste dell'azzurro-ardesia di casa: aprivi la scheda di una creatura e sembrava di
   essere tornato indietro dal Portale.
   Qui NON si riscrive nessuna regola e non si aggiunge nessun fondo: si RIACCORDANO i token
   dei pannelli su una famiglia calda, e tutto quello che li usa — card, righe, tessere,
   cornici, il fondo della pagina-overlay — segue da solo. E' anche l'unico modo perche' la
   cosa regga: una schermata nuova del Mondo Rosso nasce gia' di ruggine senza che nessuno
   se ne ricordi.
   I sei valori non sono scelti a occhio: hanno la STESSA luminanza dei blu che sostituiscono
   (25, 34, 46 per i pannelli; 21, 32, 43, 56 per gli ardesia). Cambia la tinta, non il
   contrasto — quindi ogni gerarchia gia' calibrata sopra questi token resta esattamente
   dov'era, e nessun testo diventa piu' o meno leggibile di prima.
   L'ottone NON si tocca: le cornici, l'ambra e la barra di vita sono l'identita' del gioco e
   valgono di qua come di la'. */
/* NIENTE GRANA SULLE SUPERFICI. Provata il 02/08/2026 e bocciata a vista: un velo di rumore su
   tutta la pagina sabbia le ombre e sporca il testo che ci sta sopra: le lettere prendono un
   bordo di pulviscolo e la scheda smette di sembrare stampata bene. Se la piattezza va rotta, si
   rompe con la LUCE (bagliori, velature ampie) o con l'arte, non con il rumore. Non ritentare. */
.mondo-rosso {
  --panel-0: #261613; --panel-1: #33201b; --panel-2: #432a23;
  --slate-0: #1f1410; --slate-1: #2f1e19; --slate-2: #402820; --slate-3: #4e332b;
  /* Anche il bottone neutro: era l'ultima cosa azzurra rimasta su una pagina di ruggine, e si
     notava proprio perche' era l'unica. Stessa luminanza dei due valori che sostituisce. */
  --btn-1: #4d2e24; --btn-0: #2c1a14;
}

/* LA PORTA — stato del Varco e i due verbi, in un blocco solo.
   La riga di stato era testo nudo: nessun fondo, nessun bordo, dodici pixel di corpo, in una
   pagina dove ogni altra cosa sta dentro una card. Galleggiava sotto la testata come una
   didascalia che si era staccata, e diceva la cosa piu' importante della schermata — si passa
   o non si passa. I due verbi stavano sotto, staccati, senza niente che dicesse che dipendono
   da lei: a Varco chiuso si vedevano due tasti spenti e la spiegazione sembrava un'altra frase.
   Insieme il nesso e' visibile: questo e' lo stato, e questi sono i verbi che ne conseguono. */
.av-porta .card-body { display: flex; flex-direction: column; gap: var(--sp-10); }
.av-porta .av-stato { margin: 0; }
.av-porta .av-verbi { margin: 0; }

/* ── LA TEMPESTA OSCURA ──────────────────────────────────────────────────────────────────────
   Due posti, due mestieri. Sul globo il velo di grana dice CHE c'è; la striscia in cima dice
   per QUANTO. Nella card del Varco il banner dice cosa fare — ed è l'unico dei tre che parla
   a chi ha le navi in mano.
   Niente glow (regola di casa): fondo velato, filo rosso, nessun alone. In preavviso il tono
   è più smorto dell'attiva: «sta per succedere» e «sta succedendo» non si possono leggere
   uguale, o il preavviso non serve a niente. */
.av-tempesta {
  display: flex; align-items: center; gap: var(--sp-6); flex-wrap: wrap;
  margin: 0 0 var(--sp-10); padding: var(--sp-8) var(--sp-10);
  border: 1px solid rgba(180,36,58,.42); border-radius: var(--r-8);
  background: rgba(94,18,32,.20); color: var(--ink);
  font-size: 12px; line-height: 1.35;
}
.av-tempesta b { color: #e8879a; font-family: var(--font-display); }
.av-tempesta .tmp-t { font-variant-numeric: tabular-nums; font-weight: 700; color: #f0a9b6; }
.av-tempesta .gi { width: 14px; height: 14px; flex: none; }
/* IN CORSO: il bordo si fa pieno e il fondo più fondo. Il respiro è LENTO e in opacità — non
   in scala e non in ombra: una cosa che pulsa forte sopra un pannello di comando stanca in
   dieci minuti, e questa resta accesa fino a diciotto ore. */
.av-tempesta.is-attiva {
  border-color: rgba(180,36,58,.75); background: rgba(94,18,32,.34);
  animation: tempesta-respiro 5.5s ease-in-out infinite;
}
@keyframes tempesta-respiro { 0%, 100% { opacity: 1; } 50% { opacity: .82; } }
@media (prefers-reduced-motion: reduce) { .av-tempesta.is-attiva { animation: none; } }

/* La striscia sul globo: UNA RIGA, e mai di più.
   La prima versione era una pillola con la frase intera dentro: su un telefono andava a capo
   tre volte, diventava un blocco alto quanto un pannello e si accavallava alla targhetta dei
   voli. Sopra il globo questa è una DIDASCALIA — se cresce, ha già smesso di fare il suo
   mestiere. Niente scatola, niente sfondo: un filo sotto e basta. Non intercetta il dito:
   sul mappamondo ogni pixel che non ruota è un pixel rubato. */
#worldmap-overlay .wm-temp {
  position: absolute; top: calc(var(--sp-12) + env(safe-area-inset-top));
  left: var(--sp-12); right: calc(var(--sp-32) + var(--sp-24));
  z-index: 3; display: none; pointer-events: none;
}
#worldmap-overlay .wm-temp.on { display: block; }
#worldmap-overlay .wm-temp-in {
  display: flex; align-items: center; gap: var(--sp-6);
  padding: 0 0 var(--sp-4); border-bottom: 1px solid rgba(180,36,58,.34);
  font-size: 11px; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#worldmap-overlay .wm-temp.is-attiva .wm-temp-in { border-bottom-color: rgba(180,36,58,.7); }
#worldmap-overlay .wm-temp-in b { color: #e8879a; font-family: var(--font-display); flex: none; }
#worldmap-overlay .wm-temp-in .tmp-t { font-variant-numeric: tabular-nums; font-weight: 700; flex: none; }
#worldmap-overlay .wm-temp-in .tmp-piu {
  font-style: normal; color: var(--muted); overflow: hidden; text-overflow: ellipsis;
}
#worldmap-overlay .wm-temp-in .gi { width: 13px; height: 13px; flex: none; }
/* Sotto i 560px la coda sparisce: restano nome e tempo, che sono le due cose per cui si legge. */
@media (max-width: 560px) { #worldmap-overlay .wm-temp-in .tmp-piu { display: none; } }
/* La striscia c'è → la targhetta dei voli scende di una riga sola, non di un pannello.
   Misurato: la striscia finisce a 33px, quindi a --sp-32 le due si toccavano per un pixel. */
#worldmap-overlay .wm-temp.on ~ .wm-miss {
  top: calc(var(--sp-32) + var(--sp-10) + env(safe-area-inset-top));
}

/* Castello (madre) o isola (colonia) in testa alla riga del bersaglio, tinto del colore di
   gilda. Sta dentro la riga del testo e ci si allinea: e' un segno di lettura, non un'icona
   che si prende un suo posto. */
.tgt-sub .tgt-isl { width: 12px; height: 12px; margin-right: var(--sp-4);
  vertical-align: -1px; display: inline-block; }
.tgt-sub .tgt-isl-madre { color: var(--brass); }   /* la madre e' oro, sempre e per tutti */
.tgt-sub .tgt-isl-col   { color: var(--patina); }  /* la colonia, verderame: e' la secondaria */

/* MERCE IN VENDITA — le stesse caselle dell'inventario, non tessere tutte loro. La rarità la
   porta il bordo (le classi .rar-* esistono già), la selezione è l'ottone pieno come altrove.
   Il baratto resta la prima casella: è l'unica che non è un oggetto, e sta in testa perché è
   sempre disponibile anche quando non hai niente da vendere. */
.inv-slot.mkt-slot .is-val { color: var(--patina); font-weight: 700; }
.inv-slot.mkt-slot.on { border-color: var(--brass-l); box-shadow: inset 0 0 0 2px var(--brass-l); }
.inv-slot.mkt-slot.on .is-val { color: var(--amber-l); }

/* «Il deposito si sta riempiendo»: avviso dentro la card del carico, non un pannello a sé.
   Ruggine velata e un filo a sinistra come le altre note di conseguenza; niente alone. */
.vc-corpo .vc-avviso {
  display: flex; align-items: flex-start; gap: var(--sp-6);
  margin: var(--sp-8) 0 0; padding: var(--sp-6) var(--sp-8);
  border-left: 2px solid rgba(180,36,58,.55); border-radius: var(--r-4);
  background: rgba(94,18,32,.16); font-size: 11px; line-height: 1.35; color: var(--ink-dim);
}
.vc-corpo .vc-avviso .gi { width: 13px; height: 13px; flex: none; align-self: center; }

/* Anello a piu' affissi nella griglia di vendita: i pallini dicono QUANTI sono, come sulle
   caselle degli anelli nell'Isola. L'icona grande resta quella del primo bonus. */
.inv-slot.mkt-slot .rt-pips { display: flex; gap: var(--sp-2); }
.inv-slot.mkt-slot .rt-pips i { width: 4px; height: 4px; background: var(--amber-l);
  transform: rotate(45deg); display: block; }

/* La maniglia del Mondo Rosso sulla card del Varco: stessa forma e stessa posizione di quella
   del Mondo, altra livrea. Ottone caldo che vira al rosso — è la stessa porta, verso l'altro
   pianeta. Niente alone: il rosso sta nel fondo e nel bordo, come ovunque. */
.ac-map-btn.ac-map-rosso {
  background: linear-gradient(180deg, #e9d09b, #b4243a);
  border-color: #7d1526;
}
.ac-map-btn.ac-map-rosso:hover { background: linear-gradient(180deg, #f0dbaa, #c82a44); }
.ac-map-btn.ac-map-rosso .gi { color: #2a0d12; }
/* MATERIALE DI SEASON nella stiva del trasporto: icona + quantita' della pila, dentro la stessa
   tessera degli altri oggetti. Niente cornice di rarita' (un materiale non ne ha una) e niente
   glow: solo il bordo neutro della tessera. */
.mkt-tile.is-mat { border-color: var(--line); }
.logi-mat { display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px; line-height: 1; }
.logi-mat .gi { width: 20px; height: 20px; }
.logi-mat b { font-size: 11px; color: var(--ink); }

/* Gli stili INLINE che il JS scrive sulla barra (left/width della colonna) valgono solo da
   desktop: se la finestra si stringe restano attaccati e spostano la barra fuori squadra.
   Qui vengono annullati per costruzione, senza dipendere da chi li ha scritti. */
@media (max-width: 1099px) {
  .topbar .hud-right { left: auto !important; width: auto !important; position: static; }
  /* IL MERCATO E' UN TASTO DA DESKTOP. Mobile e tablet hanno la loro vista e restano
     esattamente come in produzione: il Mercato li' si raggiunge da Azioni, come sempre. */
  #market-btn { display: none; }
}
/* ══ BARRA DEI TASTI: SOLO DESKTOP ══════════════════════════════════════════════════
   (15/08/2026) Queste regole erano state scritte senza cancello e investivano anche il
   telefono: gear e posta ricomparivano sopra le risorse e la barra andava a pezzi. Su
   mobile la barra resta ESATTAMENTE quella in produzione — non si tocca. */
@media (min-width: 1100px) {
  #settings-btn, #comms-btn { display: grid; }
  /* DA DESKTOP L'HEADER E' UNO SOLO (15/08/2026, ordine del committente): anche nel Profilo
     si vedono identita', risorse ed energia. La modalita' `profile-mode` — che le nasconde
     per far posto ai tasti — nasce dallo spazio stretto del telefono, e su uno schermo largo
     non ha piu' niente da risolvere: la fila dei tasti ha gia' la sua colonna. Su mobile e
     tablet resta esattamente com'e' in produzione. */
  /* NEL PROFILO IL CENTRO E' VUOTO, e resta cosi': niente risorse, niente energia, niente
     barre ne' icone dei materiali. Sono tutti numeri che raccontano L'ISOLA su cui stai
     lavorando, e nel Profilo non stai lavorando su nessuna. Restano le due estremita' —
     il capitano a sinistra, i suoi tasti a destra — e in mezzo l'aria. */
  .topbar.profile-mode .res-cluster, .topbar.profile-mode #energy-chip { display: none; }
  .topbar.profile-mode .hud-cap { display: flex; }
  .topbar.profile-mode .hud-right { flex: none; }
  .topbar.profile-mode #cap-id { display: none; }   /* l'identita' la porta gia' .hud-cap */
  /* Nel Profilo da desktop vale lo stesso ordine del gioco: `.topbar.profile-mode` ha la
     stessa specificita' di questi, quindi si vince stando DOPO nel foglio. Su mobile e
     tablet, invece, il Profilo resta quello di produzione — riga per riga. */
  /* Da desktop l'Emporio e' un quadrato come gli altri: la parola sparisce e con lei la
     larghezza extra. Accanto c'e' il Mercato con la stessa icona, e a dire quale dei due
     costa denaro vero e' il fondo nero — non serve piu' scriverlo. */
  /* I due pixel a destra sono tornati indietro (15/08/2026, ordine del committente): l'icona sta
     al centro geometrico del tasto, come tutte le vicine. Restava un aggiustamento OTTICO di
     quando accanto c'era la parola «Emporio» a sbilanciare la figura — da quando il tasto e' un
     quadrato di sola icona non ha piu' niente da compensare. */
  #shop-btn .hud-lbl { display: none; }
  /* STESSA SCATOLA DEL PROFILO, IN OGNI SCHERMATA (15/08/2026, ordine del committente). Qui il
     tasto veniva forzato a 40px quadrato, ma nel Profilo `.topbar.profile-mode #shop-btn` —
     che ha una classe in piu' e quindi vince — lo lascia a larghezza libera con 16 di respiro:
     55px. Risultato, l'Emporio cambiava taglia passando da una tab all'altra e si portava
     dietro tutta la fila, che e' l'offset che si vedeva saltare. Adesso i due valori sono gli
     stessi e cambiando schermata non si muove niente. */
  #shop-btn.hud-btn-wide { width: auto; padding: 0 var(--sp-16); justify-content: center; }
  .topbar.profile-mode #shop-btn { order: 7; margin-right: 0; }
  .topbar.profile-mode #market-btn { order: 6; }
  .topbar.profile-mode #comms-btn { order: 8; }
  .topbar.profile-mode #settings-btn { order: 9; }
  .topbar.profile-mode #wchat-btn { display: none; }
  /* Tutti e quattro ANCORATI A DESTRA: `.hud-right` e' l'ultimo blocco della barra e il suo
     `margin-left:auto` lo spinge in fondo, cosi' il gruppo resta compatto contro il bordo
     invece di galleggiare a meta'. */
  .hud-right { margin-left: auto; justify-content: flex-end; }
  /* Occhio GM e Console se ne sono andati nelle Impostazioni (17/08/2026): con loro se n'e'
     andata anche la molla che teneva il gruppo a destra, e adesso la porta il Mercato — che
     e' il primo dei tasti di gioco e quindi il posto naturale dell'ancora. */
  .hud-right #market-btn   { order: 6; margin-left: auto; }
  .hud-right #shop-btn     { order: 7; }
  .hud-right #comms-btn    { order: 8; }
  .hud-right #settings-btn { order: 9; }
  #market-btn { padding: 0; place-items: center; }
  /* L'icona (29) piu' il padding del bottone (6+6) faceva 41 dentro una scatola da 40: il grid
     la spingeva fuori asse di un pixel e mezzo. Senza padding il centro del disegno e quello
     del tasto coincidono, e la scatola cliccabile resta la stessa. */
  /* Due pixel piu' in alto: e' l'ultimo aggiustamento a occhio dopo averla provata su schermo,
     quindi centrata geometricamente cade bassa rispetto alle vicine, che sono compatte.
     Aggiustamento OTTICO, non di layout: la scatola cliccabile non si muove. */
  #market-btn .gi-sell-card { width: 28px; height: 28px; transform: translateY(-2px); }
  /* PIU' GRANDE DELLE VICINE (21 -> 24 -> 29 px, ordine del committente), e cresce il
  /* IL FONDO NERO ORA E' SEMPRE, non solo nella schermata Profilo. E' l'unico posto del gioco
     dove si spende denaro vero, e con il Mercato accanto che porta la STESSA icona il fondo e'
     diventato l'unica cosa che li distingue: se si accendesse a intermittenza, i due tasti
     sarebbero identici per tutto il resto del gioco. Risalta per CONTRASTO, non per luce. */
  #shop-btn {
    background: radial-gradient(120% 130% at 50% 0%, rgba(202,162,74,.30), #05060b 58%);
    border-color: #caa24a;
    color: #e9c87e;
  }
}

/* Panoramica d'impero: gli angoli ALTI seguono la curva del pannello che la contiene
   (12, come `#lr-panorama`) invece dei 4 di una card qualsiasi — e' il primo blocco della
   colonna e fa da testata. `overflow:hidden` perche' dentro c'e' un'illustrazione: senza,
   l'immagine resta squadrata e la curva si vede solo sul bordo. */
/* GLI ANGOLI SEGUONO I BOX DI DESTRA (15/08/2026): solo i DUE ANGOLI ALTI, 12px come il tasto MAPPA e il riquadro del
   mappamondo — sotto la card prosegue, e arrotondarla anche li' la staccherebbe da quel che segue, cosi' le due colonne si somigliano invece di avere una squadrata e l'altra curva.
   `!important` perche' dentro `#views` c'e' una regola d'insieme che impone il raggio a ogni
   card e la vince su qualunque specificita' — e' scritta con `!important` lei per prima, quindi
   questa e' la stessa convenzione, non un'eccezione. `overflow` per l'illustrazione dentro:
   senza, l'immagine resta squadrata e la curva si vede solo sul bordo. */
#views #lr-panorama .fleet-muster { border-top-left-radius: 12px !important;
  border-top-right-radius: 12px !important; overflow: hidden; }

/* IL COMPOSITORE NON SI COMPRIME MAI (15/08/2026). Rimpicciolendo il dock oltre un certo
   punto la casella di scrittura veniva schiacciata via: una chat senza dove scrivere non e'
   una chat ridotta, e' una chat rotta. Il compositore e la sua testata restano interi, e a
   cedere altezza e' SOLO lo scorrevole dei messaggi — che ha `min-height:0` apposta per
   poterlo fare senza sfondare il contenitore. */
@media (min-width: 900px) {
  #wchat-overlay .chat-sheet { display: flex; flex-direction: column; }
  #wchat-overlay .chat-composer, #wchat-overlay .chat-head { flex: 0 0 auto; }
  #wchat-overlay #wchat-stream { flex: 1 1 auto; min-height: 0; }
}

/* ── VETRINA DEL BUNDLE ─────────────────────────────────────────────────────────────
   E' LA STESSA SCHEDA DELLA LIVREA SINGOLA (`.shop-prev`), con due sole aggiunte: le frecce
   appoggiate sui fianchi dell'arte e i pallini in fondo. Non ha misure proprie — larghezza,
   arte, titolatura e la prova «Come appare in gioco» arrivano tutte da li'. Se questa sezione
   ricomincia a dichiarare larghezze o riquadri suoi, le due schermate stanno tornando a
   somigliarsi invece di essere la stessa cosa. Niente tasto d'acquisto: qui si guarda. */
.sm-title { position: relative; }
.sm-exp { position: absolute; right: 0; top: 50%; transform: translateY(-50%);
  background: none; border: 0; padding: 4px; cursor: pointer; line-height: 0; }
.sm-exp .gi { width: 16px; height: 16px; opacity: .75; }
.sm-exp:hover .gi { opacity: 1; }
/* La vetrina NON dichiara un suo strato: porta gia' `.shop-modal-back` e ne eredita la quota.
   Sta sopra il popup di scelta perche' viene DOPO nel documento — a parita' di strato vince
   l'ultimo — ed e' esattamente il rapporto che si vuole: la scheda copre il bancone da cui e'
   stata aperta. Un numero scritto qui sarebbe stato solo un secondo posto dove sbagliarlo. */
/* L'arte e' quella di la': `.spv-hero`. Qui prende solo il riferimento per le frecce e la
   presa del dito — `pan-y` lascia scorrere la pagina in verticale e tiene per noi l'orizzontale,
   che e' il gesto con cui si passa al pezzo dopo. */
.sbv .spv-hero { position: relative; touch-action: pan-y; }
/* Frecce sobrie, senza alone: bordo e velatura, come ogni altro comando della plancia. In
   sovrimpressione sui fianchi dell'illustrazione — il fondo scuro le stacca dall'arte senza
   toglierle spazio. */
.sbv-nav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 1;
  width: 32px; height: 48px; border-radius: 12px; cursor: pointer;
  background: linear-gradient(180deg, rgba(24,29,42,.82), rgba(12,15,25,.82));
  border: 1px solid var(--bronze-d); color: var(--brass-l);
  font-size: 22px; line-height: 1; font-family: var(--font-display); }
.sbv-prev { left: 8px; }
.sbv-next { right: 8px; }
.sbv-nav:hover { border-color: var(--brass); color: var(--brass); }
.sbv-dots { display: flex; gap: 8px; justify-content: center; margin: 12px 0 4px; }
.sbv-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--bronze-d); }
.sbv-dots i.on { background: var(--brass); }
