/* ============================================================
   Trackpeople — Compiled stylesheet (from scss/)
   ============================================================ */

:root {
  --brand-gradient: linear-gradient(145deg, #b269ac 0%, #3AA5BE 50%, #56c5b5 100%);
  --brand-violet: #b269ac;
  --brand-blue:   #3AA5BE;
  --brand-mint:   #56c5b5;
  /* Color del antetítulo .tag, elegido por dirección de diseño.
     Da 2,76:1 sobre blanco, por debajo del 4,5:1 que pide WCAG 2.2 AA para texto pequeño.
     Si en algún momento se quiere que cumpla, #297385 es la misma familia y da 5,41:1. */
  /* Azul de marca para texto. Antes era #3da9bc, que daba 2,76:1 sobre blanco, 2,64 sobre
     --ink-50 y 2,51 sobre --ink-100: por debajo del 4,5:1 de WCAG en los tres fondos del
     sitio, y lo lleva .tag, que sale en casi todas las secciones de casi todas las paginas.
     Era el fallo mas repetido de la web. Este pasa en los tres: 5,02 / 4,80 / 4,56. */
  --brand-blue-texto: #25798B;
  /* Azul de marca oscurecido hasta 4.73:1 sobre blanco. */
  --brand-blue-fuerte: #2C7D90;
  --ink-900: #0A0A0B;
  --ink-800: #18181B;
  --ink-700: #27272A;
  /* Ya estaba en la escala de tailwind.config.js, faltaba aqui. Es el escalon que se necesita
     para el texto de la columna «antes» de la comparativa: sobre su gris de fondo --ink-500 se
     queda en 4,17:1 y no pasa AA. */
  --ink-600: #3F3F46;
  --ink-500: #71717A;
  --ink-400: #A1A1AA;
  --ink-300: #D4D4D8;
  --ink-200: #E4E4E7;
  --ink-100: #F4F4F5;
  --ink-50:  #FAFAF8;
  --r-pill: 999px;
  --shadow-sm: 0 1px 2px rgba(10,10,11,0.04), 0 1px 3px rgba(10,10,11,0.06);
  --shadow-lg: 0 30px 60px -20px rgba(10,10,11,0.18), 0 12px 24px -10px rgba(10,10,11,0.08);
  --shadow-glow: 0 30px 80px -20px rgba(58,165,190,0.4), 0 10px 30px -10px rgba(178,105,172,0.3);
  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
}

* { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
html { scroll-behavior: smooth; overflow-x: hidden; }
body {
  font-family: "Inter", ui-sans-serif, system-ui, sans-serif;
  background: var(--ink-50);
  color: var(--ink-900);
  overflow-x: hidden;
  font-feature-settings: "ss01","cv11";
}
h1, h2, h3, h4, h5 { font-family: "Manrope", ui-sans-serif, system-ui, sans-serif; letter-spacing: -0.02em; }
::selection { background: var(--brand-blue); color: white; }

/* ============================================================
   Ritmo vertical de las secciones de bloque

   Antes cada plantilla llevaba su relleno escrito en clases de Tailwind (py-20 md:py-24 y
   alguna variante). Ahora lo pone .sec con variables, y desde «Apariencia» se puede pisar
   cualquiera de las cuatro medidas escribiendo esa misma variable en el atributo style del
   elemento, que gana a estas reglas.

   Tuvo que ser con variables y no con clases porque tailwind.build.css se genera de
   antemano leyendo el código: una clase compuesta en tiempo de ejecución —pt-[137px]— no
   estaría en la hoja, y el estilo en línea suelto no puede distinguir móvil de escritorio.
   ============================================================ */
.sec {
  --sec-pt: 6rem;    /* a partir de 768 px; era md:py-24 */
  --sec-pb: 6rem;
  --sec-pt-m: 5rem;  /* por debajo; era py-20 */
  --sec-pb-m: 5rem;
  padding-top: var(--sec-pt-m);
  padding-bottom: var(--sec-pb-m);
  margin-top: var(--sec-mt-m, 0px);
  margin-bottom: var(--sec-mb-m, 0px);
}
@media (min-width: 768px) {
  .sec {
    padding-top: var(--sec-pt);
    padding-bottom: var(--sec-pb);
    margin-top: var(--sec-mt, 0px);
    margin-bottom: var(--sec-mb, 0px);
  }
}

/* Los bloques que nunca han respirado como los demás. */
.sec-medium { --sec-pt: 5rem; --sec-pb: 5rem; --sec-pt-m: 4rem; --sec-pb-m: 4rem; }       /* era py-16 md:py-20 */
.sec-tight  { --sec-pt: 2.5rem; --sec-pb: 2.5rem; --sec-pt-m: 2.5rem; --sec-pb-m: 2.5rem; } /* era py-10 */
.sec-hero  { --sec-pt: 11rem; --sec-pb: 7rem; --sec-pt-m: 9rem; --sec-pb-m: 5rem; }        /* era pt-36 pb-20 md:pt-44 md:pb-28 */

/* Los bordes iban pegados al fondo —blanco sí, gris no—. Siguen saliendo igual por
   defecto, pero ahora son suyos y el editor puede quitarlos o ponerlos. */
.sec-border-top { border-top: 1px solid var(--ink-200); }
.sec-border-bottom  { border-bottom: 1px solid var(--ink-200); }

/* ============================================================
   Alta de empresa (plantilla «Registro»)

   Banda a todo el ancho con la captura de la aplicación de fondo: los paneles quedan a la
   izquierda y el formulario cae encima, a la derecha.

   El velo no es adorno. La captura es clara y está llena de tarjetas blancas: sin él, el
   formulario —que también es una tarjeta blanca— perdía el borde contra el fondo. Va en
   degradado, flojo donde se ve la imagen y denso bajo el formulario, para no apagar la
   captura entera.
   ============================================================ */
.reg-band {
  position: relative;
  background-image: url("/assets/bgVideo.png");
  background-size: cover;
  background-position: center left;
}
.reg-band::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  /* Dos capas. La horizontal separa el formulario del fondo; la vertical aplana la franja
     de arriba, que es donde caen el titular y la entradilla: ahí no basta con el contraste
     —medido pasaba— porque los bordes en diagonal de los paneles cruzaban el texto y lo
     partían. Más abajo se afloja para que la maqueta siga viéndose sobre la imagen. */
  background:
    linear-gradient(180deg, rgba(250,250,248,0.72) 0%, rgba(250,250,248,0.66) 44%, rgba(250,250,248,0.00) 66%),
    linear-gradient(90deg, rgba(250,250,248,0.10) 0%, rgba(250,250,248,0.45) 45%, rgba(250,250,248,0.88) 72%, rgba(250,250,248,0.96) 100%);
  -webkit-backdrop-filter: blur(18px);
  backdrop-filter: blur(18px);
}
/* Apilado no hay «izquierda» ni «derecha»: la tarjeta ocupa el ancho y la captura queda
   detrás, así que el velo pasa a ser parejo y más denso. */
@media (max-width: 1023px) {
  .reg-band::before { background: rgba(250,250,248,0.92); }
}
.reg-band > * { position: relative; z-index: 1; }

/* ---------- el indicador de pasos ---------- */
.reg-steps {
  list-style: none; margin: 0 0 2.25rem; padding: 0;
  display: flex; align-items: center; gap: 0.5rem;
}
.reg-step-dot {
  display: flex; align-items: center; gap: 0.6rem;
  font-size: 0.875rem; font-weight: 600; color: var(--ink-400);
  transition: color 0.3s var(--ease-out-expo);
}
/* Los pasos se reparten todo el ancho: cada uno menos el último crece, y lo que crece es la
   rayita de dentro. Así el 1 queda pegado al borde izquierdo y el último al derecho, midan
   lo que midan los rótulos. */
.reg-step-dot:not(:last-child) { flex: 1 1 auto; min-inline-size: 0; }
/* La rayita entre pasos. Va en ::after del anterior y no como elemento suelto para que no
   la lea un lector de pantalla: no dice nada que no diga ya el número. */
.reg-step-dot:not(:last-child)::after {
  content: ""; flex: 1 1 auto; min-inline-size: 1.25rem; block-size: 2px; margin-inline-start: 0.4rem;
  background: var(--ink-200); border-radius: 2px;
}
.reg-step-num {
  inline-size: 28px; block-size: 28px; border-radius: 50%;
  display: grid; place-items: center; flex: none;
  background: var(--ink-100); color: var(--ink-500);
  font-size: 0.8125rem; font-weight: 700;
  transition: background 0.3s var(--ease-out-expo), color 0.3s var(--ease-out-expo);
}
.reg-step-dot.is-activa { color: var(--ink-900); }
.reg-step-dot.is-activa .reg-step-num { background: var(--brand-gradient); color: #fff; }
.reg-step-dot.is-hecha .reg-step-num { background: var(--brand-blue); color: #fff; }
.reg-step-dot.is-hecha { color: var(--ink-700); }
/* En pantalla estrecha se quedan los números: tres rótulos no caben y se parten en dos
   líneas cada uno. El nombre del paso lo sigue diciendo el <h2> de dentro. */
@media (max-width: 479px) {
  .reg-step-txt { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .reg-step-dot:not(:last-child)::after { inline-size: 1rem; }
}

/* ---------- pie del formulario ---------- */
.reg-buttons {
  display: flex; align-items: center; gap: 0.75rem;
  margin-block-start: 2rem; padding-block-start: 1.75rem;
  border-block-start: 1px solid var(--ink-200);
}
/* La nota empuja los botones a la derecha y se queda ella a la izquierda; con «Atrás»
   presente, se coloca en medio. */
.reg-note { margin-inline-end: auto; }

.reg-error {
  margin-block-start: 1.25rem; padding: 0.7rem 0.95rem;
  border-radius: 12px; border: 1px solid #FECACA; background: #FEF2F2;
  color: #991B1B; font-size: 0.875rem;
}

/* El botón de enviar mientras se espera a la API: aro girando en lugar de la flecha. El aro
   está siempre en el marcado y solo se enseña con .is-cargando, así no hay que crearlo. */
.reg-spinner {
  display: none; inline-size: 1em; block-size: 1em;
  border: 2px solid currentColor; border-block-start-color: transparent; border-radius: 50%;
  animation: spin 0.7s linear infinite;
}
.btn.is-cargando { cursor: progress; }
.btn.is-cargando .reg-spinner { display: inline-block; }
.btn.is-cargando .arrow { display: none; }
/* El formulario bloqueado (inert) se ve apagado, para que se note que no se puede tocar. */
[data-reg-form][aria-busy="true"] [data-reg-step] { opacity: 0.55; transition: opacity 0.2s; }
/* Con menos movimiento el aro sigue girando, más despacio: es lo único que dice que algo pasa. */
@media (prefers-reduced-motion: reduce) {
  .reg-spinner { animation-duration: 1.6s; }
}

/* ---------- la confirmación ---------- */
.reg-success { text-align: center; padding-block: 1.5rem; }
.reg-tick { display: inline-block; inline-size: 88px; block-size: 88px; }
.reg-tick svg { inline-size: 100%; block-size: 100%; }
.reg-tick-ring { stroke: var(--brand-blue); stroke-width: 2.5; stroke-dasharray: 145; stroke-dashoffset: 145; }
.reg-tick-check { stroke: var(--brand-blue); stroke-width: 4; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 48; stroke-dashoffset: 48; }
/* Se dibuja el aro y después la marca. Las dos con dashoffset, que es lo que anima un trazo
   sin repintar nada: solo se mueve una propiedad y no toca el diseño de la caja. */
.reg-success.is-visible .reg-tick-ring { animation: reg-trazo 0.55s var(--ease-out-expo) forwards; }
.reg-success.is-visible .reg-tick-check { animation: reg-trazo 0.35s var(--ease-out-expo) 0.45s forwards; }
.reg-success.is-visible h2,
.reg-success.is-visible p { animation: reg-entra 0.45s var(--ease-out-expo) 0.6s both; }
.reg-success.is-visible .reg-accesos { animation: reg-entra 0.45s var(--ease-out-expo) 0.75s both; }
@keyframes reg-trazo { to { stroke-dashoffset: 0; } }
@keyframes reg-entra { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* --- las dos puertas de entrada tras registrarse -------------------------------------------
   Una por aplicación. Vienen de una tarjeta y no de un botón suelto porque lo que hay que
   decidir aquí es «quién soy», no «qué hago»: la etiqueta ayuda tanto como el destino.

   La tarjeta ENTERA es el enlace, así que no lleva botón dentro: con una sola acción por
   caja, un botón sería un segundo enlace al mismo sitio. «Entrar» se queda como señal de que
   se puede pulsar, y se mueve al pasar por encima como el resto de flechas del sitio.

   Van alineadas a la izquierda dentro de un panel centrado: el texto de dos líneas centrado
   se lee peor, y son dos fichas para comparar, no un titular. */
.reg-accesos {
  display: grid; gap: 1rem;
  margin-top: 2.25rem; text-align: left;
}
@media (min-width: 640px) { .reg-accesos { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.reg-acceso {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-areas: "icono texto" "ir ir";
  gap: 0.35rem 1rem;
  padding: 1.35rem 1.4rem;
  border: 1px solid var(--ink-200); border-radius: 18px;
  background: #fff; text-decoration: none;
  box-shadow: 0 1px 2px rgba(10, 10, 11, 0.04);
  transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s var(--ease-out-expo);
}
.reg-acceso:hover {
  border-color: var(--brand-blue);
  box-shadow: 0 18px 38px -22px rgba(10, 10, 11, 0.28);
  transform: translateY(-2px);
}
.reg-acceso:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 3px; }
.reg-acceso-icono {
  grid-area: icono;
  display: grid; place-items: center;
  inline-size: 2.6rem; block-size: 2.6rem;
  border-radius: 14px;
  background: var(--brand-gradient); color: #fff;
}
.reg-acceso-icono svg { inline-size: 1.4rem; block-size: 1.4rem; }
.reg-acceso-txt { grid-area: texto; display: grid; gap: 0.3rem; align-content: center; }
.reg-acceso-tit {
  font-family: "Manrope", sans-serif; font-weight: 800;
  font-size: 1.02rem; color: var(--ink-900); line-height: 1.25;
}
.reg-acceso-sub { font-size: 0.85rem; color: var(--ink-500); line-height: 1.45; }
/* «Entrar» baja a su propia fila y ocupa el ancho: así las dos tarjetas lo tienen a la misma
   altura aunque una descripción ocupe dos líneas y la otra una. */
.reg-acceso-ir {
  grid-area: ir;
  margin-top: 0.9rem; padding-top: 0.9rem;
  border-top: 1px solid var(--ink-100);
  font-family: "Manrope", sans-serif; font-weight: 700;
  font-size: 0.9rem; color: var(--brand-blue-texto);
}
.reg-acceso:hover .reg-acceso-ir { color: var(--ink-900); }
.reg-acceso .arrow { transition: transform 0.25s var(--ease-out-expo); display: inline-block; }
.reg-acceso:hover .arrow { transform: translateX(4px); }
@media (prefers-reduced-motion: reduce) {
  .reg-acceso, .reg-acceso .arrow { transition: none; }
  .reg-acceso:hover { transform: none; }
}

/* El confeti. Cubre la banda entera, no la tarjeta, para que caiga de arriba abajo de la
   pantalla. pointer-events a cero: es decoración y no debe estorbar al ratón. Las piezas las
   crea /js/registro.js, que es quien les pone color, sitio y tiempos al azar. */
.reg-confetti {
  position: absolute; inset: 0; overflow: hidden;
  pointer-events: none; z-index: 2;
}
.reg-confetti i {
  position: absolute; inset-block-start: -6%;
  inline-size: 9px; block-size: 14px;
  border-radius: 2px;
  animation-name: reg-caer;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}
/* Cae, deriva de lado y gira. La opacidad se apaga al final para que no desaparezca de
   golpe al llegar abajo. */
@keyframes reg-caer {
  0%   { transform: translate3d(0, 0, 0) rotate(0deg); opacity: 1; }
  85%  { opacity: 1; }
  100% { transform: translate3d(var(--reg-drift, 0), 115vh, 0) rotate(var(--reg-spin, 360deg)); opacity: 0; }
}
/* Quien pide menos movimiento ve el resultado, no el dibujo. */
@media (prefers-reduced-motion: reduce) {
  .reg-success.is-visible .reg-tick-ring,
  .reg-success.is-visible .reg-tick-check { animation: none; stroke-dashoffset: 0; }
  .reg-success.is-visible h2,
  .reg-success.is-visible p { animation: none; }
}

/* La composición del hero se sale un poco de su columna hacia la izquierda, que es donde
   hay aire: la rejilla del hero es de 12 y esta ocupa 5, y a tamaño real se quedaba pequeña.
   Crece hacia la izquierda y no hacia la derecha para no salirse del contenedor. Solo a
   partir de lg, que es cuando hay dos columnas.

   El 8% no es a ojo: con más, la caja de la imagen se metía encima de la última línea del
   titular —13 px a 1500 y 26 px a 1100, medidos sobre las líneas de texto, no sobre la caja
   del <h1>, que ocupa las siete columnas aunque el texto no las llene—. Al pisarla, esa
   franja de texto deja de poder seleccionarse. */
@media (min-width: 1024px) {
  .hero-visual { inline-size: 108%; max-inline-size: none; margin-inline-start: -8%; }
}

.font-display { font-family: "Manrope", sans-serif; }
.font-mono    { font-family: "Inter", sans-serif; }

/* gradient utilities */
/* Continuous brand gradient — single rule (no per-word splitting) */
.grad-text {
  background-image: var(--brand-gradient);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
  /* «inline» y no «inline-block»: con inline-block la frase destacada es una sola caja
     atómica, así que en un título que se parte en varias líneas salta ENTERA a la línea
     siguiente en cuanto no cabe completa en la actual, aunque sobre sitio de sobra —
     «¿Teletrabajo o trabajo / presencial? / Gestiónalo en tiempo real.» en vez de repartir
     las palabras como el resto del titular. Con inline, el degradado se reparte palabra a
     palabra igual que el texto normal que lo rodea.
     La letra se pinta a traves del fondo, asi que solo se ve dentro de la caja del elemento.
     Con un interlineado ajustado (leading-tight y similares) la caja acaba en la linea base y
     las colas de la g, la q, la y o la p se quedaban cortadas. El relleno agranda la zona
     pintada; en un inline no suma altura de linea, asi que no hace falta compensarlo con un
     margen negativo —eso solo era necesario con inline-block— y además se aplica a CADA
     linea cuando la frase se reparte en varias, no solo a la ultima. */
  padding-bottom: 0.16em;
}
.grad-bg { background: var(--brand-gradient); }
.grad-bg-soft { background: linear-gradient(145deg, rgba(178,105,172,.12) 0%, rgba(58,165,190,.12) 50%, rgba(86,197,181,.12) 100%); }

.brand-blob {
  position: absolute;
  width: 720px; height: 720px;
  border-radius: 50%;
  background: var(--brand-gradient);
  filter: blur(120px);
  opacity: 0.55;
  pointer-events: none;
  /* Sin will-change: ya no se mueven, y promocionar a capa propia una superficie de 720x720
     desenfocada 120 px cuesta memoria de GPU para nada. */
}
.brand-blob.sm { width: 380px; height: 380px; filter: blur(80px); opacity: 0.4; }
/* En movil la mancha de 720px con top/right:-200px (fijado inline en el marcado del hero)
   seguia asomando por el borde segun el ancho del dispositivo. Mas desplazada queda fuera
   del todo. Solo la del hero (la grande, no la .sm de la esquina opuesta), y con !important
   porque hay que ganarle a ese inline style. */
@media (max-width: 640px) {
  .hero .brand-blob:not(.sm) { top: -450px !important; right: -450px !important; }
}

/* buttons */
.btn {
  display: inline-flex; align-items: center; gap: 0.55rem;
  padding: 0.85rem 1.4rem;
  border-radius: var(--r-pill);
  font-weight: 600;
  font-size: 0.875rem;
  letter-spacing: -0.01em;
  transition: transform 0.35s var(--ease-out-expo), border-color 0.35s var(--ease-out-expo), box-shadow 0.35s var(--ease-out-expo), background-color 0.35s var(--ease-out-expo), color 0.35s var(--ease-out-expo), opacity 0.35s var(--ease-out-expo);
  cursor: pointer; white-space: nowrap;
  text-decoration: none;
}
.btn .arrow { transition: transform 0.35s var(--ease-out-expo); display: inline-block; }
.btn:hover .arrow { transform: translateX(4px); }
.btn-primary {
  background: var(--ink-900); color: white;
  position: relative;
  border: 1px solid var(--ink-900);
  box-shadow: 0 1px 2px rgba(10,10,11,0.10);
}
/* la capa de degradado desborda 1px para tapar el borde por completo */
.btn-primary::before {
  content: ""; position: absolute; inset: -1px;
  border-radius: inherit;
  background: var(--brand-gradient);
  opacity: 0;
  transition: opacity 0.4s var(--ease-out-expo);
  z-index: 0;
}
.btn-primary > * { position: relative; z-index: 1; }
.btn-primary:hover, .btn-primary:focus-visible {
  border-color: transparent;
  transform: translateY(-2px);
  box-shadow: 0 16px 30px -14px rgba(58,165,190,0.5), 0 6px 16px -10px rgba(178,105,172,0.4);
}
.btn-primary:hover::before, .btn-primary:focus-visible::before { opacity: 1; }
.btn-primary:active { transform: translateY(0); box-shadow: 0 4px 12px -6px rgba(58,165,190,0.5); }

.btn-ghost {
  background: transparent; color: var(--ink-900); border: 1px solid var(--ink-300);
}
.btn-ghost:hover, .btn-ghost:focus-visible {
  background: white;
  color: var(--ink-900);
  border-color: var(--brand-blue);
  transform: translateY(-2px);
  box-shadow: 0 14px 26px -16px rgba(10,10,11,0.35);
}
.btn-ghost:active { transform: translateY(0); box-shadow: none; }
.btn-ghost .grad-bg { transition: transform 0.35s var(--ease-out-back); }
.btn-ghost:hover .grad-bg { transform: scale(1.12); }

@media (prefers-reduced-motion: reduce) {
  .btn, .btn::before, .btn .arrow, .btn-ghost .grad-bg { transition-duration: 0.01ms; }
  .btn:hover { transform: none; }
}

.btn-grad {
  background: var(--brand-gradient); color: white; border: none;
}
.btn-grad:hover { transform: translateY(-2px); box-shadow: var(--shadow-glow); }

.btn-light {
  background: white; color: var(--ink-900); border: 1px solid rgba(255,255,255,0.2);
}
.btn-light:hover { transform: translateY(-2px); }

/* header */
.site-header {
  position: fixed; top: 0; left: 0; right: 0;
  z-index: 50; padding: 1.25rem 0;
  transition: background-color 0.4s var(--ease-out-expo), box-shadow 0.4s var(--ease-out-expo);
}
.header-inner {
  position: relative;
  display: flex; align-items: center; justify-content: space-between;
  gap: 2rem;
  max-width: 1280px; margin: 0 auto;
  padding: 0.75rem 1rem 0.75rem 1.5rem;
  background: rgba(255,255,255,0.7);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  backdrop-filter: blur(18px) saturate(140%);
  border: 1px solid rgba(10,10,11,0.06);
  border-radius: var(--r-pill);
  box-shadow: var(--shadow-sm);
}
.site-header.scrolled .header-inner {
  background: rgba(255,255,255,0.92);
  box-shadow: 0 12px 30px -12px rgba(10,10,11,0.12);
}
.nav-link {
  font-size: 0.875rem; font-weight: 500;
  color: var(--ink-800);
  padding: 0.35rem 0.6rem;
  border-radius: var(--r-pill);
  transition: color 0.3s ease, background-color 0.3s ease;
  text-decoration: none;
}
.nav-link:hover, .nav-link.active { color: var(--brand-violet); }
.logo svg { height: 18px; width: auto; display: block; }
.logo-light svg path { fill: white !important; }

/* ==== Megamenu ==== */
.site-header[data-mm-open] .header-inner {
  background: rgba(255,255,255,0.95);
  box-shadow: 0 12px 40px -10px rgba(10,10,11,0.10);
}
.mm-trigger {
  display: inline-flex; align-items: center; gap: 0.35rem;
  background: transparent; border: none; cursor: pointer;
  font-family: inherit; line-height: inherit;
}
.mm-trigger .mm-caret { transition: transform 0.3s ease; opacity: 0.6; }
.mm-trigger[aria-expanded="true"] {
  color: var(--brand-violet);
}
.mm-trigger[aria-expanded="true"] .mm-caret { transform: rotate(180deg); }

.megamenu {
  position: absolute;
  top: calc(100% + 12px);
  left: 50%;
  transform: translateX(-50%) translateY(-8px);
  width: min(1180px, calc(100vw - 32px));
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 28px;
  box-shadow: 0 40px 80px -30px rgba(10,10,11,0.18), 0 16px 40px -16px rgba(10,10,11,0.10);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.35s var(--ease-out-expo), transform 0.45s var(--ease-out-expo);
  overflow: hidden;
  z-index: 60;
}
.site-header[data-mm-open] .megamenu {
  opacity: 1; pointer-events: auto;
  transform: translateX(-50%) translateY(0);
}
.mm-inner { position: relative; }
.mm-pane {
  display: none;
  padding: 1.4rem 1.5rem;
}
.mm-pane.active { display: block; animation: mmFade 0.28s ease both; }
@keyframes mmFade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.mm-grid {
  /* El hueco entre columnas vive aqui porque el ancho de columna se calcula con el. */
  --mm-gap: 2rem;
  /* Cuantas columnas trae el panel. Solo lo usa .mm-grid-muchas; aqui las pistas son cuatro
     siempre. Lo pone el marcado. */
  --mm-cols: 4;
  display: grid;
  gap: var(--mm-gap);
  /* Cuatro pistas siempre, traiga el panel las columnas que traiga: las que sobran se quedan
     vacias. Hace falta para poder mandar la promo a la ultima, y de paso las columnas de
     enlaces caen en la misma reticula se pase al panel que se pase.
     Ninguna columna pasa del cuarto del panel, promo incluida. El 25 % pelado no vale:
     cuatro columnas al 25 % mas tres huecos de 2rem se salen del panel. Un cuarto del ancho
     ES la columna mas su parte del hueco, y a cada una de las cuatro le tocan tres cuartos de
     hueco, asi que el ancho util es 25% - 0.75 * gap.
     minmax(0, ...) y no el valor a secas: sin el, el minimo de una pista es su contenido y un
     titulo largo la ensanchaba por encima del tope. */
  grid-template-columns: repeat(4, minmax(0, calc(25% - 0.75 * var(--mm-gap))));
  height: 100%;
}

/* La promo, al borde derecho del panel. Las columnas de enlaces se colocan solas por orden
   desde la primera pista, asi que con una sola columna queda el hueco en medio y la promo
   pegada al canto, que es lo que se busca. */
.mm-grid .mm-col-cta { grid-column: 4; }

/* Cinco o mas no caben a un cuarto cada una. Se reparten la fila a partes iguales, que con
   cinco ya es un quinto: por debajo del tope igualmente. */
/* Cinco o mas columnas: no caben a un cuarto cada una, asi que se reparten la fila a partes
   iguales —con cinco ya es un quinto, por debajo del tope igualmente— y la promo se queda
   donde le toque por orden, que con la fila llena es el borde derecho de todas formas. */
.mm-grid-muchas { grid-template-columns: repeat(var(--mm-cols), minmax(0, 1fr)); }
.mm-grid-muchas .mm-col-cta { grid-column: auto; }
.mm-eyebrow {
  font-size: 0.7rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.16em;
  color: var(--brand-blue-texto);
  margin-bottom: 1rem;
}
.mm-link {
  display: flex; align-items: center; gap: 0.6rem;
  padding: 0.42rem 0.55rem;
  border-radius: 10px;
  text-decoration: none;
  color: var(--ink-900);
  transition: background 0.25s ease, transform 0.25s ease;
}
.mm-link:hover { background: var(--ink-100); }
.mm-link-ic {
  width: 28px; height: 28px;
  border-radius: 8px;
  background: var(--ink-100);
  display: grid; place-items: center;
  color: var(--ink-900);
  flex-shrink: 0;
  transition: background-color 0.3s ease, color 0.3s ease;
}
.mm-link:hover .mm-link-ic { background: var(--ink-900); color: white; }
.mm-link-t { font-size: 0.92rem; font-weight: 600; line-height: 1.2; }
.mm-link-d { font-size: 0.78rem; color: var(--ink-500); margin-top: 2px; }
.mm-link-sm {
  align-items: center; gap: 0.85rem;
  font-size: 0.92rem; font-weight: 500;
}
.mm-num {
  font-family: "Manrope", sans-serif; font-weight: 700;
  font-size: 0.78rem;
  color: transparent;
  background: var(--brand-gradient);
  -webkit-background-clip: text;
  background-clip: text;
  width: 22px;
}

/* Featured product card */
.mm-feat {
  display: block;
  position: relative;
  border-radius: 18px;
  padding: 1.25rem;
  height: 100%;
  text-decoration: none;
  color: white;
  overflow: hidden;
  transition: transform 0.4s var(--ease-out-expo);
}
.mm-feat:hover { transform: translateY(-2px); }
.mm-feat-bg {
  position: absolute; inset: 0;
  background: var(--brand-gradient);
}
.mm-feat-bg::after {
  content: ""; position: absolute; inset: 0;
  background:
    radial-gradient(circle at 80% 0%, rgba(255,255,255,0.3), transparent 50%),
    radial-gradient(circle at 0% 100%, rgba(0,0,0,0.15), transparent 50%);
}
.mm-feat-content { position: relative; z-index: 1; height: 100%; display: flex; flex-direction: column; }
.mm-feat-icon {
  width: 38px; height: 38px;
  border-radius: 10px;
  background: rgba(255,255,255,0.2);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  display: grid; place-items: center;
  margin-bottom: 1rem;
}
.mm-feat-title { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.25rem; margin-bottom: 0.4rem; line-height: 1.15; }
.mm-feat-desc { font-size: 0.82rem; line-height: 1.5; opacity: 0.85; flex: 1; margin-bottom: 0.75rem; }
.mm-feat-cta { font-size: 0.82rem; font-weight: 600; display: inline-flex; align-items: center; gap: 0.4rem; }
.mm-feat-cta .arrow { transition: transform 0.3s ease; }
.mm-feat:hover .mm-feat-cta .arrow { transform: translateX(4px); }

/* CTA col / promo */
.mm-col-cta { display: flex; flex-direction: column; }
.mm-promo {
  position: relative; overflow: hidden;
  border-radius: 18px;
  padding: 1.25rem;
  background: var(--ink-900);
  color: white;
  flex: 1;
  display: flex; flex-direction: column; justify-content: flex-end;
}
.mm-promo > .mm-promo-bg {
  position: absolute; bottom: -80px; right: -80px;
  width: 220px; height: 220px;
  border-radius: 50%;
  background: var(--brand-gradient);
  filter: blur(40px);
  opacity: 0.55;
}
.mm-promo.light {
  background: var(--ink-100); color: var(--ink-900);
  border: 1px solid var(--ink-200);
}
/* Promo con foto de fondo. La imagen va en el fondo del propio contenedor y encima un velo
   oscuro, porque el texto es pequeno y sobre una foto a pelo no se lee.
   El velo es oscuro de arriba abajo y no solo en la parte baja: la caja mide poco mas de
   200px y el texto la ocupa casi entera, asi que un degradado que solo cargue al final deja
   el antetitulo y media linea del titulo sobre la foto limpia. Con estos valores el texto
   blanco pasa de 7:1 sobre cualquier foto, incluida una cocina a plena luz. */
.mm-promo.has-image {
  background-color: var(--ink-900);
  background-image: var(--promo-foto);
  background-size: cover;
  background-position: center;
  color: white;
}
.mm-promo > .mm-promo-velo {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(8,8,10,0.35) 0%, rgba(8,8,10,0.5) 45%, rgba(8,8,10,0.75) 100%);
}

/* El contenido va por encima de los fondos. Los dos fondos se excluyen a mano: son hijos
   directos tambien, y sin esto este comodin —que va despues y empata en especificidad— les
   quitaba el «position: absolute» y los dejaba sin tamano. */
.mm-promo > *:not(.mm-promo-bg):not(.mm-promo-velo) { position: relative; }

@media (max-width: 1100px) {
  .megamenu { display: none; }
  .mm-trigger .mm-caret { display: none; }
}

/* pill — etiqueta de estado (dispositivos, «en activo»…).
   Era blanca con borde gris, el mismo traje que tenían .tag y los botones. Ahora va sin
   borde, con un fondo tenue de marca y el texto en el azul corporativo, para que se lea
   como una marca de estado y no como un botón. La .hero-pill mantiene su propia variante
   con borde menta porque ahí sí es el elemento protagonista. */
.pill {
  display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.4rem 0.85rem;
  border-radius: var(--r-pill);
  background: rgba(58,165,190,0.10);
  border: 1px solid transparent;
  font-size: 0.78rem; font-weight: 600;
  letter-spacing: 0.01em;
  color: var(--brand-blue-texto);
}
.pill .dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--brand-gradient);
  position: relative;
}
/* El aro que late. Antes era un box-shadow animado de 4px a 8px de extension: cada
   fotograma pedia recalculo de estilo y repintado, y esto esta siempre en pantalla.
   Ahora es un pseudoelemento del tamano del aro grande que escala y se apaga —solo
   transform y opacity, o sea compositor—. Va detras del punto con z-index negativo,
   que tiene fondo opaco y lo tapa. */
.pill .dot::after,
.dot-live::after {
  content: ""; position: absolute; inset: -4px; z-index: -1;
  border-radius: 50%;
  background: var(--dot-aro, rgba(58,165,190,0.15));
  animation: pulse-aro 2.4s ease-in-out infinite;
  pointer-events: none;
}
@keyframes pulse-aro {
  0%,100% { transform: scale(1);   opacity: 1; }
  50%     { transform: scale(1.5); opacity: 0.3; }
}

/* hero-pill — la pastilla de estado del hero.
   Era la .pill genérica: blanca con borde gris, indistinguible del resto de cápsulas de
   la página. Ahora lleva un tinte de marca y el borde en menta, que es el color del punto
   que ya parpadea al lado, así que el conjunto se lee como un indicador «en vigor». */
.hero-pill {
  background: linear-gradient(90deg, rgba(86,197,181,0.14), rgba(58,165,190,0.09));
  border-color: rgba(86,197,181,0.35);
  color: var(--ink-700);
  font-weight: 600;
  padding: 0.5rem 1rem 0.5rem 0.85rem;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}

/* live dot — verde, parpadeo (pill del hero + badges "en activo") */
.dot-live {
  width: 8px; height: 8px; border-radius: 50%;
  display: inline-block; flex: none;
  position: relative;
  background: var(--brand-mint);
  --dot-aro: rgba(86,197,181,0.18);
  animation: dot-live 2.4s ease-in-out infinite;
}
/* Mismo aro, en menta: solo cambia el color del pseudoelemento. El punto ademas se apaga un
   poco, y animar la opacidad del propio elemento tampoco cuesta layout. */
.pill .dot.dot-live { background: var(--brand-mint); }
@keyframes dot-live {
  0%,100% { opacity: 1; }
  50%     { opacity: .55; }
}
/* Sin movimiento el aro se queda en reposo, que es exactamente el aro de 4px de siempre. */
@media (prefers-reduced-motion: reduce) {
  .dot-live { animation: none; }
  .pill .dot::after,
  .dot-live::after { animation: none; }
}

/* Las cifras que cuentan llevan digitos de ancho fijo: si no, cada numero nuevo mide
   distinto y recoloca lo que tenga al lado mientras sube. El ancho de la caja lo reserva
   ademas animations.js midiendo el valor final. */
[data-count] { font-variant-numeric: tabular-nums; }

/* hero — barra de prueba social */
.hero-meta {
  display: inline-flex; flex-wrap: wrap; align-items: center;
  gap: 0.9rem 1.15rem;
  max-width: 100%;
  background: transparent;
}
.hm-item { display: flex; align-items: center; gap: 0.6rem; }
.hm-sep {
  width: 1px; height: 30px; flex: none;
  background: linear-gradient(to bottom, transparent, var(--ink-200) 25%, var(--ink-200) 75%, transparent);
}
.hm-val {
  display: block;
  font-family: "Manrope", sans-serif;
  font-size: 0.95rem; font-weight: 700;
  letter-spacing: -0.02em; line-height: 1.15;
  color: var(--ink-900);
}
.hm-label {
  display: block;
  font-size: 0.75rem; line-height: 1.25;
  color: var(--ink-500);
}
.hm-avatars { display: flex; }
.color1{
  background:var(--brand-violet)
}
.color2{
  background:var(--brand-blue)
}
.color3{
  background:var(--brand-mint)
}
.hm-avatars > span {
  width: 28px; height: 28px; border-radius: 50%;
  border: 2px solid white;
  margin-left: -8px;
  transition: transform 0.35s var(--ease-out-expo);
}
.hm-avatars > span:first-child { margin-left: 0; }
.hero-meta:hover .hm-avatars > span { transform: translateY(-2px); }
.hm-avatars > span:nth-child(2) { transition-delay: 0.04s; }
.hm-avatars > span:nth-child(3) { transition-delay: 0.08s; }
.hm-avatars > span:nth-child(4) { transition-delay: 0.12s; }
.hm-more {
  display: grid; place-items: center;
  background: var(--ink-100);
  font-size: 10px; font-weight: 700; color: var(--ink-900);
}
.hm-stars { display: inline-flex; gap: 2px; vertical-align: middle; margin-left: 0.35rem; }
.hm-link { text-decoration: none; transition: opacity 0.3s ease; }
/* Sin subrayado en reposo: el bloque entero es pulsable y se lee como tal, no como
   un enlace dentro de un texto. Se mantiene al pasar por encima para que siga habiendo
   señal de que lleva a algún sitio. */
.hm-link .hm-label { text-underline-offset: 3px; text-decoration-color: var(--ink-300); }
.hm-link:hover .hm-label { text-decoration: underline; }
.hm-link:hover { opacity: 0.75; }
.hm-link:hover .hm-label { text-decoration-color: var(--brand-blue); color: var(--brand-blue); }
@media (max-width: 767px) {
  .hero-meta { display: flex; flex-direction: column; align-items: flex-start; gap: 0.75rem; width: 100%; }
  .hm-sep { display: none; }
}

/* tag — antetítulo de sección.
   Era una cápsula con borde, igual de pesada que los botones y las pastillas, y competía
   con el titular que introduce. Ahora es una línea de marca y el texto en color
   corporativo: pesa menos y se distingue de .pill de un vistazo.
   Se centra bien porque la línea va dentro del propio inline-flex. */
.tag {
  display: inline-flex; align-items: center; gap: 0.65rem;
  font-size: 0.72rem; font-weight: 700;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--brand-blue-texto);
  /* La separacion con el titular la define la propia etiqueta, en un solo sitio. Antes
     salia de sumar el mb-4/5/6 de la etiqueta y el mt-4/5 del titular: entre 2 y 2,75rem,
     que la dejaba flotando lejos del titulo al que introduce. */
  margin-bottom: 0.6rem;
}
.tag::before {
  content: "";
  width: 1.75rem; height: 2px; flex: none;
  border-radius: 2px;
  background: var(--brand-gradient);
}
/* Sobre fondo oscuro la utilidad !text-white pisa el color; la línea se aclara aquí. */
.tag.\!text-white::before { background: rgba(255,255,255,0.5); }

/* Sin línea cuando el encabezado va centrado: ahí la raya descoloca el eje óptico y el
   antetítulo se lee mejor solo. Se engancha a .text-center, que es la clase que emite
   blocks/_encabezado y la que usan las secciones centradas escritas a mano, así que no
   hay que marcar uno por uno los 26 usos de .tag. */
.text-center .tag::before { display: none; }

/* cards */
.card {
  background: white; border: 1px solid var(--ink-200);
  border-radius: 22px; padding: 1.75rem;
  transition: transform 0.5s var(--ease-out-expo), box-shadow 0.5s var(--ease-out-expo), border-color 0.5s var(--ease-out-expo);
  position: relative; overflow: hidden;
}
.card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-lg);
  border-color: rgba(58,165,190,0.4);
}
/* Cabecera y cuerpo de una tarjeta partida en dos. Nacio en las calculadoras y se sube aqui
   porque tambien la usan bloques del sitio: asi hay una sola definicion.
   La tarjeta va sobre blanco y sin franja de color, con un filete que separa la cabecera del
   cuerpo y la misma barrita de degradado que lleva el antetitulo .tag.
   Requiere que el .card no traiga su padding: en Razor, .card.!p-0. */
.card .head {
  position: relative;
  background: linear-gradient(180deg, var(--ink-50), #fff);
  color: var(--ink-900);
  border-bottom: 1px solid var(--ink-200);
  padding: 1.1rem 1.4rem 0.95rem;
  font-family: "Manrope", sans-serif;
  font-weight: 700;
  font-size: 1.02rem;
  letter-spacing: -0.015em;
  display: flex;
  align-items: center;
  gap: 0.75rem;
}
.card .head::after {
  content: "";
  position: absolute;
  left: 1.4rem;
  bottom: -1px;
  width: 2.25rem;
  height: 2px;
  border-radius: 2px;
  background: var(--brand-gradient);
}
.card .body { padding: 1.4rem; }

/* El fondo y el cuadro del icono los puede cambiar «Apariencia» de la rejilla, que escribe
   --tj-bg y --tj-icon en el contenedor. Sin nada escrito queda lo de siempre: tarjeta
   blanca e icono sobre el degradado de marca. */
.feature-card { background: var(--tj-bg, white); border: 1px solid var(--tj-border, var(--ink-200)); border-radius: 22px; padding: 1.75rem; transition: transform 0.5s var(--ease-out-expo), box-shadow 0.5s var(--ease-out-expo), border-color 0.5s var(--ease-out-expo), background-color 0.5s var(--ease-out-expo); position: relative; overflow: hidden; }

/* El cuadro del icono. Sustituye a .grad-bg en el interior de la tarjeta para que el color
   sea configurable; en el resto del sitio .grad-bg sigue como estaba. */
.tj-icon { background: var(--tj-icon, var(--brand-gradient)); }

/* «Corporativo»: la tarjeta se viste con la familia .tc-*, la de la fila de beneficios de la
   portada. El tono lo pone la plantilla como clase, y esa clase solo declara variables; que
   hace cada una se decide aqui.
   El filete va del color del fondo, como en los tintes planos: el gris de --ink-200 alrededor
   de un color se lee como un recuadro suelto.
   El cuadro del icono usa --tc-ink, el tono oscuro de la misma familia: con el glifo en
   blanco pasa de sobra el contraste, y --tc-pill se queda demasiado claro para eso. */
/* «Auto»: una sola linea con tantas columnas como tarjetas, todas del mismo ancho —cinco
   tarjetas, un 20 % cada una—. El numero lo pone la plantilla en --tj-cols, porque depende
   del contenido y no puede salir de una utilidad de Tailwind, que se generan de antemano.
   minmax(0, 1fr) y no 1fr a secas: el minimo por defecto de una columna es su contenido, y
   con un titular largo esa columna se comia a las demas y ya no median igual.
   Solo se estiran a una linea a partir de 1024 px. Por debajo no caben: con seis tarjetas
   tocarian a 50 px de ancho. */
.tj-auto { display: grid; gap: 1.25rem; grid-template-columns: minmax(0, 1fr); align-items: stretch; }
@media (min-width: 640px) { .tj-auto { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .tj-auto { grid-template-columns: repeat(var(--tj-cols, 3), minmax(0, 1fr)); } }

/* Tarjeta con foto: columna, con la foto arriba y el texto abajo del todo. La rejilla ya
   iguala las alturas de una fila, asi que el reparto es lo unico que faltaba para que los
   textos de tarjetas vecinas arranquen a la misma altura. */
.feature-card.tj-with-image {
  display: flex; flex-direction: column; justify-content: space-between;
  /* Gana a items-start, que trae la variante «Icono al lado del titulo» en el atributo class:
     en columna ese valor encoge cada hijo a su contenido y el parrafo se desbordaba. */
  align-items: stretch;
}

.feature-card.tj-corp-bg { background: var(--tc-box); border-color: var(--tc-box); }
.feature-card.tj-corp-icon .tj-icon { background: var(--tc-ink); }

/* Variante «Centrado»: el texto al centro y el cuadro del icono con él. El icono es el
   primer hijo y tiene ancho fijo, así que basta con los márgenes automáticos. */
.tj-centered { text-align: center; }
.tj-centered > span:first-child { margin-inline: auto; }
.feature-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); border-color: rgba(58,165,190,0.4); }
.feature-card:hover .icon-wrap { transform: rotate(-6deg) scale(1.08); }
.feature-card .icon-wrap {
  width: 52px; height: 52px;
  border-radius: 14px;
  background: var(--ink-100);
  display: flex; align-items: center; justify-content: center;
  transition: transform 0.5s var(--ease-out-back);
  margin-bottom: 1.25rem; color: var(--ink-900);
}
.feature-card.dark { background: var(--ink-900); color: white; border-color: var(--ink-800); }
.feature-card.dark .icon-wrap { background: rgba(255,255,255,0.08); color: white; }
.feature-card.brand { background: var(--brand-gradient); color: white; border-color: transparent; }
.feature-card.brand .icon-wrap { background: rgba(255,255,255,0.18); color: white; }

/* marquee */
.marquee {
  display: flex; overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
  mask-image: linear-gradient(90deg, transparent, black 8%, black 92%, transparent);
}
.marquee-track {
  display: flex; flex-shrink: 0; gap: 4rem;
  animation: marquee 38s linear infinite;
  padding-right: 4rem;
  align-items: center;
}
/* Cada logo ocupa la misma casilla. Los originales van desde algo casi cuadrado (EPTA) hasta
   una banda muy alargada (KRONOS HOMES), y como el marcado solo fijaba la altura, la anchura
   la decidía la proporción de cada archivo: unos salían diminutos y otros se desbordaban.
   Aquí se fija la caja y la imagen se ajusta dentro con object-fit, que respeta la
   proporción y nunca recorta. */
.marquee-logo {
  --logo-ancho: 9rem;
  --logo-alto: 3.75rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  min-width: var(--logo-ancho);  max-width: var(--logo-ancho);
  min-height: var(--logo-alto);  max-height: var(--logo-alto);
  /* Ademas del min y el max hace falta la altura explicita: un max-height no cuenta como
     altura definida, y sin ella el max-height:100% del hijo no resuelve y la imagen se sale.
     Es justo lo que pasaba: EPTA se pintaba a 167 px dentro de una caja de 40. */
  height: var(--logo-alto);
}
.marquee-logo img {
  width: auto; height: auto;
  max-width: 100%;
  /* En unidades absolutas por lo mismo: el porcentaje depende de que el padre tenga altura
     definida y aqui no se quiere depender de eso. */
  max-height: var(--logo-alto);
  object-fit: contain;
}
/* Empresa sin logotipo: se pinta el nombre y ahí la casilla fija no sirve, porque un nombre
   largo no cabe en 9rem. Conserva la altura para que la fila no baile. */
.marquee-logo-text {
  min-width: 0; max-width: none;
  white-space: nowrap;
}
@keyframes marquee {
  to { transform: translateX(-100%); }
}
/* WCAG 2.2.2: un bucle de 38s sin forma de pararlo molesta a quien tiene problemas
   vestibulares o de atención. site.js ya la pausa al pasar el ratón o el foco, pero eso no
   ayuda a quien ha pedido menos movimiento al sistema y ni siquiera llega a tocarla. */
@media (prefers-reduced-motion: reduce) {
  .marquee-track { animation-play-state: paused; }
}

/* phone */
.phone {
  position: relative;
  width: 290px; height: 600px;
  border-radius: 48px;
  background: linear-gradient(160deg, #18181B, #0A0A0B);
  padding: 12px;
  box-shadow:
    0 50px 120px -30px rgba(58,165,190,0.45),
    0 30px 60px -30px rgba(178,105,172,0.35),
    inset 0 0 0 1px rgba(255,255,255,0.05);
}
.phone .screen { width: 100%; height: 100%; border-radius: 38px; overflow: hidden; background: var(--ink-50); position: relative; }
.phone .notch { position: absolute; top: 18px; left: 50%; transform: translateX(-50%); width: 96px; height: 26px; background: #0A0A0B; border-radius: var(--r-pill); z-index: 2; }

/* app mockup */
.app-mockup { height: 100%; background: #EFEFEF; display: flex; flex-direction: column; position: relative; overflow: hidden; }
.app-status { padding: 14px 22px 6px; display: flex; justify-content: space-between; align-items: center; font-size: 0.78rem; font-weight: 600; color: #0A0A0B; }

/* Branded gradient header (replicates real Trackpeople app) */
.app-grad-head {
  position: relative;
  padding: 18px 20px 28px;
  color: white;
  overflow: hidden;
  margin-bottom: -10px;
}
.app-grad-head .grad-head-bg {
  position: absolute; inset: 0;
  background: var(--brand-gradient);
  z-index: 0;
}
.app-grad-head .grad-head-deco {
  position: absolute; right: -18px; top: -18px;
  width: 74px; height: 74px;
  border-radius: 14px;
  background: repeating-linear-gradient(45deg, rgba(255,255,255,0.18) 0 2px, transparent 2px 6px);
  transform: rotate(12deg);
  z-index: 1;
}
.app-grad-head .grad-head-content { position: relative; z-index: 2; }
.app-grad-head .grad-head-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; }
.app-grad-head .grad-head-burger { display: flex; flex-direction: column; gap: 3px; padding: 4px; }
.app-grad-head .grad-head-burger span { width: 18px; height: 2px; background: white; border-radius: 2px; }
.app-grad-head .grad-head-mark { width: 36px; height: 36px; }
.app-grad-head .grad-head-name { text-align: center; font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.05rem; letter-spacing: -0.01em; }
.app-grad-head .grad-head-org { text-align: center; font-size: 0.66rem; letter-spacing: 0.16em; opacity: 0.85; margin-top: 2px; font-weight: 500; }

/* Jornada prevista card */
.jp-card { margin: 14px 14px 12px; background: white; border-radius: 16px; padding: 14px 14px; box-shadow: 0 4px 14px -6px rgba(10,10,11,0.08); }
.jp-title { text-align: center; color: #2DA4B8; font-weight: 700; font-size: 0.9rem; padding-bottom: 10px; border-bottom: 1px solid #EAEAEC; }
.jp-row { display: flex; justify-content: center; gap: 6px; padding-top: 12px; flex-wrap: nowrap; }
.jp-chip { display: inline-flex; align-items: center; gap: 5px; padding: 6px 10px; border-radius: 999px; font-size: 0.7rem; font-weight: 600; white-space: nowrap; }
.jp-chip-mint { background: rgba(86,197,181,0.18); color: #2A9A8C; }
.jp-chip-pink { background: rgba(178,105,172,0.18); color: #9C4F95; }

/* Timeline card */
.tl-card { margin: 0 12px; background: white; border-radius: 16px; padding: 18px 12px 14px; box-shadow: 0 4px 14px -6px rgba(10,10,11,0.08); position: relative; }
.tl-btn { display: flex; align-items: center; justify-content: center; gap: 8px; margin: 0 auto 14px; background: #B269AC; color: white; border-radius: 999px; padding: 9px 28px; font-weight: 700; font-size: 0.92rem; box-shadow: 0 6px 16px -4px rgba(178,105,172,0.45); cursor: pointer; transition: transform 0.3s, box-shadow 0.3s; }
.tl-btn:hover { transform: translateY(-1px); box-shadow: 0 10px 22px -4px rgba(178,105,172,0.55); }

.tl { position: relative; padding: 4px 4px 8px 12px; }
.tl-line { position: absolute; left: 62px; top: 14px; bottom: 14px; width: 2px; background: linear-gradient(to bottom, #56C5B5 0%, #E9C765 50%, #56C5B5 100%); border-radius: 2px; }
.tl-item { display: grid; grid-template-columns: 36px 14px 32px 1fr 16px; align-items: center; gap: 5px; padding: 7px 0; font-size: 0.76rem; }
.tl-pill { display: inline-flex; align-items: center; justify-content: center; min-height: 22px; padding: 2px 5px; background: #DCEEF0; color: #2A8CA0; border-radius: 6px; font-size: 0.66rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.tl-pill-empty { background: transparent; }
.tl-dot { width: 12px; height: 12px; border-radius: 50%; border: 3px solid white; box-shadow: 0 0 0 1px rgba(10,10,11,0.08); justify-self: center; }
.tl-dot-mint { background: #56C5B5; }
.tl-dot-yellow { background: #E9C765; }
.tl-time { font-weight: 600; color: #0A0A0B; font-variant-numeric: tabular-nums; }
.tl-label { color: #555; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tl-edit { color: #999; justify-self: end; }

.tl-total { margin-top: 8px; background: linear-gradient(135deg, #2DA4B8 0%, #3AA5BE 100%); color: white; border-radius: 14px; padding: 13px 16px; display: flex; align-items: baseline; gap: 7px; flex-wrap: nowrap; }
.tl-total-num { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.45rem; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; flex-shrink: 0; }
.tl-total-lbl { font-size: 0.72rem; opacity: 0.92; font-weight: 500; white-space: nowrap; }

/* Hero stage perspective for 3D tilt */
.hero-stage { perspective: 1400px; transform-style: preserve-3d; }
.phone { z-index: 1; }
.phone {
  transform-style: preserve-3d;
  will-change: transform;
  transition: box-shadow 0.5s var(--ease-out-expo);
}
.phone .screen { transform: translateZ(1px); }

/* Floating bubbles around phone */
.float-bub {
  position: absolute;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 16px;
  padding: 12px 14px;
  z-index: 30;
  transform: translateZ(60px);
  opacity: 0;
  will-change: transform;
  pointer-events: none;
}
.app-mockup-img {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background: #2EAFC2;
}
.app-screen-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: top center;
  opacity: 0;
  transition: opacity 0.6s ease;
  pointer-events: none;
}
.app-screen-img.active {
  opacity: 1;
}
.fb-1 { top: 60px;  left: -40px; display: flex; align-items: center; gap: 12px; }
.fb-2 { bottom: 80px; right: -30px; padding: 14px 16px; }
.fb-3 { top: 200px; right: -50px; padding: 10px 14px; }
.fb-4 { bottom: 30px; left: -10px; padding: 10px 16px; }

/* Live ping on last timeline dot */
.tl-item:last-child .tl-dot::after {
  content: "";
  position: absolute; inset: -3px;
  border-radius: 50%;
  border: 2px solid var(--brand-mint);
  animation: tlPing 1.8s ease-out infinite;
}
.tl-item .tl-dot { position: relative; }
@keyframes tlPing {
  0%   { transform: scale(0.7); opacity: 0.9; }
  100% { transform: scale(2.4); opacity: 0; }
}

/* Toast bubble (notification that pops in/out during cycle) */
.phone-toast {
  position: absolute;
  top: 90px; left: 50%;
  transform: translate(-50%, -120%);
  background: rgba(10, 10, 11, 0.94);
  color: white;
  padding: 10px 14px;
  border-radius: 14px;
  display: flex; align-items: center; gap: 10px;
  font-size: 0.78rem; font-weight: 600;
  white-space: nowrap;
  box-shadow: 0 20px 40px -16px rgba(10,10,11,0.4);
  z-index: 10;
  opacity: 0;
  pointer-events: none;
}
.phone-toast .pt-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--brand-mint);
  box-shadow: 0 0 0 0 rgba(86,197,181, 0.7);
  animation: live 1.4s ease-out infinite;
}

/* Phone overlays: side menu + bottom sheet (animated states) */
.ph-overlay { position: absolute; inset: 0; pointer-events: none; }
.ph-scrim { position: absolute; inset: 0; background: rgba(10,10,11,0.28); opacity: 0; }
.ph-side {
  position: absolute; top: 0; bottom: 0; left: 0; width: 76%;
  background: linear-gradient(170deg, #3AA5BE 0%, #56C5B5 55%, #b269ac 130%);
  color: white;
  border-top-right-radius: 22px; border-bottom-right-radius: 22px;
  padding: 46px 16px 14px;
  box-shadow: 0 0 40px rgba(10,10,11,0.25);
  display: flex; flex-direction: column;
}
.ph-side-user { display: flex; align-items: center; gap: 10px; padding: 0 4px 14px; border-bottom: 1px solid rgba(255,255,255,0.18); }
.ph-side-ava { width: 38px; height: 38px; border-radius: 50%; background: linear-gradient(135deg,#f4d3b0,#c79071); flex-shrink: 0; border: 2px solid white; }
.ph-side-name { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 0.82rem; line-height: 1.1; }
.ph-side-list { list-style: none; padding: 10px 0 0; margin: 0; display: flex; flex-direction: column; gap: 1px; flex: 1; }
.ph-side-list li { display: flex; align-items: center; gap: 10px; padding: 9px 6px; font-size: 0.78rem; font-weight: 500; border-bottom: 1px solid rgba(255,255,255,0.10); }
.ph-side-list svg { opacity: 0.95; }
.ph-side-foot { display: flex; align-items: center; justify-content: center; gap: 6px; margin-top: 8px; padding: 10px; background: rgba(255,255,255,0.10); border-radius: 10px; font-size: 0.78rem; font-weight: 600; }
.ph-sheet {
  position: absolute; left: 0; right: 0; bottom: 0;
  background: white; border-top-left-radius: 18px; border-top-right-radius: 18px;
  padding: 14px 0 24px;
  box-shadow: 0 -10px 30px rgba(10,10,11,0.18);
}
.ph-sheet-grab { width: 38px; height: 4px; border-radius: 4px; background: #E4E4E7; margin: 0 auto 8px; }
.ph-sheet-title { text-align: center; font-size: 0.72rem; color: #71717A; padding: 6px 0; border-bottom: 1px solid #F4F4F5; }
.ph-sheet-opt { text-align: center; padding: 14px 16px; font-size: 0.92rem; font-weight: 600; color: #3AA5BE; border-bottom: 1px solid #F4F4F5; }
.ph-sheet-opt:last-child { border-bottom: none; color: #B269AC; }
.ph-sheet-opt .ph-opt-ic { display: inline-block; margin-right: 6px; vertical-align: -2px; }

@media (max-width: 768px) { .float-bub { display: none; } }
@media (max-width: 1100px) { .fb-3, .fb-4 { display: none; } }

/* tier */
.tier {
  background: white; border: 1px solid var(--ink-200);
  border-radius: 32px; padding: 2rem;
  display: flex; flex-direction: column;
  transition: transform 0.5s var(--ease-out-expo), background-color 0.5s var(--ease-out-expo), border-color 0.5s var(--ease-out-expo), color 0.5s var(--ease-out-expo);
  position: relative;
}
.tier:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); }
/* El degradado de marca tal cual, con el contenido en blanco.
   AVISO, por si alguien viene a tocar esto: el blanco sobre este degradado da 2,09:1 en el
   extremo mint y 3,81:1 en el violeta, por debajo del 4,5:1 que pide WCAG 1.4.3 para texto
   normal. Esta asi a peticion expresa, sabiendo el coste. Solo hay tres salidas y las tres
   pasan por cambiar una de las dos cosas: bajarle luz al degradado (al 62 % el blanco ya pasa),
   poner el texto oscuro (5,19:1 a 9,47:1) o meter un velo entre fondo y texto.
   Por eso los blancos van todos puros, sin opacidades: aqui no sobra ni un punto de contraste
   y la jerarquia la marcan el tamaño y el peso, que no cuestan nada. */
.tier.featured {
  background: var(--brand-gradient); color: white;
  border-color: transparent; transform: scale(1.04); z-index: 2;
}
.tier.featured:hover { transform: scale(1.04) translateY(-6px); }
.tier .badge-pop {
  position: absolute; top: -14px; left: 50%; transform: translateX(-50%);
  background: var(--brand-gradient); color: white;
  font-size: 0.7rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.1em;
  padding: 0.4rem 0.9rem; border-radius: var(--r-pill);
}
.tier .tier-name { font-size: 0.85rem; font-weight: 600; color: var(--ink-500); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: 1.1rem; }
.tier.featured .tier-name { color: white; }
.tier .tier-price { display: flex; align-items: baseline; gap: 0.6rem; font-family: "Manrope", sans-serif; font-size: 3.4rem; font-weight: 700; letter-spacing: -0.04em; line-height: 1; }
/* Dos cosas apretaban «/usuario · mes» contra la cifra:
   · el hueco de 0,4rem, que a 3,4rem de cifra se queda en nada -> 0,6rem;
   · el letter-spacing de -0,04em del contenedor, que se hereda. A 3,4rem cierra la cifra, que
     es lo que se busca, pero sobre una etiqueta de 0,9rem junta las letras hasta que el punto
     medio toca las palabras. Aqui se devuelve a normal. */
.tier .tier-price-suf { font-size: 0.9rem; font-weight: 500; color: var(--ink-500); letter-spacing: normal; white-space: nowrap; }
.tier.featured .tier-price-suf { color: white; }

/* La cifra iba en .grad-text, que pinta el degradado sobre el propio texto: encima de un fondo
   de degradado no se distingue nada. En la destacada se pinta plana y oscura. */
.tier.featured .tier-price .grad-text {
  background: none; -webkit-background-clip: initial; background-clip: initial;
  -webkit-text-fill-color: currentColor; color: white;
}

/* El distintivo llevaba el degradado, que sobre la tarjeta de degradado desaparecia. */
.tier.featured .badge-pop { background: var(--ink-900); color: white; }
.tier .tier-feat { list-style: none; padding: 0; margin: 1.75rem 0; display: flex; flex-direction: column; gap: 0.7rem; flex: 1; }
.tier .tier-feat li {
  position: relative; padding-left: 1.7rem;
  font-size: 0.92rem; color: var(--ink-700); line-height: 1.45;
}
.tier.featured .tier-feat li { color: white; }

/* El parrafo de apoyo, debajo del precio. Lleva su color aqui y no una clase de utilidad en el
   marcado, para que no haya dos sitios donde mirar cuando cambie el fondo. */
.tier.featured > p { color: white; }
/* La marca: disco del azul de marca con el glifo en blanco sobre las tarjetas blancas, y al
   reves —disco blanco, glifo azul— sobre la destacada. El trazo sube de 2 a 2,4: el azul de
   marca y el blanco se quedan en 2,87:1 entre si, y con el trazo fino el glifo se deshacia. */
.tier .tier-feat li::before {
  content: ""; position: absolute; left: 0; top: 0.2rem;
  width: 18px; height: 18px; border-radius: 50%;
  background: var(--brand-blue);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2.5 6.5L5 9l4.5-5' stroke='white' stroke-width='2.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>");
  background-position: center; background-repeat: no-repeat;
  background-size: 12px;
}
.tier.featured .tier-feat li::before {
  background-color: white;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><path d='M2.5 6.5L5 9l4.5-5' stroke='%233AA5BE' stroke-width='2.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/></svg>");
}

/* faq */
.faq-item { border-bottom: 1px solid var(--ink-200); padding: 1.5rem 0; cursor: pointer; }
.faq-item .faq-q { display: flex; justify-content: space-between; align-items: center; font-family: "Manrope", sans-serif; font-size: 1.15rem; font-weight: 600; color: var(--ink-900); gap: 1rem; }
.faq-item .faq-q .toggle { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--ink-300); display: flex; align-items: center; justify-content: center; transition: background-color 0.4s var(--ease-out-expo), border-color 0.4s var(--ease-out-expo), transform 0.4s var(--ease-out-expo); flex-shrink: 0; }
.faq-item .faq-a { max-height: 0; overflow: hidden; transition: max-height 0.5s var(--ease-out-expo), margin-top 0.5s ease; color: var(--ink-500); font-size: 0.96rem; line-height: 1.65; }
.faq-item.open .faq-a { max-height: 320px; margin-top: 1rem; }
.faq-item.open .toggle { background: var(--ink-900); color: white; border-color: var(--ink-900); transform: rotate(45deg); }

/* stat */
.stat-num { font-family: "Manrope", sans-serif; font-size: clamp(2.4rem, 5vw, 3.8rem); font-weight: 700; letter-spacing: -0.04em; line-height: 1; }
.stat-num.grad-text [data-count] {
  background: var(--brand-gradient);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}

/* dashboard */
.dash { background: white; border-radius: 32px; border: 1px solid var(--ink-200); box-shadow: var(--shadow-lg); overflow: hidden; width: 100%; }
/* dash-bar — cabecera de la maqueta del panel.
   Eran los tres puntos grises de una ventana de macOS, que no dicen nada de la marca ni
   del producto. Se mantiene la metáfora de ventana pero con los tres colores de marca, y
   la ruta pasa de texto suelto a barra de direcciones, que es lo que se reconoce como
   navegador. Solo CSS: el marcado es el mismo en la home y en seccionDashboardVisual. */
.dash-bar {
  display: flex; align-items: center; gap: 6px;
  padding: 0.7rem 0.9rem;
  border-bottom: 1px solid var(--ink-200);
  background: white;
}
.dash-bar .light { width: 8px; height: 8px; border-radius: 50%; }
.dash-bar .light:nth-child(1) { background: var(--brand-violet); }
.dash-bar .light:nth-child(2) { background: var(--brand-blue); }
.dash-bar .light:nth-child(3) { background: var(--brand-mint); }
/* 0,1,1 gana al ml-4 de Tailwind (0,1,0) sin necesidad de !important */
.dash-bar > div {
  flex: 1; min-width: 0;
  margin-left: 0.4rem;
  padding: 0.3rem 0.8rem;
  background: var(--ink-50);
  border: 1px solid var(--ink-200);
  border-radius: var(--r-pill);
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}
.dash-body { display: grid; grid-template-columns: 220px 1fr; min-height: 460px; }
.dash-side { background: var(--ink-50); padding: 1.25rem; border-right: 1px solid var(--ink-200); }
.side-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: 8px; font-size: 0.85rem; color: var(--ink-700); margin-bottom: 2px; }
.side-item.active { background: var(--ink-900); color: white; }
.dash-main { padding: 1.5rem; }
.kpi-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-bottom: 18px; }
.kpi { border: 1px solid var(--ink-200); border-radius: 14px; padding: 14px; background: white; }
.kpi .k-label { font-size: 0.7rem; color: var(--ink-500); text-transform: uppercase; letter-spacing: 0.12em; }
.kpi .k-num { font-family: "Manrope", sans-serif; font-size: 1.8rem; font-weight: 700; letter-spacing: -0.03em; line-height: 1.1; margin-top: 4px; }
.kpi .k-trend { font-size: 0.75rem; color: #2da27a; font-weight: 600; }
.chart { border: 1px solid var(--ink-200); border-radius: 14px; padding: 18px; }
.chart-title { font-size: 0.92rem; font-weight: 600; margin-bottom: 14px; }

/* ============================================================
   MULTIDISPOSITIVO — tabs + panels de altura constante
   ============================================================ */
.dev-tabs {
  display: flex; align-items: center; justify-content: center;
  flex-wrap: wrap; gap: 0.25rem;
  width: fit-content; margin-inline: auto;
  padding: 0.35rem;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: var(--r-pill);
  box-shadow: var(--shadow-sm);
  max-width: 100%;
}
.dev-tab {
  display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.65rem 1.15rem;
  border: 0; background: transparent;
  border-radius: var(--r-pill);
  font: inherit; font-size: 0.875rem; font-weight: 600;
  /* --ink-400 sobre blanco da 2,56:1, y estas son las pestañas que eligen que se ve en la
     portada: no son decoracion. --ink-500 da 4,83:1. */
  color: var(--ink-500);
  white-space: nowrap; cursor: pointer;
  transition: color 0.3s var(--ease-out-expo), background-color 0.3s var(--ease-out-expo);
}
.dev-tab svg { transition: transform 0.35s var(--ease-out-back); }
.dev-tab:hover { color: var(--ink-700); background: var(--ink-100); }
.dev-tab.is-active {
  color: white;
  background: var(--brand-gradient);
  box-shadow: 0 8px 18px -10px rgba(58,165,190,0.75);
}
.dev-tab.is-active svg { transform: scale(1.08); }
.dev-tabs-sep { color: var(--ink-300); flex: none; }

/* En movil no caben las tres pestañas en una fila, y con flex-wrap la que sobra se caia a una
   segunda linea y rompia la forma de la pildora. Mejor deslizar: fila unica con scroll
   horizontal, igual que en .rec-filtros. */
@media (max-width: 640px) {
  .dev-tabs {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    width: 100%; justify-content: flex-start;
  }
  .dev-tabs::-webkit-scrollbar { display: none; }
  .dev-tab { flex: 0 0 auto; }
}

/* Las tres pestañas comparten celda de grid → la altura del bloque
   es siempre la del panel más alto y no salta al cambiar de tab. */
.dev-stage { display: grid; }
.dev-panel {
  grid-area: 1 / 1;
  opacity: 0; visibility: hidden;
  transform: translateY(12px);
  pointer-events: none;
  transition: opacity 0.45s var(--ease-out-expo), transform 0.55s var(--ease-out-expo), visibility 0.45s;
}
.dev-panel.is-active {
  opacity: 1; visibility: visible;
  transform: none;
  pointer-events: auto;
}
/* cada panel se estira a la altura del stage y su media queda centrada */
.dev-media {
  position: relative;
  display: flex; align-items: center; justify-content: center;
  min-height: 380px;
}
@media (max-width: 640px) { .dev-media { min-height: 320px; } }
@media (prefers-reduced-motion: reduce) {
  .dev-panel { transition-duration: 0.01ms; transform: none; }
}

/* burbujas flotantes de los paneles kiosko/web (CSS puro: no dependen de GSAP) */
.dev-bub {
  position: absolute; z-index: 30;
  display: flex; align-items: center; gap: 10px;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 16px;
  padding: 11px 14px;
  box-shadow: var(--shadow-lg);
  animation: devFloat 5s ease-in-out infinite;
}
.dev-bub.db-tl { top: 58px; left: -34px; }
.dev-bub.db-br { bottom: 34px; right: -34px; animation-delay: 1.2s; animation-duration: 6s; }
/* contenedor que ancla las burbujas al marco, no a la columna */
.dev-frame { position: relative; width: 100%; display: flex; justify-content: center; }
.dev-frame.is-kiosk { max-width: 560px; }
.dev-frame.is-browser { max-width: 620px; }
@keyframes devFloat {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-12px); }
}
@media (max-width: 1023px) { .dev-bub { display: none; } }
@media (prefers-reduced-motion: reduce) { .dev-bub { animation: none; } }

/* marco tablet — Modo Kiosko */
.kiosk {
  position: relative;
  width: 100%; max-width: 560px;
  aspect-ratio: 4 / 3;
  border-radius: 28px;
  padding: 14px;
  background: linear-gradient(160deg, #18181B, #0A0A0B);
  box-shadow:
    0 50px 110px -35px rgba(58,165,190,0.45),
    0 30px 60px -30px rgba(178,105,172,0.3),
    inset 0 0 0 1px rgba(255,255,255,0.06);
}
.kiosk-screen {
  position: relative; height: 100%;
  border-radius: 18px; overflow: hidden;
  background: linear-gradient(165deg, #0f172a, #1e293b);
  display: flex; align-items: center; justify-content: center;
}
/* vídeo de producto dentro de cualquiera de los tres marcos */
.dev-video { width: 100%; height: 100%; object-fit: cover; display: block; }
.kiosk-screen > .dev-video { position: absolute; inset: 0; }
.app-mockup-img > .dev-video { position: absolute; inset: 0; }
.kiosk-glow {
  position: absolute; top: -70px; right: -70px;
  width: 220px; height: 220px; border-radius: 50%;
  background: linear-gradient(135deg, rgba(58,165,190,0.35), rgba(178,105,172,0.35));
  filter: blur(45px); pointer-events: none;
}
.kiosk-ui {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: 1fr auto;
  align-items: center; gap: 26px;
  padding: 22px 26px; width: 100%;
}
.kiosk-brand { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.kiosk-logo {
  width: 38px; height: 38px; border-radius: 12px;
  background: var(--brand-gradient);
  display: grid; place-items: center;
  box-shadow: 0 8px 20px -6px rgba(58,165,190,0.55);
}
.kiosk-title { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 0.95rem; color: white; letter-spacing: -0.01em; }
.kiosk-sub { font-size: 0.68rem; color: rgba(255,255,255,0.5); }
.kiosk-user { display: flex; align-items: center; gap: 9px; padding: 9px 11px; border-radius: 12px; background: rgba(255,255,255,0.07); border: 1px solid rgba(255,255,255,0.08); }
.kiosk-ava { width: 30px; height: 30px; border-radius: 50%; background: linear-gradient(135deg,#f4d3b0,#c79071); flex: none; }
.kiosk-user-name { font-size: 0.76rem; font-weight: 600; color: white; line-height: 1.2; }
.kiosk-user-role { font-size: 0.62rem; color: rgba(255,255,255,0.45); }
.kiosk-pin { display: flex; gap: 8px; margin: 14px 0 4px; }
.kiosk-pin span {
  width: 10px; height: 10px; border-radius: 50%;
  background: rgba(255,255,255,0.18);
  animation: kioskPin 4s ease-in-out infinite;
}
.kiosk-pin span:nth-child(1) { animation-delay: 0s; }
.kiosk-pin span:nth-child(2) { animation-delay: 0.35s; }
.kiosk-pin span:nth-child(3) { animation-delay: 0.7s; }
.kiosk-pin span:nth-child(4) { animation-delay: 1.05s; }
@keyframes kioskPin {
  0%, 8%      { background: rgba(255,255,255,0.18); transform: scale(1); }
  14%, 60%    { background: #56c5b5; transform: scale(1.25); }
  70%, 100%   { background: rgba(255,255,255,0.18); transform: scale(1); }
}
.kiosk-keys { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.kiosk-keys span {
  width: 46px; height: 42px; border-radius: 12px;
  display: grid; place-items: center;
  background: rgba(255,255,255,0.07);
  border: 1px solid rgba(255,255,255,0.09);
  color: white; font-family: "Manrope", sans-serif; font-weight: 700; font-size: 0.95rem;
}
.kiosk-keys span.k-ok { background: var(--brand-gradient); border-color: transparent; }
@media (prefers-reduced-motion: reduce) { .kiosk-pin span { animation: none; } }

/* marco navegador — Plataforma Web */
.browser {
  position: relative;
  width: 100%; max-width: 620px;
  border-radius: 18px; overflow: hidden;
  background: white;
  border: 1px solid var(--ink-200);
  box-shadow:
    0 50px 110px -35px rgba(58,165,190,0.35),
    0 24px 50px -28px rgba(10,10,11,0.3);
}
.browser-bar { display: flex; align-items: center; gap: 7px; padding: 11px 14px; background: var(--ink-100); border-bottom: 1px solid var(--ink-200); }
.browser-bar i { width: 9px; height: 9px; border-radius: 50%; background: var(--ink-300); display: block; }
.browser-url {
  flex: 1; margin-left: 8px;
  background: white; border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  padding: 4px 12px;
  font-family: "Inter", sans-serif;
  font-size: 0.66rem; color: var(--ink-500);
  display: flex; align-items: center; gap: 6px;
}
/* alto fijo + cover: la captura se ve a mayor escala y el marco llena la columna */
.browser-media { position: relative; height: 420px; background: var(--ink-50); }
.browser-shot, .browser-media video {
  display: block; width: 100%; height: 100%;
  object-fit: cover; object-position: left top;
}
@media (max-width: 1023px) { .browser-media { height: 340px; } }
@media (max-width: 640px)  { .browser-media { height: 260px; } }

/* Estado de partida de lo que entra animado. Solo se aplica con .js-ready, que pone un
   script en linea del <body> y quita animations.js en cuanto ha pasado estos valores a
   estilos en linea; si GSAP no llega, un temporizador la quita a los 2 s y se ve todo.
   Tiene que estar en el CSS y no en el JavaScript: escondiendolo desde JavaScript se esconde
   DESPUES del primer pintado, o sea que se ve, desaparece y vuelve. */
.js-ready .reveal { opacity: 0; transform: translateY(28px); }
.js-ready .reveal-x { opacity: 0; transform: translateX(40px); }
.js-ready [data-stagger] > * { opacity: 0; transform: translateY(24px); }
/* Las palabras de los titulares NO van aqui: las crea el JavaScript partiendo el texto, asi
   que no existen en el primer pintado y esta regla llegaria tarde igual. Los titulares que se
   ven al cargar se quedan quietos; los de mas abajo los anima animations.js. */
.boxPicture video{
  max-height:600px
}

/* Vídeo en modal: ver /js/site.js, el manejador de [data-video-play]. El vídeo se abre sobre
   un fondo oscuro en vez de a pantalla completa, para poder cerrarlo sin salir de la página.
   Vale tanto para el <iframe> de una plataforma como para el <video> de un archivo propio. */
.video-modal {
  position: fixed; inset: 0; z-index: 100;
  background: rgba(10, 10, 15, 0.9);
  display: flex; align-items: center; justify-content: center;
  padding: 2rem;
}
body.video-modal-abierto { overflow: hidden; }
.video-modal-marco {
  position: relative;
  width: min(1100px, 100%);
  aspect-ratio: 16 / 9;
  background: #000;
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.5);
}
.video-modal-marco iframe,
.video-modal-marco video { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.video-modal-marco video { object-fit: contain; background: #000; }
.video-modal-cerrar {
  position: absolute; top: 0.75rem; right: 0.75rem; z-index: 1;
  width: 2.5rem; height: 2.5rem; border: 0; border-radius: 50%;
  background: rgba(0, 0, 0, 0.55); color: white;
  font-size: 1.5rem; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background 0.2s ease;
}
.video-modal-cerrar:hover { background: rgba(0, 0, 0, 0.8); }

/* footer */
.site-footer { background: var(--ink-900); color: white; padding: 6rem 0 2rem; position: relative; overflow: hidden; }
.site-footer .foot-blob { position: absolute; bottom: -300px; left: -200px; width: 700px; height: 700px; background: var(--brand-gradient); border-radius: 50%; filter: blur(140px); opacity: 0.25; pointer-events: none; }
.site-footer a { color: rgba(255,255,255,0.65); transition: color 0.25s ease; text-decoration: none; }
.site-footer a:hover { color: white; }
.site-footer .foot-logo svg { height: 22px; }
.site-footer .foot-logo svg path { fill: white !important; }
.footer-certificaciones a {
    background: transparent !important;
    padding: 0 !important;
}
.footer-certificaciones a img { 
    height: 85px !important;
}
/* split */
.split-line {     display: inline-block;
    overflow: initial;
    vertical-align: bottom;
    line-height: 0.9;
    padding-bottom: 0.05em; }
/* Sin will-change: son sesenta y pico palabras por pagina, o sea sesenta y pico capas
   permanentes, y la mayoria no se anima nunca —los titulares que ya se ven al cargar se
   quedan quietos—. GSAP pone will-change el solo mientras dura cada animacion, que es
   cuando sirve de algo. */
.split-word { display: inline-block; padding-bottom: 0.03em;}

/* hero specific */
.hero-grid {
  position: absolute; inset: 0; pointer-events: none;
  background-image:
    linear-gradient(rgba(10,10,11,0.04) 1px, transparent 1px),
    linear-gradient(90deg, rgba(10,10,11,0.04) 1px, transparent 1px);
  background-size: 64px 64px;
  -webkit-mask-image: radial-gradient(ellipse at 50% 30%, black 30%, transparent 70%);
  mask-image: radial-gradient(ellipse at 50% 30%, black 30%, transparent 70%);
}

/* sector card */
.sector {
  border: 1px solid var(--ink-200);
  border-radius: 20px;
  padding: 1.5rem;
  background: white;
  transition: border-color 0.4s var(--ease-out-expo), transform 0.4s var(--ease-out-expo), box-shadow 0.4s var(--ease-out-expo), color 0.4s var(--ease-out-expo);
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.sector:hover { border-color: var(--ink-900); transform: translateY(-3px); box-shadow: 0 20px 40px -16px rgba(10,10,11,0.14); }

/* sector card with image — integrated full-bleed overlay */
/* La rejilla de sectores. Va como reglas propias y no con utilidades sueltas porque el número
   de columnas lo elige el editor, y una clase compuesta al vuelo no existiría en esta hoja:
   se genera a mano. */
.sector-grid { display: grid; gap: 1.25rem; grid-template-columns: 1fr; }
@media (min-width: 640px) {
  .sector-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .sector-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .sector-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .sector-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .sector-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .sector-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  /* Auto: las que quepan sin bajar de 230px, que es donde el título deja de caber en una línea. */
  .sector-cols-auto { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); }
}

/* Formato compacto: la tarjeta pasa de vertical a apaisada. Sirve cuando hay muchas o cuando
   la sección no puede llevarse media pantalla de alto.
   Con las dos clases y no con una: esta regla va ANTES que .sector-card en la hoja, y con la
   misma especificidad ganaría la de abajo y la tarjeta seguiría saliendo alta. */
.sector-card.sector-card-compacta { aspect-ratio: 4 / 4; }
/* A ancho completo la rejilla reparte el mismo número de columnas en mucho más sitio, y una
   tarjeta compacta casi cuadrada sale desproporcionada; más apaisada —4/2— se ve mejor. */
.sector-card.sector-card-compacta.sector-card-compacta-completo { aspect-ratio: 4 / 2; }

.sector-card {
  position: relative;
  display: flex; flex-direction: column; justify-content: flex-end;
  aspect-ratio: 3 / 4;
  background: var(--ink-900);
  border-radius: 22px;
  overflow: hidden;
  text-decoration: none;
  transition: transform 0.4s var(--ease-out-expo), box-shadow 0.4s var(--ease-out-expo);
}
.sector-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 24px 48px -18px rgba(10,10,11,0.28);
}
/* En columna unica la proporcion vertical 3/4 sale demasiado alta; mas apaisada se lee mejor
   en movil. Solo afecta a la tarjeta por defecto: las variantes compactas ya tienen la suya. */
@media (max-width: 640px) {
  .sector-card { aspect-ratio: 6 / 4; }
}
.sector-card-media {
  position: absolute; inset: 0;
  overflow: hidden;
}
.sector-card-media img {
  width: 100%; height: 100%;
  object-fit: cover; display: block;
  transition: transform 0.6s var(--ease-out-expo);
}
.sector-card:hover .sector-card-media img { transform: scale(1.06); }
.sector-card-media::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10,10,11,0) 28%, rgba(10,10,11,0.55) 66%, rgba(10,10,11,0.88) 100%);
  pointer-events: none;
}
.sector-card-body {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  padding: 1.3rem 1.4rem 1.4rem;
}
.sector-card-body h3 {
  font-family: "Manrope", sans-serif; font-weight: 600;
  font-size: 1.05rem; color: #fff;
  margin-bottom: 0.35rem;
}
.sector-card-body p {
  font-size: 0.85rem; color: rgba(255,255,255,0.78);
  line-height: 1.5;
}
.sector-card-link {
  margin-top: 0.9rem;
  display: inline-flex; align-items: center; gap: 0.35rem;
  font-size: 0.78rem; font-weight: 600;
  color: rgba(255,255,255,0.7);
  transition: color 0.3s ease, gap 0.3s ease;
}
.sector-card:hover .sector-card-link { color: #fff; gap: 0.55rem; }

/* CTA box — animated particle canvas */
.cta-canvas {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  z-index: 0; pointer-events: none;
  border-radius: inherit;
  opacity: 0.85;
}

/* check list utility — consistent across all pages */
/* Sin «margin: 0». El Preflight de Tailwind ya lo pone en menos,ol,ul (0,0,1), y aqui
   valia 0,1,0: le ganaba al mt-8/mb-8 del marcado y la lista salia pegada al parrafo de
   arriba en los cinco sitios donde se usa.
   El tamano se hereda del contexto en vez de fijarse: asi la lista se lee igual que el
   parrafo que la precede, en lugar de un punto por debajo. */
.check-list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 0.7rem; }
/* El texto sube de --ink-500 a --ink-700 y a peso 500, que es como ya se pintaba .profile-list
   en las tarjetas aprobadas. Antes la marca pesaba mas que la frase; ahora manda el texto.
   Sobre blanco da 14,8:1, muy por encima del 4,5:1 de WCAG 2.2 AA. */
/* font-size FIJO, no inherit. Con inherit cada lista salia con el cuerpo del contenedor
   donde hubiera caido y el sitio tenia el mismo componente a tres tamanos distintos: 15 px en
   21 listas, 16 px en 5 y 18 px en 2 de la portada. Se fija en los 15 px de la mayoria, que
   son ademas los que ya usaba .profile-list dentro de las tarjetas. */
.check-list li { display: flex; align-items: flex-start; gap: 0.7rem; font-size: 0.9375rem; color: var(--ink-700); font-weight: 500; line-height: 1.55; }

/* 4 y 5 columnas del bloque de lista (blocks/_lista.cshtml). 2 y 3 usan las utilidades de
   Tailwind sm:grid-cols-2/3, que ya estan en tailwind.build.css; esa hoja es una compilacion
   estatica sin JIT y no tiene sm:grid-cols-4 ni sm:grid-cols-5, asi que esas dos se escriben
   a mano, al mismo breakpoint de 640px que las demas. */
@media (min-width: 640px) {
  .chk-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .chk-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}

/* --- la marca de verificacion, una sola definicion --------------------------------------
   .chk (listas sueltas: home, normativa, features, bloque de lista) y .profile-ok (listas
   dentro de una tarjeta) son la misma pieza, asi que se declaran juntas y ya no pueden
   separarse con el tiempo.

   Es el cuadro del icono de .benefit-card en pequeno: fondo tenido del acento, anillo fino
   por dentro y el glifo en color. Antes .chk era un circulo relleno con el degradado de
   marca y el tick en blanco; a 20 px y repetido seis u ocho veces seguidas la lista se leia
   como una fila de pegatinas de color y tapaba al texto.

   El acento entra por herencia: --ic lo fija .benefit-card por tarjeta, y una lista suelta
   cae al azul de marca. */
.chk, .profile-ok {
  inline-size: 22px; block-size: 22px;
  flex: none;
  display: grid; place-items: center;
  margin-block-start: 1px;
  background: color-mix(in srgb, var(--ic, var(--brand-blue)) 12%, white);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ic, var(--brand-blue)) 22%, transparent);
  /* 78 % de acento sobre --ink-900, el mismo apagado que .benefit-tag: el acento puro se
     queda en 2,9:1 sobre su propio tinte y esto es un trazo de 2 px. Asi da 3,9:1, por
     encima del 3:1 que pide WCAG 1.4.11 para elementos graficos. */
  color: color-mix(in srgb, var(--ic, var(--brand-blue)) 78%, var(--ink-900));
  /* Peticion literal del cliente: 25px. A 22 px de lado el navegador recorta el radio a la
     mitad del lado, asi que 25px y 11px pintan exactamente lo mismo, un circulo. Se deja el
     valor pedido para que la hoja diga lo que se acordo. */
  border-radius: 25px;
}
.chk svg, .profile-ok svg { inline-size: 11px; block-size: 11px; }
/* Parte del marcado trae stroke="white" en el path, que sobre el fondo tenido no se veria.
   Una propiedad CSS gana siempre al atributo de presentacion, asi que la marca sale bien
   aunque quede algun span sin actualizar. */
.chk svg path, .profile-ok svg path { stroke: currentColor; }

/* badge-new — pill for "Nuevo" / "Novedad" labels */
.badge-new {
  display: inline-flex; align-items: center;
  padding: 2px 8px; font-size: 9px; font-weight: 700;
  border-radius: 999px;
  background: #54c3b6;
  color: white; letter-spacing: 0.05em; vertical-align: middle;
}

/* blog article card */
.blog-card { background: white; border: 1px solid var(--ink-200); border-radius: 24px; overflow: hidden; transition: transform 0.35s var(--ease-out-expo), box-shadow 0.35s var(--ease-out-expo), border-color 0.35s var(--ease-out-expo); }
.blog-card:hover { transform: translateY(-4px); box-shadow: 0 24px 48px -20px rgba(10,10,11,0.14); }
.blog-card .cover { height: 176px; position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; }
.blog-card .cover img { width: 100%; height: 100%; object-fit: cover; display: block; }
.blog-card .cover-inner { text-align: center; padding: 1rem; }
.blog-card .body { padding: 1.5rem; }
.blog-card .cat { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.18em; color: var(--ink-400); margin-bottom: 0.6rem; display: block; }
.blog-card h3 { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.05rem; line-height: 1.35; margin-bottom: 0.6rem; color: var(--ink-900); }
.blog-card p { font-size: 0.85rem; color: var(--ink-500); line-height: 1.6; display: -webkit-box; -webkit-line-clamp: 3; line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.blog-card .blog-meta {
  display: flex; align-items: center; gap: 0.45rem;
  margin-top: 1.1rem; padding-top: 0.9rem;
  border-top: 1px solid var(--ink-100);
  font-size: 0.72rem; color: var(--ink-400);
  font-variant-numeric: tabular-nums;
}
.blog-card .blog-meta svg { color: var(--brand-blue); flex: none; }
.blog-card .blog-meta time { font-weight: 600; color: var(--ink-500); }
.blog-card .bm-sep { width: 3px; height: 3px; border-radius: 50%; background: var(--ink-300); flex: none; }

/* chip de categoría — compartido por blog.html, blog-entrada.html e index.html */
.blog-cat {
  display: inline-block;
  font-size: 0.68rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.16em;
  padding: 0.25rem 0.65rem; border-radius: var(--r-pill);
  background: var(--ink-100); color: var(--ink-500);
  max-width:max-content;
}
/* Un color por cada una de las cinco categorias definitivas. Los slugs los generan
   _blogCat y blogList con la misma regla, asi que tienen que coincidir letra a letra. */
/* Los colores de estas tres estaban a 3,16, 4,29 y 3,56 sobre su propio fondo. Las otras dos
   (rrhh 4,70 y transformacion 5,52) ya pasaban y se quedan como estaban. */
.blog-cat.control-horario { background: rgba(86,197,181,0.12); color: #1F7568; }
.blog-cat.rrhh { background: rgba(178,105,172,0.1); color: #9C4F95; }
.blog-cat.talento-y-equipos { background: rgba(217,146,58,0.12); color: #8A5715; }
.blog-cat.legislacion-laboral { background: rgba(58,165,190,0.1); color: #1F6C82; }
.blog-cat.transformacion-digital-e-ia { background: rgba(99,102,241,0.11); color: #4F46E5; }
.blog-card .blog-cat { align-self: flex-start; margin-bottom: 0.7rem; }

/* la tarjeta entera es un enlace: sin subrayados heredados y con foco visible */
.blog-card { display: flex; flex-direction: column; }
.blog-card[hidden] { display: none; }
.blog-card-link { display: flex; flex-direction: column; width: 100%; color: inherit; text-decoration: none; }
.blog-card-link:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 3px; border-radius: 24px; }
.blog-card .body { display: flex; flex-direction: column; flex: 1; }
.blog-card .body p { flex: 1; }
.blog-card .cover img { transition: transform 0.6s var(--ease-out-expo); }
.blog-card:hover .cover img { transform: scale(1.04); }
.blog-card h3 { transition: color 0.2s ease; }
.blog-card:hover h3 { color: var(--brand-violet); }

/* blog — artículo destacado */
.blog-featured {
  display: grid;
  grid-template-columns: 1fr;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 28px;
  overflow: hidden;
  color: inherit;
  text-decoration: none;
  transition: transform 0.35s var(--ease-out-expo), box-shadow 0.35s var(--ease-out-expo);
}
.blog-featured:hover { transform: translateY(-4px); box-shadow: 0 32px 64px -28px rgba(10,10,11,0.22); }
.blog-featured:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 3px; }
.blog-featured .bf-media { position: relative; overflow: hidden; aspect-ratio: 4 / 3; }
.blog-featured .bf-media img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.6s var(--ease-out-expo); }
.blog-featured:hover .bf-media img { transform: scale(1.04); }
.blog-featured .bf-badge {
  position: absolute; left: 1rem; bottom: 1rem;
  display: inline-flex; align-items: center; gap: 0.4rem;
  padding: 0.35rem 0.75rem; border-radius: var(--r-pill);
  background: rgba(10,10,11,0.62);
  backdrop-filter: blur(8px);
  color: white; font-size: 0.68rem; font-weight: 600;
}
.blog-featured .bf-badge svg { stroke: currentColor; }
.blog-featured .bf-body { padding: 2.25rem; display: flex; flex-direction: column; justify-content: center; }
/* Titulo y resumen a tres lineas como mucho: sin tope, un resumen largo alargaba la tarjeta
   y en el carrusel eso era lo que dejaba hueco en blanco bajo las mas cortas. */
.bf-clamp-3 {
  display: -webkit-box; -webkit-line-clamp: 3; line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden;
}
@media (min-width: 1024px) {
  .blog-featured { grid-template-columns: 1fr 1fr; }
  .blog-featured .bf-media { aspect-ratio: auto; height: 100%; min-height: 22rem; }
}

/* ============================================================
   HOME — tarjetas de beneficios
   ============================================================ */
.benefit-card {
  --ic: #3AA5BE;
  position: relative;
  display: flex; flex-direction: column;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 26px;
  padding: 2rem 1.75rem 1.75rem;
  overflow: hidden;
  isolation: isolate;
  transition: transform 0.4s var(--ease-out-expo), border-color 0.4s ease, box-shadow 0.4s var(--ease-out-expo);
}
/* halo de color de la tarjeta, aparece al pasar el cursor */
.benefit-card::before {
  content: ""; position: absolute; z-index: -1;
  top: -45%; right: -35%; width: 78%; aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, color-mix(in srgb, var(--ic) 26%, transparent) 0%, transparent 70%);
  opacity: 0; transform: scale(0.75);
  transition: opacity 0.5s ease, transform 0.6s var(--ease-out-expo);
}
.benefit-card::after {
  content: ""; position: absolute; left: 0; right: 0; top: 0; height: 3px;
  background: linear-gradient(90deg, var(--ic), color-mix(in srgb, var(--ic) 35%, white));
  transform: scaleX(0); transform-origin: left;
  transition: transform 0.5s var(--ease-out-expo);
}
.benefit-card:hover {
  transform: translateY(-5px);
  border-color: color-mix(in srgb, var(--ic) 35%, var(--ink-200));
  box-shadow: 0 30px 58px -34px color-mix(in srgb, var(--ic) 55%, rgba(10,10,11,0.55));
}
.benefit-card:hover::before { opacity: 1; transform: scale(1); }
.benefit-card:hover::after { transform: scaleX(1); }

.benefit-ic {
  width: 54px; height: 54px; border-radius: 17px;
  display: grid; place-items: center;
  color: var(--ic);
  background: color-mix(in srgb, var(--ic) 12%, white);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ic) 22%, transparent);
  transition: transform 0.4s var(--ease-out-back), background-color 0.35s ease, color 0.35s ease;
}
.benefit-card:hover .benefit-ic {
  transform: scale(1.06) rotate(-3deg);
  background: var(--ic); color: white;
}
/* fila superior: icono + número de orden */
.benefit-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.35rem; }
.benefit-num {
  font-family: "Inter", sans-serif;
  font-size: 0.7rem; font-weight: 500; letter-spacing: 0.1em;
  color: var(--ink-300);
  transition: color 0.35s ease;
}
.benefit-card:hover .benefit-num { color: color-mix(in srgb, var(--ic) 70%, var(--ink-300)); }

.benefit-card h3 {
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 1.12rem; line-height: 1.28;
  letter-spacing: -0.02em; color: var(--ink-900);
  margin-bottom: 0.6rem; text-wrap: balance;
}
.benefit-card p { font-size: 0.875rem; color: var(--ink-500); line-height: 1.65; flex: 1; }
.benefit-tag {
  display: inline-flex; align-items: center; gap: 0.4rem;
  align-self: flex-start;
  margin-top: 1.4rem; padding: 0.4rem 0.8rem;
  background: color-mix(in srgb, var(--ic) 8%, white);
  border: 1px solid color-mix(in srgb, var(--ic) 20%, transparent);
  border-radius: var(--r-pill);
  font-size: 0.7rem; font-weight: 600;
  color: color-mix(in srgb, var(--ic) 78%, var(--ink-900));
  white-space: nowrap;
}
@media (max-width: 400px) { .benefit-tag { white-space: normal; } }

/* ============================================================
   perfil — tarjetas de la comparativa de dos publicos
   ============================================================
   Es la rama de dos columnas de seccionComparativa («que gana el manager / que gana el
   empleado»). No es una tabla: el punto 3 de una columna no se corresponde con el 3 de la
   otra, asi que cada publico va en su propia tarjeta, suelta y con su cabecera.

   No es un componente nuevo: es .benefit-card —la tarjeta de «Eficiencia. Precision.
   Flexibilidad.» de la home— con dos piezas de mas, la lista y su marca de verificacion.
   Misma caja blanca, mismo filete, mismo radio y el mismo cuadro de icono con fondo tenido
   y el glifo en color. El acento entra por --ic, igual que alli: malva la primera tarjeta y
   azul la segunda, los dos extremos del degradado de marca. El color nunca va solo, cada
   tarjeta lleva ademas su nombre y su icono.

   Sin efecto al pasar por encima, al reves que en la home: alli la tarjeta acompana a un
   enlace, aqui no hay nada que abrir y elevarla prometeria un clic que no existe. */
/* align-items: start, no stretch: si una lista trae ocho puntos y la otra uno, igualar
   alturas deja la segunda tarjeta medio vacia. Con listas parejas —el caso normal— quedan
   igual de altas solas. */
.perfiles { display: grid; gap: 1.25rem; align-items: start; }
@media (min-width: 768px) {
  .perfiles-dos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Se apaga el juego de hover que hereda de .benefit-card. Van despues en la hoja, asi que
   con la misma especificidad ganan estas. */
.profile-card, .profile-card .benefit-ic { transition: none; }
.profile-card:hover { transform: none; border-color: var(--ink-200); box-shadow: none; }
.profile-card:hover .benefit-ic {
  transform: none;
  background: color-mix(in srgb, var(--ic) 12%, white);
  color: var(--ic);
}
.profile-card:hover::before { opacity: 0; }
.profile-card:hover::after { transform: scaleX(0); }

/* El icono llega como glifo de fuente, no como el SVG de la home: hay que darle cuerpo para
   que ocupe lo mismo dentro del cuadro. */
.profile-card .benefit-ic { font-size: 1.35rem; }
.profile-card .benefit-head { margin-bottom: 1.15rem; }
/* overflow-wrap: la tarjeta recorta con overflow:hidden, y el redactor puede meter una
   referencia o una URL sin espacios; sin esto se sale de la caja y arrastra la pagina. */
.profile-card h3 { font-size: 1.15rem; margin-bottom: 0; overflow-wrap: anywhere; }

/* Piezas que solo aparecen cuando la tarjeta la rellena un redactor (seccionTextoTarjeta):
   antetitulo, parrafo y boton. Las tarjetas de la comparativa solo llevan titulo y lista.
   .benefit-card es una columna flex, asi que lo que no deba ocupar todo el ancho tiene que
   pedirlo: sin esto el antetitulo y el boton salen estirados de lado a lado. */
.profile-card > .tag, .profile-card > .btn { align-self: flex-start; }
.profile-card > .btn { margin-block-start: 1.75rem; }
/* flex: none — .benefit-card p lleva flex: 1 para cuadrar alturas en la rejilla de tres de la
   home; aqui empujaria la lista al fondo de la tarjeta. */
.profile-card > p { flex: none; font-size: 0.95rem; }
.profile-card > h3 + p { margin-block-start: 0.55rem; }

.profile-list {
  list-style: none; margin: 1.1rem 0 0; padding: 0;
  display: flex; flex-direction: column;
}
.profile-list li {
  display: flex; align-items: flex-start; gap: 0.7rem;
  overflow-wrap: anywhere;
  padding-block: 0.42rem;
  color: var(--ink-700); font-weight: 500;
  font-size: 0.9375rem; line-height: 1.55;
}
.profile-list li > span:last-child { min-inline-size: 0; }
/* Sin cabecera que pintar la lista es lo primero, y el relleno de la tarjeta ya da el aire. */
.profile-list:first-child { margin-block-start: 0; }

/* .profile-ok se declara junto a .chk, arriba, en «la marca de verificacion»: son la misma
   pieza y ahora comparten una sola regla. */

/* La tarjeta se mide contra su propia caja. Dos escalones:
   · 22rem — cabe un titulo un punto mayor.
   · 26rem — es la anchura a la que queda la tarjeta con .perfiles-dos en max-w-4xl. Al
     ensanchar el contenedor las frases de la lista no crecen solas y sobraba sitio a su
     derecha; to-top el cuerpo y abrir el interlineado de fila reparte ese aire dentro de la
     linea en vez de dejarlo muerto al final. */
/* Una .check-list dentro de una tarjeta de perfil adopta el ritmo de .profile-list. Es el
   mismo componente: solo cambia de donde sale el contenido —un textarea del backoffice en
   vez de las filas de la comparativa—, asi que no puede verse distinto. */
.profile-card .check-list { gap: 0; margin-block-start: 1.1rem; }
.profile-card .check-list li { padding-block: 0.42rem; }

/* Aqui hubo una container query que subia el titulo y el ritmo de la lista cuando la caja
   de contenido pasaba de 22rem. Se ha quitado: con dos columnas la tarjeta da 27,4rem y con
   tres 21,8rem, justo a un lado y a otro del umbral, asi que la misma seccion se veia con dos
   tamanos de letra distintos segun cuantos publicos tuviera. Un unico tamano en las dos. */
/* El relleno no puede ir en la container query de arriba: un elemento no puede consultar su
   propio tamano, y ademas cambiar su relleno cambiaria la medida consultada. Va por ventana,
   en el punto en el que .perfiles-dos ya ocupa los 896px enteros de max-w-4xl (896 + 48 del
   px-6 = 944px). Con 2rem de lado la caja de contenido queda en 22,6rem, o sea por encima del
   escalon de arriba: los dos ajustes conviven sin apagarse el uno al otro. */
@media (min-width: 67rem) {
  .perfiles-dos .profile-card,
  .perfiles-tres .profile-card { padding: 2.25rem 2rem 2rem; }
}

/* ============================================================
   antes / despues — la otra rama de seccionComparativa
   ============================================================
   Mismo esqueleto que .perfiles —las dos tarjetas son .benefit-card + .profile-card—, pero
   aqui la caja no es blanca: cada columna va rellena de color, con el mismo lenguaje que las
   tarjetas de «Imagen al pie» del grid (fondo suave, sin sombra, pastilla del mismo tono un
   punto mas saturada). Antes las dos columnas eran dos cajas blancas casi identicas y todo
   el peso del contraste antes/despues recaia en el gris del texto; ahora lo sostiene el
   fondo, que es lo que se ve de lejos, y el texto puede to-top de contraste en vez de bajarlo.

   Dos cosas mas que cambian respecto a la version de cajas blancas:
   · La cabecera pasa a una sola linea —cuadro del icono + titulo, en .ad-cab— en vez de
     icono arriba y titulo debajo. Compacta el arranque y, de paso, separa esta maquetacion
     de la de dos publicos, que sale en la misma pagina en Permisos y mantiene el icono
     apilado: dos rellenos de color con cabecera en linea frente a dos cajas blancas con
     cabecera apilada.
   · Las marcas de la lista se pintan sobre un disco claro, no sobre el tinte del acento: el
     fondo de la tarjeta ya esta tenido y una marca tenida encima se perdia.

   El significado sigue sin viajar solo en el color: cada columna lleva su cabecera y su
   glifo —aspa en el «antes», tick en el «despues»—, que es lo que pide WCAG 1.4.1. */
.antes-despues {
  display: grid; gap: 1.25rem;
  grid-template-columns: minmax(0, 1fr);
  justify-items: stretch;
  /* Aqui si se igualan alturas, al reves que en .perfiles: las dos listas salen de la misma
     coleccion de filas, asi que siempre traen el mismo numero de puntos y lo unico que las
     descuadra es que una frase ocupe dos lineas. Con los pies alineados se leen como un par. */
  align-items: stretch;

  /* El azul vive en el contenedor, no en .ad-despues, porque la flecha es hermana de la
     tarjeta y tiene que poder leerlo. Es el tono de la tarjeta azul del grid de color
     (#EBF5F8) bajado un escalon: alli convive con malva y crema y con eso basta para leerse
     como azul; aqui su vecina es gris y necesita un punto mas de presencia. */
 /* Los tonos son los del juego aprobado de «Imagen al pie» del grid de tarjetas: crema y
     azul. El gris que habia aqui antes no estaba en esa paleta y se leia como un bloque
     ajeno al resto de la pagina. El «antes» se queda con el crema —neutro, ni premia ni
     castiga— y el «despues» con el azul de marca. */
  --ad-azul-caja: #EBF5F8;
  --ad-azul-filete: #D6EBF1;
  --ad-azul-pastilla: #D6EBF1;
  --ad-azul-anillo: #C2E0EA;
  --ad-azul-tinta: #1F6C82;
}
@media (min-width: 768px) {
  .antes-despues { grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); }
}

/* El relleno de color sustituye al blanco de .benefit-card. El filete fino se queda —del
   mismo tono, un escalon mas oscuro— porque el bloque tambien sale en secciones de fondo
   blanco (interruptor «fondoBlanco»), y ahi un tinte tan claro sin borde flota. */
.antes-despues .profile-card,
.antes-despues .profile-card:hover {
  background: var(--ad-caja);
  border-color: var(--ad-filete);
}
/* El velo mint en la esquina inferior es el unico gesto de marca del bloque: recuerda al
   degradado violeta-azul-mint del sitio y evita que el «despues» quede tan plano como el
   «antes», que es justo lo que interesa. Va con mas especificidad que la regla de arriba
   porque necesita ganar al fondo liso. Sobre el punto mas teñido el texto da 10,9:1. */
.antes-despues .ad-despues {
  background:
    radial-gradient(120% 90% at 100% 100%, color-mix(in srgb, var(--brand-mint) 24%, transparent) 0%, transparent 58%),
    var(--ad-caja);
}

/* Cabecera en una linea: cuadro del icono + titulo. El cuadro baja de 54 a 44 px para que la
   fila no pese mas que la lista que viene debajo. */
.ad-cab { display: flex; align-items: center; gap: 0.85rem; margin-block-end: 0.35rem; }
.ad-cab h3 { margin-block-end: 0; }
.ad-cab .benefit-ic { inline-size: 44px; block-size: 44px; border-radius: 14px; font-size: 1.1rem; flex: none; }

/* La pastilla y las marcas dejan de calcularse con color-mix sobre --ic: sobre un fondo ya
   tenido ese calculo daba una pieza casi del mismo color que la tarjeta. Ahora son tonos
   fijos del mismo juego, y el par (fondo, glifo) esta comprobado uno a uno mas abajo. */
.antes-despues .benefit-ic,
.antes-despues .profile-card:hover .benefit-ic {
  background: var(--ad-pastilla);
  box-shadow: inset 0 0 0 1px var(--ad-anillo);
  color: var(--ad-tinta);
}
.antes-despues .profile-ok {
  background: var(--ad-marca);
  box-shadow: inset 0 0 0 1px var(--ad-anillo);
  color: var(--ad-tinta);
}
/* Las dos listas arrancan a la misma altura y el alto sobrante se queda al pie de la columna
   mas corta. Se probo tambien centrar la lista en el hueco y repartirlo entre filas: las dos
   reparten mejor el color vacio, pero descolocan las filas de una columna respecto a la otra,
   y en un antes/despues la lectura es horizontal. Prima que las filas se emparejen. */
.antes-despues .profile-list { margin-block-start: 1.35rem; }

/* La flecha, en el tono pastilla del «despues»: apunta a la columna de la que es del mismo
   color. Decorativa —lo que dice ya lo dicen las dos cabeceras—, pero el glifo da 4,8:1
   sobre su disco, por encima del 3:1 de WCAG 1.4.11. */
.ad-flecha {
  inline-size: 2.75rem; block-size: 2.75rem;
  justify-self: center; align-self: center;
  display: grid; place-items: center;
  border-radius: var(--r-pill);
  background: #D9EDF3;
  box-shadow: inset 0 0 0 1px var(--ad-azul-anillo);
  color: var(--ad-azul-tinta);
}
/* Apilado, la flecha apunta hacia abajo, que es donde esta el «después». */
.ad-flecha svg { transform: rotate(90deg); }
@media (min-width: 768px) { .ad-flecha svg { transform: none; } }

/* La columna del «despues». Sobre #E3F0F5: titulo en --ink-900 17:1 y lista en --ink-700
   12,8:1; el glifo #1F6E85 sobre su disco blanco, 5,8:1. */
/* El «despues» no lleva sombra ni el filete de acento de arriba. Se probaron los dos y se
   descartaron: ese filete es el ::after de .benefit-card, que en todo el sitio solo sale al
   pasar el cursor, asi que dejarlo fijo aqui es tomar prestado un estado de interaccion para
   decorar, y la sombra sacaba la tarjeta del plano en el que estan las demas secciones.
   La diferencia entre las dos columnas la sostiene la construccion de la caja —una con
   relleno y otra sin el, en discontinuo—, no un realce anadido. */

.ad-despues {
  --ic: var(--brand-blue);
  --ad-caja: var(--ad-azul-caja);
  --ad-filete: var(--ad-azul-filete);
  --ad-pastilla: var(--ad-azul-pastilla);
  --ad-anillo: var(--ad-azul-anillo);
  --ad-tinta: var(--ad-azul-tinta);
  --ad-marca: #FFFFFF;
}

/* La columna de lo que se deja atras: gris neutro y un punto mas denso que la pagina, sin
   nada de color. Se lee como apagada por el relleno, no por un texto palido.

   Ojo con el contraste al cambiar el fondo: --ink-500 (#71717A) daba 4,83:1 sobre blanco,
   pero sobre este gris se queda en 4,17:1 y ya no llega al 4,5:1 de WCAG 2.2 AA. El texto
   sube por eso a --ink-600 (#3F3F46), 8,6:1, y la distancia con la columna de al lado
   (--ink-700, 12,8:1) la marcan ahora el peso 400 frente a 500, el aspa y el propio gris de
   la caja. El glifo del aspa, #5C5C64 sobre su disco, da 6,1:1. */
.ad-antes {
  --ic: var(--ink-400);
  /* Sin relleno y con el filete discontinuo. Es el gesto que mas separa las dos columnas:
     una tiene caja y la otra no llega a tenerla. Funciona igual sobre el gris de seccion y
     sobre blanco (interruptor «fondoBlanco»), porque no pinta fondo propio. */
  --ad-caja: transparent;
  --ad-filete: var(--ink-300);
  --ad-pastilla: transparent;
  --ad-anillo: var(--ink-300);
  /* #71717A da 4,6:1 sobre el gris de seccion (#FAFAFA) y 4,8:1 sobre blanco: cumple AA
     para texto pequeno y para el glifo del aspa, que ademas es redundante con la cabecera. */
  --ad-tinta: var(--ink-500);
  --ad-marca: transparent;
}
.antes-despues .ad-antes {
  border-style: dashed;
  box-shadow: none;
}
/* La pastilla, en contorno. Sin relleno no compite con la del «despues», que si lo lleva. */
.ad-antes .ad-pastilla {
  background: transparent;
  box-shadow: inset 0 0 0 1px var(--ink-300);
  color: var(--ink-500);
}
/* El aspa suelta: ni disco ni anillo. Menos peso que el tick del «despues», que si va en su
   cuadro. El trazo se engorda un punto para que a este tamano no se deshaga. */
.antes-despues .ad-antes .profile-ok {
  background: transparent;
  box-shadow: none;
  inline-size: 1.1rem;
  color: var(--ink-500);
}
.ad-antes h3 { color: var(--ink-600); }
/* El texto se queda en --ink-600 (10,3:1 sobre el gris de seccion): la columna se lee como
   apagada por la caja sin terminar y por el aspa, no por un texto palido que costaria leer. */
.ad-antes .profile-list li { color: var(--ink-600); font-weight: 400; }

/* ============================================================
   INTEGRACIONES — tarjetas con logotipo de marca
   ============================================================ */
.int-card {
  display: flex; flex-direction: column; gap: 0.7rem;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 20px;
  padding: 1.5rem;
  transition: transform 0.35s var(--ease-out-expo), border-color 0.35s ease, box-shadow 0.35s var(--ease-out-expo);
}
.int-card:hover {
  transform: translateY(-3px);
  border-color: var(--ink-300);
  box-shadow: 0 22px 44px -26px rgba(10,10,11,0.3);
}
.int-logo {
  width: 46px; height: 46px; flex: none;
  display: grid; place-items: center;
  border-radius: 14px;
  background: var(--ink-50);
  border: 1px solid var(--ink-100);
}
.int-logo img { width: 28px; height: 28px; object-fit: contain; display: block; }
/* los logotipos que son wordmark necesitan más ancho para leerse */
.int-logo-word img { width: 36px; height: 36px; }
.int-logo-sm { width: 40px; height: 40px; border-radius: 12px; }
.int-logo-sm img { width: 20px; height: 20px; }
.int-logo-brand { background: var(--brand-gradient); border-color: transparent; }
.int-mono {
  font-family: "Manrope", sans-serif;
  font-weight: 800; font-size: 1.02rem; letter-spacing: -0.04em;
  line-height: 1;
}
.int-name { font-size: 0.875rem; font-weight: 600; letter-spacing: -0.01em; }
.int-desc { font-size: 0.75rem; color: var(--ink-400); margin-top: -0.25rem; }

/* ============================================================
   ESTADO DEL SERVICIO (estado-del-servicio.html)
   ============================================================ */
.status-banner {
  display: flex; align-items: center; gap: 1rem;
  padding: 1.25rem 1.5rem;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 22px;
  box-shadow: var(--shadow-sm);
  position: relative; overflow: hidden;
}
.status-banner::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
  background: var(--brand-mint);
}
.status-banner[data-state="warn"]::before { background: #E9A23B; }
.status-banner[data-state="down"]::before { background: #E4574C; }
.status-banner .sb-icon {
  width: 44px; height: 44px; border-radius: 14px; flex: none;
  display: grid; place-items: center;
  background: rgba(86,197,181,0.14); color: #2A9A8C;
}
.status-banner[data-state="warn"] .sb-icon { background: rgba(233,162,59,0.14); color: #B97B18; }
.status-banner[data-state="down"] .sb-icon { background: rgba(228,87,76,0.14); color: #C33B31; }
.status-banner .sb-text { flex: 1; min-width: 0; }
.status-banner .sb-title { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.15rem; letter-spacing: -0.02em; }
.status-banner .sb-sub { font-size: 0.78rem; color: var(--ink-500); margin-top: 2px; }
.sb-refresh {
  display: inline-flex; align-items: center; gap: 0.45rem;
  padding: 0.55rem 1rem; flex: none;
  border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  background: white; color: var(--ink-700);
  font: inherit; font-size: 0.78rem; font-weight: 600;
  cursor: pointer;
  transition: border-color 0.3s ease, color 0.3s ease;
}
.sb-refresh:hover { border-color: var(--brand-blue); color: var(--brand-blue); }
.sb-refresh.is-loading svg { animation: spin 0.8s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }

.status-kpis { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0.75rem; }
.status-kpi {
  background: white; border: 1px solid var(--ink-200);
  border-radius: 18px; padding: 1.1rem 1.25rem;
}
.status-kpi .sk-label { font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 700; color: var(--ink-400); }
.status-kpi .sk-value { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.75rem; letter-spacing: -0.03em; line-height: 1.15; margin-top: 6px; }
.status-kpi .sk-foot { font-size: 0.72rem; color: var(--ink-500); margin-top: 4px; }
@media (max-width: 860px) { .status-kpis { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) {
  .status-banner { flex-wrap: wrap; }
  .sb-refresh { width: 100%; justify-content: center; }
}

.status-legend { display: flex; gap: 1rem; font-size: 0.74rem; color: var(--ink-500); }
.status-legend span { display: inline-flex; align-items: center; gap: 0.4rem; }
.status-legend i { width: 9px; height: 9px; border-radius: 3px; display: block; }
.status-legend .lg-ok { background: var(--brand-mint); }
.status-legend .lg-warn { background: #E9A23B; }
.status-legend .lg-down { background: #E4574C; }

.status-list { display: flex; flex-direction: column; gap: 0.5rem; }
.status-row {
  display: grid; grid-template-columns: minmax(220px, 1fr) minmax(240px, 2fr) auto;
  align-items: center; gap: 1.25rem;
  padding: 1rem 1.25rem;
  background: white; border: 1px solid var(--ink-200); border-radius: 16px;
  transition: border-color 0.3s ease, box-shadow 0.3s ease;
}
.status-row:hover { border-color: var(--ink-300); box-shadow: 0 12px 26px -20px rgba(10,10,11,0.35); }
.sr-head { display: flex; align-items: center; gap: 0.75rem; min-width: 0; }
.sr-ic {
  width: 34px; height: 34px; border-radius: 11px; flex: none;
  display: grid; place-items: center;
  background: var(--ink-100); color: var(--ink-700);
}
.sr-name { font-size: 0.9rem; font-weight: 600; letter-spacing: -0.01em; }
.sr-desc { font-size: 0.72rem; color: var(--ink-500); margin-top: 1px; }
.sr-bars { display: flex; gap: 2px; align-items: flex-end; height: 26px; }
.sr-bars .bar { flex: 1; min-width: 2px; height: 100%; border-radius: 2px; transition: transform 0.2s ease; }
.sr-bars .bar:hover { transform: scaleY(1.15); }
.sr-bars .b-ok { background: var(--brand-mint); }
.sr-bars .b-warn { background: #E9A23B; }
.sr-bars .b-down { background: #E4574C; }
.sr-meta { display: flex; align-items: center; gap: 0.75rem; justify-content: flex-end; min-width: 168px; }
.sr-chip {
  font-size: 0.68rem; font-weight: 700; padding: 0.3rem 0.65rem;
  border-radius: var(--r-pill); white-space: nowrap;
}
.sr-chip.chip-ok { background: rgba(86,197,181,0.16); color: #2A9A8C; }
.sr-chip.chip-warn { background: rgba(233,162,59,0.16); color: #B97B18; }
.sr-chip.chip-down { background: rgba(228,87,76,0.16); color: #C33B31; }
.sr-pct { font-family: "Inter", sans-serif; font-size: 0.78rem; color: var(--ink-500); font-variant-numeric: tabular-nums; min-width: 52px; text-align: right; }
@media (max-width: 900px) {
  .status-row { grid-template-columns: 1fr auto; }
  .sr-bars { grid-column: 1 / -1; order: 3; }
}
.status-scale {
  display: flex; align-items: center; gap: 0.75rem;
  margin-top: 0.9rem; padding: 0 1.25rem;
  font-size: 0.7rem; color: var(--ink-400);
}
.status-scale .line { flex: 1; height: 1px; background: var(--ink-200); }

.status-panel { background: white; border: 1px solid var(--ink-200); border-radius: 22px; padding: 1.5rem; }
.latency-chart { display: flex; align-items: flex-end; gap: 4px; height: 130px; }
.latency-chart span {
  flex: 1; border-radius: 4px 4px 0 0;
  background: linear-gradient(to top, rgba(58,165,190,0.25), rgba(58,165,190,0.6));
  transition: background 0.3s ease;
}
.latency-chart span:hover { background: linear-gradient(to top, rgba(58,165,190,0.4), var(--brand-blue)); }
.latency-chart span.is-now { background: var(--brand-gradient); }

.incidents { list-style: none; padding: 0; margin: 0; }
.incident { display: grid; grid-template-columns: 130px 1fr; gap: 1.5rem; padding: 1.5rem 0; border-top: 1px solid var(--ink-200); position: relative; }
.incident:first-child { border-top: 0; }
.incident .in-date { font-size: 0.78rem; color: var(--ink-500); font-weight: 600; padding-left: 1.1rem; position: relative; }
.incident .in-date::before {
  content: ""; position: absolute; left: 0; top: 6px;
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--brand-mint);
}
.incident[data-sev="warn"] .in-date::before { background: #E9A23B; }
.incident[data-sev="down"] .in-date::before { background: #E4574C; }
.incident[data-sev="maint"] .in-date::before { background: var(--brand-blue); }
.incident .in-title { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1rem; margin-bottom: 0.35rem; }
.incident .in-body p { font-size: 0.88rem; color: var(--ink-500); line-height: 1.65; }
.incident .in-steps { display: flex; flex-direction: column; gap: 0.35rem; margin-top: 0.9rem; padding-left: 0.9rem; border-left: 2px solid var(--ink-200); }
.incident .in-steps span { font-size: 0.78rem; color: var(--ink-500); }
.incident .in-steps b { font-family: "Inter", sans-serif; color: var(--ink-900); margin-right: 0.4rem; font-weight: 500; }
@media (max-width: 640px) { .incident { grid-template-columns: 1fr; gap: 0.75rem; } }

/* soporte — foto del equipo (sin veladura oscura: la sección es clara) */
.support-visual { position: relative; display: flex; align-items: center; justify-content: center; }
.support-photo {
  position: relative; margin: 0;
  width: 100%; max-width: 560px;
  border-radius: 28px;
  background: white;
  /* padding: 0.6rem; */
  box-shadow: 0 34px 70px -38px rgba(10,10,11,0.32), 0 12px 30px -22px rgba(58,165,190,0.28);
  border: 1px solid var(--ink-200);
}
.support-photo img {
  width: 100%; height: auto; display: block;
  aspect-ratio: 11 / 8; object-fit: cover;
  border-radius: 22px;
}
.support-caption {
  display: flex; align-items: center; gap: 0.55rem;
  padding: 0.9rem 0.5rem 0.35rem;
  font-size: 0.8rem; font-weight: 500; color: var(--ink-500);
}
.support-caption .dot-live { flex: none; }
@media (max-width: 1023px) { .support-photo { max-width: 480px; } }

/* ============================================================
   WEBINARS Y EVENTOS
   ============================================================ */
/* tarjeta del próximo webinar destacado */
.wb-hero {
  display: grid; grid-template-columns: 1fr;
  gap: 0;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 30px;
  overflow: hidden;
  box-shadow: 0 34px 70px -40px rgba(10,10,11,0.3);
}
.wb-hero-media { position: relative; overflow: hidden; aspect-ratio: 16 / 10; background: var(--ink-100); }
.wb-hero-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.wb-hero-media::after {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(150deg, rgba(178,105,172,0.25) 0%, rgba(58,165,190,0.12) 55%, transparent 80%);
}
.wb-hero-body { padding: 2.5rem; display: flex; flex-direction: column; justify-content: center; }
@media (min-width: 1024px) {
  .wb-hero { grid-template-columns: 1.05fr 1fr; }
  .wb-hero-media { aspect-ratio: auto; min-height: 100%; }
}
@media (max-width: 640px) { .wb-hero-body { padding: 1.75rem; } }

/* bloque de fecha reutilizable */
.wb-date {
  flex: none;
  width: 62px; padding: 0.5rem 0;
  display: flex; flex-direction: column; align-items: center;
  border-radius: 14px;
  background: var(--ink-50);
  border: 1px solid var(--ink-200);
  line-height: 1.1;
}
.wb-date .d { font-family: "Manrope", sans-serif; font-weight: 800; font-size: 1.35rem; color: var(--ink-900); letter-spacing: -0.03em; }
.wb-date .m { font-size: 0.62rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--ink-500); margin-top: 2px; }

/* tarjeta de sesión (próximas y bajo demanda) */
.wb-card {
  position: relative;
  display: flex; flex-direction: column;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 22px;
  padding: 1.5rem;
  transition: transform 0.35s var(--ease-out-expo), border-color 0.35s ease, box-shadow 0.35s var(--ease-out-expo);
}
.wb-card:hover { transform: translateY(-4px); border-color: var(--ink-300); box-shadow: 0 26px 50px -30px rgba(10,10,11,0.3); }
.wb-card-head { display: flex; align-items: flex-start; gap: 1rem; margin-bottom: 1.1rem; }
.wb-card h3 {
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 1.02rem; line-height: 1.32;
  letter-spacing: -0.015em; color: var(--ink-900);
  margin-bottom: 0.45rem; text-wrap: balance;
}
.wb-card p { font-size: 0.84rem; color: var(--ink-500); line-height: 1.6; flex: 1; }
.wb-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.4rem 0.85rem;
  margin-top: 1.2rem; padding-top: 0.95rem;
  border-top: 1px solid var(--ink-100);
  font-size: 0.74rem; color: var(--ink-500);
}
.wb-meta span { display: inline-flex; align-items: center; gap: 0.35rem; }
.wb-meta svg { color: var(--brand-blue); flex: none; }
.wb-topic {
  display: inline-block;
  font-size: 0.64rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em;
  padding: 0.28rem 0.65rem; border-radius: var(--r-pill);
  background: var(--ink-100); color: var(--ink-500);
  margin-bottom: 0.7rem;
}
.wb-topic.legal { background: rgba(58,165,190,0.1); color: #2A8CA0; }
.wb-topic.producto { background: rgba(178,105,172,0.1); color: #9C4F95; }
.wb-topic.rrhh { background: rgba(86,197,181,0.12); color: #2A9A8C; }
/* miniatura con botón de play para las sesiones grabadas */
.wb-thumb {
  position: relative; display: block;
  aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: 16px; margin: -0.25rem -0.25rem 1.1rem;
  background: var(--ink-100);
}
.wb-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.6s var(--ease-out-expo); }
.wb-card:hover .wb-thumb img { transform: scale(1.05); }
.wb-play {
  position: absolute; inset: 0; margin: auto;
  width: 48px; height: 48px; border-radius: 50%;
  display: grid; place-items: center;
  background: rgba(255,255,255,0.92);
  box-shadow: 0 8px 24px -8px rgba(10,10,11,0.5);
  color: var(--ink-900);
  transition: transform 0.3s var(--ease-out-back), background-color 0.3s ease;
}
.wb-card:hover .wb-play { transform: scale(1.1); background: white; }
.wb-duration {
  position: absolute; right: 0.6rem; bottom: 0.6rem;
  padding: 0.2rem 0.5rem; border-radius: 8px;
  background: rgba(10,10,11,0.72);
  color: white; font-size: 0.68rem; font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* ============================================================
   HERRAMIENTAS Y DESCARGABLES
   ============================================================ */
.dl-card {
  position: relative;
  display: flex; flex-direction: column;
  background: white;
  border: 1px solid var(--ink-200);
  border-radius: 22px;
  padding: 1.6rem;
  transition: transform 0.35s var(--ease-out-expo), border-color 0.35s ease, box-shadow 0.35s var(--ease-out-expo);
}
.dl-card:hover { transform: translateY(-4px); border-color: var(--ink-300); box-shadow: 0 26px 50px -30px rgba(10,10,11,0.3); }
.dl-card-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1.15rem; }
.dl-ic {
  width: 46px; height: 46px; flex: none;
  border-radius: 14px; display: grid; place-items: center;
  color: var(--ic, var(--brand-blue));
  background: color-mix(in srgb, var(--ic, #3AA5BE) 12%, white);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ic, #3AA5BE) 20%, transparent);
}
.dl-format {
  font-family: "Inter", sans-serif;
  font-size: 0.62rem; font-weight: 500; letter-spacing: 0.1em;
  padding: 0.25rem 0.55rem; border-radius: 8px;
  background: var(--ink-100); color: var(--ink-500);
  text-transform: uppercase;
}
.dl-card h3 {
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 1.02rem; line-height: 1.32;
  letter-spacing: -0.015em; color: var(--ink-900);
  margin-bottom: 0.45rem; text-wrap: balance;
}
.dl-card p { font-size: 0.84rem; color: var(--ink-500); line-height: 1.6; flex: 1; }
.dl-link {
  display: inline-flex; align-items: center; gap: 0.45rem;
  margin-top: 1.25rem; padding-top: 0.95rem;
  border-top: 1px solid var(--ink-100);
  font-size: 0.82rem; font-weight: 600; color: var(--ink-900);
  transition: gap 0.25s ease, color 0.25s ease;
}
.dl-card:hover .dl-link { gap: 0.7rem; color: var(--brand-violet); }
.dl-link svg { flex: none; }

/* calculadora interactiva */
.calc {
  background: white; border: 1px solid var(--ink-200);
  border-radius: 26px; padding: 2rem;
  box-shadow: 0 30px 60px -40px rgba(10,10,11,0.28);
}
.calc-grid { display: grid; gap: 1.1rem; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.calc-field label {
  display: block; font-size: 0.74rem; font-weight: 600;
  color: var(--ink-500); margin-bottom: 0.4rem;
}
.calc-field input, .calc-field select {
  width: 100%; padding: 0.7rem 0.9rem;
  border: 1px solid var(--ink-200); border-radius: 12px;
  background: var(--ink-50);
  font-size: 0.92rem; color: var(--ink-900);
  font-variant-numeric: tabular-nums;
  transition: border-color 0.2s ease, background-color 0.2s ease;
}
.calc-field input:focus, .calc-field select:focus {
  outline: none; border-color: var(--brand-blue); background: white;
}
.calc-out {
  margin-top: 1.6rem; padding-top: 1.5rem;
  border-top: 1px dashed var(--ink-200);
  display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
}
.calc-out .co-item { text-align: left; }
.calc-out .co-label { font-size: 0.72rem; font-weight: 600; color: var(--ink-500); margin-bottom: 0.3rem; }
.calc-out .co-value {
  font-family: "Manrope", sans-serif; font-weight: 800;
  font-size: clamp(1.5rem, 3.5vw, 2rem); letter-spacing: -0.03em; line-height: 1;
  font-variant-numeric: tabular-nums;
}
.calc-note { font-size: 0.74rem; color: var(--ink-400); margin-top: 1.25rem; line-height: 1.55; }

/* compare table */
.compare {
  width: 100%; border-collapse: separate; border-spacing: 0;
  font-size: 0.92rem;
}
.compare th, .compare td {
  padding: 16px 18px;
  text-align: left;
  border-bottom: 1px solid var(--ink-200);
}
.compare th {
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 0.85rem;
  color: var(--ink-500);
  text-transform: uppercase; letter-spacing: 0.12em;
  background: var(--ink-50);
  border-bottom: 1px solid var(--ink-200);
}
.compare td.feat { color: var(--ink-700); }
.compare td.center { text-align: center; }
.compare .check { display: inline-flex; width: 22px; height: 22px; border-radius: 50%; background: var(--ink-900); color: white; align-items: center; justify-content: center; font-size: 0.7rem; }
.compare .check.brand { background: var(--brand-gradient); }
.compare .dash-c { color: var(--ink-300); }
.compare tr.section-row td { background: var(--ink-50); font-weight: 700; color: var(--ink-900); font-family: "Manrope", sans-serif; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.12em; }

/* form */
.field { display: flex; flex-direction: column; gap: 0.4rem; }
.field label { font-size: 0.78rem; font-weight: 600; color: var(--ink-700); text-transform: uppercase; letter-spacing: 0.08em; }
.field input, .field select, .field textarea {
  font: inherit;
  padding: 0.85rem 1rem;
  border: 1px solid var(--ink-200);
  border-radius: 14px;
  background: white;
  color: var(--ink-900);
  transition: border-color 0.3s ease, box-shadow 0.3s ease;
  font-size: 0.95rem;
}
.field input:focus, .field select:focus, .field textarea:focus {
  outline: none;
  border-color: var(--ink-900);
  box-shadow: 0 0 0 4px rgba(58,165,190,0.12);
}
.field textarea { min-height: 120px; resize: vertical; }

/* ==== hamburger + mobile menu ==== */
.nav-burger {
  display: none;
  flex-direction: column; justify-content: center;
  gap: 4px;
  width: 40px; height: 40px;
  padding: 0 9px;
  border: 1px solid var(--ink-200);
  border-radius: 12px;
  background: white;
  cursor: pointer;
}
.nav-burger span {
  display: block; height: 2px; width: 100%;
  background: var(--ink-900); border-radius: 2px;
  transition: transform 0.35s var(--ease-out-expo), opacity 0.25s ease;
}
.nav-burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.nav-burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

.mobile-menu {
  position: fixed;
  top: 88px; left: 12px; right: 12px;
  z-index: 45;
  max-height: calc(100vh - 104px);
  overflow-y: auto;
  background: rgba(255,255,255,0.98);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  backdrop-filter: blur(18px) saturate(140%);
  border: 1px solid var(--ink-200);
  border-radius: 22px;
  box-shadow: 0 30px 60px -24px rgba(10,10,11,0.22);
  padding: 0.9rem 1rem 1.1rem;
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity 0.3s var(--ease-out-expo), transform 0.35s var(--ease-out-expo);
}
.mobile-menu[hidden] { display: none; }
.mobile-menu.open { opacity: 1; transform: translateY(0); }
body.menu-open { overflow: hidden; }

.mobile-nav { display: flex; flex-direction: column; }
.m-link,
.m-acc-head {
  display: flex; align-items: center; justify-content: space-between;
  width: 100%;
  padding: 0.85rem 0.6rem;
  font-family: inherit; font-size: 1rem; font-weight: 600;
  color: var(--ink-900);
  text-decoration: none;
  background: none; border: none; cursor: pointer;
  border-bottom: 1px solid var(--ink-100);
  text-align: left;
}
.m-caret { transition: transform 0.3s ease; opacity: 0.5; }
.m-acc-head[aria-expanded="true"] .m-caret { transform: rotate(180deg); }
.m-acc-body {
  max-height: 0; overflow: hidden;
  transition: max-height 0.4s var(--ease-out-expo);
}
/* 640px se quedaba corto: el panel «Producto» son 19 enlaces y pasa de 900px, asi que se
   recortaban los ultimos sin que nada lo indicara. Con los antetitulos crece un poco mas.
   Es un tope para la transicion, no una altura real: sobrado no molesta. */
.m-acc-head[aria-expanded="true"] + .m-acc-body { max-height: 1200px; }

/* El antetitulo de cada columna, tambien en movil: alineado con los enlaces y mas
   apretado que en escritorio, que aqui va dentro de un acordeon. */
.m-acc-body .mm-eyebrow {
  padding: 0.75rem 0.6rem 0 1.1rem;
  margin-bottom: 0.15rem;
  font-size: 0.66rem;
}
.m-acc-body .mm-eyebrow:first-child { padding-top: 1rem; }
.m-acc-body a {
  display: block;
  padding: 0.6rem 0.6rem 0.6rem 1.1rem;
  font-size: 0.92rem; font-weight: 500;
  color: var(--ink-500);
  text-decoration: none;
}
.m-acc-body a:active,
.m-acc-body a:hover { color: var(--brand-violet); }
.m-acc-body a:first-child { padding-top: 0.5rem; }
.m-acc-body a:last-child { padding-bottom: 0.9rem; }

.mobile-menu-cta {
  display: flex; flex-direction: column; gap: 0.6rem;
  margin-top: 1.1rem;
}

/* mobile */
@media (max-width: 900px) {
  .header-inner { gap: 0.5rem; padding: 0.6rem 0.75rem 0.6rem 1rem;         margin: 0 0.5rem;}
  .nav-links { display: none !important; }
  .nav-burger { display: flex !important; }
  .nav-demo-btn { display: none !important; }
  .tier.featured { transform: none; }
  .tier.featured:hover { transform: translateY(-6px); }
  .dash-body { grid-template-columns: 1fr; }
  .dash-side { display: none; }
}
@media (min-width: 901px) {
  .mobile-menu { display: none !important; }
}

/* ---- blog ---- */
.blog-filter {
  display: inline-flex; align-items: center;
  padding: 0.4rem 1rem;
  border-radius: var(--r-pill);
  border: 1px solid var(--ink-200);
  background: white;
  font-size: 0.8rem; font-weight: 600;
  color: var(--ink-500);
  cursor: pointer;
  transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease;
}
.blog-filter:hover, .blog-filter.active {
  background: var(--ink-900); color: white; border-color: var(--ink-900);
}
/* En movil se tienen que ver las seis categorias sin scroll: se quedan en varias filas
   (flex-wrap, como por defecto), solo un poco mas apretadas para que no ocupen tanto alto. */
@media (max-width: 640px) {
  .blog-filtros { gap: 0.5rem; }
  .blog-filter { padding: 0.35rem 0.85rem; font-size: 0.78rem; }
}

/* Sin max-width aqui a proposito: el ancho de columna lo decide cada bloque (max-w-4xl /
   max-w-5xl + mx-auto, ver seccionTextoRico y compania). Un 68ch aqui los estrechaba a todos
   por debajo del ancho para el que estan maquetados, sin que se notara en movil —ya iba mas
   estrecho que eso— pero sí en tablet/escritorio. */
.article-body h2 { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.5rem; letter-spacing: -0.02em; color: var(--ink-900); margin: 2.5rem 0 1rem; }
.article-body h3 { font-family: "Manrope", sans-serif; font-weight: 700; font-size: 1.15rem; letter-spacing: -0.01em; color: var(--ink-900); margin: 2rem 0 0.75rem; }
.article-body p { font-size: 1rem; color: var(--ink-700); line-height: 1.75; margin-bottom: 1.25rem; }
.article-body ul, .article-body ol { padding-left: 1.5rem; margin-bottom: 1.25rem; color: var(--ink-700); font-size: 1rem; line-height: 1.75; }
.article-body li { margin-bottom: 0.5rem; }
.article-body strong { color: var(--ink-900); font-weight: 600; }
.article-body a { color: var(--brand-blue); text-decoration: underline; text-underline-offset: 3px; }
.article-body a:hover { color: var(--brand-violet); }
/* El cuerpo del articulo es un Block List: cada bloque de texto viene en su propio
   .rich-text, y .secText (mas abajo en la hoja, misma especificidad) le gana a estas reglas
   y deja 0.75rem de margen en vez de los de aqui, apiñando titulos y parrafos. Repetidas con
   .rich-text de por medio se ganan esa pelea. */
.article-body .rich-text h2 { margin: 2.5rem 0 1rem; }
.article-body .rich-text h3 { margin: 2rem 0 0.75rem; }
.article-body .rich-text p { margin-bottom: 1.25rem; }
.article-body .rich-text ul, .article-body .rich-text ol { margin-bottom: 1.25rem; }
/* Las imagenes sueltas que se pegan dentro del texto (capturas, mockups) salian a bordes
   vivos y pegadas al parrafo de al lado: el mismo radio que la portada del articulo y aire
   alrededor para que se lean como una imagen aparte y no como parte del parrafo. */
.article-body .rich-text img { border-radius: 1.5rem; margin-block: 1.5rem; max-width: 100%; height: auto; }

/* --- caso de éxito ------------------------------------------------------------------------
   La página de un caso necesita dos piezas que una guía o una plantilla no tienen: un
   recorrido para saltar entre el reto, la solución y el resultado, y una forma de destacar lo
   que dice el cliente. */

/* El cuerpo del caso: el recorrido a la izquierda y el texto a la derecha.
   Va como regla propia y no con utilidades porque la columna del índice es de ancho fijo y
   la del texto elástica, y esa combinación no está en la hoja compilada. */
.caso-cuerpo { display: block; }
@media (min-width: 1024px) {
  .caso-cuerpo {
    display: grid;
    grid-template-columns: 250px minmax(0, 1fr);
    gap: 4.5rem;
  }
}
/* El índice se queda a la vista mientras se lee.
   La columna que lo contiene NO lleva align-items: start. Con «start» encogía a la altura de
   su contenido —321px medidos— y entonces el sticky no tiene por donde moverse: se va con la
   página como si fuera estático. Estirada a lo alto de la fila, el índice recorre todo el
   artículo pegado arriba, que es lo que se busca. */
.caso-recorrido { position: sticky; top: 7rem; }

/* ---- El recorrido del caso ---------------------------------------------------------------
   Mismo marcado y mismo guion que el índice del blog: /js/blog.js marca con aria-current el
   apartado que está en pantalla y escribe el avance en --avance. Lo que cambia es la piel.

   En una entrada de blog el índice es un accesorio en una tarjeta; en un caso de éxito es la
   pieza que acompaña toda la lectura, y se le da forma de recorrido: un raíl con los hitos
   numerados, apagados los que no tocan y encendido con el degradado de marca el que se está
   leyendo.

   Todo cuelga de .caso-recorrido a propósito, para que el índice del blog no se entere.
   ------------------------------------------------------------------------------------------ */
.caso-recorrido .toc { background: transparent; border: 0; box-shadow: none; padding: 0; }
.caso-recorrido .toc-title { font-size: 0.7rem; color: var(--ink-900); margin-bottom: 1.1rem; }

/* El raíl y los hitos comparten caja: la barra de avance se superpone al raíl apagado, y los
   números van encima de los dos. */
.recorrido-pista { position: relative; }
/* Arranca y termina en el centro del primer y del último hito —no en el borde de la caja—,
   que si no asoma por los dos extremos. 1.1rem = 0.42rem de relleno del enlace + 14px de
   medio hito. */
.recorrido-pista::before {
  content: ""; position: absolute; left: 13px; top: 1.1rem; bottom: 1.1rem;
  width: 2px; border-radius: 999px; background: var(--ink-100);
}
.caso-recorrido .toc-progreso {
  position: absolute; left: 13px; top: 1.1rem; bottom: 1.1rem;
  width: 2px; height: auto; margin: 0; background: transparent;
}
.caso-recorrido .toc-progreso > span {
  background: linear-gradient(180deg, #b269ac, #3AA5BE 55%, #56c5b5);
  transform: scaleY(var(--avance, 0)); transform-origin: top;
}
/* La lista va encima del raíl: los hitos son discos opacos que lo tapan a su paso. */
.caso-recorrido .toc-list { position: relative; z-index: 1; max-height: calc(100vh - 14rem); }
.caso-recorrido .toc-list a {
  grid-template-columns: 28px minmax(0, 1fr);
  gap: 0.85rem; align-items: center;
  padding: 0.42rem 0; font-size: 0.85rem;
}
/* El hito. El fondo blanco no es decorativo: es lo que corta el raíl a su altura. */
.caso-recorrido .toc-list a::before {
  width: 28px; height: 28px; border-radius: 999px;
  display: grid; place-items: center;
  background: #fff; box-shadow: inset 0 0 0 2px var(--ink-200);
  color: var(--ink-400); font-size: 0.68rem;
  transition: color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
}
.caso-recorrido .toc-list a:hover::before { box-shadow: inset 0 0 0 2px var(--ink-300); color: var(--ink-600); }
/* El que se está leyendo: encendido y con un halo que lo separa del raíl. */
.caso-recorrido .toc-list a[aria-current="true"] { color: var(--ink-900); font-weight: 700; }
.caso-recorrido .toc-list a[aria-current="true"]::before {
  background: var(--brand-gradient); color: #fff;
  box-shadow: 0 0 0 4px rgba(58, 165, 190, 0.14);
}

/* El nombre del cliente sobre el titular del caso, donde antes iba la etiqueta del tipo.
   Con icono al lado: sin la pastilla de «Caso de éxito» encima, el rótulo se quedaba solo y
   parecía un texto suelto; el icono le devuelve el peso de una etiqueta sin repetir palabras. */
.caso-empresa {
  display: inline-flex; align-items: center; gap: 0.45rem;
  font-family: "Manrope", sans-serif;
  font-weight: 800; font-size: 0.72rem;
  text-transform: uppercase; letter-spacing: 0.14em;
  color: var(--brand-blue-texto);
}
/* Sin encoger: con flex, un nombre largo aplastaría el icono en vez de partirse. */
.caso-empresa svg { width: 15px; height: 15px; flex: none; }

/* El cuerpo del articulo (blog, caso, recurso) ya va dentro de una seccion con su propio
   py-16/20: cada bloque, con su .sec, sumaba encima su propio relleno vertical completo, y
   entre la cabecera y el primer parrafo —o entre un bloque y el siguiente— se acumulaban
   100px o mas de aire. Aqui dentro el espaciado lo pone el margen entre bloques, no el
   padding de cada uno. */
.cuerpo-entrada .sec { padding-block: 0; }
.cuerpo-entrada .sec + .sec { margin-top: 2rem; }

/* Dentro del caso, cada apartado se separa del anterior con aire y un filete finísimo: el
   texto es largo y sin esa pausa se lee como un muro. El primero no lleva filete. */
.caso-texto > .sec { padding-block: 0; }
.caso-texto > .sec + .sec { margin-top: 2.5rem; padding-top: 2.5rem; border-top: 1px solid var(--ink-200); }

/* Jerarquía de titulares dentro del caso. Sin esto, el título del apartado y los subtítulos
   de dentro del texto salían del mismo tamaño —los dos son h2 y .article-body h2 gana a las
   utilidades del bloque—, así que el texto se leía como una lista de encabezados iguales y no
   se veía dónde empezaba cada apartado. */
.caso-texto > .sec > div > h2 {
  font-size: 1.95rem; line-height: 1.15; letter-spacing: -0.025em;
  margin-bottom: 1.5rem;
}
/* El primero de cada apartado no necesita aire arriba: ya lo pone la separación del apartado. */
.caso-texto > .sec > div > h2:first-child { margin-top: 0; }
/* Los subtítulos de dentro del texto, un escalón por debajo y con más aire encima que debajo,
   para que se peguen a lo que introducen. */
.caso-texto .rich-text h2 { font-size: 1.22rem; margin: 2.25rem 0 0.6rem; }

/* Las listas del caso recuperan su viñeta. El reset de Tailwind pone list-style: none en
   todos los ul y ol, así que una lista de puntos se veía como párrafos sangrados y no como
   una lista. El punto va en azul de marca, que es lo que ya hacen las listas del sitio. */
.caso-texto .rich-text ul { list-style: disc; }
.caso-texto .rich-text ol { list-style: decimal; }
.caso-texto .rich-text li { padding-left: 0.25rem; }
.caso-texto .rich-text li::marker { color: var(--brand-blue-texto); }
/* Los bloques de dentro traen su propio ancho máximo y su relleno lateral, que aquí sobran:
   la columna ya los encuadra. */
.caso-texto > .sec > div { max-width: none; padding-inline: 0; margin-inline: 0; }
/* Y su fondo propio tampoco pinta nada dentro de una columna de lectura. */
.caso-texto > .sec { background: transparent; }


/* Índice del caso. Es una lista de anclas a los apartados del cuerpo; se genera a partir de
   los títulos de los bloques, así que no hay que mantenerlo a mano. */
.caso-indice {
  border-block: 1px solid var(--ink-200);
  padding-block: 1.1rem;
  margin-block: 0 2.5rem;
}
.caso-indice-t {
  font-size: 0.7rem; font-weight: 700; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ink-400);
  margin-bottom: 0.75rem;
}
.caso-indice ol { display: flex; flex-wrap: wrap; gap: 0.5rem 1.75rem; list-style: none; padding: 0; margin: 0; counter-reset: caso; }
.caso-indice li { counter-increment: caso; }
.caso-indice a {
  font-family: "Manrope", sans-serif; font-weight: 700; font-size: 0.95rem;
  color: var(--ink-900); text-decoration: none;
  display: inline-flex; align-items: baseline; gap: 0.45rem;
}
.caso-indice a::before {
  content: counter(caso, decimal-leading-zero);
  font-size: 0.78rem; color: var(--brand-blue-texto);
}
.caso-indice a:hover { color: var(--brand-blue-texto); }

/* Lo que dice el cliente. Sin comillas dibujadas: la tipografía ya es grande y el filete de
   marca a la izquierda basta para separarla del texto corrido. */
.caso-cita {
  margin: 2.5rem 0;
  padding-left: 1.6rem;
  border-left: 4px solid transparent;
  border-image: var(--brand-gradient) 1;
}
.caso-cita p {
  font-family: "Manrope", sans-serif; font-weight: 700;
  font-size: 1.3rem; line-height: 1.5; letter-spacing: -0.015em;
  color: var(--ink-900); margin-bottom: 0.9rem;
}
.caso-cita footer { font-size: 0.9rem; color: var(--ink-500); }
.caso-cita footer b { color: var(--ink-900); font-weight: 700; }

/* Cada apartado del cuerpo se separa del anterior, que si no el caso se lee como un muro. */
.caso-apartado + .caso-apartado { margin-top: 3.5rem; }
/* El ancla queda por debajo de la cabecera fija al saltar desde el índice. */
.caso-apartado { scroll-margin-top: 7rem; }

.article-callout {
  border-left: 3px solid var(--brand-blue);
  background: rgba(58,165,190,0.06);
  border-radius: 0 12px 12px 0;
  padding: 1.25rem 1.5rem;
  margin: 2rem 0;
}
.article-callout p { margin-bottom: 0; color: var(--ink-700); }

/* Indice del articulo (lateral del detalle de entrada).
   El apartado en pantalla se marca con aria-current, que ya es el estado accesible, en
   lugar de una clase paralela que habria que mantener sincronizada. Lo pone /js/blog.js. */
.toc {
  background: #fff;
  border: 1px solid var(--ink-200);
  border-radius: 18px;
  padding: 1.1rem 1.15rem 0.9rem;
  box-shadow: 0 1px 2px rgba(10, 10, 11, 0.04);
}
.toc-title {
  margin-bottom: 0.7rem;
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 0.68rem;
  text-transform: uppercase; letter-spacing: 0.13em;
  color: var(--ink-500);
}

/* Cuanto se lleva leido del articulo. */
.toc-progreso {
  height: 3px; margin-bottom: 0.85rem;
  border-radius: 999px; overflow: hidden;
  background: var(--ink-100);
}
.toc-progreso > span {
  display: block; height: 100%; width: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, #3AA5BE, #b269ac);
  /* El avance lo escribe /js/blog.js en --avance, no en transform. Va así porque el mismo
     guion alimenta dos barras: esta, horizontal, y el raíl vertical del recorrido de un caso,
     que necesita scaleY. Con el transform escrito desde el guion solo cabía una de las dos. */
  transform: scaleX(var(--avance, 0)); transform-origin: left;
  transition: transform 0.15s linear;
}

/* Lista con su propio scroll: hay entradas con quince apartados y el indice se comia la
   columna entera, dejando el resto del lateral fuera de la pantalla. */
.toc-list {
  counter-reset: toc;
  list-style: none; margin: 0; padding: 0;
  max-height: calc(100vh - 15rem);
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--ink-200) transparent;
}
.toc-list::-webkit-scrollbar { width: 4px; }
.toc-list::-webkit-scrollbar-thumb { background: var(--ink-200); border-radius: 999px; }
.toc-list li { counter-increment: toc; }
.toc-list a {
  display: grid; grid-template-columns: 1.4rem 1fr;
  align-items: baseline;
  padding: 0.32rem 0;
  font-size: 0.82rem; line-height: 1.45;
  color: var(--ink-500); text-decoration: none;
  transition: color 0.2s ease;
}
.toc-list a::before {
  content: counter(toc, decimal-leading-zero);
  font-size: 0.66rem; font-weight: 700;
  color: var(--ink-300);
  font-variant-numeric: tabular-nums;
  transition: color 0.2s ease;
}
.toc-list a:hover { color: var(--ink-900); }
.toc-list a[aria-current="true"] { color: var(--ink-900); font-weight: 600; }
.toc-list a[aria-current="true"]::before { color: var(--brand-blue); }
.toc-list a:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 2px; border-radius: 4px; }

/* article tag pills */
.article-tag {
  display: inline-flex; align-items: center;
  font-size: 0.7rem; font-weight: 600;
  padding: 3px 10px; border-radius: 999px;
  background: rgba(58,165,190,0.08);
  color: var(--brand-blue);
  border: 1px solid rgba(58,165,190,0.22);
  text-decoration: none;
  transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.article-tag:hover { background: var(--brand-blue); color: white; border-color: var(--brand-blue); }

/* lucide icon size helper */
[data-lucide] { display: inline-block; }

/* secuencia de screens — blocklist/Components/seccionPantallas
   Varias capturas dentro del marco de navegador, encadenadas en bucle. Es el efecto que se
   pediria con un GIF, pero con imagenes sueltas: tres WebP de unos 38 KB frente a los cientos
   de KB de un GIF de este tamano, sin la paleta de 256 colores y nitidas en pantalla retina.

   El gesto: cada pantalla SE ABRE encima de la anterior —entra desde un poco mas abajo y algo
   encogida, y se posa a tamano completo—, no es un fundido cruzado. La diferencia importa:
   un fundido entre imagenes del mismo tamano se lee como diapositivas, y con los puntos de
   posicion debajo parecia ademas un carrusel que se podia manejar. Aqui no hay nada que
   manejar, es un proceso que avanza solo, asi que los puntos se han quitado y el movimiento
   dice hacia donde va. Es el gesto con el que abren las ventanas los dos sistemas operativos
   de escritorio: crecer un poco y aparecer.

   Como se sostiene: la pantalla que sale NO se desvanece, se queda debajo a opacidad plena y
   la nueva la tapa. Por eso hace falta z-index —el orden del DOM valdria para 1→2→3, pero al
   volver a empezar la 1 tiene que abrirse sobre la 3, que va despues en el marcado—. Las
   imagenes son items de rejilla, asi que z-index les aplica sin position.
   La que ya no se ve vuelve a su estado de partida en el 92-95 % del ciclo, escondida detras
   de la que este abierta en ese momento; con dos, tres o cuatro screens siempre hay una
   tapando, asi que el reajuste no se ve.

   Las imagenes van apiladas en la misma celda de una rejilla de una casilla, no en absolute:
   asi la altura del bloque la sigue marcando la imagen y no hay que fijarla a mano.

   El ciclo se reparte con animation-delay, y cada juego de fotogramas —dos, tres o cuatro—
   tiene el suyo porque en CSS no se puede calcular un porcentaje de keyframe. La entrada dura
   0,6 s en los tres, que es el porcentaje que cambia entre ellos. */
.screens { display: grid; }
.screens > img {
  grid-area: 1 / 1;
  width: 100%; height: auto; display: block;
  opacity: 0;
  /* Un poco por debajo del centro: la pantalla parece apoyarse, no salir disparada. */
  transform-origin: 50% 62%;
  animation-duration: var(--cycle, 12s);
  animation-iteration-count: infinite;
  animation-timing-function: linear;
}
.screens.de-2 > img { animation-name: pantallas2; }
.screens.de-3 > img { animation-name: pantallas3; }
.screens.de-4 > img { animation-name: pantallas4; }

/* La primera se queda visible si el navegador no anima: sin esto la caja saldria vacia. */
.screens > img:first-child { opacity: 1; }
.screens > img { animation-fill-mode: none; }

/* transform: none repetido en el fotograma del 92 % no sobra: una propiedad que no aparece en
   un fotograma se interpola entre los dos que si la traen, y sin el la pantalla iria
   encogiendose despacio durante todo el rato que esta quieta. */
@keyframes pantallas2 {
  0%       { opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 3; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); }
  7.5%     { opacity: 1; transform: none; z-index: 3; animation-timing-function: linear; }
  49.5%    { z-index: 3; }
  49.6%    { z-index: 1; }
  92%      { opacity: 1; transform: none; }
  95%, 100%{ opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 1; }
}
@keyframes pantallas3 {
  0%       { opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 3; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); }
  5%       { opacity: 1; transform: none; z-index: 3; animation-timing-function: linear; }
  33.2%    { z-index: 3; }
  33.3%    { z-index: 1; }
  92%      { opacity: 1; transform: none; }
  95%, 100%{ opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 1; }
}
@keyframes pantallas4 {
  0%       { opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 3; animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1); }
  3.75%    { opacity: 1; transform: none; z-index: 3; animation-timing-function: linear; }
  24.8%    { z-index: 3; }
  24.9%    { z-index: 1; }
  92%      { opacity: 1; transform: none; }
  95%, 100%{ opacity: 0; transform: translateY(2.8%) scale(0.945); z-index: 1; }
}

/* Quien pide menos movimiento ve solo la primera pantalla, quieta y a tamano completo. */
@media (prefers-reduced-motion: reduce) {
  .screens > img { animation: none; opacity: 0; transform: none; }
  .screens > img:first-child { opacity: 1; }
}

/* resenas embebidas — el widget de un servicio externo (Elfsight, Google Reviews...) que se
   pega como codigo en el backoffice. Solo se le reserva sitio: el aspecto lo pone el
   proveedor y no conviene pelearse con el desde aqui.
   El alto minimo evita que la pagina de un salto cuando el widget termina de cargar. */
.resenas-embebidas { min-height: 320px; }
.resenas-embebidas > * { max-width: 100%; }


/* La pastilla del antes/despues. Es la misma pieza que abre las tarjetas de «Imagen al pie»
   —texto corto, redonda, en el tono de su tarjeta— y sustituye al cuadro de icono con el
   titulo al lado que habia aqui: el cliente pidio seguir esa referencia, y alli la tarjeta
   arranca con la pastilla y no con un icono. */
.ad-pastilla {
  /* .benefit-card es un flex en columna: sin esto la pastilla se estira a todo el ancho
     de la tarjeta en vez de medir lo que mide su texto. */
  display: inline-block;
  align-self: flex-start;
  inline-size: fit-content;
  font-size: 0.78rem; font-weight: 600; letter-spacing: -0.005em;
  padding: 0.36rem 0.8rem;
  border-radius: var(--r-pill, 999px);
  background: var(--ad-pastilla);
  color: var(--ad-tinta);
}
/* La lista arranca despues de la pastilla con el mismo aire que en la referencia. */
.antes-despues .ad-pastilla + .profile-list { margin-block-start: 1.5rem; }
/* ---------------------------------------------------------------- Cifras: panel destacado

   La variante «Panel destacado» del bloque de cifras. A diferencia de los contadores de la
   home —cuatro resultados independientes, sueltos sobre el fondo— aqui las cifras suman una
   sola foto («¿Quién está hoy disponible?»: oficina, teletrabajo, vacaciones, baja), asi que
   se recogen en una tarjeta con filete y se separan entre si con una linea fina en vez de con
   aire. El icono de cada una es lo que permite distinguir el estado sin leer.

   En movil la rejilla baja a dos columnas sola (grid-cols-2 en la plantilla) y el separador
   pasa a horizontal para las de la fila de abajo: se resuelve con un borde por celda y luego
   se quitan los del borde exterior. */
.stats-panel {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  background: #fff;
  border: 1px solid var(--ink-200);
  border-radius: 28px;
  padding: 0;
  overflow: hidden;
  box-shadow: 0 1px 2px rgb(15 23 42 / 0.04);
}


/* El numero de columnas lo fija el bloque, no Tailwind: la hoja compilada solo trae hasta
   grid-cols-4 y el panel de Retail necesita cinco. En movil siempre son dos. */
@media (min-width: 768px) {
  .stats-panel.de-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .stats-panel.de-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .stats-panel.de-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .stats-panel.de-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
}

.stat {
  padding: 2.25rem 1.75rem;
  text-align: center;
  border-inline-start: 1px solid var(--ink-100);
  border-block-start: 1px solid var(--ink-100);
}

/* Sin lineas pegadas al filete de la tarjeta: solo separan celdas entre si. */
.stats-panel > .stat:nth-child(2n + 1) { border-inline-start: 0; }
.stats-panel > .stat:nth-child(-n + 2) { border-block-start: 0; }

@media (min-width: 768px) {
  .stats-panel > .stat { border-block-start: 0; }
  .stats-panel > .stat:nth-child(2n + 1) { border-inline-start: 1px solid var(--ink-100); }
  .stats-panel > .stat:first-child { border-inline-start: 0; }
}


/* Dentro del panel la cifra no necesita el tamano de un titular: compite con las otras tres
   y con el icono, y la seccion ya lleva su propio h2. */
.stat .stat-num { font-size: clamp(1.9rem, 3.4vw, 2.6rem); }


/* ============================================================
   TARJETAS DE COLOR
   ============================================================

   Un solo juego de tonos para todas las rejillas de tarjetas del sitio. Cada tono trae tres
   valores: el fondo de la caja, el de la pastilla y la tinta que va sobre las dos.

   Malva y azul son los dos extremos del degradado de marca, el crema es el neutro calido que
   ya usa el bloque de antes/despues, y el mint y la lavanda cierran el degradado por sus dos
   lados.

   Son CINCO y no cuatro por una razon aritmetica, no estetica: los tonos rotan por posicion y
   las rejillas del sitio salen a 2, 3, 4 o 6 columnas. Con cuatro tonos y cuatro columnas la
   primera columna era siempre malva, la segunda siempre crema... y la rejilla se leia como
   franjas verticales de color. Con cinco, dos tarjetas separadas por 1, 2, 3 o 4 posiciones
   nunca comparten tono, asi que no hay franja ni a 2, ni a 3, ni a 4 columnas —tampoco al
   cambiar de breakpoint, que es donde fallaban los apanos a base de desplazar la fila.

   Todos los pares (tinta, pastilla) y (tinta, caja) estan por encima de 4,8:1. */
.tc-mauve   { --tc-box: #F8EFF7; --tc-pill: #F0DCEE; --tc-ink: #7E3D79; }
.tc-cream   { --tc-box: #FAF5EA; --tc-pill: #F3E6CB; --tc-ink: #805C1D; }
.tc-blue    { --tc-box: #EBF5F8; --tc-pill: #D6EBF1; --tc-ink: #1F6C82; }
.tc-mint    { --tc-box: #EAF7F4; --tc-pill: #D3EDE7; --tc-ink: #1C6154; }
.tc-lavender { --tc-box: #EFF0FB; --tc-pill: #DFE2F5; --tc-ink: #3C4682; }

/* --------------------------------------------------------------------- la tarjeta

   Caja tenida, sin filete y sin sombra: el color ya la separa del fondo. El orden es siempre
   el mismo —pastilla, titulo, texto— y la composicion de UI, cuando la hay, asoma al pie.

   El tono no se fija aqui: lo pone una de las clases de arriba (.tc-mauve y companeras), que
   la seccion va rotando por posicion. */
.tc {
  background: var(--tc-box);
  border-radius: 26px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.tc-body { padding: 2rem; }

/* Con composicion al pie el cuerpo no cierra por abajo: el aire lo pone ya la propia imagen,
   y si se sumaran los dos la tarjeta quedaria descentrada. */
.tc-body.has-media { padding-block-end: 0; }

.tc h3 {
  font-family: "Manrope", sans-serif;
  font-weight: 700; font-size: 1.25rem; line-height: 1.3;
  letter-spacing: -0.02em; color: var(--ink-900);
  margin-block-end: 0.75rem; text-wrap: balance;
}
/* --ink-500 se queda en 4,3-4,4:1 sobre los tintes y no llega al 4,5:1 de WCAG 2.2 AA para
   texto pequeno; --ink-600 da 9,3-9,6:1. */
.tc p { font-size: 0.9375rem; color: var(--ink-600); line-height: 1.65; }
.tc .tc-pill { margin-block-end: 1.25rem; }

/* El punto de «en vivo» va en mint, y sobre la pastilla mint se queda en 1,70:1: practicamente
   no se ve. Dentro de una pastilla toma la tinta del tono, que da 5,90:1 en el peor caso. Es
   decorativo —lo que dice ya lo dice el texto de al lado— pero si esta, tiene que verse. */
.tc-pill .dot-live {
  background: var(--tc-ink);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--tc-ink) 18%, transparent);
}

/* La composicion cabe entera dentro de la tarjeta: son paneles superpuestos sobre fondo
   transparente, asi que el color de la caja se ve a traves y no hace falta recortarla. */
.tc-media { margin-block-start: auto; padding: 2rem 1.5rem 1.5rem; }

/* En la rejilla de cuatro columnas de la portada la tarjeta baja a unos 290 px y la
   composicion se quedaba en 240: los rotulos de los paneles dejaban de leerse. Se aprieta el
   aire lateral, que ademas es redundante —las composiciones ya traen su propio margen
   transparente para que la sombra no se corte contra el borde del lienzo—.
   Es una consulta de contenedor y no de ventana porque la misma tarjeta sale a tres columnas
   en las interiores, donde no hace falta. */
.tc { container-type: inline-size; }
@container (max-width: 340px) {
  .tc-media { padding: 1.5rem 0.5rem 0.85rem; }
}
.tc-media img,
.tc-media video { inline-size: 100%; block-size: auto; display: block; }

/* --------------------------------------------------- piezas comunes a las tres siluetas */

/* La pastilla. Es la misma de «Imagen al pie», que es la referencia aprobada. */
.tc-pill {
  display: inline-flex; align-items: center; gap: 0.4rem;
  align-self: flex-start; inline-size: fit-content;
  padding: 0.35rem 0.75rem;
  border-radius: var(--r-pill);
  font-size: 0.75rem; font-weight: 600; letter-spacing: -0.01em;
  background: var(--tc-pill); color: var(--tc-ink);
}






/* ---------------------------------------------------------------- Perfiles: tres columnas

   La tabla comparativa admite ahora un tercer público. A tres columnas la tarjeta baja a unos
   24rem en max-w-6xl, por debajo del umbral de 26rem al que .profile-card sube el cuerpo de la
   lista, así que no hace falta tocar nada más: la propia consulta de contenedor se encarga.

   Por debajo de 1024px pasan a dos —tres columnas de 24rem no caben en una tablet— y por
   debajo de 768px se apilan. */
@media (min-width: 768px) {
  .perfiles-tres { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
  .perfiles-tres { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}


/* [hidden] tiene que ganar SIEMPRE. Es display:none del navegador, y cualquier display
   propio del componente lo pisa: pasaba con .rec-card (flex) y con .rec-toggle-n
   (inline-grid), que se marcaban como ocultos y se seguian viendo. */
[hidden] { display: none !important; }

/* ============================ centro de recursos ============================
   Listado unificado de guías, plantillas, casos de éxito, webinars, sesiones y
   herramientas. Comparte lenguaje con .card: mismo blanco, mismo borde, mismo radio
   de 22px y el mismo levantamiento al pasar por encima. */
.rec-filtros {
  display: flex; flex-wrap: wrap; gap: 0.5rem;
  margin-bottom: 1.5rem;
}
.rec-chip {
  display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.6rem 1.1rem;
  border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  background: white; color: var(--ink-700);
  font-size: 0.875rem; font-weight: 600; font-family: inherit;
  cursor: pointer;
  transition: border-color 0.2s, color 0.2s, background 0.2s;
}
.rec-chip:hover { border-color: var(--ink-300); color: var(--ink-900); }
.rec-chip.activo {
  background: var(--ink-900); border-color: var(--ink-900); color: white;
}
/* El recuento, como una marca propia y no como texto pegado al nombre. */
.rec-chip-n {
  display: inline-grid; place-items: center;
  min-width: 1.35rem; height: 1.35rem; padding: 0 0.35rem;
  border-radius: var(--r-pill);
  background: var(--ink-100); color: var(--ink-600);
  font-size: 0.6875rem; font-weight: 700; line-height: 1;
  font-variant-numeric: tabular-nums;
}
.rec-chip.activo .rec-chip-n { background: rgba(255, 255, 255, 0.22); color: white; }
/* En las categorías, al ser texto, el número va volado y sin fondo. */
.rec-cat-chip .rec-chip-n {
  min-width: 0; height: auto; padding: 0; margin-left: 0.3rem;
  background: none; color: var(--ink-300);
  font-size: 0.6875rem; vertical-align: super;
}
.rec-cat-chip.activo .rec-chip-n { color: var(--brand-blue); }

.rec-controles {
  display: flex; flex-wrap: wrap; gap: 0.75rem;
  align-items: center;
}
.rec-buscador {
  display: flex; align-items: center; gap: 0.6rem;
  flex: 1 1 18rem; min-width: 0;
  padding: 0.7rem 1.1rem;
  border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  background: white; color: var(--ink-400);
}
.rec-buscador:focus-within { border-color: var(--brand-blue); }
.rec-buscador input {
  flex: 1; min-width: 0;
  border: 0; outline: 0; background: transparent;
  font: inherit; font-size: 0.9375rem; color: var(--ink-900);
}
.rec-buscador input::placeholder { color: var(--ink-300); }
/* La cruz que Chrome pinta en los input[type=search] no encaja con el resto. */
.rec-buscador input::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; }

.rec-categoria select {
  padding: 0.7rem 1.1rem;
  border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  background: white; color: var(--ink-700);
  font: inherit; font-size: 0.9375rem; cursor: pointer;
}
.rec-categoria select:focus { outline: 0; border-color: var(--brand-blue); }


.rec-card {
  /* Imprescindible: el enlace del titulo se estira con un ::after de inset:0, que se
     resuelve contra el ancestro POSICIONADO mas cercano. Sin esto se iba al bloque
     contenedor inicial y cada tarjeta tapaba la pagina entera con un enlace invisible. */
  position: relative;
  display: flex; flex-direction: column;
  background: white; border: 1px solid var(--ink-200);
  border-radius: 22px; overflow: hidden;
  transition: transform 0.5s var(--ease-out-expo), box-shadow 0.5s var(--ease-out-expo);
}
.rec-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); }
.rec-card-img { position: relative; display: block; aspect-ratio: 16 / 9; overflow: hidden; background: var(--ink-50); }
/* Hijo directo, que es la foto del recurso. Como descendiente suelto también alcanzaba al
   logotipo de dentro de la portada generada y lo estiraba a toda la tarjeta. */
.rec-card-img > img { width: 100%; height: 100%; object-fit: cover; }
.rec-card-body { display: flex; flex-direction: column; flex: 1; padding: 1.5rem; }
.rec-card-title {
  font-family: var(--font-display, inherit);
  font-weight: 700; font-size: 1.125rem; line-height: 1.3;
  color: var(--ink-900); margin-top: 0.75rem;
}
.rec-card-text {
  margin-top: 0.6rem; font-size: 0.9375rem; line-height: 1.6;
  color: var(--ink-500);
  /* Tres líneas y corta. Los resúmenes van de una línea a seis y las tarjetas quedaban de
     alturas muy dispares; recortando aquí la rejilla se ordena sola. */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
}
/* El enlace vive en el titulo y se estira sobre toda la tarjeta. El texto del resumen
   queda por debajo, asi que se puede seleccionar sin disparar el enlace. */
.rec-card-liga { color: inherit; }
.rec-card-liga::after { content: ""; position: absolute; inset: 0; z-index: 1; }
.rec-card-liga:focus-visible { outline: none; }
.rec-card:focus-within { outline: 2px solid var(--brand-blue); outline-offset: 3px; }

/* Al pasar por encima, el titulo toma el color principal: es la senal de que la pieza
   entera es pulsable, ahora que no hay boton. */
/* El principal, tal cual. Queda en 2.76:1 sobre blanco, por debajo de AA para un titulo de
   18px en negrita; es una decision de marca tomada a sabiendas. */
.rec-card:hover .rec-card-title { color: var(--brand-blue-texto); }
.rec-card-title { transition: color 0.2s ease; }

/* Marca de que el enlace sale fuera. */
.rec-card-fuera {
  position: absolute; top: 0.75rem; right: 0.75rem; z-index: 2;
  display: grid; place-items: center;
  width: 1.75rem; height: 1.75rem; border-radius: 50%;
  background: rgba(255, 255, 255, 0.9); color: var(--ink-700);
}
.rec-card-fuera svg { width: 0.85rem; height: 0.85rem; }

/* Etiqueta de tipo. Cada uno con su tono, con los mismos textos oscuros que ya se
   comprobaron para contraste en el resto de tarjetas de color. */
.rec-tag {
  align-self: flex-start;
  display: inline-flex; align-items: center;
  padding: 0.25rem 0.7rem; border-radius: var(--r-pill);
  font-size: 0.6875rem; font-weight: 700;
  letter-spacing: 0.08em; text-transform: uppercase;
}
/* Todas iguales, en gris. El color ya lo lleva la portada y decía la categoría; teñir
   además la etiqueta metía un segundo código de color que competía con aquel.
   ink-100 sobre ink-600 da 9.50:1, de sobra para 11px en mayúsculas.
   Las clases por tipo siguen saliendo en el marcado a propósito: no pintan nada hoy, pero
   dejan el gancho por si algún día se quiere distinguir alguna. */
.rec-tag { background: var(--ink-100); color: var(--ink-600); }

.rec-vacio {
  margin-top: 2.5rem; text-align: center;
  font-size: 0.9375rem; color: var(--ink-500);
}

/* Miga de pan del detalle de recurso. */
.rec-miga {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem;
  font-size: 0.8125rem; color: var(--ink-400);
}
.rec-miga a { color: var(--ink-500); }
.rec-miga a:hover { color: var(--ink-900); text-decoration: underline; text-underline-offset: 3px; }
.rec-miga [aria-current] { color: var(--ink-700); }

/* Portada generada de un recurso: color plano + título, como hacen Sesame y Factorial.
   El color lo reparte la posición en la rejilla, no la categoría: media web no tiene
   categoría y acababan todas del mismo color de respaldo.
   Plana, sin degradado, y con el titular en blanco para que se funda con el fondo en lugar
   de quedar estampado encima. */
.rec-portada {
  position: relative; overflow: hidden;
  display: flex; flex-direction: column; justify-content: center;
  gap: 0.6rem; padding: 1.4rem;
  background: var(--p-color);
  /* Cada tono trae su propia tinta, la de su familia. Es lo que hace que el titular se
     integre: no es negro sobre un color, es el mismo color llevado a su extremo oscuro. */
  color: var(--p-ink);
}
/* Los tres colores de --brand-gradient y los dos puntos medios del propio degradado: el que
   cae entre azul y malva, y el que cae entre azul y mint. Salen de promediar los canales de
   sus extremos, así que la familia entera es literalmente el eje de marca muestreado en
   cinco puntos.
   Van en orden de degradado, con cada intermedio entre sus padres. El orden es solo para
   leerlos: el reparto lo hace el id del nodo, así que dos fichas seguidas pueden repetir
   color —se acepta a cambio de que cada recurso conserve el suyo en el detalle—.
   OJO: con estos fondos el titular en blanco se queda entre 1.81:1 y 2.88:1, por debajo del
   3:1 que WCAG pide para texto grande. Es una decisión tomada a conciencia —la portada es
   aria-hidden y el título se repite justo debajo, en negro sobre blanco— y no un descuido:
   si algún día hay que cumplirlo, la salida es bajar los fondos, no aclarar más la tinta. */
.rec-p-mauve      { --p-color: #B269AC; --p-ink: #FFEFFE; --p-shape: rgba(126, 61, 121, 0.10); }
.rec-p-mauve-blue { --p-color: #7687B5; --p-ink: #FFFFFF; --p-shape: rgba(255, 255, 255, 0.10); }
.rec-p-blue       { --p-color: #3AA5BE; --p-ink: #FFFFFF; --p-shape: rgba(255, 255, 255, 0.10); }
.rec-p-blue-mint  { --p-color: #48B5BA; --p-ink: #FFFFFF; --p-shape: rgba(255, 255, 255, 0.10); }
.rec-p-mint       { --p-color: #56C5B5; --p-ink: #FFFFFF; --p-shape: rgba(28, 97, 84, 0.10); }

/* Forma decorativa. En los tonos plenos aclara y en los pastel oscurece —con la tinta de su
   propia familia—: un blanco tenue sobre el crema no se vería. */
.rec-portada-forma {
  position: absolute; inset: 0; width: 100%; height: 100%;
  fill: var(--p-shape);
  pointer-events: none;
}
/* El aro va de trazo: relleno no lo haría hueco sin recurrir a fill-rule. */
.rec-portada-forma [data-aro] {
  fill: none;
  stroke: var(--p-shape);
  stroke-width: 46;
}

/* Sin pastilla y a la misma opacidad que el logotipo: los dos son firmas, no información.
   A este contraste no cumple el 4.5:1 que pediría un texto de 11px, y es deliberado: la
   portada entera es aria-hidden y el tipo se repite justo debajo, en .rec-tag, a contraste
   pleno. Aquí es un eco visual del dato, no el dato. */
.rec-portada-et {
  align-self: flex-start; position: relative; z-index: 1;
  opacity: 0.55;
  font-size: 0.6875rem; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase;
}
.rec-portada-tit {
  position: relative; z-index: 1;
  /* Menos presencia: es lo que lo integra en el color en vez de dejarlo estampado encima.
     Los seis tonos de arriba están elegidos para este 0.80 exacto, así que bajarlo más sin
     tocarlos saca al azul y al mint del 3:1 que pide WCAG para texto grande. */
  opacity: 0.8;
  font-family: var(--font-display, inherit);
  font-weight: 700; font-size: 1.375rem; line-height: 1.2;
  text-wrap: balance;
}
/* Firma de marca. Abajo a la derecha y no arriba porque esa esquina ya la ocupa el
   distintivo de «se abre en otra pestaña» de las fichas externas. Discreta: es una firma,
   no un reclamo. */
.rec-cover-mark {
  position: absolute; right: 1.1rem; bottom: 1rem; z-index: 1;
  display: block; height: 11px; width: auto;
  /* En blanco, sobre pastel: queda como una marca al agua. El SVG viene en negro y no hay
     versión clara, así que se invierte —igual que en el pie de página—. A opacidad plena,
     porque sobre estos fondos el blanco ronda 1.25:1 y rebajarlo lo haría desaparecer. */
  filter: invert(1);
  opacity: 1;
  pointer-events: none;
}

.rec-portada-img { display: block; width: 100%; height: 100%; object-fit: cover; }

/* En la ficha la portada manda más: cabe más texto y se le da aire. */
.rec-portada-grande .rec-portada { padding: 2rem; }
.rec-portada-grande .rec-portada-tit { font-size: 2rem; }
.rec-portada-grande .rec-cover-mark { height: 15px; right: 1.6rem; bottom: 1.4rem; }

/* Categorías como pastillas. Se diferencian de los filtros de tipo por tamaño y por el
   activo tintado en lugar de negro: son un segundo nivel de filtro, no el principal. */
/* Las categorías van en otro registro que los tipos: texto suelto en lugar de pastilla.
   Siendo las dos filas pastillas se confundían y parecían el mismo control repetido. */
.rec-cats {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 1.15rem;
  margin-top: 1rem;
}
.rec-cats::before {
  content: "Categoría";
  font-size: 0.75rem; font-weight: 600; letter-spacing: 0.04em;
  color: var(--ink-400); text-transform: uppercase;
  margin-right: 0.25rem;
}
.rec-cat-chip {
  padding: 0.15rem 0; border: 0; background: none;
  color: var(--ink-500); font-size: 0.875rem; font-weight: 500; font-family: inherit;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  transition: color 0.2s, border-color 0.2s;
}
.rec-cat-chip:hover { color: var(--ink-900); }
.rec-cat-chip.activo {
  color: var(--ink-900); font-weight: 700;
  border-bottom-color: var(--brand-blue);
}

/* Filtro que hoy no lleva a nada: se apaga, pero se deja pulsable. Deshabilitarlo esconde
   el porqué; pulsándolo se ve el aviso de que aún no hay contenido. */
.rec-chip.vacio, .rec-cat-chip.vacio { opacity: 0.45; }
.rec-chip.vacio:hover, .rec-cat-chip.vacio:hover { opacity: 0.7; }

/* El recuento en las pastillas de categoría, más discreto que en las de tipo. */
.rec-cat-chip .rec-chip-n { margin-left: 0.4rem; font-size: 0.6875rem; }






/* Tipos de recurso como píldoras con icono en línea. Se probaron antes como tarjeta alta
   —competía con la rejilla, que ya son cajas— y como pestaña subrayada. La píldora es el
   punto medio: tiene forma propia sin ser una caja más, y ocupa la mitad de alto.
   Se reparten el ancho del contenedor, pero sin estirarse hasta deformarse. */
.rec-barra { display: block; margin-bottom: 1rem; }
.rec-barra .rec-filtros {
  display: flex; flex-wrap: wrap; gap: 0.45rem;
  margin-bottom: 0;
}
.rec-tipo {
  flex: 1 1 auto; min-width: 0;
  display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem;
  padding: 0.6rem 1.1rem;
  border: 1px solid var(--ink-200); border-radius: var(--r-pill);
  background: white; color: var(--ink-600);
  font-family: inherit; font-size: 0.875rem; font-weight: 600;
  cursor: pointer; white-space: nowrap;
  transition: border-color 0.2s, color 0.2s, background 0.2s;
}
.rec-tipo:hover { border-color: var(--ink-300); color: var(--ink-900); background: var(--ink-50); }
.rec-tipo.activo {
  background: var(--ink-900); border-color: var(--ink-900); color: white;
}
.rec-tipo-ic { font-size: 0.9rem; line-height: 1; color: var(--ink-400); transition: color 0.2s; }
.rec-tipo:hover .rec-tipo-ic { color: var(--ink-600); }
.rec-tipo.activo .rec-tipo-ic { color: white; }
.rec-tipo-txt { overflow: hidden; text-overflow: ellipsis; }

/* El recuento, volado: dentro de una píldora no hay sitio para una marca redonda. */
.rec-tipo .rec-chip-n {
  min-width: 0; height: auto; padding: 0; margin-left: 0.1rem;
  background: none; color: var(--ink-300);
  font-size: 0.6875rem; vertical-align: super;
}
.rec-tipo.activo .rec-chip-n { background: none; color: rgba(255, 255, 255, 0.7); }

.rec-tipo.vacio { opacity: 0.45; }
.rec-tipo.vacio:hover { opacity: 0.7; background: white; }

/* Buscador y categorías en la misma fila; en estrecho, una debajo de otra. */
.rec-controles {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem 1.5rem;
  padding-bottom: 1rem; margin-bottom: 0.5rem;
  border-bottom: 1px solid var(--ink-100);
}
.rec-controles .rec-buscador { flex: 0 1 22rem; }
.rec-controles .rec-cats { margin-top: 0; }

@media (max-width: 700px) {
  .rec-barra .rec-filtros {
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
    margin-inline: -1.5rem; padding-inline: 1.5rem;
  }
  .rec-barra .rec-filtros::-webkit-scrollbar { display: none; }
  .rec-tipo { flex: 0 0 auto; }
  .rec-controles .rec-buscador { flex: 1 1 100%; }
}

/* ============================================================
   Bloque «Lista con media» (seccionListaMedia)
   Lista de entradas a un lado y, al otro, la imagen o el vídeo de la seleccionada.
   ============================================================ */
/* align-items: center y no start: la lista se centra contra la media en vez de colgar de
   arriba, que es lo que hace que las entrada activa quede a media altura. */
.lm { display: grid; gap: 2.5rem; align-items: center; }
/* A dos columnas solo cuando alguna entrada trae media; si no, la lista ocupa todo. */
.lm-dos { grid-template-columns: 1fr; }
@media (min-width: 1024px) {
  .lm-dos { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 4rem; }
  /* Se invierte el orden visual, no el del marcado: el texto sigue leyéndose primero. */
  .lm-media-izq .lm-col { order: 2; }
  .lm-media-izq .lm-media { order: 1; }
}
/* En escritorio la media no baja de 680 px. El mínimo entra a partir de 1280, no de 1024:
   en un portátil de 1024 el contenedor da 912 px útiles y reservarle 680 a la media dejaba
   la lista en 232, ilegible. De 1280 en adelante el contenedor ya está a su ancho máximo y
   quedan 488 px para el texto, que es holgado. */
@media (min-width: 1280px) {
  .lm-dos { grid-template-columns: minmax(0, 1fr) minmax(680px, 1fr); }
  /* Volteado, la media ocupa la primera pista —lo hace con «order»—, así que el mínimo
     tiene que cambiarse de lado o se lo quedaría la columna de texto. */
  .lm-dos.lm-media-izq { grid-template-columns: minmax(680px, 1fr) minmax(0, 1fr); }
}
/* El SVG que solo lleva la definición del degradado no ocupa sitio. */
.lm-defs { position: absolute; width: 0; height: 0; }
/* La columna del texto: encabezado y lista juntos, para que el título quede siempre sobre
   las entradas y no arriba a todo el ancho, donde se leía como título de la media. */
.lm-col { min-width: 0; }
.lm-col > div:first-child { margin-bottom: 2rem; }

/* Con muchas entradas la lista deja de crecer y pasa a desplazarse por dentro, con la activa
   centrada —de eso se encarga el JavaScript—. El tope está en 28rem, que son unas cinco
   entradas de una línea: por encima de eso la columna de texto era más alta que la media y
   el bloque se descuadraba.
   Los bordes se difuminan con una máscara para que se vea que hay más arriba y abajo, en vez
   de cortarse a hachazo. */
.lm-list {
  display: flex; flex-direction: column; gap: 0.5rem;
  scroll-behavior: smooth;
}
@media (min-width: 1024px) {
  .lm-dos .lm-list {
    max-height: 28rem;
    overflow-y: auto;
    /* Sin barra de desplazamiento: la lista se mueve sola y el usuario la recorre pulsando.
       La rueda y el teclado siguen funcionando. */
    scrollbar-width: none;
    -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 2.5rem, black calc(100% - 2.5rem), transparent 100%);
    mask-image: linear-gradient(to bottom, transparent 0, black 2.5rem, black calc(100% - 2.5rem), transparent 100%);
  }
  .lm-dos .lm-list::-webkit-scrollbar { display: none; }
}
@media (prefers-reduced-motion: reduce) { .lm-list { scroll-behavior: auto; } }

/* La entrada es un contenedor posicionado porque el botón que la cubre se estira contra
   ella; sin position: relative el inset: 0 se resolvería contra la página entera y un solo
   botón taparía media pantalla. Ya pasó con las tarjetas del centro de recursos.
   La activa es más ancha: las demás se quedan cortas por la derecha y ella llega al final.
   Se anima el margen y no el ancho para no rehacer la caja del texto en cada fotograma. */
.lm-item {
  position: relative;
  display: flex; align-items: center; gap: 1rem;
  padding: 1.15rem 1.35rem;
  border-radius: 14px;
  /* Azul muy claro en lugar del gris --ink-100. Es el --tc-box de .tc-blue, que ya usa el
     sitio: se declara aquí como variable local y no se toca el token, que lo comparten
     media web. */
  --lm-tinte: #EBF5F8;
  background: transparent;
  /* Las que no están puestas llevan filete del color del fondo de la activa: así todas
     ocupan el mismo hueco y la fila no salta al cambiar. La activa lo lleva transparente,
     no lo quita, por lo mismo. */
  border: 1px solid var(--lm-tinte);
  /* En reposo ocupan el 92,5% y van centradas; la activa —y la que tiene el ratón encima—
     llega al 100%. */
  width: 92.5%;
  margin: 0 auto;
  transition:
    width 0.55s var(--ease-out-expo),
    background 0.35s ease,
    border-color 0.35s ease;
}
/* Misma parada para las dos: puesta y señalada se ven igual. */
.lm-item.is-activa,
.lm-item:hover {
  width: 100%;
  background: var(--lm-tinte);
  border-color: transparent;
}
.lm-item:hover .lm-item-tit { color: var(--ink-900); }
.lm-item:hover .lm-item-desc { color: var(--ink-600); }

.lm-item-btn {
  position: absolute; inset: 0; z-index: 1;
  width: 100%; height: 100%;
  padding: 0; margin: 0; border: 0;
  background: none; cursor: pointer;
  border-radius: inherit;
}
.lm-item-btn:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 2px; }

.lm-item-txt { min-width: 0; flex: 1; }
.lm-item-tit {
  font-family: var(--font-display, inherit);
  font-weight: 700; font-size: 1.125rem; line-height: 1.3;
  /* Apagadas hasta que se seleccionan: es lo que hace legible de un vistazo cuál manda. */
  color: var(--ink-400);
  transition: color 0.25s ease;
}
.lm-item-desc {
  font-size: 0.9375rem; line-height: 1.5; margin-top: 0.3rem;
  color: var(--ink-400);
  transition: color 0.25s ease;
}
.lm-item.is-activa .lm-item-tit { color: var(--ink-900); }
.lm-item.is-activa .lm-item-desc { color: var(--ink-600); }

/* El círculo de la derecha solo sale en la entrada activa: es el reloj del pase, no un
   adorno de todas. En las demás no se pinta nada, pero se le guarda el hueco con
   visibility en vez de quitarlo, para que el texto no se corra al cambiar de entrada. */
.lm-item-accion {
  position: relative; flex: 0 0 auto;
  width: 2.25rem; height: 2.25rem;
  border-radius: 50%;
  visibility: hidden; opacity: 0;
  transition: opacity 0.3s ease, visibility 0.3s;
}
.lm-item.is-activa .lm-item-accion { visibility: visible; opacity: 1; }

/* Por encima del botón que cubre la entrada: es un destino distinto del de seleccionar. */
.lm-item-flecha {
  position: absolute; inset: 0; z-index: 2;
  display: grid; place-items: center;
  border-radius: 50%;
  color: var(--ink-600);
  transition: color 0.2s ease;
}
.lm-item-flecha:hover { color: var(--brand-blue-fuerte); }

/* Anillo de avance del pase automático. Es el reloj: el JavaScript pasa a la siguiente
   entrada cuando esta animación acaba, así que pausarla pausa el pase y no hacen falta dos
   relojes que sincronizar.
   Empieza arriba —de ahí el giro de -90 grados— y se dibuja en el sentido de las agujas. */
.lm-item-anillo {
  position: absolute; inset: -1px;
  width: calc(100% + 2px); height: calc(100% + 2px);
  transform: rotate(-90deg);
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
}
.lm-item.is-activa .lm-item-anillo { opacity: 1; }
.lm-item-anillo circle { fill: none; stroke-width: 2; }
/* La pista: el círculo entero, tenue. Es lo que hace que al pulsar una entrada se vea algo
   aunque el avance esté pausado por tener el ratón encima. */
.lm-hint { stroke: var(--ink-300); }
/* El avance. El color NO se pone aquí: lleva el degradado de marca y un stroke de CSS no
   admite gradientes, así que va como atributo en el marcado apuntando al <linearGradient>
   que declara el bloque. Un «stroke» aquí lo taparía, porque la regla CSS gana al atributo
   de presentación. */
.lm-avance {
  stroke-linecap: round;
  /* 2·π·16.5 = 103.67, el perímetro del círculo del SVG. El trazo entero está desplazado
     fuera y la animación lo va metiendo. */
  stroke-dasharray: 103.67;
  stroke-dashoffset: 103.67;
}
.lm-item.is-activa .lm-avance {
  animation: lm-carga var(--lm-dur, 6s) linear forwards;
}
@keyframes lm-carga { to { stroke-dashoffset: 0; } }

/* Pausa. Con el ratón sobre la entrada activa, y también con el foco de teclado dentro de
   la lista: si no, quien navega con teclado no tendría forma de detenerlo, que es lo que
   pide el criterio de «pausar, detener u ocultar» de WCAG.
   :focus-visible y no :focus-within, que era lo que había: un clic también deja el foco en
   el botón, así que el pase se quedaba pausado para siempre en cuanto alguien pulsaba una
   entrada con el ratón. Con :focus-visible solo cuenta el foco de teclado. */
.lm-item.is-activa:hover .lm-avance,
.lm-list:has(:focus-visible) .lm-item.is-activa .lm-avance {
  animation-play-state: paused;
}

/* Quien pide menos movimiento no recibe pase automático: sin animación no hay «animationend»
   y el JavaScript nunca avanza. El anillo se retira, porque uno parado al 0% parecería algo
   roto, y la entrada activa se queda con su aro normal. */
@media (prefers-reduced-motion: reduce) {
  .lm-item-anillo { display: none; }
  /* Sin anillo, el círculo de la activa se queda vacío. Se le pone aro fijo para que siga
     señalando cuál está puesta, que es lo único que aporta ahí sin el pase. */
  .lm-item.is-activa .lm-item-accion { border: 2px solid var(--brand-blue); }
  .lm-item { transition: background 0.35s ease, border-color 0.35s ease; }
}

.lm-media { position: relative; }
/* Sin fondo: si la imagen es un PNG con transparencia, el gris de relleno se veía por detrás
   y le ponía un marco que no tiene. */
.lm-media-el {
  max-height:680px;
  display: block; width: 100%; height: auto;
  border-radius: 20px;
}

/* ============================================================
   Bloque «Tarjetas de recurso» (seccionTarjetasRecurso)
   ============================================================ */
/* Sin realce al pasar por encima, que es como se pidió. */
.rec-cards-still .rec-card-liga:hover { color: inherit; }
.rec-cards-still .rec-card:hover { transform: none; box-shadow: none; }

/* Sin filete y sin fondo propio: la tarjeta se apoya en el de la sección y lo que la
   delimita es la media. Va acotado a este bloque —no al partial— porque el listado del
   centro de recursos se queda como está. */
.rec-cards-still .rec-card {
  background: transparent;
  border: 0;
  border-radius: 0;
  overflow: visible;
  box-shadow: none;
}

/* La media, cuadrada siempre. Sea foto, GIF o vídeo, y sea cual sea su proporción, se ve
   ENTERA sobre el gris: con «cover» un vídeo apaisado perdería los lados, y aquí lo normal
   es que sean capturas donde recortar se come justo lo que se quiere enseñar. */
.rec-cards-still .rec-card-img {
  aspect-ratio: 1 / 1;
  border-radius: 18px;
  background: var(--ink-100);
}
.rec-cards-still .rec-card-img > img,
.rec-cards-still .rec-card-img > video,
.rec-cards-still .rec-card-img > .rec-portada-img {
  width: 100%; height: 100%;
  object-fit: contain;
}
/* La portada generada sí llena: es un color plano con el título, no hay nada que recortar. */
.rec-cards-still .rec-portada { height: 100%; }
/* El cuerpo pierde el relleno lateral, que lo daba la caja de la tarjeta. */
.rec-cards-still .rec-card-body { padding: 1.1rem 0.15rem 0; }

/* ============================================================
   Bloque «Destacado a color» (seccionDestacado)
   Banda de fondo con media opcional a un lado. Sin media, contenido centrado.
   ============================================================ */
/* El aire de arriba y abajo lo pone .sec con sus variables, para que «Apariencia» pueda
   cambiarlo como en cualquier otro bloque; aquí solo quedan los 5rem de siempre y el
   margen lateral, que no es configurable. */
.dst-wrap { --sec-pt: 5rem; --sec-pb: 5rem; --sec-pt-m: 5rem; --sec-pb-m: 5rem; padding-inline: 1.5rem; }
/* A todo el ancho: la banda toca los bordes y el aire lo pone ella por dentro. */
.dst-wrap-wide { --sec-pt: 0px; --sec-pb: 0px; --sec-pt-m: 0px; --sec-pb-m: 0px; padding-inline: 0; }

.dst {
  position: relative; overflow: hidden;
  max-width: 80rem; margin-inline: auto;
  border-radius: 32px;
  background: var(--d-fondo);
  color: var(--d-tinta);
}
.dst-wide { max-width: none; border-radius: 0; }

/* Solo quedan dos fondos. Hubo seis colores planos —violeta, azul, mint, lavanda, crema y
   tinta, cada uno con su tinta medida— y se retiraron del desplegable.

   El degradado va con --brand-gradient sin tocar, el mismo que usa el CTA final. Con blanco
   encima su parada mint se queda en 2.09:1 y la azul en 2.87:1, por debajo del 4.5:1 que
   pide el cuerpo y del 3:1 del titular. Se asume para que el bloque no desentone del cierre
   de página, que ya lo hace así; para un texto largo o crítico va mejor el de imagen, que
   con su velo sí cumple. */
.dst-degradado { --d-fondo: var(--brand-gradient); --d-tinta: #fff; }

/* Fondo de imagen. El velo no es estético: sobre una foto clara el blanco se queda en 1:1
   y ningún color de texto lo arregla. Un 55% de negro deja 4.76:1 incluso contra blanco
   puro, que es el peor caso posible.

   El desenfoque va sobre lo que hay detrás, no sobre el propio velo, así que no toca al
   texto: ese vive en .dst-box, por encima. Lo que hace es quitarle detalle a la foto para
   que no compita con lo que se lee. */
.dst-image {
  --d-tinta: #fff;
  --d-fondo: var(--ink-800);
  background-size: cover; background-position: center;
}
.dst-image::before {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: rgba(0, 0, 0, 0.55);
  -webkit-backdrop-filter: blur(5px);
  backdrop-filter: blur(5px);
}
/* Con media al lado el velo se hace direccional: denso bajo el contenido y suave sobre la
   media, para no apagar la foto entera. El lado depende de dónde caiga el contenido. */
@media (min-width: 1024px) {
  .dst-image.dst-veil-side::before {
    background: linear-gradient(to right, rgba(0,0,0,0.66) 0%, rgba(0,0,0,0.58) 48%, rgba(0,0,0,0.28) 78%, rgba(0,0,0,0.18) 100%);
  }
  .dst-image.dst-veil-side.dst-media-izq::before {
    background: linear-gradient(to left, rgba(0,0,0,0.66) 0%, rgba(0,0,0,0.58) 48%, rgba(0,0,0,0.28) 78%, rgba(0,0,0,0.18) 100%);
  }
}

/* Por encima del velo. */
.dst-box { position: relative; z-index: 1; display: grid; gap: 2.5rem; align-items: center; padding: 3rem 2rem; }
@media (min-width: 768px) { .dst-box { padding: 4rem 3.5rem; } }
@media (min-width: 1024px) {
  .dst-dos .dst-box { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 4rem; padding: 4.5rem 4rem; }
  /* Se invierte el orden visual, no el del marcado: el texto se sigue leyendo primero. */
  .dst-media-izq .dst-txt { order: 2; }
  .dst-media-izq .dst-media { order: 1; }
}
/* Sin media el contenido se centra y se le pone medida de lectura, que si no se estira a
   los 80rem de la banda y se vuelve ilegible. */
.dst-centered .dst-txt { text-align: center; max-width: 46rem; margin-inline: auto; }

/* Sin rebajar la opacidad. Llevaba 0.8 y con eso caía a 4.2–4.3:1: es texto de 12px, o sea
   texto normal, y pide 4.5:1. La diferencia de tamaño y el espaciado ya la separan del
   titular sin necesidad de apagarla. */
.dst-etiqueta {
  display: inline-block;
  font-size: 0.75rem; font-weight: 700;
  letter-spacing: 0.12em; text-transform: uppercase;
}
.dst-title {
  font-family: var(--font-display, inherit);
  font-weight: 700; font-size: 2rem; line-height: 1.1;
  margin-top: 0.9rem;
  text-wrap: balance;
}
@media (min-width: 768px) { .dst-title { font-size: 2.75rem; } }
.dst-text { font-size: 1.0625rem; line-height: 1.6; margin-top: 1.1rem; }
@media (min-width: 768px) { .dst-text { font-size: 1.125rem; } }
.dst-cta { margin-top: 2rem; }

.dst-media-el {
  display: block; width: 100%; height: auto;
  border-radius: 20px;
}

/* ============================================================
   Bloque «Etiquetas» (seccionEtiquetas)
   Rejilla de capacidades: celdas del mismo tamaño dentro de un panel.
   ============================================================ */
/* Panel blanco y liso, sin filete: el color lo pone ahora cada celda. */
.etq-panel {
  position: relative; overflow: hidden;
  padding: 1.25rem;
  border-radius: 28px;
  /* background: white; */
}
@media (min-width: 768px) { .etq-panel { padding: 1.5rem; } }

/* Rejilla y no flex: es lo que iguala los anchos. Con flex-wrap cada píldora medía lo que
   medía su texto y las filas quedaban descuadradas. */
/* Las columnas ya no se fijan aquí: las elige «Apariencia» y llegan como clases de Tailwind
   en el propio <ul>. Si se dejaran estas reglas ganarían siempre, porque styles.css se carga
   después de la hoja de Tailwind y la especificidad es la misma. */
.etq-grid {
  list-style: none; padding: 0; margin: 0;
  display: grid; gap: 0.75rem;
}

/* align-items no hace falta: en grid las celdas se estiran solas, así que dos etiquetas de
   la misma fila miden igual aunque una ocupe dos líneas.
   Sin filete: ahora el degradado va en cada celda y es lo que la dibuja. En diagonal y muy
   tenue, recorriendo el eje azul -> violeta de la marca, con la sombra mínima del sistema
   para despegarla del panel blanco.
   Ya no lleva backdrop-filter: con el panel liso no hay nada detrás que desenfocar, así que
   solo costaba una capa de composición por celda. */
.etq-item {
  display: flex; align-items: center; gap: 0.7rem;
  padding: 0.85rem 1.1rem;
  border-radius: 12px;
  background: #EBF5F8;
  /* box-shadow: var(--shadow-sm); */
  font-size: 0.9375rem; font-weight: 500; line-height: 1.4;
  color: var(--ink-700);
}

/* Marca propia del bloque, no la .chk del resto de listas: aquí van dieciséis seguidas y el
   cuadro teñido con anillo pesaba más que el texto. Es el mismo tick, suelto y en color de
   marca, como en los referentes.
   Se declara aparte a propósito: tocar .chk cambiaría todas las listas del sitio. */
/* El azul de marca sin oscurecer, que sobre la celda queda en 2.8:1. Por debajo del 3:1 que
   WCAG pide a un gráfico con significado, pero aquí el tick no lo tiene: es una viñeta, la
   lista se entiende igual sin él y ninguna etiqueta depende de que se vea. Si algún día
   pasa a distinguir unas de otras, el escalón que cumple es --brand-blue-fuerte. */
.etq-mk {
  flex: 0 0 auto;
  width: 1.05rem; height: 1.05rem;
  color: var(--brand-blue);
}
.etq-mk svg { width: 100%; height: 100%; display: block; }


/* ============================================================
   Bloque «Recorrido guiado» (seccionRecorrido)
   Capturas encadenadas con puntos interactivos, portada y cierre.
   ============================================================ */
/* --- «gira el móvil» ---------------------------------------------------------------------
   Solo en un teléfono de pie. El recorrido es una captura apaisada con los puntos puestos
   por porcentaje: a 360 px de ancho no se lee el texto de los globos ni se acierta a pulsar
   un punto. Se tapa con esta capa y se pide girar.

   No se oculta el recorrido con display:none, se le pone algo encima: lo de debajo sigue en
   el árbol de accesibilidad y un lector de pantalla lo recorre igual, esté como esté el
   aparato.

   El corte lleva las dos condiciones. Solo por ancho taparía también una ventana de
   escritorio estrecha, donde girar no significa nada; solo por orientación taparía un móvil
   tumbado de 667 px, que es justo lo que se quiere enseñar. */
.rec-tour-girar { display: none; }
@media (max-width: 767px) and (orientation: portrait) {
  .rec-tour-girar {
    position: absolute; inset: 0; z-index: 10;
    display: grid; place-content: center; justify-items: center;
    gap: 0.9rem; padding: 1.75rem; text-align: center;
    background: var(--ink-900); color: white;
  }
  .rec-tour-girar-icono {
    display: grid; place-items: center;
    width: 3.4rem; height: 3.4rem; border-radius: 50%;
    background: rgba(255, 255, 255, 0.12);
    animation: rt-girar 2.8s ease-in-out infinite;
  }
  .rec-tour-girar-txt {
    margin: 0; font-family: "Manrope", sans-serif;
    font-weight: 700; font-size: 1.05rem; line-height: 1.3;
  }
  .rec-tour-girar-sub { margin: 0; font-size: 0.85rem; color: rgba(255, 255, 255, 0.65); }
}
/* El móvil se queda quieto un rato, gira, espera tumbado y vuelve: gira despacio en vez de
   dar vueltas, que es el gesto que se pide hacer. */
@keyframes rt-girar {
  0%, 45% { transform: rotate(0deg); }
  60%, 85% { transform: rotate(90deg); }
  100% { transform: rotate(0deg); }
}
@media (prefers-reduced-motion: reduce) { .rec-tour-girar-icono { animation: none; } }

.rec-tour-marco {
  position: relative;
  display: grid;
  border-radius: 22px;
  overflow: hidden;
  border: 1px solid var(--ink-200);
  background: white;
  box-shadow: var(--shadow-lg);
}
/* Las diapositivas se apilan en la misma casilla de la rejilla. Se ocultan con visibilidad
   y no con [hidden], que es display: none: así todas siguen contando para el tamaño y el
   marco toma el alto de la más alta, sin pegar un salto al cambiar.
   La que no toca lleva «inert», que la saca del árbol de accesibilidad y del tabulador. */
.rec-tour-step {
  grid-area: 1 / 1;
  position: relative;
  opacity: 0; visibility: hidden;
  transition: opacity 0.4s ease, visibility 0.4s;
}
.rec-tour-step.is-activo { opacity: 1; visibility: visible; }
.rec-tour-img { display: block; width: 100%; height: auto; }

/* --- portada y cierre ------------------------------------------------------------------
   La captura se queda de fondo, muy desenfocada y lavada: se intuye el producto sin
   competir con el texto. */
.rec-tour-portada .rec-tour-img,
.rec-tour-final .rec-tour-img { filter: blur(16px) saturate(0.6) brightness(1.12); transform: scale(1.12); }
/* Velo claro y con tinta oscura, no al revés: sobre una captura de una aplicación —que casi
   siempre es blanca— una capa negra da un contraste violento con lo que hay alrededor.
   Se aclara arriba, donde va el texto, y se abre abajo para que asome la captura nítida. */
.rec-tour-capa {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center;
  padding: clamp(1.75rem, 6%, 3.5rem) 2rem 0; text-align: center;
  background: linear-gradient(to bottom, 
  rgb(255 255 255 / 70%) 0%,  
  rgb(255 255 255 / 50%) 40%, 
  rgb(255 255 255 / 25%) 75%, 
  rgba(255, 255, 255, 0.5) 100%);
  color: var(--ink-900);
  overflow: hidden;
}
/* El cierre no lleva captura asomando, así que su contenido va centrado. */
.rec-tour-final .rec-tour-capa { justify-content: center; padding-bottom: 2rem; background: linear-gradient(to bottom, rgb(255 255 255 / 75%) 0%, rgb(255 255 255 / 68%) 40%, rgb(255 255 255 / 64%) 75%, rgb(255 255 255 / 85%) 100%);}
.rec-tour-capa-tit {
  font-family: var(--font-display, inherit);
  font-weight: 700; font-size: 1.5rem; line-height: 1.15;
  text-wrap: balance;
}
@media (min-width: 768px) { .rec-tour-capa-tit { font-size: 2.25rem; } }
.rec-tour-capa-txt { max-width: 34rem; margin-top: 0.6rem; color: var(--ink-600); }
.rec-tour-capa-cta { margin-top: 1.4rem; }
.rec-tour-buttons-layer { display: flex; flex-wrap: wrap; gap: 0.75rem; justify-content: center; margin-top: 1.6rem; }

/* La captura nítida asomando por abajo. Se recorta con overflow: solo se ve la parte de
   arriba, que es lo que da la sensación de que hay más debajo. */
.rec-tour-asoma {
  display: block; margin-top: auto;
  width: min(84%, 44rem);
  /* 52% y no menos: con el marco a lo ancho que tiene, por debajo de eso quedaba un hueco
     muerto de un cuarto de la altura entre el botón y la captura. */
  max-height: 52%;
  overflow: hidden;
  border-radius: 12px 12px 0 0;
  box-shadow: 0 -24px 60px -24px rgba(10, 10, 11, 0.3);
}
.rec-tour-asoma img { display: block; width: 100%; height: auto; }

/* --- controles ------------------------------------------------------------------------
   Solo asoman al pasar el ratón por el marco, y también al entrar el foco: si no, quien va
   con teclado no los encontraría nunca. */
.rec-tour-controles {
  position: absolute; top: 0; left: 0; right: 0; z-index: 5;
  display: flex; justify-content: space-between;
  padding: 0.85rem;
  opacity: 0;
  transition: opacity 0.25s ease;
  /* Sin cursor-halo mientras no se ven, o interceptarían el clic de lo que quede debajo. */
  pointer-events: none;
}
.rec-tour-marco:hover .rec-tour-controles,
.rec-tour-marco:focus-within .rec-tour-controles,
.rec-tour-marco:fullscreen .rec-tour-controles { opacity: 1; pointer-events: auto; }
.rec-tour-ctrl {
  display: grid; place-items: center;
  width: 2.15rem; height: 2.15rem;
  border: 0; border-radius: 50%;
  background: rgba(10, 10, 11, 0.72); color: white;
  cursor: pointer;
  transition: background 0.2s ease;
}
.rec-tour-ctrl:hover { background: rgba(10, 10, 11, 0.9); }
.rec-tour-ctrl:focus-visible { outline: 2px solid white; outline-offset: 2px; }
/* Los dos iconos del botón de pantalla completa: se enseña el que toca. */
.rec-tour-close { display: none; }
.rec-tour-marco:fullscreen .rec-tour-abrir { display: none; }
.rec-tour-marco:fullscreen .rec-tour-close { display: block; }
/* A pantalla completa el marco pierde el redondeo y centra la captura. */
.rec-tour-marco:fullscreen { border-radius: 0; border: 0; background: var(--ink-900); place-items: center; }
.rec-tour-marco:fullscreen .rec-tour-step { max-height: 100vh; }
.rec-tour-marco:fullscreen .rec-tour-img { max-height: 100vh; width: auto; max-width: 100vw; margin-inline: auto; }

/* --- el punto --------------------------------------------------------------------------
   Se coloca por porcentaje y se centra sobre su coordenada con el translate, para que quede
   EN el sitio marcado y no con su esquina ahí. */
.rec-tour-punto { position: absolute; transform: translate(-50%, -50%); z-index: 2; }
/* Los puntos de un paso se descubren de uno en uno. Se apaga la opacidad para que entre
   suave, y ademas visibility para que el oculto no lo lea el lector ni entre en el
   tabulador. La visibilidad NO va en la transicion a proposito: tiene que volverse visible
   en el acto para poder llevarle el foco nada mas descubrirlo. */
.rec-tour-punto { transition: opacity 0.35s ease; }
.rec-tour-punto.is-oculto { opacity: 0; visibility: hidden; pointer-events: none; }
/* Ya pulsado: deja de latir, para que el latido quede solo en el que acaba de salir. */
.rec-tour-punto.is-visto .rec-tour-dot::before,
.rec-tour-punto.is-visto .rec-tour-dot::after { animation: none; opacity: 0; }
/* Y además se apaga: pierde el color de marca y baja de intensidad, para que de un vistazo
   se vea cuáles quedan por ver. Sigue pulsable —su globo cuenta algo— y vuelve a encenderse
   al pasar por encima, que si no parecería desactivado.
   Con :not(.is-oculto) porque las dos reglas ponen opacity con el mismo peso y esta va
   después: sin el filtro, un punto que volviera a ocultarse se vería igualmente. */
.rec-tour-punto.is-visto:not(.is-oculto) { opacity: 0.55; }
.rec-tour-punto.is-visto:hover,
.rec-tour-punto.is-visto:focus-within { opacity: 1; }
.rec-tour-punto.is-visto .rec-tour-dot {
  background: var(--ink-300);
  box-shadow: 0 0 0 3px white, 0 4px 10px -6px rgba(10, 10, 11, 0.4);
  transition: background-color 0.3s ease, transform 0.2s var(--ease-out-back);
}
.rec-tour-punto.is-visto:hover .rec-tour-dot,
.rec-tour-punto.is-visto:focus-within .rec-tour-dot { background: var(--brand-gradient); }
@media (prefers-reduced-motion: reduce) { .rec-tour-punto { transition: none; } }
/* Es un botón —lleva al paso siguiente—, salvo en la última diapositiva, donde se pinta
   como span porque no hay adonde ir. Los estilos valen para los dos. */
.rec-tour-dot {
  position: relative; display: block;
  width: 1.1rem; height: 1.1rem;
  padding: 0; border: 0;
  border-radius: 50%;
  background: var(--brand-gradient);
  box-shadow: 0 0 0 3px white, 0 6px 16px -6px rgba(10, 10, 11, 0.45);
  transition: transform 0.2s var(--ease-out-back);
}
button.rec-tour-dot { cursor: pointer; }
button.rec-tour-dot:hover { transform: scale(1.25); }
button.rec-tour-dot:focus-visible { outline: 2px solid var(--ink-900); outline-offset: 4px; }
@media (prefers-reduced-motion: reduce) { .rec-tour-dot { transition: none; } }
/* Dos aros que salen del punto, desfasados, para que el latido sea continuo y no a golpes. */
.rec-tour-dot::before,
.rec-tour-dot::after {
  content: ""; position: absolute; inset: -3px;
  border-radius: 50%;
  border: 2px solid var(--brand-blue);
  animation: rt-latido 2.6s cubic-bezier(0.2, 0.6, 0.3, 1) infinite;
}
.rec-tour-dot::after { animation-delay: 1.3s; }
@keyframes rt-latido {
  0%   { transform: scale(1);   opacity: 0.75; }
  80%  { transform: scale(2.6); opacity: 0; }
  100% { transform: scale(2.6); opacity: 0; }
}

/* --- el globo --------------------------------------------------------------------------
   Visible de salida: el mensaje es texto de la página, no algo que haya que ir a buscar. */
.rec-tour-globo {
  position: absolute; top: 50%; left: calc(100% + 0.85rem);
  transform: translateY(-50%);
  width: max-content; max-width: min(18rem, 52vw);
  padding: 0.75rem 0.95rem;
  border-radius: 12px;
  background: var(--ink-900); color: white;
  font-size: 0.8125rem; line-height: 1.5;
  box-shadow: var(--shadow-lg);
}
/* Pegado al borde derecho o al inferior, el globo se abre hacia dentro. */
.rec-tour-punto.es-izquierda .rec-tour-globo { left: auto; right: calc(100% + 0.85rem); }
.rec-tour-punto.is-top .rec-tour-globo { top: auto; bottom: calc(100% + 0.85rem); transform: none; }
.rec-tour-punto.is-top.es-izquierda .rec-tour-globo { right: 0; }
.rec-tour-globo p { margin: 0; }
.rec-tour-globo-cta {
  display: inline-block; margin-top: 0.5rem;
  font-weight: 600; color: white;
  border-bottom: 1px solid rgba(255, 255, 255, 0.45);
}
.rec-tour-globo-cta:hover { border-bottom-color: white; }

/* --- barra de avance --------------------------------------------------------------------
   Una línea por diapositiva. La puesta se rellena, las pasadas se quedan marcadas y las que
   faltan, en gris. */
.rec-tour-barra {
  display: flex; align-items: center; gap: 0.5rem;
  margin-top: 1.1rem;
}
.rec-tour-line {
  position: relative; flex: 1;
  height: 22px; padding: 0;      /* alto de sobra para que sea cómoda de pulsar */
  border: 0; background: none; cursor: pointer;
}
.rec-tour-line::before {
  content: ""; position: absolute; left: 0; right: 0; top: 50%;
  height: 5px; transform: translateY(-50%);
  border-radius: 999px;
  background: var(--ink-200);
  transition: background 0.25s ease;
}
.rec-tour-line:hover::before { background: var(--ink-300); }
/* El color lo pone el marcado: cada línea lleva su tramo del degradado de marca, calculado
   por su posición, para que las seis juntas se lean como un solo degradado. Aquí solo va la
   forma. */
.rec-tour-relleno {
  position: absolute; left: 0; top: 50%;
  height: 5px; width: 0; transform: translateY(-50%);
  border-radius: 999px;
  transition: width 0.35s ease;
}
.rec-tour-line.is-pasada .rec-tour-relleno,
.rec-tour-line.is-activa .rec-tour-relleno { width: 100%; }
.rec-tour-line.is-pasada .rec-tour-relleno { opacity: 0.45; }
.rec-tour-line:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 3px; border-radius: 999px; }

/* Miniatura al posarse: saber a dónde se salta antes de saltar. */
.rec-tour-mini {
  position: absolute; bottom: calc(100% + 0.6rem); left: 50%;
  transform: translateX(-50%) translateY(4px);
  width: 9.5rem; padding: 0.3rem;
  border-radius: 10px;
  background: var(--ink-900);
  box-shadow: var(--shadow-lg);
  opacity: 0; visibility: hidden;
  transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s;
  pointer-events: none;
}
.rec-tour-line:hover .rec-tour-mini,
.rec-tour-line:focus-visible .rec-tour-mini {
  opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0);
}
.rec-tour-mini img { display: block; width: 100%; height: auto; border-radius: 7px; }
.rec-tour-mini-nombre {
  display: block; padding: 0.35rem 0.2rem 0.15rem;
  font-size: 0.6875rem; font-weight: 600; color: white;
  text-align: center;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

@media (max-width: 639px) {
  .rec-tour-globo { font-size: 0.75rem; max-width: 56vw; padding: 0.6rem 0.75rem; }
  .rec-tour-dot { width: 0.9rem; height: 0.9rem; }
  .rec-tour-mini { width: 7rem; }
}

@media (prefers-reduced-motion: reduce) {
  .rec-tour-step { transition: none; }
  .rec-tour-dot::before,
  .rec-tour-dot::after { animation: none; opacity: 0.5; transform: scale(1.35); }
}

/* ============================================================
   Puntero y «volver arriba»
   ============================================================ */

/* El halo que sigue al raton. El cursor-halo nativo NO se oculta: sobre un campo de texto, un
   borde redimensionable o una seleccion su forma dice cosas que un circulo dibujado no dice,
   y este sitio esta lleno de formularios. Asi que esto acompaña al cursor, no lo sustituye.
   Solo lo crea el JS cuando hay raton de verdad y nadie ha pedido menos movimiento; en tactil
   no existe ni el elemento. */
.cursor-halo {
  position: fixed; inset-block-start: 0; inset-inline-start: 0;
  inline-size: 34px; block-size: 34px;
  margin-block-start: -17px; margin-inline-start: -17px;
  border-radius: 50%;
  border: 1.5px solid color-mix(in srgb, var(--brand-blue) 55%, transparent);
  background: radial-gradient(circle, color-mix(in srgb, var(--brand-blue) 14%, transparent) 0%, transparent 70%);
  /* translate y scale sueltos, no dentro de un transform: el JS reescribe la posicion en cada
     fotograma y la escala la lleva una transicion. En un solo transform una cosa pisaria a la
     otra. */
  translate: var(--px, -100px) var(--py, -100px);
  scale: 1;
  pointer-events: none; z-index: 70; opacity: 0;
  transition: opacity 0.25s ease, scale 0.3s var(--ease-out-expo),
              border-color 0.3s ease, background 0.3s ease;
  will-change: translate;
}
.cursor-halo.is-visible { opacity: 1; }

/* Sobre algo pulsable: crece y se tiñe de violeta, que es el otro extremo del degradado. */
.cursor-halo.is-activo {
  scale: 1.85;
  border-color: color-mix(in srgb, var(--brand-violet) 60%, transparent);
  background: radial-gradient(circle, color-mix(in srgb, var(--brand-violet) 16%, transparent) 0%, transparent 70%);
}
/* Y al pulsar se encoge, que es la respuesta que se espera de un boton. */
.cursor-halo.is-pulsando { scale: 0.75; }

/* ---- Volver arriba ---- */

/* Abajo a la IZQUIERDA a proposito: abajo a la derecha se pone el lanzador del chat, y dos
   pastillas redondas solapadas en la misma esquina no hay forma de pulsarlas bien en movil. */
.to-top {
  position: fixed; inset-block-end: 1.5rem; inset-inline-start: 1.5rem;
  inline-size: 3rem; block-size: 3rem;
  display: grid; place-items: center;
  border: 1px solid var(--ink-200); border-radius: 50%;
  background: rgba(255, 255, 255, 0.86);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
  color: var(--ink-900); cursor: pointer;
  box-shadow: 0 10px 30px -12px rgba(10, 10, 11, 0.25);
  z-index: 40;
  /* Oculto de verdad: visibility lo saca tambien del arbol de accesibilidad, asi que mientras
     no se ha bajado nada el lector de pantalla no lo anuncia ni el tabulador lo pisa. */
  opacity: 0; visibility: hidden; translate: 0 14px;
  transition: opacity 0.35s var(--ease-out-expo), translate 0.35s var(--ease-out-expo),
              visibility 0.35s, box-shadow 0.35s var(--ease-out-expo);
}
.to-top.is-visible { opacity: 1; visibility: visible; translate: 0 0; }
.to-top:hover { box-shadow: var(--shadow-lg); }
.to-top:hover svg { translate: 0 -2px; }
.to-top svg { inline-size: 1.15rem; block-size: 1.15rem; transition: translate 0.3s var(--ease-out-back); }
.to-top:focus-visible { outline: 2px solid var(--brand-blue); outline-offset: 3px; }

/* El aro de avance: cuanto queda de pagina.
   La mascara deja solo un anillo de 3 px; sin ella el conic-gradient pintaria el disco entero
   y taparia la flecha. */
.to-top::before {
  content: ""; position: absolute; inset: -4px; border-radius: 50%;
  background: conic-gradient(var(--brand-violet) 0turn,
                             var(--brand-blue) calc(var(--progress, 0) * 1turn),
                             transparent 0);
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
  mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
  pointer-events: none;
}

/* Donde se puede, el aro lo mueve el propio navegador atando la animacion al scroll del
   documento. Eso corre en el compositor: no hay JavaScript por medio, ni una lectura de la
   posicion por fotograma, que es lo que hacia que este boton fuera lo mas caro del scroll.
   Donde no se puede, sigue escribiendolo site.js, que detecta el soporte y se calla si lo hay. */
@supports (animation-timeline: scroll()) {
  .to-top::before {
    animation: to-top-aro linear both;
    animation-timeline: scroll(root block);
  }
  @keyframes to-top-aro {
    from { --progress: 0; }
    to   { --progress: 1; }
  }
}
/* Para poder interpolarla, la propiedad tiene que estar declarada con su tipo. */
@property --progress {
  syntax: "<number>";
  inherits: false;
  initial-value: 0;
}

@media (max-width: 639px) {
  .to-top { inset-block-end: 1rem; inset-inline-start: 1rem; inline-size: 2.75rem; block-size: 2.75rem; }
}

@media (prefers-reduced-motion: reduce) {
  .to-top { transition: opacity 0.2s linear, visibility 0.2s; translate: 0 0; }
  .to-top svg { transition: none; }
}

/* Las garantias de la pagina de precios: la misma lista de comprobaciones, pero en fila y
   centrada bajo el titular en vez de en columna. */
.check-list.check-list-row {
  flex-direction: row; flex-wrap: wrap;
  justify-content: center; gap: 0.6rem 2rem;
}


/* ============================================================
   Aviso de tarifa para empresas grandes (pagina de precios)
   ============================================================ */

/* Era un .card centrado, que es la caja generica del sitio y no decia nada. Ahora usa la
   familia corporativa .tc-* —la misma de la fila de beneficios de la portada y de las rejillas
   de tarjetas— y reparte en tres: la cifra que da el titular, el texto y la llamada.
   El tono malva es el que ya llevaba esta caja en el material de la pagina antigua. */
.bigco {
  --tc-box: #F8EFF7; --tc-pill: #F0DCEE; --tc-ink: #7E3D79;
  display: flex; align-items: center; gap: 2rem;
  background: var(--tc-box);
  border: 1px solid var(--tc-pill);
  border-radius: 28px;
  padding: 2rem 2.25rem;
  position: relative; overflow: hidden;
}

/* La cifra hace de icono: es el dato del que va la caja, asi que se pinta como tal en vez de
   repetirlo solo dentro de la frase. aria-hidden en el marcado, que el titular ya lo dice. */
.bigco-figure {
  flex: 0 0 auto; text-align: center; line-height: 1;
  color: var(--tc-ink);
  padding-inline-end: 2rem;
  border-inline-end: 1px solid var(--tc-pill);
}
.bigco-figure b {
  display: block;
  font-family: "Manrope", sans-serif;
  font-size: 3.1rem; font-weight: 800; letter-spacing: -0.04em;
}
.bigco-figure small {
  display: block; margin-block-start: 0.35rem;
  font-size: 0.7rem; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.14em;
}

.bigco-text { flex: 1 1 auto; min-inline-size: 0; }
.bigco-text h2 {
  font-family: "Manrope", sans-serif;
  font-size: 1.4rem; font-weight: 700; line-height: 1.25;
  color: var(--ink-900);
}
.bigco-text p { margin-block-start: 0.5rem; color: var(--ink-600); font-size: 0.95rem; line-height: 1.55; }

.bigco .btn { flex: 0 0 auto; }

/* Debajo de 860 px la fila no cabe: la cifra pasa arriba y el filete de separacion cambia de
   lado, porque un filete vertical entre dos bloques apilados no separa nada. */
@media (max-width: 859px) {
  .bigco { flex-direction: column; align-items: flex-start; gap: 1.25rem; padding: 1.75rem; }
  .bigco-figure {
    display: flex; align-items: baseline; gap: 0.6rem;
    padding-inline-end: 0; border-inline-end: 0;
  }
  .bigco-figure b { font-size: 2.2rem; }
  .bigco-figure small { margin-block-start: 0; }
  .bigco .btn { align-self: stretch; justify-content: center; }
}


/* Rotulos y letra fina del pie. Iban con text-white/40, que sobre el negro del pie da 3,77:1,
   por debajo del 4,5:1 de WCAG. Al 60 % da 7,30:1. Va como clase y no como utilidad porque
   tailwind.build.css se genera a mano y no trae text-white/60. */
.footer-muted { color: rgba(255, 255, 255, 0.6); }

/* ============================================================
   Panel de accesibilidad
   ============================================================ */

/* El lanzador, abajo a la izquierda. El boton de volver arriba esta en la misma esquina y se
   apila justo encima: solo aparece con la pagina bajada, asi que la mayor parte del tiempo
   este va solo. A la derecha no cabe, que ahi se pone el lanzador del chat. */
.a11y-launcher {
  position: fixed; inset-block-end: 1.5rem; inset-inline-start: 1.5rem;
  inline-size: 3rem; block-size: 3rem;
  display: none; place-items: center;
  border: 1px solid var(--ink-200); border-radius: 50%;
  background: white; color: var(--ink-900); cursor: pointer;
  box-shadow: 0 10px 30px -12px rgba(10, 10, 11, 0.3);
  z-index: 60;
  transition: box-shadow 0.35s var(--ease-out-expo), transform 0.35s var(--ease-out-expo);
}
/* Sin JavaScript el boton no haria nada al pulsarlo, asi que no se enseña. La clase la pone
   accesibilidad.js en cuanto arranca. */
.js-a11y .a11y-launcher { display: grid; }
.a11y-launcher:hover { box-shadow: var(--shadow-lg); transform: translateY(-2px); }
.a11y-launcher svg { inline-size: 1.5rem; block-size: 1.5rem; }
.a11y-launcher[aria-expanded="true"] { background: var(--ink-900); color: white; border-color: var(--ink-900); }

/* Con el panel abierto, el boton de volver arriba queda justo debajo y estorba: se aparta. */
.a11y.is-open ~ .to-top { opacity: 0; visibility: hidden; }

/* El boton de volver arriba sube, para no taparse con el de accesibilidad. */
.to-top { inset-block-end: 5.5rem; }

.a11y-panel {
  position: fixed; inset-block-end: 5.5rem; inset-inline-start: 1.5rem;
  inline-size: min(21rem, calc(100vw - 3rem));
  max-block-size: min(32rem, calc(100vh - 8rem));
  overflow-y: auto;
  background: white; border: 1px solid var(--ink-200); border-radius: 22px;
  box-shadow: var(--shadow-lg);
  padding: 1.25rem; z-index: 61;
}
.a11y-header { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-block-end: 1rem; }
.a11y-header h2 { font-family: "Manrope", sans-serif; font-size: 1.05rem; font-weight: 700; color: var(--ink-900); }
.a11y-close {
  inline-size: 2rem; block-size: 2rem; flex: 0 0 auto;
  display: grid; place-items: center;
  border: 1px solid var(--ink-200); border-radius: 50%;
  background: white; color: var(--ink-700); cursor: pointer;
}
.a11y-close:hover { background: var(--ink-100); }
.a11y-close svg { inline-size: 0.85rem; block-size: 0.85rem; }

.a11y-group { border: 0; padding: 0; margin: 0 0 1rem; }
.a11y-group legend {
  padding: 0; margin-block-end: 0.55rem;
  font-size: 0.72rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-600);
}
.a11y-sizes { display: flex; gap: 0.5rem; }
.a11y-sizes button {
  flex: 1; min-block-size: 2.75rem;
  border: 1px solid var(--ink-200); border-radius: 12px;
  background: white; color: var(--ink-900); cursor: pointer;
  font-family: "Manrope", sans-serif; font-weight: 700;
}
.a11y-sizes button:nth-child(1) { font-size: 0.9rem; }
.a11y-sizes button:nth-child(2) { font-size: 1.15rem; }
.a11y-sizes button:nth-child(3) { font-size: 1.4rem; }
.a11y-sizes button[aria-checked="true"] { background: var(--ink-900); color: white; border-color: var(--ink-900); }

.a11y-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.4rem; }
.a11y-list button {
  inline-size: 100%; text-align: start;
  display: grid; grid-template-columns: 1fr auto; align-items: center;
  gap: 0.15rem 0.75rem;
  padding: 0.7rem 0.8rem;
  border: 1px solid var(--ink-200); border-radius: 14px;
  background: white; cursor: pointer;
}
.a11y-list button:hover { background: var(--ink-50); }
.a11y-label { font-size: 0.9rem; font-weight: 600; color: var(--ink-900); }
.a11y-hint { grid-column: 1; font-size: 0.75rem; color: var(--ink-600); line-height: 1.4; }

/* El interruptor. Solo repite lo que ya dice aria-pressed, asi que va oculto a los lectores. */
.a11y-switch {
  grid-row: 1 / 3; grid-column: 2;
  inline-size: 2.4rem; block-size: 1.35rem; flex: 0 0 auto;
  border-radius: 999px; background: var(--ink-300);
  position: relative; transition: background 0.25s ease;
}
.a11y-switch::after {
  content: ""; position: absolute; inset-block-start: 3px; inset-inline-start: 3px;
  inline-size: 1.05rem; block-size: 1.05rem; border-radius: 50%;
  background: white; box-shadow: 0 1px 3px rgba(10, 10, 11, 0.25);
  transition: translate 0.25s var(--ease-out-expo);
}
.a11y-list button[aria-pressed="true"] .a11y-switch { background: var(--brand-blue-fuerte); }
.a11y-list button[aria-pressed="true"] .a11y-switch::after { translate: 1.05rem 0; }

.a11y-reset {
  inline-size: 100%; margin-block-start: 1rem;
  padding: 0.7rem 1rem; min-block-size: 2.75rem;
  border: 1px solid var(--ink-300); border-radius: 999px;
  background: white; color: var(--ink-900); font-weight: 600; font-size: 0.875rem; cursor: pointer;
}
.a11y-reset:hover { background: var(--ink-100); }
.a11y-note { margin-block-start: 0.7rem; font-size: 0.72rem; color: var(--ink-600); text-align: center; }

@media (max-width: 639px) {
  .a11y-launcher { inset-block-end: 1rem; inset-inline-start: 1rem; inline-size: 2.75rem; block-size: 2.75rem; }
  .a11y-panel { inset-block-end: 4.5rem; inset-inline-start: 1rem; inline-size: calc(100vw - 2rem); }
  .to-top { inset-block-end: 4.75rem; }
}

/* ---- Lo que hace cada ajuste ---------------------------------------------------------- */

/* Tamaño del texto. El sitio mide casi todo en rem, asi que mover la raiz lo escala entero.
   Los dos saltos son moderados a proposito: pasado el +25 % las rejillas de tres columnas
   empiezan a descuadrarse, y un ajuste que rompe la pagina no lo usa nadie. */
.a11y-text-1 { font-size: 112.5%; }
.a11y-text-2 { font-size: 125%; }

/* Mas contraste: los grises de texto secundario bajan un escalon y los filetes se marcan.
   El texto principal no se toca, que ya va casi negro. */
.a11y-contrast {
  --ink-500: #52525B;
  --ink-600: #27272A;
  --ink-400: #52525B;
  --ink-300: #71717A;
  --ink-200: #A1A1AA;
}

/* Subrayar enlaces: el criterio 1.4.1 pide no distinguirlos solo por el color. En el cuerpo
   del sitio no van subrayados; con esto si, salvo los que ya se ven como controles. */
.a11y-links a:not(.btn):not(.tag):not(.blog-cat):not(.marquee-logo):not(.rec-card-liga):not(.nav-link):not(.mm-link) {
  text-decoration: underline;
  text-underline-offset: 0.18em;
}

/* Detener animaciones: lo mismo que hace prefers-reduced-motion, pero a peticion. */
.a11y-still *,
.a11y-still *::before,
.a11y-still *::after {
  animation-duration: 0.001ms !important;
  animation-iteration-count: 1 !important;
  transition-duration: 0.001ms !important;
  scroll-behavior: auto !important;
}

/* Espaciado de texto: son los valores exactos del criterio 1.4.12 de WCAG. */
.a11y-spacing p,
.a11y-spacing li,
.a11y-spacing dd,
.a11y-spacing figcaption {
  line-height: 1.5 !important;
  letter-spacing: 0.12em !important;
  word-spacing: 0.16em !important;
}
.a11y-spacing p { margin-block-end: 2em !important; }

/* Tipografia sin adornos: se cae a la del sistema, que quien navega ya tiene instalada y
   suele tener ajustada a su gusto. No se descarga ninguna fuente nueva. */
.a11y-plainfont,
.a11y-plainfont body,
.a11y-plainfont h1, .a11y-plainfont h2, .a11y-plainfont h3,
.a11y-plainfont h4, .a11y-plainfont h5, .a11y-plainfont h6,
.a11y-plainfont .font-display,
.a11y-plainfont [class*="font-display"] {
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important;
}

/* Resaltar el foco. El sitio ya trae :focus-visible en los controles, pero fino; esto lo pone
   imposible de perder, que es de lo que se trata. */
.a11y-focus :focus-visible {
  outline: 3px solid #1C6274 !important;
  outline-offset: 3px !important;
  border-radius: 4px;
}

/* ---- Los ultimos restos de contraste y de tamaño de objetivo ------------------------------
   Vienen de la auditoria con axe: eran los dos unicos pares de color que quedaban fallando y
   el unico control por debajo del minimo de tamaño. */

/* .text-brand-blue es una utilidad que pinta --brand-blue (#3AA5BE) directamente sobre blanco:
   2,87:1, por debajo del 4,5:1 de WCAG. Para texto existe --brand-blue-texto, que es el mismo
   azul preparado para leerse. La utilidad se queda, pero apuntando a donde debe. */
.text-brand-blue { color: var(--brand-blue-texto); }

/* La fecha de las tarjetas de entrada fuera de .blog-card se quedaba en --ink-400 (2,56:1).
   Dentro de .blog-card ya iba en --ink-500; esto lo iguala en los demas sitios. */
.blog-meta time { color: var(--ink-500); }

/* Los puntos del carrusel miden 8x8 y WCAG 2.5.8 pide 24x24 de zona pulsable. El punto sigue
   viendose igual de pequeño —es lo que pide el diseño— y lo que crece es la zona sensible, con
   un pseudoelemento invisible centrado encima. */
.wb-dot { position: relative; }
.wb-dot::after {
  content: ""; position: absolute;
  inset-block-start: 50%; inset-inline-start: 50%;
  translate: -50% -50%;
  inline-size: 24px; block-size: 24px;
}


.boxImg {
      width: 80px;
    height: 80px;
    display: flex;
    align-items: center;
    justify-content: center;

}
.secText  {
  blockquote, dd, dl, figure, h1, h2, h3, h4, h5, h6, hr, p, pre {
    margin-bottom: 0.75rem;
}
}
.secText {
  menu, ol, ul {
     list-style: revert-layer;
    margin: revert;
    padding: revert;
  }
}

/* ============================================================
   COMPACTAR EN MOVIL
   Menos aire y letra mas pequeña por debajo de 640px: el relleno de las secciones y los
   titulares se pensaron para escritorio y en el movil se quedaban igual de grandes, lo que
   obligaba a scrollear mucho mas de la cuenta para avanzar poco.
   ============================================================ */
@media (max-width: 640px) {
  /* Relleno vertical de las secciones por bloque (.sec, ver arriba): un poco menos de aire
     arriba y abajo en todas, sin tocar el valor de escritorio (>=768px). */
  .sec        { --sec-pt-m: 3.5rem; --sec-pb-m: 3.5rem; }
  .sec-medium { --sec-pt-m: 3rem;   --sec-pb-m: 3rem; }
  .sec-tight  { --sec-pt-m: 2rem;   --sec-pb-m: 2rem; }
  .sec-hero   { --sec-pt-m: 7rem;   --sec-pb-m: 4rem; }

  /* Titulares: .headline se usa en h1, h2 y h3 por todo el sitio (hero, encabezados de
     bloque, CTA final...) combinado con la utilidad de Tailwind que fija el tamaño. Solo se
     tocan las combinaciones que superan el tope pedido; las que ya iban mas pequeñas
     (text-2xl, text-3xl en h2/h3) se dejan como estaban. */
  h1.headline.text-5xl, h1.headline.text-6xl, h1.headline.text-7xl {
    font-size: 2.25rem !important;   /* tope: text-4xl */
  }
  h2.headline.text-4xl, h2.headline.text-5xl, h2.headline.text-6xl, h2.headline.text-7xl,
  h3.headline.text-4xl, h3.headline.text-5xl, h3.headline.text-6xl, h3.headline.text-7xl {
    font-size: 1.875rem !important;  /* tope: text-3xl (30px) */
  }
  .dst-title { font-size: 1.875rem; }

  /* Subtitulos: en casi toda plantilla es la misma utilidad (text-lg) la que pone el
     parrafo de introduccion bajo el titular —encabezados de bloque, CTA final, hero—. */
  .text-lg { font-size: 1rem !important; line-height: 1.5rem !important; }
  .dst-text { font-size: 1rem; }
  /* La entradilla de la cabecera del blog pide quedarse en text-lg (18px), no bajar a los
     16px genericos de ahi arriba: misma especificidad, pero esta va despues y gana. */
  .blog-resumen { font-size: 1.125rem !important; line-height: 1.75rem !important; }

  /* Pregunta del acordeon de FAQ. */
  .faq-item .faq-q { font-size: 1rem; }

  /* .btn lleva white-space: nowrap para que la flecha no salte de linea sola en escritorio,
     pero eso mismo hacia que un texto de boton largo (el CTA final sobre todo) no pudiera
     partirse y empujara el ancho del boton mas alla del contenido. En movil se permite partir,
     y balanceada para que no quede una palabra sola en la segunda linea. */
  .btn { white-space: normal; text-wrap: balance; }

  /* Cuerpo del articulo: la seccion ya pone py-16 y cada bloque de dentro ya no aporta el
     suyo (ver .cuerpo-entrada .sec arriba); en movil con menos alto de sobra, pb-16 era mas
     de lo que hacia falta antes del primer bloque. */
  .cuerpo-seccion { padding-top: 3rem; padding-bottom: 0; }
  /* Cada bloque trae su propio px-6 ademas del de la seccion que lo envuelve (tambien px-6):
     en movil, con menos ancho de sobra, los dos juntos dejaban la columna de lectura
     mas estrecha de lo necesario. El de la seccion basta. */
  .cuerpo-entrada section > div { padding-left: 0; padding-right: 0; }
}