/* ==========================================================================
   style.css - EUPAHW

   Scritto partendo dallo schermo del telefono: le regole di base valgono per
   il piccolo, e le poche media query aggiungono quello che serve quando c'e'
   piu' spazio. Nessuna larghezza fissa, nessun font remoto.
   ========================================================================== */

/* I colori sono quelli del sito ufficiale della conferenza, presi dal suo
   foglio di stile e non a occhio. La palette del sito ha nomi propri: la
   scala della conferenza si chiama 'rackley' (l'azzurro-acciaio dei titoli),
   il blu del banner e' 'darkcornflowerblue', il verde 'polishedpine'.

   --blu e' il colore delle intestazioni del sito, scritto come lo scrive lui:
   rackley-500 al 90%. E il 90% e' la trappola: essendo TRASLUCIDO, il contrasto
   che offre dipende da cosa ha sotto. Sopra la fascia azzurra della testata da'
   i 3.5:1 che bastano al testo grande in grassetto - ed e' cosi' che lo usa il
   sito ufficiale, titoli in 18px bold. Ma sul fondo bianco della pagina lo
   stesso colore cade a 3.28:1, sotto qualunque soglia.
   Percio' la regola e' geografica, non tipografica: --blu solo dove sotto c'e'
   la fascia; su bianco - orari, etichette, indirizzi, e i fondi dei pulsanti e
   della pillola attiva - si usa --blu-testo, lo stesso colore un gradino piu'
   scuro, che sta a 5.5:1 ed e' anche il 'primary' del tema in global.R. */
:root {
  --blu: rgba(74, 138, 160, .9);  /* rackley-500 al 90%, come il sito */
  --blu-testo: #3C7081;           /* rackley-600 - testo piccolo sul bianco */
  --blu-scuro: #1D363F;           /* rackley-800 */
  --navy: #2F4181;                /* darkcornflowerblue-500 - il banner */
  --grigio: #4B5563;
  --grigio-chiaro: #EEF5F7;       /* rackley-50  - il fondo della pagina */
  --bordo: #D9E8ED;               /* rackley-100 */
  /* Lo sfondo del banner della conferenza: copre il bordo sotto la tacca. */
  --azzurro: #8FCEF1;

  /* L'altezza delle DUE strisce sotto il banner: la fascia blu e la riga delle
     linguette. Una variabile sola perche' devono essere uguali - due strisce
     alte diverso, una sopra l'altra, si vedono - e perche' altrimenti divergono
     appena qualcuno tocca un padding. 2.875rem sono 46 px, che e' l'altezza a
     cui stava la fascia quando le si e' misurate. Dentro ci sta una pillola da
     45 px, sopra la soglia di 44 sotto il dito. */
  --riga-testata: 2.875rem;

  /* E l'altezza della barra delle sezioni quando sta in fondo, sul telefono:
     52 px, che e' la misura delle barre di sistema - dentro ci stanno l'icona
     e la parola sotto. Non e' --riga-testata perche' la' in fondo non ha
     niente accanto a cui somigliare, e 46 px con due righe dentro stringono.
     La usano tre cose: la barra, il pulsante torna-in-cima che le sta sopra, e
     il padding che output$stile_dentro restituisce alla pagina. */
  --riga-sezioni: 3.25rem;
}

body {
  background: var(--grigio-chiaro);
  -webkit-text-size-adjust: 100%;
}

/* fluidPage() avvolge tutta la pagina in un .container-fluid, che di suo ha un
   margine laterale: il banner ne resterebbe spinto dentro, con due strisce di
   sfondo ai lati. Qui si azzera, e non si perde niente perche' lo spazio
   laterale lo mette ogni blocco per conto suo: .barra, .nav-pills, .pagina e
   .pie hanno il proprio padding.

   La colonna alta almeno quanto la finestra serve al piede: con poco contenuto
   - la pagina Authors con la ricerca che lascia una scheda sola - il piede
   risalirebbe a mezza altezza, col vuoto sotto. Qui invece la colonna arriva in
   fondo alla finestra e il piede si appoggia laggiu' (vedi .pie).

   dvh e non vh: sul telefono vh conta anche la fascia coperta dalla barra degli
   indirizzi, quindi la pagina si potrebbe far scorrere di qualche decina di
   pixel pur non avendo niente da mostrare. vh resta come ripiego per i browser
   che dvh non lo conoscono. */
.container-fluid {
  padding-left: 0;
  padding-right: 0;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100dvh;
}

/* ---- intestazione ------------------------------------------------------- */

/* La testata e' il banner della conferenza piu' una fascia blu. Lo sfondo
   azzurro e' quello del banner: copre il bordo sotto la tacca del telefono e
   le bande ai lati quando lo schermo e' piu' largo dell'immagine. */
.intestazione {
  background: var(--azzurro);
  padding-top: env(safe-area-inset-top);
}

/* Il banner tiene sempre tutta la larghezza della finestra, a qualsiasi
   misura: cosi' le proporzioni della testata non cambiano man mano che si
   allarga la pagina. Puo' farlo perche' in pagina ne arrivano due misure fra
   cui il browser sceglie: 1600x328 e 3200x656 (misurate sui file, non a
   memoria). height: auto e le misure scritte sull'<img> in ui.R servono
   insieme: le seconde danno la proporzione, questa lascia decidere alla
   larghezza. */
.banner {
  display: block;
  width: 100%;
  height: auto;
}

/* L'altezza la da' --riga-testata e non il padding verticale, che qui non c'e'
   piu': e' la stessa misura della riga delle linguette qui sotto.

   Il fianco e' 0.75rem come quello delle linguette (.nav-pills) e della pagina
   (.pagina), non 1rem: i tre blocchi incolonnati partono dallo stesso bordo, e
   quegli 8 px sono anche quelli che tengono la data su una riga sola sugli
   schermi da 320 px. */
/* IL FONDO E' --blu-testo E NON --blu, ed e' il debito che la palette si
   portava dietro: --blu e' traslucido, quindi sopra la fascia azzurra da'
   3.52:1 col bianco - e la riga della data e' 0.8rem, cioe' testo piccolo, che
   vuole 4.5. Con --blu-testo siamo a 5.49 e non c'e' piu' niente in sospeso.
   E' lo stesso blu un gradino piu' scuro, cioe' quello della pillola attiva e
   dei pulsanti: la palette non si allarga di un colore.
   E ne viene in regalo la cosa per cui e' stato fatto: la barra delle sezioni
   in fondo allo schermo ha lo stesso fondo, e le due strisce COMBACIANO - con
   --blu non lo avrebbero fatto, perche' un colore traslucido dipende da cosa
   ha sotto, e sotto hanno due cose diverse (l'azzurro del banner e il fondo
   della pagina): 3.52 contro 3.33. */
.barra {
  background-color: var(--blu-testo);
  color: #fff;
  padding: 0 0.75rem;
  min-height: var(--riga-testata);
  display: flex;
  align-items: center;
  gap: 0.5rem;
}

.intestazione-testo { flex: 1 1 auto; min-width: 0; }

/* Visibile a un lettore di schermo, non sulla pagina. */
.solo-lettore {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* Il titolo in chiaro serve solo quando il banner non c'e'. */
.barra h1 {
  font-size: 1.15rem;
  font-weight: 600;
  line-height: 1.25;
  margin: 0;
}

.occhiello {
  font-size: 0.7rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  opacity: 0.85;
  margin: 0 0 0.15rem;
}

/* SU UNA RIGA SOLA, SEMPRE. La fascia e' alta quanto la riga delle linguette
   (--riga-testata) e una seconda riga la fa crescere oltre: si vedeva col
   telefono, appena qualcuno faceva accesso (documenti/mobile1.png).

   Le larghezze sono misurate in Chrome, non stimate: "19-22 January 2027 ·
   Milan, Italy" occupa 301 px a 1.2rem e 201 px a 0.8rem. Su uno schermo da
   320 px, tolti i due fianchi (24), lo spazio fra i blocchi (8) e il pulsante
   (67), ne restano 221. Da qui 0.8rem: e' la misura che ci sta su qualunque
   telefono, con o senza qualcuno collegato, e con margine su quelli da 360 in
   su. Il nome di chi ha fatto accesso invece non ci sta a nessuna misura, e
   infatti non e' piu' qui: sta nel modale della modifica (vedi server.R).

   IL PREZZO, ed e' scritto per non riscoprirlo: a 1.2rem in grassetto questa
   riga era "testo grande", e i 3.5:1 che il bianco ha su --blu bastavano. A
   0.8rem non e' piu' testo grande e ne servirebbero 4.5. Si recuperano solo
   scurendo la fascia (--blu-testo sta a 5.5:1), che e' una decisione sul colore
   del sito e non del foglio di stile - il 0.9rem del desktop, in fondo al file,
   ha sempre avuto esattamente lo stesso problema. */
.sottotitolo {
  font-size: 0.8rem;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 0.01em;
  margin: 0;
  /* Se un giorno la stringa si allunga - un'altra citta', un intervallo di date
     piu' lungo - si accorcia coi puntini invece di far crescere la fascia. */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* L'angolo dell'accesso: un pulsante e basta. Il nome che gli stava accanto
   costava 172 px misurati sulla fascia piu' stretta che ci sia. */
.connesso {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  /* Su schermo largo qui ci sono DUE pulsanti - "Edit your data" e "Sign out" -
     e questo e' il solo spazio fra loro: senza, si leggono come un pulsante
     unico con una linea in mezzo. Mezzo rem e non piu', perche' ogni pixel qui
     e' un pixel che la data non ha per stare su una riga sola. */
  gap: 0.35rem;
}

/* Un filo piu' piccolo del btn-sm di Bootstrap: sono i pixel che tengono la
   data su una riga sola sui telefoni stretti. Resta alto ~29 px, sotto i 44 px
   che si vorrebbero sotto il dito - ma e' il tetto che impone una fascia alta
   46, ed e' un pulsante isolato, senza niente di premibile accanto a cui possa
   essere scambiato. */
.connesso .btn {
  flex: 0 0 auto;
  font-size: 0.8rem;
  padding: 0.25rem 0.5rem;
}

/* LA PORTA DEL MODULO CAMBIA POSTO CON LA LARGHEZZA, E QUESTO E' IL CONTO.

   La riga della data ("19-22 January 2027 · Milan, Italy") vuole 201 px a
   0.8rem. Quello che le resta e' la finestra meno i due fianchi (24), il
   distanziatore (8) e i pulsanti:

     due pulsanti (154 px)     320 -> 134 px    360 -> 174 px    tronca
     "Sign out" da solo (67)   320 -> 221 px    360 -> 261 px    ci sta

   La seconda riga e' misurata, non stimata: tests/browser.R la rifa' a 320, 360
   e 390 px e chiede che la stringa sia intera - 'scrollWidth <= clientWidth',
   perche' la larghezza in px da sola non direbbe se i puntini sono scattati.

   Percio' sul telefono la modifica esce dalla fascia e va in cima alla pagina
   Authors (output$pagina_autori in server.R), dove per giunta il pulsante puo'
   essere alto i 44 px del dito, che in una fascia da 46 non ci stanno.

   Le due regole sono complementari e non si sovrappongono mai: in ogni momento
   la porta e' UNA. La soglia e' 36rem = 576 px, lo stesso gradino che il resto
   del file usa per separare il telefono da tutto il resto - a quella larghezza
   la data ha gia' 390 px per i 201 che le servono, quindi si sta larghi. In rem
   e non in px di proposito: chi ha ingrandito il carattere del browser ha
   bisogno di piu' spazio, non di meno, e cosi' la soglia si sposta con lui.

   Il verso della coppia e' quello del progetto: il caso di base e' il telefono,
   e lo schermo grande e' l'eccezione che aggiunge. */
.modifica-fascia { display: none; }

.modifica-lista {
  display: inline-flex;
  align-items: center;
  /* 44 px: la misura sotto il dito. E' il guadagno vero dello spostamento, non
     un di piu' - vedi .connesso .btn qui sopra, che resta a 29. */
  min-height: 2.75rem;
  padding-left: 1.2rem;
  padding-right: 1.2rem;
  margin-bottom: 0.75rem;
}

@media (min-width: 36rem) {
  .modifica-fascia { display: inline-block; }
  .modifica-lista { display: none; }
}

/* ---- navigazione a pillole ---------------------------------------------- */

/* QUESTA E' L'UNICA PARTE DEL FILE SCRITTA AL CONTRARIO, cioe' col desktop nella
   regola di base e il telefono in una media query `max-width`. E' voluto, e la
   ragione e' che sotto i 576 px questa riga non e' la stessa cosa piu' piccola:
   e' un'altra cosa. In cima diventa in fondo, la pillola di testo diventa
   un'icona con la parola sotto, il fondo pieno della voce attiva diventa un
   colore. Scritta mobile-first sarebbe una regola che disfa Bootstrap e una
   media query che lo rimette: due negazioni da tenere d'accordo. Cosi' invece la
   trasformazione sta in un posto solo e si legge tutta insieme. */
.nav-pills {
  position: sticky;
  top: 0;
  z-index: 1020;
  background: #fff;
  border-bottom: 1px solid var(--bordo);
  /* Niente padding verticale: l'altezza della striscia e' --riga-testata, la
     stessa della fascia blu qui sopra, e dentro la pillola ci si allarga fino a
     riempirla. Col padding la striscia veniva 61 px contro i 46 della fascia. */
  padding: 0 0.75rem;
  min-height: var(--riga-testata);
  align-items: center;
  gap: 0.4rem;
  flex-wrap: nowrap;
  overflow-x: auto;
  scrollbar-width: none;
}

.nav-pills::-webkit-scrollbar { display: none; }

/* La pillola resta PICCOLA - 33 px, l'aria intorno e' quella che la fa
   sembrare una pillola e non una linguetta piena - ma la zona che risponde al
   dito arriva ai bordi della striscia.
   Le due cose stanno insieme grazie all'::after: un rettangolo invisibile che
   sporge sopra e sotto di 6 px, e siccome appartiene al collegamento, toccarlo
   e' toccare il collegamento. Il fondo colorato invece resta quello del <a>,
   quindi la pillola si vede della sua misura.
   I 6 px non sono a caso: la striscia dentro il bordo e' alta 45, la pillola 33,
   e (45 - 33) / 2 fa esattamente 6. Se sporgesse di piu' la striscia si
   ritroverebbe una barra di scorrimento verticale, perche' overflow-x: auto
   rende auto anche l'altro asse. */
.nav-pills .nav-link {
  font-size: 0.9rem;
  padding: 0.35rem 0.9rem;
  position: relative;
  white-space: nowrap;
  color: var(--grigio);
}

.nav-pills .nav-link::after {
  content: "";
  position: absolute;
  inset: -6px 0;
}

/* --blu-testo e non --blu: qui sopra ci va il bianco, e --blu e' traslucido,
   quindi sul fondo della pagina sta a 3.28:1. Vedi la nota della palette. */
.nav-pills .nav-link.active { background: var(--blu-testo); font-weight: 600; }

/* NELLA BARRA le icone si vedono solo sul telefono: in cima, una pillola di
   testo e' quello che uno si aspetta, e tre disegni la' sopra sarebbero
   decorazione. Restano nel markup, perche' il markup e' uno solo per i due
   casi. La regola e' legata a .nav-pills e non all'icona di proposito: fuori
   dalla barra - le porte della schermata d'ingresso - l'icona si vede sempre. */
.nav-pills .icona-sezione { display: none; }

/* LE DUE VERSIONI DELL'ICONA, vuota e piena, sono ENTRAMBE nel markup e a
   scegliere e' il foglio di stile: quale linguetta e' attiva cambia mentre si
   naviga, mentre quel markup si costruisce una volta sola. Il colore da solo
   non direbbe dove sei - su una barra blu con le scritte bianche non si
   vedrebbe - e la coppia vuoto/pieno e' come lo dicono le barre di sistema. */
.nav-pills .icona-piena { display: none; }


/* ---- ...e sul telefono la stessa riga e' una barra in fondo -------------- */

@media (max-width: 35.99rem) {
  /* SOTTO IL POLLICE. Un telefono si tiene in mano dal basso, e in cima al vetro
     il pollice non arriva senza cambiare presa: e' la cosa che fa somigliare il
     sito a un'applicazione piu' di qualunque altra, perche' quella barra e' il
     gesto che uno conosce da tutte le altre app che ha.

     'fixed' e non 'sticky': in fondo al documento sticky non attaccherebbe
     niente - resterebbe dove sta nel flusso, cioe' sotto il contenuto - e la
     barra deve esserci anche a pagina lunga. Il prezzo e' che non occupa piu'
     spazio nel flusso, quindi il fondo della pagina glielo restituisce
     output$stile_dentro con un padding, e solo da dentro: fuori la barra non
     c'e', e quel padding sarebbe una striscia vuota sotto la porta. */
  .nav-pills {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    top: auto;
    border-top: 1px solid var(--bordo);
    border-bottom: 0;
    /* L'area di sicurezza dell'iPhone, se no la barra finisce sotto la tacca
       orizzontale. */
    padding: 0 0.25rem env(safe-area-inset-bottom);
    min-height: var(--riga-sezioni);
    /* Lo STESSO fondo della fascia in cima, cosi' le due strisce combaciano.
       Il bordo qui non serve piu': fra il fondo della pagina e questo blu la
       separazione e' il colore. */
    background: var(--blu-testo);
    border-top: 0;
    gap: 0;
  }

  /* Le tre voci si dividono la larghezza in parti uguali, come in qualunque
     barra di sistema: ciascuna si prende la sua zona di vetro, e il bersaglio e'
     la zona, non la scritta. I flex-child di .nav-pills sono gli <li>, non gli
     <a>, quindi la divisione va chiesta a loro. */
  .nav-pills .nav-item {
    flex: 1 1 0;
    min-width: 0;
  }

  /* L'ICONA SOPRA E IL NOME SOTTO SENZA UN FLEX, e non e' pigrizia: e' l'unico
     modo che regge.
     Provato: mettere `display: flex; flex-direction: column` sul collegamento NON
     funziona, e il motivo e' nella cascata. La regola con cui il server fa
     comparire le linguette chiuse e' `.nav-pills .nav-link[data-value="agenda"]
     { display: block }`, e un selettore d'attributo pesa come una classe: (0,3,0)
     contro i (0,3,0) di `.nav-pills .nav-item .nav-link` - e a pari specificita'
     vince l'ultimo del documento, che e' quello del server, perche' sta nel body.
     Misurato in Chrome: `flex-direction` arrivava, `display` restava `block`, e le
     due cose stavano affiancate.
     Percio' il collegamento resta un blocco come lo vogliono Bootstrap e il
     server, e a impilarsi sono i suoi due figli, che sono due blocchi. E' la
     disposizione di prima dei flex, e qui e' anche la piu' robusta: non c'e'
     nessuna specificita' da rincorrere.
     Il padding e' quello che porta il collegamento a riempire i 52 px della
     barra: 22 dell'icona, 1,6 di stacco, 14 del nome, e 14,4 di padding. Cosi'
     la zona che risponde al dito e' tutta la sua colonna. */
  .nav-pills .nav-link {
    text-align: center;
    padding: 0.45rem 0.15rem;
    font-size: 0.66rem;
    line-height: 1.15;
    border-radius: 0;
    /* Bianco all'85%, che sopra --blu-testo fa 4.50:1 - appena sopra la soglia
       del testo piccolo. Le voci non attive devono essere leggibili, non
       sbiadite: e' l'attiva che si distingue, e lo fa in tre modi insieme
       (icona piena, bianco pieno, grassetto), non con l'opacita' degli altri. */
    color: rgba(255, 255, 255, 0.85);
  }

  /* Il rettangolo invisibile qui non deve sporgere: il collegamento e' gia' alto
     quanto la barra, e 6 px in piu' darebbero alla striscia una barra di
     scorrimento verticale (overflow-x: auto rende auto anche l'altro asse). */
  .nav-pills .nav-link::after { inset: 0; }

  /* LA VOCE ATTIVA SI DISTINGUE IN TRE MODI INSIEME, e non e' ridondanza: e'
     che nessuno dei tre da solo basta. L'icona diventa piena - il colore, su un
     fondo blu con le scritte bianche, non si vedrebbe affatto; la scritta passa
     al bianco pieno (5.49:1 contro i 4.50 delle altre); e il grassetto la tiene
     leggibile anche a chi non distingue quelle due sfumature di bianco.
     Nessuna pillola piena: qui il fondo e' gia' blu, e un rettangolo dentro un
     rettangolo non direbbe niente in piu'. */
  .nav-pills .nav-link.active {
    color: #fff;
    font-weight: 600;
    background: none;   /* nessuna pillola piena: qui il fondo e' gia' blu */
  }

  .nav-pills .icona-sezione { margin: 0 auto 0.1rem; }

  .nav-pills .icona-linea { display: block; }
  .nav-pills .nav-link.active .icona-linea { display: none; }
  .nav-pills .nav-link.active .icona-piena { display: block; }


  /* La parola sotto l'icona: se un nome un giorno fosse lungo, meglio i puntini
     che una barra che cresce di una riga. */
  .nome-sezione {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
}

/* ---- pulsanti ------------------------------------------------------------ */

/* NON --blu, ed e' una correzione: --blu e' traslucido, quindi il 3.5:1 della
   nota in testa al file vale solo dove sotto c'e' la fascia azzurra. Su bianco
   quello stesso colore cade a 3.28:1, e questi due pulsanti - "Sign in" e
   "Save and sign out" - sono 16 px semibold, cioe' testo piccolo, che vuole
   4.5:1. Sono anche i due comandi che una persona deve trovare da sola, col
   telefono a mezza luminosita' in una sala illuminata.
   --blu-testo e' lo stesso colore un gradino piu' scuro e sta a 5.49:1: e' gia'
   il 'primary' del tema in global.R, quindi questa regola ora concorda con lui
   invece di scavalcarlo. Il grassetto resta. */
.btn-primary {
  background-color: var(--blu-testo);
  border-color: var(--blu-testo);
  font-weight: 600;
}

/* Un gradino piu' scuro del riposo, che ora e' --blu-testo: se no premere non
   si vedrebbe. */
.btn-primary:hover,
.btn-primary:focus,
.btn-primary:active {
  background-color: var(--blu-scuro);
  border-color: var(--blu-scuro);
}

/* Il contorno prende il colore del sito, l'etichetta scende di un gradino:
   e' testo piccolo su fondo bianco, e li' servono 4.5:1. */
.btn-outline-primary {
  color: var(--blu-testo);
  border-color: var(--blu);
}

.btn-outline-primary:hover,
.btn-outline-primary:focus,
.btn-outline-primary:active {
  background-color: var(--blu-testo);   /* col bianco sopra: 5.49 */
  border-color: var(--blu);
  color: #fff;
}

.pagina {
  max-width: 52rem;
  margin: 0 auto;
  padding: 1rem 0.75rem 3rem;
}

/* ---- la schermata d'ingresso --------------------------------------------- */

/* QUELLO CHE VEDE CHI NON E' ENTRATO: due porte e nient'altro. Il markup e'
   statico (SCHERMATA_INGRESSO in global.R), quindi arriva col documento e si
   vede al primo disegno; a farlo sparire da dentro e' output$stile_dentro, che
   emette '.ingresso { display: none }' nel body.

   Lo stato di partenza e' quello di FUORI - ingresso in vista, testo informativo
   e pillole nascosti - e non e' un caso: chi non e' entrato non deve vedere niente
   comparire e sparire, perche' e' l'unica pagina che ha. Chi entra il lampo non lo
   vede: le regole del server arrivano tutte insieme al primo messaggio, e la
   pagina si sveglia una volta sola.

   dvh e non vh: sul telefono vh conta anche la fascia coperta dalla barra degli
   indirizzi, quindi mezzo schermo contato in vh e' piu' di mezzo schermo vero. */
.ingresso {
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 60vh;
  min-height: 60dvh;
}

/* "Welcome" e' la parola d'accoglienza del sito, e questo e' l'unico posto dove
   sta bene: era il nome della linguetta finche' quella era l'unica che si vedeva
   da fuori. --blu-scuro e non --blu-testo: e' un titolo su fondo chiaro, e la' il
   gradino piu' scuro della scala si legge meglio senza sembrare un collegamento. */
.ingresso-titolo {
  font-size: 1.45rem;
  font-weight: 600;
  color: var(--blu-scuro);
  margin: 0 0 1rem;
}

/* LA NOTA IN FONDO E' UN PIEDE, e sul telefono sta staccata dalle porte: e'
   l'unica cosa che serve a chi NON riesce a entrare, quindi non puo' mancare,
   ma non e' quello che la maggioranza viene a fare - e attaccata sotto le due
   porte sembrava una terza voce.
   margin-top: auto la manda in fondo alla schermata: .ingresso e' una colonna
   flex alta 60dvh, quindi il margine automatico si mangia lo spazio che avanza
   e la nota si appoggia laggiu' mentre il titolo e le porte restano in cima.
   Stessa forma del piede del desktop: piccola, grigia, centrata. */
.ingresso-nota {
  margin: auto 0 0;
  padding-top: 1rem;
  font-size: 0.78rem;
  line-height: 1.5;
  color: var(--grigio);
  text-align: center;
}

.ingresso-nota a { color: var(--blu-testo); }

@media (min-width: 36rem) {
  /* TUTTA LA PORTA DENTRO LA FINESTRA, col piede a chiudere in fondo.
     Il mezzo schermo di min-height serve sul telefono, dove sopra c'e' solo la
     testata; sul desktop il banner tiene tutta la larghezza, quindi e' alto un
     quarto della finestra, e mezzo schermo in piu' faceva scorrere la pagina per
     due dita - con il piede spinto fuori. Senza, l'altezza e' quella del
     contenuto, e la colonna alta 100dvh mette il piede in fondo da se'. C'e' una
     verifica col browser: a 1280x800 e 1366x768 la pagina non scorre. */
  .ingresso {
    min-height: 0;
    padding: 1rem 0 0.5rem;
    max-width: 32rem;
    margin: 0 auto;
    width: 100%;
  }

  /* E qualche pixel in meno addosso, per la stessa ragione: sono le misure che
     fanno stare la porta dentro la finestra a 1366x768, che e' la piu' stretta
     in altezza fra quelle comuni. Misurato: senza queste quattro righe sbordava
     di 42 px. */
  .porta { min-height: 4rem; }
  .ingresso-titolo { margin-bottom: 0.75rem; }
  /* Sul desktop la nota torna attaccata alle porte: laggiu' il piede vero c'e'
     gia' - .pie - e due piedi uno sopra l'altro sono uno di troppo. */
  .ingresso-nota { margin: 1rem 0 0; padding-top: 0.75rem; text-align: left; }

  /* E il fondo della pagina: 3rem li vuole il telefono, dove sotto c'e' la barra
     delle sezioni; sul desktop sotto c'e' il piede, che ha un padding suo. */
  .pagina { padding-bottom: 2rem; }
}

/* ---- le due porte -------------------------------------------------------- */

/* IN COLONNA E NON AFFIANCATE, e la forma e' quella di una voce di elenco:
   l'icona in un cerchio a sinistra, il nome e la spiegazione in mezzo, una
   freccia a destra. Due quadrati affiancati erano due bersagli piccoli in mezzo
   a uno schermo vuoto; due righe larghe quanto lo schermo sono due bersagli che
   non si possono sbagliare, e sono la forma che uno ha visto in ogni
   applicazione che ha aperto. */
.porte {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

.porta {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  width: 100%;
  /* 72 px: il doppio della misura sotto il dito, e non e' spreco - qui le voci
     sono due e lo schermo e' vuoto. */
  min-height: 4.5rem;
  padding: 0.85rem 1rem;
  text-align: left;
  background: #fff;
  border: 1px solid var(--bordo);
  border-radius: 1rem;
  color: var(--blu-scuro);
  text-decoration: none;
  box-shadow: 0 1px 3px rgba(29, 54, 63, 0.07);
}

/* La prima e' quella che si viene a premere: fondo pieno, come il pulsante
   primario del tema. --blu-testo e non --blu, che essendo traslucido sul bianco
   cade a 3.28:1 - e' la regola geografica sul contrasto in cima al file. */
.porta-prima {
  background: var(--blu-testo);
  border-color: var(--blu-testo);
  color: #fff;
}

.porta:hover,
.porta:focus {
  color: var(--blu-scuro);
  text-decoration: none;
  border-color: var(--blu-testo);
}

.porta-prima:hover,
.porta-prima:focus {
  color: #fff;
  background: var(--blu-scuro);
  border-color: var(--blu-scuro);
}

/* Il cerchio dietro l'icona: e' quello che fa sembrare la riga una voce di
   un'applicazione invece di un pulsante con un disegno accanto. Sulla porta
   piena il cerchio e' bianco trasparente, cosi' resta un cerchio senza aggiungere
   un terzo colore. */
.porta-icona {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 2.9rem;
  height: 2.9rem;
  border-radius: 50%;
  background: var(--grigio-chiaro);
  color: var(--blu-testo);
}

.porta-prima .porta-icona {
  background: rgba(255, 255, 255, 0.18);
  color: #fff;
}

/* L'icona qui non ha margini: li mette il cerchio che la contiene. */
.porta .icona-sezione { display: block; margin: 0; }

.porta-testo {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 0.1rem;
}

.porta-titolo { font-size: 1.1rem; font-weight: 600; }

.porta-nota {
  font-size: 0.8rem;
  line-height: 1.35;
  color: var(--grigio);
}

.porta-prima .porta-nota { color: rgba(255, 255, 255, 0.85); }

/* La freccia dice "questa riga si apre", e sta smorzata perche' e' un segno, non
   un comando: chi la guarda deve leggere il nome, non lei. */
.porta-freccia {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  opacity: 0.5;
}

.porta-freccia .icona-sezione { display: block; margin: 0; }

/* ---- selettore dei giorni ------------------------------------------------ */

.segmentato {
  display: flex;
  gap: 0.5rem;
  overflow-x: auto;
  padding-bottom: 0.25rem;
  margin-bottom: 1rem;
  scrollbar-width: none;
}

.segmentato::-webkit-scrollbar { display: none; }

/* Le quattro giornate della conferenza devono starci tutte sullo schermo di
   un telefono: si dividono la riga in parti uguali. Il minimo serve solo se
   un giorno le giornate diventassero molte, e allora si torna a scorrere. */
.segmento {
  flex: 1 1 0;
  min-width: 4.5rem;
  border: 1px solid var(--bordo);
  background: #fff;
  border-radius: 0.6rem;
  padding: 0.5rem 0.75rem;
  text-align: center;
  line-height: 1.15;
  color: var(--grigio);
}

/* --blu-testo e non --blu: la scritta e' bianca a 0.95rem, cioe' testo piccolo
   (grande vuol dire 18.66px in grassetto), e su --blu il bianco sta a 3.86.
   E' l'ultimo dei tre posti che la nota della palette elencava. */
.segmento.attivo {
  background: var(--blu-testo);
  border-color: var(--blu-testo);
  color: #fff;
}

.segmento-data { display: block; font-weight: 600; font-size: 0.95rem; }
.segmento-nome { display: block; font-size: 0.7rem; opacity: 0.85; }

/* ---- programma ----------------------------------------------------------- */

/* Cambiare giorno sostituisce tutto il contenuto del programma, e senza niente
   il vecchio spariva e il nuovo compariva di colpo: due scatti dove il gesto e'
   uno. Un'apparizione da 160 ms li cuce insieme.
   Funziona perche' gli elementi sono NUOVI a ogni cambio - Shiny rifa' il
   markup - quindi l'animazione riparte da se', senza una riga di JavaScript.
   Chi ha chiesto al sistema di non animare non vede muoversi niente: e' una
   richiesta di accessibilita', non una preferenza. */
@keyframes comparsa-giorno {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: none; }
}

#programma > * {
  animation: comparsa-giorno 0.16s ease-out both;
}

@media (prefers-reduced-motion: reduce) {
  #programma > * { animation: none; }
}

.titolo-giorno {
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--grigio);
  margin: 0 0 0.6rem 0.15rem;
}

.sessione {
  border: 1px solid var(--bordo);
  box-shadow: none;
  margin-bottom: 0.6rem;
}

.sessione .card-body { padding: 0.85rem; }

.sessione-testa { display: flex; gap: 0.75rem; align-items: baseline; }

.sessione-ora {
  flex: 0 0 auto;
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  font-size: 0.85rem;
  color: var(--blu-testo);
  white-space: nowrap;
}

.sessione-testo { min-width: 0; }

.sessione-titolo {
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.3;
  margin: 0;
}

.sessione-dettagli {
  font-size: 0.8rem;
  color: var(--grigio);
  margin: 0.2rem 0 0;
}

.tipo {
  display: inline-block;
  margin-top: 0.4rem;
  font-size: 0.68rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  background: var(--grigio-chiaro);
  border-radius: 999px;
  padding: 0.1rem 0.55rem;
  color: var(--grigio);
}

/* Pause, registrazione, cerimonie: presenti ma non in primo piano. */
.sessione-minore { background: transparent; border-style: dashed; }
.sessione-minore .sessione-titolo { font-weight: 500; color: var(--grigio); }

.pulsante-abstract { margin-top: 0.7rem; }
.pulsante-abstract::after { content: " ↓"; }
.pulsante-abstract:not(.collapsed)::after { content: " ↑"; }

/* ---- colori della bozza di agenda: SPENTI -------------------------------- */
/* Nessuna scheda porta la classe 'sessione-colorata' finche' l'app non parte
   con options(eupahw.colori_agenda = TRUE). Queste regole non toccano quelle
   sopra: si aggiungono soltanto quando l'interruttore e' acceso, e i valori
   arrivano in linea sull'elemento da stile_sessione(). Tenute qui, pronte,
   per non dover ricampionare il PDF se ci si torna. */

.sessione-colorata {
  background: var(--fondo);
  color: var(--su-fondo);
  border-color: var(--bordo-scheda);
}

.sessione-colorata .sessione-ora,
.sessione-colorata .tipo { color: var(--su-fondo); }
.sessione-colorata .tipo { background: var(--velo); }
.sessione-colorata .sessione-dettagli { color: var(--su-fondo); opacity: 0.85; }

/* Un contorno blu su fondo rosso non si leggerebbe: il pulsante prende il
   colore del testo della scheda. */
.sessione-colorata .pulsante-abstract {
  color: var(--su-fondo);
  border-color: var(--su-fondo);
}

.sessione-colorata .pulsante-abstract:hover,
.sessione-colorata .pulsante-abstract:focus,
.sessione-colorata .pulsante-abstract:not(.collapsed) {
  background: var(--su-fondo);
  color: var(--fondo);
  border-color: var(--su-fondo);
}

/* Gli abstract stanno DENTRO la scheda: su un fondo pieno un elenco di titoli
   si legge male, quindi il pannello si posa su un velo quasi bianco. */
.sessione-colorata .lista-abstract {
  background: rgba(255, 255, 255, 0.94);
  color: #14262D;
  border-top: 0;
  border-radius: 0.4rem;
  padding: 0 0.75rem 0.25rem;
}

/* ---- abstract ------------------------------------------------------------ */

.lista-abstract { margin-top: 0.85rem; border-top: 1px solid var(--bordo); }

.abstract {
  display: flex;
  gap: 0.75rem;
  padding: 0.85rem 0 0.25rem;
}

.abstract + .abstract { border-top: 1px solid var(--bordo); }

.abstract-ora {
  flex: 0 0 auto;
  font-variant-numeric: tabular-nums;
  font-size: 0.8rem;
  color: var(--grigio);
  padding-top: 0.15rem;
}

.abstract-corpo { min-width: 0; }

.abstract-titolo { font-size: 0.92rem; font-weight: 600; line-height: 1.35; margin: 0; }

.abstract-autore { font-size: 0.82rem; margin: 0.25rem 0 0; }
.abstract-ente { display: block; color: var(--grigio); font-size: 0.76rem; }

.abstract-anteprima {
  font-size: 0.85rem;
  color: #374151;
  margin: 0.4rem 0 0.25rem;
}

/* Keynote, invited lecture, poster: il contributo ordinario non ha etichetta. */
.tipo-contributo {
  display: inline-block;
  font-size: 0.66rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-weight: 600;
  color: var(--blu-testo);
  margin-bottom: 0.2rem;
}

.abstract-assente { font-size: 0.85rem; color: var(--grigio); font-style: italic; margin: 0.4rem 0 0.25rem; }

.abstract-collocazione { font-size: 0.82rem; color: var(--grigio); }
.abstract-completo p { line-height: 1.6; }

.chiavi { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.75rem; }

.chiave {
  font-size: 0.72rem;
  background: var(--grigio-chiaro);
  border-radius: 999px;
  padding: 0.15rem 0.6rem;
  color: var(--grigio);
}

/* ---- autori -------------------------------------------------------------- */

/* Sopra la ricerca, sul solo telefono, c'e' il pulsante che apre il modulo
   della propria scheda: .modifica-lista, che sta con la fascia perche' e' li'
   che si legge il conto dei pixel da cui viene. */
.barra-ricerca { margin-bottom: 1rem; }
.barra-ricerca .form-group { margin-bottom: 0; }

.griglia-autori {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0.6rem;
}

@media (min-width: 40rem) {
  .griglia-autori { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.autore { border: 1px solid var(--bordo); box-shadow: none; }
.autore .card-body { padding: 0.85rem; }
/* Non c'e' piu' un .autore-mio: si e' autenticati soltanto mentre il modale
   della modifica e' aperto, quindi un segno sulla griglia non lo vedrebbe
   nessuno - e non averlo e' la ragione per cui la cache delle schede e' la
   stessa per tutte le sessioni. */

/* La testa della scheda apre il profilo: deve sembrare premibile e deve
   mostrarsi anche a chi ci arriva col tasto di tabulazione. */
.autore-testa {
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
  cursor: pointer;
  border-radius: 0.4rem;
  margin: -0.25rem;
  padding: 0.25rem;
}

.autore-testa:hover { background: var(--grigio-chiaro); }
.autore-testa:focus-visible {
  outline: 2px solid var(--blu);
  outline-offset: 1px;
}

.avatar {
  flex: 0 0 auto;
  width: 3.25rem;
  height: 3.25rem;
  border-radius: 50%;
  object-fit: cover;
  background: var(--grigio-chiaro);
}

.avatar-iniziali {
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 600;
  color: var(--blu-scuro);
  background: var(--bordo);
}

.autore-testo { flex: 1 1 auto; min-width: 0; }
.autore-nome { font-size: 0.98rem; font-weight: 600; margin: 0; line-height: 1.25; }
.autore-ente { font-size: 0.8rem; color: var(--grigio); margin: 0.15rem 0 0; }
.autore-paese { font-size: 0.76rem; color: var(--grigio); margin: 0; }

/* L'indirizzo puo' essere lungo quanto la scheda: si spezza invece di
   allargare la colonna. */
/* .autore-email non c'e' piu': l'indirizzo si legge nella scheda che si apre
   premendo la card, non nella griglia. Le sue tre regole sono andate via con
   lui, se no restavano a far credere che quel pezzo di pagina esista. */

/* Il piede sta IN FONDO alla scheda, non subito sotto il testo. Due autori con
   un'affiliazione che va a capo un numero diverso di volte hanno un blocco di
   testo di altezza diversa, e senza questo il "1 contribution" ballava su e giu'
   da una scheda all'altra della stessa riga.
   Le schede sono celle di una griglia, quindi sono gia' alte quanto la riga piu'
   alta: basta che il corpo sia una colonna e che il piede si prenda tutto lo
   spazio che resta sopra di se'. margin-top: auto fa esattamente questo, ed e'
   il motivo per cui il distacco dal testo passa a padding-top: se restasse un
   margine, si sommerebbe allo spazio vuoto invece di starci dentro. */
.card.autore > .card-body {
  display: flex;
  flex-direction: column;
}

.autore-pie {
  margin-top: auto;
  padding-top: 0.5rem;
  font-size: 0.82rem;
}

.lista-contributi { list-style: none; padding: 0; margin: 0; }
.lista-contributi li { padding: 0.5rem 0; border-top: 1px solid var(--bordo); }
.contributo-dove { display: block; font-size: 0.78rem; color: var(--grigio); }

.contributo-cosa {
  display: block;
  font-size: 0.76rem;
  color: var(--blu-testo);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* LE LINGUETTE CHIUSE NASCONO NASCOSTE, E QUI STA IL PERCHE'.

   Prima le nascondeva il server con hideTab(), e si vedeva: la pagina arriva col
   suo markup completo, il messaggio che le nasconde arriva col primo flush del
   websocket, e in mezzo c'e' un lampo in cui Agenda e Authors si vedono e poi
   spariscono. In locale e' una frazione di secondo; su rete mobile e' piu' lungo,
   perche' e' piu' lungo il giro del websocket.

   Nascoste dal foglio di stile, invece, non c'e' nessun istante in cui si vedono:
   il CSS arriva prima che la pagina si disegni. E quando si entra e' il server a
   emettere una regola che annulla questa (output$stile_dentro in server.R):
   sta nel body, quindi viene DOPO nel documento e a pari specificita' vince.
   Nessun !important, nessun JavaScript nuovo.

   Si nasconde l'<a>, non l'<li>: il padding di Bootstrap sta sull'<a>, quindi
   l'<li> collassa da se' e la barra non lascia due buchi. */
.nav-pills .nav-link[data-value="agenda"],
.nav-pills .nav-link[data-value="authors"] {
  display: none;
}

/* E LA RIGA INTERA, prima dell'accesso: se le altre due linguette sono nascoste
   quella che resta e' una, e una barra di navigazione con una voce sola e'
   rumore - occupa 46 px in cima e non offre nessuna scelta. Senza di lei la
   schermata d'ingresso si prende lo schermo, che e' quello che deve fare.

   Basta ridichiarare display: qui siamo dopo la regola di Bootstrap (.nav) e
   dopo la nostra di sopra, quindi vince l'ultima; da dentro vince quella del
   server, che viene nel body. */
.nav-pills { display: none; }

/* E IL TESTO INFORMATIVO: da fuori sta nascosto e ci si arriva dalla porta
   "General info", che lo apre in un modale. Sta nel documento comunque - e'
   contenuto pubblico, non c'e' niente da proteggere - quindi il modale non
   aspetta nessun giro di rete e questa pagina non ha mai un istante vuoto. */
.blocco-info { display: none; }

/* IL DISPOSITIVO CHE HA IL TOKEN NON DEVE VEDERE LA PORTA, nemmeno per un
   istante: senza questa riga chi ha fatto accesso una volta si rivedrebbe la
   schermata d'ingresso a ogni ricarica per il tempo di un giro di websocket, che
   e' proprio la persona - tutte, in sala - che non deve piu' pensare
   all'accesso.

   La classe la mette www/ricordami.js appena parte, cioe' prima che la pagina si
   disegni, e la toglie quando il server rifiuta il token. NON DECIDE NIENTE
   sull'accesso: la firma la controlla il server, e le pillole restano nascoste
   finche' non e' lui a dire di mostrarle. Decide solo cosa si dipinge in quel
   decimo di secondo. */
html.ha-token .ingresso { display: none; }

/* Il cancello: quello che si vede al posto dell'agenda e dell'elenco autori
   finche' non si e' entrati. Riusa la scheda di Info - stessa cornice, stesso
   respiro - e non e' centrato in mezzo allo schermo: su un telefono il testo
   centrato su tre righe si legge peggio, e in cima c'e' comunque la fascia col
   pulsante. Il margine sotto al pulsante lo stacca dalla nota. */
.cancello .btn {
  margin: 0.6rem 0 0.2rem;
  min-height: 2.75rem;
  padding-left: 1.4rem;
  padding-right: 1.4rem;
}

.cancello .nota {
  margin-bottom: 0;
}

/* I pulsanti degli allegati stanno sotto la riga del contributo, non in fondo al
   titolo: su un telefono il titolo va a capo tre volte, e un pulsante messo di
   fianco finirebbe sotto una riga a caso. Il margine a destra serve quando ce
   n'e' piu' di uno - due poster, o un poster e il PDF dell'abstract. */
.contributo-allegato {
  display: inline-flex;
  align-items: center;
  min-height: 2.25rem;
  margin-top: 0.4rem;
  margin-right: 0.4rem;
}

/* L'anteprima e' un'immagine, non un PDF dentro un iframe: si apre e si zooma
   da qualunque parte. Alta quanto il modale la lascia stare, e mai piu' larga -
   un poster verticale su un telefono non deve mandare la pagina a scorrere di
   fianco. Il fondo si vede mentre l'immagine arriva. */
.allegato-anteprima {
  background: var(--grigio-chiaro);
  border: 1px solid var(--bordo);
  border-radius: 0.4rem;
  text-align: center;
  padding: 0.4rem;
}

.allegato-anteprima img {
  max-width: 100%;
  max-height: 65vh;
  width: auto;
  height: auto;
  /* Il cursore dice che si puo' aprire in grande. Sul telefono non si vede, e
     la' il gesto e' il tocco. */
  cursor: zoom-in;
}

@media (max-width: 575px) {
  .allegato-anteprima img { max-height: 55vh; }
}

/* ---- scheda ricercatore --------------------------------------------------
   Rispecchia il modulo di raccolta dati dell'organizzatore. I campi non
   ancora compilati restano visibili, in grigio: dicono cosa arrivera'. */

.scheda-testa {
  display: flex;
  gap: 0.9rem;
  align-items: center;
  margin-bottom: 1.1rem;
}

.avatar-grande { width: 4.5rem; height: 4.5rem; font-size: 1.4rem; }

.scheda-nome { font-size: 1.2rem; font-weight: 600; margin: 0; line-height: 1.2; }
.scheda-ruolo { font-size: 0.84rem; color: var(--grigio); margin: 0.2rem 0 0; }

.scheda-campi { margin: 0 0 1.2rem; }

/* Etichetta e valore affiancati quando c'e' spazio, incolonnati sul telefono:
   il valore non deve mai finire schiacciato in una colonna stretta. */
.riga-scheda {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0 1rem;
  padding: 0.45rem 0;
  border-top: 1px solid var(--bordo);
}

.riga-scheda dt {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--grigio);
  font-weight: 600;
}

.riga-scheda dd {
  margin: 0;
  font-size: 0.92rem;
  overflow-wrap: anywhere;
}

.riga-scheda dd a { color: var(--blu-testo); }

.non-fornito { color: var(--grigio); font-style: italic; }

.scheda-titoletto {
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--grigio);
  margin: 1.3rem 0 0.5rem;
}

.modale-interessi .nota { margin: 0.1rem 0 0.75rem; }

@media (min-width: 34rem) {
  .riga-scheda { grid-template-columns: 13rem minmax(0, 1fr); align-items: baseline; }
}

/* ---- foto profilo -------------------------------------------------------- */

.modale-foto { text-align: center; }

.anteprima {
  width: 8rem;
  height: 8rem;
  border-radius: 50%;
  object-fit: cover;
  margin: 0 auto 1rem;
  display: block;
  background: var(--grigio-chiaro);
}

.anteprima-vuota {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2.2rem;
  font-weight: 600;
  color: var(--blu-scuro);
  background: var(--bordo);
}

.modale-foto .form-group { text-align: left; }

/* La tela dove si inquadra: stessa misura e stessa forma dell'anteprima, cosi'
   quello che si vede qui e' quello che si vedra' sulla scheda. */
.tela-foto {
  width: 11rem;
  height: 11rem;
  border-radius: 50%;
  display: block;
  margin: 0 auto 0.75rem;
  background: var(--grigio-chiaro);
  cursor: grab;
  touch-action: none;   /* il trascinamento muove la foto, non la pagina */
}

.tela-foto:active { cursor: grabbing; }

/* L'input vero resta invisibile ma raggiungibile da tastiera: quello che si
   vede e' la <label>, che si puo' vestire da pulsante. */
.file-nascosto {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
}

.file-nascosto:focus-visible + label,
.scegli-foto label:hover { text-decoration: underline; }

/* Le due cose che si possono fare alla foto, affiancate: sceglierne una nuova e
   togliere quella che c'e'. In riga e centrate, cosi' hanno la stessa linea di
   base anche quando una delle due non c'e' (il pulsante di cancellazione compare
   solo se una foto c'e' davvero). */
.scegli-foto {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
}

.comandi-foto {
  margin-top: 0.9rem;
  text-align: left;
}

.comandi-foto label {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--grigio);
}

.comandi-foto .nota { margin-top: 0.3rem; }

/* ---- informativa --------------------------------------------------------- */

.informativa {
  background: var(--grigio-chiaro);
  border: 1px solid var(--bordo);
  border-radius: 0.5rem;
  padding: 0.6rem 0.85rem;
}

.informativa summary {
  cursor: pointer;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--blu-testo);
}

.informativa-corpo { margin-top: 0.75rem; }

.informativa-corpo h5 {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--grigio);
  margin: 0.9rem 0 0.2rem;
}

.informativa-corpo p {
  font-size: 0.82rem;
  line-height: 1.55;
  margin: 0;
}

.informativa-corpo a { color: var(--blu-testo); }

.informativa-chiusa { font-weight: 600; margin-top: 1rem !important; }

/* ---- pulsante di aggiornamento dentro la scheda -------------------------- */

.scheda-ritratto { flex: 0 0 auto; }

/* Nome e ruolo accanto al ritratto, e nient'altro: sono le due cose che si
   centrano fra loro nella riga della testa. */
.scheda-intestazione { min-width: 0; }

/* Qui stavano .scheda-azione e .pulsante-carica, il pulsante "Update my data"
   sotto la testa della scheda. Non c'e' piu': la scheda e' in sola lettura per
   chiunque, e al modale della modifica si arriva dal "Sign in" nella fascia. */

/* ---- aree toccabili -------------------------------------------------------
   Tre comandi che si premono col pollice stavano fra i 21 e i 28 px, perche'
   'btn-sm btn-link p-0' toglie il padding e lascia l'altezza della riga di
   testo. Qui si allarga la SCATOLA senza spostare il testo: min-height piu'
   flex, cosi' la pagina resta com'era e il bersaglio cresce.
   Nel piede della card si sta a 2.5rem invece di 2.75: quella riga si ripete
   trecento volte, e ogni mezzo rem in piu' e' mezzo rem di scorrimento per
   chi cerca una persona in fondo all'elenco. */
.legge-tutto,
.lista-contributi .btn-link {
  min-height: 2.75rem;
  display: inline-flex;
  align-items: center;
}

/* Nel piede della scheda non c'e' piu' niente da premere: il conteggio dei
   contributi e' testo, e la regola che gli allargava il bersaglio se ne e'
   andata con lui. Se un giorno tornera' a portare alla sessione (vedi "Da fare"
   in CLAUDE.md), tornera' anche un'area toccabile di almeno 2.5rem. */

/* La crocetta che toglie un interesse: ~20x21 px, e le pastiglie sono
   attaccate, quindi non vale nemmeno l'eccezione sulla spaziatura di WCAG
   2.5.8. E' l'unico comando dell'app che serve a CANCELLARE qualcosa. */
.selectize-control.multi .item {
  padding-top: 0.3rem;
  padding-bottom: 0.3rem;
  margin-right: 0.35rem;
}

.selectize-control.multi .item .remove {
  padding: 0 0.55rem;
  border-left-color: rgba(255, 255, 255, .35);
}

/* ---- torna in cima ------------------------------------------------------- */

/* Tondo, fisso in basso a destra, 44x44: la misura che si vuole sotto un dito, e
   qui c'e' lo spazio per averla - al contrario del pulsante nella fascia, che
   deve starci in 46 px di altezza. Il fianco e' 0.75rem come quello della pagina
   e delle linguette, cosi' e' incolonnato con tutto il resto e non galleggia.

   NASCE INVISIBILE e lo scopre www/torna-su.js aggiungendo .visibile quando la
   testata esce dallo schermo. Lo stato di partenza sta qui e non in un attributo
   hidden sul markup, per due ragioni: una dissolvenza vuole una proprieta'
   animabile, e display: none non lo e'; e cosi' non c'e' un istante in cui il
   pulsante si vede prima che il JS abbia girato. */
.torna-su {
  position: fixed;
  right: 0.75rem;
  /* Sul telefono la barra delle sezioni sta in fondo, e questo pulsante le
     starebbe addosso: sale della sua altezza. Sopra i 576 px la barra e' in
     cima e questo torna giu' (vedi la media query qui sotto). */
  bottom: calc(var(--riga-sezioni) + 0.75rem + env(safe-area-inset-bottom));
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid var(--bordo);
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.94);
  color: var(--blu-testo);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
  display: grid;
  place-items: center;
  cursor: pointer;
  /* Sopra il contenuto, sotto la striscia sticky delle linguette (1020) e sotto
     i modali di Bootstrap, che partono da 1050. */
  z-index: 1010;

  opacity: 0;
  /* visibility E NON SOLO opacity: un pulsante trasparente resterebbe premibile
     e resterebbe nel giro del tasto di tabulazione, cioe' ci sarebbe senza
     vedersi. E visibility si puo' mettere in transizione, al contrario di
     display: cambia di scatto, ma nel momento giusto - subito, entrando; alla
     fine della dissolvenza, uscendo - quindi la sfumatura si vede tutta. */
  visibility: hidden;
  transition: opacity 0.25s ease, visibility 0.25s ease;
}

@media (min-width: 36rem) {
  .torna-su { bottom: 0.75rem; }
}

.torna-su.visibile {
  opacity: 1;
  visibility: visible;
}

/* Col modale aperto il pulsante non c'e': starebbe sotto il velo, e un pulsante
   mezzo coperto che non risponde al dito e' peggio di un pulsante che non c'e'.
   Sfuma anche qui, cosi' se ne va insieme alla pagina che il velo copre. */
body.modal-open .torna-su {
  opacity: 0;
  visibility: hidden;
}

/* Chi ha chiesto meno animazioni non le vuole nemmeno qui: il pulsante compare e
   sparisce di colpo, che e' quello che gli serve. */
@media (prefers-reduced-motion: reduce) {
  .torna-su { transition: none; }
}

.torna-su:hover { background: #fff; border-color: var(--blu-testo); }

.torna-su:focus-visible {
  outline: 2px solid var(--blu-testo);
  outline-offset: 2px;
}

/* ---- varie --------------------------------------------------------------- */

.nota { font-size: 0.8rem; color: var(--grigio); }

/* "Signed in as ...", in cima al modale della modifica: e' li' che si dice chi
   sta scrivendo, perche' nella fascia il nome non ci sta (vedi .sottotitolo).
   Staccata dal titolo e dal riquadro della foto, cosi' si legge come una riga
   di stato e non come la prima istruzione. */
.identita { margin: 0 0 1rem; }

.vuoto { color: var(--grigio); padding: 2rem 0.5rem; text-align: center; }
.vuoto-piccolo { color: var(--grigio); font-size: 0.82rem; }

.scheda-info { border: 1px solid var(--bordo); box-shadow: none; }

/* Dentro un modale il bordo della scheda sarebbe un riquadro dentro un
   riquadro: la porta "General info" mostra questo stesso testo la' dentro, e le
   misure dei titoli e dei paragrafi devono restare quelle. */
.scheda-info.senza-cornice { border: 0; }
.scheda-info h2 { font-size: 1rem; font-weight: 600; }
.scheda-info p { font-size: 0.9rem; line-height: 1.6; }

.elenco-info {
  font-size: 0.9rem;
  line-height: 1.6;
  padding-left: 1.1rem;
  margin-bottom: 1rem;
}

.elenco-info a { color: var(--blu-testo); }

/* Precisazione che va a capo sotto la riga a cui appartiene. */
.nota-inline {
  display: block;
  font-size: 0.82rem;
  color: var(--grigio);
}

/* IL PIEDE NON C'E' SUL TELEFONO, e non e' una dimenticanza. Dice titolo, date e
   citta': le stesse tre cose che stanno nel banner e nella fascia blu due dita
   piu' in su, quindi la' sono la terza copia — e in fondo a uno schermo alto 780
   px sono anche lo spazio che serviva alla barra delle sezioni. Sul desktop
   invece resta, ed e' un altro mestiere: fa da chiusura in fondo alla pagina,
   dove una pagina che finisce di colpo sembra troncata.

   margin-top: auto si mangia tutto lo spazio che avanza nella colonna, quindi il
   piede finisce in fondo alla finestra quando il contenuto e' poco e subito
   sotto al contenuto quando invece la pagina e' lunga. Non e' fissato a schermo:
   una fascia sempre presente e' spazio tolto a quello che si sta leggendo. */
.pie {
  display: none;
  margin-top: auto;
  text-align: center;
  font-size: 0.75rem;
  color: var(--grigio);
  padding: 1rem 1rem max(1rem, env(safe-area-inset-bottom));
}

@media (min-width: 36rem) { .pie { display: block; } }

.pie p { margin: 0; }

/* Su iOS un input con font sotto i 16px fa fare lo zoom alla pagina. */
input, select, textarea { font-size: 16px !important; }

@media (min-width: 48rem) {
  /* Solo il fianco. Il padding verticale che c'era qui scavalcava il
     "padding: 0" della regola di base e faceva decidere l'altezza al contenuto:
     con la sola riga della data veniva 46 px per coincidenza - tanti quanti
     --riga-testata - ma appena dentro compariva il pulsante "Sign out" da 31 px
     la fascia saliva a 60 e non combaciava piu' con la riga delle linguette.
     L'altezza la deve dare --riga-testata, in tutte le misure di schermo. */
  .barra { padding: 0 1.5rem; }
  .barra h1 { font-size: 1.5rem; }
  .sottotitolo { font-size: 0.9rem; }
  .pagina { padding: 1.5rem 1rem 4rem; }
}
