/* ============================================================
   GRUPO JGM — CSS de contenido para WordPress (recortado de styles.css)
   ============================================================
   Este archivo es el css/styles.css del sitio estático, recortado para
   usarse como plugin de WordPress sobre el tema Blocksy: Blocksy genera
   su propio encabezado, pie de página y botón flotante nativos, así que
   las reglas que estilizaban esas piezas en el sitio estático se
   eliminaron por completo aquí (quedarían sin efecto o en conflicto).
   Todo lo demás —variables, utilidades, cada sección de contenido y el
   responsive de esas secciones— se mantiene igual que en styles.css.
   Organizado por bloques (los números siguen la numeración del archivo
   original; los bloques eliminados se marcan explícitamente):
     1. Variables / paleta de color
     2. Reset y base
     3. Utilidades (contenedor, botones, animaciones, .reveal)
     4. [ELIMINADO — encabezado/navegación, ahora lo genera Blocksy]
     5. Hero (solo en Inicio, con foto de fondo)
    5b. Franja de credibilidad (solo en Inicio)
     6. Quiénes Somos
     7. Beneficios de un solo interlocutor
     8. Por qué Grupo JGM (tarjetas con ícono)
     9. Cita / pull-quote (solo en Inicio)
    10. Nuestros Servicios
    11. Metodología de trabajo
    12. Casos de Éxito
    13. Cumplimiento y confianza legal
    14. Contacto (info + formulario)
    15. Pie de página — solo contenido (marca + lista de contacto; el
        contenedor .site-footer/.footer-inner/.footer-bottom sigue
        siendo nativo de Blocksy, no está aquí)
    16. Botón flotante de WhatsApp — solo contenido (el elemento vive
        en el plugin de carga del Paso 4, ver docs/MAPA-WORDPRESS.md)
    17. Servicio destacado (Dictamen Estructural)
    18. [ELIMINADO — modal "Acceso clientes". Se quitó HTML+CSS+JS por
        completo; es un placeholder de fase 1 que la fase 2 reemplaza
        por el login real de WP Customer Area. El botón del header
        enlaza ahora a la página /portal-clientes/.]
    19. Casilla de aviso de privacidad
    20. Página legal (aviso-privacidad.html)
    21. Encabezado de página interna (page-hero)
    22. Franja de llamado a la acción (cta-band)
    23. Resumen en Inicio (teasers hacia cada página interna)
    24. Responsive (mobile-first: base = móvil, luego tablet/desktop;
        el bloque >=1180px del original era 100% menú de escritorio y
        se eliminó completo; dentro del bloque >=768px se eliminó solo
        la regla de grid de .footer-inner, no la alineación de
        .footer-contact que sí se conserva)

   Nota sobre --header-height: el encabezado de Blocksy en este sitio
   usa position:relative (no fixed/overlay, verificado en vivo), así
   que las 3 compensaciones "padding-top: var(--header-height)" que
   existían en el original (.hero, .legal-section, .page-hero) se
   quitaron aquí a propósito — ya no hay nada que compensar. La
   variable --header-height y su uso en "scroll-margin-top" se dejan
   igual, son inofensivos y sirven si algún enlace interno hace scroll.
   ============================================================ */

/* ------------------------------------------------------------
   1. VARIABLES / PALETA DE COLOR
   ------------------------------------------------------------
   CUARTA DIRECCIÓN DE PALETA: se conserva el acento azul acero
   (no se toca) y cambian los neutros. El oscuro viejo (#1c1b19) y
   el claro viejo (#efe9df) compartían la misma familia cálida
   (tono 40° los dos) pero con intensidades opuestas — 6% de
   saturación el oscuro, 33% el claro — así que el oscuro se leía
   como un negro sucio junto a la arena en vez de un contraste
   deliberado. El oscuro pasa a un antracita decididamente frío
   para que el contraste de temperatura con la arena se lea como
   una decisión, no como un desajuste. Es un cambio de neutros, no
   de estructura: el acento, el logo, la tipografía y el layout
   siguen igual. Ver README.md.

   Los NOMBRES de las variables (--color-graphite, --color-bone,
   etc.) se mantienen aunque el tono ya no sea literalmente grafito
   ni hueso — renombrarlas tocaría más de cien usos en este archivo
   sin cambiar nada visible. ------------------------------------------------------------ */
:root {
  /* Colores de marca (propuesta) */
  --color-graphite: #202A35;        /* antracita azulado frío — base oscura (headers, overlays) */
  --color-graphite-dark: #161E26;   /* antracita más oscuro (footer) */
  --color-graphite-light: #334152;  /* antracita secundario (paneles oscuros, cita) */
  --color-accent: #1F5C99;      /* azul acero — acento principal. OJO: a diferencia del naranja
                                    anterior, este tono es oscuro: el texto encima debe ser
                                    BLANCO (6.9:1), no grafito. */
  --color-accent-dark: #174878; /* azul acero hover/activo */
  /* Mismo azul que --color-accent: aquí con nombre propio para TEXTO chico
     sobre fondos claros (blanco/arena) — contraste 5.7:1, confirmado con
     el script de luminancia WCAG. Úsala en vez de --color-accent cada vez
     que sea texto (no ícono, no borde, no botón) sobre un fondo claro. */
  --color-accent-text: #1F5C99;
  /* Variante clara, solo para acentos sobre fondos oscuros (eyebrows,
     etiquetas) — contraste 8.0:1 sobre el antracita nuevo. Un punto más
     clara que antes porque el antracita nuevo es más claro que el negro
     que reemplaza, y había que mantener el contraste de los eyebrows. */
  --color-accent-light: #9CC4E8;

  /* Neutros (antracita azulado + arena cálida, evitando blanco/gris puros) */
  --color-white: #FFFCF7;
  --color-bone: #EFE7D8;        /* arena — fondos de sección alternos */
  --color-bone-dark: #E2D7C2;   /* arena más oscura — bordes/hover sobre arena */
  --color-border: #D6CAB3;
  --color-text: #1D242C;
  --color-text-muted: #5B6672;

  /* Tipografía */
  --font-heading: 'Oswald', 'Arial Narrow', sans-serif;
  --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  /* ----------------------------------------------------------
     ESCALA DE ESPACIADO — base 8px
     ----------------------------------------------------------
     Un solo lugar para todo el espaciado del sitio (padding,
     margin, gap). Para WordPress/Elementor: estos valores se
     mapean directamente a los "Default Spacing" o a variables
     de tema en Elementor Pro. No uses valores de espaciado
     sueltos fuera de esta escala salvo casos muy puntuales
     (ya comentados donde aparecen). */
  --space-1: 0.5rem;   /*  8px */
  --space-2: 1rem;     /* 16px */
  --space-3: 1.5rem;   /* 24px */
  --space-4: 2rem;     /* 32px */
  --space-5: 2.5rem;   /* 40px */
  --space-6: 3rem;     /* 48px */
  --space-8: 4rem;     /* 64px */
  --space-10: 5rem;    /* 80px */
  --space-12: 6rem;    /* 96px */

  /* Padding vertical de sección: fluido entre --space-8 (3 veces el radio,
     en pantallas chicas) y --space-12 (pantallas grandes), sin el salto
     brusco que había antes en el breakpoint de 1024px. */
  --section-padding-y: clamp(var(--space-8), 8vw, var(--space-12));

  /* Layout */
  --container-width: 1180px;
  --container-padding-x: clamp(var(--space-3), 4vw, var(--space-5));
  --radius: 8px;
  --shadow-sm: 0 2px 8px rgba(22, 30, 38, 0.1);
  --shadow-md: 0 8px 24px rgba(22, 30, 38, 0.16);
  --header-height: 76px;
  --transition: 0.25s ease;
}

/* ------------------------------------------------------------
   2. RESET Y BASE
   ------------------------------------------------------------ */
*, *::before, *::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
}

body {
  margin: 0;
  font-family: var(--font-body);
  color: var(--color-text);
  background: var(--color-white);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 {
  font-family: var(--font-heading);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  line-height: 1.2;
  margin: 0 0 0.5em;
  color: var(--color-graphite);
  text-wrap: balance; /* evita saltos de línea feos en títulos; se ignora en navegadores que no lo soportan */
}

/* Puente WordPress: el tema Blocksy trae un reset propio
   "body, p, h1...{margin:0}" con la MISMA especificidad (0,0,1) que esta
   regla, y gana el empate porque su hoja carga después de la nuestra en
   el <head> — subimos la especificidad a "body p" (0,0,2) para que esta
   regla gane siempre, sin depender del orden de carga. */
body p { margin: 0 0 1em; }
/* Puente WordPress: el widget "Editor de texto" de Elementor trae su
   propia regla ".elementor-widget-text-editor p:last-child{margin-bottom:0}"
   (pensada para evitar doble margen antes del siguiente widget) con
   especificidad 0,2,1 — más alta que "body p" (0,0,2) — y además su hoja
   (elementor-frontend.min.css) carga después de la nuestra. En este sitio
   casi todo párrafo vive solo dentro de su propio widget, así que SIEMPRE
   es ":last-child" y SIEMPRE perdía su margen inferior sin este puente. */
body .elementor-widget-text-editor p:last-child { margin-bottom: 1em; }
ul, ol { margin: 0; padding: 0; list-style: none; }
a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }
button { font-family: inherit; cursor: pointer; }

/* Respeta preferencia de movimiento reducido */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}

/* Accesibilidad: enlace de salto. Texto blanco, no grafito: a diferencia
   del naranja anterior (claro), el azul acero es oscuro — el blanco es
   el que pasa contraste AA encima (6.9:1, confirmado con script WCAG). */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--color-accent);
  color: var(--color-white);
  padding: 0.75em 1.25em;
  z-index: 2000;
  border-radius: 0 0 var(--radius) 0;
  font-weight: 600;
}
.skip-link:focus {
  left: 0;
}

/* Foco visible consistente para navegación por teclado */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible {
  outline: 3px solid var(--color-accent);
  outline-offset: 2px;
}

/* ------------------------------------------------------------
   3. UTILIDADES
   ------------------------------------------------------------ */
.container {
  width: 100%;
  max-width: var(--container-width);
  margin: 0 auto;
  padding: 0 var(--container-padding-x);
}

.section {
  padding: var(--section-padding-y) 0;
  scroll-margin-top: var(--header-height);
}
.section-alt { background: var(--color-bone); }

.section-eyebrow {
  font-family: var(--font-heading);
  color: var(--color-text-muted); /* gris cálido, no naranja: aparece arriba de cada título de sección en las 6 páginas */
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-size: 0.85rem;
  font-weight: 600;
  margin-bottom: var(--space-1);
}

.section-title {
  font-size: clamp(1.6rem, 4vw, 2.4rem);
  margin-bottom: var(--space-4);
  max-width: 46ch;
}

.lead {
  font-size: 1.15rem;
  color: var(--color-text-muted);
}

/* Párrafo introductorio debajo de un .section-title (resúmenes de Inicio
   y encabezados de listas) + botón centrado de cierre de sección. */
.section-intro {
  font-size: 1.1rem;
  color: var(--color-text-muted);
  max-width: 65ch;
  margin-bottom: var(--space-4);
}
.section-cta { text-align: center; margin-top: var(--space-4); }

/* Botones */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5em;
  min-height: 44px; /* área táctil mínima, incluye las variantes "small" */
  padding: 0.85em 1.75em;
  border-radius: var(--radius);
  font-weight: 600;
  font-size: 0.98rem;
  border: 2px solid transparent;
  transition: transform var(--transition), background var(--transition), box-shadow var(--transition);
  white-space: nowrap;
}
.btn:hover { transform: translateY(-2px); }
.btn .icon { width: 1.1em; height: 1.1em; fill: currentColor; }

/* En pantallas angostas (ej. 360px), un botón largo como "Solicita tu
   dictamen estructural" con white-space:nowrap se salía del contenedor
   y causaba scroll horizontal. Se permite salto de línea solo aquí. */
@media (max-width: 479px) {
  .btn { white-space: normal; text-align: center; }
}

.btn-primary {
  /* Texto blanco, no grafito: el azul acero es oscuro (al revés que el
     naranja anterior), así que el blanco es el que pasa contraste AA
     encima (6.9:1, confirmado con script WCAG), en normal y en hover. */
  background: var(--color-accent);
  color: var(--color-white);
}
.btn-primary:hover { background: var(--color-accent-dark); box-shadow: var(--shadow-sm); }
.btn-primary:active { background: var(--color-accent-dark); transform: translateY(0); }

.btn-outline-light {
  background: transparent;
  border-color: rgba(255,255,255,0.5);
  color: var(--color-white);
}
.btn-outline-light:hover { border-color: var(--color-white); background: rgba(255,255,255,0.08); }
.btn-outline-light:active { background: rgba(255,255,255,0.16); transform: translateY(0); }

/* Variante de botón outline para fondos claros (header, página de aviso
   de privacidad): usada por "Acceso clientes". */
.btn-outline {
  background: transparent;
  border-color: var(--color-graphite);
  color: var(--color-graphite);
  padding: 0.55em 1.1em;
  font-size: 0.9rem;
}
.btn-outline:hover { background: var(--color-graphite); color: var(--color-white); }
.btn-outline:active { background: var(--color-graphite-dark); transform: translateY(0); }

/* Verde de WhatsApp oscurecido (el #25D366 "oficial" no pasa contraste
   AA con texto blanco encima — confirmado con Lighthouse). Sigue
   leyéndose claramente como "WhatsApp" pero es accesible. */
.btn-whatsapp {
  background: #0c7a3c;
  color: var(--color-white);
}
.btn-whatsapp:hover { background: #0a6b34; box-shadow: var(--shadow-sm); }
.btn-whatsapp:active { background: #095c2c; transform: translateY(0); }

.btn-whatsapp-small {
  background: #0c7a3c;
  color: var(--color-white);
  padding: 0.55em 1.1em;
  font-size: 0.9rem;
}
.btn-whatsapp-small:hover { background: #0a6b34; }
.btn-whatsapp-small:active { background: #095c2c; }

/* Animación de aparición al hacer scroll. Antes ".reveal{opacity:0}" se
   aplicaba sin condición: si JavaScript fallaba o estaba bloqueado,
   ese contenido se quedaba invisible para siempre. Ahora solo se
   oculta cuando la etiqueta <html> trae la clase "js" (agregada por un
   script mínimo en el <head>, antes de que el CSS se termine de
   aplicar) — sin esa clase, todo el contenido .reveal se ve normal
   desde el primer render. */
.js .reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.js .reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* ------------------------------------------------------------
   5. HERO (INICIO)
   ------------------------------------------------------------ */
.hero {
  position: relative;
  /* 100vh primero como respaldo (Safari/navegadores viejos que no
     entienden "svh" simplemente ignoran la segunda línea y se quedan
     con esta); 100svh después para los que sí lo soportan, que ajusta
     mejor la altura real en iPhone con la barra de Safari visible. */
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  background: var(--color-graphite-dark); /* color de respaldo mientras carga la foto */
  overflow: hidden;
  color: var(--color-white);
}

/* PUENTE WORDPRESS — FOTO DE FONDO DEL HERO
   El sitio estático apila dos <div> absolutos detrás del contenido
   (.hero-media para la foto, .hero-overlay para el degradado) — ese
   patrón no existe en el árbol de Elementor (el hero ahí es un solo
   Container, sin esos dos hijos extra), así que ".hero-media"/
   ".hero-overlay" de abajo no matchean nada y la foto nunca se vio: el
   hero se quedaba solo con el "background" de respaldo (gris sólido).
   Resuelto sin tocar la estructura de Elementor: el mismo degradado +
   foto se aplican directo sobre ".hero" como "background-image"
   compuesto (las dos capas de gradiente encima, la foto debajo), con
   la URL absoluta de los archivos ya subidos a /wp-content/uploads/. */
.hero {
  background-image:
    linear-gradient(100deg, rgba(22,30,38,0.93) 0%, rgba(22,30,38,0.8) 38%, rgba(22,30,38,0.42) 70%, rgba(22,30,38,0.36) 100%),
    linear-gradient(0deg, rgba(22,30,38,0.58) 0%, rgba(22,30,38,0) 35%),
    url('https://grupojgm.com/wp-content/uploads/hero-construction-mobile.webp') !important;
  background-size: cover !important;
  background-position: center 65% !important;
}
@media (min-width: 700px) {
  .hero {
    background-image:
      linear-gradient(100deg, rgba(22,30,38,0.93) 0%, rgba(22,30,38,0.8) 38%, rgba(22,30,38,0.42) 70%, rgba(22,30,38,0.36) 100%),
      linear-gradient(0deg, rgba(22,30,38,0.58) 0%, rgba(22,30,38,0) 35%),
      url('https://grupojgm.com/wp-content/uploads/hero-construction.webp') !important;
  }
}

/* Fondo fotográfico del hero. Imagen ligera para móvil y una más grande
   para pantallas anchas (ver README para reemplazarla). */
.hero-media {
  position: absolute;
  inset: 0;
  background-image: url('../assets/hero-construction-mobile.webp');
  background-size: cover;
  background-position: center 65%;
}
@media (min-width: 700px) {
  .hero-media {
    background-image: url('../assets/hero-construction.webp');
  }
}

/* Degradado oscuro (grafito, no azul) sobre la foto para mantener el
   contraste del texto */
.hero-overlay {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(100deg, rgba(22,30,38,0.93) 0%, rgba(22,30,38,0.8) 38%, rgba(22,30,38,0.42) 70%, rgba(22,30,38,0.36) 100%),
    linear-gradient(0deg, rgba(22,30,38,0.58) 0%, rgba(22,30,38,0) 35%);
}

.hero-inner {
  position: relative;
  z-index: 1;
  max-width: 720px;
}

.eyebrow {
  font-family: var(--font-heading);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: rgba(255,255,255,0.75);
  font-size: 0.95rem;
  margin-bottom: var(--space-2);
}

.hero-title {
  /* Antes el H1 era solo "Grupo JGM" (2 palabras, clamp hasta 4.2rem) y
     una cita aparte explicaba qué hace la empresa. Ahora el H1 absorbe
     esa frase completa, así que el tamaño baja para que una oración
     larga no domine la pantalla ni se vea descontrolada. */
  color: var(--color-white);
  font-size: clamp(1.9rem, 4.2vw, 3.1rem);
  max-width: 14ch;
  margin-bottom: 0.4em;
}

.hero-tagline {
  font-family: var(--font-heading);
  /* Hueso, no acento: el acento es un detalle, no el protagonista — el
     momento de marca más grande del sitio (el hero) se queda en neutros. */
  color: var(--color-bone);
  text-transform: uppercase;
  font-size: clamp(1.1rem, 3vw, 1.5rem);
  letter-spacing: 0.03em;
  margin-bottom: 1.75rem;
}

.hero-cta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
}

/* Entrada suave del texto del hero al cargar la página (no depende de scroll) */
@keyframes hero-fade-up {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: translateY(0); }
}
.hero-inner > * {
  animation: hero-fade-up 0.7s ease both;
}
/* 4 hijos ahora (eyebrow, h1, texto de apoyo, botones) — antes eran 6:
   se quitó el logo duplicado del hero y la cita se fundió con el h1. */
.hero-inner > *:nth-child(1) { animation-delay: 0s; }
.hero-inner > *:nth-child(2) { animation-delay: 0.08s; }
.hero-inner > *:nth-child(3) { animation-delay: 0.16s; }
.hero-inner > *:nth-child(4) { animation-delay: 0.24s; }

/* ------------------------------------------------------------
   5b. FRANJA DE CREDIBILIDAD (inspirada en nsoke.com)
   ------------------------------------------------------------ */
.credibility-strip {
  background: var(--color-white);
  border-bottom: 1px solid var(--color-border);
}

.credibility-grid {
  display: grid;
  gap: 0;
}
@media (min-width: 640px) {
  body .credibility-grid { grid-template-columns: none; }
}

.credibility-grid > .e-con-inner {
  display: grid !important;
  gap: 0;
  width: 100%;
}
@media (min-width: 640px) {
  .credibility-grid > .e-con-inner { grid-template-columns: repeat(3, 1fr); }
}
.credibility-item {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-4) var(--space-3);
  border-bottom: 1px solid var(--color-border);
  width: 100% !important;
}
.credibility-item:last-child { border-bottom: none; }

.credibility-icon {
  /* Íconos pequeños: encajan en el presupuesto de "acento como detalle"
     (junto con los checks de "Quiénes Somos"). */
  flex-shrink: 0;
  width: 2.75rem;
  height: 2.75rem;
  color: var(--color-accent);
}
.credibility-icon svg { width: 100%; height: 100%; }

.credibility-title {
  margin: 0;
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 1.05rem;
  color: var(--color-graphite);
  text-transform: uppercase;
  letter-spacing: 0.01em;
  line-height: 1.25;
}

/* ------------------------------------------------------------
   6. QUIÉNES SOMOS
   ------------------------------------------------------------ */
.quienes-grid {
  display: grid;
  gap: var(--space-5);
}

.quienes-media img {
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border-radius: var(--radius);
  box-shadow: var(--shadow-md);
}

.quienes-content {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}

.check-list li {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding: 0.6em 0;
  font-size: 1.05rem;
  font-weight: 500;
  border-bottom: 1px solid var(--color-border);
}
.check-list li:last-child { border-bottom: none; }

.check-mark {
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  margin-top: 0.15em;
  border-radius: 4px;
  background: var(--color-accent);
  position: relative;
}
.check-mark::after {
  content: "";
  position: absolute;
  left: 6px; top: 3px;
  width: 6px; height: 11px;
  border: solid var(--color-white);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}

.quienes-enfoque {
  background: var(--color-graphite);
  color: var(--color-white);
  border-radius: var(--radius);
  padding: var(--space-4);
  align-self: start;
}
.enfoque-label {
  font-family: var(--font-heading);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: rgba(255,255,255,0.7);
  font-size: 0.85rem;
  margin-bottom: 0.75rem;
}
.enfoque-text {
  font-size: 1.1rem;
  margin: 0;
}
.enfoque-text strong { color: var(--color-white); }

/* ------------------------------------------------------------
   7. BENEFICIOS DE UN SOLO INTERLOCUTOR
   ------------------------------------------------------------ */
.benefits-grid {
  display: grid;
  gap: var(--space-4);
}

.benefit-list li {
  position: relative;
  padding: 0.6em 0 0.6em 1.6em;
  color: var(--color-text-muted);
  border-bottom: 1px solid var(--color-border);
}
.benefit-list li:last-child { border-bottom: none; }
.benefit-list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 1.05em;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--color-graphite);
}

.benefit-callout {
  background: var(--color-graphite);
  color: var(--color-white);
  border-left: 4px solid rgba(255,255,255,0.3);
  border-radius: var(--radius);
  padding: 1.75rem 2rem;
  align-self: start;
  font-size: 1.1rem;
}
.benefit-callout strong { color: var(--color-white); }

/* ------------------------------------------------------------
   8. POR QUÉ GRUPO JGM (tarjetas con ícono)
   ------------------------------------------------------------
   Deliberadamente NO es el patrón de bloques numerados 01/02/03
   usado en el sitio de otro cliente (NSOKE): en su lugar son
   tarjetas con ícono ilustrado propio, fondo hueso y micro-
   interacción al pasar el mouse (levantamiento + borde grafito). */
.why-grid {
  display: grid;
  gap: var(--space-3);
  grid-template-columns: 1fr;
}

.why-card {
  background: var(--color-bone);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: var(--space-4);
  border-top: 3px solid transparent;
  transition: transform var(--transition), box-shadow var(--transition), border-color var(--transition);
}
.why-card:hover {
  transform: translateY(-5px);
  box-shadow: var(--shadow-md);
  border-top-color: var(--color-graphite);
}

.why-icon {
  width: 3rem;
  height: 3rem;
  margin-bottom: 1.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--color-white);
  color: var(--color-graphite);
  transition: background var(--transition), color var(--transition);
}
.why-icon svg { width: 1.5rem; height: 1.5rem; }
.why-card:hover .why-icon {
  background: var(--color-graphite);
  color: var(--color-white);
}
/* Puente WordPress: el widget "Icon Box" de Elementor dibuja su propio
   ícono dentro de ".elementor-icon-box-icon" (markup nativo del widget,
   no editable con "Clases CSS adicionales"); se igualan tamaño/color
   aquí en vez de con una clase, mismo patrón que .service-teaser. */
.why-card .elementor-icon-box-icon {
  width: 3rem;
  height: 3rem;
  margin-bottom: 1.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--color-white);
  color: var(--color-graphite);
  transition: background var(--transition), color var(--transition);
}
.why-card .elementor-icon-box-icon svg { width: 1.5rem; height: 1.5rem; }
.why-card:hover .elementor-icon-box-icon {
  background: var(--color-graphite);
  color: var(--color-white);
}

.why-card h3 {
  font-size: 1.1rem;
  color: var(--color-graphite);
  margin-bottom: var(--space-1);
}
.why-card p {
  color: var(--color-text-muted);
  font-size: 0.95rem;
  margin: 0;
}

/* ------------------------------------------------------------
   9. CITA / PULL-QUOTE
   ------------------------------------------------------------ */
.quote-banner {
  background: var(--color-graphite-light);
  color: var(--color-white);
  padding: 4rem 0;
  text-align: center;
}
.quote-banner blockquote,
/* Puente WordPress: el widget "Encabezado" de Elementor no ofrece
   <blockquote> como etiqueta HTML (solo h1-h6/div/span/p), así que la
   cita en Inicio usa la clase ".quote-text" sobre un <h2> en vez de la
   etiqueta real. Mismo resultado visual, selector adicional. */
.quote-banner .quote-text {
  margin: 0 auto 1rem;
  max-width: 60ch;
  font-family: var(--font-heading);
  font-weight: 500;
  font-size: clamp(1.2rem, 3vw, 1.7rem);
  line-height: 1.4;
  text-transform: none;
  letter-spacing: normal;
}
.quote-attribution {
  color: var(--color-bone);
  font-weight: 600;
  margin: 0;
}
.quote-banner .quote-text .elementor-heading-title { color: inherit !important; }
.quote-attribution p { color: inherit; }

/* ------------------------------------------------------------
   10. NUESTROS SERVICIOS
   ------------------------------------------------------------ */
.services-grid {
  display: grid;
  gap: var(--space-3);
  grid-template-columns: 1fr;
}

.service-card {
  background: var(--color-bone);
  border-radius: var(--radius);
  overflow: hidden;
  transition: transform var(--transition), box-shadow var(--transition);
}
.service-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
}
.service-media {
  aspect-ratio: 4 / 3;
  overflow: hidden;
}
.service-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.4s ease;
}
.service-card:hover .service-media img {
  transform: scale(1.05);
}
.service-card-body {
  padding: 1.75rem 2rem 2rem;
  border-top: 4px solid var(--color-accent);
}
.service-card h3 {
  font-size: 1.15rem;
  margin-bottom: 0.6rem;
}
.service-items {
  color: var(--color-text-muted);
  font-size: 0.95rem;
  margin: 0;
}

/* Tarjeta de servicio "completa" (página Nuestros Servicios): fila
   horizontal con imagen de un lado y contenido del otro, alternando de
   lado en cada una. Más espacio que la tarjeta compacta de arriba
   (que se sigue usando en el resumen de la página de Inicio) porque
   aquí cada servicio trae una descripción breve + sus sub-servicios
   con una línea de explicación cada uno. */
.service-detail-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-8);
}
.service-detail {
  display: grid;
  gap: var(--space-4);
  align-items: center;
}
.service-detail-media {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-md);
}
.service-detail-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.service-detail-body h3 {
  font-size: 1.4rem;
  margin-bottom: var(--space-1);
}
.service-detail-desc {
  color: var(--color-text-muted);
  font-size: 1.02rem;
  margin-bottom: 1.25rem;
}
.service-subitems {
  display: grid;
  gap: 0.9rem;
}
.service-subitems li {
  padding-left: 1.1rem;
  border-left: 3px solid var(--color-border);
}
.service-subitems strong {
  display: block;
  font-family: var(--font-heading);
  font-size: 0.95rem;
  letter-spacing: 0.02em;
  color: var(--color-graphite);
  margin-bottom: 0.15rem;
}
.service-subitems span {
  color: var(--color-text-muted);
  font-size: 0.92rem;
}

/* ------------------------------------------------------------
   11. METODOLOGÍA DE TRABAJO
   ------------------------------------------------------------ */
.timeline {
  display: grid;
  gap: 1.75rem;
  grid-template-columns: 1fr;
  counter-reset: step;
}
.timeline-step {
  position: relative;
  padding-left: 3.25rem;
}
.timeline-number {
  position: absolute;
  left: 0; top: 0;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: var(--color-graphite);
  color: var(--color-white);
  font-family: var(--font-heading);
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}
.timeline-step h3 {
  font-size: 1.05rem;
  margin-bottom: 0.25rem;
}
.timeline-step p {
  color: var(--color-text-muted);
  margin: 0;
  font-size: 0.95rem;
}

/* ------------------------------------------------------------
   12. CASOS DE ÉXITO
   ------------------------------------------------------------ */
.cases-grid {
  display: grid;
  gap: var(--space-3);
  grid-template-columns: 1fr;
}
.case-card {
  background: var(--color-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: 1.75rem;
  /* Grafito, no verde ni acento: el acento ya se usa en botones/foco/nav
     y esta es una superficie grande (borde de 3 tarjetas por página) —
     se evita saturar de color de marca. */
  border-bottom: 4px solid var(--color-graphite);
  transition: transform var(--transition), box-shadow var(--transition);
}
.case-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
}
.case-card h2,
.case-card h3 {
  /* h2 en casos-exito.html (primer nivel bajo el h1 de la página), h3 si
     en algún momento esta tarjeta se reutiliza dentro de otra sección. */
  font-size: 1.05rem;
  margin-bottom: 0.4rem;
}
.case-tag {
  color: var(--color-text-muted); /* mismo tratamiento que .section-eyebrow: etiqueta discreta, no naranja */
  font-weight: 600;
  font-size: 0.85rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-bottom: 0.6rem;
}
.case-card p:last-child {
  color: var(--color-text-muted);
  font-size: 0.95rem;
  margin: 0;
}

/* ------------------------------------------------------------
   13. CUMPLIMIENTO Y CONFIANZA LEGAL
   ------------------------------------------------------------ */
.compliance-list {
  display: grid;
  gap: var(--space-2);
  grid-template-columns: 1fr;
}
.compliance-list li,
/* Puente WordPress: los ítems de "compliance-list" son contenedores de
   Elementor (no <li> reales), así que llevan la clase ".compliance-item"
   además de la lista contenedora ".compliance-list". */
.compliance-list .compliance-item {
  background: var(--color-white);
  border: 1px solid var(--color-border);
  border-left: 4px solid var(--color-graphite);
  border-radius: var(--radius);
  padding: 1rem 1.25rem;
  font-weight: 500;
  color: var(--color-graphite);
}

/* ------------------------------------------------------------
   14. CONTACTO
   ------------------------------------------------------------ */
.contact-section {
  background: var(--color-bone);
}

.contact-grid {
  display: grid;
  gap: var(--space-5);
}

.contact-list {
  margin-bottom: 1.75rem;
}
.contact-list li,
/* Puente WordPress: los ítems de "contact-list" son contenedores de
   Elementor (no <li> reales), así que llevan la clase ".contact-item"
   además de la lista contenedora ".contact-list". */
.contact-list .contact-item {
  padding: 0.75em 0;
  border-bottom: 1px solid var(--color-border);
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
}
.contact-list li:last-child,
.contact-list .contact-item:last-child { border-bottom: none; }
.contact-list a {
  color: var(--color-graphite);
  font-weight: 600;
}
.contact-list a:hover { color: var(--color-accent); }

.contact-label {
  font-family: var(--font-heading);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 0.78rem;
  color: var(--color-text-muted);
}

.contact-whatsapp-btn { margin-bottom: 1.75rem; }

.social-links {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}
.social-icons {
  display: flex;
  gap: 0.75rem;
}
.social-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--color-graphite);
  color: var(--color-white);
  transition: background var(--transition), transform var(--transition);
}
.social-icon svg { width: 20px; height: 20px; fill: currentColor; }
.social-icon:hover { background: var(--color-accent); transform: translateY(-2px); }

/* Formulario */
.contact-form {
  background: var(--color-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  padding: var(--space-4);
}
.form-field {
  margin-bottom: 1.25rem;
  display: flex;
  flex-direction: column;
}
.form-field label {
  font-weight: 600;
  font-size: 0.92rem;
  margin-bottom: 0.4rem;
  color: var(--color-graphite);
}
.optional-tag {
  font-weight: 400;
  color: var(--color-text-muted);
}
.form-field input,
.form-field textarea {
  font-family: var(--font-body);
  font-size: 1rem;
  padding: 0.7em 0.85em;
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  background: var(--color-white);
  color: var(--color-text);
  resize: vertical;
}
.form-field input:focus,
.form-field textarea:focus {
  border-color: var(--color-accent);
}
.form-field.has-error input,
.form-field.has-error textarea {
  border-color: #d64545;
}
.form-error {
  color: #d64545;
  font-size: 0.85rem;
  margin-top: 0.35rem;
  min-height: 1.1em;
}
.form-submit { width: 100%; }
.form-status {
  margin-top: var(--space-2);
  font-weight: 600;
  text-align: center;
  min-height: 1.2em;
}
.form-status.is-success { color: #2f9e44; }
.form-status.is-error { color: #d64545; }
/* Aviso de que el formulario todavía no envía de verdad — ni éxito
   (sería engañoso) ni error, así que usa el acento en vez de verde/rojo. */
.form-status.is-demo { color: var(--color-accent-text); font-weight: 500; }

/* ------------------------------------------------------------
   15. PIE DE PÁGINA — solo contenido (RESTAURADO)
   ------------------------------------------------------------
   El contenedor del pie (.site-footer/.footer-inner/.footer-bottom) sí
   lo genera Blocksy de forma nativa (confirmado: su builder ya hace
   2 columnas lado a lado sin CSS propio), por eso esas 3 reglas siguen
   eliminadas. Pero la marca y los datos de contacto ahora son bloques
   nativos reales (Imagen + Párrafos / Lista) dentro de esas columnas,
   así que sí necesitan el estilo de contenido de abajo. */

/* Puente WordPress: al quitar ".site-footer" de arriba (porque Blocksy
   ya pone el fondo oscuro del pie por su cuenta) también se perdió sin
   querer su "color: rgba(255,255,255,.85)" — esa regla no solo ponía
   el contenedor, también era la que le daba su color de texto CLARO a
   todo el pie por herencia. Sin ella, el texto que no tiene su propio
   color explícito (teléfonos, correo, dirección, aviso de copyright)
   hereda el color oscuro de <body> — pensado para el fondo claro del
   resto del sitio — y queda casi invisible sobre el fondo oscuro del
   pie. El wrapper real en WordPress es el <footer class="ct-footer">
   nativo de Blocksy, no ".site-footer". */
.ct-footer {
  color: rgba(255,255,255,0.85);
}
body .ct-footer .ct-widget { color: inherit; }
body .ct-footer-copyright { color: inherit; }
.ct-footer-legal-link:hover { color: var(--color-accent); }

/* Puente WordPress: Blocksy envuelve el contenido de cada página en
   ".ct-container-full" con "padding: 60px 0" propio (respiro genérico
   del tema antes de pasar al pie). En el diseño original el contenido
   siempre llega hasta el borde del pie sin ese hueco — aquí se veía
   como una franja clara vacía entre la última sección oscura y el pie
   oscuro, en las 6 páginas. Solo se quita el padding de ABAJO: el de
   arriba no causa ningún salto visible (el header ya lo compensa) y
   tocarlo es innecesario. */
.ct-container-full {
  padding-bottom: 0 !important;
}

#header.ct-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 999;
}
.ct-container-full {
  padding-top: 70px !important;
}
@media (min-width: 1180px) {
  .ct-container-full { padding-top: 120px !important; }
}
[data-header*="type-1"] .ct-header [data-row*="middle"] {
  background-color: rgba(239, 231, 216, 0.94) !important;
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}

#offcanvas.ct-panel {
  background-color: var(--color-bone);
}

.footer-brand {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}
.footer-logo-img,
/* Puente WordPress: el bloque nativo "Imagen" pone la clase en el
   <figure> que envuelve la imagen, no en el <img> mismo — sin este
   selector adicional, height/filter no llegan a encoger ni invertir
   el logo real. */
.footer-logo-img img {
  height: 56px;
  width: auto;
  filter: invert(1) brightness(1.6);
  flex-shrink: 0;
}
.footer-name {
  font-family: var(--font-heading);
  color: var(--color-white);
  font-size: 1.1rem;
  margin: 0;
}
.footer-slogan {
  font-style: italic;
  font-size: 0.9rem;
  color: rgba(255,255,255,0.65);
  margin: 0.2rem 0 0;
}
.footer-contact {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  font-size: 0.92rem;
}
.footer-contact a:hover { color: var(--color-accent); }

/* ------------------------------------------------------------
   16. BOTÓN FLOTANTE DE WHATSAPP (RESTAURADO)
   ------------------------------------------------------------
   El propio elemento <a> ya no lo genera Blocksy (el cliente decidió
   que viva en el plugin de carga, ver Paso 4), pero su estilo es
   contenido igual que el resto de este archivo. */
.whatsapp-float {
  position: fixed;
  right: 1.25rem;
  bottom: 1.25rem;
  z-index: 900;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: #0c7a3c;
  color: var(--color-white);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md);
  transition: transform var(--transition);
  animation: wa-pulse 2.4s ease-in-out infinite;
}
.whatsapp-float:hover { transform: scale(1.08); }
.whatsapp-float .icon { width: 28px; height: 28px; fill: currentColor; }

@keyframes wa-pulse {
  0%, 100% { box-shadow: var(--shadow-md), 0 0 0 0 rgba(37, 211, 102, 0.5); }
  50% { box-shadow: var(--shadow-md), 0 0 0 10px rgba(37, 211, 102, 0); }
}

/* ------------------------------------------------------------
   17. SERVICIO DESTACADO (Dictamen Estructural)
   ------------------------------------------------------------
   Antes era una sola columna con imagen 16:9 a todo el ancho del
   contenedor: en escritorio llegaba a medir más de 600px de alto y
   dominaba la pantalla. Ahora es compacto a propósito (300-420px de
   alto en escritorio) para que siga siendo "el servicio más destacado"
   sin dejar de ser una tarjeta entre otras — el resto de los servicios
   de la página deben ser visibles con poco scroll debajo. */
.featured-service {
  display: grid;
  gap: 0;
  background: var(--color-graphite);
  color: var(--color-white);
  border-radius: var(--radius);
  overflow: hidden;
  margin-bottom: var(--space-5);
}
.featured-service-media {
  /* Móvil: altura fija (no 16:9) para que nunca pase de 220px, sin
     importar qué tan ancho sea el contenedor en ese rango. */
  height: 220px;
  overflow: hidden;
}
.featured-service-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Mantiene visible el sujeto principal (columna/viga) aunque el
     recorte cambie entre anchos — ajustar si la foto final lo requiere. */
  object-position: center 40%;
}
.featured-service-body {
  padding: 1.5rem 1.75rem;
  display: flex;
  flex-direction: column;
  align-items: start;
  justify-content: center;
}
.featured-service-tag {
  display: inline-block;
  font-family: var(--font-heading);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 0.75rem;
  /* Blanco atenuado, no acento: el botón de abajo ya es de acento — con
     la etiqueta también de acento se veía doble color en la misma tarjeta. */
  color: rgba(255,255,255,0.7);
  margin-bottom: 0.6rem;
}
.featured-service-body h2,
.featured-service-body h3 {
  /* el h2/h3 global es grafito; aquí va sobre fondo oscuro. Selector
     cubre ambos niveles porque el título cambia según la página: h3 si
     el bloque vive dentro de una sección con su propio h2 (como el
     resumen de Inicio), h2 si es el primer título bajo el h1 de la
     página (como en servicios.html). Tamaño reducido (antes 1.5rem)
     para que el bloque se vea compacto, no para restarle peso visual:
     sigue siendo el único título dentro de una tarjeta oscura. */
  color: var(--color-white);
  font-size: 1.25rem;
  margin-bottom: var(--space-1);
}
.featured-service-body p {
  color: rgba(255,255,255,0.8);
  font-size: 0.95rem;
  max-width: 48ch;
  margin-bottom: 0.75rem;
}
.featured-service-body .btn {
  margin-top: 0;
}

@media (min-width: 768px) {
  .featured-service {
    grid-template-columns: 38% 1fr;
    align-items: stretch;
    min-height: 320px;
  }
  .featured-service-media { height: auto; }
  .featured-service-body { padding: 2rem 2.5rem; }
  .featured-service-body h2,
  .featured-service-body h3 { font-size: 1.5rem; }
  .featured-service-body p { font-size: 1rem; }

  /* Solo en servicios.html (#capacidades es la sección que envuelve el
     dictamen + las tarjetas de servicio): se acorta el margen entre el
     dictamen y el título "Capacidades integrales" para que, a 1440x900,
     quepan el título de la página + el dictamen completo + el inicio de
     la primera tarjeta de servicio sin hacer scroll. No se toca
     .section-title en general porque el resto del sitio sí necesita el
     margen completo. */
  #capacidades .featured-service { margin-bottom: 0.75rem; }
  #capacidades .section-title { margin-bottom: 0.5rem; }
}

.services-intro {
  font-family: var(--font-heading);
  font-weight: 600;
  color: var(--color-graphite);
  margin-bottom: var(--space-3);
}

/* ------------------------------------------------------------
   18. [ELIMINADO — modal "Acceso clientes". Se quitó por completo
   (HTML, CSS y JS): era un placeholder temporal sin campos reales que
   en la fase 2 se reemplaza por el login real de WP Customer Area, así
   que no se reconstruyó aquí. El botón "Acceso clientes" del header
   ahora enlaza directo a la página /portal-clientes/.]
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   19. CASILLA DE AVISO DE PRIVACIDAD (formulario de contacto)
   ------------------------------------------------------------ */
.form-field-checkbox { margin-bottom: 1.5rem; }
.checkbox-label {
  display: flex;
  align-items: flex-start;
  gap: 0.6rem;
  font-weight: 400;
  font-size: 0.92rem;
  color: var(--color-text);
  cursor: pointer;
}
.checkbox-label input[type="checkbox"] {
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  margin-top: 0.15em;
  accent-color: var(--color-accent);
}
.checkbox-label a { color: var(--color-graphite); font-weight: 600; text-decoration: underline; }
.checkbox-label a:hover { color: var(--color-accent); }

/* ------------------------------------------------------------
   20. PÁGINA LEGAL (aviso-privacidad.html)
   ------------------------------------------------------------ */
.legal-section { padding-top: 2.5rem; }
.legal-container { max-width: 760px; }
.legal-container p,
.legal-container li { max-width: 70ch; } /* longitud de línea cómoda para lectura */
.legal-draft-notice {
  background: var(--color-bone);
  border-left: 4px solid var(--color-graphite);
  border-radius: var(--radius);
  padding: 1rem 1.25rem;
  font-size: 0.95rem;
  color: var(--color-text);
}
.legal-updated {
  color: var(--color-text-muted);
  font-size: 0.9rem;
  margin-bottom: var(--space-4);
}
.legal-container h2 {
  font-size: 1.15rem;
  margin-top: var(--space-4);
  /* Puente WordPress: el widget "Encabezado" de Elementor fija
     ".elementor-heading-title{margin:0}" con más especificidad que el
     reset base "h1,h2,h3,h4{margin:0 0 0.5em}" de este archivo, así que
     el margen inferior que el sitio estático hereda del reset se pierde
     aquí si no se repite explícito. */
  margin-bottom: 0.5em;
}
.legal-list,
/* Puente WordPress: el widget "Editor de texto" de Elementor pone la
   clase personalizada en el <div> que envuelve el contenido, no en el
   <ul> real pegado dentro (mismo patrón que .service-subitems) — sin
   este selector adicional, list-style/padding-left no llegan al <ul>. */
.legal-list ul {
  margin: 0 0 1em;
  padding-left: 1.25rem;
  list-style: disc;
}
.legal-list li { margin-bottom: 0.4em; }
.legal-contact-note {
  margin-top: var(--space-5);
  padding-top: var(--space-3);
  border-top: 1px solid var(--color-border);
  color: var(--color-text-muted);
}
.footer-legal-link { color: inherit; text-decoration: underline; }
.footer-legal-link:hover { color: var(--color-accent); }

/* Página 404 */
.error-404-content { text-align: center; }
.error-404-content .section-title { margin-left: auto; margin-right: auto; }
.error-404-content .lead { margin-bottom: var(--space-4); }
.error-404-content .hero-cta { justify-content: center; }

/* ------------------------------------------------------------
   21. ENCABEZADO DE PÁGINA INTERNA (page-hero)
   ------------------------------------------------------------
   Desde que el sitio se dividió en varias páginas, cada página interna
   (Quiénes Somos, Nuestros Servicios, Casos de Éxito, Contacto) usa este
   encabezado compacto en vez del hero a pantalla completa de Inicio —
   mismo fondo grafito que el footer, con breadcrumb + título único <h1>
   de esa página. */
.page-hero {
  background: var(--color-graphite);
  color: var(--color-white);
  padding: var(--space-6) 0 var(--space-6);
}
.breadcrumb {
  font-size: 0.85rem;
  color: rgba(255,255,255,0.6);
  margin-bottom: var(--space-3);
}
.breadcrumb a {
  /* Subrayado siempre visible: un enlace dentro de texto corrido no debe
     distinguirse solo por el color (falla de accesibilidad real,
     confirmada con Lighthouse). */
  color: rgba(255,255,255,0.85);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.breadcrumb a:hover { color: var(--color-accent); }
.breadcrumb span[aria-current] { color: rgba(255,255,255,0.6); }
.page-hero .eyebrow { color: rgba(255,255,255,0.7); margin-bottom: var(--space-1); }
.page-hero h1 {
  color: var(--color-white);
  font-size: clamp(1.9rem, 5vw, 3rem);
  margin-bottom: 0.4em;
}
.page-hero-lead {
  color: rgba(255,255,255,0.8);
  font-size: 1.1rem;
  max-width: 60ch;
  margin: 0;
}

/* ------------------------------------------------------------
   22. FRANJA DE LLAMADO A LA ACCIÓN (cta-band)
   ------------------------------------------------------------
   Cierre de cada página interna, antes del footer: siempre con el mismo
   par de acciones (WhatsApp + ir a Contacto) para que no haya ninguna
   página "sin salida". */
/* Fondo grafito, no naranja: es el bloque de mayor superficie del sitio
   (se repite en las 4 páginas internas), así que es el que más "pesaba"
   en la cantidad total de naranja visible. Grafito lo une visualmente al
   resto de los fondos oscuros del sitio (page-hero, footer, cita) y dentro
   el botón de WhatsApp (verde) sigue siendo la acción que más resalta. */
.cta-band {
  background: var(--color-graphite);
  color: rgba(255,255,255,0.85);
  padding: var(--space-8) 0;
  text-align: center;
}
.cta-band h2 {
  color: var(--color-white);
  font-size: clamp(1.4rem, 3.5vw, 2rem);
  margin-bottom: var(--space-1);
}
.cta-band p {
  color: rgba(255,255,255,0.8);
  max-width: 55ch;
  margin: 0 auto var(--space-4);
}
.cta-band-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
}
/* .btn-outline-light ya está pensado para fondos oscuros (borde/texto
   blanco) — con el fondo grafito de aquí funciona tal cual, sin
   necesidad de una variante propia como cuando el fondo era naranja. */

/* ------------------------------------------------------------
   23. RESUMEN EN INICIO (teasers que enlazan a cada página interna)
   ------------------------------------------------------------ */
.teaser-link {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 0.95rem;
  color: var(--color-accent-text);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
.teaser-link .arrow { transition: transform var(--transition); }
.teaser-link:hover .arrow { transform: translateX(4px); }
.teaser-link:hover { color: var(--color-accent-dark); }

/* Franja de confianza con los nombres de empresas con las que ya se
   trabajó (texto simple, sin logos ni carrusel — el cliente pidió
   evitar ambos). Solo aparece en el resumen de Casos de Éxito en Inicio. */
.trust-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.5rem;
  margin: var(--space-3) 0 var(--space-4);
}
.trust-strip span,
/* Puente WordPress: cada nombre de empresa es un widget "Encabezado"
   (se renderiza como <p>, no <span>) para que el cliente pueda
   editarlos desde el editor sin tocar código; misma regla por clase. */
.trust-strip .trust-strip-item {
  font-family: var(--font-heading);
  font-weight: 600;
  color: var(--color-text-muted);
  text-transform: uppercase;
  font-size: 0.85rem;
  letter-spacing: 0.02em;
}

/* Tarjetas compactas de servicio dentro del resumen de Inicio: versión
   simplificada de .service-card, sin lista de sub-servicios (esa vive
   en servicios.html). */
.service-teaser {
  display: block;
  text-align: center;
  padding: var(--space-4) var(--space-2);
  background: var(--color-bone);
  border-radius: var(--radius);
  border-top: 3px solid var(--color-border);
  transition: transform var(--transition), box-shadow var(--transition);
}
.service-teaser:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.service-teaser-icon,
/* Puente WordPress: el widget "Icon Box" de Elementor dibuja su propio
   ícono dentro de ".elementor-icon-box-icon" (markup nativo del widget,
   no editable con "Clases CSS adicionales"); se igualan tamaño/color
   aquí en vez de con una clase, ya que ese contenedor no es alcanzable
   desde el panel del widget. */
.service-teaser .elementor-icon-box-icon {
  width: 2.5rem;
  height: 2.5rem;
  margin: 0 auto var(--space-2);
  color: var(--color-graphite);
}
.service-teaser-icon svg { width: 100%; height: 100%; }
.service-teaser .elementor-icon-box-icon svg {
  width: 40px !important;
  height: 40px !important;
}
.service-teaser h3 {
  font-size: 1rem;
  margin: 0;
  color: var(--color-graphite);
}

/* ------------------------------------------------------------
   24. RESPONSIVE — TABLET (>= 640px) Y DESKTOP (>= 1024px)
   ------------------------------------------------------------ */
@media (min-width: 640px) {
  .why-grid { grid-template-columns: repeat(2, 1fr); }
  .cases-grid { grid-template-columns: repeat(2, 1fr); }
  .compliance-list { grid-template-columns: repeat(2, 1fr); }
  .hero-cta { flex-wrap: nowrap; }
  .credibility-grid { grid-template-columns: repeat(3, 1fr); }
  .credibility-item { border-bottom: none; border-right: 1px solid var(--color-border); }
  .credibility-item:last-child { border-right: none; }
}

@media (min-width: 768px) {
  .quienes-grid { grid-template-columns: 1fr 1.15fr; align-items: stretch; }
  /* En 1 columna (móvil) la imagen manda su propia relación de aspecto
     (4:3). De 768px en adelante, en cambio, se empareja con el texto:
     se estira a la altura completa de la fila en vez de aspect-ratio
     fijo, para no dejar un hueco vacío arriba/abajo cuando el texto es
     más alto que un recorte 4:3 permitiría. */
  .quienes-media img { height: 100%; aspect-ratio: auto; min-height: 320px; }
  .benefits-grid { grid-template-columns: 1.2fr 1fr; align-items: center; }
  .services-grid { grid-template-columns: repeat(3, 1fr); }
  .contact-grid { grid-template-columns: 1fr 1.3fr; }

  /* Tarjetas de servicio completas (servicios.html): imagen y contenido
     lado a lado, alternando de lado en cada fila para que la página no
     se vea como una sola columna repetitiva. */
  .service-detail { grid-template-columns: 1fr 1fr; }
  .service-detail:nth-child(even) .service-detail-media { order: 2; }

  /* Footer: la columna de contacto va alineada a la derecha para
     equilibrar con el logo a la izquierda. El grid de 2 columnas en sí
     (.footer-inner) ya lo pone Blocksy de forma nativa, por eso esa
     regla no está aquí — solo la alineación interna del contenido. */
  .footer-contact {
    align-items: flex-end;
    text-align: right;
  }
}

@media (min-width: 1024px) {
  .why-grid { grid-template-columns: repeat(4, 1fr); }
  .cases-grid { grid-template-columns: repeat(3, 1fr); }
  .compliance-list { grid-template-columns: repeat(4, 1fr); }

  .timeline {
    grid-template-columns: repeat(5, 1fr);
    gap: 1.25rem;
  }
  .timeline-step { padding-left: 0; padding-top: 3.5rem; }
  .timeline-number { left: 0; top: 0; }
}

/* ------------------------------------------------------------
   PUENTE WORDPRESS — ESPACIADO DE WIDGETS DENTRO DE CONTENEDORES
   FLEX (".e-con")
   ------------------------------------------------------------
   Elementor fuerza ".e-con .elementor-widget.elementor-widget {
   margin-block-end: 0}" (especificidad 0,3,0, en frontend.min.css, que
   carga DESPUÉS de este archivo) en todo widget que viva dentro de un
   contenedor flex — su sistema reemplaza el margen individual de cada
   widget por el "gap" del contenedor. Como casi toda esta página usa
   contenedores flex (es la estructura estándar de Elementor en este
   sitio), esa regla pisa el margin-bottom de CUALQUIER clase personalizada
   que pongamos directamente sobre el wrapper de un widget (el <div
   class="elementor-element ... [clase] elementor-widget ...">, no el
   contenido interno) — aunque la clase y el valor sean correctos, el
   margen inferior real queda en 0.
   Las reglas de abajo repiten la clase (misma, sin cambiar valores)
   repitiendo ".elementor-widget" tres veces para subir la especificidad
   a 0,4,0 y ganar siempre, sin depender del orden de carga. Si una de
   estas clases vive en realidad sobre un CONTENEDOR (no un widget), esta
   regla simplemente no aplica (un contenedor nunca lleva la clase
   "elementor-widget"), así que repetirlas aquí es inofensivo incluso
   para los casos en los que no hiciera falta. */
.elementor-widget.elementor-widget.elementor-widget.section-eyebrow { margin-bottom: var(--space-1); }
.elementor-widget.elementor-widget.elementor-widget.section-title { margin-bottom: var(--space-4); }
.elementor-widget.elementor-widget.elementor-widget.section-intro { margin-bottom: var(--space-4); }
.elementor-widget.elementor-widget.elementor-widget.eyebrow { margin-bottom: var(--space-2); }
.elementor-widget.elementor-widget.elementor-widget.hero-title { margin-bottom: 0.4em; }
.elementor-widget.elementor-widget.elementor-widget.hero-tagline { margin-bottom: 1.75rem; }
.elementor-widget.elementor-widget.elementor-widget.enfoque-label { margin-bottom: 0.75rem; }
.elementor-widget.elementor-widget.elementor-widget.contact-whatsapp-btn { margin-bottom: 1.75rem; }
.elementor-widget.elementor-widget.elementor-widget.services-intro { margin-bottom: var(--space-3); }
.elementor-widget.elementor-widget.elementor-widget.featured-service-tag { margin-bottom: 0.6rem; }
.elementor-widget.elementor-widget.elementor-widget.legal-updated { margin-bottom: var(--space-4); }
.elementor-widget.elementor-widget.elementor-widget.breadcrumb { margin-bottom: var(--space-3); }
.elementor-widget.elementor-widget.elementor-widget.case-tag { margin-bottom: 0.6rem; }
.elementor-widget.elementor-widget.elementor-widget.form-field-checkbox { margin-bottom: 1.5rem; }

/* ------------------------------------------------------------
   PUENTE WORDPRESS — WIDGET "BOTÓN" DE ELEMENTOR
   ------------------------------------------------------------
   A diferencia de Encabezado/Editor de texto (donde el contenido vive
   directo dentro del wrapper que lleva nuestra clase personalizada), el
   widget "Botón" de Elementor SIEMPRE anida el elemento real y
   clickeable (<a class="elementor-button">) DENTRO del wrapper — y ese
   <a> trae su propio fondo/padding/radio gris por defecto de Elementor,
   con más especificidad que nuestras reglas .btn-*. Confirmado en vivo:
   el wrapper (el que lleva "btn btn-primary", etc.) se pinta del color
   correcto, pero el botón real que el usuario ve y toca queda gris con
   su propio padding — un "botón dentro de otro botón", en los 10
   botones del sitio (home, servicios, quiénes somos, casos de éxito,
   contacto).
   Neutralizamos el wrapper (ya no debe verse) y repetimos el estilo
   real sobre ".elementor-button", el <a> verdadero. El texto y el
   ícono quedan dentro de spans propios de Elementor
   (.elementor-button-content-wrapper > .elementor-button-text /
   .elementor-button-icon) que no necesitan tocarse: heredan del <a>. */
.elementor-widget-button.btn {
  background: transparent;
  padding: 0;
  border: 0;
  min-height: auto;
}
.elementor-widget-button.btn .elementor-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5em;
  min-height: 44px;
  padding: 0.85em 1.75em;
  border-radius: var(--radius);
  font-weight: 600;
  font-size: 0.98rem;
  border: 2px solid transparent;
  transition: transform var(--transition), background var(--transition), box-shadow var(--transition);
  white-space: nowrap;
}
.elementor-widget-button.btn .elementor-button:hover { transform: translateY(-2px); }

.elementor-widget-button.btn-primary .elementor-button { background: var(--color-accent); color: var(--color-white); }
.elementor-widget-button.btn-primary .elementor-button:hover { background: var(--color-accent-dark); box-shadow: var(--shadow-sm); }
.elementor-widget-button.btn-primary .elementor-button:active { background: var(--color-accent-dark); transform: translateY(0); }

.elementor-widget-button.btn-outline-light .elementor-button { background: transparent; border-color: rgba(255,255,255,0.5); color: var(--color-white); }
.elementor-widget-button.btn-outline-light .elementor-button:hover { border-color: var(--color-white); background: rgba(255,255,255,0.08); }
.elementor-widget-button.btn-outline-light .elementor-button:active { background: rgba(255,255,255,0.16); transform: translateY(0); }

.elementor-widget-button.btn-outline .elementor-button { background: transparent; border-color: var(--color-graphite); color: var(--color-graphite); padding: 0.55em 1.1em; font-size: 0.9rem; }
.elementor-widget-button.btn-outline .elementor-button:hover { background: var(--color-graphite); color: var(--color-white); }
.elementor-widget-button.btn-outline .elementor-button:active { background: var(--color-graphite-dark); transform: translateY(0); }

.elementor-widget-button.btn-whatsapp .elementor-button { background: #0c7a3c; color: var(--color-white); }
.elementor-widget-button.btn-whatsapp .elementor-button:hover { background: #0a6b34; box-shadow: var(--shadow-sm); }
.elementor-widget-button.btn-whatsapp .elementor-button:active { background: #095c2c; transform: translateY(0); }

.elementor-widget-button.btn-whatsapp-small .elementor-button { background: #0c7a3c; color: var(--color-white); padding: 0.55em 1.1em; font-size: 0.9rem; }
.elementor-widget-button.btn-whatsapp-small .elementor-button:hover { background: #0a6b34; }
.elementor-widget-button.btn-whatsapp-small .elementor-button:active { background: #095c2c; }

/* "Conoce más sobre nosotros" (home): en el sitio estático es un enlace
   de texto plano con flecha, no un botón relleno — pero el widget Botón
   de Elementor igual le pone chrome gris de botón por defecto al <a>.
   Lo neutralizamos aquí también para que se vea como enlace de texto. */
.elementor-widget-button.teaser-link {
  background: transparent;
  padding: 0;
}
.elementor-widget-button.teaser-link .elementor-button {
  display: inline-flex;
  align-items: center;
  gap: 0.4em;
  background: transparent;
  border: 0;
  border-radius: 0;
  padding: 0;
  min-height: auto;
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 0.95rem;
  color: var(--color-accent-text);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
.elementor-widget-button.teaser-link .elementor-button:hover { color: var(--color-accent-dark); transform: none; }

.why-grid > *,
.cases-grid > *,
.compliance-list > *,
.quienes-grid > *,
.benefits-grid > *,
.services-grid > *,
.contact-grid > *,
.service-detail > *,
.timeline > * {
  width: 100% !important;
}

nav.header-menu-1 ul.menu {
  gap: 1.25rem !important;
}
.ct-menu-link {
  font-size: 16px !important;
}
.service-teaser .elementor-icon-box-icon a.elementor-icon {
  padding: 0 !important;
  width: 40px !important;
  height: 40px !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
}
.section-cta {
  margin-top: 0 !important;
  padding-top: 0 !important;
}

.service-teaser {
  height: 100% !important;
}

.elementor-widget-button.btn .elementor-button,
.elementor-widget-button.teaser-link .elementor-button {
  text-transform: none !important;
}

.elementor-widget-button.btn .elementor-button {
  line-height: 1.6 !important;
}

.cta-band .e-con-inner {
  gap: 0 !important;
}
.cta-band p {
  margin-bottom: var(--space-4) !important;
}

body #footer.ct-footer {
  background-color: rgb(22, 30, 38) !important;
}
.ct-footer-copyright {
  text-align: center !important;
}
