/* ==========================================================================
   INDICADORES CLAVE — Hoja de estilos única del sitio
   Paleta y tipografia: ver seccion 6 de ESPECIFICACION_SITIO_WEB.md
   ========================================================================== */

/* ----- 1. Variables de marca ----- */
:root {
  --ink: #16202E;
  --slate: #1F3350;
  --teal: #0F6E6E;
  --gold: #F0B429;
  --gold-hover: #d99f1f;
  --crimson: #9B2226;
  --amber: #B07100;
  --forest: #2A6041;
  --grey: #5A6875;
  --rule: #C9D2DB;
  --band: #EEF2F6;
  --soft: #F6F8FA;
  /* Cuarto fondo claro, para que el ritmo de bandas de la portada tenga cuatro
     escalones y no tres. Es --slate al 12% sobre --paper, no un color nuevo:
     mismo tono institucional, un paso mas profundo que --band. */
  --tinte: #E4E7EA;
  --bg-red: #FBF0F0;
  --bg-amber: #FDF6EA;
  --bg-grey: #F2F4F6;
  --bg-green: #EDF4EF;
  --paper: #FFFFFF;

  /* Semaforo de riesgo CRITICO/ALTO/MEDIO/BAJO: tomado tal cual del CSS real
     de los dashboards NexoRisk (informe_style / Dashboard Gerencial), porque
     el producto es la fuente de verdad (regla 6.1.4 de la especificacion). */
  --nivel-critico: #C0392B;
  --nivel-critico-bg: #FBEAE7;
  --nivel-alto: #E07B39;
  --nivel-alto-bg: #FCEEE1;
  --nivel-medio: #E8B83A;
  --nivel-medio-bg: #FDF4DD;
  --nivel-bajo: #3E9E5B;
  --nivel-bajo-bg: #E7F5EC;

  --font-display: 'Sora', 'Segoe UI', Arial, sans-serif;
  --font-text: 'Inter', 'Segoe UI', Arial, sans-serif;
  --font-mono: 'IBM Plex Mono', 'Consolas', monospace;

  /* Sistema de anchos del Paso 1. --container y --container-wide son ancho de
     CONTENIDO: el max-width de .section__inner les suma los dos gutters, porque
     con box-sizing:border-box el padding se descuenta por dentro. Sin esa suma,
     --container: 1320px daria 1192px de contenido a 1920px de ventana. */
  --container: 1440px;
  /* 1658 = 1440 * (1520/1320): la misma proporcion que tenian antes. */
  --container-wide: 1658px;
  --gutter: clamp(20px, 4vw, 64px);
  --section-y: clamp(56px, 7vw, 128px);

  --radius-sm: 8px;
  --radius-md: 12px;
  --shadow-sm: 0 1px 2px rgba(22, 32, 46, 0.08), 0 1px 1px rgba(22, 32, 46, 0.04);
  --shadow-md: 0 8px 24px rgba(22, 32, 46, 0.10);
  --header-h: 72px;
}

/* ----- 2. Reset base ----- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
}
body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-text);
  font-size: 1.0625rem;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}
img { max-width: 100%; height: auto; display: block; }
svg { max-width: 100%; }
a { color: var(--teal); text-decoration-thickness: 1.5px; text-underline-offset: 2px; }
a:hover { color: var(--slate); }
ul, ol { padding-left: 1.25rem; }
button { font-family: inherit; }
table { border-collapse: collapse; width: 100%; }

h1, h2, h3, h4 {
  font-family: var(--font-display);
  color: var(--slate);
  line-height: 1.2;
  margin: 0 0 0.75rem;
  font-weight: 700;
}
/* Escala fluida del Paso 1. Sustituye a la anterior, no se suma: cada regla
   declara su propio line-height, que gana al 1.2 del bloque de arriba por ir
   despues con la misma especificidad. */
/* Techo 3rem (48px), medido sobre el titular real y no heredado de otra
   escala. Lo que descuadra el reparto no es el numero de caracteres sino la
   palabra mas larga, "cooperativa": obliga a que la columna mida al menos
   unas 10,5 veces el tamano de letra para no romper mal. Con 4.5rem (72px)
   habrian hecho falta 770px de columna contra los 640 de max-width, y el
   titular rompia en 6 lineas. Medido a 1280, 1440 y 1920px: 4, 3 y 3 lineas,
   con la linea mas corta al 62%, 89% y 82% de la columna. */
h1 { font-size: clamp(2.25rem, 1.2rem + 3.4vw, 3rem); line-height: 1.05; letter-spacing: -0.02em; }
h2 { font-size: clamp(1.75rem, 1rem + 2.2vw, 3rem); line-height: 1.12; letter-spacing: -0.01em; }
/* Ningun encabezado va en teal. En el sistema el teal significa "esto es
   interactivo", y un encabezado no lo es: se reserva para enlaces reales y
   para el hover/foco de las tarjetas que si son un enlace entero. */
h3 { font-size: clamp(1.25rem, 0.95rem + 0.9vw, 1.75rem); line-height: 1.2; color: var(--slate); font-weight: 600; }
h4 { font-size: 1.05rem; font-weight: 600; color: var(--slate); }
p { margin: 0 0 1rem; }
p:last-child { margin-bottom: 0; }

:focus-visible {
  outline: 3px solid var(--teal);
  outline-offset: 2px;
  border-radius: 3px;
}

/* ----- 3. Utilidades ----- */
.visualmente-oculto {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

/* El enlace de salto se esconde con translateY sobre su propia altura, no con
   un `top` negativo fijo: con `top: -3rem` (-48px) y una altura real de
   ~48.8px asomaba 1px de su fondo dorado en el borde superior de la ventana.
   El calc() lo deja siempre justo por encima, mida lo que mida. */
.saltar-al-contenido {
  position: absolute;
  left: 0.75rem;
  top: 0.75rem;
  transform: translateY(calc(-100% - 1.5rem));
  background: var(--gold);
  color: var(--ink);
  font-weight: 600;
  padding: 0.65rem 1.1rem;
  border-radius: var(--radius-sm);
  z-index: 1000;
  transition: transform 0.15s ease;
}
.saltar-al-contenido:focus { transform: none; }

/* ----- Sistema de seccion en dos capas (Paso 1) -----
   .section lleva el fondo y el ritmo vertical, a todo el ancho de la ventana.
   .section__inner lleva el contenido y es quien lo limita y lo centra.
   Header y pie usan .section__inner tambien, para que el logo y el borde
   izquierdo del contenido caigan en la misma vertical exacta. */
.section { width: 100%; padding-block: var(--section-y); }
.section__inner {
  width: 100%;
  max-width: calc(var(--container) + 2 * var(--gutter));
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.section__inner--wide { max-width: calc(var(--container-wide) + 2 * var(--gutter)); }

/* Limites de medida, solo dentro del sistema nuevo (hoy, solo la portada). */
.section .cabecera-seccion { max-width: 68ch; }
.section .callout p { max-width: 68ch; }
/* Medidas editoriales estrechas. Van en un div DENTRO de .section__inner, no
   sobre el: si se le pone el max-width al propio .section__inner, el gutter se
   descuenta por dentro y un bloque de 800px se queda en 672 de contenido. */
.medida-560, .medida-640, .medida-720, .medida-800 { margin-inline: auto; }
/* Cancelan el centrado cuando la medida debe pegarse a un borde del
   contenedor en lugar de quedar centrada. */
.medida--izquierda { margin-inline: 0; }
.medida--derecha { margin-inline: 0; }
.medida-560 { max-width: 560px; }
.medida-640 { max-width: 640px; }
.medida-720 { max-width: 720px; }
.medida-800 { max-width: 800px; }

/* Rejillas fluidas. Al ir prefijadas por .section solo aplican en las paginas
   ya migradas; las demas conservan sus columnas fijas hasta que migren. */
.section .rejilla-2,
.section .rejilla-3,
.section .rejilla-4 { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

/* Ritmo vertical antiguo. Solo lo usan las paginas sin migrar: en la portada
   ninguna seccion lleva ya esta clase, asi que no se superpone con
   --section-y. Se retira cuando termine la migracion. */
.seccion { padding: clamp(3rem, 6vw, 5.5rem) 0; }
.seccion--banda { background: var(--band); }
.seccion--suave { background: var(--soft); }
.seccion--tinte { background: var(--tinte); }
.seccion--slate { background: var(--slate); color: #E7ECF2; }
.seccion--slate h1, .seccion--slate h2, .seccion--slate h3 { color: #FFFFFF; }
.seccion--slate .eyebrow { color: #7FD4CE; }
.seccion--slate a:not(.boton-primario):not(.boton-secundario):not(.boton-acento) { color: #7FD4CE; }
/* --ink es el punto mas oscuro del sistema y esta reservado al PIE, que es el
   suelo visual de la pagina. El CTA de cierre va un escalon por encima, en
   --slate, para que las dos ultimas bandas tengan jerarquia y no se lean como
   una sola masa oscura. Esta clase se conserva para las paginas que aun la
   usen en otro sitio, pero ninguna seccion de cierre deberia llevarla. */
.seccion--ink { background: var(--ink); color: #E7ECF2; }
.seccion--ink h1, .seccion--ink h2, .seccion--ink h3 { color: #FFFFFF; }
.seccion--ink .eyebrow { color: #7FD4CE; }
.seccion--ink a:not(.boton-primario):not(.boton-secundario):not(.boton-acento) { color: #7FD4CE; }
.seccion--ink .boton-secundario { border-color: #fff; color: #fff; }
.seccion--ink .boton-secundario:hover { background: #fff; color: var(--ink); }

.cabecera-seccion { max-width: 760px; margin: 0 0 2.5rem; }
.cabecera-seccion--centro { margin-left: auto; margin-right: auto; text-align: center; }

/* Encabezado de seccion centrado sobre el ancho del contenedor. Clase propia y
   no un modificador de .cabecera-seccion, porque esa lleva max-width 68ch con
   dos clases de especificidad y ganaria.
   Los 1000px salen de un barrido de 860 a 1180 evaluado a la vez en 1280,
   1440 y 1920: el tramo que da 2 lineas sin ninguna corta en los tres es
   960-1100. Con 900 el titular caia en 3 lineas a 1440 y 1920 dejando
   "socios." solo, al 19% del ancho. */
.encabezado-centrado { max-width: 1000px; margin: 0 auto 3.25rem; text-align: center; }
/* El parrafo se centra como bloque, pero su texto va a bandera izquierda: son
   cinco lineas, y con el texto centrado el ojo pierde el arranque de cada
   renglon. */
.encabezado-centrado > p { max-width: 68ch; margin-inline: auto; text-align: left; }

/* Cuatro pilares sin caja: icono, titulo y parrafo directamente sobre la
   banda. Sin borde, fondo ni sombra, que es lo que los hace ligeros.
   Puntos de corte medidos sobre el ancho de columna, no elegidos a ojo: con
   un minimo comodo de ~260px por columna y 3rem de calle, cuatro columnas
   piden 1160px de contenido, o sea 1260px de ventana (el contenido es 0.92 de
   la ventana hasta 1600px). Se redondea a 1280. Dos columnas piden 560px de
   contenido, o sea 609px de ventana; se redondea a los 640px que ya usa el
   resto del sistema. A 1024 quedarian en 205px por columna, demasiado
   estrechas, asi que ahi van dos. */
.pilares { display: grid; gap: 2.75rem 3rem; grid-template-columns: 1fr; align-items: start; }
@media (min-width: 640px) { .pilares { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1280px) { .pilares { grid-template-columns: repeat(4, 1fr); } }
/* Caja de alto fijo: asi los cuatro titulares arrancan en la misma linea
   aunque el dibujo de cada icono ocupe distinto alto dentro del lienzo. */
.pilar__icono { display: block; width: 60px; height: 60px; margin-bottom: 1.15rem; }
.pilar h3 { font-size: 1.1rem; line-height: 1.3; margin: 0 0 0.55rem; }
.pilar p { margin: 0; color: var(--grey); font-size: 0.98rem; }

/* ----- Seccion "Cuando la informacion esta dispersa" (solo la portada) -----
   Texto a la izquierda, los cuatro dolores apilados dentro de una tarjeta a la
   derecha. El reparto es 40/60 a favor de la tarjeta: los dolores son el
   contenido de la seccion y el bloque de texto solo los enmarca.
   Se apila en el MISMO punto que .hero__rejilla y .bloque-quienes, 1120px, y
   no en uno propio. Las tres son composiciones de dos columnas en la mitad de
   arriba de la portada: si cada una se partiera en un ancho distinto, al
   estrechar la ventana la pagina se reordenaria tres veces en lugar de una.
   El bloque NO lleva max-width. Lo llevo, de 1200px, y era un error: a 1920 el
   contenido mide 1440 y el bloque se paraba en 1200, asi que la seccion dejaba
   240px muertos a la derecha y se veia cargada a la izquierda. El ancho de
   medida se controla dentro de la tarjeta, con el acolchado fluido de abajo,
   que es donde corresponde: recortar el bloque entero para arreglar la medida
   de un parrafo desalineaba la seccion con el resto de la portada. */
.dolores { display: grid; gap: 2.5rem; grid-template-columns: 1fr; align-items: start; }
@media (min-width: 1120px) {
  .dolores { grid-template-columns: 0.4fr 0.6fr; gap: 3.5rem; }
}
/* Tope de medida del bloque de texto. No lleva media query porque no le hace
   falta: en dos columnas la columna izquierda mide entre 390 y 554px, siempre
   por debajo de 68ch, asi que la regla solo muerde apilado, que es donde el
   parrafo de entrada llegaba a 121 caracteres por linea. */
.dolores__texto { max-width: 68ch; }
.dolores__texto > p:last-child { margin-bottom: 0; }

/* Tarjeta blanca sobre fondo blanco: lo que la despega es la sombra, no el
   borde, asi que el borde va mas claro que el --rule de .tarjeta (que se usa
   sobre bandas de color, donde si contrasta solo) y la sombra es mas abierta y
   mas baja que --shadow-sm.
   El acolchado horizontal es fluido y es quien sostiene la medida ahora que la
   tarjeta ocupa toda su columna: crece con la ventana y se come parte de lo
   que gana la columna, asi que el texto sube de 54 a 79 caracteres por linea
   entre 1120 y 1920 en vez de a 85. El suelo de 1.25rem es para el movil, y el
   techo de 3.5rem para que a 1920 no se convierta en un marco. */
.dolores__tarjeta {
  background: var(--paper);
  border: 1px solid rgba(31, 51, 80, 0.10);
  border-radius: var(--radius-md);
  box-shadow: 0 2px 4px rgba(22, 32, 46, 0.04), 0 12px 32px -12px rgba(22, 32, 46, 0.16);
  padding-block: 0.5rem;
  padding-inline: clamp(1.25rem, 0.1rem + 2.9vw, 3.5rem);
}
/* El tope de la tarjeta SOLO apilado, que es donde hace falta: a 1119 el
   bloque mide 1030px de ancho y sin tope el parrafo del dolor se iba a 113
   caracteres por linea. En dos columnas estorbaba: la columna llega a 830px a
   1920 y un tope de 690 habria dejado la tarjeta corta dentro de su propia
   columna. Los 690 son los mismos 686 que medía en dos columnas a 1440. */
@media (max-width: 1119px) { .dolores__tarjeta { max-width: 690px; } }

/* Rejilla de dos columnas por dolor: el icono ocupa las dos filas y se queda
   arriba, y el parrafo entra bajo el titulo, no bajo el icono. La calle sube
   con el icono, de 1.25rem a 1.75rem, que es la misma proporcion (40->56). */
.dolor {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr);
  column-gap: 1.75rem;
  padding: 1.75rem 0;
}
/* La linea separa, no enmarca: entre dolor y dolor, nunca arriba del primero
   ni debajo del ultimo, donde ya esta el borde de la tarjeta. */
.dolor + .dolor { border-top: 1px solid rgba(31, 51, 80, 0.10); }
/* El -0.2rem no es un ajuste a ojo: el titulo mide 18.4px de letra en una caja
   de linea de 24, asi que su mayuscula arranca unos 3px por debajo del borde
   de la caja. Sin corregirlo el icono se ve caido respecto al titulo. */
.dolor__icono { grid-column: 1; grid-row: 1 / span 2; align-self: start; width: 56px; height: 56px; margin-top: -0.2rem; }
/* min-width:0 en los dos items de la columna de texto: son ellos, no
   .dolor, los que ocupan grid-column:2, y heredan min-width:auto por
   separado. Hoy el texto cabe de sobra, pero sin esto una sola palabra
   larga podria forzar la columna a crecer mas alla de su 1fr. */
.dolor h3 { grid-column: 2; grid-row: 1; min-width: 0; font-size: 1.15rem; line-height: 1.3; margin: 0 0 0.5rem; }
.dolor p { grid-column: 2; grid-row: 2; min-width: 0; margin: 0; color: var(--grey); font-size: 1rem; line-height: 1.6; }

/* En movil el icono se va ENCIMA del titulo. A 360 la tarjeta deja 278px
   utiles: con el icono al lado, la columna de texto se quedaba en 218px, unos
   27 caracteres por linea, y el segundo dolor caia en 12 lineas. Subiendolo se
   recuperan los 84px de la columna del icono y su calle, y el texto pasa a
   278px, unos 35 caracteres. El corte va en 480 porque desde ahi la columna de
   texto ya pasa de 30 caracteres con el icono al lado. */
@media (max-width: 479px) {
  .dolor { grid-template-columns: minmax(0, 1fr); }
  .dolor__icono { grid-row: 1; margin-top: 0; margin-bottom: 0.9rem; }
  .dolor h3 { grid-column: 1; grid-row: 2; }
  .dolor p { grid-column: 1; grid-row: 3; }
}

/* ----- Seccion de Recursos (solo la portada) -----
   Sin caja, como .pilares y .dolores: los articulos van directamente sobre la
   banda, sin borde, fondo ni sombra.
   Al quitar la tarjeta se pierde la unica pista de que el bloque es clicable,
   asi que se conserva el "Leer el articulo" al pie de cada uno: es lo que
   sostiene la afordancia ahora que no hay borde. El titulo pasa a teal al
   pasar por encima o al enfocar, que refuerza lo mismo. */
/* La tarjeta entera es un <a>. Ese <a> DEBE llevar text-decoration: none, y no
   por estetica: el subrayado de un enlace lo pinta el propio enlace a lo largo
   de todo su contenido, asi que sin esta linea el titulo y el parrafo salen
   subrayados aunque su text-decoration computado siga diciendo "none". Los
   descendientes no pueden quitarselo. El subrayado se reserva al pie de la
   tarjeta, y solo al pasar por encima o al enfocar. */
.recurso { display: flex; flex-direction: column; height: 100%; text-decoration: none; color: inherit; }
.recurso__ilustracion {
  display: block;
  aspect-ratio: 16 / 10;
  margin-bottom: 1.15rem;
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: 10px;
  overflow: hidden;
}
.recurso__ilustracion svg { display: block; width: 100%; height: 100%; }
.recurso__titulo {
  display: block;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 1.15rem;
  line-height: 1.3;
  color: var(--slate);
  margin-bottom: 0.55rem;
  transition: color 0.15s ease;
}
.recurso__apoyo { display: block; margin-bottom: 0.9rem; color: var(--grey); font-size: 1rem; line-height: 1.6; }
.recurso__enlace { display: block; margin-top: auto; font-weight: 600; color: var(--teal); }
.recurso:hover .recurso__titulo, .recurso:focus-visible .recurso__titulo { color: var(--teal); }
.recurso:hover .recurso__enlace, .recurso:focus-visible .recurso__enlace { text-decoration: underline; }

/* ----- Carrusel -----
   El desplazamiento es scroll nativo con scroll-snap, no un translate en JS.
   Eso da gratis el arrastre tactil, la rueda horizontal y el comportamiento
   correcto al hacer zoom, y deja a JS solo tres tareas: mover de pagina,
   pintar el estado y sacar del Tab lo que no se ve.
   El numero de tarjetas por pagina no esta escrito en ningun sitio: sale del
   ancho de la pista y del de una tarjeta, asi que pasar de 3 articulos a 10 no
   toca ni una linea de codigo. */
.carrusel { position: relative; }
.carrusel__pista {
  list-style: none;
  margin: 0;
  padding: 0 0 0.5rem;
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: calc((100% - 2 * 2rem) / 3);
  gap: 2rem;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
}
.carrusel__pista::-webkit-scrollbar { display: none; }
@media (max-width: 1023px) { .carrusel__pista { grid-auto-columns: calc((100% - 2rem) / 2); } }
@media (max-width: 639px)  { .carrusel__pista { grid-auto-columns: 100%; gap: 1.5rem; } }
.carrusel__item { scroll-snap-align: start; min-width: 0; }

.carrusel__controles { display: flex; align-items: center; justify-content: center; gap: 1rem; margin-top: 1.75rem; }
.carrusel__flecha {
  width: 2.75rem; height: 2.75rem;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 1.5rem; line-height: 1;
  border: 1px solid var(--slate);
  border-radius: 50%;
  background: transparent;
  color: var(--slate);
  cursor: pointer;
  transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;
}
.carrusel__flecha:hover:not([aria-disabled="true"]) { background: var(--slate); color: #fff; }
/* En el extremo la flecha se apaga, no se va: si desapareciera, los controles
   se moverian de sitio a cada pagina. */
.carrusel__flecha[aria-disabled="true"] { opacity: 0.45; cursor: default; }
.carrusel__puntos { display: flex; align-items: center; gap: 0.5rem; }
.carrusel__punto {
  width: 0.6rem; height: 0.6rem;
  padding: 0; border: 0; border-radius: 50%;
  background: var(--rule);
  cursor: pointer;
  transition: background-color 0.15s ease, transform 0.15s ease;
}
.carrusel__punto[aria-current="true"] { background: var(--teal); transform: scale(1.25); }
/* El punto mide 0.6rem, pero el objetivo tactil es el area de 44px que le da
   este acolchado, por encima del minimo de la WCAG 2.5.8. */
.carrusel__puntos { padding: 0.75rem 0; }
.carrusel__punto { box-shadow: 0 0 0 0.65rem transparent; }

@media (prefers-reduced-motion: reduce) {
  .carrusel__pista { scroll-behavior: auto; }
  .carrusel__punto, .carrusel__flecha, .recurso__titulo { transition: none; }
}
/* Salida a /recursos/ en enlace de texto, no en boton: el CTA de esta seccion
   no puede competir con la conversion principal de la pagina. */
.recursos__salida { margin: 2.75rem 0 0; text-align: center; }

/* El boton de "Explorelas usted mismo" quedaba pegado al ultimo renglon del
   parrafo: el patron parrafo+boton usa en todo el sitio el margen base de
   parrafo (1rem, de "p { margin: 0 0 1rem }") y no hay otra variable de
   espaciado parrafo-boton que replicar. Toma prestado el unico precedente de
   aire extra antes de un boton aislado que existe en el sistema, el de
   .modalidades__cta en /soluciones/ (2.5rem) -alli separa una rejilla de
   tarjetas de su boton, no un parrafo, pero es el mismo gesto: mas aire antes
   del unico CTA de la seccion. Acotado a esta seccion: el resto de pares
   parrafo+boton del sitio se quedan en 1rem. */
#demostraciones .grupo-botones { margin-top: 2.5rem; }

/* Mismo problema en los 4 articulos de /recursos/blog/ que llevan el CTA
   "Acceder a las demostraciones" dentro de una .tarjeta: el boton quedaba a
   1rem del parrafo. Una sola regla para los 4 (por el href, no por pagina),
   sin tocar los otros 2 articulos que en la misma estructura enlazan a
   /nexorisk/ en vez de a /demostraciones/.
   .boton-primario es inline-flex -outer display "inline"-, y los margenes de
   una caja inline no colapsan con los de un bloque vecino, se suman: por eso
   este margin-top es 1.5rem y no 2.5rem, para sumar al 1rem del parrafo y
   llegar a los mismos 2.5rem que el resto de CTA sueltos del sitio. */
.tarjeta > a.boton-primario[href="/demostraciones/#acceso"] { margin-top: 1.5rem; }


/* ----- Lista de articulos de /recursos/ -----
   Antes eran seis tarjetas-enlace del mismo peso que las dos de demostracion:
   ocho llamadas identicas en 219 palabras, sin ninguna dominante. Los
   articulos pasan a enlaces de texto para que el unico boton de la pagina sea
   el de las demostraciones, que es el primer paso real del embudo. */
/* De seis filas con filete en una columna de 68ch a rejilla de tarjetas. El
   68ch era medida de lectura aplicada a una pieza estructural: dejaba media
   pantalla vacia a la derecha y la lista ocupaba media pantalla de alto.
   No hace falta clase nueva: .lista-articulos ya es exclusiva de esta pagina y
   pasa de lista a rejilla. Las tarjetas son .tarjeta .tarjeta--enlace, que ya
   existian sin usarse y estan hechas justo para esto: toda la caja es enlace,
   con su elevacion y su titulo en teal al pasar el raton.
   No se usa .rejilla-iconos porque sus cortes son 640 y 1024, y aqui hacen
   falta 700 y 1100. */
.lista-articulos {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: 1.5rem; grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 700px) {
  .lista-articulos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1100px) {
  .lista-articulos { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* La descripcion se pega al fondo de la tarjeta para que las de una fila
   cierren igual aunque el titulo ocupe una linea mas. */
/* :not(.eyebrow) porque la etiqueta de tema tambien es un <p> dentro de la
   tarjeta, y esta regla, con dos clases, ganaba a .eyebrow y la pintaba de
   gris en vez de teal. */
.lista-articulos .tarjeta p:not(.eyebrow) { margin: 0.5rem 0 0; color: var(--grey); font-size: 0.95rem; line-height: 1.55; }
/* A una columna el relleno de 1.75rem se paga cinco veces seguidas y alargaba
   la seccion. Acotado a esta rejilla: .tarjeta la usan otras seis paginas. */
@media (max-width: 699px) {
  .lista-articulos .tarjeta { padding: 1rem; }
}

/* ----- Capacidades de /soluciones/ -----
   Indice a la IZQUIERDA y panel a la derecha, al reves que antes. Con el
   titular a la izquierda y la lista a la derecha, la columna izquierda se
   quedaba vacia 900px mientras el panel se estiraba: ahora la izquierda lleva
   el titular Y la lista, que es lo que la llena, y el panel manda en la
   derecha, que es donde hay sitio para dos columnas de texto.
   Mismo corte que el resto de composiciones de dos columnas del sitio. */
.capacidades { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); align-items: start; }
@media (min-width: 1024px) { .capacidades { grid-template-columns: 340px minmax(0, 1fr); gap: 3rem; } }
.capacidades > * { min-width: 0; }
.capacidades__indice p { color: var(--grey); }
.capacidades__lista { list-style: none; margin: 1.75rem 0 0; padding: 0; }
.capacidad + .capacidad { border-top: 1px solid var(--rule); }
/* La barra de acento vive en el boton, no en el contenedor, para que aparezca
   tambien al enfocar con teclado y no solo al abrir. */
.capacidad__boton {
  width: 100%; display: block; text-align: left;
  padding: 1rem 0 1rem 1.1rem;
  border: 0; border-left: 3px solid transparent; background: none; cursor: pointer;
  font-family: var(--font-display); font-size: 1.05rem; line-height: 1.3; font-weight: 500;
  color: var(--grey);
  transition: color 0.15s ease, border-color 0.15s ease;
}
.capacidad__boton:hover, .capacidad__boton:focus-visible { color: var(--teal); }
.capacidad__boton[aria-expanded="true"] { color: var(--slate); font-weight: 700; border-left-color: var(--teal); }

/* ALTURA FIJA CON DESPLAZAMIENTO INTERNO. Sin ella la pagina cambiaba de largo
   al abrir y cerrar y el visitante perdia el sitio. Los 540px salen de la
   cuenta al reves: en una ventana de 900 con la cabecera fija de 72 quedan 828
   utiles, y la seccion gasta 202 en su propio ritmo vertical (--section-y a
   1440), asi que el panel puede llegar a 626. Se toman 540 para dejar aire.
   tabindex="0" en el panel: un contenedor con scroll tiene que poder recibir
   el foco o no hay forma de desplazarlo con el teclado. */
.capacidades__paneles { position: relative; }
.capacidad__panel {
  background: var(--paper);
  border: 1px solid rgba(31, 51, 80, 0.10);
  border-radius: var(--radius-md);
  box-shadow: 0 2px 4px rgba(22, 32, 46, 0.04), 0 12px 32px -12px rgba(22, 32, 46, 0.16);
  padding: 1.75rem clamp(1.25rem, 0.1rem + 2vw, 2rem);
  overflow-wrap: break-word;
}
@media (min-width: 1024px) {
  /* Antes era height fija con overflow-y: auto, y la primera capacidad obligaba
     a desplazar dentro del panel sin que se notara que habia mas debajo. Al
     sacar el enlace de contacto fuera, el contenido se acorta y de 1440 en
     adelante las cuatro caben en 540 (la mas alta pide 515). Se deja como
     minimo, no como maximo: por debajo de 1440 el texto reflowa y el panel
     crece en vez de recortar. Asi no hay desplazamiento interno a ningun ancho
     y el bloque sigue entrando en 1440x900. */
  .capacidad__panel { min-height: 540px; }
}
.capacidad__panel:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }
.capacidad__panel h3 { margin-top: 0; font-size: 1.3rem; }
.capacidad__panel h4 { font-size: 0.95rem; text-transform: uppercase; letter-spacing: 0.03em; color: var(--slate); margin: 0 0 0.6rem; }
.capacidad__entrada { color: var(--grey); }
.capacidad__columnas { display: grid; gap: 1.5rem 2rem; grid-template-columns: minmax(0, 1fr); margin-top: 1.5rem; }
@media (min-width: 700px) { .capacidad__columnas { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.capacidad__columnas ul { margin: 0; padding-left: 1.1rem; }
.capacidad__columnas li { margin-bottom: 0.45rem; font-size: 0.95rem; line-height: 1.5; }
.capacidad__nota { margin-top: 1.5rem; padding-top: 1.25rem; border-top: 1px solid var(--rule); font-size: 0.92rem; color: var(--grey); }
/* Un unico enlace de contacto para las cuatro capacidades, centrado bajo la
   tarjeta. Antes iba repetido dentro de cada panel, lo que obligaba a
   desplazar el panel para llegar a el. */
.capacidades__cierre { margin: 1.75rem 0 0; text-align: center; font-weight: 600; }
.capacidades__cierre a { text-decoration: none; }
.capacidades__cierre a:hover, .capacidades__cierre a:focus-visible { text-decoration: underline; }
@media (prefers-reduced-motion: reduce) { .capacidad__boton { transition: none; } }

/* ----- Barra minima de los tableros de /demos/ -----
   Esas paginas se sirven dentro de un iframe, pero tambien son alcanzables por
   URL directa, y hasta ahora no tenian ni cabecera ni un solo enlace: quien
   abria el tablero en una pestana nueva se quedaba sin ninguna salida.
   La barra es deliberadamente minima para no competir con el tablero. */
.barra-demo {
  display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem 1.25rem;
  padding: 0.6rem clamp(1rem, 3vw, 2rem);
  background: var(--slate);
  color: #E7ECF2;
  font-size: 0.85rem;
  font-family: var(--font-text);
}
.barra-demo a { color: #E7ECF2; text-decoration: none; }
.barra-demo a:hover, .barra-demo a:focus-visible { color: var(--gold); text-decoration: underline; }
.barra-demo__logo { font-family: var(--font-display); font-weight: 700; letter-spacing: -0.01em; }
.barra-demo__etiqueta {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: #B9C3CF;
}

/* ----- Seccion puente de NexoRisk (portada y /soluciones/) -----
   Argumento a la izquierda, las tres cifras del caso de validacion a la
   derecha, dentro de la banda oscura. El reparto es 45/55: la derecha pide un
   poco mas porque sus rotulos son frases, no etiquetas de una palabra.
   Se apila en 1120px, el mismo punto que .hero__rejilla, .bloque-quienes y
   .dolores. Son las cuatro composiciones de dos columnas de la portada y
   comparten corte a proposito, para que la pagina se reordene una sola vez. */
/* La banda hospeda la textura de grafo: position para anclarla y overflow para
   que los nodos que caen fuera del lienzo no alarguen la pagina. El contenido
   sube a z-index 1 para quedar por encima. */
.seccion--puente { position: relative; overflow: hidden; }
.seccion--puente > .section__inner { position: relative; z-index: 1; }
/* La textura ocupa la mitad derecha larga y se desvanece hacia el centro con
   la mascara de degradado que lleva dentro. El tope de 900px evita que en
   pantallas muy anchas los nodos crezcan hasta parecer una ilustracion.
   Se esconde por debajo de 1120: ahi la seccion se apila, "la mitad derecha"
   deja de existir como sitio libre, y el lienzo apaisado tendria que ampliarse
   1.7 veces para cubrir una banda alta y estrecha, con lo que los nodos
   pasarian de textura a dibujo. */
.textura-grafo {
  position: absolute;
  top: 0; right: 0; bottom: 0;
  width: min(62%, 900px);
  height: 100%;
  max-width: none;
  pointer-events: none;
  display: block;
}
@media (max-width: 1119px) { .textura-grafo { display: none; } }

.puente { display: grid; gap: 2.75rem; grid-template-columns: 1fr; align-items: start; }
@media (min-width: 1120px) {
  .puente { grid-template-columns: 0.45fr 0.55fr; gap: 4rem; }
}
/* Los 620px son los que mide la columna izquierda en dos columnas a 1920, asi
   que el tope solo actua apilado: sin el, a 1119 el bloque mide 1030px de
   ancho y el parrafo de entrada se iba a 100 caracteres por linea. */
.puente__texto { max-width: 620px; }

.cifra + .cifra { margin-top: 2rem; }
/* La cifra en mono y grande, el rotulo debajo en cuerpo normal. Sin animacion
   de contador: son datos con etiqueta de validacion, y animarlos los convierte
   en un efecto. */
.cifra__valor {
  display: block;
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: clamp(2.25rem, 1.5rem + 2.4vw, 3.25rem);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: #FFFFFF;
}
/* El rotulo se para en 52ch aunque la columna de mas: a 1920 mide 757px y sin
   tope la frase mas larga se iba a una sola linea de 98 caracteres. */
.cifra__rotulo {
  display: block;
  max-width: 52ch;
  margin-top: 0.5rem;
  font-size: 1rem;
  line-height: 1.5;
  color: #B9C3CF;
}
/* La etiqueta de validacion cierra el bloque de las tres cifras, no cada una:
   es la salvedad del caso completo. */
.puente__cifras .etiqueta-caso { margin: 2rem 0 0; }

/* Atribucion de la fuente, pegada al parrafo que sustenta. El margen negativo
   se come parte del 1rem que deja ese parrafo: la cita tiene que leerse como
   un pie de ese dato y no como un parrafo mas. --grey sobre --paper da 5,7:1,
   holgado para AA aun a este cuerpo. */
.fuente-dato { margin: -0.6rem 0 0; font-size: 0.85rem; line-height: 1.5; color: var(--grey); }

.rejilla { display: grid; gap: 1.5rem; }
/* min-width:0 defensivo para las tres variantes (y para .section .rejilla-N,
   el reparto fluido de mas abajo): mismo riesgo de fondo que ya obligo a
   corregir .tratamientos-fila__bloque, aunque hoy ningun contenido de
   .rejilla lo dispare. */
.rejilla > * { min-width: 0; }
.rejilla-2 { grid-template-columns: repeat(1, 1fr); }
.rejilla-3 { grid-template-columns: repeat(1, 1fr); }
.rejilla-4 { grid-template-columns: repeat(1, 1fr); }
@media (min-width: 640px) {
  .rejilla-2 { grid-template-columns: repeat(2, 1fr); }
  .rejilla-4 { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .rejilla-3 { grid-template-columns: repeat(3, 1fr); }
  .rejilla-4 { grid-template-columns: repeat(4, 1fr); }
}

.franja-marca-oro { height: 3px; background: var(--gold); border: 0; width: 64px; margin: 0 0 1.5rem; }
.centrado { text-align: center; }
.texto-gris { color: var(--grey); }

/* Fila de tecnologias: cinco nombres separados por un filete vertical, al eje
   izquierdo como el resto de la pagina. Sin color de marca, todo en --ink y
   --grey. Se apila solo cuando no cabe. */
.tecnologias {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 0.55rem 0.9rem; margin-top: 1.5rem;
  font-family: var(--font-mono); font-size: 0.8rem; letter-spacing: 0.02em;
}
.tecnologias__rotulo { color: var(--grey); }
.tecnologias__item { display: flex; align-items: center; gap: 0.9rem; color: var(--ink); }
.tecnologias__item::before {
  content: ""; width: 1px; height: 0.95rem; background: var(--rule);
}
.mt-0 { margin-top: 0; }

/* ----- 4. Eyebrow / etiqueta ----- */
.eyebrow {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--teal);
  margin: 0 0 0.75rem;
}

/* ----- 5. Botones ----- */
.boton-primario, .boton-secundario, .boton-acento {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  font-family: var(--font-text);
  font-weight: 600;
  font-size: 0.98rem;
  padding: 0.85rem 1.5rem;
  border-radius: var(--radius-sm);
  cursor: pointer;
  text-decoration: none;
  border: 1.5px solid transparent;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
  line-height: 1.2;
}
/* ----- Contorno de los botones dorados -----
   El oro es un color claro: su relleno da 1.86:1 contra --paper, 1.75 contra
   --soft y 1.66 contra --band, siempre por debajo del 3:1 que pide la WCAG
   1.4.11 para el limite de un control. Medido sobre el render, 95 de los 126
   botones dorados del sitio incumplian, en las 24 paginas publicas. No era un
   problema de una seccion sino del color, asi que la correccion va en la clase.
   Cambiar el fondo no servia: sobre blanco el relleno solo sube a 1.86.
   Se PINTA el borde en lugar de anadirlo: la regla base ya reserva
   "border: 1.5px solid transparent", asi que solo cambia el color y las
   dimensiones exteriores no se mueven ni un pixel en ninguna pagina.
   El contorno --ink da 8.80:1 contra el oro y de 14.58 a 16.40 contra los tres
   fondos claros, asi que cumple por los dos lados, que es lo que exige 1.4.11.
   En hover, contra --gold-hover, da 6.98:1.
   Sobre banda oscura el borde se funde con el fondo y no cambia nada: alli el
   relleno ya cumplia solo, 6.84:1 contra --slate y 8.80 contra --ink. */
.boton-primario {
  background: var(--gold);
  color: var(--ink);
  border-color: var(--ink);
}
.boton-primario:hover { background: var(--gold-hover); color: var(--ink); }
.boton-primario:active { transform: translateY(1px); }
.boton-secundario {
  background: transparent;
  border-color: var(--slate);
  color: var(--slate);
}
.boton-secundario:hover { background: var(--slate); color: #fff; }
.seccion--slate .boton-secundario { border-color: #fff; color: #fff; }
.seccion--slate .boton-secundario:hover { background: #fff; color: var(--slate); }
/* Tercer boton del sistema: solido, para el unico CTA de una banda oscura. Va
   un escalon por encima del tamano normal (0.85/1.5rem de acolchado y 0.98rem
   de letra) porque es el unico elemento clicable de una banda a pantalla
   completa y al tamano corriente se quedaba timido.
   Va en --gold, que es el unico color del sistema que grita "aqui se hace
   clic", y aqui no compite con nada: el CTA del hero ya salio de pantalla
   mucho antes de que esta banda entre, y el CTA final todavia no aparece.
   El oro rinde ademas mucho mejor sobre azul oscuro que sobre blanco, que era
   el problema de origen: medido sobre el render, el relleno da 6.84:1 contra
   la banda --slate, frente a 1.86:1 del mismo boton sobre --paper. La
   etiqueta --ink sobre el oro da 8.80:1.
   Se descartaron el blanco (12.75:1 de relleno, tambien valido, pero el
   blanco pesa mas de lo que este punto de la pagina necesita) y el teal
   solido, que se quedaba en 2.11:1 de relleno, por debajo del 3:1 que pide la
   WCAG 1.4.11 para el limite de un control. */
.boton-acento { padding: 1.1rem 2.1rem; font-size: 1.08rem; background: var(--gold); color: var(--ink); border-color: var(--ink); }
.boton-acento:hover { background: var(--gold-hover); color: var(--ink); }
.boton-acento:active { transform: translateY(1px); }
.boton-primario:disabled, .boton-secundario:disabled, .boton-acento:disabled { opacity: 0.6; cursor: not-allowed; }
.boton-ancho-completo { width: 100%; }
.grupo-botones { display: flex; flex-wrap: wrap; gap: 0.85rem; align-items: center; }
/* Par de CTA del hero de la portada. Los dos botones piden 505px con el hueco;
   por debajo de 560px de ventana la columna ya no da para tanto y caen en dos
   filas. Cuando eso pasa se apilan a ancho completo, en vez de quedar sueltos
   y de anchos distintos. Acolchado y cuerpo de letra quedan en sus valores
   normales: con las etiquetas de 24 y 25 caracteres el boton mas ancho mide
   247px y entra de sobra en los 320px de contenido de una ventana de 360.
   Va en una clase propia y no en .grupo-botones para no alcanzar a los heroes
   de las otras 17 paginas. */
@media (max-width: 560px) {
  .grupo-botones--largos { flex-direction: column; align-items: stretch; }
  .grupo-botones--largos .boton-primario,
  .grupo-botones--largos .boton-secundario { width: 100%; }
}

/* ----- 6. Tarjetas ----- */
.tarjeta {
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  padding: 1.75rem;
  box-shadow: var(--shadow-sm);
  height: 100%;
}
.tarjeta--suave { background: var(--soft); }
.tarjeta--enlace { display: flex; flex-direction: column; text-decoration: none; color: inherit; transition: box-shadow 0.15s ease, transform 0.15s ease; }
.tarjeta--enlace:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); }
.tarjeta h3 { margin-top: 0; }

/* ----- Escala de titulo en contexto estrecho -----
   La escala fluida global de h3 esta pensada para encabezados que viven en el
   ancho del contenedor. Dentro de una rejilla la caja es mucho mas estrecha:
   la tarjeta mas angosta de la banda mide 300px (el suelo del minmax) y deja
   244px de texto util. Ahi el h3 global llegaba a 28px y partia el titulo mas
   largo del sitio en 5 lineas de 8 caracteres, mientras el cuerpo ocupaba 2:
   la jerarquia quedaba invertida.
   LA REGLA NO ES UN MINIMO DE CARACTERES POR LINEA. Un titulo corto partido
   en dos lineas de 15 caracteres no es un defecto. Lo que hay que evitar es
   la jerarquia invertida: que el titulo ocupe mas renglones que el cuerpo
   que lo explica. Ese era el caso a 28px, con titulos de 3 a 5 lineas sobre
   cuerpos de 2, y ademas dejaba huecos muertos en las tarjetas cortas.
   El criterio operativo es el titulo mas largo del sitio en 3 lineas o menos.

   Medido sobre los 47 titulos reales: 21px es el maximo que mantiene el mas
   largo en 3 lineas; se usa un techo de 20px para dejar holgura. La amplitud
   fluida baja de 8px (20->28) a 3px (17->20), porque en una caja que apenas
   crece no tiene sentido que la letra crezca mucho. */
.tarjeta h3,
.rejilla h3,
.mockup-navegador__imagen-cont h3 {
  font-size: clamp(1.0625rem, 1rem + 0.25vw, 1.25rem);
  line-height: 1.3;
  /* Color de texto principal, no teal: el teal significa "esto es
     interactivo" y estas tarjetas no son clicables. El teal se reserva para
     los enlaces reales, como el "Conocer mas" del pie de la tarjeta. */
  color: var(--slate);
}
/* Tarjetas que SI son un enlace: el titulo forma parte del <a>. Mantiene el
   color de texto, porque la afordancia ya la da la flecha, y pasa a teal solo
   al interactuar. */
.tarjeta--enlace:hover h3,
.tarjeta--enlace:focus-visible h3 { color: var(--teal); }
/* Sobre banda oscura, solo las tarjetas: conservan fondo blanco, asi que el
   titulo sigue en --slate. Un h3 suelto sobre la banda debe quedarse blanco,
   asi que NO se incluye .rejilla h3 aqui: seria texto slate sobre slate. */
.seccion--slate .tarjeta h3 { color: var(--slate); }
.tarjeta__icono { width: 2.5rem; height: 2.5rem; margin-bottom: 1rem; color: var(--teal); }
.tarjeta__enlace-texto { margin-top: auto; padding-top: 0.75rem; font-weight: 600; color: var(--teal); }

/* Reparto en tres columnas exactas para los bloques de seis piezas. Con el
   auto-fit general (minimo 300px) seis caben en cuatro columnas a partir de
   ~1300px de contenido y la segunda fila queda con dos sueltas; tres y tres
   reparte el peso por igual. */
.rejilla--tres { grid-template-columns: 1fr; }
@media (min-width: 640px) { .section .rejilla--tres { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .section .rejilla--tres { grid-template-columns: repeat(3, 1fr); } }

/* Lista de acciones concretas dentro de una tarjeta ("que va a poder hacer"). */
/* Marco neutro para una captura de producto. Sustituye al mockup-navegador en
   la seccion de demostraciones: aquel imitaba una ventana de macOS (barra,
   tres circulos de colores, barra de direccion) y eso ataba el producto a un
   sistema operativo que no es el del cliente. Aqui solo la captura.
   MANDA EL MARCO, NO EL ARCHIVO. Las dos capturas conservan su proporcion
   nativa (1.5131 la gerencial, 1.7778 la de redes) y es el contenedor, con
   aspect-ratio fijo 110:67, quien recorta lo que sobra via object-fit: cover.
   Antes se rellenaban los archivos hasta cuadrar con el marco, y eso dejaba
   bandas vacias que se notaban: ninguna de las dos capturas se puede tomar
   con la proporcion exacta del marco sin recapturarlas.
   Cada una se recorta por un eje distinto, y no es una eleccion: se deduce de
   comparar su proporcion con la del marco. La gerencial es mas estrecha, asi
   que cover la escala por ancho y le recorta 68px de alto (7.8%). La de redes
   es mas apaisada, asi que se escala por alto y le recorta 109px de ancho
   (7.6%); su eje vertical queda exacto y no pierde ni arriba ni abajo.
   De ahi que el object-position de cada una actue sobre un eje diferente.
   Reserva el alto antes de que la imagen cargue, asi que no hay salto de
   maquetacion. El margen inferior de 1.75rem (28px) es lo que separa la
   captura del titulo: pegados al borde de la imagen se leian como pie de foto. */
.captura {
  aspect-ratio: 110 / 67;
  margin: 0 0 1.75rem;
  border: 1px solid var(--rule);
  border-radius: 10px;
  overflow: hidden;
  background: var(--paper);
  box-shadow: 0 8px 20px -12px rgba(22, 32, 46, 0.28);
}
.captura img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: center; }
/* La gerencial se ancla arriba para conservar la cabecera con el nombre de la
   cooperativa y las pestanas; lo que se va es la fila de controles de abajo,
   que no aporta nada a 593px. */
.captura--arriba img { object-position: center top; }
/* La de redes se ancla a la izquierda para conservar entero el panel de
   filtros, que es donde se leen los nucleos detectados, las calificaciones y
   los roles; lo que se recorta es el borde derecho de la ficha del socio, que
   a este tamano ya no era legible. */
.captura--izquierda img { object-position: left center; }
/* Un escalon mas de aire entre el titulo y su parrafo que el 0.75rem global:
   con la captura encima, el bloque de texto necesita separarse como grupo. */
.tarjeta .captura + h3 { margin-bottom: 0.85rem; }

/* Cierre de la seccion de demostraciones: una sola llamada a la accion para
   las dos tarjetas, centrada bajo la rejilla. Las tarjetas ya no son enlaces,
   asi que este boton es el unico camino y por eso va en --gold: es el CTA
   principal de esta seccion, no un enlace secundario.
   La nota va en --grey sobre --paper, 5.72:1, holgado para AA a 0.85rem. */
.cierre-demos { text-align: center; margin-top: 2.5rem; }
.cierre-demos__linea { margin: 0 0 1rem; }
.cierre-demos__nota {
  max-width: 56ch;
  margin: 1rem auto 0;
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--grey);
}

.lista-acciones { list-style: none; margin: 0 0 0.5rem; padding: 0; display: grid; gap: 0.5rem; }
.lista-acciones li { position: relative; padding-left: 1.1rem; font-size: 0.95rem; }
.lista-acciones li::before {
  content: "";
  position: absolute; left: 0; top: 0.6em;
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--rule);
}

/* Precision honesta al pie de una tarjeta (por ejemplo, que un tablero esta
   pensado para pantalla ancha). Va en gris y sin icono: es una condicion de
   uso, no una advertencia. */
.tarjeta__nota {
  margin: 0.9rem 0 0;
  padding-top: 0.75rem;
  border-top: 1px solid var(--rule);
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--grey);
}

/* ----- 7. Caja semantica (callout) ----- */
.callout {
  border-left: 3px solid;
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  padding: 1.1rem 1.35rem;
  margin: 1.5rem 0;
}
.callout__titulo {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 0.98rem;
  margin: 0 0 0.35rem;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  font-size: 0.8rem;
}
.callout p { color: var(--ink); margin: 0; }
.callout--critico { background: var(--bg-red); border-color: var(--crimson); }
.callout--critico .callout__titulo { color: var(--crimson); }
.callout--aviso { background: var(--bg-amber); border-color: var(--amber); }
.callout--aviso .callout__titulo { color: var(--amber); }
.callout--nota { background: var(--bg-grey); border-color: var(--grey); }
.callout--nota .callout__titulo { color: var(--grey); }
.callout--metodo { background: var(--soft); border-color: var(--teal); }
.callout--metodo .callout__titulo { color: var(--teal); }
.callout--positivo { background: var(--bg-green); border-color: var(--forest); }
.callout--positivo .callout__titulo { color: var(--forest); }
/* Modificador de compactacion (columna izquierda de /contacto/, iteracion
   2): mismo callout, menos aire arriba y menos acolchado interno. */
.callout--compacto { margin-top: 1rem; padding: 0.9rem 1.1rem; }

/* ----- 7b. Insignia de nivel de riesgo (CRITICO/ALTO/MEDIO/BAJO) ----- */
.nivel-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  padding: 0.3rem 0.7rem 0.3rem 0.55rem;
  border-radius: 999px;
}
.nivel-badge::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: currentColor; }
.nivel-badge--critico { background: var(--nivel-critico-bg); color: var(--nivel-critico); }
.nivel-badge--alto { background: var(--nivel-alto-bg); color: var(--nivel-alto); }
.nivel-badge--medio { background: var(--nivel-medio-bg); color: var(--nivel-medio); }
.nivel-badge--bajo { background: var(--nivel-bajo-bg); color: var(--nivel-bajo); }

/* ----- 8. Franja de indicadores (kpi-strip) ----- */
.kpi-strip {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.5rem 2rem;
  margin: 1.75rem 0;
}
@media (min-width: 640px) { .kpi-strip { grid-template-columns: repeat(4, 1fr); } }
/* min-width:0 defensivo: hoy las etiquetas caben, pero es el mismo item
   de grid con texto que ya obligo a corregir .tratamientos-fila__bloque. */
.kpi-strip__item { min-width: 0; border-top: 3px solid var(--gold); padding-top: 0.6rem; }
.kpi-strip__valor {
  display: block;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(1.4rem, 3vw, 2rem);
  color: var(--slate);
  line-height: 1.1;
}
.seccion--slate .kpi-strip__valor { color: #fff; }
.kpi-strip__valor--critico { color: var(--crimson); }
.kpi-strip__etiqueta {
  display: block;
  font-size: 0.8rem;
  color: var(--grey);
  margin-top: 0.35rem;
  line-height: 1.35;
}
.seccion--slate .kpi-strip__etiqueta { color: #B9C3CF; }
.etiqueta-caso {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  color: var(--grey);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  display: inline-block;
  margin: 0.5rem 0 1rem;
}
.seccion--slate .etiqueta-caso { color: #9FAEBD; }

/* ----- 9. Cintillo de seccion (section-bar) ----- */
.section-bar {
  background: var(--slate);
  color: #fff;
  border-left: 4px solid var(--gold);
  padding: 1.75rem 2rem;
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  margin-bottom: 2.5rem;
}
.section-bar .eyebrow { color: #7FD4CE; }
.section-bar h2 { color: #fff; margin-bottom: 0; }

/* ----- 10. Acordeon FAQ ----- */
.faq { max-width: 820px; }
.faq details {
  border-bottom: 1px solid var(--rule);
  padding: 1.1rem 0;
}
.faq summary {
  cursor: pointer;
  font-family: var(--font-display);
  font-weight: 600;
  color: var(--slate);
  font-size: 1.05rem;
  padding-right: 2rem;
  position: relative;
  list-style: none;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: "+";
  position: absolute;
  right: 0;
  top: -0.15rem;
  font-size: 1.5rem;
  color: var(--teal);
  transition: transform 0.15s ease;
}
.faq details[open] summary::after { transform: rotate(45deg); }
.faq details[open] summary { margin-bottom: 0.75rem; }
.faq__respuesta { color: var(--ink); }
.faq__respuesta p:first-child { margin-top: 0; }

/* ----- 11. Tabla comparativa ----- */
.tabla-comparativa {
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  overflow: hidden;
}
.tabla-comparativa th, .tabla-comparativa td {
  padding: 0.9rem 1.1rem;
  text-align: left;
  vertical-align: top;
  border-bottom: 1px solid var(--rule);
  font-size: 0.98rem;
}
.tabla-comparativa thead th {
  background: var(--slate);
  color: #fff;
  font-family: var(--font-display);
  font-weight: 700;
}
.tabla-comparativa tbody tr:nth-child(even) { background: var(--band); }
.tabla-comparativa td:first-child, .tabla-comparativa th:first-child { border-right: 1px solid var(--rule); }
.tabla-comparativa ul { margin: 0; padding-left: 1.1rem; }
.contenedor-tabla { overflow-x: auto; }

/* ----- 12. Header ----- */
.cabecera {
  position: sticky;
  top: 0;
  z-index: 500;
  background: var(--paper);
  border-bottom: 1px solid transparent;
  transition: box-shadow 0.2s ease, border-color 0.2s ease;
}
.cabecera.con-sombra { box-shadow: var(--shadow-sm); border-color: var(--rule); }
.cabecera__barra {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: var(--header-h);
  gap: 1rem;
}
.cabecera__logo { display: flex; align-items: center; flex-shrink: 0; }
/* Sin regla sobre `.cabecera__logo img`: al ser (0,1,1) le ganaria a las clases
   de abajo y romperia el intercambio por breakpoint. El contenedor es flex, asi
   que las imagenes ya se blockifican solas. */
/* Base (< 640px): lockup horizontal completo, mismo SVG que en escritorio,
   pero acotado por ancho (no por alto) para que quepa junto a la hamburguesa.
   150-180px cubre 320-390px de viewport con margen; clamp() lo deja fijo en
   180px del resto para arriba, hasta que a 640px el bloque de abajo retoma
   el criterio de escritorio (altura fija). El isotipo deja de mostrarse. */
.cabecera__logo-completo { display: block; width: clamp(150px, 46vw, 180px); height: auto; }
.cabecera__logo-isotipo { display: none; }
/* Altura unica del lockup en todas las bandas de escritorio (>= 640px).
   26px -> 280.5px de ancho y 16.7px de altura de x.
   No se reduce en tableta: entre 640px y el corte del nav la barra solo lleva
   logo, hamburguesa y (desde 1024px) el CTA, asi que sobra sitio y encogerlo
   solo restaba legibilidad. */
.cabecera__nav-escritorio { display: none; }
.cabecera__acciones { display: flex; align-items: center; gap: 0.75rem; flex-shrink: 0; }
/* El CTA de la barra no parte nunca su texto. No tenia max-width ni un padding
   culpable: se partia por ser el unico item flexible de la barra, asi que
   absorbia toda la presion y se encogia por debajo de su ancho de contenido.
   Con nowrap su ancho minimo automatico pasa a ser el del texto completo. */
.cabecera__acciones .boton-primario { display: none; white-space: nowrap; }

/* El bloque base de la hamburguesa va antes de la consulta de 1024px: si va
   despues, su `display: inline-flex` anula por cascada al `display: none` de
   escritorio y el boton aparece junto al menu completo. */
.cabecera__hamburguesa {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  background: transparent;
  border: 1.5px solid var(--rule);
  border-radius: var(--radius-sm);
  cursor: pointer;
}
.cabecera__hamburguesa svg { width: 22px; height: 22px; }

@media (min-width: 640px) {
  .cabecera__logo-completo { width: auto; height: 26px; }
}

/* El CTA aparece antes que el nav: entre 1024px y el corte del nav la barra
   lleva logo + CTA + hamburguesa, que suman ~558px y caben de sobra. */
@media (min-width: 1024px) {
  .cabecera__acciones .boton-primario { display: inline-flex; }
}

/* ---- Corte de la navegacion completa: 1200px ----
   NO son 1024px. El conjunto logo + nav + CTA + separaciones mide 1060.7px
   (280.5 + 16 + 542.7 + 16 + 205.5), medido sobre la pagina renderizada. El
   ancho util es min(ventana,1180) - 64 hoy, y ventana - 2*clamp(20px,4vw,64px)
   cuando llegue el gutter del Paso 1. El minimo que satisface ambos es 1153px;
   se elige 1200px, que deja 55.3px de holgura con el contenedor actual y
   43.3px con el del Paso 1, en vez de los 24.9px que dejaba 1180px. Ese
   margen extra cubre que la fuente del nav se dibuje mas ancha de lo medido.
   Mostrar el nav a 1024px era pedirle que cupiera en 960px. */
@media (min-width: 1200px) {
  /* Compensacion optica, solo donde hay nav con la que alinearse.
     VALOR DERIVADO, no ajustado a ojo. Sale de dos alturas de x concretas: la
     del wordmark (17.25px sobre 24.38px de tinta) y la del nav (8.50px sobre
     11.75px, o sea Inter a 0.96rem). Una banda de altura de x esta desplazada
     respecto al centro de su caja de tinta en alto*(1-altura_x/alto)/2:
       logo  24.38*(1-0.708)/2 = 3.56px
       nav   11.75*(1-0.723)/2 = 1.63px
     La diferencia es 1.93px teoricos y 2.25px medidos sobre la pagina.
     DEPENDE DE: la altura del logo (26px), el tamano de fuente del nav
     (0.96rem) y la familia (Inter, cuya altura de x es 0.546em). Si cambia
     cualquiera de los tres, este numero deja de ser correcto: hay que volver a
     medir ambas bandas y recalcular la diferencia, no retocarlo a ojo. */
  .cabecera__logo-completo { transform: translateY(-2.25px); }
  .cabecera__nav-escritorio {
    display: flex;
    gap: 1.85rem;
    list-style: none;
    margin: 0;
    padding: 0;
  }
  .cabecera__nav-escritorio a {
    color: var(--ink);
    text-decoration: none;
    font-weight: 600;
    font-size: 0.96rem;
    padding: 0.35rem 0.1rem;
    /* El borde va arriba y abajo aunque solo se pinte el de abajo: si solo
       existe el inferior, la caja crece 2px por un lado y `align-items:center`
       centra una caja asimetrica, dejando el texto 1px por encima del centro
       real de la barra. Medido: 1.06px de desfase contra el logo. */
    border-top: 2px solid transparent;
    border-bottom: 2px solid transparent;
  }
  .cabecera__nav-escritorio a:hover { color: var(--teal); }
  .cabecera__nav-escritorio a[aria-current="page"] { color: var(--teal); border-bottom-color: var(--gold); }
  .cabecera__hamburguesa { display: none; }
}

.menu-movil {
  position: fixed;
  inset: 0;
  top: var(--header-h);
  background: var(--paper);
  z-index: 490;
  padding: 1.5rem 1.25rem 2rem;
  overflow-y: auto;
  display: none;
}
.menu-movil.abierto { display: block; }
.menu-movil ul { list-style: none; margin: 0; padding: 0; }
.menu-movil li { border-bottom: 1px solid var(--rule); }
.menu-movil a {
  display: block;
  padding: 1.1rem 0.25rem;
  font-family: var(--font-display);
  font-size: 1.2rem;
  font-weight: 600;
  color: var(--slate);
  text-decoration: none;
}
.menu-movil a[aria-current="page"] { color: var(--teal); }
.menu-movil .boton-primario { margin-top: 1.5rem; width: 100%; }
/* Mismo corte que la hamburguesa que lo abre: si este se queda en 1024px, entre
   1024 y 1200 el boton se ve pero el menu no puede desplegarse. */
@media (min-width: 1200px) { .menu-movil { display: none !important; } }

.cabecera--landing .cabecera__barra { justify-content: center; }

/* ----- 13. Footer ----- */
.pie {
  background: var(--ink);
  color: #C7D0DA;
  padding: 3.5rem 0 0;
  font-size: 0.95rem;
}
/* Sin subrayado en reposo: en el pie hay 16 enlaces seguidos y subrayarlos
   todos convierte la columna en ruido. El subrayado aparece al interactuar. */
.pie a { color: #E7ECF2; text-decoration: none; }
.pie a:hover,
.pie a:focus-visible { color: var(--gold); text-decoration: underline; }
.pie__rejilla {
  display: grid;
  gap: 2.25rem;
  grid-template-columns: 1fr;
  padding-bottom: 2.5rem;
  border-bottom: 1px solid rgba(255,255,255,0.12);
}
@media (min-width: 640px) { .pie__rejilla { grid-template-columns: repeat(2, 1fr); } }
/* min-width:0 defensivo para el tramo 640-1199px, el unico donde las
   columnas son fracciones (1fr) y no max-content: por debajo y por encima
   de ese tramo el pie ya esta protegido (una columna, o columnas que se
   miden por su propio contenido). Las cuatro columnas del pie no tienen
   clase propia mas alla de .pie__marca, asi que el selector es el hijo
   directo. */
.pie__rejilla > * { min-width: 0; }
/* Cuatro columnas de ancho de contenido, con el sobrante repartido a partes
   iguales entre ellas. Con fracciones fijas (1.4fr 1fr 1fr 1fr) las columnas
   median 424/303/303/303 y sus contenidos 244/252/162/118, asi que cada una
   arrastraba un sobrante distinto y los huecos salian de 215, 87 y 177px.
   Con max-content + space-between el hueco es el mismo entre todas y las
   columnas quedan ancladas a los dos bordes en vez de a la deriva.
   Entra a 1200px, no a 1024: por debajo no cabrian los cuatro contenidos
   (776px) mas un hueco decente. */
@media (min-width: 1200px) {
  .pie__rejilla {
    grid-template-columns: repeat(4, max-content);
    justify-content: space-between;
    column-gap: 2rem;
  }
}
/* Linea de apoyo del CTA de cierre. Va entre el titular y el boton, y en el
   gris claro de la banda oscura para que el titular siga mandando. */
.cta-final__apoyo { max-width: 56ch; margin-inline: auto; color: #C7D0DA; }

/* El correo del pie SI va subrayado en reposo, al reves que el resto de
   enlaces de la columna: no es navegacion, es un dato de contacto, y conviene
   que se lea como algo sobre lo que se puede pulsar. */
.pie__correo a { text-decoration: underline; }
.pie__marca img { height: 72px; width: auto; margin-bottom: 1rem; }
.pie__marca p { color: #B9C3CF; max-width: 30ch; }
/* h3, no h4: el pie encadenaba <h4>Soluciones/NexoRisk/Empresa</h4> sin ningun
   h3 intermedio, un salto real en las paginas donde la ultima cabecera del
   cuerpo es h2. El tamano visual no cambia: esta regla fija cada propiedad
   que separa a un h3 de serie del rotulo del pie, igual que antes lo hacia
   para h4. Se suma el selector h2: en 404.html el pie es la primera cabecera
   despues del h1 (no hay h2 de por medio), asi que ahi el rotulo usa h2 en
   vez de h3 para no repetir el mismo salto de nivel. font-weight y
   line-height van explicitos porque el h2 base del sitio no coincide con los
   del h3 (700/1.12 frente a 600/1.2) y sin fijarlos aqui el rotulo de
   404.html se veria mas grueso y con mas interlineado que en el resto de
   paginas. */
.pie h3, .pie h2 { color: #fff; font-family: var(--font-display); font-size: 0.95rem; font-weight: 600; line-height: 1.2; letter-spacing: 0.03em; text-transform: uppercase; margin-bottom: 1rem; }
.pie ul { list-style: none; margin: 0; padding: 0; }
.pie li { margin-bottom: 0.65rem; }
.pie__inferior {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.5rem;
  justify-content: space-between;
  align-items: center;
  /* padding-block, no la forma abreviada: en los pies minimos esta clase
     comparte elemento con .section__inner, y `padding: 1.5rem 0` le ponia el
     padding-inline a cero, dejando el texto pegado a los bordes de la ventana. */
  padding-block: 1.5rem;
  font-size: 0.85rem;
  color: #9FAEBD;
}
.pie__inferior nav { display: flex; flex-wrap: wrap; gap: 0.5rem 1.25rem; }
.pie--minimo { padding: 2.5rem 0; }
.pie--minimo .pie__inferior { border-top: 1px solid rgba(255,255,255,0.12); margin-top: 2rem; }

/* ----- 14. Hero ----- */
/* El hero lleva su propio ritmo vertical: mas corto por arriba porque va
   pegado al header. SUSTITUYE al padding-block de .section, no se suma: misma
   especificidad y declarado despues en el archivo. */
.hero { padding-block: clamp(2.5rem, 6vw, 4.5rem) clamp(2.5rem, 5vw, 4rem); }
/* Limite del H1 del hero, solo en las paginas ya migradas a .section. */
.section.hero h1 { max-width: 640px; }
/* Titular de la portada. 560px medidos, no elegidos: con su texto actual el
   unico tramo que da 4 lineas y ninguna por debajo del 60% del ancho en 1280,
   1440 y 1920 a la vez es 520-580px. Desde 590 la cuarta linea cae al 48%; de
   610 en adelante bajaria a 3 lineas, pero solo desde 1440, porque a 1280 la
   columna de texto mide 593px y no llega. Se toma el centro del tramo para
   dejar margen a los dos lados. */
.section.hero h1.titular-portada { max-width: 560px; }
.hero__rejilla {
  display: grid;
  gap: 2.5rem;
  align-items: center;
  grid-template-columns: 1fr;
}
/* El hero se parte en dos columnas solo desde 1120px. Por debajo, la columna
   de texto baja del ancho que el titular necesita para romper bien: medido,
   necesita ~10.67 veces su tamano de letra, y desde 847px de ventana la letra
   ya esta en su techo de 48px, o sea 512px de columna. Con el reparto 1.05fr
   de 2fr sobre el contenido menos el gap, eso se alcanza en
   0.525*(0.92V - 48) >= 512  ->  V >= 1112.6px. Se redondea a 1120.
   Apilado, el H1 lo limita su max-width de 640px y rompe como a 1920px. */
@media (min-width: 1120px) { .hero__rejilla { grid-template-columns: 1.05fr 0.95fr; gap: 3rem; } }
.hero__visual { order: -1; }
@media (min-width: 1024px) { .hero__visual { order: 2; } }
/* Parrafo de entrada. .lead es la clase del Paso 1; .hero__parrafo es el
   nombre que ya usaban las 18 paginas con hero, y comparte escala para no
   dejar dos tamanos de entradilla conviviendo. */
.lead,
.hero p.hero__parrafo { font-size: clamp(1.0625rem, 1rem + 0.4vw, 1.375rem); line-height: 1.5; }
.hero p.hero__parrafo { color: var(--grey); max-width: 54ch; }
/* Sirve para las dos formas: la banda como ancestro del hero y la banda puesta
   sobre el propio hero, que es como esta /nexorisk/. Sin la segunda, el parrafo
   se quedaba en --grey sobre --slate: 2.23:1. */
.seccion--slate .hero p.hero__parrafo,
.seccion--slate.hero p.hero__parrafo { color: #C7D0DA; }

/* ----- Composicion de imagen del hero (solo la portada) -----
   Dos piezas superpuestas: el tablero entero detras y, delante, un nucleo de
   garantias cruzadas desplazado sobre su esquina inferior derecha, que se sale
   del borde para que se despegue. El lienzo reserva su alto con aspect-ratio,
   asi que las imagenes no empujan nada al terminar de cargar.
   Las proporciones salen de la caja: el fondo ocupa el 88% del ancho y el
   frente el 46%, o sea el 52,3% del fondo. Con el fondo en 16:9 y el frente en
   1,926:1, el alto del lienzo queda en 1/1.8 del ancho: 0,4950 del fondo mas
   0,0606 que el frente asoma por debajo. */
.composicion-hero { margin: 0; }
.composicion-hero__lienzo { position: relative; width: 100%; aspect-ratio: 1.8; }
.composicion-hero__fondo,
.composicion-hero__frente {
  position: absolute;
  display: block;
  height: auto;
  border: 1px solid var(--rule);
  border-radius: 12px;
  background: var(--paper);
}
.composicion-hero__fondo {
  top: 0; left: 0; width: 88%;
  box-shadow: 0 40px 80px -40px rgba(22, 32, 46, 0.35);
}
/* Sombra mas cerrada y mas oscura que la del fondo: es lo que despega la pieza
   de delante, porque las dos comparten borde y radio. */
.composicion-hero__frente {
  right: 0; bottom: 0; width: 46%;
  box-shadow: 0 28px 48px -18px rgba(22, 32, 46, 0.45);
}
.composicion-hero__rotulo {
  margin: 1.1rem 0 0;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  line-height: 1.5;
  color: var(--grey);
}
/* Por debajo de 1120px el hero se apila a una columna y la superposicion deja
   de tener sentido: el frente bajaria de 300px de ancho. Se esconde el fondo y
   queda solo el nucleo, que es la pieza que se lee en poco ancho. Es el mismo
   punto de corte de .hero__rejilla, para que los dos cambios ocurran a la vez.
   El tope de 720px evita que en una tableta se sirva mas imagen de la que hay:
   el recorte fuente mide 1560px y 720 x 2 = 1440 sigue por debajo. */
@media (max-width: 1119px) {
  .composicion-hero__lienzo { aspect-ratio: auto; }
  .composicion-hero__fondo { display: none; }
  .composicion-hero__frente {
    position: static;
    width: 100%;
    max-width: 720px;
    margin-inline: auto;
    box-shadow: 0 24px 48px -24px rgba(22, 32, 46, 0.32);
  }
}

/* ----- Abanico del informe de ejemplo (portada #informe-ejemplo y
   /nexorisk/ #informe) -----
   Variante de tres piezas de .composicion-hero, no una copia: la geometria
   de dos capas (fondo 88%/frente 46%, esquina a esquina) no sirve para tres,
   asi que las proporciones y el lienzo se recalculan aqui, pero se conservan
   el criterio (borde, radio, sombras diferenciadas, colapso por debajo de
   1120px) y el token de las tres paginas SVG son A4 (0.7072 = 210/297mm), de
   ahi que las tres compartan el mismo aspect-ratio.
   Escritorio: tres piezas en abanico, la frontal (p.27, la mas visual) sin
   rotar y las de atras giradas -4/-2deg. El lienzo reserva 0.82 de
   aspect-ratio: con la pieza frontal al 68% de ancho y 18% de top, su borde
   inferior queda en 0.18+0.68/0.7072=0.9617 de la altura del lienzo, dentro
   del 1/0.82=1.2195 disponible. */
.composicion-informe { margin: 0; }
.composicion-informe__lienzo { position: relative; width: 100%; aspect-ratio: 0.82; }
.composicion-informe__pieza {
  position: absolute; display: block; height: auto;
  border: 1px solid var(--rule);
  border-radius: 10px;
  background: var(--paper);
}
.composicion-informe__pieza--fondo {
  top: 0; left: 0; width: 56%;
  transform: rotate(-4deg);
  box-shadow: 0 30px 60px -30px rgba(22, 32, 46, 0.30);
  z-index: 1;
}
.composicion-informe__pieza--medio {
  top: 9%; left: 16%; width: 62%;
  transform: rotate(-2deg);
  box-shadow: 0 34px 64px -28px rgba(22, 32, 46, 0.38);
  z-index: 2;
}
.composicion-informe__pieza--frente {
  top: 18%; left: 32%; width: 68%;
  box-shadow: 0 28px 48px -18px rgba(22, 32, 46, 0.45);
  z-index: 3;
}
/* Entre 700 y 1119px no hay sitio para tres piezas desplegadas -la de atras
   bajaria de 300px de ancho, el mismo limite que usa .composicion-hero-, asi
   que se esconde el fondo y quedan dos: la del medio pasa a hacer de fondo
   (rotacion reducida) y la frontal gana algo de sitio. */
@media (max-width: 1119px) {
  .composicion-informe__pieza--fondo { display: none; }
  .composicion-informe__pieza--medio { top: 0; left: 0; width: 66%; transform: rotate(-2deg); }
  .composicion-informe__pieza--frente { top: 10%; left: 22%; width: 72%; }
}
/* Por debajo de 700px solo queda la protagonista (p.27): centrada, sin
   rotar, sin el lienzo absoluto -que ya no hace falta con una sola pieza-.
   Mismo criterio que el colapso de .composicion-hero. */
@media (max-width: 699px) {
  .composicion-informe__lienzo { aspect-ratio: auto; }
  .composicion-informe__pieza--medio { display: none; }
  .composicion-informe__pieza--frente {
    position: static;
    width: 80%;
    max-width: 300px;
    margin-inline: auto;
    box-shadow: 0 20px 40px -20px rgba(22, 32, 46, 0.30);
  }
}

/* ----- Seccion #informe de /nexorisk/ (iteracion 3) -----
   Rediseño completo: dos filas de grid en vez de bloques verticales
   apilados (el problema de la iteracion 2 era ese: texto corto + abanico
   alto dejaban un hueco enorme debajo del texto antes de la fila
   siguiente, y el flujo -a ancho completo con solo 3 de sus 6 columnas
   ocupadas- dejaba otro hueco a su derecha). Ahora texto+abanico viven en
   la MISMA fila (fila superior) y flujo+acceso en la MISMA fila (fila
   inferior), asi no hay bloques que "sobren" en altura.
   Breakpoint en 1120px, no 1024: coincide con el punto en el que
   .composicion-informe ya muestra las tres piezas del abanico (ver
   @media max-width:1119px mas arriba); partir el grid en un punto donde el
   abanico todavia esta en su version de 2 piezas se veia descompensado. */
.informe-nexorisk__superior { display: grid; gap: 1.75rem; margin-top: 1.25rem; }
@media (min-width: 1120px) {
  .informe-nexorisk__superior {
    /* 55/45 aproximado: 11fr/9fr. align-items:center para que el abanico -mas
       alto que el bloque de texto por su aspect-ratio 0.82- quede centrado
       respecto al texto en vez de colgar por abajo dejando aire encima. */
    grid-template-columns: minmax(0, 11fr) minmax(0, 9fr);
    gap: clamp(2rem, 3vw, 3.5rem);
    align-items: center;
  }
}
.informe-nexorisk__texto .eyebrow { margin-bottom: 0.4rem; }
.informe-nexorisk__texto h2 { margin: 0 0 0.75rem; font-size: clamp(1.45rem, 1.1vw + 1.15rem, 1.85rem); line-height: 1.22; }
.informe-nexorisk__intro { margin: 0 0 1.25rem; max-width: 54ch; }
.informe-nexorisk__texto h3 { margin: 0 0 0.6rem; font-size: 1.05rem; }
.informe-nexorisk__texto .lista-acciones { gap: 0.5rem; margin-bottom: 0; }
.informe-nexorisk__texto .lista-acciones li { font-size: 0.93rem; line-height: 1.45; }

.informe-nexorisk__visual { display: flex; flex-direction: column; align-items: center; gap: 0.3rem; }
.informe-nexorisk__visual .composicion-informe { width: 100%; max-width: 300px; margin-inline: auto; }
@media (min-width: 1120px) {
  /* 380px: el extremo inferior del rango pedido (380-460px). El lienzo
     lleva aspect-ratio 0.82 fijo -no se toca, es el que evita que la pieza
     frontal se recorte-, asi que un ancho mayor solo hace crecer la altura
     en la misma proporcion; a 380px la altura del abanico (~490px con la
     capsula) ya queda razonablemente cerca de la del bloque de texto
     (~417px) sin bajar del piso pedido. */
  .informe-nexorisk__visual .composicion-informe { max-width: 380px; }
}
/* Capsula compacta, exclusiva de este contexto: la generica .etiqueta-sintetico
   (usada tambien como pie de figura en Inicio y como badge en la barra del
   tablero) se queda grande para ir pegada al abanico dentro de una columna
   angosta. No se toca la clase base -tiene otros usos-, se añade un
   modificador solo con lo que cambia. */
.etiqueta-sintetico--micro { font-size: 0.68rem; padding: 0.2rem 0.55rem; margin: 0; }

/* Fila inferior: flujo (60%) + tarjeta de acceso (40%), en la misma fila en
   vez de una fila para el flujo y otra debajo para el cierre -que es lo que
   dejaba el flujo con medio ancho de columna vacio a su derecha, porque a
   ancho completo de seccion .secuencia ya cae en su variante de 6
   columnas aunque solo tenga 3 pasos-. */
.informe-nexorisk__inferior { display: grid; gap: 1.75rem; margin-top: 1.25rem; }
@media (min-width: 1120px) {
  .informe-nexorisk__inferior {
    grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
    gap: clamp(2rem, 3vw, 3.5rem);
    align-items: start;
  }
}
.informe-nexorisk__flujo { margin: 0; --sec-ico: 40px; --sec-n: 15px; --sec-sep: 0.45rem; gap: 1.25rem 0.75rem; }
.informe-nexorisk__flujo .secuencia__icono img { width: 22px; height: 22px; }
.informe-nexorisk__flujo .secuencia__paso h3 { font-size: 1rem; margin-top: 0.1rem; }
.informe-nexorisk__flujo .secuencia__paso p { font-size: 0.88rem; margin-top: 0.15rem; }
/* Por encima de 1280px .secuencia pasa a 6 columnas -pensada para el uso de
   6 pasos en /nosotros/-, lo que con solo 3 pasos aqui los deja apretados
   contra la izquierda y medio ancho de fila en blanco a la derecha. Se
   fuerza de vuelta a 3: selector compuesto para ganarle por especificidad a
   la regla base, que esta mas abajo en el archivo. */
@media (min-width: 1280px) {
  .secuencia.informe-nexorisk__flujo { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.informe-nexorisk__frase { margin: 0.7rem 0 0.25rem; }
.informe-nexorisk__nota { margin: 0; font-size: 0.85rem; }

/* Tarjeta de acceso vertical: mismo .tarjeta del sistema, con menos
   acolchado -es una tarjeta de acceso, no de contenido largo- y el mismo
   criterio de .tarjeta--formulario. El titulo va mas pegado a la lista de
   pasos que el h3 por defecto, y el boton queda separado del ultimo paso
   sin sumarse al gap que ya deja .pasos--vertical entre pasos. */
.acceso-informe { padding: 0.9rem 1.4rem 1rem; }
.acceso-informe h3 { margin-top: 0.15rem; margin-bottom: 0.6rem; }
.acceso-informe .pasos--vertical { gap: 0.7rem; margin-bottom: 0.6rem; }
.acceso-informe .pasos--vertical .paso:not(:last-child)::after { bottom: -0.7rem; }

/* ----- Seccion "Que es Indicadores Clave" (solo la portada) ----- */
.bloque-quienes { display: grid; gap: 2.5rem; grid-template-columns: 1fr; align-items: center; }
/* Mismo punto de corte que .hero__rejilla: las dos secciones de arriba de la
   portada pasan a una columna a la vez, y el esquema cae debajo del texto. */
@media (min-width: 1120px) {
  .bloque-quienes { grid-template-columns: 1.05fr 0.95fr; gap: 3rem; }
}
/* La medida manda sobre el ancho de la columna: aunque la rejilla le de mas
   sitio, el texto se queda en 68ch. */
.bloque-quienes__texto { max-width: 68ch; }
.bloque-quienes__texto > p:last-child { margin-bottom: 0; }

/* ----- Seccion "El informe" (portada, despues de demostraciones) -----
   45/55 a favor del abanico, no el 50/50 de .rejilla-2 ni el 40/60 de
   .contacto__rejilla: aqui el texto es mas corto (parrafo + 3 apoyos + 2
   botones) y la pieza visual necesita el espacio extra para que la pagina
   27 en primer plano no se lea apretada. Mismo punto de corte que
   .bloque-quienes y .hero__rejilla, 1120px. */
.informe-inicio__rejilla { display: grid; gap: 2.5rem; grid-template-columns: 1fr; align-items: center; }
.informe-inicio__rejilla > * { min-width: 0; }
@media (min-width: 1120px) {
  .informe-inicio__rejilla { grid-template-columns: 0.45fr 0.55fr; gap: 3rem; }
  /* El abanico llenaba toda su columna del 55% y dominaba la seccion sobre
     el texto. Se acota a 75% de esa columna (~25% menos de ancho renderizado)
     y se pega al borde derecho, que es donde ya cae la pieza frontal: reduce
     el alto total (el lienzo escala proporcional, mismo aspect-ratio) sin
     tocar los WebP ni las proporciones internas de las tres piezas. Solo en
     este punto de corte: por debajo de 1120px el abanico ya colapsa a 1-2
     piezas via .composicion-informe y no hace falta encogerlo mas. */
  .informe-inicio__rejilla .composicion-informe { max-width: 75%; margin-inline-start: auto; }
}

/* Esquema comparativo. Ni oro ni carmesi: el oro significa "aqui se hace clic"
   y el carmesi "aqui hay riesgo", y esto no es ninguna de las dos cosas. El
   viewBox mas preserveAspectRatio por defecto lo escalan sin deformarlo. */
.esquema-comparativo { margin: 0; }
/* La ilustracion es vertical (320x410). Sin tope creceria con la columna
   —606px a 1440 darian 776px de alto— y pasaria a mandar sobre la altura de
   la seccion. Con 360px se queda por debajo del texto que acompana. */
.esquema-comparativo svg { display: block; width: 100%; height: auto; max-width: 360px; margin-inline: auto; }
/* El esquema no lleva reglas de color aqui a proposito: cada forma escribe su
   fill en el propio SVG, con var(--x, #hex). Si el color vive solo en esta
   hoja, cualquier contexto que no la cargue (el archivo abierto suelto, un
   copiado a otro documento) pinta todas las formas de negro, que es el valor
   inicial de fill en SVG. */
.esquema-comparativo__pie { margin: 0.9rem 0 0; font-size: 0.8rem; line-height: 1.5; color: var(--grey); }

/* ----- Aparicion al entrar en pantalla -----
   El estado inicial cuelga de .js-aparece, que solo pone el propio script: si
   el JavaScript no llega a ejecutarse, el CSS no esconde nada y la seccion se
   ve siempre. Y todo va dentro de no-preference, asi que a quien pide menos
   movimiento no se le oculta nada que luego haya que revelar. */
@media (prefers-reduced-motion: no-preference) {
  .js-aparece [data-aparece] {
    opacity: 0;
    transform: translateY(10px);
    transition: opacity 220ms ease-out, transform 220ms ease-out;
  }
  .js-aparece [data-aparece].esta-visible { opacity: 1; transform: none; }
}

/* ----- 15. Senales de confianza ----- */
.lista-senales { list-style: none; margin: 0; padding: 0; display: grid; gap: 1.1rem; grid-template-columns: 1fr; }
@media (min-width: 640px) { .lista-senales { grid-template-columns: repeat(2, 1fr); } }
.lista-senales li { display: flex; gap: 0.85rem; align-items: flex-start; }
.lista-senales img { flex-shrink: 0; width: 1.5rem; height: 1.5rem; margin-top: 0.15rem; }

/* ----- 16. Pasos / proceso ----- */
.pasos { display: grid; gap: 1.25rem; grid-template-columns: 1fr; counter-reset: paso; }
@media (min-width: 640px) { .pasos { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .pasos { grid-template-columns: repeat(6, 1fr); gap: 1rem; } }
.pasos--5 { }
@media (min-width: 1024px) { .pasos--5 { grid-template-columns: repeat(5, 1fr); } }
.paso { counter-increment: paso; position: relative; padding-top: 2.75rem; }
.paso::before {
  content: counter(paso);
  position: absolute; top: 0; left: 0;
  width: 2.25rem; height: 2.25rem;
  border-radius: 50%;
  background: var(--slate);
  color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-display); font-weight: 700;
}
.paso h4 { margin-bottom: 0.35rem; }
.paso p { color: var(--grey); font-size: 0.95rem; }
/* Variante vertical de .pasos/.paso: el circulo pasa de estar arriba del
   texto a estar a su izquierda, con un filete que conecta un paso con el
   siguiente. Mismo lenguaje visual que la horizontal (circulo numerado con
   contador CSS, mismo h4/p) para no crear un componente nuevo: solo cambia
   la direccion del apilado. Pensada para una tarjeta angosta (el acceso al
   informe en /nexorisk/), donde tres columnas habrian repetido el patron
   horizontal de .secuencia en la misma seccion. */
.pasos--vertical { display: flex; flex-direction: column; gap: 1.1rem; }
.pasos--vertical .paso { padding-top: 0; padding-left: 3rem; min-height: 2.25rem; }
.pasos--vertical .paso::before { top: 0; left: 0; }
.pasos--vertical .paso:not(:last-child)::after {
  content: "";
  position: absolute;
  left: 1.125rem;
  top: 2.25rem;
  bottom: -1.1rem;
  width: 1px;
  background: var(--rule);
}

/* ----- Secuencia de pasos con icono (/nosotros/) -----
   Componente propio, independiente de .pasos y .paso. --sec-n ya no es el
   diametro de un circulo relleno -se quito, competia con el del icono-: es
   el alto de fila que reserva la cifra, y el filete de union sigue
   dependiendo de el sin que su formula cambie. La cifra crece a 1.75rem
   (28px) en la tipografia de datos del sitio (--font-mono, la misma de
   .cifra-evidencia), y un margen negativo en .secuencia__n compensa ese
   crecimiento para que el alto de fila -y con el, la posicion del filete-
   no se mueva ni un pixel.
   Las tres medidas de arriba viven en variables porque de ellas depende la
   altura a la que pasa el filete: el centro del circulo del icono. */
.secuencia {
  --sec-n: 22px; --sec-ico: 64px; --sec-sep: 0.6rem;
  list-style: none; margin: 2.5rem 0 0; padding: 0;
  display: grid; gap: 2rem 1.25rem; grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 600px) { .secuencia { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px) { .secuencia { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1280px) { .secuencia { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 1.25rem; } }
.secuencia__paso {
  position: relative;
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: var(--sec-sep);
}
/* El filete va de centro a centro del circulo: asi no sobresale por fuera del
   primero ni del ultimo. Se corta al final de cada fila segun el reparto. */
.secuencia__paso::after {
  content: ""; position: absolute; z-index: 0;
  left: 50%; right: -50%; height: 1px; background: var(--rule);
  top: calc(var(--sec-n) + var(--sec-sep) + var(--sec-ico) / 2 - 0.5px);
}
.secuencia__paso:last-child::after { display: none; }
@media (max-width: 599px) { .secuencia__paso::after { display: none; } }
@media (min-width: 600px) and (max-width: 899px) {
  .secuencia__paso:nth-child(2n)::after { display: none; }
}
@media (min-width: 900px) and (max-width: 1279px) {
  .secuencia__paso:nth-child(3n)::after { display: none; }
}
.secuencia__n {
  position: relative; z-index: 1;
  flex: none;
  /* --sec-n (22px) se queda igual, es el alto de fila del filete: este
     margen negativo absorbe justo los 6px que la cifra crece (1.75rem =
     28px) para que ese alto neto -y el filete- no varien. */
  margin-bottom: calc(var(--sec-n) - 1.75rem);
  font-family: var(--font-mono); font-weight: 600; font-size: 1.75rem; line-height: 1;
  color: var(--teal);
}
/* Fondo opaco del color de la banda: es lo que impide que el filete cruce el
   circulo por dentro. */
.secuencia__icono {
  position: relative; z-index: 1;
  width: var(--sec-ico); height: var(--sec-ico); flex: none;
  display: grid; place-items: center; border-radius: 50%;
  /* --rule contra --soft daba 1.44:1, casi invisible: el circulo no se leia
     como un aro. --grey sube a 5.38:1, muy cerca del propio icono teal
     (5.67:1 sobre el mismo fondo): visible sin ganarle protagonismo al
     dibujo de dentro. */
  background: var(--soft); border: 1px solid var(--grey);
  transition: border-color 0.15s ease;
}
.secuencia__paso:hover .secuencia__icono { border-color: var(--teal); }
.secuencia__icono img { display: block; width: 32px; height: 32px; }
/* h3, no h4: ver el comentario de .pie h3 sobre el salto de nivel corregido
   en /nosotros/. font-size fijo en 1.05rem porque el h3 base del sitio es
   bastante mas grande (clamp hasta 1.75rem) y a ese tamano los seis pasos no
   caben en una fila de la rejilla; conserva el tamano que ya tenia como h4. */
.secuencia__paso h3 { margin: 0.25rem 0 0; font-size: 1.05rem; }
.secuencia__paso p { margin: 0.35rem 0 0; color: var(--grey); font-size: 0.95rem; }

/* ----- 17. Formularios ----- */
.formulario { display: grid; gap: 1.25rem; max-width: 640px; }
.campo { display: grid; gap: 0.4rem; }
.campo label { font-weight: 600; color: var(--slate); font-size: 0.95rem; }
.campo .ayuda { font-size: 0.82rem; color: var(--grey); }
.campo input, .campo select, .campo textarea {
  font-family: var(--font-text);
  font-size: 1rem;
  padding: 0.75rem 0.9rem;
  border: 1.5px solid var(--rule);
  border-radius: var(--radius-sm);
  background: #fff;
  color: var(--ink);
  width: 100%;
}
.campo input:focus, .campo select:focus, .campo textarea:focus {
  border-color: var(--teal);
  outline: none;
  box-shadow: 0 0 0 3px rgba(15,110,110,0.15);
}
.campo textarea { min-height: 110px; resize: vertical; }
.campo[data-invalido="true"] input, .campo[data-invalido="true"] textarea { border-color: var(--crimson); }
.campo__error { color: var(--crimson); font-size: 0.85rem; min-height: 1.1em; }
/* "(opcional)" visible en la propia etiqueta. Va dentro del <label>, no en un
   texto de ayuda aparte, para que el lector de pantalla lo anuncie junto al
   nombre del campo y no despues. */
.etiqueta-opcional { font-weight: 400; color: var(--grey); }

.campo-check { display: flex; gap: 0.7rem; align-items: flex-start; font-size: 0.9rem; color: var(--grey); }
/* 1.25rem son 20px de casilla, pero el objetivo tactil no es la casilla: el
   <label for> hace clicable toda la fila, y con el acolchado de abajo esa fila
   pasa de 24px de alto en cualquier caso, que es el minimo de la WCAG 2.5.8. */
.campo-check input { width: 1.25rem; height: 1.25rem; margin-top: 0.25rem; flex-shrink: 0; cursor: pointer; }
.campo-check label { padding: 0.35rem 0; line-height: 1.5; cursor: pointer; }

/* Bloque de consentimiento de comunicaciones. Va al final del formulario, con
   sus dos casillas SIN required y SIN checked: el acceso no puede depender de
   aceptarlas o el consentimiento deja de ser libre, y una casilla premarcada
   no es consentimiento. El valor real viaja en los ocultos que sincroniza
   main.js; ver el comentario alli. */
.consentimiento { display: grid; gap: 0.75rem; margin-top: 0.35rem; }
.consentimiento__nota { margin: 0; font-size: 0.82rem; line-height: 1.5; color: var(--grey); }

/* Via alternativa sin formulario. Tiene que estar y tiene que verse, pero
   SUBORDINADA al boton: si compite con el, mucha gente elige el camino que no
   deja dato. De ahi que vaya en cuerpo pequeno, en --grey y como enlace de
   texto, no como boton. El enlace se subraya para que se distinga del texto
   sin necesidad de color, y se queda en --grey en lugar del --teal de enlace
   para no llamar mas la atencion que el CTA. */
.via-alternativa { margin: 0.9rem 0 0; font-size: 0.82rem; line-height: 1.5; color: var(--grey); }
.via-alternativa a { color: var(--grey); text-decoration: underline; }
.via-alternativa a:hover, .via-alternativa a:focus-visible { color: var(--slate); }
/* En la portada cierra el bloque centrado; en las landings va bajo el boton
   del formulario, alineada con el. */
.cierre-demos .via-alternativa { max-width: 56ch; margin-inline: auto; }
.oculto-honeypot { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.formulario__nota { font-size: 0.82rem; color: var(--grey); }
.formulario__estado {
  font-size: 0.92rem;
  padding: 0.85rem 1rem;
  border-radius: var(--radius-sm);
  display: none;
}
.formulario__estado.visible { display: block; }
.formulario__estado--error { background: var(--bg-red); color: var(--crimson); }
.formulario__estado--info { background: var(--bg-amber); color: var(--amber); }

/* ----- 17 bis. Formulario compacto (modificador reutilizable) -----
   .campo sigue siendo el envoltorio que valida main.js: esto solo cambia
   como se reparten los .campo dentro de .formulario, nunca su contenido
   interno. auto-fit decide las columnas por el ancho REAL del contenedor,
   no por el viewport: en /contacto/ (columna ancha) da dos columnas: en
   /demostraciones/ (panel angosto) puede quedarse en una sin que haga falta
   una media query aparte. El orden de las columnas es el orden del DOM: para
   cambiar que campos comparten fila, se reordena el HTML, nunca con `order`
   ni grid-column en los campos normales, asi el tabulador sigue el orden
   visual. */
.formulario--compacto {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 0.85rem 1.5rem;
  align-items: start;
  max-width: 720px;
}
/* Elementos que deben romper la fila y ocupar las columnas completas,
   sea cual sea su numero: el textarea (marcado a mano con .campo--ancho,
   porque un campo de texto libre no debe compartir fila) y los bloques que
   ya son de ancho completo por su propia naturaleza (consentimientos, aviso
   de envio, boton, nota final, via alternativa de demostraciones). */
.formulario--compacto .campo--ancho,
.formulario--compacto .consentimiento,
.formulario--compacto .formulario__estado,
.formulario--compacto > button[type="submit"],
.formulario--compacto .formulario__nota,
.formulario--compacto .via-alternativa {
  grid-column: 1 / -1;
}
/* Densidad: solo desde el ancho donde ya hay sitio para pensar en dos
   columnas (el mismo umbral que usa auto-fit con minmax(260px,1fr) mas el
   gap). Por debajo, el formulario se queda con el tacto de siempre: 46px de
   alto de campo, que es el minimo comodo en movil. */
@media (min-width: 560px) {
  .formulario--compacto .campo { gap: 0.3rem; }
  .formulario--compacto .campo input,
  .formulario--compacto .campo select,
  .formulario--compacto .campo textarea {
    padding: 0.55rem 0.75rem;
  }
  .formulario--compacto .campo textarea { min-height: 60px; }
  .formulario--compacto .campo__error { min-height: 1em; }
  .formulario--compacto .campo-check label { padding: 0.2rem 0; }
  .formulario--compacto .consentimiento { gap: 0.35rem; margin-top: 0.05rem; }
  .formulario--compacto .consentimiento__nota { line-height: 1.35; }
}
/* El select de pais del telefono usa max-width:45% (17. Formularios), que en
   una columna de una sola fila (formulario sin comprimir, ~640px) sobra de
   sitio. En .formulario--compacto la columna puede bajar a ~260-300px -la
   mitad de un formulario de dos columnas- y 45% de eso (117-134px) no
   alcanza para "Ecuador +593" mas la flecha nativa: se veia truncado a
   "Ecuador +5". El piso en px no depende del ancho de columna, asi que
   crece cuando hace falta -el propio track de la rejilla se ensancha para
   darle sitio, via minmax(260px,1fr)- sin tocar el ancho de columna de los
   demas campos. */
.formulario--compacto .telefono__pais { min-width: 152px; }
/* Tarjeta que envuelve el formulario de /contacto/: menos acolchado y titulo
   mas pequeno que una tarjeta de contenido normal, porque aqui el formulario
   es el contenido, no un resumen dentro de una tarjeta generica. */
.tarjeta--formulario { padding: 1.25rem 1.5rem; }
.tarjeta--formulario h2 { font-size: 1.3rem; margin-bottom: 0.6rem; }
/* Rejilla de /contacto/: 40% para el texto y la ilustracion, 60% para el
   formulario, y no al reves como .rejilla-2 generica. Scoped a esta clase
   propia -no se toca .rejilla-2- porque esa proporcion es del formulario, no
   del sistema de columnas del sitio. Mismo punto de corte que .dolores y
   .hero__rejilla, 1120px, para que las secciones de la pagina se apilen
   todas a la vez. */
.contacto__rejilla { display: grid; gap: 2.5rem; grid-template-columns: 1fr; align-items: start; }
.contacto__rejilla > * { min-width: 0; }
@media (min-width: 1120px) {
  .contacto__rejilla { grid-template-columns: 0.4fr 0.6fr; gap: 3rem; }
  /* El parrafo hero__parrafo/.lead usa el tamano grande de heroe (clamp
     hasta 1.375rem) pensado para un ancho de ~54ch a pantalla completa.
     Aqui vive en el 40% de columna (iteracion 2), no en un hero de ancho
     completo, y a ese tamano el parrafo por si solo llegaba a 358px de
     alto -mas que la imagen y el callout juntos-, desequilibrando la
     columna frente al formulario. Baja a texto de cuerpo normal: mismo
     texto integro, ninguna palabra se toca. */
  .contacto__rejilla .hero__parrafo { font-size: 1rem; line-height: 1.55; }
}

/* ----- 18. Boton flotante WhatsApp ----- */
.whatsapp-flotante {
  position: fixed;
  right: 1.25rem;
  bottom: 1.25rem;
  width: 58px; height: 58px;
  border-radius: 50%;
  background: var(--forest);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md);
  z-index: 400;
  text-decoration: none;
}
.whatsapp-flotante svg { width: 28px; height: 28px; }
.whatsapp-flotante[hidden] { display: none; }

/* ----- 19. Banner de cookies ----- */
.banner-cookies {
  position: fixed;
  left: 0.75rem; right: 0.75rem; bottom: 0.75rem;
  max-width: 640px;
  margin: 0 auto;
  background: var(--ink);
  color: #EDEFF2;
  border-radius: var(--radius-md);
  padding: 1.35rem 1.5rem;
  box-shadow: var(--shadow-md);
  z-index: 600;
  display: none;
}
.banner-cookies.visible { display: block; }
.banner-cookies p { margin: 0 0 1rem; font-size: 0.92rem; }
.banner-cookies a { color: #7FD4CE; }
.banner-cookies__botones { display: flex; flex-wrap: wrap; gap: 0.75rem; }
.banner-cookies__botones button {
  flex: 1 1 auto;
  padding: 0.65rem 1rem;
  border-radius: var(--radius-sm);
  font-weight: 600;
  cursor: pointer;
  font-size: 0.9rem;
  border: 1.5px solid #fff;
  background: transparent;
  color: #fff;
}
.banner-cookies__botones .aceptar { background: var(--gold); color: var(--ink); border-color: var(--gold); }

/* El banner es position:fixed sin que el documento reserve espacio para el,
   asi que puede cubrir el final del contenido -en /politica-cookies/,
   concretamente el boton "Cambiar mi decision de cookies"- sin que exista
   ninguna posicion de scroll natural en la que quede claramente visible por
   encima de el. Solo mientras el banner esta realmente visible se reserva
   espacio de sobra al final de #contenido, para que la pagina pueda
   desplazarse lo suficiente y liberar esa zona. 320px cubre con margen la
   altura maxima medida del banner (272px en movil estrecho, mas su margen
   inferior de 0.75rem) en cualquier ancho. Con el banner oculto no se anade
   nada: :has() lo hace condicional sin tocar JS. */
body:has(.banner-cookies.visible) #contenido { padding-bottom: 320px; }

/* ----- 20. Mockups (marco navegador / portada PDF) -----
   Mismo tratamiento que un panel del sitio, no una ventana de macOS: radio
   --radius-md y sombra --shadow-sm, los mismos que .tarjeta y .panel-numerado,
   nunca --shadow-md, que es la sombra de elevacion al pasar el raton. Sin los
   tres puntos: la barra lleva solo la direccion. */
.mockup-navegador {
  border-radius: var(--radius-md);
  overflow: hidden;
  border: 1px solid var(--rule);
  box-shadow: var(--shadow-sm);
  background: var(--paper);
}
.mockup-navegador__barra {
  display: flex;
  align-items: center;
  padding: 0.65rem 0.85rem;
  background: var(--band);
  border-bottom: 1px solid var(--rule);
}
.mockup-navegador__direccion {
  flex: 1;
  background: #fff;
  border: 1px solid var(--rule);
  border-radius: 5px;
  height: 20px;
  font-size: 0.68rem;
  color: var(--grey);
  display: flex;
  align-items: center;
  padding: 0 0.5rem;
  font-family: var(--font-mono);
}
.mockup-navegador__imagen-cont { overflow: hidden; max-height: 360px; }
.mockup-navegador__imagen-cont img { width: 100%; display: block; animation: recorrido-suave 14s ease-in-out infinite; }
@keyframes recorrido-suave {
  0%, 12% { object-position: top; }
  50% { object-position: bottom; }
  88%, 100% { object-position: top; }
}
.mockup-navegador__imagen-cont img { object-fit: cover; object-position: top; height: 360px; }

.mockup-pdf {
  display: inline-block;
  max-width: 220px;
  border-radius: 6px;
  box-shadow: var(--shadow-md);
  transform: rotate(-3deg);
  border: 1px solid var(--rule);
  overflow: hidden;
}

.etiqueta-referencia {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-family: var(--font-mono);
  font-size: 0.68rem;
  color: var(--grey);
  background: rgba(255,255,255,0.9);
  padding: 0.2rem 0.5rem;
  border-radius: 4px;
  border: 1px solid var(--rule);
}
.contenedor-visual { position: relative; }
.contenedor-visual .etiqueta-referencia { position: absolute; bottom: 0.6rem; right: 0.6rem; }

.etiqueta-sintetico {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  /* #9A6300 y no --amber: el token daba 3.75:1 sobre --bg-amber, por debajo
     del 4.5 de texto. Este llega a 4.70:1. Se cambia aqui y no en el token
     porque --amber tiene otros usos con otros fondos. */
  color: #9A6300;
  background: var(--bg-amber);
  border: 1px solid #E8CD8F;
  padding: 0.3rem 0.65rem;
  border-radius: 999px;
  margin-bottom: 1rem;
}

/* ----- 21. Banda "pruebelo usted mismo" ----- */
.banda-prueba {
  background: var(--soft);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  padding: 2rem;
  display: grid;
  gap: 1.25rem;
  align-items: center;
  grid-template-columns: 1fr;
  margin: 2.5rem 0;
}
@media (min-width: 768px) { .banda-prueba { grid-template-columns: 1fr auto; } }

/* ----- 22. Red animada (motivo visual) ----- */
.nodo-riesgo { animation: pulso-riesgo 3.4s ease-in-out infinite; transform-origin: center; }
.nodo-riesgo--2 { animation-delay: 0.6s; }
.nodo-riesgo--3 { animation-delay: 1.2s; }
.nodo-riesgo--4 { animation-delay: 1.8s; }
@keyframes pulso-riesgo {
  0%, 100% { opacity: 0.55; }
  50% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .nodo-riesgo { animation: none; opacity: 0.9; }
  .mockup-navegador__imagen-cont img { animation: none; }
}

/* ----- 23. Articulos de blog ----- */
/* El cuerpo del articulo mide 760px, pero esa medida vive DENTRO del
   contenedor, no sobre la capa exterior. Antes el max-width estaba en el
   <article>, que es la capa de fondo: el padding del contenedor se comia
   64px y el texto quedaba en 696px, no en los 760 previstos. Sumar los dos
   gutters al inner devuelve la medida disenada. */
.articulo { max-width: none; }
.articulo > .section__inner { max-width: calc(760px + 2 * var(--gutter)); }
.articulo__meta { color: var(--grey); font-size: 0.9rem; margin-bottom: 2rem; font-family: var(--font-mono); }
.articulo h2 { margin-top: 2.25rem; }
.articulo h3 { margin-top: 1.75rem; }
.articulo figure { margin: 2rem 0; }
.articulo figcaption { font-size: 0.85rem; color: var(--grey); margin-top: 0.5rem; text-align: center; }
.migas { font-size: 0.85rem; color: var(--grey); margin-bottom: 1.5rem; }
.migas a { color: var(--grey); }
.migas ol { list-style: none; display: flex; flex-wrap: wrap; gap: 0.35rem; padding: 0; margin: 0; }
.migas li:not(:last-child)::after { content: "/"; margin-left: 0.35rem; color: var(--rule); }

/* ----- 24. Avatar geometrico (Nosotros) ----- */

/* ----- 25. Tablero embebido a ventana completa (paginas de /acceso/) -----
   El reparto va por flex y no por una resta a ojo: la zona mide la ventana
   menos la cabecera (que es sticky y siempre ocupa --header-h), la franja de
   arriba se lleva lo que necesite y el lienzo se queda con el resto exacto.
   Asi el tablero llena la pantalla al entrar sin que haya que adivinar cuanto
   mide la franja en cada ancho.
   100dvh y no 100vh: en movil la barra del navegador se recoge al hacer
   scroll y con 100vh el tablero quedaria cortado. 100vh queda de respaldo
   para los navegadores que no entiendan dvh. */
.zona-tablero {
  display: flex;
  flex-direction: column;
  height: calc(100vh - var(--header-h));
  height: calc(100dvh - var(--header-h));
  min-height: 30rem;
}
.barra-tablero {
  flex: none;
  padding: 0.75rem var(--gutter);
  border-bottom: 1px solid var(--rule);
  background: var(--paper);
}
.barra-tablero__fila { display: flex; flex-wrap: wrap; gap: 0.75rem 1.25rem; align-items: center; justify-content: space-between; }
.barra-tablero__fila--baja { margin-top: 0.5rem; }
.barra-tablero h1 { font-size: clamp(1.1rem, 0.9rem + 0.6vw, 1.4rem); line-height: 1.2; margin: 0.1rem 0 0; }
.barra-tablero .eyebrow { margin: 0; }
.barra-tablero .etiqueta-sintetico { margin: 0; }
.barra-tablero__acciones { display: flex; flex-wrap: wrap; gap: 0.6rem; }
/* Botones mas compactos que los del cuerpo: esta franja es cromo, no
   contenido, y cada pixel que ocupa se lo quita al tablero. */
.barra-tablero .boton-primario,
.barra-tablero .boton-secundario { padding: 0.55rem 1rem; font-size: 0.88rem; }

.sugerencias { font-size: 0.88rem; color: var(--grey); }
.sugerencias summary { cursor: pointer; color: var(--teal); font-weight: 600; }
.sugerencias ol { margin: 0.6rem 0 0; padding-left: 1.2rem; display: grid; gap: 0.35rem; }

.tablero-lienzo { flex: 1 1 auto; min-height: 0; background: var(--soft); }

/* Pantalla completa: el elemento que se expande es la ZONA, no solo el lienzo.
   Con el lienzo solo, el boton de salir se queda fuera del elemento a pantalla
   completa y por tanto invisible: se entra y no hay forma de salir salvo Esc,
   con el agravante de que el boton sigue diciendo "Salir de pantalla completa"
   donde nadie lo ve. Expandiendo la zona, la franja con el boton viaja dentro.
   El alto pasa a 100%: el calc() de arriba descuenta una cabecera que en
   pantalla completa ya no esta, y dejaria una franja muerta abajo. */
.zona-tablero:fullscreen { height: 100%; max-height: none; background: var(--paper); }
.dashboard-embebido { display: block; width: 100%; height: 100%; border: 0; background: var(--soft); }

/* ----- 27. Pagina de error 404 ----- */
.pagina-error { min-height: 60vh; display: flex; align-items: center; }
.pagina-error__codigo { font-family: var(--font-mono); font-size: 4rem; color: var(--rule); font-weight: 500; }

/* ----- 28. Impresion basica ----- */
@media print {
  .cabecera, .pie, .whatsapp-flotante, .banner-cookies { display: none !important; }
}

/* Hero de /soluciones/: texto a la izquierda, ilustracion modular a la derecha.
   La reparticion solo se activa a partir de 1440px: por debajo la columna de
   texto bajaria de 950px y el titular pasaria de dos lineas a tres. Ver README. */
.hero-soluciones__ilustracion { display: none; }

@media (min-width: 1440px) {
  .hero-soluciones {
    display: grid;
    grid-template-columns: minmax(0, 1fr) clamp(280px, 22vw, 360px);
    gap: clamp(32px, 3vw, 56px);
    align-items: center;
  }
  .hero-soluciones__texto { min-width: 0; max-width: 950px; }
  .hero-soluciones__ilustracion { display: block; min-width: 0; }
  .hero-soluciones__ilustracion svg { display: block; width: 100%; height: auto; }
}

/* En /soluciones/ el texto de la banda es un bloque de 720px, mas ancho en
   proporcion que la columna de 620px de la portada, asi que la nube lo alcanza
   antes. Medido: a 1120 caen 296 pixeles de textura bajo las cajas de texto y a
   1200 el margen todavia es negativo (nodos desde x=716, texto hasta x=768).
   Por eso aqui la textura no aparece hasta 1360, donde quedan ~47px de aire.
   Se aleja la nube, no se baja la opacidad. */
/* Composicion invertida respecto a la portada: la nube ocupa la izquierda y
   el texto se pega al borde derecho del contenedor. El texto solo se va a la
   derecha cuando hay nube que ocupe la izquierda; por debajo de 1360 la nube
   se oculta y el bloque vuelve al borde izquierdo, alineado con las demas
   secciones, para no dejar medio ancho vacio sin motivo. */
.seccion--puente-medida .textura-grafo {
  right: auto;
  left: 0;
  /* El ancho se calcula para que el borde derecho de la nube caiga justo en el
     primer caracter del texto, que arranca en (borde derecho del contenedor
     - 720px). Con gotera de 4vw eso es 96% - 720px; cuando el contenedor topa
     con su maximo de 1440 pasa a ser el 50% del ancho de la banda. El minimo
     de los dos acierta en todo el rango. */
  width: min(50%, calc(96% - 720px));
  max-width: none;
}
@media (min-width: 1360px) {
  .seccion--puente-medida .medida--derecha { margin-inline: auto 0; }
}
@media (max-width: 1359px) {
  .seccion--puente-medida .textura-grafo { display: none; }
}

/* El boton de "Cuatro modalidades de entrega" arrancaba justo donde termina la
   rejilla, sin margen, asi que quedaba pegado a la primera tarjeta y alineado
   con ella. Se separa y se centra. */
.modalidades__cta { margin: 2.5rem 0 0; text-align: center; }

/* ===== Pagina fusionada de NexoRisk ===== */

/* Sub-navegacion pegajosa. Se ancla bajo la cabecera, que mide --header-h. En
   movil se desplaza en horizontal y la entrada activa se mantiene a la vista. */
.subnav { position: sticky; top: var(--header-h); z-index: 20;
  background: var(--paper); border-bottom: 1px solid var(--rule); }
.subnav__inner { max-width: var(--container); margin-inline: auto;
  padding-inline: var(--gutter); }
.subnav__lista { display: flex; gap: 1.5rem; list-style: none; margin: 0; padding: 0;
  overflow-x: auto; scrollbar-width: none; }
.subnav__lista::-webkit-scrollbar { display: none; }
.subnav__lista a { display: block; padding: 0.85rem 0; white-space: nowrap;
  text-decoration: none; color: var(--grey); font-size: 0.95rem; font-weight: 600;
  border-bottom: 2px solid transparent; }
.subnav__lista a:hover { color: var(--slate); }
.subnav__lista a[aria-current="true"] { color: var(--slate); border-bottom-color: var(--teal); }
@media (max-width: 640px) { .subnav__lista { gap: 1.1rem; } }

/* Comparador de dos imagenes. El recorte lo hace clip-path sobre el lado B, que
   se apila encima; el control es un input range real, asi que el teclado
   funciona con las flechas y el lector de pantalla anuncia el valor. */
.comparador { margin-top: 2rem; }
.comparador__marco { position: relative; overflow: hidden;
  border-radius: var(--radius-md); border: 1px solid var(--rule); }
.comparador__lado { margin: 0; }
.comparador__lado img { display: block; width: 100%; height: auto; }
.comparador__lado--b { position: absolute; inset: 0;
  clip-path: inset(0 0 0 var(--corte, 50%)); }
.comparador__rotulo { position: absolute; bottom: 0.9rem; padding: 0.4rem 0.8rem;
  background: rgba(22,32,46,0.82); color: #E7ECF2; font-size: 0.82rem;
  border-radius: var(--radius-sm); }
.comparador__rotulo--a { left: 0.9rem; }
.comparador__rotulo--b { right: 0.9rem; }
.comparador__control { position: absolute; inset: 0; width: 100%; height: 100%;
  margin: 0; opacity: 0; cursor: ew-resize; }
/* El tirador tiene que verse sobre las dos mitades a la vez, y una sola tinta
   no puede: lo que contrasta con el modo claro se pierde en el oscuro. Por eso
   va en dos capas, linea oscura con reborde blanco y disco blanco con aro
   oscuro; sea cual sea el lado, una de las dos capas resalta. Las flechas
   dicen que se arrastra, que el cursor ew-resize solo cuenta con raton. */
.comparador__tirador { position: absolute; top: 0; bottom: 0; left: var(--corte, 50%);
  width: 2px; background: var(--ink); pointer-events: none;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.9); }
.comparador__tirador::after { content: ""; position: absolute; top: 50%; left: 50%;
  width: 34px; height: 34px; transform: translate(-50%, -50%);
  border: 2px solid var(--ink); border-radius: 50%; background: #FFFFFF;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316202E' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 7 5 12l4.5 5M14.5 7 19 12l-4.5 5'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: center; background-size: 17px 17px;
  box-shadow: 0 1px 3px rgba(22, 32, 46, 0.35); }
/* El anillo de foco es --teal, que sobre la mitad oscura da 2.11:1. El halo
   blanco le da un fondo propio para que se lea en los dos lados. */
.comparador__control:focus-visible + .comparador__tirador::after {
  outline: 3px solid var(--teal); outline-offset: 3px;
  box-shadow: 0 0 0 6px rgba(255, 255, 255, 0.92); }
.comparador__pie { margin-top: 0.7rem; }
.comparador__solo-apilado { display: none; }
/* Por debajo de 700px el arrastre se degrada a las dos imagenes apiladas: a esa
   anchura la barra deja de ser manejable con el pulgar. */
@media (max-width: 699px) {
  .comparador__lado--b { position: static; clip-path: none; margin-top: 1rem; }
  .comparador__rotulo { position: static; display: inline-block; margin-top: 0.5rem;
    background: rgba(22,32,46,0.55); }
  .comparador__control, .comparador__tirador { display: none; }
  .comparador__marco { overflow: visible; border: 0; }
}

/* Callout destacado: mismo peso visual que el critico pero en teal. El carmesi
   queda reservado a visualizaciones de datos. */
.callout--destacado { background: rgba(15,110,110,0.07); border-color: var(--teal); }
.callout--destacado .callout__titulo { color: var(--teal); }

/* Los dos modos del tablero: miniaturas estaticas, sin arrastre, para no
   competir con el comparador de la seccion 5. */
.modos { margin-top: 2.5rem; }
.modos__par { display: grid; gap: 1.25rem; grid-template-columns: minmax(0, 1fr);
  margin-top: 1.25rem; }
@media (min-width: 720px) { .modos__par { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.modos__miniatura { margin: 0; }
.modos__miniatura img { display: block; width: 100%; height: auto;
  border: 1px solid var(--rule); border-radius: var(--radius-md); }
.modos__miniatura figcaption { margin-top: 0.5rem; font-size: 0.9rem; color: var(--grey); }




/* ----- Teléfono con selector de código de país -----
   Tres controles: el select y el input son visibles y NO llevan name, de modo
   que no se envían por separado; el oculto con name="celular" se compone al
   enviar. Web3Forms recibe un solo campo, ya montado. */
.oculto-visual { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.campo__rotulo { display: block; font-weight: 600; margin-bottom: 0.35rem; }
.telefono { display: flex; gap: 0.5rem; align-items: stretch; }
/* El select se queda en su ancho de contenido y el número toma el resto. El
   min-width: 0 evita que el input se niegue a encoger por debajo de su
   contenido mínimo y desborde a 360px. */
.telefono__pais { flex: 0 0 auto; max-width: 45%; }
.telefono__numero { flex: 1 1 auto; min-width: 0; }
@media (max-width: 380px) {
  .telefono { flex-direction: column; }
  .telefono__pais { max-width: 100%; }
}

.pagina-acceso { min-height: 100dvh; display: flex; flex-direction: column; overflow: hidden; }
.pagina-acceso .banner-cookies { z-index: 40; }

/* ===== Páginas de acceso a los tableros =====
   Son una herramienta, no una página de contenido: una franja de 56px arriba y
   el tablero ocupando el resto exacto de la ventana. El alto sale de un flex
   sobre 100dvh, no de una resta a ojo, para que no quede recortado por abajo a
   ninguna altura de ventana. */
.franja-acceso {
  height: 56px; flex: none;
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; padding: 0 0.75rem 0 1rem;
  background: var(--ink); color: #E7ECF2;
  border: 0; box-shadow: none;
}
.franja-acceso__marca { display: flex; align-items: center; flex: none; }
.franja-acceso__acciones { display: flex; align-items: center; gap: 0.15rem; }

/* Area tactil de 44x44 aunque el icono dibujado mida 21. */
.icono-accion {
  display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem;
  min-width: 44px; height: 44px; padding: 0 0.55rem;
  border: 0; background: none; color: inherit; cursor: pointer;
  border-radius: var(--radius-sm); text-decoration: none;
  font-family: var(--font-text); font-size: 0.85rem; font-weight: 600;
}
.icono-accion:hover { background: rgba(255, 255, 255, 0.12); }
.icono-accion:focus-visible { outline: 3px solid var(--teal); outline-offset: -2px; }
.icono-accion svg { flex: none; }
/* En escritorio el texto vive solo para el lector de pantalla: el title basta
   para el visitante con cursor. */
.icono-accion__texto {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
/* El interrogante se separa del grupo. */
.icono-accion--suelto { margin-left: 0.85rem; }

/* Sin cursor no hay title que consultar, asi que los dos iconos cuyo
   significado no es evidente muestran su rotulo. */
@media (max-width: 699px) {
  .icono-accion--rotulado .icono-accion__texto {
    position: static; width: auto; height: auto; margin: 0;
    overflow: visible; clip: auto; clip-path: none;
  }
  /* Con los dos rotulos puestos, la franja pide 445px. Se comprime el logotipo,
     el relleno y el cuerpo del rotulo hasta que entra en 360 sin desbordar.
     El area tactil de 44px se mantiene: lo que se recorta es el aire, no el
     objetivo. */
  .franja-acceso { padding: 0 0.35rem 0 0.5rem; }
  .franja-acceso__acciones { gap: 0; }
  .icono-accion { padding: 0 0.3rem; gap: 0.28rem; font-size: 0.72rem; }
  .icono-accion--suelto { margin-left: 0.3rem; }
  .icono-accion svg { width: 19px; height: 19px; }
}
/* Un escalon mas para pantallas estrechas: a 360 la franja pedia 377px. Se
   recorta el logotipo y el cuerpo del rotulo, nunca el area tactil. */
@media (max-width: 420px) {
  .icono-accion { padding: 0 0.22rem; font-size: 0.68rem; gap: 0.22rem; }
  .icono-accion--suelto { margin-left: 0.18rem; }
}

.zona-tablero { flex: 1 1 auto; min-height: 0; position: relative; }
.dashboard-embebido { display: block; width: 100%; height: 100%; border: 0; }

/* El panel de sugerencias se monta sobre el tablero, no lo desplaza. */
.panel-sugerencias {
  position: absolute; inset: 0; z-index: 5;
  display: flex; align-items: flex-start; justify-content: center;
  padding: 1.5rem 1rem; background: rgba(22, 32, 46, 0.55);
}
.panel-sugerencias[hidden] { display: none; }
.panel-sugerencias__caja {
  background: var(--paper); color: var(--ink);
  border-radius: var(--radius-md); padding: 1.5rem 1.75rem;
  max-width: 620px; width: 100%; max-height: 100%; overflow-y: auto;
  box-shadow: 0 18px 48px -12px rgba(22, 32, 46, 0.45);
}
.panel-sugerencias__cabeza {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem;
}
.panel-sugerencias__cabeza h1 { margin: 0; font-size: 1.25rem; }
.panel-sugerencias__cerrar {
  flex: none; min-width: 44px; height: 44px; margin: -0.6rem -0.6rem 0 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 0; background: none; color: var(--grey); cursor: pointer;
  border-radius: var(--radius-sm);
}
.panel-sugerencias__cerrar:hover { background: var(--band); color: var(--ink); }
.panel-sugerencias__cerrar:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }
.panel-sugerencias ol { margin: 1rem 0 0; padding-left: 1.25rem; }
.panel-sugerencias li + li { margin-top: 0.6rem; }

/* El logotipo horizontal claro mide 280px a 26px de alto. El umbral no lo marca
   su ancho sino el de los controles: por debajo de 700px los dos iconos
   rotulados ocupan unos 300px, y 280+300 no entra ni en 560 ni en 699. Desde
   700 los rotulos desaparecen, los controles bajan a ~190px y el conjunto pide
   484 de los 700 disponibles. Por debajo se usa el apilado claro.

   Para esos anchos se evaluo el isotipo y SE DESCARTO. A igual altura de
   dibujo ocuparia unos 20px frente a los 48 del apilado: unos 28px de ganancia
   sobre 360 de ancho total, que no justifican mantener una quinta variante de
   logotipo sincronizada con material/logo/ ni la regla de CSS que la elige.
   Hoy no hay desbordamiento en ningun ancho de 360 a 1920, asi que no hay
   problema que resolver. Decision cerrada: no es una carencia pendiente. */
.franja-acceso__logo { display: block; width: auto; }
.franja-acceso__logo--ancho { height: 26px; }
.franja-acceso__logo--compacto { display: none; }
@media (max-width: 699px) {
  .franja-acceso__logo--ancho { display: none; }
  .franja-acceso__logo--compacto { display: block; height: 22px; }
}
@media (max-width: 420px) {
  .franja-acceso__logo--compacto { height: 18px; }
}

.panel-sugerencias__video { margin: 1.25rem 0 0; padding-top: 1rem;
  border-top: 1px solid var(--rule); font-weight: 600; }
.panel-sugerencias__video a { color: var(--teal); }

/* ===== Hero de /nexorisk/ ===== */
/* Las dos columnas arrancan a la misma altura y la ilustracion se centra dentro
   de la suya: antes la rejilla centraba las dos y la ilustracion, mas alta que
   el texto, colgaba muy por debajo. Solo esta pagina lo necesita; las demas
   paginas que comparten .hero__rejilla se quedan como estaban. */
.hero--nexorisk .hero__rejilla { align-items: start; }
.hero--nexorisk .hero__visual { align-self: stretch; display: flex; align-items: center; }

/* Migas sobre banda oscura. El enlace ya lo aclara la regla general de
   .seccion--slate; aqui solo hace falta el texto de la pagina actual. */
.seccion--slate .migas { color: #B9C3CF; }

/* El foco por defecto es --teal, que no llega al 3:1 que pide 1.4.11 para un
   indicador sobre ningun fondo oscuro del sitio: 2.11:1 sobre --slate, 2.72:1
   sobre --ink (el pie). Se resuelve con el mismo teal claro de las bandas
   oscuras en las dos zonas donde aplica -cualquier .seccion--slate y el pie-,
   sin tocar el foco por defecto de las secciones claras, que ya cumple.
   Da 7.41:1 sobre --slate (incluido el hero de /nexorisk/, que ya llevaba
   esta correccion antes de generalizarse) y 9.54:1 sobre --ink. */
.seccion--slate :focus-visible,
.pie :focus-visible {
  outline-color: #7FD4CE;
}

/* ----- Red de personas del hero -----
   Figuras humanas sin rostro: una sola forma definida en <symbol> y repetida
   con <use>, de modo que ninguna puede salir distinta de otra. Lo unico que
   cambia entre ellas es el color, que es lo que codifica el riesgo. */
.red-personas { display: block; width: 100%; height: auto; }
.red-personas__figuras use { fill: currentColor; }
.red-personas__figura { color: #C7D0DA; }
.red-personas__figura--acento { color: #7FD4CE; }
/* --crimson sobre --slate da 1.61:1: invisible. Este es el mismo rojo aclarado
   hasta 4.81:1, y sigue reservado a marcar los nodos de mayor riesgo. */
.red-personas__figura--riesgo { color: #E8827F; }
.red-personas__aristas line { stroke: #C7D0DA; stroke-opacity: 0.32; stroke-width: 2; }
.red-personas__aristas line.es-fuerte { stroke-opacity: 0.5; stroke-width: 2.6; }
.red-personas__halos circle { fill: #E8827F; fill-opacity: 0.16; }

/* Por debajo de 480px cada figura de la red completa baja de 29px de ancho y el
   conjunto se cierra en una mancha. Se cambia a una red de seis figuras
   dibujadas mas grandes, no se encoge la de once. */
.red-personas__reducida { display: none; }
@media (max-width: 479px) {
  .red-personas__completa { display: none; }
  .red-personas__reducida { display: block; }
}

/* ----- Cabecera del comparador a dos columnas -----
   El titulo ocupaba 729px y el parrafo colgaba debajo centrado en 800, asi que
   quedaba desplazado a la derecha con un hueco a su izquierda. Puestos en
   paralelo, ademas, el titular baja de cuatro lineas a dos. Se apilan en 1120,
   que es el corte del hero, la otra seccion de dos columnas de la pagina. */
.comparador-intro { display: grid; gap: 1.25rem; }
.comparador-intro .cabecera-seccion { margin-bottom: 0; max-width: none; }
/* Medida de lectura del parrafo: la misma escala de 62ch que el sitio usa en
   sus bloques de texto seguido. */
.comparador-intro__texto { max-width: 62ch; }
.comparador-intro__texto p { margin-bottom: 0; }
@media (min-width: 1120px) {
  .comparador-intro {
    /* Medido: con 1.04fr la columna izquierda se queda en 666px a 1440 y el
       titular parte en cuatro lineas; necesita 740 para tres. Con 1.16 mide 743
       a 1440 y 805 a 1920, y en las dos el titular baja a tres lineas. Cuesta
       17px de alto a 1440 y ahorra 12 a 1920, porque lo que gana el titulo lo
       pierde el parrafo, que crece en lineas. */
    grid-template-columns: minmax(0, 1.16fr) minmax(0, 0.84fr);
    gap: clamp(2rem, 3vw, 3.25rem);
    align-items: start;
  }
}

/* El comparador vuelve al ancho completo de su pista: lo que lo limita ahora es
   el hueco que dejan las dos flechas a los lados. */

/* ----- Dos diapositivas dentro del comparador -----
   Una sola rejilla gobierna las dos disposiciones. En pantalla ancha las
   flechas flanquean la pista; por debajo de 700px, donde el comparador ya se
   apila y el ancho es lo escaso, bajan a la fila de los puntos. */
.diapos {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  grid-template-areas:
    "previa pista  siguiente"
    ".      marca  ."
    ".      puntos .";
  align-items: center;
  column-gap: 0.75rem;
  /* Sin hueco de fila: las separaciones de este bloque las pone cada pieza, que
     no son iguales entre si —la etiqueta va pegada a la imagen y el boton
     claramente separado de los puntos—. */
  row-gap: 0;
  margin-top: 2rem;
}
.diapos__pista { grid-area: pista; min-width: 0; padding-block: clamp(0.5rem, 1.2vw, 1.25rem); }
.diapos__flecha--previa { grid-area: previa; }
.diapos__flecha--siguiente { grid-area: siguiente; }
.diapos__puntos { grid-area: puntos; justify-self: center; display: flex; gap: 0.25rem; }

@media (max-width: 699px) {
  .diapos {
    grid-template-columns: auto 1fr auto;
    grid-template-areas:
      "pista  pista  pista"
      "marca  marca  marca"
      "previa puntos siguiente";
  }
}

.diapos__lamina[hidden] { display: none; }
.diapos__titulo { margin: 0 0 clamp(0.9rem, 1.6vw, 1.4rem); font-size: clamp(1.05rem, 0.95rem + 0.4vw, 1.35rem); }

/* Disco blanco con aro --slate: el relleno no contrasta con la banda, pero el
   aro da 11.33:1, que es lo que pide 1.4.11 para el limite de un control. */
.diapos__flecha {
  width: 44px; height: 44px; flex: none;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1.5px solid var(--slate); border-radius: 50%;
  background: var(--paper); color: var(--slate); cursor: pointer;
}
.diapos__flecha:hover { background: var(--slate); color: #fff; }
/* La flecha del extremo se atenua, pero no tanto que desaparezca: a 0.32 su
   borde daba 1.86:1 sobre la banda y a 0.55 da 3.16:1, que es el minimo de
   1.4.11, mientras la activa se queda en 11.17 y la diferencia sigue siendo
   evidente. Lleva aria-disabled y no disabled, asi que sigue siendo alcanzable
   con el tabulador y nadie pierde el foco al llegar al final. */
.diapos__flecha[aria-disabled="true"] { opacity: 0.55; cursor: default; }
.diapos__flecha[aria-disabled="true"]:hover { background: var(--paper); color: var(--slate); }

/* El punto dibujado mide 12px, pero su area tactil es de 44x44. */
.diapos__punto {
  width: 44px; height: 44px; padding: 0; border: 0; background: none; cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
}
.diapos__punto::after {
  content: ""; width: 12px; height: 12px; border-radius: 50%;
  border: 1.5px solid var(--slate); background: transparent;
}
.diapos__punto[aria-current="true"]::after { background: var(--slate); }
.diapos__punto:hover::after { background: var(--rule); }
.diapos__punto[aria-current="true"]:hover::after { background: var(--slate); }

/* ----- Holgura del comparador -----
   Se estrecha un 15% de su pista y se centra entre las dos flechas, y gana aire
   arriba y abajo: por arriba para que la sub-navegacion pegajosa no llegue a
   tocar el borde de la imagen al desplazarse, y por abajo para separarla de los
   indicadores. El estrechamiento no baja de 700px: ahi el comparador ya esta
   apilado y ocupa el ancho del movil, donde quitarle un 15% mas solo lo haria
   ilegible. La proporcion la siguen fijando las propias imagenes. */
.diapos .comparador { margin-top: clamp(1.75rem, 3vw, 3rem); }
@media (min-width: 700px) {
  .diapos .comparador { max-width: 85%; margin-inline: auto; }
}

/* ----- Cierre del comparador: etiqueta, indicadores y boton -----
   La etiqueta colgaba suelta abajo a la izquierda, leyendose como un pie de
   seccion. Puesta bajo el marco y centrada, se lee como el rotulo de lo que se
   esta viendo. No va sobre la imagen porque las capturas tienen contenido
   propio en las esquinas superiores y la taparia.
   Las tres piezas se separan de menos a mas: la etiqueta casi pegada al marco,
   los indicadores algo mas abajo y el boton claramente aparte, de modo que se
   lean como un grupo con jerarquia y no como tres cosas sueltas. */
.diapos .diapos__marca { grid-area: marca; justify-self: center; margin: 0 0 clamp(0.65rem, 1.2vw, 1rem); }
.grupo-botones--centro { justify-content: center; }
.comparador__cta { margin-top: clamp(1.5rem, 2.6vw, 2.5rem); }

/* ===== #que-es: la cartera plana se convierte en red =====
   Ilustracion a la izquierda y texto a la derecha, al reves que las demas
   secciones. Se apilan en 1120, el corte que ya usan el hero y la cabecera del
   comparador, y al apilarse la ilustracion va primero. */
.que-es__rejilla { display: grid; gap: clamp(1.75rem, 3vw, 2.5rem); }
@media (min-width: 1120px) {
  .que-es__rejilla {
    grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr);
    gap: clamp(2rem, 3.5vw, 3.5rem);
    align-items: start;
  }
}
.que-es__rejilla .cabecera-seccion { margin-bottom: 0; }
.que-es__ilustracion { min-width: 0; }

.transformacion { display: block; width: 100%; height: auto; }
/* Dos composiciones del mismo contenido, no una redistribuida: el viewBox no se
   puede cambiar desde CSS. La vertical entra por debajo de 480px, que es donde
   la hoja de calculo baja de 120px de ancho y sus columnas dejan de leerse.
   Entre 480 y 1120 la seccion ya esta apilada, pero la ilustracion ocupa el
   ancho entero y la lectura horizontal sigue siendo la buena. */
.transformacion--alta { display: none; }
@media (max-width: 479px) {
  .transformacion--ancha { display: none; }
  .transformacion--alta { display: block; }
}

/* La hoja de calculo, en neutros: lo que tiene que leerse es el contraste entre
   lo plano y lo conectado, no la hoja en si. */
.trans-hoja__papel { fill: #FFFFFF; }
.trans-hoja__marco { fill: none; stroke: var(--grey); stroke-width: 1.5; }
.trans-hoja__cabecera { fill: #D6DCE3; }
.trans-hoja__numeros { fill: #F2F4F6; }
/* Trazo de 1.6 y no de 1: en la composicion ancha el SVG se dibuja a 0.95 de
   escala y una linea de 1 se disolvia entera en el antialias -cero pixeles del
   color declarado en la captura-, dejando la hoja sin rejilla visible. */
.trans-rejilla { stroke: var(--rule); stroke-width: 1.6; fill: none; }
.trans-celda { fill: #A9B4C1; }
.trans-celda .trans-celda--num { fill: #C3CBD4; }

.trans-flecha { fill: var(--teal); }

/* El tablero, con la paleta del sitio: es la mitad que debe leerse como
   estructurada y legible frente a la hoja plana de la izquierda. El carmesi
   aparece una sola vez, en la barra del valor de riesgo. */
.trans-tablero__pantalla { fill: #FFFFFF; }
.trans-tablero__marco { fill: none; stroke: var(--slate); stroke-width: 2; }
.trans-tablero__barra { fill: var(--slate); }
.trans-tablero__marcas { fill: rgba(255, 255, 255, 0.55); }
.trans-tarjeta { fill: var(--soft); stroke: var(--rule); stroke-width: 1; }
.trans-tarjeta__cifra { fill: var(--slate); }
.trans-tarjeta__rotulo { fill: #A9B4C1; }
.trans-panel { fill: var(--soft); stroke: var(--rule); stroke-width: 1; }
.trans-barras__eje { stroke: var(--rule); stroke-width: 1.4; }
.trans-barra { fill: var(--teal); }
.trans-barra--riesgo { fill: var(--crimson); }
.trans-tabla__cabecera { fill: var(--slate); }
.trans-tabla__fila { fill: #A9B4C1; }

/* ===== #irrc y #score de /nexorisk/: dos secciones hermanas =====
   Explican dos indicadores del mismo producto y deben leerse igual. Antes no
   lo hacian: #irrc daba a sus parrafos el ancho entero del contenedor -1325px
   a 1440- y #score los encerraba en una .medida-800 con margin-inline auto,
   que al centrar 800 dentro de 1325 dejaba 262px muertos a cada lado y se leia
   como una columna descolgada. Ahora las dos usan la misma medida, alineada a
   la izquierda como el resto de la pagina. */
.medida-lectura { max-width: 68ch; }

/* El tratamiento de esta clase esta mas abajo, junto al resto de lo que
   comparten #irrc y #score. */

/* La cifra de la cartera de validacion: el dato mas contundente de la pagina,
   que se leia como un pie. Las dos cifras en la tipografia de datos y el resto
   de la frase en cuerpo normal, sobre una tarjeta que la separa del texto. */
.bloque-evidencia {
  margin-top: 2.5rem;
  padding: 1.5rem 1.75rem;
  border: 1px solid var(--rule);
  border-top: 3px solid var(--slate);
  border-radius: var(--radius-md);
  background: var(--paper);
}
.bloque-evidencia__texto { margin-bottom: 0.9rem; }
.cifra-evidencia {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: clamp(1.75rem, 1.2rem + 1.8vw, 2.5rem);
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--slate);
}
.bloque-evidencia .etiqueta-caso { margin: 0; }

/* ----- #irrc: las cinco dimensiones, en tarjetas numeradas -----
   Cinco no reparte en filas de dos ni de tres sin dejar una tarjeta huerfana,
   y las dimensiones estan numeradas: en columna unica se leen como la lista
   ordenada que son, y cada fila tiene sitio para el nombre y su descripcion.
   El tratamiento -borde, fondo, radio y sombra- es el de .tarjeta, sin tocarlo:
   estas tarjetas y las de #que-incluye son la misma pieza. */
/* Por debajo del corte de la pagina el numero pasa encima del nombre: en 360px
   la columna del numero le quitaba ancho a la descripcion. */

/* ----- Ficha de datos -----
   La lista de definicion se veia con el sangrado por defecto del navegador.
   Terminos alineados en su columna, valores en la tipografia de datos.
   Termino y valor a todos los anchos: la ficha vive en la columna estrecha del
   segundo bloque de #irrc y ahi los tres pares en linea partian "CRITICO, ALTO,
   MEDIO, BAJO" en tres lineas y el ultimo valor en cinco. */
.ficha-dato {
  display: grid; grid-template-columns: auto minmax(0, 1fr);
  gap: 0.6rem 1.5rem; margin: 1.25rem 0 0; padding: 1.2rem 1.4rem;
  border: 1px solid var(--rule); border-radius: var(--radius-md); background: var(--paper);
}
.ficha-dato dt {
  font-family: var(--font-mono); font-size: 0.72rem; text-transform: uppercase;
  letter-spacing: 0.04em; color: var(--grey); padding-top: 0.2rem;
}
.ficha-dato dd { margin: 0; font-family: var(--font-mono); font-weight: 600; color: var(--slate); }
/* En movil, la columna del termino se come 88 de los 250px utiles y el ultimo
   valor caia en cinco lineas: se pone el termino encima. */
@media (max-width: 479px) {
  .ficha-dato { grid-template-columns: minmax(0, 1fr); gap: 0.2rem 0; }
  .ficha-dato dd + dt { margin-top: 0.9rem; }
}

/* ----- Nota al margen -----
   Informacion que un auditor agradece y que al lector comercial le interrumpe:
   se aparta de la linea de lectura con un filete neutro y cuerpo algo menor.
   Sin carmesi ni ambar, que en este sitio significan aviso. */
.nota-margen {
  display: block; margin: 1.5rem 0 0; padding: 0.15rem 0 0.15rem 1.15rem;
  border-left: 3px solid var(--rule);
}
.nota-margen p { margin: 0; font-size: 0.92rem; line-height: 1.6; color: var(--grey); }
/* Cuando cierra la seccion entera y no acompana a un parrafo, necesita
   despegarse del bloque de arriba. */
.nota-margen--cierre { margin-top: 2.5rem; }

/* ----- El hallazgo que vende el producto -----
   Mas aire, antetitulo con mas peso y cuerpo un punto por encima del normal.
   Acotado a #irrc: el otro .callout--destacado de la pagina se queda igual. */
#irrc .callout--destacado { padding: 1.6rem 1.9rem; margin-top: 1.75rem; }
#irrc .callout--destacado .callout__titulo { font-size: 0.92rem; margin-bottom: 0.55rem; }
#irrc .callout--destacado p:not(.callout__titulo) { font-size: 1.06rem; line-height: 1.6; }

/* ----- Ritmo: mas aire entre bloques que dentro de cada uno ----- */
#irrc h3 { margin-top: 3rem; }

/* ===== #irrc en dos bloques de dos columnas =====
   La seccion no tenia ningun elemento visual: texto y bloques de texto en una
   sola columna. Cada bloque reparte a mitades, alineados por arriba. Se
   mantiene el lado en los dos: invertirlos daria un zigzag y la seccion pierde
   el eje que comparte con el resto de la pagina.
   Cada bloque reparte lo suyo, y el reparto sale de medir cual cierra con
   menos desnivel, no de repetir el mismo numero:
   - #irrc bloque 1, tres quintos al panel: con mitades, tres de las cinco
     descripciones parten en dos lineas.
   - #irrc bloque 2, mitades: con 2fr/3fr su columna de texto se quedaba en
     364px a 1024 y crecia hacia abajo, con 116px de desnivel a 1440 y 238 a
     1024. A mitades queda entre 9 y 55.
   - #score, cinco cuartos al texto: sus dos callouts suman menos alto que sus
     cuatro parrafos, y a mitades sobraban de 104 a 167px que se iban al hueco
     entre los dos, un agujero. Asi cierran a cero en 1920, 1600, 1440, 1280 y
     1024, y a 22px en 1120.
   - #como-funciona, tres cuartos al panel: su columna izquierda es solo el
     rotulo -antetitulo, titulo y una linea- y no da para mas alto, asi que lo
     que se busca es el panel mas limpio. Con tres cuartos los cinco pasos caen
     en un titulo y una descripcion de una linea cada uno a 1440 y 1920; con
     2fr/3fr, dos de las cinco descripciones parten en dos.
   La costura interior no cae en la misma vertical en los cuatro, pero el eje
   -el borde izquierdo- si, que es el que comparten con el resto de la pagina. */
.bloque-doble { display: grid; gap: 1.5rem; align-items: start; margin-top: 2.5rem; }
@media (min-width: 1024px) {
  .bloque-doble { grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); gap: clamp(2rem, 3vw, 3.5rem); }
  .bloque-doble--mitades { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .bloque-doble--texto-mayor { grid-template-columns: minmax(0, 5fr) minmax(0, 4fr); }
  .bloque-doble--panel-ancho { grid-template-columns: minmax(0, 1fr) minmax(0, 3fr); }
}
.bloque-doble__texto > h3:first-child { margin-top: 0; }
/* La columna de piezas llega abajo del todo y lo que sobra se va al hueco
   entre el callout y la tarjeta de la cifra, no dentro de ninguna de las dos:
   asi las dos columnas cierran a la misma altura sin que nada se deforme ni se
   quede con un vacio interior. El bloque 1 no lleva esto: su columna derecha es
   un panel con borde y estirarlo si dejaria el vacio dentro de la caja. */
.bloque-doble__piezas {
  display: grid; gap: 1.25rem;
  align-self: stretch; align-content: space-between;
}
.bloque-doble__piezas > * { margin: 0; }

/* Un solo panel con cinco filas separadas por un filete, no cinco tarjetas. */
.panel-numerado {
  background: var(--paper); border: 1px solid var(--rule);
  border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
  padding: 0.5rem 1.5rem;
}
.panel-numerado__lista { list-style: none; margin: 0; padding: 0; }
/* Las filas salen 0.75rem por fuera del texto del panel para que el fondo del
   raton tenga aire alrededor de las palabras. Siguen siendo elementos de lista:
   no llevan a ninguna parte, asi que ni enlace ni boton ni foco. */
.panel-numerado__fila {
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 1rem;
  padding: 1.15rem 0.75rem; margin-inline: -0.75rem; align-items: start;
  border-radius: var(--radius-sm);
  transition: background-color 0.15s ease;
}
.panel-numerado__fila + .panel-numerado__fila { border-top: 1px solid var(--rule); }
.panel-numerado__fila:hover { background: rgba(15, 110, 110, 0.05); }
@media (prefers-reduced-motion: reduce) { .panel-numerado__fila { transition: none; } }
/* El numero, sobre un cuadrado redondeado en teal muy diluido: asi se lee como
   marca de posicion y no como una cifra suelta delante del nombre. El desplome
   de 0.3rem centra el cuadrado con la primera linea del nombre, que mide menos
   que el. */
.panel-numerado__n {
  display: grid; place-items: center;
  width: 2rem; height: 2rem; margin-top: -0.3rem;
  border-radius: var(--radius-sm); background: rgba(15, 110, 110, 0.09);
  font-family: var(--font-mono); font-weight: 600; font-size: 1.05rem;
  line-height: 1; color: var(--teal);
}
.panel-numerado__titulo { margin: 0 0 0.25rem; font-size: 1.05rem; line-height: 1.3; }
.panel-numerado__que { margin: 0; font-size: 0.92rem; line-height: 1.5; color: var(--grey); }
/* El panel sin numeracion: la fila pierde la columna del cuadrado y el titulo
   ocupa el ancho. Es un modificador del mismo componente, no un patron nuevo.
   El rotulo del panel va dentro, sobre las filas. */
.panel-numerado__fila--sin-marca { grid-template-columns: minmax(0, 1fr); }
.panel-numerado__rotulo {
  margin: 1rem 0 0; padding-bottom: 0.85rem;
  border-bottom: 1px solid var(--rule);
  font-size: 1.05rem; line-height: 1.3;
}

/* La cifra manda en su columna: es el argumento, no un detalle. */
.cifra-evidencia { font-size: clamp(2.1rem, 1.4rem + 2.4vw, 3.4rem); }

/* ===== La cabecera de los dos indicadores =====
   #irrc y #score son los dos indicadores del producto y se leen como pareja:
   la clase lleva el tratamiento entero y las dos cabeceras salen identicas por
   construccion, no por copiarlas.
   El oro es el color de "aqui se hace clic" y ninguna de las dos secciones
   tiene llamada a la accion, asi que el filete superior dorado deja paso a una
   franja vertical en teal del alto del antetitulo y el titulo juntos.
   Fondo teal al 7%, el mismo de .callout--destacado. Compuesto da #E6EEF0
   sobre la banda gris de #irrc y #EEF5F5 sobre el blanco de #score -las dos
   secciones no pueden llevar la misma banda seguidas-, y el antetitulo en teal
   encima llega a 5.13 y 5.47:1, por encima del 4.5 de texto normal.
   Las dos esquinas de la franja se quedan en angulo recto: redondearlas curva
   la barra de 6px en dos medias lunas y deja de leerse como franja. Es la misma
   geometria que ya usa .callout. */
.cabecera-seccion--destacada {
  border-left: 6px solid var(--teal);
  background: rgba(15, 110, 110, 0.07);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  padding: 1.35rem 1.75rem 1.5rem 1.5rem;
}
/* Los 6px solo aqui: en #irrc marcan la pieza mas fuerte de la pagina. Los
   callouts de #score son un aviso y una nota, informacion de apoyo, y subirlos
   al mismo grosor diria que pesan lo mismo. */
#irrc .callout--destacado { border-left-width: 6px; }

/* La tarjeta de la cifra era una tarjeta blanca mas y es el argumento mas
   fuerte de la pagina. Filete en teal y mas grueso, y las dos cifras en teal en
   vez del color de texto. Teal y no carmesi: esto es evidencia, no una
   visualizacion de riesgo. */
#irrc .bloque-evidencia { border-top: 5px solid var(--teal); }
#irrc .cifra-evidencia { color: var(--teal); }

/* ===== El resto de /nexorisk/: un patron distinto por seccion =====
   Tres secciones ya usan "texto a la izquierda, panel a la derecha". Si las
   demas lo repitieran, la pagina seria una sola forma repetida nueve veces.
   Aqui van los patrones propios de #entregables, #areas, #normativa, #limites
   y #preguntas. */

/* ----- #entregables: rejilla de tarjetas con icono -----
   Nueve reparte exacto en tres filas de tres, asi que no queda huerfana y no
   hace falta romper la primera fila. */
.rejilla-iconos { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 640px) { .rejilla-iconos { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .rejilla-iconos { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* Responde al raton sin ser clicable: elevacion corta y el borde en teal. */
.tarjeta--reactiva {
  transition: box-shadow 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}
.tarjeta--reactiva:hover {
  box-shadow: var(--shadow-md); border-color: var(--teal); transform: translateY(-2px);
}

/* Callout que cierra una seccion a ancho completo. Sus parrafos siguen
   limitados a 68ch por la regla de .section .callout p. */
.callout--cierre { margin-top: 2.25rem; }

/* ----- #limites: dos paneles enfrentados -----
   Lo que entra y lo que no entra tienen que leerse como opuestos. El que entra
   lleva el acento teal y marca de inclusion; el que no entra se queda en
   neutro con marca de exclusion. Sin carmesi: es una delimitacion, no un
   riesgo. El patron nacio compartido con #datos; al retirarse esa seccion se
   queda solo aqui, pero se conserva generico por si vuelve a hacer falta. */
.confrontacion { display: grid; gap: 1.25rem; margin: 2rem 0 2.25rem; align-items: start; }
@media (min-width: 768px) {
  .confrontacion { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.5rem; }
}
.confrontacion__panel {
  background: var(--paper); border: 1px solid var(--rule);
  border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
  padding: 1.5rem 1.75rem;
}
/* El que entra lleva ademas un fondo de teal al 4% sobre el de la seccion.
   Compuesto sobre --band da #E5EDF1: un matiz, no un bloque de color. El marco
   de --rule sigue separandolo del fondo. */
.confrontacion__panel--si {
  border-top: 4px solid var(--teal);
  background: rgba(15, 110, 110, 0.04);
}
.confrontacion__panel--no { border-top: 4px solid var(--rule); }
.confrontacion__titulo { margin: 0 0 1.1rem; font-size: 1.2rem; line-height: 1.25; }
.confrontacion__panel--si .confrontacion__titulo { color: var(--teal); }
.confrontacion__panel--no .confrontacion__titulo { color: var(--slate); }
.confrontacion__lista { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.85rem; }
.confrontacion__lista li {
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0.8rem;
  align-items: start; line-height: 1.55;
}
/* Las marcas van como imagen de fondo y no como caracter: asi no dependen de
   que la tipografia traiga el glifo y llevan el color que les toca. */
.confrontacion__lista li::before {
  content: ""; width: 1.35rem; height: 1.35rem; margin-top: 0.12rem;
  background-repeat: no-repeat; background-position: center; background-size: contain;
}
.confrontacion__panel--si .confrontacion__lista li::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='10' fill='%230F6E6E' fill-opacity='0.12'/%3E%3Cpath d='M5.8 10.3 L8.7 13.1 L14.2 7.2' fill='none' stroke='%230F6E6E' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.confrontacion__panel--no .confrontacion__lista li::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Ccircle cx='10' cy='10' r='10' fill='%235A6875' fill-opacity='0.14'/%3E%3Cpath d='M5.8 10 H14.2' fill='none' stroke='%235A6875' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
}

/* ----- #areas: lista vertical de roles y panel del activo -----
   Ocho en horizontal ocupaban dos filas rotas y el contenido de la activa eran
   dos lineas en un hueco enorme. En vertical se leen los ocho de un vistazo. */
.roles { margin-top: 2rem; }
.roles__marco { display: grid; gap: 1.25rem; align-items: start; }
@media (min-width: 900px) {
  .roles__marco { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 2rem; }
}
.roles__lista { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.3rem; }
.roles__boton {
  width: 100%; text-align: left; cursor: pointer;
  font-family: var(--font-text); font-size: 0.95rem; font-weight: 600; line-height: 1.35;
  padding: 0.7rem 1rem;
  background: transparent; color: var(--grey);
  border: 1px solid transparent; border-left: 3px solid var(--rule);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.roles__boton:hover { background: rgba(15, 110, 110, 0.05); color: var(--slate); }
.roles__boton:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }
.roles__boton[aria-selected="true"] {
  background: var(--paper); color: var(--slate);
  border-color: var(--rule); border-left-color: var(--teal); border-left-width: 3px;
  box-shadow: var(--shadow-sm);
}
/* Alto minimo reservado para que la pagina no salte al cambiar de pestana: los
   nueve textos van de dos a cinco lineas segun el ancho de columna, y sin esto
   cada cambio de pestana desplazaba el bloque de audiencias externas y el pie.
   Fluido porque el salto que hay que cubrir tambien lo es: a 360px la columna
   de texto baja a ~278px y "Consejo de Administracion" -el rotulo mas largo,
   25 caracteres- envuelve a dos lineas, con su parrafo a cinco; a 1440px+ la
   columna ronda 790-870px y las nueve caben en una linea de rotulo y dos de
   parrafo. Los dos extremos del clamp llevan margen sobre el calculo para
   absorber diferencia de metrica real de fuente: no se verifico en navegador.
   El contenido se queda arriba a proposito, sin centrar: es la instruccion,
   no un descuido, y dentro del alto reservado se nota en las pestanas cortas. */
.roles__panel {
  background: var(--paper); border: 1px solid var(--rule);
  border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
  padding: clamp(1.5rem, 1rem + 1.4vw, 2.25rem);
  min-height: clamp(11.5rem, 17.5rem - 6.7vw, 16rem);
}
.roles__panel h3 { margin-top: 0; }
.roles__panel > :last-child { margin-bottom: 0; }
.roles__panel ul { margin: 0; padding-left: 1.15rem; }
.roles__panel li + li { margin-top: 0.5rem; }

/* Ilustraciones de las cuatro etapas. Los iconos anteriores -lupa, barras,
   escudo, reloj- eran simbolos de interfaz que valdrian para cualquier
   producto; estas son redes, que es lo que el producto analiza y el lenguaje
   que ya usan el hero y la ilustracion de #que-es.
   El estilo vive aqui y no repetido dentro de cada SVG: es lo que garantiza
   que las cuatro compartan grosor, radio y caja, y que solo cambie la
   composicion. Mismos valores que red-hero.svg: arista #C9D2DB a 1.4 y nodo
   solido en teal. */
.red-etapa { display: block; width: 5rem; height: 5rem; margin-bottom: 1rem; }
.red-etapa line, .red-etapa circle, .red-etapa path { vector-effect: non-scaling-stroke; }
.red-etapa__arista { fill: none; stroke: var(--rule); stroke-width: 1.4; stroke-linecap: round; }
.red-etapa__arista--activa { stroke: var(--teal); stroke-width: 2; }
/* Tres grosores para la etapa de medicion: el vinculo tambien tiene magnitud. */
.red-etapa__arista--peso1 { stroke: var(--teal); stroke-width: 1.6; }
.red-etapa__arista--peso2 { stroke: var(--teal); stroke-width: 2.6; }
.red-etapa__arista--peso3 { stroke: var(--teal); stroke-width: 3.6; }
.red-etapa__nodo { fill: var(--rule); }
.red-etapa__nodo--acento { fill: var(--teal); }
/* Las marcas que distinguen una etapa de otra: el cerco que acota un
   subconjunto, el anillo que mide, la diana que senala y la flecha que compara.
   Todas en teal y con el mismo trazo fino. */
.red-etapa__cerco,
.red-etapa__anillo,
.red-etapa__diana,
.red-etapa__flecha {
  fill: none; stroke: var(--teal); stroke-width: 1.4;
  stroke-linecap: round; stroke-linejoin: round;
}
.red-etapa__cerco { stroke-dasharray: 3.2 2.8; }
/* Los cortes que parten la red por dimensiones, solo en la etapa de control. */
.red-etapa__corte { stroke: var(--teal); stroke-width: 1.4; opacity: 0.5; }
.red-etapa__anillo { opacity: 0.55; }

/* ----- #limites: la tesis del producto -----
   Es la frase que resume para que sirve todo lo anterior; como parrafo normal
   se perdia entre los dos paneles y el pie de la seccion. */
.tesis {
  max-width: 56ch; margin: 2.5rem 0 0;
  font-family: var(--font-display); font-weight: 700;
  font-size: clamp(1.2rem, 1rem + 0.8vw, 1.6rem); line-height: 1.4;
  color: var(--slate);
}

/* ----- #preguntas: el acordeon ocupa su columna entera ----- */
#preguntas .faq { max-width: none; }
.faq summary { transition: color 0.15s ease; }
.faq summary:hover { color: var(--teal); }
.faq summary:hover::after { color: var(--teal); }
.faq summary:focus-visible { outline: 3px solid var(--teal); outline-offset: 3px; }
/* La fila entera responde al raton, no solo el texto. */
.faq details { transition: background-color 0.15s ease; }
.faq details:hover { background: rgba(15, 110, 110, 0.04); }
/* Acotado a #preguntas para no mover las filas 12px si otra pagina llega a
   compartir .faq sin este relleno. */
#preguntas .faq summary,
#preguntas .faq__respuesta { padding-inline: 0.75rem; }
/* El fondo sale 0.75rem por fuera del texto para que no lo toque, pero solo
   desde 1024: por debajo el acordeon ocupa el ancho del contenedor y ese
   margen negativo sacaba 2px de barra horizontal a 560 y 4px a 360. */
@media (min-width: 1024px) {
  #preguntas .faq { margin-inline: -0.75rem; }
}

/* ----- Movimiento: corto y contenido, y ninguno si no se quiere ----- */
/* La regla global de la seccion 2 ya pone todas las duraciones a 0.001ms con
   !important, asi que aqui solo hace falta lo que esa regla no cubre: el
   desplazamiento del hover, que sin transicion se produciria de golpe. */
@media (prefers-reduced-motion: reduce) {
  .tarjeta--reactiva:hover, .tarjeta--enlace:hover { transform: none; }
}

/* ===== #normativa: las cinco etapas como paso a paso navegable =====
   Estaban las cinco en columnas de 130px con 250 palabras dentro. Ahora la fila
   es la navegacion y el texto vive en un solo panel debajo.
   De la cabecera hacia abajo, fila y panel forman un bloque simetrico
   centrado: 1180px la fila y 750px el panel, los dos con margin-inline auto en
   el mismo contenedor, asi que comparten centro por construccion. El panel se
   queda en 750 y no en los 880 de partida porque a 880 la linea mas larga de
   los diez parrafos daba 100 caracteres y a 835 daba 95, por encima del tope
   de 85. A 750 se queda en 85 justos. Medido con el avance medio real de cada
   parrafo, no suponiendo medio em por caracter. El
   antetitulo, el titular y el parrafo de entrada no entran en el bloque y
   conservan su eje izquierdo y su medida de lectura.
   Sin franja teal de 6px ni fondo teal tenue: son la marca de #irrc y #score.
   Sin oro: esta seccion no tiene llamada a la accion. */
.etapas { margin-top: 3rem; }

/* ----- La fila de cinco celdas ----- */
.etapas__fila {
  list-style: none; margin: 0 auto; padding: 0; max-width: 1180px;
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  background: var(--soft);
  border-radius: var(--radius-md) var(--radius-md) 0 0;
}
/* min-width:0: item de grid con texto de una sola palabra
   ("Identificación", "Mitigación"); sin esto, esa palabra fuerza a la
   celda a crecer mas alla de su 1fr en el tramo de escritorio, donde la
   fila es un grid de verdad y no la tira desplazable de mas abajo. */
.etapas__celda { position: relative; display: flex; min-width: 0; }
/* El filete que une las celdas va de centro a centro y pasa por detras de los
   numeros, que llevan fondo opaco y lo tapan. */
.etapas__celda:not(:last-child)::after {
  content: ""; position: absolute; z-index: 0;
  left: 50%; right: -50%; top: 2.6rem; height: 1px; background: var(--rule);
}
.etapas__boton {
  position: relative; z-index: 1;
  width: 100%; display: flex; flex-direction: column; align-items: center;
  gap: 0.6rem; padding: 1.5rem 0.75rem 1.25rem;
  background: transparent; border: 0; border-top: 3px solid transparent;
  cursor: pointer; font-family: inherit; text-align: center;
  transition: background-color 0.15s ease, opacity 0.15s ease;
}
.etapas__boton:focus-visible { outline: 3px solid var(--teal); outline-offset: -3px; }
/* El numero y la ilustracion llevan fondo opaco -mismo criterio que
   .secuencia__icono en /nosotros/, "Como trabajamos"-: el filete que une las
   celdas pasa por detras de los dos y este fondo lo tapa. Tiene que coincidir
   EXACTO con el fondo real de la celda, que no es el mismo en activa e
   inactiva: --soft aqui (coincide con el fondo de .etapas__fila, la celda
   inactiva) y --paper mas abajo, cuando la celda esta activa. */
.etapas__n {
  display: grid; place-items: center; flex: none;
  width: 2.2rem; height: 2.2rem; border-radius: 50%;
  border: 2px solid var(--teal); background: var(--soft); color: var(--teal);
  font-family: var(--font-mono); font-weight: 600; font-size: 0.95rem;
  transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.etapas__boton .red-etapa { width: 3.5rem; height: 3.5rem; margin: 0; border-radius: 50%; background: var(--soft); }
/* line-height fijo en rem y no en factor: es lo que reserva en las cinco
   celdas el alto del rotulo activo, que va un 12.5% mayor. Con un factor, la
   caja crecia con la fuente y la celda activa empujaba a las demas. */
.etapas__rotulo {
  font-family: var(--font-display); font-weight: 400; font-size: 0.95rem;
  line-height: 1.45rem; color: var(--grey);
  /* Solo el color transiciona: animar el tamano refluye el texto en cada
     cambio de etapa y se ve como un temblor. */
  transition: color 0.15s ease;
}
/* Inactiva: el numero y la ilustracion se atenuan. Ya no via opacity en el
   elemento que lleva el fondo opaco -asi es como el filete se colaba por
   dentro de los dos, a traves de un fondo que quedaba semitransparente-.
   El numero atenua color y borde, no su fondo. La ilustracion atenua el
   <g> de dentro, no el <svg>: el fondo vive en el <svg> y no en el <g>, asi
   que se queda a opacidad plena pase lo que pase con el dibujo. */
.etapas__boton[aria-selected="false"] .etapas__n { border-color: var(--grey); color: var(--grey); }
.etapas__boton[aria-selected="false"] .red-etapa > g { opacity: 0.35; }
.etapas__boton[aria-selected="false"]:hover .etapas__n { border-color: var(--teal); color: var(--teal); }
.etapas__boton[aria-selected="false"]:hover .red-etapa > g { opacity: 1; }
.etapas__boton[aria-selected="false"]:hover .etapas__rotulo { color: var(--slate); }
/* Activa. */
.etapas__boton[aria-selected="true"] {
  background: var(--paper); border-top-color: var(--teal);
}
.etapas__boton[aria-selected="true"] .etapas__n {
  background: var(--teal); color: var(--paper);
}
.etapas__boton[aria-selected="true"] .red-etapa { background: var(--paper); }
.etapas__boton[aria-selected="true"] .etapas__rotulo { color: var(--teal); font-weight: 600; }
/* Un paso mayor solo desde 600: por debajo la celda deja 96px utiles y
   "Identificacion" ya pide 110 a tamano normal. Es una sola palabra, no parte
   nunca, asi que agrandarla ahi solo aumentaria lo que se sale. */
@media (min-width: 600px) {
  .etapas__boton[aria-selected="true"] .etapas__rotulo { font-size: calc(0.95rem * 1.125); }
}

/* ----- El visor: panel al centro y los dos controles a los costados ----- */
/* Los controles van en el aire, fuera del panel: a 32px de su borde y
   centrados sobre el. Solo cuando cabe el conjunto de 44 de control mas 32 de
   aire a cada lado; por debajo pasan a una fila encima, al borde izquierdo del
   panel. El corte sale de la cuenta: el contenedor necesita 750 + 2*(44+32) =
   902px, y con el gutter de 4vw eso ocurre a partir de 981px de ventana. */
.etapas__visor {
  position: relative; max-width: 750px; margin-inline: auto; margin-top: 3rem;
  display: grid; gap: 0.75rem;
  /* La tercera pista se come el ancho sobrante. Con solo dos, el panel las
     abria a la mitad del contenedor cada una y los dos controles se separaban
     hasta los extremos en vez de quedar juntos al eje. */
  grid-template-columns: auto auto minmax(0, 1fr);
  grid-template-areas: "antes despues ." "panel panel panel";
}
@media (min-width: 990px) {
  .etapas__visor { display: block; }
  .etapas__flecha {
    position: absolute; top: 50%; transform: translateY(-50%); z-index: 1;
  }
  /* 44 de ancho mas 32 de aire hasta el borde del panel. */
  .etapas__flecha--antes { left: -76px; }
  .etapas__flecha--despues { right: -76px; }
}
.etapas__flecha--antes { grid-area: antes; }
.etapas__flecha--despues { grid-area: despues; }
.etapas__paneles { grid-area: panel; display: grid; }
.etapas__flecha {
  width: 44px; height: 44px; display: grid; place-items: center;
  background: transparent; border: 0; cursor: pointer; color: var(--ink);
  transition: color 0.15s ease, opacity 0.15s ease;
}
.etapas__flecha:hover { color: var(--teal); }
.etapas__flecha:focus-visible { outline: 3px solid var(--teal); outline-offset: 2px; }
.etapas__flecha[aria-disabled="true"] { opacity: 0.3; cursor: default; color: var(--ink); }
.etapas__chevron { width: 1.5rem; height: 1.5rem; }

/* ----- El panel -----
   Mismo marco que el panel de las cinco dimensiones de #irrc. Los cinco casos
   comparten celda de rejilla: el que no toca se oculta con visibility y no con
   display, de modo que la altura del visor es siempre la del mas alto y la
   pagina no salta al cambiar de etapa. visibility: hidden lo saca del arbol de
   accesibilidad igual que display: none, asi que el contrato de la pestana no
   cambia. */
.etapas__panel {
  grid-area: 1 / 1;
  background: var(--paper); border: 1px solid var(--rule);
  border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
  padding: clamp(1.5rem, 1rem + 1.6vw, 2.5rem);
}
.etapas__panel[hidden] { display: block; visibility: hidden; }
.etapas__par { margin: 0; }
.etapas__par dt {
  font-family: var(--font-display); font-weight: 700; font-size: 1.02rem;
  line-height: 1.3; color: var(--ink); text-align: center;
}
/* El parrafo ocupa el ancho del panel y no lleva tope propio: el que limita la
   linea es el panel, con sus 880px. Bandera derecha, nunca justificado. */
.etapas__par dd {
  margin: 0.5rem 0 0;
  text-align: left; line-height: 1.65;
}
.etapas__par dd + dt { margin-top: 1.75rem; }

/* ----- Estrecho -----
   Por debajo de 900 los controles no caben a los costados y pasan a una fila
   sobre el panel, al eje izquierdo. La fila de etapas se mantiene horizontal y
   se hace desplazable; el JS mantiene a la vista la celda activa. Por debajo de
   600 se van las ilustraciones y quedan numero y rotulo. */
@media (max-width: 899px) {
  .etapas__fila {
    grid-auto-flow: column; grid-auto-columns: minmax(9.5rem, 1fr);
    grid-template-columns: none;
    overflow-x: auto; scrollbar-width: thin;
  }
}
@media (max-width: 599px) {
  .etapas__boton .red-etapa { display: none; }
  .etapas__fila { grid-auto-columns: minmax(7.5rem, 1fr); }
  .etapas__celda:not(:last-child)::after { top: 2.3rem; }
}

/* ===== /demostraciones/: cabecera sin parrafo de entrada =====
   Toda otra pagina del sitio lleva h1 + p.lead.hero__parrafo antes de que
   termine la seccion; esta es la unica que no. Sin ese parrafo, el
   padding-bottom del sistema (--section-y) se suma al padding-top de la
   seccion siguiente y el hueco bajo el titulo dobla al de cualquier otra
   cabecera del sitio. Se retira aqui, sin inventar el parrafo que falta. */
.hero-sin-parrafo { padding-bottom: 0; }

/* ===== /demostraciones/: caso de validacion =====
   Las cuatro tarjetas de Hallazgos: .rejilla-4 usa auto-fit y entre 640 y
   1200px cae a dos o tres columnas, en mas de una fila. El stretch de grid ya
   iguala las tarjetas DENTRO de una fila, pero no ENTRE filas -a 768px la
   primera fila quedaba en 296.7px de alto y la segunda en 267px-.
   grid-auto-rows:1fr iguala todas las filas a la mas alta, con cualquier
   reparto de columnas. Los dos paneles Desafio/Enfoque ya cerraban parejos
   con el stretch por defecto, sin necesitar este ajuste. */
#caso-validacion .rejilla-4 { grid-auto-rows: 1fr; }

/* El filete superior del kpi-strip iba en oro, reservado al boton del
   formulario y al CTA de cabecera. Pasa a --rule, el neutro que ya usan los
   bordes del resto de la pagina. */
#caso-validacion .kpi-strip__item { border-top-color: var(--rule); }

/* La pagina tiene dos mitades que no son lo mismo -arriba, un caso con datos
   reales anonimizados; abajo, tableros con datos ficticios- y hoy se leian
   como un continuo. #caso-validacion pasa a banda gris, unica banda de la
   pagina: el ritmo queda blanco (hero) / banda (caso) / blanco (acceso), sin
   dos bandas iguales seguidas, y #acceso se queda en blanco porque su panel
   de acceso ya usa --band -ponerle banda a la seccion entera lo dejaria
   invisible contra su propio fondo. El cambio de fondo ya marca el corte
   por si solo, con el ritmo normal de dos secciones seguidas (2x
   --section-y): no hace falta aire de mas. */

/* El pentagono y la maqueta de dispersion, a dos columnas reales: antes
   compartian .rejilla-2 con el pentagono a su tamano declarado (420x380,
   pequeno) y la maqueta a su alto fijo de 360px, sin relacion entre si y con
   medio ancho vacio a la derecha. El pentagono llena su columna -crece con
   ella, sin techo, porque es vectorial y no pierde nitidez- y la maqueta no
   recorta, igual que el bloque de capturas de mas abajo.
   El reparto no es el 2fr/3fr por defecto de bloque-doble: con ese reparto,
   a 1440 el pentagono (proporcion ~1.31:1 tras ajustar su viewBox al
   contenido real) cerraba en 391px contra 506px de la maqueta -900x506,
   ~1.78:1, mas su barra y su etiqueta-, 115px de desnivel. 6fr/7fr para
   pentagono/maqueta deja 11px a 1440 y no pasa de 29 en toda la franja de
   1024 a 1920. */
#ilustracion-nucleo img[src*="red-nucleo-circular"] { width: 100%; height: auto; }
#ilustracion-nucleo .mockup-navegador__imagen-cont { max-height: none; }
#ilustracion-nucleo .mockup-navegador__imagen-cont img {
  height: auto;
  animation: none;
  object-fit: contain;
}
@media (min-width: 1024px) {
  #ilustracion-nucleo { grid-template-columns: minmax(0, 6fr) minmax(0, 7fr); }
}

/* ===== /demostraciones/: capturas y formulario en dos columnas =====
   Las dos capturas se leen como un par apilado, incluidas en el mismo
   marco visual: mismo ancho exterior, mismo borde, mismo radio, mismo
   margen izquierdo/derecho. El desplazamiento de 2rem que llevaba la
   primera -pensado como efecto de cascada- en la practica se leia como
   una caja mas pequena y descuadrada respecto a la de abajo, porque las
   dos imagenes comparten exactamente la misma proporcion (900x506): sin
   ese margen las dos cierran en la misma vertical de forma nativa. */
.capturas-apiladas { display: grid; gap: 1.5rem; }
/* Aqui la maqueta no recorta ni paniza: crece a su relacion de aspecto real
   (900x506) para cerrar la columna a la altura del panel de al lado. El tope
   de 900px es el limite antes de que la imagen se vea borrosa por escalado. */
.capturas-apiladas .mockup-navegador { max-width: 900px; }
.capturas-apiladas .mockup-navegador__imagen-cont { max-height: none; }
.capturas-apiladas .mockup-navegador__imagen-cont img {
  height: auto;
  animation: none;
  object-fit: contain;
}
/* Reparto medido, no el 2fr/3fr por defecto: a mas ancho de columna para las
   capturas el formulario se angosta y crece, asi que el hueco entre columnas
   no baja en linea recta con el ancho de las capturas. Medido en 1440: 2fr/3fr
   (defecto) deja 420px de hueco -mas que los 256 que dejaba el recorte fijo
   que este bloque reemplaza-; a mitades, 315; a 3fr/2fr, 221, ya por debajo
   del recorte; a 5fr/3fr toca su minimo en 205 pero el formulario baja a
   399px justo encima de los 1024px donde .bloque-doble pasa a dos columnas,
   donde ya iba apretado incluso con el reparto por defecto.
   El piso sube de 450 a 700px con el formulario compacto: .formulario--compacto
   reparte sus .campo en dos columnas via auto-fit con minmax(260px,1fr), y
   necesita minimo 2*260+24(gap)=544px de contenido util para que la segunda
   columna aparezca. Con el acolchado de .panel-acceso (2*40px), la columna
   necesita 624px; 700px deja margen. Con ese piso el calculo de arriba ya no
   aplica igual -el propio contenedor (--container:1440px) hace que el piso
   gane siempre en toda la franja de escritorio-, asi que el formulario queda
   fijo en 700px de columna y las capturas se llevan el resto (210px a 1024,
   subiendo hasta ~684px a 1920): mismo criterio del comentario de arriba,
   apretado solo en el borde exacto de 1024px, sano en el resto de la
   franja. */
@media (min-width: 1024px) {
  #acceso .bloque-doble { grid-template-columns: minmax(0, 3fr) minmax(700px, 2fr); }
}

/* El formulario es la conversion de la pagina: sobre un panel en --band para
   distinguirlo de las capturas sin tocar los colores reservados a #irrc y
   #score (franja y fondo teal) ni el oro, que ya lo lleva su boton. */
.panel-acceso {
  background: var(--band);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  padding: clamp(1.5rem, 3vw, 2.5rem);
  /* Es un item de grid (.bloque-doble) sin min-width propio: por defecto
     eso es min-width:auto, que para un item de grid equivale a "al menos
     el min-content de mi contenido". Con .formulario--compacto dentro -un
     grid anidado de dos columnas- ese min-content son 2*260px+gap=544px, y
     por debajo de 1024px (donde .bloque-doble no fija columnas) ese numero
     se filtraba hasta forzar el ancho de toda la fila, desbordando el
     viewport en movil. min-width:0 le devuelve a este item el
     comportamiento normal de bloque: se ajusta al espacio disponible y deja
     que .formulario--compacto reparta sus propias columnas (o se quede en
     una) segun lo que realmente quede. */
  min-width: 0;
}
/* Por debajo de 1024px .bloque-doble apila en una sola columna en el orden
   del DOM. Aqui el orden natural pone las capturas primero, pero el
   formulario es lo que convierte, asi que sube por encima con order. */
@media (max-width: 1023px) {
  .panel-acceso { order: -1; }
}
/* Compactacion de #acceso (iteracion 2): la seccion se sentia demasiado
   alta porque las capturas no tenian techo real -crecian hasta 900px de
   ancho si la columna lo permitia, 506px de alto cada una- y el panel del
   formulario llevaba el acolchado y los margenes de una tarjeta de
   contenido normal. Todo scoped a #acceso: no toca .bloque-doble,
   .mockup-navegador ni .panel-acceso en ningun otro sitio del sistema. */
#acceso .bloque-doble { margin-top: 1.75rem; }
#acceso .capturas-apiladas { gap: 1rem; }
#acceso .capturas-apiladas .mockup-navegador { max-width: 640px; }
#acceso .panel-acceso { padding: clamp(1.25rem, 2.5vw, 1.75rem); }
#acceso .panel-acceso h2 { font-size: 1.4rem; margin: 0 0 0.6rem; }
#acceso .panel-acceso > .medida-640 > p { margin-bottom: 1rem; }

/* ===== Plantilla de articulo de blog (indice, carril, graficos) =====
   Clases genericas para el cuerpo de un articulo largo: cabecera de franja,
   cuerpo a tres columnas, indice lateral con capitulo activo, dos paneles de
   grafico y barra de progreso. Todo prefijado .articulo-plantilla / .articulo-
   cabecera / .articulo-indice / .articulo-cuerpo / .articulo-carril / .grafico-
   panel para no tocar ni una regla de .articulo, que siguen usando los otros
   cinco articulos hasta que migren a esta plantilla. */

/* ----- Barra de progreso de lectura -----
   3px fijos en el borde superior, por ENCIMA de la cabecera pegajosa
   (z-index 500): se pinta sobre ella, no debajo. El relleno se mueve por
   main.js escribiendo su ancho en cada scroll; la transicion solo suaviza
   ese cambio y desaparece con prefers-reduced-motion por la regla global del
   bloque 2 (transition-duration: 0.001ms !important). */
.barra-progreso {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: 3px;
  z-index: 600;
  pointer-events: none;
}
.barra-progreso__relleno {
  display: block;
  height: 100%;
  width: 0%;
  background: var(--teal);
  transition: width 0.12s linear;
}

/* ----- Cabecera de franja -----
   .seccion--slate ya resuelve el fondo, el blanco de los titulares, el teal
   claro de enlaces/eyebrow y el foco accesible sobre banda oscura: se
   reutiliza en vez de repetirla. Lo unico que le faltaba para este uso es el
   enlace DENTRO de las migas: `.migas a` fija var(--grey), que sobre --slate
   da 2.23:1 e invisible por debajo del 4.5:1 de AA. Se corrige aqui porque es
   un hueco real de la regla existente, no solo de esta pagina. */
.seccion--slate .migas a { color: #B9C3CF; }

.articulo-cabecera { width: 100%; padding: clamp(2.5rem, 4vw, 3.75rem) 0 clamp(2.25rem, 3.5vw, 3rem); }
.articulo-cabecera .migas { margin-bottom: 1.5rem; }
.articulo-cabecera h1 { max-width: 880px; }
.articulo-cabecera__entrada {
  max-width: 700px;
  margin: 0 0 1.5rem;
  font-size: clamp(1.1rem, 1rem + 0.5vw, 1.3rem);
  line-height: 1.6;
}
/* Contenedor flex: el texto (fecha/autor/tiempo) y el boton de compartir en
   la misma linea, envolviendo juntos si no caben. El color y la tipografia
   de datos viven aqui, no en el parrafo de texto: asi los hereda tambien el
   icono del boton via currentColor, sin declararlos dos veces. */
.articulo-cabecera__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.35rem 0.75rem;
  max-width: 700px;
  margin: 0;
  font-family: var(--font-mono);
  font-size: 0.85rem;
  color: #B9C3CF;
}
.articulo-cabecera__meta-texto { margin: 0; }

/* ----- Cuerpo a tres columnas -----
   Indice (240px) / articulo (hasta 760px, la misma medida de lectura que ya
   usa .articulo) / carril (el resto, con un piso de 260px). Solo el articulo
   y el carril son flexibles (minmax con maximo fijo o 1fr): el indice es un
   ancho fijo porque no tiene que absorber ningun sobrante. Asi el carril
   siempre se come el espacio libre y no puede quedar una franja muerta a la
   derecha, que era el sintoma original.
   El modificador --con-indice lo pone main.js SOLO cuando encuentra 4 o mas
   encabezados con data-indice: sin el, el indice (con el atributo hidden ya
   puesto en el HTML) no reserva columna y el articulo ocupa lo que sobra. Si
   JavaScript no llega a correr, el HTML ya nace en el estado "sin indice": no
   hay una columna vacia esperando un contenido que nunca aparecio. */
.articulo-plantilla__grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  row-gap: 2rem;
  align-items: start;
}
.articulo-plantilla__grid > * { min-width: 0; }
.articulo-carril { display: none; }

@media (min-width: 820px) {
  .articulo-plantilla__grid { column-gap: 3rem; }
  .articulo-plantilla__grid--con-indice { grid-template-columns: 240px minmax(0, 1fr); }
}
@media (min-width: 1120px) {
  .articulo-plantilla__grid { grid-template-columns: minmax(0, 760px) minmax(260px, 1fr); }
  .articulo-plantilla__grid--con-indice { grid-template-columns: 240px minmax(0, 760px) minmax(260px, 1fr); }
  .articulo-carril { display: block; }
}

/* ----- Indice lateral -----
   Nace oculto (atributo hidden en el HTML) y main.js lo destapa solo si hay
   4 o mas h2 con data-indice en .articulo-cuerpo. Capitulo activo con filete
   izquierdo en teal, texto en --ink y peso alto; inactivos en --grey, igual
   que la numeracion, que nunca cambia de tono. */
.articulo-indice { position: static; }
.articulo-indice__rotulo {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--grey);
  margin: 0 0 1rem;
}
.articulo-indice__boton { display: none; }
.articulo-indice__lista { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.articulo-indice__enlace {
  display: flex;
  align-items: baseline;
  gap: 0.65rem;
  padding: 0.5rem 0 0.5rem 0.85rem;
  border-left: 2px solid transparent;
  text-decoration: none;
  color: var(--grey);
  font-size: 0.88rem;
  line-height: 1.35;
  transition: color 0.15s ease, border-color 0.15s ease;
}
.articulo-indice__numero {
  flex: none;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  color: var(--grey);
}
.articulo-indice__enlace:hover { color: var(--slate); }
.articulo-indice__enlace[aria-current="true"] {
  color: var(--ink);
  font-weight: 700;
  border-left-color: var(--teal);
}
@media (prefers-reduced-motion: reduce) { .articulo-indice__enlace { transition: none; } }

@media (min-width: 820px) {
  .articulo-indice {
    position: sticky;
    top: calc(var(--header-h) + 2rem);
    align-self: start;
    max-height: calc(100vh - var(--header-h) - 3rem);
    overflow-y: auto;
  }
}
/* Por debajo de 820px el indice deja de ser columna (el grid ya vuelve a una
   sola) y pasa a un boton desplegable sobre el articulo: rotulo y lista nacen
   cerrados y main.js alterna .articulo-indice--abierta al pulsar. */
@media (max-width: 819px) {
  .articulo-indice__boton {
    display: block;
    width: 100%;
    margin-bottom: 1.5rem;
    padding: 0.85rem 1.1rem;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: var(--radius-sm);
    font-family: var(--font-text);
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--slate);
    text-align: left;
    cursor: pointer;
  }
  .articulo-indice__rotulo,
  .articulo-indice__lista { display: none; }
  .articulo-indice--abierta .articulo-indice__rotulo,
  .articulo-indice--abierta .articulo-indice__lista { display: block; }
  .articulo-indice--abierta .articulo-indice__lista {
    margin-top: 0.5rem;
    padding: 1rem;
    max-height: 60vh;
    overflow-y: auto;
    background: var(--paper);
    border: 1px solid var(--rule);
    border-radius: var(--radius-md);
  }
}

/* ----- Sistema editorial del cuerpo -----
   Todo prefijado .articulo-cuerpo para que no alcance a los otros articulos,
   que siguen con .articulo. */
.articulo-cuerpo { font-size: 1.05rem; line-height: 1.75; }
.articulo-cuerpo h2 {
  margin: 3.5rem 0 1.25rem;
  font-size: clamp(1.9rem, 1.3rem + 2.2vw, 2.75rem);
  scroll-margin-top: calc(var(--header-h) + 1.5rem);
}
.articulo-cuerpo > h2:first-child { margin-top: 0; }
.articulo-cuerpo h3 {
  margin: 2.25rem 0 0.85rem;
  font-size: clamp(1.3rem, 1.05rem + 0.75vw, 1.6rem);
  scroll-margin-top: calc(var(--header-h) + 1.5rem);
}
.articulo-cuerpo p { margin: 0 0 1.35rem; }
.articulo-cuerpo ul, .articulo-cuerpo ol { margin: 0 0 1.35rem; padding-left: 1.35rem; }
.articulo-cuerpo li + li { margin-top: 0.55rem; }
.articulo-cuerpo a { color: var(--teal); text-decoration-thickness: 1.5px; text-underline-offset: 3px; }
.articulo-cuerpo a:hover { color: var(--slate); }

/* Parrafo de entrada: solo el primero del cuerpo (el que sigue a la
   cabecera), en tamano mayor. Reutilizable en los otros cinco articulos. */
.parrafo-entrada {
  font-size: clamp(1.15rem, 1.05rem + 0.5vw, 1.35rem);
  line-height: 1.6;
  color: var(--slate);
}
/* Letra capital: SOLO sobre el primer parrafo del articulo (misma clase que
   .parrafo-entrada aqui, pero son dos clases independientes a proposito: un
   articulo futuro podria querer una sin la otra). A tres lineas de alto sobre
   el cuerpo de 1.05rem/1.75 de interlineado del articulo. */
.letra-capital::first-letter {
  float: left;
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--teal);
  font-size: 4.2em;
  line-height: 0.82;
  padding-right: 0.1em;
  margin-top: 0.05em;
}

.articulo-cuerpo blockquote {
  margin: 2rem 0;
  padding: 1.25rem 1.5rem;
  border-left: 4px solid var(--teal);
  background: rgba(15, 110, 110, 0.07);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.articulo-cuerpo blockquote p {
  margin: 0;
  color: var(--slate);
  font-size: 1.15rem;
  font-weight: 700;
  line-height: 1.5;
}

/* Tabla en separate (no el collapse global de la base): con collapse el
   border-radius del marco no se pinta en varios navegadores. */
.articulo-cuerpo table {
  margin: 2rem 0;
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  border-collapse: separate;
  border-spacing: 0;
  overflow: hidden;
  font-size: 0.95rem;
}
.articulo-cuerpo th, .articulo-cuerpo td {
  padding: 0.85rem 1.1rem;
  text-align: left;
  border-bottom: 1px solid var(--rule);
}
.articulo-cuerpo thead th {
  background: var(--band);
  color: var(--slate);
  font-weight: 700;
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.articulo-cuerpo tbody tr:last-child td { border-bottom: 0; }
@media (max-width: 559px) {
  .articulo-cuerpo table { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; }
}

/* ----- Cierre a ancho completo (Recursos relacionados / Fuente normativa) ----- */
.articulo-cierre h2 { margin-top: 3rem; scroll-margin-top: calc(var(--header-h) + 1.5rem); }
.articulo-cierre h2:first-child { margin-top: 0; }
.articulo-cierre ul { margin: 1rem 0 0; }
/* Citas a fuentes externas como URL visible (sin acortar): una URL larga es
   una sola "palabra" sin puntos de corte naturales y desborda el ancho en
   movil si no se le permite partirse. */
.articulo-cierre a, .articulo-cuerpo a { overflow-wrap: break-word; }

/* ----- Carril derecho ----- */
.articulo-carril { align-self: start; }
.articulo-carril__tarjeta {
  position: sticky;
  top: calc(var(--header-h) + 2rem);
  background: var(--slate);
  color: #E7ECF2;
  border-radius: var(--radius-md);
  padding: 1.75rem;
  box-shadow: var(--shadow-md);
}
.articulo-carril__tarjeta .eyebrow { color: #7FD4CE; }
.articulo-carril__tarjeta h3 { color: #FFFFFF; font-size: 1.35rem; margin: 0 0 0.85rem; }
.articulo-carril__tarjeta p { color: #C9D8DC; font-size: 0.95rem; line-height: 1.6; margin: 0 0 1.5rem; }

/* ----- Paneles de grafico -----
   Mismo trazo que las ilustraciones de /nexorisk/ (.red-etapa__*, .red-
   personas__*): lineas finas, nodos con relleno solido para participantes y
   contorno para operaciones. Ningun color nuevo: los tonos "sobre banda
   oscura" (#E7ECF2, #FFFFFF, #7FD4CE, #B9C3CF, #C7D0DA) son los mismos que ya
   usan .seccion--slate, .cifra__rotulo y .red-personas__figura en el resto
   del sitio, no una paleta inventada para esto. */
.grafico-panel {
  display: grid;
  gap: 1.75rem;
  grid-template-columns: minmax(0, 1fr);
  align-items: center;
  margin: 2.5rem 0;
  padding: clamp(1.5rem, 3vw, 2.25rem);
  background: var(--slate);
  color: #E7ECF2;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
}
@media (min-width: 700px) {
  .grafico-panel { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: 2rem; }
}
/* Variante vertical: el panel oscuro admite UNA sola figura junto a la
   copia (ver criterio en el README, seccion del sistema visual). Cuando
   el concepto necesita dos o mas figuras comparadas, la copia pasa a
   ancho completo arriba y las figuras se reparten debajo en columnas;
   la especificidad del selector compuesto le gana a la regla de arriba
   sin depender del orden en la hoja. */
.grafico-panel.grafico-panel--vertical { grid-template-columns: minmax(0, 1fr); }
.grafico-panel--vertical .grafico-panel__copia { max-width: 42rem; }
.grafico-panel__figuras {
  display: grid;
  gap: 1.75rem;
  grid-template-columns: minmax(0, 1fr);
  margin-top: 0.5rem;
}
@media (min-width: 700px) {
  .grafico-panel__figuras--dos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .grafico-panel__figuras--tres { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* min-width:0 defensivo: mismo riesgo de fondo que .tratamientos-fila__bloque,
   aunque hoy los rotulos de figura no tienen una palabra tan larga. */
.grafico-panel__figura { min-width: 0; text-align: center; }
.grafico-panel__figura svg { display: block; width: 100%; height: auto; margin: 0 auto; }
.grafico-panel__figura-rotulo { margin: 0.85rem 0 0; font-family: var(--font-mono); font-size: 0.82rem; color: #B9C3CF; }
.grafico-panel--vertical .grafico-panel__leyenda { justify-content: center; margin-top: 1.75rem; }
.grafico-panel .eyebrow { color: #7FD4CE; }
.grafico-panel__titular { margin: 0 0 0.75rem; color: #FFFFFF; font-size: clamp(1.3rem, 1.1rem + 0.9vw, 1.7rem); }
.grafico-panel__parrafo { margin: 0 0 1.25rem; color: #C9D8DC; font-size: 0.98rem; line-height: 1.6; }
.grafico-panel__leyenda { display: flex; flex-wrap: wrap; gap: 0.5rem 1.15rem; margin: 0; padding: 0; list-style: none; font-size: 0.82rem; color: #B9C3CF; }
.grafico-panel__leyenda li { display: inline-flex; align-items: center; gap: 0.45rem; }
.grafico-panel__marca { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.grafico-panel__marca--participante { background: var(--teal); }
.grafico-panel__marca--operacion { background: transparent; border: 1.5px solid var(--teal); }
.grafico-panel__marca--linea { width: 16px; height: 0; border-top: 2px solid #C7D0DA; border-radius: 0; }
.grafico-panel__marca--flecha { width: 16px; height: 0; border-top: 2px solid #7FD4CE; border-radius: 0; }
/* Tres formas para distinguir grupos sin anadir color: circulo, cuadrado
   redondeado y rombo, el mismo trazo tenue de .grafico-panel__marca--linea. */
.grafico-panel__marca--circulo { background: transparent; border: 1.5px solid #C7D0DA; border-radius: 50%; }
.grafico-panel__marca--cuadrado { background: transparent; border: 1.5px solid #C7D0DA; border-radius: 3px; }
.grafico-panel__marca--rombo { background: transparent; border: 1.5px solid #C7D0DA; border-radius: 2px; transform: rotate(45deg); }
.grafico-panel__marca--tenue { width: 16px; height: 0; border-top: 1.5px dashed #C7D0DA; border-radius: 0; opacity: 0.7; }
.grafico-panel__escenario svg { display: block; width: 100%; height: auto; }
.grafico-panel__aristas line, .grafico-panel__aristas path { fill: none; stroke: #C7D0DA; stroke-opacity: 0.4; stroke-width: 1.6; }
.grafico-panel__aristas--flecha line, .grafico-panel__aristas--flecha path { fill: none; stroke: #7FD4CE; stroke-opacity: 0.6; stroke-width: 1.8; }
.grafico-panel__punta { fill: #7FD4CE; }
.grafico-panel__nodo circle { stroke: rgba(255, 255, 255, 0.22); stroke-width: 1.5; }
.grafico-panel__nodo--participante circle { fill: var(--teal); }
.grafico-panel__nodo--operacion circle { fill: var(--slate); stroke: var(--teal); stroke-width: 2; }
.grafico-panel__nodo text { fill: #FFFFFF; font-family: var(--font-text); font-weight: 700; }
.grafico-panel__nodo--participante text { font-size: 17px; }
.grafico-panel__nodo--operacion text { font-size: 13px; }

/* ----- Boton de compartir de la cabecera del articulo -----
   El icono va INLINE (no <img>, a diferencia de los 24 iconos ilustrativos
   de assets/img/): es un control interactivo, asi que necesita heredar color
   por currentColor, igual que .cabecera__hamburguesa. El archivo
   icono-compartir.svg guarda la misma version para referencia y para un
   futuro uso como ilustracion, pero el boton usa su propia copia inline.
   El menu SIEMPRE se posiciona por JS (position: fixed + left/top en linea):
   la linea de metadatos cambia de largo segun el articulo (fecha, autor,
   tiempo de lectura), asi que el boton no cae en el mismo sitio en cada
   pagina y un anclaje solo-CSS (right:0 respecto al boton) se saldria de la
   ventana en anchos estrechos. */
.articulo-compartir { position: relative; display: inline-flex; }
.articulo-compartir__boton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  background: none;
  border: 0;
  border-radius: var(--radius-sm);
  color: inherit;
  cursor: pointer;
}
.articulo-compartir__boton svg { width: 20px; height: 20px; }
.articulo-compartir__boton:hover { background: rgba(255, 255, 255, 0.12); }

.articulo-compartir__menu {
  position: fixed;
  z-index: 700;
  width: 220px;
  max-width: calc(100vw - 1.5rem);
  padding: 0.4rem;
  background: var(--paper);
  color: var(--ink);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity 0.15s ease, transform 0.15s ease;
}
.articulo-compartir__menu[hidden] { display: none; }
.articulo-compartir__menu--visible { opacity: 1; transform: translateY(0); }
.articulo-compartir__opcion {
  display: block;
  width: 100%;
  padding: 0.65rem 0.75rem;
  background: none;
  border: 0;
  border-radius: var(--radius-sm);
  color: var(--ink);
  font-family: var(--font-text);
  font-size: 0.92rem;
  font-weight: 500;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}
.articulo-compartir__opcion:hover { background: var(--band); }
/* El menu vive sobre --paper (claro) aunque cuelgue de la cabecera --slate:
   sin este override, .seccion--slate :focus-visible le pondria el teal claro
   pensado para fondo oscuro, que sobre --paper da 1.72:1, muy por debajo del
   3:1 minimo para el foco de un control (WCAG 1.4.11). Tres clases de
   especificidad, para no depender de cual de las dos reglas va despues en la
   hoja. */
.articulo-compartir__menu .articulo-compartir__opcion:focus-visible { outline-color: var(--teal); }

/* ===== Indice de /recursos/ (articulo destacado, filtro por tema, lista) =====
   Sustituye la rejilla de tarjetas (.lista-articulos), que se deja tal cual
   en el CSS por si algo la referencia todavia: esta pagina es su unico uso,
   pero no se borra codigo muerto por norma de este proyecto. Todo lo nuevo
   va con nombres propios para no tocarla. */

/* ----- Articulo destacado ----- */
.articulo-destacado-seccion { margin-bottom: clamp(2.5rem, 4vw, 3.5rem); }
.articulo-destacado {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  margin-top: 1rem;
  text-decoration: none;
  color: inherit;
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: box-shadow 0.15s ease, transform 0.15s ease;
}
.articulo-destacado:hover, .articulo-destacado:focus-visible {
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
}
@media (min-width: 700px) {
  .articulo-destacado { grid-template-columns: minmax(0, 1.1fr) minmax(0, 1.4fr); }
}
.articulo-destacado__portada { display: block; aspect-ratio: 16 / 10; background: var(--soft); }
/* Por encima de 700px, .articulo-destacado pasa a dos columnas lado a lado
   (regla de arriba) y aqui se le quita el aspect-ratio a la portada: sin el,
   deja de imponer su propia altura y se limita a estirarse (align-items:
   stretch, el valor por defecto de grid) hasta la que ya determina el
   contenido de texto -mas corto-, en vez de al reves. Antes, un aspect-ratio
   de 16:10 sobre una columna ancha forzaba una portada de ~360px a 1440px de
   ancho, la fila entera se estiraba a esa altura y el texto, mucho mas
   corto, dejaba un hueco muerto entre la descripcion y la fecha de hasta
   ~140px. Por debajo de 700px la portada y el contenido quedan apilados, no
   lado a lado, y ahi si hace falta el aspect-ratio, porque sin el la
   portada no tiene ninguna altura propia: por eso esta regla va DESPUES de
   la declaracion base y no dentro de su media query, para ganarle en orden
   de cascada a igual especificidad. */
@media (min-width: 700px) {
  .articulo-destacado__portada { aspect-ratio: auto; }
}
.articulo-destacado__portada svg { display: block; width: 100%; height: 100%; }
.articulo-destacado__contenido {
  display: flex;
  flex-direction: column;
  padding: 1.75rem clamp(1.25rem, 2vw, 2.25rem);
}
.articulo-destacado__titulo {
  display: block;
  margin: 0.5rem 0 0.75rem;
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--slate);
  font-size: clamp(1.4rem, 1.1rem + 1.2vw, 2rem);
  line-height: 1.2;
  transition: color 0.15s ease;
}
.articulo-destacado__descripcion { display: block; margin: 0 0 1rem; color: var(--grey); font-size: 1.02rem; line-height: 1.6; }
.articulo-destacado__meta { display: block; margin-top: auto; font-family: var(--font-mono); font-size: 0.85rem; color: var(--grey); }
.articulo-destacado:hover .articulo-destacado__titulo,
.articulo-destacado:focus-visible .articulo-destacado__titulo { color: var(--teal); }

/* ----- Filtro por tema -----
   Boton activo: fondo teal muy tenue + filete teal. El fondo tenue de un
   boton de filtro no es el mismo elemento que el "fondo teal de cabecera"
   reservado a #irrc/#score: aqui es una alternancia de estado sobre un
   control, no una franja de identidad de seccion. */
.filtro-articulos {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  margin: 0 0 2rem;
  padding: 0;
  list-style: none;
}
.filtro-articulos__boton {
  padding: 0.5rem 1.1rem;
  border: 1.5px solid var(--rule);
  border-radius: 999px;
  background: var(--paper);
  color: var(--slate);
  font-family: var(--font-text);
  font-size: 0.9rem;
  font-weight: 600;
  cursor: pointer;
  transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.filtro-articulos__boton:hover { border-color: var(--teal); }
.filtro-articulos__boton[aria-pressed="true"] {
  background: rgba(15, 110, 110, 0.1);
  border-color: var(--teal);
  color: var(--teal);
}
@media (prefers-reduced-motion: reduce) { .filtro-articulos__boton { transition: none; } }

/* ----- Lista de los demas articulos -----
   Fila = enlace completo, en grid de dos columnas desde 700px (texto / portada
   pequena). Por debajo de 700px la portada sube arriba: la fila pasa a una
   columna y "order" reordena visualmente sin cambiar el DOM (el texto sigue
   yendo primero para lectores de pantalla y buscadores). */
.lista-filas-articulos { list-style: none; margin: 0; padding: 0; }
.lista-filas-articulos li + li { border-top: 1px solid var(--rule); }
.fila-articulo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1rem;
  padding: 1.75rem 0;
  text-decoration: none;
  color: inherit;
}
@media (min-width: 700px) {
  .fila-articulo { grid-template-columns: minmax(0, 1fr) 220px; align-items: center; gap: 2rem; }
}
/* min-width:0 defensivo en los dos hijos directos (portada y el span de
   texto, que no tiene clase propia): el titulo del articulo es la unica
   pieza con riesgo real de palabra larga en esta rejilla. */
.fila-articulo > * { min-width: 0; }
.fila-articulo__portada {
  display: block;
  order: -1;
  aspect-ratio: 16 / 10;
  background: var(--soft);
  border: 1px solid var(--rule);
  border-radius: var(--radius-sm);
  overflow: hidden;
}
@media (min-width: 700px) { .fila-articulo__portada { order: 2; } }
.fila-articulo__portada svg { display: block; width: 100%; height: 100%; }
.fila-articulo__titulo {
  display: block;
  margin: 0.4rem 0 0.5rem;
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--slate);
  font-size: 1.2rem;
  line-height: 1.3;
  transition: color 0.15s ease;
}
.fila-articulo__descripcion { display: block; margin: 0 0 0.6rem; color: var(--grey); font-size: 0.98rem; line-height: 1.55; }
.fila-articulo__meta { display: block; font-family: var(--font-mono); font-size: 0.82rem; color: var(--grey); }
.fila-articulo:hover .fila-articulo__titulo,
.fila-articulo:focus-visible .fila-articulo__titulo { color: var(--teal); }
@media (prefers-reduced-motion: reduce) {
  .articulo-destacado, .articulo-destacado__titulo, .fila-articulo__titulo { transition: none; }
}

.filtro-articulos__vacio {
  padding: 2.5rem 0;
  margin: 0;
  color: var(--grey);
  font-style: italic;
  text-align: center;
}

/* ===== Graficos del articulo "garantias cruzadas" =====
   Dos familias:
   1) sobre banda oscura: .grafico-panel de siempre, mas dos extras que le
      faltaban -una etiqueta de texto para las figuras con rotulo propio
      dentro del SVG, y una arista tenue y discontinua para relaciones que
      existen pero no son visibles desde una sola cartera-.
   2) sobre el fondo del articulo (sin panel): familia nueva
      .diagrama-articulo, con el mismo lenguaje (participante en --teal
      solido, operacion con contorno --teal) pero con las lineas en --rule
      en vez del tono claro pensado para fondo oscuro, que aqui no
      contrastaria. */
.grafico-panel__etiqueta {
  fill: #B9C3CF;
  font-family: var(--font-mono);
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.grafico-panel__aristas--tenue line {
  stroke: #C7D0DA;
  stroke-opacity: 0.28;
  stroke-width: 1.3;
  stroke-dasharray: 3 3;
}

.diagrama-articulo { margin: 2.5rem 0; }
.diagrama-articulo--comparativo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 2rem;
}
@media (min-width: 560px) {
  .diagrama-articulo--comparativo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* min-width:0 defensivo: mismo riesgo de fondo que .tratamientos-fila__bloque
   en el tramo de dos o tres columnas de arriba. */
.diagrama-articulo__figura { min-width: 0; text-align: center; }
.diagrama-articulo__figura svg { display: block; width: 100%; height: auto; }
.diagrama-articulo__rotulo {
  margin-top: 0.85rem;
  font-family: var(--font-mono);
  font-size: 0.85rem;
  color: var(--slate);
}
.diagrama-articulo__leyenda {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.5rem 1.15rem;
  margin: 1.5rem 0 0;
  padding: 0;
  list-style: none;
  font-size: 0.82rem;
  color: var(--grey);
}
.diagrama-articulo__leyenda li { display: inline-flex; align-items: center; gap: 0.45rem; }
.diagrama-articulo__marca { width: 9px; height: 9px; border-radius: 50%; flex: none; }
.diagrama-articulo__marca--participante { background: var(--teal); }
.diagrama-articulo__marca--operacion { background: transparent; border: 1.5px solid var(--teal); }
.diagrama-articulo__marca--linea { width: 16px; height: 0; border-top: 2px solid var(--rule); border-radius: 0; }
.diagrama-articulo__marca--flecha { width: 16px; height: 0; border-top: 2px solid var(--teal); border-radius: 0; }

.diagrama-articulo__nodo circle { stroke: rgba(31, 51, 80, 0.14); stroke-width: 1.5; }
.diagrama-articulo__nodo--participante circle { fill: var(--teal); }
.diagrama-articulo__nodo--operacion circle { fill: var(--paper); stroke: var(--teal); stroke-width: 2; }
/* Nodo "de matiz" (riesgo-relacional-de-credito, dimensiones del IRRC): sin
   relleno y trazo mas tenue que --operacion, para un tercer nivel de enfasis
   que no es ni solido ni "hueco pero nitido". Decorativo, sin texto propio
   dentro, por eso la opacidad es valida (ver nota de opacity en el README). */
.diagrama-articulo__nodo--matiz circle { fill: none; stroke: var(--teal); stroke-width: 1.5; opacity: 0.55; }
.diagrama-articulo__nodo text { fill: #FFFFFF; font-family: var(--font-text); font-weight: 700; }
.diagrama-articulo__nodo--operacion text { fill: var(--teal); }
.diagrama-articulo__arista { stroke: var(--rule); stroke-width: 1.6; }
.diagrama-articulo__arista--tenue { stroke: var(--rule); stroke-width: 1.4; stroke-dasharray: 3 3; opacity: 0.7; }
.diagrama-articulo__punta { fill: var(--teal); }
.diagrama-articulo__punta--tenue { fill: var(--rule); }

/* .secuencia (/nosotros/) reutilizada tal cual dentro de un articulo: el
   rotulo de cada paso usa h3 aqui en vez de h4 -el h4 del componente
   original habria saltado de nivel, de h2 directo a h4, porque el primer
   parrafo del capitulo no trae ningun h3 antes-. Acotado a .articulo-cuerpo
   para no tocar el h4 real de /nosotros/. */
.articulo-cuerpo .secuencia__paso h3 {
  margin: 0.25rem 0 0;
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--slate);
}
/* Siete pasos: el componente original (/nosotros/) solo preveia hasta seis
   en una fila (repeat(6,...) a 1280px) y sus cortes intermedios (2 columnas
   desde 600px, 3 desde 900px) dejan un septimo paso solo en la ultima fila
   con siete elementos. Este modificador, acotado a este articulo, redefine
   los cortes para que ninguna fila quede con un unico elemento -4 columnas
   reparten 7 en 4+3-.

   El corte a una sola fila se probo primero en 1120px -el corte que usa el
   resto de la plantilla del articulo para pasar a tres columnas-, pero ahi
   la columna de contenido real mide solo ~420px (el minmax(0,760px) de
   .articulo-plantilla__grid esta lejos de su tope: crece con el viewport y
   recien se acerca a 760px bastante mas arriba). Con siete columnas en
   ~420px los rotulos largos se pisaban entre si incluso reducidos al minimo
   razonable. Se comprobo visualmente que a 1280px -que ya es el corte que
   el propio componente usaba para su caso de seis- la columna alcanza el
   ancho que hace falta para que los siete quepan sin pisarse. */
/* Palabras sueltas largas ("reciprocidad") no tienen donde partir dentro de
   una columna angosta y por defecto se salen de su celda en vez de ajustarse
   a ella. Vale para cualquier ancho, no solo el tramo de 4 columnas: es la
   red de seguridad, no la solucion principal. */
.articulo-cuerpo .secuencia--siete .secuencia__paso h3 { overflow-wrap: break-word; }
@media (min-width: 600px) {
  .articulo-cuerpo .secuencia--siete { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 600px) and (max-width: 1279px) {
  /* Las reglas base ocultan el filete en cada nth-child(2n)/nth-child(3n)
     porque asumen 2 o 3 columnas. Con 4 columnas el unico "ultimo de fila"
     intermedio es el elemento 4 (el 7, ultimo de todos, ya lo oculta la
     regla base :last-child). */
  .articulo-cuerpo .secuencia--siete .secuencia__paso::after { display: block; }
  .articulo-cuerpo .secuencia--siete .secuencia__paso:nth-child(4)::after,
  .articulo-cuerpo .secuencia--siete .secuencia__paso:last-child::after { display: none; }
  /* Con la columna de contenido todavia angosta en este tramo, el icono y
     el rotulo por defecto (heredados del componente de seis de /nosotros/)
     quedan grandes para 4 columnas. Se bajan un escalon -menos que el
     ajuste de la fila unica en 1280px- para dar mas margen antes de que
     entre en juego el overflow-wrap de arriba. */
  .articulo-cuerpo .secuencia--siete { --sec-ico: 52px; }
  .articulo-cuerpo .secuencia--siete .secuencia__paso h3 { font-size: 0.92rem; }
  .articulo-cuerpo .secuencia--siete .secuencia__icono img { width: 26px; height: 26px; }
}
@media (min-width: 1280px) {
  .articulo-cuerpo .secuencia--siete {
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 0.85rem;
    --sec-ico: 44px;
    --sec-n: 16px;
  }
  .articulo-cuerpo .secuencia--siete .secuencia__n { font-size: 1.3rem; }
  .articulo-cuerpo .secuencia--siete .secuencia__icono img { width: 22px; height: 22px; }
  .articulo-cuerpo .secuencia--siete .secuencia__paso h3 { font-size: 0.78rem; line-height: 1.3; }
}

/* ===== Graficos del articulo "morosidad" =====
   Mismo lenguaje que los dos articulos anteriores (.grafico-panel para
   panel oscuro, .diagrama-articulo para figuras sobre el fondo del
   articulo), con una diferencia deliberada: aqui SI se admite --crimson,
   acotado a las tres figuras que representan deterioro ya materializado.
   Es la excepcion que ya documenta el README ("Carmesi: la regla y su
   unica excepcion"), aplicada aqui por primera vez a una ilustracion. */

/* "Cinco perimetros": circulos que se solapan sin jerarquia -el texto
   del articulo no permite deducir una relacion de contencion exacta
   entre los cinco conceptos, y forzar un anidado preciso habria sido
   inventar una relacion que el articulo mismo advierte que no debe
   asumirse-. Cada circulo lleva una sigla; el nombre completo va en la
   leyenda, para no amontonar cinco rotulos largos sobre las figuras
   que se cruzan. */
.grafico-panel__perimetro { fill: none; stroke: #7FD4CE; stroke-width: 1.6; }
.grafico-panel__perimetro-texto { fill: #FFFFFF; font-family: var(--font-text); font-weight: 700; font-size: 15px; text-anchor: middle; }

/* Nodo en mora: mismo patron solido que --participante (disco macizo,
   texto blanco), en carmesi en vez de teal. El aro blanco marcado no es
   decorativo: teal y carmesi tienen una luminosidad parecida, y en
   escala de grises un disco carmesi y uno teal del mismo tamano se leen
   casi iguales. El aro es la diferencia que sobrevive sin color -el
   mismo principio que ya distingue hueco de macizo en el articulo
   anterior, aplicado aqui como forma en vez de relleno-. */
.grafico-panel__nodo--mora circle { fill: var(--crimson); stroke: #FFFFFF; stroke-opacity: 0.9; stroke-width: 2.5; }
.diagrama-articulo__nodo--mora circle { fill: var(--crimson); stroke: #FFFFFF; stroke-opacity: 0.9; stroke-width: 2.5; }
.diagrama-articulo__nodo--mora text { fill: #FFFFFF; }
.grafico-panel__marca--mora { background: var(--crimson); border: 1.5px solid #FFFFFF; }
.diagrama-articulo__marca--mora { background: var(--crimson); border: 1.5px solid rgba(31, 51, 80, 0.4); }
.diagrama-articulo__marca--mejora { background: var(--teal); }
.diagrama-articulo__marca--empeora { background: var(--crimson); }
.diagrama-articulo__marca--se-mantiene { background: var(--grey); opacity: 0.55; }
.diagrama-articulo__marca--cosecha-1 { width: 16px; height: 0; border-top: 2px solid var(--teal); border-radius: 0; background: none; }
.diagrama-articulo__marca--cosecha-2 { width: 16px; height: 0; border-top: 2px dashed var(--teal); border-radius: 0; background: none; }
.diagrama-articulo__marca--cosecha-3 { width: 16px; height: 0; border-top: 2px solid var(--crimson); border-radius: 0; background: none; }

/* Barras por tramo de atraso (ilustracion "misma tasa, distinta
   antiguedad"): tramos cortos en teal, tramos largos en carmesi con
   intensidad creciente -las cuatro variantes derivan del mismo token
   via opacidad, no son colores nuevos-. La opacidad minima (larga-1)
   esta calculada para que el carmesi mas tenue siga dando al menos
   3:1 de contraste contra el blanco del articulo (objeto grafico,
   WCAG 1.4.11); por debajo de ~0.55 no lo alcanza. */
.diagrama-articulo__barra { stroke: none; }
.diagrama-articulo__barra--corta { fill: var(--teal); }
.diagrama-articulo__barra--larga-1 { fill: var(--crimson); opacity: 0.6; }
.diagrama-articulo__barra--larga-2 { fill: var(--crimson); opacity: 0.75; }
.diagrama-articulo__barra--larga-3 { fill: var(--crimson); opacity: 0.9; }
.diagrama-articulo__barra--larga-4 { fill: var(--crimson); opacity: 1; }
.diagrama-articulo__eje { stroke: var(--rule); stroke-width: 1.4; }
.diagrama-articulo__eje--tenue { stroke: var(--rule); stroke-width: 1; stroke-dasharray: 3 3; opacity: 0.7; }
.diagrama-articulo__etiqueta-eje { fill: var(--grey); font-family: var(--font-mono); font-size: 10px; text-anchor: middle; }

/* Matriz de transicion: la diagonal se mantiene (gris), por encima
   mejora (teal), por debajo empeora (carmesi); la intensidad crece con
   la distancia a la diagonal, derivada del mismo token via opacidad.
   Los tres escalones de cada color se eligieron para que, con el
   texto oscuro o claro segun corresponda, el numero dentro de la
   celda siempre llegue a 4.5:1 -hay un tramo intermedio de opacidad
   (~0.55 a 0.7 en carmesi, ~0.65 a 0.87 en teal) donde NINGUN color de
   texto llega a AA, y los tres escalones lo evitan a proposito. */
.diagrama-articulo__celda { stroke: var(--paper); stroke-width: 2; }
.diagrama-articulo__celda--mantiene { fill: var(--grey); opacity: 0.32; }
.diagrama-articulo__celda--mejora-1 { fill: var(--teal); opacity: 0.35; }
.diagrama-articulo__celda--mejora-2 { fill: var(--teal); opacity: 0.6; }
.diagrama-articulo__celda--mejora-3 { fill: var(--teal); opacity: 0.9; }
.diagrama-articulo__celda--empeora-1 { fill: var(--crimson); opacity: 0.35; }
.diagrama-articulo__celda--empeora-2 { fill: var(--crimson); opacity: 0.5; }
.diagrama-articulo__celda--empeora-3 { fill: var(--crimson); opacity: 0.85; }
/* Cuadrante destacado (riesgo-relacional-de-credito, matriz calificacion x
   IRRC): misma opacidad que --mejora-3, que ya probo dar 4.5:1 con texto
   claro encima, pero con nombre propio -esta matriz no tiene "mejora" ni
   "empeora", solo un cuadrante que merece leerse primero-. */
.diagrama-articulo__celda--foco { fill: var(--teal); opacity: 0.9; }
.diagrama-articulo__celda-texto { fill: var(--slate); font-family: var(--font-mono); font-size: 11px; text-anchor: middle; }
.diagrama-articulo__celda-texto--claro { fill: #FFFFFF; }
.diagrama-articulo__matriz-rotulo { fill: var(--grey); font-family: var(--font-mono); font-size: 10px; }

/* Curvas de cosecha: la 1 (mejor) en teal solido, la 2 en teal
   discontinuo -mismo trazo, distinto patron, para no repetir el unico
   color "bueno" sin diferenciarlas-, la 3 (peor) en carmesi solido. */
.diagrama-articulo__curva { fill: none; stroke-width: 1.8; }
.diagrama-articulo__curva--uno { stroke: var(--teal); }
.diagrama-articulo__curva--dos { stroke: var(--teal); stroke-dasharray: 4 3; }
.diagrama-articulo__curva--tres { stroke: var(--crimson); }

/* "Siete capas": nueva familia -sin equivalente previo-. Seven niveles
   apilados, cada uno mas angosto que el anterior: un embudo transmite
   profundidad/especificidad creciente sin recurrir a la secuencia
   horizontal de pasos que ya usa "Como detectar garantias cruzadas" en
   el articulo anterior (esa es para procesos, no para capas). */
.diagrama-capas {
  list-style: none;
  margin: 2.5rem auto;
  padding: 0;
  max-width: 620px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.5rem;
}
.diagrama-capas__nivel {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 0.85rem;
  padding: 0.7rem 1.15rem;
  border: 1.6px solid var(--teal);
  border-radius: var(--radius-sm);
  background: var(--soft);
}
.diagrama-capas__nivel:nth-child(1) { width: 100%; }
.diagrama-capas__nivel:nth-child(2) { width: 91%; }
.diagrama-capas__nivel:nth-child(3) { width: 82%; }
.diagrama-capas__nivel:nth-child(4) { width: 73%; }
.diagrama-capas__nivel:nth-child(5) { width: 64%; }
.diagrama-capas__nivel:nth-child(6) { width: 55%; }
.diagrama-capas__nivel:nth-child(7) { width: 46%; }
.diagrama-capas__rotulo { font-size: 0.92rem; color: var(--slate); line-height: 1.3; }
@media (max-width: 480px) {
  .diagrama-capas__nivel:nth-child(n) { width: 100%; }
  .diagrama-capas__rotulo { font-size: 0.88rem; }
}

/* ===== Alineacion numerica de tablas (los cuatro articulos migrados) =====
   Declarada en el marcado con la clase .num en el th/td que corresponda,
   nunca adivinada por el contenido de la celda: la unidad que se declara
   es la columna completa (cabecera incluida), tal como la marcaba el
   markdown fuente con `---:`. Asi una tabla transpuesta como la de
   "Operacion A / B" en cartera-vencida -con texto y numeros mezclados en
   la misma columna segun la fila- se resuelve igual que una columna
   homogenea, sin necesitar que nada inspeccione el contenido de cada
   celda en tiempo real. */
.articulo-cuerpo th.num, .articulo-cuerpo td.num { text-align: right; }

/* ===== Graficos del articulo "cartera vencida y recuperacion" =====
   Carmesi solo en las ilustraciones 1 y 3 -las dos que representan
   deterioro/perdida real (el atraso que avanza, los casos que se pierden
   en la cobranza)-, tal como ya lo acota el README ("Carmesi: la regla y
   su unica excepcion"): reservado a visualizaciones de datos. Las otras
   cuatro (niveles de priorizacion, tratamientos de una operacion
   deteriorada, que es/no es el score, flujo de ocho pasos) son metodo,
   no riesgo, y se quedan en teal/gris/blanco. Mismo grosor de trazo que
   los tres articulos anteriores: 1.4-1.8 para lineas y ejes, 1.6-2.5
   para nodos y puntos. */

/* ----- 1. Linea de tiempo horizontal: cuatro etapas -----
   Los puntos reutilizan .diagrama-articulo__barra--corta/larga-2/3/4 tal
   cual -mismo token via opacidad, ningun color nuevo- y ademas crecen de
   radio (8 a 14): la progresion queda codificada dos veces, por tono y
   por tamano, para que se lea igual en escala de grises.
   Los rotulos van en grid de 4 columnas fijas, nunca en flex-wrap: con
   wrap, cuatro rotulos de largo desigual podian repartirse en dos filas
   de dos y el cuarto quedaba solo. El grid no reparte columnas de mas:
   cada rotulo cae siempre bajo su punto y solo el texto envuelve en
   vertical, sin marca de color -el punto de la linea ya la da-. Por
   debajo de 700px, que es el corte que ya usa el resto del articulo
   para apilar en una columna, pasa a lista vertical. */
.diagrama-articulo__punto { stroke: var(--paper); stroke-width: 2; }
.diagrama-articulo__pasos-tiempo {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0 0.5rem;
  margin: 0.75rem 0 0;
  padding: 0;
  list-style: none;
  text-align: center;
}
/* min-width:0: sin el, una sola palabra larga ("intensificada",
   "vencimiento") hereda min-width:auto y fuerza a su columna a crecer mas
   alla del 1fr, igual que ya paso en .tratamientos-fila__bloque. */
.diagrama-articulo__pasos-tiempo li {
  min-width: 0;
  font-size: 0.8rem;
  line-height: 1.35;
  color: var(--slate);
}
@media (max-width: 699px) {
  .diagrama-articulo__pasos-tiempo {
    grid-template-columns: minmax(0, 1fr);
    gap: 0.75rem;
    text-align: left;
    margin-top: 1.25rem;
  }
  .diagrama-articulo__pasos-tiempo li { font-size: 0.92rem; }
}

/* ----- 2. Cuatro niveles anidados (panel oscuro) -----
   Segunda version: los circulos concentricos de la primera ocupaban un
   viewBox cuadrado que a lo ancho del articulo escalaba a casi 920px de
   alto, y el rotulo de cada nivel vivia en una leyenda aparte porque no
   cabia dentro del aro. Un rectangulo anidado si tiene sitio para su
   rotulo en su propia esquina superior izquierda -el nivel 1, el mas
   interno, lo lleva centrado porque no tiene ningun hijo que lo empuje a
   una esquina-, y un viewBox ancho y bajo (480x260, no cuadrado) resuelve
   el alto sin achicar el trazo: a 760px de columna, unos 410px de alto.
   El texto lo sigue confirmando ("Agregar"/"anade" en cada nivel): cada
   nivel contiene al anterior, no lo sustituye. Relleno con el mismo teal
   claro del panel via opacidad creciente hacia el centro -ningun color
   nuevo-, para que la contencion se lea tambien sin leer el rotulo. Sin
   leyenda aparte y sin carmesi. */
.grafico-panel__nivel-caja { stroke: #7FD4CE; stroke-width: 1.6; }
.grafico-panel__nivel-caja--4 { fill: rgba(127, 212, 206, 0.04); }
.grafico-panel__nivel-caja--3 { fill: rgba(127, 212, 206, 0.08); }
.grafico-panel__nivel-caja--2 { fill: rgba(127, 212, 206, 0.13); }
.grafico-panel__nivel-caja--1 { fill: rgba(127, 212, 206, 0.20); }
.grafico-panel__nivel-rotulo { fill: #FFFFFF; font-family: var(--font-text); font-weight: 700; font-size: 15px; }
.grafico-panel__nivel-rotulo--centro { text-anchor: middle; }

/* ----- 3. Embudo de cobranza -----
   Segunda version: la primera llevaba los rotulos en una lista aparte
   debajo del SVG y marcaba la fuga entre escalones en carmesi solido.
   Dos problemas de fondo -carmesi que no es riesgo (es gente que no
   contesto el telefono: uso indebido del codigo de color del proyecto)
   y bloques macizos que pesaban mas que lo que significaban-. Ahora es
   una lista de cajas sin relleno solido, trazo teal de 1px, angostando
   por columna -mismo mecanismo de ancho por nth-child que .diagrama-
   capas, pero sin su fondo --soft: aqui "sobre el fondo del articulo"
   significa una capa de teal casi transparente, no gris-. El rotulo
   vive dentro de su propia caja, alineado a la izquierda; lo que se
   pierde entre escalones lo dice la propia forma, que ya estrecha. */
.embudo-lineas {
  list-style: none;
  margin: 1.75rem auto 0;
  padding: 0;
  max-width: 460px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.65rem;
}
.embudo-lineas__nivel {
  width: 100%;
  padding: 0.7rem 1.15rem;
  border: 1.4px solid var(--teal);
  border-radius: var(--radius-sm);
  background: rgba(15, 110, 110, 0.045);
  color: var(--slate);
  font-size: 0.92rem;
  text-align: left;
}
.embudo-lineas__nivel:nth-child(1) { width: 100%; }
.embudo-lineas__nivel:nth-child(2) { width: 77%; }
.embudo-lineas__nivel:nth-child(3) { width: 57%; }
.embudo-lineas__nivel:nth-child(4) { width: 40%; }
@media (max-width: 480px) {
  .embudo-lineas__nivel:nth-child(n) { width: 100%; }
}

/* ----- 4. Cuatro tratamientos en fila -----
   Sin SVG y sin carmesi: son categorias de tratamiento contractual, no
   riesgo. Reubicada al cierre del capitulo de refinanciamiento y
   reestructuracion -no en el de recuperacion/normalizacion, donde vivia
   el marcador original- porque necesita los cuatro conceptos ya
   definidos por el texto, y esos dos ultimos se definen en el capitulo
   siguiente. Se apila por debajo de 700px. */
.diagrama-articulo__rotulo--previo { margin: 1.75rem 0 0; text-align: left; }
/* grid-auto-rows:1fr iguala el alto de las cuatro tarjetas entre si,
   no solo dentro de su propia fila: con dos columnas -"Normalizacion"
   es la mas larga de las cuatro y decide el alto de su fila- sin esto
   las dos filas quedaban de alturas distintas. */
.tratamientos-fila {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  grid-auto-rows: 1fr;
  gap: 1.25rem;
  margin: 0.5rem 0 1.75rem;
}
/* Dos columnas, no cuatro: se probaron las cuatro incluso en el mejor
   caso posible -1920px de ventana, columna de contenido en su tope fijo
   de 760px (que no crece mas alla, la fije .articulo-plantilla__grid)-
   y a 175px por tarjeta "Normalizacion", "Refinanciamiento" y
   "Reestructuracion" seguian partiendose a mitad de palabra: son
   palabras sueltas de 13 a 17 caracteres sin ningun espacio donde
   ajustar el corte. Con el carril del articulo (aparece desde 1120px)
   la columna de contenido baja ademas hasta ~430px en el peor tramo, lo
   que habria hecho falta apretar aun mas. Dos columnas le dan a cada
   tarjeta el doble de ancho y el titulo entra siempre en una sola
   linea. */
@media (min-width: 700px) {
  .tratamientos-fila { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* min-width:0 es el arreglo real: sin el, un item de grid hereda
   min-width:auto, que para texto equivale al ancho de su palabra mas
   larga ("Reestructuracion" no tiene donde partir) y esa palabra fuerza
   a la columna a crecer mas alla de su 1fr, empujando el texto contra
   -o mas alla de- el borde de la tarjeta. overflow-wrap es la red de
   seguridad para esa misma palabra si aun asi no cupiera. */
.tratamientos-fila__bloque {
  min-width: 0;
  padding: 1.5rem 1.6rem;
  background: var(--soft);
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
}
.tratamientos-fila__bloque h4 { margin: 0 0 0.5rem; font-family: var(--font-display); font-size: 1.05rem; color: var(--slate); overflow-wrap: break-word; }
.tratamientos-fila__bloque p { margin: 0; font-size: 0.92rem; line-height: 1.5; color: var(--grey); overflow-wrap: break-word; }

/* ----- 5. Que es y que no es el score (panel oscuro) -----
   Misma idea que .confrontacion de /nexorisk/ (dos paneles enfrentados,
   marca de inclusion/exclusion), pero no se reutilizan esas clases tal
   cual: nacieron para fondo claro (tarjetas --paper, texto --grey) y
   perderian casi todo su contraste sobre --slate. Se reconstruye el
   mismo patron con los tonos que el panel oscuro ya usa en el resto del
   articulo (#E7ECF2/#C9D8DC/#7FD4CE/#B9C3CF), ningun color nuevo. Sin
   carmesi, sin oro. */
.grafico-panel__confrontacion {
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: var(--radius-sm);
  padding: 1.35rem 1.5rem;
  text-align: left;
}
.grafico-panel__confrontacion-titulo { margin: 0 0 0.9rem; font-family: var(--font-display); font-weight: 700; font-size: 1.05rem; color: #FFFFFF; }
.grafico-panel__confrontacion--no .grafico-panel__confrontacion-titulo { color: #B9C3CF; }
.grafico-panel__confrontacion-lista { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.75rem; }
.grafico-panel__confrontacion-lista li { position: relative; padding-left: 1.35rem; font-size: 0.9rem; line-height: 1.5; color: #C9D8DC; }
.grafico-panel__confrontacion-lista li::before { content: ""; position: absolute; left: 0; top: 0.5em; width: 8px; height: 8px; border-radius: 50%; }
.grafico-panel__confrontacion--si .grafico-panel__confrontacion-lista li::before { background: #7FD4CE; }
.grafico-panel__confrontacion--no .grafico-panel__confrontacion-lista li::before { background: transparent; border: 1.5px solid #B9C3CF; }

/* ----- 6. Flujo de ocho pasos en vertical -----
   Mismo principio que .secuencia de /nosotros/ -el filete pasa por
   detras de los numeros y el fondo opaco del circulo lo tapa-, pero
   vertical: la variante horizontal de .secuencia ya la usa "Como
   detectar garantias cruzadas" en el articulo anterior, y este mismo
   articulo ya tiene una linea de tiempo horizontal en la ilustracion 1.
   Sin carmesi: es metodo, no riesgo. */
.pasos-vertical { position: relative; list-style: none; margin: 2rem 0; padding: 0; max-width: 420px; display: flex; flex-direction: column; gap: 1.15rem; }
.pasos-vertical::before { content: ""; position: absolute; left: 15px; top: 4px; bottom: 4px; width: 1.6px; background: var(--rule); }
.pasos-vertical__paso { position: relative; display: flex; align-items: center; gap: 0.95rem; }
.pasos-vertical__num {
  position: relative; z-index: 1; flex: none;
  width: 32px; height: 32px;
  display: grid; place-items: center;
  background: var(--paper);
  border: 1.6px solid var(--teal);
  border-radius: 50%;
  font-family: var(--font-mono); font-weight: 700; font-size: 0.92rem;
  color: var(--teal);
}
.pasos-vertical__texto { font-size: 0.98rem; color: var(--slate); }

/* ===== Graficos del articulo "dashboard gerencial para cooperativas" =====
   Carmesi solo en las ilustraciones 3 y 7 -las dos que senalan una
   discrepancia real (cifras que no cuadran, el punto donde el proceso se
   rompe)-, igual que en los articulos anteriores: reservado a
   visualizaciones de datos, racionado. Las otras cinco se quedan en
   teal/gris/blanco. Mismo grosor de trazo que los cuatro articulos
   anteriores. */

/* ----- 1. Trece componentes, tres familias (panel oscuro) -----
   Agrupacion propuesta antes de dibujar (ver informe): no son las cinco
   preguntas del capitulo "Antes de hablar de graficos" -esas son cinco
   grupos de PREGUNTAS, no de componentes-, sino una lectura de que
   trata cada uno de los trece:
   - Cartera y calidad: Resumen ejecutivo, Cartera de credito, Morosidad
     y deterioro de cartera, Provisiones y cobertura.
   - Sostenibilidad financiera: Liquidez, Solvencia y patrimonio,
     Rentabilidad y eficiencia, Captaciones y concentracion de depositos.
   - Cobranza, concentracion y desempeno: Concentracion de credito,
     Concentracion relacional, Cobranza y recuperacion, Desempeno por
     agencia, Indicadores comerciales -fusionada desde una "Concentracion"
     de solo dos componentes, que quedaba corta frente a las otras dos
     familias y aislaba la concentracion relacional en vez de conectarla-.
   Sin leyenda aparte: el nombre de familia va dentro de su propia
   tarjeta. Tres columnas, no dos: con dos, el tercer grupo -el mas largo,
   cinco componentes- quedaba solo en su fila dejando media fila vacia, y
   el alto pasaba los 450px. A tres columnas el alto lo decide la tarjeta
   mas alta en una sola fila, no dos filas apiladas. */
.componentes-familias {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0.75rem;
}
@media (min-width: 560px) {
  .componentes-familias { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
/* min-width:0: a 560px, justo donde este grid pasa a tres columnas, el
   nombre de familia mas largo ("Sostenibilidad financiera") queda cerca
   del borde de una columna angosta; sin esto podria forzarla a crecer. */
.componentes-familias__grupo {
  min-width: 0;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: var(--radius-sm);
  padding: 0.85rem 1rem;
}
.componentes-familias__nombre {
  margin: 0 0 0.5rem;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #7FD4CE;
}
.componentes-familias__lista { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.35rem; }
.componentes-familias__lista li { font-size: 0.82rem; line-height: 1.32; color: #E7ECF2; }

/* ----- 2. Capas de profundidad -----
   Reutiliza .diagrama-capas tal cual -misma familia que ya usa
   morosidad para sus "siete capas"-, con tres niveles en vez de siete:
   el mismo mecanismo (cada nivel mas angosto que el anterior) ya
   significa "de lo agregado a lo especifico", que es exactamente lo que
   pide esta ilustracion. Nada nuevo que declarar aqui. */

/* ----- 3. Las varias verdades -----
   Tres tarjetas con el mismo nombre de indicador y una cifra distinta
   cada una, en carmesi -el unico uso permitido aqui, para senalar que
   las cifras no cuadran-. Cifras redondas e ilustrativas (8%, 10%, 12%),
   una progresion aritmetica limpia a proposito: nada que se pueda leer
   como un dato real de una institucion ni como el caso de validacion. */
.varias-verdades {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.25rem;
  margin: 1.75rem 0;
}
.varias-verdades__area {
  flex: 1 1 150px;
  max-width: 200px;
  text-align: center;
  padding: 1.25rem 1rem;
  border: 1px solid var(--rule);
  border-radius: var(--radius-md);
  background: var(--soft);
}
.varias-verdades__nombre { margin: 0 0 0.6rem; font-family: var(--font-mono); font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--grey); }
.varias-verdades__cifra { margin: 0 0 0.35rem; font-family: var(--font-display); font-weight: 700; font-size: 2.1rem; color: var(--crimson); }
.varias-verdades__indicador { margin: 0; font-size: 0.85rem; color: var(--slate); }

/* ----- 4. Que mira cada rol -----
   Un solo filete vertical -"el mismo tablero"- con cinco marcas: cada
   fila muestra el rol y una muestra literal de su lista del HTML, del
   nivel mas agregado (arriba) al mas operativo (abajo). Sin carmesi. */
.roles-profundidad { position: relative; list-style: none; margin: 1.75rem 0; padding: 0; max-width: 620px; }
.roles-profundidad::before { content: ""; position: absolute; left: 7px; top: 6px; bottom: 6px; width: 1.6px; background: var(--rule); }
.roles-profundidad__fila { position: relative; display: flex; align-items: flex-start; gap: 0.9rem; padding: 0.5rem 0; }
.roles-profundidad__marca { position: relative; z-index: 1; flex: none; width: 15px; height: 15px; margin-top: 0.2rem; border-radius: 50%; background: var(--paper); border: 1.6px solid var(--teal); }
.roles-profundidad__contenido { display: flex; flex-direction: column; gap: 0.15rem; }
.roles-profundidad__rol { font-weight: 700; color: var(--slate); font-size: 0.95rem; }
.roles-profundidad__detalle { font-size: 0.88rem; color: var(--grey); }

/* ----- 5. Reticula de una pantalla -----
   Bloques vacios con su rotulo y nada mas -ni cifra, ni barra, ni
   grafico dibujado dentro-: el trazo discontinuo es a proposito, para
   que se lea como plano/esquema y nunca como una captura del tablero
   real, que exigiria la etiqueta de datos sinteticos. */
.reticula-pantalla {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.6rem;
  margin: 1.75rem 0;
}
/* min-width:0 defensivo: mismo riesgo de fondo que .tratamientos-fila__bloque,
   aunque hoy los rotulos de zona ("Profundización") caben de sobra. */
.reticula-pantalla__zona {
  min-height: 3.25rem;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0.75rem 1rem;
  border: 1.4px dashed var(--rule);
  border-radius: var(--radius-sm);
  font-family: var(--font-mono);
  font-size: 0.78rem;
  color: var(--grey);
}
.reticula-pantalla__zona--ancha { grid-column: 1 / -1; }

/* ----- 6. Que cubre y que no -----
   Reutiliza .grafico-panel__confrontacion tal cual -construida para la
   ilustracion 5 de cartera-vencida-recuperacion-: mismo patron de dos
   paneles enfrentados, aqui con "Cubre" / "No sustituye" en vez de
   "Es" / "No es". Ninguna clase nueva. */

/* ----- 7. El proceso roto -----
   Cinco pasos: el primero -"salga del tablero", donde el proceso se
   rompe- en carmesi, el resto en teal y gris cada vez mas tenue, con un
   margen creciente entre cada uno para que la distancia crezca con la
   friccion. En columna por debajo de 700px -en fila, el margen
   creciente se hubiera leido como pasos sueltos, no como una secuencia-;
   las flechas solo se muestran en la fila horizontal. */
.proceso-roto { display: flex; flex-direction: column; gap: 0.6rem; margin: 1.75rem 0; }
.proceso-roto__paso { padding: 0.6rem 0.95rem; border-radius: var(--radius-sm); font-size: 0.85rem; border: 1.4px solid var(--rule); color: var(--slate); background: var(--paper); }
.proceso-roto__paso--origen { border-color: var(--crimson); color: var(--crimson); font-weight: 700; }
.proceso-roto__paso--dos { border-color: var(--teal); color: var(--teal); }
.proceso-roto__paso--tres { color: var(--grey); }
.proceso-roto__paso--cuatro { color: var(--grey); }
.proceso-roto__paso--cinco { color: var(--grey); }
.proceso-roto__flecha { display: none; }
@media (min-width: 700px) {
  /* flex-wrap, no nowrap+scroll: probado el scroll horizontal y el
     ultimo paso -el mas largo, "envie la respuesta horas o dias
     despues"- quedaba fuera de la vista por defecto en las cinco
     columnas del articulo, incluso a 1920px: obligaba a interactuar
     para leer el final de la secuencia, que es justo lo que "debe
     leerse" pide evitar. Con wrap todo queda visible sin interaccion;
     la fila que se envuelve mas abajo comunica que el ultimo paso esta
     mas lejos. La distancia creciente NO se hace con opacity -se probo
     primero asi y el gris de --cuatro/--cinco caia a 4.09:1 y 3.04:1,
     por debajo del 4.5:1 de AA-: es solo el margen creciente. */
  .proceso-roto { flex-direction: row; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.4rem; }
  .proceso-roto__flecha { display: inline-flex; flex: none; color: var(--rule); }
  .proceso-roto__paso--tres { margin-left: 0.5rem; }
  .proceso-roto__paso--cuatro { margin-left: 1rem; }
  .proceso-roto__paso--cinco { margin-left: 1.5rem; }
}
