/* =========================================================================
 *  TESSin_Footer v1.11.0 - IL FOOTER IN VETRINA, FOGLIO UNICO E AUTOREVOLE
 *  (giro xFOOTDEF)
 * =========================================================================
 *
 *  CHE COSA CAMBIA RISPETTO ALLA 1.10.1, E PERCHE'.
 *
 *  Fino alla 1.10.1 la presentazione del footer era SPARTITA fra due
 *  fogli: la PELLE (impaginato, tipografia, barra bassa) viveva nel tema
 *  - `_studio-footer.less`, 742 righe sotto `body.tessin-studio-theme` -
 *  e questo foglio portava soltanto i token della superficie e il markup
 *  nuovo del modulo (fascia legale, colonna recapiti, riga di consegna).
 *
 *  Quella spartizione era la RADICE di due difetti misurati sul vivo:
 *
 *   1. AUTORITA' DOPPIA. Il tema scriveva a specificita' (0,2,x), questo
 *      foglio a (0,1,x): qualunque regola scritta qui perdeva in silenzio
 *      contro la sua omonima del tema. Chi avesse voluto correggere
 *      l'impaginato dal modulo - che e' il proprietario del markup - non
 *      poteva, e non vedeva perche'.
 *   2. IMPAGINATO SFILACCIATO. Le colonne di voci erano una griglia
 *      `repeat(auto-fit, minmax(150px, 1fr))`: con tre colonne vere su un
 *      viewport largo si spartivano l'intera riga in tre tracce da ~433px,
 *      lasciando fra una voce e l'altra un vuoto piu' largo del testo. Il
 *      footer si leggeva come tre elenchi lontani, non come una tavola.
 *
 *  Da questa versione la presentazione del footer sta TUTTA qui, in UN
 *  SOLO blocco autorevole, e il tema conserva soltanto cio' che gli
 *  compete davvero: le regole sulle PRIMITIVE NATIVE di Magento
 *  (`.page-footer`, `.footer.content`), che un CSS di modulo non deve mai
 *  toccare. Nessuna regola di questo foglio ha piu' un'omonima altrove:
 *  l'ordine di caricamento non conta e non c'e' un solo `!important`.
 *
 *  RIFERIMENTO DI COMPOSIZIONE. Il disegno adotta la GRAMMATICA di una
 *  vetrina di moda di fascia alta rilevata dal vivo (la fonte e' citata
 *  nel referto di giro, mai qui e mai nel codice): fascia di servizi in
 *  testa a celle divise da capello, fascia editoriale con invito, tavola
 *  di colonne a quattro tracce che si impilano scendendo di larghezza,
 *  barra bassa a tre celle. Si adottano STRUTTURA, GERARCHIA e RITMI.
 *  Non si adotta - e non si copia - nulla che sia contenuto, testo,
 *  disegno, colore o marchio altrui: i contenuti sono i nostri, la
 *  palette e' la nostra.
 *
 *  PALETTE (legge di progetto): bianco, nero, grigi NEUTRI FREDDI e rosso
 *  come unico accento raro e funzionale. Nessun avorio, nessun beige,
 *  nessun grigio caldo.
 *
 *  TIPOGRAFIA: gerarchia fatta di PESO e SPAZIO, non di dimensione. Il
 *  maiuscoletto spaziato resta sulle sole etichette brevi di servizio (e
 *  i corpi sono tarati di conseguenza, 11px, non 14: la spaziatura fa
 *  leggere il testo piu' grande di quanto sia).
 *
 *  MISURE IN PIXEL, non in rem: il tema porta html{font-size:62.5%}
 *  (1rem = 10px) ma questo modulo deve reggere in QUALSIASI tema. In
 *  pixel il disegno e' lo stesso ovunque.
 *
 *  SCAGLIONI (mobile-first, media query DOPO le base):
 *    base    ->  telefono: colonne a fisarmonica, tutto incolonnato
 *    >= 640  ->  tavoletta: colonne aperte a due tracce
 *    >= 1033 ->  scrivania: colonne aperte a quattro tracce
 *  Il 1033 non e' un numero d'autore: e' la soglia MISURATA sul
 *  riferimento (referto di giro), e coincide di fatto con la soglia
 *  scrivania gia' in uso nel negozio.
 *
 *  CSP: nessuno stile in linea, nessun JS. Nessuna richiesta a terzi:
 *  ogni glifo e' un SVG in linea nel template.
 *
 *  WCAG 2.5.8: ogni comando ha bersaglio >= 24px (44px sui comandi a
 *  tocco pieno) e anello di focus visibile su entrambe le superfici.
 *
 *  TRAPPOLA GEMELLA (memoria css-hidden-vs-author-display): accanto a
 *  OGNI `display` d'autore su un nodo che il JS spegne con l'attributo
 *  `hidden` c'e' la regola gemella `[hidden] { display: none; }`. Senza,
 *  la regola user-agent perde contro il display d'autore e `hidden` non
 *  spegne piu' nulla.
 * ========================================================================= */

/* -------------------------------------------------------------------------
 *  TOKEN propri del footer. Ricadono su quelli del negozio (li scrive
 *  TESSin\Studio\DesignConfig su :root), e in loro assenza su neutri
 *  d'autore: il modulo si vede anche in un tema che non porta la famiglia
 *  delle variabili di footer.
 * ------------------------------------------------------------------------- */

.tsn-fo {
    --tsn-fo-bg: var(--tsn-studio-color-footer-bg, #151515);
    --tsn-fo-text: var(--tsn-studio-color-footer-text, #ffffff);
    --tsn-fo-muted: var(--tsn-studio-footer-muted, rgba(255, 255, 255, .74));
    --tsn-fo-link: var(--tsn-studio-footer-link, rgba(255, 255, 255, .78));
    --tsn-fo-line: var(--tsn-studio-footer-border, rgba(255, 255, 255, .18));
    --tsn-fo-btn-border: var(--tsn-studio-footer-button-border, rgba(255, 255, 255, .72));

    /* L'accento: rosso di marca, e solo quello. Segue lo schema scelto dal
       cliente se ce n'e' uno, esattamente come il resto del sito. */
    --tsn-fo-accent: var(--tsn-scheme-accent, var(--tsn-studio-color-red, #e41316));

    /* Ritmo verticale delle fasce: una sola scala, dichiarata una volta. */
    --tsn-fo-band: 28px;
    --tsn-fo-gutter: 20px;

    /* ---------------------------------------------------------------------
       xFOOT2 - LA SCALA TIPOGRAFICA, e il modo in cui il backend la governa.

       FINO ALLA 1.24.2 QUI NON C'ERA NULLA: le dimensioni del testo erano 24
       numeri in pixel sparsi per il foglio (misura xFOOT2: 10px x1, 11px x5,
       12px x4, 13px x2, 14px x6, 16px x1, 17px x2, 20px x1, 22px x1, 26px x1).
       Di configurabile, zero - ed e' la ragione per cui Riccardo il 15-09 ha
       detto <<non posso fare nulla dal backend>>: la pagina di configurazione
       del footer aveva 54 campi, tutti sul contenuto e nessuno sull'aspetto.

       QUEI 24 NUMERI NON ERANO 24 DECISIONI. Il valore piu' frequente, 14px
       (sei occorrenze), e' il PASSO del footer; ogni altro valore e' uno
       scostamento FISSO da quel passo: -4, -3, -2, -1, 0, +2, +3, +6, +8,
       +12. Scritto cosi', il foglio ha un solo numero d'autore - il passo - e
       tutto il resto discende. Il backend non espone 24 campi: ne espone tre,
       perche' una scala ha due gradi di liberta' (dove sta, quanto si apre) e
       una politica (chi ne resta fuori).

       DUE FAMIGLIE, NON UNA. Gli scostamenti SOTTO il passo (il maiuscoletto
       di servizio, le note legali, i mezzi di pagamento) restano agganciati al
       testo: sono la stessa voce detta piu' piano. Gli scostamenti SOPRA il
       passo (i titoli) passano per il fattore di risalto, perche' <<meno
       urlato>> e <<piu' piccolo>> sono due richieste diverse e nessuna delle
       due si ottiene con l'altra.

       MISURE IN PIXEL, NON IN REM: e' la regola gia' dichiarata in testa a
       questo foglio (il tema porta html{font-size:62.5%} ma il modulo deve
       reggere in QUALSIASI tema) e questo blocco NON la rompe. Lo scostamento
       e' una lunghezza in pixel sommata a una lunghezza in pixel: il risultato
       resta in pixel, e in un tema senza il 62.5% il disegno e' lo stesso.

       ATTENZIONE, TRAPPOLA: `--tsn-fo-fs-shift` porta l'unita' anche a zero
       (`0px`, mai `0`). In `calc()` un `0` nudo sommato a una lunghezza rende
       l'espressione invalida, la proprieta' sparisce e il testo torna alla
       misura del tema: un guasto silenzioso che nessun check statico vede.

       COME ARRIVA IL VALORE DAL BACKEND: tre attributi dato sul nodo radice,
       scritti dal template (`data-tsn-fo-type`, `data-tsn-fo-head`,
       `data-tsn-fo-pin`), tradotti qui sotto in passo e fattore. Nessuno stile
       in linea: la CSP resta intatta e la pagina resta cacheabile.

       WCAG 2.5.8 - MISURATO, non dedotto: i quattro comandi tappabili del
       footer (`col__link` 37px, `contact__link`, `trust__link`,
       `legal__link` 24px) portano gia' un `min-height` ESPLICITO. Il bersaglio
       e' ancorato al box, non al testo: nessuna posizione di questa manopola
       puo' portarlo sotto i 24px.
       --------------------------------------------------------------------- */

    /* Il passo FIRMATO del disegno. E' il solo numero d'autore della scala. */
    --tsn-fo-fs-anchor: 13px;

    /* Governati dal backend: riscritti piu' sotto per attributo dato. */
    --tsn-fo-fs-shift: 0px;
    --tsn-fo-fs-spread: 1;

    /* Il passo CORRENTE: quello firmato piu' lo scostamento voluto. */
    --tsn-fo-fs-base: calc(var(--tsn-fo-fs-anchor) + var(--tsn-fo-fs-shift));

    /* Famiglia del TESTO: segue il passo, non il risalto dei titoli. */
    --tsn-fo-fs-nano: calc(var(--tsn-fo-fs-base) - 4px);
    --tsn-fo-fs-micro: calc(var(--tsn-fo-fs-base) - 3px);
    --tsn-fo-fs-small: calc(var(--tsn-fo-fs-base) - 2px);
    --tsn-fo-fs-sub: calc(var(--tsn-fo-fs-base) - 1px);
    --tsn-fo-fs-body: var(--tsn-fo-fs-base);

    /* La bandiera del paese di consegna NON e' un titolo: sta accanto al nome
       del paese e deve restare in proporzione a quello, quindi vive qui. */
    --tsn-fo-fs-glyph: calc(var(--tsn-fo-fs-base) + 3px);

    /* Famiglia dei TITOLI: il fattore di risalto moltiplica il solo tratto
       SOPRA il passo, cosi' a `spread: 1` i valori sono quelli firmati. */
    --tsn-fo-fs-lead: calc(var(--tsn-fo-fs-base) + 2px * var(--tsn-fo-fs-spread));
    --tsn-fo-fs-head: calc(var(--tsn-fo-fs-base) + 3px * var(--tsn-fo-fs-spread));
    --tsn-fo-fs-xl: calc(var(--tsn-fo-fs-base) + 6px * var(--tsn-fo-fs-spread));
    --tsn-fo-fs-2xl: calc(var(--tsn-fo-fs-base) + 8px * var(--tsn-fo-fs-spread));
    --tsn-fo-fs-3xl: calc(var(--tsn-fo-fs-base) + 12px * var(--tsn-fo-fs-spread));

    /* LE DUE ECCEZIONI - <<Seguici>> e la riga di copyright (Riccardo, 13-09:
       <<tranne Seguici e Copyright>>). Nascono dal passo FIRMATO e non da
       quello corrente: lo scostamento le scavalca PER COSTRUZIONE, non perche'
       qualcuno tenga aggiornata una lista di selettori da escludere. A
       `shift: 0px` vale 11px, esattamente la misura di prima. */
    --tsn-fo-fs-pinned: calc(var(--tsn-fo-fs-anchor) - 3px);

    /* xFOOTWHITE (31-08, direttiva Riccardo: <<il footer confermo tutto
       bianco>>) - LA CORNICE NON C'E' PIU'.

       La 1.14.0 aveva staccato il footer dai bordi con una fascia di 10px del
       grigio freddo #f1f2f4. Decisione ribaltata: il footer torna a filo di
       finestra e la superficie e' bianca fino al bordo.

       REGOLE RIMOSSE, NON NEUTRALIZZATE: i due nomi della cornice (spessore
       e colore) e le tre dichiarazioni border-* se ne vanno DAVVERO.
       Non restano a 0 <<per comodita' se un giorno si ripensa>>: una regola
       morta che qualcuno riattiva per sbaglio e' peggio di nessuna regola, e
       questa e' la stessa dottrina con cui la 1.14.0 aveva potato la vecchia
       fascia a due tracce. Chi la rivolesse la riscrive: sono tre righe.

       Il `box-sizing` RESTA. Non serviva alla cornice: e' l'igiene del nodo,
       e toglierlo cambierebbe come si compone la larghezza del footer per una
       ragione che non c'entra nulla con questo giro.

       CONTRASTI: nessuna quota cambia. Il fondo era gia' bianco dalla 1.14.0
       (il grigio era la CORNICE, non il fondo), quindi il caso peggiore resta
       `muted` a 6,29:1 - misurato, non ricalcolato a occhio. */
    background: var(--tsn-fo-bg);
    color: var(--tsn-fo-text);
    box-sizing: border-box;
}

/* -------------------------------------------------------------------------
 *  xFOOT2 - LE TRE MANOPOLE DEL BACKEND, e nient'altro.
 *
 *  Undici righe in tutto, ed e' tutto quello che serve per rendere
 *  governabile una tipografia che prima era 24 numeri fissi. Il valore
 *  arriva in un attributo dato sul NODO RADICE, lo stesso elemento che
 *  dichiara i token: (0,2,0) contro (0,1,0), quindi vince senza `!important`
 *  e senza contro-selettori.
 *
 *  Le tre famiglie di valori sono quelle di Source\TextScale,
 *  Source\HeadingScale e del campo `pin_exceptions`: se un giorno si
 *  aggiunge una voce la' dentro senza aggiungerla qui, quel valore semplicemente
 *  non muove nulla e il footer resta al disegno firmato. E' il ripiego
 *  giusto: <<non so>> vale <<come prima>>, mai una misura inventata.
 * ------------------------------------------------------------------------- */

.tsn-fo[data-tsn-fo-type='compact']     { --tsn-fo-fs-shift: -2px; }
.tsn-fo[data-tsn-fo-type='reduced']     { --tsn-fo-fs-shift: -1px; }
.tsn-fo[data-tsn-fo-type='standard']    { --tsn-fo-fs-shift: 0px; }
.tsn-fo[data-tsn-fo-type='comfortable'] { --tsn-fo-fs-shift: 1px; }
.tsn-fo[data-tsn-fo-type='large']       { --tsn-fo-fs-shift: 2px; }

.tsn-fo[data-tsn-fo-head='flat']     { --tsn-fo-fs-spread: .5; }
.tsn-fo[data-tsn-fo-head='quiet']    { --tsn-fo-fs-spread: .75; }
.tsn-fo[data-tsn-fo-head='standard'] { --tsn-fo-fs-spread: 1; }
.tsn-fo[data-tsn-fo-head='strong']   { --tsn-fo-fs-spread: 1.25; }

/* Eccezioni SPENTE: <<Seguici>> e la riga di copyright rientrano nella scala
   e seguono lo scostamento come tutto il resto. Non e' il default - il default
   e' la richiesta di Riccardo, cioe' pinned - ma e' la posizione che rende la
   politica VISIBILE dal backend invece che cablata qui dentro. */
.tsn-fo[data-tsn-fo-pin='0'] { --tsn-fo-fs-pinned: var(--tsn-fo-fs-micro); }

/* -------------------------------------------------------------------------
 *  SUPERFICIE CHIARA - la direzione firmata per la vetrina.
 *
 *  Il fondo e' il grigio freddo chiarissimo #f1f2f4 (lo stesso delle
 *  superfici transazionali del negozio: una sola famiglia di neutri in
 *  tutto il sito), non il bianco puro, perche' il corpo pagina e' bianco
 *  e il footer deve leggersi come un'ultima riga distinta, non come la
 *  fine del nulla. Il capello in cima chiude il discorso.
 *
 *  CONTRASTI RIMISURATI sul banco (30-08, composizione alfa reale sul
 *  fondo, non stima):
 *    testo #151515                  -> 16,30:1  (AAA)
 *    link  rgba(21,21,21,.80)       ->  9,10:1  (AAA)
 *    muted rgba(21,21,21,.68)       ->  5,99:1  (AA anche a 11px)
 *    comando pieno, fondo su ink    -> 16,30:1  (AAA)
 *  E sulla superficie SCURA (#151515): testo 18,26:1 - link 11,37:1 -
 *  muted 10,25:1. Tutte le quote stanno sopra la soglia AA per testo
 *  normale (4,5:1), quindi valgono anche ai corpi piu' piccoli del
 *  foglio (11px). Le due quote "bordo" non portano testo: sono capelli, e
 *  il loro compito e' esserci senza farsi notare.
 * ------------------------------------------------------------------------- */

.tsn-fo--light {
    /* Sorgente UNICA dei valori: da qui in giu' si referenziano, non si
       riscrivono. Questi due nomi non ricadono su nulla, quindi la catena
       non puo' richiudersi su se stessa.

       xFOOTNL: il fondo passa da #f1f2f4 a BIANCO.
       xFOOTWHITE (31-08): e il grigio freddo esce di scena del tutto. Per un
       giro era diventato la cornice; ora la cornice non c'e' piu' e il footer
       e' bianco fino al bordo della finestra. Non si distingue piu' dal corpo
       pagina per COLORE - lo fa per contenuto e per il capello di chiusura in
       cima. E' la direttiva di Riccardo, ed e' una scelta, non un residuo.

       CONTRASTI: il fondo si SCHIARISCE, quindi ogni testo scuro guadagna
       contrasto e nessuna quota puo' peggiorare. Il caso peggiore restava
       `muted` rgba(21,21,21,.68), dato a 5,99:1 su #f1f2f4 dal banco del
       30-08; ricalcolato su #ffffff da' 6,29:1 (composizione alfa reale,
       poi WCAG 2.x). Il metodo e' lo stesso del banco: rifatto sul vecchio
       fondo restituisce 5,95:1, cioe' la misura originale a meno
       dell'arrotondamento - il calcolo e' tarato, non un'affermazione.
       Nessuna soglia AA viene avvicinata. */
    --tsn-fo-ground: #ffffff;
    --tsn-fo-ink: #151515;

    --tsn-fo-bg: var(--tsn-fo-ground);
    --tsn-fo-text: var(--tsn-fo-ink);
    --tsn-fo-muted: rgba(21, 21, 21, .68);
    --tsn-fo-link: rgba(21, 21, 21, .80);
    --tsn-fo-line: rgba(21, 21, 21, .14);
    --tsn-fo-btn-border: rgba(21, 21, 21, .38);

    /* Le SEI variabili che il resto del negozio legge per il footer.
       Ridefinite qui, sul nodo del footer: sotto questo nodo valgono
       queste, sopra restano quelle del negozio. */
    --tsn-studio-color-footer-bg: var(--tsn-fo-ground);
    --tsn-studio-color-footer-text: var(--tsn-fo-ink);
    --tsn-studio-footer-muted: rgba(21, 21, 21, .68);
    --tsn-studio-footer-link: rgba(21, 21, 21, .80);
    --tsn-studio-footer-button-border: rgba(21, 21, 21, .38);
    --tsn-studio-footer-border: rgba(21, 21, 21, .14);

    border-top: 1px solid var(--tsn-fo-line);
}

/* -------------------------------------------------------------------------
 *  SUPERFICIE SCURA - la stessa cosa, al contrario. Esiste perche' una
 *  scelta reversibile e' una scelta: chi volesse il footer com'era prima
 *  del giro lo riporta indietro da Stores > Config, senza un deploy.
 * ------------------------------------------------------------------------- */

.tsn-fo--dark {
    --tsn-fo-ground: #151515;
    --tsn-fo-ink: #ffffff;

    --tsn-fo-bg: var(--tsn-fo-ground);
    --tsn-fo-text: var(--tsn-fo-ink);
    --tsn-fo-muted: rgba(255, 255, 255, .74);
    --tsn-fo-link: rgba(255, 255, 255, .78);
    --tsn-fo-line: rgba(255, 255, 255, .18);
    --tsn-fo-btn-border: rgba(255, 255, 255, .72);

    --tsn-studio-color-footer-bg: var(--tsn-fo-ground);
    --tsn-studio-color-footer-text: var(--tsn-fo-ink);
    --tsn-studio-footer-muted: rgba(255, 255, 255, .74);
    --tsn-studio-footer-link: rgba(255, 255, 255, .78);
    --tsn-studio-footer-button-border: rgba(255, 255, 255, .72);
    --tsn-studio-footer-border: rgba(255, 255, 255, .18);
}

/* =========================================================================
 *  IMPAGINATO GENERALE
 *
 *  Stessa gabbia del corpo pagina (1440 + respiro): il footer non e'
 *  un'isola, e' l'ultima riga della stessa pagina.
 * ========================================================================= */

.tsn-fo__wrap {
    box-sizing: border-box;
    margin: 0 auto;
    max-width: 1440px;
    padding: 40px var(--tsn-fo-gutter) 24px;
    width: 100%;
}

.tsn-fo a {
    color: var(--tsn-fo-link);
    text-decoration: none;
    transition: color .18s ease;
}

.tsn-fo a:hover {
    color: var(--tsn-fo-text);
}

/* Anello di focus a due strati: il primo si stacca dal testo, il secondo
   garantisce il contrasto anche quando il fondo e' scuro. */
.tsn-fo a:focus-visible,
.tsn-fo button:focus-visible {
    border-radius: 2px;
    outline: 2px solid var(--tsn-fo-text);
    outline-offset: 3px;
}

.tsn-fo ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

.tsn-fo-glyph {
    display: block;
    flex: none;
}

/* =========================================================================
 *  LA FASCIA A CELLE - componente UNICO (xFOOTROW, 1.15.0)
 *
 *  Una fascia orizzontale a tutta larghezza con N celle affiancate: ogni
 *  cella e' titolo in evidenza, sottotitolo quieto sotto, chevron a destra
 *  che dichiara "si va da qualche parte". Su telefono le celle si impilano
 *  e il capello passa fra una e l'altra; da tavoletta in su diventano
 *  tracce affiancate, divise da un capello VERTICALE. Sotto l'intera
 *  fascia corre il capello orizzontale che la chiude.
 *
 *  Il bersaglio e' l'INTERA cella (56px di riga minima), non il solo
 *  titolo e non il solo chevron: e' un comando a tocco pieno.
 *
 *  DUE CONSUMATORI, UN SOLO COMPONENTE:
 *   - la fascia SERVIZI (tre voci di configurazione, in testa al footer);
 *   - le RIGHE DI SEZIONI, che l'operatore compone in Footer Studio e
 *     colloca sopra o sotto la fascia delle colonne.
 *  Fino alla 1.14.2 questo blocco si chiamava `.tsn-fo-svc` ed era della
 *  sola fascia servizi. Il nome e' cambiato perche' il componente non e'
 *  piu' di uno solo: la pelle vecchia si RINOMINA, non si duplica sotto
 *  un secondo nome che il giorno dopo diverge. Nessun selettore
 *  `.tsn-fo-svc` sopravvive - qui, nel template, nel tema o altrove.
 * ========================================================================= */

.tsn-fo-strip {
    border-bottom: 1px solid var(--tsn-fo-line);
    display: grid;
    gap: 0;
    grid-template-columns: 1fr;
    padding-bottom: 4px;
}

.tsn-fo-strip__item {
    align-items: center;
    box-sizing: border-box;
    color: var(--tsn-fo-text);
    display: flex;
    gap: 16px;
    justify-content: space-between;
    min-height: 56px;
    padding: 12px 0;
    width: 100%;
}

.tsn-fo-strip__item + .tsn-fo-strip__item {
    border-top: 1px solid var(--tsn-fo-line);
}

.tsn-fo-strip__item:hover {
    color: var(--tsn-fo-text);
}

.tsn-fo-strip__body {
    display: flex;
    flex-direction: column;
    gap: 3px;
    min-width: 0;
}

.tsn-fo-strip__title {
    color: var(--tsn-fo-text);
    font-size: var(--tsn-fo-fs-body);
    font-weight: 500;
    letter-spacing: .01em;
    line-height: 1.25;
}

.tsn-fo-strip__sub {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-sub);
    letter-spacing: .01em;
    line-height: 1.35;
}

.tsn-fo-strip__chev {
    color: var(--tsn-fo-muted);
    display: flex;
    flex: none;
    transition: transform .18s ease;
}

.tsn-fo-strip__item:hover .tsn-fo-strip__chev {
    transform: translateX(3px);
}

/* La cella che NON e' un link non finge di esserlo: niente chevron, e il
   cursore resta quello del testo. */
.tsn-fo-strip__item--plain {
    cursor: default;
}

/* =========================================================================
 *  FASCIA 2 - NEWSLETTER
 *
 *  L'invito editoriale. Su telefono e' una colonna; da scrivania il testo
 *  sta a sinistra e l'invito a destra, cosi' la fascia OCCUPA la riga
 *  invece di lasciare un vuoto largo mezza pagina (era il difetto misurato
 *  sulla 1.10.1: titolo e pulsantino in alto a sinistra, e nient'altro).
 *
 *  Il pulsante NON e' un campo e-mail: l'indirizzo si chiede nella
 *  superficie dedicata, dove vivono il gettone e le leve anti-bot (scelta
 *  anti-bot firmata in F3, che questo giro NON regredisce). Percio' qui
 *  c'e' un comando pieno, non un campo finto.
 * ========================================================================= */

.tsn-fo-news {
    border-bottom: 1px solid var(--tsn-fo-line);
    display: flex;
    flex-direction: column;
    gap: 14px;
    padding: var(--tsn-fo-band) 0;
}

.tsn-fo-news__title {
    color: var(--tsn-fo-text);
    font-size: var(--tsn-fo-fs-2xl);
    font-weight: 400;
    letter-spacing: .01em;
    line-height: 1.3;
    margin: 0;
}

/* xFOOT-CARATTERI (17-09, indicazioni di Riccardo date in px e mai registrate
   prima di oggi): il titolo della newsletter vale 2.5rem, non 3.1rem.

   PERCHE' SERVE UNA REGOLA IN PIU' E NON BASTA IL TOKEN QUI SOPRA: il titolo
   e' un <h2>, e il TEMA dichiara `body.tessin-studio-theme h2 {font-size:
   @studio-fs-2xl}` = 3.1rem, specificita' (0,1,1). La regola del modulo qui
   sopra e' (0,1,0) e PERDE: misurato a schermo su /it/ il titolo risultava
   31px, cioe' il valore del tema, non quello del footer. E' la stessa classe
   di difetto della CTA che perde l'inchiostro: un selettore di ELEMENTO nel
   tema batte una CLASSE del modulo.
   `.tsn-fo` + classe = (0,2,0) batte (0,1,1) senza `!important`. */
.tsn-fo .tsn-fo-news__title {
    font-size: 2.5rem;
}

.tsn-fo-news__copy {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-body);
    letter-spacing: .01em;
    line-height: 1.6;
    margin: 0;
    max-width: 56ch;
}

/* Comando PIENO, ALLINEATO AL PULSANTE STANDARD (x189/x189-bis: terna
   riposo/hover/testo, mai un colore derivato) - PRIMA c'era una skin
   propria (fondo/testo invertiti su --tsn-fo-text/--tsn-fo-bg, l'hover che
   svuotava il fondo capovolgendo anche il testo): non era il nostro
   pulsante, era un secondo sistema. Ora consuma il PONTE :root del tema
   (--tsn-btn-fill-bg/-hover/-fg, _studio-btn-contract.less: Studio Deep
   Grey #33383c -> Studio Black #25292b, testo bianco MAI cambiato), lo
   stesso disaccoppiato-dallo-schema-cliente della superficie guest del
   login drawer (--tsn-fo-news e' anch'essa guest/brand, non area cliente).
   Fallback = copia VERBATIM dei valori ratificati: il modulo deve reggere
   anche in un tema senza quel ponte.
   A BLOCCO PIENO (regola studio-actions-full-width, x188): su telefono e
   tavoletta l'intera larghezza della colonna, a filo col titolo/testo che
   la precede (nessun padding orizzontale nella fascia); da scrivania in su
   l'intera larghezza MENO 10px per lato (direttiva di Riccardo 31-08) - la
   colonna li' e' stretta e affiancata alle altre, l'inset la stacca
   leggermente dal bordo della traccia. Bersaglio 50px dal 01-09 (cassa del
   canone: v. xBTN1 piu' sotto; era 48px). */
.tsn-fo-news__cta {
    align-items: center;
    align-self: stretch;
    display: inline-flex;
    justify-content: center;
    text-align: center;
    text-decoration: none;
    width: 100%;
    background: var(--tsn-btn-fill-bg, #33383c);
    border: 1px solid var(--tsn-btn-fill-bg, #33383c);
    /* xBTN1 (01-09) - IL RAGGIO VIENE DAL CANONE, NON DA QUI.
       Era `2px`: un secondo raggio di sistema, scritto a mano, che nessun gate
       vedeva (il gate del raggio guarda solo i .less del TEMA - questo e' un
       .css di MODULO). Ora legge il ponte del contratto; il ripiego e' il
       valore ratificato, verbatim, perche' il modulo deve reggere anche in un
       tema che quel ponte non lo porta. */
    border-radius: var(--tsn-btn-radius, 6px);
    box-sizing: border-box;
    color: var(--tsn-btn-fill-fg, #ffffff);
    cursor: pointer;
    font-family: inherit;
    /* xFOOTCASE (31-08, direttiva Riccardo) - IL TESTO SCRITTO IN ADMIN
       ARRIVA IN VETRINA COM'E' STATO SCRITTO.

       Qui c'era `text-transform: uppercase`, e rendeva impossibile una cosa
       che l'operatore crede di poter fare: scrivere <<Iscriviti>> e vederlo
       <<Iscriviti>>. Il campo `button_label` e' testo d'autore, non
       un'etichetta di sistema: il CSS non deve riscriverlo. (Le maiuscole
       delle ALTRE etichette del footer - recapiti, spedizioni, pagamenti -
       restano: quelle sono diciture nostre, non testo scritto in admin.)

       ⚠️ LA RITARATURA che accompagnava questa direttiva (11 -> 13px, .12em ->
       .02em, cassa 48px) NON VALE PIU' ed e' stata rimossa da qui il 01-09:
       era una compensazione calcolata in isolamento, e il giro xBTN1 l'ha
       sostituita col RIFERIMENTO vero (v. blocco successivo). La trappola di
       progetto <<cambio di case = ritarare il corpo>> resta valida: quando non
       esiste un riferimento gia' tarato si ritara: ma qui il riferimento
       esiste, ed e' il pulsante del drawer carrello. Si adotta, non si
       ricalcola. */
    /* xBTN1 (01-09, segnalazione di Riccardo: <<il pulsante della newsletter e'
       sbagliato per radius e la sezione testo, devi prendere come riferimento
       il pulsante presente nel drawer carrello e metterlo a legge>>).

       LA <<SEZIONE TESTO>> ORA E' QUELLA DEL RIFERIMENTO. Il pulsante del
       drawer carrello rende (misurato su Chrome, 01-09): corpo 13,5px, peso
       600, tracking 0, sentence-case, interlinea 1.2, cassa 50px, padding
       0 24px. Qui c'erano 13px / 500 / .02em / 48px / 14px 28px: vicini
       quanto basta per sembrare uguali e diversi quanto basta perche' i due
       pulsanti, visti nella stessa sessione, non si leggessero come lo stesso
       oggetto. Non erano un adattamento: erano una taratura fatta in
       isolamento (xFOOTCASE) contro un riferimento che non era stato
       consultato.

       COSA RESTA DI xFOOTCASE, e resta INTATTO: nessun `text-transform`. Il
       testo scritto in admin arriva in vetrina com'e' stato scritto. Il
       canone dice `none` — le due direttive coincidono, non si contendono
       nulla. Il ripiego locale e' `none` scritto, non ereditato.

       BERSAGLIO DI TOCCO: la cassa sale 48 -> 50px. WCAG 2.5.8 chiede >= 24:
       si guadagna, non si perde.

       VALORI DAL PONTE `:root` del contratto (_studio-btn-contract.less): il
       modulo non compila il LESS del tema e non puo' leggere `@studio-btn-*`.

       ⚠️ I RIPIEGHI SONO IN PIXEL, e non e' una svista. Le variabili del ponte
       portano i rem del tema (`5rem`, `1.35rem`, `2.4rem`), che valgono 50 /
       13,5 / 24px SOLO perche' il tema Studio dichiara `html{font-size:62.5%}`.
       Il ripiego entra in gioco proprio quando quel tema NON c'e', dove `5rem`
       varrebbe 80px: copiarlo alla lettera romperebbe il caso che il ripiego
       esiste per coprire. In pixel il disegno e' lo stesso ovunque — e' la
       regola dichiarata in testa a questo foglio, e vale anche qui. Stessa
       misura, unita' della sede. */
    font-size: var(--tsn-btn-fs, 13.5px);
    font-weight: var(--tsn-btn-fw, 600);
    letter-spacing: var(--tsn-btn-ls, 0);
    line-height: var(--tsn-btn-lh, 1.2);
    text-transform: var(--tsn-btn-tt, none);
    min-height: var(--tsn-btn-h, 50px);
    padding: 0 var(--tsn-btn-pad, 24px);
    transition: background-color .18s ease, border-color .18s ease;
}

/* L'ANELLO DI FOCUS NON PUO' CAMBIARE LA FORMA DEL PULSANTE (xBTN1).

   La regola generale del footer (`.tsn-fo a:focus-visible, .tsn-fo
   button:focus-visible`) porta `border-radius: 2px` per far aderire il
   contorno ai link di testo. Vale (0,2,1) - `:focus-visible` conta come una
   CLASSE - e batteva la regola della CTA, che e' (0,1,0): il pulsante tornava
   a 2px NEL MOMENTO ESATTO in cui lo si stava usando da tastiera. Difetto
   reale e latente da prima di questo giro: col raggio gia' a 2px non si
   vedeva, e allineando il raggio al canone sarebbe diventato un lampeggio di
   forma sotto il Tab.

   ⚠️ MISURATO, NON DEDOTTO. La prima stesura di questa regola era
   `.tsn-fo-news__cta:focus-visible`, cioe' (0,2,0), scritta contando
   `:focus-visible` come uno pseudo-elemento: il banco Chrome del 01-09 ha
   restituito `2px`, e la regola perdeva. Con `.tsn-fo` davanti si arriva a
   (0,3,0) e il canone vince. La CTA vive sempre dentro `.tsn-fo` (e' il nodo
   radice del footer), quindi il discendente non restringe nulla.

   L'ASPETTO dell'anello resta quello del footer - outline nell'inchiostro
   della superficie, che regge sia sul footer chiaro sia su quello scuro,
   cosa che l'anello del contratto non garantisce su entrambe le varianti.
   Il canone vincola la GEOMETRIA del pulsante, non la pelle dell'anello. */
.tsn-fo .tsn-fo-news__cta:focus-visible {
    border-radius: var(--tsn-btn-radius, 6px);
}

/* Il testo NON cambia mai all'hover (x189-bis): solo il fondo scurisce
   verso Studio Black, stessa tinta scurita del 6%, HEX dichiarato. */
.tsn-fo-news__cta:hover,
.tsn-fo-news__cta:focus-visible {
    background: var(--tsn-btn-fill-hover, #25292b);
    border-color: var(--tsn-btn-fill-hover, #25292b);
    color: var(--tsn-btn-fill-fg, #ffffff);
}

/* =========================================================================
 *  FASCIA 3 - COLONNE
 *
 *  La tavola della navigazione secondaria. Contenitore neutro fuori (che
 *  ospita anche la colonna dei RECAPITI, che navigazione non e'), un solo
 *  <nav> dentro con le sole colonne di voci.
 *
 *  Base = TELEFONO, fisarmonica: l'intestazione e' un comando a tutta
 *  larghezza (44px di bersaglio) e il pannello si apre sotto. Il markup e'
 *  UNO SOLO per tutte le larghezze; senza JS i pannelli nascono aperti e
 *  la navigazione resta integra.
 * ========================================================================= */

.tsn-fo-cols {
    display: grid;
    gap: 0;
    grid-template-columns: 1fr;
    padding: 8px 0 var(--tsn-fo-band);
}

.tsn-fo-cols__nav {
    display: grid;
    gap: 0;
    grid-template-columns: 1fr;
}

/*
 * Senza la colonna dei RECAPITI (si spegne da configurazione) la
 * navigazione e' l'unica figlia della fascia: deve prendersi TUTTE le
 * tracce, non restare schiacciata nella prima. `:only-child` lo dice
 * senza che il server debba emettere una seconda classe.
 */
.tsn-fo-cols__nav:only-child {
    grid-column: 1 / -1;
}

.tsn-fo-col {
    border-bottom: 1px solid var(--tsn-fo-line);
    min-width: 0;
}

.tsn-fo-col__head {
    margin: 0;
}

/* Il titolo di colonna E' il comando su telefono: riga piena, 44px di
   bersaglio, chevron a destra. Nessuno sfondo, nessun bordo: e' una riga
   di elenco, non un pulsante. */
.tsn-fo-col__toggle {
    align-items: center;
    background: none;
    border: 0;
    box-sizing: border-box;
    color: var(--tsn-fo-text);
    cursor: pointer;
    display: flex;
    font-family: inherit;
    font-weight: 400;
    gap: 12px;
    justify-content: space-between;
    min-height: 44px;
    padding: 12px 0;
    text-align: left;
    width: 100%;
}

/*
 * DA SCRIVANIA IL PULSANTE E' `disabled`, E DEVE RESTARE LEGGIBILE.
 *
 * Il JS disattiva le intestazioni quando i pannelli sono aperti per
 * costruzione: e' una dichiarazione di VERITA' - su scrivania non c'e'
 * nulla da aprire, e un comando inerte ma raggiungibile col Tab sarebbe
 * rumore per chi naviga da tastiera. Ma `disabled` porta con se' la pelle
 * user-agent (e quella di quasi ogni tema): `opacity: .5` e peso grassetto
 * su OGNI button spento.
 *
 * Su questa superficie quell'aspetto e' una BUGIA VISIVA: il titolo di
 * colonna non e' un comando spento, e' un titolo. Al 50% di opacita' il
 * quasi-nero #151515 su fondo #f1f2f4 scende sotto la soglia AA e il
 * titolo si legge piu' debole delle voci che introduce - gerarchia
 * rovesciata, oltre che contrasto insufficiente. Qui si neutralizza:
 * opacita' piena, colore dell'inchiostro, cursore normale.
 *
 * MISURATO (banco 30-08, viewport 1500): senza questa regola il nodo
 * usciva con `opacity: 0.5` e `font-weight: 700` ereditati, e i tre
 * titoli di colonna erano visibilmente sbiaditi.
 */
.tsn-fo-col__toggle:disabled {
    color: var(--tsn-fo-text);
    cursor: default;
    opacity: 1;
}

.tsn-fo-col__title {
    font-size: var(--tsn-fo-fs-lead);
    font-weight: 500;
    letter-spacing: .01em;
    line-height: 1.3;
}

.tsn-fo-col__chev {
    color: var(--tsn-fo-muted);
    display: flex;
    flex: none;
    transition: transform .18s ease;
}

.tsn-fo-col__toggle[aria-expanded='true'] .tsn-fo-col__chev {
    transform: rotate(180deg);
}

.tsn-fo-col__panel {
    display: block;
    padding-bottom: 12px;
}

/* Regola GEMELLA obbligatoria: senza di questa il `hidden` che mette il JS
   perde contro il `display: block` d'autore qui sopra e il pannello non si
   chiude piu' (memoria css-hidden-vs-author-display). */
.tsn-fo-col__panel[hidden] {
    display: none;
}

.tsn-fo-col__links {
    display: flex;
    flex-direction: column;
}

.tsn-fo-col__item {
    margin: 0;
}

/* Righe da 37px: sei voci si scorrono col pollice, non si mirano.

   xFOOT-COLONNE (17-09, ordine di Riccardo verbatim: "font: 12px; e il
   padding: 0px 0" per le colonne Informazioni e Top Brands). Valore
   FISSO in pixel, non un token della scala tipografica governata da
   backend (--tsn-fo-fs-body = --tsn-fo-fs-anchor + --tsn-fo-fs-shift,
   quest'ultimo scritto da Stores > Config): la scala resta intatta per
   chi la condivide altrove (fascia servizi, testo newsletter, valore
   paese di spedizione), qui si scavalca SOLO per questo componente. */
.tsn-fo-col__link {
    box-sizing: border-box;
    color: var(--tsn-fo-link);
    display: block;
    font-size: 12px;
    letter-spacing: .01em;
    line-height: 1.5;
    min-height: 37px;
    padding: 0 0;
}

.tsn-fo-col__link:hover {
    color: var(--tsn-fo-text);
}

/* =========================================================================
 *  COLONNA DEI RECAPITI
 *
 *  Stessa scatola delle colonne di voci (intestazione-comando + pannello),
 *  cosi' su telefono entra nella fisarmonica insieme alle altre senza una
 *  riga di JS in piu'. Qui si veste il CONTENUTO del pannello.
 * ========================================================================= */

.tsn-fo-contact {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

/* L'indirizzo e' testo, non navigazione: corpo quieto e interlinea larga,
   perche' si legge a colpo d'occhio e non si clicca.

   xFOOT-COLONNE (17-09): stessa riga "TESSin.it Via XX Settembre, 25-27"
   che Riccardo ha visto scendere a 12px insieme alle colonne e ha
   accettato ("ma va bene") - qui la si dichiara alla pari, senza toccare
   --tsn-fo-fs-body (evita di portare lo stesso taglio anche su
   .tsn-fo-contact__link, email/telefono, che resta al bersaglio WCAG
   2.5.8 di 24px commentato piu' sotto: quella riga non era nell'ordine). */
.tsn-fo-contact__address {
    color: var(--tsn-fo-muted);
    font-size: 12px;
    letter-spacing: .01em;
    line-height: 1.65;
    margin: 0;
    max-width: 34ch;
}

.tsn-fo-contact__row {
    margin: 0;
}

/* Bersaglio >= 24px (WCAG 2.5.8): 21px di riga + 3+3 di respiro. */
.tsn-fo-contact__link {
    box-sizing: border-box;
    display: inline-block;
    font-size: var(--tsn-fo-fs-body);
    line-height: 1.5;
    min-height: 24px;
    padding: 3px 0;
}

.tsn-fo-contact__link:hover,
.tsn-fo-contact__link:focus-visible {
    text-decoration: underline;
    text-underline-offset: 4px;
}

/* Partita IVA e numero di iscrizione: sono FATTI, non comandi. Etichetta in
   maiuscoletto spaziato e valore accanto, sulla stessa riga - e' la forma in
   cui si leggono in fondo a ogni negozio serio. */
.tsn-fo-contact__row--fact {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-small);
    line-height: 1.55;
}

.tsn-fo-contact__key {
    letter-spacing: .12em;
    margin-right: 6px;
    text-transform: uppercase;
}

.tsn-fo-contact__value {
    letter-spacing: .02em;
    white-space: nowrap;
}

/* =========================================================================
 *  FASCIA FIDUCIA - il giudizio dei clienti, DISCRETO
 *
 *  Una riga sola, in coda alla colonna dei recapiti: punteggio, stelle,
 *  numero di recensioni, e un link alla scheda pubblica. Non e' un
 *  carosello, non e' un riquadro, non e' un widget di terzi che si carica
 *  a pagina fatta: e' testo RESO DAL SERVER, come tutto il resto di
 *  questo footer.
 *
 *  PERCHE' RESO DAL SERVER e non con lo script del fornitore:
 *   - FPC: e' contenuto di negozio, identico per ogni visitatore, e
 *     arriva gia' scritto nell'HTML cacheato. Nessuna chiamata dopo il
 *     primo paint, nessun salto di layout, nessun lampeggio;
 *   - CONSENSO: uno script di terzi in fondo a ogni pagina e' un tracker,
 *     e senza consenso non deve partire. Il punteggio scritto dal server
 *     non e' un tracker: non c'e' nulla da neutralizzare e nulla da
 *     chiedere;
 *   - CSP: nessun host da concedere, nessuna eccezione da mantenere.
 *
 *  Le stelle sono un SVG in linea disegnato da noi e sono `aria-hidden`:
 *  l'informazione la porta il testo del punteggio, mai il disegno.
 * ========================================================================= */

.tsn-fo-trust {
    align-items: center;
    display: flex;
    flex-wrap: wrap;
    gap: 4px 10px;
    margin: 2px 0 0;
}

.tsn-fo-trust__stars {
    align-items: center;
    display: inline-flex;
    flex: none;
    gap: 2px;
}

/* Il colore delle stelle e' l'INCHIOSTRO del footer, non un colore di
   marca altrui: la palette di casa non si piega a un logo di terzi. La
   stella vuota e' la stessa forma al 22% di opacita', cosi' il rapporto
   pieno/vuoto si legge anche senza colore. */
.tsn-fo-trust__star {
    color: var(--tsn-fo-text);
    display: block;
    flex: none;
}

.tsn-fo-trust__star--empty {
    opacity: .22;
}

.tsn-fo-trust__score {
    color: var(--tsn-fo-text);
    font-size: var(--tsn-fo-fs-sub);
    font-weight: 500;
    letter-spacing: .01em;
    line-height: 1.4;
}

.tsn-fo-trust__count {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-small);
    letter-spacing: .01em;
    line-height: 1.4;
}

/* Bersaglio >= 24px: 17px di riga + 4+4 di respiro. */
.tsn-fo-trust__link {
    box-sizing: border-box;
    display: inline-block;
    font-size: var(--tsn-fo-fs-small);
    letter-spacing: .01em;
    line-height: 1.4;
    min-height: 24px;
    padding: 4px 0;
}

.tsn-fo-trust__link:hover,
.tsn-fo-trust__link:focus-visible {
    text-decoration: underline;
    text-decoration-color: var(--tsn-fo-accent);
    text-decoration-thickness: 1px;
    text-underline-offset: 4px;
}

/* =========================================================================
 *  RIGA "PAESE DI CONSEGNA"
 *
 *  Base = telefono: etichetta sopra, valore sotto, a tutta larghezza. Da
 *  640px in su le due parti si affiancano.
 *
 *  La bandiera e' un GLIFO Unicode: nessuna immagine, nessuna richiesta,
 *  nessun host da concedere alla CSP. Dove il sistema non ce l'ha si
 *  leggono le due lettere del codice paese, che e' un degrado leggibile.
 * ========================================================================= */

.tsn-fo-ship {
    align-items: flex-start;
    border-top: 1px solid var(--tsn-fo-line);
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 0;
    padding: 16px 0;
}

.tsn-fo-ship__label {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-micro);
    letter-spacing: .14em;
    line-height: 1.3;
    text-transform: uppercase;
}

.tsn-fo-ship__value {
    align-items: center;
    display: inline-flex;
    font-size: var(--tsn-fo-fs-body);
    gap: 8px;
    letter-spacing: .02em;
    line-height: 1.4;
}

/*
 * xGIROE (1.27.0) - il valore e' un <button> (apre la finestra paese/lingua
 * di TESSin_Checkout). Pelle azzerata: resta la stessa riga di testo, piu'
 * il chevron. `disabled` (finestra assente o JS spento) = testo puro, senza
 * attenuazione: non e' un comando spento, e' un'informazione.
 */
button.tsn-fo-ship__value {
    -webkit-appearance: none;
    appearance: none;
    background: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    color: inherit;
    cursor: pointer;
    font-family: inherit;
    font-weight: inherit;
    margin: 0;
    min-height: 24px;
    padding: 0;
    text-align: left;
    text-transform: none;
}

button.tsn-fo-ship__value:hover,
button.tsn-fo-ship__value:active,
button.tsn-fo-ship__value:focus {
    background: none;
    border: 0;
    box-shadow: none;
    color: inherit;
}

button.tsn-fo-ship__value:focus-visible {
    outline: 2px solid currentColor;
    outline-offset: 2px;
}

button.tsn-fo-ship__value[disabled] {
    cursor: default;
    opacity: 1;
}

button.tsn-fo-ship__value[disabled] .tsn-fo-ship__chevron {
    display: none;
}

.tsn-fo-ship__chevron {
    font-size: 1.2em;
    line-height: 1;
}

.tsn-fo-ship__flag {
    font-size: var(--tsn-fo-fs-glyph);
    line-height: 1;
}

/*
 * xGIROE (1.27.0) - mentre footer.js aspetta la sezione `cart`, il VALORE
 * e' invisibile ma occupa il suo posto (visibility, non display): nessun
 * salto di layout e nessun paese sbagliato a schermo. La classe la mette
 * SOLO il JS e la toglie sempre (risposta, errore o tetto di 2,5 s): senza
 * JS la regola non scatta mai e resta il paese dichiarato.
 */
.tsn-fo-ship--resolving .tsn-fo-ship__value {
    visibility: hidden;
}

/* =========================================================================
 *  BARRA BASSA - social | marchio
 *
 *  xFOOTNOCOUNTRY (31-08, direttiva Riccardo) - la terza cella, il
 *  selettore Paese/Regione, e' stata RIMOSSA (torna nel menu principale,
 *  altro giro): via il markup, via i suoi consumatori (JS, ViewModel), e
 *  via l'intero blocco POPOVER PAESE/REGIONE che stava qui sotto.
 *
 *  Base = telefono: le celle rimaste (social facoltativa, marchio sempre)
 *  restano incolonnate e centrate - nessuna riga qui dipendeva dalla
 *  cella tolta.
 * ========================================================================= */

.tsn-fo-bar {
    align-items: center;
    border-top: 1px solid var(--tsn-fo-line);
    display: flex;
    flex-direction: column;
    gap: 20px;
    padding-top: 24px;
}

.tsn-fo-bar__cell {
    align-items: center;
    display: flex;
    gap: 14px;
    justify-content: center;
}

/* xFOOT2 - PRIMA DELLE DUE ECCEZIONI alla scala tipografica: <<Seguici>> resta
   alla misura firmata mentre il resto del footer si muove (Riccardo, 13-09).
   L'aggancio era gia' una classe propria, quindi qui non serviva inventarne
   una: cambia solo la sorgente della misura, da 11px cablati al token
   ancorato. */
.tsn-fo-follow {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-pinned);
    letter-spacing: .14em;
    line-height: 1.3;
    text-transform: uppercase;
}

.tsn-fo-social {
    align-items: center;
    display: flex;
    gap: 6px;
}

.tsn-fo-social__item {
    margin: 0;
}

/* Bersaglio 40px: e' un'icona senza testo, quindi il tocco deve essere
   generoso anche se il disegno e' piccolo. */
.tsn-fo-social__link {
    align-items: center;
    border-radius: 2px;
    color: var(--tsn-fo-link);
    display: flex;
    height: 40px;
    justify-content: center;
    width: 40px;
}

.tsn-fo-social__link:hover {
    color: var(--tsn-fo-text);
}

.tsn-fo-social__glyph {
    display: block;
}

.tsn-fo-logo {
    align-items: center;
    display: flex;
}

/* Il marchio in fondo e' una FIRMA, non un richiamo: resta piccolo e
   quieto. Su superficie scura si schiarisce, perche' il file e' inchiostro
   su trasparente e altrimenti sparirebbe. */
.tsn-fo-logo__img {
    display: block;
    height: auto;
    width: 56px;
}

.tsn-fo--dark .tsn-fo-logo__img {
    filter: invert(1) grayscale(1);
}

/* =========================================================================
 *  FASCIA LEGALE / PAGAMENTI
 *
 *  Base = telefono: tutto incolonnato e centrato, perche' a 390px una fila
 *  di voci legali e una di mezzi di pagamento sulla stessa riga si
 *  spezzerebbero in modo illeggibile. Da 640px in su diventa una riga
 *  vera, con la nota d'impresa sotto.
 * ========================================================================= */

.tsn-fo-legal {
    align-items: center;
    border-top: 1px solid var(--tsn-fo-line);
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin-top: 20px;
    padding: 18px 0 6px;
    text-align: center;
}

.tsn-fo-legal__nav {
    max-width: 100%;
}

.tsn-fo-legal__links {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 22px;
    justify-content: center;
}

.tsn-fo-legal__item {
    margin: 0;
}

/* Bersaglio >= 24px (WCAG 2.5.8): 16px di riga + 5+5 di respiro. Il corpo
   e' 12px e non 14: la voce legale e' servizio, non navigazione primaria. */
.tsn-fo-legal__link {
    box-sizing: border-box;
    display: inline-block;
    font-size: var(--tsn-fo-fs-small);
    letter-spacing: .02em;
    line-height: 1.35;
    min-height: 24px;
    padding: 5px 0;
}

/* L'unica puntina di rosso della fascia: il filo sotto la voce quando ci
   passi sopra. Il COLORE del testo non cambia: cambia solo il tratto, che
   e' l'accento, ed e' raro. */
.tsn-fo-legal__link:hover,
.tsn-fo-legal__link:focus-visible {
    text-decoration: underline;
    text-decoration-color: var(--tsn-fo-accent);
    text-decoration-thickness: 1px;
    text-underline-offset: 4px;
}

.tsn-fo-legal__company {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-micro);
    letter-spacing: .02em;
    line-height: 1.6;
    margin: 0;
    max-width: 760px;
}

/* -------------------------------------------------------------------------
 *  I MEZZI DI PAGAMENTO. Parole, non loghi (la ragione per intero sta in
 *  Model/Config/Source/PaymentMarks.php). Ogni voce e' una targhetta dal
 *  contorno sottile: la stessa grammatica del comando della newsletter, in
 *  scala minore, cosi' la fascia bassa resta una sola famiglia.
 * ------------------------------------------------------------------------- */

.tsn-fo-pay {
    align-items: center;
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.tsn-fo-pay__label {
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-micro);
    letter-spacing: .14em;
    line-height: 1.3;
    text-transform: uppercase;
}

.tsn-fo-pay__list {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    justify-content: center;
}

.tsn-fo-pay__mark {
    border: 1px solid var(--tsn-fo-line);
    color: var(--tsn-fo-muted);
    font-size: var(--tsn-fo-fs-nano);
    letter-spacing: .12em;
    line-height: 1.2;
    margin: 0;
    padding: 6px 9px;
    text-transform: uppercase;
    white-space: nowrap;
}

/* =========================================================================
 *  RIGA DI CHIUSURA
 * ========================================================================= */

.tsn-fo__copy {
    color: var(--tsn-fo-muted);
    margin: 0;
    padding: 12px 0 0;
    text-align: center;
}

/* xFOOT2 - AGGANCIO PROPRIO, non piu' `.tsn-fo__copy small`.
   Questa riga e' una delle DUE ECCEZIONI alla scala: prenderla per TIPO DI
   ELEMENTO voleva dire legarla a come e' fatta invece che a che cosa e', e la
   regola si sarebbe rotta in silenzio al primo riordino del markup (un secondo
   <small> accanto, o il marchio spostato in uno <span>). Ora ha un nome. */
.tsn-fo__copy-text {
    font-size: var(--tsn-fo-fs-pinned);
    letter-spacing: .04em;
    line-height: 1.5;
}

/* =========================================================================
 *  SCAGLIONE TAVOLETTA (>= 640px) - le media query DOPO le base.
 *
 *  Le colonne SI APRONO: i pannelli tornano visibili e le intestazioni
 *  smettono di essere comandi (il JS le disattiva). Due tracce, non
 *  quattro: a 640px quattro colonne di voci sarebbero quattro strisce.
 * ========================================================================= */

@media (min-width: 640px) {
    .tsn-fo__wrap {
        padding: 56px 32px 28px;
    }

    /*
     * xFOOTROW - LE TRACCE SEGUONO IL NUMERO REALE DI CELLE.
     *
     * Qui c'era `repeat(3, 1fr)` cablato, ed era un difetto silenzioso:
     * con due voci scritte su tre la terza traccia restava vuota e la
     * seconda cella finiva a meta' riga. Nessuno se ne accorgeva perche'
     * le tre voci di servizio erano quasi sempre tre.
     * Adesso il server dichiara quante celle sta scrivendo
     * (`data-tsn-fo-cells`, esattamente come `data-tsn-fo-cols` per le
     * colonne) e il foglio ci accorda le tracce. Le regole sono ENUMERATE
     * e non calcolate: un `repeat(var(--n), 1fr)` vorrebbe una variabile
     * scritta in linea nel markup, cioe' uno `style=` - e la CSP di questo
     * negozio non ammette stili in linea.
     * Il tetto e' SEI, ed e' lo stesso numero che il server fa rispettare
     * (Model\RowValidator::MAX_CELLS_PER_ROW): i due si cambiano insieme.
     * `minmax(0, 1fr)` e non `1fr`: senza il minimo a zero un titolo lungo
     * gonfia la traccia e le celle smettono di essere uguali.
     */
    .tsn-fo-strip {
        grid-template-columns: minmax(0, 1fr);
        padding-bottom: 0;
    }

    .tsn-fo-strip[data-tsn-fo-cells='2'] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tsn-fo-strip[data-tsn-fo-cells='3'] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .tsn-fo-strip[data-tsn-fo-cells='4'] { grid-template-columns: repeat(4, minmax(0, 1fr)); }

    /* CINQUE E SEI CELLE NON CI STANNO, a questa larghezza: 640/6 lascia
       ~80px di testo per cella e ogni titolo andrebbe a capo quattro volte.
       Si dispongono su TRE tracce e vanno a capo; la riga intera torna a
       una sola fila da 1033px in su, dove lo spazio c'e' davvero. */
    .tsn-fo-strip[data-tsn-fo-cells='5'],
    .tsn-fo-strip[data-tsn-fo-cells='6'] { grid-template-columns: repeat(3, minmax(0, 1fr)); }

    .tsn-fo-strip__item {
        min-height: 72px;
        padding: 16px 24px 16px 0;
    }

    /* Il capello passa da orizzontale a VERTICALE: le celle ora sono
       affiancate, e la riga che le separa deve separarle in altezza. */
    .tsn-fo-strip__item + .tsn-fo-strip__item {
        border-left: 1px solid var(--tsn-fo-line);
        border-top: 0;
        padding-left: 24px;
    }

    /* Dove la fascia VA A CAPO (le sole 5 e 6 celle, su tre tracce), la
       prima cella di ogni fila non porta il capello: li' non separerebbe
       due celle, sarebbe un tratto appoggiato al bordo sinistro. Il conto
       e' deterministico perche' le tracce sono tre: 1, 4, 7... */
    .tsn-fo-strip[data-tsn-fo-cells='5'] .tsn-fo-strip__item:nth-child(3n+1),
    .tsn-fo-strip[data-tsn-fo-cells='6'] .tsn-fo-strip__item:nth-child(3n+1) {
        border-left: 0;
        padding-left: 0;
    }

    /*
     * xFOOTNL - QUI PRIMA C'ERA IL DISEGNO DELLA FASCIA: da 640px in su la
     * newsletter diventava una griglia a due tracce, col titolo e il testo
     * a sinistra e il pulsante a destra a cavallo delle due righe. Aveva
     * senso finche' era una banda a tutta larghezza; ora e' una COLONNA, e
     * quel disegno le si ritorcerebbe contro - dentro una traccia stretta
     * il pulsante finirebbe schiacciato accanto al testo.
     *
     * Le regole non sono state neutralizzate con un contro-selettore piu'
     * forte: sono state RIMOSSE. Una regola morta che qualcuno un giorno
     * riattiva per sbaglio e' peggio di nessuna regola. La direttiva e'
     * <<i tre blocchi incolonnati>>, e la colonna e' gia' quella del
     * blocco base (flex verticale): qui resta la sola misura del titolo.
     */
    .tsn-fo-news__title {
        font-size: var(--tsn-fo-fs-3xl);
    }

    /* Il pulsante resta a BLOCCO PIENO anche in tavoletta (regola x188):
       l'inset dei 10px per lato e' una richiesta di scrivania (>= 1033px,
       v. sotto), qui il pulsante e' ancora a filo col testo. Nessuna
       regola qui: quella base (100%) attraversa il breakpoint invariata -
       prima c'era `align-self: flex-start` che lo riportava a misura di
       contenuto, rimossa perche' non era ne' lo standard ne' il blocco
       pieno. */

    .tsn-fo-cols {
        column-gap: 40px;
        grid-template-columns: minmax(0, 1fr);
        padding: 32px 0;
        row-gap: 32px;
    }

    .tsn-fo-cols__nav {
        column-gap: 40px;
        grid-template-columns: repeat(2, minmax(0, 1fr));
        row-gap: 24px;
    }

    /* Una sola colonna di voci non si spezza in due tracce: resterebbe
       una traccia vuota accanto. */
    .tsn-fo-cols[data-tsn-fo-cols='1'] .tsn-fo-cols__nav {
        grid-template-columns: minmax(0, 1fr);
    }

    /* Aperte: niente capello sotto ogni colonna (era il separatore della
       fisarmonica) e niente riga di comando. */
    .tsn-fo-col {
        border-bottom: 0;
    }

    .tsn-fo-col__toggle {
        cursor: default;
        min-height: 0;
        padding: 0 0 14px;
    }

    .tsn-fo-col__chev {
        display: none;
    }

    .tsn-fo-col__panel {
        padding-bottom: 0;
    }

    .tsn-fo-ship {
        align-items: baseline;
        column-gap: 14px;
        flex-direction: row;
        flex-wrap: wrap;
        padding: 18px 0;
        row-gap: 4px;
    }

    /* xFOOTNOCOUNTRY - la terza traccia (1fr) non ha piu' una cella che la
       riempie (era il selettore Paese/Regione, rimosso): resta comunque
       DICHIARATA, di proposito. E' uno spaziatore invisibile che tiene il
       marchio (traccia centrale, `auto`) matematicamente centrato fra due
       margini uguali - toglierla sposterebbe il marchio a sinistra, un
       regresso visivo per un pulire che non serve a nulla. */
    .tsn-fo-bar {
        display: grid;
        gap: 20px;
        grid-template-columns: 1fr auto 1fr;
        padding-top: 28px;
    }

    .tsn-fo-bar__cell--social {
        justify-content: flex-start;
    }

    .tsn-fo-legal {
        align-items: center;
        column-gap: 32px;
        flex-direction: row;
        flex-wrap: wrap;
        justify-content: space-between;
        padding: 20px 0 8px;
        row-gap: 12px;
        text-align: left;
    }

    .tsn-fo-legal__links {
        justify-content: flex-start;
    }

    .tsn-fo-pay {
        flex-direction: row;
        gap: 12px;
    }

    /* La nota d'impresa prende una riga sua: e' la piu' lunga delle tre e
       spezzata a meta' non si legge. */
    .tsn-fo-legal__company {
        flex: 1 0 100%;
        text-align: left;
    }

    .tsn-fo__copy {
        text-align: left;
    }
}

/* =========================================================================
 *  SCAGLIONE SCRIVANIA (>= 1033px)
 *
 *  La TAVOLA vera: recapiti + tre colonne di voci su quattro tracce
 *  UGUALI, con la gronda stretta (40px) che il riferimento misura.
 *
 *  Perche' `repeat(4, ...)` e non `auto-fit`: con `auto-fit` tre colonne
 *  vere si spartivano l'INTERA riga in tre tracce da ~433px e fra una voce
 *  e l'altra restava un vuoto piu' largo del testo (difetto misurato sulla
 *  1.10.1). A tracce fisse le colonne restano larghe quanto serve e la
 *  tavola si legge come una tavola.
 * ========================================================================= */

@media (min-width: 1033px) {
    .tsn-fo__wrap {
        padding: 64px 40px 32px;
    }

    .tsn-fo-strip__item {
        min-height: 76px;
        padding: 18px 32px 18px 0;
    }

    .tsn-fo-strip__item + .tsn-fo-strip__item {
        padding-left: 32px;
    }

    /*
     * xFOOTROW - QUI LO SPAZIO C'E': cinque e sei celle tornano su UNA
     * fila sola (a 1300px di canone sono ~200px per cella, larghezza da
     * titolo su una riga). Tornando in fila, il capello che a 640px si era
     * tolto dalla prima cella di ogni riga DEVE tornare - e va rimesso
     * esplicitamente, perche' la regola che lo toglieva vive nella media
     * query di sotto ed e' ancora in vigore qui.
     * L'unica cella che resta senza capello e' la PRIMA in assoluto: e'
     * l'inizio della fascia, non un confine fra due celle.
     */
    .tsn-fo-strip[data-tsn-fo-cells='5'] { grid-template-columns: repeat(5, minmax(0, 1fr)); }
    .tsn-fo-strip[data-tsn-fo-cells='6'] { grid-template-columns: repeat(6, minmax(0, 1fr)); }

    .tsn-fo-strip[data-tsn-fo-cells='5'] .tsn-fo-strip__item:nth-child(3n+1),
    .tsn-fo-strip[data-tsn-fo-cells='6'] .tsn-fo-strip__item:nth-child(3n+1) {
        border-left: 1px solid var(--tsn-fo-line);
        padding-left: 32px;
    }

    .tsn-fo-strip[data-tsn-fo-cells='5'] .tsn-fo-strip__item:first-child,
    .tsn-fo-strip[data-tsn-fo-cells='6'] .tsn-fo-strip__item:first-child {
        border-left: 0;
        padding-left: 0;
    }

    /*
     * xFOOTNL - il respiro di fascia (36px sopra e sotto) non c'e' piu':
     * la newsletter e' una colonna, e una colonna non porta il ritmo delle
     * bande, lo porta la griglia che la contiene. Il valore non e' stato
     * lasciato a morire sotto un contro-selettore: e' stato tolto.
     *
     * IL TITOLO SCENDE DA 28px A 20px, e non e' un ripensamento estetico:
     * 28px erano la misura di un titolo di fascia, largo quanto la pagina.
     * Nella traccia di una griglia a quattro o cinque colonne quella
     * misura andrebbe a capo due volte e la parola <<Newsletter>> peserebbe
     * piu' dell'invito che la segue. 20px la tiene su una riga e la mette
     * alla pari con le intestazioni delle altre colonne: e' una tavola
     * sola, e si deve leggere come tale.
     */
    .tsn-fo-news__title {
        font-size: var(--tsn-fo-fs-xl);
    }

    /* xFOOTBTN (31-08, direttiva Riccardo) - da scrivania in su il
       pulsante resta a blocco pieno ma INSET di 10px per lato: la colonna
       qui e' stretta e affiancata alle altre tre, un bordo a filo si
       confonderebbe col capello verticale della griglia. `width` esplicita
       vince sul `align-self: stretch` di base (che resta: e' lui a dare
       il 100% di riferimento su cui il calc() sottrae). */
    .tsn-fo-news__cta {
        width: calc(100% - 20px);
        margin: 0 10px;
    }

    /* Quattro tracce uguali: la colonna dei recapiti e' la prima, le
       colonne di voci occupano le altre tre. Se un giorno le colonne di
       voci diventassero quattro, la gronda le impilerebbe su due righe
       ordinate invece di stringerle tutte su una. */
    /*
     * LE TRACCE SEGUONO IL NUMERO REALE DI COLONNE, e per questo il
     * template scrive il conteggio in `data-tsn-fo-cols`.
     *
     * Non e' decorazione: e' la correzione del difetto misurato. Con un
     * numero di tracce FISSO (3) e due sole colonne di voci, la terza
     * traccia restava vuota e in fondo alla riga si apriva un buco di
     * ~384px (misurato sul banco 30-08 a 1500px: le colonne finivano a
     * 1079 e la gabbia arrivava a 1463). Con `auto-fit` succedeva il
     * difetto OPPOSTO e peggiore - due colonne si spartivano l'intera
     * riga in tracce da ~433px, con un vuoto fra una voce e l'altra piu'
     * largo del testo: era il disegno della 1.10.1.
     *
     * Le tracce sono TUTTE UGUALI, recapiti compresi: la colonna dei
     * recapiti pesa quanto una colonna di voci, quindi la banda si legge
     * come una tavola sola e non come due blocchi di larghezza diversa.
     * La regola vale per ogni conteggio ammesso dal tetto (1..7).
     */
    .tsn-fo-cols {
        column-gap: 40px;
        padding: 40px 0;
    }

    /*
     * xFOOTNL - LE TRACCE ORA DIPENDONO DA DUE NUMERI, NON DA UNO.
     *
     * Prima la testa della griglia era sempre una sola (i recapiti) e
     * bastava il conteggio delle colonne di voci. Ora le teste possibili
     * sono due, newsletter e recapiti, ognuna spegnibile per conto suo:
     * il modello va scelto sulla COPPIA (teste, colonne), ed e' per
     * questo che il template dichiara anche `data-tsn-fo-lead`.
     *
     * Perche' non `:has()` o `:nth-child`: una griglia non sa contare i
     * propri figli, e dedurre la struttura dal DOM significa riscoprire a
     * ogni frame quello che il server sapeva gia' con certezza. Il
     * server dichiara, il CSS accorda - la stessa dottrina della regola
     * qui sopra, estesa a una dimensione in piu'.
     *
     * Le tracce restano TUTTE UGUALI: newsletter e recapiti pesano
     * quanto una colonna di voci, e la banda continua a leggersi come
     * una tavola sola.
     */

    /* Nessuna testa: la navigazione si prende tutto (`:only-child` piu'
       in alto copre il caso in cui sia davvero l'unica figlia). */
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='1'] { grid-template-columns: minmax(0, 1fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='2'] { grid-template-columns: minmax(0, 2fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='3'] { grid-template-columns: minmax(0, 3fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='4'] { grid-template-columns: minmax(0, 4fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='5'] { grid-template-columns: minmax(0, 5fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='6'] { grid-template-columns: minmax(0, 6fr); }
    .tsn-fo-cols[data-tsn-fo-lead='0'][data-tsn-fo-cols='7'] { grid-template-columns: minmax(0, 7fr); }

    /* Una testa sola: newsletter OPPURE recapiti. E' il modello storico. */
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='1'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='2'] { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='3'] { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='4'] { grid-template-columns: minmax(0, 1fr) minmax(0, 4fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='5'] { grid-template-columns: minmax(0, 1fr) minmax(0, 5fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='6'] { grid-template-columns: minmax(0, 1fr) minmax(0, 6fr); }
    .tsn-fo-cols[data-tsn-fo-lead='1'][data-tsn-fo-cols='7'] { grid-template-columns: minmax(0, 1fr) minmax(0, 7fr); }

    /* Due teste: newsletter, recapiti, poi la navigazione. Il caso
       normale dopo questo giro. */
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='1'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='2'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 2fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='3'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 3fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='4'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 4fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='5'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 5fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='6'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 6fr); }
    .tsn-fo-cols[data-tsn-fo-lead='2'][data-tsn-fo-cols='7'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 7fr); }

    /* La newsletter e' una colonna come le altre: niente capello sotto
       (lo portano le colonne solo nella fisarmonica del telefono) e
       niente respiro di fascia, che qui sfalserebbe la prima riga. */
    .tsn-fo-cols .tsn-fo-news {
        border-bottom: 0;
        padding: 0;
    }

    .tsn-fo-cols__nav {
        column-gap: 40px;
    }

    .tsn-fo-cols[data-tsn-fo-cols='1'] .tsn-fo-cols__nav { grid-template-columns: minmax(0, 1fr); }
    .tsn-fo-cols[data-tsn-fo-cols='2'] .tsn-fo-cols__nav { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .tsn-fo-cols[data-tsn-fo-cols='3'] .tsn-fo-cols__nav { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .tsn-fo-cols[data-tsn-fo-cols='4'] .tsn-fo-cols__nav { grid-template-columns: repeat(4, minmax(0, 1fr)); }
    .tsn-fo-cols[data-tsn-fo-cols='5'] .tsn-fo-cols__nav { grid-template-columns: repeat(5, minmax(0, 1fr)); }
    .tsn-fo-cols[data-tsn-fo-cols='6'] .tsn-fo-cols__nav { grid-template-columns: repeat(6, minmax(0, 1fr)); }
    .tsn-fo-cols[data-tsn-fo-cols='7'] .tsn-fo-cols__nav { grid-template-columns: repeat(7, minmax(0, 1fr)); }

    .tsn-fo-col__toggle {
        padding-bottom: 18px;
    }

    .tsn-fo-col__title {
        font-size: var(--tsn-fo-fs-head);
    }
}

/* =========================================================================
 *  MOVIMENTO RIDOTTO - chi lo chiede non deve vedere rotazioni e
 *  scorrimenti.
 * ========================================================================= */

@media (prefers-reduced-motion: reduce) {
    .tsn-fo a,
    .tsn-fo-strip__chev,
    .tsn-fo-col__chev,
    .tsn-fo-news__cta,
    .tsn-fo-legal__link {
        transition: none;
    }

    .tsn-fo-strip__item:hover .tsn-fo-strip__chev {
        transform: none;
    }
}
