/* ==========================================================================
   EGS — Header, footer y secciones de página
   ========================================================================== */

/* --------------------------------------------------------------------------
   Header
   -------------------------------------------------------------------------- */

.egs-header {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 100;
  height: var(--header-h);
  display: flex;
  align-items: center;
  transition: background-color var(--dur) var(--ease), backdrop-filter var(--dur) var(--ease);
}

/* Pequeño aire respecto al borde superior de la ventana en desktop:
   logo y botón de menú quedaban pegados del todo arriba. No se toca
   --header-h (la usan también el hueco del menú desplegable y el
   padding-top de los heroes), solo se empuja el contenido dentro de
   la misma altura fija del header. */
@media (min-width: 768px) {
  .egs-header__inner { padding-top: 8px; }
}

/* En páginas sin hero a sangre, el header lleva fondo sólido desde el
   principio (se ve directamente sobre el contenido normal de la página,
   no sobre una foto). */
.egs-header--solid {
  background: var(--color-ink);
}

/* Sobre un hero transparente, al hacer scroll el header gana un fondo
   translúcido con blur (glassmorphism) en vez de un color sólido plano —
   deja ver el contenido que pasa por debajo, atenuado. */
.egs-header.is-scrolled {
  background: rgba(3, 3, 4, .55);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
}

/* El header es siempre fixed y no ocupa espacio en el flujo: en páginas
   sin hero (que antes contaban con que el header, position:relative,
   empujara el contenido) hay que dejarle hueco manualmente. */
body.egs-solid-header #content { padding-top: var(--header-h); }

.egs-header__inner {
  width: 100%;
  /* Mismo ancho que el resto de secciones (--content-max), para que el
     logo y el botón de menú queden alineados con el contenido de abajo. */
  max-width: var(--content-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
}

.egs-brand {
  display: flex;
  align-items: center;
  min-width: 0;
}

.egs-brand__logo {
  flex: 0 0 auto;
  width: auto;
  height: 48px;
}

@media (min-width: 768px) {
  .egs-brand__logo { height: 58px; }
}

/* Botón hamburguesa: las dos capas se cruzan con giro + fundido. */
.egs-menu-toggle {
  position: relative;
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-btn);
  background: rgba(217, 217, 217, .5);
  backdrop-filter: blur(6px);
  display: grid;
  place-items: center;
  transition: background-color var(--dur) var(--ease);
}
.egs-menu-toggle:hover { background: rgba(217, 217, 217, .68); }

@media (min-width: 768px) {
  .egs-menu-toggle { width: auto; min-width: 109px; height: 45px; border-radius: 6.75px; padding-inline: 20px; }
}

.egs-menu-toggle__layer {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  transition: opacity var(--dur) var(--ease);
}

/* El giro se aplica solo al icono, no a toda la capa: con el label
   "Menú"/"Cerrar" visible en escritorio, rotar el texto junto al icono
   se veía mal (el botón entero parecía inclinarse). */
.egs-menu-toggle__icon {
  width: 18px;
  height: auto;
  flex: 0 0 auto;
  transition: transform var(--dur) var(--ease);
}

.egs-menu-toggle__label {
  display: none;
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: clamp(11px, 0.2vw + 10px, 14px);
  color: var(--color-white);
  white-space: nowrap;
}

@media (min-width: 768px) {
  .egs-menu-toggle__label { display: block; }
}

.egs-menu-toggle__layer--close {
  opacity: 0;
}
.egs-menu-toggle__layer--close .egs-menu-toggle__icon {
  transform: rotate(-90deg);
}

.egs-menu-toggle[aria-expanded="true"] .egs-menu-toggle__layer--open {
  opacity: 0;
}
.egs-menu-toggle[aria-expanded="true"] .egs-menu-toggle__layer--open .egs-menu-toggle__icon {
  transform: rotate(90deg);
}
.egs-menu-toggle[aria-expanded="true"] .egs-menu-toggle__layer--close {
  opacity: 1;
}
.egs-menu-toggle[aria-expanded="true"] .egs-menu-toggle__layer--close .egs-menu-toggle__icon {
  transform: rotate(0deg);
}

/* Panel del menú: se desliza desde detrás del header, que sigue visible. */
.egs-nav-panel {
  position: fixed;
  top: var(--header-h);
  left: var(--gutter);
  right: var(--gutter);
  z-index: 90;
  max-height: calc(100vh - var(--header-h) - 24px);
  overflow-y: auto;
  padding: 22px 26px 24px;
  border-radius: var(--radius-card);
  background: var(--color-white);
  box-shadow: 0 24px 60px rgba(11, 31, 30, .22);
  /* Arranca desplazado hacia arriba y transparente: al abrir parece salir de
     detrás del header en vez de aparecer cortado en seco. */
  opacity: 0;
  transform: translateY(-14px) scale(.98);
  transform-origin: top center;
  visibility: hidden;
  pointer-events: none;
  transition: opacity var(--dur) var(--ease),
              transform var(--dur) var(--ease),
              visibility 0s linear var(--dur);
}

.egs-nav-panel.is-open {
  opacity: 1;
  transform: translateY(0) scale(1);
  visibility: visible;
  pointer-events: auto;
  transition: opacity var(--dur) var(--ease),
              transform var(--dur) var(--ease),
              visibility 0s;
}

@media (min-width: 768px) {
  .egs-nav-panel {
    left: auto;
    /* Debe alinearse con el borde derecho real del botón de menú, que
       vive dentro de .egs-header__inner (max-width:var(--content-max),
       centrado). En pantallas de hasta ese ancho eso coincide con el
       borde del viewport (right:var(--gutter) a secas bastaría), pero en
       monitores más anchos el header queda centrado con un hueco a cada
       lado, así que hay que sumar ese hueco para no desalinearse del
       botón. */
    right: max(var(--gutter), calc((100vw - var(--content-max)) / 2 + var(--gutter)));
    width: min(420px, calc(100vw - 2 * var(--gutter)));
  }
}

.egs-nav-panel__heading {
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: clamp(10px, 0.15vw + 9px, 12px);
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--color-primary-light);
  margin-bottom: 8px;
}

.egs-nav-panel__list { display: grid; gap: 0; margin-bottom: 16px; }

.egs-nav-panel__list a {
  display: flex;
  align-items: center;
  gap: 12px;
  /* padding:12px (antes 5px, "compacto a propósito"): con solo 5px el
     área de toque real medía ~30px de alto, por debajo del mínimo
     táctil recomendado (44px) — si el panel necesita scroll en
     pantallas muy bajas para caber, se prioriza que los enlaces sean
     cómodos de tocar. */
  padding: 12px 0;
  font-family: var(--font-body);
  font-weight: 500;
  font-size: clamp(17px, 0.5vw + 15px, 20px);
  line-height: 1.2;
  color: var(--color-ink);
  transition: color var(--dur) var(--ease);
}
.egs-nav-panel__list a:hover,
.egs-nav-panel__list .current-menu-item > a { color: var(--color-primary); }

.egs-nav-panel__list svg,
.egs-nav-panel__list img { width: 22px; height: 22px; color: var(--color-primary); }

.egs-nav-panel__divider {
  height: 1px;
  background: #E8E8E8;
  margin: 0 0 16px;
}

.egs-cart-count {
  display: inline-grid;
  place-items: center;
  min-width: 18px;
  height: 18px;
  padding-inline: 5px;
  border-radius: 99px;
  background: var(--color-primary);
  color: var(--color-white);
  font-family: var(--font-ui);
  font-size: clamp(10px, 0.1vw + 9.5px, 11px);
  line-height: 1;
}

body.egs-nav-open,
body.egs-cart-open { overflow: hidden; }

/* --------------------------------------------------------------------------
   Hero
   -------------------------------------------------------------------------- */

.egs-hero {
  position: relative;
  overflow: hidden;
  /* overflow:hidden también en mobile (antes solo lo ponía
     .egs-hero--home dentro del media query de escritorio): sin esto la
     mitad del resplandor de la costura (.egs-hero__seam-glow) se salía
     sin recortar por debajo del hero en mobile. */
  /* Columna, no fila: el hero apila el bloque de texto y, debajo, el de
     estadísticas. En fila ambos se repartían el ancho y las cifras quedaban
     comprimidas fuera de la pantalla. */
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  min-height: 640px;
  padding-top: calc(var(--header-h) + 40px);
  padding-bottom: 40px;
  background: var(--color-ink);
}

/* El hero de portada ocupa la pantalla completa en móvil: el contenido
   (titular, CTA, stats) queda anclado abajo del todo, como en el Figma.
   Altura fija (no min-height): con min-height + 100vh, en navegadores
   móviles que ocultan la barra de direcciones al hacer scroll, 100vh se
   recalcula y la sección "salta"/crece de golpe.
   100dvh (dynamic viewport height) evita el salto brusco, pero en
   iOS Safari y varios Android SIGUE recalculándose en tiempo real
   mientras la barra de direcciones se anima durante el gesto de
   scroll — se percibe como que el hero "crece" de forma continua, no
   de golpe, pero igual de raro. 100svh (small viewport height) usa
   siempre la altura mínima, con la barra de direcciones totalmente
   visible: no se recalcula en absoluto durante el scroll, así que el
   hero queda con una altura fija de verdad. Consecuencia aceptada: en
   navegadores donde la barra se oculta, queda un margen inferior del
   tamaño de esa barra bajo el hero en vez de aprovechar el resto del
   alto real disponible. */
@media (max-width: 767px) {
  .egs-hero--home {
    height: 100vh;
    height: 100svh;
  }
}

@media (min-width: 768px) {
  .egs-hero { min-height: 680px; justify-content: center; }
  /* En escritorio el hero de portada vuelve a su alto propio: a pantalla
     completa en desktop se ve un vacío enorme sobre pantallas muy altas.
     El contenido debe seguir anclado abajo, igual que en mobile: se
     fuerza justify-content:flex-end aquí porque .egs-hero (misma
     especificidad, regla de arriba) pone center y por cascada normal
     ganaría sobre la simple ausencia de la propiedad en .egs-hero--home. */
  .egs-hero--home { min-height: 860px; justify-content: flex-end; }
  .egs-hero--home .egs-hero__inner { padding-bottom: 0; }
  .egs-hero--home .egs-hero__stats { margin-top: 70px; }

  /* Dato del Figma (pantalla de escritorio): el hero de portada no va a
     sangre completa arriba ni a los lados, con un margen de 10px
     respecto al borde de la ventana y esquinas superiores redondeadas
     (radio 22px), dejando ver el fondo blanco de la página alrededor.
     Por abajo sigue sin margen ni redondeo, fundiéndose con la sección
     siguiente. overflow:hidden en el propio .egs-hero--home (no solo en
     .egs-hero__media) para que el border-radius recorte de verdad todo
     lo que hay dentro del hero (foto, velo, stats) sin depender de que
     cada capa interna tenga su propio recorte redondeado. */
  .egs-hero--home {
    margin: 10px 10px 0;
    border-radius: 22px 22px 0 0;
    overflow: hidden;
  }

  /* Mismo motivo que .egs-hero--home arriba: .egs-hero pone
     justify-content:center en este media query, y hay que forzar
     flex-end explícitamente para que el contenido siga anclado abajo. */
  /* min-height en px fijos no se adapta a la ventana real: en
     pantallas más bajas (portátiles con poca altura de viewport) el
     botón/stats quedaban cortados fuera de la vista sin hacer scroll.
     100vh con tope en 1000px (el dato de Figma) para que en ventanas
     más pequeñas el hero completo (titular, CTA, stats) quepa de un
     vistazo, sin superar la altura de diseño en pantallas grandes. */
  .egs-hero--compact { justify-content: flex-end; min-height: min(100vh, 1000px); }
}

/* Como en el Figma (Emerfit y el resto de páginas interiores): texto
   centrado, no alineado a la izquierda. Cardioprotección es la
   excepción confirmada por captura de Figma (egs-hero--left): ahí el
   texto va a la izquierda, como el resto de contenido de esa página. */
.egs-hero--compact .egs-hero__inner { text-align: center; }
.egs-hero--compact .egs-hero__title,
.egs-hero--compact .egs-h1 { margin-inline: auto; }
.egs-hero--compact .egs-hero__text { margin-inline: auto; }
.egs-hero--compact .egs-hero__actions { justify-content: center; }

.egs-hero--compact.egs-hero--left .egs-hero__inner { text-align: left; }
.egs-hero--compact.egs-hero--left .egs-hero__title,
.egs-hero--compact.egs-hero--left .egs-h1 { margin-inline: 0; }
.egs-hero--compact.egs-hero--left .egs-hero__text { margin-inline: 0; }
.egs-hero--compact.egs-hero--left .egs-hero__actions { justify-content: flex-start; }

.egs-hero__media {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}
.egs-hero__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Overlay negro de baja opacidad sobre la foto, independiente del
   degradado teal (.egs-hero__veil): oscurece la imagen de forma
   uniforme en toda su superficie, en vez de solo hacia abajo. */
.egs-hero__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .28);
}

/* Velo que oscurece la foto hacia abajo y la funde con la sección
   siguiente. Dos capas superpuestas:
   1) El lineal blanco de base (transparente hasta el 55%, opaco al
      100%) sigue haciendo su trabajo de oscurecer/fundir la foto con
      blanco hacia el borde recortado de .egs-hero--home.
   2) Por encima, la mitad superior del mismo radial teal exacto del
      Figma (Group 4805 — ver .egs-section--courses-glow::before en la
      sección de cursos, la otra mitad de esta misma pieza) para que
      el resplandor se vea también sobre la foto, no solo por debajo
      del hero: ambas mitades comparten centro horizontal y radio para
      leerse como una sola forma continua atravesando la costura
      recortada del hero. */
.egs-hero__veil {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg,
              rgba(255, 255, 255, 0) 55%,
              var(--color-white) 100%);
}

/* Mitad superior del resplandor teal que atraviesa la costura entre
   el hero y la sección de cursos (Group 4805 en Figma): comparte
   centro horizontal y radio con .egs-section--courses-glow::before
   (la otra mitad) para leerse como una sola forma continua. Se
   recorta en el overflow:hidden de .egs-hero--home. */
.egs-hero__seam-glow {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -310px;
  width: 100vw;
  height: 620px;
  margin-left: -50vw;
  transform: none;
  background: radial-gradient(ellipse 50% 50% at 50% 50%,
              var(--color-primary) 0%,
              rgba(255, 255, 255, 0) 75%);
  opacity: 1;
  filter: blur(40px);
  pointer-events: none;
  z-index: 1;
}

/* Segundo velo, radial y centrado sobre el titular: apaga específicamente el
   logo del chaleco que cae justo detrás del texto, sin oscurecer los bordes
   de la foto (que ya quedan tapados por el degradado vertical de arriba). */
.egs-hero--home .egs-hero__veil::after {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse 46% 40% at 50% 42%,
              rgba(11, 31, 30, .55) 0%,
              rgba(11, 31, 30, 0) 70%);
}

.egs-section--courses-glow { position: relative; overflow: hidden; background: var(--color-white); }
/* Mitad inferior del mismo resplandor (ver .egs-hero__seam-glow). */
.egs-section--courses-glow::before {
  content: "";
  position: absolute;
  left: 50%;
  top: -310px;
  width: 100vw;
  height: 620px;
  margin-left: -50vw;
  transform: none;
  background: radial-gradient(ellipse 50% 50% at 50% 50%,
              var(--color-primary) 0%,
              rgba(255, 255, 255, 0) 75%);
  opacity: 1;
  filter: blur(40px);
  pointer-events: none;
  z-index: 0;
}

.egs-hero__inner {
  position: relative;
  z-index: 3;
  width: 100%;
  max-width: var(--content-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* El hero de portada centra su contenido, como en el diseño (todos los anchos). */
.egs-hero--home .egs-hero__inner { text-align: center; }
.egs-hero--home .egs-hero__actions { justify-content: center; }
.egs-hero--home .egs-hero__title { margin-inline: auto; max-width: 20ch; }

/* En móvil los contadores van en su propio bloque bajo el texto, dentro del
   flujo: anclarlos en absoluto los sacaría del alto del hero. En escritorio
   pasan a estar anclados al pie (más abajo, en su media query). */
@media (max-width: 767px) {
  /* El hero es columna; este bloque ocupa el ancho completo y cierra el hero,
     por lo que no necesita crecer: solo separarse del botón. */
  .egs-hero--home .egs-hero__stats {
    margin-top: 10px;
    width: 100%;
  }

  /* El hero ocupa la pantalla completa (ver .egs-hero--home más arriba),
     con el contenido anclado abajo del todo. */
  .egs-hero--home { padding-bottom: 34px; }

  /* Slider: la stat central se ve completa y las de los lados asoman
     cortadas por el borde de pantalla (ver .egs-stats en components.css). */
  .egs-hero--home .egs-hero__stats { width: 100%; }
}

.egs-hero__title { margin-bottom: 24px; }

/* El titular de portada gana presencia en móvil, como en el Figma
   (dato exacto: 65.9px). Antes era un valor fijo de 62px solo hasta
   767px, y a partir de 768px entraba el clamp() del .egs-h1 base
   (clamp(46px,4vw+20px,78px)), que en ese punto exacto del viewport
   solo da ~51px: un salto brusco hacia abajo justo al cruzar a tablet.
   Un único clamp sin corte de breakpoint (sin max-width:767px) evita
   ese salto: empieza en 62px y crece de forma continua. */
.egs-hero--home .egs-hero__title { font-size: clamp(62px, 4vw + 42px, 78px); }

.egs-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 12px;
}

.egs-hero__eyebrow {
  font-family: var(--font-body);
  font-weight: 500;
  /* Datos exactos del panel de Figma: 14.74px, letter-spacing 22%. */
  font-size: clamp(11px, 0.25vw + 10px, 14px);
  letter-spacing: .22em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .82);
  margin-bottom: 4px;
}

.egs-hero__text {
  color: rgba(255, 255, 255, .92);
  max-width: 52ch;
  margin-bottom: 26px;
  line-height: 1.2;
}

/* Lista de sellos bajo los CTA del hero desktop */
.egs-hero__proof {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 18px;
  font-family: var(--font-ui);
  font-size: clamp(10px, 0.2vw + 9px, 13px);
  color: rgba(255, 255, 255, .9);
}
.egs-hero__proof li { display: flex; align-items: center; gap: 7px; }

/* El bloque de stats se apoya sobre el final del hero.
   En escritorio el hero centra su contenido verticalmente (align-items:center),
   así que las stats deben salir del flujo flex y anclarse abajo a lo ancho,
   en vez de quedar como una columna estrecha a la derecha del titular. */
.egs-hero__stats {
  position: relative;
  z-index: 3;
  margin-top: 28px;
}

@media (min-width: 768px) {
  .egs-hero {
    /* Deja hueco al pie de stats anclado (páginas interiores). */
    padding-bottom: 118px;
  }

  .egs-hero__stats {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 34px;
    margin-top: 0;
  }

  /* La portada no ancla las stats al pie del hero: van en el flujo normal,
     justo bajo el botón, con aire propio, tal como en el Figma de escritorio. */
  .egs-hero--home {
    padding-bottom: 70px;
  }
  .egs-hero--home .egs-hero__stats {
    position: relative;
    bottom: auto;
    width: 100%;
    max-width: var(--content-max);
    margin-inline: auto;
    padding-inline: var(--gutter);
    box-sizing: border-box;
  }

  /* A lo ancho las tres cifras caben: se centran y no necesitan carrusel. */
  .egs-hero__stats .egs-stats {
    justify-content: center;
    gap: 46px;
    overflow-x: visible;
    cursor: default;
  }

  /* En la portada el padding lateral ya lo pone .egs-hero__stats: quitarlo
     aquí para no duplicarlo. En páginas interiores (bloque anclado a todo
     el ancho del hero) .egs-stats sigue necesitando su propio padding. */
  .egs-hero--home .egs-hero__stats .egs-stats { padding-inline: 0; }
}

/* Hero corto para páginas interiores */
/* Misma altura que el hero de portada (--home no la toca, así que hereda
   el min-height:640px/680px de .egs-hero) y el mismo anclaje abajo
   (flex-end, ya heredado): antes --compact reducía el min-height a
   420px, dejando mucho menos aire para separar el titular/texto/botón
   entre sí y contra el borde del hero. */

/* Dato exacto del panel de Figma para el titular de estos heroes
   (EMERFIT, Cardioprotección...): 53.09px en mobile, 96px desde
   escritorio (992px, ver más abajo). Fusionado en un único clamp que
   crece de forma continua entre ambos valores, sin el salto brusco
   que dejaba el corte fijo en el breakpoint. */
.egs-hero--compact .egs-h1 { font-size: clamp(52px, 4vw + 30px, 96px); }

/* Hero del catálogo de cursos: la foto de fondo (cursos-hero.jpg) tiene
   un cartel "Área cardioprotegida" en la mitad baja del encuadre. Con
   el min-height:640px heredado (igual que el resto de heroes
   --compact) y el contenido anclado abajo, el titular caía justo
   encima de ese cartel. Se reduce la altura mínima solo para esta
   página en vez de tocar la imagen. */
.egs-hero--compact.egs-hero--shop { min-height: 360px; }
@media (min-width: 768px) {
  .egs-hero--compact.egs-hero--shop { min-height: 460px; }
}

/* Dato exacto del panel de Figma: SansPlomb 54.75px, line-height 42.5px
   (unitless ~0.78). Más pequeño que el .egs-h1 estándar (clamp hasta
   78px), que en esta página se veía desproporcionado. */
.egs-hero--shop__title {
  font-size: clamp(2.25rem, 5vw + 1.5rem, 3.4375rem);
  line-height: 0.78;
}

/* Dos capas exactas del panel de Figma sobre la foto:
   1) Radial 57A09A (centro) -> 030304 al 20% del radio (viñeta teal
      que se oscurece rápido hacia los bordes).
   2) Linear 000000 100% (arriba) -> 000000 0% (abajo), por encima del
      radial.
   bottom:0 (no el -60px heredado de .egs-hero__veil base): esa
   extensión existe en el resto del sitio para fundir el velo con la
   sección siguiente y termina en blanco; aquí no aplica ese patrón. */
.egs-hero--shop .egs-hero__veil {
  bottom: 0;
  background:
    linear-gradient(180deg, rgba(0, 0, 0, .55) 0%, rgba(0, 0, 0, 0) 100%),
    radial-gradient(circle at center, rgba(87, 160, 154, .7) 0%, rgba(3, 3, 4, .85) 20%, rgba(3, 3, 4, 0) 60%);
}

/* El H1 de estos heroes no usa la clase .egs-hero__title (con su propio
   margin-bottom), así que se queda sin separación propia respecto al
   párrafo siguiente — el margin-bottom de éste solo empuja hacia abajo
   de sí mismo, no separa de lo que viene antes. */
.egs-hero--compact .egs-h1 { margin-bottom: 34px; }

/* Sin esto el titular se estira hasta el ancho completo de
   .egs-hero__inner (max-width:var(--content-max), 1600px), quedando en
   una sola línea gigantesca en desktop en vez de partirse en 2-3 líneas
   legibles, como en el resto de titulares grandes del sitio.
   Dato exacto del panel de Figma (Emerfit): el bloque de texto mide
   948px de ancho con font-size:132.54px — bastante más grande que el
   clamp() genérico (topado en 78px) y más ancho que 22ch, que dejaba
   el titular más estrecho y pequeño de lo que marca el diseño. */
@media (min-width: 992px) {
  .egs-hero--compact .egs-h1 { max-width: 17ch; }
  /* Cardioprotección: a 17ch el titular queda innecesariamente
     estrecho (no hay dato de Figma en escritorio para esta página). */
  .egs-hero--left .egs-h1 { max-width: 19ch; }
  /* Nosotros: el 17ch genérico (pensado para Emerfit, con su propio
     dato de Figma) parte el titular en 3 líneas cortas y estrechas —
     pedido explícito de ensanchar. */
  .page-template-page-nosotros .egs-hero--compact .egs-h1 { max-width: 26ch; }
}

.egs-hero--compact .egs-hero__veil {
  background: none;
}

/* Altura uniforme para TODOS los heroes que llevan --emerfit: algunas
   páginas (home con min-height:860px, shop con 460px) sobreescriben
   el min-height genérico de .egs-hero--compact (1000px) con el suyo
   propio, con la misma o mayor especificidad de selector — sin este
   override explícito, esas páginas se veían visiblemente más bajas
   que Emerfit pese a compartir el resto del aspecto. */
@media (min-width: 992px) {
  .egs-hero--emerfit {
    min-height: min(100vh, 1000px) !important;
  }
}

/* Dato exacto del panel de Figma ("image 1"): no el overlay plano
   genérico del resto del sitio, sino 2 capas propias — negro 30%
   uniforme + un degradado lineal vertical que oscurece la parte
   INFERIOR de la foto (donde vive el titular), quedando la superior
   más clara. */
.egs-hero--emerfit .egs-hero__media::after {
  z-index: 2;
  /* Termina en negro puro (100%, no .85): se funde con el degradado
     superior de .egs-emerfit-banner (la sección siguiente), también
     negro puro en su borde de arriba, para que la costura entre
     ambas no se note como un corte. */
  background: linear-gradient(180deg,
              rgba(0, 0, 0, .15) 0%,
              rgba(0, 0, 0, .3) 40%,
              rgba(0, 0, 0, 1) 90%);
}

/* Dato exacto del SVG exportado de Figma (paint1_radial/paint2_radial,
   gradientTransform con translate/scale reales, no el bounding box
   del rect sin transformar): 2 manchas radiales teal casi idénticas,
   centradas en la mitad INFERIOR del frame — X≈46.5%/51.3%,
   Y≈79.6%/75.2% sobre 1920×1065 — con radio 116%/65% y blur fuerte
   (feGaussianBlur stdDeviation:77.97 ≈ 4% del ancho del frame). */
.egs-hero--emerfit .egs-hero__media::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  background:
    radial-gradient(ellipse 116% 65% at 46.5% 68%,
                rgba(87, 160, 154, .9) 0%,
                rgba(3, 3, 4, 0) 81%),
    radial-gradient(ellipse 116% 65% at 51.3% 64%,
                rgba(87, 160, 154, .9) 0%,
                rgba(3, 3, 4, 0) 81%);
  filter: blur(80px);
}

/* Más separación entre el bloque título+párrafo y la fila de stats
   del hero de Emerfit (grupos claramente distintos). En desktop
   .egs-hero__stats es position:absolute con bottom fijo (ver arriba),
   así que margin-top no separa nada ahí — hay que empujar el bloque
   de texto hacia arriba en su lugar. */
.egs-hero--emerfit .egs-hero__inner {
  margin-bottom: 80px;
}

/* Franja de foto decorativa entre el hero y "Qué es Emerfit" (dato de
   Figma): imagen + degradado negro superior (Linear 70%, opaco arriba
   a transparente abajo) + texto superpuesto abajo a la derecha, sin
   card ni fondo adicional. Alto real de Figma: 696px. */
.egs-emerfit-banner {
  position: relative;
  overflow: hidden;
  height: 320px;
  border-radius: 0 0 20px 20px;
}
.egs-emerfit-banner img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.egs-emerfit-banner::before {
  content: "";
  position: absolute;
  inset: 0;
  /* pointer-events:none: sin esto, este pseudo-elemento (encima del
     texto real por orden de aparición) bloqueaba el clic/selección
     del texto "Talleres de alta intensidad práctica" con el ratón. */
  pointer-events: none;
  background: linear-gradient(180deg,
              rgba(0, 0, 0, 0) 0%,
              rgba(0, 0, 0, 1) 100%);
}
/* Segundo degradado, en el borde superior: se funde con el negro del
   final del hero (.egs-hero--emerfit), para que la costura entre
   ambas secciones no se note como un corte. */
.egs-emerfit-banner::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: linear-gradient(180deg,
              rgba(0, 0, 0, 1) 0%,
              rgba(0, 0, 0, 0) 45%);
}
.egs-emerfit-banner__text {
  position: absolute;
  right: var(--gutter);
  bottom: 24px;
  margin: 0;
  text-align: right;
  color: var(--color-white);
  font-family: var(--font-display);
  font-weight: 400;
  /* Dato exacto del panel de Figma: 32px en mobile, 49.05px desde
     tablet (line-height 37.7). Fusionado en un clamp fluido. */
  font-size: clamp(32px, 3vw + 20px, 49px);
  line-height: 1;
  text-shadow: 0 2px 12px rgba(0, 0, 0, .5);
}
@media (min-width: 768px) {
  .egs-emerfit-banner { height: 696px; }
  .egs-emerfit-banner__text { line-height: 37.7px; bottom: 40px; }
}

/* Dato exacto del panel de Figma ("¿Qué es Emerfit y para qué
   sirve?"): título a 98.97px (el h2 genérico tiene un clamp topado en
   60px, demasiado pequeño para esta sección concreta), párrafo a
   negro 60% de opacidad. Todo el bloque (título, párrafo, chips) va
   centrado, no alineado a la izquierda. */
.egs-emerfit-intro .egs-container {
  text-align: center;
}
/* Dato exacto del panel de Figma: 96px desde escritorio (992px). Sin
   contraparte definida en mobile (heredaba el .egs-h2 genérico, con un
   tope de 60px muy distinto), así que se usa un clamp fluido propio
   con un mínimo ≈0.75x del valor de Figma para evitar el salto brusco
   justo en el breakpoint. */
.egs-emerfit-intro__title {
  font-size: clamp(40px, 6vw + 10px, 96px);
  line-height: .8;
}
@media (min-width: 992px) {
  .egs-emerfit-intro__title {
    max-width: 16ch;
    margin-inline: auto;
  }
}
/* La segunda mitad del titular ("para qué sirve?") solo cambia de
   color (dato de Figma): mismo peso/estilo que la primera, no la
   cursiva+opacidad genérica de .egs-em usada en el resto del sitio. */
.egs-emerfit-intro__title .egs-em {
  font-weight: inherit;
  font-style: normal;
  /* Dato exacto del panel de Figma: mismo color primario (#57A09A)
     que la primera mitad, solo al 50% de opacidad — no un teal claro
     distinto. */
  opacity: .5;
  color: var(--color-primary);
}
.egs-emerfit-intro__lead {
  color: rgba(3, 3, 4, .6);
  /* Dato exacto del panel de Figma: 17.74px, line-height "Auto"
     (normal, no el 1.45 genérico de .egs-lead). Sin contraparte en
     otro breakpoint: clamp con mínimo ≈0.75x para mobile. */
  font-size: clamp(13px, 0.4vw + 11px, 17.74px);
  line-height: normal;
  max-width: 52ch;
  margin-inline: auto;
}
.egs-emerfit-intro__chips {
  flex-wrap: wrap;
  justify-content: center;
  overflow-x: visible;
  /* Ancho contenido para que las 5 chips se repartan en 2 filas (3 +
     2), no en una sola fila larga. */
  max-width: 480px;
  margin-inline: auto;
}

/* Dato exacto del panel de Figma: línea separadora de ancho completo
   (1920×0, stroke #DADADA, 1px) entre secciones de la página. */
.egs-emerfit-divider {
  border: none;
  border-top: 1px solid #DADADA;
  margin: 48px 0;
  width: 100%;
}

/* Dato exacto del panel de Figma ("¿Para quién son los talleres
   Emerfit?"): el bloque de texto (eyebrow, título, párrafo) NO va
   arriba a ancho completo con las tarjetas debajo — va en la MISMA
   fila que la primera tarjeta, como una columna más de un grid de 4
   columnas (texto + 3 tarjetas). En mobile/tablet cae a una columna,
   apilado. */
.egs-emerfit-audience__intro {
  text-align: left;
}
.egs-emerfit-audience__eyebrow {
  /* Dato exacto del panel de Figma: Bastardo Groteskish (no
     Instrument Sans, la fuente heredada de .egs-eyebrow genérico),
     13.74px, letter-spacing 13%, color #030304 100% (negro, no el
     teal heredado). */
  font-family: var(--font-body);
  /* Sin contraparte en otro breakpoint: clamp con mínimo ≈0.75x. */
  font-size: clamp(10px, 0.15vw + 9px, 13.74px);
  letter-spacing: .13em;
  color: rgba(3, 3, 4, 1);
}
/* Dato exacto del panel de Figma: SansPlomb peso 98, font-size
   98.97px, line-height 75.4px (absoluto, no un ratio relativo), solo
   confirmado desde escritorio (992px). El fallback anterior (el
   .egs-h2 genérico, clamp(34px,3vw+14px,60px)) daba un salto brusco
   de +65% justo en el breakpoint: se sustituye por un clamp fluido
   propio, con techo en el dato exacto de Figma. */
.egs-emerfit-audience__title {
  font-size: clamp(42px, 7vw + 10px, 98.97px);
}
@media (min-width: 992px) {
  .egs-emerfit-audience__title { line-height: 75.4px; }
}
/* Dato exacto del panel de Figma: todo el titular es del mismo color
   sólido (#57A09A), no dos tonos como en "¿Qué es Emerfit?" — la
   segunda mitad NO lleva la cursiva/opacidad genérica de .egs-em. */
.egs-emerfit-audience__title .egs-em {
  font-weight: inherit;
  font-style: normal;
  opacity: 1;
  color: inherit;
}
.egs-emerfit-audience__lead {
  color: rgba(3, 3, 4, .6);
  font-size: clamp(13px, 0.4vw + 11px, 17.74px);
  line-height: normal;
  max-width: 52ch;
  /* En mobile, 56px de margin-top separaba demasiado el párrafo de su
     propio título (pedido explícito de juntarlos); en desktop ese aire
     sí es el dato de Figma (bloque de texto suelto a la izquierda de
     las tarjetas), así que solo se reduce por debajo de 992px. */
  margin: 12px 0 0;
}
@media (min-width: 992px) {
  .egs-emerfit-audience__lead { margin-top: 56px; }
}
/* En mobile/tablet el grid de escritorio (abajo) no aplica y las
   tarjetas caían en flujo normal sin ningún gap declarado, quedando
   pegadas unas a otras. */
.egs-emerfit-audience__grid .egs-team-card--cta {
  margin-bottom: 24px;
}
/* Separación entre el bloque de texto (eyebrow+título+párrafo) y la
   primera tarjeta, pedido explícito — antes quedaban demasiado
   juntos en mobile, sin gap propio en ese punto del flujo normal. */
@media (max-width: 991px) {
  .egs-emerfit-audience__intro {
    margin-bottom: 32px;
  }
}
.egs-emerfit-audience__grid .egs-team-card--cta:last-child {
  margin-bottom: 0;
}

@media (min-width: 992px) {
  /* Dato exacto de Figma: el bloque de texto mide 639px de ancho
     sobre un frame de 1920px (≈33%) — columna fija, no 1fr elástico
     que crecía demasiado en pantallas anchas. */
  .egs-emerfit-audience__grid {
    display: grid;
    grid-template-columns: 42% repeat(3, 1fr);
    /* column-gap distinto entre texto->tarjeta (40px, sitio de
       sobra) y tarjeta->tarjeta (20px, más juntas entre sí): un
       único gap uniforme no permite esa diferencia, así que el hueco
       extra de la 1ª columna se logra con su propio padding-right en
       vez de con el gap del grid. */
    column-gap: 12px;
    row-gap: 40px;
    align-items: start;
  }
  .egs-emerfit-audience__intro {
    padding-right: 20px;
  }
  .egs-emerfit-audience__grid .egs-team-card {
    aspect-ratio: 4 / 4;
    /* Dato de Figma: las tarjetas arrancan alineadas con el título,
       no con el eyebrow ("A QUIÉN VA DIRIGIDO") de encima. */
    margin-top: 44px;
  }
  /* El row-gap del grid ya separa las tarjetas: el margin-bottom de
     mobile (arriba) duplicaría el hueco. */
  .egs-emerfit-audience__grid .egs-team-card--cta {
    margin-bottom: 0;
  }
}

/* Dato exacto del panel de Figma: la tarjeta de foto tiene
   corner-radius 12.97px (no el radio genérico del sitio) — nombre a
   36.26px, texto a 18.56px, botón "Ver talleres" en Instrument Sans
   16.14px con borde blanco al 37% de opacidad. */
.egs-emerfit-audience__grid .egs-team-card {
  border-radius: 13px;
  overflow: hidden;
  /* transform:translateZ(0) crea su propia capa de composición para
     esta tarjeta: sin esto, en algunos navegadores el border-radius +
     overflow:hidden + el scale(1.04) del hover en la imagen hija
     podían desincronizarse durante el repintado, dejando un borde
     recto sin recortar visible en un lado (bug reportado por
     captura). */
  transform: translateZ(0);
}
/* width/height explícitos calc(100% + Npx), NO inset a solas: en un
   <img> (elemento reemplazado con tamaño intrínseco propio) inset
   sin width/height no garantiza que la imagen llene ese área — de
   ahí el borde negro que quedaba visible en las 3 tarjetas. Este
   cálculo sí fuerza el tamaño real, cubriendo cualquier margen de
   redondeo de subpíxel del grid repeat(3,1fr). */
.egs-emerfit-audience__grid .egs-team-card img {
  position: absolute;
  top: -2px;
  left: -2px;
  width: calc(100% + 4px);
  height: calc(100% + 4px);
  max-width: none;
}
/* Dato exacto del panel de Figma: degradado negro puro (no
   --color-ink) al 90% de opacidad, cubriendo toda la foto de arriba
   a abajo (0%-100%, no solo hasta el 60% del .egs-team-card__body
   genérico). */
.egs-emerfit-audience__grid .egs-team-card__body {
  background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .9) 100%);
  padding: 24px 16px 60px;
}
.egs-emerfit-audience__grid .egs-team-card__cta {
  bottom: 16px;
  left: 16px;
}
.egs-emerfit-audience__grid .egs-team-card__name {
  font-size: clamp(27px, 1.2vw + 22px, 36.26px);
  line-height: 27.9px;
  /* Dato exacto de Figma: "Médicos urgencias" en capitalización
     normal, no mayúsculas (heredado por error de .egs-team-card__name
     genérico). Peso "95" del panel = font-weight:400 (el "98" que
     hereda por defecto, 600, es más grueso de lo real). */
  text-transform: none;
  font-weight: 400;
  margin-bottom: 12px;
}
.egs-emerfit-audience__grid .egs-team-card__role {
  /* Dato exacto de Figma: Bastardo Groteskish Medium (no Instrument
     Sans, heredado de .egs-team-card__role genérico). */
  font-family: var(--font-body);
  font-weight: 500;
  font-size: clamp(14px, 0.6vw + 12px, 18.56px);
  line-height: normal;
  margin-bottom: 16px;
}
.egs-emerfit-audience__grid .egs-team-card__cta {
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: clamp(13px, 0.4vw + 11px, 16.14px);
  line-height: 26.8px;
  /* Dato exacto de Figma: fondo teal sólido (#57A09A), no transparente
     como el .egs-btn--outline genérico del que hereda. --egs-btn-fill
     se redefine a juego (blanco): sin esto el botón heredaba el fill
     blanco de --outline pero el color de texto en hover seguía fijo
     en blanco por la especificidad de este mismo selector, dejando
     texto blanco sobre círculo blanco (invisible) al pasar el
     ratón. */
  background: var(--color-primary);
  color: var(--color-white);
  border-color: rgba(255, 255, 255, .37);
  border-width: 1.1px;
  --egs-btn-fill: var(--color-white);
}
.egs-emerfit-audience__grid .egs-team-card__cta:hover,
.egs-emerfit-audience__grid .egs-team-card__cta:focus-visible {
  color: var(--color-primary);
}

/* Menos aire entre el separador de arriba y el título: el
   padding-top genérico de .egs-section sumado al margin del propio
   separador dejaba demasiado hueco. */
.egs-emerfit-workshops {
  padding-top: calc(var(--section-gap) * .4);
}

/* Dato exacto del panel de Figma ("Talleres y píldoras formativas
   disponibles"): título a 98.97px, line-height 75.4; párrafo a
   17.74px, negro 60%. */
@media (min-width: 992px) {
  .egs-emerfit-workshops__title {
    font-size: 96px;
    line-height: 75.4px;
    max-width: 22ch;
    margin-inline: auto;
  }
}
/* "FORMATIVAS DISPONIBLES" solo cambia de color (dato de Figma): mismo
   peso/estilo que la primera mitad, no la cursiva+opacidad genérica
   de .egs-em usada en el resto del sitio. */
.egs-emerfit-workshops__title .egs-em {
  font-weight: inherit;
  font-style: normal;
  /* Dato exacto del panel de Figma: mismo color primario (#57A09A)
     que la primera mitad, solo al 50% de opacidad. */
  opacity: .5;
  color: var(--color-primary);
}
.egs-emerfit-workshops__lead {
  color: rgba(3, 3, 4, .6);
  font-size: clamp(13px, 0.4vw + 11px, 17.74px);
  line-height: normal;
}
/* Igual que "¿Qué es Emerfit?": todo el bloque va centrado, no
   alineado a la izquierda (título, párrafo, tarjeta de curso y
   botones). */
.egs-emerfit-workshops .egs-container {
  text-align: center;
}
.egs-emerfit-workshops__lead {
  margin-inline: auto;
}
/* .egs-scroller--to-grid es display:grid con 3 columnas iguales: con
   una sola tarjeta (como ahora, solo 1 curso destacado), esa tarjeta
   ocupa solo la 1ª columna y queda pegada a la izquierda pese al
   justify-content. display:flex la centra de verdad sea cual sea el
   número real de tarjetas. */
@media (min-width: 992px) {
  .egs-emerfit-workshops .egs-scroller--to-grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
  }
  /* En flex (no grid) la tarjeta necesita su ancho fijo explícito de
     nuevo — el width:auto que .egs-scroller--to-grid .egs-course-card
     usa en el contexto grid original no da un resultado predecible
     aquí. */
  .egs-emerfit-workshops .egs-scroller--to-grid .egs-course-card {
    width: 460px;
    max-width: 460px;
  }
}

/* Dato exacto de Figma: los 2 botones van en fila (no apilados a
   ancho completo), con ancho fijo propio (291px / 256px) y 9px de
   separación entre ellos — centrados como grupo, igual que el resto
   del bloque. */
.egs-emerfit-workshops__ctas {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 9px;
  margin-top: 80px;
  margin-inline: auto;
}
/* white-space:nowrap (no un ancho fijo en px que a estos tamaños de
   fuente forzaba el texto a partirse en 2 líneas, descentrándolo
   verticalmente): el botón se dimensiona por su propio contenido,
   como el resto de .egs-btn del sitio. */
.egs-emerfit-workshops__ctas .egs-btn {
  white-space: nowrap;
  max-width: 100%;
}

/* Hero plano teal (contacto, blog). Dato del Figma (pantalla de
   contacto en mobile): el bloque teal NO va a sangre completa — tiene
   las 4 esquinas redondeadas y un margen respecto al borde de la
   ventana, con el fondo blanco de la página visible alrededor. Es el
   mismo tratamiento que ya tenía el hero del artículo del blog. */
.egs-hero--flat {
  min-height: 0;
  margin: 12px 12px 0;
  padding-block: calc(var(--header-h) + 44px) 44px;
  background: linear-gradient(160deg, var(--color-primary) 0%, var(--color-primary-dark) 100%);
  border-radius: 14px;
}
@media (min-width: 768px) {
  .egs-hero--flat { margin: 16px 16px 0; }
}

/* Variante oscura (blog): como en el Figma, sin foto de fondo — un
   degradado de --color-ink (arriba) a teal (abajo), no el teal claro
   de contacto/cardioprotección. La transición ocurre mucho antes que
   un lineal simple 0%->100% (que dejaba el negro extendiéndose
   demasiado): ya está bastante clara a la mitad de la sección. */
.egs-hero--flat.egs-hero--dark {
  background: linear-gradient(180deg,
              var(--color-ink) 0%,
              var(--color-primary-dark) 45%,
              var(--color-primary) 100%);
}
.egs-hero--dark .egs-hero__eyebrow,
.egs-hero--dark .egs-h1 { color: var(--color-white); }

/* Hero del artículo individual del blog: todo centrado (pedido
   explícito), no alineado a la izquierda como el resto de usos de
   .egs-hero--flat (contacto). */
.egs-hero--article .egs-hero__inner { text-align: center; }
.egs-hero--article .egs-breadcrumb,
.egs-hero--article .egs-single__date { margin-inline: auto; }

/* Título del artículo individual del blog: acotado, no a todo el
   ancho de --content-max (pedido explícito de bajarle el ancho). */
@media (min-width: 992px) {
  .egs-hero--article .egs-h1 { max-width: 30ch; margin-inline: auto; }
}

/* --------------------------------------------------------------------------
   Secciones de contenido
   -------------------------------------------------------------------------- */

/* Dato del Figma (cursos destacados de home): titular/lead centrado,
   no alineado a la izquierda. Único uso actual de esta clase, así que
   se centra directamente aquí en vez de con un modificador aparte. */
.egs-section-head { margin-bottom: 28px; text-align: center; }
.egs-section-head p { margin-top: 12px; max-width: 42ch; margin-inline: auto; }

.egs-section--ink { background: var(--color-ink); color: var(--color-white); }
.egs-section--ink h2, .egs-section--ink h3 { color: var(--color-white); }

.egs-section--light { background: var(--color-light-bg); }

.egs-section--teal {
  background: linear-gradient(180deg, var(--color-primary-light) 0%, var(--color-primary) 100%);
  color: var(--color-white);
}
/* Más intenso desde el arranque (--color-primary, no --color-primary-light)
   solo en esta sección concreta (pilares): el fondo empezaba
   demasiado claro arriba, a petición expresa se sube la intensidad
   desde el borde superior. Selector con más especificidad (dos
   clases) que .egs-section--teal a secas para no afectar a
   page-cardioproteccion.php, que reutiliza esa misma clase. */
.egs-sticky-gallery.egs-section--teal {
  background: linear-gradient(180deg, var(--color-primary) 0%, var(--color-primary) 100%);
}
/* Marcas (Cardioprotección): dato exacto del panel de Figma, fondo
   sólido #57A09A (--color-primary), sin el gradiente genérico. */
.egs-section--brands.egs-section--teal {
  background: var(--color-primary);
}
.egs-section--teal h2, .egs-section--teal h3 { color: var(--color-white); }

.egs-section__cta { margin-top: 28px; }

/* Banner destacado (Emerfit / medicaciones): tarjeta teal sobre foto. */
.egs-feature-banner {
  position: relative;
  min-height: 680px;
  display: flex;
  align-items: center;
  overflow: hidden;
}

@media (min-width: 768px) {
  .egs-feature-banner { min-height: 760px; }
}
.egs-feature-banner__media { position: absolute; inset: 0; overflow: hidden; }
.egs-feature-banner__media img { width: 100%; height: 100%; object-fit: cover; }


.egs-feature-banner__card {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: 520px;
  margin-inline: auto;
  padding: 28px 26px;
  border-radius: var(--radius-card);
  background: rgba(87, 160, 154, .93);
  color: var(--color-white);
  backdrop-filter: blur(2px);
}

/* Dato confirmado por captura de Figma (escritorio): la tarjeta va
   centrada sobre la foto en todos los anchos, no apartada a la
   derecha — la versión anterior de esto (margin-inline:auto 0) se
   basaba en una lectura distinta del diseño que esa captura corrige. */
@media (min-width: 768px) {
  .egs-feature-banner__card {
    max-width: 380px;
  }
}

.egs-feature-banner__meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 26px;
  font-family: var(--font-ui);
  font-size: clamp(12px, 0.3vw + 11px, 15px);
}
.egs-feature-banner__meta svg { width: 34px; height: 34px; }

.egs-feature-banner__title {
  color: var(--color-white);
  margin-bottom: 18px;
  /* El Figma lo dibuja más grande que un h2 estándar (60.3px/line-height 52
     en el frame de 402px de ancho); clamp() para que siga creciendo en
     desktop grande en vez de quedarse fijo a partir de 768px. Techo y
     mínimo reducidos (antes 48–84px) para la card ahora más estrecha
     (380px). */
  font-size: clamp(38px, 3vw + 16px, 64px);
  line-height: 0.86;
}

/* Igual que en "Sobre nosotros": la palabra en cursiva cambia de color,
   no de grosor respecto al resto del titular. */
.egs-feature-banner__title .egs-em { font-weight: inherit; opacity: .6; }

.egs-feature-banner__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-top: 26px;
}
.egs-feature-banner__foot .egs-price { color: var(--color-white); }

/* Bloque "Nosotros" de la home: apilado en mobile, 2 columnas en desktop
   (texto izq., glass-cards der.), como en el Figma.
   En mobile: .egs-about__row es flex-column y .egs-about__text es
   display:contents, así que sus hijos (h2, p, el botón CTA) se ordenan
   como hermanos directos junto a .egs-about__cards. flex order coloca
   el botón después de las tarjetas (texto -> tarjetas -> botón), en vez
   del orden natural del DOM (texto+botón -> tarjetas). */
.egs-about__row {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
.egs-about__text { display: contents; }
.egs-about__title,
.egs-about__row > .egs-about__text > .egs-lead { order: 1; }
.egs-about__cards {
  order: 2;
  /* En mobile .egs-about__cards vive dentro de .egs-container (padding
     lateral propio) y además hereda el padding-inline:var(--gutter) de
     .egs-scroller: ese doble padding dejaba muy poco hueco real para
     que la tarjeta siguiente asomara cortada. Se cancela el padding del
     container con márgenes negativos, igual que ya se hace en desktop,
     para que el scroller llegue al borde real de la pantalla. */
  margin-inline: calc(-1 * var(--gutter));
}
.egs-about__cta { order: 3; margin-top: 8px; }

@media (min-width: 992px) {
  .egs-about__row {
    flex-direction: row;
    align-items: flex-start;
    justify-content: space-between;
    /* Gap subido de 60 a 120px a petición expresa: empuja el bloque
       de tarjetas más hacia la derecha, con más aire respecto al
       texto. */
    gap: 120px;
  }
  .egs-about__text {
    display: block;
    flex: 0 1 600px;
  }
  /* En desktop .egs-about__text vuelve a ser un bloque normal (columna
     real): el order de mobile ya no aplica a sus hijos porque el flex
     context relevante pasa a ser el de .egs-about__row con solo 2 hijos
     visibles (.egs-about__text y .egs-about__cards). */
  .egs-about__title,
  .egs-about__row > .egs-about__text > .egs-lead,
  .egs-about__cta { order: initial; }
  .egs-about__cta { margin-top: 0; }

  /* Las tarjetas se salen del container hacia el borde derecho real de
     la pantalla (como un carrusel con "peek"), en vez de quedar
     contenidas dentro del ancho de --content-max. El margen negativo
     compensa el padding-inline derecho de .egs-container y, en monitores
     más anchos que --content-max, también el hueco que deja el container
     centrado hasta el borde real del viewport. */
  .egs-about__cards {
    flex: 1 1 auto;
    min-width: 0;
    /* Anula el margin-inline negativo de mobile: en desktop el borde
       izquierdo de las tarjetas debe alinearse con el gap del row, no
       desbordar hacia el texto de al lado. */
    margin-left: 0;
    margin-right: calc(-1 * max(var(--gutter), (100vw - var(--content-max)) / 2 + var(--gutter)));
    padding-right: max(var(--gutter), calc((100vw - var(--content-max)) / 2 + var(--gutter)));
    /* Barra de scroll nativa oculta: el propio "peek" (la card siguiente
       asomando cortada) ya comunica que se puede deslizar. */
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .egs-about__cards::-webkit-scrollbar { display: none; }

  /* Cada tarjeta ocupa buena parte del ancho visible de la columna,
     pero sin llegar a ser tan ancha como para verse "estirada": cabe
     una entera + un trozo claro de la siguiente asomando. Ancho
     subido de 340 a 380px a petición expresa. */
  .egs-about__cards .egs-glass-card {
    width: min(30vw, 380px);
    max-width: none;
  }
}

.egs-about__title {
  margin-bottom: 20px;
  color: var(--color-primary);
  /* El dato exacto del panel de Figma (98px) se veía demasiado
     grande en la web real — reducido a petición expresa (techo
     64px, similar al resto de h2 de la portada). */
  font-size: clamp(36px, 2.6vw + 20px, 64px);
  line-height: 0.9;
}
/* Dato exacto del panel de Figma (Selection colors): el mismo
   #57A09A que el resto del titular, no otro tono — solo con la
   capa al 60% de opacidad, no un color plano distinto. */
.egs-about__title .egs-em { color: var(--color-primary); opacity: 0.6; font-style: normal; font-weight: inherit; }

/* CTA cardioprotección. Sin overflow:hidden en el contenedor raíz: el
   botón principal desborda el panel blanco por los lados (ver
   .egs-cardio-cta__submit), y necesita salirse también de este nivel. */
.egs-cardio-cta {
  position: relative;
  padding: 0 0 24px;
  background: var(--color-ink);
  /* La foto de fondo (.egs-cardio-cta__media, inset:0 respecto a este
     bloque) dependía solo de la altura del panel para su propio alto,
     quedando corta. min-height le da más presencia propia por encima
     del panel, como en el Figma. display:flex + justify-content:center
     centra el panel verticalmente dentro de ese alto extra, en vez de
     quedar pegado abajo del todo. */
  min-height: 620px;
  display: flex;
  flex-direction: column;
  justify-content: center;
}

@media (min-width: 768px) {
  /* Desde tablet el Figma cambia de estructura: ya no es una foto de
     fondo con un panel flotando encima, sino dos columnas reales (foto
     a la izquierda, panel a la derecha), sin el corazón superpuesto ni
     el botón desbordante que solo tienen sentido en el layout mobile
     estrecho. Antes este cambio solo se aplicaba desde 992px, dejando
     tablet (768-991px) en el patrón mobile. */
  .egs-cardio-cta {
    display: flex;
    flex-direction: row;
    /* align-items:stretch (no en el propio row, se aplicaba pero la
       foto seguía viéndose más alta que el panel — dato confirmado
       por captura: en el Figma ambas columnas terminan exactamente
       a la misma altura). Se fuerza explícitamente align-items:stretch
       de nuevo aquí junto con height:100% en ambos hijos (ver
       .egs-cardio-cta__media y .egs-cardio-cta__panel) para que la
       igualación de alturas sea inequívoca, no dependiente solo del
       stretch implícito del flex container. */
    align-items: stretch;
    /* Anula el justify-content:center de mobile: en desktop las 2
       columnas deben repartirse todo el ancho (space-between por
       defecto del flujo normal), no quedar centradas como bloque. */
    justify-content: flex-start;
    gap: 200px;
    max-width: none;
    margin-inline: 0;
    padding: 0;
    background: transparent;
    /* height fija (no min-height): con min-height, la fila crecía a
       la altura intrínseca de la foto (calculada por el navegador a
       partir del ancho disponible, con object-fit:cover sin límite
       real), mucho mayor que el contenido del panel — la foto
       "dictaba" la altura de toda la sección en vez de recortarse a
       una franja compacta como en el Figma. Con height fija, la
       imagen (width:100%;height:100%;object-fit:cover) se recorta
       exactamente a esta altura, sea cual sea su relación de aspecto
       original. */
    height: 750px;
  }
}
.egs-cardio-cta__media {
  position: absolute;
  inset: 0;
  /* Dato exacto del panel de Figma: radius 10. */
  border-radius: 10px;
  overflow: hidden;
}
.egs-cardio-cta__media img { width: 100%; height: 100%; object-fit: cover; opacity: .8; }

@media (min-width: 768px) {
  .egs-cardio-cta__media {
    position: relative;
    inset: auto;
    flex: 1 1 50%;
  }
  .egs-cardio-cta__media img { opacity: 1; }
}

/* Centrado y por encima del panel blanco, apoyado sobre la foto de
   fondo. position:absolute (no relative + margin negativo): en flujo
   normal el margen negativo lo hacía solapar visualmente con el propio
   borde redondeado del panel-head en vez de quedar limpiamente por
   encima, dando la falsa impresión de estar "dentro" e inclinado. */
.egs-cardio-cta__icon {
  position: absolute;
  z-index: 3;
  top: -46px;
  left: 50%;
  /* Sin rotate() propio: el SVG (heart-dea.svg) ya viene inclinado de
     origen, exportado tal cual desde Figma — rotarlo aquí también lo
     inclinaría el doble. */
  transform: translateX(-50%);
  width: 92px;
  margin: 0;
}

@media (min-width: 768px) {
  /* En el layout de 2 columnas (desde tablet) el corazón no va
     superpuesto entre foto y panel: dato confirmado por captura de
     Figma — vive DENTRO del bloque del título (.egs-cardio-cta__panel-head,
     su nuevo padre en el HTML), anclado a su esquina superior derecha,
     y sobresale de ese bloque por ser más grande que su alto, no por
     estar fuera de él con posicionamiento independiente. */
  .egs-cardio-cta__icon {
    position: absolute;
    z-index: 4;
    /* top negativo (no 50%): dato de Figma — el corazón sobresale
       claramente por ENCIMA del borde superior del bloque, no solo
       centrado sobre la esquina. */
    top: -32px;
    left: auto;
    right: -20px;
    /* Notablemente más grande (antes 104px): dato de Figma, el corazón
       sobresale bastante por encima y por fuera del bloque del título. */
    width: 150px;
    margin: 0;
    /* Anula el centrado horizontal de mobile (left:50% + translateX). */
    transform: none;
  }
}

.egs-cardio-cta__panel {
  position: relative;
  z-index: 2;
  margin: 0 16px;
  border-radius: var(--radius-card);
  background: var(--color-white);
}

@media (min-width: 768px) {
  /* .egs-cardio-cta__panel-col es quien ahora reparte el ancho 50/50
     con la foto (igual que .egs-cardio-cta__media): así el ancho de la
     COLUMNA nunca cambia aunque .egs-cardio-cta__panel (el bloque
     visual de dentro) se haga más estrecho con max-width — antes,
     poner max-width directamente en .egs-cardio-cta__panel encogía
     también la columna (mismo elemento hacía de columna Y de tarjeta),
     dejando que la foto (flex:1 1 50%) creciera para llenar el hueco. */
  .egs-cardio-cta__panel-col {
    flex: 1 1 50%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .egs-cardio-cta__panel {
    /* Más estrecho que la columna completa, centrado por el
       justify-content:center del padre (panel-col). */
    max-width: 620px;
    width: 100%;
    margin: 0;
    /* Sin height:100%: dato confirmado por captura de Figma — el panel
       NO llena la altura completa de la foto, se queda más corto que
       ella. El propio .egs-cardio-cta__panel no lleva fondo ni padding
       (solo agrupa layout): panel-head (tarjeta blanca del título) y
       panel-body (bloque gris de info) son dos bloques HERMANOS
       independientes, apilados con gap real entre sí — el título no
       vive "dentro" del bloque gris, flota justo encima de él. */
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 0;
  }
}

/* El panel ya no recorta overflow (el botón principal desborda por los
   lados, como en el Figma): las esquinas superiores/inferiores se
   redondean directamente en la cabecera y el cuerpo, sus únicos hijos. */
.egs-cardio-cta__panel-head {
  padding: 52px 28px 16px;
  border-radius: var(--radius-card) var(--radius-card) 0 0;
  text-align: center;
}

@media (min-width: 768px) {
  .egs-cardio-cta__panel-head {
    /* padding-right ampliado: dato de Figma, el corazón ahora vive
       dentro de este bloque (anclado a su esquina, ver
       .egs-cardio-cta__icon) y el título necesita hueco de sobra para
       no quedar debajo suyo. */
    padding: 28px 120px 28px 40px;
    /* Tarjeta con las 4 esquinas redondeadas (no solo arriba), que se
       solapa ligeramente por encima de panel-body en vez de encajar a
       ras con él: margin-bottom negativo + z-index para quedar por
       delante, dato confirmado por captura de Figma. */
    position: relative;
    z-index: 1;
    margin-bottom: -16px;
    border-radius: var(--radius-card);
    background: var(--color-white);
    border: 1px solid #D5D5D5;
  }
}
.egs-cardio-cta__panel-head h2 {
  color: var(--color-primary);
  text-transform: none;
  /* Como en el Figma: en 2 líneas, no 3. El .egs-h2 base
     (clamp(34px,3vw+14px,60px)) es demasiado grande para este panel
     estrecho en mobile y el titular se partía de más. */
  font-size: clamp(26px, 5vw + 10px, 34px);
  max-width: 20ch;
  margin-inline: auto;
}

@media (min-width: 768px) {
  .egs-cardio-cta__panel-head h2 {
    /* Más grande (antes 34px de tope): dato confirmado por captura de
       Figma — el titular del panel ocupa 2 líneas anchas, notablemente
       más grande que el resto de texto de la tarjeta, no un h2
       "estándar" contenido. Peso y line-height más ligeros que el
       .egs-h2 base (600 / 0.92, pensado para titulares en mayúsculas
       muy compactos): aquí el texto va en mayúsculas/minúsculas
       normales y el Figma lo dibuja más ligero y con más aire entre
       líneas, no comprimido. */
    font-size: clamp(34px, 3vw + 22px, 52px);
    font-weight: 400;
    line-height: 1.15;
    max-width: none;
    margin-inline: 0;
  }
}

.egs-cardio-cta__panel-body {
  padding: 28px 28px 32px;
  border-radius: 0 0 var(--radius-card) var(--radius-card);
  background: var(--color-light-bg);
  text-align: center;
}
.egs-cardio-cta__panel-body .egs-lead {
  margin-bottom: 8px;
  font-size: clamp(15px, 0.3vw + 13px, 16px);
}

@media (min-width: 768px) {
  .egs-cardio-cta__panel-head,
  .egs-cardio-cta__panel-body { text-align: left; }
  /* panel-body vuelve a llevar su propio fondo gris (#F4F4F4, dato de
     Figma) y padding: ya no hay .egs-cardio-cta__panel envolvente con
     fondo propio (ver arriba) — panel-head y panel-body son bloques
     hermanos independientes, cada uno con su propio fondo, esquinas
     redondeadas y padding, apilados con gap. */
  .egs-cardio-cta__panel-body {
    padding: 44px 40px 32px;
    border-radius: var(--radius-card);
    background: #F4F4F4;
    /* Dato exacto de Figma (Rectangle 128, drop shadow): offset 0/0,
       blur 34, spread 0, color #000000 al 25%. */
    box-shadow: 0 0 34px rgba(0, 0, 0, .25);
  }
}

/* Como en el Figma mobile, el botón principal desborda no solo el panel
   (16px de margen), sino también el padding del .egs-container que lo
   envuelve (var(--gutter)), llegando casi al borde real de la pantalla.
   Especificidad reforzada (.egs-btn.egs-cardio-cta__submit) para ganar
   siempre a .egs-btn--block, sin depender del orden de los archivos. En
   el layout de 2 columnas de desktop ese desborde no tiene sentido: el
   botón se queda contenido, a lo ancho del propio panel. */
.egs-btn.egs-cardio-cta__submit {
  width: calc(100% + 32px + 2 * var(--gutter));
  max-width: none;
  margin-inline: calc(-16px - var(--gutter));
}

@media (min-width: 768px) {
  .egs-btn.egs-cardio-cta__submit {
    width: 100%;
    margin-inline: 0;
    /* Más alto que el botón base (padding-block:13px): dato de Figma,
       este CTA concreto es notablemente más alto que un botón estándar. */
    padding-block: 28px;
  }
}

.egs-callback {
  display: flex;
  align-items: stretch;
  gap: 0;
  margin-top: 14px;
  border-radius: var(--radius-input);
  overflow: hidden;
  background: var(--color-white);
  border: 1px solid #E2E2E2;
}
.egs-callback input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  padding: 14px 16px;
  font-size: clamp(14px, 0.3vw + 13px, 17px);
}
.egs-callback input:focus { outline: none; }
.egs-callback button {
  flex: 0 0 auto;
  padding: 14px 36px;
  background: var(--color-primary);
  color: var(--color-white);
  font-family: var(--font-ui);
  font-weight: 500;
  border-radius: var(--radius-btn);
  /* Sin margin (antes 3px): dato de Figma, el botón llega a ras del
     borde del contenedor, sin el pequeño hueco blanco alrededor. */
  margin: 0;
  /* Dato exacto de Figma (drop shadow): offset 0/0, blur 24, spread 0,
     color #000000 al 25%. */
  box-shadow: 0 0 24px rgba(0, 0, 0, .25);
  transition: background-color var(--dur) var(--ease);
}
.egs-callback button:hover { background: var(--color-primary-dark); }

/* Testimonios */
.egs-testimonials {
  position: relative;
  overflow: hidden;
  padding-block: calc(var(--section-gap) * 2.2);
  background: var(--color-ink);
}
.egs-testimonials__media { position: absolute; inset: 0; }
.egs-testimonials__media img { width: 100%; height: 100%; object-fit: cover; }
/* Overlay negro real (dato exacto de Figma: fill #000000 al 50%), no
   opacity:.5 en la propia imagen (que ACLARABA la foto mezclándola
   con el fondo, en vez de oscurecerla manteniendo su contraste). */
.egs-testimonials__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, .5);
}
.egs-testimonials > .egs-container,
.egs-testimonials > .egs-scroller { position: relative; z-index: 2; }

.egs-testimonials__head { position: relative; z-index: 2; text-align: center; margin-bottom: 30px; }
/* text-transform:none + peso más ligero (antes heredaba uppercase y
   font-weight:600 de .egs-h2): dato de Figma — el titular va en
   mayúsculas/minúsculas normales, con un trazo más fino, no como un
   H2 "display" comprimido en mayúsculas. Tamaño mucho más pequeño y
   contenido (antes heredaba el font-size gigante clamp(34px,...,60px)
   de .egs-h2, ocupando casi toda la sección): dato exacto de Figma —
   el texto vive en una caja compacta de 551×76 y cae en 2 líneas
   cortas ("Lo que dicen los profesionales que" / "ya se han formado
   con nosotros"), no en una sola línea enorme a lo ancho de toda la
   sección. max-width fuerza ese mismo salto de línea en la web. */
.egs-testimonials__head h2 {
  color: var(--color-white);
  text-transform: none;
  /* SansPlomb-95 = font-weight 400 en nuestro mapeo (ver @font-face en
     base.css) — "95" es el peso de la fundición, no un tamaño. El
     tamaño real es el otro dato del inspector: 49.05px. */
  font-weight: 400;
  font-size: clamp(28px, 1.6vw + 22px, 49px);
  line-height: 1.25;
  max-width: 560px;
  margin-inline: auto;
}

/* --------------------------------------------------------------------------
   Widget de reseñas de Trustindex: fuerza el look "glass" del Figma
   (fondo translúcido + blur) sobre el HTML que genera el propio plugin,
   cuyas clases no controlamos. Selectores amplios por atributo en vez de
   nombres de clase exactos, para no depender de la versión del plugin.
   -------------------------------------------------------------------------- */
/* Solo se apunta a las tarjetas de reseña individuales de Trustindex
   (.ti-review-item, el nombre de clase real confirmado en el HTML que
   sirve el plugin — [class*="ti-review-card"]/[class*="ti-card"] eran
   una suposición y nunca coincidieron con nada, por lo que este bloque
   no tenía ningún efecto), no a cualquier elemento interno del widget:
   un selector demasiado amplio ([style*="background"]) rompía
   avatares, estrellas y barras internas forzándolas también a vidrio
   translúcido. */
/* El fondo blanco real vive en .ti-inner (hijo directo de
   .ti-review-item, confirmado en el HTML servido), no en el propio
   .ti-review-item — ponerlo solo en el padre dejaba el fondo blanco
   del plugin intacto por encima, tapando el efecto glass.
   Especificidad extra (selector repetido .egs-testimonials.egs-testimonials,
   no solo !important): el propio CSS de Trustindex
   (trustindex-google-widget.css) usa !important en las MISMAS
   propiedades sobre el mismo selector .ti-inner, y ese archivo se
   encola/imprime DESPUÉS de layout.css en el <head> — con empate de
   !important, gana la regla que aparece más tarde en el documento
   (la suya), así que un simple !important aquí no bastaba. Repetir
   el selector de ancestro eleva la especificidad real por encima de
   la suya, sin depender del orden de carga. */
.egs-testimonials.egs-testimonials .ti-review-item .ti-inner,
/* Selector exacto que usa el propio Trustindex para la regla que
   gana hoy (.ti-widget.ti-goog .ti-review-item>.ti-inner, con
   background-color:white !important), repetido aquí con más
   contexto de ancestro para superar esa especificidad exacta en vez
   de solo aproximarla. */
.egs-testimonials .ti-widget.ti-goog .ti-review-item > .ti-inner {
  background: rgba(255, 255, 255, .14) !important;
  border: 1px solid rgba(255, 255, 255, .28) !important;
  border-radius: var(--radius-card) !important;
  backdrop-filter: blur(10px) !important;
  -webkit-backdrop-filter: blur(10px) !important;
  box-shadow: none !important;
}
/* Texto claro para contraste sobre el fondo translúcido + foto oscura
   de fondo (antes heredaba el negro/gris por defecto del plugin). */
.egs-testimonials.egs-testimonials .ti-review-item .ti-name,
.egs-testimonials.egs-testimonials .ti-review-item .ti-date,
.egs-testimonials.egs-testimonials .ti-review-item .ti-review-text-container,
.egs-testimonials.egs-testimonials .ti-review-item .ti-read-more {
  color: var(--color-white) !important;
}

/* Dato de Figma: se ven 3 tarjetas (más grandes) a la vez, con una
   barra de scroll horizontal PROPIA (dibujada por nosotros, ver más
   abajo — la nativa del navegador es gorda y sin esquinas redondeadas,
   y en Figma se ve fina y con radio) en vez de las flechas de
   navegación (.ti-next/.ti-prev) del carrusel por defecto del plugin.
   El propio widget ya está configurado en 3 columnas (ti-col-3,
   flex:0 0 33.333% con ese ancho relativo al CONTENEDOR de
   Trustindex) — el problema es que ese contenedor interno mide más
   que las 3 tarjetas visibles y se desliza con JS/flechas en vez de
   con scroll nativo del navegador. */
.egs-testimonials__widget {
  position: relative;
}
.egs-testimonials .ti-reviews-container-wrapper {
  overflow-x: auto !important;
  scroll-snap-type: x proximity;
  /* Scrollbar nativa oculta: la sustituye .egs-testimonials__scroll-track
     de abajo, que sí puede tener el radio/alto exactos del Figma. */
  scrollbar-width: none;
  -ms-overflow-style: none;
  /* Sin padding-inline: dato confirmado por captura — las tarjetas
     deben llegar A RAS del borde real de la pantalla, sin ningún
     margen ni siquiera en la primera/última. */
  padding-inline: 0;
}
.egs-testimonials .ti-reviews-container-wrapper::-webkit-scrollbar { display: none; }
.egs-testimonials .ti-reviews-container {
  display: flex !important;
}
.egs-testimonials.egs-testimonials .ti-review-item {
  scroll-snap-align: start;
  /* Ancho fijo (no el 33.333% relativo al contenedor de Trustindex,
     que puede medir más que el viewport visible): 3 tarjetas de este
     ancho ya llenan aproximadamente el ancho útil sin desbordar de
     más, dejando ver la 4ª empezando por el borde como pista de que
     se puede desplazar. */
  flex: 0 0 340px !important;
  max-width: 340px !important;
}
/* En mobile, 340px fijos dejan un hueco visible antes del borde
   derecho de pantallas más estrechas (p.ej. 375px de iPhone SE): la
   tarjeta actual no llega a ras del borde, solo asoma el principio de
   la siguiente. Dos intentos en CSS puro con calc() (100vw y 100%)
   dieron resultados poco fiables porque dependían de adivinar el
   padding/margin exactos que trae el propio HTML de Trustindex, fuera
   de nuestro control. Ahora lo fija JS con precisión (ver
   syncMobileCardWidth en main.js), midiendo el ancho real del
   scroller en tiempo de ejecución — ese script escribe flex-basis y
   max-width como style inline directamente en cada .ti-review-item.
   Cada .ti-review-item trae su propio padding:0 8px !important (del
   propio Trustindex) como gap visual ENTRE tarjetas — normal y
   esperado ahí, pero ese mismo padding deja también un hueco antes
   de la primera tarjeta y, sobre todo, DESPUÉS de la última, así que
   no llegaban a ras del borde real del viewport. Se compensa con
   margen negativo en el wrapper para que ese hueco de los extremos
   quede fuera del área visible, sin tocar el padding entre tarjetas
   intermedias. Especificidad reforzada (.egs-testimonials.egs-testimonials):
   Trustindex tiene su propia regla margin:0 8px !important sobre
   este mismo selector con menor especificidad que la mía anterior,
   así que ganaba la suya. */
.egs-testimonials .ti-widget.ti-goog .ti-reviews-container-wrapper,
.egs-testimonials.egs-testimonials .ti-reviews-container-wrapper {
  margin-inline: -8px !important;
}
/* Flechas y puntos de paginación por defecto ocultos: el scroll ahora
   se hace con la barra propia dibujada más abajo, no con estos
   controles (.ti-controls-line es la fila de puntitos, distinta de
   .ti-controls que son las flechas). Especificidad reforzada en
   .ti-controls-line (.egs-testimonials.egs-testimonials, mismo patrón
   que .ti-reviews-container-wrapper más abajo): Trustindex trae su
   propia regla display:block !important sobre ese mismo selector con
   más especificidad que un simple .egs-testimonials .ti-controls-line. */
.egs-testimonials .ti-controls,
.egs-testimonials.egs-testimonials .ti-controls-line,
.egs-testimonials .ti-widget.ti-goog .ti-controls-line,
.egs-testimonials.egs-testimonials .ti-widget.ti-goog .ti-controls-line,
.egs-testimonials .ti-next,
.egs-testimonials .ti-prev {
  display: none !important;
}

/* Barra de scroll horizontal propia: fina (6px, no la gorda nativa
   del navegador) y con esquinas redondeadas, contenida al ancho del
   .egs-container (a diferencia de las tarjetas, que llegan a ras del
   borde de la pantalla) — dato exacto de Figma (Line 5/6, stroke
   blanco al 30-60%, weight 6, corner radius en los extremos por ser
   un trazo con "round cap"). thumb-width/scroll-percent los rellena
   JS (initTestimonialsScrollbar en main.js) siguiendo el scroll real
   del contenedor, ya que no existe una forma nativa en CSS de
   reflejar el progreso de scroll de OTRO elemento. */
.egs-testimonials__scroll-track {
  position: relative;
  max-width: var(--content-max);
  margin: 18px auto 0;
  padding-inline: var(--gutter);
  height: 6px;
}
.egs-testimonials__scroll-track::before {
  content: "";
  position: absolute;
  inset: 0 var(--gutter);
  border-radius: 999px;
  background: rgba(255, 255, 255, .3);
}
.egs-testimonials__scroll-thumb {
  position: absolute;
  top: 0;
  /* left:var(--gutter) fijo (igual que el inset del ::before de
     arriba): el punto de partida real del carril visual. JS mueve el
     thumb desde AQUÍ con translateX, calculando su desplazamiento
     máximo sobre ese mismo ancho útil (track.clientWidth menos los
     dos gutters), no sobre el ancho total del track. */
  left: var(--gutter);
  height: 6px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .85);
}

.egs-rating {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  border-radius: 10px;
  background: var(--color-white);
  font-family: var(--font-ui);
  color: var(--color-ink);
  margin-bottom: 20px;
  box-shadow: 0 4px 18px rgba(0, 0, 0, .18);
}
.egs-rating__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #4285f4;
  color: var(--color-white);
  font-size: clamp(10px, 0.15vw + 9px, 12px);
  font-weight: 700;
}
.egs-rating__body { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; }
.egs-rating__top { display: flex; align-items: center; gap: 6px; font-size: clamp(10px, 0.15vw + 9px, 12px); }
.egs-rating__top strong { font-size: clamp(11px, 0.15vw + 10px, 13px); }
.egs-rating__stars { display: inline-flex; gap: 1px; color: #fbbc05; }
.egs-rating__stars svg { width: 11px; height: 11px; }
.egs-rating__reviews { font-size: clamp(9px, 0.1vw + 8.5px, 10.5px); color: var(--color-form-label); }

.egs-testimonials__stars {
  display: flex;
  justify-content: center;
  gap: 4px;
  color: #fbbc05;
  margin-top: 14px;
}

.egs-testimonial {
  width: 82vw;
  max-width: 460px;
  padding: 26px 24px;
  border-radius: var(--radius-card);
  background: rgba(255, 255, 255, .16);
  border: 1px solid rgba(255, 255, 255, .28);
  backdrop-filter: blur(10px);
  color: var(--color-white);
}
.egs-testimonial__quote { font-size: clamp(14px, 0.3vw + 13px, 17px); line-height: 1.45; margin-bottom: 26px; }
.egs-testimonial__author { font-family: var(--font-ui); font-size: clamp(12px, 0.25vw + 11px, 15px); }

/* Contiene .egs-closing y <footer> como una unidad, para recortar el
   resplandor decorativo (.egs-closing__bleed, 900px fijos) que se
   desborda por debajo de .egs-closing: sin este recorte, al ser
   <footer> el último elemento del body, ese desbordamiento estiraba el
   scrollHeight del documento y dejaba una franja en blanco al final de
   la página, debajo del footer. */
.egs-footer-wrap {
  position: relative;
  overflow: hidden;
  /* Negro puro aquí, no en .egs-closing/.egs-footer por separado: así
     el resplandor (.egs-footer-wrap__glow, hermano posterior en el
     DOM) se ve por encima de un único fondo compartido, en vez de
     quedar tapado por el fondo opaco propio de cada sección. */
  background: #000;
}

/* Mancha de luz teal difuminada, centrada horizontalmente en la
   franja del footer (dato de Figma). Vive como hija directa de
   .egs-footer-wrap (hermana de .egs-closing y .egs-footer, ver
   footer.php) para poder cubrir el título real, que en desktop pinta
   dentro de .egs-footer, no de .egs-closing. */
.egs-footer-wrap__glow {
  content: "";
  position: absolute;
  left: 50%;
  top: 0;
  width: min(55vw, 1300px);
  height: 400px;
  transform: translateX(-50%);
  background: radial-gradient(59.04% 115.84% at 50% 78.34%,
              #57A09A 0%,
              rgba(3, 3, 4, .2) 81.25%);
  filter: blur(47px);
  z-index: 1;
  pointer-events: none;
}

/* Franja final: marquesina + logos de certificación + CTA */
.egs-closing {
  position: relative;
  /* z-index:2 (mismo motivo que .egs-footer, ver más abajo): por
     encima del resplandor de testimonios que se extiende hasta aquí. */
  z-index: 2;
  /* overflow:hidden real, en las dos dimensiones (antes solo
     overflow-x:clip, dejando el desbordamiento vertical del bleed sin
     contener aquí — la contención vertical dependía solo de
     .egs-footer-wrap, un ancestro más arriba). Ese desbordamiento
     vertical no contenido en su padre INMEDIATO seguía afectando el
     scrollHeight calculado del documento (confirmado con mediciones:
     .egs-footer-wrap.scrollHeight medía más que su offsetHeight real),
     dejando una franja blanca visible al llegar al final real de la
     página, después del footer. Recortar aquí, en el propio
     contenedor de posicionamiento del bleed, resuelve la causa en la
     fuente en vez de depender de que un ancestro más arriba lo
     absorba. */
  overflow: hidden;
  /* En mobile, --section-gap (64px) aquí se sumaba a los 54px de
     padding-top de .egs-footer justo después, dejando ~118px de hueco
     vacío entre los logos de certificación y "Enlaces". Se reduce a un
     valor fijo más moderado; en desktop el padding grande no importa
     porque esta sección solo pinta el resplandor decorativo, sin el
     bloque de logos (oculto ahí, ver .egs-closing__row--mobile-only). */
  padding-bottom: 24px;
}
.egs-closing > * { position: relative; z-index: 2; }

.egs-closing__marquee { padding-block: 26px 30px; }

/* Es solo el tratamiento decorativo de mobile: en desktop el mismo
   titular ya se pinta como bloque estático en footer.php
   (.egs-footer__col--cta), así que la marquesina animada se oculta
   para no duplicarlo. Antes no existía ninguna regla que la ocultara,
   así que se veía en desktop encima del footer sin sentido. */
@media (min-width: 992px) {
  .egs-closing__marquee { display: none; }
}

.egs-closing__title { color: var(--color-white); display: none; }

.egs-closing__btn { margin-top: 20px; }

/* img.egs-certs-strip (no solo .egs-certs-strip): en páginas de
   WooCommerce (catálogo de cursos), la propia hoja de estilos del
   plugin trae ".woocommerce img, .woocommerce-page img { height:auto }"
   con la MISMA especificidad (clase+etiqueta) que esta regla, y gana
   por orden de carga real en el navegador (aunque el HTML estático
   muestre el theme encolado después, WordPress no siempre respeta
   ese orden) — el logo se veía a su tamaño natural completo
   (3023×704px) en vez de 130px, desbordando el footer. Con el
   selector de etiqueta duplicado la especificidad sube a 0,0,2,0,
   ganando siempre sin depender del orden de encolado. */
img.egs-certs-strip {
  display: block;
  height: 82px;
  width: auto;
  max-width: 100%;
  margin: 0 auto 30px;
  object-fit: contain;
}

@media (min-width: 768px) {
  img.egs-certs-strip { height: 96px; }
}

@media (min-width: 992px) {
  /* Más grande que antes (100px): dato confirmado por captura, los
     logos de certificación se ven notablemente mayores en el Figma. */
  img.egs-certs-strip { height: 130px; }
}

/* En mobile el titular + botón "Ver cursos" + logos van en su propia
   fila (closing.php), apilados antes del resto del footer. En desktop
   ese mismo contenido se duplica dentro de .egs-footer__row (ver
   .egs-footer__row-cta más abajo) para compartir fila con
   Enlaces/Contacto/logo; el bloque de aquí se oculta para no duplicarlo
   visualmente. */
@media (min-width: 992px) {
  .egs-closing__row--mobile-only { display: none; }
}

/* --------------------------------------------------------------------------
   Footer
   -------------------------------------------------------------------------- */

.egs-footer {
  color: rgba(255, 255, 255, .72);
  padding-block: 14px 26px;
  /* position:relative: contexto de referencia para el copyright en
     absolute en desktop (ver .egs-footer__copy más abajo). z-index:2
     explícito: el resplandor de testimonios (.egs-testimonials__glow,
     z-index:1) se extiende visualmente por debajo de esa sección
     hasta solaparse con este footer (dato de Figma), y sin esto
     quedaba PENCIMA de todo el contenido del footer en vez de detrás
     — dato confirmado por captura. */
  position: relative;
  z-index: 2;
}

@media (min-width: 992px) {
  /* padding-bottom ajustado (antes 90px, demasiado — hacía el footer
     visiblemente más alto sin necesidad, dato confirmado por captura):
     el copyright ahora es position:absolute (ver .egs-footer__col--cta
     .egs-footer__copy más abajo) y ya no empuja la altura de
     .egs-footer con su propio flujo, así que solo necesita el hueco
     justo para sus 2 líneas de texto (line-height:16px × 2 ≈ 32px)
     más un margen pequeño, no un padding grande arbitrario. */
  /* padding-bottom mínimo pero no 0: el copyright es position:absolute
     (bottom:79px, ver más abajo) — sin este padding reservando ese
     espacio, el footer terminaba ANTES de donde realmente está el
     copyright, dejando ver el fondo blanco del body por debajo (dato
     confirmado por captura). El mínimo real es 79px + su propia
     altura (~16px) para que quede completamente contenido. */
  .egs-footer { padding-top: 24px; padding-bottom: 1em; }
}

/* Solo hay 2 bloques reales (Enlaces, Contacto): repeat(3,1fr) dejaba una
   tercera columna vacía en desktop. Se acotan a un ancho razonable y se
   centran, en vez de estirarse a los 1240px completos del container. */
.egs-footer__cols {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 24px 20px;
  margin-bottom: 28px;
}

/* Acota el ancho también en tablet (antes solo desde 992px): con solo
   Enlaces/Contacto (2 columnas cortas de texto) estirándose al ancho
   completo del container tablet (~688-911px), quedaba mucho hueco en
   blanco a la derecha de cada columna. */
@media (min-width: 768px) {
  .egs-footer__cols { max-width: 480px; }
}

@media (min-width: 992px) {
  .egs-footer__cols {
    max-width: 640px;
    gap: 32px 80px;
  }
}

.egs-footer__heading {
  font-family: var(--font-ui);
  font-weight: 500;
  font-size: clamp(13px, 0.25vw + 12px, 16px);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--color-white);
  /* Más aire hacia la lista de debajo (antes 14px): dato confirmado
     por captura, en Figma hay más separación entre "Enlaces"/
     "Contacto" y su primer elemento. */
  margin-bottom: 22px;
}

.egs-footer__links { display: grid; gap: 10px; }
.egs-footer__links a,
.egs-footer__contact a,
.egs-footer__contact p {
  font-family: var(--font-ui);
  font-size: clamp(12px, 0.2vw + 11px, 14px);
  /* Dato exacto del panel de Figma: 13.74px, line-height 16px. */
  line-height: 16px;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .66);
  transition: color var(--dur) var(--ease);
}
/* Solo los enlaces cortos (Enlaces): más ajustado que el dato de
   Figma, porque al partirse en 2 líneas (p.ej. "Espacios
   cardioprotegidos") 16px se veía con demasiado aire entre ambas. El
   bloque de Contacto (direcciones/emails largos, hasta 3 líneas)
   necesita el 16px de Figma para no verse apelotonado. */
.egs-footer__links a { line-height: 13px; }

.egs-footer__links a:hover,
.egs-footer__contact a:hover { color: var(--color-primary-light); }

.egs-footer__contact { display: grid; gap: 18px; }

.egs-footer__logo {
  display: block;
  width: 110px;
  margin: 0 auto 28px;
}

/* .egs-footer__col--cta (título+redes+botón+copy) y --certs (logos de
   certificación) duplican, para desktop, contenido que en mobile ya
   pinta closing.php (título+botón+logos, en su propio bloque
   mobile-only). Se ocultan el título y el botón de aquí en mobile para
   no duplicarlos; las redes y el copyright, que NO existen en
   closing.php, sí deben verse en mobile. Orden real (Figma):
   Enlaces/Contacto -> imagotipo -> redes -> enlaces legales ->
   copyright. Como .egs-footer__col--links y --cta viven en columnas
   HTML distintas, ambas pasan a display:contents en mobile para que
   sus hijos se intercalen como hermanos directos del mismo flex
   column, con order granular en cada uno en vez de mover el HTML.
   .egs-footer__col--certs sí duplicaría los logos (esos ya están en
   closing.php), se oculta entera. */
.egs-footer__row {
  display: flex;
  flex-direction: column;
}
.egs-footer__col--cta {
  display: contents;
}
.egs-footer__col--links {
  display: contents;
}
.egs-footer__col--cta .egs-closing__title,
.egs-footer__col--cta .egs-closing__btn { display: none; }
/* display:contents también en mobile: sus hijos (.egs-social y
   .egs-closing__btn) deben seguir participando en el mismo
   ordenamiento flex de .egs-footer__row de arriba, como si este
   wrapper no existiera — solo en desktop pasa a ser un flex real
   propio (ver el media query de abajo). */
.egs-footer__cta-width { display: contents; }
.egs-footer__col--links .egs-footer__cols { order: 1; }
.egs-footer__col--links .egs-footer__logo-link { order: 2; }
.egs-footer__col--cta .egs-social { order: 3; margin-bottom: 20px; }
.egs-footer__col--links .egs-footer__legal { order: 4; }
.egs-footer__col--cta .egs-footer__copy { order: 5; }
.egs-footer__col--certs { display: none; }

@media (min-width: 992px) {
  .egs-footer__row {
    display: flex;
    flex-direction: row;
    /* stretch (no flex-start): las 3 columnas igualan su altura a la
       más alta (la de Enlaces/Contacto), en vez de terminar cada una
       donde acaba su propio contenido y quedar visualmente
       descompensadas entre sí. */
    align-items: stretch;
    /* justify-content:space-between (con las 3 columnas ya en
       flex:0 0 auto, ciñéndose a su contenido real): reparte el
       espacio sobrante EN LOS DOS HUECOS entre columnas por igual, en
       vez de depender solo de un gap fijo que se veía desigual visual
       cuando una columna es más ancha que su contenido interno
       alineado a un lado. */
    justify-content: space-between;
    /* Sin flex-wrap:wrap (lo tuvo brevemente como "red de seguridad"):
       eso hacía justo lo que se quería evitar — en vez de comprimir
       las columnas con flex-shrink/minmax cuando faltaba espacio, el
       navegador saltaba la última columna (--links, la más ancha) a
       una segunda línea completa, rompiendo las 3 columnas en fila
       que se pedían siempre en desktop (≥992px), con nowrap salvo que
       la propia ventana caiga por debajo del breakpoint. */
    gap: 48px;
    margin-bottom: 34px;
  }

  /* Anula el order de mobile: en desktop el orden visual vuelve a ser
     el de las 3 columnas en su posición natural del DOM. */
  .egs-footer__col--cta,
  .egs-footer__col--links,
  .egs-footer__col--links .egs-footer__cols,
  .egs-footer__col--links .egs-footer__logo-link,
  .egs-footer__col--links .egs-footer__legal,
  .egs-footer__col--cta .egs-social,
  .egs-footer__col--cta .egs-footer__copy { order: initial; }

  /* flex-grow:0 (antes 1 1 340px, creciendo para llenar el ancho
     sobrante): esta columna solo tiene contenido angosto (título +
     redes + botón, todos alineados a la izquierda), así que crecer
     dejaba un hueco vacío ENTRE ella y la columna de logos en vez de
     que el gap:48px fuera uniforme entre las 3 columnas — dato
     confirmado por captura. Mismo criterio que --certs (flex:0 0 auto,
     ver más abajo): se ciñe a su ancho real de contenido. */
  .egs-footer__col--cta {
    flex: 0 0 auto;
    display: flex;
    flex-direction: column;
  }
  /* max-width en ch para que parta en 2 líneas como en el Figma
     ("EMPIEZA HOY TU / FORMACIÓN"), en vez de estirarse en una sola
     línea a lo ancho de toda la columna. */
  .egs-footer__col--cta .egs-closing__title {
    display: block;
    margin-bottom: 20px;
    max-width: 14ch;
    /* Más grande que el tope del .egs-h2 base (60px): dato exacto de
       Figma, este titular concreto usa 76.95px, no un H2 "estándar". */
    font-size: clamp(46px, 4vw + 20px, 77px);
  }
  /* Dato de Figma: el orden visual es título → redes sociales → botón
     "Ver cursos" (no botón antes que redes, como está en el DOM). El
     wrapper entero (.egs-footer__cta-width, ver más abajo) ya vive
     después del título en el DOM, así que basta con que sea un flex
     column con align-items:stretch: eso reordena redes/botón
     internamente sin falta (misma posición relativa que en el HTML)
     y además hace que el botón (sin ancho propio) se estire al mismo
     ancho intrínseco que las redes, en vez de al de la columna
     completa — dato confirmado por captura, el botón debe terminar
     donde termina el último icono social. */
  /* inline-flex (no flex): con flex a secas este wrapper se expande
     al 100% del ancho de .egs-footer__col--cta (su padre), y entonces
     align-items:stretch estiraba TODO —redes y botón— a ese ancho
     completo de columna, exactamente el problema que se buscaba
     evitar. inline-flex hace que el propio wrapper mida solo lo que
     necesita su contenido más ancho (las redes), y stretch estira el
     botón a ESE ancho real, no al de la columna. */
  .egs-footer__cta-width {
    display: inline-flex;
    flex-direction: column;
    align-items: stretch;
    /* .egs-footer__col--cta (su padre) es un flex column con
       align-items:stretch por defecto: sin esto, ESE stretch volvía
       a expandir el wrapper al ancho completo de la columna,
       anulando el propósito de que fuera inline-flex. */
    align-self: flex-start;
  }
  .egs-footer__col--cta .egs-social {
    justify-content: flex-start;
    margin-top: 32px;
    margin-bottom: 24px;
  }
  .egs-footer__col--cta .egs-closing__btn {
    /* inline-flex (no flex): un <a> con display:flex se comporta como
       bloque y ocupa el 100% del ancho disponible por sí mismo, sin
       depender de align-items:stretch del padre — anulaba por
       completo el efecto de "estirarse solo al ancho de las redes"
       que se buscaba con .egs-footer__cta-width. Con inline-flex el
       ancho vuelve a ser intrínseco (ajustado al texto/padding) y
       entonces sí lo estira el align-items:stretch del wrapper. */
    display: inline-flex;
    margin-top: 0;
    padding-inline: 28px;
  }
  /* Anclado abajo (como en el Figma): esta columna se estira
     (align-items:stretch en .egs-footer__row) a la altura de la más
     alta (--links), y el copyright debe quedar al fondo de ese
     espacio, igual que "Aviso Legal" en la columna de al lado — no
     fluyendo justo tras el botón/redes. */
  /* order:3 explícito (mayor que redes:1 y botón:2): sin esto, el
     copyright (order:initial → 0) competía en el ordenamiento flex
     por delante del botón, y aunque margin-top:auto lo empujaba al
     fondo del espacio disponible, quedaba VISUALMENTE entre las redes
     y el botón en vez de después de ambos — dato confirmado por
     captura. */
  /* position:absolute (no en flujo normal, con margin-top:auto):
     estando en flujo, el texto del copyright (dos líneas largas,
     "... Todos los derechos reservados." / "Diseñado y desarrollado
     por chillypills") seguía determinando el ancho intrínseco de la
     columna --cta pese al flex:0 0 auto, dejando un hueco enorme
     entre ella y la columna de logos (--certs) — dato confirmado por
     captura. Sacarlo del flujo evita que su ancho de texto influya en
     el de la columna: se ancla directamente contra .egs-footer (que
     ya es position:relative) en su esquina inferior izquierda, con
     el ancho completo del footer disponible para partirse en líneas
     con más aire, sin condicionar el layout de las columnas de
     encima. */
  .egs-footer__col--cta .egs-footer__copy {
    position: absolute;
    /* Mismo padding lateral y max-width que .egs-container (no left:0
       a secas): así queda alineado con el resto del contenido del
       footer en vez de pegarse al borde real de la ventana. */
    left: max(var(--gutter), calc(50% - var(--content-max) / 2 + var(--gutter)));
    /* bottom = padding-bottom del footer (2em, ver .egs-footer arriba)
       + la diferencia de altura entre esta línea de texto (16px) y
       la de "Aviso Legal" (36px, por su padding-top de 16px) — el
       copyright es position:absolute respecto al padding-box de
       .egs-footer, así que cualquier padding-bottom que se le añada
       ahí desplaza igual el punto bottom:0 de este elemento, mientras
       que "Aviso Legal" (en flujo normal) queda ANTES de ese padding
       — dato confirmado por captura y medición exacta con puppeteer
       (70px deja ambos alineados con el padding-bottom:2em actual). */
    bottom: 70px;
    /* width:max-content (antes calc(100% - 2*gutter), el ancho
       completo del footer): aunque el texto se ve alineado a la
       izquierda con text-align:left, la CAJA del <p> seguía midiendo
       todo ese ancho — su hitbox invisible (sin texto visible ahí,
       pero sí clicable/interceptando eventos) se solapaba encima de
       "Aviso Legal" y los enlaces legales, en la misma franja
       horizontal, haciendo difícil clicarlos (dato confirmado con
       DevTools: el rect real de .egs-footer__copy medía 1394px de
       ancho, cubriendo toda la fila). max-content ciñe la caja del
       elemento a su texto real. */
    width: max-content;
    max-width: calc(var(--content-max) - 2 * var(--gutter));
    text-align: left;
    margin: 0;
  }
  /* Oculto solo en desktop: en mobile (ancho estrecho) el salto de
     línea sigue haciendo falta, pero aquí el footer tiene de sobra
     para que todo el texto quepa en una sola línea, como en el
     Figma. */
  .egs-footer__copy-break { display: none; }

  .egs-footer__col--certs {
    display: flex;
    /* flex-grow:0 (no 1 1 340px): con las 3 columnas creciendo por
       igual para repartirse el ancho sobrante de --content-max
       (1600px), esta columna (solo una imagen) ganaba mucho más ancho
       del que necesitaba, y justify-content:center dejaba ese sobrante
       como un hueco vacío a los lados de los logos, separándolos de
       las columnas de texto. Con flex:0 0 auto se ciñe al ancho real
       del contenido (la imagen), quedando pegada entre --cta y
       --links, como en el Figma. */
    flex: 0 0 auto;
    align-items: flex-start;
    justify-content: flex-start;
    /* margin-top negativo (antes solo padding-top:4px): dato
       confirmado por captura, los logos deben quedar más arriba,
       alineados más cerca de la parte superior de "ENLACES"/
       "CONTACTO", no varios px más abajo que ellos. */
    margin-top: -16px;
    margin-left: -80px;
    padding-top: 4px;
    /* Sin margin-left negativo (antes -90px): con el bloque
       Enlaces/Contacto ahora pegado al borde derecho de su columna
       (ver .egs-footer__col--links .egs-footer__cols más abajo), ese
       desplazamiento ya no acercaba los logos al título, sino que
       los desalineaba del resto — dato confirmado por captura. */
  }
  .egs-footer__col--certs .egs-certs-strip { margin: 0; }

  .egs-footer__col--links {
    /* flex-grow:0 (antes 1 1 420px, creciendo para llenar el espacio
       sobrante de la fila): esa columna, más ancha que su propio
       contenido (el bloque Enlaces/Contacto, ~560px, alineado a la
       derecha con align-self:flex-end dentro de ella), dejaba un
       hueco vacío A SU IZQUIERDA — el mismo gap:48px de la fila se
       veía multiplicado por ese hueco extra, separando mucho más los
       logos de "Enlaces" que de la columna del título. Con flex:0 0
       auto la columna se ciñe a su contenido real, y el gap:48px de
       la fila vuelve a ser la única separación entre ambos bloques.
       align-items:flex-end (no la propia columna alineada a la
       derecha del bloque interno): con flex:0 0 auto ya no hace falta
       ese align-self en el hijo, el ancho de la columna coincide con
       su contenido. */
    /* flex-shrink:1 (no 0): puede encoger un poco en el rango
       992-1024px si aún hace falta, ahora que su contenido interno
       (.egs-footer__cols) ya tiene minmax en vez de un ancho fijo. */
    flex: 0 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    /* Explícito (no confiar en el stretch por defecto): Enlaces/
       Contacto y los enlaces legales quedan pegados al borde
       izquierdo; el imagotipo es la excepción (align-self más abajo),
       pegado a la derecha. */
    align-items: flex-start;
  }
  /* gap horizontal reducido (antes 40px): dato confirmado por
     captura, las columnas Enlaces/Contacto deben quedar más juntas
     entre sí. */
  /* grid-template-columns:auto auto (no repeat(2,1fr)): con 1fr cada
     columna ocupaba la mitad exacta del ancho disponible sin importar
     su contenido real, así que "Contacto" (mucho más ancho por sus
     líneas de dirección/email) dejaba un hueco muerto entre el final
     de "Enlaces" y donde arrancaba su propio contenido — el gap del
     grid en sí ya era pequeño, pero no se notaba por ese ancho de
     columna sobrante. auto ciñe cada columna a su contenido real. */
  /* grid-template-columns con un ancho fijo igual en ambas pistas
     (medido: "Contacto" ocupa ~370px de contenido real, más ancha
     que "Enlaces"): con "auto auto" o con "repeat(2, max-content)"
     cada columna del grid mide solo SU PROPIO contenido de forma
     independiente (ninguna de las dos sintaxis iguala una pista al
     ancho de la otra), así que "Enlaces" quedaba visiblemente más
     estrecha que "Contacto" — dato confirmado por captura, se pide
     el mismo ancho en ambas. Fijar el mismo valor en las dos pistas
     es la única forma de igualarlas sin recurrir a JS. */
  /* align-self:flex-end (no el flex-start heredado de --links): dato
     confirmado por captura — el bloque Enlaces/Contacto debe quedar
     pegado al borde derecho de su columna (como el "space-between"
     de Elementor que compartiste), no al izquierdo. width:auto (no
     100%) para que el bloque se ciña a su ancho real (2×260px + gap)
     en vez de estirarse a ocupar toda la columna, que anularía el
     efecto de "pegado a la derecha". */
  /* minmax(180px, 260px) (no 260px fijo): con un ancho fijo, esta
     fila (más el título ancho + los logos, todos flex:0 0 auto)
     desbordaba horizontalmente en el rango 992-1024px — dato
     confirmado con puppeteer, row.scrollWidth > row.clientWidth
     justo ahí. minmax deja que la columna se encoja hasta 180px en
     pantallas de escritorio más estrechas antes de forzar scroll,
     sin necesidad de subir el breakpoint del layout de 3 columnas
     completo (eso rompía el desktop normal, >1024px, cayendo al
     layout apilado de mobile ahí también). */
  .egs-footer__col--links .egs-footer__cols {
    align-self: flex-end;
    margin-bottom: 40px;
    grid-template-columns: minmax(160px, 260px) minmax(160px, 260px);
    justify-content: start;
    gap: 32px 40px;
    width: auto;
    max-width: 100%;
  }
  /* El imagotipo va pegado a la derecha de la columna, no a la
     izquierda como el resto de su contenido. */
  .egs-footer__col--links .egs-footer__logo-link { display: block; align-self: flex-end; }
  /* Reducido (antes 150px, se veía demasiado grande — dato confirmado
     por captura), pero sin volver al 110px base: sigue algo mayor,
     con más margen inferior que el tamaño base. */
  .egs-footer__col--links .egs-footer__logo { width: 120px; margin: 0 0 40px; }
  .egs-footer__col--links .egs-footer__legal {
    /* Pegados a la derecha, alineados con el imagotipo (align-self:
       flex-end) de encima, no a la izquierda como Enlaces/Contacto.
       width:100% es imprescindible: la columna usa align-items:
       flex-start, que encoge a cada hijo a su ancho de contenido, así
       que sin esto el justify-content:flex-end no tenía espacio libre
       donde empujar los enlaces y quedaban a la izquierda igual. */
    width: 100%;
    justify-content: flex-end;
    padding-top: 20px;
    /* Con align-items:stretch, esta columna es la más alta (referencia
       de las otras dos): el separador de enlaces legales se ancla
       abajo del todo, en vez de quedar pegado justo bajo el imagotipo. */
    margin-top: auto;
  }
}

/* Breakpoint intermedio (992-1199px): en vez de seguir comprimiendo
   las columnas de Enlaces/Contacto hasta un mínimo (minmax(160px,...)
   más abajo), directamente se baja la columna --links completa a su
   propia línea, debajo de título+logos — dato pedido expresamente:
   "cuando baje de x resolución que baje la columna abajo", en vez de
   depender solo de la compresión flexible para rangos muy estrechos
   de escritorio real. */
@media (min-width: 992px) and (max-width: 1199px) {
  .egs-footer__row { flex-wrap: wrap; }
  .egs-footer__col--links {
    flex-basis: 100%;
    margin-top: 24px;
  }
  /* Vuelve a la izquierda (no pegado a la derecha, ver align-self:
     flex-end del bloque de arriba): al ocupar toda la fila propia,
     "pegado a la derecha" ya no tiene sentido visual, dejaba
     Enlaces/Contacto flotando lejos del resto del contenido. */
  .egs-footer__col--links .egs-footer__cols {
    align-self: flex-start;
  }
  .egs-footer__col--links .egs-footer__logo-link {
    align-self: flex-start;
  }
}

.egs-social {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  margin-bottom: 34px;
}
.egs-social a {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid rgba(134, 207, 202, .35);
  color: var(--color-primary-light);
  transition: background-color var(--dur) var(--ease), color var(--dur) var(--ease);
}
.egs-social a:hover { background: var(--color-primary); color: var(--color-white); }
.egs-social svg { width: 20px; height: 20px; }

.egs-footer__legal {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 8px 18px;
  padding-top: 16px;
  /* Sin border-top (antes 1px solid rgba(255,255,255,.12)): dato
     confirmado por captura, en Figma no hay línea separadora encima
     de "Aviso Legal". */
  font-family: var(--font-ui);
  /* Dato exacto del panel de Figma ("Aviso Legal"): 13.74px, line-height 16px. */
  font-size: clamp(12px, 0.2vw + 11px, 14px);
  line-height: 16px;
}
/* padding vertical (sin margin negativo compensatorio, que
   desalineaba el área clicable real respecto al texto visible —
   dato confirmado: el cursor debía ponerse arriba o abajo del texto,
   no encima, para activar el enlace): amplía el área clicable real
   de cada enlace (antes solo el alto exacto del texto, 16px de
   line-height, muy ajustado para el cursor). */
.egs-footer__legal a {
  color: rgba(255, 255, 255, .66);
  padding: 8px 0;
  display: inline-block;
}
.egs-footer__legal a:hover { color: var(--color-primary-light); }
.egs-footer__legal .sep { opacity: .4; }

.egs-footer__copy {
  margin-top: 14px;
  text-align: center;
  font-family: var(--font-ui);
  /* Dato exacto del panel de Figma ("2026 Emergency Global System..."): 13.74px, line-height 16px. */
  font-size: clamp(12px, 0.2vw + 11px, 14px);
  line-height: 16px;
  color: rgba(255, 255, 255, .5);
}
.egs-footer__copy a { color: var(--color-primary-light); }

