/* ============================================================
   Wanderlust: bottom bar (foglio del componente globale)
   ============================================================
   Coppia inseparabile di `bottom-bar.js`. Vive in un file suo, non
   dentro `home.css`, perche' lo carica anche il pannello admin, che di
   `home.css` non prende nulla: e' il modo per avere davvero la stessa
   barra in ogni pagina invece di due ricette gemelle che divergono.

   Qui vivono SOLO materiale e geometria, uguali ovunque; quali icone
   mostrare lo decide la pagina, passando la sua lista di azioni al
   componente (vedi sideActions() in home.js, adminBarActions() in
   admin.js).

   Tre strati sovrapposti, tutti con la stessa sagoma:
     .wl-bbar-plate   il vetro (backdrop-filter), ritagliato da una
                      maschera SVG generata col path della sagoma;
     .wl-bbar-shape   velo colorato, ombra esterna e UN SOLO bordo
                      (niente border CSS: un bordo rettangolare sopra
                      una sagoma ritagliata darebbe il doppio bordo);
     .wl-bbar-row     le icone, che non sanno niente della sagoma.

   La tasca centrale non e' una valle disegnata a mano: e' la barra
   meno un cerchio piu' grande del pulsante (72 contro 54px, 9px di
   gap su tutto l'arco), concentrico al pulsante e raccordato al bordo
   alto da due archi tangenti. Le misure stanno nelle variabili qui
   sotto, il JS le legge e ne ricava il path: cambiare una taglia si
   fa da qui, in un posto solo.
   ============================================================ */
.wl-bbar {
  /* Variabili del progetto che il componente usa. Le ridichiara qui con
     lo stesso valore che hanno nel tema: home.css le dà solo alle viste
     dell'app, e admin.html non carica home.css. Chi include questo file
     ha la barra completa senza altre dipendenze; una pagina che definisce
     le proprie le sovrascrive normalmente. */
  /* ---- Materiale "vetro clear" (13/8/2026) ------------------------
     Ricetta di riferimento del progetto, calibrata sulla barra e da
     estendere poi al resto (menu, toolbar, pannelli). Tre ingredienti,
     ognuno con un mestiere preciso:

       blur(10px)        diffusione. Era 40px: talmente largo da ridurre
                         qualsiasi contenuto a una macchia uniforme, cioe'
                         il motivo per cui "non si vedeva cosa c'e' sotto".
                         iOS 27 ha ridotto il raggio proprio per questo.
       saturate(200%)    e' quello che fa leggere il vetro come trasparente
                         invece che sporco: il colore di cio' che sta sotto
                         arriva su, invece di spegnersi nel grigio.
       brightness(0.78)  smorzamento. Prende il posto del velo: invece di
                         stendere una vernice piatta sopra tutto, abbassa
                         il contenuto campionato in proporzione a quanto
                         e' chiaro. E' cosi' che una facciata assolata non
                         acceca le icone senza che il vetro debba
                         diventare opaco. Apple chiede uno strato di
                         smorzamento proprio quando si usa il materiale
                         Clear: e' questo.

     Due giri, e la storia serve. Il primo (`blur(20px) saturate(180%)
     brightness(0.82)`, velo 0.20-0.30) era il "Regular" prescritto da
     Apple per le barre persistenti, scelto perche' reggeva anche sul
     fondo piatto della Home. Visto sul telefono vero l'utente ha chiesto
     di piu': questa e' la variante Clear, e il compromesso e' esplicito.
     Sul contenuto (Esplora, foto che scorrono) si legge cosa c'e' sotto;
     sulla Home, dove il fondo blueprint e' quasi piatto e sotto la barra
     non c'e' niente da mostrare, la barra si appoggia quasi solo al filo
     del bordo. Per questo i due fili (chiaro sopra, scuro fuori) sono
     stati alzati insieme al resto: con un velo cosi' leggero sono loro a
     dire dove finisce la barra.

     Misurato sugli scatti (scripts/glass-lab.mjs --vivo): della struttura
     che sta sotto la barra ne sopravvive il 18% (era il 12% con blur 40 e
     velo 0.50-0.68, il 15% col Regular) e il contrasto peggiore tra icone
     e vetro resta 5.4:1, sopra il minimo di 3:1 per un elemento di
     interfaccia (WCAG 1.4.11). Chi tocca questi valori rifaccia quella
     misura: il vetro e' bello finche' le icone restano leggibili sul caso
     peggiore, non sul fondo comodo della Home.

     Sullo smorzamento si e' tornati due volte: 0.82 col Regular, 0.68 al
     primo Clear, 0.78 adesso. E' la manopola della trasmissione (quanto
     del fondo arriva in superficie): 0.30 a 0.68, 0.41 a 0.78, misurata
     con scripts/glass-transmittance.mjs. Il blur invece e' la manopola
     del dettaglio, cioe' se sotto si riconosce qualcosa o si vede solo una
     macchia di colore. Due manopole diverse: prima di girarne una, sapere
     quale delle due cose non va. */
  --wl-glass-blur: blur(10px) saturate(200%) brightness(0.78);
  --wl-accent: #e2652b;
  --wl-sans: "Nunito", system-ui, -apple-system, "Segoe UI", sans-serif;

  /* Geometria, letta da bottom-bar.js via getComputedStyle. */
  --wl-bbar-h: 64px;
  --wl-bbar-corner: 32px;
  /* Pulsante centrale, terzo giro con l'utente (12/8): 66 -> 60 -> 54px.
     Ogni volta il glifo dentro e' cresciuto invece di rimpicciolirsi: e'
     l'aria attorno che si toglie, non il disegno. Il monogramma occupa
     ora il 78% del diametro contro il 67% di due giri fa. La tasca segue
     sempre il pulsante, 9px di gap tutt'intorno: 54 + 2x9 = 72. */
  --wl-bbar-center-size: 54px;
  --wl-bbar-cutout-size: 72px;
  --wl-bbar-fillet: 12px;
  /* Riquadro delle icone laterali per i glifi non elencati piu' sotto:
     quelli noti hanno una taglia propria, misurata (vedi .wl-bbar-btn svg). */
  --wl-bbar-ic: 31px;
  /* Apertura reale della tasca: riscritta dal JS ad ogni ridisegno,
     questo e' solo il valore prima del primo calcolo. */
  --wl-bbar-notch-w: 93px;
  /* Materiale: dark navy in vetro, la stessa famiglia del resto
     dell'app (--wl-glass-blur e' condiviso con toolbar e tendine). */
  /* Velo ridotto all'osso (era 0.50-0.68, poi 0.20-0.30 col Regular).
     Con lo smorzamento nel filtro non serve un velo denso per tenere le
     icone leggibili, e un velo denso e' esattamente cio' che trasforma
     il vetro in plastica colorata. Resta verticale, piu' chiaro in alto
     e piu' scuro in basso: e' il verso in cui la luce cade. */
  --wl-bbar-tint-a: rgba(20, 48, 80, 0.08);
  --wl-bbar-tint-b: rgba(6, 24, 42, 0.16);
  /* Filo chiaro superiore (specular highlight), il piu' brillante finora:
     iOS 27 alza proprio questo perche' con un velo piu' leggero e' il
     bordo a dare spessore al vetro. Con la ricetta Clear e' anche cio'
     che tiene in piedi la barra sul fondo piatto della Home, dove il
     materiale da solo non ha niente da mostrare. */
  --wl-bbar-edge-a: rgba(255, 255, 255, 0.8);
  --wl-bbar-edge-b: rgba(255, 255, 255, 0.28);
  --wl-bbar-edge-c: rgba(255, 255, 255, 0.12);
  /* Filo scuro esterno (iOS 27, "darkened edge"): sta mezzo pixel sotto
     quello chiaro e da' al vetro uno spessore invece di un contorno.
     Serve soprattutto quando sotto scorre una foto chiara: senza, il
     bordo alto si perde nel contenuto. */
  --wl-bbar-edge-dark: rgba(0, 0, 0, 0.42);
  --wl-bbar-shadow: rgba(4, 14, 25, 0.45);
  --wl-bbar-icon: rgba(255, 255, 255, 0.66);
  --wl-bbar-icon-active: #ffffff;
  /* Accento del pulsante centrale: definito dal tema, non dal
     componente. 12/8: torna la tinta accent (era un cerchio navy
     trasparente dal 9/8), ma in vetro come la barra, non piena. */
  /* 13/8: il pulsante passa allo stesso sistema della barra, ma con la
     densita' di un'azione primaria, non con quella della cornice. Apple
     chiama "prominente" questo vetro: piu' pieno del materiale attorno,
     perche' l'azione principale deve restare inequivocabile.

     Due tarature, non una. Prima il velo, da 0.84-0.93 a 0.66-0.82:
     misurata la trasmissione (quanto del fondo arriva in superficie,
     0 = opaco, 1 = nessun materiale) passa da 0.11 a 0.24, contro lo
     0.31 della barra. Scendere fino al velo della barra era la strada
     sbagliata: a quella densita' il cerchio smette di essere arancione,
     vira al marrone sul fondo scuro (misurato rgb 91,42,20) e si slava
     su quello chiaro (saturazione da 0.66 a 0.31).

     Poi la tinta, ed e' il passaggio che si dimentica: lasciar passare
     piu' fondo, su un fondo SCURO, vuol dire diventare piu' scuri. Con i
     colori di prima il pulsante si spegneva (rgb 149,82,57 contro
     187,96,54). I due capi del gradiente sono quindi piu' chiari e piu'
     carichi di croma, cosi' il risultato composito torna dov'era:
     rgb 173,91,55, saturazione 0.68 contro 0.71 di prima, luminosita'
     106 contro 112. Il colore del brand e' un vincolo, non un effetto:
     chi ritocca l'alpha ritocchi anche questi due colori, o l'arancione
     se ne va senza che nessuno abbia deciso di cambiarlo. */
  --wl-bbar-center-a: rgba(255, 154, 84, 0.66);
  --wl-bbar-center-b: rgba(232, 90, 26, 0.82);
  --wl-bbar-center-ring: rgba(255, 255, 255, 0.62);

  position: fixed;
  z-index: 80;
  left: 50%;
  transform: translateX(-50%);
  /* 4/9, richiesta utente: la barra scende verso il fondo. Il 3/9 sommava
     12px alla safe area, cioe' 46px dal bordo su un iPhone: la barra
     galleggiava a meta' strada invece di appoggiarsi in fondo come nel
     concept, dove sta a ~18 CSS dal bordo e l'home indicator le passa sotto.

     Il limite non e' l'home indicator, e' lo SCHERMO: gli angoli sono
     stondati con un raggio fra 47 e 55 CSS a seconda del modello, e la barra
     e' larga quanto la vista meno 32, cioe' 16 per lato. L'angolo basso
     esterno della barra sta dentro la curva finche' vale
     (R-16)^2 + (R-y)^2 <= R^2: con R uguale a 55, il caso peggiore, serve
     y >= 16.2. Da qui i 20px sotto, che lasciano ~4 CSS di margine sul
     modello piu' stondato e molti di piu' sugli altri.

     La formula toglie 14 alla safe area invece di sommarci: su iPhone
     34 - 14 fa 20, verificato dentro la curva sia a R uguale a 47 sia a 55
     (scripts/diag-bbar-angoli.mjs). Dove la safe area non c'e' resta il
     minimo di 12, e li' i 55 di raggio non esistono: un raggio cosi' e' di
     un iPhone con home indicator, che quindi non passa mai da questo ramo.
     Serve viewport-fit=cover in index.html, senza env() vale 0 e questa riga
     sarebbe inerte. */
  bottom: max(12px, calc(env(safe-area-inset-bottom, 0px) - 14px));
  width: calc(100% - 32px);
  max-width: 398px;
  height: var(--wl-bbar-h);
  /* Niente sfondo, bordo o ombra sul contenitore: li disegna la
     sagoma, altrimenti si vedrebbe il rettangolo dietro il ritaglio. */
  background: none;
  border: 0;
  filter: none;
}

/* Strato del vetro: la maschera (data URI col path della sagoma) la
   scrive il JS, qui restano solo le proprieta' fisse. */
.wl-bbar-plate {
  position: absolute;
  inset: 0;
  pointer-events: none;
  -webkit-backdrop-filter: var(--wl-glass-blur);
  backdrop-filter: var(--wl-glass-blur);
  -webkit-mask-size: 100% 100%;
  mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
}

/* Velo, ombra e bordo. L'SVG deborda di 40px per lato (stesso margine
   di SHADOW_PAD in bottom-bar.js) per non tagliare l'ombra sfocata. */
.wl-bbar-shape {
  position: absolute;
  left: -40px;
  top: -40px;
  width: calc(100% + 80px);
  height: calc(100% + 80px);
  pointer-events: none;
  overflow: visible;
}
/* Velo e bordo prendono il gradiente da un attributo di presentazione
   scritto dal JS, non da qui: con piu' barre nella stessa pagina ogni
   istanza ha i propri id, e una regola CSS con un id fisso vincerebbe
   sull'attributo mandandole tutte a pescare dai gradienti della prima. */
.wl-bbar-edge {
  fill: none;
  stroke-width: 1.1;
}
/* Il filo scuro usa un colore pieno, non un gradiente: puo' quindi stare
   nel CSS senza il problema degli id per istanza. Il mezzo pixel di
   scarto verso il basso e' quello che lo fa leggere come spessore del
   vetro invece che come secondo contorno disegnato. */
.wl-bbar-edge-dark {
  fill: none;
  stroke: var(--wl-bbar-edge-dark);
  stroke-width: 1.4;
  transform: translateY(0.6px);
}
.wl-bbar-tint-a { stop-color: var(--wl-bbar-tint-a); }
.wl-bbar-tint-b { stop-color: var(--wl-bbar-tint-b); }
.wl-bbar-edge-a { stop-color: var(--wl-bbar-edge-a); }
.wl-bbar-edge-b { stop-color: var(--wl-bbar-edge-b); }
.wl-bbar-edge-c { stop-color: var(--wl-bbar-edge-c); }
.wl-bbar-drop { flood-color: var(--wl-bbar-shadow); flood-opacity: 1; }
/* Senza blur disponibile il velo deve reggere da solo la leggibilita'
   delle icone (stessa logica del vecchio fallback della tab bar). */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .wl-bbar { --wl-bbar-tint-a: rgba(16, 44, 74, 0.94); --wl-bbar-tint-b: rgba(6, 24, 42, 0.96); }
}

/* Riga delle icone: due gruppi simmetrici e, in mezzo, lo spazio della
   tasca. Cosi' nessuna icona finisce sotto il pulsante centrale, con
   qualsiasi numero di azioni e a qualsiasi larghezza di schermo. */
.wl-bbar-row {
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  height: 100%;
  padding: 0 4px;
}
.wl-bbar-side {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: space-evenly;
}
.wl-bbar-notch { flex: 0 0 var(--wl-bbar-notch-w); }

.wl-bbar-btn {
  position: relative;
  display: grid;
  place-items: center;
  width: 46px;
  height: 46px;
  /* Un <button> non azzera mai da solo il padding del browser: con
     icone grandi se lo mangia il centraggio (bug gia' visto sul
     pulsante centrale il 9/8). */
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: none;
  color: var(--wl-bbar-icon);
  cursor: pointer;
  font-family: var(--wl-sans);
  transition: color 0.18s ease, transform 0.18s ease;
}
/* Alone morbido sotto l'icona attiva: senza etichette e' lui, con la
   tinta piena, a dire dove siamo. */
.wl-bbar-btn.is-active::before {
  content: "";
  position: absolute;
  inset: 2px;
  border-radius: 50%;
  background: radial-gradient(circle at 50% 46%, rgba(255, 255, 255, 0.24), rgba(255, 255, 255, 0) 68%);
}
.wl-bbar-btn.is-active { color: var(--wl-bbar-icon-active); }
/* Taglia delle icone laterali: un riquadro per glifo, non uno per tutti.
   Terzo giro (12/8, utente: "aumenta le icone come quella della casa, che
   sembra della grandezza giusta"). Il giro precedente aveva pareggiato
   solo QUANTO SI ESTENDE il disegno, e infatti le icone risultavano gia'
   larghe uguale: ma a parita' di estensione il cuore continuava a
   sembrare piu' piccolo, perche' ha il tratto piu' sottile e dipinge
   molta meno superficie. Misurato con `scripts/measure-glyph-weight.mjs`
   (pixel davvero dipinti dentro il riquadro, rasterizzando il glifo):

     casa 13,9%   mappa 10,5%   cuore 8,1%   persona 12,5%
     condividi 19,0%   cestino 24,5%

   Il tratto scala col riquadro, quindi l'area dipinta cresce col quadrato
   della taglia: per pesare come la casa servirebbero cuore 39px e cestino
   22,6px. Prese cosi' pero' si ribalta l'errore, perche' il cuore
   diventerebbe molto piu' esteso della casa. I valori qui sotto sono la
   media geometrica tra il pareggio per estensione e quello per peso, con
   la casa come riferimento: ogni glifo tiene la stessa "presenza" senza
   sfondare il proprio spazio. Chi cambia un'icona rifaccia le due misure
   (`measure-glyph-ink.mjs` e `measure-glyph-weight.mjs`), non stimi. */
.wl-bbar-btn svg {
  position: relative;
  z-index: 1;
  width: var(--wl-bbar-ic);
  height: var(--wl-bbar-ic);
  display: block;
}
/* Riferimento: e' la taglia che l'utente ha giudicato giusta. */
.wl-bbar-btn[data-bbar-icon="wl-ic-home"] svg { width: 30px; height: 30px; }
/* Larga e bassa (78% x 49%): con lo stesso riquadro sembra la meta'. */
.wl-bbar-btn[data-bbar-icon="wl-ic-map"] svg { width: 34px; height: 34px; }
/* Il tratto piu' sottile del set: e' il glifo che si vedeva meno. */
.wl-bbar-btn[data-bbar-icon="wl-ic-heart"] svg { width: 35px; height: 35px; }
.wl-bbar-btn[data-bbar-icon="wl-ic-user"] svg { width: 31px; height: 31px; }
/* Condividi e cestino vanno invece RIDOTTI: sono i due glifi piu' pesanti
   del set (19% e 24,5% contro il 13,9% della casa) e alla taglia comune
   schiacciavano le altre azioni. */
.wl-bbar-btn[data-bbar-icon="wl-ic-share"] svg { width: 28px; height: 28px; }
.wl-bbar-btn[data-bbar-icon="wl-ic-trash"] svg { width: 27px; height: 27px; }
.wl-bbar-btn:active { transform: scale(0.92); }
.wl-bbar-btn:disabled { opacity: 0.45; cursor: default; }

/* Pulsante centrale: stesso vetro della barra, tinto d'arancio. Meta'
   sopra e meta' dentro (il suo centro sta sul bordo alto, esattamente
   dove sta il centro della tasca).
   12/8, richiesta utente: prima era un disco quasi pieno (alpha 0.95)
   con un blur suo, piu' debole di quello della barra: sembrava plastica
   accanto al vetro, non della stessa famiglia. Ora il velo arancio sta
   nella stessa fascia di opacita' del velo navy della barra e il blur e'
   la variabile condivisa `--wl-glass-blur`: stesso materiale, tinta
   diversa. Il rilievo lo danno il filo chiaro in alto e l'ombra interna
   in basso, non un fondo pieno. */
.wl-bbar-center {
  position: absolute;
  z-index: 3;
  left: 50%;
  top: calc(var(--wl-bbar-center-size) / -2);
  transform: translateX(-50%);
  width: var(--wl-bbar-center-size);
  height: var(--wl-bbar-center-size);
  padding: 0;
  display: grid;
  place-items: center;
  border: 1px solid var(--wl-bbar-center-ring);
  border-radius: 50%;
  background: linear-gradient(158deg, var(--wl-bbar-center-a) 0%, var(--wl-bbar-center-b) 100%);
  color: white;
  cursor: pointer;
  /* Stesso vetro della barra piu' una schiarita: un velo arancio sopra un
     fondo navy quasi nero vira al marrone, e il pulsante primario deve
     restare arancione. La luce arriva dal filtro, non da un fondo pieno,
     cosi' il vetro resta vetro (dietro si continua a vedere).
     13/8: la schiarita e' salita da 1.5 a 1.8 quando la ricetta condivisa
     ha preso uno smorzamento. Passando alla variante Clear (smorzamento
     0.68) il conto direbbe di alzarla ancora, ma misurando il colore del
     pulsante a 1.8, 2.2, 2.6 e 3.0 il risultato e' praticamente lo stesso
     (rgb 173,90,54 contro 173,96,67 all'estremo): sul fondo scuro
     dell'app non c'e' quasi niente da schiarire, e su una foto chiara il
     valore satura comunque. Resta 1.8, ma per misura, non per aritmetica:
     chi cambia lo smorzamento della barra ricampioni invece di ricalcolare. */
  -webkit-backdrop-filter: var(--wl-glass-blur) brightness(1.8);
  backdrop-filter: var(--wl-glass-blur) brightness(1.8);
  box-shadow:
    /* Filo scuro esterno, lo stesso della sagoma (iOS 27): sta appena
       fuori dall'anello chiaro, cosi' il bordo del cerchio ha lo stesso
       spessore di vetro del bordo della barra. Prima il pulsante aveva
       solo il filo chiaro e, sopra una foto chiara, si perdeva. */
    0 0 0 1.4px var(--wl-bbar-edge-dark),
    0 10px 22px rgba(4, 14, 25, 0.34),
    0 0 18px rgba(226, 101, 43, 0.22),
    inset 0 1.5px 0 rgba(255, 255, 255, 0.55),
    inset 0 -12px 22px rgba(96, 26, 0, 0.28);
  transition: filter 0.2s, box-shadow 0.2s;
}
/* Senza blur il velo arancio da solo non basta a staccare il pulsante
   dal fondo: si torna a una tinta piena (stesso ragionamento del
   fallback della barra). */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .wl-bbar-center { --wl-bbar-center-a: rgba(233, 124, 62, 0.96); --wl-bbar-center-b: rgba(186, 68, 20, 0.96); }
}
.wl-bbar-center:disabled { opacity: 0.48; cursor: default; }
/* Taglie per stato. Il monogramma W e' largo e basso, le altre icone sono
   quadrate; ognuna riempie la propria viewBox in modo diverso, per questo
   i numeri non sono proporzionali tra loro. Il vincolo e' il raggio utile
   del cerchio (54 meno 2px di bordo = 52px di spazio interno): il punto
   piu' lontano del disegno deve restarci dentro con qualche pixel di
   margine, verificato misurando l'inchiostro, non a occhio.
   12/8, terzo giro: il cerchio scende a 54px ma il monogramma sale a
   42px di larghezza (era 40 in un cerchio da 60): il padding interno
   passa da 10 a 6px per lato ed e' esattamente quello che si voleva,
   vedere meglio il glifo. */
.wl-bbar-center svg { width: 42px; height: 24px; display: block; }
.wl-bbar-center.is-add svg { width: 46px; height: 46px; }
.wl-bbar-center.is-save svg,
.wl-bbar-center.is-edit svg { width: 43px; height: 43px; }
/* La spunta e' piccola dentro la propria viewBox (disegna 25x17 su 43):
   con la taglia di "Salva" la conferma sembrava un passo indietro. */
.wl-bbar-center.is-saved svg { width: 50px; height: 50px; }
/* L'aeroplanino di "Invia" ha uno svolazzo che arriva piu' vicino ai
   bordi del proprio disegno rispetto al nastro di "Salva": taglia
   propria, altrimenti sborda dal cerchio (segnalato su schermo reale). */
.wl-bbar-center.is-send svg { width: 36px; height: 36px; }
/* Passi 1-4 del wizard (19/8). La freccia disegna 17x12 sulle 24 della
   propria viewBox, quindi a 42px l'inchiostro e' 30x21: sta nei 52px utili
   con margine, ed e' la stessa larghezza ottica del monogramma che c'era
   prima. La scintilla di "Crea l'itinerario" riempie di piu' il quadrato
   (17x17 su 24), quindi resta un filo piu' piccola per pareggiare. */
.wl-bbar-center.is-continue svg { width: 42px; height: 42px; }
.wl-bbar-center.is-generate svg { width: 40px; height: 40px; }

/* Richiamo al cambio di stato: lo aggiunge il componente quando
   l'azione centrale cambia davvero, non ad ogni ridisegno. */
.wl-bbar-center.is-pulse { animation: wl-bbar-pop 0.45s cubic-bezier(.34, 1.56, .64, 1); }
.wl-bbar-center.is-pulse::after {
  content: "";
  position: absolute;
  inset: -3px;
  border-radius: 50%;
  border: 2px solid var(--wl-accent);
  animation: wl-bbar-ring 0.6s ease-out;
  pointer-events: none;
}
@keyframes wl-bbar-pop {
  0% { transform: translateX(-50%) scale(1); }
  40% { transform: translateX(-50%) scale(1.16); }
  100% { transform: translateX(-50%) scale(1); }
}
@keyframes wl-bbar-ring {
  0% { opacity: 0.9; transform: scale(1); }
  100% { opacity: 0; transform: scale(1.5); }
}
@media (prefers-reduced-motion: reduce) {
  .wl-bbar-center.is-pulse, .wl-bbar-center.is-pulse::after { animation: none; }
}

/* Accessori che la pagina infila dentro un'azione (badge preferiti,
   foto profilo, glifo livello): il componente li ospita, non li
   conosce. Restano le classi storiche, ci scrive sopra home.js. */
.wl-tab-badge {
  position: absolute;
  top: -1px;
  right: -1px;
  width: 19px;
  height: 19px;
  padding: 0;
  display: grid;
  place-items: center;
  border-radius: 999px;
  border: 1px solid rgba(255, 255, 255, 0.78);
  background: var(--wl-accent);
  color: white;
  font-size: 0.58rem;
  font-weight: 700;
  z-index: 2;
}
/* Foto profilo reale (Google) al posto dell'icona persona: border
   currentColor cosi' eredita da sola la tinta dell'icona che sostituisce. */
.wl-tab-avatar {
  position: relative;
  z-index: 1;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  object-fit: cover;
  border: 1.5px solid currentColor;
}
.wl-tab-level {
  position: absolute;
  right: 0;
  bottom: 1px;
  width: 20px;
  height: 20px;
  display: grid;
  place-items: center;
  border-radius: 999px;
  background: white;
  border: 1.5px solid rgba(255, 255, 255, 0.88);
  color: white;
  pointer-events: none;
  overflow: hidden;
  z-index: 2;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
}
.wl-tab-level .wl-level-badge-glyph {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}
/* Varianti predisposte per i glifi badge utente. */
.wl-tab-level--wayfarer {}
.wl-tab-level--tracker {}
.wl-tab-level--explorer {}
.wl-tab-level--waymark {}
.wl-tab-level--cartographer {}
.wl-tab-level--guardian {}
.wl-tab-level--pathfinder {}
.wl-tab-level--guide {}
.wl-tab-level--ambassador {}
.wl-tab-level--legend {}
/* Barre affollate: il pannello admin ne ha cinque piu' il centro, contro
   le quattro dell'app. Sotto i 400px cinque riquadri da 46px piu'
   l'apertura della tasca non ci starebbero, quindi il componente scrive
   quante azioni sta disegnando (data-bbar-actions) e il tema stringe solo
   quel caso: taglia del tasto e riquadro dell'icona, non la geometria
   della barra, che resta identica ovunque. */
.wl-bbar[data-bbar-actions="5"] .wl-bbar-btn,
.wl-bbar[data-bbar-actions="6"] .wl-bbar-btn {
  width: 42px;
  height: 42px;
}
.wl-bbar[data-bbar-actions="5"] { --wl-bbar-ic: 28px; }
.wl-bbar[data-bbar-actions="6"] { --wl-bbar-ic: 26px; }
@media (max-width: 379px) {
  .wl-bbar[data-bbar-actions="5"] .wl-bbar-btn,
  .wl-bbar[data-bbar-actions="6"] .wl-bbar-btn { width: 38px; height: 38px; }
  .wl-bbar[data-bbar-actions="5"] { --wl-bbar-ic: 26px; }
}
/* Le eccezioni per glifo sono taglie assolute, quindi vanno riscalate
   anche loro quando la barra e' affollata: senza, la mappa resterebbe a
   34px accanto a icone da 28. */
.wl-bbar[data-bbar-actions="5"] .wl-bbar-btn[data-bbar-icon="wl-ic-home"] svg,
.wl-bbar[data-bbar-actions="6"] .wl-bbar-btn[data-bbar-icon="wl-ic-home"] svg { width: 27px; height: 27px; }
.wl-bbar[data-bbar-actions="5"] .wl-bbar-btn[data-bbar-icon="wl-ic-map"] svg,
.wl-bbar[data-bbar-actions="6"] .wl-bbar-btn[data-bbar-icon="wl-ic-map"] svg { width: 31px; height: 31px; }
.wl-bbar[data-bbar-actions="5"] .wl-bbar-btn[data-bbar-icon="wl-ic-heart"] svg,
.wl-bbar[data-bbar-actions="6"] .wl-bbar-btn[data-bbar-icon="wl-ic-heart"] svg { width: 32px; height: 32px; }
.wl-bbar[data-bbar-actions="5"] .wl-bbar-btn[data-bbar-icon="wl-ic-user"] svg,
.wl-bbar[data-bbar-actions="6"] .wl-bbar-btn[data-bbar-icon="wl-ic-user"] svg { width: 28px; height: 28px; }

/* Una barra senza azione primaria (centerAction: null) si disegna piena,
   senza tasca: il JS azzera --wl-bbar-notch-w e nasconde il pulsante. */
.wl-bbar-center.hidden { display: none !important; }

/* Ospite (5/9, richiesta utente: "rendere grigio il monogramma del tasto
   centrale fino a che l'utente non si registra"). Il pulsante resta
   premibile apposta, non e' `:disabled`: e' premendolo che si scopre il
   perche', perche' apre il foglio del recinto (guest-gate.js). Grigio dice
   "non ancora tuo"; spento direbbe "rotto", e non spiegherebbe niente.
   Stessa struttura di sempre, cambiano solo le variabili del gradiente,
   quindi il vetro, il rilievo e la sagoma restano quelli certificati. Il
   `brightness(1.8)` della versione arancione qui scenderebbe a schiarire
   un grigio verso il beige: si abbassa e si desatura quello che sta
   dietro, cosi' il grigio resta grigio anche sopra una foto calda. */
.wl-bbar-center.is-locked {
  --wl-bbar-center-a: rgba(226, 232, 238, 0.4);
  --wl-bbar-center-b: rgba(116, 129, 141, 0.56);
  --wl-bbar-center-ring: rgba(255, 255, 255, 0.44);
  color: rgba(255, 255, 255, 0.74);
  -webkit-backdrop-filter: var(--wl-glass-blur) brightness(1.15) saturate(0.5);
  backdrop-filter: var(--wl-glass-blur) brightness(1.15) saturate(0.5);
  /* Identica all'originale meno l'alone arancione: quello e' il richiamo
     dell'azione primaria, e qui non c'e' nessuna azione primaria. */
  box-shadow:
    0 0 0 1.4px var(--wl-bbar-edge-dark),
    0 10px 22px rgba(4, 14, 25, 0.3),
    inset 0 1.5px 0 rgba(255, 255, 255, 0.42),
    inset 0 -12px 22px rgba(22, 32, 42, 0.26);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .wl-bbar-center.is-locked { --wl-bbar-center-a: rgba(203, 212, 220, 0.96); --wl-bbar-center-b: rgba(122, 136, 148, 0.96); }
}
