/* ============================================================
   VINCASOFT — style.css  v6.1 — Maggio 2026
   Font: Plus Jakarta Sans (titoli) + DM Sans (corpo)
   Scala: H1 68px · H2 52px · H3 32px · Body 20px
   Layout: PAGE SHELL 1440px · contenuto 1280px · padding 72px
   OGNI sezione usa .container — nulla va a tutta larghezza.
   ============================================================ */

/* FONT: caricati con <link> in partials/header.php, non con @import.
   L'@import creava una catena in serie: HTML -> style.css -> googleapis -> gstatic.
   Con i <link> nel <head> il browser scarica font e CSS in parallelo. */


/* ============================================================
   SEZIONE DESKTOP — ELEMENTI COMUNI
   ============================================================ */


/* ============================================================
   VARIABILI
   ============================================================ */
:root {
  --vp:     #1FA0D0;
  --vd:     #167A99;
  --vl:     #5FC4E6;
  --vs:     #E6F4FA;
  --text:   #0F172A;
  --muted:  #64748B;
  --border: #E2E8F0;
  --bg:     #F8FAFC;
  --white:  #FFFFFF;

  --f-title: 'Plus Jakarta Sans', sans-serif;
  --f-body:  'DM Sans', sans-serif;

  /* Corpo centrale stile Cisco */
  --shell-w: 1280px;
  --max-w:   1280px;
  --pad-x:   72px;

  --page-gutter-bg: #F3F6F8;
}

/* ============================================================
   RESET & BASE
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html  { scroll-behavior: smooth; }
body  {
  font-family: var(--f-body);
  font-size: 20px;
  line-height: 1.65;
  color: var(--text);
  background: var(--page-gutter-bg);
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a   { color: inherit; text-decoration: none; }
ul  { list-style: none; }

/* ============================================================
   PAGE SHELL — corpo centrale con fasce laterali neutre
   ============================================================ */
.page-shell {
  width: min(100%, var(--shell-w));
  margin: 0 auto;
  background: var(--white);
  overflow: visible;
  box-shadow: 0 0 32px rgba(15, 23, 42, 0.05);
}

/* Le sezioni principali restano sempre dentro la page-shell */
.hero,
.cta-section,
footer {
  width: 100%;
  max-width: 100%;
}

/* ============================================================
   CONTAINER — corpo fisso con spazio ai lati
   TUTTE le sezioni usano questo contenitore.
   ============================================================ */
.container {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 var(--pad-x);
}

/* ============================================================
   TIPOGRAFIA — scala approvata
   ============================================================ */
h1 { font-family: var(--f-title); font-size: 68px; font-weight: 800; line-height: 1.04; letter-spacing: -.03em; }
h2 { font-family: var(--f-title); font-size: 52px; font-weight: 700; line-height: 1.08; letter-spacing: -.025em; }
h3 { font-family: var(--f-title); font-size: 32px; font-weight: 600; line-height: 1.15; letter-spacing: -.02em; }

/* ============================================================
   COMPONENTI CONDIVISI
   ============================================================ */
.eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--f-body); font-size: 12px; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--vp); margin-bottom: 18px;
}
.ew-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--vp); flex-shrink: 0; }

.btn-primary {
  display: inline-flex; align-items: center; gap: 9px;
  background: var(--vp); color: white;
  padding: 16px 28px; border-radius: 8px;
  font-family: var(--f-title); font-size: 17px; font-weight: 600;
  border: none; cursor: pointer; transition: background .2s;
}
.btn-primary:hover { background: var(--vd); color: white; }

.divider { width: 40px; height: 3px; background: var(--vp); margin: 0 auto 28px; border-radius: 2px; }

/* ============================================================
   NAVBAR — sticky · logo sx · menu a destra
   ============================================================ */

.nav {
  position: sticky;
  top: 0;
  z-index: 9999;
  width: 100%;
  background: var(--white);
  border-bottom: 1px solid var(--border);
}

.nav-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 90px;
}

/* Logo grande e leggibile */
.logo img {
  height: 180px;
  width: auto;
  display: block;
}

/* Menu a destra */
.nav-links {
  display: flex;
  align-items: center;
  gap: 18px;
  margin-left: auto;
  padding-right: 0;
  transform: translateX(62px);
}

.nav-links a {
  font-family: var(--f-body);
  font-size: 15px;
  font-weight: 500;
  color: var(--muted);
  transition: color .2s, background .2s;
  white-space: nowrap;
  padding: 6px 0;
}

.nav-links a:hover {
  color: var(--vp);
}

/* Pulsante finale */
.nav-links .nav-cta,
.nav-links a.nav-cta {
  margin-left: 30px;
  background: var(--vp) !important;
  color: white !important;
  padding: 11px 22px;
  border-radius: 8px;
  font-weight: 600 !important;
  transition: background .2s !important;
}

.nav-links .nav-cta:hover,
.nav-links a.nav-cta:hover {
  background: var(--vd) !important;
}

/* ============================================================
   HERO — standard unico
   Tutte le hero principali hanno la stessa altezza.
   Le singole pagine modificano solo overlay, testo e posizione immagine.
   ============================================================ */
.hero {
  position: relative;
  height: 620px;
  min-height: 620px;
  display: flex;
  align-items: center;
  overflow: hidden;
}

.hero-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
}

.hero-bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}

.hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(
    to right,
    rgba(15, 23, 42, 0.65) 0%,
    rgba(15, 23, 42, 0.4) 30%,
    rgba(15, 23, 42, 0.15) 55%,
    rgba(15, 23, 42, 0) 75%
  );
}

.hero .container {
  position: relative;
  z-index: 2;
  padding-top: 0;
  padding-bottom: 0;
  padding-left: 24px;
}

.hero-inner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: center;
}

.hero h1 {
  color: white;
  margin-bottom: 22px;
}

.hero-sub {
  font-family: var(--f-body);
  font-size: 20px;
  color: rgba(255, 255, 255, .85);
  line-height: 1.5;
  margin-bottom: 36px;
  max-width: 520px;
}

/* ============================================================
   CTA FINALE — background immagine full, colori originali
   ============================================================ */

.cta-section {
  position: relative;
  padding: 96px 0;
  background: var(--vs);
  overflow: hidden;
  min-height: 360px;
}

/* Immagine di background full */
.cta-section::before {
  content: "";
  position: absolute;
  inset: 0;
  background: url("/img/sections/ai_test.webp") no-repeat right center;
  background-size: cover;
  opacity: 1;
  z-index: 0;
}

/* Contenuto sopra l'immagine */
.cta-inner {
  position: relative;
  z-index: 1;
  text-align: left;
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 var(--pad-x);
}

/* Titolo */
.cta-inner h2 {
  font-family: var(--f-title);
  font-size: 52px;
  font-weight: 700;
  margin-bottom: 18px;
  color: var(--text);
}

/* Testo */
.cta-inner p {
  font-family: var(--f-body);
  font-size: 19px;
  color: var(--muted);
  line-height: 1.55;
  max-width: 520px;
  margin: 0 0 64px 0;
}

/* Pulsante */
.cta-inner .btn-primary {
  display: inline-block;
  margin-top: 0;
}
/* ============================================================
   FOOTER — sfondo #060F1C
   ============================================================ */

footer {
  width: 100%;
  background: #060F1C;
  padding: 28px 0 24px;
}

/* Container allineato al layout centrale */
.footer-inner {
  max-width: var(--max-w);
  margin: 0 auto;
  padding: 0 var(--pad-x);
}

/* Grid colonne */
.footer-grid {
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1.4fr;
  gap: 44px;
  margin-bottom: 42px;
  align-items: start;
}

/* =========================
   COLONNA BRAND (LOGO)
   ========================= */

.footer-brand-col {
  padding-top: 0;
  overflow: visible;
}

/* LOGO */
.footer-logo {
  width: 245px;
  height: auto;
  display: block;
  margin: 0 0 10px;
}

.footer-logo-link {
  display: inline-block;
  margin: 0 0 10px;
}

.footer-logo-link .footer-logo {
  margin: 0;
}

.footer-logo-link:hover {
  opacity: 0.9;
}
/* TESTO SOTTO LOGO */
.footer-brand {
  font-family: var(--f-body);
  font-size: 14px;
  color: #94A3B8;
  line-height: 1.36;
  margin: 4px 0 0;
  max-width: 290px;
}

/* =========================
   TITOLI COLONNE
   ========================= */

/* Il secondo selettore serve a battere `body[class*="page-"] h3` (0,2,1)
   della patch mobile, che altrimenti porterebbe questi titoli a 19-20px.
   Erano <h5> e non venivano intercettati; da <h3> si'. */
footer h3,
body[class*="page-"] footer h3 {
  position: relative;
  font-family: var(--f-title);
  font-size: 15px;
  font-weight: 800;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: #94A3B8;
  margin: 0 0 16px;
  padding-bottom: 10px;
}

footer h3::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 44px;
  height: 2px;
  border-radius: 999px;
  background: rgba(31, 160, 208, 0.58);
}

/* =========================
   LINK / TESTI
   ========================= */

footer a,
footer p,
footer span {
  font-family: var(--f-body);
  font-size: 16px;
  line-height: 1.20;
  color: #94A3B8;
  text-decoration: none;
  display: block;
}

footer a {
  margin-bottom: 7px;
  transition: color 0.18s ease;
}

footer a:hover,
footer a:focus {
  color: var(--white);
  text-decoration: none;
}

/* Indirizzo */
.footer-address {
  font-family: var(--f-body);
  font-size: 13px;
  color: #64748B;
  line-height: 1.26;
  display: block;
  margin-top: 10px;
}

/* =========================
   FOOTER BOTTOM
   Barra legale — Privacy / Cookie
   ========================= */

.footer-bottom {
  border-top: 1px solid #0F1E30;
  padding-top: 20px;
  font-size: 13px;
  color: #64748B;

  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
}

.footer-bottom span,
.footer-bottom a {
  display: inline;
  font-size: 16px;
  line-height: 1.35;
  color: #64748B;
  margin-bottom: 0;
}

.footer-bottom a,
.footer-bottom a:visited,
.footer-bottom a[aria-current="page"] {
  color: #64748B;
  font-weight: 600;
  text-decoration: none;
  transition: color 0.18s ease;
}

.footer-bottom a:hover,
.footer-bottom a:focus,
.footer-bottom a[aria-current="page"]:hover,
.footer-bottom a[aria-current="page"]:focus {
  color: var(--white);
  text-decoration: none;
}

/* ============================================================
   DIMENSIONI TESTO — elementi comuni
   ============================================================ */
.sec-p,
.cta-inner p {
  font-size: 22px;
  line-height: 1.7;
}

footer a,
footer p,
footer span {
  font-size: 17px;
}


/* ============================================================
   SEZIONE DESKTOP — SINGOLE PAGINE
   ============================================================ */

/* ============================================================
   HOME — pagina iniziale
   Versione desktop
   ============================================================ */

/* ============================================================
   HOME — MAPPA DEI SERVIZI
   4 card: Servizi Cloud · Hosting · Applicativi · FileMaker
   ============================================================ */

.home-services {
  padding: 36px 0 44px;
  background: var(--white);
  border-bottom: 1px solid var(--border);
}

.home-services-head {
  max-width: 920px;
  margin: 0 auto 34px;
  text-align: center;
}

.home-services-head h2 {
  margin: 0;

  font-family: var(--f-title);
  font-size: 44px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.035em;
  color: var(--text);
}

.home-services-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 22px;
  align-items: stretch;
}

.home-service-item {
  position: relative;
  display: flex;
  flex-direction: column;
  min-width: 0;

  padding: 32px 28px 30px;

  background: var(--white);
  border: 1px solid var(--border);
  border-radius: 6px;

  box-shadow: 0 8px 24px rgba(7, 24, 42, .045);

  transition:
    transform .2s ease,
    border-color .2s ease,
    box-shadow .2s ease;
}

.home-service-item:hover {
  transform: translateY(-3px);
  border-color: rgba(0, 145, 215, .28);
  box-shadow: 0 14px 30px rgba(7, 24, 42, .075);
}

.home-service-icon {
  display: flex;
  align-items: center;
  justify-content: center;

  width: 68px;
  height: 68px;
  margin: 0 0 10px;

  border: 0;
  background: transparent;
}

.home-service-icon img {
  display: block;
  width: 68px;
  height: 68px;
  object-fit: contain;
}

.home-service-item h3 {
  margin: 0 0 12px;

  font-family: var(--f-title);
  font-size: 22px;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -.015em;
  color: var(--text);
}

.home-service-item > p {
  min-height: 84px;
  margin: 0 0 20px;

  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.58;
  color: var(--muted);
}

.home-service-item ul {
  display: flex;
  flex-direction: column;
  gap: 9px;

  margin: 0 0 26px;
  padding: 0;

  list-style: none;
}

.home-service-item li {
  position: relative;
  padding-left: 18px;

  font-family: var(--f-body);
  font-size: 15px;
  line-height: 1.48;
  color: var(--text);
}

.home-service-item li::before {
  content: "✓";
  position: absolute;
  top: 0;
  left: 0;

  font-size: 12px;
  font-weight: 700;
  color: var(--vp);
}

.home-service-item > a {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;

  margin-top: auto;

  font-family: var(--f-body);
  font-size: 14px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--vp);

  transition:
    color .2s ease,
    transform .2s ease;
}

.home-service-item > a:hover {
  color: var(--vd);
  transform: translateX(3px);
}

/* ============================================================
   HOME — GESTIONE TECNICA COORDINATA
   Foto sx a tutta colonna · contenuto dx
   ============================================================ */

.how-section {
  background: var(--bg);
  border-bottom: 1px solid var(--border);
}

.how-grid {
  display: grid;
  grid-template-columns: 52% 48%;
  align-items: stretch;

  width: 100%;
  max-width: var(--max-w);
  height: 560px;
  margin: 0 auto;
  padding: 0;
}

.how-photo {
  position: relative;
  width: 100%;
  height: 560px;
  overflow: hidden;
}

.how-photo img {
  display: block;
  width: 100%;
  height: 100%;

  object-fit: cover;
  object-position: center 42%;
}

.how-photo-overlay {
  position: absolute;
  inset: 0;
  pointer-events: none;

  background: linear-gradient(
    to right,
    transparent 78%,
    var(--bg) 100%
  );
}

.how-photo-ph {
  display: flex;
  align-items: center;
  justify-content: center;

  width: 100%;
  height: 410px;

  background: #dde4ea;
  font-family: var(--f-body);
  font-size: 14px;
  color: var(--muted);
}

.how-text {
  display: flex;
  flex-direction: column;
  justify-content: center;

  min-width: 0;
  padding: 30px 54px 30px 50px;
}

.how-text h2 {
  max-width: 500px;
  margin: 0 0 12px;

  font-family: var(--f-title);
  font-size: 38px;
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -.03em;
  color: var(--text);
}

.how-intro {
  max-width: 540px;
  margin: 0;

  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.5;
  color: var(--muted);
}

.steps {
  display: flex;
  flex-direction: column;
  margin-top: 18px;
}

.step {
  display: grid;
  grid-template-columns: 38px minmax(0, 1fr);
  gap: 12px;
  align-items: start;

  padding: 10px 0;
  border-top: 1px solid var(--border);
}

.step:last-child {
  border-bottom: 1px solid var(--border);
}

.step-num {
  padding-top: 1px;

  font-family: var(--f-title);
  font-size: 15px;
  font-weight: 700;
  line-height: 1.45;
  color: var(--vp);
}

.step-title {
  margin: 0 0 2px;

  font-family: var(--f-title);
  font-size: 17px;
  font-weight: 700;
  line-height: 1.25;
  color: var(--text);
}

.step-desc {
  margin: 0;

  font-family: var(--f-body);
  font-size: 14px;
  line-height: 1.45;
  color: var(--muted);
}

.how-text .svc-link {
  display: inline-flex;
  align-items: center;
  align-self: flex-start;

  margin-top: 48px;

  font-family: var(--f-body);
  font-size: 14px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--vp);

  transition:
    color .2s ease,
    transform .2s ease;
}

.how-text .svc-link:hover {
  color: var(--vd);
  transform: translateX(3px);
}

/* ============================================================
   HOME — TARGET
   3 colonne · separatori · icone PNG
   ============================================================ */

.target-section {
  padding: 50px 0 56px;
  background: var(--white);
}

.target-section .section-label {
  margin: 0 0 10px;
}

.target-section .sec-h2 {
  max-width: 720px;
  margin: 0 0 38px;

  font-family: var(--f-title);
  font-size: 42px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -.03em;
  text-align: left;
  color: var(--text);
}

.target-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0;
}

.target-item {
  min-width: 0;
  padding: 0 44px 2px;
  border-right: 1px solid var(--border);
}

.target-item:first-child {
  padding-left: 0;
}

.target-item:last-child {
  padding-right: 0;
  border-right: none;
}

.ti-icon {
  width: 88px;
  height: 88px;
  margin: 0 0 18px -12px;
}

.ti-icon img {
  display: block;
  width: 88px;
  height: 88px;
  object-fit: contain;
}

.ti-title {
  margin: 0 0 10px;

  font-family: var(--f-title);
  font-size: 21px;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -.01em;
  color: var(--text);
}

.ti-desc {
  margin: 0;

  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.62;
  color: var(--muted);
}

/* ============================================================
   CHI SIAMO — pagina interna
   ============================================================ */


/* ============================================================
   CHI SIAMO — HERO
   ============================================================ */

.hero-about .hero-bg img {
  object-position: center;
}

.page-chi-siamo .hero::after,
.hero-about::after {
  background: linear-gradient(
    to right,
    rgba(248, 250, 252, 0.96) 0%,
    rgba(248, 250, 252, 0.90) 22%,
    rgba(248, 250, 252, 0.58) 43%,
    rgba(248, 250, 252, 0) 76%
  );
}

.page-chi-siamo .hero .hero-inner > div:first-child,
.hero-about .hero-inner > div:first-child {
  transform: translateY(-48px);
}

.hero-about .hero-inner {
  align-items: flex-start;
  padding-top: 48px;
}

.page-chi-siamo .hero h1,
.hero-about h1 {
  color: var(--text);
  line-height: 1.02;
  max-width: 560px;
  margin-bottom: 34px;
}

.page-chi-siamo .hero-sub,
.hero-about .hero-sub {
  max-width: 540px;
  color: var(--muted);
  font-size: 20px;
  line-height: 1.58;
  margin-bottom: 28px;
}

.page-chi-siamo .hero .eyebrow,
.hero-about .eyebrow {
  color: var(--vp) !important;
}

.page-chi-siamo .hero .ew-dot,
.hero-about .ew-dot {
  background: var(--vp) !important;
}

/* ============================================================
   CHI SIAMO — ESPERIENZA DIRETTA
   ============================================================ */

.about-main {
  background: var(--white);
  padding: 42px 0 62px;
}

.about-main-head {
  max-width: 1120px;
  margin: 0 auto;
}

.about-main-head h2 {
  max-width: 860px;
  margin: 0 auto 36px;
  font-family: var(--f-title);
  font-size: 48px;
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -0.035em;
  color: var(--text);
  text-align: center;
}

.about-main-intro {
  max-width: 1120px;
  margin: 26px auto 0;
  text-align: left;
}

.about-main-intro p {
  max-width: 1080px;
  margin: 0 0 13px;
  font-family: var(--f-body);
  font-size: 18px;
  line-height: 1.66;
  color: var(--muted);
}

.about-main-intro p:last-child {
  margin-bottom: 0;
}


/* ============================================================
   CHI SIAMO — 3 CARD IDENTITARIE
   ============================================================ */

.about-panel {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 24px;
  max-width: 1120px;
  margin: 0 auto;
}

.about-panel-card {
  min-height: 185px;
  padding: 24px 34px 26px;
  background: #F3FAFD;
  border: 1px solid #D8EAF2;
  text-align: left;
}

.about-panel-card.strong {
  background: #EEF8FC;
  border-color: rgba(31, 160, 208, 0.42);
  box-shadow: 0 14px 32px rgba(15, 23, 42, 0.045);
}

.about-panel-card span {
  display: block;
  margin-bottom: 16px;
  font-family: var(--f-title);
  font-size: 24px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: 0.08em;
  color: var(--vp);
}

.about-panel-card h3 {
  margin: 0 0 12px;
  font-family: var(--f-title);
  font-size: 23px;
  font-weight: 700;
  line-height: 1.18;
  letter-spacing: -0.02em;
  color: var(--text);
}

.about-panel-card p {
  margin: 0;
  font-family: var(--f-body);
  font-size: 16px;
  line-height: 1.58;
  color: #475569;
}

/* ============================================================
   CHI SIAMO — RESPONSIVE BLOCCO Conosciamo gli ambienti
   ============================================================ */

@media (max-width: 1024px) {
  .about-main {
    padding: 48px 0 64px;
  }

  .about-main-head h2 {
    max-width: 760px;
    font-size: 42px;
  }

  .about-panel {
    grid-template-columns: 1fr;
    gap: 22px;
  }

  .about-panel-card {
    min-height: auto;
    padding: 34px 32px;
  }
}

@media (max-width: 640px) {
  .about-main {
    padding: 42px 0 56px;
  }

  .about-main-head h2 {
    font-size: 34px;
    line-height: 1.12;
    margin-bottom: 24px;
  }

  .about-main-intro p {
    font-size: 17px;
    line-height: 1.62;
  }

  .about-panel {
    margin-top: 32px;
  }

  .about-panel-card {
    padding: 30px 26px;
  }

  .about-panel-card span {
    margin-bottom: 22px;
    font-size: 23px;
  }

  .about-panel-card h3 {
    font-size: 22px;
  }

  .about-panel-card p {
    font-size: 16px;
  }
}


/* ============================================================
   CHI SIAMO — RESPONSIVE INFRASTRUTTURA / APPLICATIVI / GESTIONE
   ============================================================ */

@media (max-width: 1024px) {
  .about-continuity-grid {
    grid-template-columns: 1fr;
  }

  .about-continuity-map {
    min-height: auto;
    padding: 48px 42px;
  }

  .about-continuity-node,
  .about-continuity-node:nth-child(2),
  .about-continuity-node:nth-child(3) {
    max-width: none;
    margin-left: 0;
  }

  .about-continuity-content {
    padding: 48px 42px 56px;
  }

  .about-continuity-content h2 {
    max-width: 760px;
    font-size: 42px;
  }

  .about-continuity-content p {
    max-width: 760px;
  }
}

@media (max-width: 640px) {
  .about-continuity-map {
    padding: 42px 24px;
    gap: 18px;
  }

  .about-continuity-node {
    padding: 22px 24px;
  }

  .about-continuity-node span {
    font-size: 20px;
  }

  .about-continuity-node strong {
    font-size: 15px;
  }

  .about-continuity-content {
    padding: 42px 24px 50px;
  }

  .about-continuity-content h2 {
    font-size: 34px;
    line-height: 1.12;
    margin-bottom: 24px;
  }

  .about-continuity-content p {
    font-size: 17px;
    line-height: 1.66;
  }
}

/* ============================================================
   CHI SIAMO — INFRASTRUTTURA, APPLICATIVI E GESTIONE
   ============================================================ */

.about-continuity {
  background: var(--bg);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}

.about-continuity > .container {
  max-width: none;
  width: 100%;
  padding-left: 0;
  padding-right: 0;
}

.about-continuity-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: stretch;
}

.about-continuity-map {
  position: relative;
  min-height: 400px;
  padding: 42px 70px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  gap: 20px;
  background:
    radial-gradient(
      circle at 24% 38%,
      rgba(255, 255, 255, 0.66) 0%,
      rgba(255, 255, 255, 0.28) 36%,
      rgba(255, 255, 255, 0.04) 68%
    ),
    linear-gradient(
      135deg,
      rgba(238, 247, 251, 0.94) 0%,
      rgba(216, 236, 245, 0.86) 54%,
      rgba(196, 222, 235, 0.78) 100%
    ),
    url("/img/sections/system_pattern_bg_v2.webp") no-repeat center;
  background-size: cover;
}

.about-continuity-node {
  width: 76%;
  max-width: none;
  padding: 21px 28px 22px;
  background: rgba(255, 255, 255, 0.985);
  border: 1px solid rgba(31, 160, 208, 0.18);
  border-left: 5px solid var(--vp);
  box-shadow: 0 15px 30px rgba(15, 23, 42, 0.07);
}

.about-continuity-node:nth-child(2) {
  margin-left: 8%;
}

.about-continuity-node:nth-child(3) {
  margin-left: 16%;
}

.about-continuity-node span {
  display: block;
  margin: 0 0 8px;
  font-family: var(--f-title);
  font-size: 22px;
  font-weight: 800;
  line-height: 1.2;
  color: var(--text);
}

.about-continuity-node strong {
  display: block;
  font-family: var(--f-body);
  font-size: 15px;
  font-weight: 500;
  line-height: 1.55;
  color: var(--muted);
}

.about-continuity-content {
  padding: 42px 72px 42px 64px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.about-continuity-content h2 {
  max-width: 620px;
  margin: 0 0 28px;
  font-family: var(--f-title);
  font-size: 46px;
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -0.035em;
  color: var(--text);
  text-align: left;
}

.about-continuity-content p {
  max-width: 640px;
  margin: 0 0 18px;
  font-family: var(--f-body);
  font-size: 18px;
  line-height: 1.74;
  color: var(--muted);
}

.about-continuity-content p:last-child {
  margin-bottom: 0;
}


/* ============================================================
   CHI SIAMO — CARD INFRASTRUTTURA / APPLICATIVI / GESTIONE
   ============================================================ */

@media (max-width: 1024px) {
  .about-continuity-grid {
    grid-template-columns: 1fr;
  }

  .about-continuity-map {
    min-height: auto;
    padding: 44px 42px;
  }

  .about-continuity-node,
  .about-continuity-node:nth-child(2),
  .about-continuity-node:nth-child(3) {
    width: 100%;
    max-width: none;
    margin-left: 0;
  }

  .about-continuity-content {
    padding: 44px 42px 50px;
  }

  .about-continuity-content h2 {
    max-width: 760px;
    font-size: 42px;
  }

  .about-continuity-content p {
    max-width: 760px;
  }
}

@media (max-width: 640px) {
  .about-continuity-map {
    padding: 38px 24px;
    gap: 18px;
  }

  .about-continuity-node {
    padding: 22px 24px;
  }

  .about-continuity-node span {
    font-size: 20px;
  }

  .about-continuity-node strong {
    font-size: 15px;
  }

  .about-continuity-content {
    padding: 38px 24px 46px;
  }

  .about-continuity-content h2 {
    font-size: 34px;
    line-height: 1.12;
    margin-bottom: 24px;
  }

  .about-continuity-content p {
    font-size: 17px;
    line-height: 1.66;
  }
}
/* ============================================================
   CHI SIAMO — AZIENDE E WEB AGENCY
   ============================================================ */

.about-stable {
  background: var(--white);
  padding: 44px 0 48px;
  border-bottom: 1px solid var(--border);
}

.about-stable-inner {
  max-width: 1120px;
  margin: 0 auto;
}

.about-stable h2 {
  max-width: 860px;
  margin: 0 0 26px;
  font-family: var(--f-title);
  font-size: 48px;
  font-weight: 700;
  line-height: 1.08;
  letter-spacing: -0.035em;
  color: var(--text);
}

.about-stable p {
  max-width: 980px;
  margin: 0 0 14px;
  font-family: var(--f-body);
  font-size: 19px;
  line-height: 1.66;
  color: var(--muted);
}

.about-stable p:last-child {
  margin-bottom: 0;
}


/* ============================================================
   CHI SIAMO — RESPONSIVE AZIENDE E WEB AGENCY
   ============================================================ */

@media (max-width: 1024px) {
  .about-stable {
    padding: 50px 0 54px;
  }

  .about-stable h2 {
    max-width: 760px;
    font-size: 42px;
  }

  .about-stable p {
    max-width: 760px;
  }
}

@media (max-width: 640px) {
  .about-stable {
    padding: 42px 0 46px;
  }

  .about-stable h2 {
    font-size: 34px;
    line-height: 1.12;
    margin-bottom: 22px;
  }

  .about-stable p {
    font-size: 17px;
    line-height: 1.66;
  }
}

/* ============================================================
   INFRASTRUTTURA CLOUD — pagina interna
   ============================================================ */


/* ============================================================
   INFRASTRUTTURA CLOUD — HERO
   ============================================================ */

.hero-infrastruttura .hero-bg img {
  object-position: center right;
  transform: none;
}

.page-infrastruttura .hero::after,
.hero-infrastruttura::after {
  background: linear-gradient(
    to right,
    rgba(248, 250, 252, 0.98) 0%,
    rgba(248, 250, 252, 0.88) 27%,
    rgba(248, 250, 252, 0.42) 46%,
    rgba(248, 250, 252, 0.06) 66%,
    rgba(248, 250, 252, 0) 100%
  );
}

.page-infrastruttura .hero-inner,
.hero-infrastruttura .hero-inner {
  align-items: flex-start;
  padding-top: 4px;
}

.page-infrastruttura .hero-inner > div:first-child,
.hero-infrastruttura .hero-inner > div:first-child {
  transform: translateY(-48px);
}

.page-infrastruttura .hero h1,
.hero-infrastruttura h1 {
  max-width: 580px;
  color: var(--text);
  line-height: 1.04;
  margin-top:42px;
  margin-bottom:36px;
}

.page-infrastruttura .hero-sub,
.hero-infrastruttura .hero-sub {
  max-width: 560px;
  color: var(--muted);
  font-size: 18.5px;
  line-height: 1.58;
}

.page-infrastruttura .hero .eyebrow,
.hero-infrastruttura .eyebrow {
  color: var(--vp);
}

.page-infrastruttura .hero .ew-dot,
.hero-infrastruttura .ew-dot {
  background: var(--vp);
}

/* ============================================================
   INFRASTRUTTURA CLOUD — COSA POSSIAMO OSPITARE / GESTIRE
   ============================================================ */

.infra-environments {
  background: var(--white);
  border-bottom: 1px solid var(--border);
  padding: 48px 0 10px;
}

.infra-environments-head {
  max-width: 840px;
  margin: 0 auto 38px;
  text-align: center;
}

.infra-environments-head h2 {
  font-family: var(--f-title);
  font-size: 40px;
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: var(--text);
  margin: 0 0 18px;
}

.infra-environments-head p {
  font-family: var(--f-body);
  font-size: 18px;
  line-height: 1.66;
  color: var(--muted);
  margin: 0 0 10px;
}

.infra-environments-head p:last-child {
  margin-bottom: 0;
}

.infra-environments-list {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 0;
}

.infra-environment-item {
  position: relative;
  padding: 5px 34px 32px;
  background: transparent;
}

.infra-environment-item:nth-child(1),
.infra-environment-item:nth-child(2),
.infra-environment-item:nth-child(3) {
  grid-column: span 2;
}

.infra-environment-item:nth-child(4),
.infra-environment-item:nth-child(5) {
  grid-column: span 3;
  padding-top: 22px;
  padding-bottom: 24px;
}

.infra-environment-item:nth-child(2),
.infra-environment-item:nth-child(3),
.infra-environment-item:nth-child(5) {
  border-left: 1px solid rgba(203, 213, 225, 0.46);
}

.infra-environment-item:nth-child(4) {
  padding-left: 34px;
}

.infra-env-icon {
  width: 54px;
  height: 54px;
  margin-bottom: 20px;
  border: 1.5px solid rgba(31, 160, 208, 0.48);
  border-radius: 15px;
  background:
    linear-gradient(
      135deg,
      rgba(230, 244, 250, 0.98) 0%,
      rgba(255, 255, 255, 1) 100%
    );
  display: flex;
  align-items: center;
  justify-content: center;
}

.infra-env-icon svg {
  width: 29px;
  height: 29px;
  color: var(--vp);
  display: block;
}

.infra-env-icon svg path {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.infra-environment-item h3 {
  font-family: var(--f-title);
  font-size: 22px;
  font-weight: 700;
  line-height: 1.24;
  letter-spacing: -0.015em;
  color: var(--text);
  margin: 0 0 18px;
}

.infra-environment-item p {
  max-width: 440px;
  font-family: var(--f-body);
  font-size: 16px;
  line-height: 1.64;
  color: var(--muted);
  margin: 0;
}

/* ============================================================
   INFRASTRUTTURA CLOUD — BASE TECNICA REALE
   ============================================================ */

.infra-split {
  position: relative;
  overflow: hidden;
  background:
    linear-gradient(135deg, #071527 0%, #0B1E33 56%, #0E2740 100%);
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
  padding: 62px 0 54px;
}

.infra-split::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: url("/img/sections/rack-infrastruttura.webp");
  background-size: cover;
  background-position: center right;
  background-repeat: no-repeat;
  opacity: 0.82;
}

.infra-split::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(7, 21, 39, 0.94) 0%,
      rgba(7, 21, 39, 0.82) 34%,
      rgba(7, 21, 39, 0.44) 62%,
      rgba(7, 21, 39, 0.10) 100%
    ),
    linear-gradient(
      180deg,
      rgba(7, 21, 39, 0.00) 0%,
      rgba(7, 21, 39, 0.12) 42%,
      rgba(7, 21, 39, 0.58) 100%
    );
}

.infra-split .container {
  position: relative;
  z-index: 3;
}

.infra-split-layout {
  display: block;
  position: static;
}

.infra-split-content {
  position: relative;
  z-index: 3;
}

.infra-split-image {
  display: none;
}

.infra-split-head {
  max-width: 760px;
  margin: 0 0 48px;
}

.infra-split-head h2 {
  max-width: 700px;
  font-family: var(--f-title);
  font-size: 40px;
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: #FFFFFF;
  margin: 0 0 20px;
}

.infra-split-head p {
  max-width: 700px;
  font-family: var(--f-body);
  font-size: 17.5px;
  line-height: 1.68;
  color: rgba(226, 239, 247, 0.88);
  margin: 0 0 10px;
}

.infra-split-head p:last-child {
  margin-bottom: 0;
}

.infra-split-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 74px;
  position: relative;
}

.infra-split-grid::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 1px;
  background: rgba(226, 239, 247, 0.22);
}

.infra-problem {
  padding-right: 34px;
}

.infra-approach {
  padding-left: 34px;
}

.infra-label {
  position: relative;
  display: inline-block;
  font-family: var(--f-title);
  font-size: 12.5px;
  font-weight: 800;
  letter-spacing: .095em;
  text-transform: uppercase;
  color: #7DD3FC;
  margin: 0 0 20px;
  padding-bottom: 10px;
}

.infra-label::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 34px;
  height: 2px;
  background: var(--vp);
  border-radius: 2px;
}

.infra-problem p,
.infra-approach p {
  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.66;
  color: rgba(226, 239, 247, 0.88);
  margin: 0 0 16px;
}

.infra-problem p:last-child,
.infra-approach p:last-child {
  margin-bottom: 0;
}

.infra-bad-list {
  display: grid;
  gap: 10px;
  margin: 22px 0 0;
  padding: 0;
  list-style: none;
}

.infra-bad-list li {
  position: relative;
  padding-left: 24px;
  font-family: var(--f-body);
  font-size: 16.2px;
  line-height: 1.52;
  color: rgba(248, 250, 252, 0.92);
}

.infra-bad-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.72em;
  width: 12px;
  height: 2px;
  background: #7DD3FC;
  border-radius: 2px;
}

/* ============================================================
   INFRASTRUTTURA CLOUD — POSIZIONAMENTO INTRODUTTIVO
   ============================================================ */

.infra-position {
  background: var(--white);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  padding: 34px 0 32px;
}

.infra-position-inner {
  max-width: 900px;
  margin: 0 auto;
  text-align: center;
}

.infra-position h2 {
  font-family: var(--f-title);
  font-size: 32px;
  font-weight: 700;
  line-height: 1.12;
  letter-spacing: -0.03em;
  color: var(--text);
  margin: 0 0 14px;
}

.infra-position p {
  max-width: 840px;
  margin: 0 auto 9px;
  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.58;
  color: var(--muted);
  text-align: center;
}

.infra-position p:first-of-type {
  max-width: 840px;
  font-family: var(--f-title);
  font-size: 16.8px;
  font-weight: 700;
  line-height: 1.5;
  color: var(--text);
  margin-bottom: 9px;
}

.infra-position p:last-child {
  margin-bottom: 0;
}


/* ============================================================
   INFRASTRUTTURA CLOUD — GESTIONE SISTEMISTICA
   ============================================================ */

.infra-sysadmin {
  background: var(--white);
  border-bottom: 1px solid var(--border);
  padding: 42px 0 58px;
}

.infra-sysadmin-head {
  max-width: 880px;
  margin: 0 auto 42px;
  text-align: center;
}

.infra-sysadmin-head h2 {
  font-family: var(--f-title);
  font-size: 40px;
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: var(--text);
  margin: 0 0 18px;
}

.infra-sysadmin-head p {
  max-width: 760px;
  margin: 0 auto;
  font-family: var(--f-body);
  font-size: 18px;
  line-height: 1.66;
  color: var(--muted);
}

.infra-sysadmin-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 72px;
  position: relative;
}

.infra-sysadmin-grid::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 1px;
  background: rgba(203, 213, 225, 0.64);
}

.infra-sysadmin-col:first-child {
  padding-right: 34px;
}

.infra-sysadmin-col:last-child {
  padding-left: 34px;
}

.infra-sysadmin-icon {
  width: 46px;
  height: 46px;
  margin: 0 0 20px;
  border: 1.5px solid rgba(31, 160, 208, 0.48);
  border-radius: 14px;
  background:
    linear-gradient(
      135deg,
      rgba(230, 244, 250, 0.98) 0%,
      rgba(255, 255, 255, 1) 100%
    );
  display: flex;
  align-items: center;
  justify-content: center;
}

.infra-sysadmin-icon svg {
  width: 26px;
  height: 26px;
  color: var(--vp);
  display: block;
}

.infra-sysadmin-icon svg path {
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.infra-sysadmin-col h3 {
  font-family: var(--f-title);
  font-size: 28px;
  font-weight: 700;
  line-height: 1.18;
  letter-spacing: -0.02em;
  color: var(--text);
  margin: 0 0 18px;
}

.infra-sysadmin-col p {
  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.66;
  color: var(--muted);
  margin: 0 0 14px;
}

.infra-sysadmin-col p:last-child {
  margin-bottom: 0;
}

/* ============================================================
   INFRASTRUTTURA CLOUD — CONFINE HOSTING / INFRASTRUTTURA
   ============================================================ */

.infra-boundary {
  background:
    linear-gradient(
      135deg,
      rgba(230, 244, 250, 0.96) 0%,
      rgba(246, 251, 253, 1) 54%,
      rgba(225, 242, 249, 0.92) 100%
    );
  border-top: 1px solid rgba(31, 160, 208, 0.14);
  border-bottom: 1px solid rgba(31, 160, 208, 0.16);
  padding: 28px 0 30px;
}

.infra-boundary-box {
  display: grid;
  grid-template-columns: 180px minmax(0, 1fr);
  gap: 52px;
  align-items: center;
  max-width: 980px;
  margin: 0 auto;
  padding: 0;
  background: transparent;
  border: 0;
}

.infra-boundary-icon {
  width: 190px;
  height: 190px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.infra-boundary-icon svg {
  width: 180px;
  height: 180px;
  color: var(--vp);
  display: block;
  opacity: 0.72;
}

.infra-boundary-icon svg path,
.infra-boundary-icon svg rect,
.infra-boundary-icon svg circle {
  fill: none !important;
  stroke: currentColor;
  stroke-width: 2.4;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.infra-boundary-content {
  max-width: 760px;
}

.infra-boundary-content h2 {
  font-family: var(--f-title);
  font-size: 34px;
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: var(--text);
  margin: 0 0 16px;
}

.infra-boundary-content p {
  max-width: 760px;
  margin: 0 0 12px;
  font-family: var(--f-body);
  font-size: 17px;
  line-height: 1.62;
  color: var(--muted);
}

.infra-boundary-content p:first-of-type {
  font-weight: 700;
  color: var(--text);
}

.infra-boundary-content p:last-of-type {
  margin-bottom: 14px;
}

.infra-boundary-content a {
  display: inline-block;
  font-family: var(--f-title);
  font-size: 17px;
  font-weight: 700;
  color: var(--vp);
  text-decoration: none;
}

.infra-boundary-content a:hover {
  text-decoration: underline;
}

/* ============================================================
   INFRASTRUTTURA CLOUD — CASO REALE
   ============================================================ */

.infra-case {
  background: #FFFFFF;
  border-bottom: 1px solid var(--border);
  padding: 58px 0 62px;
}

.infra-case-layout {
  display: grid;
  grid-template-columns: 360px minmax(0, 1fr);
  gap: 48px;
  align-items: start;
  max-width: 1080px;
  margin: 0 auto;
}

.infra-case-side {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding-top: 8px;
}

.infra-case-label {
  display: inline-block;
  width: fit-content;
  margin: 0 0 28px;
  padding-bottom: 10px;
  font-family: var(--f-title);
  font-size: 14px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: .105em;
  text-transform: uppercase;
  color: var(--vp);
  border-bottom: 2px solid var(--vp);
}

.infra-case-visual {
  width: 360px;
  max-width: 100%;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  margin-top: 34px;
}

.infra-case-visual img {
  width: 340px;
  max-width: none;
  height: auto;
  display: block;
}

.infra-case-content {
  padding: 0;
  transform: translateY(-8px);
}

.infra-case-content h2 {
  max-width: 780px;
  font-family: var(--f-title);
  font-size: 40px;
  font-weight: 700;
  line-height: 1.14;
  letter-spacing: -0.03em;
  color: var(--text);
  margin: 0 0 22px;
}

.infra-case-content p {
  max-width: 760px;
  font-family: var(--f-body);
  font-size: 17.5px;
  line-height: 1.66;
  color: var(--muted);
  margin: 0 0 16px;
}

.infra-case-content p:last-child {
  margin-bottom: 0;
}

.infra-case-image {
  display: none;
}

.infra-case-steps {
  display: none;
}

/* ============================================================
   INFRASTRUTTURA CLOUD — CTA FINALE
   Mantiene il componente standard, testo specifico Infrastruttura
   ============================================================ */

.page-infrastruttura .cta-inner p {
  max-width: 520px;
  margin-bottom: 42px;
  font-size: 19px;
  line-height: 1.55;
}

.page-infrastruttura .cta-inner .btn-primary {
  margin-top: 0;
}
/* ============================================================
   HOSTING — Pagina interna
   ============================================================ */

/* ============================================================
   HOSTING — HERO
   ============================================================ */

.page-hosting .hero-inner > div:first-child {
  max-width: 560px;
  transform: translateY(-32px);
}

.page-hosting .hero h1 {
  max-width: 560px;
}
.page-hosting .hero h1 {
  max-width: 560px;
  color: #07182A;
}

.page-hosting .hero p {
  color: #263A4D;
}

.page-hosting .hero::after {
  background: linear-gradient(
    to right,
    rgba(248, 250, 252, 0.90) 0%,
    rgba(248, 250, 252, 0.76) 26%,
    rgba(248, 250, 252, 0.42) 46%,
    rgba(248, 250, 252, 0.12) 66%,
    rgba(248, 250, 252, 0) 86%
  );
}

/* ============================================================
   HOSTING — AMBIENTE WEB GESTITO / COME LO GESTIAMO
   Blocco unico dopo la hero
   ============================================================ */

.page-hosting .hosting-position {
  background: #ffffff;
  padding: 36px 0 36px;
  margin: 0;
  border-bottom: 1px solid var(--border);
}

.page-hosting .hosting-position-inner {
  max-width: 980px;
  margin: 0 auto;
}

.page-hosting .hosting-position-icon {
  display: none;
}

.page-hosting .hosting-position-text {
  max-width: 780px;
  margin: 0 auto 34px;
  text-align: center;
}

.page-hosting .hosting-position-text h2 {
  margin: 0 0 14px;
  font-family: var(--f-title);
  font-size: 42px;
  line-height: 1.08;
  letter-spacing: -0.04em;
  color: var(--text);
}

.page-hosting .hosting-position-text p {
  margin: 0 auto;
  max-width: 760px;
  font-size: 18px;
  line-height: 1.65;
  color: var(--muted);
}

.page-hosting .hosting-position-points {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 22px;
}

.page-hosting .hosting-position-point {
  padding: 24px 26px 26px;
  min-height: 0;
  border: 1px solid rgba(31, 160, 208, 0.18);
  border-radius: 22px;
  background: #ffffff;
  box-shadow: 0 18px 42px rgba(15, 23, 42, 0.05);
}

.page-hosting .hosting-position-point-icon {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  margin: 0 0 18px;
  border-radius: 14px;
  background: rgba(31, 160, 208, 0.11);
  border: 1px solid rgba(31, 160, 208, 0.26);
}

.page-hosting .hosting-position-point-icon::before {
  content: "";
  display: block;
  width: 27px;
  height: 27px;
  background-repeat: no-repeat;
  background-position: center;
  background-size: 27px 27px;
}

/* Server / infrastruttura */
.page-hosting .hosting-point-infra::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='5' width='16' height='5' rx='1.5'/%3E%3Crect x='4' y='14' width='16' height='5' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E");
}

/* Supporto diretto */
.page-hosting .hosting-point-support::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 13v-1a8 8 0 0 1 16 0v1'/%3E%3Cpath d='M5 13h3v5H6a1 1 0 0 1-1-1v-4Z'/%3E%3Cpath d='M16 13h3v4a1 1 0 0 1-1 1h-2v-5Z'/%3E%3Cpath d='M16 18c0 1.1-.9 2-2 2h-2'/%3E%3C/svg%3E");
}

/* Gestione proattiva */
.page-hosting .hosting-point-proactive::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6v5h-5'/%3E%3Cpath d='M4 18v-5h5'/%3E%3Cpath d='M18.5 10A7 7 0 0 0 6.8 6.8L4 9.5'/%3E%3Cpath d='M5.5 14A7 7 0 0 0 17.2 17.2L20 14.5'/%3E%3C/svg%3E");
}

.page-hosting .hosting-position-point h3 {
  margin: 0 0 9px;
  font-family: var(--f-title);
  font-size: 19px;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--text);
}

.page-hosting .hosting-position-point p {
  margin: 0;
  font-size: 15px;
  line-height: 1.5;
  color: var(--muted);
}

/* ============================================================
   HOSTING — AMBIENTE TECNICO
   ============================================================ */

.page-hosting .hosting-real {
  background: #eef8fc;
  border-bottom: 1px solid var(--border);
}

.page-hosting .hosting-real-grid {
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
  max-width: 1440px;
  min-height: 420px;
  margin: 0 auto;
  overflow: hidden;
  background: #eef8fc;
  align-items: stretch;
}

.page-hosting .hosting-real-media {
  position: relative;
  height: auto;
  min-height: 420px;
  overflow: hidden;
}

.page-hosting .hosting-real-content {
  min-height: 420px;
  padding: 34px 64px 32px;
  background: #eef8fc;
  box-sizing: border-box;
}
.page-hosting .hosting-real-media img {
  width: 100%;
  height: 100%;
  min-height: 420px;
  display: block;
  object-fit: cover;
  object-position: center;
  filter: saturate(0.98) contrast(0.98) brightness(1.01);
}

.page-hosting .hosting-real-media::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(255, 255, 255, 0.00) 0%,
      rgba(255, 255, 255, 0.00) 68%,
      rgba(230, 244, 250, 0.06) 100%
    );
}

.page-hosting .hosting-real-content h2 {
  margin: 0 0 12px;
  max-width: 620px;
  font-family: var(--f-title);
  font-size: 36px;
  line-height: 1.06;
  letter-spacing: -0.04em;
  color: var(--text);
}

.page-hosting .hosting-real-intro {
  margin: 0 0 22px;
  max-width: 620px;
  font-size: 15.5px;
  line-height: 1.52;
  color: var(--muted);
}

.page-hosting .hosting-real-items {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 17px;
}

.page-hosting .hosting-real-item {
  padding-left: 17px;
  border-left: 1px solid rgba(31, 160, 208, 0.24);
}

.page-hosting .hosting-real-icon {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 62px;
  height: 62px;
  margin-bottom: 20px;
  border-radius: 18px;
  background: rgba(31, 160, 208, 0.13);
  border: 1px solid rgba(31, 160, 208, 0.32);
}

.page-hosting .hosting-real-icon::before {
  content: "";
  display: block;
  width: 36px;
  height: 36px;
  background-repeat: no-repeat;
  background-position: center center;
  background-size: 36px 36px;
}

/* Plesk / pannello */
.page-hosting .hosting-real-plesk::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2.1' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='5' width='16' height='5' rx='1.5'/%3E%3Crect x='4' y='14' width='16' height='5' rx='1.5'/%3E%3Cpath d='M7 7.5h.01M7 16.5h.01M11 7.5h6M11 16.5h6'/%3E%3C/svg%3E");
}

/* Email / servizi collegati */
.page-hosting .hosting-real-mail::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2.1' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='4' y='6' width='16' height='12' rx='2'/%3E%3Cpath d='m4 8 8 6 8-6'/%3E%3C/svg%3E");
}

/* Sicurezza */
.page-hosting .hosting-real-security::before {
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' fill='none' stroke='%231FA0D0' stroke-width='2.1' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3 5 6v5c0 4.5 3 8.5 7 10 4-1.5 7-5.5 7-10V6l-7-3Z'/%3E%3Cpath d='m9.5 12 1.8 1.8L15 10'/%3E%3C/svg%3E");
}

.page-hosting .hosting-real-item h3 {
  margin: 0 0 12px;
  font-family: var(--f-title);
  font-size: 15.5px;
  line-height: 1.15;
  color: var(--text);
}

.page-hosting .hosting-real-item p {
  margin: 0;
  font-size: 12.7px;
  line-height: 1.42;
  color: var(--muted);
}

/* ============================================================
   HOSTING — CRESCITA ED EVOLUZIONE
   ============================================================ */

.hosting-growth {
  background: #ffffff;
  padding: 36px 0 36px;
  border-bottom: 1px solid var(--border);
}

.hosting-growth-inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(260px, 0.9fr);
  gap: 56px;
  align-items: center;
}

.hosting-growth-content {
  max-width: 680px;
}

.hosting-growth-content h2 {
  margin: 0 0 16px;
  font-family: var(--f-title);
  font-size: 40px;
  line-height: 1.08;
  letter-spacing: -0.04em;
  color: var(--text);
}

.hosting-growth-content p {
  margin: 0;
  max-width: 640px;
  font-size: 17px;
  line-height: 1.65;
  color: var(--muted);
}

.page-hosting .hosting-growth .hosting-growth-link,
.page-hosting .hosting-growth .hosting-growth-link:link,
.page-hosting .hosting-growth .hosting-growth-link:visited {
  display: inline-flex;
  margin-top: 22px;
  font-weight: 700;
  color: #1FA0D0 !important;
  text-decoration: none;
}

.page-hosting .hosting-growth .hosting-growth-link:hover {
  color: #167A99 !important;
}


.hosting-growth-chart {
  display: flex;
  justify-content: center;
  align-items: center;
  transform: translateY(18px);
}

.hosting-growth-svg {
  width: min(100%, 500px);
  height: auto;
  display: block;
}

/* ============================================================
   HOSTING — COSA È INCLUSO
   ============================================================ */

.hosting-included {
  background: linear-gradient(180deg, #ffffff 0%, #f7fbfd 100%);
  padding: 36px 0 36px;
  border-bottom: 1px solid var(--border);
}

.hosting-included-head {
  max-width: 820px;
  margin: 0 0 38px;
}

.hosting-included-head h2 {
  margin: 0 0 16px;
  font-family: var(--f-title);
  font-size: 42px;
  line-height: 1.08;
  letter-spacing: -0.04em;
  color: var(--text);
}

.hosting-included-head p {
  max-width: 700px;
  margin: 0;
  font-size: 18px;
  line-height: 1.65;
  color: var(--muted);
}

.hosting-included-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 18px;
}

.hosting-included-item {
  min-height: 150px;
  padding: 24px 22px;
  border: 1px solid rgba(31, 160, 208, 0.18);
  border-radius: 22px;
  background: #ffffff;
  box-shadow: 0 18px 42px rgba(15, 23, 42, 0.05);
}

.hosting-included-item strong {
  display: block;
  margin-bottom: 10px;
  font-family: var(--f-title);
  font-size: 17px;
  line-height: 1.25;
  color: var(--text);
}

.hosting-included-item span {
  display: block;
  font-size: 15px;
  line-height: 1.55;
  color: var(--muted);
}

/* ============================================================
   HOSTING — PER CHI È / PER CHI NON È
   ============================================================ */

.page-hosting .hosting-fit {
  background: #ffffff;
  padding: 32px 0 48px;
  border-bottom: 1px solid var(--border);
}

.page-hosting .hosting-fit-head {
  max-width: 860px;
  margin: 0 0 34px;
}

.page-hosting .hosting-fit-head h2 {
  margin: 0 0 16px;
  font-family: var(--f-title);
  font-size: 42px;
  line-height: 1.08;
  letter-spacing: -0.04em;
  color: var(--text);
}

.page-hosting .hosting-fit-head p {
  margin: 0;
  max-width: 780px;
  font-size: 18px;
  line-height: 1.65;
  color: var(--muted);
}

.page-hosting .hosting-fit-grid {
  position: relative;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 72px;
  max-width: 1080px;
}

.page-hosting .hosting-fit-grid::before {
  content: "";
  position: absolute;
  top: 6px;
  bottom: 6px;
  left: 50%;
  width: 1px;
  transform: translateX(-50%);
  background: linear-gradient(
    180deg,
    rgba(31, 160, 208, 0.00) 0%,
    rgba(31, 160, 208, 0.16) 18%,
    rgba(31, 160, 208, 0.16) 82%,
    rgba(31, 160, 208, 0.00) 100%
  );
}

.page-hosting .hosting-fit-box {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}

.page-hosting .hosting-fit-for,
.page-hosting .hosting-fit-not {
  background: transparent;
  border: 0;
}

.page-hosting .hosting-fit-box h3 {
  margin: 0 0 18px;
  font-family: var(--f-title);
  font-size: 26px;
  line-height: 1.22;
  letter-spacing: -0.015em;
  color: var(--text);
}
.page-hosting .hosting-fit-box ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.page-hosting .hosting-fit-box li {
  position: relative;
  margin: 0 0 13px;
  padding-left: 22px;
  border: 0;
  font-size: 16px;
  line-height: 1.55;
  color: var(--muted);
}

.page-hosting .hosting-fit-box li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.72em;
  width: 9px;
  height: 2px;
  border-radius: 999px;
  background: #1FA0D0;
}

.page-hosting .hosting-fit-box li:last-child {
  margin-bottom: 0;
}


.page-hosting .hosting-fit-accent {
  display: block !important;
  width: 88px;
  min-width: 88px;
  height: 3px;
  min-height: 3px;
  margin: -4px 0 24px;
  border-radius: 999px;
  background: #1FA0D0 !important;
}

/* ============================================================
   APPLICATIVI — pagina interna
   ============================================================ */


/* ============================================================
   APPLICATIVI — HERO
   ============================================================ */

.hero-applicativi {
  position: relative;
  min-height: 560px;
  overflow: hidden;
  background: #f8fafc;
}

.hero-applicativi .hero-bg img {
  object-position: center right;
  transform: scale(1.04) translateX(8px) translateY(2px);
  filter:
    contrast(1.04)
    saturate(1.03)
    drop-shadow(-18px 24px 34px rgba(6, 15, 28, 0.12));
}

.hero-applicativi::after,
.page-applicativi .hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(
    to right,
    rgba(248, 250, 252, 1) 0%,
    rgba(248, 250, 252, 0.98) 27%,
    rgba(248, 250, 252, 0.80) 45%,
    rgba(248, 250, 252, 0.30) 65%,
    rgba(248, 250, 252, 0) 100%
  );
}

.hero-applicativi .container {
  position: relative;
  z-index: 2;
}

.hero-applicativi .hero-inner {
  min-height: 560px;
  align-items: center;
  padding-top: 0;
  padding-bottom: 0;
}

.hero-applicativi .hero-inner > div:first-child {
  transform: translateY(-8px);
}

.hero-applicativi h1 {
  max-width: 610px;
  margin: 0 0 20px;
  color: #07182A;
}

.hero-applicativi .hero-sub {
  max-width: 565px;
  margin: 0;
  color: #40566A;
  font-size: 20px;
  line-height: 1.6;
}


/* ============================================================
   APPLICATIVI — COSA POSSIAMO COSTRUIRE
   ============================================================ */

.applicativi-build {
  padding: 50px 0 26px;
  border-top: 1px solid rgba(181, 216, 230, 0.30);
  background:
    radial-gradient(
      circle at 50% 0%,
      rgba(31, 160, 208, 0.08) 0%,
      rgba(31, 160, 208, 0) 36%
    ),
    linear-gradient(180deg, #ffffff 0%, #f7fbfd 100%);
}

.applicativi-build-head {
  max-width: 850px;
  margin: 0 auto 46px;
  text-align: center;
}

.applicativi-build-head h2 {
  margin: 0 0 20px;
  color: #07182A;
  font-size: 48px;
  line-height: 1.08;
  letter-spacing: -0.045em;
}

.applicativi-build-head p {
  max-width: 760px;
  margin: 0 auto;
  color: #40566A;
  font-size: 19px;
  line-height: 1.62;
}

.applicativi-build-grid {
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  max-width: 1180px;
  margin: 0 auto;
}

.applicativi-build-item {
  position: relative;
  min-width: 0;
  padding: 6px 42px 8px;
}

.applicativi-build-item:first-child {
  padding-left: 0;
}

.applicativi-build-item:last-child {
  padding-right: 0;
}

.applicativi-build-item:not(:first-child)::before {
  content: "";
  position: absolute;
  left: 0;
  top: 4px;
  bottom: 4px;
  width: 1px;
  background: rgba(181, 216, 230, 0.72);
}

.applicativi-build-item h3 {
  max-width: 270px;
  min-height: 58px;
  margin: 0 0 25px;
  color: #07182A;
  font-size: 25px;
  line-height: 1.16;
  font-weight: 800;
  letter-spacing: -0.035em;
}

.applicativi-build-item ul {
  display: grid;
  gap: 15px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.applicativi-build-item li {
  position: relative;
  padding-left: 22px;
  color: #40566A;
  font-size: 17px;
  line-height: 1.48;
}

.applicativi-build-item li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.68em;
  width: 9px;
  height: 2px;
  border-radius: 999px;
  background: #1FA0D0;
}

/* ============================================================
   APPLICATIVI — INTEGRARE, ADATTARE O SVILUPPARE
   ============================================================ */

.applicativi-choice {
  padding: 68px 0 26px;
  background: #ffffff;
}

.applicativi-choice-inner {
  display: grid;
  grid-template-columns: minmax(0, 0.44fr) minmax(0, 0.56fr);
  gap: 64px;
  align-items: start;
}

.applicativi-choice-content {
  max-width: 520px;
}

.applicativi-choice-content h2 {
  margin: 0 0 26px;
  color: #07182A;
  font-size: 42px;
  line-height: 1.08;
  letter-spacing: -0.045em;
}

.applicativi-choice-content p {
  margin: 0 0 17px;
  color: #40566A;
  font-size: 18px;
  line-height: 1.62;
}

.applicativi-choice-content p:last-child {
  margin-bottom: 0;
}

.applicativi-choice-options {
  display: grid;
  gap: 0;
  border-top: 1px solid rgba(181, 216, 230, 0.70);
}

.applicativi-choice-option {
  position: relative;
  display: grid;
  grid-template-columns: 72px minmax(190px, 0.70fr) minmax(240px, 1fr);
  gap: 24px;
  align-items: start;
  padding: 34px 0 36px;
  border-bottom: 1px solid rgba(181, 216, 230, 0.70);
}

.applicativi-choice-option:last-child {
  border-bottom: 0;
}

.applicativi-choice-option > span {
  display: block;
  color: rgba(31, 160, 208, 0.92);
  font-size: 20px;
  line-height: 1;
  font-weight: 800;
  letter-spacing: -0.02em;
}

.applicativi-choice-option h3 {
  margin: -4px 0 0;
  color: #07182A;
  font-size: 23px;
  line-height: 1.22;
  font-weight: 800;
  letter-spacing: -0.03em;
}

.applicativi-choice-option p {
  margin: -3px 0 0;
  color: #40566A;
  font-size: 17px;
  line-height: 1.58;
}

/* ============================================================
   APPLICATIVI — IL WEB COME PARTE DEL SISTEMA
   ============================================================ */

.applicativi-web-system {
  padding: 26px 0 28px;
  overflow: hidden;
  background:
    radial-gradient(
      circle at 76% 46%,
      rgba(31, 160, 208, 0.10) 0%,
      rgba(31, 160, 208, 0) 38%
    ),
    linear-gradient(180deg, #f7fbfd 0%, #ffffff 100%);
}

.applicativi-web-system-inner {
  display: grid;
  grid-template-columns: minmax(0, 0.52fr) minmax(0, 0.48fr);
  gap: 82px;
  align-items: center;
  min-height: 440px;
}

.applicativi-web-system-content {
  max-width: 620px;
}

.applicativi-web-system-content h2 {
  max-width: 570px;
  margin: 0 0 27px;
  color: #07182A;
  font-size: 46px;
  line-height: 1.08;
  letter-spacing: -0.045em;
}

.applicativi-web-system-content p {
  max-width: 600px;
  margin: 0 0 17px;
  color: #40566A;
  font-size: 18px;
  line-height: 1.62;
}

.applicativi-web-system-content p:last-child {
  margin-bottom: 0;
}

.applicativi-web-system-media {
  position: relative;
  min-height: 390px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.applicativi-web-system-media::before {
  content: "";
  position: absolute;
  width: 390px;
  height: 390px;
  border-radius: 50%;
  background:
    radial-gradient(
      circle,
      rgba(31, 160, 208, 0.10) 0%,
      rgba(31, 160, 208, 0.035) 48%,
      rgba(31, 160, 208, 0) 72%
    );
}

.applicativi-web-system-media img {
  position: relative;
  z-index: 2;
  display: block;
  width: 100%;
  max-width: 480px;
  height: auto;
  transform: translateX(16px);
  filter: drop-shadow(-18px 26px 34px rgba(6, 15, 28, 0.14));
}


/* ============================================================
   APPLICATIVI — TECNOLOGIA E AMBIENTE TECNICO
   ============================================================ */

.applicativi-technology {
  padding: 46px 0 62px;
  background: #ffffff;
}

.applicativi-technology-head {
  max-width: 860px;
  margin: 0 auto 50px;
  text-align: center;
}

.applicativi-technology-head h2 {
  max-width: 820px;
  margin: 0 auto 22px;
  color: #07182A;
  font-size: 48px;
  line-height: 1.08;
  letter-spacing: -0.045em;
}

.applicativi-technology-head p {
  max-width: 720px;
  margin: 0 auto;
  color: #40566A;
  font-size: 19px;
  line-height: 1.62;
}

.applicativi-technology-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0 64px;
  max-width: 1180px;
  margin: 0 auto;
}

.applicativi-technology-item {
  position: relative;
  padding: 10px 36px 40px 0;
}

.applicativi-technology-item:nth-child(2) {
  padding-right: 0;
  padding-left: 36px;
  border-left: 1px solid rgba(181, 216, 230, 0.72);
}

.applicativi-technology-item h3 {
  margin: 0 0 17px;
  color: #07182A;
  font-size: 27px;
  line-height: 1.18;
  font-weight: 800;
  letter-spacing: -0.035em;
}

.applicativi-technology-item p {
  max-width: 520px;
  margin: 0;
  color: #40566A;
  font-size: 18px;
  line-height: 1.62;
}


/* ============================================================
   APPLICATIVI — FILEMAKER
   ============================================================ */

.applicativi-technology-filemaker {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: minmax(0, 0.46fr) minmax(0, 0.54fr);

  width: calc(100% + 144px);
  min-height: 330px;
  margin: 10px -72px -92px;
  padding: 0;

  overflow: hidden;
  border: 0;
  border-radius: 0;
  box-shadow: none;

  background:
    radial-gradient(
      circle at 76% 34%,
      rgba(95, 196, 230, 0.22) 0%,
      rgba(95, 196, 230, 0) 42%
    ),
    linear-gradient(
      145deg,
      #07182A 0%,
      #0B2238 54%,
      #06101E 100%
    );
}

.applicativi-technology-filemaker-content {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 22px 54px 40px;
  transform: translateY(-18px);
}


.applicativi-technology-filemaker h3 {
  margin: 0 0 18px;
  color: #ffffff;
  font-size: 36px;
  line-height: 1.08;
  letter-spacing: -0.045em;
}

.applicativi-technology-filemaker p {
  max-width: 450px;
  margin: 0 0 14px;
  color: rgba(255, 255, 255, 0.78);
  font-size: 17px;
  line-height: 1.58;
}

.applicativi-technology-filemaker p:last-of-type {
  margin-bottom: 0;
}

.applicativi-link {
  display: inline-flex;
  align-items: center;
  width: fit-content;
  margin-top: 24px;
  color: #8CDBF4;
  font-size: 16px;
  line-height: 1.2;
  font-weight: 800;
  text-decoration: none;
  transition:
    color 0.2s ease,
    transform 0.2s ease;
}

.applicativi-link:hover {
  color: #ffffff;
  transform: translateX(3px);
}

.applicativi-technology-filemaker-media {
  position: relative;
  min-height: 330px;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.applicativi-technology-filemaker-media::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(7, 24, 42, 0.28) 0%,
      rgba(7, 24, 42, 0) 34%
    );
}

.applicativi-technology-filemaker-media img {
  position: relative;
  z-index: 2;
  display: block;
  width: 100%;
  max-width: 390px;
  height: auto;
  transform:
    perspective(1100px)
    rotateY(-5deg)
    rotateX(2deg)
    translateX(6px);

  filter:
    drop-shadow(-18px 22px 30px rgba(0, 0, 0, 0.28));
}

.applicativi-filemaker-brand {
  position: absolute;
  z-index: 3;
  right: 34px;
  bottom: 40px;
  display: grid;
  gap: 4px;
  justify-items: end;
  color: rgba(255, 255, 255, 0.72);
  font-size: 13px;
  line-height: 1.2;
}

.applicativi-claris-logo {
  display: block;
  color: #ffffff;
  font-size: 27px;
  line-height: 1;
  font-weight: 700;
  letter-spacing: -0.04em;
}

/* ============================================================
   APPLICATIVI — CTA FINALE
   ============================================================ */

.page-applicativi .cta-inner p {
  max-width: 560px;
  margin-bottom: 42px;
  font-size: 19px;
  line-height: 1.58;
}

/* ============================================================
   FILEMAKER — pagina interna
   Versione desktop
   ============================================================ */


/* ============================================================
   FILEMAKER — HERO
   ============================================================ */

.page-filemaker .hero-filemaker {
  position: relative;
  min-height: 620px;
  overflow: hidden;
  background: #f8fbfe;
}

.page-filemaker .hero-filemaker .hero-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}

.page-filemaker .hero-filemaker .hero-bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center right;
  display: block;
  filter: contrast(1.12) saturate(1.08) brightness(0.94);
}

.page-filemaker .hero-filemaker .container {
  position: relative;
  z-index: 2;
}

.page-filemaker .hero-filemaker .hero-inner {
  min-height: 620px;
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
  align-items: start;
  padding-top: 92px;
}

.hero-filemaker .hero-inner > div:first-child {
  transform: translateY(-22px);
}

.page-filemaker .hero-filemaker .eyebrow {
  margin-bottom: 18px;
  color: #1FA0D0;
  font-size: 13px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.page-filemaker .hero-filemaker h1 {
  max-width: 620px;
  margin: 0 0 30px;
  color: #061936;
  font-size: 58px;
  line-height: 1.04;
  letter-spacing: -0.045em;
}

.hero-filemaker .hero-sub {
  max-width: 620px;
  color: #5f6f86;
  font-size: 21px;
  font-weight: 400;
  line-height: 1.62;
}

.hero-filemaker::after,
.page-filemaker .hero::after {
  background: linear-gradient(
    to right,
    rgba(248, 250, 252, 0.92) 0%,
    rgba(248, 250, 252, 0.80) 30%,
    rgba(248, 250, 252, 0.38) 52%,
    rgba(248, 250, 252, 0.08) 72%,
    rgba(248, 250, 252, 0.00) 100%
  );
}

.page-filemaker .hero-filemaker .btn-primary {
  margin-top: 4px;
}


/* ============================================================
   FILEMAKER — SISTEMA COMPLETO
   ============================================================ */

.filemaker-system {
  padding: 44px 0 46px;
  background: #ffffff;
}

.filemaker-system-head {
  max-width: 820px;
  margin: 0 auto 36px;
  text-align: center;
}

.filemaker-system-head h2 {
  margin: 0 0 18px;
  color: #071a36;
  font-size: 38px;
  line-height: 1.16;
  letter-spacing: -0.035em;
}

.filemaker-system-head p {
  max-width: 720px;
  margin: 0 auto;
  color: #52667e;
  font-size: 18px;
  line-height: 1.7;
}

.filemaker-system-grid {
  display: grid;
  grid-template-columns: repeat(5, 150px);
  gap: 40px;
  justify-content: center;
}

.filemaker-system-item {
  position: relative;
  padding: 28px 18px 0 0;
  text-align: left;
}

.filemaker-system-item::before {
  content: "";
  display: block;
  width: 42px;
  height: 3px;
  margin: 0 0 16px;
  border-radius: 999px;
  background: #1FA0D0;
}

.filemaker-system-item h3 {
  margin: 0 0 12px;
  color: #071a36;
  font-size: 18px;
  line-height: 1.3;
  letter-spacing: -0.015em;
}

.filemaker-system-item p {
  max-width: 150px;
  margin: 0;
  color: #5a6d83;
  font-size: 15px;
  line-height: 1.46;
}

/* ============================================================
   FILEMAKER — PARTNER, RESELLER, HOSTING E VPS
   ============================================================ */

.filemaker-partner {
  padding: 48px 0 10px;
  background:
    linear-gradient(180deg, #f4f8fc 0%, #eef5fa 100%);
}

.filemaker-partner-grid {
  display: grid;
  grid-template-columns: minmax(300px, 0.82fr) minmax(0, 1.55fr);
  gap: 58px;
  align-items: start;
}

.filemaker-partner-intro {
  max-width: 430px;
}

.filemaker-partner-intro h2 {
  margin: 0 0 28px;
  color: #071a36;
  font-size: 42px;
  line-height: 1.12;
  letter-spacing: -0.04em;
}

.filemaker-partner-intro p {
  margin: 0 0 28px;
  color: #40556f;
  font-size: 18px;
  line-height: 1.7;
}

.filemaker-partner-cards {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 24px;
  padding-top: 28px;
}

.filemaker-partner-card {
  position: relative;
  min-height: 245px;
  padding: 24px;
  overflow: hidden;
  border-radius: 4px;
  color: #ffffff;
  background: #071a36;
  box-shadow: 0 16px 32px rgba(6, 20, 42, 0.15);
}

.filemaker-partner-card::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background:
    linear-gradient(
      180deg,
      rgba(5, 17, 36, 0.26) 0%,
      rgba(5, 17, 36, 0.88) 100%
    ),
    radial-gradient(
      circle at 78% 14%,
      rgba(31, 160, 208, 0.58),
      transparent 42%
    );
}

.filemaker-partner-card::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  opacity: 0.28;
  background:
    linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.16) 0%,
      transparent 38%
    ),
    repeating-linear-gradient(
      90deg,
      rgba(255, 255, 255, 0.08) 0,
      rgba(255, 255, 255, 0.08) 1px,
      transparent 1px,
      transparent 28px
    );
}

.filemaker-card-partner {
  background:
    linear-gradient(145deg, #0b163d 0%, #162a62 52%, #08142f 100%);
}

.filemaker-card-hosting {
  background:
    linear-gradient(145deg, #05383f 0%, #096a77 48%, #061f35 100%);
}

.filemaker-card-vps {
  background:
    linear-gradient(145deg, #063b74 0%, #082759 54%, #061528 100%);
}

.filemaker-partner-card > * {
  position: relative;
  z-index: 1;
}

.filemaker-card-icon {
  width: 62px;
  height: 62px;
  margin: 22px auto 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(255, 255, 255, 0.38);
  border-radius: 22px;
  background:
    linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.24),
      rgba(255, 255, 255, 0.07)
    );
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.10),
    0 12px 26px rgba(0, 0, 0, 0.16);
}

/* Logo Claris nel box Partner */

.filemaker-card-claris img {
  display: block;
  width: 54px;
  height: auto;
  opacity: 0.96;
  filter: none;
}

/* Icona cloud nel box Hosting FileMaker */

.filemaker-card-cloud::before {
  content: "";
  width: 48px;
  height: 32px;
  display: block;
  background: rgba(255, 255, 255, 0.96);
  -webkit-mask:
    radial-gradient(circle 12px at 17px 20px, #000 98%, transparent 100%),
    radial-gradient(circle 15px at 30px 15px, #000 98%, transparent 100%),
    radial-gradient(circle 11px at 40px 21px, #000 98%, transparent 100%),
    linear-gradient(#000 0 0) bottom / 40px 17px no-repeat;
  mask:
    radial-gradient(circle 12px at 17px 20px, #000 98%, transparent 100%),
    radial-gradient(circle 15px at 30px 15px, #000 98%, transparent 100%),
    radial-gradient(circle 11px at 40px 21px, #000 98%, transparent 100%),
    linear-gradient(#000 0 0) bottom / 40px 17px no-repeat;
}

/* Icona server nel box VPS ottimizzate */

.filemaker-card-server {
  position: relative;
}

.filemaker-card-server::before {
  content: "";
  width: 48px;
  height: 38px;
  display: block;
  border-top: 5px solid rgba(255, 255, 255, 0.96);
  border-bottom: 5px solid rgba(255, 255, 255, 0.96);
  border-radius: 6px;
  background:
    linear-gradient(
      rgba(255, 255, 255, 0.96),
      rgba(255, 255, 255, 0.96)
    ) center / 100% 5px no-repeat;
}

.filemaker-card-server::after {
  content: "";
  position: absolute;
  right: 18px;
  top: 25px;
  width: 4px;
  height: 4px;
  border-radius: 999px;
  background: #5FC4E6;
  box-shadow:
    0 11px 0 #5FC4E6,
    0 -11px 0 #5FC4E6;
}

.filemaker-partner-card h3 {
  margin: 0 0 8px;
  color: #ffffff;
  font-size: 22px;
  line-height: 1.24;
  letter-spacing: -0.02em;
}

.filemaker-partner-card p {
  margin: 0;
  color: rgba(255, 255, 255, 0.84);
  font-size: 16px;
  line-height: 1.46;
}


/* ============================================================
   FILEMAKER — PROBLEMA
   ============================================================ */

.filemaker-problem {
  background: #ffffff;
}

.filemaker-problem-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  max-width: 1400px;
  min-height: 470px;
  margin: 0 auto;
}

.filemaker-problem-media {
  position: relative;
  overflow: hidden;
  background: #eaf2f7;
}

.filemaker-problem-media img {
  width: 100%;
  height: 100%;
  min-height: 470px;
  object-fit: cover;
  object-position: 30% center;
  display: block;
  filter: brightness(1.03) saturate(0.96);
  transform: scale(1.01);
}

.filemaker-problem-media::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(248, 251, 254, 0.00) 0%,
      rgba(248, 251, 254, 0.00) 42%,
      rgba(248, 251, 254, 0.24) 68%,
      rgba(248, 251, 254, 0.82) 100%
    ),
    linear-gradient(
      180deg,
      rgba(255, 255, 255, 0.03) 0%,
      rgba(6, 25, 54, 0.025) 100%
    );
}

.filemaker-problem-content {
  padding: 44px 78px 56px;
  background: #f8fbfe;
}

.filemaker-problem-content h2 {
  margin: 0 0 24px;
  color: #071a36;
  font-size: 40px;
  line-height: 1.15;
  letter-spacing: -0.035em;
}

.filemaker-problem-content p {
  margin: 0 0 18px;
  color: #40556f;
  font-size: 18px;
  line-height: 1.7;
}

.filemaker-problem-intro {
  max-width: 680px;
}

.filemaker-problem-points {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 26px;
  margin-top: 42px;
}

.filemaker-problem-point {
  padding-top: 22px;
  border-top: 1px solid rgba(9, 31, 61, 0.14);
}

.filemaker-problem-point h3 {
  margin: 0 0 10px;
  color: #071a36;
  font-size: 17px;
  line-height: 1.3;
}

.filemaker-problem-point p {
  margin: 0;
  color: #5a6d83;
  font-size: 15px;
  line-height: 1.6;
}

.filemaker-point-users p {
  margin-top: 12px;
}


/* ============================================================
   FILEMAKER — POSIZIONAMENTO
   ============================================================ */

.filemaker-position {
  padding: 48px 0 64px;
  background: #ffffff;
}

.filemaker-position-head {
  max-width: 820px;
  margin: 0 auto 54px;
  text-align: center;
}

.filemaker-position-head h2 {
  margin: 0;
  color: #071a36;
  font-size: 40px;
  line-height: 1.24;
  letter-spacing: -0.035em;
}

.filemaker-position-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  max-width: 1050px;
  margin: 0 auto;
}

.filemaker-position-item {
  position: relative;
  padding: 0 42px;
}

.filemaker-position-item + .filemaker-position-item {
  border-left: 1px solid rgba(9, 31, 61, 0.12);
}

.filemaker-position-item::before {
  content: "";
  display: block;
  width: 42px;
  height: 3px;
  margin: 0 0 22px;
  border-radius: 999px;
  background: #1FA0D0;
}

.filemaker-position-item h3 {
  margin: 0 0 12px;
  color: #071a36;
  font-size: 18px;
  line-height: 1.25;
  letter-spacing: -0.015em;
}

.filemaker-position-item p {
  margin: 0;
  color: #53657c;
  font-size: 16px;
  line-height: 1.65;
}


/* ============================================================
   FILEMAKER — CASO REALE / COSA CAMBIA
   ============================================================ */

.filemaker-case {
  background: #f4f8fc;
}

.filemaker-case-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  max-width: 1400px;
  min-height: 420px;
  margin: 0 auto;
}

.filemaker-case-content {
  padding: 50px 74px 46px 84px;
}

.filemaker-case-content h2 {
  margin: 0 0 36px;
  color: #071a36;
  font-size: 42px;
  line-height: 1.12;
  letter-spacing: -0.04em;
}

.filemaker-case-steps {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 28px;
  margin-bottom: 44px;
}

.filemaker-case-step {
  position: relative;
}

.filemaker-case-step span {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  margin-bottom: 16px;
  border-radius: 999px;
  color: #ffffff;
  background: #1FA0D0;
  font-size: 15px;
  font-weight: 800;
  line-height: 1;
}

.filemaker-case-step h3 {
  margin: 0 0 10px;
  color: #071a36;
  font-size: 17px;
  line-height: 1.28;
}

.filemaker-case-step p {
  margin: 0;
  color: #53677e;
  font-size: 15px;
  line-height: 1.62;
}

.filemaker-case-benefits {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 24px;
  padding-top: 30px;
  border-top: 1px solid rgba(9, 31, 61, 0.14);
}

.filemaker-case-benefits article {
  min-width: 0;
}

.filemaker-case-benefits h3 {
  margin: 0 0 6px;
  color: #071a36;
  font-size: 15px;
  line-height: 1.3;
}

.filemaker-case-benefits p {
  margin: 0;
  color: #5d7188;
  font-size: 14px;
  line-height: 1.45;
}

.filemaker-case-media {
  position: relative;
  overflow: hidden;
  background: #dce8ef;
}

.filemaker-case-media img {
  width: 100%;
  height: 100%;
  min-height: 420px;
  object-fit: cover;
  object-position: 86% center;
  display: block;
}

.filemaker-case-media::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(244, 248, 252, 0.92) 0%,
      rgba(244, 248, 252, 0.58) 13%,
      rgba(244, 248, 252, 0.16) 28%,
      rgba(244, 248, 252, 0.00) 42%
    ),
    linear-gradient(
      180deg,
      rgba(6, 25, 54, 0.02),
      rgba(6, 25, 54, 0.08)
    );
}


/* ============================================================
   FILEMAKER — PONTE VERSO IL SITO DEDICATO
   ============================================================ */

.filemaker-difference {
  position: relative;
  min-height: 360px;
  padding: 54px 0 36px;
  overflow: hidden;
  background:
    radial-gradient(
      circle at 86% 44%,
      rgba(42, 116, 255, 0.28),
      transparent 24%
    ),
    linear-gradient(
      135deg,
      #071832 0%,
      #06101f 58%,
      #091c3d 100%
    );
}

.filemaker-difference::before {
  content: "";
  position: absolute;
  inset: 0;
  opacity: 0.18;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(255, 255, 255, 0.08) 1px,
      transparent 1px
    ),
    linear-gradient(
      180deg,
      rgba(255, 255, 255, 0.06) 1px,
      transparent 1px
    );
  background-size: 48px 48px;
}

.filemaker-difference .container {
  position: relative;
  z-index: 1;
}

.filemaker-difference-grid {
  display: grid;
  grid-template-columns:
    minmax(0, 1.05fr)
    minmax(0, 0.95fr)
    260px;
  gap: 56px;
  align-items: start;
}

/* Titolo principale */

.filemaker-difference-title h2 {
  margin: 0;
  color: #ffffff;
  font-size: 41px;
  line-height: 1.28;
  letter-spacing: -0.005em;
}

/* Testo centrale */

.filemaker-difference-text {
  padding-left: 48px;
  border-left: 1px solid rgba(255, 255, 255, 0.28);
}

.filemaker-difference-text p {
  margin: 0;
  color: rgba(255, 255, 255, 0.78);
  font-size: 18px;
  line-height: 1.72;
}

.filemaker-difference-text p + p {
  margin-top: 18px;
  color: #ffffff;
  font-weight: 700;
}

/* Simbolo a layer — immagine */

.filemaker-difference-mark {
  position: relative;
  width: 340px;
  height: 300px;
  justify-self: center;
  margin-top: 0;
  overflow: hidden;
  border-radius: 34px;
  mix-blend-mode: screen;
  filter:
    drop-shadow(0 30px 62px rgba(42, 92, 255, 0.36));
  transform: translateY(-24px);
}

.filemaker-difference-mark img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}


.filemaker-difference-text .btn-primary {
  display: inline-flex;
  margin-top: 26px;
}

/* ============================================================
   FILEMAKER — CTA FINALE
   Mantiene il componente standard, con testo specifico FileMaker
   ============================================================ */

.page-filemaker .cta-inner p {
  max-width: 430px;
  margin-bottom: 64px;
  font-size: 19px;
  line-height: 1.55;
}

.page-filemaker .cta-inner .btn-primary {
  margin-top: 0;
}

/* ============================================================
   CONTATTI — pagina interna
   ============================================================ */

/* ============================================================
   CONTATTI — HERO CON IMMAGINE NEL PHP
   ============================================================ */

.page-contatti .contact-hero {
  position: relative;
  min-height: 620px;
  padding: 0;
  display: flex;
  align-items: center;
  background: #f8fbfd;
  border-bottom: 1px solid rgba(7, 21, 42, 0.08);
  overflow: hidden;
}

.page-contatti .contact-hero-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  overflow: hidden;
}

.page-contatti .contact-hero-bg img {
  position: absolute;
  right: 0;
  bottom: 0;
  width: auto;
  height: 620px;
  max-width: none;
  display: block;
  opacity: 1;
  filter: contrast(1.08) saturate(1.06);
}

.page-contatti .contact-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background:
    linear-gradient(
      90deg,
      rgba(248, 251, 253, 1) 0%,
      rgba(248, 251, 253, 0.98) 34%,
      rgba(248, 251, 253, 0.82) 55%,
      rgba(248, 251, 253, 0.34) 100%
    ),
    radial-gradient(circle at 78% 24%, rgba(31, 160, 208, 0.05), transparent 34%);
}

.page-contatti .contact-hero::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  z-index: 2;
  width: min(1240px, calc(100% - 160px));
  height: 1px;
  transform: translateX(-50%);
  background: rgba(7, 21, 42, 0.06);
}

.page-contatti .contact-hero .container {
  position: relative;
  z-index: 3;
  width: 100%;
}

.page-contatti .contact-hero-inner {
  max-width: 760px;
  transform: translateY(-32px);
}

.page-contatti .contact-hero h1 {
  max-width: 680px;
  margin: 0;
  color: #07152a;
  font-size: 58px;
  line-height: 1.04;
  letter-spacing: -0.055em;
}

.page-contatti .contact-hero h1::after {
  content: "";
  display: block;
  width: 56px;
  height: 3px;
  margin-top: 28px;
  background: #1FA0D0;
  border-radius: 999px;
}

.page-contatti .contact-hero p {
  max-width: 610px;
  margin: 28px 0 0;
  color: #40566A;
  font-size: 20px;
  line-height: 1.65;
}

/* ============================================================
   CONTATTI — elementi comuni
   ============================================================ */

.page-contatti .contact-section-head {
  max-width: 720px;
  margin-bottom: 40px;
}

.page-contatti .contact-section-head h2 {
  margin: 0;
  color: #07152a;
  font-size: 42px;
  line-height: 1.08;
  letter-spacing: -0.04em;
}

.page-contatti .contact-section-head p {
  margin: 14px 0 0;
  color: #5f6f82;
  font-size: 18px;
  line-height: 1.6;
}

.page-contatti a {
  text-decoration: none;
}


/* ============================================================
   CONTATTI — CANALI DIRETTI
   ============================================================ */

.contact-direct {
  padding: 48px 0 66px;
  background: #ffffff;
}

.contact-direct .contact-section-head {
  margin-bottom: 34px;
}

.contact-direct-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 0;
}

.contact-direct-item {
  display: grid;
  grid-template-columns: 58px minmax(0, 1fr);
  gap: 20px;
  align-items: center;
  min-height: 138px;
}

.contact-direct-item + .contact-direct-item {
  padding-left: 42px;
  border-left: 1px solid rgba(7, 21, 42, 0.12);
}

.contact-direct-icon {
  width: 54px;
  height: 54px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background:
    radial-gradient(circle at 34% 24%, #ffffff 0%, #eef7fb 52%, #dceef6 100%);
  box-shadow:
    0 18px 38px rgba(31, 160, 208, 0.14),
    inset 0 0 0 1px rgba(31, 160, 208, 0.12);
}

.contact-direct-icon::before {
  content: "";
  width: 24px;
  height: 24px;
  display: block;
  background: #1FA0D0;
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: contain;
}

.contact-icon-email::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M3 5h18v14H3V5Zm9 7.2L5.4 7v10h13.2V7L12 12.2Zm0-2.2L18.4 7H5.6L12 10Z'/%3E%3C/svg%3E");
}

.contact-icon-pec::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 4h16v16H4V4Zm2 3v1.2l6 3.8 6-3.8V7H6Zm0 3.5V18h12v-7.5l-6 3.8-6-3.8Z'/%3E%3C/svg%3E");
}

.contact-icon-phone::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.6 3.5 9.4 4c.6.1 1 .5 1.2 1.1l.8 2.7c.2.6 0 1.3-.5 1.7l-1.6 1.3c1 2 2.6 3.6 4.7 4.7l1.3-1.6c.4-.5 1.1-.7 1.7-.5l2.7.8c.6.2 1 .6 1.1 1.2l.5 2.8c.1.8-.4 1.5-1.2 1.7-1.2.2-2.4.2-3.8 0C9.5 19 5 14.5 4.1 7.7c-.2-1.3-.2-2.6 0-3.8.2-.8.9-1.3 1.7-1.2Z'/%3E%3C/svg%3E");
}

.contact-direct-label {
  margin: 0 0 7px;
  color: #167A99;
  font-size: 12px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

.contact-direct h3 {
  margin: 0;
  color: #07152a;
  font-size: 23px;
  line-height: 1.18;
  letter-spacing: -0.025em;
}

.contact-direct h3 a {
  color: inherit;
}

.contact-direct h3 a:hover {
  color: #167A99;
}

.contact-direct-item p:last-child {
  max-width: 310px;
  margin: 10px 0 0;
  color: #5f6f82;
  font-size: 15px;
  line-height: 1.5;
}


/* ============================================================
   CONTATTI — GESTIONE RICHIESTE
   ============================================================ */

.contact-requests {
  position: relative;
  padding: 54px 0 58px;
  background:
    radial-gradient(circle at 76% 28%, rgba(31, 160, 208, 0.08), transparent 30%),
    linear-gradient(180deg, #f4f8fb 0%, #f8fbfd 100%);
}

.contact-requests::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: min(1240px, calc(100% - 160px));
  height: 1px;
  transform: translateX(-50%);
  background: rgba(7, 21, 42, 0.08);
}

.contact-requests .contact-section-head {
  max-width: 760px;
  margin-bottom: 42px;
}

.contact-requests-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
  margin-top: 4px;
}

.contact-request-item {
  display: grid;
  grid-template-columns: 52px minmax(0, 1fr);
  gap: 22px;
  align-items: flex-start;
  min-height: 150px;
}

.contact-request-item + .contact-request-item {
  padding-left: 68px;
  border-left: 1px solid rgba(7, 21, 42, 0.12);
}

.contact-request-icon {
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background:
    radial-gradient(circle at 35% 22%, #ffffff, #eef8fc 58%, #dceef6 100%);
  box-shadow:
    0 16px 34px rgba(31, 160, 208, 0.12),
    inset 0 0 0 1px rgba(31, 160, 208, 0.12);
}

.contact-request-icon::before {
  content: "";
  width: 23px;
  height: 23px;
  display: block;
  background: #1FA0D0;
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: contain;
}

.contact-icon-client::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 12a4.5 4.5 0 1 0 0-9 4.5 4.5 0 0 0 0 9Zm0 2c-4.2 0-7.5 2.4-7.5 5.4V21h15v-1.6c0-3-3.3-5.4-7.5-5.4Z'/%3E%3C/svg%3E");
}

.contact-icon-project::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9 3h6l1.6 2H21v15H3V5h4.4L9 3Zm-4 7v8h14v-8H5Z'/%3E%3C/svg%3E");
}

.contact-request-item h3 {
  margin: 0 0 16px;
  color: #07152a;
  font-size: 21px;
  line-height: 1.25;
  letter-spacing: -0.02em;
}

.contact-request-item ul {
  display: grid;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.contact-request-item li {
  position: relative;
  padding-left: 22px;
  color: #44546a;
  font-size: 16px;
  line-height: 1.45;
}

.contact-request-item li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: #1FA0D0;
  box-shadow: 0 0 0 4px rgba(31, 160, 208, 0.10);
}


/* ============================================================
   CONTATTI — DUE SEDI
   ============================================================ */

.contact-locations {
  position: relative;
  padding: 64px 0 76px;
  background:
    radial-gradient(circle at 16% 18%, rgba(31, 160, 208, 0.10), transparent 30%),
    linear-gradient(180deg, #ffffff 0%, #f8fbfd 100%);
}

.contact-locations::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 0;
  width: min(1240px, calc(100% - 160px));
  height: 1px;
  transform: translateX(-50%);
  background: rgba(7, 21, 42, 0.08);
}

.contact-locations .container {
  display: grid;
  grid-template-columns: 0.82fr 1fr 1fr;
  gap: 58px;
  align-items: start;
}

.contact-locations .contact-section-head {
  max-width: 380px;
  margin: 0;
}

.contact-locations .contact-section-head h2 {
  margin: 0;
  color: #07152a;
  font-size: 36px;
  line-height: 1.08;
  letter-spacing: -0.04em;
}

.contact-locations .contact-section-head p {
  margin: 20px 0 0;
  color: #5f6f82;
  font-size: 18px;
  line-height: 1.65;
}

.contact-locations-grid {
  display: contents;
}

.contact-location {
  position: relative;
  min-height: 300px;
}

.contact-location + .contact-location {
  padding-left: 44px;
  border-left: 1px solid rgba(7, 21, 42, 0.10);
}

.contact-location-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 22px;
  margin-bottom: 28px;
}

.contact-location-head > div {
  display: flex;
  align-items: center;
  gap: 18px;
}

.contact-location h3 {
  margin: 0;
  color: #07152a;
  font-size: 24px;
  line-height: 1.2;
  letter-spacing: -0.025em;
}

.contact-location p {
  margin: 0;
  color: #415166;
  font-size: 17px;
  line-height: 1.55;
}

.contact-location-icon {
  width: 54px;
  height: 54px;
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background:
    radial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.95), rgba(226, 241, 248, 0.95));
  box-shadow:
    0 18px 40px rgba(22, 122, 153, 0.14),
    inset 0 0 0 1px rgba(31, 160, 208, 0.12);
}

.contact-location-icon::before {
  content: "";
  width: 24px;
  height: 24px;
  display: block;
  background: #1FA0D0;
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: contain;
}

.contact-icon-pin::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 22s7-6.1 7-13a7 7 0 1 0-14 0c0 6.9 7 13 7 13Zm0-9.5A3.5 3.5 0 1 0 12 5a3.5 3.5 0 0 0 0 7.5Z'/%3E%3C/svg%3E");
}

.contact-icon-building::before {
  mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 21V4.8C4 3.8 4.8 3 5.8 3h8.4c1 0 1.8.8 1.8 1.8V9h2.2c1 0 1.8.8 1.8 1.8V21h-6v-4h-4v4H4Zm3-13h2V6H7v2Zm4 0h2V6h-2v2Zm-4 4h2v-2H7v2Zm4 0h2v-2h-2v2Zm5 4h2v-2h-2v2Z'/%3E%3C/svg%3E");
}

.contact-location-label {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 28px;
  padding: 0 14px;
  border-radius: 999px;
  background: rgba(31, 160, 208, 0.12);
  color: #167A99;
  font-size: 12px;
  font-weight: 800;
}

.contact-location-legal .contact-location-label {
  background: rgba(7, 21, 42, 0.08);
  color: #667386;
}

.contact-map-preview {
  width: 100%;
  height: 210px;
  margin-top: 28px;
  overflow: hidden;
  border-radius: 16px;
  background: #eaf2f7;
  box-shadow:
    0 18px 44px rgba(7, 21, 42, 0.10),
    inset 0 0 0 1px rgba(7, 21, 42, 0.08);
}

.contact-map-preview iframe {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
}

.contact-location-note {
  width: 100%;
  min-height: 150px;
  margin-top: 28px;
  padding: 28px 0 0;
  border-top: 1px solid rgba(7, 21, 42, 0.10);
  background: transparent;
  box-shadow: none;
}

.contact-location-note strong {
  display: block;
  margin-bottom: 14px;
  color: #07152a;
  font-size: 15px;
  font-weight: 800;
}

.contact-location-note ul {
  display: grid;
  gap: 9px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.contact-location-note li {
  position: relative;
  padding-left: 20px;
  color: #506176;
  font-size: 16px;
  line-height: 1.42;
}

.contact-location-note li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 6px;
  height: 6px;
  border-radius: 999px;
  background: #1FA0D0;
  box-shadow: 0 0 0 4px rgba(31, 160, 208, 0.10);
}


/* ============================================================
   CONTATTI — CTA FINALE
   Usa il componente CTA standard, con solo testo più compatto
   ============================================================ */

.page-contatti .cta-inner p {
  max-width: 500px;
  font-size: 17px;
  line-height: 1.45;
}

/* ============================================================
   ANALIZZIAMO IL TUO CASO — pagina interna
   Pagina CTA guidata con form di contatto
   ============================================================ */


/* ============================================================
   ANALIZZIAMO — HERO
   ============================================================ */

.hero-analizziamo {
  position: relative;
  min-height: 560px;
  display: flex;
  align-items: flex-start;
  overflow: hidden;
  background: #f8fbfd;
}

.hero-analizziamo .hero-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}

.hero-analizziamo .hero-bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 88% center;
}

.hero-analizziamo::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: linear-gradient(
    to right,
    rgba(248, 251, 253, 1.00) 0%,
    rgba(248, 251, 253, 1.00) 34%,
    rgba(248, 251, 253, 0.94) 47%,
    rgba(248, 251, 253, 0.62) 61%,
    rgba(248, 251, 253, 0.18) 78%,
    rgba(248, 251, 253, 0.02) 100%
  );
}

.hero-analizziamo .container {
  position: relative;
  z-index: 2;
}

.hero-analizziamo .hero-inner {
  display: grid;
  grid-template-columns: minmax(0, 500px) 1fr;
  align-items: start;
  gap: 90px;
  padding-top: 98px;
  transform: translateX(-220px);
}

.hero-analizziamo h1 {
  max-width: 500px;
  margin: 0;
  color: #071827;
  font-size: 64px;
  line-height: 1.04;
  letter-spacing: -0.055em;
}

.hero-analizziamo .hero-sub {
  max-width: 480px;
  margin-top: 34px;
  color: #304556;
  font-size: 22px;
  line-height: 1.5;
}


/* ============================================================
   ANALIZZIAMO — ELEMENTI CONDIVISI
   ============================================================ */

.page-analizziamo .analisi-kicker {
  margin: 0 0 14px;
  font-size: 15px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #1FA0D0;
}

.page-analizziamo h2,
.page-analizziamo h3 {
  color: #071827;
}

.page-analizziamo p {
  color: #405466;
}

.page-analizziamo .btn-primary {
  border: 0;
  cursor: pointer;
}


/* ============================================================
   ANALIZZIAMO — INTRO / POSIZIONAMENTO
   ============================================================ */

.analisi-intro {
  padding: 54px 0 68px;
  background: #ffffff;
}

.analisi-intro-inner {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 420px;
  gap: 82px;
  align-items: center;
}

.analisi-intro-content {
  max-width: 760px;
}

.analisi-intro-content h2 {
  max-width: 760px;
  margin: 0 0 28px;
  font-size: 44px;
  line-height: 1.08;
  letter-spacing: -0.04em;
}

.analisi-intro-content p {
  max-width: 680px;
  margin: 0 0 18px;
  font-size: 20px;
  line-height: 1.65;
}

.analisi-intro-content p:last-child {
  margin-bottom: 0;
}

.analisi-intro-card {
  position: relative;
  padding: 36px 40px 38px;
  border-radius: 30px;
  background: linear-gradient(180deg, #ffffff 0%, #f4fbfe 100%);
  border: 1px solid rgba(31, 160, 208, 0.16);
  box-shadow: 0 28px 70px rgba(7, 24, 39, 0.09);
}

.analisi-intro-card::before {
  content: "";
  position: absolute;
  top: -28px;
  right: -28px;
  width: 110px;
  height: 110px;
  border-radius: 999px;
  background: rgba(31, 160, 208, 0.11);
  pointer-events: none;
}

.analisi-intro-card-icon {
  width: 60px;
  height: 60px;
  margin-bottom: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 22px;
  color: #167A99;
  background: #E6F4FA;
}

.analisi-intro-card-icon svg {
  width: 32px;
  height: 32px;
}

.analisi-intro-card h3 {
  margin: 0 0 18px;
  font-size: 27px;
  line-height: 1.18;
  letter-spacing: -0.03em;
}

.analisi-intro-card ul {
  margin: 0;
  padding: 0;
  list-style: none;
}

.analisi-intro-card li {
  position: relative;
  margin-bottom: 14px;
  padding-left: 28px;
  font-size: 18px;
  line-height: 1.45;
  color: #405466;
}

.analisi-intro-card li:last-child {
  margin-bottom: 0;
}

.analisi-intro-card li::before {
  content: "";
  position: absolute;
  top: 0.78em;
  left: 0;
  width: 12px;
  height: 2px;
  border-radius: 999px;
  background: #1FA0D0;
}


/* ============================================================
   ANALIZZIAMO — FORM
   ============================================================ */

.analisi-form-section {
  padding: 64px 0 76px;
  background: linear-gradient(180deg, #eef7fb 0%, #f8fbfd 100%);
}

.analisi-form-layout {
  display: grid;
  grid-template-columns: minmax(0, 430px) 1fr;
  gap: 72px;
  align-items: start;
}

.analisi-form-intro {
  padding-top: 6px;
}

.analisi-form-intro h2 {
  margin: 0 0 24px;
  font-size: 50px;
  line-height: 1.05;
  letter-spacing: -0.045em;
}

.analisi-form-intro > p {
  margin: 0 0 18px;
  font-size: 20px;
  line-height: 1.62;
}

.analisi-form-note {
  margin-top: 34px;
  padding: 0 0 0 22px;
  border-left: 4px solid #1FA0D0;
}

.analisi-form-note p {
  margin: 0;
  max-width: 390px;
  font-size: 17px;
  line-height: 1.6;
  color: #405466;
}

.analisi-form-points {
  margin: 28px 0 0;
  padding: 0;
  list-style: none;
}

.analisi-form-points li {
  position: relative;
  margin-bottom: 15px;
  padding-left: 28px;
  font-size: 18px;
  line-height: 1.5;
  font-weight: 650;
  color: #405466;
}

.analisi-form-points li:last-child {
  margin-bottom: 0;
}

.analisi-form-points li::before {
  content: "";
  position: absolute;
  top: 0.78em;
  left: 0;
  width: 12px;
  height: 2px;
  border-radius: 999px;
  background: #1FA0D0;
}

.analisi-form {
  padding: 46px;
  border-radius: 34px;
  background: #ffffff;
  border: 1px solid rgba(22, 122, 153, 0.13);
  box-shadow: 0 34px 90px rgba(7, 24, 39, 0.10);
}

.analisi-form .form-field {
  margin-bottom: 24px;
}

.analisi-form label,
.analisi-form legend {
  display: block;
  margin-bottom: 10px;
  font-size: 16px;
  font-weight: 800;
  color: #071827;
}

.analisi-form label span,
.analisi-form legend span {
  color: #1FA0D0;
}

.analisi-form label small {
  font-size: 14px;
  font-weight: 600;
  color: #70808d;
}

.analisi-form input,
.analisi-form select,
.analisi-form textarea {
  width: 100%;
  min-height: 58px;
  padding: 15px 17px;
  border-radius: 16px;
  border: 1px solid rgba(7, 24, 39, 0.14);
  background: #f8fbfd;
  color: #071827;
  font-family: inherit;
  font-size: 17px;
  line-height: 1.4;
  outline: none;
  transition:
    border-color 0.18s ease,
    background-color 0.18s ease,
    box-shadow 0.18s ease;
}

.analisi-form textarea {
  min-height: 160px;
  resize: vertical;
}

.analisi-form input:focus,
.analisi-form select:focus,
.analisi-form textarea:focus {
  border-color: #1FA0D0;
  background: #ffffff;
  box-shadow: 0 0 0 4px rgba(31, 160, 208, 0.12);
}

.analisi-form input::placeholder,
.analisi-form textarea::placeholder {
  color: #8495a3;
}

.analisi-form .form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 22px;
}

.analisi-form fieldset {
  margin: 0 0 30px;
  padding: 0;
  border: 0;
}

.analisi-form .form-contact-preference {
  display: flex;
  flex-wrap: wrap;
  gap: 14px 22px;
  align-items: center;
}

.analisi-form .form-contact-preference legend {
  width: 100%;
  margin-bottom: 2px;
}

.analisi-form .form-check {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  padding: 13px 18px;
  border-radius: 999px;
  border: 1px solid rgba(7, 24, 39, 0.12);
  background: #f8fbfd;
  font-size: 16px;
  font-weight: 700;
  color: #405466;
  cursor: pointer;
}

.analisi-form .form-check input {
  width: 18px;
  min-height: auto;
  height: 18px;
  padding: 0;
  border-radius: 4px;
  cursor: pointer;
}

.analisi-form .form-check span {
  color: #405466;
}

.analisi-form .form-privacy-check {
  display: grid;
  grid-template-columns: 18px 1fr;
  gap: 12px;
  align-items: start;
  margin: 4px 0 28px;
  padding: 18px;
  border-radius: 18px;
  background: #f8fbfd;
  border: 1px solid rgba(7, 24, 39, 0.10);
  cursor: pointer;
}

.analisi-form .form-privacy-check input {
  width: 18px;
  height: 18px;
  min-height: auto;
  padding: 0;
  margin-top: 2px;
  cursor: pointer;
}

.analisi-form .form-privacy-check span {
  font-size: 14px;
  font-weight: 600;
  line-height: 1.5;
  color: #405466;
}

.analisi-form button.btn-primary {
  margin-top: 8px;
  min-height: 60px;
  padding: 18px 30px;
  font-size: 17px;
}

.form-hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.analisi-form .form-alert,
.form-alert {
  margin-bottom: 24px;
  padding: 18px 20px;
  border-radius: 18px;
  font-size: 16px;
  font-weight: 700;
  line-height: 1.45;
}

.form-alert-success {
  color: #0b5f3c;
  background: #e9f8f0;
  border: 1px solid rgba(11, 95, 60, 0.18);
}

.form-alert-error {
  color: #8a1f1f;
  background: #fff0f0;
  border: 1px solid rgba(138, 31, 31, 0.18);
}

.form-turnstile {
  margin: 4px 0 22px;
}

.form-turnstile .cf-turnstile {
  min-height: 65px;
}


/* ============================================================
   ANALIZZIAMO — COSA SUCCEDE DOPO
   ============================================================ */

.analisi-steps {
  position: relative;
  padding: 88px 0 72px;
  background: linear-gradient(180deg, #eef7fb 0%, #f6fbfd 100%);
  border-top: 1px solid rgba(192, 221, 236, 0.55);
}

.analisi-section-head {
  max-width: 780px;
  margin-bottom: 42px;
}

.analisi-section-head h2 {
  margin: 0 0 22px;
  font-size: 48px;
  line-height: 1.08;
  letter-spacing: -0.04em;
}

.analisi-section-head p {
  max-width: 650px;
  margin: 0;
  font-size: 20px;
  line-height: 1.6;
}

.analisi-steps-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 28px;
}

.analisi-step-card {
  position: relative;
  min-height: 270px;
  padding: 34px 36px 34px;
  border-radius: 30px;
  background: #ffffff;
  border: 1px solid rgba(22, 122, 153, 0.11);
  box-shadow: 0 24px 58px rgba(7, 24, 39, 0.07);
}

.analisi-step-number {
  display: block;
  position: relative;
  margin-bottom: 36px;
  padding-bottom: 16px;
  font-size: 26px;
  line-height: 1;
  font-weight: 900;
  letter-spacing: 0.06em;
  color: #1FA0D0;
}

.analisi-step-number::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: 0;
  width: 86px;
  height: 4px;
  border-radius: 999px;
  background: #1FA0D0;
}

.analisi-step-card h3 {
  margin: 0 0 16px;
  font-size: 27px;
  line-height: 1.22;
  letter-spacing: -0.035em;
}

.analisi-step-card p {
  margin: 0;
  font-size: 18px;
  line-height: 1.6;
}


/* ============================================================
   ANALIZZIAMO — A CHI È RIVOLTO
   ============================================================ */

.analisi-target {
  padding: 70px 0 76px;
  background: #ffffff;
  border-top: 1px solid rgba(192, 221, 236, 0.32);
}

.analisi-target-inner {
  display: grid;
  grid-template-columns: minmax(0, 480px) 1fr;
  gap: 78px;
  align-items: start;
}

.analisi-target-content {
  position: sticky;
  top: 120px;
}

.analisi-target-content h2 {
  margin: 0 0 26px;
  font-size: 48px;
  line-height: 1.08;
  letter-spacing: -0.04em;
}

.analisi-target-content p {
  margin: 0;
  font-size: 20px;
  line-height: 1.65;
}

.analisi-target-list {
  display: grid;
  gap: 24px;
}

.analisi-target-item {
  display: grid;
  grid-template-columns: 72px 1fr;
  gap: 26px;
  padding: 34px 36px;
  border-radius: 28px;
  background: #f8fbfd;
  border: 1px solid rgba(31, 160, 208, 0.13);
}

.analisi-target-icon {
  width: 72px;
  height: 72px;
  border-radius: 24px;
  background: linear-gradient(135deg, #E6F4FA 0%, #CFEAF5 100%);
  position: relative;
}

.analisi-target-icon::before,
.analisi-target-icon::after {
  content: "";
  position: absolute;
  border-radius: 999px;
  background: #167A99;
}

.analisi-target-icon.agency::before {
  width: 30px;
  height: 22px;
  top: 23px;
  left: 21px;
  border-radius: 8px;
  background: transparent;
  border: 2px solid #167A99;
}

.analisi-target-icon.agency::after {
  width: 26px;
  height: 2px;
  top: 48px;
  left: 23px;
}

.analisi-target-icon.systems::before {
  width: 34px;
  height: 26px;
  top: 18px;
  left: 19px;
  border-radius: 8px;
  background: transparent;
  border: 2px solid #167A99;
}

.analisi-target-icon.systems::after {
  width: 32px;
  height: 8px;
  top: 48px;
  left: 20px;
  border-radius: 4px;
}

.analisi-target-icon.continuity::before {
  width: 34px;
  height: 34px;
  top: 19px;
  left: 19px;
  background: transparent;
  border: 2px solid #167A99;
}

.analisi-target-icon.continuity::after {
  width: 16px;
  height: 16px;
  top: 28px;
  left: 28px;
  background: #1FA0D0;
}

.analisi-target-item h3 {
  margin: 0 0 10px;
  font-size: 26px;
  line-height: 1.22;
  letter-spacing: -0.03em;
}

.analisi-target-item p {
  margin: 0;
  font-size: 18px;
  line-height: 1.58;
}

/* ============================================================
   PRIVACY POLICY — pagina di servizio
   Hero neutro · corpo leggibile · nessuna CTA
   ============================================================ */

/* ============================================================
   PRIVACY POLICY — HERO
   Pagina di servizio · blu/nero tecnico · profondità controllata
   ============================================================ */

.page-privacy .legal-hero {
  position: relative;
  padding: 58px 0 78px;
  background:
    radial-gradient(
      circle at 12% 18%,
      rgba(31, 160, 208, 0.18) 0%,
      rgba(14, 53, 86, 0.16) 24%,
      rgba(6, 20, 37, 0.00) 50%
    ),
    linear-gradient(
      115deg,
      #061425 0%,
      #071a2f 30%,
      #0a2540 56%,
      #cfdbe2 100%
    );
  border-bottom: 1px solid rgba(6, 20, 37, 0.30);
  overflow: hidden;
}

.page-privacy .legal-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    linear-gradient(
      90deg,
      rgba(0, 0, 0, 0.14) 0%,
      rgba(6, 20, 37, 0.08) 36%,
      rgba(255, 255, 255, 0.08) 72%,
      rgba(255, 255, 255, 0.30) 100%
    );
  pointer-events: none;
}

.page-privacy .legal-hero::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 24px;
  background:
    linear-gradient(
      180deg,
      rgba(6, 20, 37, 0.00) 0%,
      rgba(6, 20, 37, 0.10) 100%
    );
  pointer-events: none;
}

.page-privacy .legal-hero .container {
  position: relative;
  z-index: 2;
}

.page-privacy .legal-hero-inner {
  max-width: 820px;
}

.page-privacy .legal-hero .eyebrow {
  display: none;
  align-items: center;
  margin-bottom: 18px;
  padding: 8px 14px;
  border-radius: 999px;
  background: rgba(31, 160, 208, 0.18);
  color: #d9f4ff;
  font-size: 13px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.16);
}

.page-privacy .legal-hero h1 {
  max-width: 760px;
  margin: 0;
  color: #ffffff;
  font-family: "Plus Jakarta Sans", sans-serif;
  font-size: 58px;
  line-height: 1.04;
  font-weight: 800;
  letter-spacing: -0.055em;
  text-shadow: 0 16px 32px rgba(0, 0, 0, 0.22);
}
.page-privacy .legal-hero-sub {
  max-width: 690px;
  margin: 24px 0 0;
  color: rgba(235, 247, 252, 0.88);
  font-size: 21px;
  line-height: 1.62;
  font-weight: 500;
}
/* ============================================================
   PRIVACY POLICY — CONTENUTO
   ============================================================ */

.page-privacy .legal-page-content {
  padding: 72px 0 104px;
  background: #ffffff;
}

.page-privacy .legal-container {
  max-width: 920px;
}

.page-privacy .legal-content {
  position: relative;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}

.page-privacy .legal-content::before {
  display: none;
}

.page-privacy .legal-intro {
  margin: 0 0 42px;
  padding: 0 0 34px;
  color: #334757;
  font-size: 20px;
  line-height: 1.72;
  font-weight: 500;
  border-bottom: 1px solid rgba(12, 31, 48, 0.08);
}

.page-privacy .legal-section {
  margin-top: 42px;
}

.page-privacy .legal-section:first-of-type {
  margin-top: 0;
}

.page-privacy .legal-section h2 {
  margin: 0 0 18px;
  color: #061425;
  font-family: "Plus Jakarta Sans", sans-serif;
  font-size: 28px;
  line-height: 1.22;
  font-weight: 800;
  letter-spacing: -0.025em;
}

.page-privacy .legal-section p {
  margin: 0 0 18px;
  color: #425565;
  font-size: 18px;
  line-height: 1.74;
  font-weight: 400;
}

.page-privacy .legal-section p:last-child {
  margin-bottom: 0;
}

.page-privacy .legal-section strong {
  color: #122536;
  font-weight: 800;
}

.page-privacy .legal-section a {
  color: #167a99;
  font-weight: 700;
  text-decoration: none;
  text-underline-offset: 4px;
  transition:
    color 0.18s ease,
    text-decoration-color 0.18s ease;
}

.page-privacy .legal-section a:hover {
  color: #1fa0d0;
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
}

.page-privacy .legal-section ul {
  margin: 14px 0 22px;
  padding: 0;
  list-style: none;
}

.page-privacy .legal-section ul:last-child {
  margin-bottom: 0;
}

.page-privacy .legal-section li {
  position: relative;
  margin: 0 0 13px;
  padding-left: 28px;
  color: #425565;
  font-size: 18px;
  line-height: 1.68;
}

.page-privacy .legal-section li:last-child {
  margin-bottom: 0;
}

.page-privacy .legal-section li::before {
  content: "";
  position: absolute;
  top: 0.72em;
  left: 2px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #1fa0d0;
  box-shadow: 0 0 0 5px rgba(31, 160, 208, 0.12);
}

.page-privacy .legal-section li strong {
  color: #122536;
}

/* ============================================================
   PRIVACY POLICY — MICRO-SEPARAZIONE TRA SEZIONI LUNGHE
   ============================================================ */

.page-privacy .legal-section + .legal-section {
  padding-top: 6px;
}

.page-privacy .legal-section:nth-of-type(4),
.page-privacy .legal-section:nth-of-type(7),
.page-privacy .legal-section:nth-of-type(10) {
  margin-top: 50px;
  padding-top: 42px;
  border-top: 1px solid rgba(12, 31, 48, 0.08);
}



/* ============================================================
   SEZIONE RESPONSIVE — ELEMENTI COMUNI
   ============================================================ */

@media (max-width: 1180px) {
  :root { --pad-x: 48px; }

  .nav-links { gap: 20px; }

  .hero {
    height: auto;
    min-height: 620px;
  }

  .hero-inner { grid-template-columns: 1fr; }

  .svc-cisco { grid-template-columns: 1fr; gap: 40px; }
  .svc-left { padding-right: 0; }
  .svc-right { border-left: none; padding-left: 0; }

  .how-grid { grid-template-columns: 1fr; }
  .how-photo-overlay { display: none; }
}

@media (max-width: 820px) {
  :root { --pad-x: 28px; }

  .hero {
    height: auto;
    min-height: 560px;
  }

  h1 { font-size: 46px; }
  h2, .sec-h2, .cta-inner h2 { font-size: 38px; }

  .nav-inner {
    height: auto;
    min-height: 90px;
    align-items: flex-start;
    padding: 18px 0;
  }

  .nav-links {
    flex-wrap: wrap;
    justify-content: flex-end;
    gap: 14px 18px;
  }

  .svc-right { grid-template-columns: 1fr; }
  .svc-item { padding-right: 0; }
  .svc-item:nth-child(2) {
    padding-left: 0;
    border-left: none;
    border-top: 1px solid var(--border);
    padding-top: 36px;
    margin-top: 36px;
  }

  .target-grid { grid-template-columns: 1fr; gap: 36px; }
  .target-item,
  .target-item:nth-child(2),
  .target-item:last-child {
    padding: 0;
    border-right: none;
  }

  .footer-grid { grid-template-columns: 1fr; }
}


/* ============================================================
   SEZIONE RESPONSIVE — SINGOLE PAGINE
   ============================================================ */

@media (max-width: 1180px) {
  .about-main-grid,
  .about-system-grid {
    grid-template-columns: 1fr;
  }

  .about-system-visual,
  .about-system-copy {
    padding: 72px var(--pad-x);
  }
}

@media (max-width: 820px) {
  .about-main,
  .about-fit {
    padding: 72px 0;
  }

  .about-main-grid {
    gap: 48px;
  }

  .about-copy h2,
  .about-system-copy h2,
  .about-fit h2 {
    font-size: 38px;
  }

  .about-copy .about-lead {
    font-size: 20px;
  }

  .layer-two,
  .layer-three {
    margin-left: 0;
  }
}

@media (max-width: 1180px) {
  .infra-split-grid,
  .infra-offer-grid {
    grid-template-columns: 1fr 1fr;
  }

  .infra-split-grid::before {
    display: none;
  }

  .infra-problem,
  .infra-approach {
    padding: 0;
  }
}

@media (max-width: 820px) {
  .infra-position-inner {
    grid-template-columns: 1fr;
  }

  .infra-position h2,
  .infra-problem h2,
  .infra-approach h2,
  .infra-offer h2,
  .infra-offer-head h2 {
    font-size: 32px;
  }

  .infra-position p {
    font-size: 22px;
  }

  .infra-split-grid,
  .infra-offer-grid {
    grid-template-columns: 1fr;
  }

  .infra-split,
  .infra-offer {
    padding: 64px 0;
  }
}

@media (max-width: 1180px) {

  .hosting-boxes-grid {
    grid-template-columns: 1fr;
  }

  .hosting-box-growth {
    border-right: none;
    border-bottom: 1px solid var(--border);
    padding: 42px 40px;
    background:
      linear-gradient(
        90deg,
        rgba(248, 250, 252, 1) 0%,
        rgba(248, 250, 252, 0.96) 36%,
        rgba(248, 250, 252, 0.70) 58%,
        rgba(248, 250, 252, 0.22) 82%,
        rgba(248, 250, 252, 0) 100%
      ),
      url("/img/sections/grafico.webp");
    background-repeat: no-repeat;
    background-size: 46% auto;
    background-position: right 40px center;
  }

  .hosting-box-includes {
    padding: 42px 40px;
  }

  .hosting-box-growth-text,
  .hosting-box-growth h2,
  .hosting-box-growth p {
    max-width: 460px;
  }

  .hosting-box-services {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 24px;
  }

}

@media (max-width: 820px) {

  .hosting-box {
    min-height: auto;
  }

  .hosting-box-growth,
  .hosting-box-includes {
    padding: 38px 24px;
  }
.hosting-box-growth {
  border-right: 1px solid var(--border);
  padding: 42px 56px 40px;
  background:
    linear-gradient(
      90deg,
      rgba(248, 250, 252, 1) 0%,
      rgba(248, 250, 252, 0.98) 28%,
      rgba(248, 250, 252, 0.82) 42%,
      rgba(248, 250, 252, 0.34) 62%,
      rgba(248, 250, 252, 0) 100%
    ),
    url("/img/sections/grafico.webp");
  background-repeat: no-repeat;
  background-size: 66% auto;
  background-position: right 18px center;
}
  .hosting-box h2 {
    font-size: 25px;
  }

  .hosting-box-growth-text,
  .hosting-box-growth h2,
  .hosting-box-growth p,
  .hosting-box-includes h2 {
    max-width: none;
  }

  .hosting-box-services {
    grid-template-columns: 1fr;
    gap: 18px;
  }

}

@media (max-width: 1180px) {

  .hosting-position-inner {
    max-width: 860px;
  }

  .hosting-position-points {
    max-width: 760px;
    grid-template-columns: 1fr;
    gap: 24px;
  }

  .hosting-position-point {
    padding: 0;
  }

  .hosting-position-point:first-child,
  .hosting-position-point:last-child {
    padding-left: 0;
    padding-right: 0;
  }

  .hosting-position-point:not(:last-child)::after {
    display: none;
  }

  .hosting-real-grid {
    grid-template-columns: 1fr;
  }

  .hosting-real-media {
    min-height: 420px;
  }

  .hosting-real-media img {
    min-height: 420px;
  }

  .hosting-real-content {
    padding: 60px 40px;
  }

  .hosting-managed-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .hosting-managed-evolution {
    grid-column: 1 / -1;
  }

  .hosting-include-list {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 0;
  }

  .hosting-include-item {
    padding: 26px 18px;
    border-right: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
  }

  .hosting-include-item:nth-child(3n) {
    border-right: none;
  }

  .hosting-include-item:nth-last-child(-n + 3) {
    border-bottom: none;
  }

}

@media (max-width: 820px) {

  .page-hosting .hero-hosting::after,
  .page-hosting .hero::after {
    background: linear-gradient(
      to bottom,
      rgba(248, 250, 252, 0.96) 0%,
      rgba(248, 250, 252, 0.9) 48%,
      rgba(248, 250, 252, 0.72) 100%
    );
  }

  .hosting-position {
    padding: 48px 0 50px;
  }

  .hosting-managed,
  .hosting-offer {
    padding: 56px 0;
  }

  .hosting-position-inner,
  .hosting-managed-head {
    max-width: 100%;
  }

  .hosting-position-text {
    margin-bottom: 34px;
  }

  .hosting-position-text h2,
  .hosting-real-content h2,
  .hosting-managed-head h2,
  .hosting-offer h2 {
    font-size: 32px;
  }

  .hosting-position-text p,
  .hosting-real-intro,
  .hosting-managed-head p {
    font-size: 17px;
  }

  .hosting-position-points {
    gap: 22px;
  }

  .hosting-position-point {
    grid-template-columns: 42px 1fr;
    gap: 14px;
  }

  .hosting-position-point-icon {
    width: 36px;
    min-width: 36px;
    height: 36px;
  }

  .hosting-position-point-icon::before {
    font-size: 30px;
  }

  .hosting-real-media {
    min-height: 320px;
  }

  .hosting-real-media img {
    min-height: 320px;
  }

  .hosting-real-content {
    padding: 48px 24px;
  }

  .hosting-managed-grid {
    grid-template-columns: 1fr;
  }

  .hosting-managed-card {
    min-height: auto;
    padding: 28px 24px;
  }

  .hosting-managed-evolution {
    display: block;
  }

  .hosting-include-list {
    grid-template-columns: 1fr;
  }

  .hosting-include-item {
    padding: 24px 12px;
    border-right: none;
    border-bottom: 1px solid var(--border);
  }

  .hosting-include-item:nth-child(3n) {
    border-right: none;
  }

  .hosting-include-item:nth-last-child(-n + 3) {
    border-bottom: 1px solid var(--border);
  }

  .hosting-include-item:last-child {
    border-bottom: none;
  }

}

@media (max-width: 520px) {

  .hosting-position-inner,
  .hosting-managed-head {
    text-align: left;
  }

  .hosting-position-icon {
    margin-left: 0;
    margin-right: 0;
  }

  .hosting-position-text h2,
  .hosting-real-content h2,
  .hosting-managed-head h2,
  .hosting-offer h2 {
    font-size: 29px;
  }

  .hosting-managed-card h3 {
    font-size: 20px;
  }

}


/* ============================================================================
   VINCASOFT — INTEGRAZIONE CSS MOBILE
   ----------------------------------------------------------------------------
   Generato il 04/09/2026 da rilevamento automatico su demo.vincasoft.it
   misurando il rendering reale a 375 px di viewport.

   BREAKPOINT USATI (coerenti con quelli già presenti nel blocco più recente):
       1180 px  →  tablet orizzontale / laptop piccoli
        820 px  →  tablet verticale  ← qui avviene la maggior parte dei collassi
        520 px  →  telefono

   COME USARLO
   Da appendere in fondo a style.css, oppure — preferibile nel lungo periodo —
   spostando ogni blocco accanto al componente corrispondente. Ogni sezione è
   autonoma: si può tagliare e incollare dove serve senza rompere le altre.

   NON tocca nessuna regola desktop esistente: sono tutte dentro media query.

   ----------------------------------------------------------------------------
   SITUAZIONE DI PARTENZA — overflow orizzontale misurato a 375 px
   ----------------------------------------------------------------------------
       /contatti.php                 529 px oltre     ← peggiore
       /applicativi.php              379 px oltre
       /analizziamo-il-tuo-caso.php  343 px oltre
       /infrastruttura-cloud.php     279 px oltre
       /filemaker.php                267 px oltre
       /hosting.php                   47 px oltre
       /index.php                     42 px oltre
       /chi-siamo.php                 34 px oltre

   I 34 px presenti su TUTTE le pagine sono il menu di navigazione (sezione 1).

   ----------------------------------------------------------------------------
   INDICE
   ----------------------------------------------------------------------------
       0.  Sicurezze globali
       1.  Header e navigazione mobile          ← richiede markup, vedi nota
       2.  Home
       3.  Chi siamo
       4.  Infrastruttura cloud
       5.  Hosting
       6.  Applicativi
       7.  FileMaker
       8.  Contatti
       9.  Analizziamo il tuo caso
      10.  Form
      11.  CTA finale (immagine di sfondo)
      12.  Note e punti da decidere
   ============================================================================ */


/* ============================================================================
   0. SICUREZZE GLOBALI
   ----------------------------------------------------------------------------
   Rete di protezione contro gli sforamenti più banali. Vale a ogni larghezza,
   non solo su mobile, quindi sta fuori dalle media query.

   NOTA: volutamente NON è stato messo `overflow-x: hidden` sul body. È il
   cerotto che si usa per nascondere gli sforamenti invece di risolverli: la
   barra sparisce ma il contenuto resta tagliato e non te ne accorgi più.
   Se dopo aver applicato tutto restasse ancora overflow, va trovato l'elemento
   colpevole, non nascosta la barra.
   ============================================================================ */

img,
video,
svg,
iframe {
  max-width: 100%;
  height: auto;
}

/* Contenuti che non si possono spezzare devono scorrere dentro sé stessi,
   non allargare la pagina */
pre,
table {
  max-width: 100%;
  overflow-x: auto;
}

/* Parole lunghe (URL, indirizzi email) che sfondano il contenitore */
p,
li,
h1, h2, h3, h4,
td, th {
  overflow-wrap: break-word;
}


/* ============================================================================
   1. HEADER E NAVIGAZIONE MOBILE
   ----------------------------------------------------------------------------
   PROBLEMA: `ul.nav-links` sfora di 34 px su ogni pagina del sito.
   Due cause sommate:
     a) le 7 voci di menu in fila non entrano in 375 px (larghezza reale 235 px
        + il bottone CTA da 204 px);
     b) la regola base ha `transform: translateX(62px)`, che sposta l'intero
        menu di 62 px verso destra — da annullare sotto gli 820 px.

   ATTENZIONE — QUESTA SEZIONE RICHIEDE UNA MODIFICA ALL'HTML.
   Sul sito pubblicato non esiste alcun pulsante hamburger: né markup, né CSS,
   né JavaScript. Se ne hai già uno in una versione locale, salta questa sezione
   e tieni il tuo.

   Il markup qui sotto usa un checkbox nascosto: nessun JavaScript, funziona
   ovunque. Il checkbox deve stare PRIMA di <nav>, perché il CSS lo aggancia
   con il selettore fratello `~`.

   ----------------------------------------------------------------------------
   <div class="nav-inner">
     <a href="index.php" class="logo" aria-label="Vincasoft — Home">
       <img src="img/logo/logo_transparent_dark.png" alt="Vincasoft">
     </a>

     <input type="checkbox" id="nav-toggle" class="nav-toggle">
     <label for="nav-toggle" class="nav-burger" aria-label="Apri il menu">
       <span></span><span></span><span></span>
     </label>

     <nav aria-label="Navigazione principale">
       <ul class="nav-links"> ... invariata ... </ul>
     </nav>
   </div>
   ----------------------------------------------------------------------------
   ============================================================================ */

/* Il checkbox è solo un interruttore: mai visibile, ma NON con display:none
   (lo renderebbe irraggiungibile da tastiera) */
.nav-toggle {
  position: absolute;
  opacity: 0;
  width: 1px;
  height: 1px;
  pointer-events: none;
}

/* Il pulsante non esiste sopra gli 820 px */
.nav-burger {
  display: none;
}

@media (max-width: 820px) {

  .nav-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px;
  }

  /* --- il pulsante hamburger --- */
  .nav-burger {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 44px;                /* 44 px è la dimensione minima di un target
                                   toccabile: sotto si sbaglia il tocco */
    height: 44px;
    padding: 10px;
    cursor: pointer;
    border-radius: 8px;
    box-sizing: border-box;
  }

  .nav-burger span {
    display: block;
    height: 2px;
    width: 100%;
    background: var(--text, #111827);
    border-radius: 2px;
    transition: transform .25s ease, opacity .2s ease;
  }

  /* aperto: le tre barre diventano una X */
  .nav-toggle:checked ~ .nav-burger span:nth-child(1) {
    transform: translateY(7px) rotate(45deg);
  }
  .nav-toggle:checked ~ .nav-burger span:nth-child(2) {
    opacity: 0;
  }
  .nav-toggle:checked ~ .nav-burger span:nth-child(3) {
    transform: translateY(-7px) rotate(-45deg);
  }

  /* visibile quando si naviga da tastiera */
  .nav-toggle:focus-visible ~ .nav-burger {
    outline: 2px solid var(--vp, #1FA0D0);
    outline-offset: 2px;
  }

  /* --- il menu --- */
  .nav-inner nav {
    flex-basis: 100%;
    order: 3;
  }

  .nav-links {
    display: none;              /* chiuso di default */
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    margin-left: 0;
    padding: 8px 0 4px;
    transform: none;            /* ← annulla il translateX(62px) della regola
                                     base: è metà del problema dei 34 px */
  }

  .nav-toggle:checked ~ nav .nav-links {
    display: flex;
  }

  .nav-links li {
    width: 100%;
    border-top: 1px solid var(--border, #E5E7EB);
  }

  .nav-links a {
    display: block;
    padding: 14px 4px;          /* riga alta abbastanza da essere toccabile */
    font-size: 16px;
    white-space: normal;
  }

  /* il bottone CTA a piena larghezza, staccato dalle voci normali */
  .nav-links .nav-cta,
  .nav-links a.nav-cta {
    margin: 14px 0 4px;
    text-align: center;
    padding: 14px 18px;
  }

  .nav-links li:has(> .nav-cta) {
    border-top: 0;
  }
}


/* ============================================================================
   2. HOME
   ----------------------------------------------------------------------------
   Sforava di 42 px. Colpevoli:
     .home-services-grid   griglia a 4 colonne da 63 px — illeggibili
     .how-text             flex a 4 elementi senza wrap
     .steps                flex a 3 elementi senza wrap
   ============================================================================ */

@media (max-width: 1180px) {

  /* 4 → 2 colonne: su tablet le quattro aree restano confrontabili a coppie */
  .home-services-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 820px) {

  /* i tre step del processo si impilano */
  .steps,
  .how-text {
    flex-direction: column;
  }

  .steps {
    gap: 20px;
  }
}

@media (max-width: 520px) {

  /* 2 → 1 colonna: sotto i 520 px due colonne darebbero ~140 px l'una,
     troppo strette per icona + titolo + testo */
  .home-services-grid {
    grid-template-columns: 1fr;
  }
}


/* ============================================================================
   3. CHI SIAMO
   ----------------------------------------------------------------------------
   Sforava di 34 px, cioè solo per il menu (sezione 1). I due blocchi qui sotto
   non causavano overflow ma restavano affiancati e compressi: si impilano per
   leggibilità, non per necessità tecnica.
   ============================================================================ */

@media (max-width: 820px) {

  .about-continuity-map,
  .about-continuity-content {
    flex-direction: column;
    gap: 18px;
  }
}


/* ============================================================================
   4. INFRASTRUTTURA CLOUD
   ----------------------------------------------------------------------------
   Sforava di 279 px. Colpevoli:
     .infra-environments-list  griglia a 6 colonne (!) da 53 px
     .infra-sysadmin-grid      2 colonne, la seconda usciva di 173 px
     .infra-boundary-box       2 colonne
     .infra-case-layout        2 colonne, la seconda collassata a 0 px
                               (da cui gli elementi con width:0 fuori schermo)
   ============================================================================ */

@media (max-width: 1180px) {

  /* 6 → 3 colonne: gli ambienti restano scansionabili in griglia */
  .infra-environments-list {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (max-width: 820px) {

  .infra-environments-list {
    grid-template-columns: repeat(2, 1fr);
  }

  .infra-sysadmin-grid,
  .infra-boundary-box,
  .infra-case-layout {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  /* la colonna che usciva di 173 px */
  .infra-sysadmin-col {
    width: auto;
    max-width: 100%;
  }
}

@media (max-width: 520px) {

  .infra-environments-list {
    grid-template-columns: 1fr;
  }
}


/* ============================================================================
   5. HOSTING
   ----------------------------------------------------------------------------
   Sforava di soli 47 px: è la pagina interna messa meglio, perché ha già molte
   media query proprie a 1180 e 820. Qui si chiudono i casi rimasti scoperti.

     .hosting-included-grid   griglia a 5 colonne da 49 px
     .hosting-position-points 3 colonne
     .hosting-real-items      3 colonne ridotte a 11 px l'una (illeggibili)
     .hosting-real-grid       2 colonne ancora affiancate a 375 px
     .hosting-fit-grid        2 colonne
     .hosting-growth-inner    2 colonne, la prima collassata a 3 px
   ============================================================================ */

@media (max-width: 1180px) {

  .hosting-included-grid {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (max-width: 820px) {

  .hosting-included-grid,
  .hosting-fit-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .hosting-position-points,
  .hosting-real-grid,
  .hosting-real-items,
  .hosting-growth-inner {
    grid-template-columns: 1fr;
    gap: 20px;
  }
}

@media (max-width: 520px) {

  .hosting-included-grid,
  .hosting-fit-grid {
    grid-template-columns: 1fr;
  }
}


/* ============================================================================
   6. APPLICATIVI
   ----------------------------------------------------------------------------
   Sforava di 379 px. Nessuna media query esistente su questa pagina.

   Il colpevole principale è `.applicativi-choice-option`: una griglia a
   3 colonne (72 px + 190 px + 240 px = 502 px) dentro un contenitore da 375 px.
   Da sola valeva 379 px di sforamento.

     .applicativi-build-grid              3 colonne
     .applicativi-choice-inner            2 colonne
     .applicativi-choice-option           3 colonne  ← il colpevole
     .applicativi-web-system-inner        2 colonne
     .applicativi-technology-grid         2 colonne
     .applicativi-technology-filemaker    2 colonne, media da 250 px
   ============================================================================ */

@media (max-width: 1180px) {

  .applicativi-build-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 820px) {

  .applicativi-build-grid,
  .applicativi-choice-inner,
  .applicativi-web-system-inner,
  .applicativi-technology-grid,
  .applicativi-technology-item.applicativi-technology-filemaker {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  /* icona sopra, titolo e testo sotto: da 3 colonne a 1 */
  .applicativi-choice-option {
    grid-template-columns: 1fr;
    gap: 12px;
  }

  /* l'immagine affiancata al testo diventa a piena larghezza */
  .applicativi-technology-filemaker-media {
    width: 100%;
    max-width: 100%;
  }

  .applicativi-technology-filemaker-media img {
    width: 100%;
    height: auto;
  }
}


/* ============================================================================
   7. FILEMAKER
   ----------------------------------------------------------------------------
   Sforava di 267 px. Nessuna media query esistente su questa pagina.

     .hero-inner                 2 colonne (vale anche per altre pagine)
     .filemaker-system-grid      5 colonne da 150 px FISSI = 750 px
     .filemaker-partner-grid     2 colonne, la seconda a 0 px
     .filemaker-partner-cards    3 colonne tutte a 0 px
     .filemaker-problem-grid     2 colonne
     .filemaker-problem-points   3 colonne tutte a 0 px
     .filemaker-position-grid    3 colonne
     .filemaker-case-grid        2 colonne
     .filemaker-difference-mark  immagine a lastre da 340 px, usciva di 65 px

   Le colonne "a 0 px" sono il sintomo di una griglia a larghezza fissa più
   larga del contenitore: il browser azzera le colonne in eccesso e il
   contenuto esce comunque. Collassando la griglia il problema sparisce.
   ============================================================================ */

@media (max-width: 1180px) {

  .filemaker-system-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .filemaker-position-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 820px) {

  .filemaker-system-grid,
  .filemaker-partner-grid,
  .filemaker-partner-cards,
  .filemaker-problem-grid,
  .filemaker-problem-points,
  .filemaker-position-grid,
  .filemaker-case-grid {
    grid-template-columns: 1fr;
    gap: 20px;
  }

  /* le card avevano larghezza fissa: va tolta, non ridotta */
  .filemaker-system-item,
  .filemaker-partner-card {
    width: auto;
    max-width: 100%;
  }

  /* --- blocco di chiusura pagina (vedi §7 del documento go-live) ---
     A 3 colonne diventa una sola: titolo, testo e simbolo impilati.
     Il simbolo si rimpicciolisce e si centra invece di uscire di 65 px. */
  .filemaker-difference-grid {
    grid-template-columns: 1fr;
    gap: 24px;
    text-align: left;
  }

  .filemaker-difference-mark {
    width: 100%;
    max-width: 220px;
    margin: 0 auto;
  }

  .filemaker-difference-mark img {
    width: 100%;
    height: auto;
  }
}


/* ============================================================================
   8. CONTATTI  ← LA PAGINA MESSA PEGGIO
   ----------------------------------------------------------------------------
   Sforava di 529 px, quasi il doppio della larghezza dello schermo.
   Nessuna media query esistente su questa pagina.

   Il colpevole è il `.container` dentro la sezione .contact-locations, che è
   una griglia a 3 colonne di larghezza fissa (192 + 231 + 336 = 759 px).
   Da lì gli elementi delle sedi finivano interamente fuori schermo.

     .contact-locations .container  3 colonne fisse  ← il colpevole
     .contact-direct-grid           3 colonne
     .contact-direct-item           2 colonne, la seconda a 0 px
     .contact-requests-grid         2 colonne
     .contact-request-item          2 colonne
   ============================================================================ */

@media (max-width: 1180px) {

  .contact-direct-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 820px) {

  .contact-locations .container,
  .contact-locations-grid,
  .contact-direct-grid,
  .contact-requests-grid {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  /* icona sopra, contenuto sotto */
  .contact-direct-item,
  .contact-request-item {
    grid-template-columns: 1fr;
    gap: 10px;
  }

  /* le schede sede avevano larghezza fissa da 336 px */
  .contact-location,
  .contact-location-head,
  .contact-location-note {
    width: auto;
    max-width: 100%;
  }
}


/* ============================================================================
   9. ANALIZZIAMO IL TUO CASO
   ----------------------------------------------------------------------------
   Sforava di 343 px. Nessuna media query esistente.

   È la pagina più importante del sito: contiene l'unico form di conversione.
   Un form che sfora su mobile è un form che non viene compilato.

     .analisi-steps-grid    3 colonne  ← il colpevole (343 px)
     .analisi-intro-inner   2 colonne, la prima a 0 px
     .analisi-form-layout   2 colonne, la prima a 0 px
     .analisi-target-inner  2 colonne
     .analisi-intro-card    larghezza fissa 420 px
     .analisi-form-column   larghezza fissa 394 px
     .hero-inner            2 colonne
   ============================================================================ */

@media (max-width: 1180px) {

  .analisi-steps-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (max-width: 820px) {

  .analisi-steps-grid,
  .analisi-intro-inner,
  .analisi-form-layout,
  .analisi-target-inner {
    grid-template-columns: 1fr;
    gap: 24px;
  }

  .analisi-target-item {
    grid-template-columns: 1fr;
    gap: 10px;
  }

  /* larghezze fisse da rimuovere, non da ridurre */
  .analisi-intro-card,
  .analisi-form-column,
  .analisi-step-card {
    width: auto;
    max-width: 100%;
  }
}


/* ============================================================================
   10. FORM
   ----------------------------------------------------------------------------
   Vale per il form di "Analizziamo il tuo caso", l'unica conversione del sito.

   `.form-row` è una griglia a 2 colonne da 139 px: due campi affiancati su
   telefono sono inutilizzabili. Vanno impilati.

   Il font-size di 16 px sugli input NON è estetica: sotto i 16 px iOS Safari
   ingrandisce automaticamente la pagina al focus del campo, e l'utente si
   ritrova il layout zoomato senza capire perché. È il bug più segnalato dei
   form su iPhone.

   `.form-privacy-check` resta volutamente a 2 colonne: è checkbox + etichetta,
   e affiancati sono corretti.
   ============================================================================ */

@media (max-width: 820px) {

  .form-row {
    grid-template-columns: 1fr;
    gap: 0;
  }

  .form-field {
    width: 100%;
    max-width: 100%;
  }

  .analisi-form input,
  .analisi-form select,
  .analisi-form textarea {
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
    font-size: 16px;            /* ← vedi nota sopra: non ridurre sotto 16px */
  }

  .analisi-form button,
  .analisi-form [type="submit"] {
    width: 100%;
    padding: 15px 20px;
  }
}


/* ============================================================================
   11. CTA FINALE — RIMOZIONE IMMAGINE DI SFONDO SU MOBILE
   ----------------------------------------------------------------------------
   La CTA in fondo a ogni pagina ha un'immagine di sfondo applicata così:

       .cta-section::before {
         background: url("/img/sections/ai_test.webp") no-repeat right center;
         background-size: cover;
       }

   PROBLEMA
   `cover` + ancoraggio `right center` significa che su uno schermo stretto e
   alto il browser ingrandisce l'immagine finché non copre tutta l'altezza:
   quello che si vede è un frammento sproporzionato del lato destro, che non
   somiglia più all'immagine originale e passa dietro al testo rendendolo
   difficile da leggere.

   SOLUZIONE
   Su mobile resta il solo fondo pieno, senza immagine. Il colore c'è già:
   `.cta-section` ha `background: var(--vs)` (#E6F4FA), e il testo è #0F172A
   su titoli e #64748B sui paragrafi — quindi il contrasto regge senza
   toccare nulla dei colori.

   BONUS DI PERFORMANCE, NON SOLO ESTETICA
   `ai_test.png` pesa 1.730 KB. I browser NON scaricano l'immagine di sfondo
   di un elemento in `display: none`: questa singola regola risparmia
   1,7 MB di download su OGNI pagina in mobile, dato che la CTA è ovunque.
   È il guadagno più grosso di tutto questo file.

   Anche su desktop quell'immagine andrebbe convertita in WebP e ridotta
   (vedi §6 del documento go-live): 1,7 MB per un fondo decorativo sono molti.
   ============================================================================ */

@media (max-width: 820px) {

  /* via l'immagine: resta il fondo pieno di .cta-section */
  .cta-section::before {
    display: none;
  }

  .cta-section {
    min-height: 0;              /* i 360px fissi non servono più senza immagine */
    padding: 56px 0;            /* da 96px: su telefono erano troppi */
    overflow: visible;
  }

  /* il testo era limitato a max-width per stare a sinistra dell'immagine */
  .cta-inner p {
    max-width: 100%;
    margin-bottom: 32px;
    font-size: 18px;
  }

  /* stesse regole per le varianti per-pagina, che ridefiniscono max-width */
  .page-infrastruttura .cta-inner p,
  .page-applicativi .cta-inner p,
  .page-filemaker .cta-inner p,
  .page-contatti .cta-inner p {
    max-width: 100%;
    margin-bottom: 32px;
  }

  /* il bottone della CTA a piena larghezza: è l'azione principale della pagina */
  .cta-inner .btn-primary,
  .cta-inner a[class*="btn"] {
    display: block;
    width: 100%;
    text-align: center;
    box-sizing: border-box;
  }
}


/* ============================================================================
   12. NOTE E PUNTI DA DECIDERE
   ----------------------------------------------------------------------------

   SCELTE DI DESIGN, NON DI TECNICA
   Dove una griglia poteva collassare a 1 o a 2 colonne ho scelto il default
   che mi sembrava più leggibile. Sono decisioni tue, non c'è una risposta
   giusta — cambiare il numero è una riga:

     .home-services-grid       4 → 2 (a 1180) → 1 (a 520)
     .infra-environments-list  6 → 3 (a 1180) → 2 (a 820) → 1 (a 520)
     .hosting-included-grid    5 → 3 (a 1180) → 2 (a 820) → 1 (a 520)
     .filemaker-system-grid    5 → 2 (a 1180) → 1 (a 820)
     .analisi-steps-grid       3 → 2 (a 1180) → 1 (a 820)

   COSA NON È COPERTO QUI
   - Le dimensioni tipografiche: `h1` e `h2` sono già gestiti nel blocco 820
     esistente. Da verificare a occhio, non erano fra le cause di overflow.
   - Le spaziature verticali fra sezioni: non generano sforamenti, ma su
     telefono spesso restano troppo ampie. Da tarare guardando, non misurando.
   - Il peso delle immagini: è un problema diverso, trattato nel §6 del
     documento go-live, e impatta il mobile più di qualsiasi regola di questo
     file. Unica eccezione: la sezione 11 qui sopra, che togliendo il fondo
     della CTA evita da sola 1,7 MB di download per pagina.

   COME VERIFICARE DI AVER CHIUSO TUTTO
   In console del browser, su ogni pagina a 375 px di larghezza:

       document.documentElement.scrollWidth

   Deve restituire 375. Qualsiasi valore superiore significa che qualcosa
   sfora ancora. Per trovare cosa:

       [...document.querySelectorAll('*')]
         .filter(el => el.getBoundingClientRect().right > 375)
         .map(el => el.tagName + '.' + el.className)

   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 1 — correzioni al blocco mobile                                  #
   #                                                                          #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' QUESTA PATCH ESISTE
   ----------------------------------------------------------------------------
   Dopo il primo blocco mobile l'overflow era sceso quasi ovunque a zero, ma
   restavano quattro pagine:

       /analizziamo-il-tuo-caso.php   47 px
       /applicativi.php               44 px
       /filemaker.php                 22 px
       /infrastruttura-cloud.php      13 px

   Tre di queste avevano la stessa causa, ed e' un errore di impostazione del
   blocco precedente:

   `grid-template-columns: 1fr` NON basta a far restringere una colonna.
   `1fr` equivale a `minmax(auto, 1fr)`: quel minimo `auto` viene calcolato sul
   contenuto, quindi se dentro la colonna c'e' un elemento con una `width`
   fissa (360px, 397px, 394px nei nostri casi) la traccia non scende sotto
   quella misura, qualunque cosa dica la griglia.

   La forma corretta e' `minmax(0, 1fr)`: il minimo diventa 0 e la colonna
   puo' davvero restringersi. In piu' vanno azzerate le width fisse dei figli.

   La quarta pagina (applicativi) aveva una causa diversa, documentata sotto.

   Da tenere a mente per il futuro: dentro una griglia che deve collassare,
   `minmax(0, 1fr)` e' quasi sempre la scelta giusta al posto di `1fr`.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. GRIGLIE — da 1fr a minmax(0, 1fr)
     Sostituisce le dichiarazioni del blocco precedente. Vale per tutte le
     griglie collassate a una colonna, non solo per quelle che sforavano:
     le altre funzionavano per caso, perche' non avevano figli a larghezza
     fissa. Meglio metterle tutte al sicuro.
     -------------------------------------------------------------------------- */

  .infra-case-layout,
  .infra-sysadmin-grid,
  .infra-boundary-box,
  .filemaker-case-grid,
  .filemaker-partner-grid,
  .filemaker-partner-cards,
  .filemaker-problem-grid,
  .filemaker-problem-points,
  .filemaker-system-grid,
  .analisi-form-layout,
  .analisi-intro-inner,
  .analisi-target-inner,
  .applicativi-choice-inner,
  .applicativi-web-system-inner,
  .applicativi-technology-grid,
  .contact-locations .container,
  .contact-locations-grid,
  .contact-direct-grid,
  .contact-requests-grid,
  .hosting-real-grid,
  .hosting-growth-inner {
    grid-template-columns: minmax(0, 1fr);
  }


  /* --------------------------------------------------------------------------
     B. WIDTH FISSE SUI FIGLI
     Il collasso della griglia non tocca la `width` dichiarata sull'elemento
     interno: va annullata esplicitamente, altrimenti resta larga com'era.

       .infra-case-side        360 px
       .filemaker-case-media   397 px
       .analisi-form-column    394 px
     -------------------------------------------------------------------------- */

  .infra-case-side,
  .infra-case-visual,
  .infra-case-content,
  .filemaker-case-media,
  .filemaker-case-content,
  .analisi-form-intro,
  .analisi-form-note,
  .analisi-form-points,
  .analisi-form-column {
    width: auto;
    max-width: 100%;
  }


  /* --------------------------------------------------------------------------
     C. APPLICATIVI — annullamento del full-bleed
     `.applicativi-technology-filemaker` esce di proposito dal contenitore per
     occupare tutta la larghezza dello schermo:

         width: calc(100% + 144px);
         margin: 0 -72px;

     E' un effetto voluto sul desktop, ma su telefono i 72 px di margine
     negativo per lato mandano il blocco fuori schermo da entrambi i lati
     (partiva da x = -44). Su mobile torna dentro al suo contenitore.
     -------------------------------------------------------------------------- */

  .applicativi-technology-filemaker,
  .applicativi-technology-item.applicativi-technology-filemaker {
    width: 100%;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0;
  }

  .applicativi-technology-filemaker-content {
    padding-left: 24px;
    padding-right: 24px;
  }

  .applicativi-technology-filemaker p {
    max-width: 100%;
  }


  /* --------------------------------------------------------------------------
     D. PADDING PENSATI PER IL DESKTOP
     `.filemaker-case-content` ha 84 px di padding a sinistra e 74 a destra:
     su uno schermo da 375 px sono 158 px di vuoto, piu' del 40% della
     larghezza disponibile, e spingono il contenuto fuori.
     -------------------------------------------------------------------------- */

  .filemaker-case-content {
    padding-left: 24px;
    padding-right: 24px;
  }


  /* --------------------------------------------------------------------------
     E. IMMAGINI RIMASTE FUORI MISURA
     Casi singoli, non coperti dalla regola generale perche' hanno vincoli
     propri (min-height, object-fit, larghezza dichiarata).
     -------------------------------------------------------------------------- */

  /* aveva min-height: 420px, sproporzionata su telefono */
  .filemaker-case-media img {
    min-height: 240px;
    width: 100%;
  }

  .filemaker-problem-media img,
  .hero-bg img {
    width: 100%;
    max-width: 100%;
    height: auto;
  }

  /* sforava di 8 px */
  .hosting-real-icon {
    max-width: 100%;
  }
}


/* ============================================================================
   VERIFICA
   ----------------------------------------------------------------------------
   In console, su ogni pagina con la finestra a 375 px:

       document.documentElement.scrollWidth      // deve dare 375

   Se una pagina da' ancora di piu', per sapere quale elemento e':

       [...document.querySelectorAll('*')]
         .filter(el => el.getBoundingClientRect().right > 376)
         .map(el => el.tagName + '.' + el.className)
         .slice(0, 5)

   ----------------------------------------------------------------------------
   QUANDO SARA' TUTTO STABILE
   Questa patch e il blocco mobile vanno fusi: le regole della sezione A qui
   sopra sostituiscono quelle equivalenti del blocco precedente, non si
   aggiungono. Tenerle separate ora serve solo a poter tornare indietro
   facilmente se qualcosa non torna.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 2 — header e hero su mobile                                      #
   #                                                                          #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' QUESTA PATCH ESISTE
   ----------------------------------------------------------------------------
   Dopo la PATCH 1 l'overflow orizzontale era a zero su tutte le pagine, ma
   guardando il rendering restavano due problemi che una misura di larghezza
   non puo' rilevare: qualcosa puo' stare dentro i 375 px ed essere comunque
   sbagliato.

   1. HEADER ALTO 285 px
      Il logo su mobile resta 270 x 180 px, e il `flex-wrap: wrap` introdotto
      nel blocco mobile per mandare il menu a capo manda a capo anche il
      pulsante hamburger: 270 (logo) + 44 (burger) + gap non entrano nei
      319 px disponibili. Risultato: logo enorme, burger sotto, e l'header
      occupa un terzo dello schermo prima ancora del contenuto.

   2. TITOLO HERO SOPRA L'IMMAGINE
      `.hero::after` e' un gradiente ORIZZONTALE (`to right`) che sul desktop
      schiarisce la meta' sinistra per far risaltare il titolo, lasciando
      visibile l'immagine a destra. Su telefono il testo occupa tutta la
      larghezza, quindi quella protezione non copre piu' la zona giusta e le
      lettere finiscono sopra l'immagine.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. HEADER — logo ridotto e burger in riga
     Logo a 150 px: con 44 px di burger e 12 di gap restano 206 px sui 319
     disponibili, quindi non va piu' a capo.
     `flex-shrink: 0` sul burger evita che venga compresso se il logo cresce.
     -------------------------------------------------------------------------- */

  .logo {
    flex: 0 0 auto;
    max-width: 150px;
  }

  .logo img {
    width: 100%;
    max-width: 150px;
    height: auto;
  }

  .nav-burger {
    flex: 0 0 auto;
    margin-left: auto;        /* spinge il burger all'estremo destro */
  }

  header.nav .nav-inner {
    padding: 12px 0;
    gap: 10px;
  }


  /* --------------------------------------------------------------------------
     B. HERO — immagine attenuata e titolo leggibile

     -------------------------------------------------------------------------- */

  .hero-bg {
    opacity: .16;
  }

  /* il gradiente orizzontale non protegge piu' nulla su schermo stretto:
     diventa verticale, dall'alto verso il basso */
  .hero::after {
    background: linear-gradient(
      to bottom,
      rgba(248, 250, 252, .96) 0%,
      rgba(248, 250, 252, .88) 55%,
      rgba(248, 250, 252, .96) 100%
    );
  }

  /* il testo sopra a tutto, senza ambiguita' di sovrapposizione */
  .hero-inner,
  .hero .container {
    position: relative;
    z-index: 2;
  }

  /* 46px su 375 mandavano il titolo su tre righe piene */
  .hero h1 {
    font-size: 34px;
    line-height: 1.12;
  }

  /* l'hero era alto 560 px: piu' di due terzi di schermo prima del contenuto */
  .hero {
    min-height: 0;
    padding-top: 40px;
    padding-bottom: 40px;
  }
}


@media (max-width: 520px) {

  .hero h1 {
    font-size: 30px;
  }

  .logo,
  .logo img {
    max-width: 132px;
  }
}

/* ############################################################################
   #                                                                          #
   #   PATCH 3 — hero della home e dimensioni dei titoli                      #
   #                                                                          #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   1. HERO DELLA HOME — correzione di un errore della PATCH 2
   ----------------------------------------------------------------------------
   Nella PATCH 2 avevo applicato a TUTTE le hero un gradiente chiaro e ridotto
   l'immagine di sfondo a opacita' 0.16. La verifica su tutte le pagine mostra
   che le hero non sono uguali fra loro:

       PAGINA                        COLORE TESTO H1        FONDO NECESSARIO
       /                             #FFFFFF (bianco)       SCURO
       /chi-siamo.php                #0F172A                chiaro
       /infrastruttura-cloud.php     #0F172A                chiaro
       /hosting.php                  #07182A                chiaro
       /applicativi.php              #07182A                chiaro
       /filemaker.php                #061936                chiaro
       /contatti.php                 #07152A                chiaro
       /analizziamo-il-tuo-caso.php  #07182A                chiaro

   La home e' l'unica con testo bianco, perche' e' l'unica costruita sopra
   un'immagine scura (datacenter.jpg). Schiarendole il fondo, il testo bianco
   e' diventato invisibile.

   Per le altre sette la PATCH 2 va bene e resta com'e'. Qui si corregge solo
   la home, riportando il fondo scuro sotto al testo bianco.
   ============================================================================ */

@media (max-width: 820px) {

  /* l'immagine torna piena: e' lei a dare il fondo scuro */
  .page-home .hero-bg {
    opacity: 1;
  }

  /* overlay SCURO al posto del gradiente chiaro della PATCH 2.
     Scurisce l'immagine quanto basta a far risaltare il testo bianco,
     senza cancellarla. */
  .page-home .hero::after {
    background: linear-gradient(
      to bottom,
      rgba(9, 20, 36, .74) 0%,
      rgba(9, 20, 36, .62) 50%,
      rgba(9, 20, 36, .80) 100%
    );
  }
}


/* ============================================================================
   2. DIMENSIONI DEI TITOLI DI SEZIONE
   ----------------------------------------------------------------------------
   Gli h2 restavano fra 42 e 50 px anche a 375 px di schermo: una riga entra
   a fatica e le parole si spezzano male ("Quattro aree, un unico obiettivo:
   far funzionare i sistemi" occupava mezzo schermo in altezza).

   Il blocco mobile originale gia' riduceva `h2`, ma ogni pagina ha regole
   proprie piu' specifiche (`.page-applicativi h2 { font-size: 48px }` e
   simili) che vincevano.

   Il selettore `body[class*="page-"] h2` ha specificita' (0,2,1) e batte
   quelle regole per-pagina (0,1,1) senza dover elencare ogni pagina una per
   una, e senza ricorrere a !important.

   Valori scelti: 28 px su tablet verticale, 25 su telefono. Sono un punto di
   partenza ragionevole, non un dogma: se li vuoi diversi e' una riga.
   ============================================================================ */

@media (max-width: 820px) {

  body[class*="page-"] h2,
  body[class*="page-"] .sec-h2 {
    font-size: 28px;
    line-height: 1.18;
    letter-spacing: -0.02em;
  }

  body[class*="page-"] h3 {
    font-size: 20px;
    line-height: 1.25;
  }

  /* i paragrafi introduttivi seguivano la scala dei titoli */
  body[class*="page-"] .sec-p,
  body[class*="page-"] .cta-inner p {
    font-size: 17px;
    line-height: 1.6;
  }
}


@media (max-width: 520px) {

  body[class*="page-"] h2,
  body[class*="page-"] .sec-h2 {
    font-size: 25px;
  }

  body[class*="page-"] h3 {
    font-size: 19px;
  }
}


/* ============================================================================
   NOTA
   ----------------------------------------------------------------------------
   L'errore della PATCH 2 nasce dall'aver guardato una pagina sola
   (applicativi) e dedotto che tutte le hero fossero uguali. Non lo erano.

   Quando si scrive una regola che tocca tutte le pagine con un selettore
   generico come `.hero`, conviene prima verificare che quelle pagine
   condividano davvero la caratteristica su cui si sta intervenendo — qui il
   colore del testo, che decideva se il fondo dovesse schiarire o scurire.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 4 — altezze fisse e footer                                       #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 3.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   1. ALTEZZE FISSE CHE NON REGGONO IL COLLASSO A UNA COLONNA
   ----------------------------------------------------------------------------
   E' il problema del blocco "Una gestione tecnica coordinata" sulla home.

   COSA SUCCEDE
   `.how-section` e `.how-grid` hanno `height: 560px` FISSA. Sul desktop e'
   corretta: foto e testo stanno affiancati in due colonne, e 560 px bastano
   per entrambi.

   Collassando a una colonna sola i due blocchi si impilano e il contenuto
   diventa 1.264 px (foto 560 + testo 704), ma l'altezza fissa resta 560.
   Il testo esce quindi di 703 px dal fondo della sezione e finisce SOPRA la
   sezione successiva (`.target-section`).

   E' un caso diverso dallo sforamento orizzontale: qui la pagina non scorre
   di lato, si sovrappone in verticale. Per questo non era stato rilevato dai
   controlli precedenti, che misuravano solo `scrollWidth`.

   Ho poi cercato lo stesso schema su tutte le pagine: si ripete solo su
   /applicativi.php, con `.applicativi-technology-grid` che sfora di 92 px.
   Nient'altro nel sito ha altezze fisse che non reggono il collasso.
   ----------------------------------------------------------------------------
   REGOLA GENERALE: una `height` in px va sempre accompagnata da un `height:
   auto` nel breakpoint in cui il layout collassa. Il collasso della griglia
   non tocca l'altezza dichiarata.
   ============================================================================ */

@media (max-width: 820px) {

  /* --- HOME: blocco "Una gestione tecnica coordinata" --- */

  .how-section,
  .how-grid {
    height: auto;
    min-height: 0;
  }

  .how-grid {
    grid-template-rows: auto auto;
  }

  /* la foto a piena altezza desktop occupava due terzi di schermo:
     su telefono basta una fascia */
  .how-photo {
    height: 240px;
    min-height: 0;
  }

  /* padding pensato per la colonna desktop: 54 e 50 px sui lati */
  .how-text {
    height: auto;
    padding: 28px 24px;
  }


  /* --- APPLICATIVI: griglia tecnologie --- */

  .applicativi-technology-grid {
    height: auto;
    min-height: 0;
  }
}


/* ============================================================================
   2. FOOTER — colonne "Servizi" e "Azienda" nascoste su mobile
   ----------------------------------------------------------------------------
   Il footer su telefono e' alto 945 px: le quattro colonne, impilate una
   sotto l'altra, diventano un elenco lunghissimo da scorrere.

   Le colonne "Servizi" e "Azienda" ripetono esattamente le voci gia' presenti
   nel menu hamburger, che su mobile e' sempre a portata di pollice in cima
   alla pagina. Rimuoverle toglie circa 320 px di scroll senza togliere nulla
   di raggiungibile.

   Restano: il blocco brand (logo e descrizione) e i Contatti, che sono
   l'informazione che si cerca davvero arrivando in fondo a una pagina.

   STRUTTURA DEL FOOTER
   `.footer-grid` contiene quattro `div`, di cui solo il primo ha una classe:

       1  .footer-brand-col   logo + descrizione     ← resta
       2  (nessuna classe)    Servizi                ← nascosta
       3  (nessuna classe)    Azienda                ← nascosta
       4  (nessuna classe)    Contatti               ← resta

   Vengono quindi selezionate per posizione. Se un giorno l'ordine delle
   colonne cambia, questa regola va aggiornata: e' il limite di `nth-child`,
   ed e' il motivo per cui, potendo, converrebbe dare una classe a ciascuna
   (`.footer-col-servizi`, `.footer-col-azienda`) e selezionare quelle.

   NOTA SEO: nessun impatto. I link restano nel DOM e tutte le pagine sono
   comunque linkate dal menu di navigazione, presente su ogni pagina.
   ============================================================================ */

@media (max-width: 820px) {

  .footer-grid > div:nth-child(2),
  .footer-grid > div:nth-child(3) {
    display: none;
  }

  /* con due colonne in meno, il footer si ricompatta */
  .footer-grid {
    gap: 28px;
  }
}


/* ============================================================================
   COME VERIFICARE
   ----------------------------------------------------------------------------
   Per lo sforamento verticale, che `scrollWidth` non intercetta, in console:

       [...document.querySelectorAll('section, div')]
         .filter(el => {
           const h = getComputedStyle(el).height;
           return /^\d+(\.\d+)?px$/.test(h) &&
                  el.scrollHeight > parseFloat(h) + 30 &&
                  getComputedStyle(el).overflow !== 'hidden';
         })
         .map(el => el.className + ' sfora di ' +
              Math.round(el.scrollHeight - parseFloat(getComputedStyle(el).height)) + 'px')

   Deve restituire un array vuoto.
   ============================================================================ */

/* ============================================================
   PATCH 5 — applicativi, margine negativo del blocco FileMaker
   ------------------------------------------------------------
   .applicativi-technology-item ha `margin: 10px 0 -92px`.
   Il margine inferiore negativo serve al desktop per far
   risalire il blocco successivo; su mobile accorcia il
   contenitore di 92px rispetto al contenuto, che sborda sotto.
   ============================================================ */

@media (max-width: 820px) {

  .applicativi-technology-item {
    margin-bottom: 0;
  }
}

/* ############################################################################
   #                                                                          #
   #   PATCH 6 — visibilita' delle immagini hero                              #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 5.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' QUESTA PATCH ESISTE
   ----------------------------------------------------------------------------
   La PATCH 2 riduceva TUTTE le immagini hero a `opacity: .16` per garantire la
   leggibilita' del testo sovrapposto. Era una precauzione applicata alla cieca,
   uguale per tutte, senza misurare le immagini: il risultato e' che si vedono
   appena.

   Misurando la luminanza media di ogni immagine e calcolando il contrasto
   effettivo con il colore del testo (formula WCAG), la situazione e' questa:

     HERO                      LUMINANZA   CONTRASTO A OPACITA' PIENA
     hosting                      232            15.7
     filemaker                    232            15.7
     applicativi                  231            15.5
     contatti                     231            15.4
     analizziamo                  226            14.8
     ------------------------------------------------------------------
     infrastruttura               136             5.4
     chi-siamo                    128             4.9

   Soglia WCAG AA: 4.5 per il testo normale, 3.0 per il testo grande.

   CINQUE hero su sette hanno immagini chiare e restano perfettamente leggibili
   anche a opacita' 1: attenuarle non serviva a niente. Tornano piene.

   Le due immagini di media luminosita' (chi-siamo e infrastruttura) a opacita'
   piena darebbero 4.9 e 5.4: sopra la soglia, ma di poco, e il valore e' una
   MEDIA. Il loro range e' 0-254, quindi contengono zone scure dove il testo
   scuro sparirebbe comunque. A 0.7 il contrasto medio sale a 8.3-8.8, che
   copre anche le zone peggiori.

   Il gradiente di protezione introdotto dalla PATCH 2 (alpha .96/.88/.96)
   viene alleggerito di conseguenza: con immagini gia' chiare serviva solo a
   sbiadirle ulteriormente.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. IMMAGINI CHIARE — opacita' piena
     Contrasto fra 14.8 e 15.7 : il testo scuro si legge senza alcun aiuto.
     -------------------------------------------------------------------------- */

  .hero-hosting .hero-bg,
  .hero-applicativi .hero-bg,
  .hero-filemaker .hero-bg,
  .hero-analizziamo .hero-bg,
  .contact-hero .hero-bg {
    opacity: 1;
  }

  /* velo minimo, solo per uniformare il fondo dietro al testo */
  .hero-hosting::after,
  .hero-applicativi::after,
  .hero-filemaker::after,
  .hero-analizziamo::after,
  .contact-hero::after {
    background: linear-gradient(
      to bottom,
      rgba(248, 250, 252, .34) 0%,
      rgba(248, 250, 252, .20) 60%,
      rgba(248, 250, 252, .34) 100%
    );
  }


  /* --------------------------------------------------------------------------
     B. IMMAGINI DI MEDIA LUMINOSITA' — chi siamo e infrastruttura
     Molto piu' visibili di prima (da .16 a .7) ma con un velo piu' marcato,
     perche' contengono zone scure dove il testo scuro rischia di perdersi.
     -------------------------------------------------------------------------- */

  .hero-about .hero-bg,
  .hero-infrastruttura .hero-bg {
    opacity: .7;
  }

  .hero-about::after,
  .hero-infrastruttura::after {
    background: linear-gradient(
      to bottom,
      rgba(248, 250, 252, .58) 0%,
      rgba(248, 250, 252, .42) 60%,
      rgba(248, 250, 252, .58) 100%
    );
  }
}


/* ============================================================================
   SE VUOI REGOLARE A OCCHIO
   ----------------------------------------------------------------------------
   I due valori da toccare sono l'`opacity` del blocco `.hero-bg` e l'alpha del
   gradiente `::after`. Alzando l'uno o abbassando l'altro l'immagine si vede
   di piu', ma il testo perde contrasto: sono la stessa manopola vista da due
   lati.

   Riferimento per non scendere sotto la soglia di leggibilita':

     chi-siamo / infrastruttura   opacity .7  -> 8.3    (limite utile: ~.95)
     le altre cinque              opacity 1   -> 15+    (nessun limite)

   La home resta fuori da questa patch: ha testo BIANCO su immagine scura e
   usa l'overlay scuro della PATCH 3. Le sue regole non vanno toccate qui.

   ----------------------------------------------------------------------------
   NOTA DI METODO
   Applicare lo stesso valore a sette elementi diversi senza misurarli e' stato
   un errore: cinque non ne avevano bisogno. Quando una regola vale "per tutte",
   conviene prima verificare che tutte abbiano davvero lo stesso problema.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 7 — altezza delle hero su mobile                                 #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 6.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' QUESTA PATCH ESISTE
   ----------------------------------------------------------------------------
   Le hero restano molto piu' alte del loro contenuto, lasciando una fascia
   vuota sotto al testo:

     PAGINA                  HERO      CONTENUTO   VUOTO SOTTO
     applicativi             640 px      183 px      351 px
     infrastruttura-cloud    490 px      290 px      204 px
     chi-siamo               522 px      286 px      196 px
     hosting                 435 px      239 px      188 px
     home                    469 px      273 px      156 px
     contatti                620 px      465 px      110 px
     analizziamo             513 px      299 px       76 px

   LE CAUSE, tutte ereditate dal layout desktop:

   1. `.hero-inner` ha `min-height: 560px` (applicativi). Sul desktop serve a
      dare respiro alla composizione su due colonne; su telefono, con 183 px di
      testo, produce 351 px di vuoto.

   2. `.hero` e `.contact-hero` hanno `min-height: 620px` su contatti e
      filemaker.

   3. `.hero-inner` e' una griglia a due colonne (testo | immagine). Collassata
      a una colonna resta una traccia vuota che occupa comunque spazio, e
      `padding-top: 48px` si somma a quello dell'hero.

   Il risultato e' che su telefono si scorre parecchio prima di arrivare al
   contenuto vero della pagina.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. L'hero si adatta al contenuto
     `min-height: 0` e `height: auto` annullano le altezze desktop; il padding
     scende da 40 a 32 px, che su telefono e' gia' sufficiente a dare aria.
     -------------------------------------------------------------------------- */

  .hero,
  .contact-hero {
    min-height: 0;
    height: auto;
    padding-top: 32px;
    padding-bottom: 32px;
  }

  .hero > .container,
  .contact-hero > .container {
    height: auto;
    min-height: 0;
  }


  /* --------------------------------------------------------------------------
     B. Il contenitore interno smette di riservare spazio
     `align-content: start` evita che la griglia distribuisca lo spazio
     avanzato fra le righe, che e' l'altro modo in cui ricompare il vuoto.
     -------------------------------------------------------------------------- */

  .hero-inner {
    min-height: 0;
    height: auto;
    padding-top: 0;
    padding-bottom: 0;
    grid-template-rows: auto;
    align-content: start;
    row-gap: 20px;
  }
}


@media (max-width: 520px) {

  .hero,
  .contact-hero {
    padding-top: 26px;
    padding-bottom: 26px;
  }
}


/* ============================================================================
   SE VUOI REGOLARE L'ARIA
   ----------------------------------------------------------------------------
   L'unica manopola e' il `padding` di `.hero`: 32 px sopra e sotto e' un
   compromesso. Alzandolo l'hero respira di piu' ma si scorre di piu' prima di
   arrivare al contenuto; abbassandolo il testo si avvicina al bordo.

   Sotto i 20 px il titolo inizia a sembrare attaccato all'header.

   NOTA: l'hero di FileMaker resta la piu' alta (circa 1.800 px) ma li' non c'e'
   vuoto: contiene 1.600 px di contenuto reale. Non e' un problema di altezza,
   semmai di quantita' di contenuto in cima alla pagina, che e' una scelta
   editoriale e non tecnica.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 8 — leggibilita' del testo hero e altezze rimaste                #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 7.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   1. LEGGIBILITA' DEL PARAGRAFO NELL'HERO
   ----------------------------------------------------------------------------
   Nella PATCH 6 avevo calcolato il contrasto usando il colore dell'H1, che e'
   quasi nero. Ma il paragrafo sotto al titolo usa un grigio molto piu' chiaro,
   e su tre pagine finisce sotto la soglia di leggibilita'.

   Contrasto misurato del PARAGRAFO sul fondo effettivo (immagine + velo):

     PAGINA                 COLORE ATTUALE     CONTRASTO
     chi-siamo              rgb(100,116,139)      2.9     SOTTO SOGLIA
     infrastruttura-cloud   rgb(100,116,139)      3.0     SOTTO SOGLIA
     filemaker              rgb( 95,111,134)      4.3     appena sotto
     ---------------------------------------------------------------
     hosting                rgb( 38, 58, 77)      9.9     ok
     analizziamo            rgb( 48, 69, 86)      8.0     ok
     applicativi            rgb( 64, 86,106)      6.4     ok
     contatti               rgb( 64, 86,106)      6.4     ok

   Soglia WCAG AA: 4.5 per il testo normale.

   Gli H1 stanno tutti fra 10.7 e 15.2: il titolo si legge ovunque. E' solo il
   grigio chiaro del paragrafo a perdersi sull'immagine.

   PERCHE' SI SCURISCE IL TESTO INVECE DI RAFFORZARE IL VELO
   Per portare `rgb(100,116,139)` a 4.5 servirebbe un fondo quasi bianco: si
   tornerebbe a far sparire l'immagine, annullando la PATCH 6. Scurire il testo
   mantiene l'immagine visibile e risolve il contrasto.

   Il cambio vale SOLO su mobile: sul desktop il paragrafo sta su fondo pulito,
   a sinistra del gradiente, e li' il grigio chiaro va benissimo.
   ============================================================================ */

@media (max-width: 820px) {

  .hero-about .hero-inner p,
  .hero-infrastruttura .hero-inner p,
  .hero-filemaker .hero-inner p,
  .hero-about p,
  .hero-infrastruttura p,
  .hero-filemaker p {
    color: #334155;
  }
}


/* ============================================================================
   2. ALTEZZE HERO RIMASTE — questione di specificita'
   ----------------------------------------------------------------------------
   La PATCH 7 non ha avuto effetto su applicativi (612 px) e contatti (620 px)
   perche' le regole originali sono piu' specifiche delle mie:

     REGOLA ORIGINALE                                    SPECIFICITA'
     .hero-applicativi .hero-inner { min-height:560px }     0,2,0
     .page-filemaker .hero-filemaker .hero-inner            0,3,0
     .page-contatti .contact-hero  { min-height:620px }     0,2,0
     .page-contatti .contact-hero h1 { font-size:58px }     0,3,1

     LA MIA (PATCH 7)
     .hero-inner { min-height: 0 }                          0,1,0   <- perde

   Il prefisso `body[class*="page-"]` porta la specificita' a 0,3,1 e vince
   su tutte, senza dover elencare le pagine una per una e senza !important.
   E' lo stesso meccanismo usato nella PATCH 3 per i titoli di sezione.
   ============================================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .hero .hero-inner,
  body[class*="page-"] .contact-hero .hero-inner {
    min-height: 0;
    height: auto;
  }

  body[class*="page-"] .hero,
  body[class*="page-"] .contact-hero {
    min-height: 0;
    height: auto;
  }

  /* l'H1 di contatti era rimasto a 58px */
  body[class*="page-"] .hero h1,
  body[class*="page-"] .contact-hero h1 {
    font-size: 34px;
    line-height: 1.12;
  }

  body[class*="page-"] .hero p,
  body[class*="page-"] .contact-hero p {
    font-size: 17px;
    line-height: 1.55;
  }
}


@media (max-width: 520px) {

  body[class*="page-"] .hero h1,
  body[class*="page-"] .contact-hero h1 {
    font-size: 30px;
  }
}


/* ============================================================================
   NOTA DI METODO
   ----------------------------------------------------------------------------
   Due lezioni da questa patch, utili per il futuro:

   1. Il contrasto va verificato sul testo PIU' CHIARO della composizione, non
      sul titolo. Il titolo e' quasi sempre il caso facile.

   2. Quando una regola "non funziona", nove volte su dieci non e' sbagliata:
      e' meno specifica di quella che sta sovrascrivendo. Prima di riscriverla
      conviene cercare chi la sta battendo.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 9 — hero: testo e immagine separati su mobile                    #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 8.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' QUESTA PATCH ESISTE — e perche' chiude il problema invece di
   spostarlo
   ----------------------------------------------------------------------------
   Le PATCH 6 e 8 hanno lavorato sul contrasto fra testo e immagine
   sovrapposti: opacita' dell'immagine, forza del velo, colore del testo.
   Il contrasto MEDIO e' salito a 6.2, ma il problema resta visibile.

   Il motivo e' che il contrasto medio non dice nulla sui singoli punti:
   l'immagine di chi-siamo ha un range di luminanza 0-254, e proprio dove
   cadono le righe centrali del paragrafo ci sono i monitor illuminati. Li'
   il testo si perde, per quanto la media sia buona.

   Finche' testo e immagine stanno sovrapposti su 375 px di larghezza, ogni
   valore di opacita' e' un compromesso fra due esigenze opposte: leggibilita'
   contro visibilita' dell'immagine. Sul desktop il problema non esiste perche'
   il gradiente orizzontale tiene il testo a sinistra e l'immagine a destra —
   sono affiancati, non sovrapposti.

   LA SOLUZIONE: riprodurre su mobile la stessa separazione, in verticale.
   Testo in alto su fondo pulito, immagine come banda sotto.

   Cosa si guadagna:
     - leggibilita' totale, indipendente da come e' fatta l'immagine
     - immagine a piena opacita', nitida, senza veli
     - niente piu' banda vuota: oggi l'immagine di chi-siamo e' alta 250 px
       dentro un hero di 388, e su contatti e' 1162x620 con `top: -362`,
       quindi quasi tutta fuori dallo schermo
     - il colore originale del paragrafo torna utilizzabile (la PATCH 8 lo
       aveva scurito solo per sopravvivere alla sovrapposizione)

   LA HOME RESTA COM'E'
   Ha testo BIANCO su immagine scura: separandoli, il testo bianco finirebbe
   su fondo chiaro e sparirebbe. Li' la sovrapposizione con overlay scuro
   funziona bene ed e' gia' verificata, quindi non si tocca.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. L'hero diventa una colonna: prima il testo, poi l'immagine
     `.hero` e' gia' `display: flex`, basta girarlo in verticale e ordinare
     i due figli con `order`.
     -------------------------------------------------------------------------- */

  body[class*="page-"]:not(.page-home) .hero,
  body[class*="page-"] .contact-hero {
    flex-direction: column;
    align-items: stretch;
    padding-bottom: 0;          /* la banda immagine chiude la sezione */
    overflow: hidden;
  }

  body[class*="page-"]:not(.page-home) .hero > .container,
  body[class*="page-"] .contact-hero > .container {
    order: 1;
    padding-bottom: 28px;
  }


  /* --------------------------------------------------------------------------
     B. L'immagine esce dal posizionamento assoluto e diventa una banda
     -------------------------------------------------------------------------- */

  body[class*="page-"]:not(.page-home) .hero .hero-bg,
  body[class*="page-"] .contact-hero .contact-hero-bg {
    position: relative;
    inset: auto;
    order: 2;
    width: 100%;
    height: 200px;
    opacity: 1;                 /* niente piu' attenuazione: non c'e' testo sopra */
    display: block;
  }

  body[class*="page-"]:not(.page-home) .hero .hero-bg img,
  body[class*="page-"] .contact-hero .contact-hero-bg img {
    position: static;
    width: 100%;
    max-width: 100%;
    height: 200px;
    object-fit: cover;
    object-position: center;
    top: auto;
    right: auto;
    bottom: auto;
    left: auto;
  }


  /* --------------------------------------------------------------------------
     C. Via il velo: non serve piu' proteggere nulla
     -------------------------------------------------------------------------- */

  body[class*="page-"]:not(.page-home) .hero::after,
  body[class*="page-"] .contact-hero::after {
    display: none;
  }


  /* --------------------------------------------------------------------------
     D. Il paragrafo torna al colore originale
     La PATCH 8 lo aveva scurito a #334155 solo per reggere la sovrapposizione.
     Ora sta su fondo pulito e il grigio di progetto va benissimo.
     -------------------------------------------------------------------------- */

  .hero-about p,
  .hero-infrastruttura p,
  .hero-about .hero-inner p,
  .hero-infrastruttura .hero-inner p {
    color: #64748B;
  }

  .hero-filemaker p,
  .hero-filemaker .hero-inner p {
    color: #5F6F86;
  }
}


/* ============================================================================
   SE VUOI REGOLARE
   ----------------------------------------------------------------------------
   L'unico valore da toccare e' l'altezza della banda: 200 px in due punti
   (sul contenitore e sull'immagine, devono restare uguali).

     120-150 px  accenno grafico, quasi una riga di colore
     200 px      valore attuale: si legge il soggetto senza rubare scroll
     260-300 px  l'immagine diventa protagonista, ma allunga la pagina

   Se preferisci l'immagine SOPRA il testo, si invertono i due `order`:
   `.container { order: 2 }` e `.hero-bg { order: 1 }`.

   ----------------------------------------------------------------------------
   NOTA DI METODO
   Le PATCH 6 e 8 hanno inseguito il contrasto medio, che era il parametro
   sbagliato: una media alta convive benissimo con zone in cui il testo
   sparisce. Quando un problema si ripresenta dopo due correzioni successive,
   di solito non serve una terza regolazione dello stesso parametro — serve
   cambiare l'impostazione che lo genera.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 10 — immagine hero SOPRA il testo                                #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 9.                    #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   COSA CAMBIA RISPETTO ALLA PATCH 9
   ----------------------------------------------------------------------------
   La PATCH 9 metteva il testo in alto e l'immagine come banda in fondo
   all'hero. Qui l'ordine e' invertito: prima l'immagine, poi il testo.

   Cambiano solo tre cose:
     - i due `order` si scambiano (immagine 1, testo 2)
     - il padding superiore dell'hero va a zero, cosi' l'immagine tocca
       l'header senza una striscia di fondo in mezzo
     - il padding torna sotto al testo, che ora chiude la sezione

   Tutto il resto della PATCH 9 resta valido e non va toccato: separazione,
   opacita' piena, niente velo, colore originale del paragrafo.

   NOTA: con l'immagine in cima, la prima cosa che si vede aprendo la pagina
   e' l'immagine e non il titolo. E' una scelta legittima e molto diffusa, ma
   ha una conseguenza da conoscere: l'immagine dell'hero diventa il contenuto
   piu' grande visibile all'apertura, quindi l'elemento su cui Google misura
   il Largest Contentful Paint. Vale la pena tenerlo presente quando si
   comprimeranno le immagini (§6 del documento go-live): quelle degli hero
   diventano le piu' importanti da alleggerire.
   ============================================================================ */


@media (max-width: 820px) {

  /* --- l'hero non ha piu' padding sopra: lo spazio lo occupa l'immagine --- */

  body[class*="page-"]:not(.page-home) .hero,
  body[class*="page-"] .contact-hero {
    padding-top: 0;
    padding-bottom: 32px;
  }


  /* --- immagine per prima --- */

  body[class*="page-"]:not(.page-home) .hero .hero-bg,
  body[class*="page-"] .contact-hero .contact-hero-bg {
    order: 1;
  }


  /* --- testo dopo, con lo spazio che prima stava sopra l'immagine --- */

  body[class*="page-"]:not(.page-home) .hero > .container,
  body[class*="page-"] .contact-hero > .container {
    order: 2;
    padding-top: 30px;
    padding-bottom: 0;
  }
}


@media (max-width: 520px) {

  body[class*="page-"]:not(.page-home) .hero,
  body[class*="page-"] .contact-hero {
    padding-bottom: 26px;
  }

  body[class*="page-"]:not(.page-home) .hero > .container,
  body[class*="page-"] .contact-hero > .container {
    padding-top: 26px;
  }
}


/* ============================================================================
   REGOLAZIONI
   ----------------------------------------------------------------------------
   Altezza della banda: resta quella della PATCH 9 (200 px, in due punti).
   Con l'immagine in cima si puo' alzare un po' senza penalizzare la lettura,
   perche' il titolo resta comunque nella prima schermata:

     200 px   valore attuale
     240 px   piu' presente, il titolo resta visibile senza scorrere
     280 px+  su schermi piccoli il titolo inizia a finire sotto la piega

   Se torni a preferirla sotto, basta rimuovere questa patch: la PATCH 9
   riprende a valere da sola.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 11 — spazio vuoto sotto il testo dell'hero                       #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 10.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   DA COSA E' COMPOSTO IL VUOTO
   ----------------------------------------------------------------------------
   Misurato lo spazio fra l'ultima riga di testo e il fondo dell'hero:

     PAGINA                 VUOTO   dentro .hero-inner   margin <p>   padding hero
     infrastruttura-cloud   130px         104               36            26
     chi-siamo              122px          96               28            26
     hosting                114px          88               36            26
     filemaker               84px          58               36            26
     analizziamo             62px          36               36            26
     contatti                59px           -                0            26
     applicativi             54px          28                0            26

   Tre residui del layout desktop, che si sommano:

   1. `.hero-inner` e' la griglia a due colonne del desktop. Collassata a una,
      mantiene una traccia vuota che continua a occupare spazio.

   2. Il `row-gap` della griglia resta quello desktop: 20 px, e su
      analizziamo addirittura 90 px.

   3. L'ultimo paragrafo conserva il suo `margin-bottom` (28-36 px), che sul
      desktop serve a staccarlo da cio' che segue nella colonna. Qui sotto non
      c'e' piu' niente: e' vuoto puro.

   A questi si somma il `padding-bottom` dell'hero, che invece serve e resta —
   ridotto da 26 a 20 px.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. Le tracce vuote della griglia spariscono
     `:empty` colpisce solo gli elementi realmente privi di contenuto, quindi
     le celle rimaste orfane del layout a due colonne.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero-inner > *:empty {
    display: none;
  }


  /* --------------------------------------------------------------------------
     B. Gap della griglia riportato a una misura da mobile
     Era 20 px su quasi tutte e 90 px su analizziamo.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero-inner {
    row-gap: 0;
    align-content: start;
  }


  /* --------------------------------------------------------------------------
     C. L'ultimo elemento non ha piu' niente sotto di se': via il margine
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero .hero-inner > *:last-child,
  body[class*="page-"] .contact-hero .hero-inner > *:last-child,
  body[class*="page-"] .hero p:last-of-type,
  body[class*="page-"] .contact-hero p:last-of-type {
    margin-bottom: 0;
  }


  /* --------------------------------------------------------------------------
     D. Padding di chiusura dell'hero, ridotto ma non azzerato:
        serve a non far toccare il testo al bordo della sezione successiva
     -------------------------------------------------------------------------- */

  body[class*="page-"]:not(.page-home) .hero,
  body[class*="page-"] .contact-hero {
    padding-bottom: 20px;
  }
}


@media (max-width: 520px) {

  body[class*="page-"]:not(.page-home) .hero,
  body[class*="page-"] .contact-hero {
    padding-bottom: 16px;
  }
}


/* ============================================================================
   RISULTATO ATTESO
   ----------------------------------------------------------------------------
   Il vuoto sotto il testo dovrebbe scendere dai 54-130 px attuali a circa
   16-20 px su tutte le pagine, cioe' al solo padding di chiusura.

   Se dopo questa patch una pagina mostra ancora spazio di troppo, il colpevole
   e' probabilmente un elemento decorativo (una riga, un separatore) che non
   e' `:empty` perche' contiene qualcosa. Si trova cosi', in console:

       const h = document.querySelector('.hero');
       [...h.querySelectorAll('*')]
         .filter(e => e.getBoundingClientRect().height > 0)
         .slice(-3)
         .map(e => e.tagName + '.' + e.className + ' h=' +
              Math.round(e.getBoundingClientRect().height))

   Mostra gli ultimi tre elementi con altezza reale: se fra loro c'e' qualcosa
   che non ti aspetti, e' quello.

   ----------------------------------------------------------------------------
   Il `padding-bottom` di 20 px e' l'unica manopola volontaria rimasta: si puo'
   portare a 0 se vuoi il testo attaccato alla sezione successiva, ma di solito
   un minimo di stacco aiuta a separare i blocchi.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 12 — inquadratura delle immagini hero su mobile                  #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 11.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   IL PROBLEMA E' DENTRO I FILE, NON NEL CSS
   ----------------------------------------------------------------------------
   Le immagini hero sono state preparate per il layout desktop: il testo sta a
   sinistra, quindi la meta' sinistra dell'immagine e' sfumata verso il bianco
   per farlo risaltare. La sfumatura e' incorporata nel PNG.

   Luminanza misurata da sinistra a destra (255 = bianco):

     PAGINA           SINISTRA -> DESTRA                    ZONA LAVATA
     chi-siamo        254 249 216 141 75 50 29 12               25%
     analizziamo      249 249 243 227 215 202 224 199           38%
     applicativi      251 249 245 239 220 227 225 192           50%
     filemaker        245 248 248 239 232 229 223 193           50%
     contatti         241 241 242 241 238 224 215 201           63%
     infrastruttura   215 192 177 151 92 79 86 84                0%
     hosting          222 224 229 233 238 238 237 236            0% (uniforme)

   Su mobile la banda mostra tutta la larghezza, quindi il primo quarto (o
   meta') dell'immagine appare come una zona slavata senza contenuto.

   PERCHE' `object-position` DA SOLO NON BASTA
   La banda e' 375x200 (proporzione 1.875), le immagini sono circa 1536x1024
   (1.5). Con `object-fit: cover` il browser scala sulla LARGHEZZA e ritaglia
   in ALTEZZA: la larghezza viene mostrata per intero, zona lavata compresa, e
   `object-position` orizzontale non ha alcun effetto perche' non c'e' niente
   da spostare.

   LA SOLUZIONE
   Ingrandire l'immagine dentro la banda ancorandola al bordo destro: si vede
   solo la porzione che contiene davvero il soggetto.

   `scale(1.7)` con origine a destra mostra il 59% destro dell'immagine, cioe'
   dal 41% in poi. Nessuna perdita di qualita': anche ingrandita, la larghezza
   richiesta resta circa 640 px contro i 1536 dell'originale.
   ============================================================================ */


@media (max-width: 820px) {

  /* la banda ritaglia quello che esce */
  body[class*="page-"] .hero .hero-bg,
  body[class*="page-"] .contact-hero .contact-hero-bg {
    overflow: hidden;
  }

  /* --------------------------------------------------------------------------
     Inquadratura ancorata a destra.
     Valore unico per le pagine con sfumatura marcata.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero .hero-bg img,
  body[class*="page-"] .contact-hero .contact-hero-bg img {
    transform: scale(1.7);
    transform-origin: right center;
  }


  /* --------------------------------------------------------------------------
     ECCEZIONI
     -------------------------------------------------------------------------- */

  /* hosting: luminanza 222-238 costante su tutta la larghezza, nessuna
     sfumatura da evitare. Ingrandirla toglierebbe soltanto inquadratura. */
  body[class*="page-"] .hero-hosting .hero-bg img {
    transform: none;
  }

  /* infrastruttura: la sfumatura e' dolce (215 -> 84) e il soggetto occupa
     gia' quasi tutta la larghezza. Basta un ingrandimento leggero. */
  body[class*="page-"] .hero-infrastruttura .hero-bg img {
    transform: scale(1.25);
  }

  /* contatti: zona lavata fino al 63%, la piu' estesa. Serve piu' zoom. */
  body[class*="page-"] .contact-hero .contact-hero-bg img {
    transform: scale(2.1);
  }
}


/* ============================================================================
   COME REGOLARE, PAGINA PER PAGINA
   ----------------------------------------------------------------------------
   Il valore di `scale` decide quanta parte sinistra viene esclusa:

       scale(1.3)  ->  mostra il 77% destro   (esclude il 23% sinistro)
       scale(1.5)  ->  mostra il 67% destro
       scale(1.7)  ->  mostra il 59% destro   <- valore generale
       scale(2.0)  ->  mostra il 50% destro
       scale(2.5)  ->  mostra il 40% destro

   Regola pratica: `scale = 1 / (1 - percentuale_lavata)`.
   Per chi-siamo, lavata al 25%: 1 / 0.75 = 1.33 sarebbe il minimo; 1.7 da'
   un margine di sicurezza e centra meglio il soggetto.

   Alzando troppo lo zoom si perde contesto e l'immagine diventa un dettaglio
   irriconoscibile: meglio restare sotto 2.5.

   ----------------------------------------------------------------------------
   LA SOLUZIONE MIGLIORE, QUANDO CI SARA' TEMPO
   Questa patch e' un rimedio: sta ritagliando immagini pensate per un altro
   formato. La soluzione pulita e' esportare una versione mobile di ogni hero,
   senza sfumatura e gia' inquadrata per un formato orizzontale basso, da
   servire con <picture> e media query.

   Vantaggi: nessun ingrandimento, inquadratura decisa da chi ha fatto la
   grafica invece che da una formula, e file molto piu' leggeri — le attuali
   sono da 1536-1717 px di larghezza per essere mostrate a 375.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 13 — correzione home + vuoto residuo nell'hero                   #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 12.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   1. CORREZIONE: la home aveva preso lo zoom della PATCH 12
   ----------------------------------------------------------------------------
   Nelle PATCH 9 e 10 la home era stata esclusa con `:not(.page-home)`, perche'
   e' l'unica che mantiene il layout sovrapposto (testo bianco su immagine
   scura). Nella PATCH 12 quell'esclusione e' stata dimenticata, quindi la home
   ha ricevuto `transform: scale(1.7)` su un'immagine che li' fa da sfondo a
   tutta la sezione: risultato, inquadratura ingrandita senza motivo.

   Qui viene annullato. La home torna esattamente com'era dopo la PATCH 3.
   ============================================================================ */

@media (max-width: 820px) {

  body.page-home .hero .hero-bg img {
    transform: none;
  }
}


/* ============================================================================
   2. VUOTO RESIDUO SOTTO IL TESTO — la griglia che non serve piu'
   ----------------------------------------------------------------------------
   Dopo la PATCH 11 il vuoto era sceso da 122 a 64 px, ma non ai 20 previsti.

   MISURA su chi-siamo:
       il testo finisce a          466 px
       .hero-inner finisce a       514 px   <- 48 px di spazio riservato
       .hero finisce a             530 px   <- 16 px di padding, corretti

   CAUSA
   `.hero-inner` e' la griglia a due colonne del desktop. Su mobile ha ancora
   DUE celle: la prima con il testo, la seconda — quella dell'immagine — alta
   zero ma pur sempre una traccia della griglia.

   La regola `:empty` della PATCH 11 non la intercetta, perche' quel `div` non
   e' realmente vuoto: contiene un elemento annidato che a sua volta non
   produce altezza. `:empty` guarda i figli, non l'altezza risultante.

   SOLUZIONE
   Su mobile `.hero-inner` non ha piu' bisogno di essere una griglia: deve solo
   impilare i suoi contenuti. Con `display: block` le tracce spariscono, e con
   loro gap, righe fantasma e distribuzione dello spazio. E' anche piu' solido
   di qualsiasi regola che cerchi di neutralizzare la griglia pezzo per pezzo.
   ============================================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .hero-inner {
    display: block;
  }

  /* i figli diretti tornano a comportarsi da blocchi impilati */
  body[class*="page-"] .hero-inner > * {
    width: auto;
    max-width: 100%;
  }

  /* l'ultimo elemento non ha nulla sotto di se' */
  body[class*="page-"] .hero-inner > *:last-child,
  body[class*="page-"] .hero-inner > *:last-child > *:last-child {
    margin-bottom: 0;
  }
}


/* ============================================================================
   RISULTATO ATTESO
   ----------------------------------------------------------------------------
   Il vuoto sotto il testo scende a 16-20 px su tutte le pagine: il solo
   padding di chiusura dell'hero, che serve a separarlo dalla sezione
   successiva.

   Per verificarlo, in console a 375 px:

       const h = document.querySelector('.hero, .contact-hero');
       const t = [...h.querySelectorAll('h1,p,a,ul')]
                   .filter(e => e.getBoundingClientRect().height > 0).pop();
       Math.round(h.getBoundingClientRect().bottom -
                  t.getBoundingClientRect().bottom)

   ----------------------------------------------------------------------------
   NOTA
   `display: block` su un contenitore nato come griglia e' spesso la mossa piu'
   pulita quando su mobile serve solo impilare: evita di dover azzerare a mano
   colonne, righe, gap e allineamenti, e non lascia tracce fantasma.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 14 — padding interno dell'hero e interruzioni di riga            #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 13.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   1. IL PADDING CHE RESISTEVA
   ----------------------------------------------------------------------------
   Ogni pagina ha un padding proprio su `.hero-inner`, con selettori piu'
   specifici di quelli usati finora:

       .hero-about .hero-inner                            padding-top: 48px
       .hero-infrastruttura .hero-inner                    padding-top:  4px
       .page-infrastruttura .hero-inner                    padding-top:  4px

   La PATCH 7 azzerava `.hero-inner` (specificita' 0,1,0) e perdeva contro
   `.hero-about .hero-inner` (0,2,0). Il prefisso `body[class*="page-"]` porta
   a 0,3,1 e vince su tutte.

   Il valore viene uniformato a 24 px sopra — uno stacco dall'immagine uguale
   per tutte le pagine — e 0 sotto, perche' li' chiude gia' il padding
   dell'hero.
   ============================================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .hero .hero-inner,
  body[class*="page-"] .contact-hero .hero-inner,
  body[class*="page-"] .contact-hero .contact-hero-inner {
    padding-top: 24px;
    padding-bottom: 0;
  }

  /* l'ultimo blocco di testo non ha nulla sotto di se' */
  body[class*="page-"] .hero .hero-inner > *:last-child,
  body[class*="page-"] .hero .hero-inner > *:last-child > *:last-child,
  body[class*="page-"] .contact-hero .contact-hero-inner > *:last-child {
    margin-bottom: 0;
    padding-bottom: 0;
  }
}


/* ============================================================================
   2. LE INTERRUZIONI DI RIGA DEL DESKTOP
   ----------------------------------------------------------------------------
   Nei titoli e nei paragrafi dell'hero ci sono `<br>` inseriti per spezzare il
   testo in punti precisi sul desktop, dove la colonna e' larga:

       infrastruttura-cloud   <br> alto 38 px dentro l'h1
       hosting                <br> alto 23 px dentro il paragrafo

   Su 375 px il testo va gia' a capo da solo, e quel `<br>` non spezza niente:
   aggiunge una riga vuota.

   Vengono disattivati SOLO dentro l'hero: altrove nel sito potrebbero servire
   davvero, e questa patch non li tocca.
   ============================================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .hero h1 br,
  body[class*="page-"] .hero .hero-sub br,
  body[class*="page-"] .contact-hero h1 br,
  body[class*="page-"] .contact-hero p br {
    display: none;
  }
}


/* ============================================================================
   VERIFICA
   ----------------------------------------------------------------------------
   In console, a 375 px, su ciascuna pagina:

       const h = document.querySelector('.hero, .contact-hero');
       const t = [...h.querySelectorAll('h1,p')]
                   .filter(e => e.getBoundingClientRect().height > 0).pop();
       ({
         sopra: Math.round(
           h.querySelector('h1').getBoundingClientRect().top -
           h.querySelector('.hero-bg, .contact-hero-bg').getBoundingClientRect().bottom),
         sotto: Math.round(h.getBoundingClientRect().bottom -
                           t.getBoundingClientRect().bottom)
       })

   Atteso: circa 24 px sopra il titolo (stacco dall'immagine) e 16 px sotto
   l'ultimo testo (chiusura dell'hero).

   ----------------------------------------------------------------------------
   NOTA
   Il padding di `.hero-inner` era gia' stato azzerato nella PATCH 7, ma con un
   selettore troppo debole. E' il terzo caso in questa serie in cui una regola
   sembrava non funzionare ed era solo meno specifica di quella che stava
   provando a sovrascrivere: conviene verificarlo per primo, prima di
   riscrivere la regola.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 15 — separatori verticali e rientri del layout a colonne         #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 14.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   COSA SONO QUESTE LINEE
   ----------------------------------------------------------------------------
   Sulla pagina Infrastruttura si vedono due linee verticali fuori posto: una
   staccata a sinistra dei blocchi, una che taglia il testo a meta'. Cercandole
   su tutte le pagine, sono la stessa cosa ripetuta 20 volte.

   Sono due meccanismi diversi che il desktop usa per separare le colonne:

   A) PSEUDO-ELEMENTI: una linea in `position: absolute` disegnata fra le due
      colonne della griglia. Con la griglia collassata resta dov'era e finisce
      in mezzo al contenuto.

         .infra-sysadmin-grid::before     1 x 827 px  a 159 px da sinistra
         .hosting-fit-grid::before        1 x 645 px
         .applicativi-build-item::before  1 x 310 px

   B) BORDER-LEFT sulle card: sul desktop, affiancate, il bordo sinistro fa da
      divisorio fra una colonna e l'altra. Impilate su mobile, diventa una
      riga verticale a sinistra che non separa piu' niente.

   ----------------------------------------------------------------------------
   COME SONO STATI DISTINTI I CASI

   Non tutti i `border-left` sono errori: alcuni sono accenti decorativi voluti.
   Il criterio e' il COLORE.

     AZZURRO Vincasoft — rgb(31,160,208), rgba(22,122,153,...) e derivati
     Accento di marca, deliberato. RESTA.
       .about-continuity-node   .about-panel-card    .analisi-intro-card
       .analisi-form-note       .analisi-step-card   .analisi-target-item
       .analisi-form            .hosting-position-point

     GRIGIO NEUTRO — rgb(226,232,240), rgba(203,213,225,...), rgba(7,21,42,...)
     Divisorio strutturale, senza significato una volta impilato. VIA.
       .home-service-item       .infra-environment-item  .contact-direct-item
       .contact-location        .contact-request-item    .filemaker-position-item
       .applicativi-technology-item

   Eccezione: `.hosting-included-item` ha un bordo azzurro tenue ma sul desktop
   sta in una griglia a 5 colonne, quindi li' e' un divisorio a tutti gli
   effetti: va tolto anche quello.

   ----------------------------------------------------------------------------
   IL PROBLEMA PIU' GRANDE: I RIENTRI

   Il `border-left` viaggia sempre con un `padding-left` che gli fa spazio, e
   quei valori sono pensati per una colonna larga:

       .contact-request-item   68 px   = 18% dello schermo
       .filemaker-difference-text 48   .analisi-form 46   .contact-location 44
       .contact-direct-item 42  .filemaker-position-item 42  .analisi-intro-card 40
       .analisi-step-card 36    .analisi-target-item 36  .applicativi-technology-item 36
       .infra-environment-item 34

   Su 375 px di larghezza sono decine di pixel sottratti al testo su ogni
   riga. Vengono ridotti a 16 px dove l'accento resta, azzerati dove il bordo
   se ne va.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. Le linee disegnate fra le colonne
     -------------------------------------------------------------------------- */

  body[class*="page-"] .infra-sysadmin-grid::before,
  body[class*="page-"] .hosting-fit-grid::before,
  body[class*="page-"] .applicativi-build-item::before,
  body[class*="page-"] .infra-split-grid::before {
    display: none;
  }


  /* --------------------------------------------------------------------------
     B. I divisori grigi: via bordo e rientro
     -------------------------------------------------------------------------- */

  body[class*="page-"] .home-service-item,
  body[class*="page-"] .infra-environment-item,
  body[class*="page-"] .contact-direct-item,
  body[class*="page-"] .contact-location,
  body[class*="page-"] .contact-request-item,
  body[class*="page-"] .filemaker-position-item,
  body[class*="page-"] .applicativi-technology-item,
  body[class*="page-"] .hosting-included-item {
    border-left: 0;
    padding-left: 0;
  }


  /* --------------------------------------------------------------------------
     C. Gli accenti azzurri restano, ma con un rientro da mobile
        16 px bastano a staccare il testo dalla barretta senza mangiare riga.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .about-continuity-node,
  body[class*="page-"] .about-panel-card,
  body[class*="page-"] .analisi-intro-card,
  body[class*="page-"] .analisi-form-note,
  body[class*="page-"] .analisi-step-card,
  body[class*="page-"] .analisi-target-item,
  body[class*="page-"] .analisi-form,
  body[class*="page-"] .hosting-position-point,
  body[class*="page-"] .filemaker-difference-text {
    padding-left: 16px;
  }
}


/* ============================================================================
   VERIFICA
   ----------------------------------------------------------------------------
   In console, a 375 px, su ogni pagina — deve restituire un array vuoto:

       [...document.querySelectorAll('*')].filter(el => {
         const cs = getComputedStyle(el);
         return parseFloat(cs.borderLeftWidth) > 0 &&
                el.getBoundingClientRect().height > 60 &&
                parseFloat(cs.paddingLeft) > 20;
       }).map(el => el.className)

   E per le linee verticali:

       [...document.querySelectorAll('*')].filter(el => {
         const b = getComputedStyle(el, '::before');
         return b.content !== 'none' &&
                parseFloat(b.width) > 0 && parseFloat(b.width) <= 6 &&
                parseFloat(b.height) > 60;
       }).map(el => el.className)

   ----------------------------------------------------------------------------
   NOTA
   Questi separatori non erano rilevabili dai controlli fatti finora: non
   producono sforamento, non generano sovrapposizioni, non toccano il
   contrasto. Sono semplicemente elementi grafici che hanno perso il loro
   significato quando il layout e' passato da due colonne a una.

   Vale la pena cercarli anche in futuro, dopo ogni collasso di griglia: un
   divisorio ha senso solo finche' c'e' qualcosa da dividere.
   ============================================================================ */

/* ============================================================
   PATCH 16 — rientri residui senza bordo
   ------------------------------------------------------------
   Tre contenitori hanno un padding-left dimensionato per la
   colonna desktop ma nessun border-left, quindi erano sfuggiti
   al controllo della PATCH 15 che cercava la coppia bordo+rientro.
   .filemaker-problem-content arrivava a 78px: il 21% di 375.
   ============================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .filemaker-problem-content,
  body[class*="page-"] .applicativi-build-item,
  body[class*="page-"] .infra-sysadmin-col {
    padding-left: 0;
  }
}

/* ============================================================
   PATCH 17 — ripristino delle card
   ------------------------------------------------------------
   Nella PATCH 15 il border-left di questi elementi era stato
   classificato come separatore di colonna. Sbagliato: sono card
   con sfondo, ombra e raggio, e quel bordo era il quarto lato
   della cornice. Il padding-left non faceva spazio al bordo,
   era il padding interno della card.
   Risultato: cornice aperta a sinistra e testo appoggiato al bordo.

   Gli altri elementi della PATCH 15 sono trasparenti e senza
   contorno: per quelli padding-left: 0 resta corretto.
   ============================================================ */

@media (max-width: 820px) {

  body[class*="page-"] .home-service-item {
    border-left: 1px solid rgb(226, 232, 240);
    padding-left: 28px;
  }

  body[class*="page-"] .hosting-included-item {
    border-left: 1px solid rgba(31, 160, 208, .18);
    padding-left: 22px;
  }

  /* niente bordo, ma ha sfondo proprio: serve respiro interno.
     Il valore originale era 78px, eccessivo su 375. */
  body[class*="page-"] .filemaker-problem-content {
    padding-left: 24px;
  }
}

/* ############################################################################
   #                                                                          #
   #   PATCH 18 — pagina hosting                                              #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 17.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PERCHE' HOSTING E' RIMASTA INDIETRO
   ----------------------------------------------------------------------------
   Su questa pagina TUTTE le regole di layout sono scritte con il prefisso
   `.page-hosting`, quindi hanno specificita' 0,2,0. Le regole mobile scritte
   finora usano la sola classe del componente (0,1,0) e perdono ogni confronto.

   Risultato: quattro griglie non hanno mai collassato, pur essendo elencate
   sia nel blocco mobile sia nella PATCH 1.

     GRIGLIA                     STATO A 375 px
     .hosting-real-items         3 colonne da 8 px      <- illeggibile
     .hosting-position-points    3 colonne da 91 px
     .hosting-fit-grid           2 colonne da 123 px
     .hosting-real-grid          2 colonne (168 + 186)

   In piu' due `min-height: 420px` sovrapposti — uno sull'immagine, uno sul
   testo — che con la griglia non collassata portano la sezione
   `.hosting-real` a 3.158 px: un terzo dell'intera pagina.

   E una linea verticale `.hosting-fit-grid::before` (`left: 50%; width: 1px`),
   il divisorio fra le due colonne, rimasta in mezzo al contenuto.

   Tutte le regole qui sotto usano `body[class*="page-"]` (0,3,1) per stare
   sopra a `.page-hosting` senza ricorrere a !important.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. Le quattro griglie collassano davvero
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hosting-position-points,
  body[class*="page-"] .hosting-real-grid,
  body[class*="page-"] .hosting-real-items,
  body[class*="page-"] .hosting-fit-grid,
  body[class*="page-"] .hosting-growth-inner,
  body[class*="page-"] .hosting-managed-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 20px;
  }


  /* --------------------------------------------------------------------------
     B. Il divisorio fra le due colonne
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hosting-fit-grid::before {
    display: none;
  }


  /* --------------------------------------------------------------------------
     C. Le due altezze minime da 420 px
        Sul desktop servono a tenere immagine e testo della stessa altezza,
        affiancati. Impilati non hanno piu' senso: l'immagine diventa una
        fascia, il testo si adatta al proprio contenuto.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hosting-real-media,
  body[class*="page-"] .hosting-real-media img {
    min-height: 0;
    height: 200px;
    object-fit: cover;
  }

  body[class*="page-"] .hosting-real-content {
    min-height: 0;
    height: auto;
    padding: 24px;              /* era 34px 64px 32px */
  }


  /* --------------------------------------------------------------------------
     D. Gli altri padding tarati sulla colonna desktop
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hosting-box,
  body[class*="page-"] .hosting-managed-card,
  body[class*="page-"] .hosting-offer {
    padding-left: 20px;
    padding-right: 20px;
  }
}


/* ============================================================================
   NOTA — QUESTO CASO VALE PER TUTTO IL CSS
   ----------------------------------------------------------------------------
   E' la quinta volta in questa serie che una regola mobile "non funziona" e la
   causa e' la specificita'. Il sito usa due convenzioni diverse:

       .hosting-real-grid            componente puro          0,1,0
       .page-hosting .hosting-real-grid   componente per-pagina    0,2,0

   Le due convivono nello stesso foglio, e la seconda vince sempre.

   AL CONSOLIDAMENTO conviene sceglierne una sola. La piu' pulita e' la prima:
   il prefisso di pagina serve solo quando lo stesso componente deve apparire
   diverso su pagine diverse, che qui non succede quasi mai. Uniformando, le
   media query tornano a funzionare con la sola classe del componente e sparisce
   tutta questa categoria di problemi.

   Nel frattempo, la regola pratica: se una regola mobile sembra ignorata,
   cercare chi la sta battendo PRIMA di riscriverla.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 19 — pagina FileMaker                                            #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 18.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PRIMA: UN ERRORE DI CALCOLO NELLE PATCH PRECEDENTI
   ----------------------------------------------------------------------------
   Ho usato piu' volte `body[class*="page-"] .componente` dandogli specificita'
   0,3,1. E' sbagliato: vale 0,2,1.

       body            tipo        0,0,1
       [class*="..."]  attributo   0,1,0
       .componente     classe      0,1,0
       ------------------------------------
       totale                      0,2,1

   Contro `.page-filemaker .hero-filemaker .hero-inner`, che vale 0,3,0, quel
   selettore PERDE. Su applicativi funzionava solo perche' li' la regola
   originale e' piu' corta (`.hero-applicativi .hero-inner`, 0,2,0).

   Serve una classe in piu' nel percorso:

       body[class*="page-"] .hero .hero-inner    ->  0,3,1   vince

   Le regole di questa patch usano quella forma.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. L'hero-inner di FileMaker era rimasto a due colonne
        (115 px + 127 px), da cui un hero di 994 px
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero .hero-inner,
  body[class*="page-"] .hero.hero-filemaker .hero-inner {
    display: block;
  }


  /* --------------------------------------------------------------------------
     B. Le griglie della sezione "caso"
          .filemaker-case-steps      3 colonne da 90 px
          .filemaker-case-benefits   4 colonne da 63 px  <- illeggibili
     -------------------------------------------------------------------------- */

  body[class*="page-"] .filemaker-case .filemaker-case-steps,
  body[class*="page-"] .filemaker-case .filemaker-case-benefits,
  body[class*="page-"] .filemaker-case-steps,
  body[class*="page-"] .filemaker-case-benefits {
    grid-template-columns: minmax(0, 1fr);
    gap: 16px;
  }


  /* --------------------------------------------------------------------------
     C. Le altezze minime del desktop
        Servono a tenere allineate le colonne affiancate. Impilate, diventano
        solo spazio vuoto: la sezione .filemaker-problem misura 1.659 px.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .filemaker-problem .filemaker-problem-grid,
  body[class*="page-"] .filemaker-case .filemaker-case-grid,
  body[class*="page-"] .filemaker-difference {
    min-height: 0;
    height: auto;
  }

  body[class*="page-"] .filemaker-problem .filemaker-problem-media img,
  body[class*="page-"] .filemaker-problem-media img {
    min-height: 0;
    height: 200px;
    object-fit: cover;
  }


  /* --------------------------------------------------------------------------
     D. Padding tarati sulla colonna desktop
        .filemaker-problem-content aveva 78 px a destra
     -------------------------------------------------------------------------- */

  body[class*="page-"] .filemaker-problem .filemaker-problem-content,
  body[class*="page-"] .filemaker-problem-content {
    padding-left: 20px;
    padding-right: 20px;
  }

  body[class*="page-"] .filemaker-position .filemaker-position-item,
  body[class*="page-"] .filemaker-position-item {
    padding-right: 0;
  }


  /* --------------------------------------------------------------------------
     E. Card rimaste senza respiro interno
        Stesso caso della PATCH 17: hanno sfondo o bordo propri, quindi il
        padding orizzontale e' contenuto, non rientro.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .filemaker-problem-point,
  body[class*="page-"] .filemaker-case-benefits {
    padding-left: 18px;
    padding-right: 18px;
  }

  body[class*="page-"] .filemaker-difference .filemaker-difference-text,
  body[class*="page-"] .filemaker-difference-text {
    padding-left: 18px;
    padding-right: 18px;
  }
}


/* ============================================================================
   NOTA PER IL CONSOLIDAMENTO
   ----------------------------------------------------------------------------
   Il problema di fondo resta quello segnalato nella PATCH 18: il foglio usa
   due convenzioni (`.componente` e `.page-x .componente`) e la seconda vince
   sempre. Ogni pagina ha la sua profondita' di annidamento, quindi non esiste
   un singolo prefisso che basti per tutte: qui servivano tre classi, su
   applicativi ne bastavano due.

   Uniformare la convenzione al consolidamento elimina questa categoria di
   problemi. Finche' convivono, ogni regola mobile va verificata contro la
   specificita' reale della regola che deve sovrascrivere — non stimata.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 20 — pagina "Analizziamo il tuo caso"                            #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 19.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   QUESTA E' LA PAGINA PIU' IMPORTANTE DEL SITO
   ----------------------------------------------------------------------------
   Contiene l'unico form di conversione. Un problema qui non e' estetico: e'
   una richiesta di contatto che non arriva.

   PROBLEMA PRINCIPALE
   `.form-row` e' ancora una griglia a DUE COLONNE da 116 px l'una. Due campi
   affiancati larghi 116 px su un telefono sono di fatto inutilizzabili.
   Era previsto fin dal blocco mobile iniziale, ma la regola non ha mai avuto
   effetto: specificita' insufficiente (vedi PATCH 19).

   ALTRI PROBLEMI
   - Padding asimmetrici lasciati dalle patch precedenti: 16 px a sinistra
     contro 36-46 a destra. Il testo risulta spostato.
       .analisi-form         16 / 46
       .analisi-intro-card   16 / 40
       .analisi-step-card    16 / 36
       .analisi-target-item  16 / 36
   - `.analisi-step-card` ha `min-height: 270px`: spazio vuoto sotto contenuti
     brevi.
   - I checkbox misurano 18 px. Non e' un errore di layout, ma su touch sono
     piccoli da centrare.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     A. I CAMPI DEL FORM, UNO PER RIGA
     -------------------------------------------------------------------------- */

  body[class*="page-"] .analisi-form .form-row,
  body[class*="page-"] .analisi-form-section .form-row,
  body[class*="page-"] form .form-row {
    display: block;
  }

  body[class*="page-"] .analisi-form .form-field,
  body[class*="page-"] form .form-field {
    width: 100%;
    max-width: 100%;
    margin-bottom: 16px;
  }

  /* font-size 16px: sotto questa soglia iOS ingrandisce la pagina al focus
     del campo, e l'utente si ritrova il layout zoomato */
  body[class*="page-"] .analisi-form input,
  body[class*="page-"] .analisi-form select,
  body[class*="page-"] .analisi-form textarea,
  body[class*="page-"] form input[type="text"],
  body[class*="page-"] form input[type="email"],
  body[class*="page-"] form input[type="tel"],
  body[class*="page-"] form select,
  body[class*="page-"] form textarea {
    width: 100%;
    max-width: 100%;
    box-sizing: border-box;
    font-size: 16px;
    min-height: 46px;
  }

  body[class*="page-"] .analisi-form textarea {
    min-height: 120px;
  }


  /* --------------------------------------------------------------------------
     B. CHECKBOX PIU' FACILI DA CENTRARE
        Il box passa da 18 a 22 px. La label resta cliccabile per intero,
        quindi l'area utile e' comunque tutta la riga.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .analisi-form input[type="checkbox"],
  body[class*="page-"] form input[type="checkbox"] {
    width: 22px;
    height: 22px;
    min-height: 0;
    flex: 0 0 auto;
  }

  body[class*="page-"] .form-privacy-check,
  body[class*="page-"] label.form-privacy-check {
    grid-template-columns: 22px minmax(0, 1fr);
    gap: 12px;
    align-items: start;
    padding: 6px 0;
  }


  /* --------------------------------------------------------------------------
     C. PADDING SIMMETRICI
        Le patch precedenti avevano corretto solo il lato sinistro.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .analisi-intro .analisi-intro-card,
  body[class*="page-"] .analisi-form-section .analisi-form,
  body[class*="page-"] .analisi-steps .analisi-step-card,
  body[class*="page-"] .analisi-target .analisi-target-item,
  body[class*="page-"] .analisi-intro-card,
  body[class*="page-"] .analisi-form,
  body[class*="page-"] .analisi-step-card,
  body[class*="page-"] .analisi-target-item,
  body[class*="page-"] .analisi-form-note {
    padding-left: 18px;
    padding-right: 18px;
  }


  /* --------------------------------------------------------------------------
     D. Altezza minima delle schede passo
     -------------------------------------------------------------------------- */

  body[class*="page-"] .analisi-steps .analisi-step-card,
  body[class*="page-"] .analisi-step-card {
    min-height: 0;
  }


  /* --------------------------------------------------------------------------
     E. Il pulsante di invio a piena larghezza
        E' l'azione finale della pagina: deve essere impossibile mancarlo.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .analisi-form button,
  body[class*="page-"] .analisi-form [type="submit"] {
    width: 100%;
    min-height: 50px;
    font-size: 17px;
  }
}


/* ============================================================================
   DA VERIFICARE A MANO DOPO L'APPLICAZIONE
   ----------------------------------------------------------------------------
   Il CSS non puo' dire se il form FUNZIONA. Su questa pagina conviene provarlo
   davvero da telefono:

     - compilare e inviare, controllando che la mail arrivi
     - verificare che il campo non faccia zoomare la pagina al focus
       (e' quello che il font-size 16px previene)
     - controllare che Turnstile si veda per intero e non sbordi
     - verificare che i messaggi di errore, se ci sono, siano leggibili

   L'invio era gia' stato testato in precedenza, ma da desktop.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 21 — gli spostamenti di composizione del desktop                 #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 20.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   COSA SONO
   ----------------------------------------------------------------------------
   Il foglio usa `transform: translate()` per rifinire la composizione del
   desktop: alzare un blocco di qualche pixel, allineare due colonne, far
   sporgere un elemento. Sono aggiustamenti visivi, non struttura.

   Su mobile quegli spostamenti restano, ma il layout sotto e' cambiato:

     .hero-analizziamo .hero-inner              translateX(-220px)
     .page-chi-siamo   ... > div:first-child    translateY(-48px)
     .page-infrastruttura ... > div:first-child translateY(-48px)
     .page-hosting     ... > div:first-child    translateY(-32px)
     .page-contatti .contact-hero-inner         translateY(-32px)
     .hero-filemaker   ... > div:first-child    translateY(-22px)
     .hero-applicativi ... > div:first-child    translateY(-8px)
     .hosting-growth-chart                      translateY(18px)
     .applicativi-web-system-media img          translateX(16px)
     .applicativi-technology-filemaker-content  translateY(-18px)
     .filemaker-difference-mark                 translateY(-24px)

   DUE CONSEGUENZE

   1. Su "Analizziamo il tuo caso" il translateX(-220px) porta titolo e testo
      dell'hero FUORI dallo schermo a sinistra: il blocco va da -196 a 127 px
      su un viewport di 375. E' il caso piu' grave.

   2. I translateY spiegano i vuoti inseguiti nelle PATCH 11, 13 e 14: un
      blocco spostato in alto di 48 px lascia 48 px vuoti sotto di se'. I
      "48 px misteriosi" sotto il testo di chi-siamo e infrastruttura erano
      esattamente questo, non padding o celle fantasma della griglia.

   ----------------------------------------------------------------------------
   NOTA: un `transform` non modifica lo spazio occupato nel flusso. L'elemento
   viene disegnato altrove ma continua a riservare la sua posizione originale:
   per questo il buco resta dove il blocco "era", ed e' invisibile a qualsiasi
   controllo su padding, margini e altezze.
   ============================================================================ */


@media (max-width: 820px) {

  /* --------------------------------------------------------------------------
     Gli spostamenti di composizione si annullano.
     Su una colonna sola non hanno piu' niente da allineare.
     -------------------------------------------------------------------------- */

  body[class*="page-"] .hero .hero-inner,
  body[class*="page-"] .hero .hero-inner > div:first-child,
  body[class*="page-"] .contact-hero .contact-hero-inner,
  body[class*="page-"] .hero-analizziamo .hero-inner,
  body[class*="page-"] .hosting-growth-chart,
  body[class*="page-"] .applicativi-web-system-media img,
  body[class*="page-"] .applicativi-technology-filemaker-content,
  body[class*="page-"] .filemaker-difference-mark {
    transform: none;
  }
}


/* ============================================================================
   COSA NON VIENE TOCCATO — e perche'
   ----------------------------------------------------------------------------
   Restano attivi i `transform` che servono su mobile:

     .hero .hero-bg img            scale(1.7)   inquadratura (PATCH 12)
     .hero-infrastruttura ...      scale(1.25)
     .contact-hero-bg img          scale(2.1)
     .nav-burger span              rotate()     animazione del pulsante menu
     .applicativi-technology-filemaker-media img
                                   perspective + rotate: effetto 3D voluto
                                   sull'immagine, non uno spostamento

   La differenza e' che questi trasformano l'elemento su se' stesso, mentre
   quelli rimossi lo spostano rispetto al layout.

   ----------------------------------------------------------------------------
   DA CONTROLLARE DOPO L'APPLICAZIONE

   In console, a 375 px, su ogni pagina — deve tornare un array vuoto:

       [...document.querySelectorAll('*')].filter(el => {
         const t = getComputedStyle(el).transform;
         if (t === 'none') return false;
         const m = t.match(/matrix\(1, 0, 0, 1, (-?[\d.]+), (-?[\d.]+)\)/);
         return m && (Math.abs(+m[1]) > 4 || Math.abs(+m[2]) > 4);
       }).map(el => el.className + ' ' + getComputedStyle(el).transform)

   Cerca le sole traslazioni (matrice identita' con offset), quindi ignora
   correttamente scale e rotazioni.
   ============================================================================ */


/* ############################################################################
   #                                                                          #
   #   PATCH 23 — scroll su "Analizziamo il tuo caso": la causa               #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 22.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   IL PROBLEMA — e perche' nessun controllo l'aveva visto

   Il colpevole non e' Turnstile. E' il cerchio decorativo della card
   "Mettiamo ordine nelle informazioni":

       .analisi-intro-card::before { position:absolute; top:-28px; right:-28px;
                                     width:110px; height:110px; }

   La card vive dentro `.container`, che su mobile ha 28 px di padding laterale.
   Il `right: -28px` del cerchio annulla ESATTAMENTE quel padding: il bordo
   destro del cerchio cade sul bordo del viewport, con margine ZERO.

   Misurato in Chromium, emulazione mobile, su nove combinazioni
   larghezza/densita':

       375 @2x · 375 @3x · 390 @3x · 393 @3x · 414 @2x
       428 @3x · 430 @3x · 360 @3x · 412 @2.625x

   eccedenza = 0.000 px su TUTTE. Non "poco": zero netto, a ogni larghezza,
   perche' i due 28 px si cancellano per costruzione.

   E' una condizione di equilibrio instabile. Basta una frazione di pixel —
   arrotondamento a densita' 3x, la larghezza non intera del viewport di
   Chrome iOS, il rimbalzo elastico dello scroll — e il cerchio passa oltre il
   bordo. Sul dispositivo la frazione c'e'; nell'emulatore a larghezze intere
   no.

   TRE MOTIVI INDIPENDENTI PER CUI GLI SCRIPT NON POTEVANO TROVARLO

   1. Un `::before` NON compare in `document.querySelectorAll('*')` e non ha
      un `getBoundingClientRect()` proprio. Ogni ciclo "elementi che sforano"
      e' cieco ai pseudo-elementi. Per questo tutte le verifiche
      elemento-per-elemento tornavano vuote.

   2. `scrollWidth === clientWidth` era CORRETTO: con eccedenza 0 la pagina
      non sfora davvero, alle larghezze intere provate.

   3. Nascondere una sezione alla volta non isola un difetto che si manifesta
      solo sul dispositivo: nell'emulatore, con o senza quella sezione, la
      misura e' identica.

   La conferma e' causale, non indiziaria: disattivando il solo `::before`,
   `.analisi-intro-card` passa da scrollWidth 345 a 317 (= clientWidth) e
   `.analisi-intro-inner` da 346 a 319. I 27-28 px attribuiti a Turnstile
   nella PATCH 22 sono questi.

   ----------------------------------------------------------------------------
   SECONDO DIFETTO, STESSA PAGINA — l'honeypot

       .form-hp { position:absolute; left:-9999px; width:1px; overflow:hidden; }

   Il campo esca del form. L'`input` dentro resta largo 36 px e il box finisce
   a x = -9999. In LTR lo sforamento a SINISTRA non entra mai in `scrollWidth`
   e non e' raggiungibile scrollando: e' invisibile per costruzione a
   qualunque misura fatta finora, ed e' l'unico elemento del sito posizionato
   fuori schermo. Va sostituito con la tecnica sr-only, che occupa spazio zero
   senza creare un box fuori dal viewport.
   ============================================================================ */


/* ----------------------------------------------------------------------------
   A — Il cerchio decorativo rientra nella card (solo mobile)

   Su desktop la card sta in una griglia a due colonne con spazio in
   abbondanza: li' il cerchio deve continuare a sporgere, quindi la regola e'
   confinata sotto 820 px. `overflow: hidden` e' la cintura di sicurezza per
   qualunque altro elemento decorativo che venisse aggiunto alla card.
   ---------------------------------------------------------------------------- */

@media (max-width: 820px) {

  body[class*="page-"] .analisi-intro-card {
    overflow: hidden;
  }

  body[class*="page-"] .analisi-intro-card::before {
    top: 0;
    right: 0;
  }
}


/* ----------------------------------------------------------------------------
   B — Honeypot: da "fuori schermo" a "spazio zero"

   Nessuna media query: il difetto e' identico su desktop e mobile.
   `clip-path: inset(50%)` lo rende invisibile mantenendolo compilabile dai
   bot — che e' esattamente il suo scopo. Resta escluso dal tab (tabindex=-1
   nell'HTML) e dai lettori di schermo.
   ---------------------------------------------------------------------------- */

.form-hp {
  position: absolute;
  left: auto;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}


/* ============================================================================
   C — DA FARE NELL'HTML (non qui)

   In analizziamo-il-tuo-caso.php, riga 201, il div e' ancora:

       <div class="cf-turnstile" data-sitekey="0x4AAAAAADK21CcGLQsJPj_I"></div>

   Va portato a:

       <div class="cf-turnstile" data-sitekey="0x4AAAAAADK21CcGLQsJPj_I"
            data-size="compact"></div>

   Il widget passa da 300 a 150 px e entra ovunque senza trucchi. A quel punto
   la PATCH 22 va RIMOSSA per intero: il suo `transform: scale(.84)` con
   `height: 58px; overflow: hidden` sotto i 400 px rimpicciolisce il widget
   proprio sull'ultimo passaggio prima dell'invio, e se Cloudflare presenta
   una sfida interattiva l'altezza fissa la taglia.
   ============================================================================ */


/* ============================================================================
   VERIFICA — lo script che avrebbe trovato tutto questo

   Da incollare in console, in emulazione mobile, su ogni pagina. A differenza
   dei controlli precedenti guarda anche i pseudo-elementi, i box a sinistra e
   il margine residuo, non solo lo sforamento gia' avvenuto.

   (() => {
     const cw = document.documentElement.clientWidth, out = [];
     for (const el of document.querySelectorAll('*')) {
       const rc = el.getBoundingClientRect();
       const n = el.tagName.toLowerCase() +
                 (el.className && typeof el.className === 'string'
                   ? '.' + el.className.trim().split(/\s+/).join('.') : '');
       for (const w of ['::before', '::after']) {
         const s = getComputedStyle(el, w);
         if (s.content === 'none' || s.display === 'none') continue;
         if (s.position !== 'absolute' && s.position !== 'fixed') continue;
         const r = parseFloat(s.right), l = parseFloat(s.left), pw = parseFloat(s.width);
         const bordo = !isNaN(r) ? rc.right - r
                     : (!isNaN(l) && !isNaN(pw) ? rc.left + l + pw : null);
         if (bordo !== null && cw - bordo <= 2)
           out.push(['PSEUDO A FILO', n + w, 'margine ' + (cw - bordo).toFixed(2) + 'px']);
       }
       if (rc.left < -1 && rc.width > 0) out.push(['BOX A SINISTRA', n, Math.round(rc.left)]);
       if (el.scrollWidth > el.clientWidth + 1 && el.clientWidth > 0)
         out.push(['SCROLLER ANNIDATO', n, el.scrollWidth - el.clientWidth]);
     }
     console.table(out);
     return out.length ? out.length + ' rilievi' : 'pulito';
   })()

   Atteso su questa pagina dopo la patch: resta il solo `img` dell'hero a
   sinistra (e' lo `scale(1.7)` della PATCH 12, ritagliato da
   `.hero { overflow: hidden }`, corretto cosi') e la coppia `.form-hp` /
   `label` come scroller da 1 px, inerte: `overflow: hidden` non e'
   trascinabile al tocco.

   ----------------------------------------------------------------------------
   SUL DISPOSITIVO

   Applicata la patch, se lo scroll su iPhone persiste NON serve rimettere
   `diagnostica-scroll.html`: quel blocco misura gli elementi, e abbiamo
   appena visto che gli elementi non sono il posto dove guardare. Serve
   invece il collegamento cablato — iPhone al Mac, Safari > Sviluppo >
   iPhone — e leggere `document.documentElement.scrollWidth` e
   `window.visualViewport.width` sulla pagina vera, sul dispositivo vero.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 24 — "Quando ha senso contattarci": il blocco che resta fermo    #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 23.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   IL PROBLEMA

   Riga 5327 del foglio:

       .analisi-target-content { position: sticky; top: 120px; }

   Su desktop e' voluto e funziona: `.analisi-target-inner` e' una griglia a due
   colonne (`minmax(0,480px) 1fr`), il titolo resta agganciato a sinistra mentre
   i tre item scorrono a destra. E' il motivo per cui esiste la regola.

   A 820 px la griglia collassa a colonna singola (riga 6739). Lo sticky pero'
   resta: in tutto il foglio ci sono DUE soli `position: sticky` — la navbar e
   questo — e nessuna media query annulla il secondo. Non ha mai avuto un
   comportamento mobile.

   Su una colonna sola lo sticky non ha piu' niente accanto a cui restare fermo:
   si incolla a 120 px dall'alto e i tre item gli salgono SOTTO. Non e' scroll
   orizzontale ne' un elemento che sfora: e' un blocco fermo e il resto della
   pagina che gli passa dietro.

   PERCHE' NON SI POTEVA TROVARE MISURANDO IL LAYOUT

   Un elemento sticky non sfora niente. Non allarga il documento, non allunga la
   pagina, non esce dal viewport. `scrollWidth`, `clientWidth`, box model,
   contenitori con overflow proprio: tutto corretto, perche' non c'e' nessun
   difetto di dimensione. Il difetto e' nel COMPORTAMENTO ALLO SCROLL, e si vede
   solo confrontando due misure prese a scroll diversi — cosa che nessuna
   verifica statica fa.

   E' anche la ragione del "solo su questa pagina": e' l'unico blocco sticky di
   contenuto del sito.

   MISURA, sulla pagina reale a 375 px

       position calcolato        sticky, top:120px     ->  static
       blocco dopo 300px scroll  inchiodato a 116px    ->  scorre
       sovrapposizione con la
       lista dei tre item        +942 px               ->  -24 px (nessuna)
   ============================================================================ */


@media (max-width: 820px) {

  /* Stessa soglia a cui collassa `.analisi-target-inner`: sopra gli 820 px la
     griglia ha due colonne e lo sticky serve, sotto no. */

  body[class*="page-"] .analisi-target-content {
    position: static;
    top: auto;
  }
}


/* ============================================================================
   VERIFICA

   Sul telefono: scorrere fino a "Quando ha senso contattarci". Il titolo e il
   paragrafo devono scorrere via insieme ai tre item, senza restare appesi in
   alto.

   In console, in emulazione mobile:

       getComputedStyle(document.querySelector('.analisi-target-content')).position
       // deve dare "static"

   Controllo generale, da rifare su ogni pagina — cerca blocchi sticky che su
   una colonna sola non hanno piu' senso:

       [...document.querySelectorAll('*')]
         .filter(e => getComputedStyle(e).position === 'sticky')
         .map(e => e.tagName.toLowerCase() + '.' + e.className)

   Atteso: la sola `nav`. Qualunque altra cosa compaia va valutata allo stesso
   modo.

   ----------------------------------------------------------------------------
   NOTA PER IL CONSOLIDAMENTO

   Questa regola va tenuta ACCANTO a `.analisi-target-content` quando si fondono
   blocco mobile e patch, non in coda al file: desktop e mobile dello stesso
   componente devono stare insieme, altrimenti la prossima volta che si tocca
   quel blocco lo sticky torna a essere una regola senza contesto — che e'
   esattamente come e' nato il problema.
   ============================================================================ */

/* ############################################################################
   #                                                                          #
   #   PATCH 25 — uniformita' delle spaziature hero                           #
   #                                                                          #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 24.                   #
   #                                                                          #
   ############################################################################ */

/* ============================================================================
   PREMESSA — la regola unica pianificata il 04/09 NON serve piu'

   Il piano di allora era: azzerare tutti i margini interni dell'hero e
   ridefinirli, per rimediare a sette valori diversi (18/28/35/42/50/77 px sopra
   il titolo). Rimisurato oggi sulla pagina reale a 375 px, dopo le patch 15-24:

       hosting · filemaker · applicativi · analizziamo    50 px
       contatti                                           50 px
       chi-siamo                                          83 px
       infrastruttura                                    125 px
       index (hero scura, trattamento proprio)            50 px

   Sei pagine su otto sono gia' identiche. Riscrivere da zero i margini di tutte
   le hero per correggerne due significherebbe rimettere in gioco sei pagine che
   funzionano. Si correggono le due, con le loro cause.

   LE DUE CAUSE

   1. EYEBROW VUOTO — chi-siamo e infrastruttura

      <div class="eyebrow" style="color:rgba(255,255,255,.7);"></div>
      <div class="eyebrow"></div>

      Div senza testo e senza figli (`:empty` li intercetta entrambi), ma con
      `display: inline-flex` e `margin-bottom: 18px`: spingono giu' il titolo di
      33 px senza mostrare nulla.

      NON e' un difetto mobile: quel markup sposta il titolo anche su desktop.
      La correzione giusta e' toglierlo dall'HTML (vedi sotto); la regola CSS
      qui e' la rete di sicurezza.

   2. `margin-top: 42px` SULL'H1 DI INFRASTRUTTURA — riga 1517

      .page-infrastruttura .hero h1 { margin-top: 42px; ... }

      Valore di composizione desktop, mai neutralizzato su mobile. E' il resto
      dei 125 px: 50 (base) + 33 (eyebrow) + 42 (questo).

   VERIFICATO IN PAGINA: applicando le due regole, chi-siamo passa da 83 a 50 e
   infrastruttura da 125 a 50. Esattamente il valore delle altre sei.
   ============================================================================ */


@media (max-width: 820px) {

  /* Un eyebrow senza contenuto non deve occupare spazio. `:empty` colpisce solo
     i div effettivamente vuoti: se domani ricevono un testo, la regola smette da
     sola di applicarsi e l'eyebrow torna visibile. */

  body[class*="page-"] .hero .eyebrow:empty {
    display: none;
  }


  /* Gli scostamenti verticali di composizione dell'h1 non servono su una
     colonna sola. Stessa logica della PATCH 21 sui `transform`. */

  body[class*="page-"] .hero h1 {
    margin-top: 0;
  }
}


/* ============================================================================
   DA FARE NELL'HTML — la correzione vera dell'eyebrow

   In `chi-siamo.php` e `infrastruttura-cloud.php`, dentro l'hero, va eliminato
   il div vuoto:

       <div class="eyebrow" style="color:rgba(255,255,255,.7);"></div>   (chi-siamo)
       <div class="eyebrow"></div>                                       (infrastruttura)

   Toglierli sistema anche il desktop, dove oggi il titolo e' 33 px piu' in
   basso del dovuto su quelle due pagine. La regola `:empty` qui sopra puo'
   restare: non fa danno e protegge dal caso che ricompaia.
   ============================================================================ */


/* ============================================================================
   APERTO — spazio fra titolo e sottotitolo (NON incluso in questa patch)

   Misurato, `margin-bottom` dell'h1 sulle otto pagine:

       contatti · analizziamo         0 px
       applicativi                   20 px
       hosting · index               22 px
       filemaker                     30 px
       chi-siamo                     34 px
       infrastruttura                36 px

   Da 0 a 36 px: e' la disomogeneita' che resta dopo questa patch. Non l'ho
   uniformata perche' e' una scelta di resa visiva, non un difetto: toccarla
   cambia l'aspetto di tutte e otto le hero, comprese le sei gia' a posto.

   Se si decide di uniformarla, basta scegliere un valore e togliere il commento
   qui sotto. 24 px e' la mediana dei valori attuali, quindi lo scostamento
   massimo da com'e' oggi resta contenuto.

   @media (max-width: 820px) {
     body[class*="page-"] .hero h1 { margin-bottom: 24px; }
   }

   Da valutare guardando le pagine, non i numeri: contatti e analizziamo oggi
   sono a 0 e passerebbero a 24, che e' il cambiamento piu' visibile.
   ============================================================================ */


/* ============================================================================
   VERIFICA

   In console, in emulazione mobile, su ciascuna pagina — deve dare 50:

       (() => {
         const h = document.querySelector('.hero, .contact-hero');
         const b = h.querySelector('.hero-bg, picture, img').getBoundingClientRect();
         return +(h.querySelector('h1').getBoundingClientRect().top - b.bottom).toFixed(1);
       })()

   Atteso: 50 su tutte e otto. La home resta a 50 con il suo trattamento
   proprio (immagine non separata dal testo, overlay scuro della PATCH 3).
   ============================================================================ */

/* ############################################################################
   #   PAGINE 404 / 410 — stile minimo                                       #
   #   Va incollato IN FONDO a style.css, DOPO la PATCH 25.                  #
   ############################################################################ */

/* Usa i token e i componenti esistenti: nessun colore, font o spaziatura
   inventati. Le due pagine non hanno hero, quindi serve solo il respiro
   verticale che l'hero darebbe. */

.errore-section {
  background: var(--white);
  padding: 96px 0 104px;
}

.errore-inner {
  max-width: 720px;
  margin: 0 auto;
}

.errore-code {
  display: block;
  margin: 0 0 18px;
  font-family: var(--f-title);
  font-size: 72px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -.04em;
  color: var(--vp);
}

.errore-inner h1 {
  margin: 0 0 22px;
  font-size: 46px;
  color: var(--text);
}

.errore-sub {
  margin: 0 0 36px;
  font-family: var(--f-body);
  font-size: 19px;
  line-height: 1.6;
  color: var(--muted);
}

.errore-links {
  margin: 0 0 56px;
}

.errore-mappa {
  padding-top: 34px;
  border-top: 1px solid var(--border);
}

.errore-mappa h2 {
  margin: 0 0 18px;
  font-family: var(--f-title);
  font-size: 19px;
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--muted);
}

.errore-mappa ul {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px 28px;
  margin: 0 0 36px;
  padding: 0;
  list-style: none;
}

.errore-mappa a {
  font-family: var(--f-body);
  font-size: 17px;
  font-weight: 500;
  color: var(--vp);
  transition: color .2s ease;
}

.errore-mappa a:hover { color: var(--vd); }

.errore-nota {
  margin: 0;
  font-family: var(--f-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--muted);
}

.errore-nota a {
  color: var(--vp);
  font-weight: 600;
}

/* --------------------------------------------------------------------------
   Mobile — stessa soglia degli altri componenti
   -------------------------------------------------------------------------- */

@media (max-width: 820px) {

  body[class*="page-"] .errore-section {
    padding: 56px 0 64px;
  }

  body[class*="page-"] .errore-code {
    font-size: 56px;
  }

  body[class*="page-"] .errore-inner h1 {
    font-size: 30px;   /* stesso valore delle altre h1 su mobile */
  }

  body[class*="page-"] .errore-mappa ul {
    grid-template-columns: minmax(0, 1fr);
  }
}