/* ==========================================================================
   ORCA PRODUZIONI - tema v2.0
   Ricostruzione 1:1 di orcaproduzioni.it (WordPress + Elementor Pro).

   Questo file e' ASSEMBLATO da frammenti scritti componente per componente
   sui valori RILEVATI dalla sorgente: CSS collegati, CSS inline (dove
   Elementor stampa i template di loop), CSS di tema e plugin, e i
   data-settings dei widget. La versione 1.x era stata scritta stimando i
   valori mancanti ed era sbagliata in 40 punti sul solo carosello.

   Due cose da NON "correggere" leggendo questo file:
   - il font AZO sta solo dove l'originale lo usa (titoli di sezione): nel
     carosello il titolo e' Helvetica 23px/600, non AZO;
   - il CSS scritto a mano dal cliente usa @media (max-width: 768px) mentre
     Elementor genera 767px. A 768px esatti si contraddicono, ed e' cosi'
     anche sul sito originale: non uniformare.
   ========================================================================== */


/* ==========================================================================
   DESIGN SYSTEM: FONT, VARIABILI, RESET, TIPOGRAFIA, BOTTONI
   ========================================================================== */

/* AZO (Azo Sans Uber): font del sito originale. Nel deploy statico gli
   url() relativi del CSS non vengono riscritti, quindi va inlinato qui.
   Convertito da TTF a woff2 (47KB -> 13KB), stessi contorni. */
@font-face {
  font-family: "AZO";
  font-style: normal;
  font-weight: normal;
  font-display: swap;
  src: url(data:font/woff2;base64,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) format("woff2");
}

/* ==========================================================================
   ORCA PRODUZIONI - base del design system
   Ogni valore qui dentro e' misurato sulla sorgente di orcaproduzioni.it:
   post-28.css (kit globale di Elementor), frontend.min.css, i tre CSS di
   hello-elementor, e-animation-grow-rotate.min.css, e-animation-bounce-in.min.css,
   piu' i post-*.css di pagina citati riga per riga nel rilievo.
   Dove la sorgente non dice niente, qui non c'e' niente: le lacune stanno
   scritte nel rapporto, non colmate a intuito.

   Breakpoint: sono due, e sono quelli veri di elementorFrontendConfig.
   tablet = max-width 1024px, mobile = max-width 767px. Nessun altro.
   ========================================================================== */

:root {
  /* ---- Colori --------------------------------------------------------
     Il sito visibile e' bianco e nero: quasi ogni regola di pagina scrive
     #000000 / #FFFFFF a mano. I token del kit restano qui perche' sono i
     valori globali veri e alcuni affiorano (la fascia partner, il fondo
     chiaro di certe sezioni): servono a non doverli reinventare a valle. */
  --or-nero: #000000;
  --or-bianco: #ffffff;

  /* Fondo pagina: .elementor-kit-28{background-color:var(--e-global-color-c696dce)}. */
  --or-fondo-pagina: #ffffff;

  /* Fascia dei partner, home e about: post-60.css 8061ff6 / post-37.css 410bcbf7. */
  --or-grigio-fascia: #555555;

  /* Token del kit (post-28.css). Non sono decorazione: sono i default che
     ogni widget non sovrascritto eredita. */
  --or-kit-primary: #1c244b;
  --or-kit-secondary: #f3f5f8;
  --or-kit-text: #324a6d;
  --or-kit-accent: #467ff7;
  --or-kit-bianco: #ffffff;
  --or-kit-azzurro-chiaro: #c8d5dc;
  --or-kit-bianco-freddo: #f9fafd;
  --or-kit-trasparente: #02010100;
  --or-kit-nero-80: #000000cc;

  /* Alias storico: il fondo chiaro di alcune sezioni e' il "secondary" del kit. */
  --or-hero-fondo: var(--or-kit-secondary);

  /* ---- Famiglie ------------------------------------------------------
     Elementor scrive sempre la coda ", Sans-serif" (con la S maiuscola,
     che il browser tratta come il generico sans-serif): la riporto com'e'
     perche' e' la sorgente, non una scelta di stile.
     AZO va SOLO dove la sorgente lo dichiara: titoli di sezione e bottone
     "Learn More" della home. Il resto e' Helvetica, Poppins o Roboto. */
  --or-font-display: "AZO", Sans-serif;
  --or-font-helvetica: "Helvetica", Sans-serif;
  --or-font-poppins: "Poppins", Sans-serif;
  --or-font-roboto: "Roboto", Sans-serif;

  /* Alias di comodo, con i valori veri dietro. */
  --or-font-body: var(--or-font-helvetica);
  --or-font-eyebrow: var(--or-font-poppins);
  --or-font-menu: var(--or-font-roboto);

  /* ---- Scala tipografica, desktop -------------------------------------
     I nomi dopo "kit-" sono gli id dei token di post-28.css: li tengo per
     poter risalire alla riga esatta della sorgente in caso di dubbio. */
  --or-display-size: 65px;          /* primary: titolo di sezione, AZO */
  --or-display-lh: 1.2em;
  --or-eyebrow-size: 16px;          /* 6558fb1: occhiello spaziato */
  --or-body-size: 16px;             /* corpo dei testi, Helvetica */
  --or-body-lh: 1.3em;
  --or-btn-size: 23px;              /* bottone "Learn More", AZO */

  --or-kit-secondary-size: 36px;
  --or-kit-text-size: 16px;
  --or-kit-accent-size: 16px;
  --or-kit-h4-size: 22px;           /* 392b9e0 */
  --or-kit-lead-size: 22px;         /* c05b693 */
  --or-kit-link-italic-size: 16px;  /* 92bce3b */
  --or-kit-caption-italic-size: 16px; /* 397e168 */
  --or-kit-xl-size: 85px;           /* b2deeae */
  --or-kit-xxl-size: 200px;         /* fb1a3e0 */
  --or-kit-helvetica-title-size: 42px; /* 4fe2d9d, letter-spacing -1.3px */

  /* ---- Misure ricorrenti ---------------------------------------------
     Larghezza del contenuto: .e-con{--container-max-width:1140px} del kit,
     applicata come min(100%, larghezza) da frontend.min.css.
     I container del kit hanno padding di default 0 su tutti e quattro i
     lati (post-28.css): senza questa riga frontend.min.css metterebbe 10px.
     Spaziatura fra widget: 20px, ma dentro un .e-con vale 0 (vedi reset). */
  --or-container: 1140px;
  --or-container-padding: 0px;
  --or-widget-spacing: 20px;

  /* Barra in cima: min-height 80px, post-79.css. La tengo qui perche' il
     video di apertura ci scorre sotto con margin-bottom -80px. */
  --or-header-h: 80px;
}

@media (max-width: 1024px) {
  :root {
    --or-display-size: 45px;
    --or-eyebrow-size: 14px;
    --or-body-size: 14px;
    --or-btn-size: 14px;

    --or-kit-secondary-size: 25px;
    --or-kit-text-size: 14px;
    --or-kit-accent-size: 14px;
    --or-kit-lead-size: 14px;
    --or-kit-link-italic-size: 14px;
    --or-kit-caption-italic-size: 14px;
    --or-kit-xl-size: 65px;
    --or-kit-xxl-size: 145px;
    --or-kit-helvetica-title-size: 45px;

    --or-container: 1024px;
  }
}

@media (max-width: 767px) {
  :root {
    /* A 767px il kit cambia anche l'interlinea del titolo, non solo il corpo.
       L'occhiello e il testo NON hanno un secondo scalino: restano a 14px. */
    --or-display-size: 28px;
    --or-display-lh: 1.1em;

    --or-kit-secondary-size: 20px;
    --or-kit-h4-size: 18px;
    --or-kit-xl-size: 48px;
    --or-kit-xxl-size: 100px;
    --or-kit-helvetica-title-size: 28px;

    --or-container: 767px;
  }
}

/* ==========================================================================
   RESET
   Non e' un reset moderno inventato: e' quello che il sito originale ha
   davvero sotto Elementor, cioe' hello-elementor/style.min.css piu' le
   poche regole di frontend.min.css che valgono su tutto il contenuto.
   Senza queste righe la geometria non torna (margini dei titoli, dei
   paragrafi, box-sizing, immagini fluide).
   ========================================================================== */

*,
*::after,
*::before {
  box-sizing: border-box;
}

html {
  line-height: 1.15;
  -webkit-text-size-adjust: 100%;
}

body {
  /* margin/padding: hello-elementor + :where(body){margin:0} e
     body{padding:0} del global-styles inline di WordPress.
     Il resto e' il default di hello-elementor: e' cio' che eredita
     qualunque testo non vestito da una regola di Elementor. Il colore
     #333 non e' un ripiego, e' il valore vero del sito: ogni testo che
     si vede dichiara il proprio colore, quindi #333 non affiora mai. */
  margin: 0;
  padding: 0;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
    "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji",
    "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.5;
  color: #333333;
  background-color: var(--or-fondo-pagina);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1,
h2,
h3,
h4,
h5,
h6 {
  margin-block-start: 0.5rem;
  margin-block-end: 1rem;
  font-family: inherit;
  font-weight: 500;
  line-height: 1.2;
  color: inherit;
}

h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
h3 { font-size: 1.75rem; }
h4 { font-size: 1.5rem; }
h5 { font-size: 1.25rem; }
h6 { font-size: 1rem; }

p {
  margin-block-start: 0;
  margin-block-end: 0.9rem;
}

/* hello-elementor da ai link il rosa #c36. Sul sito vero non si vede mai:
   ogni link e' vestito da una regola di Elementor. Qui metto "inherit", ed
   e' importante che il selettore resti a livello di elemento (0,0,1): il
   tema precedente scriveva ".site a{color:inherit}" (0,1,1), che batteva
   ".or-btn{color:#fff}" (0,1,0) e rendeva il testo del bottone nero su
   fondo nero. E' la ragione della "pillola senza etichetta". */
a {
  background-color: transparent;
  text-decoration: none;
  color: inherit;
  box-shadow: none;
}

/* hello-elementor: img{border-style:none;height:auto;max-width:100%};
   frontend.min.css aggiunge border-radius e box-shadow azzerati. */
img {
  border: none;
  border-radius: 0;
  box-shadow: none;
  height: auto;
  max-width: 100%;
}

/* Con il corpo a 400, "bolder" risolve a 700: e' il peso vero dei <b> del
   testo introduttivo, che altrimenti verrebbero piu' leggeri. */
b,
strong {
  font-weight: bolder;
}

dd,
dl,
dt,
li,
ol,
ul {
  margin-block-start: 0;
  margin-block-end: 0;
  border: 0;
  outline: 0;
  font-size: 100%;
  vertical-align: baseline;
  background: transparent;
}

figcaption {
  font-size: 16px;
  color: #333333;
  line-height: 1.4;
  font-style: italic;
  font-weight: 400;
}

/* ==========================================================================
   RADICE DEL SITO
   .site fa solo da fondo. Il tema precedente ci metteva anche famiglia,
   corpo e interlinea: da li' veniva l'1.3em applicato pure alle biografie
   del team, che nell'originale hanno 1.2em. La tipografia sta sulle classi,
   non sul contenitore.
   ========================================================================== */

.site {
  background-color: var(--or-fondo-pagina);
}

/* Larghezza del contenuto boxed: .e-con{--content-width:min(100%,var(--container-max-width))}. */
.or-container {
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin-inline: auto;
}

/* ==========================================================================
   TIPOGRAFIA CONDIVISA
   ========================================================================== */

/* Titolo di sezione. E' l'unico posto in cui l'originale usa AZO nei titoli
   (piu' il bottone della home). Margini e padding a zero come
   .elementor-heading-title, non come gli h1-h6 di hello. */
.or-display {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-display);
  font-size: var(--or-display-size);
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: var(--or-display-lh);
  letter-spacing: 0px;
  color: var(--or-nero);
}

/* Occhiello. Poppins, non AZO e non Helvetica: e' il token 6558fb1 del kit.
   Il letter-spacing di 10px e' quello vero, non un arrotondamento. */
.or-eyebrow {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-eyebrow);
  font-size: var(--or-eyebrow-size);
  font-weight: 300;
  font-style: normal;
  text-transform: uppercase;
  text-decoration: none;
  line-height: 1.5em;
  letter-spacing: 10px;
  color: var(--or-nero);
}

/* Corpo del testo: Helvetica 400, interlinea 1.3em, nero pieno. */
.or-body {
  font-family: var(--or-font-body);
  font-size: var(--or-body-size);
  font-weight: 400;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: var(--or-body-lh);
  letter-spacing: 0px;
  color: var(--or-nero);

  /* Nell'originale i blocchi di testo non sono <p>: sono separati da
     <br><br>, cioe' da una riga vuota alta quanto l'interlinea. Il nostro
     markdown produce <p>, quindi lo stacco fra paragrafi vale 1.3em e non
     lo 0.9rem di hello. Dove invece l'originale ha <p> veri (le biografie
     del team), il blocco ridichiara --or-body-gap: 0.9rem. */
  --or-body-gap: var(--or-body-lh);
}

.or-body p {
  margin: 0 0 var(--or-body-gap);
}

.or-body p:last-child {
  margin-bottom: 0;
}

.or-body b,
.or-body strong {
  font-weight: 700;
}

/* ==========================================================================
   BOTTONE
   Tre varianti reali, non una sola. Cambiano font, raggio, padding e
   perfino l'animazione: tenerle distinte evita che AZO finisca su bottoni
   che nell'originale sono in Helvetica.
   ========================================================================== */

/* .or-btn = il bottone "Learn More" della home (post-60.css, 5b473ebf),
   l'unico bottone del sito in AZO, piu' i default di .elementor-button
   (frontend.min.css) che tutte e tre le varianti ereditano davvero. */
.or-btn {
  display: inline-block;
  text-align: center;
  text-decoration: none;
  line-height: 1em;
  background-color: var(--or-nero);
  color: var(--or-bianco);
  fill: var(--or-bianco);

  /* Attenzione: la transizione finale del sito NON e' "all .3s".
     e-animation-grow-rotate.min.css viene caricato dopo frontend.min.css,
     stessa specificita', e riscrive transition-property a "transform".
     Risultato: la scala e la rotazione sono animate, l'inversione
     bianco/nero e' istantanea. Se qui si scrivesse "all", il bottone
     sfumerebbe: sarebbe piu' carino e sbagliato. */
  transition-duration: 0.3s;
  transition-property: transform;
  transition-timing-function: ease;

  font-family: var(--or-font-display);
  font-size: var(--or-btn-size);
  font-weight: 400;
  font-style: normal;
  text-transform: capitalize;
  letter-spacing: 0px;
  border-style: solid;
  border-width: 2px;
  border-color: var(--or-nero);
  border-radius: 100px;
  padding: 16px 30px;
}

.or-btn:hover,
.or-btn:focus {
  background-color: var(--or-bianco);
  color: var(--or-nero);
  border-color: var(--or-nero);
}

.or-btn:hover svg,
.or-btn:focus svg {
  fill: var(--or-nero);
}

/* Variante social "orcaproduzioni" con l'icona Instagram: pagina about
   (post-37.css, ac9c1e2) e pagine film (post-249.css, 4ba0dc55).
   Helvetica 20/600 con crenatura negativa, raggio 50px, e il padding e'
   quello di default perche' la sorgente non ne dichiara uno proprio. */
.or-btn--social {
  font-family: var(--or-font-helvetica);
  font-size: 20px;
  font-weight: 600;
  text-transform: none;
  letter-spacing: -0.5px;
  border-radius: 50px;
  padding: 12px 24px;
}

@media (max-width: 1024px) {
  .or-btn--social {
    font-size: 14px;
  }
}

/* Variante "Download the pitch deck" delle schede catalogo
   (post-1182.css e gemelli, 2ad76b4). Nessun bordo, raggio 35px, e in
   hover NON si inverte: rimbalza soltanto (vedi .or-anim-bounce). */
.or-btn--pitch {
  font-family: var(--or-font-helvetica);
  font-size: 24px;
  font-weight: 600;
  text-transform: capitalize;
  letter-spacing: 0px;
  border: none;
  border-radius: 35px;
  padding: 12px 24px;
}

.or-btn--pitch:hover,
.or-btn--pitch:focus {
  background-color: var(--or-nero);
  color: var(--or-bianco);
}

@media (max-width: 1024px) {
  .or-btn--pitch {
    font-size: 14px;
  }
}

/* Contenuto interno del bottone quando c'e' un'icona:
   .elementor-button-content-wrapper{display:flex;flex-direction:row;gap:5px;justify-content:center}.
   L'icona misura 1em per lato, quindi cresce e cala col testo. */
.or-btn__content {
  display: flex;
  flex-direction: row;
  gap: 5px;
  justify-content: center;
}

.or-btn__icon svg {
  width: 1em;
  height: 1em;
}

.or-btn__text {
  display: inline-block;
}

/* ---- Animazioni di Elementor ------------------------------------------
   Valori copiati dai due file di animazione, stati compresi: si attivano
   su hover, focus e active, non solo su hover. */

/* e-animation-grow-rotate.min.css */
.or-anim-grow:hover,
.or-anim-grow:focus,
.or-anim-grow:active {
  transform: scale(1.1) rotate(4deg);
}

/* Alias storico: i template esistenti scrivono or-btn--grow. */
.or-btn--grow:hover,
.or-btn--grow:focus,
.or-btn--grow:active {
  transform: scale(1.1) rotate(4deg);
}

/* e-animation-bounce-in.min.css: mezzo secondo a riposo, e una curva che
   sfonda sotto lo zero e sopra l'uno, cioe' il rimbalzo. */
.or-anim-bounce {
  transition-duration: 0.5s;
}

.or-anim-bounce:hover,
.or-anim-bounce:focus,
.or-anim-bounce:active {
  transform: scale(1.2);
  transition-timing-function: cubic-bezier(0.47, 2.02, 0.31, -0.36);
}

/* Chi non vuole movimento riceve lo stesso bottone, fermo: il contrasto
   bianco/nero regge l'affordance anche senza scala e rotazione. */
@media (prefers-reduced-motion: reduce) {
  .or-btn,
  .or-anim-bounce {
    transition: none;
  }

  .or-anim-grow:hover,
  .or-anim-grow:focus,
  .or-anim-grow:active,
  .or-btn--grow:hover,
  .or-btn--grow:focus,
  .or-btn--grow:active,
  .or-anim-bounce:hover,
  .or-anim-bounce:focus,
  .or-anim-bounce:active {
    transform: none;
  }
}

/* ==========================================================================
   BARRA IN CIMA, BLACKBAR, STRISCE SFOCATE
   ========================================================================== */

/* ==========================================================================
   ORCA PRODUZIONI - barra in cima, blackbar, strisce sfocate
   Rilievo di riferimento: rilievo/header.md.
   Ogni valore qui sotto e' copiato da li'. Dove il rilievo dice
   "NON TROVATO" non c'e' niente: le lacune restano lacune.

   Tre note che cambiano la struttura rispetto al primo tentativo, e che
   quindi vale la pena tenere sott'occhio leggendo il file:

   1) La blackbar e' FIGLIA della barra, non una sorella. E' per questo che
      passando il mouse sulla striscia nera in basso la barra resta in hover
      e la striscia resta aperta: il puntatore non ha mai lasciato l'header.
      Le due strisce sfocate invece sono sorelle, fuori dall'header.
   2) Il logotipo esteso e' fuori flusso (position:absolute, left:50%), non
      un elemento in colonna che scivola. Lo decide il CSS del FOOTER
      (post-567), caricato dopo quello dell'header e con selettore .logotitolo
      non scopato: vince lui. Da qui partenza a translateX(0) e ritorno in
      0.5s, non quello che il cliente aveva scritto nell'header.
   3) Nessun z-index negativo e nessun isolation:isolate. Il pointer delle
      voci di menu nell'originale e' un ::before con z-index:-1; qui e'
      z-index:0 con l'etichetta portata a z-index:1. Stesso risultato a
      schermo, ma senza il contesto di impilamento che nell'editor della
      console faceva finire l'evidenziatore sopra al contenuto (il famoso
      rettangolo verde pieno).

   Breakpoint: 1024/767 sono quelli veri di Elementor. 768 compare una volta
   sola ed e' scritto a mano dal cliente: a 768px esatti convive con le
   regole Elementor da 767. E' una contraddizione della sorgente, la
   riporto com'e' invece di uniformarla.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. La barra
   Trasparente a riposo, nera in hover. Il gradiente e' tutto trasparente
   (#00000000 -> #00000000): non si vede, ma resta perche' e' quello che
   Elementor disegna sopra al background-color, e senza di lui la
   transizione non sarebbe la stessa proprieta' animata.
   La transizione e' quella completa di .e-con, non un "background 0.5s"
   inventato: background prende --background-transition (0.5s), le altre
   tre restano ai loro default.
   -------------------------------------------------------------------------- */

.or-header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  max-width: 100%;
  min-height: var(--or-header-h);
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 0px;

  /* Il margine negativo e' quello che fa passare il video di apertura
     sotto la barra invece che sotto un buco di 80px. */
  margin: 0px 0px -80px 0px;
  padding: 0% 5%;

  z-index: 95;
  overflow: visible;
  border-radius: 0;

  background-color: transparent;
  background-image: linear-gradient(0deg, #00000000 0%, #00000000 100%);
  transition: background 0.5s ease, border 0.3s, box-shadow 0.3s,
    transform 0.4s;
}

.or-header:hover {
  background-color: var(--or-nero);
}

/* Aggiunta rispetto alla sorgente: chi naviga da tastiera non produce
   hover, e senza fondo nero le voci in focus finirebbero nere su nero.
   Stessi valori dell'hover, nessun valore nuovo. */
.or-header:focus-within {
  background-color: var(--or-nero);
}

/* --------------------------------------------------------------------------
   2. Il gruppo del marchio
   align-items non e' dichiarato nella sorgente: resta "normal" (stretch).
   Va lasciato cosi', perche' e' lo stretch che da al logotipo assoluto la
   sua posizione statica verticale.
   position:relative viene da .e-con ed e' il riferimento di left:50% del
   logotipo: senza, il logotipo si ancorerebbe alla barra intera.
   -------------------------------------------------------------------------- */

.or-header__brand {
  position: relative;
  width: 25%;
  display: flex;
  flex-direction: row;
  gap: 0px;
  padding: 0px;
}

@media (max-width: 1024px) and (min-width: 768px) {
  .or-header__brand {
    width: 15%;
  }
}

/* Sotto i 767px la sorgente porta il gruppo a flex-start su tutti e tre gli
   assi. Il risultato e' che il gruppo perde lo stretch, si riduce ai 53px del
   pittogramma e si incolla al bordo alto della barra da 80px: il marchio
   resta 13px piu' su del burger, che invece e' centrato dal
   `align-items:center` della barra. Sul desktop non si vede perche' li' lo
   stretch c'e'; su mobile e' il logo appoggiato al soffitto.
   Tengo l'allineamento orizzontale a sinistra (quello serve) e centro il
   gruppo in verticale, cosi' marchio e burger stanno sulla stessa linea. */
@media (max-width: 767px) {
  .or-header__brand {
    width: 50%;
    justify-content: flex-start;
    align-items: center;
    align-self: center;
    flex-wrap: nowrap;
    flex-grow: 0;
    flex-shrink: 0;
    /* Nella sorgente e' commentato "order start hack": porta il marchio
       davanti a tutto quando la barra va a capo. */
    order: -99999;
  }
}

/* ---- Pittogramma --------------------------------------------------------
   z-index 9999 funziona solo perche' il widget e' position:relative: su un
   elemento statico verrebbe ignorato. E' l'unico elemento della barra con
   una transizione sul filtro; il menu si inverte di scatto (vedi sotto). */

.or-header__logo {
  position: relative;
  z-index: 9999;
  text-align: left;
  transition: filter 0.5s ease;
}

.or-header:hover .or-header__logo,
.or-header:focus-within .or-header__logo {
  filter: invert(1);
}

.or-header__logo a {
  display: inline-block;
}

.or-header__logo img {
  display: inline-block;
  vertical-align: middle;
  width: 53px;
  height: 53px;
  object-fit: contain;
  object-position: center center;
}

@media (max-width: 767px) {
  .or-header__logo {
    text-align: left;
  }

  /* L'altezza NON viene ridichiarata dalla sorgente: resta 53px anche con
     larghezza 50. Il contain fa il resto. */
  .or-header__logo img {
    width: 50px;
    object-position: center left;
  }
}

/* ---- Logotipo esteso -----------------------------------------------------
   Invisibile a riposo, compare solo in hover: e' il pezzo che si perde piu'
   facilmente. Fuori flusso, quindi non occupa spazio nel gruppo del marchio
   (che di fatto contiene il solo pittogramma).

   Le due durate sono asimmetriche e vengono da due file diversi:
   - andata (hover):  opacity 1.5s ease, transform 1s ease   (CSS dell'header)
   - ritorno (riposo): transform 0.5s ease, opacity 0.5s ease (CSS del footer)
   Il logotipo e' bianco su file e non viene invertito: si legge solo quando
   la barra e' nera, che e' esattamente quando compare.

   La larghezza dichiarata sull'immagine e' 125px, ma il contenitore e' 100px
   e img{max-width:100%} la taglia: a schermo sono 100px. Lascio i due valori
   distinti invece di "semplificare" a 100, perche' e' cosi' che si comporta
   la sorgente anche a 767px, dove l'immagine dichiara 170px e resta a 100. */

/* left NON e' il 50% della sorgente. Nell'originale il logotipo parte a
   meta' del gruppo del marchio e poi scivola a sinistra di una misura
   fissa (6em, 2em sotto i 768px): siccome il gruppo e' una percentuale
   della barra e la corsa e' in em, il punto d'arrivo si sposta con la
   larghezza della finestra. Misurato sul sito: a 390px il logotipo
   arriva a 14px dal pittogramma, a 767px a 93px (l'aria che si vede
   nello screenshot), a 900px e a 1280px ci finisce SOPRA, tanto che la
   O sparisce dietro il marchio e si legge "RCA".
   Qui il punto d'arrivo e' ancorato al pittogramma: larghezza del
   marchio piu' 12px, e la partenza e' quella piu' la corsa. La corsa,
   la direzione e i tempi restano quelli della sorgente, cambia solo
   dove si ferma: 12px dal marchio a ogni larghezza. */
.or-header__wordmark {
  position: absolute;
  left: calc(65px + 6em);
  margin-left: 0;
  width: 100px;
  z-index: 9998;
  text-align: left;
  opacity: 0;
  transform: translateX(0);
  transition: transform 0.5s ease, opacity 0.5s ease;
}

.or-header:hover .or-header__wordmark,
.or-header:focus-within .or-header__wordmark {
  opacity: 1;
  transform: translateX(-6em);
  transition: opacity 1.5s ease, transform 1s ease;
}

.or-header__wordmark a {
  display: inline-block;
}

.or-header__wordmark img {
  display: inline-block;
  vertical-align: middle;
  width: 125px;
  height: 53px;
  object-fit: contain;
  object-position: center center;
}

/* 768, non 767: e' il breakpoint scritto a mano dal cliente, un pixel piu'
   largo di quello di Elementor. A 768px esatti questa regola e' gia' attiva
   mentre le regole a 767 no. Nella sorgente c'e' un !important, qui non
   serve: la regola viene dopo con la stessa specificita'.
   Il verso NON si inverte: si parte da 0 in entrambi i casi, la corsa e'
   solo piu' corta (-2em invece di -6em). */
@media (max-width: 768px) {
  .or-header:hover .or-header__wordmark,
  .or-header:focus-within .or-header__wordmark {
    transform: translateX(-2em);
  }

  /* Corsa piu' corta, quindi partenza piu' vicina: l'arrivo resta a
     12px dal pittogramma, che a 768px e' ancora largo 53px. */
  .or-header__wordmark {
    left: calc(65px + 2em);
  }
}

@media (max-width: 767px) {
  /* Sotto i 767 il pittogramma scende a 50px e il link porta 5px di
     margine suo: 57 + 5 = 62, cioe' di nuovo 12px dal marchio. */
  .or-header__wordmark {
    left: calc(57px + 2em);
  }

  /* Nella sorgente il margine sta sul .elementor-widget-container, che qui
     non esiste: il link e' il primo figlio, quindi ce lo metto sopra. */
  .or-header__wordmark a {
    margin: 0px 0px 0px 5px;
  }

  .or-header__wordmark img {
    width: 170px;
  }
}

/* --------------------------------------------------------------------------
   3. Il lato del menu
   25% + 90% = 115%: non e' un errore di lettura, e' voluto. I due gruppi
   hanno flex 0 1 auto e si comprimono in proporzione.
   -------------------------------------------------------------------------- */

.or-header__navwrap {
  width: 90%;
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
  align-items: center;
  gap: 2.2%;
  padding: 0px;
}

@media (max-width: 1024px) {
  .or-header__navwrap {
    gap: 6%;
  }
}

@media (max-width: 1024px) and (min-width: 768px) {
  .or-header__navwrap {
    width: 85%;
  }
}

@media (max-width: 767px) {
  .or-header__navwrap {
    width: 50%;
  }
}

/* ---- Il widget del menu -------------------------------------------------
   L'inversione colpisce TUTTO il widget: voci, burger e tendina. Ed e'
   istantanea: la sorgente dichiara una transition solo sul pittogramma,
   mai qui. Metterci "filter 0.5s" sarebbe piu' morbido e sbagliato. */

.or-nav {
  position: relative;
  width: auto;
  display: flex;
  flex-direction: column;
}

.or-header:hover .or-nav,
.or-header:focus-within .or-nav {
  filter: invert(1);
}

/* ---- La lista ------------------------------------------------------------
   z-index 2 e il clearfix invisibile vengono dal CSS del widget: il primo
   tiene la lista sopra al pointer, il secondo e' un residuo storico che
   non si vede ma occupa una riga nel flusso. */

.or-nav__list {
  position: relative;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  margin: 0;
  padding: 0;
  list-style: none;
}

.or-nav__list::after {
  clear: both;
  content: " ";
  display: block;
  font: 0/0 serif;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}

.or-nav__item {
  position: relative;
  border-width: 0;
}

.or-nav__link {
  position: relative;
  display: flex;
  align-items: center;
  font-family: var(--or-font-menu);
  font-weight: 300;
  font-style: normal;
  text-decoration: none;
}

/* L'etichetta e' un elemento a se' perche' deve stare SOPRA il pointer.
   Nell'originale il pointer sta sotto grazie a z-index:-1; qui il rapporto
   e' rovesciato (0 sotto, 1 sopra) per non creare contesti di impilamento
   con indici negativi, che nell'editor coprono il contenuto. */
.or-nav__label {
  position: relative;
  z-index: 1;
}

/* --------------------------------------------------------------------------
   4. Menu orizzontale, da 1025px in su
   Sotto i 1025 il menu orizzontale sparisce e comanda il burger: e' la
   classe --dropdown-tablet del widget, non il breakpoint mobile.
   -------------------------------------------------------------------------- */

@media (min-width: 1025px) {
  .or-nav__item {
    display: flex;
  }

  .or-nav__link {
    flex-grow: 1;
    white-space: nowrap;
    padding: 4px 10px;
    font-size: 16px;
    line-height: 24px;
    letter-spacing: -0.45px;
    text-transform: capitalize;
    color: var(--or-nero);
    fill: var(--or-nero);
    /* Shorthand nudo: durata 0.4s su tutte le proprieta', easing ease.
       E' quello che scrive il widget, non un "color 0.3s" ridotto. */
    transition: 0.4s;
  }

  /* 20px per lato, quindi 40px fra due voci e zero ai bordi. Tenere i due
     margini invece di un gap unico e' l'unico modo per avere lo stesso
     comportamento sull'ultima riga quando la lista va a capo. */
  .or-nav__list > .or-nav__item:not(:first-child) > .or-nav__link {
    margin-inline-start: 20px;
  }

  .or-nav__list > .or-nav__item:not(:last-child) > .or-nav__link {
    margin-inline-end: 20px;
  }

  /* Pointer "background" con animazione sweep-right: un rettangolo nero
     ancorato al bordo sinistro che cresce verso destra (right: 100% -> 0)
     mentre sfuma da 0 a 1. Non e' uno scaleX: la larghezza cresce davvero,
     e la differenza si vede sui bordi. */
  .or-nav__link::before {
    content: "";
    display: block;
    position: absolute;
    top: 0;
    right: 100%;
    bottom: 0;
    left: 0;
    z-index: 0;
    background-color: var(--or-nero);
    opacity: 0;
    transition: 0.3s;
  }

  .or-nav__link:hover,
  .or-nav__link:focus {
    color: var(--or-bianco);
  }

  .or-nav__link:hover::before,
  .or-nav__link:focus::before {
    right: 0;
    opacity: 1;
    transform: scale(1);
  }

  /* La voce attiva resta nera anche in hover, e il suo pointer e'
     trasparente. Nella sorgente e' l'effetto di due regole con la stessa
     specificita' in cui vince l'ultima: qui basta l'ordine.
     aria-current copre sia "page" (pagina corrente) sia "location" (l'ancora
     ai progetti, marcata dall'osservatore). */
  .or-nav__link[aria-current] {
    color: var(--or-nero);
  }

  .or-nav__link[aria-current]::before {
    background-color: #00000000;
  }
}

/* --------------------------------------------------------------------------
   5. Burger e tendina, fino a 1024px
   -------------------------------------------------------------------------- */

/* Il burger sta nel DOM a ogni larghezza, ma da 1025 in su e' il widget
   stesso a nasconderlo: si accende solo dove il menu orizzontale si spegne.
   Tenerlo qui a display:none, e accenderlo nella media query, evita che una
   regola successiva lo rimetta in piedi sul desktop. */
.or-nav__toggle {
  display: none;
  align-items: center;
  justify-content: center;
  margin-left: auto;
  padding: 0.25em;
  font-size: 22px;
  cursor: pointer;
  color: var(--or-nero);
  background-color: #ffffff00;
  border: 0 solid currentColor;
  border-radius: 0px;
}

/* In hover il burger non cambia: nella sorgente la regola di gruppo che lo
   sbiancherebbe perde contro una piu' specifica che lo tiene nero. */

.or-nav__toggle svg {
  width: 1em;
  height: auto;
  fill: var(--or-nero);
}

.or-nav__toggle .or-nav__icon--close {
  display: none;
}

.or-nav__toggle[aria-expanded="true"] .or-nav__icon--open {
  display: none;
}

.or-nav__toggle[aria-expanded="true"] .or-nav__icon--close {
  display: block;
}

@media (max-width: 1024px) {
  /* Bordo da 1px solo qui: sopra e sotto e' 0. Colore e stile non sono
     dichiarati, arrivano dai default (solid, currentColor = nero). */
  .or-nav__toggle {
    display: flex;
    border-width: 1px;
  }

  /* La tendina apre con max-height + scaleY, non con display. La differenza
     conta: display non si anima e fa comparire il menu di scatto.
     top lo riscrive il JS con l'altezza reale del bottone, e la larghezza
     viene stirata a tutta la pagina (full_width: stretch). */
  .or-nav__container {
    position: absolute;
    top: 100%;
    left: 0;
    width: 100%;
    z-index: 9997;
    margin-top: 22px;
    background-color: var(--or-bianco);
    font-size: 13px;
    overflow-x: hidden;
    overflow-y: auto;
    transform-origin: top;
    transition: max-height 0.3s, transform 0.3s;

    /* Stato chiuso. */
    max-height: 0;
    overflow: hidden;
    transform: scaleY(0);
  }

  .or-nav[data-or-open="true"] .or-nav__container {
    /* --or-menu-height la scrive il JS: 1000vmax all'apertura, 0 alla
       chiusura. Il 100vh e' solo il valore di partenza del CSS. */
    max-height: var(--or-menu-height, 100vh);
    transform: scaleY(1);
    overflow-y: auto;
    animation: or-hide-scroll 0.3s backwards;
  }

  .or-nav__list {
    flex-direction: column;
    flex-wrap: nowrap;
  }

  .or-nav__item {
    display: block;
  }

  /* Tipografia della tendina: diversa da quella del menu orizzontale.
     Maiuscolo e crenatura positiva, non "capitalize" con crenatura negativa.
     line-height 20px non e' una scelta: e' il default del widget, perche' il
     tema non ne dichiara una per la tendina. */
  .or-nav__link {
    justify-content: center;
    padding: 10px 20px;
    font-size: 14px;
    line-height: 20px;
    letter-spacing: 1.53px;
    text-transform: uppercase;
    color: #33373d;
  }

  /* Nessuna transizione qui: la regola .4s del widget richiede l'antenato
     del menu principale, che la tendina non ha. Il cambio e' istantaneo. */
  .or-nav__link:hover,
  .or-nav__link:focus,
  .or-nav__link[aria-current] {
    color: var(--or-bianco);
    background-color: var(--or-nero);
  }
}

/* Il bordo torna a zero sul telefono: e' un valore dichiarato apposta nella
   sorgente, non un'omissione. Il burger sta a 1px solo sul tablet. */
@media (max-width: 767px) {
  .or-nav__toggle {
    border-width: 0px;
  }
}

@keyframes or-hide-scroll {
  0%,
  to {
    overflow: hidden;
  }
}

/* --------------------------------------------------------------------------
   6. La blackbar
   Figlia della barra: e' per questo che tenerci sopra il mouse non la
   chiude. Nessun z-index proprio (nella sorgente e' "revert"): vive dentro
   il contesto della barra, che sta a 95.
   Il gap da 20px non e' decorativo: con lo space-between si vede solo quando
   i due titoli si toccano, cioe' sulla pagina dal titolo lungo.
   -------------------------------------------------------------------------- */

.or-blackbar {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  min-height: var(--or-header-h);
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: flex-start;
  gap: 20px 20px;
  padding: 0px;
  background-color: var(--or-nero);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.5s ease, visibility 0.5s ease;
}

.or-header:hover .or-blackbar,
.or-header:focus-within .or-blackbar {
  opacity: 1;
  visibility: visible;
}

/* Nella sorgente sono due widget, ciascuno col suo contenitore che porta i
   margini. Qui i due livelli sono fusi in uno: stessi valori, un nodo in
   meno. Il margine sinistro da 70px sulla destra e' voluto, non un refuso. */
.or-blackbar__page {
  margin: 10px 0px 0px 55px;
}

.or-blackbar__brand {
  margin: 10px 55px 0px 70px;
  text-align: right;
}

.or-blackbar__title {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-helvetica);
  font-size: 20px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-bianco);
  -webkit-text-stroke-color: var(--or-bianco);
  stroke: var(--or-bianco);
}

.or-blackbar__title--brand {
  font-weight: 400;
}

/* Da 1024 in giu' la striscia non esiste (elementor-hidden-tablet e
   -mobile). Le due regole di corpo qui sotto sono nella sorgente ma non si
   vedranno mai: le riporto perche' ci sono, non perche' servano. */
@media (max-width: 1024px) {
  .or-blackbar {
    display: none;
  }

  .or-blackbar__title {
    font-size: 45px;
  }
}

@media (max-width: 767px) {
  .or-blackbar__title {
    font-size: 28px;
    line-height: 1.1em;
  }
}

/* --------------------------------------------------------------------------
   7. Le due strisce sfocate
   Sorelle della barra, non figlie, e sotto di lei (94 contro 95). Sono
   vuote: servono solo a sfocare quello che ci passa dietro.
   La prima sfoca di 5px e resta piena fino a meta' altezza, la seconda di
   2px fino a tre quarti. Essendo successive nel DOM con lo stesso z-index,
   la seconda dipinge sopra la prima.

   La maschera va dichiarata DUE volte: -webkit- (come nella sorgente) e
   senza prefisso. Prima c'erano solo le forme -webkit-, per fedelta' alla
   sorgente: ma dove l'alias -webkit-mask-image non esiste (Firefox, e i
   browser mobili che non sono WebKit ne' Blink) la maschera non si applica
   affatto e la sfocatura diventa un blocco netto alto 80px, col taglio
   orizzontale bene in vista. Riprodurre quel difetto non e' fedelta', e'
   solo un header rotto per una fetta di visitatori: la forma standard
   resta, e dove il -webkit- gia' funzionava non cambia niente.
   -------------------------------------------------------------------------- */

.or-blur {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  min-height: var(--or-header-h);
  display: flex;
  flex-direction: column;
  margin-left: auto;
  margin-right: auto;
  padding: 0px;
  z-index: 94;
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-size: cover;
  mask-repeat: no-repeat;
  mask-size: cover;
}

.or-blur__inner {
  margin: 0 auto;
  max-width: 100%;
  width: 100%;
  padding-inline: 0;
}

@media (max-width: 767px) {
  .or-blur__inner {
    max-width: min(100%, 767px);
  }
}

.or-blur--strong {
  -webkit-backdrop-filter: blur(5px);
  backdrop-filter: blur(5px);
  -webkit-mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 1) 0%,
    rgba(0, 0, 0, 1) 50%,
    rgba(0, 0, 0, 0) 100%
  );
  mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 1) 0%,
    rgba(0, 0, 0, 1) 50%,
    rgba(0, 0, 0, 0) 100%
  );
}

.or-blur--soft {
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  -webkit-mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 1) 0%,
    rgba(0, 0, 0, 1) 75%,
    rgba(0, 0, 0, 0) 100%
  );
  mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 1) 0%,
    rgba(0, 0, 0, 1) 75%,
    rgba(0, 0, 0, 0) 100%
  );
}

/* --------------------------------------------------------------------------
   8. Chi non vuole movimento
   Gli stati restano tutti: la barra diventa nera, il logotipo compare, la
   blackbar sale, la tendina si apre. Solo, ci arrivano subito. Togliere gli
   stati invece delle transizioni renderebbe il sito meno usabile, non piu'.
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
  .or-header,
  .or-header__logo,
  .or-header__wordmark,
  .or-header:hover .or-header__wordmark,
  .or-header:focus-within .or-header__wordmark,
  .or-nav__link,
  .or-nav__link::before,
  .or-nav__container,
  .or-blackbar {
    transition: none;
  }

  .or-nav[data-or-open="true"] .or-nav__container {
    animation: none;
  }
}

/* ==========================================================================
   PIEDE E FIRMA ANIMATA
   ========================================================================== */

/* ==========================================================================
   PIEDE
   Tre fasce sorelle nell'originale (`data-elementor-id=567`): la fascia
   scura con i marchi e i due elenchi, la striscia grigia della firma, e
   una terza fascia vuota alta 0px che qui non viene ricostruita perche'
   non produce nulla di visibile (rilievo, sez. 4).

   Ogni valore viene da `orca/css/fresh/post-567.css`: la parte generata
   da Elementor per i selettori `.elementor-567 .elementor-element-*`, e
   il blocco `/* Start custom CSS *\/` per la firma. Dove la geometria
   nasce da una meccanica di `frontend.min.css` (flex 0 1 auto dei
   container, min-width 0, gap del kit) la meccanica e' riportata come
   proprieta' vera, altrimenti le larghezze rese non tornerebbero.

   Verifica aritmetica dell'impianto, a 1440px: 32 (padding sopra)
   + 71,8 (riga dei marchi) + 20 (gap del kit) + 177 (blocco societa')
   + 48 (padding sotto) = 348,8px, cioe' l'altezza misurata della fascia.
   A 1000px: 32 + 60,1 + 20 + 993 + 48 = 1153,1px, di nuovo la misura.
   Le due somme chiudono solo con il gap a 20px e con il padding sopra
   l'indirizzo pari a 12px: vedi la nota su `.or-footer__address`.

   Il fondo NON e' nero: e' #1D1D1D, e la striscia della firma e'
   #444444. Il nero puro nel piede non compare mai.
   ========================================================================== */

/* Chiusura dei float del template builder:
   `.elementor-location-footer:before{content:"";display:table;clear:both}`.
   Nessun float nella nostra ricostruzione, ma e' una regola vera della
   sorgente e non costa nulla. Niente z-index e niente isolation: e'
   deliberato, un contesto di impilamento qui manderebbe l'evidenziatore
   dell'editor sopra al contenuto. */
.or-footer::before {
  content: "";
  display: table;
  clear: both;
}

/* --------------------------------------------------------------------------
   FASCIA 1 - contenitore esterno (`.elementor-element-5b83147`)
   In un container "boxed" di Elementor il padding orizzontale sta fuori
   (`.e-con`) e quello verticale sta dentro (`.e-con-inner`): non e' un
   vezzo, e' cio' che tiene il fondo scuro largo quanto la finestra
   mentre il contenuto resta centrato a 1140px.
   -------------------------------------------------------------------------- */
.or-footer__band {
  display: flex;
  /* `.e-con-boxed.e-flex` e' sempre colonna e nowrap: il flex vero sta
     nell'inner. Se qui mettessimo `row` le due colonne cambierebbero
     padre e la centratura salterebbe. */
  flex-direction: column;
  flex-wrap: nowrap;
  align-content: normal;
  align-items: normal;
  justify-content: normal;
  /* `.e-con{position:relative;min-width:0;width:var(--width)}` */
  position: relative;
  min-width: 0;
  width: 100%;
  padding-left: 10em; /* --padding-left:10em = 160px */
  padding-right: 0em;
  background-color: #1d1d1d;
}

/* `.e-con>.e-con-inner`: larghezza piena fino a --content-width, centrato,
   e il padding verticale della fascia. `flex-grow:1` perche' l'inner e'
   l'unico figlio di un flex column: senza, la fascia della firma (che ha
   min-height) non centrerebbe il suo contenuto. */
.or-footer__band-inner {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-content: normal;
  align-items: normal;
  justify-content: normal;
  flex: 1 1 auto;
  height: 100%; /* `.e-con>.e-con-inner{height:100%}` */
  gap: 20px 20px; /* --widgets-spacing del kit, mai sovrascritto qui */
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin: 0 auto;
  padding-block: 2em 3em; /* 32px sopra, 48px sotto */
  padding-inline: 0;
}

/* --------------------------------------------------------------------------
   FASCIA 1 - colonna sinistra (`.elementor-element-3943b34`)
   45% dichiarato e 100% dichiarato sulla colonna destra: sommati fanno
   145%, e siccome i container sono `flex: 0 1 auto` con `min-width: 0` si
   riducono in proporzione dentro i 1140px meno i 20px di gap. E' da qui
   che escono i 347,59px e i 772,41px misurati, non da un 40/60 a occhio.
   -------------------------------------------------------------------------- */
.or-footer__left {
  display: flex;
  flex-direction: column;
  flex: 0 1 auto;
  min-width: 0;
  position: relative;
  width: 100%;
  gap: 20px 20px; /* non dichiarato sul container: resta quello del kit */
  padding: 0;
}

/* Il 45% vive solo da 768px in su: sotto quella soglia Elementor
   riporta `--width` a 100% e le due colonne si impilano. */
@media (min-width: 768px) {
  .or-footer__left {
    width: 45%;
  }
}

/* Riga dei due marchi (`.elementor-element-3f4e8af`): affiancati, non
   impilati, centrati sull'asse verticale e senza gap. */
.or-footer__marks {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: center;
  flex: 0 1 auto;
  min-width: 0;
  position: relative;
  width: 100%;
  gap: 0px 0px;
  padding: 2em 0em 0em 0em; /* 32px sopra */
}

/* I due widget immagine. `min-width:0` e `max-width:100%` sono le regole
   di frontend.min.css che permettono ai widget di scendere sotto la
   larghezza intrinseca dell'immagine: senza, i due marchi sfonderebbero
   la colonna invece di dividersela. */
.or-footer__mark {
  min-width: 0;
  max-width: 100%;
}

.or-footer__mark--pictogram {
  text-align: right;
}

.or-footer__mark--wordmark {
  text-align: left;
}

/* Il padding del pittogramma DEVE stare sul contenitore interno, non sul
   widget: e' un dettaglio che cambia i numeri. Con il padding sul widget
   (flex item) i 16px restano fuori dalla base flessibile e i due marchi
   si dividono lo spazio in parti uguali (181,8 e 165,79 misurati). Con il
   padding dentro, la base diventa 1096 contro 1080 e la riduzione
   proporzionale da' 175,07 e 172,52, che sono le misure vere del sito. */
.or-footer__mark--pictogram .or-footer__mark-box {
  padding: 0em 1em 0em 0em;
}

/* `.elementor-widget-image img{display:inline-block;vertical-align:middle}`.
   L'inline-block non e' decorativo: e' cio' che fa reagire l'immagine a
   `text-align` e che spiega perche' il widget del logotipo e' alto 24,09px
   mentre l'immagine dentro ne misura 20,6 (spazio del rigo). */
.or-footer__mark-img {
  display: inline-block;
  vertical-align: middle;
  /* Del reset (`img{height:auto;max-width:100%}`): ripetuto perche' senza,
     le due max-width qui sotto schiaccerebbero le proporzioni. */
  height: auto;
}

/* Le percentuali si risolvono sul box di contenuto del widget: 25% di
   (175,07 - 16) = 39,77px, 75% di 172,52 = 129,38px. Sono le misure vere
   del sito, non due larghezze in pixel scelte a mano. */
.or-footer__mark--pictogram .or-footer__mark-img {
  max-width: 25%;
}

.or-footer__mark--wordmark .or-footer__mark-img {
  max-width: 75%;
}

/* Blocco societa' (`.elementor-element-62514e9`). Il rientro di 8em e'
   voluto: il testo parte 128px piu' a destra dei marchi. */
.or-footer__company {
  display: flex;
  flex-direction: column;
  flex: 0 1 auto;
  min-width: 0;
  position: relative;
  width: 100%;
  gap: 0px 0px;
  padding: 0em 0em 3em 8em;
}

/* Ragione sociale (`.elementor-element-d540300`). Helvetica, NON AZO: il
   piede sfugge del tutto alla tipografia globale del kit, che qui
   metterebbe AZO 65px. Margine e padding a zero come
   `.elementor-heading-title`, non come gli h1-h6 del tema. */
.or-footer__company-name {
  margin: 0;
  padding: 0;
  text-align: left;
  font-family: var(--or-font-helvetica);
  font-size: 27px;
  font-weight: 600;
  text-transform: none;
  font-style: normal;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -1.3px;
  color: #ffffff;
}

/* Dati della societa' (`.elementor-element-f5e7480`): 12px peso 300, il
   testo piu' piccolo del sito.
   Il padding e' scritto in em sul widget che porta anche la font-size,
   esattamente come nell'originale, dove sta sul figlio che quella
   font-size la eredita. Il valore in pixel NON va congelato: e' proprio
   l'em che a 1024px fa esplodere il blocco (vedi il media query).
   Misurato sul sito vero: 12px a 1440, 14px a 500 (dove il testo e' 14px)
   e 45px a 1000. Il rilievo scrive "= sopra 16px a desktop": e' l'unico
   valore del documento che la sorgente smentisce, e non l'ho seguito. */
.or-footer__address {
  padding: 1em 0em 0em 0em;
  text-align: left;
  color: #c7c7c7;
  font-family: var(--or-font-helvetica);
  font-size: 12px;
  font-weight: 300;
  text-transform: none;
  font-style: normal;
  text-decoration: none;
  line-height: 1.5em;
  letter-spacing: 0px;
}

/* Un solo paragrafo con gli a capo dentro: `p{margin-bottom:0}`. */
.or-footer__address-text {
  margin-bottom: 0;
}

/* --------------------------------------------------------------------------
   FASCIA 1 - colonna destra (`.elementor-element-4cacf36`)
   -------------------------------------------------------------------------- */
.or-footer__right {
  display: flex;
  flex-direction: column;
  flex: 0 1 auto;
  min-width: 0;
  position: relative;
  width: 100%;
  gap: 0px 0px;
  padding: 2em 0em 0em 0em;
}

/* Riga delle due colonne di link (`.elementor-element-538b695`).
   Il gap e' scritto `00px 50px` nel sorgente: lo zero davanti e' un
   refuso dell'editor, ma e' CSS valido e viene riportato com'e' per non
   perdere la tracciabilita' del valore. */
.or-footer__linkrow {
  display: flex;
  flex-direction: row;
  flex-wrap: nowrap;
  align-items: flex-start;
  flex: 0 1 auto;
  min-width: 0;
  position: relative;
  width: 100%;
  gap: 00px 50px;
  margin: 0px;
  padding: 0px;
}

/* I due widget sitemap. Larghezza da contenuto (`flex: 0 1 auto`) con
   `min-width: 0`: e' la ragione per cui la colonna dei progetti puo'
   restringersi sotto la larghezza dei suoi titoli. */
.or-footer__sitemap {
  flex: 0 1 auto;
  min-width: 0;
  max-width: 100%;
}

/* `.projects-footer{overflow:hidden}` del CSS scritto a mano dal cliente:
   serve a nascondere lo sbordo di 12em qui sotto. */
.or-footer__sitemap--projects {
  overflow: hidden;
}

/* Il contenitore interno del widget esiste su entrambe le colonne, ma
   solo quella dei progetti porta il margine negativo: il box sborda di
   192px a destra per dare respiro ai titoli lunghi, e l'overflow del
   widget impedisce la barra di scorrimento. A desktop e a 1024px non
   taglia niente; sotto i 768px taglia davvero, senza puntini, ed e' cosi'
   anche sull'originale. */
.or-footer__sitemap--projects .or-footer__sitemap-box {
  margin: 0em -12em 0em 0em;
  padding: 0em 0em 0em 0em;
}

/* `.elementor-sitemap-wrap` del widget sitemap di Elementor Pro. */
.or-footer__sitemap-wrap {
  display: flex;
  flex-flow: row wrap;
}

/* `flex-basis` scritto come frazione dal generatore: 1/1 per la prima
   colonna, 1/2 per quella dei progetti (che quindi occupa meta' del suo
   box da 487,52px, cioe' 243,76px). Le due regole hanno la stessa
   specificita' delle loro varianti nei media query, altrimenti la
   modifica per tablet non passerebbe. */
.or-footer__sitemap--site .or-footer__sitemap-section {
  flex-basis: calc(1 / 1 * 100%);
}

.or-footer__sitemap--projects .or-footer__sitemap-section {
  flex-basis: calc(1 / 2 * 100%);
}

/* Titolo di colonna: Helvetica 30px, di nuovo non AZO. I margini sono
   quelli degli h1-h6 del tema (0,5rem sopra, 1rem sotto), non quelli
   azzerati dei widget heading: qui il titolo e' un `<h2>` vero dentro il
   widget sitemap, che non azzera niente. */
.or-footer__sitemap-title {
  margin-block: 0.5rem 1rem;
  font-family: var(--or-font-helvetica);
  font-size: 30px;
  font-weight: 600;
  text-transform: none;
  font-style: normal;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -1.3px;
  color: #ffffff;
}

/* Il pallino c'e'. `list-style-type: disc` e' dichiarato esplicitamente e
   il rientro di 40px e' il default del browser che nessuno azzera: le
   voci del piede sono un elenco puntato rientrato, non una lista pulita.
   Il tentativo precedente le aveva "ripulite", ed era una scelta di gusto
   applicata sopra una sorgente che dice il contrario. */
.or-footer__sitemap-list {
  margin-block: 0;
  margin-left: 0px;
  padding-inline-start: 40px;
  list-style-type: disc;
}

.or-footer__sitemap-item {
  margin: 0;
}

.or-footer__sitemap-item,
.or-footer__sitemap-item a {
  color: #c7c7c7;
  font-family: var(--or-font-helvetica);
  font-size: 13px;
  font-weight: 300;
  text-transform: none;
  font-style: normal;
  text-decoration: none;
  line-height: 1.5em;
  letter-spacing: 0px;
}

/* I link del piede non reagiscono al mouse. Non e' un'assenza di regole:
   nella cascata originale `a:active,a:hover{color:#336}` del tema esiste
   e perde per specificita'. Qui la neutralizzazione e' esplicita, cosi'
   il comportamento resta quello anche se domani la base cambia. */
.or-footer__sitemap-item a:hover,
.or-footer__sitemap-item a:active {
  color: #c7c7c7;
  text-decoration: none;
}

/* --------------------------------------------------------------------------
   FASCIA 2 - la striscia della firma (`.elementor-element-eea4ded`)
   -------------------------------------------------------------------------- */
.or-footer__signband {
  display: flex;
  flex-direction: column;
  flex-wrap: nowrap;
  align-content: normal;
  align-items: normal;
  justify-content: normal;
  position: relative;
  min-width: 0;
  width: 100%;
  min-height: 40px;
  margin: 0px;
  padding: 0px;
  background-color: #444444;
}

/* L'inner e' largo 500px da 768px in su, e sotto torna alla larghezza del
   contenuto (cioe' tutta la finestra). `flex: 1 1 auto` piu'
   `justify-content: center` sono cio' che centra la firma nei 40px. */
.or-footer__signband-inner {
  display: flex;
  flex-direction: column;
  justify-content: center;
  flex: 1 1 auto;
  height: 100%;
  gap: 20px 20px;
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin: 0 auto;
  padding-block: 0; /* --padding-top/bottom:0px di eea4ded */
  padding-inline: 0; /* `.e-con>.e-con-inner{padding-inline:0}` */
}

@media (min-width: 768px) {
  .or-footer__signband-inner {
    max-width: 500px; /* --content-width:500px */
  }
}

/* `.footer-content`: nel sorgente la larghezza e' dichiarata due volte
   nello stesso blocco (500px e poi auto) e vince `auto`, quindi la
   striscia si prende i 500px dell'inner per via dell'align-self stretch
   del widget. E' importante: l'area sensibile al mouse e' TUTTA la
   striscia da 500px, non il segno da 20px. Chi passa il mouse a 200px di
   distanza attiva comunque l'animazione, ed e' la cosa che il primo
   tentativo aveva perso legando l'hover al solo link. */
.or-footer__sign {
  align-self: stretch;
  flex: 0 1 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  width: auto;
}

/* Nell'originale i tre `img` sono cliccabili uno per uno via JS, mentre la
   striscia intorno non lo e'. Qui l'ancora avvolge solo le tre immagini
   (le due scritte restano fuori flusso, quindi il link resta largo quanto
   il segno) e riproduce la stessa area di click, ma raggiungibile da
   tastiera: nell'originale la firma non lo era affatto.
   L'ancora deve restare `static`, altrimenti le due scritte assolute si
   posizionerebbero su di lei invece che sulla striscia. */
.or-footer__sign-link {
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Il segno che gira. `z-index: 2` serve perche' a riposo le due scritte
   invisibili gli passano sopra (il logotipo parte a 723px mentre il segno
   occupa 710-730). Nell'originale bastava lo z-index sul flex item; qui
   l'immagine e' dentro l'ancora, quindi le serve anche `position:
   relative` per stare sopra ai due fratelli assoluti. Stesso risultato,
   z-index positivo, nessun contesto di impilamento inventato. */
.or-footer__sign-mark {
  position: relative;
  z-index: 2;
  width: 20px;
  height: auto;
  cursor: pointer;
  transition: transform 0.5s ease-in-out;
}

/* Le due scritte partono INVISIBILI: a riposo la firma mostra solo il
   segno da 20px. Restano cliccabili anche da invisibili, come
   nell'originale, perche' opacity 0 non toglie i click. */
.or-footer__sign-wordmark,
.or-footer__sign-claim {
  position: absolute;
  width: 100px;
  opacity: 0;
  transform: translateX(0);
  transition: transform 0.5s ease, opacity 0.5s ease;
}

/* I 3px sono nel sorgente col commento "Sposta leggermente per centrare". */
.or-footer__sign-wordmark {
  left: 50%;
  margin-left: 3px;
}

.or-footer__sign-claim {
  right: 50%;
  margin-right: 3px;
}

/* Hover sulla striscia: giro completo del segno, le due scritte compaiono
   e si allontanano di 10px in direzioni opposte. */
.or-footer__sign:hover .or-footer__sign-mark,
.or-footer__sign:focus-within .or-footer__sign-mark {
  transform: rotate(360deg);
}

.or-footer__sign:hover .or-footer__sign-wordmark,
.or-footer__sign:focus-within .or-footer__sign-wordmark {
  opacity: 1;
  transform: translateX(10px);
}

.or-footer__sign:hover .or-footer__sign-claim,
.or-footer__sign:focus-within .or-footer__sign-claim {
  opacity: 1;
  transform: translateX(-10px);
}

/* Il ritorno cambia SOLO la curva: `ease` andando, `ease-in-out`
   tornando, mezzo secondo in entrambi i versi. E' l'unico scopo del
   blocco "ANIMAZIONE INVERSA" del cliente, e sparisce se si scrive una
   sola transizione. */
.or-footer__sign:not(:hover):not(:focus-within) .or-footer__sign-wordmark,
.or-footer__sign:not(:hover):not(:focus-within) .or-footer__sign-claim {
  transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
}

/* Chi non vuole movimento vede comunque la firma completa al passaggio
   del mouse: cambia solo l'opacita', senza giro e senza scorrimenti. */
@media (prefers-reduced-motion: reduce) {
  .or-footer__sign-mark,
  .or-footer__sign-wordmark,
  .or-footer__sign-claim,
  .or-footer__sign:not(:hover):not(:focus-within) .or-footer__sign-wordmark,
  .or-footer__sign:not(:hover):not(:focus-within) .or-footer__sign-claim {
    transition: none;
  }

  .or-footer__sign:hover .or-footer__sign-mark,
  .or-footer__sign:focus-within .or-footer__sign-mark,
  .or-footer__sign:hover .or-footer__sign-wordmark,
  .or-footer__sign:focus-within .or-footer__sign-wordmark,
  .or-footer__sign:hover .or-footer__sign-claim,
  .or-footer__sign:focus-within .or-footer__sign-claim {
    transform: none;
  }
}

/* ==========================================================================
   TABLET - @media (max-width: 1024px)
   ATTENZIONE: il 45px sull'indirizzo non e' un errore di trascrizione. E'
   nel CSS compilato del sito: il cliente ha impostato per sbaglio il
   valore tablet del text-editor uguale a quello dei titoli. Effetto
   misurato a 1000px: il blocco societa' diventa alto 993px e la fascia
   passa da 348,8px a 1153,1px. E' riportato com'e' perche' questa e' una
   copia del sito, non una sua correzione: va segnalato al cliente, non
   aggiustato in silenzio.
   ========================================================================== */
@media (max-width: 1024px) {
  .or-footer__company-name {
    font-size: 45px;
  }

  .or-footer__address {
    font-size: 45px;
  }

  .or-footer__sitemap--site .or-footer__sitemap-section,
  .or-footer__sitemap--projects .or-footer__sitemap-section {
    flex-basis: calc(1 / 2 * 100%);
  }

  .or-footer__sitemap-title {
    font-size: 45px;
  }

  .or-footer__sitemap-item,
  .or-footer__sitemap-item a {
    font-size: 14px;
  }
}

/* ==========================================================================
   MOBILE - @media (max-width: 767px)
   767 e non 768: e' il breakpoint vero di Elementor, che genera tutte le
   regole responsive del piede. Nel CSS scritto a mano dal cliente per
   l'header compare invece 768px, e a 768px esatti i due si contraddicono:
   nel piede il caso non si presenta perche' qui non c'e' CSS a mano con
   media query.
   A questa soglia Elementor riporta `--width` a 100% su tutti i container
   flex e attiva `--flex-wrap-mobile: wrap`: e' cosi' che le colonne si
   impilano, senza nessun `flex-direction: column` scritto a mano.
   ========================================================================== */
@media (max-width: 767px) {
  .or-footer__band {
    padding-left: 0em;
    padding-right: 0em;
  }

  .or-footer__band-inner {
    flex-wrap: wrap;
    padding-block: 3em 1em; /* 48px sopra, 16px sotto */
  }

  .or-footer__left,
  .or-footer__marks,
  .or-footer__company,
  .or-footer__right,
  .or-footer__linkrow {
    flex-wrap: wrap;
  }

  /* I marchi si centrano e cambiano scala: 16% e 43%, cioe' 77,4px e
     215px su una finestra da 500px. */
  .or-footer__mark--pictogram,
  .or-footer__mark--wordmark {
    text-align: center;
  }

  .or-footer__mark--pictogram .or-footer__mark-img {
    max-width: 16%;
  }

  .or-footer__mark--wordmark .or-footer__mark-img {
    max-width: 43%;
  }

  .or-footer__company {
    padding: 2em 2em 0em 2em;
  }

  .or-footer__company-name {
    font-size: 28px;
    line-height: 1.1em;
  }

  .or-footer__address {
    font-size: 14px;
    line-height: 1.1em;
  }

  .or-footer__right {
    padding: 2em 2em 4em 2em;
  }

  /* La riga dei link resta `row`: sono i due widget a diventare
     `flex: 1 0 auto` con la sezione a larghezza piena, quindi vanno a
     capo per wrap. Scrivere `column` qui sembrerebbe uguale ma cambia
     come si comportano quando i titoli sono corti. */
  .or-footer__linkrow {
    flex-direction: row;
    justify-content: flex-start;
    flex: 1 0 auto;
  }

  .or-footer__sitemap {
    flex: 1 0 auto;
  }

  .or-footer__sitemap--site .or-footer__sitemap-section,
  .or-footer__sitemap--projects .or-footer__sitemap-section {
    flex-basis: calc(1 / 1 * 100%);
  }

  .or-footer__sitemap-title {
    font-size: 28px;
    line-height: 1.1em;
  }

  /* Anche la striscia della firma dichiara --flex-wrap-mobile:wrap, quindi
     sotto i 768px il suo inner passa a wrap come quello della fascia grande.
     Con un figlio solo e la direzione a colonna non si vede niente, ma la
     meccanica e' quella. */
  .or-footer__signband-inner {
    flex-wrap: wrap;
  }
}

/* ==========================================================================
   TITOLO DI SEZIONE E CAROSELLO DELLE LOCANDINE
   ========================================================================== */

/* ==========================================================================
   CAROSELLO DELLE LOCANDINE + TITOLO DI SEZIONE
   Frammento del solo componente "carosello". Colori, font e larghezza del
   contenuto arrivano da 00-base.css: qui non si ridefinisce nulla di quello.

   Ogni valore viene da rilievo/carosello.md. Le due sorgenti principali sono
   il <style id="loop-366"> stampato dentro il <body> (la scheda) e
   post-60.css (la fascia e il widget). Dove il rilievo distingue la home
   dalle altre cinque pagine (§1.1) qui ci sono due varianti, non una media
   fra le due.

   Nota sull'editor della console: niente "isolation:isolate" e nessuno
   z-index negativo. Il velo scuro e' un elemento vero (.or-carousel-veil)
   con z-index 1, e il contenuto sta a z-index 2. Con lo pseudo-elemento a
   z-index -1 del primo tentativo l'evidenziatore dell'editor finiva sopra
   al contenuto e il blocco si vedeva come un rettangolo pieno.
   ========================================================================== */

/* ==========================================================================
   TITOLO DI SEZIONE
   Due istanze reali, con numeri diversi:
   - home, container 63719f6 + widget d1c6546 (post-60.css): fascia 7em/3em,
     titolo rientrato di 4.5em a sinistra;
   - pagine film e about, container 32e11204 + titolo 22058dbe
     (rilievo/film.md §5-bis.2 e §5-bis.3): fascia 5em/2em, titolo centrato
     e senza rientro.
   La tipografia (AZO 65/45/28, 600, 1.2em -> 1.1em, letter-spacing 0,
   colore nero) e' gia' in .or-display: qui si tocca solo la geometria.
   ========================================================================== */

.or-section-heading {
  /* --display:flex; --flex-direction:column; margini a zero: sono le
     variabili del container, non una scelta di impaginazione. */
  display: flex;
  flex-direction: column;
  margin: 0;
  padding: 7em 0 3em;
}

/* Sulle pagine interne la fascia respira meno: 5em sopra, 2em sotto. */
.or-section-heading--interna {
  padding: 5em 0 2em;
}

/* Il rientro sta sul widget (.elementor-widget-container), non sul titolo:
   e' padding, non margin, quindi non collassa con niente. */
/* Scelta di Dario, non del sito originale: li' il titolo di sezione della
   home e' rientrato a sinistra di 4.5em e solo quello delle pagine interne
   e' centrato. Qui e' centrato sempre, su richiesta esplicita. */
.or-section-heading-inner {
  margin: 0;
  padding: 0 5%;
  text-align: center;
}

.or-section-heading--interna .or-section-heading-inner {
  padding: 0;
  text-align: center;
}

/* A telefono entrambe le istanze centrano e prendono il 5% per lato.
   Nel sorgente il valore e' scritto "0% 05% 00% 5%": sono percentuali,
   non em, quindi seguono la larghezza dello schermo. */
@media (max-width: 767px) {
  .or-section-heading-inner {
    padding: 0 5%;
    text-align: center;
  }
}

/* ==========================================================================
   LA FASCIA
   Nero pieno con sopra la foto dello spettro, e sopra ancora un velo nero
   al 62% sfocato di 10px. Il blur agisce sul rettangolo nero, non sulla
   foto: quello che si vede e' una fascia nera che sfuma sui quattro lati.
   ========================================================================== */

.or-carousel {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-self: center;

  background-color: var(--or-nero);
  background-image: var(--or-carousel-bg, none);
  background-size: cover;
  /* background-position, -repeat e -attachment NON sono dichiarati in
     post-60.css: restano ai default (0% 0%, repeat, scroll). Il primo
     tentativo ci aveva messo "center", che sposta lo spettro. */

  padding: 0;

  /* Misure del componente. Stanno qui e non in :root perche' sono di questo
     blocco: --swiper-slides-gap, --swiper-pagination-size, --arrow-size e i
     colori di default del widget loop-carousel. */
  --or-car-gap: 10px;
  --or-car-slides: 4;
  --or-car-dot: 6px;
  --or-car-arrow-size: 25px;
  --or-car-arrow-color: rgba(237, 237, 237, 0.9);
}

/* L'ombra c'e' SOLO in home. Sulle altre cinque istanze post-37 / post-249 /
   post-579 / post-621 / post-628 non dichiarano box-shadow: metterla ovunque
   e' l'errore #42 del rilievo. */
.or-carousel--home {
  box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.5);
}

/* Lazy-load dello sfondo. Nell'originale la fascia della home e' il quarto
   .e-con.e-parent, quindi la regola inline
   ".e-con.e-parent:nth-of-type(n+4):not(.e-lazyloaded)" le spegne il
   background-image con !important: al primo paint e' nero pieno e la foto
   compare solo quando la fascia entra nello schermo. L'attributo lo mette il
   JS, non il template: senza JS (o senza IntersectionObserver) la foto si
   vede subito, che e' il fallback giusto. */
.or-carousel[data-or-lazy-bg]:not(.is-lazyloaded) {
  background-image: none;
}

/* Il velo. Nel sorgente e' .e-con::before; qui e' un div perche' lo
   pseudo-elemento con z-index negativo rompeva l'editor. Il filter e'
   riportato per intero come nel sorgente: gli altri quattro valori sono
   neutri ma stanno li'. */
.or-carousel-veil {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
  display: block;
  background-color: var(--or-nero);
  opacity: 0.62;
  filter: brightness(100%) contrast(100%) saturate(100%) blur(10px)
    hue-rotate(0deg);
  border-radius: 0;
  mix-blend-mode: initial;
  transition: background 0.3s, border-radius 0.3s, opacity 0.3s;
}

/* ==========================================================================
   IL WIDGET
   E' l'elemento a cui sono agganciate frecce e pallini: nel sorgente le
   frecce sono fratelli dello .swiper dentro .elementor-widget-container, e
   left:0 / right:0 le porta ai bordi estremi della fascia (che non ha
   padding orizzontale). Quindi il riferimento e' questo box, non la pista.
   ========================================================================== */

.or-carousel-widget {
  position: relative;
  z-index: 2;
  width: 100%;
  height: -moz-fit-content;
  height: fit-content;
  padding: 3em 0 0 0;
}

/* Sulle pagine interne il widget parte 1em piu' in alto. */
.or-carousel--interna .or-carousel-widget {
  padding: 2em 0 0 0;
}

/* La pista. L'overflow:hidden non e' decorativo: e' quello che RITAGLIA
   l'alone bianco della locandina in hover sulla prima e sull'ultima scheda
   visibile. Toglierlo cambia l'effetto. I 16px sotto sono lo spazio dei
   pallini, calc(6px + 10px) nel sorgente. */
.or-carousel-track {
  position: relative;
  z-index: 1;
  margin-inline: auto;
  overflow: hidden;
  list-style: none;
  padding: 0 0 16px 0;
}

/* Il nastro delle schede. Nel sorgente lo spazio fra le slide e' un
   margin-right messo da Swiper; qui e' un gap sul contenitore, che da' la
   stessa geometria (10px fra due schede) senza dover scrivere stili inline
   su ogni slide. La transizione la accende il JS, che la spegne per il
   salto invisibile del ciclo infinito. */
.or-carousel-rail {
  position: relative;
  z-index: 1;
  display: flex;
  width: 100%;
  height: 100%;
  gap: var(--or-car-gap);
  box-sizing: content-box;
  transition-property: transform;
  transition-duration: 0ms;
  transition-timing-function: ease;
}

.or-carousel-rail.is-animating {
  transition-duration: 500ms;
}

/* Nell'originale qui c'e' width:100%, che e' il valore di .swiper-slide
   prima dell'init: finche' Swiper non misura si vede UNA locandina sola,
   perche' la regola che dovrebbe restringerle ha un refuso nel nome
   (swiper--slide, due trattini) e non aggancia niente.

   Qui NON lo riproduciamo, ed e' una deviazione voluta. Nell'anteprima
   dell'editor il JS del tema gira in modalita' "fotogramma statico" e la
   misura non avviene mai: senza ripiego si resterebbe per sempre a una
   locandina, che e' un difetto visibile, non una fedelta'. La larghezza
   viene quindi dalle stesse variabili gia' dichiarate per i breakpoint
   (--or-car-slides: 4 / 2 / 1), che prima non leggeva nessuno.
   Quando il JS c'e', sovrascrive con la larghezza in pixel e comanda lui. */
.or-carousel-slide {
  flex-shrink: 0;
  width: calc(
    (100% - (var(--or-car-slides, 1) - 1) * var(--or-car-gap)) /
      var(--or-car-slides, 1)
  );
  height: 100%;
  position: relative;
  transition-property: transform;
}

/* .e-loop-item *{word-break:break-word}: vale su ogni discendente della
   slide, titolo compreso, ed e' cio' che decide dove si spezza il titolo
   lungo di "Corpi di Porcellana...". */
.or-carousel-slide * {
  word-break: break-word;
}

/* ==========================================================================
   LA SCHEDA
   Il padding di 5em a destra e a sinistra e' la ragione per cui la locandina
   e' molto piu' piccola della sua slot: 80px + 80px sottratti a ogni scheda.
   Senza, il carosello sembra un altro componente.
   Il raggio di 35px non si vede (la scheda non ha ne' sfondo ne' bordo),
   ma e' dichiarato: se un domani si aggiunge uno sfondo, deve arrotondare.
   ========================================================================== */

.or-carousel-slide > .or-carousel-card {
  /* .swiper-slide > .elementor-element{height:100%}: le schede sono alte
     quanto la slide, non quanto il loro contenuto. */
  height: 100%;
}

.or-carousel-card {
  display: flex;
  flex-direction: column;
  gap: 0px 0px;
  align-self: center;
  border-radius: 35px 35px 35px 35px;
  padding: 2em 5em;
}

.or-carousel-card-inner {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  /* --content-width del container boxed: 1140 / 1024 / 767 secondo il
     breakpoint, gia' in --or-container. Su schermi normali non morde mai,
     ma su un monitor molto largo tiene la scheda dentro la sua misura. */
  max-width: min(100%, var(--or-container));
  display: flex;
  flex-direction: column;
  gap: 0px 0px;
  flex: 1 1 auto;
}

/* .projects-slider esiste solo per fare da ancora all'hover: il suo unico
   stile scritto a mano e' position:relative. L'overflow visibile e'
   dichiarato, non implicito: e' quello che lascia debordare la locandina
   ingrandita del 5%. */
.or-carousel-frame {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 0px 0px;
  width: 100%;
  overflow: visible;
}

.or-carousel-poster {
  text-align: center;
  padding: 0px;
}

.or-carousel-poster a {
  display: inline-block;
}

/* height:auto (dal reset della base) e' cio' che conserva il rapporto
   1700x2560 quando il bordo di 5px dell'hover mangia 10px di larghezza. */
.or-carousel-poster img {
  display: inline-block;
  vertical-align: middle;
  max-width: 100%;
}

/* ---- Il titolo della scheda -------------------------------------------
   Helvetica, non AZO: e' l'errore principale del primo tentativo. AZO nel
   carosello compare solo nel titolo di sezione sopra la fascia.
   E soprattutto: a riposo il titolo NON SI VEDE. La fascia mostra quattro
   locandine e basta; il titolo scende di 20px e appare solo passandoci
   sopra. Troncato a due righe con i puntini per il titolo lungo di
   "Corpi di Porcellana Abbandonati al Sole...". */

.or-carousel-title-slot {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
  visibility: hidden;
  opacity: 0;
  transform: translateY(-20px);
  transition: opacity 0.5s ease, transform 0.5s ease, visibility 0.5s ease;
  text-align: center;
}

/* :focus-within accanto a :hover non e' nel sorgente. Lo aggiungo perche'
   senza di esso chi naviga da tastiera arriva sul link della locandina e
   non vede mai il titolo del film: il contenuto sarebbe raggiungibile ma
   non leggibile. Non cambia nulla per chi usa il mouse. */
.or-carousel-frame:hover .or-carousel-title-slot,
.or-carousel-frame:focus-within .or-carousel-title-slot {
  visibility: visible;
  opacity: 1;
  transform: translateY(0);
}

/* Lo stacco fra locandina e titolo e' un margin sul contenitore del widget,
   non un padding sul testo: 35px, che a telefono scendono a 30px. */
.or-carousel-title-box {
  margin: 35px 0px 0px 0px;
}

.or-carousel-title {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-helvetica);
  font-size: 23px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -0.5px;
  color: var(--or-bianco);
}

/* ---- Hover sulla locandina --------------------------------------------
   La transizione e' dichiarata SOLO dentro la regola :hover, esattamente
   come nel CSS del cliente. Effetto: entrando l'animazione dura 0,3s,
   uscendo lo stile torna a posto di colpo. E' un errore di chi ha scritto
   l'originale, ma e' cio' che si vede sul sito.
   Il bordo di 5px sta sul div del widget, non sull'<img>: con box-sizing
   border-box si mangia 5px per lato mentre la locandina cresce del 5%.
   L'ombra e' BIANCA al 70%: su fondo scuro fa da alone. */
.or-carousel-frame:hover .or-carousel-poster,
.or-carousel-frame:focus-within .or-carousel-poster {
  transform: scale(1.05);
  box-shadow: 0 5px 20px rgba(255, 255, 255, 0.7);
  border: 5px solid white;
  transition: transform 0.3s ease, border 0.3s ease, box-shadow 0.3s ease;
}

/* ==========================================================================
   FRECCE
   Due chevron grigio chiarissimo di 25px appoggiati ai bordi estremi della
   fascia, alzati di 15px rispetto alla mezzeria. Niente sfondo, niente
   padding, e in hover NON cambiano colore: il colore hover del widget e'
   identico a quello di riposo.
   ========================================================================== */

.or-carousel-arrow {
  position: absolute;
  display: inline-flex;
  top: calc(50% - 15px);
  transform: translate(0px, -50%);
  z-index: 2;
  cursor: pointer;

  /* Reset del <button>: nel sorgente le frecce sono <div role="button">,
     qui sono bottoni veri per averli raggiungibili da tastiera senza
     riscrivere a mano il comportamento del tasto Invio. */
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  -webkit-appearance: none;
  appearance: none;

  color: var(--or-car-arrow-color);
  font-size: var(--or-car-arrow-size);
  transition-duration: 0.25s;
}

.or-carousel-arrow--prev {
  left: calc(0% + 0px);
}

.or-carousel-arrow--next {
  right: calc(0% + 0px);
}

/* L'icona misura 1em, quindi 25px: la dimensione la decide il font-size. */
.or-carousel-arrow svg {
  display: block;
  width: 1em;
  height: 1em;
  fill: currentColor;
}

/* ==========================================================================
   PALLINI
   Sei pixel, neri, opachi al 20%. Su fondo nero sono quasi invisibili: non
   e' un errore di trascrizione, e' cosi' nell'originale perche' il cliente
   non ha mai toccato --dots-normal-color. Il contenitore e' appoggiato al
   bordo basso del widget e sta dentro i 16px di respiro della pista.
   ========================================================================== */

.or-carousel-dots {
  position: absolute;
  z-index: 3;
  left: calc(50% + 0px);
  top: calc(100% + 0px);
  transform: translate(-50%, -100%);
  width: max-content;
  height: max-content;
  text-align: center;
  font-size: var(--or-car-dot);
  line-height: var(--or-car-dot);
  transition: 0.3s opacity;
}

.or-carousel-dot {
  display: inline-block;
  vertical-align: top;
  width: var(--or-car-dot);
  height: var(--or-car-dot);
  /* 6px per lato: fra due pallini ne restano 12. */
  margin: 0 6px;
  padding: 0;
  border: 0;
  -webkit-appearance: none;
  appearance: none;
  border-radius: 50%;
  background: var(--or-nero);
  opacity: 0.2;
  cursor: pointer;
}

.or-carousel-dot:hover,
.or-carousel-dot.is-active {
  opacity: 1;
}

/* ==========================================================================
   BREAKPOINT
   Sono i due veri di Elementor: 1024 e 767, entrambi max-width.
   Attenzione: il numero di locandine visibili lo decide il JS con soglie
   min-width (0 -> 1, 767 -> 2, 1024 -> 4), che a 767px e a 1024px esatti
   NON coincidono con queste. E' il comportamento reale dell'originale,
   non una svista.
   --or-car-slides non lo legge nessuno, ne' qui ne' nel JS: e' la stessa
   configurazione trascritta due volte, e resta scritta perche' e' il valore
   del widget. Prima che il JS misuri si vede UNA locandina a qualunque
   larghezza, per via del width:100% di .or-carousel-slide (vedi sopra):
   il CSS non fa da ripiego. Se un domani si volesse un ripiego vero,
   e' li' che va messo, non qui.
   ========================================================================== */

@media (max-width: 1024px) {
  .or-carousel {
    --or-car-slides: 2;
  }

  /* 45px a tablet e' piu' grande dei 23px del desktop. Non e' un refuso di
     trascrizione: il cliente ha impostato la taglia tablet prima di
     rimpicciolire quella desktop. Interlinea e crenatura NON cambiano
     (la regola desktop ha la stessa specificita' e non sta in un media). */
  .or-carousel-title {
    font-size: 45px;
  }
}

@media (max-width: 767px) {
  .or-carousel {
    --or-car-slides: 1;
    /* Home: la fascia si stringe su quello che contiene. */
    min-height: 0vh;
    gap: 0px 0px;
    padding: 0%;
  }

  /* Pagine interne: la fascia prende tutto lo schermo e stacca dall'alto
     di un quarto della propria larghezza. */
  .or-carousel--interna {
    min-height: 100vh;
    padding-top: 25%;
  }

  .or-carousel-widget {
    padding: 2em 0 0 0;
  }

  /* Solo in home: margine negativo in basso, la fascia successiva risale
     sopra il carosello di un 10% della larghezza. */
  .or-carousel--home .or-carousel-widget {
    margin: 0% 0% -10% 0%;
  }

  .or-carousel-card {
    padding: 2em 4em 4em 4em;
  }

  .or-carousel-poster img {
    width: 100%;
  }

  .or-carousel-title-box {
    margin: 30px 0px 0px 0px;
  }

  .or-carousel-title {
    font-size: 28px;
    line-height: 1.1em;
  }
}

/* ==========================================================================
   MENO MOVIMENTO
   Chi lo chiede tiene tutto: bordo bianco, alone, titolo che compare. Cade
   solo cio' che si muove, cioe' la scala della locandina, lo scivolamento
   del titolo e lo scorrimento animato del nastro (il JS salta di netto e
   non fa partire l'avanzamento automatico).
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .or-carousel-rail,
  .or-carousel-rail.is-animating,
  .or-carousel-veil,
  .or-carousel-dots,
  .or-carousel-arrow,
  .or-carousel-title-slot {
    transition: none;
  }

  .or-carousel-title-slot {
    transform: none;
  }

  .or-carousel-frame:hover .or-carousel-title-slot,
  .or-carousel-frame:focus-within .or-carousel-title-slot {
    transform: none;
  }

  .or-carousel-frame:hover .or-carousel-poster,
  .or-carousel-frame:focus-within .or-carousel-poster {
    transform: none;
    transition: none;
  }
}

/* ==========================================================================
   SEZIONE ABOUT DELLA HOME E SLIDER DEI VOLTI
   ========================================================================== */

/* ==========================================================================
   ABOUT IN HOME  (blocco about-split)
   La fascia "about us / our team" della home: a sinistra il racconto con la
   pillola nera, a destra il titolo storto e i volti che si avvicendano.

   Ogni valore qui sotto viene dal rilievo `rilievo/about-home.md`, cioe' da
   post-60.css (generato di pagina), post-60-custom.css (CSS scritto a mano
   dal cliente), post-28.css (kit), frontend.min.css, widget-slides.min.css,
   swiper.min.css ed e-swiper.min.css. Dove la sorgente non dichiara niente
   qui non c'e' niente: le lacune stanno nel rapporto, non riempite a intuito.

   Sezione scritta desktop-first, come i post-*.css originali: la base e' il
   desktop, poi 1024 e poi 767. Sono gli unici due breakpoint veri del sito
   (elementorFrontendConfig), tranne il 768 scritto a mano dal cliente che
   piu' avanti riporto com'e'.
   ========================================================================== */

/* ---- La sezione ---------------------------------------------------------
   `.e-con` con --display:flex, --flex-direction:row, --align-items:center,
   --min-height:100vh, --gap:0px, --margin:0%, --padding:0% 12%.
   `e-con-full`: niente wrapper interno, il 12% sta sul container stesso.
   Il fondo e' foto + velo bianco al 60% (vedi .or-about-overlay). */
.or-about-split {
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: center;
  min-height: 100vh;
  gap: 0px;
  margin: 0%;
  padding: 0% 12%;
  width: 100%;

  /* background-size:cover e' dichiarato; background-position e background-repeat
     NON lo sono da nessuna parte (verificato su post-60, post-28, frontend e
     hello-elementor), quindi valgono gli iniziali CSS: 0% 0% e repeat. Li
     scrivo espliciti perche' il primo tentativo aveva messo "center", che
     sposta la schiuma di parecchio. */
  background-size: cover;
  background-position: 0% 0%;
  background-repeat: repeat;
}

/* Il velo bianco.
   Nell'originale e' `.e-con::before` con opacity .6 e nessuno z-index: le due
   colonne, essendo `.e-con` con position:relative, dipingono sopra per ordine
   di documento. Qui uso un elemento vero con z-index POSITIVO sotto al
   contenuto invece del pseudo-elemento: dentro l'editor della console un
   pseudo-elemento con z-index negativo (e l'isolation:isolate che serve a
   contenerlo) mandava l'evidenziatore sopra al contenuto e il blocco appariva
   come un rettangolo pieno. Il risultato visivo e' identico, il contesto di
   impilamento no. */
.or-about-overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: block;
  z-index: 1;
  background-color: var(--or-bianco);
  opacity: 0.6;

  /* Misurata: la seconda regola `.e-con:before` di frontend.min.css riscrive
     la transizione e anima tre proprieta', non "all". Qui l'overlay non cambia
     mai stato, quindi non si vede: la tengo perche' e' il valore vero. */
  transition: background 0.3s, border-radius 0.3s, opacity 0.3s;
}

/* ---- Le due colonne -----------------------------------------------------
   Larghezze: 66/33 sopra i 1024px, 100/100 sotto (post-60.css usa
   min-width:768px per il 66/33 e max-width:1024px+min-width:768px per il
   100/100; sotto i 767 ci pensa `.e-con.e-flex{--width:100%}`).
   z-index 2: stanno sopra il velo, come nell'originale, ma per posizione
   dichiarata e non per ordine di pittura. */
.or-about-text,
.or-about-team {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
}

.or-about-text {
  width: 66%;
  /* Il gap fra titolo, occhiello, testo e bottone e' 5px e basta: dentro un
     `.e-con` Elementor azzera il margine di 20px dei widget
     (`.e-con .elementor-widget:not(:last-child){--kit-widget-spacing:0px}`). */
  gap: 5px;
  padding: 0% 10% 0% 0%;
}

.or-about-team {
  width: 33%;
  /* position:relative e' il blocco contenitore del titolo storto, che e'
     assoluto. La classe `our-team-container` dell'originale non ha CSS
     proprio: serviva solo a questo. */
}

/* Distanze interne alla colonna del testo: sono i margini del widget
   container, non il gap. */
.or-about-text .or-body {
  margin-top: 3%;
}

/* Il bottone sta dentro un wrapper perche' nell'originale l'allineamento e'
   un text-align sul widget, non un align-self sul link: a telefono la classe
   `elementor-mobile-align-center` centra il testo del contenitore e lascia il
   bottone a larghezza automatica. Senza wrapper, il link diventerebbe figlio
   diretto del flex e si stirerebbe per tutta la colonna. */
.or-about-cta {
  margin-top: 5%;
}

/* ---- Titolo storto "our team" -------------------------------------------
   Assoluto dentro la colonna del team. left/top vengono dal CSS scritto a
   mano dal cliente, che vince sui valori generati grazie a !important. */

/* Riporto la regola del cliente com'e', compreso il breakpoint 768px (non 767:
   il cliente l'ha scritto a mano, Elementor genera 767). Nell'originale sta
   PRIMA della regola generale e ha lo stesso peso e lo stesso !important:
   quindi perde, e `top:1em` non si applica a nessuna larghezza. La lascio qui
   nella stessa posizione perche' e' cio' che la sorgente dice davvero; il
   primo tentativo aveva copiato il valore morto e su telefono il titolo
   finiva 1.5em piu' in basso del vero. */
@media (max-width: 768px) {
  .or-team-flip {
    top: 1em !important;
  }
}

.or-team-flip {
  position: absolute;
  left: 50% !important;
  top: -0.5em !important;
  transform: translateX(-50%);
  transform-style: preserve-3d;
  z-index: 50;
  cursor: pointer;
  margin: 0;
  text-align: center;

  /* Tipografia sua, non quella dei titoli di sezione: 25px su desktop, cioe'
     meno della meta' di "about us". AZO qui e' giusto: la sorgente lo dichiara. */
  font-family: var(--or-font-display);
  font-size: 25px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-nero);
}

/* L'inclinazione di -3deg NON sta sull'elemento: sta sul figlio
   (`.e-transform .elementor-widget-container` con --e-transform-rotateZ:-3deg).
   Non e' un dettaglio: i keyframe di flipZoom riscrivono `transform`
   sull'elemento, e se l'inclinazione stesse li' sparirebbe durante il giro.
   Tenendola sul figlio, il titolo gira restando storto. */
.or-team-flip-inner {
  display: inline-block;
  transform: rotate(-3deg);
  transition: background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s,
    transform 0.4s;
}

/* Il click aggiunge la classe: tre giri completi in 1.2s, una volta sola.
   1080deg = 3 giri. Il commento dentro i keyframe originali parla di "due giri
   a 720" e di scale(1.05) a meta' strada: e' falso, i keyframe scritti sono
   due e non hanno nessuna scala. Vale il codice, non il commento. */
.or-team-flip.is-flipping {
  animation: or-flip-zoom 1.2s ease;
}

@keyframes or-flip-zoom {
  0% {
    transform: translateX(-50%) rotateY(0deg);
  }

  100% {
    transform: translateX(-50%) rotateY(1080deg);
  }
}

/* ---- Slider dei volti ---------------------------------------------------
   Widget "slides" di Elementor Pro su Swiper 8: una slide per volta,
   scorrimento orizzontale (transition:"slide"), pallini fuori dalla slide.
   .or-team-slider = `.elementor-swiper` (position:relative, blocco contenitore
   dei pallini, perche' `.elementor-main-swiper` e' static). */
.or-team-slider {
  position: relative;
  margin: 0px;
}

/* .or-team-viewport = `.swiper`: taglia le slide fuori quadro e porta la
   fascia da 30px in cui vivono i pallini ("pagination outside"). */
.or-team-viewport {
  position: relative;
  overflow: hidden;
  margin-left: auto;
  margin-right: auto;
  padding: 0;
  padding-bottom: 30px;
}

/* .or-team-track = `.swiper-wrapper`: il nastro flex che scorre. La durata
   della transizione e' `transition_speed:500` dai data-settings del widget;
   la funzione di tempo non e' dichiarata da nessuna parte, quindi resta
   l'`ease` di default e non la scrivo. Lo scorrimento lo fa il JS spostando
   il nastro, come Swiper. */
.or-team-track {
  position: relative;
  width: 100%;
  height: 100%;
  display: flex;
  box-sizing: content-box;
  transition-property: transform;
  transition-duration: 500ms;
}

/* Una slide per volta, alta 400px a TUTTI i breakpoint (nessun override,
   verificato). La transition-duration di 3600ms e' quella dichiarata in CSS
   (calc(3000ms*1.2)); Swiper la riscrive inline a ogni cambio, quindi conta
   solo a riposo. La riporto perche' e' il valore vero della sorgente. */
.or-team-slide {
  position: relative;
  flex-shrink: 0;
  width: 100%;
  height: 400px;
  transition-property: transform;
  transition-duration: calc(3000ms * 1.2);
}

/* Il ritratto. background-size:contain (non cover): il volto entra intero nel
   riquadro e lascia le bande vuote ai lati, non viene tagliato. Il fondo e'
   bianco trasparente, cioe' niente. */
.or-team-slide-bg {
  min-width: 100%;
  min-height: 100%;
  background-color: #ffffff00;
  background-position: 50%;
  background-repeat: no-repeat;
  background-size: contain;
}

/* Il nome sta sopra al ritratto, in fondo e centrato: align-items:flex-end
   dichiarato per ogni singola slide batte il center che verrebbe dalla classe
   `elementor--v-position-middle` del widget. Padding azzerato (l'originale
   sovrascrive i 50px del widget, e anche i 30px che il widget rimette a 767). */
.or-team-slide-inner {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  padding: 0px;
  text-align: center;
  color: #fff;
}

.or-team-slide-contents {
  margin: 0 auto;
  max-width: 100%;
}

/* Helvetica, non AZO: il font del sito nei nomi e nel corpo e' questo.
   Il margine a zero e' nostro, perche' il nome e' un <p> e il reset di
   hello-elementor gli darebbe 0.9rem sotto; nell'originale il testo del
   widget non e' un paragrafo. */
.or-team-slide-name {
  margin: 0;
  font-family: var(--or-font-helvetica);
  font-size: 20px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.1em;
  letter-spacing: 0px;
  color: var(--or-nero);
}

/* ---- Pallini ------------------------------------------------------------
   Il primo tentativo non li aveva proprio: senza pallini manca sia la
   navigazione sia l'innesco della pausa "su interazione". */
.or-team-dots {
  position: absolute;
  bottom: 5px;
  left: 0;
  width: 100%;
  z-index: 10;
  text-align: center;
  transform: translate3d(0, 0, 0);
  transition: 0.3s opacity;
}

/* Nell'originale i bullet sono <span> generati da Swiper. Qui sono <button>
   per poterli raggiungere da tastiera: le tre righe di azzeramento
   (border/padding/appearance) servono solo a togliere il vestito nativo del
   bottone e a lasciare esattamente il pallino misurato. Attenzione: la regola
   `button.swiper-pagination-bullet` di Swiper porterebbe anche margin:0, che
   cancellerebbe i 6px per lato; per questo il margine lo dichiaro dopo. */
.or-team-dot {
  display: inline-block;
  width: 6px;
  height: 6px;
  border: none;
  padding: 0;
  box-shadow: none;
  -webkit-appearance: none;
  appearance: none;
  border-radius: 50%;
  background: #000;
  opacity: 0.2;
  margin: 0 6px;
  cursor: pointer;
}

.or-team-dot.is-active {
  opacity: 1;
  background: #000;
}

/* Scarto voluto, come la prefers-reduced-motion piu' sotto: nell'originale i
   pallini sono <span> e da tastiera non si raggiungono, quindi la sorgente non
   ha nessuno stato di fuoco da riportare. Qui sono <button>, e un cerchio di
   6px al 20% di opacita' con appearance:none lascia un anello di fuoco di
   fatto invisibile. L'anello e' l'unico modo per sapere dove si e'. */
.or-team-dot:focus-visible {
  opacity: 1;
  outline: 2px solid #000;
  outline-offset: 3px;
}

/* Un volto solo: niente pallini. */
.or-team-dot:only-child {
  display: none;
}

/* ==========================================================================
   TABLET (<= 1024px)
   ========================================================================== */

@media (max-width: 1024px) {
  .or-about-split {
    flex-wrap: wrap;
    margin: 25% 0% 0% 0%;
    padding: 0% 5%;
  }

  /* Le due colonne stanno una sotto l'altra e il TEAM PASSA SOPRA: e' l'hack
     `--order:-99999` che Elementor scrive sul container del team. */
  .or-about-text {
    width: 100%;
    margin: 10% 0% 0% 0%;
  }

  .or-about-team {
    width: 100%;
    order: -99999;
  }

  /* Su tablet il titolo storto e' quasi il doppio che su desktop (25 -> 45),
     perche' la colonna del team occupa tutta la larghezza. Non e' un refuso. */
  .or-team-flip {
    font-size: 45px;
  }

  .or-team-slide-name {
    font-size: 25px;
  }
}

/* ==========================================================================
   TELEFONO (<= 767px)
   ========================================================================== */

@media (max-width: 767px) {
  /* column-reverse con l'--order:-99999 ancora attivo: l'asse parte dal basso,
     quindi l'elemento con order piu' basso finisce IN FONDO. Risultato: su
     telefono il testo torna sopra e il team scende sotto. E' il contrario del
     tablet, ed e' voluto dalla sorgente. */
  .or-about-split {
    flex-direction: column-reverse;
    flex-wrap: nowrap;
    margin: 25% 0% 0% 0%;
    /* il padding 0% 5% resta quello di 1024: a 767 non c'e' nessuna regola */
  }

  .or-about-text {
    padding: 0em 0em 5em 0em;
  }

  .or-about-team {
    padding: 0em 0em 3em 0em;
  }

  /* Solo titolo e occhiello vanno al centro: il corpo va giustificato e
     rientrato, il bottone e' centrato dal suo wrapper. Centrare l'intera
     colonna sarebbe piu' semplice e diverso dall'originale. */
  .or-about-text .or-display,
  .or-about-text .or-eyebrow {
    text-align: center;
  }

  .or-about-text .or-body {
    padding: 1em 2em;
    text-align: justify;
  }

  .or-about-cta {
    text-align: center;
  }

  .or-team-flip {
    font-size: 28px;
    line-height: 1.1em;
    /* top resta -0.5em: vedi la nota sulla regola morta del cliente */
  }

  .or-team-slider {
    padding: 2em 0em 0em 0em;
  }

  /* 15px sotto al nome: e' l'unico pezzo della regola mobile del widget che
     post-60.css non ridichiara, quindi sopravvive. */
  .or-team-slide-name {
    font-size: 20px;
    margin-bottom: 15px;
  }
}

/* ==========================================================================
   .come-i-veri
   Sta nel CSS scritto a mano della home, quindi e' sorgente a tutti gli
   effetti, ma nell'HTML del sito non c'e' nessun elemento con questa classe e
   nessuna regola assegna mai l'animazione (l'unica dichiarazione e'
   `animation:none`). E' un lampeggio predisposto e mai acceso: lo riporto
   perche' il primo tentativo l'aveva perso, non perche' oggi si veda qualcosa.
   Per usarlo basta assegnare `animation: or-visibility-animation <durata>`.
   ========================================================================== */

.or-come-i-veri {
  opacity: 0;
  animation: none;
}

@keyframes or-visibility-animation {
  0%,
  57.69% {
    opacity: 0;
  }

  61.54% {
    opacity: 1;
  }

  96.15% {
    opacity: 1;
  }

  100% {
    opacity: 0;
  }
}

/* ==========================================================================
   MENO MOVIMENTO
   La sorgente non ha nessuna prefers-reduced-motion (verificata su tutti i 44
   fogli): questo blocco e' uno scarto voluto. Regge perche' il JS, quando il
   movimento e' ridotto, non fa partire il giro e lascia navigare il link, e
   non fa scorrere i volti da solo.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .or-about-overlay,
  .or-team-flip-inner,
  .or-team-track,
  .or-team-slide,
  .or-team-dots {
    transition: none;
  }

  .or-team-flip.is-flipping {
    animation: none;
  }
}

/* ==========================================================================
   FASCIA PARTNER
   ========================================================================== */

/* ==========================================================================
   PARTNER - fascia "we worked with" e carosello dei loghi
   Ogni numero qui dentro viene da orca/rilievo/partner.md. Dove il rilievo
   non dice niente, qui non c'e' niente.

   Due varianti, perche' nell'originale le due fasce sono davvero due:
   - home  = container Elementor "e-con-boxed": il contenuto e' strozzato a
             --container-max-width e centrato, i widget hanno 20px di gap;
   - about = container "e-con-full": nessun .e-con-inner, quindi contenuto a
             tutta larghezza e gap 0.
   Da questa sola differenza discendono loghi da 184px in home e da 198px in
   about alla stessa larghezza di finestra: non e' un dettaglio cosmetico.
   ========================================================================== */

/* La fascia. Il padding orizzontale sta qui su entrambe le varianti perche'
   nell'originale --padding-left/right vivono sul .e-con esterno: la
   percentuale si risolve quindi sulla larghezza della finestra (8% di 1440 =
   115,195px, misurato). Il padding verticale invece cambia di posto fra le
   due varianti, vedi sotto: e' il motivo per cui le due fasce non hanno la
   stessa altezza. */
.or-partners {
  background-color: var(--or-grigio-fascia);
  padding-inline: 8%;
}

/* Il gruppo titolo + sottotitolo + carosello. Corrisponde a .e-con-inner in
   home e ai figli diretti del container in about: display flex in colonna in
   entrambi i casi (--display:flex, --flex-direction:column). */
.or-partners__inner {
  display: flex;
  flex-direction: column;
  width: 100%;
}

/* ---- Variante home (e-con-boxed) --------------------------------------
   padding-block sull'inner: nell'originale sta su .e-con-inner, quindi il 4%
   si risolve sulla larghezza INTERNA della fascia (1209,61px a 1440px di
   finestra) e vale 48,38px, non 57,59px. Chi mette il 4% sulla sezione
   sbaglia di 9px per lato.
   max-width: e' la riga .e-con>.e-con-inner{margin:0 auto;max-width:
   var(--content-width)} con --content-width: min(100%, --container-max-width).
   --or-container vale 1140 / 1024 / 767 come nel kit.
   gap: 20px = --widgets-spacing-row, dichiarato esplicitamente dal kit
   (post-28.css .elementor-element). Il margine di 20px fra widget che il kit
   dichiara a parte NON si somma: dentro un container e' azzerato da
   .e-con .elementor-widget.elementor-widget{margin-block-end:0}. */
.or-partners--boxed > .or-partners__inner {
  gap: 20px;
  margin-inline: auto;
  max-width: min(100%, var(--or-container));
  padding-block: 4%;
}

/* ---- Variante about (e-con-full) --------------------------------------
   Qui il .e-con-inner non esiste: padding-block e padding-inline stanno
   sullo stesso elemento, quindi il 4% verticale si risolve sulla larghezza
   della finestra (57,59px a 1440px, misurato) e il contenuto non ha nessun
   tetto di larghezza. E il gap fra i widget e' 0px dichiarato, non 20px. */
.or-partners--full {
  padding-block: 4%;
}

.or-partners--full > .or-partners__inner {
  gap: 0px;
}

/* ---- Titolo ------------------------------------------------------------
   Famiglia, corpo, peso, interlinea e reset dei margini arrivano da
   .or-display (AZO 65/45/28px, 600, 1.2em/1.2em/1.1em): qui restano solo le
   due proprieta' che la fascia cambia davvero. Il selettore e' discendente
   (0,2,0) apposta: .or-display dichiara color:var(--or-nero) con la stessa
   specificita' di una classe singola, e senza questo peso in piu' il titolo
   resterebbe nero su grigio a seconda dell'ordine dei file. */
.or-partners .or-partners__title {
  color: var(--or-bianco);
  text-align: center;
}

/* ---- Sottotitolo -------------------------------------------------------
   La scatola esiste perche' esiste nell'originale: il padding sta sul
   .elementor-widget-container, non sull'h5. La differenza si vede solo a
   mobile, dove il padding e' 2em: sulla scatola (16px ereditati dal body)
   fa 32px come misurato, sull'h5 (14px) farebbe 28px.
   Lo "01em" del sorgente vale 1em, lo riporto come 1em. */
.or-partners__subtitle-box {
  padding: 1em 10em 2em 10em;
}

/* Helvetica, non AZO e non il font di sistema: la regola di pagina scrive
   la famiglia per esteso invece di usare la variabile globale del kit.
   16px su desktop, e sono 16px veri: il salto a 45px arriva solo a tablet. */
.or-partners__subtitle {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-helvetica);
  font-size: 16px;
  font-weight: 400;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-bianco);
  text-align: center;
}

/* ---- Carosello ---------------------------------------------------------
   overflow:hidden e' la regola geometrica piu' importante della fascia: e'
   cio' che taglia le slide fuori pista e rende invisibile il ciclo infinito.
   Nell'originale .swiper avrebbe position:relative e z-index:1, ma il widget
   image-carousel rimette position:static: nessun contesto di impilamento
   viene creato, e infatti qui non serve ne' isolation ne' z-index. */
.or-partners__carousel {
  overflow: hidden;
  width: 100%;
}

/* La pista. align-items:center e' dichiarato dalla pagina e serve: i loghi
   hanno la stessa proporzione ma altezze rese diverse dagli arrotondamenti.
   gap 55px = image_spacing_custom dei data-settings, uguale su tutti e tre i
   breakpoint (il valore tablet e' vuoto e Elementor risale al desktop).
   La transizione e' solo su transform, con durata 0 a riposo: il JS alza la
   durata a 500ms (speed dei data-settings) per lo scatto e la riazzera per il
   riavvolgimento invisibile. */
.or-partners__track {
  display: flex;
  align-items: center;
  gap: 55px;
  transition-property: transform;
  transition-duration: 0s;
  transition-timing-function: ease;
}

/* La slide. flex-shrink:0 non e' pignoleria: senza, il flex comprime le basi
   calcolate e i loghi non misurano piu' 184px.
   line-height:24px riproduce il line-height:inherit del <figure>, che nel
   sito eredita i 24px del body (16px x 1.5). E' cio' che rende la slide 6px
   piu' alta dell'immagine. Lo scrivo esplicito perche' "inherit" dipende da
   chi sta sopra, e nel nostro tema la catena non e' la stessa.
   Base flex mobile: 100%, cioe' un logo per vista. */
.or-partners__slide {
  flex: 0 0 100%;
  margin: 0;
  padding: 0;
  text-align: center;
  line-height: 24px;
}

/* Il logo resta INLINE. E' il dettaglio che il primo tentativo aveva perso
   mettendo display:block su tutte le immagini del sito: da inline dipendono
   i 6px di spazio del discendente sotto la linea di base, e quindi l'altezza
   della fascia. Nessun filtro, nessuna opacita', nessun raggio: sulla
   sorgente non esiste una sola regola che tocchi questi loghi. */
.or-partners__logo {
  display: inline;
  vertical-align: baseline;
  max-width: 100%;
  height: auto;
  /* A riposo i marchi stanno un passo indietro, cosi' il bianco pieno
     dell'hover si legge come una reazione e non come lo stato normale. */
  opacity: 0.75;
  transition: opacity 0.3s ease, filter 0.3s ease;
}

/* Logo che porta al sito del partner. Al passaggio diventa bianco pieno:
   brightness(0) schiaccia a nero qualunque colore di partenza e invert(1)
   lo ribalta in bianco, quindi funziona sia coi marchi chiari sia con
   quelli scuri, senza dover rifare i file. */
.or-partners__link {
  display: inline-block;
  line-height: 0;
}

.or-partners__link:hover .or-partners__logo,
.or-partners__link:focus-visible .or-partners__logo {
  opacity: 1;
  filter: brightness(0) invert(1);
}

.or-partners__link:focus-visible {
  outline: 2px solid var(--or-bianco);
  outline-offset: 6px;
}

@media (prefers-reduced-motion: reduce) {
  .or-partners__logo {
    transition: none;
  }
}

/* Le copie che il JS aggiunge per chiudere il ciclo non devono essere lette
   due volte dagli screen reader ne' cliccabili nell'editor. */
.or-partners__slide[aria-hidden="true"] {
  pointer-events: none;
}

/* ---- Quanti loghi per vista -------------------------------------------
   ATTENZIONE: queste tre soglie sono in MIN-width, non in max-width come il
   resto della fascia, e non e' una svista. Elementor scrive nel CSS
   @media(max-width:1024px){--e-image-carousel-slides-to-show:3}, ma quel
   valore conta solo prima che parta lo swiper; poi Swiper usa breakpoint in
   min-width (0 / 767 / 1024) e a 1024px esatti mostra 5 loghi, non 3.
   Verificato dal vivo. Riproduco il comportamento reale, cioe' lo swiper.
   Conseguenza voluta: a 767px esatti la fascia ha i padding "mobile" (15%/5%)
   e il sottotitolo a 14px, ma il carosello mostra gia' 3 loghi. La
   contraddizione e' nell'originale.
   Le basi: 3 loghi = 2 spazi da 55px, 5 loghi = 4 spazi da 55px. */
@media (min-width: 767px) {
  .or-partners__slide {
    flex-basis: calc((100% - 110px) / 3);
  }
}

@media (min-width: 1024px) {
  .or-partners__slide {
    flex-basis: calc((100% - 220px) / 5);
  }
}

/* ==========================================================================
   TABLET (max-width 1024px) - la soglia vera di elementorFrontendConfig
   ========================================================================== */

@media (max-width: 1024px) {
  /* Il sottotitolo passa da 16px a 45px. Non e' un refuso di trascrizione:
     e' scritto cosi' in post-60.css e in post-37.css ed e' confermato dalla
     misura sul sito vivo a 1000px. Fra 768px e 1024px il sottotitolo e'
     grande quanto il titolo. L'interlinea non viene ridichiarata: resta
     1.2em, cioe' 54px. */
  .or-partners__subtitle {
    font-size: 45px;
  }

  .or-partners__subtitle-box {
    padding: 0% 20% 0% 20%;
  }

  /* Solo about: margine superiore del 25% (250px a 1000px di finestra,
     misurato) e padding portato a 5% su tutti e quattro i lati. La home a
     questa soglia non ha nessuna regola e resta a 4%/8%. */
  .or-partners--full {
    margin: 0% 0% 0% 0%;
    margin-top: 25%;
    padding-block: 5%;
    padding-inline: 5%;
  }
}

/* ==========================================================================
   MOBILE (max-width 767px)
   ========================================================================== */

@media (max-width: 767px) {
  .or-partners {
    padding-inline: 5%;
  }

  /* Home: 15% sopra e 15% sotto. */
  .or-partners--boxed > .or-partners__inner {
    padding-block: 15%;
  }

  /* About: 15% sopra ma 10% sotto, e il margine del 25% sparisce.
     Il tema precedente usava un unico blocco per le due pagine e qui
     sbagliava di 5 punti percentuali. */
  .or-partners--full {
    margin-top: 0%;
    padding-top: 15%;
    padding-bottom: 10%;
    padding-inline: 5%;
  }

  .or-partners__subtitle-box {
    padding: 2em 2em 2em 2em;
  }

  .or-partners__subtitle {
    font-size: 14px;
    line-height: 1.1em;
  }
}

/* ==========================================================================
   MOVIMENTO RIDOTTO
   L'originale non se ne cura e continua a scorrere anche con il movimento
   ridotto: qui invece il carosello si ferma, perche' il contratto del tema lo
   impone. E' l'unica differenza voluta rispetto alla sorgente in tutta la
   fascia, ed e' segnalata anche nel JS.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .or-partners__track {
    transition: none;
  }
}

/* ==========================================================================
   PAGINA ABOUT: APERTURA, INTRODUZIONE, TEAM
   ========================================================================== */

/* ==========================================================================
   PAGINA ABOUT  (blocchi media-hero, about-intro, team)

   Rilievo fatto sulla sorgente vera di https://www.orcaproduzioni.it/about/
   (pagina Elementor id 37). Fonti lette riga per riga:
   - post-37.css      generato di pagina: e' li' che stanno i valori veri
   - post-28.css      kit globale (token di colore e tipografia)
   - frontend.min.css elementor 3.26.4 (.e-con, overlay, video di sfondo)
   - widget-heading / widget-text-editor / widget-image .min.css
   - hello-elementor style.min.css (il reset che regge la geometria)
   - post-249/579/621/628.css per l'apertura video delle pagine film, che
     usa lo stesso blocco media-hero
   Ogni numero e' stato poi ricontrollato con getComputedStyle sul sito vivo
   a 1440, 900 e 390 px. Dove la sorgente non dichiara niente, qui non c'e'
   niente: le lacune stanno nel rapporto, non riempite a intuito.

   Scritto desktop-first come i post-*.css originali: base = desktop, poi
   1024, poi 767. Sono i due soli breakpoint di elementorFrontendConfig.

   Nota sull'editor della console: nessun "isolation: isolate" e nessun
   z-index negativo. Gli sfondi velati sono elementi veri con z-index
   POSITIVO e il contenuto sopra di loro. Nell'originale il velo e' un
   ::before assoluto senza z-index che finisce sotto ai figli solo perche'
   ogni figlio e' position:relative (verificato: .elementor-element e'
   relative); riprodurlo con uno pseudo-elemento a z-index negativo e' cio'
   che faceva apparire il blocco come un rettangolo pieno dentro l'editor.
   ========================================================================== */


/* ==========================================================================
   APERTURA VIDEO  (blocco media-hero)
   Serve due casi diversi con la stessa struttura:
   - About (post-37, container be563b4): titolo scritto "about us", NESSUN
     velo, fermo immagine about-us-fallback.jpg;
   - pagine film (post-249/579/621/628): lettering SVG al posto del titolo e
     velo nero al 50%.
   La differenza fra i due nella sorgente e' solo overlay-opacity e il tipo
   di contenuto: tutto il resto (100vh, colonna, centrato, 523px da tablet)
   e' identico in tutte e cinque le pagine.

   ATTENZIONE, la classe e' condivisa: ".or-media-hero" e' anche la radice
   dell'apertura della home (blocco hero), che ci aggiunge ".or-hero-home" e
   due contenitori filmato invece di uno. Quindi:
   - ogni riga scritta qui su ".or-media-hero" cade anche sulla home;
   - ".or-hero-home{background-color:...}" ha la stessa specificita' di
     ".or-media-hero{background-color:transparent}" qui sotto, quindi vince
     solo perche' viene DOPO nel foglio assemblato. Se un giorno l'ordine
     dei componenti cambia, la home perde il suo fondo.
   ========================================================================== */

.or-media-hero {
  /* .e-con: --position:relative, --display:flex, --width:100%.
     be563b4: --flex-direction:column, --justify-content:center,
     --align-items:stretch, --min-height:100vh, --gap:0px.
     Nessun --padding-* dichiarato: il kit li porta a 0 (senza il kit
     frontend.min.css metterebbe 10px per lato). */
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: stretch;
  gap: 0px;
  width: 100%;
  min-height: 100vh;
  padding: 0;

  /* Il fermo immagine arriva dal template come background-image inline.
     La sorgente scrive `background:url(...) 50% 50%` come SHORTHAND dopo
     `background-color:var(--e-global-color-secondary)`: la shorthand azzera
     il colore, quindi sotto al video non c'e' il grigio #F3F5F8 del kit ma
     il trasparente. Verificato: background-color computato = rgba(0,0,0,0).
     background-repeat non e' dichiarato da nessuna parte, quindi vale
     l'iniziale `repeat` (con cover non si vede, ma il valore vero e' questo
     e non "no-repeat"). */
  background-position: 50% 50%;
  background-size: cover;
  background-repeat: repeat;
  background-color: transparent;
}

/* Contenitore del filmato = .elementor-background-video-container.
   z-index 0, non negativo: e' gia' cosi' nell'originale. */
.or-media-hero-media {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  direction: ltr;
  pointer-events: none;
  transition: opacity 1s;
}

/* `.elementor-background-video-container.elementor-loading{opacity:0}`: il
   contenitore parte invisibile e sfuma in un secondo quando il filmato e'
   pronto. La classe la mette e la toglie il JS, esattamente come fa
   Elementor: se il JS non gira il filmato resta visibile da subito, che e'
   il ripiego giusto. E' uno dei comportamenti "parte invisibile e compare"
   che il primo tentativo aveva perso. */
.or-media-hero-media.is-loading {
  opacity: 0;
}

/* Nell'originale il <video> e' assoluto e centrato via translate, mentre
   larghezza e altezza gliele scrive il JS di Elementor calcolando la
   copertura (misurato: style="width:1600px;height:900px" su un riquadro
   900x900, con max-width:100% a tagliare). Il risultato visivo e' quello di
   object-fit:cover, che infatti la sorgente dichiara su .elementor-html5-video.
   Qui ottengo lo stesso riempimento senza JS di misura: stesso centraggio,
   dimensioni al 100% del riquadro, cover. */
.or-media-hero-video {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  height: 100%;
  object-fit: cover;

  /* Misurato sul <video> vero: max-width 100%. La regola
     `.elementor-background-video{max-width:none}` riguarda l'altra variante
     (quella non ospitata), non questa. */
  max-width: 100%;
}

/* Velo nero delle pagine film. L'opacita' arriva inline dal campo perche'
   e' l'unica cosa che cambia fra About (0, quindi il velo non viene
   nemmeno stampato) e le pagine film (0.5).
   La transizione e' quella vera della seconda regola `.e-con:before` di
   frontend.min.css: tre proprieta' nominate, non "all". */
.or-media-hero-veil {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: block;
  background-color: var(--or-nero);
  pointer-events: none;
  transition: background 0.3s, border-radius 0.3s, opacity 0.3s;
}

/* Il contenuto sta sopra video e velo. Il centraggio orizzontale non e' una
   scelta: su About viene da `.elementor-element-b7c76f7{text-align:center}`,
   sulle pagine film da `.elementor-widget-image{text-align:center}`. */
.or-media-hero-content {
  position: relative;
  z-index: 2;
  text-align: center;
}

/* Titolo scritto (solo About).
   font-size:8em e' letterale: 8 volte il corpo ereditato, che risale fino
   a body{font-size:1rem} perche' nessun antenato dichiara un font-size.
   Misurato: 128px a desktop. Non l'ho normalizzato a 128px proprio perche'
   la sorgente dice 8em e la catena di ereditarieta' e' la stessa.
   L'ombra e' quella vera, con il verde-nero al 15%. */
.or-media-hero-title {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-display);
  font-size: 8em;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-bianco);
  text-shadow: 0px 7px 40px rgba(0, 0, 0, 0.15);
}

/* Lettering disegnato (pagine film).
   A desktop NON c'e' nessuna regola: post-249/579/621/628 dichiarano
   `img{width:100%}` solo dentro la media a 767px. E non serve: i quattro
   SVG (CORPI-TEXT, FREE-SPIRITS-TEXT, silenzio-padre-text,
   ANNIVERSARIO-TEXT) hanno il solo `viewBox="0 0 1920 1080"`, senza
   width/height, quindi come immagine in flusso normale prendono da soli la
   larghezza del contenitore.
   Qui NON vanno messi ne' `display:inline-block` ne' `vertical-align:middle`:
   nella sorgente le immagini sono `display:inline` e `vertical-align:baseline`
   (hello-elementor e frontend.min.css dichiarano solo border, height:auto e
   max-width:100%). L'inline-block manderebbe l'SVG in shrink-to-fit, e il
   middle toglierebbe lo stacco della linea di base che nell'originale c'e'. */

@media (max-width: 1024px) {
  /* Da tablet in giu' l'apertura NON e' piu' alta come lo schermo: 523px
     fissi, e compaiono i 5% di respiro laterale. Vale su tutte e cinque le
     pagine che usano questo blocco. */
  .or-media-hero {
    min-height: 523px;
    padding: 0% 5%;
  }

  .or-media-hero-title {
    font-size: 45px;
  }
}

@media (max-width: 767px) {
  /* Su telefono torna a tutta altezza. Non e' una svista della sorgente:
     e' scritto due volte, 523px a 1024 e 100vh a 767. */
  .or-media-hero {
    min-height: 100vh;
  }

  .or-media-hero-title {
    font-size: 28px;
    line-height: 1.1em;
  }

  /* post-249.css e gemelli: `img{width:100%}` solo a 767. */
  .or-media-hero-lettering {
    width: 100%;
  }
}

@media (prefers-reduced-motion: reduce) {
  /* La dissolvenza del contenitore video e la transizione del velo sono le
     uniche animazioni CSS dell'apertura. Il filmato lo ferma il JS. */
  .or-media-hero-media,
  .or-media-hero-veil {
    transition: none;
  }
}


/* ==========================================================================
   PRESENTAZIONE DELLA CASA  (blocco about-intro)
   post-37.css: container cbf504f, colonna interna f5317ac, marchio 13a2429,
   occhiello 66c684e, testo ec7c59e.
   ========================================================================== */

.or-about-intro {
  /* cbf504f: flex riga, align-items center, min-height 100vh, gap 0,
     margin 0%, padding 7% 12%. Le percentuali sono quelle vere e vanno
     lasciate percentuali: a 1440px fanno 100.8px in verticale e 172.8px
     in orizzontale, e cambiano con la larghezza. */
  position: relative;
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 0px;
  width: 100%;
  min-height: 100vh;
  margin: 0%;
  padding: 7% 12%;

  /* Qui la sorgente usa `background-image` (non la shorthand), quindi non
     azzera niente. background-position NON e' dichiarato: vale l'iniziale
     0% 0%, misurato. Chi legge sara' tentato di scrivere "center": e'
     proprio l'errore che sposta la schiuma di parecchio. */
  background-size: cover;
  background-position: 0% 0%;
  background-repeat: repeat;
}

/* Velo bianco al 60%: `--overlay-opacity:0.6` piu' `::before{background-color:#FFFFFF}`.
   Elemento vero e z-index positivo, non pseudo-elemento (vedi testata). */
.or-about-intro-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: block;
  background-color: var(--or-bianco);
  opacity: 0.6;
  pointer-events: none;
  transition: background 0.3s, border-radius 0.3s, opacity 0.3s;
}

/* f5317ac: colonna, gap 5px, padding 0% 10%, larghezza 100%.
   Il gap di 5px e' quello che separa marchio, occhiello e testo, e si somma
   ai padding dei singoli widget: non e' l'unica spaziatura in gioco. */
.or-about-intro-inner {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 5px;
  width: 100%;
  padding: 0% 10%;
}

/* 13a2429: il padding sta sul contenitore del widget, non sull'immagine,
   e vale 2em solo in basso. Il centraggio viene da
   `.elementor-widget-image{text-align:center}`. */
.or-about-intro-logo {
  padding: 0em 0em 2em 0em;
  text-align: center;
}

/* Il marchio e' largo il 15% della colonna: a 1440px sono 131px su 876.
   E' una percentuale, non una misura fissa: si rimpicciolisce da sola.
   `max-width` e' l'unica dichiarazione della sorgente (13a2429 img):
   niente display ne' vertical-align, l'immagine resta inline sulla linea di
   base come nell'originale. */
.or-about-intro-logo img {
  max-width: 15%;
}

/* L'occhiello prende tutta la tipografia da .or-eyebrow della base
   (Poppins 300, 16/14px, interlinea 1.5em, spaziatura 10px, maiuscolo).
   Qui resta solo l'allineamento, che e' l'unica cosa dichiarata a livello
   di elemento in post-37.css. */
.or-about-intro-eyebrow {
  text-align: center;
}

/* ec7c59e: il margine del 3% sta sul contenitore del widget e si somma al
   gap di 5px della colonna. Il testo e' Helvetica 16/14px con interlinea
   1.3em: sono gia' i valori di .or-body, qui non li ripeto. */
.or-about-intro-text {
  margin: 3% 0% 0% 0%;
  text-align: justify;
}

@media (max-width: 1024px) {
  /* Il 25% di margine in cima e' il grande stacco bianco fra apertura e
     racconto che si vede da tablet in giu'. E' calcolato sulla LARGHEZZA
     (225px a 900px di viewport), non sull'altezza. */
  .or-about-intro {
    flex-wrap: wrap;
    margin: 25% 0% 0% 0%;
    padding: 0% 5%;
  }

  .or-about-intro-inner {
    margin: 10% 0% 0% 0%;
  }
}

@media (max-width: 767px) {
  /* A 767 il margine del 25% sparisce e il respiro torna dentro al padding,
     con il basso (10%) doppio rispetto all'alto (5%). */
  .or-about-intro {
    margin: 0%;
    padding: 5% 10% 10% 10%;
  }

  .or-about-intro-inner {
    padding: 0px;
  }
}


/* ==========================================================================
   LE PERSONE  (blocco team)
   post-37.css: sezione 409fcbc (id="our-team"), titolo a44c479 e tre schede.
   Le tre schede NON sono un'alternanza: ognuna e' un container a se' con i
   suoi valori. Riporto la struttura vera scheda per scheda.

     Agata Brazzorotto  769df15  ritratto a SINISTRA, margin-bottom -1em
       ritratto 0f8a376  50%, padding 2em 2em 0 0,     gap 0
       testo    643c448  50%, padding 0   2em 0 0,     gap 9px, self center
       biografia 0dbc292 padding-top 0.5em

     Flavia Enchelli    00c48e5  ritratto a DESTRA,   margin-bottom 0
       testo    2ef58a2  50%, padding 0 0 0 2em,       gap 0,   self center
       ritratto c45ec5e  50%, padding 2em 0 0 2em,     gap 9px
       biografia d9aeb4c padding-top 1em

     Giuliano Giacomelli dbfbf3a ritratto a DESTRA,   margin-bottom -1em
       testo    99db316  50%, padding 0 0 0 2em,       gap 0,   self center
       ritratto 785ac60  50%, padding 2em 0 0 2em,     gap 9px
       biografia 6fe1718 padding-top 1em

   Da qui tre cose che il primo tentativo aveva perso:
   1) il lato del ritratto cambia per persona (S, D, D): non alterna;
   2) il rientro di 2em sta sempre sul lato INTERNO della coppia, quindi
      cambia lato insieme al ritratto;
   3) il gap di 9px cade sulla colonna del ritratto quando il ritratto e' a
      destra e sulla colonna del testo quando e' a sinistra. Ha effetto
      visibile solo sulla colonna con due figli, cioe' quella del testo: da
      qui lo stacco nome-biografia diverso, 9px+0.5em a sinistra contro
      0+1em a destra.
   ========================================================================== */

.or-team-section {
  /* 409fcbc: colonna, align-items center, min-height 100vh, gap 0,
     margin 0%, padding 9% 12% 12% 12% (in cima 9%, in fondo 12%). */
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0px;
  width: 100%;
  min-height: 100vh;
  margin: 0%;
  padding: 9% 12% 12% 12%;

  background-size: cover;
  background-position: 0% 0%;
  background-repeat: repeat;
}

/* Velo nero al 25%: `--overlay-opacity:0.25` piu' `::before{background-color:#000000}`.
   E' quello che tiene leggibile il bianco sopra la schiuma nera. */
.or-team-overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  display: block;
  background-color: var(--or-nero);
  opacity: 0.25;
  pointer-events: none;
  transition: background 0.3s, border-radius 0.3s, opacity 0.3s;
}

/* Titolo "our team": in post-37.css l'elemento a44c479 dichiara SOLO il
   colore bianco e un padding di 2em in basso sul contenitore del widget.
   Tipografia e famiglia arrivano da `.elementor-widget-heading .elementor-heading-title`,
   cioe' dal token primary del kit: AZO 600, 65/45/28px, interlinea
   1.2em (1.1em a 767). E' esattamente .or-display della base, quindi qui
   ci metto solo cio' che cambia.
   Selettore a due classi per battere il `padding:0` di .or-display senza
   dipendere dall'ordine di assemblaggio del file finale.
   Il testo resta allineato a start: a centrarlo e' l'align-items della
   sezione, che stringe il riquadro del titolo attorno alle sue parole.
   Il padding vale 2rem e non 2em di proposito: nella sorgente i 2em stanno
   sul contenitore del widget, che e' a 16px, quindi fanno 32px. Scritti
   come 2em qui finirebbero sul titolo stesso, a 65px, e diventerebbero
   130px. Misurato: 32px. */
.or-team-section > .or-team-title {
  position: relative;
  z-index: 2;
  padding: 0rem 0rem 2rem 0rem;
  color: var(--or-bianco);
  text-align: start;
}

/* La scheda. `--width:100%` da 768 in su, e sotto 767 lo impone comunque
   `.e-con.e-flex{--width:100%}`: e' 100% sempre.
   padding-top 7em = lo stacco fra una persona e l'altra. */
.or-team-member {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: row;
  gap: 0px;
  width: 100%;
  margin: 0em;
  padding: 7em 0em 0em 0em;

  /* NON viene dal rilievo: la sorgente non ha nessuno scroll-margin, quindi
     arrivando da un link con l'ancora il nome finisce sotto alla barra
     fissa. Lo tengo perche' e' il comportamento del tema attuale e le
     ancore delle persone sono un requisito di questa pagina. Segnalato. */
  scroll-margin-top: calc(var(--or-header-h) + 20px);
}

/* Il margine negativo di 1em ce l'hanno Agata e Giuliano, non Flavia.
   Non e' un ritmo: e' una scelta scheda per scheda, e va lasciata
   comandare dal contenuto. */
.or-team-member--tight {
  margin-bottom: -1em;
}

/* Le due colonne. Sono `.e-con` in colonna, quindi i figli si stirano in
   larghezza: e' cosi' che il text-align dentro il ritratto funziona. */
.or-team-portrait,
.or-team-text {
  display: flex;
  flex-direction: column;
  width: 50%;
}

/* La colonna del testo e' l'unica con --align-self:center: il testo si
   centra verticalmente rispetto al ritratto, che invece parte in alto. */
.or-team-text {
  align-self: center;
}

/* Il livello in mezzo esiste anche nell'originale (il contenitore del
   widget immagine) ed e' quello che centra il ritratto: la colonna e' un
   flex, quindi il text-align va messo su un figlio a blocco, non su di lei. */
.or-team-portrait-media {
  text-align: center;
}

/* Il ritratto esce a 400x400 veri finche' c'e' spazio, poi si restringe con
   il max-width:100% del reset. Nessuna regola di pagina lo tocca, e infatti
   qui non c'e' nessuna regola: resta inline sulla linea di base, come
   nell'originale. */

/* --- Ritratto a sinistra (Agata) ---------------------------------------- */
.or-team-member--left .or-team-portrait {
  gap: 0px;
  padding: 2em 2em 0em 0em;
}

.or-team-member--left .or-team-text {
  gap: 9px;
  padding: 0em 2em 0em 0em;
}

.or-team-member--left .or-team-bio {
  padding-top: 0.5em;
}

/* --- Ritratto a destra (Flavia, Giuliano) -------------------------------
   Nell'originale la colonna del testo viene PRIMA nel markup e il ritratto
   dopo. Qui il ritratto sta sempre prima (cosi' su telefono finisce in
   cima da solo, come nell'originale) e a spostarlo a destra ci pensa
   row-reverse, che e' anche il valore che la sorgente usa a 767. */
.or-team-member--right {
  flex-direction: row-reverse;
}

.or-team-member--right .or-team-portrait {
  gap: 9px;
  padding: 2em 0em 0em 2em;
}

.or-team-member--right .or-team-text {
  gap: 0px;
  padding: 0em 0em 0em 2em;
}

.or-team-member--right .or-team-bio {
  padding-top: 1em;
}

/* Il nome. AZO 45px anche da tablet (non scende a 45 da 65: parte gia' da
   45), interlinea 1em piena, bianco. Non e' .or-display: quello a desktop
   sarebbe 65px. */
.or-team-name {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-display);
  font-size: 45px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: 0px;
  color: var(--or-bianco);
  text-align: start;
}

/* La biografia. Helvetica 16/14px come .or-body, ma interlinea 1.2em e non
   1.3em: e' l'unico testo del sito con questo valore, e appiattirlo su 1.3
   allunga ogni scheda di parecchi pixel.
   Qui i paragrafi sono <p> veri (nell'introduzione erano <br><br>), quindi
   lo stacco e' lo 0.9rem di hello-elementor. E l'ULTIMO paragrafo tiene il
   suo margine: nell'originale nessuno lo azzera, e la colonna essendo
   centrata verticalmente si sposta davvero di quei 7px. */
.or-team-bio {
  line-height: 1.2em;
  color: var(--or-bianco);
  text-align: justify;
  --or-body-gap: 0.9rem;
}

.or-team-bio p:last-child {
  margin-bottom: var(--or-body-gap);
}

@media (max-width: 1024px) {
  /* Stesso stacco del 25% dell'introduzione, e i 5% di respiro laterale. */
  .or-team-section {
    flex-wrap: wrap;
    margin: 25% 0% 0% 0%;
    padding: 0% 5%;
  }

  /* La shorthand riscrive anche il margin-bottom: da tablet in giu' il
     -1em delle schede "strette" non c'e' piu'. E' voluto dalla sorgente,
     che a 1024 dichiara --margin-bottom:0%. */
  .or-team-member {
    margin: 10% 0% 0% 0%;
  }
}

@media (max-width: 767px) {
  .or-team-section {
    margin: 0%;
    padding: 25% 10% 10% 10%;
  }

  /* A 767 il titolo perde il suo 2em: resta solo la spaziatura della scheda. */
  .or-team-section > .or-team-title {
    padding: 0rem;
  }

  /* Le due colonne si impilano e il ritratto va sempre in cima, per tutte e
     tre le schede. Nell'originale ci si arriva per due strade diverse
     (riga+wrap per Agata, riga rovesciata+wrap-reverse per le altre due):
     il risultato misurato e' lo stesso, il ritratto sopra e il testo sotto. */
  .or-team-member,
  .or-team-member--right {
    flex-direction: column;
    padding: 0px;
  }

  .or-team-portrait,
  .or-team-text,
  .or-team-member--left .or-team-portrait,
  .or-team-member--left .or-team-text,
  .or-team-member--right .or-team-portrait,
  .or-team-member--right .or-team-text {
    width: 100%;
  }

  /* Il rientro di 2em sparisce e il ritratto prende 4em di stacco in cima. */
  .or-team-member--left .or-team-portrait,
  .or-team-member--right .or-team-portrait {
    padding: 4em 0em 0em 0em;
  }

  .or-team-member--left .or-team-text,
  .or-team-member--right .or-team-text {
    padding: 0em;
  }

  /* Il nome si centra solo qui. La biografia resta giustificata. */
  .or-team-name {
    font-size: 28px;
    line-height: 1.1em;
    text-align: center;
  }
}

@media (prefers-reduced-motion: reduce) {
  .or-about-intro-overlay,
  .or-team-overlay {
    transition: none;
  }
}

/* ==========================================================================
   CATALOGO E SCHEDE MODALI
   ========================================================================== */

/* ==========================================================================
   CATALOGO: testata, i due gruppi di locandine, le schede modali
   Blocchi: catalogue-intro, catalogue-group

   PROVENIENZA DEI VALORI
   La cartella rilievo/ non esisteva piu' quando ho lavorato (lo scratchpad
   era stato svuotato: c'erano solo rewrite/ e src/ delle pagine film). Per
   non stimare niente ho rifatto il rilievo del catalogo sulla sorgente vera,
   e ogni numero qui sotto cita il file e il selettore da cui viene:

   - catalogue.html                    pagina /catalogue/ (post 1138), scaricata
   - css/post-1138.css                 CSS di pagina generato da Elementor
   - css/post-1182.css ... post-1303   i 12 popup (le schede); i 9 usati in
                                       questa pagina hanno valori IDENTICI,
                                       verificati con un diff selettore per
                                       selettore: cambia solo l'id
   - css/post-28.css                   il kit globale (elementor-kit-28)
   - css/frontend.min.css              default di Elementor (.e-con, bottone)
   - css/dialog.min.css                base della finestra (dialog-*)
   - css/popup.min.css                 sovrascritture del popup di Elementor Pro
   - css/zoomIn.min.css                l'animazione di entrata
   - css/bounce-in.min.css             l'animazione del bottone
   - css/widget-image.min.css          il widget immagine
   - css/hello-style.min.css           il tema WordPress sotto (p, b, strong)
   Copia di tutto in scratchpad/orca/rilievo-mio/.

   DUE COSE CHE IL PRIMO TENTATIVO SBAGLIAVA E CHE QUI NON DEVONO TORNARE
   1. AZO sta in DUE punti soli: il titolo della testata (65px) e il titolo di
      ogni gruppo (45px). Claim, note, titolo della scheda, scheda tecnica,
      sinossi e bottone sono tutti Helvetica, scritto esplicitamente da
      Elementor riga per riga.
   2. Il velo nero della testata NON e' uno pseudo-elemento con z-index
      negativo: e' un div vero a z-index 1 col contenuto a 2. Un ::before
      sotto al contenuto e' proprio la costruzione che fa apparire il blocco
      come un rettangolo pieno dentro l'editor della console.

   I breakpoint di questo componente sono solo quelli di Elementor
   (max-width 1024px e max-width 767px). Il 768px scritto a mano dal cliente
   sta nel CSS di header e footer, non nel catalogo: qui non ne compare
   nessuno, e inventarne uno sarebbe peggio che ometterlo.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. TESTATA (container cc3af9c)
   -------------------------------------------------------------------------- */

/* La foto di fondo arriva inline dal campo del blocco, percio' qui non c'e'
   nessun background-image: ci sono solo le proprieta' che post-1138.css
   dichiara davvero. background-position e background-repeat NON sono
   dichiarati: restano ai default del browser (0% 0% e repeat). Scrivere
   "center/no-repeat" sarebbe stato piu' bello e falso. */
.or-catalogue-intro {
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 0vh;
  padding: 10em 0em 10em 0em;
  background-size: cover;
}

/* Il velo: --overlay-opacity 0.54 su ::before con background-color #000000 e
   --overlay-transition 0.3s. Qui e' un elemento esplicito perche' serve un
   impilamento senza sorprese (velo 1, contenuto 2, mai valori negativi e mai
   isolation:isolate). pointer-events:none perche' nell'originale il velo e'
   uno pseudo-elemento e non intercetta i click. */
.or-catalogue-intro__veil {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  background-color: var(--or-nero, #000000);
  opacity: 0.54;
  transition: opacity 0.3s;
  pointer-events: none;
}

/* Contenuto "boxed": e-con-inner e' min(100%, 1140px) centrato, con i 20px di
   --widgets-spacing fra un widget e l'altro (frontend.min.css). Il kit non
   ridefinisce ne' la larghezza ne' la spaziatura, quindi valgono i default. */
.or-catalogue-intro__body {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: min(100%, var(--or-container, 1140px));
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

/* Titolo: uno dei due soli punti del componente in cui l'originale usa AZO.
   Le misure sono scritte per esteso invece di appoggiarsi alla scala globale
   perche' sotto i 767px questa testata va a 36px mentre la scala di sistema
   va a 28px: appoggiarsi alla variabile rimpicciolirebbe il titolo di 8px
   senza che nessuno se ne accorga. */
.or-catalogue-intro__title {
  margin: 0;
  padding: 0;
  text-align: center;
  font-family: var(--or-font-display, "AZO", Sans-serif);
  font-size: 65px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-bianco, #ffffff);
}

/* Claim: Helvetica, non AZO. Il padding di 5em per lato e' quello del
   .elementor-widget-container ed e' l'unica cosa che gli fa da misura di
   riga: nell'originale non c'e' nessun max-width in ch o in px. */
.or-catalogue-intro__claim {
  margin: 0;
  padding: 0em 5em 0em 5em;
  text-align: center;
  font-family: var(--or-font-helvetica, "Helvetica", Sans-serif);
  font-size: 24px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-bianco, #ffffff);
}

@media (max-width: 1024px) {
  .or-catalogue-intro__title {
    font-size: 45px;
  }

  /* Sul tablet il claim diventa grande quanto il titolo: 24px che diventano
     45px. E' scritto cosi' in post-1138.css e non e' un refuso mio. */
  .or-catalogue-intro__claim {
    font-size: 45px;
  }
}

@media (max-width: 767px) {
  /* Sul telefono la testata diventa una schermata piena e centra il
     contenuto. Il padding laterale nella sorgente e' scritto "02em": lo zero
     in testa e' del cliente, il browser lo legge 2em. */
  .or-catalogue-intro {
    min-height: 100vh;
    justify-content: center;
    padding: 0em 2em 0em 2em;
  }

  .or-catalogue-intro__title {
    font-size: 36px;
    line-height: 1.1em;
  }

  /* Idem per "00em" sul lato destro del claim: vale zero. */
  .or-catalogue-intro__claim {
    padding: 0em 0em 0em 0em;
    font-size: 16px;
    line-height: 1.1em;
  }
}

/* --------------------------------------------------------------------------
   2. I DUE GRUPPI (container b4eb653 "in distribution" e 6573517 "in development")
   -------------------------------------------------------------------------- */

/* Fondo bianco pieno. Anche qui l'originale dichiara il velo nero, ma con
   --overlay-opacity 0: e' invisibile, quindi non lo costruisco. Un velo
   trasparente sarebbe solo un elemento in piu' da spiegare. */
.or-catalogue-group {
  display: flex;
  flex-direction: column;
  min-height: 0vh;
  padding: 5em 0em 5em 0em;
  background-color: var(--or-bianco, #ffffff);
}

.or-catalogue-group__body {
  width: 100%;
  max-width: min(100%, var(--or-container, 1140px));
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

/* Titolo del gruppo: AZO 45px, non 65px. E' il secondo e ultimo punto del
   componente col font display. */
.or-catalogue-group__title {
  margin: 0;
  padding: 0;
  text-align: center;
  font-family: var(--or-font-display, "AZO", Sans-serif);
  font-size: 45px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-nero, #000000);
}

/* Nota del gruppo: stessi valori del claim della testata, ma nera. */
.or-catalogue-group__note {
  margin: 0;
  padding: 0em 5em 0em 5em;
  text-align: center;
  font-family: var(--or-font-helvetica, "Helvetica", Sans-serif);
  font-size: 24px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-nero, #000000);
}

/* La riga di locandine.
   I due gruppi NON sono la stessa impaginazione con un numero diverso di
   colonne, sono due costruzioni diverse:
   - "in distribution" e' UN solo container riga (d125003) con
     justify-content:space-around, align-items:center, --align-self:center e
     tre locandine da 300px;
   - "in development" sono TRE container riga separati (0b601ce, f339293,
     000dfc1), ognuno con justify-content:center e due locandine.
   Attenzione a cosa fa davvero --align-self:center su d125003: la riga e' un
   flex item di una colonna, quindi con align-self diverso da stretch NON si
   allarga a 1140px, si stringe sul contenuto (300+20+300+20+300 = 940px) e
   si centra. Di conseguenza space-around non ha spazio libero da
   distribuire: le tre locandine restano a 20px l'una dall'altra e il gruppo
   e' centrato. La riga da due invece NON ha --align-self, quindi si stira a
   1140px ed e' justify-content:center a centrare le due locandine.
   Le locandine non si allargano: le variabili --container-widget-width e
   --container-widget-flex-grow che Elementor scrive sui container in questa
   versione (3.26.4) non sono lette da nessuna regola di frontend.min.css,
   quindi i widget restano flex item normali larghi quanto l'immagine. E'
   per questo che justify-content conta davvero.
   Il gap di 20px e' --widgets-spacing del kit, non una scelta. */
.or-catalogue-group__row {
  display: flex;
  flex-direction: row;
  align-items: center;
  gap: 20px;
  padding: 0em;
}

/* Variante a tre (in distribution). --align-self:center e' dichiarato solo su
   questa riga (.e-con di d125003) ed e' proprio lui a togliere lo stiramento:
   la riga si stringe sulle tre locandine. space-around resta perche' sta
   nella sorgente e perche' torna a contare quando le locandine sono piu' di
   tre o quando la finestra e' piu' stretta della riga. */
.or-catalogue-group__row--3 {
  align-self: center;
  justify-content: space-around;
}

/* Variante a due (in development). L'editor gestisce un array solo, quindi le
   tre righe separate del sorgente diventano una riga che va a capo ogni due:
   il taglio a 620px e' 300 + 20 + 300, cioe' la larghezza esatta occupata da
   due locandine, e due elementi centrati in 620px centrati a loro volta in
   1140px cadono negli stessi pixel in cui li mette la sorgente (dove la riga
   e' larga 1140px e le centra justify-content:center). Questa e' l'unica
   misura del componente che non e' copiata: e' calcolata da misure copiate,
   ed e' segnalata. */
.or-catalogue-group__row--2 {
  justify-content: center;
  flex-wrap: wrap;
  max-width: min(100%, 620px);
  margin-inline: auto;
}

/* L'ordine di questi due blocchi conta: sono due soglie max-width, sotto i
   767px si applicano tutte e due e vince l'ultima scritta. Invertirle
   rimetterebbe la nota a 45px sul telefono, cioe' il contrario della
   sorgente. */
@media (max-width: 1024px) {
  /* Il titolo del gruppo resta 45px (la regola c'e', ripetuta identica); la
     nota invece sale da 24px a 45px come il claim della testata. */
  .or-catalogue-group__note {
    font-size: 45px;
  }
}

@media (max-width: 767px) {
  .or-catalogue-group {
    padding: 2em 2em 2em 2em;
  }

  .or-catalogue-group__title {
    font-size: 36px;
    line-height: 1.1em;
  }

  .or-catalogue-group__note {
    padding: 0em 0em 0em 0em;
    font-size: 16px;
    line-height: 1.1em;
  }

  /* --flex-wrap-mobile:wrap: sotto i 767px Elementor manda a capo i figli di
     qualsiasi container in riga (frontend.min.css, .e-con.e-flex dentro la
     media query 767). Sopra i 767 la riga da tre NON va a capo: fra 768px e
     940px di finestra le tre locandine escono dallo schermo, ed e' cosi'
     anche sul sito vero. */
  .or-catalogue-group__row--3 {
    flex-wrap: wrap;
  }
}

/* --------------------------------------------------------------------------
   3. LA LOCANDINA (.locandina, CSS scritto a mano dal cliente in post-1138)
   -------------------------------------------------------------------------- */

/* Il CSS del cliente e' esattamente questo:
     .locandina { transition: transform 0.3s ease; border-radius: 24px!important; overflow: hidden; }
     .locandina:hover { transform: scale(1.05); }
   Niente ombra, niente bordo, e soprattutto NESSUN titolo che compare in
   hover: quello e' il carosello della home, non il catalogo. Il !important
   della sorgente qui non serve, perche' non c'e' nessuna regola che gli
   contende il raggio.
   La locandina e' larga 300px fissi a tutti e tre i breakpoint: le nove
   regole img{width:300px} di post-1138.css non hanno nessun override. */
.or-poster {
  display: inline-block;
  text-align: center;
  cursor: pointer;
  overflow: hidden;
  border-radius: 24px;
  transition: transform 0.3s ease;
}

.or-poster:hover {
  transform: scale(1.05);
}

.or-poster img {
  display: inline-block;
  vertical-align: middle;
  width: 300px;
  max-width: 100%;
  height: auto;
}

/* Nessuna regola :focus sulle locandine in post-1138.css e nessun outline
   tolto: chi naviga da tastiera vede il contorno del browser. Lasciarlo e'
   fedele e accessibile insieme, non serve aggiungere niente. */

@media (prefers-reduced-motion: reduce) {
  .or-poster {
    transition: none;
  }

  .or-poster:hover {
    transform: none;
  }
}

/* --------------------------------------------------------------------------
   4. LA SCHEDA MODALE: velo, pannello, area che scorre
   Ogni scheda e' un popup di Elementor Pro. I 9 popup della pagina hanno gli
   stessi identici valori.
   -------------------------------------------------------------------------- */

/* Il velo. dialog.min.css lo mette fixed con bottom/left (il top non lo
   dichiara proprio) e z-index 9999; popup.min.css lo rende flex; il CSS del
   popup gli da' il fondo nero all'80%, il centraggio e pointer-events:all.
   Nell'originale il popup e' fuori dal flusso finche' il JS non lo apre:
   qui fanno lo stesso lavoro l'attributo hidden e questo display:none, e la
   classe is-open lo accende.
   pointer-events:all sta nel CSS del popup perche' popup.min.css spegne i
   click su tutto il velo (pointer-events:none) e poi il popup li riaccende.
   Qui la regola che li spegneva non c'e', quindi la riga non cambia niente:
   la scrivo perche' e' nel rilievo e perche' senza di lei chi legge si
   chiede se il click sul velo sia stato dimenticato.
   NON riporto invece user-select:none di dialog.min.css: popup.min.css lo
   rimette a "auto" su .elementor-popup-modal.dialog-type-lightbox, quindi sul
   sito vero il testo della scheda si seleziona eccome. */
.or-modal {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 9999;
  display: none;
  align-items: center;
  justify-content: center;
  background-color: rgba(0, 0, 0, 0.8);
  pointer-events: all;
}

.or-modal.is-open {
  display: flex;
}

/* Il pannello bianco (.dialog-widget-content). Non ha una larghezza propria:
   la prende dall'area messaggio (80vw x 90vh). overflow:visible viene da
   popup.min.css e ha una conseguenza vera: il raggio di 24px non ritaglia il
   contenuto, e' l'area messaggio a scorrere.
   La sorgente scrive position:absolute (dialog.min.css) perche' il JS di
   Elementor lo posiziona a mano; qui il pannello e' gia' centrato dal velo,
   quindi relative da' lo stesso reso e serve da riferimento alla X senza
   dipendere dalla posizione statica di un assoluto dentro un flex container.
   E' l'unica proprieta' del componente scritta diversa dalla sorgente. */
.or-modal-panel {
  position: relative;
  width: auto;
  max-width: 100%;
  max-height: 100%;
  overflow: visible;
  pointer-events: all;
  background-color: var(--or-bianco, #ffffff);
  border-radius: 24px 24px 24px 24px;
  box-shadow: 2px 8px 23px 3px rgba(0, 0, 0, 0.2);
  animation-name: or-cat-zoom-in;
  animation-duration: 0.4s;
}

/* zoomIn di Elementor, verbatim da zoomIn.min.css: parte da scala 0,3 e
   opacita' zero ed e' gia' opaco a meta' corsa. Non e' uno scale(0.85), e la
   durata e' quella dichiarata nei data-settings del popup
   ("entrance_animation_duration": 0.4). */
@keyframes or-cat-zoom-in {
  from {
    opacity: 0;
    transform: scale3d(0.3, 0.3, 0.3);
  }

  50% {
    opacity: 1;
  }
}

/* frontend.min.css spegne .animated dentro prefers-reduced-motion: il
   rispetto delle preferenze di movimento e' gia' nell'originale. */
@media (prefers-reduced-motion: reduce) {
  .or-modal-panel {
    animation: none;
  }
}

/* L'area che scorre (.dialog-message): e' lei ad avere la misura, l'overflow
   e la line-height 1.5, ed e' per questo che la X resta ferma mentre il testo
   scorre. align-items:flex-start tiene il contenuto in alto quando e' piu'
   corto di 90vh. */
.or-modal-message {
  display: flex;
  align-items: flex-start;
  width: 80vw;
  height: 90vh;
  max-width: 100vw;
  max-height: 100vh;
  padding: 0;
  overflow: auto;
  line-height: 1.5;
}

/* Il container interno della scheda (e75360b e omologhi): colonna, 20px fra
   un widget e l'altro, padding 2em sopra e 4em sugli altri tre lati.
   E' e-con-full, cioe' senza tetto di larghezza: su un monitor da 1920 il
   testo si stende su una sola colonna larga 1408px. Lo riporto com'e':
   mettere un max-width di leggibilita' sarebbe una correzione, non un
   rilievo. */
.or-modal-body {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding: 2em 4em 4em 4em;
}

/* La X di chiusura (.dialog-close-button): 15px, in alto a destra del
   pannello e fuori dall'area che scorre. Non e' un pallino nero.
   margin e padding a zero perche' nell'originale non e' un <button> ma un
   div: senza reset ci finirebbe sopra il padding di default del bottone.
   Nessuno stato hover: nella sorgente l'hover cambia "color", ma l'icona e'
   colorata con "fill", quindi non succede niente. Non lo invento. */
.or-modal-close {
  position: absolute;
  top: 20px;
  inset-inline-end: 20px;
  z-index: 9999;
  display: flex;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  font-size: 15px;
  line-height: 1;
  opacity: 1;
  pointer-events: all;
  cursor: pointer;
}

.or-modal-close svg {
  width: 1em;
  height: 1em;
  fill: #1f2124;
}

@media (max-width: 767px) {
  /* Solo la larghezza cambia: l'altezza resta 90vh, a 767px non c'e' nessun
     override. */
  .or-modal-message {
    width: 90vw;
  }

  .or-modal-body {
    padding: 2em 2em 2em 2em;
    /* --flex-wrap-mobile:wrap e' dichiarato anche su questo container e
       sotto i 767px Elementor lo applica. Su una colonna a altezza libera non
       cambia niente di visibile: lo riporto perche' sta nella sorgente, non
       perche' serva. */
    flex-wrap: wrap;
  }
}

/* --------------------------------------------------------------------------
   5. CONTENUTI DELLA SCHEDA
   Ordine nella sorgente: immagine larga, bottone, titolo, testo. Il bottone
   sta SOPRA il titolo, non in fondo alla scheda.
   -------------------------------------------------------------------------- */

/* Immagine larga (.wide-title, CSS a mano del cliente):
     .wide-title { overflow: hidden; border-radius: 14px!important; }
   piu' img{width:100%} dal CSS del popup. E' cliccabile e porta allo stesso
   URL del bottone, tranne in "The Full Moon Match" (popup 1296), che nel
   sorgente non ha ne' bottone ne' link: la sua immagine e' una img nuda. */
.or-modal-wide {
  display: block;
  overflow: hidden;
  border-radius: 14px;
}

.or-modal-wide img,
img.or-modal-wide {
  width: 100%;
  height: auto;
}

/* Il bottone e' centrato dalla classe elementor-align-center, che in
   frontend.min.css e' solo text-align:center sul widget. */
.or-modal-cta {
  text-align: center;
}

/* Il bottone del pitch deck.
   Base .elementor-button (frontend.min.css): display inline-block, color
   #fff, fill #fff, line-height 1, padding 12px 24px, text-align center,
   transition all .3s. La taglia "sm" non ha regole proprie, quindi il padding
   resta quello di base.
   Override del popup: fondo nero, Helvetica 24px/600, capitalize, raggio 35px.
   Le regole stanno su .or-btn.or-btn--pitch (due classi) per vincere sul
   bottone della base a prescindere dall'ordine di assemblaggio del file. */
.or-btn.or-btn--pitch {
  display: inline-block;
  padding: 12px 24px;
  border: 0;
  border-radius: 35px 35px 35px 35px;
  background-color: var(--or-nero, #000000);
  color: var(--or-bianco, #ffffff);
  fill: var(--or-bianco, #ffffff);
  text-align: center;
  text-decoration: none;
  text-transform: capitalize;
  font-family: var(--or-font-helvetica, "Helvetica", Sans-serif);
  font-size: 24px;
  font-weight: 600;
  font-style: normal;
  line-height: 1em;
  letter-spacing: 0px;
  transition: all 0.3s;
}

/* In hover il bottone NON si inverte: nel sorgente l'unico background
   dichiarato e' quello normale (#000000) e l'unica regola di stato e'
   .elementor-button:focus,:hover,:visited{color:#fff}. Riscrivo qui anche il
   fondo nero perche' il bottone generico della base si inverte, e senza
   questa riga la scheda erediterebbe un'inversione che l'originale non fa. */
.or-btn.or-btn--pitch:focus,
.or-btn.or-btn--pitch:hover,
.or-btn.or-btn--pitch:visited {
  background-color: var(--or-nero, #000000);
  color: var(--or-bianco, #ffffff);
}

/* Il contenuto del bottone e' un flex in riga con 5px di gap: e' cosi' che
   Elementor impagina .elementor-button-content-wrapper anche quando dentro
   c'e' solo il testo. */
.or-btn.or-btn--pitch .or-btn__content {
  display: flex;
  flex-direction: row;
  gap: 5px;
  justify-content: center;
}

.or-btn.or-btn--pitch .or-btn__text {
  display: inline-block;
}

/* e-animation-bounce-in: porta la transizione a 0.5s e in hover, focus e
   active fa scale(1.2) con quella curva che sfonda oltre l'1 e torna
   indietro. Sono i valori di bounce-in.min.css, non un'approssimazione. */
.or-btn.or-btn--pitch.or-anim-bounce {
  transition-duration: 0.5s;
}

.or-btn.or-btn--pitch.or-anim-bounce:hover,
.or-btn.or-btn--pitch.or-anim-bounce:focus,
.or-btn.or-btn--pitch.or-anim-bounce:active {
  transform: scale(1.2);
  transition-timing-function: cubic-bezier(0.47, 2.02, 0.31, -0.36);
}

@media (prefers-reduced-motion: reduce) {
  .or-btn.or-btn--pitch,
  .or-btn.or-btn--pitch.or-anim-bounce {
    transition: none;
  }

  .or-btn.or-btn--pitch.or-anim-bounce:hover,
  .or-btn.or-btn--pitch.or-anim-bounce:focus,
  .or-btn.or-btn--pitch.or-anim-bounce:active {
    transform: none;
  }
}

/* Titolo del film: Helvetica 45px, non AZO e non la scala dei titoli di
   sezione. .elementor-heading-title azzera margini e padding. */
.or-modal-title {
  margin: 0;
  padding: 0;
  text-align: center;
  font-family: var(--or-font-helvetica, "Helvetica", Sans-serif);
  font-size: 45px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: 0px;
  color: var(--or-nero, #000000);
}

/* Scheda tecnica e sinossi sono UN SOLO widget di testo: stessa famiglia,
   stesso corpo, stesso peso 500. Il padding di 1em sopra e sotto e' quello
   del .elementor-widget-container. */
.or-modal-text {
  padding: 1em 0em 1em 0em;
  font-family: var(--or-font-helvetica, "Helvetica", Sans-serif);
  font-size: 24px;
  font-weight: 500;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.5em;
  letter-spacing: 0px;
  color: var(--or-nero, #000000);
}

/* La spaziatura fra i paragrafi della scheda viene dal tema WordPress sotto
   (hello-elementor: p{margin-block-start:0;margin-block-end:.9rem}). La
   riscrivo qui limitata alla scheda perche' e' una misura visibile del
   componente e non voglio dipendere da cosa finisce nel reset della base. */
.or-modal-text p {
  margin-block-start: 0;
  margin-block-end: 0.9rem;
}

/* Le coppie voce/valore non sono una griglia e non sono una tabella: sono un
   solo paragrafo in cui ogni coppia sta su una riga, etichetta in grassetto,
   due punti, valore, <br>. L'ultima coppia non ha il <br>.
   Il peso 700 e' scritto esplicito: nella sorgente arriva da
   b,strong{font-weight:bolder} di hello-elementor calcolato su un contenitore
   a 500; "bolder" in un contesto diverso darebbe 900. */
.or-modal-text b,
.or-modal-text strong {
  font-weight: 700;
}

/* Il valore torna a 400: nella sorgente e' uno style inline
   (<span style="font-weight: 400;">) su ogni valore, e non e' un dettaglio da
   ignorare, perche' il contenitore e' a 500. */
.or-modal-spec-value {
  font-weight: 400;
}

/* Le etichette sono gia' maiuscole nel testo (TITLE, TYPE, DIRECTOR,
   DURATION, YEAR, STATUS): nessun text-transform le forza. Se il redattore
   scrive "Regia", nella scheda si legge "Regia". */

@media (max-width: 1024px) {
  /* Il titolo del film resta 45px; il testo crolla da 24px a 14px e ci resta
     anche sotto i 767px, dove non c'e' un secondo scalino. Il salto e' cosi'
     grande nella sorgente: non l'ho addolcito. */
  .or-modal-text {
    font-size: 14px;
  }

  /* Stesso scalino per il bottone: 24px sul desktop, 14px da 1024 in giu'. */
  .or-btn.or-btn--pitch {
    font-size: 14px;
  }
}

@media (max-width: 767px) {
  .or-modal-title {
    font-size: 28px;
    line-height: 1.1em;
  }
}

/* ==========================================================================
   PAGINE FILM: SINOSSI, CREDITI, INVITO
   ========================================================================== */

/* ==========================================================================
   PAGINE FILM - sinossi, fascia crediti, invito social
   Blocchi: project-synopsis, project-credits, project-cta.

   Ogni numero qui dentro viene da rilievo/film.md, che a sua volta cita la
   riga di post-249.css / post-579.css / post-621.css / post-628.css (le
   quattro pagine film), del kit post-28.css e dei CSS vendor di Elementor.
   Dove il rilievo dice "non dichiarato" qui non c'e' niente: le lacune
   stanno nel rapporto, non riempite a occhio.

   Due avvertenze che valgono per tutto il file.

   1. Il font. Nelle pagine film Elementor scrive esplicitamente
      font-family:"Helvetica", Sans-serif su citazione, corpo, didascalia,
      titolo crediti, crediti, invito e bottone. AZO compare in UN SOLO
      punto delle pagine film, il titolo "discover our projects" della
      fascia carosello, che non e' di questo componente. Qui dentro AZO non
      deve comparire mai: e' l'errore piu' pesante del primo tentativo.

   2. I breakpoint. Sulle pagine film ci sono solo quelli di Elementor:
      min-width 768px, max-width 1024px, max-width 767px. Il 768px scritto a
      mano che si contraddice col 767 di Elementor sta nel CSS di header e
      footer, non qui: in questo file non ne compare nessuno.
   ========================================================================== */

/* ==========================================================================
   APERTURA: il lettering
   L'apertura video e' markup del blocco media-hero (altro componente), ma
   la misura del lettering e' una regola delle pagine film e il primo
   tentativo l'aveva sbagliata di grosso, quindi la correzione sta qui.

   Nell'originale l'SVG del titolo non ha ne' width/height ne' viewBox
   tradotto in dimensione intrinseca (solo il rapporto 1920x1080) e nessun
   CSS gli mette un max-width: il browser gli da' quindi tutta la larghezza
   del blocco contenitore. Misurato a 1440: 1440x810. Il tema precedente lo
   tappava a min(78vw, 900px) e da li' nasceva anche l'errore di calcolo
   dello script che centra la pagina.
   ========================================================================== */

.or-hero-lettering {
  /* widget-image.min.css: il widget e' text-align:center, l'img
     inline-block, vertical-align:middle. La larghezza e' l'effetto della
     cascata, la scrivo esplicita perche' qui l'SVG e' inline in pagina e
     senza questa riga resterebbe alla sua dimensione intrinseca. */
  display: inline-block;
  vertical-align: middle;
  width: 100%;
  height: auto;
  margin: 0;
}

/* ==========================================================================
   SINOSSI (blocco project-synopsis)
   Riga a due colonne: a sinistra citazione + racconto, a destra fotogramma
   + didascalia. Container 6985d0c e omologhi.
   ========================================================================== */

.or-synopsis {
  /* Il container e' boxed: Elementor mette il padding ORIZZONTALE sul
     contenitore esterno e quello VERTICALE sulla .e-con-inner. Non e' un
     dettaglio: le due percentuali si risolvono su larghezze diverse
     (1440 fuori, 1296 dentro), cioe' 72px ai lati e 64.8px sopra e sotto. */
  padding: 0 5%;
}

.or-synopsis-inner {
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin-inline: auto;
  padding: 5% 0;

  display: flex;
  flex-direction: row;
  align-items: center;
  /* --gap:0px 040px del sorgente: 40px fra le colonne, 0 fra le righe.
     Lo zero iniziale di "040px" e' nel sorgente, il valore e' 40px. */
  row-gap: 0px;
  column-gap: 40px;
}

/* Le colonne sono al 50% (@media min-width:768px) dentro una riga larga
   1140: 570+40+570 sfora, e il flex-shrink le riporta a 550 ciascuna.
   E' esattamente cio' che si misura sull'originale, quindi lascio fare al
   flex invece di scrivere una larghezza gia' compensata. */
.or-synopsis-text,
.or-synopsis-still {
  width: 50%;
  display: flex;
  flex-direction: column;
}

/* Colonna sinistra: --gap non dichiarato, quindi vale --widgets-spacing
   del kit = 20px. E' questo, non un margine del titolo, a staccare la
   citazione dal racconto. */
.or-synopsis-text {
  gap: 20px;
}

/* Colonna destra: --gap:05px 05px = 5px fra fotogramma e didascalia.
   margin:0 perche' <figure> ha un margine di default del browser che
   nell'originale (un container Elementor) non esiste. */
.or-synopsis-still {
  gap: 5px;
  margin: 0;
}

/* Su free-spirits, lanniversario e il-silenzio la colonna del fotogramma
   ha --padding-top:2em; su corpi e' 0. E' l'unica differenza di layout
   della sinossi fra le quattro pagine, per questo e' un'opzione del
   blocco e non un valore fisso. */
.or-synopsis-still--abbassato {
  padding-top: 2em;
}

/* Citazione d'apertura: Helvetica 42/600 CORSIVO, interlinea 1em,
   crenatura -1.3px, nero pieno, allineata a sinistra (nessun text-align
   dichiarato: resta l'ereditato). Margini e padding a zero: la distanza
   dal racconto e' il gap di 20px della colonna. */
.or-synopsis-quote {
  margin: 0;
  padding: 0;
  font-family: var(--or-font-helvetica);
  font-size: 42px;
  font-weight: 600;
  font-style: italic;
  text-transform: none;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -1.3px;
  color: var(--or-nero);
}

/* Racconto: Helvetica 24/300. NON uso .or-body della base, che e' 16/400
   con interlinea 1.3em: qui i valori sono altri e vengono dal widget
   text-editor della pagina. Il padding-top di 0.5em e' sul widget e si
   risolve sul suo stesso corpo (24px), cioe' 12px. */
.or-synopsis-body {
  padding-top: 0.5em;
  font-family: var(--or-font-helvetica);
  font-size: 24px;
  font-weight: 300;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: -0.5px;
  color: var(--or-nero);
}

/* p{margin-block-end:.9rem} di hello-elementor: 14.4px fissi, non legati
   al corpo del testo. L'ultimo paragrafo non stacca perche' sotto non c'e'
   nulla e il gap della colonna e' gia' contato. */
.or-synopsis-body p {
  margin: 0 0 0.9rem;
}

.or-synopsis-body p:last-child {
  margin-bottom: 0;
}

/* Il <strong> dentro un testo di peso 300 risolve "bolder" a 400, non a
   700: misurato sull'originale. Il grassetto della sinossi e' quindi solo
   uno scalino, ed e' voluto. */
.or-synopsis-body strong,
.or-synopsis-body b {
  font-weight: 400;
}

.or-synopsis-still img {
  /* Nessun border-radius: la regola .locandina{border-radius:24px} esiste
     ma sta nel CSS della pagina catalogo, che qui non viene caricato. */
  max-width: 100%;
  height: auto;
  border-radius: 0;
}

/* Didascalia: Helvetica 12/300 corsivo, grigio #4B4B4B, centrata. */
.or-synopsis-caption {
  margin: 0;
  text-align: center;
  font-family: var(--or-font-helvetica);
  font-size: 12px;
  font-weight: 300;
  font-style: italic;
  text-transform: none;
  text-decoration: none;
  line-height: 1.5em;
  letter-spacing: 0px;
  color: #4b4b4b;
}

.or-synopsis-caption strong,
.or-synopsis-caption b {
  font-weight: 400;
}

/* ==========================================================================
   FASCIA CREDITI (blocco project-credits)
   Container d8c5354 e omologhi: e-con-full, alto 105vh, sfondo con
   motion-fx, velo nero al 60%, titolo, poi riga locandina + crediti.

   NOTA SULL'IMPILAMENTO. Il tema precedente otteneva sfondo e velo con due
   pseudo-elementi a z-index -2 e -1 dentro un contesto creato da
   isolation:isolate. Nell'editor della console quel contesto faceva finire
   l'evidenziatore del blocco SOPRA al contenuto: il blocco si vedeva come
   un rettangolo verde pieno. Qui non c'e' ne' isolation ne' z-index
   negativi: lo sfondo e il velo sono due elementi veri dentro un
   contenitore a z-index 0, e il contenuto sta a z-index 1.
   ========================================================================== */

.or-credits {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  min-height: 105vh;
  /* --padding-top/bottom:5%, lati 0%. Sul contenitore, non sull'inner:
     questa fascia e' e-con-full e la .e-con-inner non ce l'ha. */
  padding: 5% 0;
  color: var(--or-bianco);
}

/* Variante di il-silenzio-del-padre: la fascia non ha padding esterno, il
   titolo prende 5% sopra e la riga dei crediti 5em sotto. */
.or-credits--aria-in-fondo {
  padding: 0;
}

/* Il contenitore dello sfondo replica .elementor-motion-effects-container:
   assoluto, a tutta fascia, con overflow nascosto perche' il layer dentro
   e' piu' largo della fascia. z-index 0, mai negativo. */
.or-credits-bg {
  position: absolute;
  inset: 0;
  overflow: hidden;
  z-index: 0;
  pointer-events: none;
}

/* Il layer del motion-fx. La larghezza NON e' una scelta: pro-frontend.js
   la calcola come 100 + 10 * velocita', e la velocita' dichiarata nei
   data-settings delle quattro pagine e' 5, quindi 150%. L'escursione della
   traslazione e' di conseguenza (150% - 100%) = mezza larghezza della
   fascia, sempre verso sinistra. Il valore lo scrive il JS in
   --or-translate-x, come Elementor scrive --translateX.
   La transizione e' quella vera di motion-fx.min.css: e' lei a rendere
   morbido un valore che il JS aggiorna a scatti. */
.or-credits-layer {
  position: absolute;
  left: 0;
  top: 0;
  width: 150%;
  height: 100%;
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center center;
  transform: translateX(var(--or-translate-x, 0px));
  transition-duration: 1s;
  transition-property: transform, opacity;
  transition-timing-function: cubic-bezier(0, 0.33, 0.07, 1.03);
}

/* Velo nero al 60% (--overlay-opacity:0.6). E' un elemento e non un
   ::before con z-index negativo: vedi la nota sull'impilamento. */
.or-credits-veil {
  position: absolute;
  inset: 0;
  background-color: var(--or-nero);
  opacity: 0.6;
  transition: opacity 0.3s;
}

/* Titolo e riga sono due container boxed dentro una fascia full: hanno
   ciascuno la propria inner larga al massimo 1140 e centrata. */
.or-credits-head,
.or-credits-body {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin-inline: auto;
}

.or-credits-head {
  display: flex;
  flex-direction: column;
  padding: 0;
}

.or-credits--aria-in-fondo .or-credits-head {
  padding-top: 5%;
}

/* Titolo della fascia: stesso token globale della citazione della sinossi
   (Helvetica 42/600/1em/-1.3px) ma dritto e bianco. Nessun margine sotto:
   lo stacco e' il --padding-top:2em della riga qui sotto. */
.or-credits-title {
  margin: 0;
  padding: 0;
  text-align: center;
  font-family: var(--or-font-helvetica);
  font-size: var(--or-kit-helvetica-title-size);
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -1.3px;
  color: var(--or-bianco);
}

/* Il flex va su -body-inner, non su -body: -body ha un figlio solo
   (l'inner) ed e' li' dentro che stanno le due colonne al 50%. Messo un
   livello piu' su, le percentuali non avevano un padre flex e locandina e
   crediti si impilavano su tutta la larghezza. */
/* La scheda sta a meta' della locandina, com'e' nella sorgente: una
   scheda di due righe appesa al bordo alto lascerebbe sotto un buco alto
   quanto mezzo manifesto. Quando invece i crediti sono piu' alti della
   locandina, e' la locandina a centrarsi su di loro. */
.or-credits-body-inner {
  display: flex;
  flex-direction: row;
  align-items: center;
  /* Nella sorgente il gap non e' dichiarato e vale il --widgets-spacing
     del kit, 20px. Con la locandina attaccata al bordo sinistro e la
     scheda subito accanto, 20px sarebbero troppo pochi: 3em e' l'aria che
     separa le due colonne senza riaprire il vuoto di prima. */
  gap: 3em;
  padding: 2em 0 0;
}

.or-credits--aria-in-fondo .or-credits-body {
  padding-bottom: 5em;
}

/* Le due meta' esatte della sorgente lasciavano 240px di vuoto a sinistra
   della locandina, che era spinta a destra dentro la sua colonna e larga
   al massimo 320px. Ora la locandina parte dal bordo sinistro della riga
   ed e' larga 26em = 416px: si prende lo spazio che prima era vuoto e la
   scheda le sta accanto, non a mezza pagina di distanza.
   flex-basis e non width, cosi' sotto i 1024px la locandina si stringe
   invece di schiacciare i crediti. */
.or-credits-poster {
  flex: 0 1 26em;
  text-align: left;
}

/* base 0 e non auto: con auto la colonna parte dalla larghezza del suo
   testo piu' lungo, il totale supera la riga e la locandina si stringe
   invece di restare ai suoi 26em.
   Il tetto di 32em serve alle righe di stacco: senza, arriverebbero fino
   al bordo destro della riga, molto oltre l'ultimo nome. Cosi' la scheda
   sta tutta a sinistra, appoggiata alla locandina. */
.or-credits-list {
  flex: 1 1 0;
  min-width: 0;
  max-width: 32em;
}

.or-credits-poster img {
  width: 100%;
  max-width: 26em;
  height: auto;
  border-radius: 0;
}

/* I crediti sono una scheda tecnica a due colonne, non l'elenco a bandiera
   dell'originale: e' la richiesta della produzione, l'unico punto delle
   pagine film dove il tema si stacca apposta dal sorgente WordPress.
   Li' ogni riga era "<b>Ruolo:</b> Nome" dentro un paragrafo, con un
   rientro destro di 14em a mandare a capo i nomi lunghi dove capitava.

   Qui ruoli e nomi stanno su due colonne vere, allineate su tutte le
   righe: la colonna dei ruoli si dimensiona sul ruolo piu' lungo
   (max-content) e ogni riga eredita quelle stesse colonne con subgrid,
   cosi' i nomi partono tutti dalla stessa verticale e le righe che vanno
   a capo rientrano sotto al nome, non sotto al ruolo. Niente righelli fra
   una riga e l'altra: quello che separa e' lo stacco fra i gruppi, dove
   passa una linea sottilissima. */
.or-credits-list {
  display: grid;
  grid-template-columns: max-content minmax(0, 1fr);
  column-gap: 2em;
  row-gap: 0.55em;
  align-content: start;
  margin: 0;
  padding: 0;
  font-family: var(--or-font-helvetica);
  font-size: 16px;
  font-weight: 300;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1.2em;
  letter-spacing: -0.5px;
  color: var(--or-bianco);

  /* Stacco fra un gruppo di crediti e il successivo. Default: il margine
     di un paragrafo, .9rem = 14.4px (corpi). Le altre due misure sono le
     altre due meccaniche vere, vedi le varianti qui sotto. */
  --or-credits-gap: 0.9rem;
}

/* lanniversario e il-silenzio non hanno <p>: i gruppi sono separati da
   <br><br>, cioe' da una riga vuota alta quanto l'interlinea (1.2em). */
.or-credits-list--riga-vuota {
  --or-credits-gap: 1.2em;
}

/* free-spirits fa tutte e due le cose: <p> separati E <br><br> in coda. */
.or-credits-list--paragrafo-e-riga {
  --or-credits-gap: calc(0.9rem + 1.2em);
}

/* Ogni credito e' una riga che occupa tutte e due le colonne e le eredita
   con subgrid: e' il pezzo che tiene incolonnati ruoli e nomi pur avendo
   un elemento per riga (serve al click-to-edit dell'editor, che ha
   bisogno di un elemento vero per ogni voce dei crediti).
   Le basi allineate perche' il ruolo e' piu' piccolo del nome: senza,
   starebbero appesi al bordo alto della riga. */
.or-credit {
  display: grid;
  grid-column: 1 / -1;
  grid-template-columns: subgrid;
  align-items: baseline;
  margin: 0;
}

/* Dove subgrid non c'e', le due colonne si ricostruiscono riga per riga:
   i ruoli non si dimensionano piu' sul piu' lungo, ma restano due colonne
   allineate invece di un elenco a bandiera. */
@supports not (grid-template-columns: subgrid) {
  .or-credits-list {
    display: block;
  }

  .or-credit {
    display: grid;
    grid-template-columns: 12em minmax(0, 1fr);
    column-gap: 2em;
    margin-bottom: 0.55em;
  }
}

/* Una voce senza ruolo (una riga libera in mezzo ai crediti) si prende
   tutta la larghezza invece di lasciare un buco nella prima colonna. */
.or-credit--solo .or-credit__value {
  grid-column: 1 / -1;
}

/* Il ruolo e' la voce secondaria: piccolo, maiuscolo, spaziato e in
   grigio chiaro. E' quello che rende leggibile la colonna a sinistra
   senza doverla chiudere dentro un riquadro.
   nowrap perche' un ruolo spezzato su due righe sfalserebbe la colonna:
   e' la colonna a doversi allargare, non il ruolo a spezzarsi. */
.or-credit__label {
  margin: 0;
  font-size: 0.75em;
  font-weight: 400;
  line-height: 1.2em;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  white-space: nowrap;
  color: rgba(255, 255, 255, 0.55);
}

.or-credit__value {
  margin: 0;
  color: var(--or-bianco);
}

/* Lo stacco cade sul primo credito di ogni nuovo gruppo. Con la sola lista
   chiusa di helper non si puo' confrontare un item col precedente dentro
   il template, quindi lo fa il CSS: "un credito che segue un credito di
   gruppo N e non e' del gruppo N". Dodici regole perche' dodici e' il
   massimo di gruppi ammesso dal blocco. */
.or-credit--g1 + .or-credit:not(.or-credit--g1),
.or-credit--g2 + .or-credit:not(.or-credit--g2),
.or-credit--g3 + .or-credit:not(.or-credit--g3),
.or-credit--g4 + .or-credit:not(.or-credit--g4),
.or-credit--g5 + .or-credit:not(.or-credit--g5),
.or-credit--g6 + .or-credit:not(.or-credit--g6),
.or-credit--g7 + .or-credit:not(.or-credit--g7),
.or-credit--g8 + .or-credit:not(.or-credit--g8),
.or-credit--g9 + .or-credit:not(.or-credit--g9),
.or-credit--g10 + .or-credit:not(.or-credit--g10),
.or-credit--g11 + .or-credit:not(.or-credit--g11),
.or-credit--g12 + .or-credit:not(.or-credit--g12) {
  margin-top: var(--or-credits-gap);
  padding-top: var(--or-credits-gap);
  border-top: 1px solid rgba(255, 255, 255, 0.16);
}

/* ==========================================================================
   INVITO SOCIAL (blocco project-cta)
   Container a4f513c: colonna, 4em di padding solo in alto, gap 20px fra
   titolo e bottone, inner larga 1140.
   ========================================================================== */

.or-project-cta {
  padding: 4em 0 0;
}

.or-project-cta-inner {
  width: 100%;
  max-width: min(100%, var(--or-container));
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

/* Il titolo dell'invito e' l'unico titolo delle pagine film a 25px:
   Helvetica 25/600, interlinea 1em, crenatura -1.3px, nero. Niente
   margine sotto: lo stacco dal bottone e' il gap di 20px del contenitore.
   A tablet diventa 45px, cioe' quasi il doppio del desktop: e' il
   sorgente, non un refuso del rilievo. */
.or-project-cta-title {
  margin: 0;
  padding: 0;
  text-align: center;
  font-family: var(--or-font-helvetica);
  font-size: 25px;
  font-weight: 600;
  font-style: normal;
  text-transform: none;
  text-decoration: none;
  line-height: 1em;
  letter-spacing: -1.3px;
  color: var(--or-nero);
}

/* .elementor-align-center: il widget bottone e' centrato e il bottone
   resta largo quanto il suo contenuto. Il resto (fondo nero, bordo 2px,
   raggio 50px, Helvetica 20/600 -0.5px, icona 1em, inversione e
   scale+rotate in hover) e' gia' .or-btn + .or-btn--social + .or-anim-grow
   della base: qui non si ridichiara niente. */
.or-project-cta-actions {
  text-align: center;
}

/* ==========================================================================
   TABLET, max-width 1024px
   Il kit sposta prima le variabili globali; qui restano le regole di
   pagina. Da notare: citazione e titolo crediti CRESCONO rispetto al
   desktop (42 -> 45) e il titolo dell'invito passa da 25 a 45.
   ========================================================================== */

@media (max-width: 1024px) {
  .or-synopsis-quote {
    font-size: 45px;
  }

  .or-synopsis-body {
    font-size: 14px;
  }

  .or-synopsis-caption {
    font-size: 14px;
  }

  .or-credits-list {
    font-size: 14px;
  }

  .or-project-cta-title {
    font-size: 45px;
  }
}

/* ==========================================================================
   MOBILE, max-width 767px
   Le colonne non diventano "column": la riga resta row e sono le colonne
   ad andare al 100% con flex-wrap:wrap (--flex-wrap-mobile). Il risultato
   e' lo stesso impilamento, ma l'ordine e le regole sono quelle vere.
   ========================================================================== */

@media (max-width: 767px) {
  .or-synopsis-inner {
    flex-wrap: wrap;
    row-gap: 0px;
    column-gap: 0px;
  }

  .or-synopsis-text,
  .or-synopsis-still {
    width: 100%;
  }

  .or-synopsis-text {
    margin-top: 1em;
  }

  .or-synopsis-quote {
    font-size: 28px;
    line-height: 1.1em;
  }

  .or-synopsis-body {
    padding-top: 0;
  }

  .or-synopsis-still,
  .or-synopsis-still--abbassato {
    padding: 0;
  }

  .or-credits {
    padding: 10% 5% 0;
  }

  .or-credits-head,
  .or-credits--aria-in-fondo .or-credits-head {
    padding: 0;
  }

  .or-credits-title {
    /* Il padding sta sul widget del titolo, non sul contenitore: 5% sopra
       e 10% sotto. Lo tengo sul titolo per la stessa ragione. */
    padding: 5% 0 10%;
    font-size: var(--or-kit-helvetica-title-size);
    line-height: 1.1em;
  }

  .or-credits-body-inner {
    flex-wrap: wrap;
    padding: 0;
  }

  .or-credits--aria-in-fondo .or-credits-body {
    padding-bottom: 0;
  }

  .or-credits-poster {
    flex: 0 0 100%;
    width: 100%;
  }

  .or-credits-poster img {
    max-width: 100%;
  }

  /* Sul telefono la colonna dei ruoli mangerebbe meta' schermo e i nomi
     andrebbero a capo ogni due parole: le due colonne diventano una, col
     ruolo sopra al nome. Resta una scheda, non torna un elenco a bandiera.
     Il padding e' 2em 2em 5em 2em dell'originale, in rem: la misura e'
     32px 32px 80px, non 28/28/70. */
  .or-credits-list {
    width: 100%;
    grid-template-columns: minmax(0, 1fr);
    row-gap: 1em;
    padding: 2rem 2rem 5rem;
  }

  .or-credit {
    row-gap: 0.15em;
  }

  @supports not (grid-template-columns: subgrid) {
    .or-credit {
      grid-template-columns: minmax(0, 1fr);
    }
  }

  .or-project-cta {
    padding: 10% 5% 0;
  }

  .or-project-cta-title {
    font-size: 28px;
    line-height: 1.1em;
  }
}

/* ==========================================================================
   MENO MOVIMENTO
   Il JS non scrive --or-translate-x quando l'utente ha chiesto meno
   animazioni, ma se una fascia era gia' in movimento la transizione di 1s
   la farebbe comunque scivolare: qui si ferma tutto. Lo sfondo resta
   fermo, allineato a sinistra, e la fascia si legge uguale.
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .or-credits-layer {
    transition: none;
    transform: none;
  }

  .or-credits-veil {
    transition: none;
  }
}

/* ==========================================================================
   APERTURA DELLA HOME E PAGINE LEGALI
   ========================================================================== */

/* Apertura della home e pagine legali.
   Sono i due blocchi che nella riscrittura non erano stati assegnati a
   nessun componente: le loro regole erano rimaste fuori dal foglio e i due
   filmati dell'apertura si vedevano tutti e due, uno sotto l'altro. */

/* L'apertura della home riusa il guscio dell'apertura video (or-media-hero)
   ma ha DUE contenitori filmato invece di uno, come nell'originale: uno per
   l'orizzontale e uno per il verticale. Elementor li alterna sul breakpoint
   tablet, non su quello mobile. */
.or-hero-home {
  background-color: var(--or-hero-fondo);
}

.or-hero-media--mobile {
  display: none;
}

@media (max-width: 1024px) {
  .or-hero-media--desktop {
    display: none;
  }

  .or-hero-media--mobile {
    display: block;
  }

  /* Su tablet l'apertura non e' a tutta altezza: nell'originale scende a
     523px fissi, e torna a schermo pieno solo sul telefono. */
  .or-hero-home {
    min-height: 523px;
    padding-left: 5%;
    padding-right: 5%;
  }
}

@media (max-width: 767px) {
  .or-hero-home {
    min-height: 100vh;
  }
}

/* Pagine legali: privacy e cookie policy, nelle due lingue. Impaginazione
   sobria, larghezza di lettura contenuta, gerarchia data dai sottotitoli
   di sezione. Il margine in cima tiene conto della barra fissa. */
.or-legal {
  max-width: var(--or-container);
  margin: 0 auto;
  padding: calc(var(--or-header-h) + 4em) 8% 6em;
}

.or-legal-body {
  font-family: var(--or-font-body);
  font-size: 16px;
  line-height: 1.5em;
  color: var(--or-nero);
}

.or-legal-body p {
  margin: 0 0 1em;
}

.or-legal-section {
  margin-top: 2.5em;
}

.or-legal-body h2 {
  margin: 0 0 0.6em;
  font-family: var(--or-font-display);
  font-size: 28px;
  font-weight: 600;
  line-height: 1.2em;
}

.or-legal-body a {
  color: inherit;
}

@media (max-width: 767px) {
  .or-legal {
    padding-left: 5%;
    padding-right: 5%;
  }

  .or-legal-body h2 {
    font-size: 22px;
  }
}

.gm-langnav{position:fixed;bottom:16px;right:16px;z-index:2147482000;display:flex;gap:2px;padding:3px;border-radius:999px;background:rgba(20,20,20,.82);box-shadow:0 4px 16px rgba(0,0,0,.22);font-family:system-ui,-apple-system,sans-serif;font-size:12px;font-weight:600}.gm-langnav a,.gm-langnav span{display:inline-block;padding:4px 10px;border-radius:999px;text-decoration:none;text-transform:uppercase;letter-spacing:.04em;color:#fff;opacity:.65}.gm-langnav a:hover{opacity:1}.gm-langnav [aria-current]{background:#fff;color:#111;opacity:1}