/* ==========================================================================
   FINAL-RENEWAL-2026-07-05 — Design system "Electronic Solution"
   ==========================================================================
   File nuovo del tema child. Caricato DOPO style.css del child (vedi
   functions.php, handle: generatepress-child-renewal).

   PRINCIPI
   - Tutte le classi nuove sono namespaced `es-*`: non collidono con il CSS
     esistente nel Customizer né con GeneratePress/plugin.
   - Gli unici selettori non-namespaced toccati sono VERIFICATI nei sorgenti
     locali: GeneratePress 3.6.1 (a.generate-back-to-top, .entry-content),
     Contact Form 7 (.wpcf7*). Ogni blocco è marcato e rollbackabile
     eliminando il blocco stesso.
   - Palette: blu profondo + oro sobrio (corporate tecnico premium).
   - Font: quelli già registrati dal sito via plugin custom-fonts
     ('manrope', 'sora', 'rajdhani') — nessun font esterno aggiunto.
   - Mobile-first, niente altezze fisse fragili, niente animazioni pesanti.

   INDICE
   01. Variabili design system
   02. Fix difensivi globali (overflow, media fluide, wrapping)
   03. Accessibilità (focus-visible, reduced motion, screen-reader)
   04. Sezioni e layout (es-section, es-grid)
   05. Tipografia componenti (es-kicker, es-chip, es-title)
   06. Bottoni e CTA (es-btn)
   07. Hero (es-hero)
   08. Card (es-card)
   09. Checklist (es-checklist)          ← FIX CERTO "Chi siamo"
   10. Callout / note (es-note)
   11. Timeline / metodo (es-steps)
   12. FAQ senza JS (es-faq)
   13. Ecosistema responsive (es-ecosystem) ← FIX CERTO mobile
   14. Media / visual card (es-media)    ← FIX CERTO "Servizi"
   15. Form — Contact Form 7 (verificato nel plugin locale)
   16. Back-to-top — override GP nativo  ← FIX CERTO
   17. Tabelle e overflow utility
   ========================================================================== */


/* --------------------------------------------------------------------------
   01. FINAL-RENEWAL-2026-07-05 — Variabili design system
   -------------------------------------------------------------------------- */
:root {
	/* Blu — struttura e testo su fondi chiari */
	--es-navy-900: #0a1f3c; /* fondi hero / footer scuri */
	--es-navy-800: #0e2a50;
	--es-navy-700: #14406b;
	--es-blue-600: #1b5fa8; /* interattivo: link, bordi focus, bottoni outline (6.5:1 su bianco) */
	--es-blue-500: #2472c8;
	--es-blue-100: #e8f0fa; /* fondi leggeri, icone */

	/* Oro — solo accenti. ATTENZIONE contrasto:
	   --es-gold-500 va usato su fondi scuri (6.8:1 su navy-900) o come decorazione;
	   per TESTO oro su fondo chiaro usare --es-gold-700 (5.8:1 su bianco,
	   5.05:1 su gold-100 — verificato in review accessibilità). */
	--es-gold-500: #c9a227;
	--es-gold-600: #a9861c;
	--es-gold-700: #7d620f;
	--es-gold-100: #f7efd8;

	/* Neutri */
	--es-ink-900: #16232f;  /* testo principale */
	--es-ink-600: #43586c;  /* testo secondario (7.2:1 su bianco) */
	--es-bg: #ffffff;
	--es-bg-alt: #f5f8fc;   /* sezioni alternate */
	--es-border: #dfe7f0;

	/* Spaziature fluide */
	--es-space-xs: clamp(8px, 1vw, 12px);
	--es-space-s: clamp(12px, 1.6vw, 18px);
	--es-space-m: clamp(18px, 2.4vw, 28px);
	--es-space-l: clamp(28px, 4vw, 48px);
	--es-space-xl: clamp(44px, 7vw, 88px);

	/* Raggi e ombre (sobri) */
	--es-radius-s: 8px;
	--es-radius-m: 14px;
	--es-radius-l: 20px;
	--es-shadow-s: 0 1px 2px rgba(10, 31, 60, 0.06), 0 2px 8px rgba(10, 31, 60, 0.06);
	--es-shadow-m: 0 2px 6px rgba(10, 31, 60, 0.07), 0 10px 28px rgba(10, 31, 60, 0.10);

	/* Font registrati dal plugin custom-fonts (fallback di sistema inclusi) */
	--es-font-body: 'manrope', system-ui, -apple-system, 'Segoe UI', sans-serif;
	--es-font-display: 'sora', 'manrope', system-ui, sans-serif;
	--es-font-tech: 'rajdhani', 'manrope', system-ui, sans-serif;

	/* Transizione standard (annullata da prefers-reduced-motion, sez. 03) */
	--es-ease: 180ms ease;
}


/* --------------------------------------------------------------------------
   02. FINAL-RENEWAL-2026-07-05 — Fix difensivi globali
   Scopo: eliminare overflow orizzontali e media che sbordano su mobile.
   Rollback: rimuovere il blocco.
   -------------------------------------------------------------------------- */

/* Guardia anti-scroll orizzontale. `clip` non crea un nuovo scroll container
   (a differenza di `hidden`) ed è più sicuro; fallback per browser datati.
   HOTFIX-2026-07-05: guardia anche su html — le sezioni full-bleed del sito
   (.es .s, width:var(--es-vw,100vw)) col fallback 100vw possono generare
   qualche px di scroll orizzontale a livello viewport (verificato su markup
   reale); il clip su html lo elimina senza rompere position:sticky. */
html,
body {
	overflow-x: hidden;
}
@supports (overflow-x: clip) {
	html,
	body {
		overflow-x: clip;
	}
}

/* Media sempre fluidi dentro il contenuto (immagini, SVG inline, iframe) */
.entry-content img,
.entry-content svg,
.entry-content video,
.entry-content iframe {
	max-width: 100%;
	height: auto;
}
.entry-content iframe {
	/* height:auto schiaccerebbe gli iframe: manteniamo il rapporto tipico */
	aspect-ratio: 16 / 9;
}

/* Parole lunghe (URL, codici, termini tecnici) non devono forare le card.
   break-word è prudente; `anywhere` è usato SOLO dove serve (es-ecosystem). */
.entry-content {
	overflow-wrap: break-word;
}


/* --------------------------------------------------------------------------
   03. FINAL-RENEWAL-2026-07-05 — Accessibilità
   -------------------------------------------------------------------------- */

/* Focus da tastiera sempre visibile e coerente in tutto il sito.
   L'outline segue il border-radius dell'elemento nei browser moderni:
   nessuna alterazione di forma al focus. */
:focus-visible {
	outline: 2px solid var(--es-blue-600);
	outline-offset: 2px;
}

/* Su fondo hero (sempre navy) l'outline blu sparirebbe: qui diventa oro.
   Il back-to-top ha invece il suo focus dedicato nella sezione 16 (l'anello
   con offset cade sul fondo PAGINA, non sul pulsante: l'oro su bianco non
   avrebbe contrasto sufficiente). */
.es-hero :focus-visible {
	outline-color: var(--es-gold-500);
}

/* Riduzione movimento: spegne transizioni/animazioni per chi lo richiede.
   !important necessario: deve vincere su qualunque transizione inline/di plugin. */
@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}
}

/* Testo solo per screen reader (per etichette extra nei blocchi patch) */
.es-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}


/* --------------------------------------------------------------------------
   04. FINAL-RENEWAL-2026-07-05 — Sezioni e griglie
   -------------------------------------------------------------------------- */
.es-section {
	padding-block: var(--es-space-xl);
}
.es-section--alt {
	background: var(--es-bg-alt);
}
.es-section--tight {
	padding-block: var(--es-space-l);
}

/* Intestazione di sezione: kicker + titolo + sottotitolo, centrabili */
.es-section__head {
	max-width: 46em;
	margin-bottom: var(--es-space-l);
}
.es-section__head--center {
	margin-inline: auto;
	text-align: center;
}

/* Griglia responsive di default: nessuna colonna sotto la larghezza minima,
   min() evita overflow quando il contenitore è più stretto di 280px. */
.es-grid {
	display: grid;
	gap: var(--es-space-m);
	grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr));
}
.es-grid > * {
	min-width: 0; /* le celle non forzano mai la griglia oltre il contenitore */
}
/* Varianti a larghezza minima diversa (più card per riga / card più larghe) */
.es-grid--compact {
	grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr));
}
.es-grid--wide {
	grid-template-columns: repeat(auto-fit, minmax(min(340px, 100%), 1fr));
}


/* --------------------------------------------------------------------------
   05. FINAL-RENEWAL-2026-07-05 — Tipografia componenti
   -------------------------------------------------------------------------- */

/* Kicker: la piccola etichetta tecnica sopra i titoli */
.es-kicker {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	font-family: var(--es-font-tech);
	font-size: clamp(0.82rem, 0.8rem + 0.2vw, 0.95rem);
	font-weight: 600;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--es-gold-700);
}
.es-kicker::before {
	content: "";
	width: 1.6em;
	height: 2px;
	background: var(--es-gold-500);
	border-radius: 1px;
}
/* Su fondo scuro l'oro pieno è leggibile (6.8:1) */
.es-hero .es-kicker,
.es-kicker--on-dark {
	color: var(--es-gold-500);
}

/* Chip: pill piccola per tag/tecnologie/settori */
.es-chip {
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	padding: 0.3em 0.85em;
	border: 1px solid var(--es-border);
	border-radius: 999px;
	background: var(--es-bg);
	font-family: var(--es-font-tech);
	font-size: 0.9rem;
	font-weight: 600;
	letter-spacing: 0.04em;
	color: var(--es-navy-700);
	white-space: nowrap;
}
.es-chip--gold {
	border-color: color-mix(in srgb, var(--es-gold-500) 45%, var(--es-border));
	background: var(--es-gold-100);
	color: var(--es-gold-700);
}
.es-chip-row {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}

/* Titoli dei componenti (non tocca gli H1/H2 esistenti fuori dai blocchi es-*) */
.es-title {
	font-family: var(--es-font-display);
	font-weight: 700;
	line-height: 1.15;
	color: var(--es-navy-900);
	margin: 0.35em 0 0.45em;
	font-size: clamp(1.6rem, 1.3rem + 1.8vw, 2.4rem);
}
.es-subtitle {
	color: var(--es-ink-600);
	font-size: clamp(1rem, 0.95rem + 0.35vw, 1.15rem);
	line-height: 1.6;
	margin: 0;
}


/* --------------------------------------------------------------------------
   06. FINAL-RENEWAL-2026-07-05 — Bottoni e CTA
   Touch target ≥ 44px garantito da min-height + padding.
   -------------------------------------------------------------------------- */
.es-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5em;
	min-height: 48px;
	padding: 0.65em 1.5em;
	border: 2px solid transparent;
	border-radius: var(--es-radius-s);
	font-family: var(--es-font-display);
	font-size: 1rem;
	font-weight: 600;
	line-height: 1.2;
	text-decoration: none;
	cursor: pointer;
	transition: background-color var(--es-ease), border-color var(--es-ease),
		color var(--es-ease), box-shadow var(--es-ease);
}
.es-btn:hover {
	text-decoration: none;
}

/* Primario: blu pieno (bianco su blu-600 = 6.5:1) */
.es-btn--primary {
	background: var(--es-blue-600);
	color: #ffffff;
}
.es-btn--primary:hover,
.es-btn--primary:focus {
	background: var(--es-navy-700);
	color: #ffffff;
	box-shadow: var(--es-shadow-s);
}

/* Oro: per la CTA più importante della pagina (navy su oro = 6.8:1) */
.es-btn--gold {
	background: var(--es-gold-500);
	color: var(--es-navy-900);
}
.es-btn--gold:hover,
.es-btn--gold:focus {
	background: var(--es-gold-600);
	color: var(--es-navy-900);
	box-shadow: var(--es-shadow-s);
}

/* Outline: azione secondaria su fondo chiaro */
.es-btn--outline {
	background: transparent;
	border-color: var(--es-blue-600);
	color: var(--es-blue-600);
}
.es-btn--outline:hover,
.es-btn--outline:focus {
	background: var(--es-blue-100);
	color: var(--es-navy-700);
}

/* Ghost su fondo scuro (hero) */
.es-btn--ghost-dark {
	background: rgba(255, 255, 255, 0.06);
	border-color: rgba(255, 255, 255, 0.45);
	color: #ffffff;
}
.es-btn--ghost-dark:hover,
.es-btn--ghost-dark:focus {
	background: rgba(255, 255, 255, 0.14);
	border-color: #ffffff;
	color: #ffffff;
}

/* Riga di CTA: va sempre a capo senza overflow */
.es-cta-row {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	align-items: center;
}
/* Su schermi molto stretti le CTA occupano tutta la riga: più tappabili */
@media (max-width: 480px) {
	.es-cta-row .es-btn {
		flex: 1 1 100%;
	}
}


/* --------------------------------------------------------------------------
   07. FINAL-RENEWAL-2026-07-05 — Hero
   Fondo navy con texture leggera CSS-only (niente immagini obbligatorie,
   niente contenuto dipendente da JS).
   -------------------------------------------------------------------------- */
.es-hero {
	position: relative;
	background:
		radial-gradient(1100px 480px at 85% -10%, rgba(36, 114, 200, 0.28), transparent 60%),
		radial-gradient(700px 380px at -10% 110%, rgba(201, 162, 39, 0.10), transparent 55%),
		linear-gradient(160deg, var(--es-navy-900) 0%, var(--es-navy-800) 55%, var(--es-navy-700) 100%);
	color: #ffffff;
	padding-block: var(--es-space-xl);
	overflow: hidden; /* le decorazioni non devono creare scroll */
}
/* Filo oro alla base: firma visiva sobria */
.es-hero::after {
	content: "";
	position: absolute;
	inset: auto 0 0 0;
	height: 3px;
	background: linear-gradient(90deg, transparent, var(--es-gold-500) 30%, var(--es-gold-500) 70%, transparent);
	opacity: 0.85;
}
.es-hero__inner {
	position: relative;
	display: grid;
	gap: var(--es-space-l);
	align-items: center;
	grid-template-columns: 1fr;
}
@media (min-width: 900px) {
	.es-hero__inner--split {
		grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);
	}
}
.es-hero__title {
	font-family: var(--es-font-display);
	font-weight: 700;
	line-height: 1.12;
	font-size: clamp(1.9rem, 1.4rem + 3vw, 3.1rem);
	margin: 0.3em 0 0.4em;
	color: #ffffff;
}
.es-hero__text {
	font-size: clamp(1.02rem, 0.95rem + 0.5vw, 1.2rem);
	line-height: 1.65;
	color: rgba(255, 255, 255, 0.88);
	max-width: 38em;
	margin: 0 0 1.4em;
}
.es-hero .es-cta-row {
	margin-top: 0.4em;
}
/* Media/visual nel lato destro dell'hero */
.es-hero__media {
	min-width: 0;
}
.es-hero__media img,
.es-hero__media svg {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--es-radius-l);
	box-shadow: var(--es-shadow-m);
}


/* --------------------------------------------------------------------------
   08. FINAL-RENEWAL-2026-07-05 — Card
   -------------------------------------------------------------------------- */
.es-card {
	display: flex;
	flex-direction: column;
	min-width: 0;
	background: var(--es-bg);
	border: 1px solid var(--es-border);
	border-radius: var(--es-radius-m);
	box-shadow: var(--es-shadow-s);
	padding: clamp(18px, 2.6vw, 28px);
	transition: box-shadow var(--es-ease), border-color var(--es-ease),
		transform var(--es-ease);
}
/* Hover sobrio, solo su dispositivi con hover reale */
@media (hover: hover) {
	.es-card:hover {
		border-color: color-mix(in srgb, var(--es-blue-600) 35%, var(--es-border));
		box-shadow: var(--es-shadow-m);
		transform: translateY(-2px);
	}
}

/* Icona quadrata arrotondata, coerente su tutte le card */
.es-card__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 48px;
	height: 48px;
	border-radius: 12px;
	background: var(--es-blue-100);
	color: var(--es-navy-700);
	margin-bottom: var(--es-space-s);
	flex: none;
}
.es-card__icon svg {
	width: 26px;
	height: 26px;
}
.es-card__icon--gold {
	background: var(--es-gold-100);
	color: var(--es-gold-700);
}

.es-card__title {
	font-family: var(--es-font-display);
	font-size: clamp(1.12rem, 1.05rem + 0.4vw, 1.3rem);
	font-weight: 700;
	line-height: 1.25;
	color: var(--es-navy-900);
	margin: 0 0 0.4em;
}
.es-card__text {
	color: var(--es-ink-600);
	line-height: 1.6;
	margin: 0 0 1em;
}
/* Il link della card si aggancia in basso: card allineate anche con testi diversi */
.es-card__link {
	margin-top: auto;
	display: inline-flex;
	align-items: center;
	gap: 0.45em;
	min-height: 44px; /* touch target */
	font-weight: 700;
	color: var(--es-blue-600);
	text-decoration: none;
}
.es-card__link::after {
	content: "\2192"; /* freccia → */
	transition: transform var(--es-ease);
}
.es-card__link:hover,
.es-card__link:focus {
	color: var(--es-navy-700);
	text-decoration: underline;
}
@media (hover: hover) {
	.es-card__link:hover::after {
		transform: translateX(3px);
	}
}

/* Card "in evidenza" (es. servizio principale): bordo oro sottile in alto */
.es-card--featured {
	border-top: 3px solid var(--es-gold-500);
}

/* Card scura (per contrasto in griglie miste o footer CTA) */
.es-card--dark {
	background: var(--es-navy-900);
	border-color: var(--es-navy-700);
	color: rgba(255, 255, 255, 0.88);
}
.es-card--dark .es-card__title {
	color: #ffffff;
}
.es-card--dark .es-card__text {
	color: rgba(255, 255, 255, 0.78);
}
.es-card--dark .es-card__link {
	color: var(--es-gold-500);
}
.es-card--dark .es-card__link:hover,
.es-card--dark .es-card__link:focus {
	color: var(--es-gold-100);
}


/* --------------------------------------------------------------------------
   09. FINAL-RENEWAL-2026-07-05 — Checklist  ← FIX CERTO "Chi siamo"
   Problema originario: spunte troppo distanti dal testo ("Perché sceglierci —
   Competenze integrate, metodo verificabile").
   Soluzione: grid a 2 colonne [icona | testo] con gap fisso e allineamento
   alla prima riga. Layout stabile a qualsiasi larghezza; il markup pronto è
   in deliverables/PATCH-CONTENUTI-WP.md.
   -------------------------------------------------------------------------- */
.es-checklist {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: clamp(10px, 1.6vw, 16px);
}
.es-checklist li {
	display: grid;
	grid-template-columns: 1.5em minmax(0, 1fr); /* icona vicina, testo mai compresso */
	column-gap: 0.65em;
	align-items: start;
	margin: 0;
	min-width: 0;
	line-height: 1.55;
}
/* L'icona è un SVG inline nel markup (nessuna dipendenza JS/font-icon) */
.es-checklist .es-check {
	width: 1.5em;
	height: 1.5em;
	margin-top: 0.05em; /* allineata otticamente alla prima riga di testo */
	color: var(--es-gold-600);
	flex: none;
}
.es-checklist strong {
	color: var(--es-navy-900);
}
/* Variante blu (dove l'oro risulterebbe troppo caldo) */
.es-checklist--blue .es-check {
	color: var(--es-blue-600);
}
/* Due colonne su schermi larghi, una su mobile: mai testo compresso.
   Mobile-first: sotto i 700px resta la colonna singola ereditata. */
@media (min-width: 700px) {
	.es-checklist--2col {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		column-gap: var(--es-space-m);
	}
}


/* --------------------------------------------------------------------------
   10. FINAL-RENEWAL-2026-07-05 — Callout / note
   -------------------------------------------------------------------------- */
.es-note {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr);
	gap: 0.75em;
	align-items: start;
	background: var(--es-bg-alt);
	border: 1px solid var(--es-border);
	border-left: 4px solid var(--es-gold-500);
	border-radius: var(--es-radius-s);
	padding: var(--es-space-s) var(--es-space-m);
	color: var(--es-ink-600);
	line-height: 1.6;
}
.es-note__icon {
	width: 1.4em;
	height: 1.4em;
	margin-top: 0.1em;
	color: var(--es-gold-700);
	flex: none;
}
.es-note--info {
	border-left-color: var(--es-blue-600);
}
.es-note--info .es-note__icon {
	color: var(--es-blue-600);
}


/* --------------------------------------------------------------------------
   11. FINAL-RENEWAL-2026-07-05 — Timeline / metodo (es-steps)
   Verticale ovunque: robusta, leggibile, nessuna griglia densa su mobile.
   -------------------------------------------------------------------------- */
.es-steps {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 0;
	counter-reset: es-step;
}
.es-steps li {
	position: relative;
	counter-increment: es-step;
	display: grid;
	grid-template-columns: 44px minmax(0, 1fr);
	column-gap: var(--es-space-s);
	padding-bottom: var(--es-space-m);
	margin: 0;
	min-width: 0;
}
/* Numero del passo */
.es-steps li::before {
	content: counter(es-step, decimal-leading-zero);
	display: flex;
	align-items: center;
	justify-content: center;
	width: 44px;
	height: 44px;
	border-radius: 50%;
	background: var(--es-navy-900);
	color: var(--es-gold-500);
	font-family: var(--es-font-tech);
	font-weight: 700;
	font-size: 1rem;
	letter-spacing: 0.05em;
	grid-row: 1 / span 2;
	z-index: 1;
}
/* Linea di collegamento tra i passi */
.es-steps li:not(:last-child)::after {
	content: "";
	position: absolute;
	left: 21px;
	top: 48px;
	bottom: 4px;
	width: 2px;
	background: linear-gradient(180deg, var(--es-border), color-mix(in srgb, var(--es-gold-500) 40%, var(--es-border)));
}
.es-steps h3,
.es-steps .es-step__title {
	font-family: var(--es-font-display);
	font-size: 1.08rem;
	font-weight: 700;
	color: var(--es-navy-900);
	margin: 0.55em 0 0.3em;
	line-height: 1.3;
}
.es-steps p {
	grid-column: 2;
	color: var(--es-ink-600);
	line-height: 1.6;
	margin: 0;
}


/* --------------------------------------------------------------------------
   12. FINAL-RENEWAL-2026-07-05 — FAQ senza JS (details/summary)
   Contenuto sempre raggiungibile anche senza JavaScript.
   -------------------------------------------------------------------------- */
.es-faq {
	display: grid;
	gap: 10px;
}
.es-faq details {
	border: 1px solid var(--es-border);
	border-radius: var(--es-radius-s);
	background: var(--es-bg);
	overflow: hidden;
}
.es-faq summary {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1em;
	min-height: 48px; /* touch target */
	padding: 12px 16px;
	cursor: pointer;
	font-weight: 600;
	color: var(--es-navy-900);
	list-style: none;
}
.es-faq summary::-webkit-details-marker {
	display: none;
}
/* Indicatore +/− CSS-only. Doppia dichiarazione content: la seconda usa la
   sintassi con alt-text vuoto per NON far finire il simbolo nel nome
   accessibile del summary (i browser che non la supportano tengono la prima). */
.es-faq summary::after {
	content: "+";
	content: "+" / "";
	flex: none;
	width: 28px;
	height: 28px;
	display: flex;
	align-items: center;
	justify-content: center;
	border-radius: 50%;
	background: var(--es-blue-100);
	color: var(--es-navy-700);
	font-weight: 700;
	font-size: 1.1rem;
	line-height: 1;
}
.es-faq details[open] summary::after {
	content: "\2212"; /* − (fallback) */
	content: "\2212" / ""; /* escluso dal nome accessibile */
	background: var(--es-gold-100);
	color: var(--es-gold-700);
}
.es-faq details[open] summary {
	border-bottom: 1px solid var(--es-border);
	background: var(--es-bg-alt);
}
.es-faq .es-faq__body {
	padding: 14px 16px 16px;
	color: var(--es-ink-600);
	line-height: 1.6;
}
.es-faq .es-faq__body > :last-child {
	margin-bottom: 0;
}


/* --------------------------------------------------------------------------
   13. FINAL-RENEWAL-2026-07-05 — Ecosistema  ← FIX CERTO mobile
   Problema originario: su mobile i testi uscivano dalle celle del grafico.
   Soluzione: niente posizionamenti assoluti; griglia auto-fit con
   min-width:0, overflow-wrap:anywhere SOLO qui (URL e nomi dominio lunghi),
   font fluido con clamp. Su mobile il grafico degrada a colonna singola.
   Markup pronto in deliverables/PATCH-CONTENUTI-WP.md.
   -------------------------------------------------------------------------- */
.es-ecosystem {
	display: grid;
	gap: 12px;
	grid-template-columns: repeat(auto-fit, minmax(min(240px, 100%), 1fr));
}

/* Nodo centrale (hub): occupa tutta la riga, visivamente dominante */
.es-ecosystem__hub {
	grid-column: 1 / -1;
	background: linear-gradient(150deg, var(--es-navy-900), var(--es-navy-700));
	color: #ffffff;
	border-radius: var(--es-radius-m);
	border: 1px solid var(--es-navy-700);
	padding: clamp(18px, 3vw, 30px);
	text-align: center;
	min-width: 0;
}
.es-ecosystem__hub .es-ecosystem__title {
	color: #ffffff;
}
.es-ecosystem__hub .es-ecosystem__desc {
	color: rgba(255, 255, 255, 0.82);
}
/* Su fondo navy il tag blu non avrebbe contrasto: nel hub diventa oro */
.es-ecosystem__hub .es-ecosystem__tag {
	color: var(--es-gold-500);
}
.es-ecosystem__hub .es-ecosystem__link {
	color: var(--es-gold-500);
	justify-content: center;
}
.es-ecosystem__hub .es-ecosystem__link:hover,
.es-ecosystem__hub .es-ecosystem__link:focus {
	color: var(--es-gold-100);
}

/* Connettore visivo hub→nodi: semplice e indistruttibile (niente absolute) */
.es-ecosystem__hub::after {
	content: "";
	display: block;
	width: 2px;
	height: 18px;
	margin: 14px auto 0;
	background: var(--es-gold-500);
	border-radius: 1px;
}

/* Nodi satellite */
.es-ecosystem__node {
	display: flex;
	flex-direction: column;
	min-width: 0;
	background: var(--es-bg);
	border: 1px solid var(--es-border);
	border-top: 3px solid var(--es-blue-600);
	border-radius: var(--es-radius-m);
	padding: clamp(14px, 2.4vw, 22px);
	box-shadow: var(--es-shadow-s);
}
.es-ecosystem__node--gold {
	border-top-color: var(--es-gold-500);
}

.es-ecosystem__tag {
	font-family: var(--es-font-tech);
	font-size: clamp(0.78rem, 0.75rem + 0.2vw, 0.88rem);
	font-weight: 600;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--es-blue-600);
	margin-bottom: 0.35em;
}
.es-ecosystem__node--gold .es-ecosystem__tag {
	color: var(--es-gold-700);
}

.es-ecosystem__title {
	font-family: var(--es-font-display);
	font-size: clamp(1rem, 0.95rem + 0.4vw, 1.18rem);
	font-weight: 700;
	line-height: 1.25;
	color: var(--es-navy-900);
	margin: 0 0 0.35em;
	/* Nomi di dominio/brand lunghi: spezzare piuttosto che uscire dalla cella */
	overflow-wrap: anywhere;
}
.es-ecosystem__desc {
	color: var(--es-ink-600);
	font-size: clamp(0.92rem, 0.88rem + 0.25vw, 1rem);
	line-height: 1.55;
	margin: 0;
	overflow-wrap: anywhere;
}
.es-ecosystem__link {
	margin-top: auto;
	padding-top: 0.6em;
	display: inline-flex;
	align-items: center;
	gap: 0.4em;
	min-height: 44px;
	font-weight: 700;
	font-size: 0.95rem;
	color: var(--es-blue-600);
	text-decoration: none;
	overflow-wrap: anywhere;
}
.es-ecosystem__link:hover,
.es-ecosystem__link:focus {
	text-decoration: underline;
	color: var(--es-navy-700);
}


/* --------------------------------------------------------------------------
   14. FINAL-RENEWAL-2026-07-05 — Media / visual delle card  ← FIX CERTO "Servizi"
   Contenitore per il visual SVG della card "Piattaforma informatica dedicata"
   (e riusabile su altre card). L'SVG è inline nel markup: visibile sempre,
   anche senza JS, sia desktop sia mobile.
   -------------------------------------------------------------------------- */
.es-media {
	display: block;
	width: 100%;
	border-radius: var(--es-radius-s);
	overflow: hidden;
	background: linear-gradient(155deg, var(--es-navy-900), var(--es-navy-700));
	margin-bottom: var(--es-space-s);
}
.es-media svg,
.es-media img {
	display: block;
	width: 100%;
	height: auto;
}


/* --------------------------------------------------------------------------
   15. FINAL-RENEWAL-2026-07-05 — Form (Contact Form 7)
   Selettori verificati in wp-content/plugins/contact-form-7 (markup standard).
   Rollback: rimuovere il blocco.
   -------------------------------------------------------------------------- */
.wpcf7 input[type="text"],
.wpcf7 input[type="email"],
.wpcf7 input[type="tel"],
.wpcf7 input[type="url"],
.wpcf7 input[type="number"],
.wpcf7 input[type="date"],
.wpcf7 select,
.wpcf7 textarea {
	width: 100%;
	min-height: 48px;
	padding: 10px 14px;
	border: 1px solid var(--es-border);
	border-radius: var(--es-radius-s);
	background: #ffffff;
	color: var(--es-ink-900);
	font-family: inherit;
	font-size: 1rem;
	line-height: 1.5;
	transition: border-color var(--es-ease), box-shadow var(--es-ease);
}
.wpcf7 textarea {
	min-height: 140px;
	resize: vertical;
}
/* Il focus da tastiera mantiene l'outline del design system (regola globale
   :focus-visible, sezione 03): qui NON si azzera l'outline — border e ring
   sono solo rinforzo estetico, non l'indicatore di focus. */
.wpcf7 input:focus,
.wpcf7 select:focus,
.wpcf7 textarea:focus {
	border-color: var(--es-blue-600);
	box-shadow: 0 0 0 3px rgba(27, 95, 168, 0.18);
}
/* Submit coerente con la CTA primaria del design system.
   Niente proprieta' flex qui: CF7 renderizza <input type="submit"> (che le
   ignora e centra il label nativamente). */
.wpcf7 input[type="submit"],
.wpcf7 button[type="submit"] {
	min-height: 48px;
	padding: 0.65em 1.8em;
	border: 2px solid transparent;
	border-radius: var(--es-radius-s);
	background: var(--es-blue-600);
	color: #ffffff;
	font-family: var(--es-font-display);
	font-size: 1rem;
	font-weight: 600;
	cursor: pointer;
	transition: background-color var(--es-ease), box-shadow var(--es-ease);
}
.wpcf7 input[type="submit"]:hover,
.wpcf7 input[type="submit"]:focus,
.wpcf7 button[type="submit"]:hover,
.wpcf7 button[type="submit"]:focus {
	background: var(--es-navy-700);
	box-shadow: var(--es-shadow-s);
}
/* Focus da tastiera sul submit: anello ben visibile oltre all'outline globale */
.wpcf7 input[type="submit"]:focus-visible,
.wpcf7 button[type="submit"]:focus-visible {
	box-shadow: 0 0 0 3px rgba(27, 95, 168, 0.35), var(--es-shadow-s);
}
/* Messaggi di validazione più leggibili */
.wpcf7 .wpcf7-not-valid-tip {
	font-size: 0.9rem;
	margin-top: 4px;
	color: #b3261e;
}
/* Specificita' (0,2,1) identica a styles.css:19 di CF7 (.wpcf7 form
   .wpcf7-response-output): vince per ordine di sorgente. Niente border-color:
   i colori di stato di CF7 (sent/failed/invalid) restano attivi. */
.wpcf7 form .wpcf7-response-output {
	margin: 1.2em 0 0;
	padding: 12px 16px;
	border-radius: var(--es-radius-s);
	border-width: 1px;
	border-style: solid;
	line-height: 1.5;
}


/* --------------------------------------------------------------------------
   16. FINAL-RENEWAL-2026-07-05 — Back-to-top (override del nativo GeneratePress)
   Il pulsante è quello NATIVO del tema (markup e JS di GeneratePress 3.6.1,
   attivato da functions.php del child): niente duplicati, aria-label e
   role="button" già inclusi dal tema.

   Questo blocco è AUTOSUFFICIENTE: replica anche gli stili base che GP
   genera nel "CSS dinamico" (inc/css-output.php:116-134), perché quel CSS è
   cachato nell'option generate_dynamic_css_output e, attivando l'opzione via
   filtro, la cache potrebbe non contenerli.

   Posizione: BASSO A DESTRA (rivisto su evidenze reali, HOTFIX-2026-07-05):
   sul sito NON esiste alcun pulsante WhatsApp flottante (i bottoni es-wa-*
   sono CTA nel contenuto) e il cookie banner reale è il CUSTOM #es-cookie-bar,
   fisso in basso a SINISTRA (z-index 99985, max-width 380px). A destra il
   pulsante non può collidere con nulla per geometria. Dimensione touch 48px.
   Selettore con specificità doppia per vincere sul CSS dinamico del tema
   (a.generate-back-to-top) senza usare !important.
   Rollback: rimuovere blocco + filtri back-to-top in functions.php.
   -------------------------------------------------------------------------- */
a.generate-back-to-top.generate-back-to-top {
	/* Base (replica del CSS dinamico GP, non affidata alla cache) */
	position: fixed;
	display: block;
	text-align: center;
	z-index: 9990; /* sopra contenuto e floating button tipici, sotto il banner cookie (100000) */
	opacity: 0.1; /* stato nascosto: non 0 per evitare doppio-tap su iOS (come GP) */
	transform: translateY(1000px);
	visibility: hidden; /* fuori dal tab order quando nascosto (WCAG 2.4.7);
	                       animata in modo discreto: il fade resta identico */
	transition: opacity 200ms ease-in-out, transform 200ms ease-in-out,
		visibility 200ms ease-in-out, background-color var(--es-ease);

	/* Rifinitura Electronic Solution */
	right: 18px;
	left: auto;
	bottom: calc(18px + env(safe-area-inset-bottom, 0px));
	width: 48px;
	height: 48px;
	line-height: 48px;
	font-size: 18px;
	border-radius: 12px;
	background: var(--es-navy-800);
	color: #ffffff;
	border: 1px solid rgba(255, 255, 255, 0.18);
	box-shadow: var(--es-shadow-m);
}
/* Stato visibile (classe aggiunta dal JS nativo GP dopo 300px di scroll) */
a.generate-back-to-top.generate-back-to-top__show {
	opacity: 1;
	transform: translateY(0);
	visibility: visible;
}
a.generate-back-to-top.generate-back-to-top:hover,
a.generate-back-to-top.generate-back-to-top:focus {
	background: var(--es-blue-600);
	color: #ffffff;
}
/* Focus da tastiera: doppio anello (alone bianco + blu) leggibile su
   QUALSIASI sfondo sottostante — l'outline oro con offset cadrebbe sul fondo
   pagina chiaro (2.4:1, insufficiente). */
a.generate-back-to-top.generate-back-to-top:focus-visible {
	outline: 2px solid var(--es-blue-600);
	outline-offset: 2px;
	box-shadow: 0 0 0 5px #ffffff, var(--es-shadow-m);
}
/* Icona SVG del tema centrata */
a.generate-back-to-top svg {
	vertical-align: middle;
}
/* NOTA (HOTFIX-2026-07-05): rimossa la vecchia regola body.cookies-not-set —
   il sito reale usa un cookie bar custom (#es-cookie-bar, in basso a sinistra),
   non la barra del plugin Cookie Notice: la classe body non viene applicata e
   con il pulsante a destra l'offset non serve piu'.
   Caso residuo: su mobile (≤600px) il cookie bar custom diventa quasi full
   width (left:12px;right:12px) e coprirebbe il pulsante. Finché il banner è
   visibile (classe es-cb-show) il pulsante si ritira: robusto per qualunque
   altezza del banner. Senza :has() resta la sovrapposizione temporanea
   pre-consenso (stato attuale del live: degrado benigno). */
@media (max-width: 600px) {
	body:has(#es-cookie-bar.es-cb-show) a.generate-back-to-top.generate-back-to-top {
		opacity: 0;
		visibility: hidden;
		pointer-events: none;
	}
}
/* Chi preferisce meno movimento vede il pulsante apparire senza scivolare */
@media (prefers-reduced-motion: reduce) {
	a.generate-back-to-top.generate-back-to-top {
		transform: none;
		visibility: hidden;
		opacity: 0;
	}
	a.generate-back-to-top.generate-back-to-top__show {
		visibility: visible;
		opacity: 1;
	}
}


/* --------------------------------------------------------------------------
   17. FINAL-RENEWAL-2026-07-05 — Tabelle e utility overflow
   -------------------------------------------------------------------------- */
/* Wrapper per tabelle larghe: scrollano da sole, mai la pagina intera */
.es-table-wrap {
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	max-width: 100%;
}
.es-table-wrap table {
	min-width: 560px;
	margin: 0;
}

/* Spaziatura verticale coerente tra blocchi es-* consecutivi nel contenuto */
.entry-content .es-grid + .es-cta-row,
.entry-content .es-checklist + .es-cta-row,
.entry-content .es-ecosystem + .es-cta-row {
	margin-top: var(--es-space-m);
}


/* --------------------------------------------------------------------------
   18. HOTFIX-POST-SCREENSHOT-CEO-2026-07-05 — Fix sul MARKUP REALE del sito
   Scritti sull'HTML/CSS effettivi delle pagine live (backup Cowork
   BUILD-2026-07-05-FINAL: pagine + CSS Customizer "css.css").
   Il CSS Customizer viene stampato DOPO questo foglio: dove serve vincere su
   sue regole !important si usa specificità superiore + !important.
   Rollback: rimuovere questa sezione.
   -------------------------------------------------------------------------- */

/* 18.1 — BUG 2 (Chi siamo, "Perché sceglierci"): spunte separate dal testo.
   CAUSA REALE: il CSS Customizer contiene
     .es .feat{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important}
   pensata per i .feat-CONTENITORE (Home, Studio tecnico: figli <div>), ma che
   spacca in 2 colonne anche i .feat-VOCE di Chi siamo (figli: span.dot + span
   testo): la spunta finisce in una colonna larga metà riga, il testo nell'altra.
   FIX: solo i .feat che contengono una .dot diretta (esistono SOLO in Chi
   siamo, verificato su tutte le 15 pagine) tornano flex come nel design
   originale. Specificità (0,3,0)+!important batte (0,2,0)!important del
   Customizer anche se stampato dopo. Richiede :has() (baseline 2023 — Chrome
   105+, Safari 15.4+, Firefox 121+); nei browser più vecchi resta la resa
   attuale (nessuna regressione). I .feat-contenitore NON sono toccati. */
.es .feat:has(> .dot) {
	display: flex !important;
	grid-template-columns: none !important;
	gap: 12px;
	align-items: flex-start;
	margin: 14px 0;
}

/* 18.2 — BUG 1 (Ecosistema, organigramma SVG su mobile): difesa senza patch.
   CAUSA REALE: il CSS Customizer a ≤640px porta i titoli dell'SVG a 24px
   (.es .es-eco-map .tt{font-size:24px}): dentro il viewBox 720×290 il testo
   ".computer — Hardware" supera i rettangoli da 212 unità e sfora la cella.
   A 16px il titolo rientra (≈186 unità). Specificità (0,3,1) > (0,3,0).
   È un CONTENIMENTO: la soluzione completa è la variante mobile 18.3. */
@media (max-width: 640px) {
	.es .es-eco-map text.tt {
		font-size: 16px;
	}
}

/* 18.3 — BUG 1: variante mobile dedicata dell'ecosistema (pila verticale).
   Il markup (patch contenuti WP: blocco .es-eco-mobile subito dopo l'SVG)
   sostituisce l'organigramma su mobile: card impilate con connettori
   verticali, zero coordinate fisse, zero overflow possibile.
   Su desktop resta l'organigramma SVG attuale (invariato). */
.es .es-eco-mobile {
	display: none;
}
@media (max-width: 640px) {
	/* Con la variante presente (patch: .es-eco-mobile inserita SUBITO DOPO
	   l'SVG), l'organigramma lascia il posto alle card. Senza patch l'SVG
	   resta visibile (con i titoli contenuti da 18.2): nessuna sezione vuota.
	   !important necessario: l'SVG ha display:block INLINE nel markup.
	   Browser senza :has(): SVG + card conviventi su mobile (degrado benigno). */
	.es .es-eco-map:has(+ .es-eco-mobile) {
		display: none !important;
	}
	.es .es-eco-mobile {
		display: grid;
		justify-items: center;
		gap: 0;
		margin-top: 10px;
	}
	.es .es-eco-mobile__hub,
	.es .es-eco-mobile__node {
		width: min(100%, 420px);
		min-width: 0;
		background: #ffffff;
		border: 2px solid #c99b4b;
		border-radius: 10px;
		padding: 13px 16px;
		text-align: center;
	}
	.es .es-eco-mobile__hub {
		font-family: 'Sora', sans-serif;
		font-weight: 700;
		font-size: 17px;
		color: #071a2f;
	}
	.es .es-eco-mobile__node--cyan {
		border-color: #00aeef;
	}
	.es .es-eco-mobile__name {
		font-family: 'Sora', sans-serif;
		font-weight: 700;
		font-size: 15.5px;
		line-height: 1.3;
		color: #0b3d66;
		overflow-wrap: anywhere;
	}
	.es .es-eco-mobile__desc {
		font-family: 'Manrope', sans-serif;
		font-size: 13px;
		line-height: 1.5;
		color: #5c6670;
		margin-top: 4px;
		overflow-wrap: anywhere;
	}
	/* connettori verticali tra le card */
	.es .es-eco-mobile__link {
		width: 2px;
		height: 18px;
		background: #c99b4b;
	}
	.es .es-eco-mobile__link--cyan {
		background: #00aeef;
	}
}

/* 18.4 — BUG 3 (Informatica, "Piattaforma informatica dedicata") —
   V3-FINAL-EXPERIENCE-2026-07-05: FIX DEFINITIVO ZERO-DATABASE.
   Diagnosi verificata sul live: i file del tema sono deployati ma la patch
   contenuti (PATCH B) non è stata applicata → il blocco mostra ancora il
   placeholder div.ph. Questo blocco rende il fix INDIPENDENTE dal database:
   l'immagine reale (già sul server: assets/img/es-eu-pc-su-misura.jpg,
   HTTP 200 verificato) viene renderizzata come sfondo del placeholder.
   - URL relativo al CSS (../img/…): nessun percorso locale/dominio.
   - Fallback: se l'immagine non carica resta il pannello scuro con caption;
     se il CSS non si aggiorna resta lo stato attuale. Mai un buco.
   - Il testo esistente "Hardware · PC · Componenti" diventa caption overlay;
     l'iconcina placeholder viene nascosta; il .tag resta invariato.
   - Quando la PATCH B (markup semantico con <img>) verrà applicata, .ph
     sparisce dal markup e questa regola semplicemente non matcha più.
   Rollback: rimuovere questo blocco (torna il placeholder). */
.es .es-fig .ph {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	justify-content: flex-end;
	aspect-ratio: 3 / 2;
	min-height: 0;
	padding: 16px 18px;
	background:
		linear-gradient(to top, rgba(3, 8, 18, 0.78), rgba(3, 8, 18, 0.16) 42%, rgba(3, 8, 18, 0) 65%),
		url('../img/es-eu-pc-su-misura.jpg') center / cover no-repeat;
	font-family: 'Rajdhani', sans-serif;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	font-size: 12.5px;
	color: #eaf2ff;
	text-align: left;
}
.es .es-fig .ph svg {
	display: none; /* via l'iconcina placeholder: c'è l'immagine reale */
}
